A2osX/BIN/ASM.S.MAC.txt
2022-11-02 07:54:30 +01:00

581 lines
8.0 KiB
Plaintext
Raw Permalink 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 lda #SL..+SL._
>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 MA.MAXDEPTH*6
>SYSCALL GetMem
bcs .9
>STYA ZPMacroStk
txa
>STA.G MAC.hStk
.9 rts
*---------------------------------------
MAC.Quit >LDA.G MAC.StkPtr
beq .10
jsr MAC.Pop
bra MAC.Quit
.10 >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
>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
>PUSHWI 0 ScopeID
>SYSCALL SListLookup
bcs .90
>STYA ZPPtr1 MAC.ID
jsr SRC.SkipX
.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
stz DIR.Byte
.1 lda (ZPMacroBuf)
beq .8
cmp #C.CR
beq .8
inc ZPMacroBuf
bne .2
inc ZPMacroBuf+1
.2 cmp #']'
bne .7
bit DIR.Byte
bmi .7
lda (ZPMacroBuf)
beq .9
inc ZPMacroBuf
bne .21
inc ZPMacroBuf+1
.21 cmp #'#'
bne .22
lda ZPMacroArgCnt
ora #$30
bra .7
.22 cmp #'1'
bcc .6
cmp #'9'+1
bcs .6
and #$0f
tax
dec
cmp ZPMacroArgCnt
bcs .1
jsr MAC.GetArgX
bcs .1 no arg ]n, append nothing
.3 lda (ZPPtr1)
sta (ZPLineBuf),y
iny
inc ZPPtr1
bne .4
inc ZPPtr1+1
.4 dex
bne .3
bra .1
.6 pha
lda #']'
sta (ZPLineBuf),y
iny
pla
.7 sta (ZPLineBuf),y
iny
bra .1
.8 lda #0
sta (ZPLineBuf),y
jmp MAC.Put
.9 lda #E.SYNTAX.ERROR
sec
MAC.ReadLine.RTS
rts
*---------------------------------------
MAC.Push >LDA.G MAC.StkPtr
cmp #MA.MAXDEPTH*6
beq MAC.ReadLine.RTS
>LDA.G MAC.CtxID
pha
>INC.G MAC.CtxStackPtr
clc
adc #MAC.CtxStack-1
tay
pla
sta (pData),y
>INC.G MAC.CtxNextID
>STA.G MAC.CtxID
ldy #$ff
.10 iny
lda (ZPLinePtr),y
bne .10
iny
iny
lda #0
>SYSCALL GetMem
bcs MAC.ReadLine.RTS
>STYA ZPPtr2
phx hArgs
ldx #0 arg cnt
.1 ldy #$ff
stz DIR.Byte between " flag
.2 iny
lda (ZPLinePtr),y
beq .3
cmp #C.SPACE end of args ?
bne .21
bit DIR.Byte
beq .3
.20 sta (ZPPtr2)
inc ZPPtr2
bne .2
inc ZPPtr2+1
bra .2
.21 cmp #'"'
bne .22
lda DIR.Byte
eor #$ff
sta DIR.Byte
bra .2
.22 cmp #','
bne .20
bit DIR.Byte
bmi .20
lda #0
sta (ZPPtr2)
inc ZPPtr2
bne .23
inc ZPPtr2+1
.23 tya
beq .4
inx
sec
adc ZPLinePtr
sta ZPLinePtr
bcc .1
inc ZPLinePtr+1
bra .1
.3 lda #0
sta (ZPPtr2)
tya
beq .4
inx
.4 >LDA.G MAC.StkPtr
tay
pla push hArgs
sta (ZPMacroStk),y
iny
txa push arg count
sta (ZPMacroStk),y
iny
lda #0 push offset
sta (ZPMacroStk),y
iny
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
rts
*---------------------------------------
MAC.Pop >LDA.G MAC.StkPtr
dec
dec mac id
dec
dec offset
dec arg cnt
dec hArgs
sta (pData),y 6 bytes off stack
tay
lda (ZPMacroStk),y
>SYSCALL FreeMem
>LDA.G MAC.CtxStackPtr
clc
adc #MAC.CtxStack-1
tay
lda (pData),y
>STA.G MAC.CtxID
>DEC.G MAC.CtxStackPtr
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 get arg count
sta ZPMacroArgCnt
dey
lda (ZPMacroStk),y
>SYSCALL GetMemPtr
>STYA ZPMacroArgBuf get args
rts
*---------------------------------------
MAC.Put >LDA.G MAC.StkPtr
tay
dey to arg cnt
dey
dey skip mac ID
lda ZPPtr2
sta (ZPMacroStk),y
dey
lda ZPPtr2+1
sta (ZPMacroStk),y save offset
clc
rts
*---------------------------------------
MAC.GetArgX phy
>LDYA ZPMacroArgBuf
>STYA ZPPtr1
.1 ldy #$ff
.2 iny
lda (ZPPtr1),y
bne .2
.3 dex
beq .4
tya
beq .9
sec
adc ZPPtr1
sta ZPPtr1
bcc .1
inc ZPPtr1+1
bra .1
.4 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