NEW
  PREFIX
AUTO 4,1
*---------------------------------------
MAC.Init		>SYSCALL SListNew
				bcs .9

				>STA.G MAC.hList
						
				>LDYAI 256
				>SYSCALL getmem
				bcs .9
				
				>STYA ZPMacroBuf
				txa
				>STA.G MAC.hBuf

				>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 .3

				>SYSCALL FreeMem
				
.3				>LDA.G MAC.hList
				beq .8
				>SYSCALL SListFree

.8				clc
				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				>LDA.G MAC.BufPtr
				tay
				lda #0
				
				>PUSHYA
				>PUSHW ZPMacroBuf
				>PUSHW.G MAC.ID
				>LDA.G MAC.hList
				>SYSCALL SListAddData
				rts
				
.8				clc
MAC.AddChar.RTS	rts
*---------------------------------------
MAC.ReadLine	>LDA.G MAC.StkPtr

				tay
				dey
				lda (ZPMacroStk),y
				sta ZPPtr1
				dey
				lda (ZPMacroStk),y
				sta ZPPtr1+1			pop mac ID
				
				dey
				lda (ZPMacroStk),y
				sta ZPPtr2
				dey
				lda (ZPMacroStk),y
				sta ZPPtr2+1			pop offset
				
				dey
				lda (ZPMacroStk),y
				sta ZPMacroBuf
				dey
				lda (ZPMacroStk),y
				sta ZPMacroBuf+1		pop args

				tya
				>STA.G MAC.StkPtr
				
				>PUSHW ZPPtr2			offset
				>PUSHWZ				len = 0 (string mode)
				>PUSHW ZPLineBuf
				>PUSHW ZPPtr1			Mac ID	
				>LDA.G MAC.hList
				>SYSCALL SListGetData
				bcs MAC.AddChar.RTS

				pha
				tya
*				clc
				adc ZPPtr2
				sta ZPPtr2
				
				pla
				adc ZPPtr2+1
				sta ZPPtr2+1
				
				>LDYA ZPMacroBuf
				>SYSCALL puts
				
				>LDA.G MAC.StkPtr
				tay
				
				lda ZPLinePtr+1		push args
				sta (ZPMacroStk),y
				iny
				
				lda ZPLinePtr
				sta (ZPMacroStk),y
				iny
*---------------------------------------
MAC.Push		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
*---------------------------------------
MAC.Exec		jsr SRC.GetNextChar		skip '>'
				bcs .90

				>PUSHW ZPLinePtr
				>LDA.G MAC.hList
				>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 #' '
				bne .92
				
				jsr SRC.GetNextChar
				beq .8					eol..
				
				cmp #' '				some arg...
				bne .8
					
.2				jsr SRC.GetNextChar		comment....skip
				bcc .2
				
.8				>LDA.G MAC.StkPtr
				cmp #MA.MAXDEPTH*8
				beq .91
				
				stz ZPPtr2
				stz ZPPtr2+1			offset = 0
				
				>INC.G MAC.CtxID
				>INC.G MAC.Depth
				
				>LDA.G MAC.StkPtr
				tay
				
				lda ZPLinePtr+1			push args
				sta (ZPMacroStk),y
				iny
				
				lda ZPLinePtr
				sta (ZPMacroStk),y
				iny

				jmp MAC.Push
							
.90				lda #E.MACRO.INV
				sec
				rts	
				
.91				lda #E.MACRO.TOO.MANY
				sec
				rts
				
.92				lda #E.SYNTAX.ERROR
				sec
				rts	
*---------------------------------------
MAN
SAVE USR/SRC/BIN/ASM.S.MAC
LOAD USR/SRC/BIN/ASM.S
ASM
