A2osX/BIN/ASM.S.txt
2015-09-16 17:58:06 +02:00

449 lines
8.6 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
SRC.IN.DEPTH.MAX .EQ 7
*---------------------------------------
ERR.INV.ARGS .EQ 1
ERR.SRC.INV.TYPE .EQ 2
ERR.SRC.TOO.LONG .EQ 3
ERR.SRC.TOO.MANY.IN .EQ 4
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 #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.COUNT
lda (pData),y
beq .8
.1 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
bne .1
.8 lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*---------------------------------------
LOAD.ASM.T
clc
rts
*---------------------------------------
SRC.OPEN 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-1
tay
pla
sta (pData),y
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hBUFFERS-1
tay
txa
sta (pData),y
lda hFileName
>SYSCALL SYS.MLIGetFileInfoA
bcs .99
>STYA ZPQuickPtr1
ldy #SRC.COUNT
lda (pData),y
clc
adc #SRC.hFILETYPES-1
tay
ldy #1
lda (ZPQuickPtr1),y
sta (pData),y
cmp #$04 TXT?
bne .1
>PUSHBI $0D
>PUSHBI $FF
>PUSHB hFileName
>SYSCALL SYS.MLINewLine
bcs .99
bra .8
.1 cmp #$FA BAS?
bne .98
.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 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.COUNT
lda (pData),y
clc
adc #SRC.hREFNUMS-1
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
bSTOP .BS 1
bCANCEL .BS 1
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
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
*---------------------------------------
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