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 cpx #' ' no label...go scan dir/opcode beq .4 .1 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.Label.Flags beq .1 jsr SYM.Add bcs SRC.ParseLine.Err .1 SRC.ParseLine.skip clc rts SRC.ParseLine.Err1 lda #ERR.INVALID.LABEL SRC.ParseLine.Err sec rts *--------------------------------------- SRC.ParseLine.SymP jsr SRC.GetChar beq SRC.ParseLine.SymE jsr SRC.GetDecimal bcs SRC.ParseLine.SymR jmp SYM.AddPrivate *--------------------------------------- SRC.ParseLine.SymL jsr SRC.GetChar beq SRC.ParseLine.SymE jsr SRC.GetDecimal bcs SRC.ParseLine.SymR jmp SYM.AddLocal *--------------------------------------- SRC.ParseLine.SymG jsr SYM.ClearLocal jsr SRC.GetLabel bcs SRC.ParseLine.SymE 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 clc rts SRC.ParseLine.SymE lda #ERR.INVALID.LABEL sec SRC.ParseLine.SymR 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 lda (ZPPtr1),y clc adc ZPPtr1 sta ZPPtr2 iny lda (ZPPtr1),y adc ZPPtr1+1 sta ZPPtr2+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 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 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 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.GetHex stz SRC.ACC+1 stz SRC.ACC+2 stz SRC.ACC+3 jsr SRC.GetChar beq .99 jsr SRC.IsDigit16 bcs .99 and #$0F sta SRC.ACC .1 jsr SRC.GetChar beq .8 cmp #' ' beq .8 jsr SRC.IsDigit16 bcs .99 asl asl asl asl ldx #4 .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 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 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.IsDigit16 jsr SRC.IsDigit10 bcc .8 cmp #'A' bcc .9 cmp #'G' bcc .1 rts cc if ok, cs if not .1 sbc #'A'-10 cc so A->10 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.GetCharNB jsr SRC.GetCharUC 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 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 #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