;********************************************************
;*							*
;*	--  COLD START LOADER FOR CP/M V2.2  --		*
;*							*
;*	Russell Smith		7-October-80		*
;*	Herbert Koehl		5-MAR-82 added signon	*
;*							*
;********************************************************
;
	PSECT	ABS
;
MSIZE	EQU	60		;MEMORY CAPACITY IN KBYTES
MONITR	EQU	0F000H		;BASE ADDRESS OF MONITOR
	
EXTRA	EQU	MSIZE-20
BASE	EQU	.RES.(EXTRA*1024)-0200H
CBIOS	EQU	.RES.4A00H+BASE	;BASE OF CUSTOM BIOS
;
INSTAL	EQU	.RES.0900H-080H
;
CONOUT	EQU	0F00CH		;CONSOLE OUTPUT
;
;
CSRCHR	EQU	0FF76H		;CURSOR CHARACTER STORAGE LOCATION

CR	EQU	0DH		;CARRIAGE RETURN
LF	EQU	0AH		;LINE FEED

	ORG	080H
	
	

BOOT:	EQU	$
	LD	A,'_'+080H	;CHANGE CURSOR TO BLINKING UNDERSCORE

	LD	(CSRCHR),A	;NOW BOOT CPM!!
	LD	E,0		;LOAD E WITH TRACK#
	LD	HL,.RES.3400H+BASE
	LD	BC,0D02H
	CALL	RDLOOP		;READ EVEN SECTORS ON TRK 0
	LD	HL,.RES.3480H+BASE
	LD	BC,0C03H
	CALL	RDLOOP		;READ ODD SECTORS ON TRK 0
	LD	C,1		;LOAD C WITH TRACK#
	CALL	MONITR+33	;CALL MONITOR SEEK ROUTINE
	JR	NZ,ERROR-$
	LD	HL,.RES.4080H+BASE
	LD	BC,0D01H	
	CALL	RDLOOP		;READ ODD SECTORS ON TRK 1
	LD	HL,.RES.4100H+BASE
	LD	BC,0D02H
	CALL	RDLOOP		;READ EVEN SECTORS ON TRK 1
	
	LD	HL,SIGNON	;PRINT SIGNON MESSAGE
	CALL	PMSG
	JP	CBIOS		;JUMP TO CP/M COLD START ENTRY
;
;
RDLOOP:	PUSH	HL		;SAVE PARAMETERS
	PUSH	BC
	CALL	MONITR+36	;CALL MONITOR DISK READ ROUTINE
	POP	BC
	POP	HL
	JR	NZ,ERROR-$	;READ ERROR IF Z FLAG SET
	INC	H		;BUMP DATA POINTER BY 256
	INC	C
	INC	C		;BUMP SECTOR# BY 2
	DJNZ	RDLOOP-$
	RET
;
;
ERROR:	LD	HL,MSG		;POINT TO ERROR MESSAGE
	CALL	PMSG		;CALL PRINT ROUTINE
	JP	MONITR+3	;JUMP BACK TO MONITOR

PMSG:	EQU	$
	LD	A,(HL)		;GET CHARACTER
	CP	'$'		;CHECK FOR END OF MESSAGE
	INC	HL
	RET	Z		;RETURN IF WE ARE AT THE END OF MESSAGE
	CALL	POUT		;OUTPUT TO MONITOR CONSOLE IF WE ARE NOT AT END
	JR	PMSG		;PRINT ANOTHER BYTE

POUT:	EQU	$
	JP	CONOUT		;CONSOLE OUTPUT
	
MSG:	EQU	$
	DEFB	'B'+080H	;CREATE A FLASHING BOOT FAILED MESSAGE
	DEFB	'O'+080H
	DEFB	'O'+080H
	DEFB	'T'+080H
	DEFB	' '
	DEFB	'F'+080H
	DEFB	'A'+080H
	DEFB	'I'+080H
	DEFB	'L'+080H
	DEFM	'$'
;
SIGNON:	EQU	$
	DEFB	01AH
	DEFM	'60K CP/M 2.2 |L0.3|'
	DEFB	LF
	DEFM	'$'
	END
