SHOW   ;      PROGRAM TO SELECT A DISK SECTOR, READ IT IN,
 ;      AND DISPLAY IT TO THE VIDEO SCREEN.
 ;
 DR0	EQU	01
 SECTOR	EQU	37EEH	;SECTOR SELECT ADDRESS
 DATA	EQU	37EFH	;TRACK SELECT & DATA TRANSFER
 STATUS	EQU	37ECH	;CONTROLLER STAT. /COMMAND ADDRESS
 DRIVE	EQU	37E1H	;DRIVE SELECT / 0=1:1=2:2=4:3=8
 SEEK	EQU	1BH	;LOAD INTO COMMAND REG.
 READ	EQU	88H	;DITTO
 RESTOR	EQU	01	;MOVES HEAD TO TRACK 0
 KEY	EQU	0049H	;SIMULATE INKEY$ AT 02BH
 CLS	EQU	01C9H
 	ORG	7000H
 START	DI
 	LD	SP,41FCH
 	CALL	CLS
 	LD	HL,MSGI		;INTRO MESSAGE
 	CALL	PRNT1
 LP1	CALL	KEY
 	CP	0DH		;ENTER ?
 	JR	NZ,LP1
 	CALL	CLS		;CLEAR SCREEN
 ASK1	LD	HL,MSG5
 	LD	DE,3E00H
 	LD	BC,07
 	PUSH	DE
 	PUSH	HL
 	PUSH	BC
 	LDIR
 	POP	BC
 	POP	HL
 	LD	DE,3E80H
 	LDIR
 	POP	DE
 	LD	HL,MSG1		;ASK FOR TRACK #
 	LD	BC,05
 	LDIR
 	EX	DE,HL
 	LD	B,01
 	CALL	INPUT		;GET TRACK #
 	CP	59	; (+) INC. TRACK # ?
 	JR	Z,PLUS
 	CP	45	; (-) DEC. TRACK # ?
 	JP	Z,MINUS
 	CP	40	;TRACK # TOO HIGH ?
 	JR	NC,ASK1
 	LD	D,A	;PUT IT IN D
 	PUSH	DE
 	LD	DE,3E80H
 	LD	HL,MSG2		;ASK FOR SECTOR #
 	LD	BC,05
 	LDIR
 	EX	DE,HL
 	LD	B,0
 	CALL	INPUT		;GET SECTOR #
 	POP	DE
 	CP	0AH	;SECTOR # TOO HIGH ?
 	JR	NC,ASK1
 	LD	E,A		;PUT IT IN E
 HOP	LD	(TRKSEC),DE	;SAVE TRK & SEC
 AGAIN	LD	BC,BUFF
 	CALL	GETSEC		;READ SECTOR INTO BUFFER
 	JR	NZ,AGAIN	;TRY AGAIN IF READ ERROR
 	CALL	SECPNT		;PRINT SECTOR TO SCREEN
 	LD	HL,MSG3
 	LD	DE,3C40H
 	LD	BC,05
 	LDIR
 	LD	DE,(TRKSEC)
 	PUSH	DE
 	LD	A,D
 	CALL	ASC1
 	LD	(3C81H),A	;UPDATE TRK# ON SCREEN
 	LD	A,D
 	CALL	ASC2
 	LD	(3C82H),A
 	LD	A,48H
 	LD	(3C83H),A
 	LD	HL,MSG4
 	LD	DE,3D00H
 	LD	BC,06
 	LDIR
 	POP	DE
 	LD	A,E
 	CALL	ASC1
 	LD	(3D41H),A	;UPDATE SECT.# ON SCREEN
 	LD	A,E
 	CALL	ASC2
 	LD	(3D42H),A
 	LD	A,48H
 	LD	(3D43H),A
 	JP	ASK1	;GO BACK & DO IT AGAIN
 PLUS	LD	DE,(TRKSEC)	;GET LAST SEC. PRINTED
 	INC	E		;BUMP SECTOR
 	LD	A,E
 	CP	0AH		;TOO HIGH ?
 	JR	C,HOP
 	LD	E,0		;RESET SECTOR
 	INC	D		;BUMP TRACK
 	LD	A,D
 	CP	40		;TOO HIGH ?
 	JR	C,HOP
 	LD	D,0		;RESET TRACK
 	JR	HOP
 MINUS	LD	DE,(TRKSEC)	;GET LAST SEC. PRINTED
 	DEC	E		;DECREMENT SECTOR
 	JP	P,HOP		;JUMP IF NOT < 0
 	LD	E,09		;FIX IF < 0
 	DEC	D		;DECREMENT TRACK
 	JP	P,HOP		;JUMP IF NOT < 0
 	LD	DE,0000		;RESET IF < 0
 	JR	HOP		;BACK TO THE PROGRAM
 ASC1	AND	0F0H	;CONVERT 1 BYTE HEX CODE INTO
 	SRL	A	;A TWO BYTE ASCII CODE TO BE
 	SRL	A	;PRINTED TO THE SCREEN.
 	SRL	A
 	SRL	A
 COMM	CP	0AH
 	JR	C,AD1
 	ADD	A,07
 AD1	ADD	A,30H
 	RET
 ASC2	AND	0FH	;PROCESS SECOND HALF
 	JR	COMM
 	LD	A,D
 ;    SECTOR READ ROUTINE STARTS HERE   <<<<<<<<<<<<<<<<<<
 GETSEC	LD	A,DR0
 	LD	(DRIVE),A	;SELECT DRIVE 0
 	LD	HL,STATUS
 	PUSH	AF		;DELAY
 	POP	AF
 	PUSH	AF
 	POP	AF
 	LD	(DRIVE),A	;RE-SELECT DRIVE
 	LD	(SECTOR),DE	;SELECT TRACK & SECTOR
 	LD	(HL),SEEK	;FIND THEM
 	PUSH	AF		;DELAY
 	POP	AF
 	PUSH	AF
 	POP	AF
 CHK1	LD	A,(HL)		;CHECK IF FOUND
 	RRCA
 	JR	C,CHK1		;LOOP IF NOT FOUND YET
 	LD	(HL),READ	;START SECTOR READ
 	PUSH	BC		;DELAY
 	POP	BC
 	PUSH	BC
 	POP	BC
 	JR	DRQ1
 BUSY1	RRCA		;CHECK IF ENTIRE SECTOR READ
 	JR	NC,DONE1	;JUMP IF DONE
 DRQ1	LD	A,(HL)	        ;NEXT BYTE READY ?
 	BIT	1,A
 	JR	Z,BUSY1	        ;LOOP IF NOT READY
 	LD	A,(DATA)	;GET NEXT BYTE
 	LD	(BC),A		;PUT IN BUFER
 	INC	BC		;BUMP POINTER
 	JR	DRQ1		;GO BACK FOR NEXT BYTE
 DONE1	LD	A,(HL)
 	AND	5CH	        ;CHECK FOR READ ERROR
 	RET	Z	        ;NO ERROR
 	LD	(HL),0D0H       ;RESET CONTROLLER
 	RET		        ;TRY AGAIN
 INPUT	CALL	INP
 	LD	C,A		;SAVE CHARACTER
 	LD	A,B
 	OR	A
 	LD	A,C
 	RET	Z	;RETURN IF ONLY ONE NEEDED
 	SLA	C	;MOVE FIRST HALF OVER
 	SLA	C
 	SLA	C
 	SLA	C
 	CALL	INP	;GET SECOND HALF
 	ADD	A,C	;MIX IT WITH FIRST HALF
 	RET
 INP	PUSH	AF	;SET UP STACK
 INP1	POP	AF
 	CALL	KEY	;SCAN KEYBOARD
 	CP	59	; (+)
 	JR	Z,FIX
 	CP	45	; (-)
 	JR	Z,FIX
 	PUSH	AF	;SAVE CHARACTER
 	SUB	30H	;CHANGE ASCII TO HEX
 	JR	C,INP1
 	CP	0AH
 	JR	C,CONT
 	SUB	07
 CONT	LD	(TEMP),A	;SAVE HEX
 	POP	AF		;RESTORE ASCII
 	CALL	PRINT		;PRINT ASCII
 	LD	A,(TEMP)	;RESTORE HEX
 	RET
 FIX	POP	IY		;FIX STACK
 	RET
 SECPNT	LD	DE,BUFF		;POINT TO BUFFER
 	PUSH	DE
 	POP	IX		;IX POINTS TO BUFFER
 	LD	HL,3C07H	;START PRINTING HERE
 NLINE	LD	C,8		;8 BLOCKS TO PRINT
 LLOOP	LD	B,2	;2 TWO BYTE # TO THE BLOCK
 PLOOP	LD	A,(DE)		;GET HEX CHARACTER
 	PUSH	AF
 	CALL	ASC1
 	CALL	PRINT		;PRINT FIRST HALF
 	POP	AF
 	CALL	ASC2
 	CALL	PRINT		;PRINT SECOND HALF
 	INC	DE		;BUMP POINTER
 	DJNZ	PLOOP		;LOOP ONCE
 	INC	HL		;INSERT SPACE
 	DEC	C
 	JR	NZ,LLOOP	;LOOP 8 TIMES
 	INC	HL		;INSERT SPACE
 	LD	B,16
 ALOOP	LD	A,(IX)	;REPRINT LINE WITH DOTS FOR NON-
 	INC	IX	;ASCII CHARACTERS
 	CP	20H
 	JR	C,PERIOD
 	CP	128
 	JR	C,GOOD
 PERIOD	LD	A,2EH
 GOOD	CALL	PRINT
 	RET	Z	;EXIT IF END OF SCREEN
 	DJNZ	ALOOP		;LOOP 16 TIMES
 	PUSH	DE
 	POP	IX
 	JR	NLINE		;START NEW LINE
 PRINT	LD	(HL),A		;PUT CHARACTER ON SCREEN
 	INC	HL		;BUMP SCREEN POINTER
 	LD	A,L
 	AND	3FH		;END OF LINE ?
 	RET	NZ		;RETURN IF NO
 	LD	A,L
 	ADD	A,07		;START OF NEW LINE
 	LD	L,A
 	LD	A,H
 	CP	40H		;END OF SCREEN ?
 	RET			;Z FLAG SET IF YES
 PRNT1	LD	A,(HL)		;STANDARD SCREEN
 	CP	03		;PRINT USING ROM
 	RET	Z		;PRINT ROUTINE
 	INC	HL		;03 HEX IS THE TERMINATOR
 	CALL	0033H		;FOR THE MESSAGE
 	JR	PRNT1
 TEMP	DEFB	0
 TRKSEC	DEFW	00FFH	;SETS DEFAULT TO 0
 MSGI	DEFM	'   THIS IS A PROGRAM TO READ IN ONE DISK SECTOR AT A TIME AND'
 	DEFB	0DH
 	DEFM	'DISPLAY IT TO THE VIDEO SCREEN.   YOU WILL BE ASKED TO ENTER'
 	DEFB	0DH
 	DEFM	'WHICH TRACK AND SECTOR YOU WANT TO LOOK AT.  ALL ENTRIES MUST'
 	DEFB	0DH
 	DEFM	'BE IN HEX  AND WHEN ENTERING THE TRACK # LEADING ZEROS MUST'
 	DEFB	0DH
 	DEFM	'BE INCLUDED. EG. TRACK 1 WOULD BE ENTERED AS 01 .'
 	DEFB	0DH
 	DEFM	'   TO SCROLL FORWARD ONE SECTOR HIT THE "+" KEY FOR TRK ?'
 	DEFB	0DH
 	DEFM	'   TO SCROLL BACKWARD ONE SECTOR HIT THE "-" KEY FOR TRK ?'
 	DEFB	0DH
 	DEFM	'   TRYING TO READ A NON-EXISTING SECTOR WILL CAUSE AN ENDLESS'
 	DEFB	0DH
 	DEFM	'SEARCH SEQUENCE FROM WHICH THE ONLY EXIT IS A "RE-BOOT"'
 	DEFW	0D0DH
 	DEFM	'   PRESS ENTER TO START '
 	DEFB	03
 MSG1	DEFM	'TRK ?'		;3E00	5 CHAR.
 MSG2	DEFM	'SEC ?'		;3E80	5 CHAR.
 MSG3	DEFM	'TRACK'		;3C40	5 CHAR.
 MSG4	DEFM	'SECTOR'	;3D00	6 CHAR.
 MSG5	DEFM	'       '	;3E00	8 CHAR.
 BUFF	DEFS	260
 	END	START
