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 ZPLineBuf .EQ ZPBIN+4 ZPLinePtr .EQ ZPBIN+6 ZPNameBuf .EQ ZPBIN+8 ZPGlobalBuf .EQ ZPBIN+10 ZPLookupBuf .EQ ZPBIN+12 ZPMacroBuf .EQ ZPBIN+14 ZPTmpBuf .EQ ZPBIN+16 ZPAMPtr .EQ ZPBIN+18 ZPRPtr .EQ ZPBIN+20 ZPOpsPtr .EQ ZPBIN+22 ZPOpDefPtr .EQ ZPBIN+24 *--------------------------------------- SYMG.LEN .EQ 0 SYMG.F .EQ 1 SYMG.F.RESOLVED .EQ %10000000 SYMG.F.RW .EQ %01000000 SYMG.F.SIZE .EQ %00000111 SYMG.V .EQ 2 * SYMG.SIZE .EQ 6 *--------------------------------------- SYML.ID .EQ 0 SYML.V .EQ 1 * SYML.SIZE .EQ 5 *--------------------------------------- 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 #32 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.LSYMBOL .DA MSG.LSYMBOL 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.PSTR .DA MSG.PSTR L.MSG.CRLF .DA MSG.CRLF 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 OUT.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....beq=CS 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 jsr OUT.Print ldy #SRC.hFILENAME lda (pData),y >SYSCALL GetMemPtr.A jsr FIO.OpenFile bcs .99 jsr DIR.Reset jsr SYM.Reset .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 jsr SYM.FlushGlobal Store last Symbol, if any.... bcs .9 >LDA.G ASM.PASS End of pass #2 ?? bne .1 inc sta (pData),y clc .99 rts .1 jsr SYM.Dump >PUSHW ZPLinePtr >LDYA L.MSG.SUMMARY jsr OUT.Print lda #0 End of assembly, exit with no error sec rts .2 jsr SRC.ParseLine bcs .9 jsr OUT.PrintLine .8 clc rts .9 pha jsr OUT.PrintLineErr jsr SYM.Dump 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..T. .AZ ".T." ASM.6502 .AZ "6502" MSG.HELP .AZ "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\nUsage : ASM [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.LSYMBOL .AZ ", .%d %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.PSTR .AZ " %S" MSG.CRLF .AZ " \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.F .BS 1 SRC.ACC.SIZE .BS 1 SRC.ACC .BS 4 SRC.ARG.F .BS 1 SRC.ARG.SIZE .BS 1 SRC.ARG .BS 4 SRC.ACCTMP .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 SRC.LINENUM .BS 2 SRC.AMID .BS 1 DST.hFILENAME .BS 1 DST.hREFNUM .BS 1 DST.hBUFFER .BS 1 DST.hFILETYPE .BS 1 DIR.Word .BS 2 DIR.Byte .BS 1 EXP.Modifier .BS 1 EXP.Prefix .BS 1 EXP.Operator .BS 1 ASM.T.hMem .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.hGlobalList .BS 1 SYM.hNameBuf .BS 1 SYM.hGlobalBuf .BS 1 SYM.GlobalID .BS 2 SYM.hLookupBuf .BS 1 SYM.LocalID .BS 2 MAC.hMacros .BS 1 MAC.hBuf .BS 1 MAC.bAdd .BS 1 OUT.PC .BS 4 OUT.Buf .BS 4 OUT.bEquate .BS 1 OUT.LineCnt .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