NEW PREFIX AUTO 4,1 *--------------------------------------- SRC.ParseLine jsr OUT.Reset jsr SRC.GetChar bcs .8 cmp #'*' Comment? beq .8 cmp #';' Comment? beq .8 >LDA.G ASM.DO.StackPtr beq .1 clc adc #ASM.DO.Stack-1 tay lda (pData),y beq .8 .1 >LDA.G ASM.MA.ON bmi SRC.ParseLine.MACRO jmp SRC.ParseLine.LABEL .8 clc rts *--------------------------------------- SRC.ParseLine.Macro >LDA.G ASM.PASS If Pass#2, ignore bne .8 >STZ.G MAC.BufPtr sta (ZPMacroBuf) lda (ZPLinePtr) cmp #' ' No label, scan to DIR/OP if any bne .1 jsr SRC.GetNextCharNB bcs .8 lda #' ' Store ONE blank jsr MAC.AddChar bcs .90 lda (ZPLinePtr) get back non blank char bra .2 .1 jsr MAC.AddChar bcs .99 jsr SRC.GetNextChar bcs .80 cmp #' ' bne .1 jsr MAC.AddChar .90 bcs .99 jsr SRC.GetNextCharNB bcs .80 .2 cmp #'.' Directive ? bne .4 ldy #1 lda (ZPLinePtr),y beq .3 cmp #'E' beq .21 cmp #'e' bne .3 .21 iny lda (ZPLinePtr),y beq .3 cmp #'M' beq .22 cmp #'m' bne .3 .22 >STZ.G ASM.MA.ON .8 clc rts .80 lda #0 jmp MAC.AddChar .3 lda (ZPLinePtr) .4 jsr MAC.AddChar bcs .99 jsr SRC.GetNextChar bcs .80 cmp #' ' bne .4 jsr SRC.GetNextChar bcs .8 cmp #' ' beq .80 Comments... pha lda #' ' jsr MAC.AddChar pla bcs .99 .5 jsr MAC.AddChar Store ARG.... bcs .99 jsr SRC.GetNextChar bcs .80 cmp #' ' bne .5 bra .80 End of Line .99 SRC.ParseLine.RTS rts *--------------------------------------- SRC.ParseLine.LABEL jsr SRC.GetChar cmp #' ' no label...go scan dir/opcode beq SRC.ParseLine.DirOp cmp #'.' local symbol? bne .1 lda (ZPGlobalBuf) Not relative to Global label... beq SRC.ParseLine.InvLbl jsr SRC.GetNextChar bcs SRC.ParseLine.InvLbl jsr SRC.GetDecimal bcs SRC.ParseLine.InvLbl lda SRC.ACC+1 ora SRC.ACC+2 ora SRC.ACC+3 bne SRC.ParseLine.InvLbl Max .255 lda SRC.ACC beq SRC.ParseLine.InvLbl .0 is not allowed jsr SYM.NewOrGetLocalA bcs SRC.ParseLine.RTS bra SRC.ParseLine.DirOp .1 jsr SYM.FlushGlobal Close & store Previous Global bcs SRC.ParseLine.RTS jsr SYM.NewOrGetGlobal bcs SRC.ParseLine.RTS *--------------------------------------- SRC.ParseLine.DirOp jsr SRC.GetNextCharNB Scan for an Opcode... bcs SRC.ParseLine.Ok cmp #'.' bne .5 jsr SRC.GetNextChar bcs SRC.ParseLine.InvDir jsr SRC.ParseLine.Dir bcs SRC.ParseLine.Err bra SRC.ParseLine.Ok .5 cmp #'>' bne SRC.ParseLine.OpCode jsr SRC.ParseLine.ExecMacro bcs SRC.ParseLine.Err bra SRC.ParseLine.Ok SRC.ParseLine.Ok clc SRC.ParseLine.Err rts SRC.ParseLine.InvLbl lda #ERR.INV.LABEL sec rts SRC.ParseLine.InvDir lda #ERR.INV.DIR sec rts *--------------------------------------- SRC.ParseLine.Dir >LDYA L.T.DIRECTIVES jsr SRC.GetKeyword bcs SRC.ParseLine.InvDir jmp (J.DIRECTIVES,x) *--------------------------------------- SRC.ParseLine.ExecMacro jsr SRC.GetNextChar skip '>' bcs .90 jsr MAC.Lookup bcs .90 >LDA.G ASM.MA.StackPtr cmp #MA.MAXDEPTH beq .91 clc adc #ASM.MA.StackPtr tay >INC.G ASM.MA.StackPtr clc rts .90 lda #ERR.MACRO.INV sec rts .91 lda #ERR.MACRO.INV sec rts *--------------------------------------- SRC.ParseLine.OpCode stz SRC.AM.StrBuf >LDYA ZPOpsPtr >STYA ZPOpDefPtr .1 lda (ZPOpDefPtr) End Of OpCode List ldy #1 ora (ZPOpDefPtr),y beq .9 lda ZPOpDefPtr clc adc #2 sta ZPPtr2 lda ZPOpDefPtr+1 adc #0 sta ZPPtr2+1 lda (ZPPtr2) tax ldy #0 .2 lda (ZPLinePtr),y beq .7 cmp #'a' bcc .3 cmp #'z'+1 bcs .3 eor #$20 .3 iny cmp (ZPPtr2),y bne .7 dex bne .2 lda (ZPLinePtr),y beq .8 End of Line, no AM cmp #' ' A space after opcode ? bne .7 tya sec skip OP + ' ' adc ZPLinePtr sta ZPLinePtr bcc .5 inc ZPLinePtr+1 .5 bra SRC.ParseLine.AM .7 lda ZPOpDefPtr clc adc (ZPOpDefPtr) tax lda ZPOpDefPtr+1 ldy #1 adc (ZPOpDefPtr),y stx ZPOpDefPtr sta ZPOpDefPtr+1 bra .1 .8 jmp SRC.ParseLine.OPAMCheckFF .9 lda #ERR.INV.OPCODE sec .99 rts *--------------------------------------- SRC.ParseLine.AM .1 jsr SRC.GetChar bcs SRC.ParseLine.AMCheck .10 cmp #' ' another space ? beq SRC.ParseLine.AMCheck ignore end of line (comment) jsr SRC.IsAMReserved bcs .2 jsr SRC.AddToBuf bra .7 .2 jsr SRC.IsLetter Any register? bcs .6 no, try something else >LDYA ZPRPtr Check in register table jsr SRC.GetKeyword bcs .6 lda (ZPPtr1) get register len tax .4 inc ZPPtr1 bne .5 inc ZPPtr1+1 .5 lda (ZPPtr1) jsr SRC.AddToBuf dex bne .4 bra .1 .6 jsr EXP.Eval bcs .99 >LDA.G EXP.Prefix beq .75 jsr SRC.AddToBuf .75 ldx #2 .74 lda SRC.ACC.SIZE beq .72 Pending...assume 2 bytes... tax .73 lda SRC.ACC-1,x bne .72 dex bne .73 inx .72 lda #'a' .71 jsr SRC.AddToBuf dex bne .71 bra .1 .7 jsr SRC.GetNextChar bcc .10 jmp SRC.ParseLine.AMCheck .9 lda #ERR.INV.AM.SYN sec .99 rts *--------------------------------------- SRC.ParseLine.AMCheck * jsr OUT.PrintLine.1 * >PUSHW L.SRC.AM.StrBuf * >LDYA L.MSG.PSTRCRLF * >SYSCALL printf * >DEBUG lda SRC.AM.StrBuf beq SRC.ParseLine.OPAMCheckFF >LDYA ZPAMPtr >STYA ZPPtr1 ldx #0 .1 inx lda (ZPPtr1) beq .9 cmp SRC.AM.StrBuf bne .7 tay .2 lda (ZPPtr1),y cmp SRC.AM.StrBuf,y bne .6 dey bne .2 txa >STA.G SRC.AMID bra SRC.ParseLine.OPAMCheck .6 lda (ZPPtr1) .7 sec adc ZPPtr1 sta ZPPtr1 bcc .1 inc ZPPtr1+1 bra .1 .9 lda #ERR.INV.AM sec rts *--------------------------------------- SRC.ParseLine.OPAMCheckFF lda #$ff Default to no AM >STA.G SRC.AMID SRC.ParseLine.OPAMCheck ldy #2 Skip nPtr+Len+OP lda (ZPOpDefPtr),y LEN sec LEN Byte adc #2 nPtr adc ZPOpDefPtr sta ZPOpDefPtr bcc .10 inc ZPOpDefPtr+1 .10 lda (ZPOpDefPtr) .1 >CMP.G SRC.AMID beq SRC.ParseLine.Emit ldy #1 lda (ZPOpDefPtr),y inc sec adc ZPOpDefPtr sta ZPOpDefPtr bcc .2 inc ZPOpDefPtr+1 .2 lda (ZPOpDefPtr) bne .1 .99 lda #ERR.INV.AM.4.OC sec rts *--------------------------------------- SRC.ParseLine.Emit stz SRC.ACCTMP index in ACC ldy #1 lda (ZPOpDefPtr),y sta SRC.ACCTMP+1 Char Count in AM iny .4 lda (ZPOpDefPtr),y cmp #'a bcs .5 lowercase, go compute address jsr SRC.IsDigit16 asl asl asl asl sta SRC.ACCTMP+2 iny dec SRC.ACCTMP+1 lda (ZPOpDefPtr),y jsr SRC.IsDigit16 ora SRC.ACCTMP+2 .50 jsr OUT.EmitByte bcs .9 iny dec SRC.ACCTMP+1 bne .4 clc rts .5 bne .6 cmp #'a'.... ldx SRC.ACCTMP inc SRC.ACCTMP lda SRC.ACC,x bra .50 .6 cmp #'r bne .7 lda SRC.ACC.SIZE beq .50 Emit 00 if pending symbol (pass #1) jsr SRC.ComputeRel8 bcs .91 bra .50 .7 cmp #'l bne .90 lda SRC.ACC.SIZE bne .71 jsr OUT.EmitByte Emit 00 00 if pending symbol (pass #1) bcs .9 lda #0 bra .50 .71 jsr SRC.ComputeRel16 bcs .91 lda SRC.ACC jsr OUT.EmitByte bcs .9 lda SRC.ACC+1 bra .50 .8 clc .9 rts .90 lda #ERR.INV.T.FILE sec rts .91 lda #ERR.RANGE sec rts *--------------------------------------- SRC.AddToBuf inc SRC.AM.StrBuf ldy SRC.AM.StrBuf sta SRC.AM.StrBuf,y rts *--------------------------------------- SRC.ComputeRel8 jsr SRC.ComputeRel bcc .1 * positive : check 0STYA ZPPtr1 KeyWord table ldx #0 Keyword.ID .1 phx lda (ZPPtr1) beq .9 End Of table tax KW len ldy #0 .3 lda (ZPLinePtr),y beq .6 jsr SRC.IsKeywordLetterUC bcs .6 iny cmp (ZPPtr1),y bne .6 dex bne .3 lda (ZPLinePtr),y All chars match... beq .4 End of Line ? jsr SRC.IsKeywordLetterUC bcc .6 Additional letters... .4 lda ZPLinePtr clc adc (ZPPtr1) sta ZPLinePtr bcc .5 inc ZPLinePtr+1 .5 plx Keyword.ID clc rts .6 lda (ZPPtr1) sec Add keyword Len+1 adc ZPPtr1 sta ZPPtr1 bcc .7 inc ZPPtr1+1 .7 plx Keyword.ID inx inx bra .1 .9 plx sec rts *--------------------------------------- SRC.IsAMReserved ldx SRC.AM.RESERVED .1 cmp SRC.AM.RESERVED,x beq .8 dex bne .1 sec rts .8 clc rts *--------------------------------------- SRC.IsMODReserved ldx SRC.MOD.RESERVED .1 cmp SRC.MOD.RESERVED,x beq .8 dex bne .1 sec rts .8 clc rts *--------------------------------------- SRC.IsEXPReserved ldx SRC.EXP.RESERVED .1 cmp SRC.EXP.RESERVED,x beq SRC.IsEXPReserved.8 dex bne .1 sec rts SRC.IsEXPReserved.8 clc rts *--------------------------------------- SRC.IsKeywordLetterUC cmp #'.' beq SRC.IsEXPReserved.8 cmp #'_' beq SRC.IsEXPReserved.8 cmp #'A' bcc .9 cmp #'Z'+1 bcc .99 cmp #'a' bcc .9 cmp #'z'+1 eor #$20 rts CC if lowercase .9 sec .99 rts *--------------------------------------- *--------------------------------------- SRC.IsLetterOrDigit jsr SRC.IsDigit10 bcc SRC.IsLetterRTS *--------------------------------------- SRC.IsLetter cmp #'A' bcc .9 cmp #'Z'+1 bcc SRC.IsLetterRTS cmp #'a' bcc .9 cmp #'z'+1 rts CC if lowercase .9 sec SRC.IsLetterRTS rts *--------------------------------------- SRC.IsDigit16 jsr SRC.IsDigit10 bcc .8 cmp #'A' bcc .9 cmp #'F'+1 bcc .1 cmp #'a' bcc .9 cmp #'f'+1 bcs .9 eor #$20 .1 * clc sbc #'A'-11 cc so A->10 (11-CC) clc .8 and #$0F rts .9 sec rts *--------------------------------------- SRC.IsDigit10 cmp #'0' bcc .9 cmp #'9'+1 rts cc if ok, cs if not .9 sec rts *--------------------------------------- SRC.IsDigit8 cmp #'0' bcc .9 cmp #'7'+1 rts cc if ok, cs if not .9 sec rts *--------------------------------------- SRC.GetNextCharNB jsr SRC.GetNextChar bcs .9 cmp #' ' beq SRC.GetNextCharNB clc .9 rts *--------------------------------------- SRC.GetNextCharUC jsr SRC.GetNextChar bcs .9 cmp #'a' bcc .8 cmp #'z'+1 bcs .8 eor #$20 to Uppercase .8 clc .9 rts *--------------------------------------- SRC.GetNextChar lda (ZPLinePtr) beq SRC.GetChar.ERR cmp #$0D beq SRC.GetChar.ERR inc ZPLinePtr bne SRC.GetChar inc ZPLinePtr+1 SRC.GetChar lda (ZPLinePtr) beq SRC.GetChar.ERR cmp #$0D beq SRC.GetChar.ERR clc rts SRC.GetChar.ERR sec 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 #2 .1 asl SRC.ACC ACC=ACC*4 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 USR/SRC/BIN/ASM.S.SRC LOAD USR/SRC/BIN/ASM.S ASM