Work In Progress (ASM)

This commit is contained in:
Rémy GIBERT 2015-10-06 18:14:48 +02:00
parent f4817adf71
commit b94da4b027
4 changed files with 748 additions and 534 deletions

View File

@ -3,8 +3,8 @@ PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.LIST OFF
.OP 65C02
*---------------------------------------
DIR.AC clc
rts
@ -36,6 +36,20 @@ DIR.ED clc
DIR.EL clc
rts
*---------------------------------------
DIR.EM ldy #ASM.MA.ON
lda (pData),y
bpl .9
lda #$00
sta (pData),y
clc
rts
.9 lda #ERR.INVALID.MACRO.DEF
sec
rts
*---------------------------------------
DIR.EN clc
rts
*---------------------------------------
@ -51,13 +65,65 @@ DIR.FI clc
DIR.HS clc
rts
*---------------------------------------
DIR.IN clc
DIR.IN jsr SRC.GetArg
bcs .9
>LDYA L.SRC.BUFFER
>SYSCALL SYS.NewPStrYA
jsr SRC.OpenFileA
bcs .99
rts
.9 lda #ERR.SYNTAX.ERROR
.99 sec
rts
*---------------------------------------
DIR.LI clc
DIR.LI >LDYA L.T.LI
jsr SRC.GetKeyword
bcc .1
lda #ERR.SYNTAX.ERROR
sec
rts
.1 jmp (J.LI,x)
DIR.LI.CON ldy #ASM.LI.CON
sec
bra DIR.LI.APPLY
DIR.LI.COFF ldy #ASM.LI.CON
clc
bra DIR.LI.APPLY
DIR.LI.XON ldy #ASM.LI.XON
sec
bra DIR.LI.APPLY
DIR.LI.XOFF ldy #ASM.LI.XON
clc
bra DIR.LI.APPLY
DIR.LI.ON ldy #ASM.LI.ON
sec
bra DIR.LI.APPLY
DIR.LI.OFF ldy #ASM.LI.ON
clc
DIR.LI.APPLY lsr
sta (pData),y
rts
*---------------------------------------
DIR.MA clc
DIR.MA ldy #ASM.MA.ON
lda (pData),y
bmi .9
lda #$80
sta (pData),y
jsr SRC.GetArg
clc
rts
.9 lda #ERR.INVALID.MACRO.DEF
sec
rts
*---------------------------------------
DIR.OP clc

581
BIN/ASM.S.SRC.txt Normal file
View File

@ -0,0 +1,581 @@
PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*---------------------------------------
SRC.OpenFileA sta hFileName
>SYSCALL SYS.GetMemPtrA
>STYA ZPPtr1
ldy #1
lda (ZPPtr1),y
cmp #'/'
beq .1
>PUSHB hFileName
ldy #S.PS.hPREFIX
lda (pPs),y
>PUSHA
>SYSCALL SYS.PStrCat
sta hFileName
>SYSCALL SYS.GetMemPtrA
>STYA ZPPtr1
.1 >PUSHW ZPPtr1
>PUSHW L.MSG.SRC.FILE
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #SRC.COUNT
lda (pData),y
cmp #SRC.IN.DEPTH.MAX
bne .10
lda #ERR.SRC.TOO.MANY.IN
sec
rts
.10 lda hFileName
>SYSCALL SYS.MLIOpenA
bcs .99
pha
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hREFNUMS
tay
pla
sta (pData),y
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hBUFFERS
tay
txa
sta (pData),y
lda hFileName
>SYSCALL SYS.MLIGetFileInfoA
bcs .99
>STYA ZPQuickPtr1
ldy #1
lda (ZPQuickPtr1),y
tax
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hFILETYPES
tay
txa
sta (pData),y
cmp #$FA S-C/BAS?
beq .8
cmp #$04 TXT ?
bne .98
>PUSHBI $0D Line separator for TXT file
>PUSHBI $FF
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hREFNUMS
tay
lda (pData),y
>PUSHA
>SYSCALL SYS.MLINewLine
bcs .99
.8 ldy #SRC.COUNT
lda (pData),y
inc
sta (pData),y
clc
rts
.98 lda #ERR.SRC.INV.TYPE
.99 sec
rts
*---------------------------------------
SRC.ReadLine ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hFILETYPES-1
tay
lda (pData),y
bmi .10
>PUSHWI 256
>PUSHWI TmpBuffer256
jsr SRC.ReadFromFile
bcs .19
lda #0 replace ending $0D with $00
sta TmpBuffer256,y
.19 rts
.10 >PUSHWI 3
>PUSHW L.SRC.Buffer
jsr SRC.ReadFromFile
bcs .9
lda SRC.Buffer+1
sta SRC.LINENUM
lda SRC.Buffer+2
sta SRC.LINENUM+1
lda SRC.Buffer LEN
sec
sbc #3
bcc .9 LEN should be at least 3
tay
lda #0
>PUSHYA
>PUSHW L.SRC.BUFFER
jsr SRC.ReadFromFile
ldy #0
ldx #0
.1 lda SRC.Buffer,y
bmi .2
sta TmpBuffer256,x
beq .8 Ending 00
inx
beq .99
iny
bne .1
bra .99
.2 cmp #$C0 REPEAT char?
bne .5
iny
beq .99
lda SRC.Buffer,y
iny
beq .99
.3 pha
lda SRC.Buffer,y
sta TmpBuffer256,x
pla
inx
beq .99
dec
bne .3
iny
bne .1
bra .99
.5 and #$3F Compute blank count
.6 pha
lda #$20
sta TmpBuffer256,x
pla
inx
beq .99
dec
bne .6
iny
bne .1
bra .99
.8 clc
.9 rts
.99 lda #ERR.LINE.TOO.LONG
sec
rts
*--------------------------------------
SRC.ReadFromFile ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hREFNUMS-1
tay
lda (pData),y
>PUSHA
>SYSCALL SYS.MLIRead
bcs .9
tax $100 byte transfered ?
beq .9
lda #ERR.LINE.TOO.LONG
sec
.9 rts
*---------------------------------------
SRC.FileClose ldy #SRC.COUNT
lda (pData),y
beq .8
clc
adc #SRC.hREFNUMS-1
tay
lda (pData),y
>SYSCALL SYS.MLICloseA
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hBUFFERS-1
tay
lda (pData),y
>SYSCALL SYS.FreeMemA
ldy #SRC.COUNT
lda (pData),y
dec
sta (pData),y
.8 clc
rts
*---------------------------------------
SRC.ParseLine stz SRC.Label.Flags
stz SRC.BufPtr
lda TmpBuffer256
beq SRC.ParseLine.Ok
cmp #'*' Comment?
beq SRC.ParseLine.Ok
cmp #';' Comment?
beq SRC.ParseLine.Ok
tax
ldy #ASM.MA.ON
lda (pData),y
bpl .1
jmp SRC.ParseLine.Macro
.1 txa
cmp #' '
beq SRC.ParseLine.OpCde
SRC.ParseLine.Sym cmp #'.' Local Label?
bne SRC.ParseLine.SymG
jsr SRC.GetChar
beq SRC.ParseLine.Err1
jsr SRC.GetDecimal
bcs SRC.ParseLine.Err1
jsr SYM.AddLocal
bcc SRC.ParseLine.OpCde
rts
SRC.ParseLine.SymG jsr SYM.ClearLocal
jsr SRC.GetLabel
bcs SRC.ParseLine.Err1
inc SRC.Label.Flags Remember to Add Label
ldx #3 Makes Current Label = PC for now
ldy #ASM.PC
lda (pdata),y
.1 sta SRC.LabelValue,x
dey
dex
bpl .1
SRC.ParseLine.OpCde jsr SRC.GetCharNB
beq SRC.ParseLine.Ok
cmp #'.'
beq SRC.ParseLine.Dir
bra SRC.ParseLine.Ok
SRC.ParseLine.Ok lda SRC.Label.Flags
beq .8
jsr SYM.AddLocal
.8 clc
rts
SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL
SRC.ParseLine.Err sec
rts
*---------------------------------------
SRC.ParseLine.Dir >LDYA L.T.DIRECTIVES
jsr SRC.GetKeyword
bcs .9
jmp (J.DIRECTIVES,x)
.9 lda #ERR.INVALID.DIRECTIVE
sec
rts
*---------------------------------------
SRC.ParseLine.Macro
clc
rts
*---------------------------------------
SRC.PrintLine bcs .1 if CS, unconditional
ldy #ASM.MA.ON
lda (pData),y
bpl .1
ldy #ASM.LI.CON
lda (pData),y
bpl .9
bmi .8
.1 ldy #ASM.LI.ON
lda (pData),y
bpl .9
.8 >PUSHWI TmpBuffer256
>PUSHW SRC.LINENUM
>PUSHW L.MSG.SRCLINE
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.9 rts
*---------------------------------------
SRC.GetDecimal stz SRC.ACC+1
stz SRC.ACC+2
stz SRC.ACC+3
jsr SRC.GetChar
beq .99
jsr SRC.IsDigit10
bcs .99
and #$0F
sta SRC.ACC
.1 jsr SRC.GetChar
beq .8
cmp #' '
beq .8
jsr SRC.IsDigit10
bcs .99
and #$0F
pha
jsr SRC.ACC10
pla
bcs .9
clc
adc SRC.ACC
sta SRC.ACC
bcc .1
inc SRC.ACC+1
bne .1
inc SRC.ACC+2
bne .1
inc SRC.ACC+3
bne .1
.9 lda #ERR.VAL.TOO.BIG
sec
rts
.8 clc
rts
.99 lda #ERR.SYNTAX.ERROR
sec
rts
*---------------------------------------
SRC.GetLabel jsr SRC.GetCharUC
beq .9
jsr SRC.IsLetter
bcs .9
sta SRC.Label
ldy #1
.1 jsr SRC.GetCharUC
beq .8
cmp #' '
beq .8
cmp #'.'
beq .2
jsr SRC.IsLetterOrDigit
bcs .9
.2 sta SRC.Label,y
iny
cpy #SRC.LABEL.MAXLEN
bne .1 if equ Carry is set
.9 sec
rts
.8 lda #0
sta SRC.Label,y
clc
rts
*---------------------------------------
SRC.GetKeyword >STYA ZPPtr1
jsr SRC.GetArg
bcs .9
stz SRC.Keyword.ID
ldy #0
.3 lda (ZPPtr1),y
beq .9
cmp SRC.Buffer
bne .6
phy
ldx #0
.4 iny
inx
lda (ZPPtr1),y
cmp SRC.Buffer,x
bne .5
cpx SRC.Buffer
bne .4
ply
ldx SRC.Keyword.ID
clc
rts
.5 ply
.6 tya
sec Add keyword Len+1
adc (ZPPtr1),y
tay
inc SRC.Keyword.ID
inc SRC.Keyword.ID
bra .3
.9 sec
rts
*---------------------------------------
SRC.GetArg jsr SRC.GetCharUC
beq .9
sta SRC.Buffer+1
ldy #1
.1 jsr SRC.GetCharUC
beq .2
cmp #' '
beq .2
cmp #','
iny
sta SRC.Buffer,y
bra .1
.2 sty SRC.Buffer
clc
rts
.9 sec
rts
*---------------------------------------
SRC.IsLetterOrDigit jsr SRC.IsDigit10
bcc SRC.IsLetterRTS
*---------------------------------------
SRC.IsLetter cmp #'A'
bcc .9
cmp #'['
bcc SRC.IsLetterRTS
cmp #'a'
bcc .9
cmp #'{'
rts CC if lowercase
.9 sec
SRC.IsLetterRTS rts
*---------------------------------------
SRC.IsDigit10 cmp #'0'
bcc .9
cmp #':'
rts cc if ok, cs if not
.9 sec
rts
*---------------------------------------
SRC.GetCharNB jsr SRC.GetChar
beq .9
cmp #' '
beq SRC.GetCharNB
.9 rts
*---------------------------------------
SRC.GetCharUC jsr SRC.GetChar
beq .9
cmp #'a'
bcc .9
cmp #'{'
bcs .9
eor #$20 to Uppercase
.9 rts
*---------------------------------------
SRC.GetChar ldx SRC.BufPtr
lda TmpBuffer256,x
inc SRC.BufPtr
and #$7f
rts
*---------------------------------------
SRC.ACC10 lda SRC.ACC ACC*2-> ACC & ACCTMP
asl
sta SRC.ACC
sta SRC.ACCTMP
lda SRC.ACC+1
rol
sta SRC.ACC+1
sta SRC.ACCTMP+1
lda SRC.ACC+2
rol
sta SRC.ACC+2
sta SRC.ACCTMP+2
lda SRC.ACC+3
rol
sta SRC.ACC+3
sta SRC.ACCTMP+3
bcs .9
ldx #1
.1 asl SRC.ACC ACC=ACC*8
rol SRC.ACC+1
rol SRC.ACC+2
rol SRC.ACC+3
bcs .9
dex
bne .1
lda SRC.ACC CC from ROL SRC.ACC+3
adc SRC.ACCTMP
sta SRC.ACC
lda SRC.ACC+1
adc SRC.ACCTMP+1
sta SRC.ACC+1
lda SRC.ACC+2
adc SRC.ACCTMP+2
sta SRC.ACC+2
lda SRC.ACC+3
adc SRC.ACCTMP+3
sta SRC.ACC+3 CS if overflow
.9 rts
*---------------------------------------
MAN
SAVE BIN/ASM.S.SRC
LOAD BIN/ASM.S
ASM

View File

@ -3,8 +3,8 @@ PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.LIST OFF
.OP 65C02
*---------------------------------------
SYM.ClearPrivate
clc

View File

@ -13,20 +13,24 @@ AUTO 6
.INB INC/A2OSX.API.I
.INB INC/LIBSTR.I
*---------------------------------------
ZPPtr1 .EQ ZPBIN
ZPPtr2 .EQ ZPBIN+2
*---------------------------------------
SYM.BLOCK.SIZE .EQ 4096
SYM.BLOCK.MAX .EQ 8
SRC.IN.DEPTH.MAX .EQ 7
SRC.LABEL.MAXLEN .EQ 16
SRC.LABEL.MAXLEN .EQ 32
*---------------------------------------
ERR.INV.ARGS .EQ 1
ERR.SRC.INV.TYPE .EQ 2
ERR.SRC.TOO.MANY.IN .EQ 3
ERR.SYNTAX.ERROR .EQ 99
ERR.SYM.TOO.LONG .EQ 10
ERR.VAL.TOO.BIG .EQ 11
ERR.LINE.TOO.LONG .EQ 20
ERR.INVALID.LABEL .EQ 21
ERR.INVALID.DIRECTIVE .EQ 22
ERR.INV.ARGS .EQ $80
ERR.SRC.INV.TYPE .EQ $90
ERR.SRC.TOO.MANY.IN .EQ $91
ERR.SYNTAX.ERROR .EQ $A0
ERR.SYM.TOO.LONG .EQ $A1
ERR.VAL.TOO.BIG .EQ $A2
ERR.LINE.TOO.LONG .EQ $A3
ERR.INVALID.LABEL .EQ $A4
ERR.INVALID.DIRECTIVE .EQ $A5
ERR.INVALID.MACRO.DEF .EQ $E0
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
@ -51,7 +55,10 @@ L.MSG.HELP1 .DA MSG.HELP1
L.MSG.HELP2 .DA MSG.HELP2
L.MSG.SRCLINE .DA MSG.SRCLINE
L.MSG.ERROR .DA MSG.ERROR
L.READ.BUFFER .DA READ.BUFFER
L.MSG.PASS .DA MSG.PASS
L.MSG.SRC.FILE .DA MSG.SRC.FILE
L.MSG.OBJ.FILE .DA MSG.OBJ.FILE
L.SRC.BUFFER .DA SRC.BUFFER
L.T.DIRECTIVES .DA T.DIRECTIVES
J.DIRECTIVES .DA DIR.AC
.DA DIR.AS
@ -61,14 +68,27 @@ J.DIRECTIVES .DA DIR.AC
.DA DIR.DA
.DA DIR.DO
.DA DIR.DU
.DA DIR.DU
.DA DIR.ED
.DA DIR.EL
.DA DIR.EM
.DA DIR.EN
.DA DIR.EP
.DA DIR.EQ
.DA DIR.FI
.DA DIR.HS
.DA DIR.IN
.DA DIR.IN
.DA DIR.IN
.DA DIR.IN
.DA DIR.IN
.DA DIR.IN
.DA DIR.IN
.DA DIR.IN
.DA DIR.IN
.DA DIR.IN
.DA DIR.IN
.DA DIR.LI
.DA DIR.LI
.DA DIR.MA
.DA DIR.OP
@ -80,6 +100,13 @@ J.DIRECTIVES .DA DIR.AC
.DA DIR.TF
.DA DIR.TI
.DA DIR.US
L.T.LI .DA T.LI
J.LI .DA DIR.LI.CON
.DA DIR.LI.COFF
.DA DIR.LI.XON
.DA DIR.LI.XOFF
.DA DIR.LI.ON
.DA DIR.LI.OFF
.DA 0
*---------------------------------------
CS.INIT >LDYA L.LIBSTR
@ -88,7 +115,7 @@ CS.INIT >LDYA L.LIBSTR
ldy #S.PS.hARGS
lda (pPs),y
bne CS.INIT.ARGS
bne .1
>PUSHW L.MSG.HELP1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
@ -98,31 +125,18 @@ CS.INIT >LDYA L.LIBSTR
sec
rts
CS.INIT.ARGS >SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
lda (ZPQuickPtr1)
beq .98
.1 ldy #1
lda (ZPQuickPtr1),y
cmp #'/'
bne .2
ldy #S.PS.hARGS
lda (pPs),y
>SYSCALL SYS.PStrCpyA
bra .3
.2 ldy #S.PS.hARGS
lda (pPs),y
>PUSHA
ldy #S.PS.hPREFIX
lda (pPs),y
>PUSHA
>SYSCALL SYS.PStrCat
.3 ldy #SRC.hFILENAME
.1 >SYSCALL SYS.PStrCpyA
ldy #SRC.hFILENAME
sta (pData),y Store filename
lda #$80
ldy #ASM.LI.ON
sta (pData),y
ldy #ASM.LI.CON
sta (pData),y
ldy #ASM.LI.XON
sta (pData),y
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
@ -147,11 +161,17 @@ CS.RUN ldy #bCANCEL
lda (pData),y
bne .10
ldy #ASM.PASS
lda (pData),y
>PUSHA
>PUSHW L.MSG.PASS
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #SRC.hFILENAME
lda (pData),y
jsr SRC.OpenFileA
bcs *
bcs .99
.10 jsr SRC.ReadLine
bcc .2
@ -179,19 +199,21 @@ CS.RUN ldy #bCANCEL
.2 jsr SRC.ParseLine
bcs .9
>PUSHWI TmpBuffer256
>PUSHW SRC.LINENUM
>PUSHW L.MSG.SRCLINE
>LIBCALL hLIBSTR,LIBSTR.PRINTF
jsr SRC.PrintLine with CC, conditional
.8 clc
rts
.9 >PUSHA
.9 pha
sec
jsr SRC.PrintLine with CS, print always
pla
pha
>PUSHA
>PUSHW SRC.LINENUM
>PUSHW L.MSG.ERROR
>LIBCALL hLIBSTR,LIBSTR.PRINTF
pla
sec
rts
*--------------------------------------
@ -248,486 +270,8 @@ LOAD.ASM.T
clc
rts
*---------------------------------------
SRC.OpenFileA sta hFileName
ldy #SRC.COUNT
lda (pData),y
cmp #SRC.IN.DEPTH.MAX
bne .10
lda #ERR.SRC.TOO.MANY.IN
sec
rts
.10 lda hFileName
>SYSCALL SYS.MLIOpenA
bcs .99
pha
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hREFNUMS
tay
pla
sta (pData),y
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hBUFFERS
tay
txa
sta (pData),y
lda hFileName
>SYSCALL SYS.MLIGetFileInfoA
bcs .99
>STYA ZPQuickPtr1
ldy #1
lda (ZPQuickPtr1),y
tax
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hFILETYPES
tay
txa
sta (pData),y
cmp #$FA S-C/BAS?
beq .8
cmp #$04 TXT ?
bne .98
>PUSHBI $0D Line separator for TXT file
>PUSHBI $FF
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hREFNUMS
tay
lda (pData),y
>PUSHA
>SYSCALL SYS.MLINewLine
bcs .99
.8 ldy #SRC.COUNT
lda (pData),y
inc
sta (pData),y
clc
rts
.98 lda #ERR.SRC.INV.TYPE
.99 sec
rts
*---------------------------------------
SRC.ReadLine ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hFILETYPES-1
tay
lda (pData),y
bmi .10
>PUSHWI 256
>PUSHWI TmpBuffer256
jsr SRC.ReadFromFile
bcs .19
lda #0 replace ending $0D with $00
sta TmpBuffer256,y
.19 rts
.10 >PUSHWI 3
>PUSHW L.READ.BUFFER
jsr SRC.ReadFromFile
bcs .9
lda READ.BUFFER+1
sta SRC.LINENUM
lda READ.BUFFER+2
sta SRC.LINENUM+1
lda READ.BUFFER LEN
sec
sbc #3
bcc .9 LEN should be at least 3
tay
lda #0
>PUSHYA
>PUSHW L.READ.BUFFER
jsr SRC.ReadFromFile
ldy #0
ldx #0
.1 lda READ.BUFFER,y
bmi .2
sta TmpBuffer256,x
beq .8 Ending 00
inx
beq .99
iny
bne .1
bra .99
.2 cmp #$C0 REPEAT char?
bne .5
iny
beq .99
lda READ.BUFFER,y
iny
beq .99
.3 pha
lda READ.BUFFER,y
sta TmpBuffer256,x
pla
inx
beq .99
dec
bne .3
iny
bne .1
bra .99
.5 and #$3F Compute blank count
.6 pha
lda #$20
sta TmpBuffer256,x
pla
inx
beq .99
dec
bne .6
iny
bne .1
bra .99
.8 clc
.9 rts
.99 lda #ERR.LINE.TOO.LONG
sec
rts
*--------------------------------------
SRC.ReadFromFile ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hREFNUMS-1
tay
lda (pData),y
>PUSHA
>SYSCALL SYS.MLIRead
bcs .9
tax $100 byte transfered ?
beq .9
lda #ERR.LINE.TOO.LONG
sec
.9 rts
*---------------------------------------
SRC.FileClose ldy #SRC.COUNT
lda (pData),y
beq .8
clc
adc #SRC.hREFNUMS-1
tay
lda (pData),y
>SYSCALL SYS.MLICloseA
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hBUFFERS-1
tay
lda (pData),y
>SYSCALL SYS.FreeMemA
ldy #SRC.COUNT
lda (pData),y
dec
sta (pData),y
.8 clc
rts
*---------------------------------------
SRC.ParseLine stz SRC.Label.Flags
stz SRC.BufPtr
lda TmpBuffer256
beq SRC.ParseLine.Ok
cmp #'*' Comment?
beq SRC.ParseLine.Ok
cmp #' '
beq SRC.ParseLine.OpCde
SRC.ParseLine.Sym cmp #'.' Local Label?
bne SRC.ParseLine.SymG
jsr SRC.GetChar
beq SRC.ParseLine.Err1
jsr SRC.GetDecimal
bcs SRC.ParseLine.Err1
jsr SYM.AddLocal
bcc SRC.ParseLine.OpCde
rts
SRC.ParseLine.SymG jsr SYM.ClearLocal
jsr SRC.GetLabel
bcs SRC.ParseLine.Err1
inc SRC.Label.Flags Remember to Add Label
ldx #3 Makes Current Label = PC for now
ldy #ASM.PC
lda (pdata),y
.1 sta SRC.LabelValue,x
dey
dex
bpl .1
SRC.ParseLine.OpCde jsr SRC.GetCharNB
beq SRC.ParseLine.Ok
cmp #'.'
beq SRC.ParseLine.Dir
bra SRC.ParseLine.Ok
SRC.ParseLine.Ok lda SRC.Label.Flags
beq .8
jsr SYM.AddLocal
.8 clc
rts
SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL
SRC.ParseLine.Err sec
rts
*---------------------------------------
SRC.ParseLine.Dir jsr SRC.GetChar
beq .99
sta SRC.Directive+1
ldy #2
.1 jsr SRC.GetChar
beq .2
sta SRC.Directive,y
iny
cpy #SRC.DIR.MAXLEN+2
bne .1
bra .99
.2 sty SRC.Directive
ldx #0
stz SRC.Directive.ID
.3 lda T.DIRECTIVES,x
beq .99
cmp SRC.Directive
bne .6
phx
ldy #0
.4 inx
iny
lda T.DIRECTIVES,x
cmp SRC.Directive,y
bne .5
cpy SRC.Directive
beq .7
.5 plx
.6 txa
clc
adc T.DIRECTIVES,x
tax
inc SRC.Directive.ID
bra .3
.7
.99 lda #ERR.INVALID.DIRECTIVE
sec
rts
*---------------------------------------
SRC.GetDecimal stz SRC.ACC+1
stz SRC.ACC+2
stz SRC.ACC+3
jsr SRC.GetChar
beq .99
jsr SRC.IsDigit10
bcs .99
and #$0F
sta SRC.ACC
.1 jsr SRC.GetChar
beq .8
cmp #' '
beq .8
jsr SRC.IsDigit10
bcs .99
and #$0F
pha
jsr SRC.ACC10
pla
bcs .9
clc
adc SRC.ACC
sta SRC.ACC
bcc .1
inc SRC.ACC+1
bne .1
inc SRC.ACC+2
bne .1
inc SRC.ACC+3
bne .1
.9 lda #ERR.VAL.TOO.BIG
sec
rts
.8 clc
rts
.99 lda #ERR.SYNTAX.ERROR
sec
rts
*---------------------------------------
SRC.GetLabel jsr SRC.GetChar
beq .9
jsr SRC.IsLetter
bcs .9
sta SRC.Label
ldy #1
.1 jsr SRC.GetChar
beq .8
cmp #' '
beq .8
cmp #'.'
beq .2
jsr SRC.IsLetterOrDigit
bcs .9
.2 sta SRC.Label,y
iny
cpy #SRC.LABEL.MAXLEN
bne .1 if equ Carry is set
.9 sec
rts
.8 lda #0
sta SRC.Label,y
clc
rts
*---------------------------------------
SRC.IsLetterOrDigit jsr SRC.IsDigit10
bcc SRC.IsLetterRTS
*---------------------------------------
SRC.IsLetter cmp #'A'
bcc .9
cmp #'['
bcc SRC.IsLetterRTS
cmp #'a'
bcc .9
cmp #'{'
bcs SRC.IsLetterRTS
adc #$20 to Uppercase
rts
.9 sec
SRC.IsLetterRTS rts
*---------------------------------------
SRC.IsDigit10 cmp #'0'
bcc .9
cmp #':'
rts cc if ok, cs if not
.9 sec
rts
*---------------------------------------
SRC.GetCharNB jsr SRC.GetChar
beq .9
cmp #' '
beq SRC.GetCharNB
.9 rts
*---------------------------------------
SRC.GetChar ldx SRC.BufPtr
lda TmpBuffer256,x
inc SRC.BufPtr
and #$7f
rts
*---------------------------------------
SRC.ACC10 lda SRC.ACC ACC*2-> ACC & ACCTMP
asl
sta SRC.ACC
sta SRC.ACCTMP
lda SRC.ACC+1
rol
sta SRC.ACC+1
sta SRC.ACCTMP+1
lda SRC.ACC+2
rol
sta SRC.ACC+2
sta SRC.ACCTMP+2
lda SRC.ACC+3
rol
sta SRC.ACC+3
sta SRC.ACCTMP+3
bcs .9
ldx #1
.1 asl SRC.ACC ACC=ACC*8
rol SRC.ACC+1
rol SRC.ACC+2
rol SRC.ACC+3
bcs .9
dex
bne .1
lda SRC.ACC CC from ROL SRC.ACC+3
adc SRC.ACCTMP
sta SRC.ACC
lda SRC.ACC+1
adc SRC.ACCTMP+1
sta SRC.ACC+1
lda SRC.ACC+2
adc SRC.ACCTMP+2
sta SRC.ACC+2
lda SRC.ACC+3
adc SRC.ACCTMP+3
sta SRC.ACC+3 CS if overflow
.9 rts
*---------------------------------------
.INB BIN/ASM.S.SRC
.INB BIN/ASM.S.DIR
.INB BIN/ASM.S.SYM
*---------------------------------------
@ -756,6 +300,8 @@ T.DIRECTIVES .HS 02
.HS 04
.AS "ELSE"
.HS 02
.AS "EM"
.HS 02
.AS "EN"
.HS 02
.AS "EP"
@ -813,9 +359,26 @@ T.DIRECTIVES .HS 02
.AS "US"
.HS 00
*---------------------------------------
T.LI .HS 03
.AS "CON"
.HS 04
.AS "COFF"
.HS 03
.AS "XON"
.HS 04
.AS "XOFF"
.HS 02
.AS "ON"
.HS 03
.AS "OFF"
.HS 00
*---------------------------------------
LIBSTR >PSTRING "libstr.o"
MSG.HELP1 >CSTRING "A2osX-Macro Assembler (S-C MASM 2.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.PASS >CSTRING "Pass:#%d\n"
MSG.SRC.FILE >CSTRING "Source File:#%S\n"
MSG.OBJ.FILE >CSTRING "Object File:#%S, Type=%02x\n"
MSG.SRCLINE >CSTRING "%05D-%s\n"
MSG.ERROR >CSTRING "%05D-Error:$%h\n"
hLIBSTR .BS 1
@ -824,12 +387,12 @@ SRC.LINENUM .BS 2
SRC.BufPtr .BS 1
SRC.Label.Flags .BS 1
SRC.Label .BS SRC.LABEL.MAXLEN
SRC.Directive.ID .BS 1
SRC.Directive .BS SRC.DIR.MAXLEN
SRC.LabelValue .BS 4
SRC.Directive.ID .BS 1
SRC.Keyword.ID .BS 1
SRC.ACC .BS 4
SRC.ACCTMP .BS 4
READ.BUFFER .BS 256
SRC.Buffer .BS 256
*--------------------------------------
.DUMMY
.OR 0
@ -850,10 +413,14 @@ DST.hBUFFER .BS 1
DST.hFILETYPE .BS 1
ASM.T.hFILENAME .BS 1
ASM.T.hFILE .BS 1 handle to loaded ASM.T.xxxxx
ASM.T.hFILE .BS 1 handle to ASM.T.xxxxx
ASM.PASS .BS 1
ASM.PH.ON .BS 1
ASM.LI.OFF .BS 1
ASM.LI.ON .BS 1
ASM.LI.CON .BS 1
ASM.LI.XON .BS 1
ASM.MA.ON .BS 1
ASM.PC .BS 4 32Bits PC
ASM.PC.PH .BS 4 32Bits PC saved for PH directive