NEW AUTO 3,1 *--------------------------------------- DIR.Reset lda #$ff >STA.G ASM.LI.ON iny #ASM.LI.CON sta (pData),y iny #ASM.LI.MON sta (pData),y iny #ASM.LI.XON sta (pData),y >STA.G MAC.StkPtr rts *--------------------------------------- DIR.AC clc rts *--------------------------------------- DIR.AT sec .HS 90 BCC *--------------------------------------- DIR.AS clc lda #0 ror sta DIR.Byte Save b7 of last char in string jsr SRC.GetNextChar bcs .9 cmp #'-' bne .1 lda #$40 save b7 status of ALL chars tsb DIR.Byte jsr SRC.GetNextChar bcs .9 .1 sta DIR.Word Save delimiter.... sta DIR.Word+1 Save also in prev char.. .2 jsr SRC.GetNextChar bcs .8 cmp DIR.Word delimiter ? beq .8 ldx DIR.Word+1 Get prev char sta DIR.Word+1 replace it with new txa cmp DIR.Word is it the starting delimiter beq .2 yes, skip bit DIR.Byte bvc .3 ora #$80 .3 jsr OUT.EmitByte no, emit prev char bcc .2 .9 lda #E.SYNTAX.ERROR sec rts .8 lda DIR.Word+1 Get prev char cmp DIR.Word someone typed .AS "" ? beq .88 bit DIR.Byte bpl .81 eor #$80 .81 jmp OUT.EmitByte .88 clc DIR.AS.RTS rts *--------------------------------------- DIR.AZ jsr DIR.AS bcs DIR.AS.RTS lda #0 jmp OUT.EmitByte *--------------------------------------- DIR.PS jsr SRC.GetNextChar bcs .9 sta DIR.Word Save delimiter.... ldx #$ff ldy #1 skip delimiter .1 inx lda (ZPLinePtr),y beq .9 cmp #$0D beq .9 iny cmp DIR.Word bne .1 txa jsr OUT.EmitByte emit length bcs .9 .2 jsr SRC.GetNextChar jsr OUT.EmitByte bcs .9 dex bne .2 jsr SRC.GetNextChar skip delimiter clc rts .9 lda #E.SYNTAX.ERROR sec rts *--------------------------------------- DIR.CS jsr SRC.GetNextChar bcs .9 stz DIR.Byte cmp #'-' bne .1 ror DIR.Byte save b7 status of ALL chars jsr SRC.GetNextChar bcs .9 .1 sta DIR.Word Save delimiter.... .2 jsr SRC.GetNextChar bcs .9 cmp DIR.Word delimiter ? beq .8 cmp #'\' bne .7 jsr SRC.GetNextChar bcs .9 ldx #DIR.EscChars.L-1 .3 cmp DIR.EscChars,x beq .4 dex bpl .3 bmi .9 .4 lda DIR.EscCodes,x .7 ora DIR.Byte jsr OUT.EmitByte bcc .2 .9 lda #E.SYNTAX.ERROR sec rts .8 clc DIR.CZ.RTS rts *--------------------------------------- DIR.CZ jsr DIR.CS bcs DIR.CZ.RTS lda #0 jmp OUT.EmitByte *--------------------------------------- DIR.BS jsr SRC.GetNextCharNB bcs .98 jsr EXP.ResetAcc jsr EXP.Eval bcs .9 lda SRC.ACC+3 ora SRC.ACC+2 bne .99 lda SRC.ACC eor #$ff sta DIR.Word lda SRC.ACC+1 eor #$ff sta DIR.Word+1 stz DIR.Byte jsr SRC.GetChar bcs .1 cmp #C.SPACE beq .1 cmp #',' bne .98 jsr EXP.ResetAcc jsr EXP.Eval bcs .9 lda SRC.ACC+3 ora SRC.ACC+2 ora SRC.ACC+1 bne .99 lda SRC.ACC sta DIR.Byte .1 inc DIR.Word bne .2 inc DIR.Word+1 beq .8 .2 lda DIR.Byte jsr OUT.EmitByte bcc .1 rts .8 clc .9 rts .99 lda #E.RANGE sec rts .98 lda #E.SYNTAX.ERROR sec rts *--------------------------------------- DIR.DA jsr SRC.GetNextCharNB bcs .98 .1 jsr EXP.ResetAcc jsr EXP.Eval bcs .9 ldy #0 ldx SRC.ACC.SIZE .2 lda SRC.ACC,y jsr OUT.EmitByte bcs .9 iny dex bne .2 .3 jsr SRC.GetChar bcs .8 cmp #C.SPACE beq .8 cmp #',' bne .98 jsr SRC.GetNextChar bcc .1 .98 lda #E.SYNTAX.ERROR sec .9 rts .8 clc rts *--------------------------------------- DIR.DO >LDA.G ASM.DO.StackPtr tay inc cmp #DO.MAXDEPTH bcs .98 tya beq .1 * clc adc #ASM.DO.Stack-1 tay lda (pData),y Previous DO is false? bne .1 >INC.G ASM.DO.StackPtr yes,stack FALSE * clc adc #ASM.DO.Stack-1 tay lda #0 bra .8 .1 jsr SRC.GetNextCharNB bcs .99 jsr EXP.ResetAcc jsr EXP.Eval bcs .99 >INC.G ASM.DO.StackPtr * clc adc #ASM.DO.Stack-1 tay lda SRC.ACC ora SRC.ACC+1 ora SRC.ACC+2 ora SRC.ACC+3 beq .8 lda #$ff .8 sta (pData),y clc rts .98 lda #E.TOO.MANY.DO sec .99 rts *--------------------------------------- DIR.EL >LDA.G ASM.DO.StackPtr beq .9 tax dec beq .1 no previous DO context clc adc #ASM.DO.Stack-1 tay lda (pData),y beq .8 previous is FALSE .1 txa clc adc #ASM.DO.Stack-1 tay lda (pData),y eor #$ff sta (pData),y .8 clc rts .9 lda #E.ELSE.WITHOUT.DO sec rts *--------------------------------------- DIR.EM lda #E.MACRO.INV.DEF sec rts *--------------------------------------- DIR.DU >LDA.G ASM.DU.ON bmi DIR.EP.ILLEGAL lda #$80 sta (pData),y ldy #ASM.PC.DU jmp DIR.SavePC *--------------------------------------- DIR.PH >LDA.G ASM.PH.ON bmi DIR.EP.ILLEGAL lda #$80 sta (pData),y ldy #ASM.PC.PH jsr DIR.SavePC jmp DIR.OR *--------------------------------------- DIR.ED >LDA.G ASM.DU.ON bpl DIR.EP.ILLEGAL lda #0 sta (pData),y ldy #ASM.PC.DU jmp DIR.RestorePC *--------------------------------------- DIR.EP >LDA.G ASM.PH.ON bpl .9 lda #0 sta (pData),y ldy #ASM.PC.PH jmp DIR.RestorePC .9 DIR.EP.ILLEGAL lda #E.ILLEGAL.DIR sec DIR.EP.RTS rts *--------------------------------------- DIR.SE sec .HS 90 BCC *--------------------------------------- DIR.EQ clc lda #$ff >STA.G OUT.bEquate >LDA.G SYM.BufPtr beq DIR.EP.ILLEGAL not in global symbol context eor #SYMG beq .1 bcs DIR.EP.ILLEGAL .SE not allowed in local/private bcc .10 .EQ in local, skip F update .1 ror A = 0 : CS = SYMG.F.RW ora #SYMG.F.EQU sta SRC.ACC.F .10 jsr SRC.GetNextCharNB bcs .9 jsr EXP.ResetAccV keep F jsr EXP.Eval bcs DIR.EP.RTS >LDA.G SYM.BufPtr cmp #SYMG beq .12 tay ldx #3 we are in local/private .11 lda SRC.ACC,x update value dey sta (ZPSymbolBuf),y dex bpl .11 clc rts .12 ldy #SYMG-1 .13 lda SRC.ACC.F,y sta (ZPSymbolBuf),y dey bpl .13 >LDA.G ASM.PASS bne .2 jmp SYM.StoreGlobal .2 jmp SYM.UpdateGlobal .9 lda #E.SYNTAX.ERROR sec rts *--------------------------------------- DIR.FI >LDA.G ASM.DO.StackPtr beq DIR.EP.ILLEGAL dec sta (pData),y clc rts *--------------------------------------- DIR.HS clc .HS B0 BCS DIR.HX sec ror DIR.Word jsr SRC.GetNextCharNB bcs .99 jsr SRC.IsDigit16 bcs .99 .1 sta DIR.Byte jsr SRC.GetNextChar bcc .2 jmp OUT.EmitByte .2 jsr SRC.IsDigit16 bcc .3 cmp #',' beq .22 cmp #'.' bne .99 .22 lda DIR.Byte jsr OUT.EmitByte bcc .5 rts *--------------------------------------- .3 bit DIR.Word bmi .30 asl DIR.Byte asl DIR.Byte asl DIR.Byte asl DIR.Byte bra .4 .30 asl asl asl asl .4 ora DIR.Byte jsr OUT.EmitByte bcs .9 jsr SRC.GetNextChar bcs .8 cmp #C.SPACE beq .8 jsr SRC.IsDigit16 bcc .1 cmp #',' beq .5 cmp #'.' bne .99 .5 jsr SRC.GetNextChar bcs .99 jsr SRC.IsDigit16 bcc .1 .99 lda #E.SYNTAX.ERROR sec .9 rts .8 clc rts *--------------------------------------- DIR.IN jsr SRC.GetNextCharNB bcs .9 >LDYA ZPLinePtr jmp FIO.OpenFile .9 lda #E.SYNTAX.ERROR sec rts *--------------------------------------- DIR.LI jsr SRC.GetNextChar bcs .9 >LDYA L.T.LI jsr SRC.GetKeyword bcs .9 jsr .7 jsr SRC.GetChar bcs .8 cmp #',' beq DIR.LI cmp #C.SPACE beq .8 .9 lda #E.SYNTAX.ERROR sec rts .7 jmp (J.LI,x) .8 clc rts DIR.LI.ON ldy #ASM.LI.ON sec bra DIR.LI.APPLY DIR.LI.OFF ldy #ASM.LI.ON clc bra DIR.LI.APPLY 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.MON ldy #ASM.LI.MON sec bra DIR.LI.APPLY DIR.LI.MOFF ldy #ASM.LI.MON 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 DIR.LI.APPLY lda #0 ror sta (pData),y rts *--------------------------------------- DIR.MA >LDA.G ASM.MA.ON bmi .9 >LDA.G ASM.PASS If Pass#2, ignore bne .8 jsr SRC.GetNextCharNB beq DIR.OP.SYNERR >PUSHB.G MAC.hList >PUSHW ZPLinePtr >PUSHWI 0 ScopeID >SYSCALL SListNewKey bcs .99 >STYA.G MAC.ID .8 lda #$ff >STA.G ASM.MA.ON clc rts .9 lda #E.MACRO.INV.DEF sec .99 rts *--------------------------------------- DIR.OP jsr SRC.GetNextCharNB bcs DIR.OP.SYNERR >LDYA ZPLinePtr jmp FIO.LOAD.CPU DIR.OP.SYNERR lda #E.SYNTAX.ERROR sec rts *--------------------------------------- DIR.OR jsr SRC.GetNextCharNB bcs DIR.OP.SYNERR jsr EXP.ResetAcc jsr EXP.Eval bcs .9 ldx #0 ldy #ASM.PC .1 lda SRC.ACC,x sta (pData),y iny inx cpx #4 bne .1 >LDA.G ASM.DU.ON bmi .8 >LDA.G ASM.PH.ON bmi .8 lda SRC.ACC >STA.G DST.AUXTYPE lda SRC.ACC+1 iny sta (pData),y .8 clc .9 rts *--------------------------------------- DIR.EN *--------------------------------------- DIR.PG *--------------------------------------- DIR.TI *--------------------------------------- DIR.US *--------------------------------------- DIR.TA DIR.TA.8 clc DIR.TA.RTS rts *--------------------------------------- DIR.TF >LDA.G ASM.PASS If Pass#1, ignore beq DIR.TA.8 >LDA.G ArgDstFile beq .1 >SYSCALL ArgV bra .2 .1 jsr SRC.GetNextCharNB bcs DIR.OP.SYNERR >LDYA ZPLinePtr .2 >SYSCALL StrDup bcs DIR.TA.RTS >STYA ZPPtr1 stx ZPPtr2 lda #S.FI.T.BIN sta ZPPtr2+1 ldy #$ff .3 iny lda (ZPPtr1),y beq .7 cmp #',' bne .3 lda #0 sta (ZPPtr1),y iny lda (ZPPtr1),y cmp #'T' beq .4 .30 lda #E.SYNTAX.ERROR bra .9 .4 ldx #0 .5 iny lda (ZPPtr1),y cmp DIR.SYS,x including \0 bne .30 inx cpx #4 bne .5 lda #S.FI.T.SYS sta ZPPtr2+1 .7 >PUSHW ZPPtr1 >PUSHWZ Allocate >SYSCALL RealPath bcs .9 txa >STA.G DST.hFILENAME >SYSCALL GetMemPtr >PUSHYA >PUSHBI O.WRONLY+O.CREATE >PUSHB ZPPtr2+1 Type >PUSHW.G DST.AUXTYPE >SYSCALL FOpen bcs .9 >STA.G DST.hREFNUM clc .9 php pha lda ZPPtr2 >SYSCALL FreeMem pla plp rts *--------------------------------------- DIR.SavePC phy plx ldy #ASM.PC+3 .1 lda (pData),y pha dey cpy #ASM.PC-1 bne .1 phx ply ldx #3 .2 pla sta (pData),y iny dex bpl .2 clc rts *--------------------------------------- DIR.RestorePC ldx #3 .1 lda (pData),y pha iny dex bpl .1 ldy #ASM.PC+3 ldx #3 .2 pla sta (pData),y dey dex bpl .2 clc because of JMP to it rts *--------------------------------------- MAN SAVE usr/src/bin/asm.s.dir LOAD usr/src/bin/asm.s ASM