Work In Progress (ASM)

This commit is contained in:
Rémy GIBERT 2015-11-20 17:31:14 +01:00
parent 7fa3545a19
commit 71a00af938
6 changed files with 518 additions and 148 deletions

View File

@ -48,6 +48,12 @@ DIR.EP clc
DIR.EQ jsr EXP.Eval DIR.EQ jsr EXP.Eval
bcs .9 bcs .9
ldx #3
.1 lda SRC.ACC,x
sta SRC.GLabel.Value,x
dex
bpl .1
clc clc
.9 rts .9 rts
*--------------------------------------- *---------------------------------------
@ -63,13 +69,23 @@ DIR.IN jsr SRC.GetArg
>LDYA L.SRC.BUFFER >LDYA L.SRC.BUFFER
>SYSCALL SYS.NewPStrYA >SYSCALL SYS.NewPStrYA
pha
jsr FIO.OpenFileA jsr FIO.OpenFileA
bcs .99 plx
php
pha
txa
>SYSCALL SYS.FreeMemA
pla
plp
rts rts
.9 lda #ERR.SYNTAX.ERROR .9 lda #ERR.SYNTAX.ERROR
.99 sec sec
rts rts
*--------------------------------------- *---------------------------------------
DIR.LI >LDYA L.T.LI DIR.LI >LDYA L.T.LI
@ -100,6 +116,10 @@ DIR.LI.ON ldy #ASM.LI.ON
DIR.LI.OFF ldy #ASM.LI.ON DIR.LI.OFF ldy #ASM.LI.ON
clc clc
DIR.LI.APPLY lsr DIR.LI.APPLY lsr
lda #$80
sta (pData),y sta (pData),y
rts rts
*--------------------------------------- *---------------------------------------

View File

@ -13,22 +13,26 @@ AUTO 6
* & = octal * & = octal
* * = PC * * = PC
*--------------------------------------- *---------------------------------------
EXP.Eval jsr SRC.GetCharNB EXP.Eval stz EXP.Operator
jsr SRC.GetCharNB
beq .98 beq .98
cmp #'*' cmp #'*'
bne .10 bne .10
ldy #ASM.PC ldy #ASM.PC+3
ldx #0 ldx #3
.11 lda (pData),y .11 lda (pData),y
sta SRC.ACC,x sta SRC.ACC,x
inx dey
iny dex
cpx #4 bpl .11
bne .11
bra .8 jsr SRC.GetCharNB
bne .97
clc
rts
.10 jsr SRC.IsDigit10 Decimal constant ? .10 jsr SRC.IsDigit10 Decimal constant ?
bcs .1 bcs .1
@ -62,7 +66,24 @@ EXP.Eval jsr SRC.GetCharNB
.4 jsr SRC.IsLetter Symbol ? .4 jsr SRC.IsLetter Symbol ?
bcs .97 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 .8 clc
rts rts
@ -74,6 +95,10 @@ EXP.Eval jsr SRC.GetCharNB
.98 lda #ERR.MISSING.EXP .98 lda #ERR.MISSING.EXP
sec sec
.99 rts .99 rts
.96 lda #ERR.UNDEF.SYMBOL
sec
rts
*--------------------------------------- *---------------------------------------
stz SRC.ACC stz SRC.ACC
stz SRC.ACC+1 stz SRC.ACC+1

View File

@ -5,21 +5,25 @@ INC 1
AUTO 6 AUTO 6
.LIST OFF .LIST OFF
*--------------------------------------- *---------------------------------------
FIO.OpenFileA sta hFileName FIO.OpenFileA sta FIO.hFileName
>SYSCALL SYS.GetMemPtrA >SYSCALL SYS.GetMemPtrA
>STYA ZPPtr1 >STYA ZPPtr1
stz FIO.hFullPath
ldy #1 ldy #1
lda (ZPPtr1),y lda (ZPPtr1),y
cmp #'/' cmp #'/'
beq .1 beq .1
>PUSHB hFileName >PUSHB FIO.hFileName
ldy #S.PS.hPREFIX ldy #S.PS.hPREFIX
lda (pPs),y lda (pPs),y
>PUSHA >PUSHA
>SYSCALL SYS.PStrCat >SYSCALL SYS.PStrCat
sta hFileName sta FIO.hFullPath
sta FIO.hFileName
>SYSCALL SYS.GetMemPtrA >SYSCALL SYS.GetMemPtrA
>STYA ZPPtr1 >STYA ZPPtr1
@ -34,9 +38,9 @@ FIO.OpenFileA sta hFileName
lda #ERR.SRC.TOO.MANY.IN lda #ERR.SRC.TOO.MANY.IN
sec sec
rts bra FIO.OpenFileA.Exit
.10 lda hFileName .10 lda FIO.hFileName
>SYSCALL SYS.MLIOpenA >SYSCALL SYS.MLIOpenA
bcs .99 bcs .99
@ -57,7 +61,7 @@ FIO.OpenFileA sta hFileName
txa txa
sta (pData),y sta (pData),y
lda hFileName lda FIO.hFileName
>SYSCALL SYS.MLIGetFileInfoA >SYSCALL SYS.MLIGetFileInfoA
bcs .99 bcs .99
@ -100,11 +104,18 @@ FIO.OpenFileA sta hFileName
inc inc
sta (pData),y sta (pData),y
clc clc
rts bra FIO.OpenFileA.Exit
.98 lda #ERR.SRC.INV.TYPE .98 lda #ERR.SRC.INV.TYPE
.99 sec .99 sec
FIO.OpenFileA.Exit php
pha
lda FIO.hFullPath
beq .1
>SYSCALL SYS.FreeMemA
.1 pla
plp
rts rts
*--------------------------------------- *---------------------------------------
FIO.ReadLine stz SRC.BufPtr FIO.ReadLine stz SRC.BufPtr

View File

@ -13,10 +13,12 @@ SRC.ParseLine ldx TmpBuffer256
cpx #';' Comment? cpx #';' Comment?
beq SRC.ParseLine.Skip beq SRC.ParseLine.Skip
stz SRC.GLabel.New
cpx #' ' no label...go scan dir/opcode cpx #' ' no label...go scan dir/opcode
beq .4 beq .4
.1 cpx #'.' local symbol? cpx #'.' local symbol?
bne .2 bne .2
jsr SRC.ParseLine.SymL jsr SRC.ParseLine.SymL
bra .3 bra .3
@ -46,47 +48,117 @@ SRC.ParseLine ldx TmpBuffer256
bcs SRC.ParseLine.Err bcs SRC.ParseLine.Err
SRC.ParseLine.Ok lda SRC.GLabel.Len SRC.ParseLine.Ok lda SRC.GLabel.New
beq .1 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 SRC.ParseLine.skip clc
rts rts
SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL
SRC.ParseLine.Err sec SRC.ParseLine.Err sec
rts rts
SRC.ParseLine.Redef lda #ERR.SYMBOL.REDEFINE
sec
rts
*--------------------------------------- *---------------------------------------
SRC.ParseLine.SymP jsr SRC.GetChar SRC.ParseLine.SymP jsr SRC.GetChar
beq SRC.ParseLine.SymE beq SRC.ParseLine.SymE
jsr SRC.GetDecimal jsr SRC.GetDecimal
bcs SRC.ParseLine.SymR bcs SRC.ParseLine.SymE
jmp SYM.AddPrivate jmp SYM.AddPrivate
*--------------------------------------- *---------------------------------------
SRC.ParseLine.SymL jsr SRC.GetChar SRC.ParseLine.SymL jsr SRC.GetChar
beq SRC.ParseLine.SymE beq SRC.ParseLine.SymE
jsr SRC.GetDecimal jsr SRC.GetDecimal
bcs SRC.ParseLine.SymR bcs SRC.ParseLine.SymE
jmp SYM.AddLocal 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 bcs SRC.ParseLine.SymE
ldx #3 Makes Current Label = PC for now ldx #3 Makes Current Label = PC for now
ldy #ASM.PC ldy #ASM.PC+3
lda (pdata),y
.1 sta SRC.GLabel.Value,x .1 lda (pData),y
sta SRC.GLabel.Value,x
dey dey
dex dex
bpl .1 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 clc
rts rts
SRC.ParseLine.SymE lda #ERR.INVALID.LABEL
sec
SRC.ParseLine.SymR rts
*--------------------------------------- *---------------------------------------
SRC.ParseLine.Dir >LDYA L.T.DIRECTIVES SRC.ParseLine.Dir >LDYA L.T.DIRECTIVES
jsr SRC.GetKeyword jsr SRC.GetKeyword
@ -154,7 +226,18 @@ SRC.ParseLine.OpCode
jsr SRC.ParseLine.AM jsr SRC.ParseLine.AM
bcs .99 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 rts
.7 lda ZPPtr1 .7 lda ZPPtr1
@ -189,14 +272,7 @@ SRC.ParseLine.AM stz SRC.AM.ID
sta SRC.AM.StrBuf,x sta SRC.AM.StrBuf,x
bra .1 bra .1
.8 lda SRC.AM.StrBuf .8 clc
beq .89
>PUSHWI TmpBuffer256
>PUSHW L.SRC.AM.StrBuf
>PUSHB SRC.AM.StrBuf
>PUSHW L.MSG.DEBUG
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.89 clc
rts rts
.2 jsr SRC.IsLetter Any register? .2 jsr SRC.IsLetter Any register?
@ -207,7 +283,7 @@ SRC.ParseLine.AM stz SRC.AM.ID
inc SRC.AM.tmpBuf inc SRC.AM.tmpBuf
.3 jsr SRC.GetCharUC .3 jsr SRC.GetCharUC
beq .4 beq .41
jsr SRC.IsLetterOrDigit jsr SRC.IsLetterOrDigit
bne .4 bne .4
inc SRC.AM.tmpBuf inc SRC.AM.tmpBuf
@ -217,7 +293,7 @@ SRC.ParseLine.AM stz SRC.AM.ID
.4 dec SRC.BufPtr back one char .4 dec SRC.BufPtr back one char
ldy #0 .41 ldy #0
.5 lda (ZPPtr3),y .5 lda (ZPPtr3),y
beq .71 last register ? beq .71 last register ?
@ -241,10 +317,11 @@ SRC.ParseLine.AM stz SRC.AM.ID
.61 iny .61 iny
lda SRC.AM.tmpBuf,y lda SRC.AM.tmpBuf,y
sta SRC.AM.StrBuf,x
inx inx
sta SRC.AM.StrBuf,x
cpy SRC.AM.tmpBuf cpy SRC.AM.tmpBuf
bne .61 bne .61
stx SRC.AM.StrBuf stx SRC.AM.StrBuf
bra .72 bra .72
@ -258,7 +335,7 @@ SRC.ParseLine.AM stz SRC.AM.ID
.70 dec SRC.BufPtr back one char .70 dec SRC.BufPtr back one char
.71 jsr SRC.GetExp .71 jsr EXP.Eval
bcs .99 bcs .99
.72 jmp .1 .72 jmp .1
clc clc
@ -313,7 +390,7 @@ SRC.GetDecimal stz SRC.ACC+1
jsr SRC.ACC10 jsr SRC.ACC10
pla pla
bcs .9 bcs .9
clc
adc SRC.ACC adc SRC.ACC
sta SRC.ACC sta SRC.ACC
bcc .1 bcc .1
@ -344,7 +421,7 @@ SRC.GetHex stz SRC.ACC+1
beq .99 beq .99
jsr SRC.IsDigit16 jsr SRC.IsDigit16
bcs .99 bcs .99
and #$0F
sta SRC.ACC sta SRC.ACC
.1 jsr SRC.GetChar .1 jsr SRC.GetChar
@ -354,20 +431,16 @@ SRC.GetHex stz SRC.ACC+1
jsr SRC.IsDigit16 jsr SRC.IsDigit16
bcs .99 bcs .99
asl
asl
asl
asl
ldx #4 ldx #4
.2 asl .2 asl SRC.ACC
rol SRC.ACC
rol SRC.ACC+1 rol SRC.ACC+1
rol SRC.ACC+2 rol SRC.ACC+2
rol SRC.ACC+3 rol SRC.ACC+3
bcs .9 bcs .9
dex dex
bne .2 bne .2
ora SRC.ACC
sta SRC.ACC
bra .1 bra .1
.8 clc .8 clc
@ -467,14 +540,15 @@ SRC.GetBinary stz SRC.ACC+1
sec sec
rts rts
*--------------------------------------- *---------------------------------------
SRC.GetGLabel jsr SRC.GetCharUC SRC.GetLabel >STYA ZPPtr1
jsr SRC.GetCharUC
beq .9 beq .9
jsr SRC.IsLetter jsr SRC.IsLetter
bcs .9 bcs .9
sta SRC.GLabel.Name
ldy #1 ldy #1
sta (ZPPtr1),y
.1 jsr SRC.GetCharUC .1 jsr SRC.GetCharUC
beq .8 beq .8
@ -485,19 +559,25 @@ SRC.GetGLabel jsr SRC.GetCharUC
cmp #'.' cmp #'.'
beq .2 beq .2
cmp #'_'
beq .2
jsr SRC.IsEXPReserved
bcc .8
jsr SRC.IsLetterOrDigit jsr SRC.IsLetterOrDigit
bcs .9 bcs .9
.2 sta SRC.GLabel.Name,y .2 iny
iny sta (ZPPtr1),y
cpy #SRC.GLABEL.MAXLEN 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 rts
.8 tya .8 tya
sta SRC.GLabel.Len sta (ZPPtr1)
clc clc
rts rts
*--------------------------------------- *---------------------------------------
@ -544,7 +624,7 @@ SRC.GetKeyword >STYA ZPPtr1
.9 sec .9 sec
rts rts
*--------------------------------------- *---------------------------------------
SRC.GetExp stz SRC.Exp SRC.GetExp.DELETE stz SRC.Exp
jsr SRC.GetCharUC jsr SRC.GetCharUC
beq .9 beq .9
@ -634,11 +714,11 @@ SRC.IsDigit16 jsr SRC.IsDigit10
bcc .8 bcc .8
cmp #'A' cmp #'A'
bcc .9 bcc .9
cmp #'G' cmp #'F'+1
bcc .1 bcc .1
rts cc if ok, cs if not 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 clc
.8 and #$0F .8 and #$0F
rts rts
@ -702,8 +782,8 @@ SRC.ACC10 lda SRC.ACC ACC*2-> ACC & ACCTMP
sta SRC.ACCTMP+3 sta SRC.ACCTMP+3
bcs .9 bcs .9
ldx #1 ldx #2
.1 asl SRC.ACC ACC=ACC*8 .1 asl SRC.ACC ACC=ACC*4
rol SRC.ACC+1 rol SRC.ACC+1
rol SRC.ACC+2 rol SRC.ACC+2
rol SRC.ACC+3 rol SRC.ACC+3

View File

@ -6,15 +6,16 @@ AUTO 6
.LIST OFF .LIST OFF
*--------------------------------------- *---------------------------------------
* Global Symbol Record: (8+ bytes) * Global Symbol Record: (8+ bytes)
* 0-3 : 32 bits Value * 0 : Flags:
* 4 : Flags: * b7=Valid Entry
* b7=R/W (.SE)
* b6=pending * b6=pending
* b0=R/W (.SE)
* 1-4 : 32 bits Value
* 5 : Len * 5 : Len
* 6-... Name * 6-... Name
* ...... * ......
* Local Symbol Record: (2 bytes) * Local Symbol Record: (2 bytes)
* 2 : Local ID (0->255) * 2 : Local ID (1->255)
* 3 : offset from Global Symbol * 3 : offset from Global Symbol
* ...... * ......
* Ending 0 * Ending 0
@ -30,7 +31,14 @@ AUTO 6
*--------------------------------------- *---------------------------------------
* Macro Record: ( bytes) * 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 bcs .9
clc clc
@ -54,21 +62,78 @@ SYM.Quit ldy #SYM.LastGBlock
.8 clc .8 clc
rts rts
*--------------------------------------- *---------------------------------------
SYM.AddGlobal SYM.Dump >PUSHW L.MSG.SYMBOLS
clc >LIBCALL hLIBSTR,LIBSTR.PRINTF
rts
*--------------------------------------- ldy #SYM.DumpCount
SYM.LookupGlobal lda #20
clc sta (pData),y
rts
*--------------------------------------- jsr SYM.ResetGBlock
SYM.AddLocal
clc .1 jsr SYM.GetByteGBlock Get Flags
rts sta SRC.GLabel.Flags
*--------------------------------------- bne .10
SYM.LookupLocal
clc clc
rts 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 SYM.AddPrivate
clc clc
@ -86,74 +151,182 @@ SYM.LookupMacro
clc clc
rts rts
*--------------------------------------- *---------------------------------------
SYM.AddToGBlock ldy #SYM.GBlockPtr SYM.UpdateGlobal
lda (pData),y *---------------------------------------
clc SYM.FindGlobal jsr SYM.ResetGBlock
adc #6 Value+Flags+Len
bcs .1
adc SRC.GLabel.Len
bcs .1
ldy #SYM.LastGBlock .1 jsr SYM.GetByteGBlock Get Flags
lda (pData),y beq .9
>SYSCALL SYS.GetMemPtrA sta SRC.FLabel.Flags
>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
ldx #0 ldx #0
.4 lda SRC.GLabel.Name,x .2 jsr SYM.GetByteGBlock
sta (ZPPtr1),y sta SRC.FLabel.Value,x
inx inx
iny cpx #4
cpx SRC.GLabel.Len bne .2
bne .4
tya jsr SYM.GetByteGBlock
ldy #SYM.GBlockPtr sta SRC.FLabel.Len
sta (pData),y set new SYM.GBlockPtr
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 clc
.9 rts
.5 jsr SYM.GetByteGBlock
beq .1
jsr SYM.GetByteGBlock
bra .5
.9 sec
rts 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 >PUSHBI S.MEM.F.INIT0
>SYSCALL SYS.GetMem >SYSCALL SYS.GetMem
bcs .9 bcs .9
>STYA ZPPtr1 >STYA ZPBlockPtr
ldy #SYM.LastGBlock ldy #SYM.LastGBlock
lda (pData),y lda (pData),y
inc inc
sta (pData),y sta (pData),y
ldy #SYM.hGBlocks
clc clc
adc (pData),y adc #SYM.hGBlocks
tay tay
txa txa
sta (pData),y sta (pData),y
lda #0 lda #0
ldy #SYM.GBlockPtr ldy #SYM.iCurGBlock
sta (pData),y sta (pData),y
clc clc
.9 rts .9 plx
rts
*--------------------------------------- *---------------------------------------
MAN MAN
SAVE BIN/ASM.S.SYM SAVE BIN/ASM.S.SYM

View File

@ -16,6 +16,7 @@ AUTO 6
ZPPtr1 .EQ ZPBIN ZPPtr1 .EQ ZPBIN
ZPPtr2 .EQ ZPBIN+2 ZPPtr2 .EQ ZPBIN+2
ZPPtr3 .EQ ZPBIN+4 ZPPtr3 .EQ ZPBIN+4
ZPBlockPtr .EQ ZPBIN+6
*--------------------------------------- *---------------------------------------
ASM.T.AM .EQ 0 ASM.T.AM .EQ 0
ASM.T.R .EQ 2 ASM.T.R .EQ 2
@ -24,7 +25,7 @@ ASM.T.O .EQ 4
SRC.IN.MAXDEPTH .EQ 7 SRC.IN.MAXDEPTH .EQ 7
SRC.GLABEL.MAXLEN .EQ 32 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.SBLOCK.MAX .EQ 16 16*256=4k
SYM.PBLOCK.MAX .EQ 32 32*256=8k SYM.PBLOCK.MAX .EQ 32 32*256=8k
SYM.MBLOCK.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.OPCODE .EQ $A6
ERR.INVALID.AM.SYN .EQ $A7 ERR.INVALID.AM.SYN .EQ $A7
ERR.INVALID.AM.4.OC .EQ $A8 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.MISSING.EXP .EQ $B0
ERR.EXP.SYN.ERROR .EQ $B1 ERR.EXP.SYN.ERROR .EQ $B1
ERR.INVALID.MACRO.DEF .EQ $E0 ERR.INVALID.MACRO.DEF .EQ $E0
@ -71,11 +75,17 @@ L.MSG.HELP2 .DA MSG.HELP2
L.MSG.SRCLINE .DA MSG.SRCLINE L.MSG.SRCLINE .DA MSG.SRCLINE
L.MSG.ERROR .DA MSG.ERROR L.MSG.ERROR .DA MSG.ERROR
L.MSG.DEBUG .DA MSG.DEBUG 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.PASS .DA MSG.PASS
L.MSG.SRC.FILE .DA MSG.SRC.FILE L.MSG.SRC.FILE .DA MSG.SRC.FILE
L.MSG.OBJ.FILE .DA MSG.OBJ.FILE L.MSG.OBJ.FILE .DA MSG.OBJ.FILE
L.MSG.T.FILE .DA MSG.T.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.SRC.BUFFER .DA SRC.BUFFER
L.ASM.T.FILENAME .DA ASM.T.FILENAME L.ASM.T.FILENAME .DA ASM.T.FILENAME
L.T.DIRECTIVES .DA T.DIRECTIVES L.T.DIRECTIVES .DA T.DIRECTIVES
@ -177,6 +187,9 @@ CS.INIT >LDYA L.LIBSTR
jsr LOAD.ASM.T jsr LOAD.ASM.T
bcs .99 bcs .99
jsr SYM.Init
bcs .99
lda #$80 lda #$80
ldy #ASM.LI.ON ldy #ASM.LI.ON
sta (pData),y sta (pData),y
@ -243,7 +256,12 @@ CS.RUN ldy #bCANCEL
clc clc
rts 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 .99 sec
rts rts
@ -306,6 +324,8 @@ CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device?
CS.QUIT jsr FIO.FileClose CS.QUIT jsr FIO.FileClose
bne CS.QUIT bne CS.QUIT
jsr SYM.Quit
ldy #ASM.T.hMem ldy #ASM.T.hMem
lda (pData),y lda (pData),y
beq .1 beq .1
@ -321,6 +341,15 @@ CS.QUIT jsr FIO.FileClose
>SYSCALL SYS.UnloadLibA >SYSCALL SYS.UnloadLibA
clc clc
rts rts
*---------------------------------------
COUT phx
phy
ldx #DEVMGR.COUT
jsr pDevJmp
ply
plx
rts
pDevJmp jmp (pDev)
*--------------------------------------- *---------------------------------------
.INB BIN/ASM.S.DIR .INB BIN/ASM.S.DIR
.INB BIN/ASM.S.EXP .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.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.HELP2 >CSTRING "Usage : ASM <src file> [type TXT ($04) or S-C/BAS ($FA)]\n"
MSG.PASS >CSTRING "Pass:#%d\n" MSG.PASS >CSTRING "Pass:#%d\n"
MSG.SRC.FILE >CSTRING "Source File:%S\n" MSG.SRC.FILE >CSTRING "Reading SRC File:%S\n"
MSG.OBJ.FILE >CSTRING "Object File:%S, Type=%02x\n" MSG.OBJ.FILE >CSTRING "Writing OBJ File:%S, Type=%02x\n"
MSG.T.FILE >CSTRING "CPU Definition File:%S\n" MSG.T.FILE >CSTRING "Loading CPU File:%S\n"
MSG.SRCLINE >CSTRING "%05D-%s\n" MSG.SRCLINE >CSTRING "%05D-%s\n"
MSG.ERROR >CSTRING "%05D-Error:$%h\n" MSG.ERROR >CSTRING "%05D-Error:$%h\n"
MSG.DEBUG >CSTRING "DEBUG:%h:%S:%s\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.AM.RESERVED >PSTRING "[]#(),"
SRC.MOD.RESERVED >PSTRING "#/<>"
SRC.EXP.RESERVED >PSTRING "^!|&<=>+-*/" SRC.EXP.RESERVED >PSTRING "^!|&<=>+-*/"
ASM.T.DEFAULT .AS ".T.6502" ASM.T.DEFAULT .AS ".T.6502"
ASM.T.FILENAMELEN .BS 1 ASM.T.FILENAMELEN .BS 1
ASM.T.FILENAME .BS 65 ASM.T.FILENAME .BS 65
hLIBSTR .BS 1 hLIBSTR .BS 1
hFileName .BS 1
FIO.hFileName .BS 1
FIO.hFullPath .BS 1
EXP.Operator .BS 1
SRC.LINENUM .BS 2 SRC.LINENUM .BS 2
SRC.Directive.ID .BS 1 SRC.Directive.ID .BS 1
SRC.Keyword.ID .BS 1 SRC.Keyword.ID .BS 1
@ -456,10 +495,21 @@ SRC.BufPtr .BS 1
SRC.BufPtrSave .BS 1 SRC.BufPtrSave .BS 1
SRC.Buffer .BS 256 SRC.Buffer .BS 256
*-------------------------------------- *--------------------------------------
SRC.GLabel.Value .BS 4 SRC.GLabel.New .BS 1
SRC.GLabel.Flags .BS 1 SRC.GLabel.Flags .BS 1
SRC.GLabel.Value .BS 4
SRC.GLabel.Len .BS 1 SRC.GLabel.Len .BS 1
SRC.GLabel.Name .BS SRC.GLABEL.MAXLEN 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 .DUMMY
.OR 0 .OR 0
@ -481,21 +531,27 @@ DST.hFILETYPE .BS 1
ASM.T.hMem .BS 1 handle to ASM.T.xxxxx ASM.T.hMem .BS 1 handle to ASM.T.xxxxx
SYM.LastGBlock .BS 1 SYM.hCurSBlock .BS 1
SYM.hGBlocks .BS SYM.GBLOCK.MAX SYM.iCurSBlock .BS 1
SYM.GBlockPtr .BS 1
SYM.LastSBlock .BS 1 SYM.LastSBlock .BS 1
SYM.hSBlocks .BS SYM.SBLOCK.MAX 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.LastPBlock .BS 1
SYM.hPBlocks .BS SYM.PBLOCK.MAX SYM.hPBlocks .BS SYM.PBLOCK.MAX
SYM.PrivateBlockPtr .BS 1
SYM.hCurMBlock .BS 1
SYM.iCurMBlock .BS 1
SYM.LastMBlock .BS 1 SYM.LastMBlock .BS 1
SYM.hMBlocks .BS SYM.MBLOCK.MAX SYM.hMBlocks .BS SYM.MBLOCK.MAX
SYM.MBlockPtr .BS 1
SYM.DumpCount .BS 1
ASM.PASS .BS 1 ASM.PASS .BS 1
ASM.MACRO.ON .BS 1 ASM.MACRO.ON .BS 1
@ -505,10 +561,15 @@ ASM.LI.CON .BS 1
ASM.LI.XON .BS 1 ASM.LI.XON .BS 1
ASM.PC .BS 4 32Bits PC ASM.PC .BS 4 32Bits PC
ASM.PC.PH .BS 4 32Bits PC saved for PH directive 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.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.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 ASM.SYM.ID .BS 2 For reference when a local label is parsed
DS.END .ED DS.END .ED
*---------------------------------------
.DO DS.END-DS.START>$FF
ERROR:DS too big
.FIN
*--------------------------------------- *---------------------------------------
MAN MAN
SAVE BIN/ASM.S SAVE BIN/ASM.S