;	BOOTSTRAP LOADER
;VERSION 4.2
;FOR USE WITH THE FDC-3 CONTROLLER BOARD IN EITHER SINGLE OR DOUBLE
;DENSITY ON THE DSC-2 COMPUTER SYSTEMS.
;
;SET THE VALUE DOUBLE ACCORDINGLY IF ASSEMBLING THIS FOR A
;SINGLE DENSITY SYSTEM

;THE IOBYTE IS IMPLEMENTED IN THE VERSION
;AND IS INITIALIZED WITH THE LIST DEVICE GOING TO SERIAL PORT1

	
TRUE	EQU	0FFFH
FALSE	EQU	NOT TRUE
;
;
;
DOUBLE	EQU	TRUE	;THIS SHOULD BE FALSE FOR SINGLE DENSITY
;
	ORG	00H
;
MSIZE	EQU	64
sys$top	equ	msize*1024
bios	equ	sys$top-6*256
bdos	equ	bios-0e00h
ccp	equ	bdos-0800h
warm$boot equ	ccp-0080h
;
PORT	EQU	4AH
LAST	EQU	26	;LAST SECTOR ON TRK1 TO LOAD
SKIP	EQU	1	;NUMBER OF SECTORS TO SKIP
;
INIT0	EQU	((SKIP+1) SHL 8) OR 0	;INITIAL TRACK,SECTOR
END0	EQU	(0 SHL 7) OR 27	;END OF FIRST TRK
INIT1	EQU	(129 SHL 8) OR 1	;TRACK,SECT ON TRK 1
END1	EQU	(1 SHL 7) OR LAST+1	;LAST POSITION ON TRK 1
ERR	EQU	0F0H	;ERROR CONDITIONS
IOF	EQU	08H	;IO FINISH
IOBYTE	EQU	3
;
;
T76	EQU	04H	;TOWARD 76
STT	EQU	06H	;TOWARD 76 AND STEP PULSE
DOUT	EQU	80H	;DISK OUTPUT PORT
DINP	EQU	80H	;DISK INPUT PORT
DMAH	EQU	81H	;HIGH ORDER DMA ADDRESS
DMAL	EQU	82H	;LOW ORDER DMA ADDRESS
COMMAND2 EQU	83H	;SECOND COMMAND PORT
RDS	EQU	040H	;READ SECTOR
;RS232 PORTS
DATA	EQU	40H
STATUS	EQU	41H
STATUS1	EQU	49H
STATUS2	EQU	51H
STATUS3	EQU	59H
;
;
;	INITIALIZE TRK/SEC AND DMA ADDRESS
START:
	LXI	D, INIT0
	LXI	H, warm$boot-3
;
READL:	;READ LOOP
	SPHL		;SET THE STACK POINTER
;	SEND DMA ADDRESS
	MOV	A,H
	OUT	DMAH
	MOV	A,L
	OUT	DMAL
;
;	SET UP TRACK AND SECTOR
	;
	MOV	L,E	;TRACK TO L
	MOV	A,D	;SECTOR TO A
	ANI	7FH	;CLEAR HIGH BIT
	MOV	H,A	;SECTOR TO H
	XTHL		;SET TRK AND SECTOR
	INX	SP	;ADJUST STACK POINTER
	POP	B
;	PERFORM THE READ
	MVI	A,RDS
	OUT	DOUT
;
WRD:	IN	DINP
	ANI	ERR
	JZ	NERROR
;
;	ERROR, REBOOT
;A HLT DOES A REBOOT AUTOMATICALLY ON DSC-2
	HLT
;
;
NERROR:	;NO ERROR SO FAR
	IN	DINP
	ANI	IOF
	JZ	WRD	;GO BACK AND WAIT
;
;	I/O FINISH,
;	REPLACE DATA BYTES
	PUSH	B	;REPLACE 1 BYTE
	INX	SP	;ADJUST STACK POINTER
	PUSH	H	;REPLACE 2 BYTES
;
;	ADD 128 TO DMA ADDRESS
	LXI	H,128
	DAD	SP
;
;	INC TRACK/SECTOR
	INR	D
	MOV	A,D
	CPI	END0	;END OF TRACK 0?
	JNZ	CMP1
;
;	STEP TRACK TO TRACK 1
	MVI	A,STT
	OUT	DOUT
	MVI	A,T76
	OUT	DOUT
WST:	;WAIT FOR STEP AND HEAD SETTLE
	MVI	A,18D
WST0:
	MVI	C,0AAH	;ONE MILLISECOND TIMING
WST2:
	DCR	C
	JNZ	WST2
	DCR	A
	JNZ	WST0
;
;		TRACK STEPPED
	IF DOUBLE
;NOW CHANGE DENSITY
	MVI	 A,8
	OUT	COMMAND2
	ENDIF
;
	LXI	D,INIT1
	MOV	A,D
CMP1:	CPI	END1	;END OF TRACK 1?
	JNZ	READL	;GO BACK FOR MORE
;
;	END OF LOAD
	LXI	H,PORT
;
	IF DOUBLE
;INIT FOR DOUBLE DENSITY
	MVI	M,8
	INX	H
	MVI	M,8
	INX	H	;POINT TO DENSITY SELECT
	MVI	M,0FH	;DOUBLE DENSITY
	ENDIF
;
	IF NOT DOUBLE
	MOV	M,H	;H IS 0
	INX	H
	MOV	M,H
	INX	H	;POINT TO DENSITY SELECT
	MVI	M,00	;SINGLE DENSITY
	ENDIF
;
;SET LOC 4 TO CONTAIN ACTIVE DRIVE = 0
	MVI	L,4
	MOV	M,H
;
; INITIALIZE THE I/O BYTE
;	CON:=TTY:	(CONSOLE TO PORT0)
;	RDR:=PTR:	(READER TO PORT2)
;	PUN:=PTP:	(PUNCH TO PORT2)
;	LST:=CRT:	(LIST TO PORT1)
;
	MVI	A,01$01$01$00B
	STA	IOBYTE
;
;INITIALIZE THE USARTS
	MVI	A,0CEH
	OUT	STATUS
	OUT	STATUS1
	OUT	STATUS2
	MVI	A,27H
	OUT	STATUS
	OUT	STATUS1
	OUT	STATUS2
	IN	DATA
;
	JMP	bios	;GO DO MORE INITIALIZATION
;
	END
