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 [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