Compucolor.org – Virtual Media

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

; MACHINE CALL ROUTINE TO INTERFACE TO 8080 CODED ROUTINES

	MCER	EQU	24
	KILL	EQU	99

	EXTRN	APPLVL,ECHO,ERR,ESCAPE,MCARGS
	EXTRN	ESET,PUSHK,PONE,POPTWO,PZERO,TOPTOI

	ENTRY	MC

MC:	STA	MCARGS
	CALL	TOPTOI
	LXI	H,-1000
	DAD	D
	JC	USERMC
	MOV	A,E
	CPI	1
	JZ	MC1
	CPI	2
	JZ	MC2
	CPI	3
	JZ	MC3
	CPI	4
	JZ	MC4
	CPI	5
	JZ	MC5
	CPI	6
	JZ	MC6
	CPI	7
	JZ	MC7
	CPI	8
	JZ	MC8
	CPI	9
	JZ	MC9
	CPI	10
	JZ	MC10
	CPI	11
	JZ	MC11
	CPI	12
	JZ	MC12
	CPI	13
	JZ	MC13
	CPI	14
	JZ	MC14

	ENTRY	MCESET

MCESET:	CALL	ESET
	DB	MCER
	RET

; PUT A CHARACTER TO SCREEN

	EXTRN	OUTCH

MC1:	CALL	TOPTOI
	CALL	PUSHK
	MOV	A,E
	JMP	OUTCH

; GET A CHARACTER FROM KEYBOARD

	EXTRN	INCH

MC2:	CALL	INCH
	MOV	B,A
	LDA	APPLVL
	ORA	A
	JZ	USEIT
	LDA	ESCAPE
	CMP	B
	JNZ	USEIT
	CALL	ESET
	DB	KILL
USEIT:	LDA	ECHO
	ORA	A
	MOV	A,B
	CNZ	OUTCH
	MOV	E,A
	XRA	A
	MOV	D,A
	JMP	PUSHK

; FILE OPEN(R/W,NAME,FSIZE,UNIT)

	EXTRN	FOPEN

MC3:	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	MOV	A,E
	ORA	D
	POP	H
	POP	D
	POP	B
	CALL	FOPEN
MC3A:	LXI	D,0
	MOV	E,A
	JMP	PUSHK

; READ BLOCK(WHERE2,UNIT)

	EXTRN	FREAD

MC4:	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	XCHG
	POP	B
	CALL	FREAD
MC4A:	JZ	MC4P				;RSS02
	LXI	D,-1
	MOV	E,A
MC4P:	JMP	PUSHK

; WRITE BLOCK(1ST BYTE,LAST BYTE,UNIT)

	EXTRN	FWRITE

MC5:	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	XCHG
	POP	D
	POP	B
	CALL	FWRITE
	JMP	MC3A				;RSS04

; CLOSE FILE(UNIT)

	EXTRN	FCLOSE,PZERO

MC6:	CALL	TOPTOI
	MOV	C,E
	MOV	B,D
	CALL	FCLOSE
	JMP	PZERO

; MOVE A BLOCK UP OR DOWN(FIRST,LAST,K)

	EXTRN	MOVEBL

MC7:	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	POP	H
	POP	B
	CALL	MOVEBL
	JMP	PZERO

; COUNT # INSTANCES OF CHARACTER IN BLOCK(FIRST,LAST,CH)

	EXTRN	CNTCH

MC8:	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	POP	H
	POP	B
	MOV	A,C
	CALL	CNTCH
	MOV	E,C
	MOV	D,B
	JMP	PUSHK

; SCAN FOR NTH OCCURANCE OF CH(FIRST,LAST,CH,CNT ADDRESS)

	EXTRN	SCANN

MC9:	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	POP	H
	POP	B
	MOV	A,C
	XTHL
	MOV	C,M
	INX	H
	MOV	B,M
	DCX	H
	XTHL
	PUSH	D
	CALL	SCANN
	POP	H
	MOV	A,E
	SUB	L
	MOV	E,A
	MOV	A,D
	SBB	H
	MOV	D,A
	POP	H
	MOV	M,C
	INX	H
	MOV	M,B
	JMP	PUSHK

; TRAP TO MONITOR 4.0 FOR DEBUGGING.

MC10:	DB	0FFH
	RET

; ENTERS AN APPLICATION PROGRAM.

	EXTRN	CURFUN,CURGLBL,CURSOR,ERRAT
	EXTRN	PROGEND,PRUSED
	EXTRN	FUNDONE,HLNEG,LINK,NEWFUN,PRBEGIN,PRDONE,ST

MC11:	LHLD	CURSOR
	PUSH	H
	LHLD	PROGEND
	PUSH	H
	LHLD	PRUSED
	PUSH	H
	LHLD	CURGLBL
	PUSH	H
	CALL	TOPTOI
	XCHG
	PUSH	H
	SHLD	CURSOR
	CALL	TOPTOI
	XCHG
	SHLD	PRUSED
	CALL	HLNEG
	SHLD	PROGEND
	CALL	LINK
	LHLD	CURFUN
	SHLD	CURGLBL
	CALL	TOPTOI
	XCHG
	SHLD	CURSOR
	CALL	NEWFUN
	CALL	TOPTOI
	PUSH	D
	LXI	H,APPLVL
	INR	M
	PUSH	H
	LDA	ERR
	ORA	A
	JNZ	DONE
	CALL	PRBEGIN
	CALL	ST
	CALL	PRDONE
DONE:	POP	H
	DCR	M
	CALL	FUNDONE
	CALL	FUNDONE
	LHLD	CURSOR
	LDA	ERR
	ORA	A
	JZ	MCEN2
	LHLD	ERRAT
MCEN2:	XCHG
	POP	H
	POP	B
	MOV	A,E
	SUB	C
	MOV	E,A
	MOV	A,D
	SBB	B
	MOV	D,A
	LDA	ERR
	MOV	M,A
	XRA	A
	INX	H
	MOV	M,A
	INX	H
	MOV	M,E
	INX	H
	MOV	M,D
	POP	H
	SHLD	CURGLBL
	POP	H
	SHLD	PRUSED
	POP	H
	SHLD	PROGEND
	POP	H
	SHLD	CURSOR
	XRA	A
	STA	ERR
	JMP	PZERO

; TEST IF KEYBOARD CHAR READY

	EXTRN	CHRDY

MC12:	CALL	CHRDY
	MVI	D,0
	MOV	E,A
	JMP	PUSHK

; PRINT RAM, FROM AND TO ADDRESSES

MC13:	CALL	TOPTOI
	PUSH	D
	CALL	TOPTOI
	XCHG
	POP	D
LOOP13:	MOV	A,E
	SUB	L
	MOV	A,D
	SBB	H
	JC	PZERO
	MOV	A,M
	ORA	A
	JNZ	EC13
	MVI	A,'"'
EC13:	CALL	OUTCH
	INX	H
	JMP	LOOP13

; PRINT A SIGNED INTEGER

	EXTRN	PN

MC14:	CALL	TOPTOI
	PUSH	D
	CALL	PN
	POP	D
	JMP	PUSHK

; USER MC CALLS

USERMC:	MOV	A,L	; A:=MC#-1000
	CPI	1
	JZ	MC101
	CPI	2
	JZ	MC102
	CPI	3
	JZ	MC103
	CPI	4
	JZ	MC104
	CPI	5
	JZ	MC105
	CPI	6
	JZ	MC106
	JMP	MCESET

; OUTPUT(PORT#,VALUE)

MC101:	CALL	POPTWO	; GET PORT# AND VALUE
	LXI	H,MC101A+1
	MOV	M,E	; STORE PORT# IN INSTRUCTION
	MOV	A,C	; OUTPUT C TO PORT
MC101A:	OUT	0
	JMP	PZERO

; INPUT(PORT#)

MC102:	CALL	TOPTOI	; GET PORT#
	LXI	H,MC102A+1
	MOV	M,E	; STORE PORT# IN INSTRUCTION
MC102A:	IN	0	; INPUT FROM PORT
	MVI	D,0	; DE:=VALUE
	MOV	E,A
	JMP	PUSHK

; GETBYTE(UNIT)

	EXTRN	GBYTE

MC103:	CALL	TOPTOI	; BC:=UNIT#
	MOV	B,D
	MOV	C,E
	CALL	GBYTE	; READ BYTE
	JMP	MC4A

; BREAD(FIRST BYTE,LAST BYTE,BLOCK#,UNIT)

	EXTRN	BREAD,POPOFF

MC104:	CALL	POPOFF	; POP ARGUMENTS INTO BLOCKN
	CALL	BREAD	; READ BLOCKS
	JMP	MC4A

; BWRITE(FIRST BYTE,LAST BYTE,BLOCK#,UNIT)

	EXTRN	BWRITE

MC105:	CALL	POPOFF	; POP ARGUMENTS INTO BLOCKN
	CALL	BWRITE	; WRITE BLOCKS
	JMP	MC4A

; FPBADR(UNIT)

	EXTRN	FADDR

MC106:	CALL	TOPTOI	; * GET FPB ADDRESS *
	MOV	B,D
	MOV	C,E
	CALL	FADDR	; GET ADDRESS
	XCHG
	JMP	PUSHK

	END