Mercurial > hg > Members > kono > nitros9-code
view level1/cmds/merge.asm @ 1331:0a3500c747de
Fixed ANOTHER bug
author | boisy |
---|---|
date | Sun, 07 Sep 2003 00:53:51 +0000 |
parents | 4f42a5a604d3 |
children |
line wrap: on
line source
******************************************************************** * Merge - Merge files into one file * * $Id$ * * Edt/Rev YYYY/MM/DD Modified by * Comment * ------------------------------------------------------------------ * 4 ????/??/?? * From Tandy OS-9 Level One VR 02.00.00. * * 5 2003/09/06 * Added -z option to read files from stdin nam Merge ttl Merge files into one file ifp1 use defsfile endc tylg set Prgrm+Objct atrv set ReEnt+rev rev set $00 edition set 5 * Here are some tweakable options STACKSZ set 128 estimated stack size in bytes PARMSZ set 256 estimated parameter size in bytes mod eom,name,tylg,atrv,start,size org 0 path rmb 1 param rmb 2 d.ptr rmb 2 d.size rmb 2 d.buff rmb 128 d.buffer rmb 2496 should reserve 7k, leaving some room for parameters * Finally the stack for any PSHS/PULS/BSR/LBSRs that we might do rmb STACKSZ+PARMSZ size equ . name fcs /Merge/ fcb edition change to 6, as merge 5 has problems? * Here's how registers are set when this process is forked: * * +-----------------+ <-- Y (highest address) * ! Parameter ! * ! Area ! * +-----------------+ <-- X, SP * ! Data Area ! * +-----------------+ * ! Direct Page ! * +-----------------+ <-- U, DP (lowest address) * * D = parameter area size * PC = module entry point abs. address * CC = F=0, I=0, others undefined * The start of the program is here. start subd #$0001 if this becomes zero, beq Exit we have no parameters leay d.buffer,u point Y to buffer offset in U stx <param and parameter area start tfr s,d place top of stack in D pshs y save Y on stack subd ,s++ get size of space between buff and X subd #STACKSZ+PARMSZ subtract out our stack/param size std <d.size save size of data buffer leay d.buffer,u point to some data sty <d.ptr do.opts ldx <param get first option do.opts2 lbsr space cmpa #C$CR was the character a CR? beq do.file yes, parse files cmpa #'- was the character a dash? beq do.dash yes, parse option lbsr nonspace else skip nonspace chars cmpa #C$CR end of line? beq do.file branch if so bra do.opts2 else continue parsing for options do.file ldx <param lbsr space cmpa #C$CR CR? beq Exit exit if so cmpa #'- option? bne itsfile bsr nonspace cmpa #C$CR CR? beq Exit exit if so itsfile bsr readfile bcs Error bra do.file readfile lda #READ. os9 I$Open open the file for reading bcs read.ex crap out if error sta <path save path number stx <param and save new address of parameter area read.lp lda <path get the current path number ldy <d.size and size of data to read ldx <d.ptr and pointer to data buffer os9 I$Read read data into the buffer bcs chk.err check errors lda #$01 to STDOUT os9 I$Write dump it out in one shot bcc read.lp loop if no errors read.ex rts chk.err cmpb #E$EOF end of the file? bne read.ex no, error out lda <path otherwise get the current path number os9 I$Close close it rts return to caller Error coma set carry fcb $21 skip next byte Exit clrb os9 F$Exit and exit do.dash leax 1,x skip over dash lda ,x+ get char after dash cmpa #C$CR CR? beq Exit yes, exit anda #$DF make uppercase cmpa #'Z input from stdin? bne Exit * read from stdin until eof or blank line * skip lines that begin with * (these are comments) do.z leax d.buff,u ldy #127 clra stdin os9 I$ReadLn bcc do.z2 cmpb #E$EOF end-of-file? beq Exit nope, exit with error bra Error do.z2 lda ,x cmpa #'* asterisk? (comment) beq do.z yep, ignore and get next line bsr space skip space at X cmpa #C$CR end of line? beq Exit yup, we're done * X points to a filename... pshs x bsr readfile read contents of file and send to stdout puls x bcc do.z branch if ok bra Error space lda ,x+ grab a character cmpa #C$SPAC space? beq space yes, skip it leax -1,x otherwise point to last non-space rts nonspace lda ,x+ grab a character cmpa #C$CR cr? beq nospacex yes, skip it cmpa #C$SPAC nonspace? bne nonspace yes, skip it nospacex leax -1,x otherwise point to last space rts emod eom equ * end