A2osX/BIN/ASM.S.DIR.txt
burniouf 9a7d20a7e1 ProDOS 203 / FX:TC mod for year 2022-2026
FORMAT: new switches & checks
SH:BREAK in FOR and WHILE
ASM / S-C MASM: new directives, CString support and .HX
LC / UC:bugfix
DHGR.DRV:bugfix
LIBGUI:wip
CC:wip
2022-12-07 08:02:29 +01:00

842 lines
12 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
*---------------------------------------
DIR.Reset lda #$ff
>STA.G ASM.LI.ON
iny #ASM.LI.CON
sta (pData),y
iny #ASM.LI.MON
sta (pData),y
iny #ASM.LI.XON
sta (pData),y
>STA.G MAC.StkPtr
rts
*---------------------------------------
DIR.AC clc
rts
*---------------------------------------
DIR.AT sec
.HS 90 BCC
*---------------------------------------
DIR.AS clc
lda #0
ror
sta DIR.Byte Save b7 of last char in string
jsr SRC.GetNextChar
bcs .9
cmp #'-'
bne .1
lda #$40 save b7 status of ALL chars
tsb DIR.Byte
jsr SRC.GetNextChar
bcs .9
.1 sta DIR.Word Save delimiter....
sta DIR.Word+1 Save also in prev char..
.2 jsr SRC.GetNextChar
bcs .8
cmp DIR.Word delimiter ?
beq .8
ldx DIR.Word+1 Get prev char
sta DIR.Word+1 replace it with new
txa
cmp DIR.Word is it the starting delimiter
beq .2 yes, skip
bit DIR.Byte
bvc .3
ora #$80
.3 jsr OUT.EmitByte no, emit prev char
bcc .2
.9 lda #E.SYNTAX.ERROR
sec
rts
.8 lda DIR.Word+1 Get prev char
cmp DIR.Word someone typed .AS "" ?
beq .88
bit DIR.Byte
bpl .81
eor #$80
.81 jmp OUT.EmitByte
.88 clc
DIR.AS.RTS rts
*---------------------------------------
DIR.AZ jsr DIR.AS
bcs DIR.AS.RTS
lda #0
jmp OUT.EmitByte
*---------------------------------------
DIR.PS jsr SRC.GetNextChar
bcs .9
sta DIR.Word Save delimiter....
ldx #$ff
ldy #1 skip delimiter
.1 inx
lda (ZPLinePtr),y
beq .9
cmp #$0D
beq .9
iny
cmp DIR.Word
bne .1
txa
jsr OUT.EmitByte emit length
bcs .9
.2 jsr SRC.GetNextChar
jsr OUT.EmitByte
bcs .9
dex
bne .2
jsr SRC.GetNextChar skip delimiter
clc
rts
.9 lda #E.SYNTAX.ERROR
sec
rts
*---------------------------------------
DIR.CS jsr SRC.GetNextChar
bcs .9
stz DIR.Byte
cmp #'-'
bne .1
ror DIR.Byte save b7 status of ALL chars
jsr SRC.GetNextChar
bcs .9
.1 sta DIR.Word Save delimiter....
.2 jsr SRC.GetNextChar
bcs .9
cmp DIR.Word delimiter ?
beq .8
cmp #'\'
bne .7
jsr SRC.GetNextChar
bcs .9
ldx #DIR.EscChars.L-1
.3 cmp DIR.EscChars,x
beq .4
dex
bpl .3
bmi .9
.4 lda DIR.EscCodes,x
.7 ora DIR.Byte
jsr OUT.EmitByte
bcc .2
.9 lda #E.SYNTAX.ERROR
sec
rts
.8 clc
DIR.CZ.RTS rts
*---------------------------------------
DIR.CZ jsr DIR.CS
bcs DIR.CZ.RTS
lda #0
jmp OUT.EmitByte
*---------------------------------------
DIR.BS jsr SRC.GetNextCharNB
bcs .98
jsr EXP.ResetAcc
jsr EXP.Eval
bcs .9
lda SRC.ACC+3
ora SRC.ACC+2
bne .99
lda SRC.ACC
eor #$ff
sta DIR.Word
lda SRC.ACC+1
eor #$ff
sta DIR.Word+1
stz DIR.Byte
jsr SRC.GetChar
bcs .1
cmp #C.SPACE
beq .1
cmp #','
bne .98
jsr EXP.ResetAcc
jsr EXP.Eval
bcs .9
lda SRC.ACC+3
ora SRC.ACC+2
ora SRC.ACC+1
bne .99
lda SRC.ACC
sta DIR.Byte
.1 inc DIR.Word
bne .2
inc DIR.Word+1
beq .8
.2 lda DIR.Byte
jsr OUT.EmitByte
bcc .1
rts
.8 clc
.9 rts
.99 lda #E.RANGE
sec
rts
.98 lda #E.SYNTAX.ERROR
sec
rts
*---------------------------------------
DIR.DA jsr SRC.GetNextCharNB
bcs .98
.1 jsr EXP.ResetAcc
jsr EXP.Eval
bcs .9
ldy #0
ldx SRC.ACC.SIZE
.2 lda SRC.ACC,y
jsr OUT.EmitByte
bcs .9
iny
dex
bne .2
.3 jsr SRC.GetChar
bcs .8
cmp #C.SPACE
beq .8
cmp #','
bne .98
jsr SRC.GetNextChar
bcc .1
.98 lda #E.SYNTAX.ERROR
sec
.9 rts
.8 clc
rts
*---------------------------------------
DIR.DO >LDA.G ASM.DO.StackPtr
tay
inc
cmp #DO.MAXDEPTH
bcs .98
tya
beq .1
* clc
adc #ASM.DO.Stack-1
tay
lda (pData),y Previous DO is false?
bne .1
>INC.G ASM.DO.StackPtr yes,stack FALSE
* clc
adc #ASM.DO.Stack-1
tay
lda #0
bra .8
.1 jsr SRC.GetNextCharNB
bcs .99
jsr EXP.ResetAcc
jsr EXP.Eval
bcs .99
>INC.G ASM.DO.StackPtr
* clc
adc #ASM.DO.Stack-1
tay
lda SRC.ACC
ora SRC.ACC+1
ora SRC.ACC+2
ora SRC.ACC+3
beq .8
lda #$ff
.8 sta (pData),y
clc
rts
.98 lda #E.TOO.MANY.DO
sec
.99 rts
*---------------------------------------
DIR.EL >LDA.G ASM.DO.StackPtr
beq .9
tax
dec
beq .1 no previous DO context
clc
adc #ASM.DO.Stack-1
tay
lda (pData),y
beq .8 previous is FALSE
.1 txa
clc
adc #ASM.DO.Stack-1
tay
lda (pData),y
eor #$ff
sta (pData),y
.8 clc
rts
.9 lda #E.ELSE.WITHOUT.DO
sec
rts
*---------------------------------------
DIR.EM lda #E.MACRO.INV.DEF
sec
rts
*---------------------------------------
DIR.DU >LDA.G ASM.DU.ON
bmi DIR.EP.ILLEGAL
lda #$80
sta (pData),y
ldy #ASM.PC.DU
jmp DIR.SavePC
*---------------------------------------
DIR.PH >LDA.G ASM.PH.ON
bmi DIR.EP.ILLEGAL
lda #$80
sta (pData),y
ldy #ASM.PC.PH
jsr DIR.SavePC
jmp DIR.OR
*---------------------------------------
DIR.ED >LDA.G ASM.DU.ON
bpl DIR.EP.ILLEGAL
lda #0
sta (pData),y
ldy #ASM.PC.DU
jmp DIR.RestorePC
*---------------------------------------
DIR.EP >LDA.G ASM.PH.ON
bpl .9
lda #0
sta (pData),y
ldy #ASM.PC.PH
jmp DIR.RestorePC
.9
DIR.EP.ILLEGAL lda #E.ILLEGAL.DIR
sec
DIR.EP.RTS rts
*---------------------------------------
DIR.SE sec
.HS 90 BCC
*---------------------------------------
DIR.EQ clc
lda #$ff
>STA.G OUT.bEquate
>LDA.G SYM.BufPtr
beq DIR.EP.ILLEGAL not in global symbol context
eor #SYMG
beq .1
bcs DIR.EP.ILLEGAL .SE not allowed in local/private
bcc .10 .EQ in local, skip F update
.1 ror A = 0 : CS = SYMG.F.RW
ora #SYMG.F.EQU
sta SRC.ACC.F
.10 jsr SRC.GetNextCharNB
bcs .9
jsr EXP.ResetAccV keep F
jsr EXP.Eval
bcs DIR.EP.RTS
>LDA.G SYM.BufPtr
cmp #SYMG
beq .12
tay
ldx #3 we are in local/private
.11 lda SRC.ACC,x update value
dey
sta (ZPSymbolBuf),y
dex
bpl .11
clc
rts
.12 ldy #SYMG-1
.13 lda SRC.ACC.F,y
sta (ZPSymbolBuf),y
dey
bpl .13
>LDA.G ASM.PASS
bne .2
jmp SYM.StoreGlobal
.2 jmp SYM.UpdateGlobal
.9 lda #E.SYNTAX.ERROR
sec
rts
*---------------------------------------
DIR.FI >LDA.G ASM.DO.StackPtr
beq DIR.EP.ILLEGAL
dec
sta (pData),y
clc
rts
*---------------------------------------
DIR.HS clc
.HS B0 BCS
DIR.HX sec
ror DIR.Word
jsr SRC.GetNextCharNB
bcs .99
jsr SRC.IsDigit16
bcs .99
.1 sta DIR.Byte
jsr SRC.GetNextChar
bcc .2
jmp OUT.EmitByte
.2 jsr SRC.IsDigit16
bcc .3
cmp #','
beq .22
cmp #'.'
bne .99
.22 lda DIR.Byte
jsr OUT.EmitByte
bcc .5
rts
*---------------------------------------
.3 bit DIR.Word
bmi .30
asl DIR.Byte
asl DIR.Byte
asl DIR.Byte
asl DIR.Byte
bra .4
.30 asl
asl
asl
asl
.4 ora DIR.Byte
jsr OUT.EmitByte
bcs .9
jsr SRC.GetNextChar
bcs .8
cmp #C.SPACE
beq .8
jsr SRC.IsDigit16
bcc .1
cmp #','
beq .5
cmp #'.'
bne .99
.5 jsr SRC.GetNextChar
bcs .99
jsr SRC.IsDigit16
bcc .1
.99 lda #E.SYNTAX.ERROR
sec
.9 rts
.8 clc
rts
*---------------------------------------
DIR.IN jsr SRC.GetNextCharNB
bcs .9
>LDYA ZPLinePtr
jmp FIO.OpenFile
.9 lda #E.SYNTAX.ERROR
sec
rts
*---------------------------------------
DIR.LI jsr SRC.GetNextChar
bcs .9
>LDYA L.T.LI
jsr SRC.GetKeyword
bcs .9
jsr .7
jsr SRC.GetChar
bcs .8
cmp #','
beq DIR.LI
cmp #C.SPACE
beq .8
.9 lda #E.SYNTAX.ERROR
sec
rts
.7 jmp (J.LI,x)
.8 clc
rts
DIR.LI.ON ldy #ASM.LI.ON
sec
bra DIR.LI.APPLY
DIR.LI.OFF ldy #ASM.LI.ON
clc
bra DIR.LI.APPLY
DIR.LI.CON ldy #ASM.LI.CON
sec
bra DIR.LI.APPLY
DIR.LI.COFF ldy #ASM.LI.CON
clc
bra DIR.LI.APPLY
DIR.LI.MON ldy #ASM.LI.MON
sec
bra DIR.LI.APPLY
DIR.LI.MOFF ldy #ASM.LI.MON
clc
bra DIR.LI.APPLY
DIR.LI.XON ldy #ASM.LI.XON
sec
bra DIR.LI.APPLY
DIR.LI.XOFF ldy #ASM.LI.XON
clc
DIR.LI.APPLY lda #0
ror
sta (pData),y
rts
*---------------------------------------
DIR.MA >LDA.G ASM.MA.ON
bmi .9
>LDA.G ASM.PASS If Pass#2, ignore
bne .8
jsr SRC.GetNextCharNB
beq DIR.OP.SYNERR
>PUSHB.G MAC.hList
>PUSHW ZPLinePtr
>PUSHWI 0 ScopeID
>SYSCALL SListNewKey
bcs .99
>STYA.G MAC.ID
.8 lda #$ff
>STA.G ASM.MA.ON
clc
rts
.9 lda #E.MACRO.INV.DEF
sec
.99 rts
*---------------------------------------
DIR.OP jsr SRC.GetNextCharNB
bcs DIR.OP.SYNERR
>LDYA ZPLinePtr
jmp FIO.LOAD.CPU
DIR.OP.SYNERR lda #E.SYNTAX.ERROR
sec
rts
*---------------------------------------
DIR.OR jsr SRC.GetNextCharNB
bcs DIR.OP.SYNERR
jsr EXP.ResetAcc
jsr EXP.Eval
bcs .9
ldx #0
ldy #ASM.PC
.1 lda SRC.ACC,x
sta (pData),y
iny
inx
cpx #4
bne .1
>LDA.G ASM.DU.ON
bmi .8
>LDA.G ASM.PH.ON
bmi .8
lda SRC.ACC
>STA.G DST.AUXTYPE
lda SRC.ACC+1
iny
sta (pData),y
.8 clc
.9 rts
*---------------------------------------
DIR.EN
*---------------------------------------
DIR.PG
*---------------------------------------
DIR.TI
*---------------------------------------
DIR.US
*---------------------------------------
DIR.TA
DIR.TA.8 clc
DIR.TA.RTS rts
*---------------------------------------
DIR.TF >LDA.G ASM.PASS If Pass#1, ignore
beq DIR.TA.8
>LDA.G ArgDstFile
beq .1
>SYSCALL ArgV
bra .2
.1 jsr SRC.GetNextCharNB
bcs DIR.OP.SYNERR
>LDYA ZPLinePtr
.2 >SYSCALL StrDup
bcs DIR.TA.RTS
>STYA ZPPtr1
stx ZPPtr2
lda #S.FI.T.BIN
sta ZPPtr2+1
ldy #$ff
.3 iny
lda (ZPPtr1),y
beq .7
cmp #','
bne .3
lda #0
sta (ZPPtr1),y
iny
lda (ZPPtr1),y
cmp #'T'
beq .4
.30 lda #E.SYNTAX.ERROR
bra .9
.4 ldx #0
.5 iny
lda (ZPPtr1),y
cmp DIR.SYS,x including \0
bne .30
inx
cpx #4
bne .5
lda #S.FI.T.SYS
sta ZPPtr2+1
.7 >PUSHW ZPPtr1
>PUSHWZ Allocate
>SYSCALL RealPath
bcs .9
txa
>STA.G DST.hFILENAME
>SYSCALL GetMemPtr
>PUSHYA
>PUSHBI O.WRONLY+O.CREATE
>PUSHB ZPPtr2+1 Type
>PUSHW.G DST.AUXTYPE
>SYSCALL FOpen
bcs .9
>STA.G DST.hREFNUM
clc
.9 php
pha
lda ZPPtr2
>SYSCALL FreeMem
pla
plp
rts
*---------------------------------------
DIR.SavePC phy
plx
ldy #ASM.PC+3
.1 lda (pData),y
pha
dey
cpy #ASM.PC-1
bne .1
phx
ply
ldx #3
.2 pla
sta (pData),y
iny
dex
bpl .2
clc
rts
*---------------------------------------
DIR.RestorePC ldx #3
.1 lda (pData),y
pha
iny
dex
bpl .1
ldy #ASM.PC+3
ldx #3
.2 pla
sta (pData),y
dey
dex
bpl .2
clc because of JMP to it
rts
*---------------------------------------
MAN
SAVE usr/src/bin/asm.s.dir
LOAD usr/src/bin/asm.s
ASM