BOOT2  ;		* * * * * * * * * * * * *
 ;		*  PROGRAM BY KIM WATT  *
 ;		* BREEZE COMPUTING INC. *
 ;		*     P.O. BOX  1013    *
 ;		* BERKLEY, MICH.  48072 *
 ;		*    (313)  288-9422    *
 ;		* * * * * * * * * * * * * 												
 ;
 ;	THIS IS A COMPLETE LOADER THAT WILL ALLOW
 ;	THE USER TO LOAD ANY NUMBER OF SECTORS
 ;	UP TO 255.  USER MAY ALSO REQUEST KEYBOARD
 ;	WHILE DISPLAYING PROMPTING MESSAGES.  THIS WILL
 ;	ALLOW THE LOADING OF SEVERAL VERSIONS.  USER
 ;	NEED ONLY TO TIE INTO THE KEYBOARD DECODING
 ;	AND JUMP VECTORS SUPPLIED HERE.
 ;
 ;	THE DIRECTORY IS NOT CONSULTED AND MAY BE
 ;	DESTROYED TO PREVENT TAMPERING WITH PROGRAMS.
 ;
 ;	THIS LOADER WILL AUTOMATICALLY TRANSFER CONTROL
 ;	TO THE LOADED PROGRAM.  THIS MAY BE INTERCEPTED
 ;	IF THE USER DESIRES TO LOAD ONLY AND EXECUTE
 ;	ELSEWHERE.
 ;
 ;	IT IS UP TO THE USER TO BE SURE THAT THIS PROGRAM
 ;	DOES NOT OCCUPY MORE THAN 255 BYTES, AS THIS IS
 ;	ALL THAT CAN BE LOADED BY THE ROM.
 ;	IT IS ALSO UP TO THE USER TO PROVIDE A MACHINE
 ;	LANGUAGE PROGRAM ON THE SPECIFED LOAD SECTORS
 ;	TO BE SURE THAT CONTROL IS PASSED CORRECTLY.
 ;
 ;	THIS PROGRAM WILL ALSO CHECK FOR LOAD ERRORS
 ;	AND THE USER MAY PROVIDE AN ERROR MESSAGE.
 ;	ANY KEY PRESSED WILL RE-TRY TO BOOT.
 ;
 ;
 ;  USER MAY SELECT A VERSION ETC. TO BE LOADED
 ;  PROGRAM WILL WAIT FOR KEYBOARD INPUT AND
 ;  LOAD THE RESPECTIVE SECTORS
 ;
 	ORG	4200H		;ALL LOADERS START HERE
 ENTRY	DI			;CAN'T BE BOTHERED
 	LD	SP,4200H	;BUILDS DOWNWARD
 	CALL	DISPLY		;DISPLAY FOLLOWING MESS.
 ;  PROGRAM EXECUTION WILL BE RETURNED TO THE FIRST
 ;	INSTRUCTION AFTER BYTE 0.
 	DEFB	1CH		;HOME CURSOR BYTE
 	DEFB	1FH		;CLEAR TO END OF SCREEN
 ;	USER DISPLAY MESSAGE
 	DEFM	'-INVADERS LOADER BY BREEZE COMPUTING-'
 	DEFW	0D0DH		;CARRIAGE RETURNS
 ;  THESE ROUTINE ARE FOR DISPLAY PURPOSES ONLY.
 ;	THE ACTUAL PROGRAMS ARE NOT SUPPLIED.
 	DEFM	'<1>  SOUND VERSION'
 	DEFB	0DH
 	DEFM	'<2>  QUIET VERSION'
 	DEFB	0DH
 	DEFB	20H
 	DEFB	'?'
 	DEFB	0		;END OF MESSAGE MARKER
 GETKEY	CALL	2BH		;SCAN KEYBOARD
 	OR	A		;ASCII IN A - SET FLAGS
 	JR	Z,GETKEY	;NO KEY WAS PRESSED
 	CP	31H		;	1 ?
 	LD	DE,0300H	;TRACK/SECTOR OF DATA
 	LD	BC,5300H	;PROGRAM LOAD ADDRESS
 	JP	Z,SELECT	;READ PROGRAM FROM DISK
 	CP	32H		;	2 ?
 	LD	DE,0800H	;TRACK/SECTOR
 	LD	BC,5300H	;LOAD ADDRESS
 	JP	NZ,GETKEY	;INVALID KEY PRESSED
 SELECT	PUSH	BC		;SAVE LOAD ADDRESS
 	LD	HL,0023H	;# OF SECTORS TO READ
 	PUSH	HL		;SAVE ON STACK
 AGAIN	LD	A,1		;SELECT
 	LD	(37E1H),A	;	DRIVE 0
 ;
 	CALL	READ		;READ A SECTOR
 	JP	NZ,ERROR	;UNSUCCESSFUL READ
 	POP	HL		;GET SECTOR COUNT
 	DEC	L		;DECREMENT COUNTER
 	JP	Z,5AE8H		;ENTRY POINT
 ; THIS RETURN INSTRUCTION WILL TRANSFER CONTROL
 ;	TO THE PROGRAM THAT WAS JUST LOADED.
 ;	USER MAY POP THIS VALUE AND JUMP ELSEWHERE.
 	PUSH	HL		;PUSH COUNT BACK ON STACK
 	INC	E		;INCREMENT SECTOR POINTER
 	LD	A,E		;TEST IS SECTOR COUNT IS
 	SUB	0AH		;   OVER 10
 	JP	NZ,AGAIN	;BACK FOR NEXT SECTOR
 	LD	E,A		;SECTOR COUNT -10
 	INC	D		;INCREMENT TRACK COUNT
 	JP	AGAIN		;GET NEXT SECTOR
 READ	PUSH	BC		;SAVE BEGINNING POINTER
 	CALL	READIT		;READ THE SECTOR
 	POP	HL		;CURRENT LOAD POINTER
 	RET	Z		;READ WAS SUCCESSFUL
 ;  IF THE FIRST READ IS UNSUCCESSFUL, ONE MORE TRY !
 	LD	B,H		;TRANSFER POINTER
 	LD	C,L		;   TO BYTE COUNTER
 READIT	LD	(37EEH),DE	;TRACK/SECTOR TO SEEK
 	LD	HL,37ECH	;COMMAND REGISTER
 	LD	(HL),1BH	;SEEK COMMAND
 ;	RESULT:	LOAD HEAD
 ;		DO NOT VERIFY
 ;		STEPPER MOTOR AT 20 MS.
 ;		SEEK TRACK AND SECTOR
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 ;  SMALL DELAY FOR THE CONTROLLER STATUS TO BECOME VALID
 TESTBZ	LD	A,(HL)		;GET CONTROLLER STATUS
 	RRCA			;BIT 0 IS SET IF COMMAND
 	JP	C,TESTBZ	;	IN PROGRESS
 	LD	(HL),80H	;READ SECTOR BYTE
 ;	RESULT:	SINGLE SECTOR READ
 ;		IBM 3740 DATA FORMAT (STANDARD)
 ;		HEAD ASSUMED ENGAGED
 	PUSH	DE		;SAVE TRACK/SECTOR
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 ;  SMALL DELAY FOR THE CONTROLLER STATUS TO BECOME VALID
 	JP	BZTEST		;WAIT FOR READY
 TEST	RRCA			;BIT 0 SET IF BUSY
 	JP	NC,TEST1	;NOT READY YET
 BZTEST	LD	A,(HL)		;GET STATUS BYTE
 	BIT	1,A		;BIT 1 IS SET IF 37EF
 	JP	Z,TEST		;  CONTAINS VALID BYTE
 	LD	A,(DE)		;GET THE NEW BYTE
 	LD	(BC),A		;SAVE IN BUFFER
 	INC	BC		;POINT TO NEXT LOAD ADDR.
 	JP	BZTEST		;WAIT FOR NEXT BYTE
 TEST1	LD	A,(HL)		;GET STATUS BYTE
 	XOR	A		;RESET FLAGS
 ;	COULD BE COMPARE WITH C5 TO TEST ACTUAL VALIDITY
 	POP	DE		;RESTORE LOAD POINTER
 	RET	Z		;SUCCESSFUL READ
 	LD	(HL),0D0H	;FORCE INTERRUPT OF DISK
 	RET			;DISK ERROR
 ERROR	CALL	DISPLY		;DISPLAY MESSAGE
 	DEFB	17H		;VIDEO DOUBLE SIZE
 ;  USER ERROR MESSAGE IF I/O ERROR DURING LOAD PROCESS
 	DEFM	'!!   DISK ERROR   !!'
 	DEFB	0		;END OF MESSAGE
 	HALT
 ;  ADDRESS OF WHERE ERROR WAS GENERATED IS ON STACK
 ;	USER MAY RETRY-TO READ BY PRESSING ANY KEY
 DISPLY	POP	HL
 ;  FIRST BYTE AFTER CALL IS FIRST BYTE OF MESSAGE
 LOOPER	LD	A,(HL)		;GET MESSAGE BYTE
 	OR	A		;SET FLAGS
 	INC	HL		;POINT TO NEXT BYTE
 	JP	Z,DONE		;END OF MESSAGE READ
 	CALL	33H		;DISPLAY BYTE ON VIDEO
 	JP	LOOPER		;DO IT AGAIN
 DONE	PUSH	HL
 ;  HL POINTS TO NEXT BYTE AFTER DATA WHICH IS ALSO
 ;	THE RETURN ADDRESS OF THE ROUTINE.
 	RET			;BACK TO WORK
 	END	ENTRY
