;	SYSTEM DECTAPE LOAD PROGRAM

;	THIS PROGRAM TAKES THE CURRENT CORE IMAGE AND WRITES
;	IT OUT ON DTA0 WITH AN APPROIATE BOOT SO AS TO BE LOADED
;	WHEN STARTED WITH THE YB ROM BOOT LOADER.

R0	=	%0	;GENERAL REGISTER 0
R1	=	%1	;GENERAL REGISTER 1
R2	=	%2	;GENERAL REGISTER 2
R3	=	%3	;GENERAL REGISTER 3
R4	=	%4	;GENERAL REGISTER 4
R5	=	%5	;GENERAL REGISTER 5
SP	=	%6	;PROCESSOR STACK POINTER
PC	=	%7	;PROCESSOR PROGRAM COUNTER

SWREG	=	177570	;SWITCH REGISTER
STATUS	=	177776	;PROCESSOR STATUS REGISTER

TCST	=	177340	;DECTAPE STATUS REGISTER
TCCM	=	177342	;DECTAPE COMMAND REGISTER
TCWC	=	177344	;DECTAPE WORD COUNT REGISTER
TCBA	=	177346	;DECTAPE BUS ADDRESS REGISTER
TCDT	=	177350	;DECTAPE DATA REGISTER

SYSIZE	=	120000	;THE CORE SIZE OF THE OBJECT TAPE
WDCNT	=	SYSIZE/2&077777	;SIZE AS A WORD COUNT FOR THE HARDWARE
ORIGIN	=	SYSIZE	;A CONVIENENT PLACE IF BIG ENOUGH


	.ABS		;AN ABSOLUTE ASSEMBLY FOR NOW

.	=	ORIGIN

	.REPT	85.
	.WORD	0,0,0
	.ENDR
	.WORD	0		;85*3+1=256 SO THE BLOCK IS ZERO EXCEPT FOR US
.	=	ORIGIN	;THE PLACE TO START

	MOV	#BOOT-ORIGIN,R3	;THE ADDRESS OF THAT WHICH MUST BE MOVED
	MOV	#400,R4		;THE NUMBER OF WORDS TO MOVE
	MOV	#SYSIZE-1000,R5	;THE PLACE TO MOVE IT TO
MOVE00:	MOV	(R3)+,(R5)+	;MOVE ONE WORD OF THE MANY
	DEC	R4		;DECREMENT THE COUNT
	BGT	MOVE00		;BRANCH IF MORE TO DO
	MOV	#SYSIZE-1000,PC	;AND BRANCH TO THE ROUTINE

BOOT:	RESET			;DID SOME ONE WANT TO GET OFF??
	MOV	#TCWC,R1	;ADDRESS OF WORD COUNT REGISTER
	MOV	#-WDCNT+400,(R1);SET THE WORD COUNT
	MOV	#004002,-(R1)	;MOVE BACK TO THE END ZONE
BOOT05:	TST	(R1)		;SEE IF AN ERROR YET
	BPL	BOOT05		;BRANCH FO NO ACTION YET
	TST	-(R1)		;MAKE SURE IT'S ENDZONE
	BPL	BOOT		;IF OTHERWISE WE'RE IN A LOOP I BET
	TST	(R1)+		;BACK TO THE COMMAND REGISTER
BOOT10:	MOV	#3,(R1)		;READ FORWARD NOW
BOOT15:	TSTB	(R1)		;SEE IF ONE IS ARROUND YET
	BPL	BOOT15		;LOOP IF BECAUSE OF SLOW DRIVE
	TST	(R1)		;SEE IF NO GOOD LIKE BADNESS
	BMI	BOOT		;ERRORS HERE SHOULD NOT HAPPEN
	CMP	#1,6(R1)	;SEE IF OUR BLOCK NUMBER
	BNE	BOOT10		;IF NOT US THE LOOP FOR MORE
	MOV	#5,(R1)		;ELSE READ FOR A WHILE
BOOT20:	TSTB	(R1)		;SEE IF READY YET
	BPL	BOOT20		;BRANCH IF NOT READY--WAIT DRAT
	MOV	-2(R1),R0	;GET THE ENDING STATUS
	BPL	BOOT25		;BRANCH IF NO ERROR
	SEC			;SET A FLAG
BOOT25:	MOV	#0,(R1)		;STOP THE BLOODY THING NOW
	BCC	BOOT30		;BRANCH IF ALL WENT OK
	HALT			;ELSE SHOW ERROR IN R0
BOOT30:	MOV	#40,PC		;GO TO LOCATION 40


.	=	ORIGIN+1000	;THE PLACE TO START

INIT00:	MOV	-2(R1),R0	;GET THE ERROR STATUS
	CLR	(R1)		;AND STOP THE MUSIC
	HALT			;MAKE THE CLOD KNOW IT
INIT:	MOV	STACK,SP	;SET UP THE STACK
	JSR	PC,REWIND	;BACK TO BLOCK 0 FOR YOU FELLA
	MOV	#-400,-(R1)	;SET UP WORD COUNT
	MOV	#15,-(R1)	;AND THE FUNCTION WRITE DATA
INIT10:	TSTB	(R1)		;SEE IF ANY THING TO DO
	BPL	INIT10		;BRANCH IF JUST WAITING
	TST	(R1)		;SEE IF ANY ERROR
	BMI	INIT00		;BRANCH IF NOT USUAL
	CLR	4(R1)		;CLEAR CORE ADDRESS
	MOV	#-WDCNT,2(R1)	;SET UP FOR THE BIG WRITE
	MOV	#15,(R1)	;AND WRITE DATA AGAIN
INIT15:	TSTB	(R1)		;SEE IF READY YET
	BPL	INIT15		;BRANCH IF NOTHING TO DO EXCEPT WAIT
	TST	(R1)		;SEE IF ANY ERRORS--I HOPE NOT
	BMI	INIT00		;BRANCH IF BADNESS
	JSR	PC,REWIND	;BACK TO GO (MAYBE $200 THERE HUH?)
	MOV	(R1),R0		;START ADDRESS OF BLOCK 0 IN CORE
	MOV	#400,R4		;WORD COUNT
	TST	-(R1)		;POP OVER THE WORD COUNT REGISTER
	MOV	#7,-(R1)	;READ ALL IS THE FUNCTION
INIT20:	TSTB	(R1)		;SEE IF A WORD IS READY
	BPL	INIT20		;THESE WILL COME FASTER THAN BLOCK ENDS
	CMP	6(R1),(R0)+	;SEE IF MATCH IS OK
	BNE	NOGOOD		;BRANCH TO SHOW AN ERROR
	DEC	R4		;DECREMENT COUNE
	BGT	INIT20		;LOOP FOR MORE IF NEEDED
	CLR	R0		;THE NEXT BLOCK(S) START AT 0
	MOV	#WDCNT,R4		;AND ARE LONG AT THAT
INIT25:	TSTB	(R1)		;SEE IF A WORD IS DONE
	BPL	INIT25		;BRANCH IF NOT READY YET
	CMP	6(R1),(R0)+	;SEE IF OK
	BNE	NOGOOD		;BRANCH IF RE-DO IS CALLED FOR
	DEC	R4		;DECREMENT COUNT
	BGT	INIT25		;BRANCH IF MORE TO DO
	JSR	PC,REWIND	;BACK TO BLOCK 0 FOR THE CONVIENCE OF THE GUY OUT THERE
	BR	INIT99		;BRANCH IF DONE

INIT90:	MOV	SP,STACK	;SAVE THE STACK LOCATION
	MOV	SP,R5		;COPY TO ANOTHER REGISTER
	BIC	#000777,R5	;DOWN TO LOWER LIMIT
	BIS	#000500,R5	;THERE IS WHERE THE ABS LOADER SHOULD BE
	MOV	#ORIGIN+1000-300,R3	;THE PLACE TO PUT IT
INIT95:	MOV	(R5)+,(R3)+	;MOVE A WORD
	CMP	R3,#ORIGIN+1000	;SEE IF DONE YET
	BLO	INIT95		;BRANCH IF MORE TO DO
INIT99:	CLR	R0		;SHOW NO ERROR
	HALT			;STOP AND LET HIM REMOVE THE TAPE
	BR	INIT		;AND ANOTHER???
STACK:	.WORD	0		;STACK SAVE LOCATION

REWIND:	RESET			;BYE WORLD THERE
	MOV	#TCWC,R1	;DECTAPE WORD COUNT REGISTER
	MOV	#4003,-(R1)	;MOVE BACKWARDS TO END ZONE
WIND00:	TST	(R1)		;MUST GET AN ERROR
	BPL	WIND00		;BRANCH TO GET IT
	TST	-(R1)		;MAKE SURE IT'S END ZONE
	BPL	REWIND		;IF NOT LOOP FOREVER PROBABLY
	ADD	#6,R1		;ADD 6 POINTS TO THE SCORE FOR A TOUCHDOWN
	MOV	#ORIGIN,(R1)	;SET UP THE BUS ADDRESS
	RTS	PC		;AND RETURN

NOGOOD:	DEC	R0		;SO SOME BITS WILL BE ON
	CLR	(R1)		;THIS WILL STOP THE MUSIC
	HALT			;STOP SHOWING ADDRESS
	BR	INIT		;AND LOOP AGAIN

	.END	INIT90		;START BY STOPPING

 