PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *--------------------------------------- SRC.ParseLine ldx TmpBuffer256 beq SRC.ParseLine.Skip cpx #'*' Comment? beq SRC.ParseLine.Skip cpx #';' Comment? beq SRC.ParseLine.Skip stz SRC.GLabel.New cpx #' ' no label...go scan dir/opcode beq .4 cpx #'.' local symbol? bne .2 jsr SRC.ParseLine.SymL bra .3 .2 jsr SRC.ParseLine.SymG .3 bcs SRC.ParseLine.Err .4 jsr SRC.GetCharNB Scan for an Opcode... beq SRC.ParseLine.Ok cmp #'.' bne .5 jsr SRC.ParseLine.Dir bcs SRC.ParseLine.Err bra SRC.ParseLine.Ok .5 cmp #'>' bne .6 jsr SRC.ParseLine.Exec.Macro bcs SRC.ParseLine.Err bra SRC.ParseLine.Ok .6 dec SRC.BufPtr Back one char... jsr SRC.ParseLine.OpCode bcs SRC.ParseLine.Err SRC.ParseLine.Ok lda SRC.GLabel.New bpl .1 lda SRC.GLabel.Flags lsr .SE ? bcs .1 yes, update during pass 1 & 2 ldy #ASM.PASS lda (pData),y pass#2? bne .8 yes, skip to avoid redefinition error jsr SYM.FindGlobal bcs SRC.ParseLine.Redef .1 jsr SYM.AddGToGBlock bcs SRC.ParseLine.Err .8 SRC.ParseLine.skip clc rts SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL SRC.ParseLine.Err sec rts SRC.ParseLine.Redef lda #ERR.SYMBOL.REDEFINE sec rts *--------------------------------------- SRC.ParseLine.SymP jsr SRC.GetChar beq SRC.ParseLine.SymE jsr SRC.GetDecimal bcs SRC.ParseLine.SymE jmp SYM.AddPrivate *--------------------------------------- SRC.ParseLine.SymL jsr SRC.GetChar beq SRC.ParseLine.SymE jsr SRC.GetDecimal bcs SRC.ParseLine.SymE lda SRC.ACC+1 ora SRC.ACC+2 ora SRC.ACC+3 bne SRC.ParseLine.SymE Max .255 lda SRC.ACC beq SRC.ParseLine.SymE .0 is not allowed sta SRC.LLabel.ID ldy #ASM.PC lda (pData),y ldy #ASM.PC.GLABEL sec sbc (pData),y sta SRC.LLabel.Offset ldy #ASM.PC+1 lda (pData),y ldy #ASM.PC.GLABEL+1 sbc (pData),y bne SRC.ParseLine.SymR ldy #ASM.PC+2 lda (pData),y ldy #ASM.PC.GLABEL+2 sbc (pData),y bne SRC.ParseLine.SymR ldy #ASM.PC+3 lda (pData),y ldy #ASM.PC.GLABEL+3 sbc (pData),y bne SRC.ParseLine.SymR bcc SRC.ParseLine.SymR jmp SYM.AddLToGBlock *--------------------------------------- SRC.ParseLine.SymE lda #ERR.INVALID.LABEL sec rts SRC.ParseLine.SymR lda #ERR.RANGE sec rts *--------------------------------------- SRC.ParseLine.SymG >LDYA L.SRC.GLabel.Len jsr SRC.GetLabel bcs SRC.ParseLine.SymE ldx #3 Makes Current Label = PC for now ldy #ASM.PC+3 .1 lda (pData),y sta SRC.GLabel.Value,x dey dex bpl .1 ldx #3 Makes Current Label = Ref for next local ldy #ASM.PC.GLABEL+3 .2 lda SRC.GLabel.Value,x sta (pData),y dey dex bpl .2 lda #$80 Mark GLabel Flag... sta SRC.GLabel.Flags sta SRC.GLabel.New clc 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.Exec.Macro clc rts *--------------------------------------- SRC.ParseLine.Add.Macro clc rts *--------------------------------------- SRC.ParseLine.OpCode jsr SRC.GetArg bcs .9 ldy #ASM.T.hMem lda (pData),y >SYSCALL SYS.GetMemPtrA >STYA ZPPtr1 ldy #ASM.T.O setup Ptr to Opcodes lda (ZPPtr1),y clc adc ZPPtr1 sta ZPPtr2 iny lda (ZPPtr1),y adc ZPPtr1+1 sta ZPPtr2+1 ldy #ASM.T.R setup Ptr to Registers lda (ZPPtr1),y clc adc ZPPtr1 sta ZPPtr3 iny lda (ZPPtr1),y adc ZPPtr1+1 sta ZPPtr3+1 .10 lda (ZPPtr2) ldy #1 ora (ZPPtr2),y beq .9 ldx #$FF .1 inx lda SRC.Buffer,x iny cmp (ZPPtr2),y bne .7 cpx SRC.Buffer bne .1 jsr SRC.ParseLine.AM bcs .99 ldy #ASM.PC lda (pData),y inc sta (pData),y bne .2 iny lda (pData),y inc sta (pData),y .2 clc rts .7 lda ZPPtr1 clc adc (ZPPtr2) tax lda ZPPtr1+1 ldy #1 adc (ZPPtr2),y stx ZPPtr2 sta ZPPtr2+1 bra .10 .9 lda #ERR.INVALID.OPCODE sec .99 rts *--------------------------------------- SRC.ParseLine.AM stz SRC.AM.ID stz SRC.AM.StrBuf .1 jsr SRC.GetCharUC any arg immediately after ' '? beq .8 no, AM.ID=0 (implied) cmp #' ' another space ? beq .8 ignore end of line (comment) jsr SRC.IsAMReserved bcs .2 inc SRC.AM.StrBuf ldx SRC.AM.StrBuf sta SRC.AM.StrBuf,x bra .1 .8 clc rts .2 jsr SRC.IsLetter Any register? bcs .70 no, try something else stz SRC.AM.tmpBuf sta SRC.AM.tmpBuf+1 inc SRC.AM.tmpBuf .3 jsr SRC.GetCharUC beq .41 jsr SRC.IsLetterOrDigit bne .4 inc SRC.AM.tmpBuf ldx SRC.AM.tmpBuf sta SRC.AM.tmpBuf,x bra .3 .4 dec SRC.BufPtr back one char .41 ldy #0 .5 lda (ZPPtr3),y beq .71 last register ? ldx #$ff phy .6 lda (ZPPtr3),y iny inx cmp SRC.AM.tmpBuf,x bne .7 cpx SRC.AM.tmpBuf bne .6 ply ldy #0 register match, add to AM string ldx SRC.AM.StrBuf .61 iny lda SRC.AM.tmpBuf,y inx sta SRC.AM.StrBuf,x cpy SRC.AM.tmpBuf bne .61 stx SRC.AM.StrBuf bra .72 .7 ply tya sec adc (ZPPtr3),y tay bra .5 .70 dec SRC.BufPtr back one char .71 jsr EXP.Eval bcs .99 .72 jmp .1 clc rts .9 lda #ERR.INVALID.AM.SYN sec .99 rts *--------------------------------------- SRC.PrintLine bcs .8 if CS, unconditional ldy #ASM.MACRO.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 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.GetHex stz SRC.ACC+1 stz SRC.ACC+2 stz SRC.ACC+3 jsr SRC.GetChar beq .99 jsr SRC.IsDigit16 bcs .99 sta SRC.ACC .1 jsr SRC.GetChar beq .8 cmp #' ' beq .8 jsr SRC.IsDigit16 bcs .99 ldx #4 .2 asl SRC.ACC rol SRC.ACC+1 rol SRC.ACC+2 rol SRC.ACC+3 bcs .9 dex bne .2 ora SRC.ACC sta SRC.ACC bra .1 .8 clc rts .9 lda #ERR.VAL.TOO.BIG sec rts .99 lda #ERR.SYNTAX.ERROR sec rts *--------------------------------------- SRC.GetOctal stz SRC.ACC+1 stz SRC.ACC+2 stz SRC.ACC+3 jsr SRC.GetChar beq .99 jsr SRC.IsDigit8 bcs .99 and #$0F sta SRC.ACC .1 jsr SRC.GetChar beq .8 cmp #' ' beq .8 jsr SRC.IsDigit8 bcs .99 asl asl asl asl asl ldx #3 .2 asl rol SRC.ACC rol SRC.ACC+1 rol SRC.ACC+2 rol SRC.ACC+3 bcs .9 dex bne .2 bra .1 .8 clc rts .9 lda #ERR.VAL.TOO.BIG sec rts .99 lda #ERR.SYNTAX.ERROR sec rts *--------------------------------------- SRC.GetBinary stz SRC.ACC+1 stz SRC.ACC+2 stz SRC.ACC+3 jsr SRC.GetChar beq .99 cmp #'1' beq .10 cmp #'0' bne .99 .10 and #$01 sta SRC.ACC .1 jsr SRC.GetChar beq .8 cmp #'1' beq .11 cmp #'0' bne .8 .11 lsr rol SRC.ACC rol SRC.ACC+1 rol SRC.ACC+2 rol SRC.ACC+3 bcs .9 bra .1 .8 clc rts .9 lda #ERR.VAL.TOO.BIG sec rts .99 lda #ERR.SYNTAX.ERROR sec rts *--------------------------------------- SRC.GetLabel >STYA ZPPtr1 jsr SRC.GetCharUC beq .9 jsr SRC.IsLetter bcs .9 ldy #1 sta (ZPPtr1),y .1 jsr SRC.GetCharUC beq .8 cmp #' ' beq .8 cmp #'.' beq .2 cmp #'_' beq .2 jsr SRC.IsEXPReserved bcc .8 jsr SRC.IsLetterOrDigit bcs .9 .2 iny sta (ZPPtr1),y cpy #SRC.GLABEL.MAXLEN bcc .1 if equ Carry is set .9 lda #ERR.SYNTAX.ERROR sec rts .8 tya sta (ZPPtr1) 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.GetExp.DELETE stz SRC.Exp jsr SRC.GetCharUC beq .9 ldy #0 jsr SRC.IsAMReserved bcc .8 iny sta SRC.Exp+1 .1 jsr SRC.GetCharUC beq .89 cmp #' ' beq .89 jsr SRC.IsAMReserved bcc .8 iny sta SRC.Exp,y bra .1 .8 dec SRC.BufPtr .89 sty SRC.Exp clc rts .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 iny sta SRC.Buffer,y bra .1 .2 sty SRC.Buffer clc rts .9 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.IsEXPReserved ldx SRC.EXP.RESERVED .1 cmp SRC.EXP.RESERVED,x beq .8 dex bne .1 sec rts .8 clc 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 rts cc if ok, cs if not .1 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.GetCharNB jsr SRC.GetCharUC beq .9 cmp #' ' beq SRC.GetCharNB .9 rts *--------------------------------------- SRC.GetCharUC jsr SRC.GetChar beq .9 cmp #'a' bcc .9 cmp #'z'+1 bcs .9 eor #$20 to Uppercase .9 rts *--------------------------------------- SRC.GetChar ldx SRC.BufPtr lda TmpBuffer256,x beq .9 inc SRC.BufPtr if 255, will make Z and #$7f Make sure NZ .9 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 BIN/ASM.S.SRC LOAD BIN/ASM.S ASM