Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-04 - decus/20-0125/gtload.p11
There are 2 other files named gtload.p11 in the archive. Click here to see a list.
	.TITLE	GTLOAD GT40 LOAD HANDLER
CHAR=%0
CSUM=%1
BYTECT=%2
LOADDR=%3
SP=%6
PC=%7
	;
GTIS=175610	; GT40 INPUT STATUS
GTIB=175612	; GT40 INPUT BUFFER
GTOS=175614	; GT40 OUTPUT STATUS
GTOB=175616	; GT40 OUTPUT BUFFER
	;
	; THIS IS THE GT40 RESIDENT HANDLER DURING
	; A LOAD. THIS PROGRAM WOULD BE LOADED
	; BY THE GT40 BOOTSTRAP (A SIX BIT LOADER)
	; THIS IS AN EIGHT HANDLER SO TRANSFER
	; IS SPEEDED UP. THE SECOND ADVANTAGE OF
	; THIS HANDLER IS THAT IT RETURNS INFORMATION
	; ABOUT EACH BLOCK, ALLOWING THE HOST (I.E. PDP 10)
	; BETTER MONITORING OF BLOCK TRANSFERS
	;
	.=37534			; FOR 8K GT40
	;
START:	MOV	#START,SP		; SET UP STACK
READY:	MOVB	#'R,CHAR		; 'R'
	JSR	PC,SEND			; FOR READY
GETBLK:	CLR	CSUM			; CLEAR THE CHECKSUM
	JSR	PC,GET			; GET THE FIRST BYTE
	DEC	CHAR			; IF NOT A 1 THEN
	BNE	GETBLK			; LOOK FOR START
	JSR	PC,GET			; GET THE SECOND BYTE
	TSTB	CHAR			; IF NOT A NULL THEN
	BNE	GETBLK			; LOOK FOR START
	;
	; START PROCESSING A VALID BLOCK
	;
	JSR	PC,GET			; GET LOW ORDER BYTE COUNT
	MOV	CHAR,BYTECT		; AND SAVE
	JSR	PC,GET			; GET HIGH ORDER BYTE COUNT
	SWAB	CHAR			; MAKE HIGH ORDER
	BIS	CHAR,BYTECT		; FORM COMPLETE BYTE COUNT
	JSR	PC,GET			; GET LOW ORDER LOAD ADDRESS
	MOV	CHAR,LOADDR		; AND SAVE
	JSR	PC,GET			; GET HIGH ORDER LOAD ADDRESS
	SWAB	CHAR			; MAKE HIGH ORDER
	BIS	CHAR,LOADDR		; FORM COMPLETE LOAD ADDRESS
	;
	; IF BYTECT > 6 THEN INTERMEDIATE BLOCK
	; IF BYTECT = 6 THEN LAST BLOCK
	; IF BYTECT < 6 THEN ERROR
	;
	SUB	#6,BYTECT		; UPDATE BYTE COUNT
	BLT	ERROR			; BAD COUNT
	BEQ	LAST			; LAST BLOCK
	;
	; PROCESS INTERMEDIATE BLOCK
	;
NORMAL:	JSR	PC,GET			; GET THE NEXT BYTE
	MOVB	CHAR,(LOADDR)+		; SAVE THE BYTE, INCREMENT ADDRESS
	DEC	BYTECT			; DECREMENT THE BYTE COUNT
	BGT	NORMAL			; AND LOOP FOR ENTIRE BLOCK
	JSR	PC,GET			; GET THE CHECKSUM
	TSTB	CSUM			; IS CHECKSUM ZERO
	BEQ	READY			; IF SO CONTINUE WITH NEXT BLOCK
	;
	; CHECKSUM ERROR OR BAD BYTE COUNT
	;
ERROR:	MOVB	#'E,CHAR		; 'E'
	JSR	PC,SEND			; FOR ERROR
	BR	GETBLK			; TRY THE BLOCK AGAIN
	;
LAST:	JSR	PC,GET			; GET THE CHECKSUM
	TSTB	CSUM			; WAS IT GOOD ?
	BNE	ERROR			; CHECKSUM ERROR
	;
	; SELF START OR HALT
	;
	BIT	#1,LOADDR		; EVEN ADDRESS ?
	BEQ	TRANSF			; YES
	MOVB	#'H,CHAR		; IF ODD THEN 'H'
	JSR	PC,SEND			; FOR HALT
	HALT
TRANSF:	MOVB	#'S,CHAR		; EVEN ADDRESS SO 'S'
	JSR	PC,SEND			; FOR SELF-START
	JMP	@LOADDR			; START USERS PROGRAM
	.PAGE
GET:	TSTB	@#GTIS			; TEST STATUS - READY ?
	BPL	GET			; WAIT UNTIL READY
	MOVB	@#GTIB,CHAR		; GET THE CHARACTER
	BIC	#177400,CHAR		; CLEAR THE TOP BYTE
	ADD	CHAR,CSUM		; AND ADD INTO CHECKSUM
	RTS	PC			; RETURN TO CALLER
	;
SEND:	BIC	#177400,CHAR		; CLEAR TOP BYTE OF CHARACTER
	MOVB	CHAR,@#GTOB		; SEND THE CHARACTER
WAIT:	TSTB	@#GTOS			; WAIT UNTIL CHARACTER
	BPL	WAIT			; HAS BEEN SENT
	RTS	PC			; RETURN TO CALLER
	;
	.END	START