A2osX/BIN/ASM.S.MAC.txt

475 lines
7.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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