NEW AUTO 3,1 .LIST OFF *-------------------------------------- EXP.GET jsr CORE.ArgV.Next bne .1 >LDYA ZPArgVBufPrev no op, return text value clc rts .1 >LDYA ZPArgVBufPrev >SYSCALL AToL bcs .99 >PULLL M32.ACC .2 >LDYA L.EXP.OP.MATH + - .... ? jsr CORE.LookupArgVBuf bcs .9 txa >STA.G CORE.Operator jsr M32.ACC2ARG jsr CORE.ArgV.Next get next argument in ACC beq .9 >LDYA ZPArgVBufPtr >SYSCALL AToL bcs .9 >PULLL M32.ACC jsr EXP.GET.OP .99 bcs .9 jsr CORE.ArgV.Next another op ? bne .2 .8 >PUSHL M32.ACC >PUSHBI 4 >PUSHW L.M32.Printf >LEA.G M32.BUF >SYSCALL sprintf bcs .9 >LEA.G M32.BUF rts .9 lda #E.ESYN sec rts EXP.GET.OP >LDA.G CORE.Operator asl tax jmp (J.EXP.OP.MATH,x) *-------------------------------------- EXP.TEST lda (ZPArgVBufPtr) beq .9 lda #$80 >STA.G CORE.TestOp No Op .10 >LDYA L.EXP.BEGIN jsr CORE.LookupArgVBuf bcs .9 dex 0=[ or 1=![ , $ff or 0 txa asl in C php >LDA.G CORE.Test get parent asl discard true/false plp get new ror set ctx and parent >STA.G CORE.Test jsr CORE.ArgV.Next beq .9 >LDYA L.EXP.OP.UNARY -d -e -f -n -z ? jsr CORE.LookupArgVBuf bcs .1 txa >STA.G CORE.Operator jsr EXP.TEST.UNARY bcs .9 >EOR.G CORE.Test sta (pData),y lda (ZPArgVBufPtr) bra .8 go check ] .9 lda #E.ESYN sec .99 rts .1 jsr CORE.ArgV.Next beq .9 >LDYA L.EXP.OP.BINARY -eq -ne .... ? jsr CORE.LookupArgVBuf bcs .9 txa >STA.G CORE.Operator jsr EXP.TEST.BINARY bcs .9 >EOR.G CORE.Test sta (pData),y jsr CORE.ArgV.Next beq .9 .8 cmp #']' bne .9 ldy #1 lda (ZPArgVBufPtr),y bne .9 jsr CORE.ArgV.Next beq .80 >LDYA L.EXP.OP.LOGIC jsr CORE.LookupArgVBuf bcs .9 txa 0 = AND, 1 = OR >STA.G CORE.TestOp txa beq .84 >lda.G CORE.Test OR : prev test is true, exit bmi .88 bra .85 .84 >lda.G CORE.Test AND : prev test is false, exit bpl .88 .85 >LDA.G CORE.Test >STA.G CORE.TestArg jsr CORE.ArgV.Next beq .9 jmp .10 .80 >LDA.G CORE.TestOp bne .88 NONE, or OR : exit with last result >LDA.G CORE.TestArg AND : stop if false >AND.G CORE.Test >STA.G CORE.Test .88 clc rts *-------------------------------------- EXP.TEST.UNARY jsr CORE.ArgV.Next beq EXP.OP.UNARY.ESYN we need one arg or ] >LDA.G CORE.Operator asl tax jmp (J.EXP.OP.UNARY,x) EXP.OP.UNARY.ESYN lda #E.ESYN sec rts EXP.OP.UNARY.D jsr EXP.OP.UNARY.STAT bcs EXP.OP.UNARY.DEF.9 >LDA.G StatBuf+S.STAT.P.TYPE cmp #S.FI.T.DIR bne EXP.OP.UNARY.DEF.9 bra EXP.OP.UNARY.DEF.8 EXP.OP.UNARY.E jsr EXP.OP.UNARY.STAT bcs EXP.OP.UNARY.DEF.9 bra EXP.OP.UNARY.DEF.8 DIR or FILE exist EXP.OP.UNARY.F jsr EXP.OP.UNARY.STAT bcs EXP.OP.UNARY.DEF.9 >LDA.G StatBuf+S.STAT.P.TYPE cmp #S.FI.T.DIR beq EXP.OP.UNARY.DEF.9 bra EXP.OP.UNARY.DEF.8 EXP.OP.UNARY.STAT >PUSHEA.G StatBuf >LDYA ZPArgVBufPtr >SYSCALL STAT php jsr CORE.ArgV.Next plp rts EXP.OP.UNARY.DEF.8 lda #$80 true clc rts EXP.OP.UNARY.DEF.9 lda #0 false clc rts *-------------------------------------- EXP.OP.UNARY.N lda (ZPArgVBufPtr) [ -N ] ? cmp #']' beq EXP.OP.UNARY.DEF.9 FALSE jsr CORE.ArgV.Next beq EXP.OP.UNARY.ESYN bra EXP.OP.UNARY.DEF.8 arg is not empty TRUE EXP.OP.UNARY.Z lda (ZPArgVBufPtr) [ -Z ] ? cmp #']' beq EXP.OP.UNARY.DEF.8 TRUE jsr CORE.ArgV.Next beq EXP.OP.UNARY.ESYN bra EXP.OP.UNARY.DEF.9 FALSE *-------------------------------------- EXP.TEST.BINARY >LDA.G CORE.Operator cmp #6 =, !=, <= <, >=, > bcs EXP.TEST.BINARY.NUM >LDYA ZPArgVBufPrev >STYA ZPPtr1 jsr CORE.ArgV.Next beq EXP.TEST.BINARY.ESYN >PUSHW ZPPtr1 >LDYA ZPArgVBufPtr >SYSCALL strcmp bcs .1 CS if != lda #%010 010 str1 = str2 bra EXP.TEST.BINARY.END .1 asl CS if < bcs .2 lda #%100 010 str1 < str2 bra EXP.TEST.BINARY.END .2 lda #%001 010 str1 > str2 bra EXP.TEST.BINARY.END EXP.TEST.BINARY.ESYN lda #E.ESYN sec rts *-------------------------------------- EXP.TEST.BINARY.NUM >LDYA ZPArgVBufPrev >SYSCALL AToL bcs EXP.TEST.BINARY.ESYN >PULLL M32.ACC jsr CORE.ArgV.Next beq EXP.TEST.BINARY.ESYN >LDYA ZPArgVBufPtr >SYSCALL AToL bcs EXP.TEST.BINARY.ESYN >PULLL M32.ARG jsr M32.Cmp EXP.TEST.BINARY.END pha >LDA.G CORE.Operator tax pla and EXP.OP.BINARY.BITS,x beq .80 lda #$80 true clc rts .80 lda #0 false clc rts *-------------------------------------- MAN SAVE USR/SRC/BIN/SH.S.EXP LOAD USR/SRC/BIN/SH.S ASM