2RD8D8|DR<(8x
0($ ||
R<	.TITLE READID	; BY PAUL KONING , 3-FEB-74
	R0=%0
	R1=%1
	R2=%2
	R3=%3
	R4=%4
	R5=%5
	SP=%6
	PC=%7
	KBS=177560
	KBB=177562
	TPS=177564
	TPB=177566	; DEFINITIONS OF  CONSOLE REGISTERS
	RKCS=177404
	RKWC=177406
	RKMA=177410
	RKDA=177412	; SAME FOR RK REGISTERS
	RKER=177402
	BTDISK=177462	; ADDRESS OF DISK TO BOOT FROM ON EXIT (RF)
	.ASECT
	.=4		; LOCATION OF VECTOR
	.WORD TRAP,340	; GO TO "TRAP" IF NON-EXISTENT MEMORY TRAP HAPPENS
;
	.CSECT READID	; START THE RELOCATABLE PART HERE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                     ;
;      READID VERSION 1-A             A PROGRAM FOR READING DISK      ;
;      ID'S OFF A RK DISK PACK WITHOUT DAMAGING IT                    ;
;              WRITTEN BY PAUL KONING OF THE LAWRENCE UNIVERSITY      ;
;                      COMPUTER CENTER                                ;
;                                                                     ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
START:	RESET		; GET RID OF ALL POSSIBLE TROUBLE
	MOV #START,SP	; INITIALIZE THE STACK POINTER
	MOV #TRAP,@#4
	MOV #340,@#6
	MOV #TRAP,@#10
	MOV #340,@#12	; SET UP VECTORS FOR THE FATAL TRAPS
	JSR PC,CARRET	; START ON A FRESH BLANK LINE
	JSR R5,TEXOUT	; PRINT NAME ETC.
	.ASCII \READID VERSION 1-A LAWRENCE%\
	.EVEN		; TO PLEASE THE ASSEMBLER
ASK:	JSR PC,CARRET	; AND A CARRIAGE RETURN
	JSR R5,TEXOUT	; ASK WHICH DRIVE HE/SHE WANTS
	.ASCII \WHICH DRIVE DO YOU USE (0-7)?%\
	.EVEN
	JSR R5,TEXIN	; READ THE ANSWER
	.WORD DRIVE	; HERE THE DRIVE NUMBER WILL APPEAR
	BIC #177600,DRIVE; THROW OUT CRAP IN THE HIGH BYTE OF "DRIVE"
	CMP R3,#1	; ONE CHARACTER ONLY IS ALLOWED
	BNE NODRIV	; THIS IS WRONG!
	SUB #'0,DRIVE	; GO DOWN TO 0-7
	BLT NODRIV	; A NEGATIVE DRIVE IS NO GOOD
	CMP DRIVE,#7	; IS DRIVE NUMBER WITHIN RANGE?
	BLE OKDRIV	; YES, OK THEN
NODRIV:	JSR PC,CARRET
	JSR R5,TEXOUT	; GIVE A NASTY MESSAGE
	.ASCII \INVALID DRIVE NUMBER!%\
	.EVEN
	BR ASK		; TRY AGAIN FOR A REASONABLE ANSWER
OKDRIV:	JSR R5,TEXOUT	; TELL HIM OR HER TO GET THE DRIVE READY
	.ASCII \READY DISK THEN HIT "RETURN"%\
	.EVEN
	JSR R5,TEXIN	; WAIT FOR THE "RETURN"
	.WORD CRET	; HERE IT GOES
	TST R3		; REALLY ONLY A "RETURN"?
	BNE OKDRIV	; NO, THEN ASK AGAIN TO GET GOING
	MOV #BUFF,R0
	MOV #300.,R1	; FOR A FANATIC ZEROING ACTION!
	CLR (R0)+	; WIPE CORE
	DEC R1		; COUNT THOSE LITTLE RINGS TOO
	BPL .-4		; LOOP IF NOT DONE
	MOV #BUFF,@#RKMA; SET THE BUS ADDRESS FOR THE TRANSFER
	MOV #-256.,@#RKWC; WE WILL READ 256. WORDS FROM THE DISK
	CLR R4		; JUST A MATTER OF INITIALIZING
	MOVB DRIVE,R4	; GET THE DRIVE NUMBER
	CLC
	ROR R4
	ROR R4
	ROR R4
	ROR R4		; GET THE DRIVE # BITS IN THE RIGHT PLACE
	INC R4		; SET TO BLOCK #1
 	MOV R4,@#RKDA	; LOAD DISK ADDRESS
	MOV #5,@#RKCS	; START THE READING
	TSTB @#RKCS	; DONE ALREADY?
	BPL .-4		; NO, WAIT LONGER
	TST @#RKCS	; DID ANY ERRORS OCCUR IN THE PROCESS?
	BPL NOERR	; NO, OK THEN!
		MOV @#RKER,R2	; GET THE ERROR STATUS FIRST
	RESET		; NO HARM DONE WE SAY THEN
	JSR PC,CARRET	; GET A CLEAN LINE FOR THE MESSAGE
	JSR R5,TEXOUT	; PRINT HEADER FOR ERROR MESSAGE
	.ASCII \RKER = %\
	.EVEN
	MOV #16.,R0	; COUNT BITS
	CLC
NEX:	ROL R2		; GET MSB
	BCC PRZERO	; IF NO CARRY, PRINT "0"
	JSR R5,TEXOUT	; ELSE PRINT A "1"
	.ASCII \1%\
	.EVEN
	BR NEX2		; TEST FOR DONE
PRZERO:	JSR R5,TEXOUT	; NOW PRINT A "0"
	.ASCII \0%\
	.EVEN
NEX2:	DEC R0		; COUNT BITS
	BPL NEX		; MORE TO DO
	JSR R5,TEXOUT	; THEN PRINT IT
	.BYTE 7		; RING THE BELL FOR THIS ONE
	.ASCII \DISK ERROR - RESTART%\
	.EVEN
	JMP START	; TRY AGAIN NEXT TIME
NOERR:	JSR R5,TEXOUT	; PRINT THE TITLE LINE
	.ASCII \DISK ID IS : %\
	MOV ID,R2	; GET FIRST PART OF ID
	JSR PC,PRRADX	; PRINT IN RADIX-50
	MOV ID+2,R2	; NOW THE SECOND HALF
	JSR PC,PRRADX	; GET IT OUT TO PAPER
	JSR PC,CARRET	; FOR A BLANK LINE
	JMP ASK		; NEXT DRIVE PLEASE!
TRAP:	RESET		; HERE WE COME IN CASE OF NEM TRAP
	JSR PC,CARRET	; GET A NEW LINE
	JSR R5,TEXOUT	; THEN TELL THE BAD NEWS
	.BYTE 7		; RING THE BELL HERE TOO!!!!
	.ASCII \FATAL ERROR TRAP OCCURED - RESTART%\
	.EVEN
	JSR PC,CARRET	; NEW LINE PLEASE
	JMP START	; START FROM SCRATCH
;
TEXOUT:	TSTB @#TPS	; PRINTER READY NOW?
	BPL TEXOUT	; NO, WAIT FOR THE SLOW THING
	MOVB (R5)+,R1	; GET A CHARACTER
	CMPB R1,#'%	; IS IT A "%" (TO END)?
	BEQ EXITPR	; YES, STOP POUNDING
	MOV R1,@#TPB	; PRINT THE CHARACTER
	BR TEXOUT	; GET MORE OF THEM
EXITPR:	INC R5
	BIC #1,R5	; PERFORM A .EVEN ON R5
	RTS R5		; ONLY THEN IT IS SAFE TO EXIT
;
TEXIN:	MOV (R5),R3	; GET OUTPUT AREA POINTER
LOOP:	TSTB @#KBS	; IS A CHARACTER READY YET?
	BPL LOOP	; WAIT MORE TILL DONE
	MOV @#KBB,R2	; GET THE CHARACTER FROM THE BUFFER
	BIC #177600,R2	; STRIP EXTRANEOUS BITS
	BEQ LOOP	; IGNORE NULLS OF COURSE
	CMPB R2,#3	; WAS IT A ^C (TO QUIT)?
	BNE TEST2	; NO, MORE TESTING TO BE DONE
	MOV #BTDISK,R1	; PREPARE TO BOOT FROM THE DISK
	JMP @#173104	; DO A HARDWARE BOOT (SAVES ME THE TROUBLE OF
			;   WRITING ONE)
TEST2:	CMPB R2,#25	; ^U?
	BNE CRQ		; NO, MAYBE IT'S A CR
	MOV (R5),R3	; RESET BUFFER
	JSR R5,TEXOUT	; PRINT "^U"
	.ASCII \^U%\	; THERE IT IS!
	.EVEN		; VERY NEEDED HERE
	JSR PC,CARRET	; THEN CR
	BR LOOP		; GET MORE DOPE
CRQ:	CMPB R2,#15	; NOW IS IT A CARRIAGE RETURN?
	BNE TEST3	; NOT EVEN THAT!
	JSR PC,CARRET	; RETURN CARRIAGE
	SUB (R5),R3	; MAKE R3 INTO THE # OF CHARACTERS
	TST (R5)+	; POINT TO THE NEXT INSTRUCTION
	RTS R5		; THEN RETURN
TEST3:	CMPB R2,#32	; IS IT "^Z" FOR RESTART?
	BNE .+6		; NO
	JMP START	; YES, RESTART
	CMPB R2,#177	; RUBOUT?
	BNE NORMAL	; NO, JUST A PLAIN ORDINARY CHARACTER
	CMP R3,(R5)	; ANYTHING IN THE BUFFER?
	BEQ EMPTY	; NO NOTHING LEFT
	MOVB -(R3),@#TPB; ECHO CHARACTER THAT IS ERASED
	BR LOOP		; THEN GET MORE
EMPTY:	MOV #134,@#TPB	; IF EMPTY, ECHO A "\"
	BR LOOP		; GET MORE AS BEFORE
NORMAL:	MOVB R2,(R3)+	; STORE THAT CHARACTER
	MOV R2,@#TPB	; ECHO IT TOO
	BR LOOP		; I WANT MORE!
;
CARRET:	JSR R5,TEXOUT	; GO PRINT A CARRIAGE RETURN
	.BYTE 15,0,0,0,0,0,12,0,'%	; AND SOME EXTRA STUFF
	.EVEN
	RTS PC		; THAT'S ALL FOLKS!
DIV50:	MOV R2,R0	; COPY R2
	CLR R1		; R1 IS THE COUNTER
LOOPDV:	CMP R0,#50	; DIVISION POSSIBLE?
	BLO ENDIT	; NOT ANY MORE
	SUB #50,R0	; ELSE DO A SUBSTRACTION
	INC R1		; COUNT IT TOO
	BR LOOPDV	; TRY SOME MORE
ENDIT:	TST R0		; IS THE RESULT A SPACE?
	BNE NOSP	; NOT A SPACE
	MOV #40,R0	; PUT A DECENT ASCII SPACE THERE
	RTS PC		; AND GET OUTTA THERE
NOSP:	CMP R0,#32	; IS IT ALPHA?
	BGT NOAL	; NOT THIS TIME
	ADD #100,R0	; MAKE REAL CHARACTER
	RTS PC		; THAT'S IT
NOAL:	CMP R0,#35	; FUNNY CHARACTER????
	BLE FUNNY	; YES!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	ADD #22,R0	; ELSE MAKE IT INTO A DIGIT
	RTS PC		; AND EXIT
FUNNY:	MOV #'?,R0	; INDICATE FUNNY CHARACTER
	RTS PC		; LAST ONE TO LEAVE
;
PRRADX:	JSR PC,DIV50	; DIVIDE THE CRUMMY WAY
	MOVB R0,RX3	; LAST CHARACTER FIRST PLEASE
	MOV R1,R2	; GET QUOTIENT
	JSR PC,DIV50
	MOVB R0,RX2	; SAME AS ABOVE
	MOV R1,R2
	JSR PC,DIV50
	MOVB R0,RX1	; DONE FOR NOW
	JSR R5,TEXOUT	; PRINT THE RESULT
RX1:	.BYTE 0
RX2:	.BYTE 0
RX3:	.BYTE 0		; HERE WE WILL GET THE RESULT
	.BYTE '%	; TO END THE TYPING
	.EVEN		; REDUNDANT, BUT WHY WORRY ABOUT IT??
;
;
DRIVE:	0		; STORE THE DRIVE NUMBER HERE
CRET:			; HERE COMES THE CARRIAGE RETURN
BUFF:	0,0,0,0,0,0	; FIRST SECTION OF THE BUFFER
ID:	0,0		; ID WILL LAND HERE
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ID2:	0,0		; SECOND ID ENTRY COMES HERE
			;  NAMELY THE PASSWORD OF [0,1]
	.=BUFF+600.	; THE REST OF THE BUFFER WITH A LITTLE EXTRA
	.END START	; GO GALA GO!!!!!!!
