Compucolor.org – Virtual Media

Listing of file='LEX.MAC;01' on disk='vmedia/tiny_c_v3.0-sector.ccvf'

; @@@@ SCAN TOOLS @@@@

LF	EQU	10
CURSER	EQU	2

ASCRET	EQU	13

	EXTRN	CMNT,NEWLINE
	EXTRN	LB,LPAR
	EXTRN	XELS,XIF,XWHI
	EXTRN	CURSOR,FNAME,LNAME,PROGEND
	EXTRN	DENEG,ESET

	ENTRY	LITX

LITX:	LHLD	CURSOR				;RSS04
	JMP	LIT4				;RSS04

	ENTRY	LIT

LIT:	CALL	BLANKS				;RSS01
LIT4:	LDAX	D
	ORA	A
	JZ	MATCH
	CMP	M
	INX	D
	INX	H
	JZ	LIT4
	XRA	A
	ORA	A
	RET

MATCH:	SHLD	CURSOR
	CMA
	ORA	A
	RET

; ADVANCES CURSOR OVER BLANKS. PUTS CURSOR IN HL

	ENTRY	BLANKS

BLANKS:	LHLD	CURSOR
LOOP:	MOV	A,M				;RSS01
	INX	H				;RSS01
	CPI	' '				;RSS01
	JZ	LOOP				;RSS01
	CPI	'	'			;RSS01
	JZ	LOOP				;RSS01
	DCX	H				;RSS01
	SHLD	CURSOR
	RET

; SKIPS OVER BALANCED L-R DELIMITERS, (ASSUMING THE FIRST
; 1 DELIMITER IS ALREADY MATCHED.)

	ENTRY	SKIP

SKIP:	MVI	D,1
SK2:	MOV	A,M
	CMP	B
	JZ	SKL
	CMP	C
	JNZ	SKNEXT
	DCR	D
	JNZ	SKNEXT
	INX	H
	SHLD	CURSOR
	STC
	CMC
	RET

SKL:	INR	D
SKNEXT:	INX	H
	XCHG
	PUSH	H
	LHLD	PROGEND
	DAD	D
	POP	H
	XCHG
	JNC	SK2
	CALL	ESET
	DB	CURSER
	STC
	RET

; TESTS FOR LEGAL IDENTIFIER CHARACTER

	ENTRY	ALEGAL

ALEGAL:	CPI	'_'			;RSS04
	RZ				;RSS04
	CPI	'0'
	RM
	CPI	'9'+1
	JM	YESA

; TEST IF (A) IS ALPHA. PLUS ON YES

	ENTRY	ALPHA

ALPHA:	CPI	'A'
	RM
	CPI	'Z'+1
	JM	YESA
	CPI	'a'
	RM
	CPI	'z'+1
	JM	YESA
	CMA
	ORA	A
	RET

YESA:	XRA	A
	RET

; MATCHES A VARIABLE OR FUNCTION NAME. SETS FNAME.

	ENTRY	SYMNAME

SYMNAME:CALL	BLANKS
	SHLD	FNAME
	MOV	A,M
	CALL	ALPHA
	JM	SY3
SY2:	INX	H
	MOV	A,M
	CALL	ALEGAL			;RSS04
	JP	SY2
	SHLD	CURSOR
	DCX	H
	SHLD	LNAME
	RET

SY3:	XRA	A
	RET

; MATCHES 3 KINDS OF CONSTANTS, SETTING FNAME

	ENTRY	CONST

CONST:	CALL	BLANKS
	MOV	A,M
	CPI	'+'
	JZ	CN2
	CPI	'-'
	JZ	CN2
	CPI	'0'
	JM	CN3
	CPI	'9'+1
	JP	CN3
CN2:	SHLD	FNAME
CN4:	INX	H
	MOV	A,M
	CPI	'0'
	JM	CN5
	CPI	'9'+1
	JM	CN4
CN5:	SHLD	CURSOR
	DCX	H
	SHLD	LNAME
	MVI	A,1
	RET

CN3:	CPI	'"'
	JNZ	CN6
	INX	H
	SHLD	FNAME
CN7:	MOV	A,M
	ORA	A
	JZ	CN8
	SBI	'"'
	JZ	CN8
	INX	H
	XCHG
	LHLD	PROGEND
	DAD	D
	XCHG
	JNC	CN7
	JMP	CNERR

CN8:	MOV	M,A
	DCX	H
	SHLD	LNAME
	MVI	A,2
	ORA	A
	INX	H
	INX	H
	SHLD	CURSOR
	RET

CN6:	CPI	27H
	JNZ	CN9
	INX	H
	SHLD	FNAME
CN12:	MOV	A,M
	CPI	27H
	JZ	CN11
	INX	H
	XCHG
	LHLD	PROGEND
	DAD	D
	XCHG
	JNC	CN12
	JMP	CNERR

CN11:	MVI	A,3
	ORA	A
	INX	H
	SHLD	CURSOR
	RET

CN9:	XRA	A
	RET

CNERR:	CALL	ESET
	DB	CURSER
	RET

; SKIPS OVER REMARKS AND/OR END-OF-LINES IN ANY ORDER

	ENTRY	REM

REM:	LXI	D,NEWLINE
	CALL	LIT
	JZ	RE2
RE3:	MOV	A,M
	CPI	LF
	JNZ	REM
	INX	H
	SHLD	CURSOR
	JMP	REM

RE2:	LXI	D,CMNT
	CALL	LITX				;RSS04
	RZ
	MVI	B,1
	MVI	C,ASCRET
	CALL	SKIP
	RC
	JMP	RE3

; HL POINT TO START OF DIGIT STRING

	ENTRY	ATON

ATON:	XCHG
	LXI	H,0
AN2:	LDAX	D
	SUI	48
	JC	AN3
	CPI	10
	JNC	AN3
	MOV	B,H
	MOV	C,L
	DAD	H
	DAD	H
	DAD	B
	DAD	H
	MOV	C,A
	MVI	B,0
	DAD	B
	INX	D
	JMP	AN2

AN3:	XCHG
	RET

; HL POINTS TO BEGINNING OF ASCII INTEGER

	ENTRY	ATOI

ATOI:	XRA	A
	STA	AISGN
AI6:	MOV	A,M
	CPI	' '
	JNZ	AI2
	INX	H
	JMP	AI6

AI2:	CPI	'-'
	JNZ	AI3
	STA	AISGN
	INX	H
AI3:	CPI	'+'
	JNZ	AI4
	INX	H
AI4:	CALL	ATON
	LDA	AISGN
	ORA	A
	RZ
	JMP	DENEG

AISGN:	DB	0

; SKIPST SKIPS OVER A (POSSIBLY COMPOUND) STATEMENT

	ENTRY	SKIPST

SKIPST:	CALL	REM
	LXI	D,LB
	CALL	LIT
	JZ	SS2
	MVI	B,'['
	MVI	C,']'
	CALL	SKIP
	JMP	REM

SS2:	LXI	D,XIF
	CALL	LITX				;RSS04
	JNZ	SS6
	LXI	D,XWHI
	CALL	LITX				;RSS04
SS7:	JZ	SS3
SS6:	LXI	D,LPAR
	CALL	LIT
	MVI	B,'('
	MVI	C,')'
	CALL	SKIP
	CALL	SKIPST
	LXI	D,XELS
	CALL	LIT
	CNZ	SKIPST
	JMP	REM

SS3:	LHLD	CURSOR
SS4:	MOV	A,M
	CPI	ASCRET
	JZ	SS8
	CPI	']'
	JZ	SS8
	CPI	';'
	JZ	SS5
	INX	H
	XCHG
	LHLD	PROGEND
	DAD	D
	XCHG
	JNC	SS4
	JMP	REM

SS5:	INX	H
SS8:	SHLD	CURSOR
	JMP	REM

	END