Compucolor.org – Virtual Media

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

;	TITLE	TINY-C VERSION 80-01-03, NOVEMBER 1980
;
;	REQUIRED ROUTINES:
;
	EXTRN	ASGN
	EXTRN	CHRDY,INCH,OUTCH
	EXTRN	CMPHD
	EXTRN	CNTCH
	EXTRN	FCLOSE,FOPEN,FREAD,FWRITE
	EXTRN	HLNEG
	EXTRN	KBINT
	EXTRN	LOADER
	EXTRN	LIT,LITX
	EXTRN	MCESET
	EXTRN	MOVE
	EXTRN	NEWFUN,NEWVAR
	EXTRN	PN,PX
	EXTRN	PUSHK
	EXTRN	PZERO
	EXTRN	QUIT
	EXTRN	REM
	EXTRN	SCANN
	EXTRN	SKIP,SKIPST
	EXTRN	SYMNAME
	EXTRN	TOPTOI
	EXTRN	VALLOC
;
;	REQUIRED VARIABLES:
;
	EXTRN	BFUN,EFUN,BPR,EPR,BVAR,EVAR
	EXTRN	BSTACK,ESTACK,MSTACK
	EXTRN	KBRPTR

; ERROR CODES

STATER	EQU	1
CURSER	EQU	2
SYMER	EQU	3
RPARER	EQU	5
RANGER	EQU	6
CLASER	EQU	7
SYNXER	EQU	9
LVALER	EQU	14
PUSHER	EQU	16
TMFUER	EQU	17
TMVRER	EQU	18
TMVLER	EQU	19
LNKER	EQU	20
ARGSER	EQU	21
LBRCER	EQU	22
MCER	EQU	24
SYMERA	EQU	26
KILL	EQU	99

VLEN	EQU	3		;ALLOCATION LENGTH OF SYMBOLS
CR	EQU	13		;CARRIAGE RETURN
LF	EQU	10		;LINE-FEED
ERS	EQU	11		;ERASE-LINE (VT)
FF	EQU	12		;ERASE-PAGE (FORM-FEED)
ASCRET	EQU	CR		;END-OF-LINE CHARACTER

HOTVEC	EQU	81BFH	;ESC ^ (USER)
KBVEC	EQU	81C5H
KBDFL	EQU	81DFH

; * ENTRY POINTS

TINYC:	JMP	COLD
	JMP	WARM
	JMP	HOT

; TAILORING VECTOR

	PUBLIC	ECHO

ECHO:	DB	1	; 0==SUPPRESSES ECHOING
	JMP	INCH	; * I/O VECTORS *
	JMP	OUTCH
	JMP	CHRDY
	JMP	FOPEN
	JMP	FREAD
	JMP	FWRITE
	JMP	FCLOSE
	JMP	MCESET

	ENTRY	PRBEGIN

PRBEGIN:NOP
	NOP
	RET

	ENTRY	STBEGIN

STBEGIN:NOP
	NOP
	RET

	ENTRY	PRDONE

PRDONE:	NOP
	NOP
	RET

; MC TOOLS

	PUBLIC MCARGS,ESCAPE

XMCESET:JMP	MCESET
XTOPTOI:JMP	TOPTOI
XPUSHK:	JMP	PUSHK
MCARGS:	DB	0
ESCAPE:	DB	27		; ESCAPE CHARACTER

; STANDARD CELLS

	PUBLIC ERR,ERRAT,LEAVE,BRAKE,TOP,NXTVAR
	PUBLIC CURFUN,CURGLBL,FNAME,LNAME,STCURS,CURSOR
	PUBLIC PRUSED,PROGEND,APPLVL

ERR:	DW	0
ERRAT:	DW	0
LEAVE:	DB	0
BRAKE:	DB	0
TOP:	DW	0
NXTVAR:	DW	0
CURFUN:	DW	0
CURGLBL:DW	0
FNAME:	DW	0
LNAME:	DW	0
STCURS:	DW	0
CURSOR:	DW	0
PRUSED:	DW	0
PROGEND:DW	0
APPLVL:	DB	0

; LITERALS

	PUBLIC XIF,XELS,XINT,XCHAR,XWHI,XRET,XBRK,XENDL

BALPHS	EQU	$	; BEGIN ALPHABETICS
XIF:	DB	'IF',0
XELS:	DB	'ELSE',0
XINT:	DB	'INT',0
XCHAR:	DB	'CHAR',0
XWHI:	DB	'WHILE',0
XRET:	DB	'RETURN',0
XBRK:	DB	'BREAK',0
XENDL:	DB	'ENDLIBRARY',0
	DB	0FFH	; END OF ALPHABETICS

	PUBLIC LB,RB,LPAR,RPAR,COMMA,NEWLINE,CMNT
	PUBLIC XSTAR,SEMI,XPCNT,XSLASH,XPLUS,XMINUS

LB:	DB	'[',0
RB:	DB	']',0
LPAR:	DB	'(',0
RPAR:	DB	')',0
COMMA:	DB	',',0
NEWLINE:DB	CR,0
CMNT:	DB	'/'
XSTAR:	DB	'*',0
SEMI:	DB	';',0
XPCNT:	DB	'%',0
XSLASH:	DB	'/',0
XPLUS:	DB	'+',0
XMINUS:	DB	'-',0

	PUBLIC XLT,XGT,NOTEQ,EQEQ,XEQ,XGE,XLE,XNL

XLT:	DB	'<',0
XGT:	DB	'>',0
NOTEQ:	DB	'!=',0
EQEQ:	DB	'='
XEQ:	DB	'=',0
XGE:	DB	'>=',0
XLE:	DB	'<=',0
XNL:	DB	ASCRET,0

; ESET SETS ERR UNLESS ONE IS ALREADY SET

	ENTRY	ESET

ESET:	LDA	ERR
	XTHL
	ORA	A
	JZ	ES2
	INX	H
	XTHL
	RET

ES2:	MOV	A,M
	INX	H
	XTHL
	STA	ERR
	LHLD	CURSOR
	SHLD	ERRAT
	RET

; @@@@ TINY - C INTERPRETER @@@@

; ST INTERPRETS A POSSIBLY COMPOUND STATEMENT

	ENTRY	ST

ST:	CALL	QUIT
	LDA	ERR
	ORA	A
	RNZ
	CALL	REM
	CALL	STBEGIN
ST2:	LHLD	CURSOR
	SHLD	STCURS
	CALL	DECL
	JNZ	REM
	LXI	D,LB
	CALL	LIT
	JZ	TIF
	CALL	REM
CMPND:	LDA	ERR
	MOV	B,A
	LDA	LEAVE
	ORA	B
	MOV	B,A
	LDA	BRAKE
	ORA	B
	RNZ
	LXI	D,RB
	CALL	LIT
	JNZ	REM
	CALL	ST
	JMP	CMPND

TIF:	LXI	D,XIF
	CALL	LITX				;RSS04
	JZ	TWHI
	LXI	D,LPAR
	CALL	LIT
	CALL	ASGN
	RZ
	LXI	D,RPAR
	CALL	LIT
	CALL	TOPTOI
	MOV	A,D
	ORA	E
	JZ	IF2
	CALL	ST
	LXI	D,XELS
	CALL	LIT
	CNZ	SKIPST
	RET

IF2:	CALL	SKIPST
	LXI	D,XELS
	CALL	LIT
	CNZ	ST
	RET

TWHI:	LXI	D,XWHI
	CALL	LITX				;RSS04
	JZ	TSEM
	LXI	D,LPAR
	CALL	LIT
	CALL	ASGN
	RZ
	LXI	D,RPAR
	CALL	LIT
	CALL	TOPTOI
	MOV	A,D
	ORA	E
	JZ	WH2
	LHLD	STCURS
	PUSH	H
	LHLD	CURSOR
	PUSH	H
	CALL	ST
	POP	H
	SHLD	OBJT
	POP	H
	SHLD	AGIN
	LDA	BRAKE
	ORA	A
	JZ	WH3
	LHLD	OBJT
	SHLD	CURSOR
	CALL	SKIPST
	XRA	A
	STA	BRAKE
	RET

WH3:	LHLD	AGIN
	SHLD	CURSOR
	RET

WH2:	CALL	SKIPST
	RET

TSEM:	LXI	D,SEMI
	CALL	LITX				;RSS04
	JNZ	REM
TRET:	LXI	D,XRET
	CALL	LITX				;RSS04
	JZ	TBRK
	LXI	D,SEMI
	CALL	LIT
	JNZ	TR2
	LXI	D,XNL
	CALL	LITX				;RSS04
	JNZ	TR2
	CALL	ASGN
	JMP	TR4
TR2:	CALL	PZERO
TR4:	MVI	A,1
	STA	LEAVE
	RET

TBRK:	LXI	D,XBRK
	CALL	LITX				;RSS04
	JZ	TASG
	MVI	A,1
	STA	BRAKE
	RET

TASG:	CALL	ASGN
	JZ	STER
	CALL	TOPTOI
	LXI	D,SEMI
	CALL	LIT
	JMP	REM

STER:	CALL	ESET
	DB	STATER
	RET

OBJT:	DW	0
AGIN:	DW	0

; DECL TEST FOR AND INTERPRETS DECLARATIONS

	ENTRY	DECL

DECL:	LXI	D,XCHAR
	CALL	LIT
	JZ	TINT
CH2:	MVI	A,'C'
	LXI	H,0
	CALL	VALLOC
	LXI	D,COMMA
	CALL	LIT
	JNZ	CH2
CH3:	LXI	D,SEMI
	CALL	LIT
	MVI	A,07FH
	ORA	A
	RET

TINT:	LXI	D,XINT
	CALL	LITX				;RSS04
	RZ
IN2:	MVI	A,'I'
	LXI	H,0
	CALL	VALLOC
	LXI	D,COMMA
	CALL	LIT
	JNZ	IN2
	JMP	CH3

; SCANS PROGRAM AND ALLOCATE ALL EXT. IN NEXT FCTN LAYER.

	ENTRY	LINK

LINK:	CALL	NEWFUN
LI2:	LDA	ERR
	ORA	A
	RNZ
	LHLD	CURSOR
	INX	H
	INX	H
	XCHG
	LHLD	PROGEND
	DAD	D
	XCHG
	RC
	CALL	REM
	LXI	D,LB
	CALL	LIT
	JZ	LIDCL
	MVI	B,'['
	MVI	C,']'
	CALL	SKIP
	JMP	LI2

LIDCL:	CALL	DECL
	JNZ	LI2
	LXI	D,XENDL
	CALL	LIT
	JZ	LISYM
	CALL	NEWFUN
	JMP	LI2

LISYM:	CALL	SYMNAME
	JZ	LIERR
	MVI	A,'E'
	MVI	B,2
	MVI	E,1
	MVI	D,0
	LHLD	CURSOR
	CALL	NEWVAR
	LHLD	CURSOR
	MVI	A,'['
LI3:	CMP	M
	JZ	LI4
	INX	H
	XCHG
	LHLD	PROGEND
	DAD	D
	XCHG
	JNC	LI3
	CALL	ESET
	DB	LBRCER
	RET

LI4:	SHLD	CURSOR
	CALL	SKIPST
	JMP	LI2

LIERR:	CALL	ESET
	DB	LNKER
	RET

; @@@@ IT ALL STARTS HERE @@@@

	PUBLIC	FCSSP

FCSSP:	DW	0	; ORIGINAL SP		;RSS01

COLD:	LDA	FCSSP+1	; OLD STACK SET?	;RSS01
	ORA	A				;RSS01
	JNZ	CL1				;RSS01
	LXI	H,0				;RSS01
	DAD	SP				;RSS01
	SHLD	FCSSP				;RSS01
CL1:	LHLD	MSTACK
	SPHL
CL2:	LXI	B,-10
	LHLD	BPR
	XCHG
	LXI	H,INST
	CALL	MOVE
	LHLD	BPR
	LXI	D,9
	DAD	D
	CALL	HLNEG
	SHLD	PROGEND
CL3:	MVI	A,0C3H				;RSS01
	STA	HOTVEC				;RSS01
	LXI	H,HOTSTRT			;RSS01
	SHLD	HOTVEC+1			;RSS01
	STA	KBVEC				;RSS01
	LXI	H,KBINT				;RSS01
	SHLD	KBVEC+1				;RSS01
	MVI	A,31				;RSS01
	STA	KBDFL				;RSS01
	LXI	H,0				;RSS01
	SHLD	KBRPTR				;RSS01
	CALL	LOGO
WARM:	CALL	LOADER
HOT:	CALL	LOGO
	LHLD	PROGEND
	CALL	HLNEG
	SHLD	PRUSED
	LHLD	BPR
	SHLD	CURSOR
	LHLD	BFUN
	LXI	D,6
	DAD	D
	SHLD	CURGLBL
	LXI	D,-12
	DAD	D
	SHLD	CURFUN
	LHLD	BVAR
	SHLD	NXTVAR
	LHLD	BSTACK
	LXI	D,-5
	DAD	D
	SHLD	TOP
	XRA	A
	MOV	H,A
	MOV	L,A
	STA	ERR
	SHLD	ERRAT
	STA	LEAVE
	STA	BRAKE
	CALL	LINK
	CALL	NEWFUN
	LHLD	BPR
	SHLD	CURSOR
	CALL	PRBEGIN
	CALL	ST	; THIS EXECUTES THE SYSTEM PROGRAM
	CALL	PRDONE
	LDA	ERR				;RSS01
	ORA	A				;RSS01
	JNZ	DONERR				;RSS01
	CALL	PX				;RSS01
	DB	LF,ERS,'DONE',CR,LF,0		;RSS01
	JMP	WARM				;RSS01
						;RSS01
DONERR:	CALL	PX				;RSS01
	DB	LF,ERS,'ERROR ',0		;RSS01
	LHLD	ERR				;RSS01
	XCHG					;RSS01
	CALL	PN				;RSS01
	CALL	PX				;RSS01
	DB	' ON LINE ',0			;RSS01
	LHLD	BPR				;RSS01
	XCHG					;RSS01
	LHLD	ERRAT				;RSS01
	MVI	A,ASCRET			;RSS01
	PUSH	H				;RSS01
	PUSH	D				;RSS01
	CALL	CNTCH				;RSS01
	PUSH	B				;RSS01
	MOV	E,C				;RSS01
	MOV	D,B				;RSS01
	INX	D				;RSS01
	CALL	PN				;RSS01
	CALL	PX				;RSS01
	DB	LF,ERS,0			;RSS01
	POP	B				;RSS01
	POP	D				;RSS01
	POP	H				;RSS01
	MVI	A,ASCRET			;RSS01
	CALL	SCANN				;RSS01
	MOV	B,A				;RSS01
DONE1:	INX	D				;RSS01
	CALL	CMPHD				;RSS01
	JNZ	DONE2				;RSS01
	CALL	PX				;RSS01
	DB	21,31,'`',15,18,0		;RSS01
DONE2:	LDAX	D				;RSS01
	ORA	A				;RSS01
	JNZ	DONE3				;RSS01
	MVI	A,'"'				;RSS01
DONE3:	CALL	OUTCH				;RSS01
	CMP	B				;RSS01
	JNZ	DONE1				;RSS01
	JMP	WARM

INST:	DB	'[MAIN();]',0

; PRINT THE COPYRIGHT MESSAGE ON THE TERMINAL.

LOGO:	CALL	PX				;RSS01
CPMSG:	DB	LF,11,'TINY-C V3.0',CR,LF,0
	RET					;RSS01

HOTSTRT:LHLD	MSTACK	; HOT START ADDITION
	SPHL
	JMP	CL3

	END	TINYC