

                ;
                ;	  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
                ;
 FFFF =         TRUE		EQU	0FFFFH		;VALUE OF TRUE
 0000 =         FALSE		EQU	NOT TRUE	;VALUE OF FALSE
                ;
 0000 =         DDT		EQU	FALSE		;DEBUGGING WITH DDT ?
                ;
 0041 =         RELEASE		EQU	'A'		;CURRENT RELEASE
 0031 =         VERSION		EQU	'1'		;CURRENT VERSION NUMBER
                ;
 0000 =         BOOT		EQU	0H		;LOCATION OF CP/M BOOT VECTOR
 0005 =         BDOS		EQU	5H		;CP/M ENTRY VECTOR
 0100 =         TPA		EQU	100H		;START OF USER AREA
                ;
 0001 =         RDCON		EQU	1		;BDOS READ CONSOLE ROUTINE
 0009 =         WRBUF		EQU	9		;BDOS WRITE BUFFER ROUTINE
                ;
                ; THE FOLLOWING REFER TO THE UCSD PASCAL (TM) DISTRIBUTION DISK
                ;
 8200 =         SECBOOT		EQU	8200H		;BOOTSTRAP RUNS HERE
 0100 =         INTERP$BASE	EQU	0100H		;FIRST LOC USED BY THE INTERPRETER
 0100 =         LOW$MEMORY	EQU	0100H		;LOWEST AVAILABLE RAM LOCATION
 004D =         TRACKS		EQU	77		;NUMBER OF TRACKS PER DISK
 001A =         SECTORS		EQU	26		;NUMBER OF SECTORS PER TRACK
 0080 =         BYTES		EQU	128		;NUMBER OF BYTES PER SECTOR
 0001 =         INTERLEAVE	EQU	1		;INTERLEAVING FACTOR (N X 1)
 0001 =         FIRST$TRACK	EQU	1		;FIRST INTERLEAVED TRACK
 0000 =         SKEW		EQU	0		;TRACK-TO-TRACK SKEW
 001A =         MAX$SECTORS	EQU	26		;MAXIMUM NUMBER OF SECTORS IN TABLE
 0080 =         MAX$BYTES	EQU	128		; MAXIMUM NUMBER OF BYTES PER SECTOR
                ;
 000D =         CR		EQU	0DH
 000A =         LF		EQU	0AH
 0024 =         EOM		EQU	'$'
                ;
 0100           	ORG	TPA
                ;
                MAIN:				;LET'S BOOT UCSD PASCAL
                ;
 0100 11B001    	LXI	D,VERSION$MSG	;TELL HIM WHICH VERSION THIS IS
 0103 CDAB01    	CALL	MESSAGE$OUT
                ;
 0106 CD5101    	CALL	REQUEST$DISK	;GET PASCAL DISK IN DRIVE A
                ;
 0109 111302    	LXI	D,READING$MSG	;TELL HIM WE'RE READING THE BOOTSTRAP
 010C CDAB01    	CALL	MESSAGE$OUT
 010F CD6201    	CALL	READ$BOOT	;READ IN THE BOOTSTRAP
                ;
 0112 113102    	LXI	D,BOOTING$MSG	;TELL HIM WE'RE GOING TO BOOT NOW
 0115 CDAB01    	CALL	MESSAGE$OUT
                ;
                	IF	DDT
                	LHLD	BDOS+1		;GET CURRENT TOP OF RAM IF DDT IN
                	ENDIF
                	IF	NOT DDT
 0118 2A0100    	LHLD	BOOT+1		;GET CURRENT TOP OF AVAILABLE RAM+3
 011B 11EFFF    	LXI	D,-3-14		;LEAVE ROOM FOR UNORTHODOX BIOSES
 011E 19        	DAD	D		;MUST BE A WORD BOUNDARY
                	ENDIF
 011F F9        	SPHL			;RESET THE STACK
 0120 EB        	XCHG			;SAVE TOP OF AVAILABLE RAM
 0121 218000    	LXI	H,MAX$BYTES	;MAXIMUM NUMBER OF BYTES PER SECTOR
 0124 E5        	PUSH	H
 0125 211A00    	LXI	H,MAX$SECTORS	;MAXIMUM NUMBER OF SECTORS IN TABLE
 0128 E5        	PUSH	H
 0129 210000    	LXI	H,SKEW		;TRACK-TO-TRACK SKEW
 012C E5        	PUSH	H
 012D 210100    	LXI	H,FIRST$TRACK	;FIRST INTERLEAVED TRACK
 0130 E5        	PUSH	H
 0131 210100    	LXI	H,INTERLEAVE	;INTERLEAVING FACTOR
 0134 E5        	PUSH	H
 0135 218000    	LXI	H,BYTES		;BYTES PER SECTOR
 0138 E5        	PUSH	H
 0139 211A00    	LXI	H,SECTORS	;SECTORS PER TRACK
 013C E5        	PUSH	H
 013D 214D00    	LXI	H,TRACKS	;TRACKS PER DISK
 0140 E5        	PUSH	H
 0141 D5        	PUSH	D		;TOP OF AVAILABLE RAM
 0142 210001    	LXI	H,LOW$MEMORY	;BOTTOM OF AVAILABLE RAM
 0145 E5        	PUSH	H
 0146 2A0100    	LHLD	BOOT+1		;SBIOS ADDRESS (JMP WBOOT)
 0149 E5        	PUSH	H
 014A 210001    	LXI	H,INTERP$BASE	;STARTING ADDRESS OF THE INTERPRETER
 014D E5        	PUSH	H
                ;
 014E C30082    	JMP	SECBOOT		;ENTER 'SECBOOT'
                ;
                REQUEST$DISK:			;ASK FOR PASCAL DISK
 0151 11DD01    	LXI	D,DISK$MSG
 0154 CDAB01    	CALL	MESSAGE$OUT
                RD$LOOP:			;THEN WAIT FOR A CR
 0157 0E01      	MVI	C,RDCON
 0159 CD0500    	CALL	BDOS
 015C FE0D      	CPI	CR
 015E C25701    	JNZ	RD$LOOP
 0161 C9        	RET
                ;
                READ$BOOT:
 0162 010082    	LXI	B,SECBOOT	;READ 'SECBOOT' HERE
 0165 1E03      	MVI	E,3		;SECBOOT STARTS ON SECTOR 3
 0167 1611      	MVI	D,17		; FOR 17 SECTORS
                RR$LP:
 0169 C5        	PUSH	B		;SAVE BUFFER ADDRESS
 016A D5        	PUSH	D		;SAVE SECTORS TO READ AND COUNT
 016B CD9D01    	CALL	SETDMA
 016E 0E00      	MVI	C,0		;SET FOR TRACK 0
 0170 CD9301    	CALL	SETTRK
 0173 C1        	POP	B		;GET SECTOR BACK INTO C
 0174 C5        	PUSH	B		;SAVE ACROSS CALL
 0175 CD9801    	CALL	SETSEC
 0178 0E00      	MVI	C,0		;SELECT THE DRIVE
 017A CD8E01    	CALL	SELDSK
 017D CDA201    	CALL	READ		;AND READ THE DATA
 0180 D1        	POP	D
 0181 C1        	POP	B
 0182 218000    	LXI	H,BYTES		;ADVANCE BUFFER ADDRESS
 0185 09        	DAD	B
 0186 44        	MOV	B,H
 0187 4D        	MOV	C,L
 0188 1C        	INR	E		;ADVANCE SECTOR COUNT
 0189 15        	DCR	D		;ALL SECTORS IN ?
 018A C26901    	JNZ	RR$LP
 018D C9        	RET			;LEAVE, WHEN DONE
                ;
                SELDSK:				;SELECT DISK (C-REG)
 018E 1E18      	MVI	E,1BH-03H
 0190 C3A401    	JMP	BIOS
                ;
                SETTRK:				;SET TRACK (C-REG)
 0193 1E1B      	MVI	E,1EH-03H
 0195 C3A401    	JMP	BIOS
                ;
                SETSEC:				;SET SECTOR (C-REG)
 0198 1E1E      	MVI	E,21H-03H
 019A C3A401    	JMP	BIOS
                ;
                SETDMA:				;SET DATA TRANSFER ADDRESS (BC-REG)
 019D 1E21      	MVI	E,24H-03H
 019F C3A401    	JMP	BIOS
                ;
                READ:				;READ A SECTOR TO THE DATA AREA
 01A2 1E24      	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:
 01A4 1600      	MVI	D,0
 01A6 2A0100    	LHLD	BOOT+1
 01A9 19        	DAD	D
 01AA E9        	PCHL
                ;
                ;  OUTPUT THE MESSAGE POINTED TO BY DE
                ;
                MESSAGE$OUT:
 01AB 0E09      	MVI	C,WRBUF
 01AD C30500    	JMP	BDOS
                ;
                VERSION$MSG:
 01B0 0D0A0A5543	DB	CR,LF,LF,'UCSD PASCAL (IV.0) BOOTER  VERSION '
 01D6 5B41315D0D	DB	'[',RELEASE,VERSION,']',CR,LF,EOM
                DISK$MSG:
 01DD 0D0A494E53	DB	CR,LF,'INSERT PASCAL DISK INTO DRIVE A, '
 0200 5448454E20	DB	'THEN TYPE <RETURN>',EOM
                READING$MSG:
 0213 0D0A524541	DB	CR,LF,'READING SECONDARY BOOTSTRAP',EOM
                BOOTING$MSG:
 0231 0D0A424F4F	DB	CR,LF,'BOOTING TO UCSD PASCAL',CR,LF,EOM
                ;
 024C           	END	START
