A2osX/BIN/ASM.S.txt
2018-03-21 16:22:05 +00:00

498 lines
10 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.

NEW
PREFIX /A2OSX.BUILD
AUTO 4,1
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BUILD/BIN/DEV/ASM
*---------------------------------------
.INB /A2OSX.BUILD/INC/MACROS.I
.INB /A2OSX.BUILD/INC/A2OSX.I
*---------------------------------------
ZPPtr1 .EQ ZPBIN
ZPPtr2 .EQ ZPBIN+2
ZPPtr3 .EQ ZPBIN+4
ZPLineBuf .EQ ZPBIN+6
ZPLinePtr .EQ ZPBIN+8
ZPLocalBuf .EQ ZPBIN+10
ZPMacroBuf .EQ ZPBIN+12
ZPTmpBuf .EQ ZPBIN+14
ZPAMPtr .EQ ZPBIN+16
ZPRPtr .EQ ZPBIN+18
ZPOPtr .EQ ZPBIN+20
ZPOpDefPtr .EQ ZPBIN+22
*---------------------------------------
SYM.LEN .EQ 0
SYM.F .EQ 1
SYM.F.RESOLVED .EQ %10000000
SYM.F.RW .EQ %01000000
SYM.F.SIZE .EQ %00000111
SYM.V .EQ 2
*---------------------------------------
ASM.T.AM .EQ 0
ASM.T.R .EQ 2
ASM.T.O .EQ 4
*---------------------------------------
SRC.DO.MAXDEPTH .EQ 8
SRC.IN.MAXDEPTH .EQ 7
*---------------------------------------
ERR.INV.ARGS .EQ $80
ERR.SRC.INV.TYPE .EQ $90
ERR.SRC.TOO.MANY.IN .EQ $91
ERR.SRC.UNEXP.EOF .EQ $92
ERR.SYNTAX.ERROR .EQ $A0
ERR.SYM.TOO.LONG .EQ $A1
ERR.VAL.TOO.BIG .EQ $A2
ERR.LINE.TOO.LONG .EQ $A3
ERR.INV.LABEL .EQ $A4
ERR.INV.DIR .EQ $A5
ERR.INV.OPCODE .EQ $A6
ERR.INV.AM.SYN .EQ $A7
ERR.INV.AM .EQ $A8
ERR.INV.AM.4.OC .EQ $A9
ERR.RANGE .EQ $AA
ERR.UNDEF.SYMBOL .EQ $AB
ERR.SYMBOL.REDEF .EQ $AC
ERR.TOO.MANY.DO .EQ $AD
ERR.ELSE.WITHOUT.DO .EQ $AE
ERR.TOO.MANY.LOCAL .EQ $AF
ERR.MISSING.EXP .EQ $B0
ERR.EXP.SYN.ERROR .EQ $B1
ERR.MACRO.INV.DEF .EQ $E0
ERR.MACRO.TOO.BIG .EQ $E1
*--------------------------------------
* 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 CS
.DA DS.END-DS.START DS
.DA #0 SS
.DA #24 ZP
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG.HELP .DA MSG.HELP
L.MSG.OUT0 .DA MSG.OUT0
.DA MSG.OUT1
.DA MSG.OUT2
.DA MSG.OUT3
L.MSG.EQU0 .DA MSG.EQU0
.DA MSG.EQU1
.DA MSG.EQU2
.DA MSG.EQU3
.DA MSG.EQU4
L.MSG.SRCLINE .DA MSG.SRCLINE
L.MSG.ERROR .DA MSG.ERROR
L.MSG.SYMBOLS .DA MSG.SYMBOLS
L.MSG.PSTRCRLF .DA MSG.PSTRCRLF
L.MSG.SUMMARY .DA MSG.SUMMARY
L.MSG.PASS .DA MSG.PASS
L.MSG.SRC.FILE .DA MSG.SRC.FILE
L.MSG.OBJ.FILE .DA MSG.OBJ.FILE
L.MSG.T.FILE .DA MSG.T.FILE
L.SRC.AM.StrBuf .DA SRC.AM.StrBuf
L.ASM.6502 .DA ASM.6502
L.ASM.T.FILENAME .DA ASM.T.FILENAME
L.FIO.Stat .DA FIO.Stat
L.T.DIRECTIVES .DA T.DIRECTIVES
J.DIRECTIVES .DA DIR.AC
.DA DIR.AS
.DA DIR.AT
.DA DIR.AZ
.DA DIR.BS
.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
.DA DIR.OR
.DA DIR.PG
.DA DIR.PH
.DA DIR.SE
.DA DIR.TA
.DA DIR.TF
.DA DIR.TI
.DA DIR.US
L.T.LI .DA T.LI
J.LI .DA DIR.LI.ON
.DA DIR.LI.OFF
.DA DIR.LI.CON
.DA DIR.LI.COFF
.DA DIR.LI.MON
.DA DIR.LI.MOFF
.DA DIR.LI.XON
.DA DIR.LI.XOFF
J.EXP.MOD .DA EXP.MOD.8.1 #/^<>
.DA EXP.MOD.8.2
.DA EXP.MOD.8.3
.DA EXP.MOD.24
.DA EXP.MOD.32
J.EXP.OP .DA EXP.OP.EOR ^!|&<=>+-*/
.DA EXP.OP.ORA
.DA EXP.OP.ORA
.DA EXP.OP.AND
.DA EXP.OP.LOW
.DA EXP.OP.EQU
.DA EXP.OP.GRT
.DA EXP.OP.ADD
.DA EXP.OP.SUB
.DA EXP.OP.MUL
.DA EXP.OP.DIV
.DA 0
*---------------------------------------
CS.INIT ldy #S.PS.ARGC
lda (pPs),y
beq .99
lda #1
>SYSCALL GetArg.A
>SYSCALL RealPath.YA
txa
ldy #SRC.hFILENAME
sta (pData),y
jsr FIO.Init
bcs .9
jsr SYM.Init
bcs .9
jsr MAC.Init
bcs .9
jsr DIR.Init
>LDYAI 256
>SYSCALL GetMem.YA
bcs .9
>STYA ZPLineBuf
txa
>STA.G SRC.hLineBuf
>LDYAI 256
>SYSCALL GetMem.YA
bcs .9
>STYA ZPTmpBuf
txa
>STA.G SRC.hTmpBuf
* lda (pPs)
* ora #S.PS.F.EVENT
* sta (pPs)
clc
rts
.99 >LDYA L.MSG.HELP
>SYSCALL PrintF.YA
lda #ERR.INV.ARGS
sec
.9 rts
*--------------------------------------
CS.RUN >SYSCALL GetChar
bcs .11 no char
cmp #$03 Ctrl-C
beq .99 Abort....
cmp #$13 Ctrl-S
bne .11
ldy #bPause
lda (pData),y
eor #$ff
sta (pData),y
.11 ldy #bPause
lda (pData),y
bne .8
ldy #SRC.COUNT root file is already opened?
lda (pData),y
bne .10
>LDA.G ASM.PASS
inc
>PUSHA
>LDYA L.MSG.PASS
>SYSCALL PrintF.YA
ldy #SRC.hFILENAME
lda (pData),y
>SYSCALL GetMemPtr.A
jsr FIO.OpenFile
bcs .99
.10 jsr FIO.ReadLine
bcc .2
cmp #$4C End Of File?
bne .9
jsr FIO.FileClose
ldy #SRC.COUNT end of root file ?
lda (pData),y
bne .8 no continue back to previous file
>LDA.G ASM.PASS End of pass #2 ??
bne .1
inc
sta (pData),y
jsr DIR.Init Reset
>DEBUG
clc
rts
.1 jsr SYM.Dump
>PUSHW ZPLinePtr
>LDYA L.MSG.SUMMARY
>SYSCALL PrintF.YA
lda #0 End of assembly, exit with no error
.99 sec
rts
.2 jsr SRC.ParseLine
bcs .9
jsr OUT.PrintLine
.8 clc
rts
.9 pha
jsr OUT.PrintLineErr
pla
sec
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT jsr FIO.FileClose
bne CS.QUIT
jsr MAC.Quit
jsr SYM.Quit
>LDA.G ASM.T.hMem
beq .1
>SYSCALL FreeMem.A
.1 >LDA.G SRC.hFILENAME
beq .2
>SYSCALL FreeMem.A
.2 >LDA.G SRC.hLineBuf
beq .3
>SYSCALL FreeMem.A
.3 >LDA.G SRC.hTmpBuf
beq .8
>SYSCALL FreeMem.A
.8 clc
rts
*---------------------------------------
.INB /A2OSX.BUILD/BIN/DEV/ASM.S.DIR
.INB /A2OSX.BUILD/BIN/DEV/ASM.S.EXP
.INB /A2OSX.BUILD/BIN/DEV/ASM.S.FIO
.INB /A2OSX.BUILD/BIN/DEV/ASM.S.MAC
.INB /A2OSX.BUILD/BIN/DEV/ASM.S.OUT
.INB /A2OSX.BUILD/BIN/DEV/ASM.S.SRC
.INB /A2OSX.BUILD/BIN/DEV/ASM.S.SYM
*---------------------------------------
CS.END
T.DIRECTIVES >PSTR "AC"
>PSTR "AS"
>PSTR "AT"
>PSTR "AZ"
>PSTR "BS"
>PSTR "DA"
>PSTR "DO"
>PSTR "DU"
>PSTR "DUMMY"
>PSTR "ED"
>PSTR "ELSE"
>PSTR "EM"
>PSTR "EN"
>PSTR "EP"
>PSTR "EQ"
>PSTR "FIN"
>PSTR "HS"
>PSTR "IN"
>PSTR "INB"
>PSTR "INB1"
>PSTR "INB2"
>PSTR "INB3"
>PSTR "INB4"
>PSTR "INB5"
>PSTR "INB6"
>PSTR "INB7"
>PSTR "INB8"
>PSTR "INB9"
>PSTR "LI"
>PSTR "LIST"
>PSTR "MA"
>PSTR "OP"
>PSTR "OR"
>PSTR "PG"
>PSTR "PH"
>PSTR "SE"
>PSTR "TA"
>PSTR "TF"
>PSTR "TI"
>PSTR "US"
.HS 00
*---------------------------------------
T.LI >PSTR "ON"
>PSTR "OFF"
>PSTR "CON"
>PSTR "COFF"
>PSTR "MON"
>PSTR "MOFF"
>PSTR "XON"
>PSTR "XOFF"
.HS 00
*---------------------------------------
ASM.6502 .AZ "6502"
MSG.HELP .AZ "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\nUsage : ASM <src file> [type TXT ($04) or S-C/BAS ($FA)]\r\n"
MSG.PASS .AZ "Pass:#%d\r\n"
MSG.SRC.FILE .AZ "Reading SRC File:%s\r\n"
MSG.OBJ.FILE .AZ "Writing OBJ File:%s, Type=%02x\r\n"
MSG.T.FILE .AZ "Loading CPU File:%s\r\n"
MSG.OUT0 .AZ "%H- "
MSG.OUT1 .AZ "%H-%h "
MSG.OUT2 .AZ "%H-%h %h "
MSG.OUT3 .AZ "%H-%h %h %h"
MSG.EQU0 .AZ " [ ?]"
MSG.EQU1 .AZ " [ %h]"
MSG.EQU2 .AZ " [ %h%h]"
MSG.EQU3 .AZ " [ %h%h%h]"
MSG.EQU4 .AZ " [%h%h%h%h]"
MSG.SRCLINE .AZ " %05D %s\r\n"
MSG.ERROR .AZ "*** Fatal Error $%h "
MSG.SYMBOLS .AZ "Symbol Table:\r\n"
MSG.PSTRCRLF .AZ " %S\r\n"
MSG.SUMMARY .AZ "\r\nSymbol Table Size : %5D Bytes.\r\nEnd Of Assembly.\r\n"
SRC.MOD.RESERVED >PSTR "#/^<>"
SRC.EXP.RESERVED >PSTR "^!|&<=>+-*/"
SRC.AM.RESERVED >PSTR "[](),"
*---------------------------------------
ASM.T.FILENAME .BS 65
FIO.Stat .BS S.STAT
SRC.ACC.SIZE .BS 1
SRC.ACC .BS 4
SRC.ACCTMP .BS 4
SRC.ARG .BS 4
SRC.AM.StrBuf .BS 32
*--------------------------------------
.DUMMY
.OR 0
DS.START
bPause .BS 1
SRC.hFILENAME .BS 1
SRC.hLineBuf .BS 1
SRC.hTmpBuf .BS 1
SRC.COUNT .BS 1
SRC.hFILES .BS SRC.IN.MAXDEPTH
SRC.hFILETYPES .BS SRC.IN.MAXDEPTH
DST.hFILENAME .BS 1
DST.hREFNUM .BS 1
DST.hBUFFER .BS 1
DST.hFILETYPE .BS 1
SRC.LINENUM .BS 2
ASM.T.hMem .BS 1
DIR.Word .BS 2
DIR.Byte .BS 1
EXP.Modifier .BS 1
EXP.Prefix .BS 1
EXP.Operator .BS 1
ASM.PASS .BS 1
ASM.DO.StackPtr .BS 1
ASM.DO.Stack .BS SRC.DO.MAXDEPTH
ASM.DO.ON .BS 1
ASM.PH.ON .BS 1
ASM.LI.ON .BS 1
ASM.LI.CON .BS 1
ASM.LI.MON .BS 1
ASM.LI.XON .BS 1
ASM.PC .BS 4
ASM.PC.PH .BS 4
SYM.hGlobals .BS 1
SYM.bGlobal .BS 1
SYM.Global .BS 6
SYM.ID .BS 2
SYM.hLocalBuf .BS 1
SYM.LocalIndex .BS 1
SYM.Lookup .BS 6
MAC.hMacros .BS 1
MAC.hBuf .BS 1
MAC.bAdd .BS 1
OUT.PC .BS 4
OUT.Buf .BS 4
OUT.bEquate .BS 1
SRC.AMID .BS 1
DS.END .ED
*---------------------------------------
.DO DS.END-DS.START>$FF
ERROR:DS too big
.FIN
*---------------------------------------
MAN
SAVE /A2OSX.BUILD/BIN/DEV/ASM.S
ASM