	TITLE M5b Z-80 MONITOR CHARACTER I/O ROM
	LIST	NOCOND
;****************************************************************************
;
;	SYSTEM MONITOR FOR M5b
;	(c) 1982,1983  GRH ELECTRONICS, CUPERTINO, CA
;
;****************************************************************************
;
;	This code module contains the system character I/O drivers and 
; resides in the same address space as the resident Monitor ROM. The ROMs
; communicate with each other through a ROM transfer function.
;
*INCLUDE ZBMH122.HDR
;****************************************************************************
;
;	Revision status:
;
; 1.0 - Release
;
; 1.22	11-22-90   GRH
;	Separate code from monitor ROM.
;	Move code to separate ROM in order to gain space for I/O drivers and
;	 interrupt code.
;	Add rom xover function as include file.
;	Add function dispatcher for execution and breakpoint entries.
;
;	1-9-91   GRH
;	Add conditional ASSY for default CON:. Add SIO driver as alternate.
;
VERSN	EQU	122
;****************************************************************************
	FORM
FALSE	EQU	0
TRUE	EQU	NOT FALSE

SERIAL	EQU	TRUE

;
;   INCLUDE SYSTEM DEFINITION FILES
;
;*MACLIB  ASMBTOOL.MLB
;*INCLUDE MONBOARD.DEF
;*INCLUDE NAKEDT.DEF
;*INCLUDE PRI.DEF
;*INCLUDE ZBMFUNS.DEF
;*INCLUDE COMIOPB2.DEF
;
	LIST	OFF
*MACLIB	 ASMBTOOL.MLB
*INCLUDE MONBOARD.DEF
*INCLUDE NAKEDT.DEF
*INCLUDE PRI.DEF
*INCLUDE ZBMFUNS.DEF
*INCLUDE COMIOPB2.DEF
	LIST	ON
*INCLUDE	ZBMG122.DEF


THIS_ROM EQU	CHR_RNUM

	SUBTTL	EXTERNAL ENTRY POINTS
	ORG	MONROM
;
	JP	CINIT		;COLD START
;
;   EXTERNAL FUNCTION ENTRY DURING INTERRUPT
;
	DS	(MONROM + 6) - $
	JP	I_STUB


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE
; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS.
;	ENTRY-	A= FUNCTION #
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
I_STUB:
	ADD	A,2		;BIAS UP
	PUSH	HL
	LD	H,MR_RNUM	;USE RESIDENT ROM
	LD	L,A
	EX	(SP),HL
	CALL	XROMF		;GO EXECUTE THE FUNCTION
	INC	SP		;BALANCE STACK
	INC	SP
	RET


;****************************************************************************
;
;	COLD INIT ONLY SWITCHES TO RESIDENT ROM
;
;****************************************************************************
;
CINIT:
;
;   SET STACK
;
	LD	SP,MONSTK
;
;   RESET ROM FUNCTION SHOULD NOT RETURN
;
	LD	HL,[MR_RNUM SHL 8] + 1	;RESET
	PUSH	HL
	CALL	XROMF
;
;   IF RETURNED THEN HALT
;
	HALT


	SUBTTL	MONITOR BOARD SHADOW ROM SELECTION PROCEDURE
*INCLUDE	XROM.Z80

	SUBTTL	MONITOR FUNCTION CALL DISPATCHER
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	ENTRY-	A= FUNCTION #
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
FUNCH:
	CP	A,MAXFUNS
	JR	NC,MFUNERR
;
;   FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE
;
	PUSH	HL		;SAVE POSSIBLE ARGUMENT
;
	LD	HL,FUNTABL
	ADD	A,A
	ADD	A,L
	LD	L,A
	LD	A,0
	ADC	A,H
	LD	H,A
	LD	A,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,A
;
;   RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK
	EX	(SP),HL
;
;   RETURN TO EXECUTION ADDRESS
;
	RET
;
;
;   FUNCTION ERROR
;
MFUNERR:
	LD	A,-1
	OR	A,A
	RET


;############################################################################
;
;	MONITOR FUNCTION TABLE
;
;############################################################################
;
FUNTABL:
	DW	RETVERS		;0: RETURN MONITOR ROM VERSION
;
	DW	MFUNERR		;1: RETURN CHAR DEVICE PARAMETERS
	DW	MFUNERR		;2: EXECUTE SELF TEST
	DW	MFUNERR		;3: SET STANDARD CONSOLE DEVICE
	DW	MFUNERR		;4: SET STANDARD LIST DEVICE
	DW	MFUNERR		;5: INITIALIZE CHAR DEVICE
	DW	MFUNERR		;6: SET DEVICE BAUD RATE
	DW	MFUNERR		;7: SPARE
	DW	CIS		;8: RETURN STANDARD CONSOLE INPUT STATUS
	DW	CI		;9: RETURN STANDARD CONSOLE CHAR
	DW	COS		;10: RETURN STANDARD CONSOLE OUTPUT STATUS
	DW	CO		;11: SEND CHAR TO STANDARD CONSOLE
	DW	LOS		;12: RETURN STANDARD LIST DEVICE OUTPUT STATUS
	DW	LO		;13: SEND CHAR TO STANDARD LIST DEVICE
;
MAXFUNS	EQU	($ - FUNTABL) / 2

	SUBTTL	DEBUGGER FUNCTIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	RETURN VERSION FUNCTION
;	EXIT -	HL= VERSION # (123D = 1.23)
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
RETVERS:
	LD	HL,VERSN
	RET


;****************************************************************************
;
;	INITIALIZE I/O
;
;****************************************************************************
;
ROM_INIT:
  IF SERIAL <> TRUE
;
;   IF NAKED TERMINAL INSTALLED THEN SET IOBYTE TO IT
;   ELSE SET IOBYTE TO SIO
;
	IN	A,(NT_STAT)
	AND	A,[1 SHL NT_PRSNT]
	RRCA
  ELSE
	XOR	A,A
  ENDIF
	LD	(IOBYTE),A
;
;   INIT SIO ANYWAY
;
	LD	HL,IOIDTA	;SET TABLE PTR
;
IOILP:	LD	C,(HL)		;FETCH PORT
	INC	HL
;
	LD	A,C		;IF PORT == -1 THEN DONE
	INC	A
	JR	Z,IOIDN
;
	LD	B,(HL)		;FETCH COUNT
	INC	HL
	OTIR
	JR	IOILP
;
;   SIO DONE
;
IOIDN:
;
;   DISPLAY SIGN-ON
;
	LD	HL,LOGMSG
	CALL	PRTS
;
;   DONE
;
	RET


;############################################################################
;
;	SIO INITIALIZATION DATA TABLE
;
;############################################################################
;
IOIDTA:
;
;   SIO #0A
;
	DB	35H	;PORT
	DB	8
	DB	18H
	DB	4,44H
	DB	3,0C1H
	DB	5,0EAH
	DB	0
;
;   SIO #0B
;
	DB	37H
	DB	8
	DB	18H
	DB	4,44H
	DB	3,0C1H
	DB	5,0EAH
	DB	0
;
;   CTC 0: SIO #0A BAUD
;
	DB	3CH
	DB	2
	DB	01000101B
	DB	64
;
;   CTC 1: SIO #0B BAUD
;
	DB	3DH
	DB	2
	DB	01000101B
	DB	64
;
	DB	-1	;END-OF-TABLE


	SUBTTL	FUNCTIONS AND PROCEDURES
;****************************************************************************
;
;	DISPLAY TEXT ON CONSOLE PROCEDURE
;	ENTRY-	HL= PTR TO BIT-7 TERMINATED ASCII TEXT
;
;****************************************************************************
;
PRTS:
;
;   DISPLAY CHAR
;
	LD	C,(HL)
	RES	7,C
	PUSH	HL
	CALL	CO
	POP	HL
;
;   IF CHAR < 128 THEN DO NEXT CHAR
;
	BIT	7,(HL)
	INC	HL
	JR	Z,PRTS
;
	RET


	SUBTTL	IOBYTE HANDLERS
;****************************************************************************
;
;	SYSTEM CONSOLE OUTPUT STATUS SELECTOR
;	ENTRY-	(IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3
;	EXIT -	A= 0: BUSY, FFH: READY
;
;****************************************************************************
;
COS:	LD	A,(IOBYTE)
	AND	A,3
	JP	Z,COS0		;CONSOLE 0
	CP	A,2
	JP	M,COS1		;CONSOLE 1
	JP	Z,COS2		;CONSOLE 2
	JP	COS3		;CONSOLE 3


;****************************************************************************
;
;	SYSTEM CONSOLE OUTPUT SELECTOR
;	ENTRY-	(IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3
;		C= CHAR
;
;****************************************************************************
;
CO:	LD	A,(IOBYTE)
	AND	A,3
	JP	Z,CO0		;CONSOLE 0
	CP	A,2
	JP	M,CO1		;CONSOLE 1
	JP	Z,CO2		;CONSOLE 2
	JP	CO3		;CONSOLE 3


;****************************************************************************
;
;	SYSTEM CONSOLE INPUT STATUS SELECTOR
;	ENTRY-	(IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3
;	EXIT -	A= 0: NOT READY, FFH: CHAR READY
;
;****************************************************************************
;
CIS:	LD	A,(IOBYTE)
	AND	A,3
	JP	Z,CIS0		;CONSOLE 0
	CP	A,2
	JP	M,CIS1		;CONSOLE 1
	JP	Z,CIS2		;CONSOLE 2
	JP	CIS3		;CONSOLE 3


;****************************************************************************
;
;	SYSTEM CONSOLE INPUT SELECTOR
;	ENTRY-	(IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3
;	EXIT -	A= CHAR (CTRL-Z: EOF)
;
;****************************************************************************
;
CI:	LD	A,(IOBYTE)
	AND	A,3
	JP	Z,CI0		;CONSOLE 0
	CP	A,2
	JP	M,CI1		;CONSOLE 1
	JP	Z,CI2		;CONSOLE 2
	JP	CI3		;CONSOLE 3


;****************************************************************************
;
;	LIST DEVICE OUTPUT SELECTOR
;	ENTRY-	(IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON
;		C= CHAR
;
;****************************************************************************
;
LO:	LD	A,(IOBYTE)
	AND	A,0C0H
	JP	Z,LO0		;PRINTER 0
	CP	A,80H
	JP	M,LO1		;PRINTER 1
	JP	Z,LO2		;PRINTER 2
	JP	CO		;CONSOLE


;****************************************************************************
;
;	LIST DEVICE STATUS INPUT SELECTOR
;	ENTRY-	(IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON
;	EXIT -	A= 0: BUSY, FFH: READY
;
;****************************************************************************
;
LOS:	LD	A,(IOBYTE)
	AND	A,0C0H
	JP	Z,LOS0	;PRINTER 0
	CP	A,80H
	JP	M,LOS1	;PRINTER 1
	JP	Z,LOS2	;PRINTER 2
	JP	COS	;CONSOLE

	SUBTTL	PRIMITIVE I/O DRIVERS
  IF SERIAL
	CONMSG	-- SERIAL VERSION --
;****************************************************************************
;
;	PRIMARY CONSOLE DEVICE (CON0) : SIO #0A
;
;****************************************************************************
;
;   RETURN INPUT STATUS
;
CIS0:	IN	A,(35H)
	AND	A,00000001B
	RET	Z
	LD	A,-1		;ELSE RETURN -1
	RET
;
;
;   RETURN INPUT CHAR
;
CI0:	CALL	CIS0		;IF CHAR NOT READY THEN WAIT
	JR	Z,CI0
;
	IN	A,(34H)	;ELSE RETURN CHAR
	RET
;
;
;   RETURN OUTPUT STATUS
;
COS0:	IN	A,(35H)		;IF NOT READY TO ACCEPT CHAR THEN WAIT
	AND	A,00000100B
	RET	Z
	LD	A,-1
	RET
;
;
;   OUTPUT CHAR
;
CO0:	CALL	COS0		;IF BUSY THEN WAIT
	JR	Z,CO0
;
	LD	A,C		;OUTPUT CHAR & RETURN
	OUT	(34H),A
	RET
  ELSE
	CONMSG	-- NAKED TERMINAL VERSION --
;****************************************************************************
;
;	PRIMARY CONSOLE DEVICE (CON0) : NAKED TERMINAL
;
;****************************************************************************
;
;   RETURN INPUT STATUS
;
CIS0:	IN	A,(NT_STAT)	;IF NOT CHAR NOT READY THEN RETURN 0
	AND	A,1 SHL NT_READY
	RET	Z
	LD	A,-1		;ELSE RETURN -1
	RET
;
;
;   RETURN INPUT CHAR
;
CI0:	CALL	CIS0		;IF CHAR NOT READY THEN WAIT
	JR	Z,CI0
;
	IN	A,(NT_DATA)	;ELSE RETURN CHAR
	RET
;
;
;   RETURN OUTPUT STATUS
;
COS0:	IN	A,(NT_STAT)	;IF NOT READY TO ACCEPT CHAR THEN WAIT
	CPL
	AND	A,1 SHL NT_BUSY
	RET	Z
	LD	A,-1
	RET
;
;
;   OUTPUT CHAR
;
CO0:	CALL	COS0		;IF BUSY THEN WAIT
	JR	Z,CO0
;
	LD	A,C		;OUTPUT CHAR & RETURN
	OUT	(NT_DATA),A
	RET
  ENDIF


;****************************************************************************
;
;	ALTERNATE CONSOLE DEVICE (CON1) : SIO #0
;
;****************************************************************************
;
CIS1:	EQU	CIS0
CI1:	EQU	CI0
COS1:	EQU	COS0
CO1:	EQU	CO0


;****************************************************************************
;
;	ALTERNATE CONSOLE DEVICE (CON2)
;
;****************************************************************************
;
CIS2:	EQU	CIS0
CI2:	EQU	CI0
COS2:	EQU	COS0
CO2:	EQU	CO0


;****************************************************************************
;
;	ALTERNATE CONSOLE DEVICE (CON3)
;
;****************************************************************************
;
CIS3:	EQU	CIS0
CI3:	EQU	CI0
COS3:	EQU	COS0
CO3:	EQU	CO0


;****************************************************************************
;
;	LIST DEVICE 1 (LST1) : PRI CENTRONICS
;	
;****************************************************************************
;
;   RETURN OUTPUT STATUS
;
LOS0:
	LD	A,0BFH			;THIS PRINTER NEEDS STB=F FOR BUSY
	OUT	(PRI_2CNT),A		; TO WORK PROPERLY
;
	IN	A,(PRI_1ST)		;FETCH STATUS
	CPL
	AND	A,[1 SHL PRI_1BSB]	;TEST BUSY
	RET	Z
;
	LD	A,-1
	RET
;
;
;   OUTPUT CHAR
;
LO0:
	CALL	LOS0			;WAIT FOR BUSY=FALSE
	JR	Z,LO0
;
	LD	A,C			;OUTPUT CHARACTER
	OUT	(PRI_1DO),A
	LD	A,NOT [1 SHL PRI_1CSB]	;OUTPUT STROBE
	OUT	(PRI_2CNT),A
	LD	A,0BFH
	OUT	(PRI_2CNT),A		;CLEAR STROBE
	RET


;****************************************************************************
;
;	LIST DEVICE 1 (LST1)
;
;****************************************************************************
;
LOS1:	EQU	LOS0
LO1:	EQU	LO0


;****************************************************************************
;
;	LIST DEVICE 2 (LST2)
;
;****************************************************************************
;
LOS2:	EQU	LOS0
LO2:	EQU	LO0



LOGMSG	DB	' M5b Character I/O V. '
	PVERS	VERSN
	DM	CR,LF

	END
