A2osX/BIN/ASM.S.txt

446 lines
8.5 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
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
*---------------------------------------
ERR.INV.ARGS .EQ 1
ERR.SRC.INV.TYPE .EQ 2
ERR.SRC.TOO.LONG .EQ 3
ERR.SYM.TOO.LARGE .EQ 10
*--------------------------------------
* 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 #VAR.INIT
lda #0
.1 sta (pData),y
iny
cpy #VAR.INIT.END
bne .1
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
*--------------------------------------
CS.RUN lda bCANCEL
beq .1
sec
rts
.1 lda bSTOP
beq .2
clc
rts
.2 jsr SRC.ReadLine
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
lda #$FF
sta bCANCEL
bra .8
.1 cmp #$13 Ctrl-S
bne .8
lda bSTOP
eor #$FF
sta bSTOP
.8 clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT ldy SRC.INDEX
lda (pData),y
bmi .8
.1 clc
adc #SRC.hREFNUMS
tay
lda (pData),y
>SYSCALL SYS.MLICloseA
ldy SRC.INDEX
lda (pData),y
clc
adc #SRC.hBUFFERS
tay
lda (pData),y
>SYSCALL SYS.FreeMemA
ldy SRC.INDEX
lda (pData),y
dec
sta (pData),y
bpl .1
.8 lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*---------------------------------------
LOAD.ASM.T
clc
rts
*---------------------------------------
SRC.OPEN sta hFileName
>SYSCALL SYS.MLIOpenA
bcs .99
pha
ldy #SRC.INDEX
lda (pData),y
clc
adc #SRC.hREFNUMS
tay
pla
sta (pData),y
ldy #SRC.INDEX
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
pha
ldy #SRC.INDEX
lda (pData),y
clc
adc #SRC.hFILETYPES
tay
pla
sta (pData),y
cmp #$04 TXT?
bne .1
>PUSHBI $0D
>PUSHBI $FF
>PUSHB SRC.hREFNUMS
>SYSCALL SYS.MLINewLine
bcs .99
.1 cmp #$FA BAS?
bne .98
ldy #SRC.INDEX
lda (pData),y
inc
sta (pData),y
clc
rts
.98 lda #ERR.SRC.INV.TYPE
.99 sec
rts
*---------------------------------------
SRC.ReadLine ldy #SRC.INDEX
lda (pData),y
clc
adc #SRC.hFILETYPES
tay
lda (pData),y
bmi SRC.ReadLine.BIN
jmp SRC.ReadLine.TXT
*---------------------------------------
SRC.ReadLine.BIN >LDYAI 3 LEN + LINENUM
jsr SRC.ReadLine.YA
bcs .9
lda READ.BUFFER+1
sta SRC.LINENUM
lda READ.BUFFER+2
sta SRC.LINENUM+1
lda READ.BUFFER
dec
dec
dec
beq .8
tay
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
.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.SRC.TOO.LONG
sec
rts
*--------------------------------------
SRC.ReadLine.TXT
clc
rts
*--------------------------------------
SRC.ReadLine.YA >PUSHYA
>PUSHW L.READ.BUFFER
ldy #SRC.INDEX
lda (pData),y
clc
adc #SRC.hREFNUMS
tay
lda (pData),y
>PUSHA
>SYSCALL SYS.MLIRead
rts
*---------------------------------------
SYM.ADD
clc
rts
*---------------------------------------
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
READ.BUFFER .BS 256
*--------------------------------------
.DUMMY
.OR 0
DS.START
*---------------------------------------
VAR.INIT
bSTOP .BS 1
bCANCEL .BS 1
SRC.INDEX .BS 1
SRC.hREFNUMS .BS 8 Store ref_num of opened files (Main, .INs & .INBs)
SRC.hBUFFERS .BS 8 Store hMem to allocated buffers
SRC.hFILETYPES .BS 8 Store file type of opened SRC files
SRC.LINENUM .BS 2
ASM.T.hFILENAME .BS 1
ASM.T.hFILE .BS 1 handle to loaded ASM.T.xxxxx
DST.hFILENAME .BS 1
DST.hREFNUM .BS 1
DST.hBUFFER .BS 1
VAR.INIT.END
*---------------------------------------
ASM.T.FILENAME .BS 65 PStr ProDOS Max Path Len +1
TARGET.FILENAME .BS 65 PStr ProDOS Max Path Len +1
TARGET.FILETYPE .BS 1
*---------------------------------------
ASM.PASS .BS 1
ASM.ORG .BS 4 32Bits Origin
SYM.BLOCKS .BS SYM.BLOCK.MAX
DS.END .ED
*---------------------------------------
MAN
SAVE BIN/ASM.S
ASM