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.