;----------------------------------------------------------
;Option ROM Header must be ORGed at 0 by the assembler
;or linked at 0 by the linker.
;----------------------------------------------------------

;Routine to turn on the Option ROM

OPON:	EQU	0FAA4H

;Globals on the Telcom Back Page to temporarily hold HL and
;DE registers during a CALL to Standard ROM, or during an
;Interrupt.

HOLDH:	EQU	0FCC0H
HOLDD:	EQU	0FCC2H
INTH:	EQU	0FCC4H
INTD:	EQU	0FCC6H


;Entry point arrived at by CALL 63012

RST0?:
;Optional for linking versions
;	EXTRN	PROGRAM
	INX	SP
	INX	SP
	JMP	PROGRAM
	DB	0,0,0

RST1?:				;Not used
	RET
	DB	0,0,0,0,0,0,0

RST2?:				;Not used
	RET
	DB	0,0,0,0,0,0,0

RST3?:				;Not Used
	RET
	DB	0,0,0,0,0,0,0

RST4?:				;Not Used
	RET
	DB	0,0,0

TRAP?:
	DI
	JMP	INTRAP

RST5?:				;Not Used
	RET
	DB	0,0,0

RST55?:
	DI
	JMP	INT55

;RST 6 used as short call to a Standard ROM routine.

RST6?:
	JMP	STDCALL
	DB	0

;Replaces the 6.5 interrupt and sets up a call to 6.5 in
;Standard ROM

RST65?:
	DI
	JMP	INT65

RST7?:				;Not Used
	RET
	DB	0,0,0

;Replaces the 7.5 interrupt and sets up a call to 7.5 in
;Standard ROM

RST75?:
	DI
	JMP	INT75

;An image of the OPON routine copied to FAA4H by the
;Model 100 power up logic.

OPONIMG:
	PUSH	PSW
	MVI	A,1
	OUT	0E0H
	POP	PSW
	RET
	DB	0

;---------------------------------------------------------
;The STDCALL routine allows a program running in the
;the Option ROM to call and return to an address in the
;Option ROM.
;Syntax is to use a RST 6 plus the address to be called.
;
;	RST	6
;	DW	04B44H
;---------------------------------------------------------

STDCALL:
	DI
	SHLD	HOLDH		;Caller's HL
	XCHG
	SHLD	HOLDD		;Caller's DE
	POP	H		;(HL)=Routine to Call
	MOV	E,M
	INX	H
	MOV	D,M		;DE=Routine to Call
	INX	H		;HL=Return Address
	PUSH	H
	LXI	H,OPON		;return through OPON
	PUSH	H
	PUSH	D		;Return Address
	LHLD	HOLDD		;Caller's DE
	XCHG
	LHLD	HOLDH		;Caller's HL
	EI
	JMP	STDON


;Routines for each of the hardware traps.
INTRAP:
	CALL	INTCALL
	DW	0024H
	RET

INT55:
	CALL	INTCALL
	DW	002CH
	RET

INT65:
	CALL	INTCALL
	DW	0034H
	RET

INT75:
	CALL	INTCALL
	DW	003CH
	RET

OPX:
;Turns off the Option ROM (or turns on Standard ROM)
;Depending on your viewpoint.
;This routine must be ORGed at 85H. Ensure the the previous
;Code does not overlap into 85H

	ORG	85H
;Optional for linking versions
;	PUBLIC	STDON
STDON:
	PUSH	PSW
	PUSH	H
	LXI	H,26C8H
	XTHL
	XRA	A
OPEXIT:
	OUT	0E0H
	RET

;---------------------------------------------------------
;The INTCALL routine allows a program running in the Option
;ROM to call an interrupt routine.
;Syntax: CALL INTCALL plus the address to be called.
;
;	CALL	INTCALL
;	DW	24H
;---------------------------------------------------------
INTCALL:
	SHLD	INTH		;Caller's HL
	XCHG
	SHLD	INTD		;Caller's DE
	POP	H		;(HL)=Routine to Call
	MOV	E,M
	INX	H
	MOV	D,M		;DE=Routine to Call
	INX	H		;HL=Return Address
	PUSH	H
	LXI	H,OPON		;return through OPON
	PUSH	H
	PUSH	D		;Return Address
	LHLD	INTD		;Caller's DE
	XCHG
	LHLD	INTH		;Caller's HL
	JMP	STDON

;For Non linking versions your Code begins here
;For linking versions delete the label below, and
;use it for the entry point to your program after
;declaring it PUBLIC.

PROGRAM:

	END
