Listing of file='EVAL.MAC;01' on disk='vmedia/tiny_c_v3.0-sector.ccvf'
; EXPRESSION ANALYSIS ; ASCRET EQU 13 ; ASGN IS THE EXPRESSION EVALUATOR. EXTRN ERR,XEQ EXTRN EQL,LIT ENTRY ASGN ASGN: CALL RELN LXI D,XEQ CALL LIT JZ A2 CALL ASGN LDA ERR ORA A CZ EQL A2: LDA ERR ORA A JZ A3 XRA A RET A3: DCR A RET ; A RELN IS AN EXPR OR A COMPARISON OF EXPRS. EXTRN EQEQ,NOTEQ,XGE,XGT,XLE,XLT EXTRN PONE,PZERO,TOPDIF EXTRN LITX ENTRY RELN RELN: CALL EXPR LXI D,XLE CALL LIT JZ R2 CALL EXPR CALL TOPDIF JZ PONE JC PONE JMP PZERO R2: LXI D,XGE CALL LITX ;RSS04 JZ R3 CALL EXPR CALL TOPDIF JZ PONE JNC PONE JMP PZERO R3: LXI D,EQEQ CALL LITX ;RSS04 JZ R4 CALL EXPR CALL TOPDIF JZ PONE JMP PZERO R4: LXI D,NOTEQ CALL LITX ;RSS04 JZ R5 CALL EXPR CALL TOPDIF JNZ PONE JMP PZERO R5: LXI D,XGT CALL LITX ;RSS04 JZ R6 CALL EXPR CALL TOPDIF JZ PZERO JC PZERO JMP PONE R6: LXI D,XLT CALL LITX ;RSS04 RZ CALL EXPR CALL TOPDIF JC PONE JMP PZERO ; AN EXPR IS A TERM OR SUM (DIFF) OF TERMS. EXTRN XMINUS,XPLUS EXTRN DADD,DSUB EXTRN POPTWO,PUSHK,TOPTOI ENTRY EXPR EXPR: LXI D,XMINUS CALL LIT JZ EX2 CALL TERM CALL TOPTOI MOV A,E CMA MOV E,A MOV A,D CMA MOV D,A INX D CALL PUSHK JMP EX3 EX2: LXI D,XPLUS CALL LITX ;RSS04 CALL TERM EX3: LDA ERR ORA A RNZ LXI D,XPLUS CALL LIT JZ EX4 CALL TERM CALL POPTWO CALL DADD CALL PUSHK JMP EX3 EX4: LXI D,XMINUS CALL LITX ;RSS04 RZ CALL TERM CALL POPTWO CALL DSUB CALL PUSHK JMP EX3 ; A TERM IS A FACTOR OR A PRODUCT OF FACTORS EXTRN XPCNT,XSLASH,XSTAR EXTRN DDIV,DMPY,DREM,REM ENTRY TERM TERM: CALL FACTOR TE2: LDA ERR ORA A RNZ LXI D,XSTAR CALL LIT JZ TE3 CALL FACTOR CALL POPTWO CALL DMPY CALL PUSHK JMP TE2 TE3: CALL REM LXI D,XSLASH CALL LIT JZ TE4 CALL FACTOR CALL POPTWO CALL DDIV CALL PUSHK JMP TE2 TE4: LXI D,XPCNT CALL LITX ;RSS04 RZ CALL FACTOR CALL POPTWO CALL DREM CALL PUSHK JMP TE2 ; A FACTOR IS A ASGN, CONST., VAR. REF. OR FUN. REF. SYMER EQU 3 RPARER EQU 5 RANGER EQU 6 CLASER EQU 7 SYNXER EQU 9 EXTRN LPAR,RPAR,FNAME,LNAME EXTRN CLASS,OBSIZE,LEN EXTRN ADRVAL EXTRN ATOI,CONST,ESET,PUSHST,SYMNAME ENTRY FACTOR FACTOR: LXI D,LPAR CALL LIT JZ FA2 CALL ASGN LXI D,RPAR CALL LIT RNZ CALL ESET DB RPARER RET FA2: CALL CONST JZ FA5 CPI 1 JNZ FA3 LHLD FNAME CALL ATOI JMP PUSHK FA3: CPI 2 JNZ FA4 MVI A,1 MVI B,'A' MVI C,1 LHLD FNAME XCHG JMP PUSHST FA4: XRA A MVI B,'A' MVI C,1 LHLD FNAME MOV E,M JMP PUSHST FA5: CALL SYMNAME JZ FA6 LHLD FNAME INX H LDA LNAME CMP L JNZ FA7 LDA LNAME+1 CMP H JNZ FA7 MOV A,M CPI 'C' JNZ FA7 DCX H MOV A,M CPI 'M' JNZ FA7 LXI H,0 JMP ENTER FA7: CALL ADRVAL SHLD FWHERE STA CLASS MOV A,B STA OBSIZE XCHG SHLD LEN MOV A,D ORA E JZ FA8 LDA CLASS CPI 'E' JZ FA9 LXI D,LPAR CALL LIT JZ FA10 LDA CLASS DCR A STA CLASS JP FA11 CALL ESET DB CLASER RET FA11: LHLD FWHERE MOV E,M INX H MOV D,M PUSH D LHLD LEN PUSH H LHLD CLASS PUSH H CALL ASGN POP H SHLD CLASS POP H SHLD LEN POP H SHLD FWHERE RZ LXI D,RPAR CALL LIT CALL TOPTOI XCHG SHLD SUBSCR XCHG LHLD LEN MOV A,L DCR A ORA H JZ FA12 LDA CLASS ORA A JNZ FA12 ORA D JM SUBERR MOV B,H MOV C,L CALL DSUB JC FA12 SUBERR: CALL ESET DB RANGER FA12: LHLD SUBSCR XCHG LHLD FWHERE LDA OBSIZE FA13: DCR A JM FA14 DAD D JMP FA13 FA14: SHLD FWHERE FA10: LDA OBSIZE MOV C,A LDA CLASS MVI B,'L' LHLD FWHERE XCHG JMP PUSHST FA9: LHLD FWHERE JMP ENTER FA8: CALL ESET DB SYMER RET FA6: CALL ESET DB SYNXER RET FWHERE: DW 0 ; LOCALS USED BY ASGN SUBSCR: DW 0 ; VALLOC PARSES ONE VARIABLE BEHIND INT OR CHAR AND MAKES ; ALLOCATION AND SYMBOL ENTRY. EXTRN NEWVAR ENTRY VALLOC VALLOC: STA TYPE SHLD VPASSED CALL SYMNAME JZ V2 XRA A STA VCLASS LXI D,LPAR CALL LIT JZ V3 LHLD FNAME PUSH H LHLD LNAME PUSH H LDA VCLASS INR A PUSH PSW CALL ASGN POP PSW STA VCLASS POP H SHLD LNAME POP H SHLD FNAME LDA ERR ORA A RNZ LXI D,RPAR CALL LIT CALL TOPTOI INX D XCHG SHLD ALEN JMP V5 V3: LXI H,1 SHLD ALEN V5: LDA TYPE MVI B,1 CPI 'C' JZ V7 INR B V7: LDA VCLASS LHLD ALEN XCHG LHLD VPASSED JMP NEWVAR V2: CALL ESET DB SYMER RET TYPE: DB 0 VPASSED:DW 0 VCLASS: DB 0 ALEN: DW 0 ; EVALUATE ARGUMENTS OF A FUNCTION. ARGSER EQU 21 EXTRN CURSOR,LEAVE,STCURS,TOP EXTRN COMMA,SEMI,XCHAR,XINT EXTRN FUNDONE,MC,NEWFUN,POPST,ST ENTRY ENTER ENTER: SHLD WHERE XRA A STA NARGS LHLD TOP LXI D,5 DAD D SHLD ARG LXI D,LPAR CALL LIT LXI D,RPAR CALL LIT JNZ ARGSDNE LHLD CURSOR MOV A,M CPI ']' JZ ARGSDNE CPI ';' JZ ARGSDNE CPI ASCRET JZ ARGSDNE CPI '/' JZ ARGSDNE EN2: LDA ERR ORA A RNZ LHLD ARG PUSH H LHLD WHERE PUSH H LHLD NARGS PUSH H CALL ASGN POP H MOV A,L POP H SHLD WHERE POP H SHLD ARG INR A STA NARGS LXI D,COMMA CALL LIT JNZ EN2 LXI D,RPAR CALL LITX ;RSS04 ARGSDNE:LDA ERR ORA A RNZ LHLD WHERE MOV A,H ORA L JNZ EN3 LDA NARGS CALL MC RET EN3: LHLD CURSOR PUSH H LHLD STCURS PUSH H LHLD WHERE SHLD CURSOR CALL NEWFUN EN4: CALL REM LXI D,XINT CALL LIT JZ EN5 EN6: LHLD ARG MVI B,'I' CALL SETARG LHLD ARG LXI D,5 DAD D SHLD ARG LXI D,COMMA CALL LIT JNZ EN6 LXI D,SEMI CALL LITX ;RSS04 JMP EN4 EN5: LXI D,XCHAR CALL LITX ;RSS04 JZ EN7 EN8: LHLD ARG MVI B,'C' CALL SETARG LHLD ARG LXI D,5 DAD D SHLD ARG LXI D,COMMA CALL LIT JNZ EN8 LXI D,SEMI CALL LITX JMP EN4 EN7: LHLD TOP LXI D,5 DAD D LDA ARG CMP L JZ EN9 POP D POP H SHLD CURSOR PUSH H PUSH D CALL ESET DB ARGSER EN9: LXI H,NARGS DCR M JM EN11 CALL POPST JMP EN9 EN11: LDA ERR ORA A CZ ST LDA LEAVE ORA A CZ PZERO XRA A STA LEAVE POP H SHLD STCURS POP H SHLD CURSOR CALL FUNDONE LHLD TOP INX H MOV A,M CPI 'A' RZ CALL TOPTOI JMP PUSHK NARGS: DB 0 WHERE: DW 0 ARG: DW 0 ; HL POINT INTO STACK TO AN ARG. B IS TYPE. ENTRY SETARG SETARG: PUSH B MOV B,M INX H MOV A,M INX H MOV C,M INX H MOV E,M INX H MOV D,M CPI 'A' JZ SE2 XCHG MOV E,M INX H MOV D,M SE2: MOV A,C DCR A ORA B JNZ SE3 MOV A,E RLC SBB A MOV D,A SE3: POP B MOV A,B XCHG JMP VALLOC END