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 *--------------------------------------- ERR.INV.ARGS .EQ 1 ERR.SRC.INV.TYPE .EQ 2 ERR.SRC.TOO.LONG .EQ 3 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 #VAR.INIT lda #0 .1 sta (pData),y iny cpy #VAR.INIT.END bne .1 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.INDEX lda (pData),y bmi .8 .1 clc adc #SRC.hREFNUMS tay lda (pData),y >SYSCALL SYS.MLICloseA ldy SRC.INDEX lda (pData),y clc adc #SRC.hBUFFERS tay lda (pData),y >SYSCALL SYS.FreeMemA ldy SRC.INDEX lda (pData),y dec sta (pData),y bpl .1 .8 lda hLIBSTR >SYSCALL SYS.UnloadLibA clc rts *--------------------------------------- LOAD.ASM.T clc rts *--------------------------------------- SRC.OPEN sta hFileName >SYSCALL SYS.MLIOpenA bcs .99 pha ldy #SRC.INDEX lda (pData),y clc adc #SRC.hREFNUMS tay pla sta (pData),y ldy #SRC.INDEX 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 pha ldy #SRC.INDEX lda (pData),y clc adc #SRC.hFILETYPES tay pla sta (pData),y cmp #$04 TXT? bne .1 >PUSHBI $0D >PUSHBI $FF >PUSHB SRC.hREFNUMS >SYSCALL SYS.MLINewLine bcs .99 .1 cmp #$FA BAS? bne .98 ldy #SRC.INDEX lda (pData),y inc sta (pData),y clc rts .98 lda #ERR.SRC.INV.TYPE .99 sec rts *--------------------------------------- SRC.ReadLine ldy #SRC.INDEX lda (pData),y clc adc #SRC.hFILETYPES 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.INDEX lda (pData),y clc adc #SRC.hREFNUMS 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 *--------------------------------------- VAR.INIT bSTOP .BS 1 bCANCEL .BS 1 SRC.INDEX .BS 1 SRC.hREFNUMS .BS 8 Store ref_num of opened files (Main, .INs & .INBs) SRC.hBUFFERS .BS 8 Store hMem to allocated buffers SRC.hFILETYPES .BS 8 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 VAR.INIT.END *--------------------------------------- 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