;  THIS IS THE CP/M BOOTSTRAP FOR THE SINGLE USER SYSTEM.
; I HAVE WRITTEN IT IN SUCH A WAY THAT IT IS INDEPENDENT
; OF THE PROM CODE, EVEN THOUGH THIS MEANS MORE PROGRAMMING
; OF THE DMA.  OTHERWISE, WE WOULD BE FORCED TO MODIFY THE
; PROM CODE EVERY TIME WE WANTED TO MOVE CP/M AROUND IN
; RAM.  THE BOOTSTRAP IS OTHERWISE STRAIGHTFORWARD AND
; REQUIRES NO SPECIAL EXPLANATION.  IT IS DESIGNED TO BE
; LOADED AND EXECUTED AT 4000H, THE FIRST LOCATION OF NON-
; SWAPPABLE DYNAMIC RAM.

; 7-8-81		SUNG WOO LEE
; MODIFIED BIOS LENGTH FROM 0600H TO 0D00H FOR INCREASED BIOS LOADING

	TITLE TSFBOOT.MAC--TELEVIDEO SYSTEM TS-802 BOOTSTRAP--JULY 1, 1981

	.Z80
	CSEG
	.PHASE 4000H

BOOT:	OUT	(ENDRAM),A	; NO STACK OPERATIONS BEFORE HERE
	LD	SP,BOOT		; INITIALIZE THE STACK POINTER

; REPROGRAM THE DMA DESTINATION ADDRESS

BOOT10:	LD	C,DMA		; PORT ADDRESS
	LD	A,10000011B	; DISABLE COMMAND
	OUT	(C),A
	LD	A,11001101B	; BURST MODE, CHANGE B ADDRESS
	OUT	(C),A
	LD	HL,CPMBAS	; NEW TRANSFER ADDRESS
	OUT	(C),L
	OUT	(C),H
	LD	A,11001111B	; LOAD DMA REGISTERS
	OUT	(C),A
	LD	A,10000111B	; ENABLE THE DMA
	OUT	(DMA),A

; HOME THE HEAD TO TRACK 0

	LD	A,RESCMD	; RESTORE COMMAND
	OUT	(FDCCMD),A
	CALL	WAIT		; WAIT FOR COMPLETION
	AND	SEEMSK
	JR	NZ,BOOT10	; SEEK ERROR, TRY AGAIN

; INITIAL VALUES FOR TRACK, SECTOR, AND SECTOR COUNT

	LD	L,0		; START ON TRACK 0
	LD	E,2		; SECTOR 2
	LD	B,CPMSEC	; NO. OF SECTORS IN CP/M

BOOT20:	LD	A,E
	CP	SPCYL+1		; TIME TO MOVE TO NEXT TRACK
	JR	C,BOOT30	; NO.

; MOVE TO NEXT TRACK AND SEEK.

	INC	L		; BUMP TRACK NO.
	LD	E,1		; RESET SECTOR NO.
	LD	A,L
	OUT	(FDCDAT),A	; WRITE TRACK TO DATA REGISTER
	LD	A,SEECMD
	OUT	(FDCCMD),A	; SEEK.
	CALL	WAIT		; WAIT FOR COMPLETION
	AND	SEEMSK		; STRIP OFF NON-SIGNIFICANT BITS
	JR	NZ,BOOT10	; BOOT ERROR, TRY AGAIN


BOOT30:	LD	A,L		; UPDATE TRACK REGISTER
	OUT	(FDCTRK),A
	LD	A,E		; UPDATE SECTOR REGISTER
	CP	(SPCYL/2)+1	; WHICH SIDE?
	LD	C,00010010B
	JR	C,BOOT40	; SIDE 0, (PRIMARY)
	LD	C,00010110B	; SIDE 1, (SECONDARY)
	SUB	(SPCYL/2)

BOOT40:	OUT	(FDCSEC),A
	LD	A,C		; CHOOSE SIDE
	OUT	(FDD),A		; WRITE TO FLOPPY SELECT LATCH
	LD	A,RDSCMD	; READ SECTOR COMMAND
	OUT	(FDCCMD),A
	CALL	WAIT		; WAIT FOR COMPLETION
	JR	NZ,BOOT10	; READ ERROR, START OVER

	INC	E		; BUMP SECTOR NUMBER
	LD	A,10000011B	; DISABLE THE DMA
	OUT	(DMA),A
	LD	A,11010011B	; CONTINUE OPERATION
	OUT	(DMA),A		; SUBSTITUTE FOR LOAD
	LD	A,10000111B	; ENABLE THE DMA
	OUT	(DMA),A
	DJNZ	BOOT20		; LOOP ON NEXT SECTOR
	JP	CPMBOO		; JUMP TO CBIOS BOOT ADDRESS

	
; THIS ROUTINE LOOPS UNTIL THE FDC IS
; IN A NON-BUSY STATE, OR UNTIL A NOT-
; READY CONDITION IS DETECTED.

WAIT:	LD	A,15		; WE MUST DELAY ABOUT
WAIT10:	DEC	A		; 60 USECS BEFORE READING 
	JR	NZ,WAIT10	; THE STATUS.

WAIT20:	IN	A,(FDCCMD)	; READ THE FDC STATUS
	BIT	FDCRDY,A	; IS THE DEVICE NOT READY?
	RET	NZ		; YES, THIS IS AN ERROR

	BIT	FDCBSY,A	; ARE WE PROCESSING A COMMAND?
	JR	NZ,WAIT20	; YES, LOOP UNTIL NOT BUSY
	AND	ERRMSK		; MASK OFF NON-ERROR BITS
	RET
	.DEPHASE

; FDC EQUATES

FDCCMD	EQU	14H		; FDC STATUS AND COMMAND PORT
FDCTRK	EQU	15H		; FDC TRACK PORT
FDCSEC	EQU	16H		; FDC SECTOR PORT
FDCDAT	EQU	17H		; FDC DATA PORT

; DMA PORT ADDRESS

DMA	EQU	10H		; DMA PORT ADDRESS
FDD	EQU	18H		; FLOPPY SELECT LATCH
ENDRAM	EQU	04H		; PROM DISABLE PORT

; FDC STATUS BITS

FDCBSY	EQU	0		; FDC BUSY IS BIT 0
FDCIND	EQU	1		; FDC INDEX HOLE DETECTED
FDCTR0	EQU	2		; FDC TRACK 0 DETECTED
FDCCRC	EQU	3		; FDC CRC ERROR ENCOUNTERED
FDCSEE	EQU	4		; FDC SEEK ERROR ENCOUNTERED
FDCHLD	EQU	5		; FDC HEAD LOAD ACK.
FDCPRT	EQU	6		; FDC DISK IS WRITE PROTECTED
FDCRDY	EQU	7		; FDC DISK NOT READY BIT

; FDC STATUS BYTE MASKS

ERRMSK	EQU	11011100B	; MASK OFF INSIGNIFICANT BITS
SEEMSK	EQU	10011000B	; CHECK THE NOT READY BIT
DNRMSK	EQU	10000000B	; DRIVE NOT READY MASK

; FDC COMMAND BYTES

RESCMD	EQU	00000111B	; HOME HEAD COMMAND
SEECMD	EQU	00010111B	; SEEK TRACK COMMAND
HDSCMD	EQU	00110111B	; HEAD STEP, PREVIOUS DIRECTION
HSICMD	EQU	01010111B	; HEAD STEP IN, TOWARD HUB.
HSOCMD	EQU	01110111B	; HEAD STEP OUT, TOWARD EDGE.
RDSCMD	EQU	10000000B	; READ SECTOR
WTSCMD	EQU	10100000B	; WRITE SECTOR
RDACMD	EQU	11000000B	; READ SECTOR ADDRESS
RDTCMD	EQU	11100000B	; READ TRACK
WTTCMD	EQU	11110000B	; WRITE TRACK
FRCCMD	EQU	11010000B	; FORCE TERMINATION

; DISK CONFIGURATION EQUATES

NUMTRK	EQU	40		; NUMBER OF TRACKS ON DISKETTES
MAXTRK	EQU	NUMTRK-1	; NUMBER STARTS AT 0
MINTRK	EQU	0		; WHERE TO BEGIN SEEK TEST
SPT	EQU	18		; SECTORS PER TRACK
SPCYL	EQU	SPT*2		; SECTORS PER CYLINDER
BPSEC	EQU	100H		; BYTE PER SECTOR

;	*********************************************
;	* FOLLOWING CPMBAS(CCP ENTRY POINT ADDRESS) * 
;	* HAS TO BE CONSULTED WITH 802FBIOS.MAC FOR * 
;	* FUTURE MOVCPM GENERATION.                 *
;	*********************************************

CPMBAS	EQU	0DC00H		; CCP ADDRESS FOR 62K SYSTEM
CPMLN	EQU	1600H		; CP/M SIZE = CCP + BDOS = 1600H
BIOSLN	EQU	0D00H		; CP/M BIOS SIZE (VARIES)

CPMSEC	EQU	(0FFFFH-CPMBAS)/256+1	; NUMBER OF SECTORS FOR TVI CP/M
CPMBOO	EQU	CPMBAS+CPMLN		; CBIOS COLD START ENTRY POINT

	END

