;
;	  THIS PROGRAM READS IN THE SECONDARY BOOTSTRAP FROM TRACK 0,
;	SECTORS 3-18 OF THE UCSD PASCAL (TM) DISTRIBUTION DISK, LOADS
;	UP THE STACK AND THEN EXECUTES THE SECONDARY BOOTSTRAP.
;
;  19-NOV-79 DLB  ORIGINAL CREATION FROM OLD BOOTSTRAPS
;  11-JAN-80 DLB  OPTIONS ADDED FOR USING DDT
;  5-DEC-80 SCK  IV.0 modifications
;
TRUE		EQU	0FFFFH		;VALUE OF TRUE
FALSE		EQU	NOT TRUE	;VALUE OF FALSE
;
DDT		EQU	FALSE		;DEBUGGING WITH DDT ?
;
RELEASE		EQU	'A'		;CURRENT RELEASE
VERSION		EQU	'1'		;CURRENT VERSION NUMBER
;
BOOT		EQU	0H		;LOCATION OF CP/M BOOT VECTOR
BDOS		EQU	5H		;CP/M ENTRY VECTOR
TPA		EQU	100H		;START OF USER AREA
;
RDCON		EQU	1		;BDOS READ CONSOLE ROUTINE
WRBUF		EQU	9		;BDOS WRITE BUFFER ROUTINE
;
; THE FOLLOWING REFER TO THE UCSD PASCAL (TM) DISTRIBUTION DISK
;
SECBOOT		EQU	8200H		;BOOTSTRAP RUNS HERE
INTERP$BASE	EQU	0100H		;FIRST LOC USED BY THE INTERPRETER
LOW$MEMORY	EQU	0100H		;LOWEST AVAILABLE RAM LOCATION
TRACKS		EQU	77		;NUMBER OF TRACKS PER DISK
SECTORS		EQU	26		;NUMBER OF SECTORS PER TRACK
BYTES		EQU	128		;NUMBER OF BYTES PER SECTOR
INTERLEAVE	EQU	2		;INTERLEAVING FACTOR (N X 1)
FIRST$TRACK	EQU	1		;FIRST INTERLEAVED TRACK
SKEW		EQU	6		;TRACK-TO-TRACK SKEW
MAX$SECTORS	EQU	26		;MAXIMUM NUMBER OF SECTORS IN TABLE
MAX$BYTES	EQU	128		; MAXIMUM NUMBER OF BYTES PER SECTOR
;
CR		EQU	0DH
LF		EQU	0AH
EOM		EQU	'$'
;
	ORG	TPA
;
MAIN:				;LET'S BOOT UCSD PASCAL
;
	LXI	D,VERSION$MSG	;TELL HIM WHICH VERSION THIS IS
	CALL	MESSAGE$OUT
;
	CALL	REQUEST$DISK	;GET PASCAL DISK IN DRIVE A
;
	LXI	D,READING$MSG	;TELL HIM WE'RE READING THE BOOTSTRAP
	CALL	MESSAGE$OUT
	CALL	READ$BOOT	;READ IN THE BOOTSTRAP
;
	LXI	D,BOOTING$MSG	;TELL HIM WE'RE GOING TO BOOT NOW
	CALL	MESSAGE$OUT
;
	IF	DDT
	LHLD	BDOS+1		;GET CURRENT TOP OF RAM IF DDT IN
	ENDIF
	IF	NOT DDT
	LHLD	BOOT+1		;GET CURRENT TOP OF AVAILABLE RAM+3
	LXI	D,-3-14		;LEAVE ROOM FOR UNORTHODOX BIOSES
	DAD	D		;MUST BE A WORD BOUNDARY
	ENDIF
	SPHL			;RESET THE STACK
	XCHG			;SAVE TOP OF AVAILABLE RAM
	LXI	H,MAX$BYTES	;MAXIMUM NUMBER OF BYTES PER SECTOR
	PUSH	H
	LXI	H,MAX$SECTORS	;MAXIMUM NUMBER OF SECTORS IN TABLE
	PUSH	H
	LXI	H,SKEW		;TRACK-TO-TRACK SKEW
	PUSH	H
	LXI	H,FIRST$TRACK	;FIRST INTERLEAVED TRACK
	PUSH	H
	LXI	H,INTERLEAVE	;INTERLEAVING FACTOR
	PUSH	H
	LXI	H,BYTES		;BYTES PER SECTOR
	PUSH	H
	LXI	H,SECTORS	;SECTORS PER TRACK
	PUSH	H
	LXI	H,TRACKS	;TRACKS PER DISK
	PUSH	H
	PUSH	D		;TOP OF AVAILABLE RAM
	LXI	H,LOW$MEMORY	;BOTTOM OF AVAILABLE RAM
	PUSH	H
	LHLD	BOOT+1		;SBIOS ADDRESS (JMP WBOOT)
	PUSH	H
	LXI	H,INTERP$BASE	;STARTING ADDRESS OF THE INTERPRETER
	PUSH	H
;
	JMP	SECBOOT		;ENTER 'SECBOOT'
;
REQUEST$DISK:			;ASK FOR PASCAL DISK
	LXI	D,DISK$MSG
	CALL	MESSAGE$OUT
RD$LOOP:			;THEN WAIT FOR A CR
	MVI	C,RDCON
	CALL	BDOS
	CPI	CR
	JNZ	RD$LOOP
	RET
;
READ$BOOT:
	LXI	B,SECBOOT	;READ 'SECBOOT' HERE
	MVI	E,3		;SECBOOT STARTS ON SECTOR 3
	MVI	D,17		; FOR 17 SECTORS
RR$LP:
	PUSH	B		;SAVE BUFFER ADDRESS
	PUSH	D		;SAVE SECTORS TO READ AND COUNT
	CALL	SETDMA
	MVI	C,0		;SET FOR TRACK 0
	CALL	SETTRK
	POP	B		;GET SECTOR BACK INTO C
	PUSH	B		;SAVE ACROSS CALL
	CALL	SETSEC
	MVI	C,0		;SELECT THE DRIVE
	CALL	SELDSK
	CALL	READ		;AND READ THE DATA
	POP	D
	POP	B
	LXI	H,BYTES		;ADVANCE BUFFER ADDRESS
	DAD	B
	MOV	B,H
	MOV	C,L
	INR	E		;ADVANCE SECTOR COUNT
	DCR	D		;ALL SECTORS IN ?
	JNZ	RR$LP
	RET			;LEAVE, WHEN DONE
;
SELDSK:				;SELECT DISK (C-REG)
	MVI	E,1BH-03H
	JMP	BIOS
;
SETTRK:				;SET TRACK (C-REG)
	MVI	E,1EH-03H
	JMP	BIOS
;
SETSEC:				;SET SECTOR (C-REG)
	MVI	E,21H-03H
	JMP	BIOS
;
SETDMA:				;SET DATA TRANSFER ADDRESS (BC-REG)
	MVI	E,24H-03H
	JMP	BIOS
;
READ:				;READ A SECTOR TO THE DATA AREA
	MVI	E,27H-03H
;
;  JUMP TO THE CBIOS VECTOR WHOSE OFFSET IS IN E AND WHOSE
; BASE ADDRESS IS AT (BOOT+1).  CBIOS ROUTINE WILL DO THE
; RETURN
;
BIOS:
	MVI	D,0
	LHLD	BOOT+1
	DAD	D
	PCHL
;
;  OUTPUT THE MESSAGE POINTED TO BY DE
;
MESSAGE$OUT:
	MVI	C,WRBUF
	JMP	BDOS
;
VERSION$MSG:
	DB	CR,LF,LF,'UCSD PASCAL (IV.0) BOOTER  VERSION '
	DB	'[',RELEASE,VERSION,']',CR,LF,EOM
DISK$MSG:
	DB	CR,LF,'INSERT PASCAL DISK INTO DRIVE A, '
	DB	'THEN TYPE <RETURN>',EOM
READING$MSG:
	DB	CR,LF,'READING SECONDARY BOOTSTRAP',EOM
BOOTING$MSG:
	DB	CR,LF,'BOOTING TO UCSD PASCAL',CR,LF,EOM
;
	END	START
