.TITLE	RK05 BOOTSTRAP FOR CONCURRENT PASCAL SYSTEM
.SBTTL	INTRODUCTION
;
;
;	THIS PROGRAM IS DESIGNED TO RESIDE ON BLOCK 0 OF AN RK05 PACK
;	CONTAINING A SOLO SYSTEM.  THE PROGRAM IS INITIATED BY THE
;	STANDARD HARDWARE LOAD SEQUENCE, AND MOVES A PART OF ITSELF TO
;	156000 (8).  THIS SECTION THEN READS IN THE KERNEL PORTION OF
;	THE SOLO SYSTEM, WHICH WILL READ IN THE SOLO SYSTEM ITSELF.
;
;
;	DEFINITIONS:
;
RKCS	=	177404			;RK-11 CONTROL/STATUS REGISTER
RKWC	=	177406			;RK-11 WORD COUNT (2'S COMPLEMENT)
RKBA	=	177410			;RK-11 BUS ADDRESS REGISTER
RKDA	=	177412			;RK-11 DISK ADDRESS REGISTER
;
RKRD	=	5			;READ COMMAND (RKCS)
;
;
;
TPS	=	177564			;TERMINAL PRINTER STATUS
TPB	=	177566			;TERMINAL PRINTER BUFFER
;
;
;
$LOC	=	156000			;HIGH MEMORY ADDRESS
;
;
UNITNO	=	40			;PLACE TO PUT BOOTED UNIT
;
;
.ASECT					;ABSOLUTE SECTION
.	=	0			;START AT ABSOLUTE 0
.PAGE
.SBTTL	NON-RELOCATABLE CODE
;
;
;	THE FOLLOWING CODE IS USED TO MOVE THE RELOCATABLE CODE TO A HIGH
;	MEMORY ADDRESS.
;
START:
	NOP				;SOME BOOT ROMS EXPECT THIS
	BR	10$			;SKIP TRAP VECTORS
	TRAP4,0				;TRAP TO 4
	TRAP10,0			;TRAP TO 10
10$:
	MOV	#$LOC,SP		;SET SO TRAP TO 4/10 IS OK
					;(WILL NOT CAUSE DOUBLE BUS ERROR)

	MOV	SP,R0			;R0 -> AREA FOR CODE
	MOV	#20$,R1			;R1 -> CODE
15$:
	MOV	(R1)+,(R0)+		;MOVE A WORD OF CODE
	CMP	@R1,#-1			;DONE?
	BNE	15$			;NO, MOVE MORE CODE

	JMP	@#$LOC			;DONE, START RELOCATED PORTION
.PAGE
.SBTTL	RELOCATED CODE
;
;
;	THE FOLLOWING CODE IS MOVED AND THEREFORE MUST BE POSITION-
;	INDEPENDENT!!!!
;
20$:
	MOV	@#RKDA,R5		;R5 = DISK ADDR REG
	BIC	#^C160000,R5		;ISOLATE UNIT BITS
	MOVB	#1,@#RKDA		;SET BLOCK NUMBER (DON'T CHANGE DRIVE
					;NUMBER)
	MOV	#-27000.,@#RKWC		;SET LARGE WORD COUNT
	MOV	#0,@#RKBA		;SET BUFFER ADDRESS
	MOV	#RKRD,@#RKCS		;READ IT
25$:
	TSTB	@#RKCS			;DONE YET?
	BPL	25$			;NO, LOOP TILL DONE BIT ON

	TST	@#RKCS			;ERROR BIT SET?
	BMI	IOERR			;YES, PRINT "DISK ERROR"

	CMP	@#0,#137		;TEST FOR JMP @#X INSTRUCTION @ 0
	BNE	BADFIL			;NOT THERE, BAD DISK

	MOV	R5,@#UNITNO		;PASS UNIT NUMBER TO KERNEL
	NOP				;CONVENIENT PLACE TO PUT A HALT
	CLR	PC			;ELSE, JUMP TO LOCATION 0

IOERR:	JSR	R0,PRINT		;CALL TTYOUT SUBROUTINE
	.ASCIZ	\I/O ERROR\		;BAD BLOCK ON DISK

BADFIL:	JSR	R0,PRINT		;CALL TTYOUT SUBROUTINE
	.ASCIZ	\BAD DISK FORMAT\	;KERNEL NFG

PRINT:
	TSTB	@#TPS			;WAIT ON TERMINAL READY
	BPL	PRINT			;NOT READY
	MOVB	(R0)+,@#TPB		;PRINT NEXT CHARACTER
	BNE	PRINT			;IF NE, MORE TO PRINT

40$:	HALT				;HALT CPU
	BR	40$			;DON'T ALLOW RE-TRY

ENDCOD:	.WORD	-1			;END OF MOVED CODE

;
;	CHECK FOR CODE FIT INTO BOOT
;


	.IF	GE, <ENDCOD-350>
	.ERROR	;;BOOT CODE EXTENDS INTO BITMAP
	.ENDC

.	=	400			;MOVE PAST BITMAP
;
;	THESE ROUTINES HANDLE TRAPS TO 4 AND 10 (WHILE BOOT STILL IN BLOCK
;	ZERO OF MEMORY).
;
;
TRAP4:	JSR	R0,PRINT		;TRAP TO 4
	.ASCIZ	\TRAP TO 4\
TRAP10:	JSR	R0,PRINT		;TRAP TO 10
	.ASCIZ	\TRAP TO 10\
	.END
                                                                                                                                                                                                     