	TITLE M5b Z-80 MONITOR RESIDENT ROM
	LIST	NOCOND
;****************************************************************************
;
;	SYSTEM MONITOR FOR M5b
;	(c) 1982,1983,1990  GRH Enterprises, Cupertino, CA
;
;****************************************************************************
;
;	This Monitor program resides at the top 2k of memory & supports the 
;system resources and transfer to additional ROMs residing in the same memory
; area as this ROM.
;
*INCLUDE B:ZBMH122.HDR
;****************************************************************************
;
;	Revision status:
;
; 1.0 - Release
; 1.1 -
;	Add Double D deselect upon reset code.
;	Change printer port.
; 1.2 -	20 FEB 83   GRH
;	Add delay before turning off boot image, in case logic
;	  too slow.
; 1.3 -	17 MAR 84   GRH
;	Change to allow Boot command parameter passing to boot ROM.
;
; 1.4 - 2 JUN 84   GRH
;	Fix bug in line printer status subroutine which hung the
;	  line printer by sensing the status incorrectly.
; 1.5 -	29 SEP 85   GRH
;	Fix bug in Input command which caused monitor to crash.
;	  The jump to 'BITS2' expects DE to be on stack.
; 1.6 -	6 DEC 85   GRH
;	Add code to disable all Jade controllers from 40H to 43H after
;	 reset.
; 1.7 -	8 FEB 86   GRH
;	Remove time delay from power up reset code to allow ISHA to access
;	  ram.
;	Remove the auto-boot from reset function.
; 1.8 -	29 MAY 86   GRH
;	Add Cromemco PRI printer driver as primary printer.
;	Change IOBYTE definitions.
;	Remove initialization of Jade FDC port 40H in anticipation of 
;	 Cromemco bank select useage.
; 1.9 -	16 AUG 86   GRH
;	Fix bug in PRI driver which caused new Oki 93 to be busy.
; 1.10-	8 FEB 87   GRH
;	Fix bug in register restore routine which caused IX & IY to be
;	 swapped prior to GOTO.
;	Change restart error to vector to breakpoint after message.
; 1.11-	27 DEC 87   GRH
;	Add bank memory management routines.
; 1.12	20 JUL 88   GRH
;	Add Monitor function call restart.
; 1.20	29 DEC 88   GRH
;	Add banked memory support:
;	  1. Page 0 initialization.
;	  2. Init bank register to bank 0F8H.
; 1.21	27 JAN 89   GRH
;	Add new monitor function routines.
;
; 1.22	11-22-90   GRH
;	Move debugger code to separate ROM in order to gain space for I/O
;	 drivers and interrupt code for SIO ports.
;	Add serial I/O driver.
;	Add rom xover function as include file so all modules can utilize it.
;
; 1.23	2-21-91   GRH
;	Add function #7, return current bank #. Remove reading THIS_BNK.
;
; 1.24	8-13-91   GRH
;	Change bank port definition for SSM CB2 cpu.
;	Add THIS_STK init for rom bank.
;
VERSN	EQU	124
;
;****************************************************************************
	FORM
FALSE	EQU	0
TRUE	EQU	NOT FALSE


;
;   INCLUDE SYSTEM DEFINITION FILES
;
;	NOTE: INCLUDE ONE OF THE FOLLOWING CPU FILES:
;
;		    BIGZ.DEF :	JADE 'BIG Z' Z80
;	>	     CB2.DEF :	SOLID STATE MUSIC 'CB2' Z80
;
;*MACLIB    ASMBTOOL.MLB
;*INCLUDE   MONBOARD.DEF
;*INCLUDE   JDDCONT.DEF
;*INCLUDE B:ZBMF101.DEF
;*INCLUDE B:ZBMG101.DEF
;
	LIST	OFF
*MACLIB	   ASMBTOOL.MLB		;VERSION # EXTRACTION
*INCLUDE   MONBOARD.DEF		;MONITOR II BOARD
*INCLUDE   CB2.DEF		;CPU
*INCLUDE   JDDCONT.DEF		;JADE CONTROLLER
*INCLUDE B:ZBMF101.DEF		;MONITOR FUNCTIONS
*INCLUDE B:ZBMG101.DEF		;GLOBAL DEFS
	LIST	ON

;
THIS_ROM EQU	MR_RNUM
;
;   BANK SELECTION
;
BNKREG	EQU	BNKPORT     ;MEMORY BANK SELECT REGISTER PORT ADDRESS


	SUBTTL	JUMP TARGETS FOR MONITOR ENTRY
	ORG	MONROM
;
;   COLD START VECTOR
;
	JP	INIT		;COLD START (RESET)
;
	JP	CI		;RETURN NEXT SYSTEM CONSOLE CHAR IN A
;
FUNENT:	JP	MONFUNC		;EXECUTE MONITOR FUNCTION IN A
;
	JP	CO		;SEND CHAR IN C TO SYSTEM CONSOLE
;
	JP	COS		;RETURN SYSTEM CONSOLE OUTPUT STATUS IN A
;
	JP	LO		;SEND CHAR IN C TO SYSTEM LIST DEVICE
;
	JP	CIS		;RETURN SYSTEM CONSOLE INPUT STATUS IN A
;
	JP	GETMEM		;RETURN BANKED MEMORY DATA
;
	JP	PUTMEM		;STORE BANKED MEMORY DATA
;
	JP	BNKSEL		;SELECT MEMORY BANK
;
	JP	XMOVE		;SELECT MEMORY BANKS FOR MOVE
;
	JP	BMOVE		;BANKED MEMORY BLOCK MOVE
;
	JP	REST	;(NOT IMPLIMENTED)	;EXECUTE BANK FUNCTION
;
	JP	LOS		;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A
;
	JP	REST		;INTERNAL BREAKPOINT ENTRY
;
	JP	GOTOS		;INTERNAL EXECUTE REGISTERS PROCEDURE (GOTO)
;
	JP	RSTER		;RESTART ERROR ENTRY
;
	JP	PRTS		;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE


	SUBTTL	MONITOR BOARD SHADOW ROM SELECTION PROCEDURE
*INCLUDE 	B:XROM.Z80


	SUBTTL	MEMORY MANAGEMENT ROUTINES
;****************************************************************************
;
;	BANK SELECT PROCEDURE
;	NOTE: THIS FUNCTION IS ONLY FOR CP/M 3.0 COMPATABILITY. ALL OTHER
; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES.
;	ENTRY-	A= BANK ADDRESS
;
;****************************************************************************
;
FBSEL:
	LD	A,C
;
BNKSEL:
;
;   SELECT NEW BANK
;
	OUT	(BNKREG),A
;
;   STORE IN BANK PAGE 0
;
	LD	(THIS_BNK),A
;
;   ALSO STORE LOCALLY
;
	LD	(CURBNK),A
;
;   DONE
;
	RET


;****************************************************************************
;
;	SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE)
;	FUNCTION #4
;	ENTRY-	B= SOURCE BANK
;		C= DESTINATION BANK
;	EXIT -	A= ?
;
;****************************************************************************
;
XMOVE:
;
;   STORE BANK #S
;
	LD	(DBANK),BC
;
;   SET BANKS CHANGED FLAG
;
	LD	A,-1
	LD	(BNKCHG),A
;
;   DONE
;
	RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	MEMORY TO MEMORY MOVE FUNCTION #5
;  NOTE: THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL & DE ARE REVERSED
;	 (Z-80 COMPATABLE)
;	ENTRY-	HL= SOURCE PTR
;		DE= DESTINATION PTR
;		BC= BYTE COUNT
;	EXIT -	HL & DE= NEXT BYTES TO MOVE PTRS
;		A, BC= ?
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
BMOVE:
;
;   IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRA-BANK MOVE
;
	LD	A,(BNKCHG)
	OR	A,A
	JP	NZ,BMOVE2
;
	LDIR
;
;   DONE WITH SIMPLE CASE
;
	RET
;
;
;   ELSE USE INTER-BANK MOVE
;
BMOVE2:
;
;   SAVE CURRENT BANK #
;
	LD	A,(CURBNK)
	LD	(CBANK),A
;
;   CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME
;
	XOR	A,A
	LD	(BNKCHG),A
;
;   IF IN SAME BANK THEN USE INTRA_BANK MOVE ON IT
;
	PUSH	HL		;SAVE PTR
	LD	HL,(DBANK)
	LD	A,H
	CP	A,L
	POP	HL		;PTR
	JP	NZ,NTSAME
;
;   SELECT BANK OF MOVE
;
	DI			;NO INTERRUPTS WHILE BANK SWAPPED
;
	OUT	(BNKREG),A	;A STILL HAS BANK (BOTH SAME, REMEMBER?)
;
	LDIR
;
;   DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED
;
BMOVE3:	
	LD	A,(CBANK)	;RESELECT CURRENT BANK & RETURN
	OUT	(BNKREG),A
;
	EI			;ALLOW INTERRUPTS NOW
	RET
;
;
;   BANKS NOT THE SAME, DO DISCRETE MOVE
;
NTSAME:
;
;   SAVE COUNT
;
	PUSH	BC		;SAVE COUNT
	EXX
	POP	BC
	EXX
;
;   FETCH BANKS
;
	LD	BC,(DBANK)
;
;   NO INTERRUPTS WHILE MOVING
;
	DI
;
;   TOP OF MOVE LOOP
;
BMOVE4:	LD	A,B		;SELECT SOURCE BANK
	OUT	(BNKREG),A
	LD	A,(HL)
	EX	AF,AF'
;
	LD	A,C		;SELECT DESTINATION BANK
	OUT	(BNKREG),A
	EX	AF,AF'
	LD	(DE),A
;
	INC	HL		;NEXT BYTE
	INC	DE
;
	EXX			;CHECK FOR DONE
	DEC	BC
	LD	A,C
	OR	A,B
	EXX
	JP	NZ,BMOVE4
;
;   DONE
;
	JP	BMOVE3


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	RETURN BANKED MEMORY DATA FUNCTION #1
;	ENTRY-	HL= OFFSET PTR
;		E= BANK #
;	EXIT -	A= DATA
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
GETMEM:
;
;   SAVE REGISTER
;
	PUSH	BC
;
;   SAVE CURRENT BANK FOR RETURN
;
	LD	A,(CURBNK)
	LD	B,A
;
;   SELECT BANK
;
	LD	A,E
	DI			;NO INTERRUPTS
	OUT	(BNKREG),A
;
;   FETCH DATA
;
	LD	C,(HL)
;
;   RESTORE BANK
;
	LD	A,B
	OUT	(BNKREG),A
;
;   RETURN DATA
;
	LD	A,C
;
;   DONE
;
	POP	BC
	EI
	RET


;****************************************************************************
;
;	STORE DATA INTO BANKED MEMORY PROCEDURE FUNCTION #2
;	ENTRY-	HL= OFFSET PTR
;		E= BANK #
;		C= DATA
;	EXIT -	A= ?
;
;****************************************************************************
;
PUTMEM:
;
;   SAVE REG
;
	PUSH	BC
;
;   SAVE CURRENT BANK TO RETURN TO
;
	LD	A,(CURBNK)
	LD	B,A
;
;   SELECT BANK
;
	LD	A,E
	DI			;NO INTERRUPTS WHILE BANK SWAPPED
	OUT	(BNKREG),A
;
;   STORE DATA
;
	LD	(HL),C
;
;   RESTORE BANK
;
	LD	A,B
	OUT	(BNKREG),A
;
	EI
;
;   DONE
;
	POP	BC
	RET


	SUBTTL	MONITOR FUNCTION CALL DISPATCHER
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	ENTRY-	A= FUNCTION #
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
FUNCH:		;ROM SWAP ENTRY
MONFUNC:	;EXTERNAL ENTRY
;
;   IF NOT LOCAL FUNCTIONS THEN EXIT
;
	CP	A,MAXFUNS
	JR	NC,NOT_INT
;
;   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	GETMEM		;1: RETURN BANKED MEMORY DATA
	DW	PUTMEM		;2: STORE DATA INTO BANKED MEMORY
	DW	MFUNERR		;3: SPARE
	DW	XMOVE		;4: SET BLOCK MOVE BANKS
	DW	BMOVE		;5: BANKED BLOCK MOVE
	DW	MFUNERR		;6: SELECT NEW BUS PROCESSOR
	DW	RETCBNK		;7: RETURN CURRENTLY SELECTED BANK IN A
	DW	GOTOS		;8: DEBUGGER EXECUTER
	DW	FBSEL		;9: SELECT NEW BANK
;
MAXFUNS	EQU	($ - FUNTABL) / 2

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	NOT INTERNAL FUNCTION, CHECK FOR DEBUGGER
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
NOT_INT:
;
;   BIAS DOWN DEBUGGER FUNCTIONS
;
	SUB	A,16
;
;   IF FUN# < START THEN INTERNAL FUNCTION RESERVED ERR
;
	JR	C,MFUNERR
;
;   ELSE IF FUN# > LAST THEN GO CHECK NEXT GROUP
;
	CP	A,16
	JR	NC,NOT_DEB
;
;   ELSE EXECUTE DEBUGGER FUNCTION
;
	ADD	A,2		;BIAS UP
	PUSH	HL
	LD	H,DEB_RNUM
	LD	L,A
	EX	(SP),HL
	CALL	XROMF
	INC	SP
	INC	SP
	RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	CHAR FUNCTIONS
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
NOT_DEB:
;
;  BIAS DOWN TO CHAR FUNS
;
	SUB	A,16
;
;   IF NOT CHAR FUNCS THEN CHECK NEXT GROUP
;
	CP	A,32
	JR	NC,NOT_CHR
;
;   ELSE EXECUTE CHAR ROM
;
	ADD	A,2
	PUSH	HL
	LD	L,A
	LD	H,CHR_RNUM
	EX	(SP),HL
	CALL	XROMF
	INC	SP
	INC	SP
	RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	DISK DRIVER FUNCTIONS
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
NOT_CHR:
;
;   BIAS DOWN TO DISK FUNCTIONS
;
	SUB	A,32
;
;   IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP
;
	CP	A,16
	JR	NC,NOT_DSK
;
;   ELSE EXECUTE DISK ROM
;
	ADD	A,2		;ADD OFFSET
;
	PUSH	HL		;SAVE ARG
	LD	H,DK_RNUM	;SET ROM #
	LD	L,A		;SET FUNCTION #
	EX	(SP),HL
	CALL	XROMF
	INC	SP
	INC	SP
;
	RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	MISCELLANEOUS DRIVER FUNCTIONS
;	ENTRY-	D= DRIVER FUNCTION #
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
NOT_DSK:
;
;   BIAS DOWN TO MISC. FUNCTIONS
;
	SUB	A,16
;
;   SET ROM #
;
	ADD	A,2		;ADD OFFSET
;
	PUSH	HL		;SAVE ARG
	LD	H,CLK_RNUM	;SET ROM #
	LD	L,A		;SET FUNCTION #
	EX	(SP),HL
	CALL	XROMF
	INC	SP
	INC	SP
;
	RET
	

	SUBTTL	MONITOR FUNCTIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	RETURN VERSION FUNCTION #0
;	EXIT -	HL= VERSION # (123D = 1.23)
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
RETVERS:
	LD	HL,VERSN
	RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	RETURN CURRENTLY SELECTED BANK FUNCTION #7
;	EXIT -	A= BANK
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
RETCBNK:
	LD	A,(CURBNK)
	CP	A,A		;RETURN ZF
	RET


	SUBTTL	INITIALIZATION CODE
;----------------------------------------------------------------------------
;
;	THIS IS THE COLD START INIT CODE
;
;----------------------------------------------------------------------------
;
ROM_INIT:	;XROM ENTRY
INIT:		;EXTERNAL ENTRY
;
;   INSURE INTERRUPTS DISABLED
;
	DI
;
;   REMOVE PAGE 0 IMAGE
;
	OUT	(M2_CLDRES),A
;
;   REMOVE JADE DOUBLE D WINDOW(S)
;
	LD	A,DD_FREE	;REMOVE DD WINDOW, IF PRESENT
	OUT	(DD_PRT3),A
	OUT	(DD_PRT5),A
	OUT	(DD_PRT8),A
;
;   SET MEMORY BANK
;
	LD	A,DEFBNK
	OUT	(BNKREG),A
;
;   INITIALIZE RESTART VECTORS IN PAGE 0
;
	LD	SP,003FH	;USE STACK TO INIT RESTARTS
	LD	HL,0C300H
	LD	DE,RSTER
	LD	B,16		;64 BYTES
;
INIT1:	PUSH	DE
	PUSH	HL
	DJNZ	INIT1
;
;   SET STACK
;
	LD	SP,MONSTK
;
;   SET MEMORY BANK CONSTANT
;
	LD	(THIS_BNK),A	;A STILL HAS DEFAULT BANK #
	LD	(CURBNK),A
;
;   INIT ALL BANKS
;
	LD	E,A		;START WITH ALL Z80 BANKS
	LD	HL,THIS_BNK	;POINT TO LOCATION TO STORE BANK #
BNKS_INIT:
	LD	C,E		;STORE IT
	CALL	PUTMEM
;
	INC	E		;NEXT BANK
;
	LD	A,0FFH		;IF NOT LAST BANK THEN REPEAT
	CP	A,E
	JR	NZ,BNKS_INIT
;
;   INITIALIZE IOBYTE
;
	LD	A,IOBYTV	;SET TO INITIAL IOBYTE VALUE
	LD	(IOBYTE),A
;
;   SET BANK STACK
;
	LD	(THIS_STK),SP
;
	DEC	E		;BACK UP TO BANK 0FEH (ROM BANK)
	LD	HL,THIS_STK	;SET PTR
	LD	C,0		;SET TO 0800H
	CALL	PUTMEM
;
	INC	HL
	LD	C,8
	CALL	PUTMEM
;
;   SET FUNCTION CALL RESTART
;
	LD	HL,FUNENT
	LD	(MFUNRSV),HL
;
;  INIT ROMS (I/O)
;
	LD	HL,[CHR_RNUM SHL 8] + 1		;CHAR
	PUSH	HL
	CALL	XROMF
	POP	HL
;
	LD	HL,[DEB_RNUM SHL 8] + 1		;DEBUGGER
	PUSH	HL
	CALL	XROMF
	POP	HL
;
	LD	HL,[DK_RNUM SHL 8] + 1		;DISK
	PUSH	HL
	CALL	XROMF
	POP	HL
;
	LD	HL,[CLK_RNUM SHL 8] + 1		;MISC
	PUSH	HL
	CALL	XROMF
	POP	HL
;
;   OUTPUT SIGN-ON MESSAGE
;
	LD	HL,LOGMSG	;OUTPUT SIGN-ON
	CALL	PRTS
;
;   EXECUTE THE DEBUGGER
;
MAINLP:
	LD	SP,MONSTK
	LD	HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2	;3
	PUSH	HL
	CALL	XROMF
	POP	HL
	JR	MAINLP

	SUBTTL	DEBUGGER SUPPORT ROUTINES
;****************************************************************************
;
;	GOTO FUNCTION #8
;
;****************************************************************************
;
GOTOS:
;
;   SCRUB FUNCTION DATA ON STACK
;
	POP	HL		;RET ADDR TO XROMF
	POP	HL		;CALLER RETURN ADDR
	POP	HL		;XROM ARGUMENT
;
;   SET REGISTERS
;
	LD	HL,(RLOC)	;L= R, H= I
	LD	A,H		;SET I REG.
	LD	I,A
;
	LD	A,L		;SAVE R REG
;
	LD	HL,(FLOC)	;FETCH AF
	PUSH	HL
;
	LD	HL,(LLOC)	;SET HL
;
;   DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE
;
	LD	R,A		;SET R
	POP	AF		;SET AF
;
;   RESERVE SPACE FOR A EI INSTRUCTION TO BE PATCHED IN
;
	DB	0		;'NOP' OR PLACE FOR 'EI'
;
;   RETURN TO EXECUTION ADDRESS ON STACK
;
	RET


;****************************************************************************
;
;	REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT
; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE
; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE
; REGISTERS COMMANDS.
;
;	INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST.
;
;****************************************************************************
;
REST:
;
;   SAVE 8080 REGS FIRST SO WE CAN WORK
;
	PUSH	AF
	LD	A,R		;DO REFRESH REGISTER AS SOON AS POSSIBLE
	LD	(LLOC),HL
	POP	HL
	LD	(FLOC),HL
;
	LD	L,A		;REFRESH REGISTER
	LD	A,I
	LD	H,A
	LD	(RLOC),HL
;
	LD	(ELOC),DE
	LD	(CLOC),BC
;
;   FETCH RETURN ADDRESS FROM PGM STACK
;
	POP	BC
;
;   SAVE SP AT BREAKPOINT
;
	LD	(SLOC),SP
;
;   BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION
;
	DEC	BC
;
;   SET UP LOCAL STACK
;
	LD	SP,MONSTK	;SET THE MONITOR STACK
;
;   RETURN TO DEBUGGER
;
	LD	HL,[DEB_RNUM SHL 8] + 2
	PUSH	HL
	CALL	XROMF
	POP	HL
	JP	MAINLP

	SUBTTL	SUBROUTINES & FUNCTIONS
;----------------------------------------------------------------------------
;
;	UNINITIALIZED RESTART ERROR HANDLER
;
;----------------------------------------------------------------------------
;
RSTER:	PUSH	AF
	PUSH	HL
	LD	HL,RSTMSG
	CALL	PRTS
	POP	HL
	POP	AF
	JP	REST


;****************************************************************************
;
;	PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE.
;  THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING.
;	ENTRY-	HL= TEXT PTR
;
;****************************************************************************
;
PRTS:
;
;   DISPLAY CHAR
;
	LD	C,(HL)		;FETCH CHAR
	RES	7,C		;MAKE 7-BIT
	PUSH	HL		;SAVE PTR
	CALL	CO		;DISPLAY CHAR
	POP	HL		;RESTORE PTR
;
;  IF CHAR < 128 THEN REPEAT
;
	BIT	7,(HL)
	INC	HL		;NEXT CHAR
	JR	Z,PRTS
;
;   ELSE DONE
;
	RET


	SUBTTL	EXTERNAL NON-FUNCTION CONSOLE I/O
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTION
;	EXIT -	A= 0: BUSY, FFH: READY
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
COS:
	XCROM	MF_COS
;
;   DONE
;
	RET


;****************************************************************************
;
;	SEND CHAR TO SYSTEM CONSOLE OUTPUT PROCEDURE
;	ENTRY-	C= CHAR
;
;****************************************************************************
;
CO:
	XCROM	MF_CO
;
;   DONE
;
	RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	RETURN SYSTEM CONSOLE INPUT STATUS FUNCTION
;	EXIT -	A= 0: NOT READY, FFH: CHAR READY
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
CIS:
	XCROM	MF_CIS
;
;   DONE
;
	RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION
;	EXIT -	A= CHAR (CTRL-Z: EOF)
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
CI:
	XCROM	MF_CI
;
;   DONE
;
	RET


;****************************************************************************
;
;	SEND CHAR TO LIST DEVICE OUTPUT PROCEDURE
;	ENTRY-	C= CHAR
;
;****************************************************************************
;
LO:
	XCROM	MF_LO
;
;   DONE
;
	RET


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	RETURN LIST DEVICE OUTPUT STATUS FUNCTION
;	EXIT -	A= 0: BUSY, FFH: READY
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
LOS:
	XCROM	MF_LOS
;
;   DONE
;
	RET


	SUBTTL	MESSAGES
RSTMSG:	DM	CR,LF,'RST ERR '
LOGMSG:	DB	CR,LF,'65K BANKED ZMON V. '
	PVERS	VERSN
	DM	CR,LF

	END
