SCOTT  ;		* * * * * * * * * * * * *
 ;		*  PROGRAM BY KIM WATT  *
 ;		* BREEZE COMPUTING INC. *
 ;		*     P.O. BOX  1013    *
 ;		* BERKLEY, MICH.  48072 *
 ;		*    (313)  288-9422    *
 ;		* * * * * * * * * * * * *																			
 ENTRY	DI			;NO INTERRUPTIONS
 	LD	A,0C3H		;"JUMP" OPCODE
 	LD	HL,GETSTR	;KEYBOARD INPUT ROUTINE
 	LD	(7494H),A
 	LD	(7495H),HL	;"NEW" KEYBOARD ROUTINE
 	LD	(77CFH),A
 	LD	HL,GETGAM
 	LD	(77D0H),HL
 	LD	(7BEAH),A
 	LD	HL,SAVGAM
 	LD	(7BEBH),HL	;NEW SAVE GAME ROUTINE
 	LD	HL,7BF7H
 	LD	(HL),0C9H	;NEW RETURN INSTRUCTION
 	LD	HL,7C24H	;"CLOSE" ROUTINE
 	LD	(HL),0C9H	;NOT NEEDED ANYMORE
 	LD	HL,8755H	;"CLOSE" ROUTINE
 	LD	(HL),0C9H	;DON'T NEED THIS EITHER
 	LD	HL,BYE		;INTERCEPT DOS RETURN
 	LD	(86CCH),HL
 	LD	(86ECH),HL
 	LD	HL,NEWRED	;NEW DISK READ ROUTINE
 	LD	(8896H),HL	;FIX IT
 	LD	HL,FASTER	;FASTER I/O
 	LD	DE,89B7H
 	LD	BC,27
 	LDIR
 	LD	A,34H
 	LD	(8A4AH),A	;ADVENTURE 1-4
 	LD	HL,NEWLOD	;NEW LOADER ROUTINE
 	LD	(89EDH),HL
 	JP	7050H		;START ADVENTURE
 ;  ROUTINE TO READ MULTIPLE SECTORS INTO RAM
 ;	 L = # OF SECTORS TO READ
 ;	DE = START TRACK/SECTOR
 ;	BC = LOAD ADDRESS
 ;	ZERO FLAG SET IF READ IS SUCCESSFUL
 READ	PUSH	HL		;SAVE LOOP COUNT
 READLP	CALL	READ2		;2 TRIES FOR SUCCESS
 	POP	HL		;RESTORE COUNT
 	JP	NZ,DERROR	;BAD AFTER 2 TRIES
 	DEC	L		;REDUCE
 	RET	Z		;DONE WITH READ
 	PUSH	HL		;SAVE AGAIN
 	INC	E		;NEXT SECTOR
 	LD	A,E		;PASS TO ACCUM.
 	SUB	0AH		;10 SECTORS ?
 	JR	NZ,READLP	;MORE SECTORS
 	LD	E,A		;0 TO E
 	INC	D		;NEXT TRACK
 	JR	READLP		;GO SOME MORE
 READ2	PUSH	BC		;SAVE LOAD ADDRESS
 	CALL	READ1		;READ IT ONE TIME
 	POP	HL		;LOAD ADDRESS INTO HL
 	RET	Z		;SUCCESSFUL AFTER 1 TRY
 	LD	B,H		;RESET LOAD ADDRESS
 	LD	C,L		;	INTO BC
 READ1	LD	(37EEH),DE	;TRACK/SECTOR
 	CALL	SELECT		;SELECT DRIVE & TEST
 ;  IF DRIVE IS NOT READY, PROGRAM WILL NOT RETURN
 	LD	HL,37ECH	;COMMAND REGISTER
 	LD	A,(SKTYPE)	;GET SEEK TYPE BYTE
 	LD	(HL),A		;PASS TO CONTROLLER
 	PUSH	AF		;8 MS DELAY
 	POP	AF
 	PUSH	AF
 	POP	AF
 READBZ	LD	A,(HL)		;GET STATUS BYTE
 	RRCA			;SHIFT BUSY BIT
 	JR	C,READBZ	;NOT FOUND YET
 	DEFB	3EH		;LOAD ACCUMULATOR WITH
 RDTYPE	DEFB	88H		;READ SECTOR BYTE
 	LD	(HL),A		;PASS TO CONTROLLER
 	PUSH	DE		;SAVE TRACK/SECTOR
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	PUSH	BC		;4 MORE MS DELAY
 	POP	BC
 	JR	RDTEST		;READ TEST
 RDDONE	RRCA			;SHIFT COMMAND DONE BIT
 	JR	NC,READOK	;NOT SET = DONE
 RDTEST	LD	A,(HL)		;GET STATUS
 	BIT	1,A		;VALID DATA PRESENT ?
 	JR	Z,RDDONE	;IS READ DONE ?
 	LD	A,(DE)		;GET THE VALID BYTE
 	LD	(BC),A		;PUT INTO LOAD BUFFER
 	INC	BC		;POINT TO NEXT
 	JR	RDTEST		;ANY MORE DATA ?
 READOK	LD	A,(HL)		;GET STATUS/RESET LATCH
 	BIT	2,A		;DATA LOST DURING XFER ?
 	POP	DE		;RESTORE TRK/SEC
 	RET	Z		;SUCCESSFUL READ
 	LD	(HL),0D0H	;FORCED INTERRUPT
 	RET			;Z FLAG IS RESET/ERROR
 TRACKS	DEFB	35		;# OF TRACKS ON DISK
 ;  ROUTINE TO WRITE DISK SECTORS
 ;	 L = # OF SECTORS TO WRITE
 ;	DE = START TRACK/SECTOR
 ;	BC = DATA ADDRESS
 ;	ZERO FLAG SET IF WRITE IS SUCCESSFUL
 WRITE	PUSH	HL		;SAVE LOOP COUNT
 ;  SEE SIMILAR REMARKS FOR READ SECTORS
 	CALL	STATCK		;CHECK DISK STATUS
 WRITEL	CALL	WRITE2
 	POP	HL
 	JP	NZ,DERROR	;DISK ERROR ROUTINE
 	DEC	L
 	RET	Z
 	PUSH	HL
 	INC	E
 	LD	A,E
 	SUB	0AH
 	JR	NZ,WRITEL
 	LD	E,A
 	INC	D
 	JR	WRITEL
 WRITE2	PUSH	BC
 	CALL	WRITE1
 	POP	HL
 	RET	Z
 	LD	B,H
 	LD	C,L
 WRITE1	LD	(37EEH),DE
 	CALL	SELECT		;SELECT DRIVE
 	LD	HL,37ECH
 	DEFB	3EH		;LOAD ACCUMULATOR
 SKTYPE	DEFB	1BH		;SLOW SEEK BYTE
 	LD	(HL),A		;PASS TO CONTROLLER
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 WRITEZ	LD	A,(HL)
 	RRCA
 	JR	C,WRITEZ
 	DEFB	3EH		;LOAD ACCUMULATOR
 ;  ALL WRITING IS READ PROTECTED UNLESS MODIFIED
 WRTYPE	DEFB	0A9H		;WRITE SECTOR BYTE
 	LD	(HL),A		;PASS TO CONTROLLER
 	PUSH	DE
 	LD	DE,37EFH
 	PUSH	BC
 	POP	BC
 	JR	WRITET
 WRITED	RRCA
 	JR	NC,WRITEO
 WRITET	LD	A,(HL)
 	BIT	1,A
 	JR	Z,WRITED
 	LD	A,(BC)
 	LD	(DE),A
 	INC	BC
 	JR	WRITET
 WRITEO	LD	A,(HL)
 	BIT	2,A
 	POP	DE
 	RET	Z
 	LD	(HL),0D0H
 	RET			;FLAGS ARE SET
 ;  THIS ROUTINE WILL CATCH ALL DISK ERRORS
 ;	A WILL CONTAIN LAST STATUS BYTE
 DERROR	BIT	2,A		;DATA LOST FLAG
 	LD	HL,ERMSG1	;ERROR MESSAGE
 	JR	NZ,ERSHOW	;SHOW IS THAT'S IT
 	BIT	4,A		;TRACK/SECTOR NOT FOUND
 	LD	HL,ERMSG2
 	JR	NZ,ERSHOW
 	BIT	3,A		;ERROR IN DATA FIELD
 	LD	HL,ERMSG3
 	JR	NZ,ERSHOW
 	LD	HL,ERMSG4
 ERSHOW	CALL	SHOW
 	JP	STOP		;TERMINATE PROGRAM
 SHOW	LD	A,(HL)		;GET A CHARACTER
 	INC	HL		;POINT TO NEXT
 	CP	3		;TERMINATOR ?
 	RET	Z		;DONE IF YES
 	CALL	33H		;DISPLAY THE BYTE
 	JR	SHOW		;BACK FOR MORE
 ERMSG1	DEFB	0DH
 	DEFM	'DATA LOST DURING DISK I/O OPERATION.'
 	DEFB	3
 ERMSG2	DEFB	0DH
 	DEFM	'TRACK/SECTOR NOT FOUND DURING DISK'
 	DEFM	' I/O OPERATION.'
 	DEFB	3
 ERMSG3	DEFB	0DH
 	DEFM	'ERROR IN DATA ID FIELD ON DISKETTE.'
 	DEFB	3
 ERMSG4	DEFB	0DH
 	DEFM	'UNIDENTIFIED ERROR HAS BEEN DETECTED.'
 	DEFB	3
 SELECT	DEFB	3EH		;LOAD ACCUMULATOR
 DRIVE	DEFB	1		;WITH THIS BYTE
 	LD	(37E1H),A	;PASS TO CONTROLLER
 	RET			;DONE WITH SELECT
 STATCK	PUSH	BC		;SAVE ALL THE POINTERS
 	PUSH	DE
 	PUSH	HL
 	CALL	SELECT		;SELECT THE DRIVE
 	LD	BC,0		;1 SECOND DELAY LOOP
 	CALL	60H		;TO WAIT FOR MOTOR SPEED
 	LD	A,(37ECH)	;GET STATUS BYTE
 	LD	HL,ERMSG5	;DRIVE NOT READY
 	BIT	7,A
 	JP	NZ,ERSHOW	;SHOW THE ERROR
 	LD	HL,ERMSG6	;DRIVE NOT IN SYSTEM
 	BIT	2,A
 	JP	Z,ERSHOW
 	LD	HL,ERMSG7	;WRITE PROTECTED
 	BIT	6,A
 	JP	NZ,ERSHOW
 	LD	HL,ERMSG8	;NO SYSTEM IN DRIVE
 	LD	BC,00CDH	;LOOP COUNTER
 LP1	DEC	BC
 	LD	A,B		;GET MSB
 	OR	C		;ANY BITS SET ?
 	JP	Z,ERSHOW
 	LD	(37ECH),A	;READY YET ?
 	AND	2
 	JR	NZ,LP1		;WAIT SOME MORE
 	LD	HL,ERMSG9	;DOOR NOT CLOSED
 	LD	BC,199DH	;LOOP COUNT
 LP2	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,ERSHOW
 	LD	A,(37ECH)
 	AND	2
 	JR	Z,LP2
 	LD	DE,0
 	LD	BC,00BAH
 	LD	HL,ERMSG0	;NO DISKETTE IN DRIVE
 LP3	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,ERSHOW
 	INC	DE
 	LD	A,(37ECH)
 	AND	2
 	JR	NZ,LP3
 	LD	BC,1720H
 	LD	HL,ERMSG9	;DOOR NOT CLOSED
 LP4	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,ERSHOW
 	INC	DE
 	LD	A,(37ECH)
 	AND	2
 	JR	Z,LP4
 	LD	HL,0EACBH
 	ADD	HL,DE
 	LD	HL,ERMSGU	;DISKETTE HARD SECTORED
 	JP	NC,ERSHOW
 	POP	HL		;RESTORE ALL POINTERS
 	POP	DE
 	POP	BC
 	RET			;DONE WITH DIAGNOSTICS
 ERMSG5	DEFB	0DH
 	DEFM	'DRIVE IS NOT READY FOR DATA TRANSFER.'
 	DEFB	3
 ERMSG6	DEFB	0DH
 	DEFM	'DRIVE IS NOT IN THE SYSTEM.'
 	DEFB	3
 ERMSG7	DEFB	0DH
 	DEFM	'DISKETTE IS WRITE PROTECTED.'
 	DEFB	3
 ERMSG8	DEFB	0DH
 	DEFM	'NO SYSTEM IN THE DRIVE.'
 	DEFB	3
 ERMSG9	DEFB	0DH
 	DEFM	'DOOR NOT CLOSED ON DRIVE.'
 	DEFB	3
 ERMSG0	DEFB	0DH
 	DEFM	'NO DISKETTE IN DRIVE.'
 	DEFB	3
 ERMSGU	DEFB	0DH
 	DEFM	'DISKETTE IS HARD SECTORED AND'
 	DEFM	' IS UNUSABLE.'
 	DEFB	3
 STOP	CALL	DISPLY		;DISPLAY FOLLOWING
 	DEFW	0D0DH
 	DEFM	'PROGRAM CANNOT CONTINUE '
 	DEFM	'BECAUSE OF DETECTED ERROR.'
 	DEFB	0DH
 	DEFM	'PRESS <ENTER> TO TRY AGAIN. '
 	DEFB	0
 	CALL	GETSTR
 	POP	HL
 	POP	DE
 	POP	BC
 	POP	HL
 	JP	WRITE		;STACK IS RESTORED
 STRING	EQU	8AA3H		;KEYBOARD INPUT BUFFER
 LENGTH	DEFB	0		;LENGTH OF INPUT STRING
 REQLEN	DEFB	0		;REQUESTED LENGTH
 CHAR	DEFB	0		;LAST INPUT CHARACTER
 GETSTR	PUSH	AF		;SAVE 'EM
 	LD	A,18		;INPUT LENGTH
 	LD	(REQLEN),A	;SAVE IT
 NEWST	LD	HL,(8C23H)	;GET CURSOR POSITION
 	LD	DE,STRING	;POINT TO BUFFER
 	LD	A,20H		;ASCII SPACE
 LOOP15	LD	(HL),A		;INTO VIDEO
 	LD	(DE),A		;INTO BUFFER
 	INC	DE		;	NEXT
 	INC	HL		;    TYPED INTO
 	DJNZ	LOOP15		;NEXT SPACE
 	XOR	A		;ZERO THE ACCUMULATOR
 	LD	(LENGTH),A	;INITIALIZE LENGTH
 	LD	HL,STRING	;SET POINTER TO BEGINNING
 ;					OF BUFFER AREA
 	LD	DE,(8C23H)	;GET CURSOR POSITION
 SCAN	LD	A,5FH		;CURSOR CHARACTER
 	LD	(DE),A		;CURSOR ON
 	LD	BC,500H		;DELAY COUNT
 LOOP1	DEC	BC		;START COUNT
 	PUSH	BC		;SAVE COUNT
 	PUSH	DE		;MUST SAVE
 	PUSH	IY		;   <DE> AND <IY>
 	CALL	2BH		;ROM KEYBOARD SCAN
 	POP	IY		;RESTORE
 	POP	DE		;   <DE> AND <IY>
 	POP	BC		;RESTORE COUNT
 	OR	A		;SET FLAGS
 	JP	NZ,GOTONE	;IF KEY WAS PRESSED
 	LD	A,B		;TEST <BC> REG. FOR
 	OR	C		;   ZERO VALUE
 	JR	NZ,LOOP1	;GO BACK IF NOT DONE
 	LD	A,20H		;CURSOR CHARACTER
 	LD	(DE),A		;CURSOR OFF
 	LD	BC,500H		;DELAY COUNT
 LOOP2	DEC	BC		;START COUNT
 	PUSH	BC		;SAVE COUNT
 	PUSH	DE		;MUST SAVE
 	PUSH	IY		;   <DE> AND <IY>
 	CALL	2BH		;ROM KEYBOARD SCAN
 	POP	IY		;RESTORE
 	POP	DE		;   <DE> AND <IY>
 	POP	BC		;RESTORE COUNT
 	OR	A		;SET FLAGS
 	JP	NZ,GOTONE	;NEW KEY IF <ACC> >< 0
 	LD	A,B		;GET VALUE OF B
 	OR	C		;ANY BITS ON ?
 	JR	NZ,LOOP2	;NEXT LOOP
 	JR	SCAN		;DO IT AGAIN
 ;  KEY PRESSED IS IN <A> REG.
 GOTONE	LD	(CHAR),A	;SAVE INPUT CHARACTER
 	CP	0DH		;IS IT A CARRIAGE RETURN
 	JP	Z,DONE		;GO IF IT IS
 	CP	8		;IS IT A BACKSPACE
 	JR	Z,BCKSPA	;SEE IF IT'S OK
 	CP	18H		;SHIFT LEFT ARROW
 	JR	Z,NEWST		;INITIALIZE IF YES
 	CP	20H		;SEE IF A NON-ALPHA KEY
 	JP	C,SCAN		;   WAS PRESSED
 	LD	A,(REQLEN)	;GET REQUESTED LENGTH
 	LD	B,A		;GIVE VALUE TO <B> REG.
 	LD	A,(LENGTH)	;GET CURRENT LENGTH
 	CP	B		;COMPARE VALUES
 	JR	NC,SCAN		;TOO MANY CHARACTERS
 ;  HERE THE NEW KEY IS DISPLAYED AND STORED IN <STRING>
 	LD	A,(CHAR)	;RESTORE INPUT CHARACTER
 	LD	(DE),A		;PUT IT ON VIDEO
 	LD	(HL),A		;PUT IT IN BUFFER
 	INC	DE		;INCREMENT <HL> AND <DE>
 	INC	HL		;    TABLE POINTERS
 	LD	A,(LENGTH)	;GET LENGTH
 	INC	A		;ADD 1
 	LD	(LENGTH),A	;SAVE VALUE
 	JR	SCAN		;GET NEXT KEY
 BCKSPA	LD	A,(LENGTH)	;GET CURRENT LENGTH
 	OR	A		;SET FLAGS
 	JR	Z,SCAN		;NO CHARACTERS IN BUFFER
 	DEC	A		;SUBTRACT 1
 	LD	(LENGTH),A	;NEW LENGTH
 	LD	A,20H		;CURSOR OFF CHAR.
 	LD	(DE),A		;CURSOR OFF
 	LD	(HL),A		;PUT SPACE IN BUFFER
 	DEC	HL		;DECREMENT BOTH
 	DEC	DE		;    TABLE POINTERS
 	JR	SCAN		;GET ANOTHER KEY
 DONE	LD	A,20H		;ASCII - SPACE
 	LD	(DE),A		;CURSOR OFF
 	LD	(HL),0H		;CARRIAGE RETURN
 	LD	A,(LENGTH)	;GET LENGTH
 	LD	B,A		;GIVE TO B REG.
 	LD	A,(STRING)	;GET FIRST INPUT CHAR.
 	LD	HL,STRING	;POINT TO BUFFER
 	POP	AF		;RESTORE 'EM
 	RET			;ALL DONE
 ;  SAVE GAME ROUTINE
 SAVGAM	LD	A,(8AA2H)	;DISK OR CASSETTE ?
 	OR	A		;SET FLAGS
 	LD	HL,7C0CH	;READY CASSETTE MESSAGE
 	JP	Z,7BF1H		;CASSETTE OUTPUT
 	CALL	DISPLY		;PROMPT
 	DEFB	0DH
 	DEFM	'ENTER GAME # TO SAVE (1-9) ? '
 	DEFB	0
 	CALL	GETSTR
 	CP	40H		;MORE THAN 9 ?
 	JR	NC,SAVGAM	;INVALID RESPONSE
 	CP	31H		;LESS THAN 1 ?
 	JR	C,SAVGAM	;INVALID RESPONSE
 	SUB	30H		;REMOVE ASCII
 	LD	E,A		;GIVE TO SECTOR REGISTER
 	LD	D,0		;TRACK REGISTER
 	LD	HL,1		;# OF SECTORS
 	LD	BC,8AA3H	;DATA LOCATION
 	CALL	WRITE		;WRITE THE SECTOR
 	RET			;DONE WITH SAVE
 ;  ROUTINE TO RESTORE A PREVIOUSLY SAVED GAME
 GETGAM	LD	A,(8AA2H)	;GET DISK OR CASSETTE
 	OR	A		;SET FLAGS
 	JP	Z,7860H		;GET IT FROM CASSETTE
 	CALL	DISPLY		;FIND OUT WHICH ONE
 	DEFB	0DH
 	DEFM	'WHICH GAME TO RESTORE (1-9) ? '
 	DEFB	0
 	CALL	GETSTR
 	CP	40H
 	JR	NC,GETGAM
 	CP	31H
 	JR	C,GETGAM
 	SUB	30H		;REMOVE ASCII
 	LD	E,A		;SECTOR OF DATA
 	LD	D,0		;TRACK OF DATA
 	LD	HL,1		;# OF SECTORS
 	LD	BC,8AA3H	;WHERE TO LOAD DATA
 	CALL	READ		;READ IT
 	LD	A,(8AA3H)	;GET FIRST BYTE
 	OR	A		;SET FLAGS
 	JP	NZ,77FEH	;BACK TO ADVENTURE
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'THAT GAME WAS NOT PREVIOUSLY SAVED !'
 	DEFB	0
 	JP	77BCH		;TRY AGAIN
 DISPLY	POP	HL		;GET DATA ADDRESS
 DISP1	LD	A,(HL)		;GET A BYTE
 	INC	HL		;POINT TO NEXT
 	OR	A		;SET FLAGS
 	JR	Z,DISPDN	;TERMINATOR REACHED
 	CALL	33H		;DISPLAY IT
 	JR	DISP1		;AGAIN
 DISPDN	PUSH	HL
 	RET			;DONE
 BYE	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'PROGRAM TERMINATED DUE TO ERROR !'
 WHOA	JR	WHOA
 NEWRED	LD	BC,(84C0H)
 	LD	DE,(84C6H)
 	LD	HL,1
 	CALL	READ		;READ ONE SECTOR
 	LD	(84C0H),BC	;LOAD ADDRESS
 	LD	(84C6H),DE	;TRACK/SECTOR
 	RET
 FASTER	DEFM	'FIVE SECONDS PLEASE.    '
 NEWLOD	LD	A,(84B0H)	;GET SELECTION
 	CP	1
 	JR	Z,GAM1
 	CP	2
 	JR	Z,GAM2
 	CP	3
 	JR	Z,GAM3
 	CP	4
 	JR	Z,GAM4
 	LD	A,0FFH
 	OR	A
 	RET
 GAM1	LD	HL,0100H
 	LD	(84C6H),HL
 	XOR	A
 	RET
 GAM2	LD	HL,0800H
 	LD	(84C6H),HL
 	XOR	A
 	RET
 GAM3	LD	HL,0F00H
 	LD	(84C6H),HL
 	XOR	A
 	RET
 GAM4	LD	HL,1600H
 	LD	(84C6H),HL
 	XOR	A
 	RET
