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.MANY.IN .EQ 3 ERR.SYM.TOO.LARGE .EQ 10 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 *-------------------------------------- CS.RUN ldy #bCANCEL lda (pData),y beq .1 sec rts .1 ldy #bSTOP lda (pData),y beq .2 clc rts .2 jsr SRC.ReadLine bcs .9 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 lda #$FF ldy #bCANCEL sta (pData),y bra .8 .1 cmp #$13 Ctrl-S bne .8 ldy #bSTOP lda (pData),y eor #$FF sta (pData),y .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 tay pla sta (pData),y ldy #SRC.COUNT 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 tax ldy #SRC.COUNT lda (pData),y clc adc #SRC.hFILETYPES tay txa sta (pData),y cmp #$04 TXT? bne .1 >PUSHBI $0D >PUSHBI $FF >PUSHB hFileName >SYSCALL SYS.MLINewLine bcs .99 bra .8 .1 cmp #$FA S-C/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.TFA jmp SRC.ReadLine.T04 *--------------------------------------- SRC.ReadLine.TFA >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 LEN sec sbc #3 remove LEN + LINENUM from LEN bcc .9 LEN should be at least 3 beq .8 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 .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.LINE.TOO.LONG sec rts *-------------------------------------- SRC.ReadLine.T04 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 *--------------------------------------- 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 *--------------------------------------- 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 [type TXT ($04) or S-C/BAS ($FA)]\n" MSG.SRCLINE >CSTRING "%05D-%s\n" hLIBSTR .BS 1 hFileName .BS 1 SRC.LINENUM .BS 2 SRC.BufPtr .BS 1 SRC.Token .BS 256 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 DST.hFILENAME .BS 1 DST.hFILETYPE .BS 1 DST.hREFNUM .BS 1 DST.hBUFFER .BS 1 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 SYM.BLOCKS .BS SYM.BLOCK.MAX DS.END .ED *--------------------------------------- MAN SAVE BIN/ASM.S ASM