dml@loral.UUCP (Dave Lewis) (10/18/85)
--> line eater choker <-- Here's a program that can save some time and finger wear. It runs fine on a Color Computer using OS-9 level 1 version 1.01.00 -- can't vouch for anything else but it should work on any system. It's great for making a new OS9Boot file or working on a combined device driver/device descriptor file. Assemble using the Microware OS-9 assembler. Give it at least 10K of symbol memory. ------ Assembly listing starts here------ ***************************************************************** * This sourcecode listing is released to public domain by * * Dave Lewis San Diego CA October 16, 1985 * * It may be copied and used for any purpose EXCEPT for sale. I'm * not getting paid for writing it -- don't try to get paid for * copying it. ***************************************************************** * Utility to break a multiple-module file (like OS9Boot) into its * component modules and store them as separate files in a * specified or default directory. * * Usage: Separate /Dn/DIRECTORY/filename /Dn/DIRECTORY * * Modules are stored in destination directory under their module * names. Ensure there are no existing files with the same name * as any of the modules. * NAM Separate TTL Module separator * IFP1 USE /D0/DEFS/OS9Defs USE /D0/DEFS/SCFDefs ENDC * REV EQU 1 TYPE EQU PRGRM+OBJCT ATTR EQU REENT+REV * MOD SIZE,NAME,TYPE,ATTR,EXEC,STORG NAME FCS 'Separate' FCB 1 Version number * INPATH RMB 1 Input file path number OUTPATH RMB 1 Output file path number FILEPTR RMB 2 Address of output filename EOBUFPTR RMB 2 Buffer end address EOMEMPTR RMB 2 Data memory end address MODSIZE RMB 2 Bytes still to be written MODPTR RMB 2 Disk file position pointer OPTHLST RMB 60 Output pathlist buffer DATABUF RMB 700 Module data buffer RMB 232 Reserve stack space RMB 20 Reserve parameter area STORG EQU . * EXEC STY EOMEMPTR End of allocated memory LEAY DATABUF+700 Find end of data buffer STY EOBUFPTR Store end address CLR MODPTR Zero out module offset point- CLR MODPTR+1 er; start at BOF LDA #READ. Access mode = read OS9 I$OPEN Open input file BCS SPEXIT Exit if error STA INPATH Store input path number * LEAY OPTHLST,U Get pathlist buffer address FINDPATH CMPX EOMEMPTR Test X for end of memory BHS NOPATH No pathlist, use working dir LDA ,X+ Get next character CMPA #'/ Test for pathname start BEQ FOUNDPATH BSR ALPHTEST Test for letter (UC or lc) BNE FINDPATH Not a letter; keep looking FOUNDPTH LEAX -1,X Set X back to character MOVEPATH LDA ,X+ Get next character CMPA #C$CR Test character for `CR' or BEQ MPEXIT blank; either indicates CMPA #C$SPAC the end of a pathlist. BEQ MPEXIT STA ,Y+ Add character to outpathlist CMPX EOMEMPTR Test for end of parameter BLO MOVEPATH memory; can't go past it MPEXIT LDA #'/ Prepare pathlist for addition STA ,Y+ of a filename * NOPATH STY FILEPTR Save pointer to next byte BSR GETMOD Do all modules of input file SPEXIT OS9 F$EXIT End; pass any errors out * ALPHTEST TFR A,B Don't change letter in A ANDB #$DF Change lowercase to uppercase CMPB #'A Test for less than an `A' BLO NOTALPH CMPB #'Z Test for greater than a `Z' BHI NOTALPH CLRB Return w/Z flag set if alpha NOTALPH RTS * GETMOD LDA INPATH Read from input file LEAX DATABUF,U Point to data buffer LDY #9 Read first 9 bytes (header) OS9 I$READ Does not change X register BCC GETMOD2 Continue if no error CMPB #E$EOF Test for end-of-file error BNE GMEXIT1 End of file just means you're CLRB done; other errors are real GMEXIT1 RTS * GETMOD2 LDD DATABUF Load first two bytes of file CMPD #M$ID12 and test for module ID BEQ GETMOD3 Continue if ID good COMB Set carry flag for error LDB #E$BMID Set error code RTS * GETMOD3 LDD DATABUF+2 Load module size STD MODSIZE Store as variable LDD DATABUF+4 Load module name offset PSHS U Save U LDU MODPTR Get module offset in file LEAU D,U Add name offset in module LDX #0 MS 16 bits of file position LDA INPATH Position file pointer on OS9 I$SEEK first byte of module name PULS U Restore U register BCC GETMOD4 Continue if no error GMEXIT2 RTS * GETMOD4 LEAX DATABUF,U LDY #32 Module name can't exceed LDA INPATH 32 characters OS9 I$READ Read module name BCS GMEXIT2 Exit if error LDY FILEPTR Point to destination MOVLOOP LDA ,X+ Move name to pathlist buffer STA ,Y+ TSTA Test for last character -- BPL MOVLOOP MSB will be set ANDA #$7F Clear MSB STA -1,Y Store corrected character LDA #C$CR Terminate line STA ,Y LEAX OPTHLST,U Point to pathlist LDB #$F Attributes: r w e pr LDA #WRITE. Access mode OS9 I$CREATE Create and open output file BCS GMEXIT2 Exit if error STA OUTPATH Store path number * PSHS U Save U LDU MODPTR Point to start of module LDX #0 MS 16 bits of file pointer LDA INPATH Path number OS9 I$SEEK Position file pointer PULS U Restore U BCS GMEXIT2 Exit if error LDD MODPTR Module offset in file ADDD MODSIZE Length of module STD MODPTR Point to next module in file * MODLOOP STD MODSIZE Store updated module size CMPD #700 Is it bigger than buffer? BLS LOADALL No, read it all LDD #700 Fill the buffer LOADALL TFR D,Y Y contains #bytes to read PSHS D Save #bytes to be read LEAX DATABUF,U Point to start of buffer LDA INPATH Get input path number OS9 I$READ Read data BCS GMEXIT3 Exit if read error CMPY ,S Were intended number of bytes BEQ GETMOD5 actually read? COMB If not, report it as a LDB #E$READ read error GMEXIT3 PULS Y,PC Pull and return * GETMOD5 LDA OUTPATH Get output path number OS9 I$WRITE Write same number of bytes BCS GMEXIT4 Exit if error CMPY ,S Were correct number of BEQ GETMOD6 bytes written? COMB If not, report a write LDB #E$WRITE error GMEXIT4 PULS Y,PC Pull and return * GETMOD6 LDD MODSIZE Get total size of module SUBD ,S++ Subtract bytes just processed BNE MODLOOP More of this module remains LDA OUTPATH Get output path number OS9 I$CLOSE Close output file LBCC GETMOD Process next module RTS If error, exit EMOD CRC bytes SIZE EQU * ---------------- Dave Lewis Loral Instrumentation San Diego !sdcc3 ---\ !sdcc6 ---->--- !loral!dml (uucp) !sdcsvax -/ "Always put your clothes and weapons where you can find them quickly in the dark" -- Lazarus Long.
dml@loral.UUCP (Dave Lewis) (10/24/85)
---------------------- Found two bugs that sneaked into the program in copying the listing. The first bug is on the 66th line of the listing (don't count the info above the program heading) four lines after the label `FINDPATH': > BEQ FOUNDPATH --- change to BEQ FOUNDPTH as it was more than 8 characters. The other bug is on lines 150 --> 152 just above label `MODLOOP': > LDD MODPTR > ADDD MODSIZE > STD MODPTR and must be changed to: LDX MODPTR Module offset in file LDD MODSIZE Length of module LEAX D,X Compute offset to next module STX MODPTR Point to next module in file Sorry about posting it with mistakes. Hope nobody blew up their operating systems with it. ------------------------------- Dave Lewis Loral Instrumentation San Diego ihnp4 ---\ !sdcc6 ---\ sdcrdcf -->-->!sdcc3 ---->--->!loral!dml (uucp) sdcsvax -/ !sdcsvax -/ "Always put your clothes and weapons where you can find them quickly in the dark" -- Lazarus Long.