;OVERLAY/ASM
*TITLE	'OVERLAY - SYSTEM OVERLAY LOADER'
;
;	THIS PACKAGE CONTAINS FILE LOAD/RUN
;	ROUTINES AND A GENERAL PURPOSE OVERLAY
;	LOADER FOR INTERNAL SYSTEM OPERATIONS
;
LDB	EQU	01H		;LD	BC
CR	EQU	13		;C/R
ERR24	EQU	24		;FILE NOT FOUND
ERR31	EQU	31		;PROGRAM NOT FOUND
ER34	EQU	34		;NON-PROGRAM FILE
ER35	EQU	35		;MEMORY FAULT
;
*EJECT
;	NON-RESIDENT SVC ROUTINES
;
JP2DOS	LD	A,1-1<4+1	;NORMAL SYSTEM ENTRY
	RST	24
DOSCMD	LD	A,1-1<4+2	;INTERPRET CMD & EXIT
	RST	24
RETCMD	LD	A,1-1<4+3	;INTERPERT CMD & RETURN
	RST	24
CLRXIT	LD	A,1-1<4+6	;CLEAR RAM & ABORT
	RST	24
EVAL	LD	A,1-1<4+7	;EVALUATE COMMAND LINE
	RST	24
FSPEC	LD	A,1-1<4+8	;FETCH FILE SPEC
	RST	24
PARAM	LD	A,1-1<4+9	;FETCH OPTIONAL PARAMETERS
	RST	24
FEXT	LD	A,1-1<4+10	;PLACE FILE EXTENSION
	RST	24
VALUE	LD	A,1-1<4+13	;FETCH NUMERIC VALUE
	RST	24
;
OPEN	LD	A,2-1<4+1	;OPEN/INIT DEVICE/FILE
	RST	24
RENAME	LD	A,2-1<4+2	;RENAME DEVICE/FILE
	RST	24
;
KILLO	LD	A,3-1<4+1	;KILL OPEN FILE
	RST	24
CLOSE	LD	A,3-1<4+2	;CLOSE DEVICE/FILE
	RST	24
;
ERROR	LD	A,5-1<4+1	;POST ERROR MESSAGE
	RST	24
ERRMSG	LD	A,5-1<4+2	;FETCH ERROR MESSAGE
	RST	24
;
DEBUG	PUSH	AF		;SAVE!
	LD	A,6-1<4+1	;ENTER DEBUGGER
	RST	24
;
KBINIT	LD	A,7-1<4+1	;KEYBOARD INIT
	RST	24
VDINIT	LD	A,7-1<4+2	;VIDEO INIT
	RST	24
PRINIT	LD	A,7-1<4+3	;PRINTER INIT
	RST	24
RS232C	LD	A,7-1<4+4	;RS232 INIT
	RST	24
DATE	LD	A,7-1<4+5	;FETCH TIME/DATE
	RST	24
PRCTRL	LD	A,7-1<4+6	;PRINTER CONTROL
	RST	24
ACTRL	LD	A,7-1<4+7	;CL A CONTROL
	RST	24
BCTRL	LD	A,7-1<4+8	;CL B CONTROL
	RST	24
INITIO	LD	A,7-1<4+9	;INIT ALL I/O
	RST	24
JPINIT	LD	A,7-1<4+10	;NORMAL SYSTEM ENTRY
	RST	24
;
PARSER	LD	A,8-1<4+1	;PARSE TEXT STRING
	RST	24
WILD	LD	A,8-1<4+2	;WILD CARD PARSER
	RST	24
RAMDIR	LD	A,8-1<4+3	;RAM DIRECTORY
	RST	24
RDDIR	LD	A,8-1<4+4	;READ DIRECTORY
	RST	24
FILPTR	LD	A,8-1<4+5	;GET FILE POINTERS
	RST	24
DISKID	LD	A,8-1<4+6	;READ DISK ID'S
	RST	24
SORT	LD	A,8-1<4+7	;SORT RAM TABLE
	RST	24
RANDOM	LD	A,8-1<4+9	;RAMDOM NUM GEN
	RST	24
;
*EJECT
;	$OVERLAY - SYSTEM OVERLAY LOADER
;
;	ENT	 A =	LOAD COMMAND
;
;		BIT:	  7	HIGH/LOW FLAG
;			6-4	LFN-3
;			3-0	COMMAND VECTOR
;
OVERLY	INC	SP		;IGNORE
	INC	SP		;CALLER
;
OVRLY0	PUSH	HL		;SAVE
	LD	HL,OVRLY4	;RET ADD
	EX	(SP),HL 	;TO STACK
;
	PUSH	HL		;SAVE REGISTERS
	PUSH	DE
	PUSH	BC
	PUSH	AF
;
;	DEBUG OFF - SAVE STATUS
;
	LD	HL,FLAG1S	;DEBUG INT FLAG
	LD	B,(HL)		;GET STATUS
	LD	(HL),0		;NO DEBUG INT
	INC	HL		;FLAG2S
	LD	(HL),B		;SAVE STATUS
	INC	HL		;FLAG3S
	LD	(HL),A		;SAVE SYSTM/CMD
;
;	CHECK/LOAD SYSTEM OVERLAY
;
	LD	HL,OVLYL	;LOW OVERLAY NUMBER
	LD	DE,LOENT	;LOW ENTRY POINT
	OR	A		;LOW OVERLAY?
	JP	P,OVRLY1	;IF YES
	INC	HL		;HIGH OVERLAY NUMBER
	LD	DE,HIENT	;HIGH ENTRY POINT
OVRLY1	AND	0F0H		;IGNORE CMD
	CP	(HL)		;MATCH?
	LD	(HL),A		;SET OVERLAY
	JR	Z,OVRLY2	;IF YES
;
	CALL	OVRLY5		;LOAD FILE
	JR	NZ,OVRLY8	;I/O ERROR
	EX	DE,HL		;DE => ENTRY POINT
	LD	(HL),E		;SET ENTRY
	INC	HL
	LD	(HL),D		;SET ENTRY
	JR	OVRLY3		;SKIP
;
;	GET ENTRY POINT AND GO!
;
OVRLY2	EX	DE,HL		;HL => ENTRY
	LD	E,(HL)		;GET ENTRY
	INC	HL
	LD	D,(HL)		;GET ENTRY
;
OVRLY3	POP	AF		;RET ADD
	AND	0FH		;IGNORE SYS
	ADD	A,A		;* 2
	LD	L,A
	LD	H,0		;HL = OFFSET
	ADD	HL,DE		;HL => ADDRESS
	LD	A,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,A		;HL => ROUTINE
	POP	BC		;RESTORE REG
	POP	DE
	EX	(SP),HL
	RET			;GO!
;
;	RESTORE DEBUG STATUS
;
OVRLY4	PUSH	AF		;SAVE
	LD	A,(FLAG2S)	;GET DEBUG FLAG
	LD	(FLAG1S),A	;SET DEBUG FLAG
	POP	AF		;RESTORE
	RET			;OVERLAY DONE!
;
;	SET-UP SYSTEM OVERLAY'S DCB
;
;	ENT	 A =	SYSTEM (0-15)
;
OVRLY5	PUSH	DE		;SAVE REG
	PUSH	IY
	RLCA
	RLCA
	RLCA
	RLCA			;SYSTEM TO LSB
	ADD	A,3		;CORRECT (MAKE LFN)
	LD	B,A		;B = ASSUMED LFN
	LD	C,0		;DRIVE
	CALL	LOCDCT		;LOCATE DCT
	LD	A,B		;GET LFN
	SUB	(IY+17) 	;END DIR?
	JR	C,OVRLY6	;IF NOT
	OR	20H		;CORRECT LFN
	LD	B,A		;B = TRUE LFN
;
OVRLY6	LD	IY,SYSDCB	;SYSTEM DCB
	LD	(IY+17),B	;SET LFN
	LD	(IY+01),0	;ATTRIB
	LD	(IY+10),0	;LSB NRN
;
	CALL	DIRRED		;READ DIRECTORY
	JR	NZ,OVRLY7	;ERROR!
	LD	A,(HL)		;GET TYPE
	CPL			;INVERT
	AND	50H		;AVTIVE SYSTEM?
	LD	A,24		;FILE NOT FOUND
	JR	NZ,OVRLY7	;HUH?
;
	LD	DE,16H		;SD OFFSET
	ADD	HL,DE		;HL => SD LIST
	LD	E,(HL)
	INC	HL
	LD	D,(HL)		;DE = 1ST SD
	LD	(IY+20),E	;SET 1ST SD
	LD	(IY+21),D	;SET 1ST SD
;
	LD	DE,SYSDCB	;DE => DCB
	CALL	LDPG1		;LOAD OVERLAY!
;
OVRLY7	POP	IY		;RESTORE REG
	POP	DE
	RET
;
;	OVERLAY ERROR HANDLER
;
OVRLY8	LD	HL,FLAG3S	;CURR LOAD COMMAND
	BIT	7,(HL)		;LOW?
	INC	HL		;HL => OVLYL
	JR	Z,OVRLY9	;IF LOW
	INC	HL		;HL => OVLYH
OVRLY9	LD	(HL),-1 	;UNDEFINED
	LD	HL,MES1+13	;'SYSTEM ERROR'
	CALL	B2H		;GET CODE
	LD	HL,MES1 	;'SYSTEM ERROR'
	LD	BC,16<8+CR	;COUNT & TERM
	CALL	VDLINE		;VIDEO LINE
	CALL	KBDW		;WAIT FOR KEY
	JP	CLRXIT		;ABORT!
;
MES1	DEFM	'System error 00H'
;
*EJECT
;	LOAD/EXECUTE PROGRAM FILE
;
;	ENT	DE =>	DCB
;
RUN	PUSH	HL		;SAVE
	LD	HL,FLAGK1	;SYSTEM FLAGS
	SET	1,(HL)		;FORCE READ
	PUSH	HL		;SAVE FLAGS
	CALL	LOAD		;LOAD FILE
	EX	(SP),HL 	;HL => FLAGS
	RES	1,(HL)		;FORCE READ OFF
	JR	NZ,RUN1 	;I/O ERROR
	BIT	2,(HL)		;DEBUG ON?
	INC	DE		;NEXT
	LD	A,(DE)		;GET ATTRIB
	LD	BC,(DATAK6)	;BC => LOW MEMORY
	LD	DE,(DATAK7)	;DE => HIGH MEMORY
	POP	HL		;HL => ENTRY
	EX	(SP),HL 	;RESTORE
	RET	Z		;NO DEBUG
	AND	7		;ATTRIB
	SUB	6		;EXEC?
	JP	C,DEBUG 	;GO DEBUG!
	LD	(FLAG1S),A	;BREAK TRIGGER OFF
	RET			;EXECUTE!
;
RUN1	LD	B,A		;B = CODE
	CALL	ERROR		;OUTPUT
	POP	HL		;IGNORE
	POP	HL		;GET => CMD LINE
	XOR	A		;NO ERROR
	RET
;
*EJECT
;	LOAD PROGRAM FILE ROUTINE
;
;	ENT	 DE =>	FILE DCB
;
LOAD	LD	HL,PLIST	;HL => PARAM LIST
	CALL	OPEN		;OPEN FILE!
	JR	Z,LDPG1 	;NO ERROR
	CP	ERR24		;FILE NOT FOUND?
	RET	NZ		;IF NOT
	LD	A,ERR31 	;PROGRAM NOT FOUND
	OR	A		;NZ STATUS
	RET
;
LDPG1	LD	C,-1		;INIT BUFF LOC
LDPG2	CALL	GETBYT		;GET BYTE
	CP	' '             ;CONTROL?
	JR	NC,LDER3	;NON-PROGRAM FILE
	LD	H,A		;H = CTL BYTE
	CALL	GETBYT		;GET BYTE
	LD	B,A		;B = COUNT
	CALL	GETBYT		;GET BYTE
	LD	L,A		;L = LSB ADD
	DEC	H		;DATA?
	JR	Z,LDPG5 	;GO!
	DEC	H		;TERM?
	JR	NZ,LDPG4	;GO!
;
;	GET PROGRAM ENTRY POINT
;
LDPG3	CALL	GETBYT		;GET BYTE
	LD	H,A		;HL = ADDRESS
	XOR	A		;NO ERRORS
	RET
;
;	READ FILE LOAD REMARK
;
LDPG4	DEC	B		;NEXT
	JR	Z,LDPG2 	;DONE
	CALL	GETBYT		;GET BYTE
	JR	LDPG4		;TIL DONE
;
;	READ PROGRAM DATA BLOCK
;
LDPG5	CALL	GETBYT		;GET BYTE
	LD	H,A		;HL = ADDRESS
	DEC	B		;NEXT
	DEC	B		;NEXT
;
LDPG6	CALL	GETBYT		;GET BYTE
	LD	(HL),A		;LOAD BYTE
	CP	(HL)		;OK?
	JR	NZ,LDER4	;BAD LOAD!
	INC	HL		;NEXT
	DJNZ	LDPG6		;TIL DONE
	JR	LDPG2		;TRY AGAIN
;
;	READ 1 BYTE FROM FILE
;
GETBYT	INC	C		;NEXT
	JR	NZ,GTBYT1	;NO READ
	CALL	READNX		;READ SECTOR
	JR	NZ,LDER0	;I/O ERROR
;
GTBYT1	PUSH	BC		;SAVE B
	LD	B,BUFFER<-8	;BC => DATA
	LD	A,(BC)		;GET DATA
	POP	BC		;RESTORE B
	RET
;
;	LOAD ERROR HANDLERS
;
LDER3	LD	A,ER34		;NON-PROGRAM FILE
	DEFB	LDB		;DUMMY INST
LDER4	LD	A,ER35		;MEMORY FAULT
	PUSH	BC
LDER0	POP	BC		;IGNORE CALLER
	RET			;
;
;	OPEN PARAM LIST FOR LOAD
;
PLIST	DEFW	BUFFER		;BUFADR
	DEFW	BUFFER		;RECADR
	DEFW	0		;EODAD
	DEFB	'R'             ;READ
	DEFB	0		;LRL
	DEFB	'F'             ;FIXED LENGTH
	DEFB	3		;OPEN NEW LRL
 