mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-22 16:31:07 +00:00
Work In Progress (ASM)
This commit is contained in:
parent
7fa3545a19
commit
71a00af938
@ -48,6 +48,12 @@ DIR.EP clc
|
||||
DIR.EQ jsr EXP.Eval
|
||||
bcs .9
|
||||
|
||||
ldx #3
|
||||
.1 lda SRC.ACC,x
|
||||
sta SRC.GLabel.Value,x
|
||||
dex
|
||||
bpl .1
|
||||
|
||||
clc
|
||||
.9 rts
|
||||
*---------------------------------------
|
||||
@ -63,13 +69,23 @@ DIR.IN jsr SRC.GetArg
|
||||
>LDYA L.SRC.BUFFER
|
||||
>SYSCALL SYS.NewPStrYA
|
||||
|
||||
pha
|
||||
|
||||
jsr FIO.OpenFileA
|
||||
bcs .99
|
||||
plx
|
||||
php
|
||||
pha
|
||||
|
||||
txa
|
||||
>SYSCALL SYS.FreeMemA
|
||||
|
||||
pla
|
||||
plp
|
||||
rts
|
||||
|
||||
|
||||
.9 lda #ERR.SYNTAX.ERROR
|
||||
.99 sec
|
||||
sec
|
||||
rts
|
||||
*---------------------------------------
|
||||
DIR.LI >LDYA L.T.LI
|
||||
@ -100,6 +116,10 @@ DIR.LI.ON ldy #ASM.LI.ON
|
||||
DIR.LI.OFF ldy #ASM.LI.ON
|
||||
clc
|
||||
DIR.LI.APPLY lsr
|
||||
|
||||
|
||||
|
||||
lda #$80
|
||||
sta (pData),y
|
||||
rts
|
||||
*---------------------------------------
|
||||
|
@ -13,22 +13,26 @@ AUTO 6
|
||||
* & = octal
|
||||
* * = PC
|
||||
*---------------------------------------
|
||||
EXP.Eval jsr SRC.GetCharNB
|
||||
EXP.Eval stz EXP.Operator
|
||||
|
||||
jsr SRC.GetCharNB
|
||||
beq .98
|
||||
cmp #'*'
|
||||
bne .10
|
||||
|
||||
ldy #ASM.PC
|
||||
ldx #0
|
||||
ldy #ASM.PC+3
|
||||
ldx #3
|
||||
|
||||
.11 lda (pData),y
|
||||
sta SRC.ACC,x
|
||||
inx
|
||||
iny
|
||||
cpx #4
|
||||
bne .11
|
||||
dey
|
||||
dex
|
||||
bpl .11
|
||||
|
||||
bra .8
|
||||
jsr SRC.GetCharNB
|
||||
bne .97
|
||||
clc
|
||||
rts
|
||||
|
||||
.10 jsr SRC.IsDigit10 Decimal constant ?
|
||||
bcs .1
|
||||
@ -62,7 +66,24 @@ EXP.Eval jsr SRC.GetCharNB
|
||||
|
||||
.4 jsr SRC.IsLetter Symbol ?
|
||||
bcs .97
|
||||
dec SRC.BufPtr
|
||||
>LDYA L.SRC.ELabel.Len
|
||||
jsr SRC.GetLabel
|
||||
bcs .97
|
||||
jsr SYM.FindGlobal
|
||||
bcc .41
|
||||
|
||||
ldy #ASM.PASS
|
||||
lda (pData),y pass#2?
|
||||
bne .96 yes, undefined symbol
|
||||
|
||||
jsr
|
||||
|
||||
.41 ldx #3
|
||||
.5 lda SRC.FLabel.Value,x
|
||||
sta SRC.ACC,x
|
||||
dex
|
||||
bpl .5
|
||||
|
||||
.8 clc
|
||||
rts
|
||||
@ -74,6 +95,10 @@ EXP.Eval jsr SRC.GetCharNB
|
||||
.98 lda #ERR.MISSING.EXP
|
||||
sec
|
||||
.99 rts
|
||||
|
||||
.96 lda #ERR.UNDEF.SYMBOL
|
||||
sec
|
||||
rts
|
||||
*---------------------------------------
|
||||
stz SRC.ACC
|
||||
stz SRC.ACC+1
|
||||
|
@ -5,21 +5,25 @@ INC 1
|
||||
AUTO 6
|
||||
.LIST OFF
|
||||
*---------------------------------------
|
||||
FIO.OpenFileA sta hFileName
|
||||
FIO.OpenFileA sta FIO.hFileName
|
||||
>SYSCALL SYS.GetMemPtrA
|
||||
>STYA ZPPtr1
|
||||
|
||||
stz FIO.hFullPath
|
||||
|
||||
ldy #1
|
||||
lda (ZPPtr1),y
|
||||
cmp #'/'
|
||||
beq .1
|
||||
|
||||
>PUSHB hFileName
|
||||
>PUSHB FIO.hFileName
|
||||
ldy #S.PS.hPREFIX
|
||||
lda (pPs),y
|
||||
>PUSHA
|
||||
>SYSCALL SYS.PStrCat
|
||||
sta hFileName
|
||||
sta FIO.hFullPath
|
||||
sta FIO.hFileName
|
||||
|
||||
>SYSCALL SYS.GetMemPtrA
|
||||
>STYA ZPPtr1
|
||||
|
||||
@ -34,9 +38,9 @@ FIO.OpenFileA sta hFileName
|
||||
|
||||
lda #ERR.SRC.TOO.MANY.IN
|
||||
sec
|
||||
rts
|
||||
bra FIO.OpenFileA.Exit
|
||||
|
||||
.10 lda hFileName
|
||||
.10 lda FIO.hFileName
|
||||
>SYSCALL SYS.MLIOpenA
|
||||
bcs .99
|
||||
|
||||
@ -57,7 +61,7 @@ FIO.OpenFileA sta hFileName
|
||||
txa
|
||||
sta (pData),y
|
||||
|
||||
lda hFileName
|
||||
lda FIO.hFileName
|
||||
>SYSCALL SYS.MLIGetFileInfoA
|
||||
bcs .99
|
||||
|
||||
@ -100,11 +104,18 @@ FIO.OpenFileA sta hFileName
|
||||
inc
|
||||
sta (pData),y
|
||||
clc
|
||||
rts
|
||||
bra FIO.OpenFileA.Exit
|
||||
|
||||
.98 lda #ERR.SRC.INV.TYPE
|
||||
|
||||
.99 sec
|
||||
FIO.OpenFileA.Exit php
|
||||
pha
|
||||
lda FIO.hFullPath
|
||||
beq .1
|
||||
>SYSCALL SYS.FreeMemA
|
||||
.1 pla
|
||||
plp
|
||||
rts
|
||||
*---------------------------------------
|
||||
FIO.ReadLine stz SRC.BufPtr
|
||||
|
@ -13,10 +13,12 @@ SRC.ParseLine ldx TmpBuffer256
|
||||
cpx #';' Comment?
|
||||
beq SRC.ParseLine.Skip
|
||||
|
||||
stz SRC.GLabel.New
|
||||
|
||||
cpx #' ' no label...go scan dir/opcode
|
||||
beq .4
|
||||
|
||||
.1 cpx #'.' local symbol?
|
||||
cpx #'.' local symbol?
|
||||
bne .2
|
||||
jsr SRC.ParseLine.SymL
|
||||
bra .3
|
||||
@ -46,47 +48,117 @@ SRC.ParseLine ldx TmpBuffer256
|
||||
bcs SRC.ParseLine.Err
|
||||
|
||||
|
||||
SRC.ParseLine.Ok lda SRC.GLabel.Len
|
||||
beq .1
|
||||
SRC.ParseLine.Ok lda SRC.GLabel.New
|
||||
bpl .1
|
||||
|
||||
lda SRC.GLabel.Flags
|
||||
lsr .SE ?
|
||||
bcs .1 yes, update during pass 1 & 2
|
||||
|
||||
ldy #ASM.PASS
|
||||
lda (pData),y pass#2?
|
||||
bne .8 yes, skip to avoid redefinition error
|
||||
|
||||
jsr SYM.FindGlobal
|
||||
bcs SRC.ParseLine.Redef
|
||||
|
||||
.1 jsr SYM.AddGToGBlock
|
||||
bcs SRC.ParseLine.Err
|
||||
|
||||
|
||||
.8
|
||||
|
||||
* jsr SYM.AddToGBlock
|
||||
* bcs SRC.ParseLine.Err
|
||||
.1
|
||||
SRC.ParseLine.skip clc
|
||||
rts
|
||||
|
||||
SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL
|
||||
SRC.ParseLine.Err sec
|
||||
rts
|
||||
SRC.ParseLine.Redef lda #ERR.SYMBOL.REDEFINE
|
||||
sec
|
||||
rts
|
||||
*---------------------------------------
|
||||
SRC.ParseLine.SymP jsr SRC.GetChar
|
||||
beq SRC.ParseLine.SymE
|
||||
jsr SRC.GetDecimal
|
||||
bcs SRC.ParseLine.SymR
|
||||
bcs SRC.ParseLine.SymE
|
||||
jmp SYM.AddPrivate
|
||||
*---------------------------------------
|
||||
SRC.ParseLine.SymL jsr SRC.GetChar
|
||||
beq SRC.ParseLine.SymE
|
||||
jsr SRC.GetDecimal
|
||||
bcs SRC.ParseLine.SymR
|
||||
jmp SYM.AddLocal
|
||||
bcs SRC.ParseLine.SymE
|
||||
lda SRC.ACC+1
|
||||
ora SRC.ACC+2
|
||||
ora SRC.ACC+3
|
||||
bne SRC.ParseLine.SymE Max .255
|
||||
lda SRC.ACC
|
||||
beq SRC.ParseLine.SymE .0 is not allowed
|
||||
sta SRC.LLabel.ID
|
||||
|
||||
ldy #ASM.PC
|
||||
lda (pData),y
|
||||
ldy #ASM.PC.GLABEL
|
||||
sec
|
||||
sbc (pData),y
|
||||
sta SRC.LLabel.Offset
|
||||
|
||||
ldy #ASM.PC+1
|
||||
lda (pData),y
|
||||
ldy #ASM.PC.GLABEL+1
|
||||
sbc (pData),y
|
||||
bne SRC.ParseLine.SymR
|
||||
|
||||
ldy #ASM.PC+2
|
||||
lda (pData),y
|
||||
ldy #ASM.PC.GLABEL+2
|
||||
sbc (pData),y
|
||||
bne SRC.ParseLine.SymR
|
||||
|
||||
ldy #ASM.PC+3
|
||||
lda (pData),y
|
||||
ldy #ASM.PC.GLABEL+3
|
||||
sbc (pData),y
|
||||
bne SRC.ParseLine.SymR
|
||||
bcc SRC.ParseLine.SymR
|
||||
jmp SYM.AddLToGBlock
|
||||
*---------------------------------------
|
||||
SRC.ParseLine.SymG jsr SRC.GetGLabel
|
||||
SRC.ParseLine.SymE lda #ERR.INVALID.LABEL
|
||||
sec
|
||||
rts
|
||||
|
||||
SRC.ParseLine.SymR lda #ERR.RANGE
|
||||
sec
|
||||
rts
|
||||
*---------------------------------------
|
||||
SRC.ParseLine.SymG >LDYA L.SRC.GLabel.Len
|
||||
jsr SRC.GetLabel
|
||||
bcs SRC.ParseLine.SymE
|
||||
|
||||
ldx #3 Makes Current Label = PC for now
|
||||
ldy #ASM.PC
|
||||
lda (pdata),y
|
||||
.1 sta SRC.GLabel.Value,x
|
||||
ldy #ASM.PC+3
|
||||
|
||||
.1 lda (pData),y
|
||||
sta SRC.GLabel.Value,x
|
||||
dey
|
||||
dex
|
||||
bpl .1
|
||||
|
||||
ldx #3 Makes Current Label = Ref for next local
|
||||
ldy #ASM.PC.GLABEL+3
|
||||
|
||||
.2 lda SRC.GLabel.Value,x
|
||||
sta (pData),y
|
||||
dey
|
||||
dex
|
||||
bpl .2
|
||||
|
||||
lda #$80 Mark GLabel Flag...
|
||||
sta SRC.GLabel.Flags
|
||||
sta SRC.GLabel.New
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
SRC.ParseLine.SymE lda #ERR.INVALID.LABEL
|
||||
sec
|
||||
SRC.ParseLine.SymR rts
|
||||
*---------------------------------------
|
||||
SRC.ParseLine.Dir >LDYA L.T.DIRECTIVES
|
||||
jsr SRC.GetKeyword
|
||||
@ -154,7 +226,18 @@ SRC.ParseLine.OpCode
|
||||
|
||||
jsr SRC.ParseLine.AM
|
||||
bcs .99
|
||||
clc
|
||||
|
||||
ldy #ASM.PC
|
||||
lda (pData),y
|
||||
inc
|
||||
sta (pData),y
|
||||
bne .2
|
||||
iny
|
||||
lda (pData),y
|
||||
inc
|
||||
sta (pData),y
|
||||
|
||||
.2 clc
|
||||
rts
|
||||
|
||||
.7 lda ZPPtr1
|
||||
@ -189,14 +272,7 @@ SRC.ParseLine.AM stz SRC.AM.ID
|
||||
sta SRC.AM.StrBuf,x
|
||||
bra .1
|
||||
|
||||
.8 lda SRC.AM.StrBuf
|
||||
beq .89
|
||||
>PUSHWI TmpBuffer256
|
||||
>PUSHW L.SRC.AM.StrBuf
|
||||
>PUSHB SRC.AM.StrBuf
|
||||
>PUSHW L.MSG.DEBUG
|
||||
>LIBCALL hLIBSTR,LIBSTR.PRINTF
|
||||
.89 clc
|
||||
.8 clc
|
||||
rts
|
||||
|
||||
.2 jsr SRC.IsLetter Any register?
|
||||
@ -207,7 +283,7 @@ SRC.ParseLine.AM stz SRC.AM.ID
|
||||
inc SRC.AM.tmpBuf
|
||||
|
||||
.3 jsr SRC.GetCharUC
|
||||
beq .4
|
||||
beq .41
|
||||
jsr SRC.IsLetterOrDigit
|
||||
bne .4
|
||||
inc SRC.AM.tmpBuf
|
||||
@ -217,7 +293,7 @@ SRC.ParseLine.AM stz SRC.AM.ID
|
||||
|
||||
.4 dec SRC.BufPtr back one char
|
||||
|
||||
ldy #0
|
||||
.41 ldy #0
|
||||
|
||||
.5 lda (ZPPtr3),y
|
||||
beq .71 last register ?
|
||||
@ -241,10 +317,11 @@ SRC.ParseLine.AM stz SRC.AM.ID
|
||||
|
||||
.61 iny
|
||||
lda SRC.AM.tmpBuf,y
|
||||
sta SRC.AM.StrBuf,x
|
||||
inx
|
||||
sta SRC.AM.StrBuf,x
|
||||
cpy SRC.AM.tmpBuf
|
||||
bne .61
|
||||
|
||||
stx SRC.AM.StrBuf
|
||||
bra .72
|
||||
|
||||
@ -258,7 +335,7 @@ SRC.ParseLine.AM stz SRC.AM.ID
|
||||
.70 dec SRC.BufPtr back one char
|
||||
|
||||
|
||||
.71 jsr SRC.GetExp
|
||||
.71 jsr EXP.Eval
|
||||
bcs .99
|
||||
.72 jmp .1
|
||||
clc
|
||||
@ -313,7 +390,7 @@ SRC.GetDecimal stz SRC.ACC+1
|
||||
jsr SRC.ACC10
|
||||
pla
|
||||
bcs .9
|
||||
clc
|
||||
|
||||
adc SRC.ACC
|
||||
sta SRC.ACC
|
||||
bcc .1
|
||||
@ -344,7 +421,7 @@ SRC.GetHex stz SRC.ACC+1
|
||||
beq .99
|
||||
jsr SRC.IsDigit16
|
||||
bcs .99
|
||||
and #$0F
|
||||
|
||||
sta SRC.ACC
|
||||
|
||||
.1 jsr SRC.GetChar
|
||||
@ -354,20 +431,16 @@ SRC.GetHex stz SRC.ACC+1
|
||||
jsr SRC.IsDigit16
|
||||
bcs .99
|
||||
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
|
||||
ldx #4
|
||||
.2 asl
|
||||
rol SRC.ACC
|
||||
.2 asl SRC.ACC
|
||||
rol SRC.ACC+1
|
||||
rol SRC.ACC+2
|
||||
rol SRC.ACC+3
|
||||
bcs .9
|
||||
dex
|
||||
bne .2
|
||||
ora SRC.ACC
|
||||
sta SRC.ACC
|
||||
bra .1
|
||||
|
||||
.8 clc
|
||||
@ -467,14 +540,15 @@ SRC.GetBinary stz SRC.ACC+1
|
||||
sec
|
||||
rts
|
||||
*---------------------------------------
|
||||
SRC.GetGLabel jsr SRC.GetCharUC
|
||||
SRC.GetLabel >STYA ZPPtr1
|
||||
jsr SRC.GetCharUC
|
||||
|
||||
beq .9
|
||||
jsr SRC.IsLetter
|
||||
bcs .9
|
||||
sta SRC.GLabel.Name
|
||||
|
||||
ldy #1
|
||||
sta (ZPPtr1),y
|
||||
|
||||
.1 jsr SRC.GetCharUC
|
||||
beq .8
|
||||
@ -485,19 +559,25 @@ SRC.GetGLabel jsr SRC.GetCharUC
|
||||
cmp #'.'
|
||||
beq .2
|
||||
|
||||
cmp #'_'
|
||||
beq .2
|
||||
|
||||
jsr SRC.IsEXPReserved
|
||||
bcc .8
|
||||
jsr SRC.IsLetterOrDigit
|
||||
bcs .9
|
||||
|
||||
.2 sta SRC.GLabel.Name,y
|
||||
iny
|
||||
.2 iny
|
||||
sta (ZPPtr1),y
|
||||
cpy #SRC.GLABEL.MAXLEN
|
||||
bne .1 if equ Carry is set
|
||||
bcc .1 if equ Carry is set
|
||||
|
||||
.9 sec
|
||||
.9 lda #ERR.SYNTAX.ERROR
|
||||
sec
|
||||
rts
|
||||
|
||||
.8 tya
|
||||
sta SRC.GLabel.Len
|
||||
sta (ZPPtr1)
|
||||
clc
|
||||
rts
|
||||
*---------------------------------------
|
||||
@ -544,7 +624,7 @@ SRC.GetKeyword >STYA ZPPtr1
|
||||
.9 sec
|
||||
rts
|
||||
*---------------------------------------
|
||||
SRC.GetExp stz SRC.Exp
|
||||
SRC.GetExp.DELETE stz SRC.Exp
|
||||
jsr SRC.GetCharUC
|
||||
beq .9
|
||||
|
||||
@ -634,11 +714,11 @@ SRC.IsDigit16 jsr SRC.IsDigit10
|
||||
bcc .8
|
||||
cmp #'A'
|
||||
bcc .9
|
||||
cmp #'G'
|
||||
cmp #'F'+1
|
||||
bcc .1
|
||||
rts cc if ok, cs if not
|
||||
|
||||
.1 sbc #'A'-10 cc so A->10
|
||||
.1 sbc #'A'-11 cc so A->10 (11-CC)
|
||||
clc
|
||||
.8 and #$0F
|
||||
rts
|
||||
@ -702,8 +782,8 @@ SRC.ACC10 lda SRC.ACC ACC*2-> ACC & ACCTMP
|
||||
sta SRC.ACCTMP+3
|
||||
bcs .9
|
||||
|
||||
ldx #1
|
||||
.1 asl SRC.ACC ACC=ACC*8
|
||||
ldx #2
|
||||
.1 asl SRC.ACC ACC=ACC*4
|
||||
rol SRC.ACC+1
|
||||
rol SRC.ACC+2
|
||||
rol SRC.ACC+3
|
||||
|
@ -6,15 +6,16 @@ AUTO 6
|
||||
.LIST OFF
|
||||
*---------------------------------------
|
||||
* Global Symbol Record: (8+ bytes)
|
||||
* 0-3 : 32 bits Value
|
||||
* 4 : Flags:
|
||||
* b7=R/W (.SE)
|
||||
* 0 : Flags:
|
||||
* b7=Valid Entry
|
||||
* b6=pending
|
||||
* b0=R/W (.SE)
|
||||
* 1-4 : 32 bits Value
|
||||
* 5 : Len
|
||||
* 6-... Name
|
||||
* ......
|
||||
* Local Symbol Record: (2 bytes)
|
||||
* 2 : Local ID (0->255)
|
||||
* 2 : Local ID (1->255)
|
||||
* 3 : offset from Global Symbol
|
||||
* ......
|
||||
* Ending 0
|
||||
@ -30,7 +31,14 @@ AUTO 6
|
||||
*---------------------------------------
|
||||
* Macro Record: ( bytes)
|
||||
*---------------------------------------
|
||||
SYM.Init jsr SYM.NewGBlock
|
||||
SYM.Init lda #0
|
||||
ldy #SYM.iCurGBlock
|
||||
sta (pData),y
|
||||
dec
|
||||
ldy #SYM.hCurGBlock
|
||||
sta (pData),y
|
||||
|
||||
jsr SYM.NewGBlock
|
||||
bcs .9
|
||||
|
||||
clc
|
||||
@ -54,21 +62,78 @@ SYM.Quit ldy #SYM.LastGBlock
|
||||
.8 clc
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.AddGlobal
|
||||
clc
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.LookupGlobal
|
||||
clc
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.AddLocal
|
||||
clc
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.LookupLocal
|
||||
SYM.Dump >PUSHW L.MSG.SYMBOLS
|
||||
>LIBCALL hLIBSTR,LIBSTR.PRINTF
|
||||
|
||||
ldy #SYM.DumpCount
|
||||
lda #20
|
||||
sta (pData),y
|
||||
|
||||
jsr SYM.ResetGBlock
|
||||
|
||||
.1 jsr SYM.GetByteGBlock Get Flags
|
||||
sta SRC.GLabel.Flags
|
||||
bne .10
|
||||
clc
|
||||
rts
|
||||
|
||||
.10 ldx #0
|
||||
.2 jsr SYM.GetByteGBlock
|
||||
sta SRC.GLabel.Value,x
|
||||
inx
|
||||
cpx #4
|
||||
bne .2
|
||||
|
||||
jsr SYM.GetByteGBlock
|
||||
sta SRC.GLabel.Len
|
||||
|
||||
ldx #0
|
||||
.3 jsr SYM.GetByteGBlock
|
||||
sta SRC.GLabel.Name,x
|
||||
inx
|
||||
cpx SRC.GLabel.Len
|
||||
bne .3
|
||||
|
||||
>PUSHW L.SRC.GLabel.Len
|
||||
|
||||
lda SRC.GLabel.Value+1
|
||||
>PUSHA
|
||||
lda SRC.GLabel.Value
|
||||
>PUSHA
|
||||
lda SRC.GLabel.Value+3
|
||||
>PUSHA
|
||||
lda SRC.GLabel.Value+2
|
||||
>PUSHA
|
||||
|
||||
>PUSHW L.MSG.GSYMBOL
|
||||
>LIBCALL hLIBSTR,LIBSTR.PRINTF
|
||||
* bcs .9
|
||||
|
||||
.4 jsr SYM.GetByteGBlock
|
||||
beq .5 End Locals...proceed next Global
|
||||
|
||||
pha
|
||||
jsr SYM.GetByteGBlock
|
||||
>PUSHA
|
||||
pla
|
||||
>PUSHA
|
||||
>PUSHW L.MSG.LSYMBOL
|
||||
>LIBCALL hLIBSTR,LIBSTR.PRINTF
|
||||
* bcc .4
|
||||
bra .4
|
||||
|
||||
.5 lda #13
|
||||
jsr COUT
|
||||
|
||||
ldy #SYM.DumpCount
|
||||
lda (pData),y
|
||||
dec
|
||||
bne .6
|
||||
>DEBUG
|
||||
lda #20
|
||||
.6 sta (pData),y
|
||||
jmp .1
|
||||
.9 rts
|
||||
*---------------------------------------
|
||||
SYM.AddPrivate
|
||||
clc
|
||||
@ -86,74 +151,182 @@ SYM.LookupMacro
|
||||
clc
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.AddToGBlock ldy #SYM.GBlockPtr
|
||||
lda (pData),y
|
||||
clc
|
||||
adc #6 Value+Flags+Len
|
||||
bcs .1
|
||||
adc SRC.GLabel.Len
|
||||
bcs .1
|
||||
SYM.UpdateGlobal
|
||||
*---------------------------------------
|
||||
SYM.FindGlobal jsr SYM.ResetGBlock
|
||||
|
||||
ldy #SYM.LastGBlock
|
||||
lda (pData),y
|
||||
>SYSCALL SYS.GetMemPtrA
|
||||
>STYA ZPPtr1
|
||||
bra .2
|
||||
|
||||
.1 jsr SYM.NewGBlock
|
||||
bcs .9
|
||||
>STYA ZPPtr1
|
||||
|
||||
.2 ldx #0
|
||||
ldy #SYM.GBlockPtr
|
||||
|
||||
.3 lda SRC.GLabel.Value,x
|
||||
sta (ZPPtr1),y
|
||||
inx
|
||||
iny
|
||||
cpx #6
|
||||
bne .3
|
||||
.1 jsr SYM.GetByteGBlock Get Flags
|
||||
beq .9
|
||||
sta SRC.FLabel.Flags
|
||||
|
||||
ldx #0
|
||||
|
||||
.4 lda SRC.GLabel.Name,x
|
||||
sta (ZPPtr1),y
|
||||
.2 jsr SYM.GetByteGBlock
|
||||
sta SRC.FLabel.Value,x
|
||||
inx
|
||||
iny
|
||||
cpx SRC.GLabel.Len
|
||||
bne .4
|
||||
cpx #4
|
||||
bne .2
|
||||
|
||||
tya
|
||||
ldy #SYM.GBlockPtr
|
||||
sta (pData),y set new SYM.GBlockPtr
|
||||
jsr SYM.GetByteGBlock
|
||||
sta SRC.FLabel.Len
|
||||
|
||||
ldx #0
|
||||
.3 jsr SYM.GetByteGBlock
|
||||
sta SRC.FLabel.Name,x
|
||||
inx
|
||||
cpx SRC.FLabel.Len
|
||||
bne .3
|
||||
|
||||
cpx SRC.ELabel.Len
|
||||
bne .5
|
||||
|
||||
.4 lda SRC.FLabel.Name-1,x
|
||||
cmp SRC.ELabel.Name-1,x
|
||||
bne .5
|
||||
dex
|
||||
bne .4
|
||||
clc
|
||||
.9
|
||||
rts
|
||||
|
||||
.5 jsr SYM.GetByteGBlock
|
||||
beq .1
|
||||
jsr SYM.GetByteGBlock
|
||||
bra .5
|
||||
|
||||
.9 sec
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.NewGBlock >PUSHWI 256
|
||||
SYM.AddLToGBlock jsr SYM.GetLastGBlock
|
||||
|
||||
lda SRC.LLabel.ID
|
||||
jsr SYM.AddByteGBlock
|
||||
bcs .9
|
||||
|
||||
lda SRC.LLabel.Offset
|
||||
jmp SYM.AddByteGBlock
|
||||
.9 rts
|
||||
*---------------------------------------
|
||||
SYM.AddGToGBlock jsr SYM.GetLastGBlock
|
||||
|
||||
ldy #SYM.hCurGBlock 1st Gblock to add?
|
||||
lda (pData),y
|
||||
ldy #SYM.iCurGBlock
|
||||
ora (pData),y
|
||||
beq .10 yes, skip closing previous one
|
||||
|
||||
lda #0 Close Pending Global/Local
|
||||
jsr SYM.AddByteGBlock
|
||||
bcs .9
|
||||
|
||||
.10 ldx #0
|
||||
.1 lda SRC.GLabel.Flags,x
|
||||
jsr SYM.AddByteGBlock
|
||||
bcs .9
|
||||
inx
|
||||
cpx #6
|
||||
bne .1
|
||||
|
||||
ldx #0
|
||||
|
||||
.2 lda SRC.GLabel.Name,x
|
||||
jsr SYM.AddByteGBlock
|
||||
bcs .9
|
||||
inx
|
||||
cpx SRC.GLabel.Len
|
||||
bne .2
|
||||
|
||||
clc
|
||||
.9 rts
|
||||
*---------------------------------------
|
||||
SYM.ResetGBlock ldy #SYM.hGBlocks
|
||||
lda (pData),y
|
||||
>SYSCALL SYS.GetMemPtrA
|
||||
>STYA ZPBlockPtr
|
||||
lda #0
|
||||
ldy #SYM.hCurGBlock
|
||||
sta (pData),y
|
||||
ldy #SYM.iCurGBlock
|
||||
sta (pData),y
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.GetByteGBlock ldy #SYM.iCurGBlock
|
||||
lda (pData),y
|
||||
tay
|
||||
lda (ZPBlockPtr),y
|
||||
pha
|
||||
|
||||
ldy #SYM.iCurGBlock
|
||||
lda (pData),y
|
||||
inc
|
||||
sta (pData),y
|
||||
bne .1
|
||||
|
||||
ldy #SYM.hCurGBlock
|
||||
lda (pData),y
|
||||
inc
|
||||
sta (pData),y
|
||||
jsr SYM.GetGBlockA
|
||||
|
||||
.1 pla
|
||||
clc
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.GetLastGBlock ldy #SYM.LastGBlock
|
||||
lda (pData),y
|
||||
SYM.GetGBlockA clc
|
||||
adc #SYM.hGBlocks
|
||||
tay
|
||||
lda (pData),y
|
||||
phx
|
||||
>SYSCALL SYS.GetMemPtrA
|
||||
>STYA ZPBlockPtr
|
||||
plx
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.AddByteGBlock pha
|
||||
ldy #SYM.iCurGBlock
|
||||
lda (pData),y
|
||||
tay
|
||||
|
||||
pla
|
||||
sta (ZPBlockPtr),y
|
||||
|
||||
tya
|
||||
inc
|
||||
beq SYM.NewGBlock
|
||||
|
||||
ldy #SYM.iCurGBlock
|
||||
sta (pData),y
|
||||
clc
|
||||
rts
|
||||
*---------------------------------------
|
||||
SYM.NewGBlock phx
|
||||
>PUSHWI 256
|
||||
>PUSHBI S.MEM.F.INIT0
|
||||
>SYSCALL SYS.GetMem
|
||||
|
||||
bcs .9
|
||||
>STYA ZPPtr1
|
||||
>STYA ZPBlockPtr
|
||||
|
||||
ldy #SYM.LastGBlock
|
||||
lda (pData),y
|
||||
inc
|
||||
sta (pData),y
|
||||
|
||||
ldy #SYM.hGBlocks
|
||||
clc
|
||||
adc (pData),y
|
||||
adc #SYM.hGBlocks
|
||||
tay
|
||||
|
||||
txa
|
||||
sta (pData),y
|
||||
|
||||
lda #0
|
||||
ldy #SYM.GBlockPtr
|
||||
ldy #SYM.iCurGBlock
|
||||
sta (pData),y
|
||||
|
||||
clc
|
||||
.9 rts
|
||||
.9 plx
|
||||
rts
|
||||
*---------------------------------------
|
||||
MAN
|
||||
SAVE BIN/ASM.S.SYM
|
||||
|
@ -16,6 +16,7 @@ AUTO 6
|
||||
ZPPtr1 .EQ ZPBIN
|
||||
ZPPtr2 .EQ ZPBIN+2
|
||||
ZPPtr3 .EQ ZPBIN+4
|
||||
ZPBlockPtr .EQ ZPBIN+6
|
||||
*---------------------------------------
|
||||
ASM.T.AM .EQ 0
|
||||
ASM.T.R .EQ 2
|
||||
@ -24,7 +25,7 @@ ASM.T.O .EQ 4
|
||||
SRC.IN.MAXDEPTH .EQ 7
|
||||
SRC.GLABEL.MAXLEN .EQ 32
|
||||
*---------------------------------------
|
||||
SYM.GBLOCK.MAX .EQ 64 64*256=16k
|
||||
SYM.GBLOCK.MAX .EQ 96 96*256=24k
|
||||
SYM.SBLOCK.MAX .EQ 16 16*256=4k
|
||||
SYM.PBLOCK.MAX .EQ 32 32*256=8k
|
||||
SYM.MBLOCK.MAX .EQ 32 32*256=8k
|
||||
@ -43,6 +44,9 @@ ERR.INVALID.DIRECTIVE .EQ $A5
|
||||
ERR.INVALID.OPCODE .EQ $A6
|
||||
ERR.INVALID.AM.SYN .EQ $A7
|
||||
ERR.INVALID.AM.4.OC .EQ $A8
|
||||
ERR.RANGE .EQ $A9
|
||||
ERR.UNDEF.SYMBOL .EQ $AA
|
||||
ERR.SYMBOL.REDEFINE .EQ $AB
|
||||
ERR.MISSING.EXP .EQ $B0
|
||||
ERR.EXP.SYN.ERROR .EQ $B1
|
||||
ERR.INVALID.MACRO.DEF .EQ $E0
|
||||
@ -71,11 +75,17 @@ L.MSG.HELP2 .DA MSG.HELP2
|
||||
L.MSG.SRCLINE .DA MSG.SRCLINE
|
||||
L.MSG.ERROR .DA MSG.ERROR
|
||||
L.MSG.DEBUG .DA MSG.DEBUG
|
||||
L.SRC.AM.StrBuf .DA SRC.AM.StrBuf
|
||||
L.MSG.SYMBOLS .DA MSG.SYMBOLS
|
||||
L.MSG.GSYMBOL .DA MSG.GSYMBOL
|
||||
L.MSG.LSYMBOL .DA MSG.LSYMBOL
|
||||
L.MSG.SUMMARY .DA MSG.SUMMARY
|
||||
L.MSG.PASS .DA MSG.PASS
|
||||
L.MSG.SRC.FILE .DA MSG.SRC.FILE
|
||||
L.MSG.OBJ.FILE .DA MSG.OBJ.FILE
|
||||
L.MSG.T.FILE .DA MSG.T.FILE
|
||||
L.SRC.AM.StrBuf .DA SRC.AM.StrBuf
|
||||
L.SRC.GLabel.Len .DA SRC.GLabel.Len
|
||||
L.SRC.ELabel.Len .DA SRC.ELabel.Len
|
||||
L.SRC.BUFFER .DA SRC.BUFFER
|
||||
L.ASM.T.FILENAME .DA ASM.T.FILENAME
|
||||
L.T.DIRECTIVES .DA T.DIRECTIVES
|
||||
@ -177,6 +187,9 @@ CS.INIT >LDYA L.LIBSTR
|
||||
jsr LOAD.ASM.T
|
||||
bcs .99
|
||||
|
||||
jsr SYM.Init
|
||||
bcs .99
|
||||
|
||||
lda #$80
|
||||
ldy #ASM.LI.ON
|
||||
sta (pData),y
|
||||
@ -243,7 +256,12 @@ CS.RUN ldy #bCANCEL
|
||||
clc
|
||||
rts
|
||||
|
||||
.1 lda #0 End of assembly, exit with no error
|
||||
.1 jsr SYM.Dump
|
||||
|
||||
>PUSHW L.MSG.SUMMARY
|
||||
>LIBCALL hLIBSTR,LIBSTR.PRINTF
|
||||
|
||||
lda #0 End of assembly, exit with no error
|
||||
.99 sec
|
||||
rts
|
||||
|
||||
@ -306,6 +324,8 @@ CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device?
|
||||
CS.QUIT jsr FIO.FileClose
|
||||
bne CS.QUIT
|
||||
|
||||
jsr SYM.Quit
|
||||
|
||||
ldy #ASM.T.hMem
|
||||
lda (pData),y
|
||||
beq .1
|
||||
@ -321,6 +341,15 @@ CS.QUIT jsr FIO.FileClose
|
||||
>SYSCALL SYS.UnloadLibA
|
||||
clc
|
||||
rts
|
||||
*---------------------------------------
|
||||
COUT phx
|
||||
phy
|
||||
ldx #DEVMGR.COUT
|
||||
jsr pDevJmp
|
||||
ply
|
||||
plx
|
||||
rts
|
||||
pDevJmp jmp (pDev)
|
||||
*---------------------------------------
|
||||
.INB BIN/ASM.S.DIR
|
||||
.INB BIN/ASM.S.EXP
|
||||
@ -430,19 +459,29 @@ LIBSTR >PSTRING "libstr.o"
|
||||
MSG.HELP1 >CSTRING "A2osX-Macro Assembler (S-C MASM 3.0 Based)\n"
|
||||
MSG.HELP2 >CSTRING "Usage : ASM <src file> [type TXT ($04) or S-C/BAS ($FA)]\n"
|
||||
MSG.PASS >CSTRING "Pass:#%d\n"
|
||||
MSG.SRC.FILE >CSTRING "Source File:%S\n"
|
||||
MSG.OBJ.FILE >CSTRING "Object File:%S, Type=%02x\n"
|
||||
MSG.T.FILE >CSTRING "CPU Definition File:%S\n"
|
||||
MSG.SRC.FILE >CSTRING "Reading SRC File:%S\n"
|
||||
MSG.OBJ.FILE >CSTRING "Writing OBJ File:%S, Type=%02x\n"
|
||||
MSG.T.FILE >CSTRING "Loading CPU File:%S\n"
|
||||
MSG.SRCLINE >CSTRING "%05D-%s\n"
|
||||
MSG.ERROR >CSTRING "%05D-Error:$%h\n"
|
||||
MSG.DEBUG >CSTRING "DEBUG:%h:%S:%s\n"
|
||||
MSG.SYMBOLS >CSTRING "Symbol Table:\n"
|
||||
MSG.GSYMBOL >CSTRING "$%H%H:%S"
|
||||
MSG.LSYMBOL >CSTRING " .%d:+$%h"
|
||||
MSG.SUMMARY >CSTRING "\nEnd Of Assembly.\n"
|
||||
SRC.AM.RESERVED >PSTRING "[]#(),"
|
||||
SRC.MOD.RESERVED >PSTRING "#/<>"
|
||||
SRC.EXP.RESERVED >PSTRING "^!|&<=>+-*/"
|
||||
ASM.T.DEFAULT .AS ".T.6502"
|
||||
ASM.T.FILENAMELEN .BS 1
|
||||
ASM.T.FILENAME .BS 65
|
||||
hLIBSTR .BS 1
|
||||
hFileName .BS 1
|
||||
|
||||
FIO.hFileName .BS 1
|
||||
FIO.hFullPath .BS 1
|
||||
|
||||
EXP.Operator .BS 1
|
||||
|
||||
SRC.LINENUM .BS 2
|
||||
SRC.Directive.ID .BS 1
|
||||
SRC.Keyword.ID .BS 1
|
||||
@ -456,10 +495,21 @@ SRC.BufPtr .BS 1
|
||||
SRC.BufPtrSave .BS 1
|
||||
SRC.Buffer .BS 256
|
||||
*--------------------------------------
|
||||
SRC.GLabel.Value .BS 4
|
||||
SRC.GLabel.New .BS 1
|
||||
SRC.GLabel.Flags .BS 1
|
||||
SRC.GLabel.Value .BS 4
|
||||
SRC.GLabel.Len .BS 1
|
||||
SRC.GLabel.Name .BS SRC.GLABEL.MAXLEN
|
||||
SRC.LLabel.ID .BS 1
|
||||
SRC.LLabel.Offset .BS 1
|
||||
SRC.ELabel.Flags .BS 1
|
||||
SRC.ELabel.Value .BS 4
|
||||
SRC.ELabel.Len .BS 1
|
||||
SRC.ELabel.Name .BS SRC.GLABEL.MAXLEN
|
||||
SRC.FLabel.Flags .BS 1
|
||||
SRC.FLabel.Value .BS 4
|
||||
SRC.FLabel.Len .BS 1
|
||||
SRC.FLabel.Name .BS SRC.GLABEL.MAXLEN
|
||||
*--------------------------------------
|
||||
.DUMMY
|
||||
.OR 0
|
||||
@ -481,21 +531,27 @@ DST.hFILETYPE .BS 1
|
||||
|
||||
ASM.T.hMem .BS 1 handle to ASM.T.xxxxx
|
||||
|
||||
SYM.LastGBlock .BS 1
|
||||
SYM.hGBlocks .BS SYM.GBLOCK.MAX
|
||||
SYM.GBlockPtr .BS 1
|
||||
|
||||
SYM.hCurSBlock .BS 1
|
||||
SYM.iCurSBlock .BS 1
|
||||
SYM.LastSBlock .BS 1
|
||||
SYM.hSBlocks .BS SYM.SBLOCK.MAX
|
||||
SYM.SBlockPtr .BS 1
|
||||
|
||||
SYM.hCurGBlock .BS 1
|
||||
SYM.iCurGBlock .BS 1
|
||||
SYM.LastGBlock .BS 1
|
||||
SYM.hGBlocks .BS SYM.GBLOCK.MAX
|
||||
|
||||
SYM.hCurPBlock .BS 1
|
||||
SYM.iCurPBlock .BS 1
|
||||
SYM.LastPBlock .BS 1
|
||||
SYM.hPBlocks .BS SYM.PBLOCK.MAX
|
||||
SYM.PrivateBlockPtr .BS 1
|
||||
|
||||
SYM.hCurMBlock .BS 1
|
||||
SYM.iCurMBlock .BS 1
|
||||
SYM.LastMBlock .BS 1
|
||||
SYM.hMBlocks .BS SYM.MBLOCK.MAX
|
||||
SYM.MBlockPtr .BS 1
|
||||
|
||||
SYM.DumpCount .BS 1
|
||||
|
||||
ASM.PASS .BS 1
|
||||
ASM.MACRO.ON .BS 1
|
||||
@ -505,10 +561,15 @@ ASM.LI.CON .BS 1
|
||||
ASM.LI.XON .BS 1
|
||||
ASM.PC .BS 4 32Bits PC
|
||||
ASM.PC.PH .BS 4 32Bits PC saved for PH directive
|
||||
ASM.PC.GLABEL .BS 4 32Bits PC for last Label (for local labels)
|
||||
ASM.LOCAL.OFFSET .BS 1 Store local offset from last Global Symbol for local (.xx)
|
||||
ASM.LOCAL.INVALID .BS 1 If not in global or offset out of range this flag is set
|
||||
ASM.SYM.ID .BS 2 For reference when a local label is parsed
|
||||
DS.END .ED
|
||||
*---------------------------------------
|
||||
.DO DS.END-DS.START>$FF
|
||||
ERROR:DS too big
|
||||
.FIN
|
||||
*---------------------------------------
|
||||
MAN
|
||||
SAVE BIN/ASM.S
|
||||
|
Loading…
Reference in New Issue
Block a user