Compucolor.org – Virtual Media

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