diff --git a/BIN/ASM.S.DIR.txt b/BIN/ASM.S.DIR.txt index 714d9b63..f06f6003 100644 --- a/BIN/ASM.S.DIR.txt +++ b/BIN/ASM.S.DIR.txt @@ -3,8 +3,8 @@ PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 - .LIST OFF - .OP 65C02 + .LIST OFF + .OP 65C02 *--------------------------------------- DIR.AC clc rts @@ -36,6 +36,20 @@ DIR.ED clc DIR.EL clc rts *--------------------------------------- +DIR.EM ldy #ASM.MA.ON + lda (pData),y + bpl .9 + + lda #$00 + sta (pData),y + + clc + rts + +.9 lda #ERR.INVALID.MACRO.DEF + sec + rts +*--------------------------------------- DIR.EN clc rts *--------------------------------------- @@ -51,13 +65,65 @@ DIR.FI clc DIR.HS clc rts *--------------------------------------- -DIR.IN clc +DIR.IN jsr SRC.GetArg + bcs .9 + + >LDYA L.SRC.BUFFER + >SYSCALL SYS.NewPStrYA + + jsr SRC.OpenFileA + bcs .99 + rts + + +.9 lda #ERR.SYNTAX.ERROR +.99 sec rts *--------------------------------------- -DIR.LI clc +DIR.LI >LDYA L.T.LI + jsr SRC.GetKeyword + bcc .1 + + lda #ERR.SYNTAX.ERROR + sec + rts + +.1 jmp (J.LI,x) + +DIR.LI.CON ldy #ASM.LI.CON + sec + bra DIR.LI.APPLY +DIR.LI.COFF ldy #ASM.LI.CON + clc + bra DIR.LI.APPLY +DIR.LI.XON ldy #ASM.LI.XON + sec + bra DIR.LI.APPLY +DIR.LI.XOFF ldy #ASM.LI.XON + clc + bra DIR.LI.APPLY +DIR.LI.ON ldy #ASM.LI.ON + sec + bra DIR.LI.APPLY +DIR.LI.OFF ldy #ASM.LI.ON + clc +DIR.LI.APPLY lsr + sta (pData),y rts *--------------------------------------- -DIR.MA clc +DIR.MA ldy #ASM.MA.ON + lda (pData),y + bmi .9 + + lda #$80 + sta (pData),y + + jsr SRC.GetArg + clc + rts + +.9 lda #ERR.INVALID.MACRO.DEF + sec rts *--------------------------------------- DIR.OP clc diff --git a/BIN/ASM.S.SRC.txt b/BIN/ASM.S.SRC.txt new file mode 100644 index 00000000..123593d7 --- /dev/null +++ b/BIN/ASM.S.SRC.txt @@ -0,0 +1,581 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*--------------------------------------- +SRC.OpenFileA sta hFileName + >SYSCALL SYS.GetMemPtrA + >STYA ZPPtr1 + + ldy #1 + lda (ZPPtr1),y + cmp #'/' + beq .1 + + >PUSHB hFileName + ldy #S.PS.hPREFIX + lda (pPs),y + >PUSHA + >SYSCALL SYS.PStrCat + sta hFileName + >SYSCALL SYS.GetMemPtrA + >STYA ZPPtr1 + +.1 >PUSHW ZPPtr1 + >PUSHW L.MSG.SRC.FILE + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + 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 #$FA S-C/BAS? + beq .8 + + cmp #$04 TXT ? + + bne .98 + + >PUSHBI $0D Line separator for TXT file + >PUSHBI $FF + + ldy #SRC.COUNT + lda (pData),y + clc + adc #SRC.hREFNUMS + tay + lda (pData),y + >PUSHA + >SYSCALL SYS.MLINewLine + bcs .99 + +.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 .10 + + >PUSHWI 256 + >PUSHWI TmpBuffer256 + jsr SRC.ReadFromFile + bcs .19 + + lda #0 replace ending $0D with $00 + sta TmpBuffer256,y +.19 rts + +.10 >PUSHWI 3 + >PUSHW L.SRC.Buffer + jsr SRC.ReadFromFile + bcs .9 + + lda SRC.Buffer+1 + sta SRC.LINENUM + lda SRC.Buffer+2 + sta SRC.LINENUM+1 + + lda SRC.Buffer LEN + sec + sbc #3 + bcc .9 LEN should be at least 3 + + tay + lda #0 + >PUSHYA + >PUSHW L.SRC.BUFFER + jsr SRC.ReadFromFile + + ldy #0 + ldx #0 + +.1 lda SRC.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 SRC.Buffer,y + iny + beq .99 +.3 pha + lda SRC.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.ReadFromFile ldy #SRC.COUNT + lda (pData),y + clc + adc #SRC.hREFNUMS-1 + tay + lda (pData),y + >PUSHA + >SYSCALL SYS.MLIRead + bcs .9 + tax $100 byte transfered ? + beq .9 + lda #ERR.LINE.TOO.LONG + sec +.9 rts +*--------------------------------------- +SRC.FileClose ldy #SRC.COUNT + lda (pData),y + beq .8 + + 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 + +.8 clc + rts +*--------------------------------------- +SRC.ParseLine stz SRC.Label.Flags + stz SRC.BufPtr + lda TmpBuffer256 + beq SRC.ParseLine.Ok + cmp #'*' Comment? + beq SRC.ParseLine.Ok + cmp #';' Comment? + beq SRC.ParseLine.Ok + + tax + ldy #ASM.MA.ON + lda (pData),y + bpl .1 + + jmp SRC.ParseLine.Macro + +.1 txa + cmp #' ' + beq SRC.ParseLine.OpCde + +SRC.ParseLine.Sym cmp #'.' Local Label? + bne SRC.ParseLine.SymG + + jsr SRC.GetChar + beq SRC.ParseLine.Err1 + jsr SRC.GetDecimal + bcs SRC.ParseLine.Err1 + jsr SYM.AddLocal + bcc SRC.ParseLine.OpCde + rts + +SRC.ParseLine.SymG jsr SYM.ClearLocal + jsr SRC.GetLabel + bcs SRC.ParseLine.Err1 + + inc SRC.Label.Flags Remember to Add Label + + ldx #3 Makes Current Label = PC for now + ldy #ASM.PC + lda (pdata),y +.1 sta SRC.LabelValue,x + dey + dex + bpl .1 + +SRC.ParseLine.OpCde jsr SRC.GetCharNB + beq SRC.ParseLine.Ok + + cmp #'.' + beq SRC.ParseLine.Dir + + + + bra SRC.ParseLine.Ok + + + +SRC.ParseLine.Ok lda SRC.Label.Flags + beq .8 + + jsr SYM.AddLocal + +.8 clc + rts + +SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL +SRC.ParseLine.Err sec + rts +*--------------------------------------- +SRC.ParseLine.Dir >LDYA L.T.DIRECTIVES + jsr SRC.GetKeyword + bcs .9 + + jmp (J.DIRECTIVES,x) + +.9 lda #ERR.INVALID.DIRECTIVE + sec + rts +*--------------------------------------- +SRC.ParseLine.Macro + clc + rts +*--------------------------------------- +SRC.PrintLine bcs .1 if CS, unconditional + ldy #ASM.MA.ON + lda (pData),y + bpl .1 + + ldy #ASM.LI.CON + lda (pData),y + bpl .9 + bmi .8 + +.1 ldy #ASM.LI.ON + lda (pData),y + bpl .9 + +.8 >PUSHWI TmpBuffer256 + >PUSHW SRC.LINENUM + >PUSHW L.MSG.SRCLINE + >LIBCALL hLIBSTR,LIBSTR.PRINTF +.9 rts +*--------------------------------------- +SRC.GetDecimal stz SRC.ACC+1 + stz SRC.ACC+2 + stz SRC.ACC+3 + + jsr SRC.GetChar + beq .99 + jsr SRC.IsDigit10 + bcs .99 + and #$0F + sta SRC.ACC + +.1 jsr SRC.GetChar + beq .8 + cmp #' ' + beq .8 + jsr SRC.IsDigit10 + bcs .99 + and #$0F + + pha + jsr SRC.ACC10 + pla + bcs .9 + clc + adc SRC.ACC + sta SRC.ACC + bcc .1 + + inc SRC.ACC+1 + bne .1 + inc SRC.ACC+2 + bne .1 + inc SRC.ACC+3 + bne .1 + +.9 lda #ERR.VAL.TOO.BIG + sec + rts + +.8 clc + rts + +.99 lda #ERR.SYNTAX.ERROR + sec + rts +*--------------------------------------- +SRC.GetLabel jsr SRC.GetCharUC + + beq .9 + jsr SRC.IsLetter + bcs .9 + sta SRC.Label + + ldy #1 + +.1 jsr SRC.GetCharUC + beq .8 + + cmp #' ' + beq .8 + + cmp #'.' + beq .2 + + jsr SRC.IsLetterOrDigit + bcs .9 +.2 sta SRC.Label,y + iny + cpy #SRC.LABEL.MAXLEN + bne .1 if equ Carry is set + +.9 sec + rts + +.8 lda #0 + sta SRC.Label,y + clc + rts +*--------------------------------------- +SRC.GetKeyword >STYA ZPPtr1 + + jsr SRC.GetArg + bcs .9 + + stz SRC.Keyword.ID + + ldy #0 + +.3 lda (ZPPtr1),y + beq .9 + cmp SRC.Buffer + bne .6 + phy + + ldx #0 +.4 iny + inx + lda (ZPPtr1),y + cmp SRC.Buffer,x + bne .5 + cpx SRC.Buffer + bne .4 + + ply + + ldx SRC.Keyword.ID + clc + rts + +.5 ply + +.6 tya + sec Add keyword Len+1 + adc (ZPPtr1),y + tay + inc SRC.Keyword.ID + inc SRC.Keyword.ID + bra .3 + +.9 sec + rts +*--------------------------------------- +SRC.GetArg jsr SRC.GetCharUC + beq .9 + + sta SRC.Buffer+1 + ldy #1 + +.1 jsr SRC.GetCharUC + beq .2 + cmp #' ' + beq .2 + cmp #',' + iny + sta SRC.Buffer,y + bra .1 + +.2 sty SRC.Buffer + clc + rts + +.9 sec + rts +*--------------------------------------- +SRC.IsLetterOrDigit jsr SRC.IsDigit10 + bcc SRC.IsLetterRTS +*--------------------------------------- +SRC.IsLetter cmp #'A' + bcc .9 + cmp #'[' + bcc SRC.IsLetterRTS + + cmp #'a' + bcc .9 + cmp #'{' + rts CC if lowercase + +.9 sec +SRC.IsLetterRTS rts +*--------------------------------------- +SRC.IsDigit10 cmp #'0' + bcc .9 + cmp #':' + rts cc if ok, cs if not + +.9 sec + rts +*--------------------------------------- +SRC.GetCharNB jsr SRC.GetChar + beq .9 + cmp #' ' + beq SRC.GetCharNB +.9 rts +*--------------------------------------- +SRC.GetCharUC jsr SRC.GetChar + beq .9 + cmp #'a' + bcc .9 + cmp #'{' + bcs .9 + eor #$20 to Uppercase +.9 rts +*--------------------------------------- +SRC.GetChar ldx SRC.BufPtr + lda TmpBuffer256,x + inc SRC.BufPtr + and #$7f + rts +*--------------------------------------- +SRC.ACC10 lda SRC.ACC ACC*2-> ACC & ACCTMP + asl + sta SRC.ACC + sta SRC.ACCTMP + lda SRC.ACC+1 + rol + sta SRC.ACC+1 + sta SRC.ACCTMP+1 + lda SRC.ACC+2 + rol + sta SRC.ACC+2 + sta SRC.ACCTMP+2 + lda SRC.ACC+3 + rol + sta SRC.ACC+3 + sta SRC.ACCTMP+3 + bcs .9 + + ldx #1 +.1 asl SRC.ACC ACC=ACC*8 + rol SRC.ACC+1 + rol SRC.ACC+2 + rol SRC.ACC+3 + bcs .9 + dex + bne .1 + + lda SRC.ACC CC from ROL SRC.ACC+3 + adc SRC.ACCTMP + sta SRC.ACC + lda SRC.ACC+1 + adc SRC.ACCTMP+1 + sta SRC.ACC+1 + lda SRC.ACC+2 + adc SRC.ACCTMP+2 + sta SRC.ACC+2 + lda SRC.ACC+3 + adc SRC.ACCTMP+3 + sta SRC.ACC+3 CS if overflow + +.9 rts + +*--------------------------------------- +MAN +SAVE BIN/ASM.S.SRC +LOAD BIN/ASM.S +ASM diff --git a/BIN/ASM.S.SYM.txt b/BIN/ASM.S.SYM.txt index cf48600f..56dfe1f1 100644 --- a/BIN/ASM.S.SYM.txt +++ b/BIN/ASM.S.SYM.txt @@ -3,8 +3,8 @@ PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 - .LIST OFF - .OP 65C02 + .LIST OFF + .OP 65C02 *--------------------------------------- SYM.ClearPrivate clc diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 3935d77f..cde5d1e9 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -13,20 +13,24 @@ AUTO 6 .INB INC/A2OSX.API.I .INB INC/LIBSTR.I *--------------------------------------- +ZPPtr1 .EQ ZPBIN +ZPPtr2 .EQ ZPBIN+2 +*--------------------------------------- SYM.BLOCK.SIZE .EQ 4096 SYM.BLOCK.MAX .EQ 8 SRC.IN.DEPTH.MAX .EQ 7 -SRC.LABEL.MAXLEN .EQ 16 +SRC.LABEL.MAXLEN .EQ 32 *--------------------------------------- -ERR.INV.ARGS .EQ 1 -ERR.SRC.INV.TYPE .EQ 2 -ERR.SRC.TOO.MANY.IN .EQ 3 -ERR.SYNTAX.ERROR .EQ 99 -ERR.SYM.TOO.LONG .EQ 10 -ERR.VAL.TOO.BIG .EQ 11 -ERR.LINE.TOO.LONG .EQ 20 -ERR.INVALID.LABEL .EQ 21 -ERR.INVALID.DIRECTIVE .EQ 22 +ERR.INV.ARGS .EQ $80 +ERR.SRC.INV.TYPE .EQ $90 +ERR.SRC.TOO.MANY.IN .EQ $91 +ERR.SYNTAX.ERROR .EQ $A0 +ERR.SYM.TOO.LONG .EQ $A1 +ERR.VAL.TOO.BIG .EQ $A2 +ERR.LINE.TOO.LONG .EQ $A3 +ERR.INVALID.LABEL .EQ $A4 +ERR.INVALID.DIRECTIVE .EQ $A5 +ERR.INVALID.MACRO.DEF .EQ $E0 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- @@ -51,7 +55,10 @@ L.MSG.HELP1 .DA MSG.HELP1 L.MSG.HELP2 .DA MSG.HELP2 L.MSG.SRCLINE .DA MSG.SRCLINE L.MSG.ERROR .DA MSG.ERROR -L.READ.BUFFER .DA READ.BUFFER +L.MSG.PASS .DA MSG.PASS +L.MSG.SRC.FILE .DA MSG.SRC.FILE +L.MSG.OBJ.FILE .DA MSG.OBJ.FILE +L.SRC.BUFFER .DA SRC.BUFFER L.T.DIRECTIVES .DA T.DIRECTIVES J.DIRECTIVES .DA DIR.AC .DA DIR.AS @@ -61,14 +68,27 @@ J.DIRECTIVES .DA DIR.AC .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 @@ -80,6 +100,13 @@ J.DIRECTIVES .DA DIR.AC .DA DIR.TF .DA DIR.TI .DA DIR.US +L.T.LI .DA T.LI +J.LI .DA DIR.LI.CON + .DA DIR.LI.COFF + .DA DIR.LI.XON + .DA DIR.LI.XOFF + .DA DIR.LI.ON + .DA DIR.LI.OFF .DA 0 *--------------------------------------- CS.INIT >LDYA L.LIBSTR @@ -88,7 +115,7 @@ CS.INIT >LDYA L.LIBSTR ldy #S.PS.hARGS lda (pPs),y - bne CS.INIT.ARGS + bne .1 >PUSHW L.MSG.HELP1 >LIBCALL hLIBSTR,LIBSTR.PRINTF @@ -98,31 +125,18 @@ CS.INIT >LDYA L.LIBSTR 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 ldy #SRC.hFILENAME +.1 >SYSCALL SYS.PStrCpyA + ldy #SRC.hFILENAME sta (pData),y Store filename + lda #$80 + ldy #ASM.LI.ON + sta (pData),y + ldy #ASM.LI.CON + sta (pData),y + ldy #ASM.LI.XON + sta (pData),y + lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) @@ -147,11 +161,17 @@ CS.RUN ldy #bCANCEL lda (pData),y bne .10 + ldy #ASM.PASS + lda (pData),y + >PUSHA + >PUSHW L.MSG.PASS + >LIBCALL hLIBSTR,LIBSTR.PRINTF + ldy #SRC.hFILENAME lda (pData),y jsr SRC.OpenFileA - bcs * + bcs .99 .10 jsr SRC.ReadLine bcc .2 @@ -179,19 +199,21 @@ CS.RUN ldy #bCANCEL .2 jsr SRC.ParseLine bcs .9 - >PUSHWI TmpBuffer256 - >PUSHW SRC.LINENUM - >PUSHW L.MSG.SRCLINE - >LIBCALL hLIBSTR,LIBSTR.PRINTF + jsr SRC.PrintLine with CC, conditional .8 clc rts -.9 >PUSHA +.9 pha + sec + jsr SRC.PrintLine with CS, print always + pla + pha + >PUSHA >PUSHW SRC.LINENUM >PUSHW L.MSG.ERROR >LIBCALL hLIBSTR,LIBSTR.PRINTF - + pla sec rts *-------------------------------------- @@ -248,486 +270,8 @@ LOAD.ASM.T clc rts *--------------------------------------- -SRC.OpenFileA 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 #$FA S-C/BAS? - beq .8 - - cmp #$04 TXT ? - - bne .98 - - >PUSHBI $0D Line separator for TXT file - >PUSHBI $FF - - ldy #SRC.COUNT - lda (pData),y - clc - adc #SRC.hREFNUMS - tay - lda (pData),y - >PUSHA - >SYSCALL SYS.MLINewLine - bcs .99 - -.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 .10 - - >PUSHWI 256 - >PUSHWI TmpBuffer256 - jsr SRC.ReadFromFile - bcs .19 - - lda #0 replace ending $0D with $00 - sta TmpBuffer256,y -.19 rts - -.10 >PUSHWI 3 - >PUSHW L.READ.BUFFER - jsr SRC.ReadFromFile - bcs .9 - - lda READ.BUFFER+1 - sta SRC.LINENUM - lda READ.BUFFER+2 - sta SRC.LINENUM+1 - - lda READ.BUFFER LEN - sec - sbc #3 - bcc .9 LEN should be at least 3 - - tay - lda #0 - >PUSHYA - >PUSHW L.READ.BUFFER - jsr SRC.ReadFromFile - - 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.ReadFromFile ldy #SRC.COUNT - lda (pData),y - clc - adc #SRC.hREFNUMS-1 - tay - lda (pData),y - >PUSHA - >SYSCALL SYS.MLIRead - bcs .9 - tax $100 byte transfered ? - beq .9 - lda #ERR.LINE.TOO.LONG - sec -.9 rts -*--------------------------------------- -SRC.FileClose ldy #SRC.COUNT - lda (pData),y - beq .8 - - 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 - -.8 clc - rts -*--------------------------------------- -SRC.ParseLine stz SRC.Label.Flags - stz SRC.BufPtr - lda TmpBuffer256 - beq SRC.ParseLine.Ok - cmp #'*' Comment? - beq SRC.ParseLine.Ok - cmp #' ' - beq SRC.ParseLine.OpCde - -SRC.ParseLine.Sym cmp #'.' Local Label? - bne SRC.ParseLine.SymG - - jsr SRC.GetChar - beq SRC.ParseLine.Err1 - jsr SRC.GetDecimal - bcs SRC.ParseLine.Err1 - jsr SYM.AddLocal - bcc SRC.ParseLine.OpCde - rts - -SRC.ParseLine.SymG jsr SYM.ClearLocal - jsr SRC.GetLabel - bcs SRC.ParseLine.Err1 - - inc SRC.Label.Flags Remember to Add Label - - ldx #3 Makes Current Label = PC for now - ldy #ASM.PC - lda (pdata),y -.1 sta SRC.LabelValue,x - dey - dex - bpl .1 - -SRC.ParseLine.OpCde jsr SRC.GetCharNB - beq SRC.ParseLine.Ok - - cmp #'.' - beq SRC.ParseLine.Dir - - - - bra SRC.ParseLine.Ok - - - -SRC.ParseLine.Ok lda SRC.Label.Flags - beq .8 - - jsr SYM.AddLocal - -.8 clc - rts - -SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL -SRC.ParseLine.Err sec - rts -*--------------------------------------- -SRC.ParseLine.Dir jsr SRC.GetChar - beq .99 - sta SRC.Directive+1 - - ldy #2 - -.1 jsr SRC.GetChar - beq .2 - sta SRC.Directive,y - iny - cpy #SRC.DIR.MAXLEN+2 - bne .1 - bra .99 - -.2 sty SRC.Directive - - ldx #0 - stz SRC.Directive.ID - -.3 lda T.DIRECTIVES,x - beq .99 - cmp SRC.Directive - bne .6 - phx - - ldy #0 -.4 inx - iny - lda T.DIRECTIVES,x - cmp SRC.Directive,y - bne .5 - cpy SRC.Directive - beq .7 - -.5 plx -.6 txa - clc - adc T.DIRECTIVES,x - tax - inc SRC.Directive.ID - bra .3 - -.7 - -.99 lda #ERR.INVALID.DIRECTIVE - sec - rts -*--------------------------------------- -SRC.GetDecimal stz SRC.ACC+1 - stz SRC.ACC+2 - stz SRC.ACC+3 - - jsr SRC.GetChar - beq .99 - jsr SRC.IsDigit10 - bcs .99 - and #$0F - sta SRC.ACC - -.1 jsr SRC.GetChar - beq .8 - cmp #' ' - beq .8 - jsr SRC.IsDigit10 - bcs .99 - and #$0F - - pha - jsr SRC.ACC10 - pla - bcs .9 - clc - adc SRC.ACC - sta SRC.ACC - bcc .1 - - inc SRC.ACC+1 - bne .1 - inc SRC.ACC+2 - bne .1 - inc SRC.ACC+3 - bne .1 - -.9 lda #ERR.VAL.TOO.BIG - sec - rts - -.8 clc - rts - -.99 lda #ERR.SYNTAX.ERROR - sec - rts -*--------------------------------------- -SRC.GetLabel jsr SRC.GetChar - - beq .9 - jsr SRC.IsLetter - bcs .9 - sta SRC.Label - - ldy #1 - -.1 jsr SRC.GetChar - beq .8 - - cmp #' ' - beq .8 - - cmp #'.' - beq .2 - - jsr SRC.IsLetterOrDigit - bcs .9 -.2 sta SRC.Label,y - iny - cpy #SRC.LABEL.MAXLEN - bne .1 if equ Carry is set - -.9 sec - rts - -.8 lda #0 - sta SRC.Label,y - clc - rts -*--------------------------------------- -SRC.IsLetterOrDigit jsr SRC.IsDigit10 - bcc SRC.IsLetterRTS -*--------------------------------------- -SRC.IsLetter cmp #'A' - bcc .9 - cmp #'[' - bcc SRC.IsLetterRTS - - cmp #'a' - bcc .9 - cmp #'{' - bcs SRC.IsLetterRTS - - adc #$20 to Uppercase - rts - -.9 sec -SRC.IsLetterRTS rts -*--------------------------------------- -SRC.IsDigit10 cmp #'0' - bcc .9 - cmp #':' - rts cc if ok, cs if not - -.9 sec - rts -*--------------------------------------- -SRC.GetCharNB jsr SRC.GetChar - beq .9 - cmp #' ' - beq SRC.GetCharNB -.9 rts -*--------------------------------------- -SRC.GetChar ldx SRC.BufPtr - lda TmpBuffer256,x - inc SRC.BufPtr - and #$7f - rts -*--------------------------------------- -SRC.ACC10 lda SRC.ACC ACC*2-> ACC & ACCTMP - asl - sta SRC.ACC - sta SRC.ACCTMP - lda SRC.ACC+1 - rol - sta SRC.ACC+1 - sta SRC.ACCTMP+1 - lda SRC.ACC+2 - rol - sta SRC.ACC+2 - sta SRC.ACCTMP+2 - lda SRC.ACC+3 - rol - sta SRC.ACC+3 - sta SRC.ACCTMP+3 - bcs .9 - - ldx #1 -.1 asl SRC.ACC ACC=ACC*8 - rol SRC.ACC+1 - rol SRC.ACC+2 - rol SRC.ACC+3 - bcs .9 - dex - bne .1 - - lda SRC.ACC CC from ROL SRC.ACC+3 - adc SRC.ACCTMP - sta SRC.ACC - lda SRC.ACC+1 - adc SRC.ACCTMP+1 - sta SRC.ACC+1 - lda SRC.ACC+2 - adc SRC.ACCTMP+2 - sta SRC.ACC+2 - lda SRC.ACC+3 - adc SRC.ACCTMP+3 - sta SRC.ACC+3 CS if overflow - -.9 rts *--------------------------------------- + .INB BIN/ASM.S.SRC .INB BIN/ASM.S.DIR .INB BIN/ASM.S.SYM *--------------------------------------- @@ -756,6 +300,8 @@ T.DIRECTIVES .HS 02 .HS 04 .AS "ELSE" .HS 02 + .AS "EM" + .HS 02 .AS "EN" .HS 02 .AS "EP" @@ -813,9 +359,26 @@ T.DIRECTIVES .HS 02 .AS "US" .HS 00 *--------------------------------------- +T.LI .HS 03 + .AS "CON" + .HS 04 + .AS "COFF" + .HS 03 + .AS "XON" + .HS 04 + .AS "XOFF" + .HS 02 + .AS "ON" + .HS 03 + .AS "OFF" + .HS 00 +*--------------------------------------- LIBSTR >PSTRING "libstr.o" -MSG.HELP1 >CSTRING "A2osX-Macro Assembler (S-C MASM 2.0 Based)\n" +MSG.HELP1 >CSTRING "A2osX-Macro Assembler (S-C MASM 3.0 Based)\n" MSG.HELP2 >CSTRING "Usage : ASM [type TXT ($04) or S-C/BAS ($FA)]\n" +MSG.PASS >CSTRING "Pass:#%d\n" +MSG.SRC.FILE >CSTRING "Source File:#%S\n" +MSG.OBJ.FILE >CSTRING "Object File:#%S, Type=%02x\n" MSG.SRCLINE >CSTRING "%05D-%s\n" MSG.ERROR >CSTRING "%05D-Error:$%h\n" hLIBSTR .BS 1 @@ -824,12 +387,12 @@ SRC.LINENUM .BS 2 SRC.BufPtr .BS 1 SRC.Label.Flags .BS 1 SRC.Label .BS SRC.LABEL.MAXLEN -SRC.Directive.ID .BS 1 -SRC.Directive .BS SRC.DIR.MAXLEN SRC.LabelValue .BS 4 +SRC.Directive.ID .BS 1 +SRC.Keyword.ID .BS 1 SRC.ACC .BS 4 SRC.ACCTMP .BS 4 -READ.BUFFER .BS 256 +SRC.Buffer .BS 256 *-------------------------------------- .DUMMY .OR 0 @@ -850,10 +413,14 @@ DST.hBUFFER .BS 1 DST.hFILETYPE .BS 1 ASM.T.hFILENAME .BS 1 -ASM.T.hFILE .BS 1 handle to loaded ASM.T.xxxxx +ASM.T.hFILE .BS 1 handle to ASM.T.xxxxx + ASM.PASS .BS 1 ASM.PH.ON .BS 1 -ASM.LI.OFF .BS 1 +ASM.LI.ON .BS 1 +ASM.LI.CON .BS 1 +ASM.LI.XON .BS 1 +ASM.MA.ON .BS 1 ASM.PC .BS 4 32Bits PC ASM.PC.PH .BS 4 32Bits PC saved for PH directive