NEW AUTO 3,1 *--------------------------------------- MAC.Init >SYSCALL SListNew bcs .9 >STA.G MAC.hList >LDYAI 256 >SYSCALL getmem bcs .9 txa >STA.G MAC.hBuf >LDYAI 256 >SYSCALL getmem bcs .9 >STYA ZPMacroArgBuf txa >STA.G MAC.hArgBuf >LDYAI 256 >SYSCALL getmem bcs .9 >STYA ZPMacroStk txa >STA.G MAC.hStk .9 rts *--------------------------------------- MAC.Reset >STZ.G MAC.StkPtr >STA.G MAC.CtxID rts *--------------------------------------- MAC.Quit >LDA.G MAC.hStk beq .1 >SYSCALL FreeMem .1 >LDA.G MAC.hBuf beq .2 >SYSCALL FreeMem .2 >LDA.G MAC.hArgBuf beq .3 >SYSCALL FreeMem .3 >LDA.G MAC.hList beq .8 >PUSHA >SYSCALL SListFree .8 clc rts *--------------------------------------- MAC.Learn >LDA.G MAC.hBuf >SYSCALL GetMemPtr >STYA ZPMacroBuf >STZ.G MAC.BufPtr sta (ZPMacroBuf) lda (ZPLinePtr) cmp #C.SPACE No label, scan to DIR/OP if any bne .1 jsr SRC.GetNextCharNB bcs .8 lda #C.SPACE Store ONE blank jsr MAC.AddChar bcs .90 lda (ZPLinePtr) get back non blank char bra .2 .1 jsr MAC.AddChar bcs .99 jsr SRC.GetNextChar bcs .80 cmp #C.SPACE bne .1 jsr MAC.AddChar .90 bcs .99 jsr SRC.GetNextCharNB bcs .80 .2 cmp #'.' Directive ? bne .4 ldy #1 lda (ZPLinePtr),y beq .3 cmp #'E' beq .21 cmp #'e' bne .3 .21 iny lda (ZPLinePtr),y beq .3 cmp #'M' beq .22 cmp #'m' bne .3 .22 >STZ.G ASM.MA.ON .8 clc rts .80 lda #C.CR jmp MAC.AddChar .3 lda (ZPLinePtr) .4 jsr MAC.AddChar bcs .99 jsr SRC.GetNextChar bcs .80 cmp #C.SPACE bne .4 jsr SRC.GetNextChar bcs .8 cmp #C.SPACE beq .80 Comments... pha lda #C.SPACE jsr MAC.AddChar pla bcs .99 .5 jsr MAC.AddChar Store ARG.... bcs .99 jsr SRC.GetNextChar bcs .80 cmp #C.SPACE bne .5 bra .80 End of Line .99 rts *--------------------------------------- MAC.AddChar tax >LDA.G ASM.PASS If Pass#2, ignore bne .8 >LDA.G MAC.BufPtr tay txa sta (ZPMacroBuf),y >INC.G MAC.BufPtr txa beq .1 cmp #C.CR bne .8 .1 >PUSHB.G MAC.hList >PUSHW.G MAC.ID >PUSHW ZPMacroBuf >LDA.G MAC.BufPtr tay lda #0 >PUSHYA >SYSCALL SListAddData rts .8 clc rts *--------------------------------------- MAC.Exec jsr SRC.GetNextChar skip '>' bcs .90 >PUSHB.G MAC.hList >PUSHW ZPLinePtr >SYSCALL SListLookup bcs .90 >STYA ZPPtr1 MAC.ID txa * clc adc ZPLinePtr sta ZPLinePtr bcc .1 inc ZPLinePtr+1 .1 jsr SRC.GetChar bcs .8 cmp #C.SPACE bne .92 jsr SRC.GetNextChar beq .8 eol.. cmp #C.SPACE some arg... bne .8 .2 jsr SRC.GetNextChar comment....skip bcc .2 .8 jmp MAC.Push .90 lda #E.MACRO.INV sec rts .92 lda #E.SYNTAX.ERROR sec MAC.Exec.RTS rts *--------------------------------------- MAC.ReadLine >LDA.G MAC.hBuf >SYSCALL GetMemPtr >STYA ZPMacroBuf jsr MAC.Get ZPMacroArgBuf = args >PUSHB.G MAC.hList >PUSHW ZPPtr1 Mac ID >PUSHW ZPMacroBuf >PUSHWZ len = 0 (string mode) >PUSHW ZPPtr2 offset >SYSCALL SListGetData bcs MAC.Exec.RTS pha tya sec +1 for CR adc ZPPtr2 sta ZPPtr2 pla adc ZPPtr2+1 sta ZPPtr2+1 ldy #0 .1 lda (ZPMacroBuf) beq .7 inc ZPMacroBuf bne .2 inc ZPMacroBuf+1 .2 cmp #']' bne .7 lda (ZPMacroBuf) beq .9 inc ZPMacroBuf bne .21 inc ZPMacroBuf+1 .21 cmp #'#' bne .20 jsr MAC.GetArgCnt ora #$30 bra .7 .20 cmp #'1' bcc .9 cmp #'9'+1 bcs .9 and #$0f tax jsr MAC.GetArgX bcs .9 .3 lda (ZPPtr1) sta (ZPLineBuf),y iny inc ZPPtr1 bne .4 inc ZPPtr1+1 .4 dex bne .3 bra .1 .7 sta (ZPLineBuf),y beq .8 iny bra .1 .8 jmp MAC.Put .9 lda #E.SYNTAX.ERROR sec rts *--------------------------------------- MAC.Put >LDA.G MAC.StkPtr tay dey dey skip mac ID dey lda ZPPtr2 sta (ZPMacroStk),y dey lda ZPPtr2+1 sta (ZPMacroStk),y get offset rts *--------------------------------------- MAC.Push >LDA.G MAC.StkPtr cmp #MA.MAXDEPTH*8 beq .9 stz ZPPtr2 stz ZPPtr2+1 offset = 0 >INC.G MAC.CtxID >INC.G MAC.Depth >LDYA ZPLinePtr >SYSCALL strdup Args bcs .99 >LDA.G MAC.StkPtr tay txa push args sta (ZPMacroStk),y iny lda ZPPtr2+1 push offset sta (ZPMacroStk),y iny lda ZPPtr2 sta (ZPMacroStk),y iny lda ZPPtr1+1 push MAC.ID sta (ZPMacroStk),y iny lda ZPPtr1 sta (ZPMacroStk),y iny tya >STA.G MAC.StkPtr clc rts .9 lda #E.MACRO.TOO.MANY sec .99 rts *--------------------------------------- MAC.Pop >LDA.G MAC.StkPtr dec dec dec dec dec sta (pData),y 5 bytes off stack tay lda (ZPMacroStk),y >SYSCALL freemem >DEC.G MAC.CtxID >DEC.G MAC.Depth clc rts *--------------------------------------- MAC.Get >LDA.G MAC.StkPtr tay dey lda (ZPMacroStk),y sta ZPPtr1 dey lda (ZPMacroStk),y sta ZPPtr1+1 get mac ID dey lda (ZPMacroStk),y sta ZPPtr2 dey lda (ZPMacroStk),y sta ZPPtr2+1 get offset dey lda (ZPMacroStk),y >SYSCALL GetMemPtr >STYA ZPMacroArgBuf get args rts *--------------------------------------- MAC.GetArgCnt phy ldx #0 ldy #$ff .1 iny lda (ZPMacroArgBuf),y ply clc rts *--------------------------------------- MAC.GetArgX phy >LDYA ZPMacroArgBuf >STYA ZPPtr1 ldy #$ff .1 iny lda (ZPPtr1),y beq .7 cmp #',' bne .1 .2 dex beq .7 tya beq .9 clc adc ZPPtr1 bcc .7 inc ZPPtr1+1 .7 tya tax beq .9 ply clc rts .9 ply sec rts *--------------------------------------- MAN SAVE USR/SRC/BIN/ASM.S.MAC LOAD USR/SRC/BIN/ASM.S ASM