Kernel 0.9.1 : ASM rewrite....Local Symbols

This commit is contained in:
Rémy GIBERT 2018-03-23 15:57:35 +00:00
parent 1ae1532109
commit 6d248041ae
9 changed files with 215 additions and 198 deletions

Binary file not shown.

View File

@ -478,7 +478,7 @@ DIR.MA >LDA.G MAC.bAdd
jsr SRC.GetNextCharNB
beq DIR.OP.SYNERR
jsr MAC.Clear
jsr MAC.New
.8 lda #$ff
>STA.G MAC.bAdd

View File

@ -15,6 +15,10 @@ AUTO 4,1
* & = octal
* * = PC
*---------------------------------------
EXP.Eval.Missing lda #ERR.MISSING.EXP
sec
rts
EXP.Eval >STZ.G EXP.Modifier
>STZ.G EXP.Prefix
>STZ.G EXP.Operator
@ -23,19 +27,15 @@ EXP.Eval >STZ.G EXP.Modifier
bcs EXP.Eval.Missing
jsr SRC.IsMODReserved
bcs EXP.Eval.Next1
bcs EXP.Eval.Next
txa
>STA.G EXP.Modifier
lda #'#'
>STA.G EXP.Prefix
bra EXP.Eval.Next
EXP.Eval.Next0 jsr SRC.GetNextChar
EXP.Eval.Missing lda #ERR.MISSING.EXP
sec
rts
EXP.Eval.Next lda #2
sta SRC.ACC.SIZE Default To WORD (2 bytes)
@ -44,13 +44,13 @@ EXP.Eval.Next lda #2
stz SRC.ACC+2
stz SRC.ACC+3
jsr SRC.GetNextChar
jsr SRC.GetChar
bcs EXP.Eval.Missing
EXP.Eval.Next1 cmp #'.' Local Label?
cmp #'.' Local Label?
bne .12
jsr EXP.GetLocal
jsr EXP.GetLSymIDInAcc
bcs .14
jmp EXP.EvalOperator
@ -133,7 +133,7 @@ EXP.Eval.Next1 cmp #'.' Local Label?
.42 jsr SRC.IsLetter Symbol ?
bcs EXP.EvalExitSYN
jsr EXP.GetSymbolValue
jsr EXP.GetGSymValueInAcc
bcs EXP.EvalExitUND
bra EXP.EvalOperator
@ -173,16 +173,16 @@ EXP.EvalOperator >LDA.G EXP.Operator
txa
>STA.G EXP.Operator
ldx #3
ldx #4
.8 lda SRC.ACC,x
sta SRC.ARG,x
.8 lda SRC.ACC.SIZE,x
sta SRC.ARG.SIZE,x
dex
bpl .8
jmp EXP.Eval.Next
jmp EXP.Eval.Next0
*---------------------------------------
EXP.GetLocal jsr SRC.GetNextChar
EXP.GetLSymIDInAcc jsr SRC.GetNextChar
bcs .9
jsr SRC.GetDecimal
@ -201,16 +201,9 @@ EXP.GetLocal jsr SRC.GetNextChar
.9 lda #ERR.SYNTAX.ERROR
sec
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.GetSymbolValue jsr SYM.LookupGlobal
EXP.GetGSymValueInAcc
jsr SYM.LookupGlobal
bcs .2
ldy #SYM.Lookup+5
@ -231,23 +224,37 @@ EXP.GetSymbolValue jsr SYM.LookupGlobal
.2 >LDA.G ASM.PASS pass#2?
bne .99 yes, undefined symbol
lda #0
sta SRC.ACC.SIZE Add Pending
jsr SYM.AddGlobal
.3 clc
lda #0 Mark ACC as pending
sta SRC.ACC.SIZE
.3 jsr SRC.GetNextChar
bcs .8
jsr SRC.IsLetterOrDigit
bcc .3
cmp #'.'
beq .3
cmp #'_'
beq .3
.8 clc
rts
.99 lda #ERR.UNDEF.SYMBOL
sec
.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 asl
tax
>LDA.G ASM.PASS pass#2?
beq .8
jmp (J.EXP.OP-2,x)
.8 clc
rts
*---------------------------------------
EXP.MOD.8.3 lda SRC.ACC+2
bra EXP.MOD.8

View File

@ -55,7 +55,7 @@ FIO.LOAD.ASM.T >STYA ZPPtr2
.4 >PUSHW L.ASM.T.FILENAME
>LDYA L.MSG.T.FILE
>SYSCALL PrintF.YA
jsr OUT.Print
>PUSHWI 0 Aux type
>PUSHBI 6 S.FI.T.BIN
@ -107,7 +107,7 @@ FIO.OpenFile >STYA ZPPtr1
>PUSHW ZPPtr1
>LDYA L.MSG.SRC.FILE
>SYSCALL PrintF.YA
jsr OUT.Print
ldy #SRC.COUNT
lda (pData),y

View File

@ -29,7 +29,7 @@ MAC.Quit >LDA.G MAC.hBuf
.8 clc
rts
*---------------------------------------
MAC.Clear lda #0
MAC.New lda #0
tay
.1 sta (ZPMacroBuf),y
@ -38,7 +38,10 @@ MAC.Clear lda #0
rts
*---------------------------------------
MAC.AddChar tax
MAC.AddChar >LDA.G ASM.PASS If Pass#2, ignore
bne .8
tax
lda (ZPMacroBuf)
* cmp #254
* beq .9 CS if EQ
@ -55,7 +58,7 @@ MAC.AddChar tax
beq .1
* >SYSCALL PutChar.A
clc
.8 clc
rts
.1
@ -68,7 +71,10 @@ MAC.AddChar tax
clc
.9 rts
*---------------------------------------
MAC.Store clc
MAC.Store >LDA.G ASM.PASS If Pass#2, ignore
bne .8
.8 clc
rts
*---------------------------------------

View File

@ -2,6 +2,10 @@ NEW
PREFIX /A2OSX.BUILD
AUTO 4,1
*---------------------------------------
OUT.Init lda #20
>STA.G OUT.LineCnt
rts
*---------------------------------------
OUT.Reset ldx #4
ldy #ASM.PC
@ -24,6 +28,7 @@ OUT.Reset ldx #4
>STZ.G OUT.Buf
>STA.G OUT.bEquate
rts
*---------------------------------------
OUT.PrintLineErr >STA.G DIR.Byte Save Error code
@ -70,7 +75,7 @@ OUT.PrintLine.1 jsr OUT.PrintLineOutBuf
>PUSHW ZPLineBuf
>PUSHW.G SRC.LINENUM
>LDYA L.MSG.SRCLINE
>SYSCALL PrintF.YA
jmp OUT.Print
OUT.PrintLine.9 rts
*---------------------------------------
OUT.PrintLineOn clc
@ -134,7 +139,7 @@ OUT.PrintLineOutBuf >LDA.G OUT.bEquate
ldy L.MSG.OUT0,x
lda L.MSG.OUT0+1,x
>SYSCALL PrintF.YA
rts
rts
OUT.PrintLineAcc ldx SRC.ACC.SIZE
beq .2
@ -154,6 +159,24 @@ OUT.PrintLineAcc ldx SRC.ACC.SIZE
lda L.MSG.EQU0+1,x
>SYSCALL PrintF.YA
rts
*---------------------------------------
OUT.Print >SYSCALL PrintF.YA
bra OUT.Print1
OUT.PrintCR lda #13
>SYSCALL PutChar.A
lda #10
>SYSCALL PutChar.A
OUT.Print1 >DEC.G OUT.LineCnt
bne .8
lda #20
sta (pData),y
>DEBUG
.8 rts
*---------------------------------------
OUT.EmitByte phy
phx
@ -170,10 +193,7 @@ OUT.EmitByte phy
bpl .1
jsr OUT.PrintLineOutBuf
lda #13
>SYSCALL PutChar.A
lda #10
>SYSCALL PutChar.A
jsr OUT.PrintCR
.1 jsr OUT.Reset

View File

@ -29,10 +29,7 @@ SRC.ParseLine jsr OUT.Reset
.8 clc
rts
SRC.ParseLine.Macro >LDA.G ASM.PASS If Pass#2, ignore
bne .8
lda (ZPLinePtr)
SRC.ParseLine.Macro lda (ZPLinePtr)
cmp #' ' No label, scan to DIR/OP if any
bne .1
@ -82,8 +79,7 @@ SRC.ParseLine.Macro >LDA.G ASM.PASS If Pass#2, ignore
.22 jsr MAC.Store
bcs SRC.ParseLine.RTS
lda #0
>STA.G MAC.bAdd
>STZ.G MAC.bAdd
.8 clc
rts
@ -139,7 +135,7 @@ SRC.ParseLine.LABEL jsr SRC.GetChar
cmp #'.' local symbol?
bne .1
>LDA.G SYM.bGlobal
lda (ZPGlobalBuf)
beq SRC.ParseLine.InvLbl
jsr SRC.GetNextChar
@ -154,38 +150,24 @@ SRC.ParseLine.LABEL jsr SRC.GetChar
lda SRC.ACC
beq SRC.ParseLine.InvLbl .0 is not allowed
jsr SYM.AddLocalPC
jsr SYM.AddLocal
bcs SRC.ParseLine.RTS
bra SRC.ParseLine.DirOp
.1 jsr SYMG.FlushGlobal
bcs SRC.ParseLine.Err
lda #$ff
>STA.G SYM.bGlobal
>LDA.G ASM.PASS
bne .3
bne .2
jsr SYM.AddGlobalPC Pass #1; try to add global...
bcc SRC.ParseLine.DirOp yes!!! go scan dir/op
jsr SYM.LookupGlobal already defined...get it
bcc SRC.ParseLine.Redef
>LDA.G SYM.Lookup+SYMG.F
bit #SYMG.F.RW
bne .2 R/W, always update...
bit #SYMG.F.RESOLVED
bne SRC.ParseLine.Redef
.2 jsr SYM.UpdateGlobalPC
jsr SYM.NewGlobal Pass #1; try to add global...
bra SRC.ParseLine.DirOp
.3 jsr SYM.LookupGlobal Pass #2: should be already defined...
bcs SRC.ParseLine.Undef
jsr SYM.UpdateGlobalPC
.2 jsr SYM.GetGlobal Pass #2: should be already defined...
bcs SRC.ParseLine.Undef
*---------------------------------------
SRC.ParseLine.DirOp jsr SRC.GetNextCharNB Scan for an Opcode...
bcs SRC.ParseLine.Ok
@ -478,7 +460,7 @@ SRC.ParseLine.OPAMCheck
.2 lda (ZPOpDefPtr)
bne .1
lda #ERR.INV.AM.4.OC
.99 lda #ERR.INV.AM.4.OC
sec
rts
@ -516,14 +498,24 @@ SRC.ParseLine.OPAMCheck
.5 bne .6
ldx SRC.ACCTMP
lda SRC.ACC,x
inc SRC.ACCTMP
lda SRC.ACC,x
bra .50
.6 cmp #'r
>DEBUG
bne .99
ldx SRC.ACCTMP
inc SRC.ACCTMP
lda ASM.PC,x
sec
sbc SRC.ACC,x
pha
pla
bra .50
.8 clc
.9 rts

View File

@ -2,21 +2,20 @@ NEW
PREFIX /A2OSX.BUILD
AUTO 4,1
*---------------------------------------
* Global Symbol Record: (8 bytes)
* 0 : Len (8)
* Global Symbol Record: (6+ bytes)
* 0 : Len
* 1 : Flags:
* b7=0=pending,1=resolved
* b6=R/W (.SE)
* b2,b1,b0 : Size (in bytes)
* 2-5 : 32 bits Value
* 6-7 : LSID (Local Symbols ID)
* 6+ : Local Symbols.....
*---------------------------------------
* Local Symbol Record: (7 bytes)
* 0 : Len (8)
* Local Symbol Record: (6 bytes)
* 0 : Local ID (1->255)
* 1 : Flags:
* b7=0=pending,1=resolved
* 2-5 : 32 bits Value (PC)
* 6 : Local ID (1->255)
*---------------------------------------
* Private Symbol Record: (9 bytes)
* 0 : Len (8)
@ -31,36 +30,39 @@ SYM.Init >SYSCALL SListNew
>STA.G SYM.hGlobals
>SYSCALL SListNew
>LDYAI 256
>SYSCALL GetMem.YA
bcs .9
>STA.G SYM.hLocals
>STYA ZPGlobalBuf
txa
>STA.G SYM.hGlobalBuf
>LDYAI 256
>SYSCALL GetMem.YA
bcs .9
>STYA ZPLocalBuf
>STYA ZPLookupBuf
txa
>STA.G SYM.hLocalBuf
>STA.G SYM.hLookupBuf
.9 rts
*---------------------------------------
SYM.Reset >STZ.G SYM.bGlobal
>STA.G SYM.LocalIndex
SYM.Reset lda #0
sta (ZPGlobalBuf)
rts
*---------------------------------------
SYM.Quit >LDA.G SYM.hLocalBuf
SYM.Quit >LDA.G SYM.hLookpBuf
beq .1
>SYSCALL FreeMem.A
.1 >LDA.G SYM.hGlobalBuf
beq .2
>SYSCALL FreeMem.A
.2 >LDA.G SYM.hLocals
beq .3
>SYSCALL SListFree.A
.3 >LDA.G SYM.hGlobals
.2 >LDA.G SYM.hGlobals
beq .8
>SYSCALL SListFree.A
@ -129,18 +131,44 @@ SYM.Dump stz ZPLinePtr
.8 clc
rts
*---------------------------------------
SYM.AddGlobalPC jsr SYM.PC2Global A=PC Size
ora #SYMG.F.RESOLVED PC is always known
*---------------------------------------
SYM.AddGlobal >STA.G SYM.Global+SYMG.F
SYM.NewGlobal >LDYA ZPLinePtr
>STYA SYM.GlobalPtr
lda #SYMG.SIZE-1 F+V+LSID
>STA.G SYM.Global+SYMG.LEN
jsr SYM.PC2Global A=PC Size
ora #SYMG.F.RESOLVED PC is always known
ldy #SYMG.F
sta (ZPGlobalBuf),y
lda #SYMG.SIZE-1
* ldy #SYMG.LEN
sta (ZPGlobalBuf)
clc
rts
*---------------------------------------
SYM.GetGlobal >PUSHB.G SYM.hGlobals
>PUSHW ZPLinePtr
>PUSHW ZPGlobalBuf
>SYSCALL SListLookup
bcs .9
>PUSHB.G SYM.hGlobals
adc ZPLinePtr
sta ZPLinePtr
bcc .1
inc ZPLinePtr+1
clc
.1 tya
>STA.G SYM.GlobalID+1
txa
>STA.G SYM.GlobalID
.9 rts
*---------------------------------------
SYM.AddGlobal >PUSHB.G SYM.hGlobals
>PUSHW ZPLinePtr
>PUSHEA.G SYM.Global
>PUSHW ZPGlobalBuf
>SYSCALL SListAdd
bcs .9
@ -163,27 +191,20 @@ SYM.AddGlobal >STA.G SYM.Global+SYMG.F
*---------------------------------------
SYM.LookupGlobal >PUSHB.G SYM.hGlobals
>PUSHW ZPLinePtr
>PUSHEA.G SYM.Lookup
>PUSHW ZPLookupBuf
>SYSCALL SListLookup
bcs .9
adc ZPLinePtr
sta ZPLinePtr
bcc .1
bcc .8
inc ZPLinePtr+1
clc
.1 tya
>STA.G SYM.GlobalID+1
txa
>STA.G SYM.GlobalID
.8
.9 rts
*---------------------------------------
SYM.UpdateGlobalPC jsr SYM.PC2Global
bra SYM.UpdateGlobal
*---------------------------------------
SYM.UpdateGlobalAcc ldx #3
ldy #SYM.Global+SYMG.V+3
@ -209,7 +230,7 @@ SYM.UpdateGlobal ora #SYMG.F.RESOLVED
>SYSCALL SListUpdateByID
rts
*---------------------------------------
SYMG.FlushGlobal clc
SYMG.FlushGlobal clc
rts
*---------------------------------------
SYM.PC2Global ldx #4
@ -224,10 +245,10 @@ SYM.PC2Global ldx #4
ldx #4
ldy #SYM.Global+SYMG.V+3
ldy #SYMG.V+3
.2 pla
sta (pData),y
sta (ZPGlobalBuf),y
dey
dex
bne .2
@ -235,30 +256,32 @@ SYM.PC2Global ldx #4
ldx #4
ldy #ASM.PC+3
.3 lda (pData),y
.3 lda (ZPGlobalBuf),y
bne .4
dex
dey
bne .3
.4 txa A=PC Size
.4 txa
ora #SYMG.F.RESOLVED
ldy #SYMG.F
sta (ZPGlobalBuf),y
txa A=PC Size
rts
*---------------------------------------
SYM.AddLocalPC tax Save ID
SYM.AddLocal tax Save ID
>LDA.G SYM.LocalIndex
lda (ZPGlobalBuf)
tay
clc
adc #6
adc #SYML.SIZE
bcs .9
txa Get Back ID
sta (ZPLocalBuf),y
iny
lda #SYMG.F.RESOLVED
sta (ZPLocalBuf),y
sta (ZPGlobalBuf),y
iny
phy
@ -278,46 +301,15 @@ SYM.AddLocalPC tax Save ID
ply
.2 pla
sta (ZPLocalBuf),y
sta (ZPGlobalBuf),y
iny
dex
bne .2
lda #0
sta (ZPLocalBuf),y
sta (ZPGlobalBuf),y
tya
>STA.G SYM.LocalIndex
* clc
rts
.9 lda #ERR.TOO.MANY.LOCAL
* sec
rts
*---------------------------------------
SYM.AddLocalPending tax Save ID
>LDA.G SYM.LocalIndex
tay
clc
adc #6
bcs .9
txa Get Back ID
sta (ZPLocalBuf),y
ldx #6 F+DWORD+Ending 0
lda #0
.1 iny
sta (ZPLocalBuf),y
iny
dex
bne .1
>STA.G SYM.LocalIndex
sta (ZPGlobalBuf)
* clc
rts

View File

@ -14,29 +14,29 @@ ZPPtr2 .EQ ZPBIN+2
ZPPtr3 .EQ ZPBIN+4
ZPLineBuf .EQ ZPBIN+6
ZPLinePtr .EQ ZPBIN+8
ZPLocalBuf .EQ ZPBIN+10
ZPMacroBuf .EQ ZPBIN+12
ZPTmpBuf .EQ ZPBIN+14
ZPAMPtr .EQ ZPBIN+16
ZPRPtr .EQ ZPBIN+18
ZPOpsPtr .EQ ZPBIN+20
ZPOpDefPtr .EQ ZPBIN+22
ZPGlobalBuf .EQ ZPBIN+10
ZPLookupBuf .EQ ZPBIN+12
ZPMacroBuf .EQ ZPBIN+14
ZPTmpBuf .EQ ZPBIN+16
ZPAMPtr .EQ ZPBIN+18
ZPRPtr .EQ ZPBIN+20
ZPOpsPtr .EQ ZPBIN+22
ZPOpDefPtr .EQ ZPBIN+24
*---------------------------------------
SYMG.LEN .EQ 0
SYMG.F .EQ 1
SYMG.F.RESOLVED .EQ %10000000
SYMG.F.RW .EQ %01000000
SYMG.F.SIZE .EQ %00000111
SYMG.F.RESOLVED .EQ %10000000
SYMG.F.RW .EQ %01000000
SYMG.F.EQU .EQ %00100000
SYMG.F.SIZE .EQ %00000111
SYMG.V .EQ 2
SYMG.LSID .EQ 6
SYMG.SIZE .EQ 8
*
SYMG.SIZE .EQ 6
*---------------------------------------
SYML.LEN .EQ 0
SYML.F .EQ 1
SYML.F.RESOLVED .EQ %10000000
SYML.V .EQ 2
SYML.ID .EQ 6
SYML.SIZE .EQ 7
SYML.ID .EQ 0
SYML.V .EQ 1
*
SYML.SIZE .EQ 5
*---------------------------------------
ASM.T.AM .EQ 0
ASM.T.R .EQ 2
@ -80,7 +80,7 @@ CS.START cld
.DA CS.END-CS.START CS
.DA DS.END-DS.START DS
.DA #0 SS
.DA #24 ZP
.DA #32 ZP
.DA 0
*--------------------------------------
* Relocation Table
@ -200,6 +200,8 @@ CS.INIT ldy #S.PS.ARGC
jsr MAC.Init
bcs .9
jsr OUT.Init
>LDYAI 256
>SYSCALL GetMem.YA
@ -231,7 +233,7 @@ CS.RUN >SYSCALL GetChar
bcs .11 no char
cmp #$03 Ctrl-C
beq .99 Abort....
beq .99 Abort....beq=CS
cmp #$13 Ctrl-S
bne .11
@ -253,7 +255,7 @@ CS.RUN >SYSCALL GetChar
inc
>PUSHA
>LDYA L.MSG.PASS
>SYSCALL PrintF.YA
jsr OUT.Print
ldy #SRC.hFILENAME
lda (pData),y
@ -282,15 +284,15 @@ CS.RUN >SYSCALL GetChar
inc
sta (pData),y
clc
rts
.99 rts
.1 jsr SYM.Dump
>PUSHW ZPLinePtr
>LDYA L.MSG.SUMMARY
>SYSCALL PrintF.YA
jsr OUT.Print
lda #0 End of assembly, exit with no error
.99 sec
sec
rts
.2 jsr SRC.ParseLine
@ -430,8 +432,9 @@ FIO.Stat .BS S.STAT
SRC.ACC.SIZE .BS 1
SRC.ACC .BS 4
SRC.ACCTMP .BS 4
SRC.ARG.SIZE .BS 1
SRC.ARG .BS 4
SRC.ACCTMP .BS 4
SRC.AM.StrBuf .BS 32
*--------------------------------------
.DUMMY
@ -447,13 +450,13 @@ SRC.COUNT .BS 1
SRC.hFILES .BS SRC.IN.MAXDEPTH
SRC.hFILETYPES .BS SRC.IN.MAXDEPTH
SRC.LINENUM .BS 2
SRC.AMID .BS 1
DST.hFILENAME .BS 1
DST.hREFNUM .BS 1
DST.hBUFFER .BS 1
DST.hFILETYPE .BS 1
SRC.LINENUM .BS 2
ASM.T.hMem .BS 1
DIR.Word .BS 2
DIR.Byte .BS 1
@ -463,6 +466,8 @@ EXP.Prefix .BS 1
EXP.Operator .BS 1
ASM.T.hMem .BS 1
ASM.PASS .BS 1
ASM.DO.StackPtr .BS 1
ASM.DO.Stack .BS SRC.DO.MAXDEPTH
@ -476,19 +481,14 @@ ASM.PC .BS 4
ASM.PC.PH .BS 4
SYM.hGlobals .BS 1
SYM.bGlobal .BS 1
SYM.GlobalPtr .BS 2
SYM.hGlobalBuf .BS 1
SYM.GlobalID .BS 2
SYM.Global .BS SYMG.SIZE
SYM.hLocals .BS 1
SYM.hLookupBuf .BS 1
SYM.hLocalBuf .BS 1
SYM.LocalIndex .BS 1
SYM.LocalID .BS 2
SYM.Local .BS SYML.SIZE
SYM.Lookup .BS SYMG.SIZE
MAC.hMacros .BS 1
MAC.hBuf .BS 1
@ -497,8 +497,8 @@ MAC.bAdd .BS 1
OUT.PC .BS 4
OUT.Buf .BS 4
OUT.bEquate .BS 1
OUT.LineCnt .BS 1
SRC.AMID .BS 1
DS.END .ED
*---------------------------------------
.DO DS.END-DS.START>$FF