A2osX/BIN/ASM.S.txt

520 lines
9.9 KiB
Plaintext
Raw Normal View History

PR#3
2015-06-03 18:30:57 +00:00
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BOOT/BIN/ASM
*---------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/A2OSX.API.I
.INB INC/LIBSTR.I
*---------------------------------------
SYM.BLOCK.SIZE .EQ 4096
SYM.BLOCK.MAX .EQ 8
2015-09-16 15:58:06 +00:00
SRC.IN.DEPTH.MAX .EQ 7
*---------------------------------------
ERR.INV.ARGS .EQ 1
ERR.SRC.INV.TYPE .EQ 2
2015-09-25 15:50:15 +00:00
ERR.SRC.TOO.MANY.IN .EQ 3
ERR.SYM.TOO.LARGE .EQ 10
2015-09-25 15:50:15 +00:00
ERR.LINE.TOO.LONG .EQ 20
ERR.INVALID.LABEL .EQ 21
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START
.DA DS.END-DS.START Data Segment to Allocate
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.MSG.HELP1 .DA MSG.HELP1
L.MSG.HELP2 .DA MSG.HELP2
L.MSG.SRCLINE .DA MSG.SRCLINE
L.READ.BUFFER .DA READ.BUFFER
.DA 0
*---------------------------------------
CS.INIT >LDYA L.LIBSTR
>LOADLIBYA
sta hLIBSTR
ldy #S.PS.hARGS
lda (pPs),y
bne CS.INIT.ARGS
>PUSHW L.MSG.HELP1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW L.MSG.HELP2
>LIBCALL hLIBSTR,LIBSTR.PRINTF
lda #ERR.INV.ARGS
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 jsr SRC.OPEN
bcs .99
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
clc
rts
.98 lda #ERR.INV.ARGS
sec
.99 rts
*--------------------------------------
2015-09-16 20:48:59 +00:00
CS.RUN ldy #bCANCEL
lda (pData),y
beq .1
sec
rts
2015-09-16 20:48:59 +00:00
.1 ldy #bSTOP
lda (pData),y
beq .2
clc
rts
.2 jsr SRC.ReadLine
bcs .9
2015-09-25 15:50:15 +00:00
jsr SRC.ParseLine
bcs .9
>PUSHWI TmpBuffer256
>PUSHW SRC.LINENUM
>PUSHW L.MSG.SRCLINE
>LIBCALL hLIBSTR,LIBSTR.PRINTF
clc
.9 rts
*--------------------------------------
CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPs),y
bne .9
lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$03 Ctrl-C
bne .1
2015-09-16 20:48:59 +00:00
lda #$FF
2015-09-16 20:48:59 +00:00
ldy #bCANCEL
sta (pData),y
bra .8
2015-09-16 20:48:59 +00:00
.1 cmp #$13 Ctrl-S
bne .8
2015-09-16 20:48:59 +00:00
ldy #bSTOP
lda (pData),y
eor #$FF
2015-09-16 20:48:59 +00:00
sta (pData),y
.8 clc
rts
.9 sec
rts
*--------------------------------------
2015-09-16 20:48:59 +00:00
CS.QUIT ldy #SRC.COUNT
lda (pData),y
2015-09-16 15:58:06 +00:00
beq .8
.1 clc
2015-09-16 15:58:06 +00:00
adc #SRC.hREFNUMS-1
tay
lda (pData),y
>SYSCALL SYS.MLICloseA
2015-09-16 15:58:06 +00:00
ldy SRC.COUNT
lda (pData),y
clc
2015-09-16 15:58:06 +00:00
adc #SRC.hBUFFERS-1
tay
lda (pData),y
>SYSCALL SYS.FreeMemA
2015-09-16 20:48:59 +00:00
ldy #SRC.COUNT
lda (pData),y
dec
sta (pData),y
2015-09-16 15:58:06 +00:00
bne .1
.8 lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*---------------------------------------
LOAD.ASM.T
clc
rts
*---------------------------------------
SRC.OPEN sta hFileName
2015-09-16 15:58:06 +00:00
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
2015-09-16 15:58:06 +00:00
ldy #SRC.COUNT
lda (pData),y
clc
2015-09-16 20:48:59 +00:00
adc #SRC.hREFNUMS
tay
pla
sta (pData),y
2015-09-16 15:58:06 +00:00
ldy #SRC.COUNT
lda (pData),y
clc
2015-09-16 20:48:59 +00:00
adc #SRC.hBUFFERS
tay
txa
sta (pData),y
lda hFileName
>SYSCALL SYS.MLIGetFileInfoA
bcs .99
2015-09-16 20:48:59 +00:00
>STYA ZPQuickPtr1
2015-09-16 20:48:59 +00:00
ldy #1
lda (ZPQuickPtr1),y
tax
2015-09-16 15:58:06 +00:00
ldy #SRC.COUNT
lda (pData),y
clc
2015-09-16 20:48:59 +00:00
adc #SRC.hFILETYPES
tay
2015-09-16 15:58:06 +00:00
2015-09-16 20:48:59 +00:00
txa
sta (pData),y
cmp #$04 TXT?
bne .1
>PUSHBI $0D
>PUSHBI $FF
2015-09-16 15:58:06 +00:00
>PUSHB hFileName
>SYSCALL SYS.MLINewLine
bcs .99
2015-09-16 15:58:06 +00:00
bra .8
2015-09-25 15:50:15 +00:00
.1 cmp #$FA S-C/BAS?
bne .98
2015-09-16 15:58:06 +00:00
.8 ldy #SRC.COUNT
lda (pData),y
inc
sta (pData),y
clc
rts
.98 lda #ERR.SRC.INV.TYPE
.99 sec
rts
*---------------------------------------
2015-09-16 15:58:06 +00:00
SRC.ReadLine ldy #SRC.COUNT
lda (pData),y
clc
2015-09-16 15:58:06 +00:00
adc #SRC.hFILETYPES-1
tay
lda (pData),y
2015-09-25 15:50:15 +00:00
bmi SRC.ReadLine.TFA
jmp SRC.ReadLine.T04
*---------------------------------------
2015-09-25 15:50:15 +00:00
SRC.ReadLine.TFA >LDYAI 3 LEN + LINENUM
jsr SRC.ReadLine.YA
2015-09-16 20:48:59 +00:00
bcs .9
lda READ.BUFFER+1
sta SRC.LINENUM
lda READ.BUFFER+2
sta SRC.LINENUM+1
2015-09-25 15:50:15 +00:00
lda READ.BUFFER LEN
sec
sbc #3 remove LEN + LINENUM from LEN
bcc .9 LEN should be at least 3
beq .8
2015-09-25 15:50:15 +00:00
tay Read remaining chars
lda #0
jsr SRC.ReadLine.YA
bcs .9
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
2015-09-25 15:50:15 +00:00
.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
2015-09-25 15:50:15 +00:00
.99 lda #ERR.LINE.TOO.LONG
sec
rts
*--------------------------------------
2015-09-25 15:50:15 +00:00
SRC.ReadLine.T04
clc
rts
*--------------------------------------
SRC.ReadLine.YA >PUSHYA
>PUSHW L.READ.BUFFER
2015-09-16 15:58:06 +00:00
ldy #SRC.COUNT
lda (pData),y
clc
2015-09-16 15:58:06 +00:00
adc #SRC.hREFNUMS-1
tay
lda (pData),y
>PUSHA
>SYSCALL SYS.MLIRead
rts
*---------------------------------------
2015-09-25 15:50:15 +00:00
SRC.ParseLine stz SRC.BufPtr
jsr SRC.GetNextChar
beq .8
cmp #'*' Comment?
beq .8
cmp #' '
beq SRC.ParseLine.OpCode
SRC.ParseLine.Sym cmp #'.' Local Label?
bne SRC.ParseLine.SymG
jsr SRC.GetNextToken
bcs
jsr SRC.IsNumber
bcs SRC.ParseLine.Err1
SRC.ParseLine.SymG
jsr SRC.GetToken
jsr SYM.ClearLocal
SRC.ParseLine.OpCode
jsr SRC.GetNextCharNB
beq .8
.8 clc
rts
SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL
sec
rts
*---------------------------------------
SRC.GetToken
*---------------------------------------
SRC.GetNextCharNB jsr SRC.GetNextChar
beq .9
cmp #' '
beq SRC.GetNextCharNB
.9 rts
*---------------------------------------
SRC.GetNextChar ldx SRC.BufPtr
lda TmpBuffer256,x
inc SRC.BufPtr
and #$7f
rts
*---------------------------------------
SYM.ClearLocal
clc
rts
*---------------------------------------
SYM.AddLocal
clc
rts
*---------------------------------------
*---------------------------------------
SYM.AddGlobal
clc
rts
*---------------------------------------
2015-09-25 15:50:15 +00:00
SYM.Lookup
clc
rts
*---------------------------------------
SYM.BLOCK.ALLOC ldx #0
.1 lda SYM.BLOCKS,x
beq .2
inx
cpx #SYM.BLOCK.MAX
bne .1
lda #ERR.SYM.TOO.LARGE
sec Out of block error
rts
.2 phx Save next free block
>LDYA SYM.BLOCK.SIZE
>SYSCALL SYS.GetMem
bcs .9
txa
plx
sta SYM.BLOCKS,x
clc
.9 rts
*---------------------------------------
CS.END
T.DIRECTIVES .AS "AS"
.AS "AT"
.AS "AZ"
.AS "BS"
.AS "DA"
.AS "DO"
.AS "DU"
.AS "ED"
.AS "EL"
.AS "EN"
.AS "EP"
.AS "EQ"
.AS "FI"
.AS "HS"
.AS "IN"
.AS "LI"
.AS "MA"
.AS "OP"
.AS "OR"
.AS "PG"
.AS "PH"
.AS "TA"
.AS "TF"
.AS "TI"
.AS "US"
T.DIRECTIVES.END .EQ *
*---------------------------------------
LIBSTR >PSTRING "libstr.o"
MSG.HELP1 >CSTRING "A2osX-Macro Assembler (S-C MASM 2.0 Based)\n"
MSG.HELP2 >CSTRING "Usage : ASM <src file> [type TXT ($04) or S-C/BAS ($FA)]\n"
MSG.SRCLINE >CSTRING "%05D-%s\n"
hLIBSTR .BS 1
hFileName .BS 1
2015-09-16 20:48:59 +00:00
SRC.LINENUM .BS 2
2015-09-25 15:50:15 +00:00
SRC.BufPtr .BS 1
SRC.Token .BS 256
READ.BUFFER .BS 256
*--------------------------------------
.DUMMY
.OR 0
DS.START
bSTOP .BS 1
bCANCEL .BS 1
2015-09-16 20:48:59 +00:00
2015-09-16 15:58:06 +00:00
SRC.COUNT .BS 1
SRC.hREFNUMS .BS SRC.IN.DEPTH.MAX Store ref_num of opened files (Main, .INs & .INBs)
SRC.hBUFFERS .BS SRC.IN.DEPTH.MAX Store hMem to allocated buffers
SRC.hFILETYPES .BS SRC.IN.DEPTH.MAX Store file type of opened SRC files
DST.hFILENAME .BS 1
2015-09-16 20:48:59 +00:00
DST.hFILETYPE .BS 1
DST.hREFNUM .BS 1
DST.hBUFFER .BS 1
2015-09-16 20:48:59 +00:00
ASM.T.hFILENAME .BS 1
ASM.T.hFILE .BS 1 handle to loaded ASM.T.xxxxx
ASM.PASS .BS 1
ASM.ORG .BS 4 32Bits Origin
2015-09-16 20:48:59 +00:00
SYM.BLOCKS .BS SYM.BLOCK.MAX
DS.END .ED
*---------------------------------------
MAN
SAVE BIN/ASM.S
ASM