Kernel 0.9.1 : ASM, Local SYM ok, MACROS in progress

This commit is contained in:
Rémy GIBERT 2018-04-06 16:10:02 +01:00
parent 4358169b40
commit 79c593f907
12 changed files with 520 additions and 244 deletions

View File

@ -15,21 +15,21 @@ Multi-CPU macro assembler based on S-C MASM 3.0 dialect
| .BS | Block Storage | S-C,A2osX | Working | | | | .BS | Block Storage | S-C,A2osX | Working | | |
| .DA | Data | S-C,A2osX | Working | | | | .DA | Data | S-C,A2osX | Working | | |
| .DO | conditional start | S-C,A2osX | Working | | | | .DO | conditional start | S-C,A2osX | Working | | |
| .DU,.DUMMY | begin DUmmy section | S-C,A2osX | In Progress | | | | .DU,.DUMMY | begin DUmmy section | S-C,A2osX | Working | | |
| .ED | End Dmmy section | S-C,A2osX | In Progress | | | | .ED | End Dmmy section | S-C,A2osX | Working | | |
| .DA | | S-C,A2osX | In Progress | | | | .DA | DAta | S-C,A2osX | Working | | |
| .ELSE | conditional ELSE | S-C,A2osX | Working | | | | .ELSE | conditional ELSE | S-C,A2osX | Working | | |
| .EM | End Macro | S-C,A2osX | In Progress | | | | .EM | End Macro | S-C,A2osX | Working | | |
| .EN | ENd of source code | S-C,A2osX | In Progress | | | | .EN | ENd of source code | S-C,A2osX | In Progress | | |
| .EP | End Phase| S-C,A2osX | In Progress | | | | .EP | End Phase | S-C,A2osX | Working | | |
| .EQ | EQuate | S-C,A2osX | In Progress | | | | .EQ | EQuate | S-C,A2osX | Working | | |
| .FIN | conditional end| S-C,A2osX | Working | | | | .FIN | conditional end| S-C,A2osX | Working | | |
| .PH | PHase start| S-C,A2osX | Working | | | | .PH | PHase start| S-C,A2osX | Working | | |
| .HS | Hex String | S-C,A2osX | Working | `HS FE1A78` delimiter allowed : `HS 00.11,22` | | | .HS | Hex String | S-C,A2osX | Working | `HS FE1A78` delimiter allowed : `HS 00.11,22` | |
| .IN,.INB,.INBx | | S-C,A2osX | Working | | | | .IN,.INB,.INBx | | S-C,A2osX | Working | | |
| .LI,.LIST | | S-C,A2osX | Working | | | | .LI,.LIST | | S-C,A2osX | Working | | |
| .MA | MAcro deffinition | S-C,A2osX | Working | | | | .MA | MAcro deffinition | S-C,A2osX | Working | | |
| .OP | OPCode | S-C,A2osX | Working | `.OP cpu` where cpu is one of 6502,65C02,65R02,65816,Z80,S16 | | | .OP | OPCode | S-C,A2osX | Working | `.OP cpu` where cpu is one of 6502,65C02,65R02,65816,Z80,SW16 | |
| .OR | ORigin | S-C,A2osX | Working | | | | .OR | ORigin | S-C,A2osX | Working | | |
| .PG | PaGe control | S-C,A2osX | IGNORED | | | | .PG | PaGe control | S-C,A2osX | IGNORED | | |
| .PH | PHase | S-C,A2osX | Working | | | | .PH | PHase | S-C,A2osX | Working | | |

Binary file not shown.

Binary file not shown.

View File

@ -180,7 +180,7 @@ DIR.DA jsr SRC.GetNextCharNB
*--------------------------------------- *---------------------------------------
DIR.DO >LDA.G ASM.DO.StackPtr DIR.DO >LDA.G ASM.DO.StackPtr
inc inc
cmp #SRC.DO.MAXDEPTH cmp #DO.MAXDEPTH
bcs .98 bcs .98
jsr SRC.GetNextCharNB jsr SRC.GetNextCharNB
@ -202,7 +202,7 @@ DIR.DO >LDA.G ASM.DO.StackPtr
lda #$ff lda #$ff
.1 sta (pData),y .1 sta (pData),y
lda #$FF lda #$FF
>STA.G ASM.DO.ON >STA.G ASM.DO.ON
clc clc
@ -212,10 +212,36 @@ DIR.DO >LDA.G ASM.DO.StackPtr
sec sec
.99 rts .99 rts
*--------------------------------------- *---------------------------------------
DIR.DU clc DIR.DU >LDA.G ASM.DU.ON
bmi DIR.DU.ERR
lda #$80
sta (pData),y
ldy #ASM.PC.DU
jsr DIR.SavePC
clc
rts
DIR.DU.ERR lda #ERR.INV.DIR
sec
rts rts
*--------------------------------------- *---------------------------------------
DIR.ED clc DIR.ED >LDA.G ASM.DU.ON
bpl DIR.DU.ERR
lda #0
sta (pData),y
ldy #ASM.PC.DU
jsr DIR.RestorePC
clc
rts
.9 lda #ERR.INV.DIR
sec
rts rts
*--------------------------------------- *---------------------------------------
DIR.EL >LDA.G ASM.DO.StackPtr DIR.EL >LDA.G ASM.DO.StackPtr
@ -231,7 +257,6 @@ DIR.EL >LDA.G ASM.DO.StackPtr
clc clc
rts rts
.9 lda #ERR.ELSE.WITHOUT.DO .9 lda #ERR.ELSE.WITHOUT.DO
sec sec
rts rts
@ -243,30 +268,15 @@ DIR.EM lda #ERR.MACRO.INV.DEF
DIR.EN clc DIR.EN clc
rts rts
*--------------------------------------- *---------------------------------------
DIR.EP ldy #ASM.PH.ON DIR.EP >LDA.G ASM.PH.ON
lda (pData),y
bpl .9 bpl .9
lda #0 lda #0
sta (pData),y sta (pData),y
ldy #ASM.PC.PH+3 ldy #ASM.PC.PH
ldx #3
jsr DIR.RestorePC
.1 lda (pData),y
pha
dey
dex
bpl .1
ldy #ASM.PC
ldx #3
.2 pla
sta (pData),y
iny
dex
bpl .2
clc clc
rts rts
@ -274,12 +284,15 @@ DIR.EP ldy #ASM.PH.ON
sec sec
rts rts
*--------------------------------------- *---------------------------------------
DIR.SE lda #SYMG.F.RW DIR.SE sec
sta SRC.ACC.F .HS 90 BCC
*--------------------------------------- *---------------------------------------
DIR.EQ lda (ZPGlobalBuf) DIR.EQ clc
lda (ZPGlobalBuf)
beq .99 beq .99
ror
>STA.G OUT.bEquate >STA.G OUT.bEquate
jsr SRC.GetNextCharNB jsr SRC.GetNextCharNB
@ -291,11 +304,7 @@ DIR.EQ lda (ZPGlobalBuf)
jsr SYM.Acc2Global jsr SYM.Acc2Global
bcs .9 bcs .9
jsr SYM.FlushGlobal jmp SYM.FlushGlobal
bcs .9
lda #0
sta (ZPGlobalBuf)
rts
.99 lda #ERR.SYNTAX.ERROR .99 lda #ERR.SYNTAX.ERROR
sec sec
@ -407,7 +416,6 @@ DIR.IN jsr SRC.GetNextCharNB
plp plp
rts rts
.9 lda #ERR.SYNTAX.ERROR .9 lda #ERR.SYNTAX.ERROR
sec sec
rts rts
@ -475,7 +483,7 @@ DIR.LI.APPLY lda #0
sta (pData),y sta (pData),y
rts rts
*--------------------------------------- *---------------------------------------
DIR.MA >LDA.G MAC.bAdd DIR.MA >LDA.G ASM.MA.ON
bmi .9 bmi .9
>LDA.G ASM.PASS If Pass#2, ignore >LDA.G ASM.PASS If Pass#2, ignore
@ -484,17 +492,20 @@ DIR.MA >LDA.G MAC.bAdd
jsr SRC.GetNextCharNB jsr SRC.GetNextCharNB
beq DIR.OP.SYNERR beq DIR.OP.SYNERR
jsr SYM.GetName
bcs .99
jsr MAC.New jsr MAC.New
.8 lda #$ff .8 lda #$ff
>STA.G MAC.bAdd >STA.G ASM.MA.ON
clc clc
rts rts
.9 lda #ERR.MACRO.INV.DEF .9 lda #ERR.MACRO.INV.DEF
sec sec
rts .99 rts
*--------------------------------------- *---------------------------------------
DIR.OP jsr SRC.GetNextCharNB DIR.OP jsr SRC.GetNextCharNB
bcs DIR.OP.SYNERR bcs DIR.OP.SYNERR
@ -527,30 +538,14 @@ DIR.OR jsr SRC.GetNextCharNB
DIR.PG clc DIR.PG clc
rts rts
*--------------------------------------- *---------------------------------------
DIR.PH ldy #ASM.PH.ON DIR.PH >LDA.G ASM.PH.ON
lda (pData),y
bmi .9 bmi .9
lda #$80 lda #$80
sta (pData),y sta (pData),y
ldy #ASM.PC+3
ldx #3
.1 lda (pData),y
pha
dey
dex
bpl .1
ldy #ASM.PC.PH ldy #ASM.PC.PH
ldx #3 jsr DIR.SavePC
.2 pla
sta (pData),y
iny
dex
bpl .2
jmp DIR.OR jmp DIR.OR
@ -570,6 +565,46 @@ DIR.TI clc
DIR.US clc DIR.US clc
rts rts
*--------------------------------------- *---------------------------------------
DIR.SavePC ldx #3
phy
ldy #ASM.PC+3
.1 lda (pData),y
pha
dey
dex
bpl .1
ply
ldx #3
.2 pla
sta (pData),y
iny
dex
bpl .2
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
rts
*---------------------------------------
MAN MAN
SAVE /A2OSX.BUILD/BIN/DEV/ASM.S.DIR SAVE /A2OSX.BUILD/BIN/DEV/ASM.S.DIR
LOAD /A2OSX.BUILD/BIN/DEV/ASM.S LOAD /A2OSX.BUILD/BIN/DEV/ASM.S

View File

@ -51,7 +51,7 @@ EXP.Eval.Next lda #2
cmp #'.' Local Label? cmp #'.' Local Label?
bne .12 bne .12
jsr EXP.GetLSymIDInAcc jsr EXP.GetSymL
bcs .14 bcs .14
jmp EXP.EvalOperator jmp EXP.EvalOperator
@ -176,17 +176,16 @@ EXP.EvalOperator
txa txa
>STA.G EXP.Operator >STA.G EXP.Operator
ldx #5 ldx #4
.8 lda SRC.ACC.F,x .8 lda SRC.ACC.SIZE,x
sta SRC.ARG.F,x sta SRC.ARG.SIZE,x
dex dex
bpl .8 bpl .8
jmp EXP.Eval.Next0 jmp EXP.Eval.Next0
*--------------------------------------- *---------------------------------------
EXP.GetLSymIDInAcc EXP.GetSymL jsr SRC.GetNextChar
jsr SRC.GetNextChar
bcs .9 bcs .9
jsr SRC.GetDecimal jsr SRC.GetDecimal
@ -199,12 +198,18 @@ EXP.GetLSymIDInAcc
beq EXP.EvalExitSYN .0 is not allowed beq EXP.EvalExitSYN .0 is not allowed
jsr SYM.LookupLocal jsr SYM.LookupLocal
bcs EXP.EvalExitUND bcc .8
>LDA.G ASM.PASS pass#2?
bne EXP.EvalExitUND
lda #0 Mark ACC as pending
sta SRC.ACC.SIZE
clc
rts rts
.9 lda #ERR.SYNTAX.ERROR .9 lda #ERR.SYNTAX.ERROR
sec sec
rts .8 rts
*--------------------------------------- *---------------------------------------
EXP.GetSymG jsr SYM.LookupGlobal EXP.GetSymG jsr SYM.LookupGlobal
bcs .2 bcs .2
@ -214,10 +219,10 @@ EXP.GetSymG jsr SYM.LookupGlobal
clc clc
rts rts
.2 >LDA.G ASM.PASS pass#2? .2 >LDA.G ASM.PASS pass#2?
bne .99 yes, undefined symbol bne EXP.EvalExitUND yes, undefined symbol
lda #0 Mark ACC as pending lda #0 Mark ACC as pending
sta SRC.ACC.SIZE sta SRC.ACC.SIZE
.3 jsr SRC.GetNextChar .3 jsr SRC.GetNextChar
@ -237,33 +242,6 @@ EXP.GetSymG jsr SYM.LookupGlobal
sec sec
.9 rts .9 rts
*--------------------------------------- *---------------------------------------
EXP.SetAccA sta SRC.ACC
stz SRC.ACC+1
stz SRC.ACC+2
stz SRC.ACC+3
lda #1
sta SRC.ACC.SIZE
rts
*---------------------------------------
EXP.Compute lda SRC.ACC.F
and SRC.ARG.F
and #SYMG.F.RESOLVED
beq .1
asl
tax
jmp (J.EXP.OP-2,x)
.1 >LDA.G ASM.PASS
beq .8
lda #ERR.UNDEF.SYMBOL
sec
rts
.8 clc
rts
*---------------------------------------
EXP.MOD.8.3 lda SRC.ACC+2 EXP.MOD.8.3 lda SRC.ACC+2
bra EXP.MOD.8 bra EXP.MOD.8
EXP.MOD.8.2 lda SRC.ACC+1 EXP.MOD.8.2 lda SRC.ACC+1
@ -281,6 +259,25 @@ EXP.MOD.32 lda #4
clc clc
rts rts
*--------------------------------------- *---------------------------------------
EXP.Compute ldx SRC.ACC.SIZE
beq .1
ldx SRC.ARG.SIZE
beq .1
asl
tax
jmp (J.EXP.OP-2,x)
.1 >LDA.G ASM.PASS
beq .8
lda #ERR.UNDEF.SYMBOL
sec
rts
.8 clc
rts
*---------------------------------------
EXP.OP.EOR ldx #3 EXP.OP.EOR ldx #3
.1 lda SRC.ARG,x .1 lda SRC.ARG,x
@ -308,8 +305,12 @@ EXP.OP.AND ldx #3
bpl .1 bpl .1
rts rts
*--------------------------------------- *---------------------------------------
EXP.OP.LOW clc EXP.OP.LOW jsr EXP.OP.SUB
rts
lda #0
rol
jmp EXP.SetAccA
*--------------------------------------- *---------------------------------------
EXP.OP.EQU ldx #0 ARG-ACC->ACC EXP.OP.EQU ldx #0 ARG-ACC->ACC
ldy #4 ldy #4
@ -334,13 +335,17 @@ EXP.OP.EQU ldx #0 ARG-ACC->ACC
.9 rts .9 rts
*--------------------------------------- *---------------------------------------
EXP.OP.GRT EXP.OP.GRT jsr EXP.OP.SUB
clc
rts lda #0
rol
eor #1
jmp EXP.SetAccA
*--------------------------------------- *---------------------------------------
EXP.OP.ADD ldx #0 ARG-ACC->ACC EXP.OP.ADD ldx #0 ARG-ACC->ACC
ldy #4 ldy #4
clc clc
.1 lda SRC.ARG,x .1 lda SRC.ARG,x
@ -357,7 +362,7 @@ EXP.OP.ADD ldx #0 ARG-ACC->ACC
*--------------------------------------- *---------------------------------------
EXP.OP.SUB ldx #0 ARG-ACC->ACC EXP.OP.SUB ldx #0 ARG-ACC->ACC
ldy #4 ldy #4
sec sec
.1 lda SRC.ARG,x .1 lda SRC.ARG,x
@ -382,6 +387,15 @@ EXP.OP.DIV
clc clc
rts rts
*--------------------------------------- *---------------------------------------
EXP.SetAccA sta SRC.ACC
stz SRC.ACC+1
stz SRC.ACC+2
stz SRC.ACC+3
lda #1
sta SRC.ACC.SIZE
clc
rts
*---------------------------------------
MAN MAN
SAVE /A2OSX.BUILD/BIN/DEV/ASM.S.EXP SAVE /A2OSX.BUILD/BIN/DEV/ASM.S.EXP
LOAD /A2OSX.BUILD/BIN/DEV/ASM.S LOAD /A2OSX.BUILD/BIN/DEV/ASM.S

View File

@ -111,7 +111,7 @@ FIO.OpenFile >STYA ZPPtr1
ldy #SRC.COUNT ldy #SRC.COUNT
lda (pData),y lda (pData),y
cmp #SRC.IN.MAXDEPTH cmp #IN.MAXDEPTH
bne .1 bne .1
lda #ERR.SRC.TOO.MANY.IN lda #ERR.SRC.TOO.MANY.IN

View File

@ -5,7 +5,7 @@ AUTO 4,1
MAC.Init >SYSCALL SListNew MAC.Init >SYSCALL SListNew
bcs .9 bcs .9
>STA.G MAC.hMacros >STA.G MAC.hMacroList
>LDYAI 256 >LDYAI 256
>SYSCALL GetMem.YA >SYSCALL GetMem.YA
@ -13,16 +13,43 @@ MAC.Init >SYSCALL SListNew
>STYA ZPMacroBuf >STYA ZPMacroBuf
txa txa
>STA.G MAC.hBuf >STA.G MAC.hMacroBuf
>SYSCALL SListNew
bcs .9
>STA.G MAC.hCtxList
>LDYAI 256
>SYSCALL GetMem.YA
bcs .9
>STYA ZPCtxBuf
txa
>STA.G MAC.hCtxBuf
.9 rts .9 rts
*--------------------------------------- *---------------------------------------
MAC.Quit >LDA.G MAC.hBuf MAC.Reset >STZ.G MAC.CtxID
iny
sta (pData),y
rts
*---------------------------------------
MAC.Quit >LDA.G MAC.hCtxBuf
beq .1 beq .1
>SYSCALL FreeMem.A >SYSCALL FreeMem.A
.1 >LDA.G MAC.hMacros .1 >LDA.G MAC.hCtxList
beq .2
>SYSCALL SListFree.A
.2 >LDA.G MAC.hMacroBuf
beq .3
>SYSCALL FreeMem.A
.3 >LDA.G MAC.hMacroList
beq .8 beq .8
>SYSCALL SListFree.A >SYSCALL SListFree.A
@ -43,8 +70,8 @@ MAC.AddChar >LDA.G ASM.PASS If Pass#2, ignore
tax tax
lda (ZPMacroBuf) lda (ZPMacroBuf)
* cmp #254 cmp #254
* beq .9 CS if EQ beq .9 CS if EQ
inc inc
sta (ZPMacroBuf) sta (ZPMacroBuf)
@ -74,11 +101,36 @@ MAC.AddChar >LDA.G ASM.PASS If Pass#2, ignore
MAC.Store >LDA.G ASM.PASS If Pass#2, ignore MAC.Store >LDA.G ASM.PASS If Pass#2, ignore
bne .8 bne .8
lda (ZPMacroBuf)
beq .8
>PUSHB.G MAC.hMacroList
>PUSHW ZPNameBuf
>PUSHW ZPMacroBuf
>SYSCALL SListAdd
rts
.8 clc .8 clc
rts rts
*--------------------------------------- *---------------------------------------
MAC.Lookup >PUSHB.G MAC.hMacroList
>PUSHW ZPLinePtr
>PUSHW ZPMacroBuf
>SYSCALL SListLookup
bcs .9
adc ZPLinePtr
sta ZPLinePtr
bcc .8
inc ZPLinePtr+1
clc
.8
.9 rts
*---------------------------------------
MAC.NewOrGetCtx
*---------------------------------------
*---------------------------------------
MAN MAN
SAVE /A2OSX.BUILD/BIN/DEV/ASM.S.MAC SAVE /A2OSX.BUILD/BIN/DEV/ASM.S.MAC
LOAD /A2OSX.BUILD/BIN/DEV/ASM.S LOAD /A2OSX.BUILD/BIN/DEV/ASM.S

View File

@ -85,7 +85,7 @@ OUT.PrintLineOn clc
>LDA.G ASM.LI.ON >LDA.G ASM.LI.ON
bpl .9 bpl .9
>LDA.G MAC.bAdd MACRO Mode ? >LDA.G ASM.MA.ON MACRO Mode ?
bpl .1 bpl .1
>LDA.G ASM.LI.MON >LDA.G ASM.LI.MON
@ -177,7 +177,8 @@ OUT.Print1 >DEC.G OUT.LineCnt
lda #20 lda #20
sta (pData),y sta (pData),y
>DEBUG lda #$80
>STA.G bPause
.8 rts .8 rts
*--------------------------------------- *---------------------------------------

View File

@ -21,7 +21,7 @@ SRC.ParseLine jsr OUT.Reset
lda (pData),y lda (pData),y
beq .8 beq .8
.1 >LDA.G MAC.bAdd .1 >LDA.G ASM.MA.ON
bmi SRC.ParseLine.MACRO bmi SRC.ParseLine.MACRO
jmp SRC.ParseLine.LABEL jmp SRC.ParseLine.LABEL
@ -80,7 +80,7 @@ SRC.ParseLine.Macro
.22 jsr MAC.Store .22 jsr MAC.Store
bcs SRC.ParseLine.RTS bcs SRC.ParseLine.RTS
>STZ.G MAC.bAdd >STZ.G ASM.MA.ON
.8 clc .8 clc
rts rts
@ -208,10 +208,37 @@ SRC.ParseLine.Dir
jmp (J.DIRECTIVES,x) jmp (J.DIRECTIVES,x)
*--------------------------------------- *---------------------------------------
SRC.ParseLine.ExecMacro SRC.ParseLine.ExecMacro
jsr SRC.GetNextChar skip '>'
bcs .90
jsr MAC.Lookup
bcs .90
>LDA.G ASM.MA.StackPtr
cmp #MA.MAXDEPTH
beq .91
clc
adc #ASM.MA.StackPtr
tay
>INC.G ASM.MA.StackPtr
clc clc
rts rts
.90 lda #ERR.MACRO.INV
sec
rts
.91 lda #ERR.MACRO.INV
sec
rts
*--------------------------------------- *---------------------------------------
SRC.ParseLine.OpCode SRC.ParseLine.OpCode
stz SRC.AM.StrBuf stz SRC.AM.StrBuf
@ -366,7 +393,7 @@ SRC.ParseLine.AMCheck
* >PUSHW L.SRC.AM.StrBuf * >PUSHW L.SRC.AM.StrBuf
* >LDYA L.MSG.PSTRCRLF * >LDYA L.MSG.PSTRCRLF
* >SYSCALL PrintF.YA * >SYSCALL PrintF.YA
* >DEBUG
lda SRC.AM.StrBuf lda SRC.AM.StrBuf
beq SRC.ParseLine.OPAMCheckFF beq SRC.ParseLine.OPAMCheckFF
@ -424,7 +451,7 @@ SRC.ParseLine.OPAMCheck
.10 lda (ZPOpDefPtr) .10 lda (ZPOpDefPtr)
.1 >CMP.G SRC.AMID .1 >CMP.G SRC.AMID
beq .3 beq SRC.ParseLine.Emit
ldy #1 ldy #1
lda (ZPOpDefPtr),y lda (ZPOpDefPtr),y
@ -440,8 +467,9 @@ SRC.ParseLine.OPAMCheck
.99 lda #ERR.INV.AM.4.OC .99 lda #ERR.INV.AM.4.OC
sec sec
rts rts
*---------------------------------------
.3 stz SRC.ACCTMP index in ACC SRC.ParseLine.Emit
stz SRC.ACCTMP index in ACC
ldy #1 ldy #1
lda (ZPOpDefPtr),y lda (ZPOpDefPtr),y
@ -450,7 +478,8 @@ SRC.ParseLine.OPAMCheck
.4 lda (ZPOpDefPtr),y .4 lda (ZPOpDefPtr),y
cmp #'a cmp #'a
bcs .5 bcs .5 lowercase, go compute address
jsr SRC.IsDigit16 jsr SRC.IsDigit16
asl asl
asl asl
@ -469,10 +498,11 @@ SRC.ParseLine.OPAMCheck
iny iny
dec SRC.ACCTMP+1 dec SRC.ACCTMP+1
bne .4 bne .4
clc clc
rts rts
.5 bne .6 .5 bne .6 cmp #'a'....
ldx SRC.ACCTMP ldx SRC.ACCTMP
inc SRC.ACCTMP inc SRC.ACCTMP
@ -480,28 +510,137 @@ SRC.ParseLine.OPAMCheck
bra .50 bra .50
.6 cmp #'r .6 cmp #'r
bne .99 bne .7
lda SRC.ACC.SIZE
beq .50 Emit 00 if pending symbol (pass #1)
jsr SRC.ComputeRel8
bcs .91
bra .50
.7 cmp #'l
bne .90
ldx SRC.ACCTMP lda SRC.ACC.SIZE
inc SRC.ACCTMP bne .71
lda ASM.PC,x
sec
sbc SRC.ACC,x
pha
jsr OUT.EmitByte Emit 00 00 if pending symbol (pass #1)
bcs .9
lda #0
bra .50
pla .71 jsr SRC.ComputeRel16
bcs .91
lda SRC.ACC
jsr OUT.EmitByte
bcs .9
lda SRC.ACC+1
bra .50 bra .50
.8 clc .8 clc
.9 rts .9 rts
.90 lda #ERR.INV.T.FILE
sec
rts
.91 lda #ERR.RANGE
sec
rts
*--------------------------------------- *---------------------------------------
SRC.AddToBuf inc SRC.AM.StrBuf SRC.AddToBuf inc SRC.AM.StrBuf
ldy SRC.AM.StrBuf ldy SRC.AM.StrBuf
sta SRC.AM.StrBuf,y sta SRC.AM.StrBuf,y
rts rts
*--------------------------------------- *---------------------------------------
SRC.ComputeRel8 jsr SRC.ComputeRel
bcc .1
* positive : check 0<r<0000007F
lda SRC.ACC+3
ora SRC.ACC+2
ora SRC.ACC+1
bne .9
lda SRC.ACC
bmi .9
clc
rts
* negative : check FFFFFF80<r<FFFFFFFF
.1 lda SRC.ACC+3
and SRC.ACC+2
and SRC.ACC+1
inc
bne .9
lda SRC.ACC
bpl .9
clc
rts
.9 sec
rts
*---------------------------------------
SRC.ComputeRel16
jsr SRC.ComputeRel
bcc .1
* positive : check 0<r<00007FFF
lda SRC.ACC+3
ora SRC.ACC+2
bne .9
lda SRC.ACC+1
bmi .9
clc
rts
* negative : check FFFF8000<r<FFFFFFFF
.1 lda SRC.ACC+3
and SRC.ACC+2
inc
bne .9
lda SRC.ACC+1
bpl .9
clc
rts
.9 sec
rts
*---------------------------------------
SRC.ComputeRel phy
ldy #ASM.PC
clc
lda SRC.ACC
sbc (pData),y
sta SRC.ACC
iny
lda SRC.ACC+1
sbc (pData),y
sta SRC.ACC+1
iny
lda SRC.ACC+2
sbc (pData),y
sta SRC.ACC+2
iny
lda SRC.ACC+3
sbc (pData),y
sta SRC.ACC+3
ply
rts
*---------------------------------------
SRC.GetDecimal jsr SRC.GetChar SRC.GetDecimal jsr SRC.GetChar
beq .99 beq .99
@ -596,12 +735,7 @@ SRC.GetHex jsr SRC.GetNextChar skip '$'
sta SRC.ACC sta SRC.ACC
bra .1 bra .1
.8 lda #SYMG.F.RESOLVED .8 clc
sta SRC.ACC.F
lda #2
sta SRC.ACC.SIZE
clc
rts rts
.9 lda #ERR.VAL.TOO.BIG .9 lda #ERR.VAL.TOO.BIG

View File

@ -11,6 +11,10 @@ AUTO 4,1
* 2-5 : 32 bits Value * 2-5 : 32 bits Value
* 6+ : Local Symbols..... * 6+ : Local Symbols.....
*--------------------------------------- *---------------------------------------
* Local Symbol Record: (5 bytes)
* 0 : Local ID (1->255)
* 1-4 : 32 bits Value (PC)
*---------------------------------------
SYM.Init >SYSCALL SListNew SYM.Init >SYSCALL SListNew
bcs .9 bcs .9
@ -119,8 +123,7 @@ SYM.Dump stz ZPLinePtr
>LDYA L.MSG.PSTR >LDYA L.MSG.PSTR
>SYSCALL PrintF.YA >SYSCALL PrintF.YA
bcs .9 bcs .9
>DEBUG ldy #SYMG.SIZE
ldy #SYMG.SIZE-1
.4 tya .4 tya
@ -142,7 +145,7 @@ SYM.Dump stz ZPLinePtr
pla pla
>PUSHA >PUSHA
phy phy
>LDYA L.MSG.PSTR >LDYA L.MSG.LSYMBOL
>SYSCALL PrintF.YA >SYSCALL PrintF.YA
ply ply
bne .4 bne .4
@ -167,7 +170,7 @@ SYM.NewGlobal jsr SYM.LookupGlobal Pass #1; try to add global...
jsr SYM.PC2Global A=PC Size jsr SYM.PC2Global A=PC Size
lda #SYMG.SIZE-1 lda #SYMG.SIZE
sta (ZPGlobalBuf) sta (ZPGlobalBuf)
clc clc
rts rts
@ -212,8 +215,7 @@ SYM.LookupGlobal
bcc .8 bcc .8
inc ZPLinePtr+1 inc ZPLinePtr+1
clc clc
.8 .8
.9 rts .9 rts
*--------------------------------------- *---------------------------------------
@ -228,15 +230,19 @@ SYM.FlushGlobal lda (ZPGlobalBuf)
>PUSHW ZPNameBuf >PUSHW ZPNameBuf
>PUSHW ZPGlobalBuf >PUSHW ZPGlobalBuf
>SYSCALL SListAdd >SYSCALL SListAdd
rts bra .3
.2 >PUSHW.G SYM.GlobalID .2 >PUSHW.G SYM.GlobalID
>PUSHW ZPGlobalBuf >PUSHW ZPGlobalBuf
>SYSCALL SListUpdateByID >SYSCALL SListUpdateByID
.3 bcs .9
lda #0
sta (ZPGlobalBuf)
rts rts
.8 clc .8 clc
rts .9 rts
*--------------------------------------- *---------------------------------------
SYM.GetName jsr SRC.GetChar SYM.GetName jsr SRC.GetChar
bcs .9 bcs .9
@ -295,7 +301,6 @@ SYM.PC2Global ldx #4
.4 txa .4 txa
ora #SYMG.F.RESOLVED
ldy #SYMG.F ldy #SYMG.F
sta (ZPGlobalBuf),y sta (ZPGlobalBuf),y
@ -303,112 +308,132 @@ SYM.PC2Global ldx #4
rts rts
*--------------------------------------- *---------------------------------------
SYM.Acc2Global ldx #3 SYM.Acc2Global ldx #4
ldy #SYMG.V+3 ldy #SYMG.F+4
.1 lda SRC.ACC,x .1 lda SRC.ACC.SIZE,x
sta (ZPGlobalBuf),y sta (ZPGlobalBuf),y
dey dey
dex dex
bpl .1 bpl .1
lda SRC.ACC.SIZE
ora SRC.ACC.F
sta (ZPGlobalBuf),y
clc clc
rts rts
*--------------------------------------- *---------------------------------------
SYM.Lookup2Acc ldy #SYMG.V+3 SYM.Lookup2Acc ldy #SYMG.F+4
ldx #3 ldx #4
.1 lda (ZPLookupBuf),y .1 lda (ZPLookupBuf),y
sta SRC.ACC,x sta SRC.ACC.SIZE,x
dey dey
dex dex
bpl .1 bne .1
lda (ZPLookupBuf),y lda (ZPLookupBuf),y
and #SYMG.F.SIZE and #SYMG.F.SIZE
sta SRC.ACC.SIZE sta SRC.ACC.SIZE
lda (ZPLookupBuf),y
and #SYMG.F.SIZE^$ff
sta SRC.ACC.F
clc clc
rts rts
*--------------------------------------- *---------------------------------------
* Local Symbol Record: (6 bytes) * Local Symbol Record: (5 bytes)
* 0 : Local ID (1->255) * 0 : Local ID (1->255)
* 1 : Flags: * 1-4 : 32 bits Value (PC)
* b7=0=pending,1=resolved
* 2-5 : 32 bits Value (PC)
*--------------------------------------- *---------------------------------------
SYM.NewOrGetLocalA SYM.NewOrGetLocalA
tax Save ID tax Save ID
>LDA.G ASM.PASS lda (ZPGlobalBuf) not in a global label
bne SYM.GetLocal Pass #2: should be already defined... bne .1
lda #ERR.INV.LABEL
clc clc
rts rts
*---------------------------------------
SYM.AddLocal lda (ZPGlobalBuf) .1 >LDA.G ASM.PASS
bne SYM.LookupLocal.1 Pass #2: should be already defined...
SYM.NewLocal jsr SYM.LookupLocal.1 Pass #1; try to add
bcc .9 Already Defined
lda (ZPGlobalBuf)
tay tay
clc clc
adc #SYML.SIZE adc #SYML.SIZE
bcs .9 bcs .90
ldy #ASM.PC+4
.1 dey
lda (pData),y
pha
cpy #ASM.PC
bne .1
lda (ZPGlobalBuf)
tay
iny
txa Get Back ID txa Get Back ID
sta (ZPGlobalBuf),y sta (ZPGlobalBuf),y
iny
phy
ldx #4 ldx #4
ldy #ASM.PC+3
.1 lda (pData),y
pha
dey
dex
bne .1
ldx #4
ply
.2 pla .2 pla
sta (ZPGlobalBuf),y
iny iny
sta (ZPGlobalBuf),y
dex dex
bne .2 bne .2
lda #0
sta (ZPGlobalBuf),y
tya tya
sta (ZPGlobalBuf) sta (ZPGlobalBuf)
* clc clc
rts rts
.9 lda #ERR.TOO.MANY.LOCAL .90 lda #ERR.TOO.MANY.LOCAL
* sec * sec
rts rts
*---------------------------------------
SYM.GetLocal
.9 lda #ERR.SYMBOL.REDEF
sec
rts
*--------------------------------------- *---------------------------------------
SYM.LookupLocal lda #2 SYM.LookupLocal tax
sta SRC.ACC.SIZE SYM.LookupLocal.1
lda #$FF ldy #SYMG.SIZE
sta SRC.ACC
sta SRC.ACC+1 tya
.1 cmp (ZPGlobalBuf)
beq .9 CS if =
txa
iny
cmp (ZPGlobalBuf),y
beq .2
tya
clc
adc #SYML.SIZE-1
tay
bcc .1
.9 lda #ERR.UNDEF.SYMBOL
* sec
rts
.2 ldx #0
.3 iny
lda (ZPGlobalBuf),y
sta SRC.ACC,x
inx
cpx #4
bne .3
clc clc
rts rts
*--------------------------------------- *---------------------------------------
@ -428,14 +453,6 @@ SYM.LookupPrivate
clc clc
rts rts
*--------------------------------------- *---------------------------------------
SYM.AddMacro
clc
rts
*---------------------------------------
SYM.LookupMacro
clc
rts
*---------------------------------------
MAN MAN
SAVE /A2OSX.BUILD/BIN/DEV/ASM.S.SYM SAVE /A2OSX.BUILD/BIN/DEV/ASM.S.SYM
LOAD /A2OSX.BUILD/BIN/DEV/ASM.S LOAD /A2OSX.BUILD/BIN/DEV/ASM.S

View File

@ -17,37 +17,45 @@ ZPLinePtr .EQ ZPBIN+6
ZPNameBuf .EQ ZPBIN+8 ZPNameBuf .EQ ZPBIN+8
ZPGlobalBuf .EQ ZPBIN+10 ZPGlobalBuf .EQ ZPBIN+10
ZPLookupBuf .EQ ZPBIN+12 ZPLookupBuf .EQ ZPBIN+12
ZPMacroBuf .EQ ZPBIN+14
ZPTmpBuf .EQ ZPBIN+16 ZPMacroBuf .EQ ZPBIN+14
ZPCtxBuf .EQ ZPBIN+16
ZPAMPtr .EQ ZPBIN+18 ZPAMPtr .EQ ZPBIN+18
ZPRPtr .EQ ZPBIN+20 ZPRPtr .EQ ZPBIN+20
ZPOpsPtr .EQ ZPBIN+22 ZPOpsPtr .EQ ZPBIN+22
ZPOpDefPtr .EQ ZPBIN+24 ZPOpDefPtr .EQ ZPBIN+24
ZPTmpBuf .EQ ZPBIN+16
*--------------------------------------- *---------------------------------------
SYMG.LEN .EQ 0 SYMG.LEN .EQ 0
SYMG.F .EQ 1 SYMG.F .EQ 1
SYMG.F.RESOLVED .EQ %10000000 SYMG.F.RW .EQ %10000000
SYMG.F.RW .EQ %01000000
SYMG.F.SIZE .EQ %00000111 SYMG.F.SIZE .EQ %00000111
SYMG.V .EQ 2 SYMG.V .EQ 2
* *
SYMG.SIZE .EQ 6 SYMG.SIZE .EQ 5
*--------------------------------------- *---------------------------------------
SYML.ID .EQ 0 SYML.ID .EQ 0
SYML.V .EQ 1 SYML.V .EQ 1
* *
SYML.SIZE .EQ 5 SYML.SIZE .EQ 5
*--------------------------------------- *---------------------------------------
MCTX.LEN .EQ 0
MCTX.PTR .EQ 1
MCTX.ID .EQ 2
MCTX.ARGS .EQ 4
*---------------------------------------
ASM.T.AM .EQ 0 ASM.T.AM .EQ 0
ASM.T.R .EQ 2 ASM.T.R .EQ 2
ASM.T.O .EQ 4 ASM.T.O .EQ 4
*--------------------------------------- *---------------------------------------
SRC.DO.MAXDEPTH .EQ 8 DO.MAXDEPTH .EQ 8
SRC.IN.MAXDEPTH .EQ 7 IN.MAXDEPTH .EQ 7
MA.MAXDEPTH .EQ 8
*--------------------------------------- *---------------------------------------
ERR.INV.ARGS .EQ $80 ERR.INV.ARGS .EQ $80
ERR.INV.T.FILE .EQ $81
ERR.SRC.INV.TYPE .EQ $90 ERR.SRC.INV.TYPE .EQ $90
ERR.SRC.TOO.MANY.IN .EQ $91 ERR.SRC.TOO.MANY.IN .EQ $91
ERR.SRC.UNEXP.EOF .EQ $92 ERR.SRC.UNEXP.EOF .EQ $92
@ -71,6 +79,8 @@ ERR.MISSING.EXP .EQ $B0
ERR.EXP.SYN.ERROR .EQ $B1 ERR.EXP.SYN.ERROR .EQ $B1
ERR.MACRO.INV.DEF .EQ $E0 ERR.MACRO.INV.DEF .EQ $E0
ERR.MACRO.TOO.BIG .EQ $E1 ERR.MACRO.TOO.BIG .EQ $E1
ERR.MACRO.INV .EQ $E2
ERR.MACRO.TOO.MANY .EQ $E3
*-------------------------------------- *--------------------------------------
* File Header (16 Bytes) * File Header (16 Bytes)
*-------------------------------------- *--------------------------------------
@ -235,25 +245,28 @@ CS.INIT ldy #S.PS.ARGC
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
CS.RUN >SYSCALL GetChar CS.RUN >SYSCALL GetChar
bcs .11 no char bcs .13 no char
cmp #$03 Ctrl-C cmp #$03 Ctrl-C
beq .99 Abort....beq=CS beq .99 Abort....beq=CS
cmp #$13 Ctrl-S cmp #$13 Ctrl-S
bne .11 bne .11
ldy #bPause >LDA.G bPause
lda (pData),y
eor #$ff eor #$ff
sta (pData),y sta (pData),y
.11 ldy #bPause bpl .12
lda (pData),y clc
bne .8 rts
ldy #SRC.COUNT root file is already opened? .13 >LDA.G bPause
lda (pData),y bmi .8
.11 >STZ.G bPause
.12 >LDA.G SRC.COUNT root file is already opened?
bne .10 bne .10
>LDA.G ASM.PASS >LDA.G ASM.PASS
@ -272,10 +285,11 @@ CS.RUN >SYSCALL GetChar
jsr DIR.Reset jsr DIR.Reset
jsr SYM.Reset jsr SYM.Reset
jsr MAC.Reset
.10 jsr FIO.ReadLine .10 jsr FIO.ReadLine
bcc .2 bcc .2
cmp #$4C End Of File? cmp #$4C End Of File?
bne .9 bne .9
jsr FIO.FileClose jsr FIO.FileClose
@ -414,7 +428,7 @@ T.LI >PSTR "ON"
ASM..T. .AZ ".T." ASM..T. .AZ ".T."
ASM.6502 .AZ "6502" ASM.6502 .AZ "6502"
MSG.HELP .AZ "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\nUsage : ASM <src file> [type TXT ($04) or S-C/BAS ($FA)]\r\n" MSG.HELP .AZ "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\nUsage : ASM <src file> [type TXT ($04) or S-C/BAS ($FA)]\r\n"
MSG.PASS .AZ "Pass:#%d\r\n" MSG.PASS .AZ "*** Pass:#%d\r\n"
MSG.SRC.FILE .AZ "*** Reading SRC File:%s\r\n" MSG.SRC.FILE .AZ "*** Reading SRC File:%s\r\n"
MSG.OBJ.FILE .AZ "*** Writing OBJ File:%s, Type=%02x\r\n" MSG.OBJ.FILE .AZ "*** Writing OBJ File:%s, Type=%02x\r\n"
MSG.T.FILE .AZ "*** Loading CPU File:%s\r\n" MSG.T.FILE .AZ "*** Loading CPU File:%s\r\n"
@ -427,7 +441,7 @@ MSG.EQU1 .AZ " [ %h]"
MSG.EQU2 .AZ " [ %h%h]" MSG.EQU2 .AZ " [ %h%h]"
MSG.EQU3 .AZ " [ %h%h%h]" MSG.EQU3 .AZ " [ %h%h%h]"
MSG.EQU4 .AZ " [%h%h%h%h]" MSG.EQU4 .AZ " [%h%h%h%h]"
MSG.LSYMBOL .AZ ", .%d %h%h%h%h" MSG.LSYMBOL .AZ ", .%d=%h%h%h%h"
MSG.SRCLINE .AZ " %05D %s\r\n" MSG.SRCLINE .AZ " %05D %s\r\n"
MSG.ERROR .AZ "*** Fatal Error $%h " MSG.ERROR .AZ "*** Fatal Error $%h "
MSG.SYMBOLS .AZ "Symbol Table:\r\n" MSG.SYMBOLS .AZ "Symbol Table:\r\n"
@ -443,11 +457,9 @@ ASM.T.FILENAME .BS 65
FIO.Stat .BS S.STAT FIO.Stat .BS S.STAT
SRC.ACC.F .BS 1
SRC.ACC.SIZE .BS 1 SRC.ACC.SIZE .BS 1
SRC.ACC .BS 4 SRC.ACC .BS 4
SRC.ARG.F .BS 1
SRC.ARG.SIZE .BS 1 SRC.ARG.SIZE .BS 1
SRC.ARG .BS 4 SRC.ARG .BS 4
@ -464,8 +476,8 @@ SRC.hLineBuf .BS 1
SRC.hTmpBuf .BS 1 SRC.hTmpBuf .BS 1
SRC.COUNT .BS 1 SRC.COUNT .BS 1
SRC.hFILES .BS SRC.IN.MAXDEPTH SRC.hFILES .BS IN.MAXDEPTH
SRC.hFILETYPES .BS SRC.IN.MAXDEPTH SRC.hFILETYPES .BS IN.MAXDEPTH
SRC.LINENUM .BS 2 SRC.LINENUM .BS 2
SRC.AMID .BS 1 SRC.AMID .BS 1
@ -482,20 +494,29 @@ EXP.Modifier .BS 1
EXP.Prefix .BS 1 EXP.Prefix .BS 1
EXP.Operator .BS 1 EXP.Operator .BS 1
ASM.T.hMem .BS 1 ASM.T.hMem .BS 1
ASM.PASS .BS 1 ASM.PASS .BS 1
ASM.DO.StackPtr .BS 1
ASM.DO.Stack .BS SRC.DO.MAXDEPTH
ASM.DO.ON .BS 1 ASM.DO.ON .BS 1
ASM.DO.StackPtr .BS 1
ASM.DO.Stack .BS DO.MAXDEPTH
ASM.DU.ON .BS 1
ASM.PH.ON .BS 1 ASM.PH.ON .BS 1
ASM.LI.ON .BS 1 ASM.LI.ON .BS 1
ASM.LI.CON .BS 1 ASM.LI.CON .BS 1
ASM.LI.MON .BS 1 ASM.LI.MON .BS 1
ASM.LI.XON .BS 1 ASM.LI.XON .BS 1
ASM.MA.ON .BS 1
ASM.MA.StackPtr .BS 1
ASM.MA.Stack .BS MA.MAXDEPTH
ASM.PC .BS 4 ASM.PC .BS 4
ASM.PC.PH .BS 4 ASM.PC.PH .BS 4
ASM.PC.DU .BS 4
SYM.hGlobalList .BS 1 SYM.hGlobalList .BS 1
SYM.hNameBuf .BS 1 SYM.hNameBuf .BS 1
@ -506,9 +527,11 @@ SYM.hLookupBuf .BS 1
SYM.LocalID .BS 2 SYM.LocalID .BS 2
MAC.hMacros .BS 1 MAC.hMacroList .BS 1
MAC.hBuf .BS 1 MAC.hMacroBuf .BS 1
MAC.bAdd .BS 1 MAC.hCtxList .BS 1
MAC.hCtxBuf .BS 1
MAC.CtxID .BS 2
OUT.PC .BS 4 OUT.PC .BS 4
OUT.Buf .BS 4 OUT.Buf .BS 4

View File

@ -89,7 +89,7 @@ BRK .DA BRK.E+1-*
BRK.E .HS 00 BRK.E .HS 00
BRL .DA BRL.E+1-* BRL .DA BRL.E+1-*
.DA #3,$$"BRL" .DA #3,$$"BRL"
.DA #11,#4,$$"82rr" .DA #11,#3,$$"82l"
BRL.E .HS 00 BRL.E .HS 00
BVC .DA BVC.E+1-* BVC .DA BVC.E+1-*
.DA #3,$$"BVC" .DA #3,$$"BVC"
@ -295,7 +295,7 @@ PEI .DA PEI.E+1-*
PEI.E .HS 00 PEI.E .HS 00
PER .DA PER.E+1-* PER .DA PER.E+1-*
.DA #3,$$"PER" .DA #3,$$"PER"
.DA #11,#4,$$"62rr" .DA #11,#3,$$"62l"
PER.E .HS 00 PER.E .HS 00
PHA .DA PHA.E+1-* PHA .DA PHA.E+1-*
.DA #3,$$"PHA" .DA #3,$$"PHA"