

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	EXECUTE ALTERNATE ROM FUNCTION FUNCTION
;	ENTRY-	(SP+2)= FUNCTION # {0: NONE,
;				    1: INITIALIZE ROM,
;				    2..FF: FUNCTION -2}
;		(SP+3)= ROM # TO EXECUTE
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   IF ($ AND 7FFFH) > 7840H 
	CONMSG	**** ROM XOVER OVERLAP ****
   ENDIF
	ORG	0F840H
;
XROMF:
;
;   SAVE POSSIBLE RETURN VALUES
;
	PUSH	AF
	PUSH	HL
;
;   FETCH ROM # TO EXECUTE
;
	LD	HL,7		;STACK OFFSET
	ADD	HL,SP
	LD	A,(HL)		;FETCH ROM # TO EXECUTE
	LD	(HL),THIS_ROM	;SET RETURN ROM #
	POP	HL
;
;   EXECUTE THE ROM
;
	OUT	(M2_RSEL),A
;
; THE PC SHOULD BE AT 0F833H AT THIS POINT
;

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	ROM EXECUTION RETURN POINT
;	ENTRY-	(SP)= AF
;		(SP+2)= RETURN ADDRESS IN CALLER
;		(SP+4)= FUNCTION #
;		(SP+5)= RETURN ROM #
;	
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;   IF FUNCTION == 0 THEN RETURN
;
	PUSH	HL		;SAVE DATA
	LD	HL,6		;OFFSET TO FUNCTION
	ADD	HL,SP
	LD	A,(HL)
	POP	HL		;RESTORE DATA
;
	OR	A,A		;TEST
	JR	Z,XR_RET
;
;   ELSE IF FUNCTION == 1 THEN INITIALIZE
;
	DEC	A
	JR	Z,XR_INIT
;
;   ELSE TREAT AS FUNCTION
;
	INC	SP		;SCRUB OLD AF
	INC	SP
;
	DEC	A		;BIAS DOWN
	CALL	FUNCH
;
;   FUNCTION DONE, CLEAN UP
;
XR_DONE:
	PUSH	AF		;SAVE RETURN VALUES
	PUSH	HL
;
	LD	HL,6		;SET RETURN CODE TO 0 (NO FUNCTION)
	ADD	HL,SP
	LD	(HL),0
;
	POP	HL		;RESTORE RETURN VALUES
	POP	AF
	JR	XROMF
;
;
;   NO-FUNCTION RETURN
;
XR_RET:	
	POP	AF
	RET
;
;
;   INIT EXECUTION
;
XR_INIT:
	POP	AF
	CALL	ROM_INIT
	JR	XR_DONE


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
;	MACROS
;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
;   ACCESS RESIDENT ROM
;
XRROM	MACRO	#FUN
;
;   USE FUNCTION NO. #FUN
;   
	PUSH	HL
	LD	HL,[MR_RNUM SHL 8] + #FUN + 2
	EX	(SP),HL
	CALL	XROMF
	INC	SP
	INC	SP
	ENDM


;
;   ACCESS DISK ROM
;
XKROM	MACRO	#FUN
;
;   USE FUNCTION NO. #FUN
;   
	PUSH	HL
	LD	HL,[DK_RNUM SHL 8] + #FUN + 2 - 64
	EX	(SP),HL
	CALL	XROMF
	INC	SP
	INC	SP
	ENDM


;
;   ACCESS DEBUGGER ROM
;
XDROM	MACRO	#FUN
;
;   USE FUNCTION NO. #FUN
;   
	PUSH	HL
	LD	HL,[DEB_RNUM SHL 8] + #FUN + 2 - 16
	EX	(SP),HL
	CALL	XROMF
	INC	SP
	INC	SP
	ENDM

;
;   ACCESS CHAR I/O ROM
;
XCROM	MACRO	#FUN
;
;   USE FUNCTION NO. #FUN
;   
	PUSH	HL
	LD	HL,[CHR_RNUM SHL 8] + #FUN + 2 - 32
	EX	(SP),HL
	CALL	XROMF
	INC	SP
	INC	SP
	ENDM

;
;   ACCESS MISC. I/O ROM
;
XVROM	MACRO	#FUN
;
;   USE FUNCTION NO. #FUN
;   
	PUSH	HL
	LD	HL,[CLK_RNUM SHL 8] + #FUN + 2 - 80
	EX	(SP),HL
	CALL	XROMF
	INC	SP
	INC	SP
	ENDM

