            

		; COMMON INPUT ROUTINE FOR USE BY NON FILE DEVICES



I.INPUT: MOV	R5,I.RDIT		; SAVE ADR DIT
	ADD	I.ICHAR,(R5)+		; UPDATE CKSUM
	MOV	(R5)+,I.RMAX		; GET  MAX
	MOV	(R5)+,I.MODADR; GET ADR MODE
	TST	(R5)+			; R5=ADR IOX BC
	TSTB	@R6			; TEST FOR OUT-OF TAPE
	BMI	I.CK1D0			; TOO BAD


; I.CKMOD:
	BITB	#I.BINARY,@I.MODADR	; WHAT IS MODE?
	BNE	I.CKBIN			; BINARY
					; ASCII
;I.STRIP:
	BIC	#177600,I.ICHAR	; STRIP ALL ASCII
	CMPB	I.PL12(I.RDIT),#I.KBD	; KBD?
	BEQ	I.KBDNI		;
;I.RDRIN:
	BITB	#I.UNF,@I.MODADR	; RDR ... UNF ASCII
	BNE	I.PUT			; YES
	CMPB	I.ICHAR,#I.RUBOUT	; DISCARD FASCII RUBOUTS
	BEQ	I.CKDUN
	BR	I.CK2LF		;
I.KBDNI: JSR	R5,I.CKCTRL		; CHECK FOR ^P
	MOV	I.ICHAR,I.OCHAR		; ECHO THIS CHAR
	BITB	#I.UNF,@I.MODADR	; IS THIS UNFASC?
	BEQ	I.CONVRT		; FASCII
	BR	I.PUT

I.CKBIN: BITB	#I.UNF,@I.MODADR; UNFORMATTED BINARY?
	BNE	I.PUT			; YES
				; FBIN

	ADD	#4,I.RMAX		; ADD 4 TO MAX
	TST	@R5			; IOX BC=0?
	BNE	I.IO2BIN		; NO
	MOV	#-1,2(I.MODADR)		; YES...SET USER BC =-1
	TSTB	I.ICHAR			; IS THIS CHAR A NULL?
	BEQ	I.CKD0			; YES...DROP IT
	CMPB	I.ICHAR,#I.FBIN		; NO...IS THIS THE MODE BYTE?
	BEQ	I.PUT			; YES
					; NO...MODE ERROR
;I.MODERR:
	BIS	#I.IMPMOD,@I.MODADR	; SET IMP MODE ERR
	INC	@R6
	BR	I.CKD0

I.IO2BIN: CMP	@R5,2(I.MODADR)	; IS TAPE BC=USER BC?
	BNE	I.PUT			; NO
	SUB	#4,@R5		; SUBTRACT FOUR FROM BYTE COUNT
	INC	@I.RDUN		;SET COMPLETION INDICATOR
	TSTB	@I.RDIT
	BEQ	I.IODUN

; I.CKERR:
	BIS	#I.CKSERR,@I.MODADR	; SET CHECKSUM INDICATOR
	BR I.IODUN


I.CONVRT:

;I.CK1:
	CMPB	I.ICHAR,#I.RUBOUT	; IS CHAR A RUBOUT?
	BNE	I.CKUPU			; NO
					; YES
	TST	@R5			; BC=0?
	BEQ	I.CKDUN			; YES---FORGET IT
	MOVB	#I.BSLASH,I.OCHAR	; ECHO A \
	DEC	@R5			; BC=BC-1
	DEC	-(R5)			; POINTER=POINTER-1
	BR	I.UPU1			; I.EKO

I.CKUPU: CMPB	I.ICHAR,#I.UCTRL; IS IT A ^U?
	BNE	I.CKCR			; NO
	MOV	#I.UPU,I.OCHAR		; YES---ECHO ^U
	CLR	@R5			; BC=0
	MOV	I.MODADR,-(R5)
	ADD	#4,@R5
I.UPU1:	BIC	#I.LONGLIN,@I.MODADR
	BR	I.EKO			; ECHO


I.CKCR:	CMPB	I.ICHAR,#I.CR		; IS IT A I.CR?
	BNE	I.CKLF			; NO
	MOV	#I.CRLF,I.ICHAR		; YES---ECHO I.CRLF
I.CKLF:	MOV	I.ICHAR,I.OCHAR
I.CK2LF: TST	I.ICHAR		; DISCARD FASCII NULLS
	BEQ	I.CKDUN	
	CMPB	I.ICHAR,#I.LF
	BEQ	I.CK3A
; I.CKFF:
	CMPB	I.ICHAR,#I.FF
	BNE	I.PUT
I.CK3A:	INC	@I.RDUN



I.PUT:
	INC	@R5			; INC BC
	CMP	@R5,I.RMAX	;COMPARE BC TO MAX BUFFER SIZE
	BHI	I.IA		;BYTE COUNT TO BIG?
I.IB:	MOVB	I.ICHAR,@-(R5); MOVE CHAR VIA POINTER
	INC	(R5)+			; NO...INC PTR
	BITB	#2,@I.MODADR		;FORMATTED BINARY MODE?
	BEQ	I.EKO			;YES, DON'T COMPARE BYTE COUNT
	CMP	@R5,I.RMAX		; IS BC LT USER BC?
	BLO	I.EKO			; NO
I.IC:	INC	@I.RDUN			; YES...SET DONE INDICATOR
	BR	I.EKO
I.IA:	BIS	#I.LONGLIN,@I.MODADR	; SET LONG LINE INDICATOR		
	DEC	-2(R5)		;DEC BUFFER POINTER
	BR	I.IB		;GO TEST IF FORMATTED BINARY
I.EKO: TST	I.OCHAR			; ANYTHING TO ECHO?
	BEQ	I.CKDUN			; NO

; I.EKOIT:
	TSTB	@I.MODADR		; CHECK TO SEE IF DON'T ECHO BIT IS ON
	BMI	I.CKDUN
	MOV	I.OCHAR,I.ECHAR	; SET UP FOR TTY
	BISB	I.FUNC+4,I.TSCR		; ENABLE INTS ON TTY
	INCB	I.CONBYT		; TURN ON EKO IN PROGRESS BIT.
	CLR	I.OCHAR			; IN CASE THIS IS <CR,LF>

I.IODUN:
I.CKDUN: CLRB	I.ICHAR			; IS LF IN HI ORDER?
	SWAB	I.ICHAR
	BEQ	I.CKD0
	BR	I.CK3A
I.CK1D0:BIS	#I.EOMDET,@I.MODADR	; SET EOM ON HSR
	INCB	I.DST+12

I.CKD0:	MOVB	12(I.RDIT),I.RDEV	; GET DEVICE
	TST	(I.RDUN)+		; IS DONE SET?
	BEQ	I.AGAIN			; NO---KEEP GOING
					; FINISH BUFFERS
; I.CK1DUN:
	MOV	I.RMAX,2(I.MODADR)	; BC=IOX BC UNLESS LONG LINE SET
	BITB	#I.LONGLIN,@I.MODADR	; 
	BNE	I.CK2DUN		; 
	MOV	10(I.RDIT),2(I.MODADR)	; 

I.CK2DUN: BIS	#I.DUNBIT,@I.MODADR	; SET DONE BIT

; TURN OFF INTS AND CONFLICTS
; I.CK3DUN:
	JSR	R5,I.TURNOFF+4	; 
                        ; I.RETURN:
	TST	I.PL14(I.RDIT)	; IS THIS A READR?
	BEQ	I.REGRTN		; NO
; I.REALRTN:
	JSR	R7,@I.PL14(I.RDIT); YES
I.REGRTN: JMP	I.UNSAV			; NO
I.AGAIN: BISB	I.FUNC(I.RDEV),@I.SCRTAB(I.RDEV)
	BR	I.REGRTN

                        
; /////////////////////////////////////////////
; ////////////TTY INT ROUTINE  ///////////////
; ////////////////////////////////////////////
I.TTYIR:
; I.LSPIR:
	JSR	R0,I.SAVR		; SAVE REGS
	MOV	#I.ECHAR,I.RECHAR	; GET ADR OF ECHO BYTE
	BITB	#1,I.CONBYT		; IS THIS TTY OR PUNCH OUTPUT?
	BEQ	I.TTYUSR		; YES
					; NO... MUST BE ECHO
	MOVB	@I.RECHAR,I.OCHAR	; GET THE CHAR

I.TTYCK: MOV	#I.TABCNT,I.RTAB; GET ADR COUNTER
	MOV	I.RTAB,I.R0TMP
; I.IOLF:
	CMPB	I.OCHAR,#40		; IS CHAR A PRINTING CHAR?
	BLT	I.IOCR			; NO
;I.LF1:
	DECB	@I.RTAB			; YES...DEC COUNTER
I.IOCR:	CMPB	I.OCHAR,#I.CR		; CLR COUNTER IF CHAR IS A CR
	BNE	I.CR2
	CLRB	@I.R0TMP		; CLR TAB COUNTER
I.CR2:	CMPB	I.OCHAR,@#I.45		; IS CHAR TO BE FILLED
	BNE	I.IOTAB			; NO
	TSTB	-(I.R0TMP)		; 1ST TIME THIS FILL?
	BNE	I.CR3			; NO
	MOVB	@#I.44,@I.R0TMP			; SET UP FILL COUNT
	BR	I.IO1
I.CR3:	CLRB	I.OCHAR			; CREATE NULL FILL CHAR
	DECB	(I.R0TMP)+		; COUNT FILL
I.IOTAB: CMPB	I.OCHAR,#I.HTAB		; DO TAB CONVERSION FOR TABS
	BNE	I.IO1
	INCB	-(I.R0TMP)		; SET FLAG
	DECB	@I.RTAB			; COUNT TAB SPACES
	BNE	I.TAB3
	CLRB	@I.R0TMP
I.TAB3:	MOV	#I.1BLNK,I.OCHAR

I.IO1:	MOVB	I.OCHAR,I.TDR		; OUTPUT THE CHAR
	BICB	#370,(I.RTAB)+		; CLR OUT HI BITS OF COUNTER

	TSTB	I.TABCNT-1		; MORE TO THIS CHAR?
	BNE	I.EXIT			; YES

	BITB	#I.EKBIT,@I.RTAB	; IS THIS AN ECHO?
	BEQ	I.OUT2			; NO...BACK TO OUTPUT
					; NOTE THAT RTAB CANNOT
					; EQUAL ONE UPON RETURN
;I.IOEKO:
	CLRB	@I.RECHAR		; MORE TO THIS ECHO?
	SWAB	@I.RECHAR
	BNE	I.EXIT			; YES
	BICB	#25,@I.RTAB		; TURN OFF CONFLICT
I.EX1:	BICB	I.FUNC+4,I.TSCR		; TURN OFF INTS
I.EXIT:	BR	I.REGRTN


; /////////////////////////////////////////////
; /////////////////HSP INT ROUTINE/////////////
; /////////////////////////////////////////////
I.HSPIR: JSR	R0,I.SAVR
	TST	I.HSPSCR		; SET EOM ON THIS BUFFER IF OUT-OF-TAPE
	BGE	I.HP1
	BIS	#I.EOMDET,@I.HPDIT+4
	CLR	I.HPDIT+10		; I.OUTPUT WILL TERMINATE THE
					; WRITE IF BC = 0
I.HP1:	JSR	R5,I.OUTPUT
I.HPDIT: .WORD	0			; CKSUM
	.WORD	0			; MAX
	.WORD	0			; ADR MODE
	.WORD	0			; POINTER
	.WORD	0			; BC
	.WORD	0			; DEV
	.WORD	0			; DONE ADR
	I.HPDR


                              
I.TTYUSR: JSR	R5,I.OUTPUT
I.TTYDIT:
;I.LSPDIT:
	.WORD	0			; CKSUM
	.WORD	0			; MAX
	.WORD	0			; ADR MODE
	.WORD	0			; POINTER
	.WORD	0			; BC
	.WORD	0			; DEVICE
	.WORD	0			; DONE ADR
	I.TDR				; TTY DATA BUFFER REGISTER ADR



					; FORMATTED BINARY OUTPUT STUFF
I.OUTBIN: TST	@R5			; BC = 0 ?
	BEQ	I.BINDUN		; YES
	BMI	I.OUT1DUN	;CHECKSUMTRANSFER COMPLETE?
	ADD	I.OCHAR,@I.RDIT		; NO  UPDATE CKSUM
	BIC	#177400,@I.RDIT
	BR	I.OUTOVR

I.BINDUN: SUB	#4,2(I.MODADR)		; RESET USER BC
	MOVB	@I.RDIT,I.OCHAR		; GET CKSUM
	NEG	I.OCHAR
	BR	I.OUTOVR	;GO OUTPUT CHECKSUM CHAR
;
I.OUTPUT: TST	(R6)+		;CLEAN STACK
I.1OUT:	MOV	R5,I.RDIT		; SAVE ADR DIT
	TST	(R5)+	
	MOV	(R5)+,I.RADD		;ADDRESS OF MAX BUFFER SIZE 
	MOV	(R5)+,I.MODADR		; SAVE ADR MODE
	MOVB	@(R5)+,I.OCHAR		; GET THE CHAR
	CMPB	#1,@I.MODADR		; WHAT IS MODE?
	BEQ	I.OUTBIN		; FBIN
	TST	(R5)		;BYTE COUNT = 0?
	BEQ	I.OUT1DUN	;YES, EXIT
	BITB	#I.UNF,@I.MODADR
	BNE	I.OUTOVR
	TSTB	I.OCHAR			; DISCARD FASCII NULL
	BEQ	I.OGAIN
	CMPB	12(I.RDIT),#I.TTY	; DEVICE?
	BEQ	I.TTYCK			; TTY
					; PUNCH
; I.OTPCH:
 	TST	@I.RDIT			; LAST CHAR A TAB?
	BEQ	I.OUTCKT		; NO...
	CLR	@I.RDIT			; YES
	MOVB	#I.RUBOUT,I.OCHAR	; OUTPUT A RUBOUT
	BR	I.OUTOVR

I.OUTCKT: CMPB	#I.HTAB,I.OCHAR		; IS THIS ONE A TAB?
	BNE	I.OUTOVR
	INC	@I.RDIT			; YES...DIDDLE FLAGS
; I.OTDDL:
	DEC	-2(R5)		; DIDDLE POINTER
	INC	@R5			; DIDDLE BC


I.OUTOVR: MOVB	I.OCHAR,@16(I.RDIT)	; OUTPUT THE CHAR
I.OUT2:	MOV	-4(R5),I.MODADR		;RESTORE R1
	DEC	@R5			; DEC BC
	INC	-(R5)			; NO...INC POINTER
I.OUT3:	BR	I.EXIT

I.OUT1DUN: MOV	I.RDIT,I.RADD
	MOV	12(I.RDIT),I.RDEV
	JMP	I.CK2DUN

I.OGAIN: DEC	@R5			; DEC BC
	INC	-(R5)		;INCREMENT POINTER
	MOV	I.RDIT,R5	;RESET DIT TABLE ADDRESS
	BR	I.1OUT
                        					; IF THIS IS A ^P, THEN CONTROL
I.CKCTRL: BIC	#177600,I.ICHAR		; NEVER RETURNS TO INT ROUTINE
	CMPB	I.ICHAR,#I.PCTRL	; CHAR A ^P
	BEQ	I.EXYES			; YES
I.EXNO:	RTS	R5			; NO GO...RTN
I.EXYES: TST	I.RESTAD		; YES...CHECK TO SEE IF A
	BEQ	I.EXNO			; RESTART ADR WAS SPECIFIED

	MOV	#I.RESTAD,R0		;
	MOV	(R0)+,20(R6)		;
	CLR	(R0)+			; CLR TAB COUNTER
	BIC	#37,@R0			; CLR CONFLICTS
I.P0:	TSTB	I.TSCR
	BPL	I.P0

	MOV	#'^,I.TDR		; OUTPUT ^
I.P1:	TSTB	I.TSCR			; WAIT UNTIL DONE
	BPL	I.P1	

	MOV	#'P,I.TDR		; OUTPUT P
	CLR	@R6	; SET UP TIMING LOOP
I.P2:	INC	@R6	; COUNT TO 2**16
	BNE	I.P2

	CMP	(R6)+,(R6)+		; GET RID OF EXTRA WORDS ON 
	JMP	I.EX1			; RETURN





                        					; REGISTER ASSIGNMENTS

I.KSCR	=	177560
I.RSCR	=	177560
I.KDR	=	177562
I.TSCR	=	177564
I.PSCR	=	177564
I.TDR	=	177566
I.HSRSCR	=	177550
I.HRDR	=	177552
I.HSPSCR	=	177554
I.HPDR	=	177556
	I.STAREG	=-2
.=4					; ILLEGAL MEM REF TRAP VECTORS
I.ERR0
340

.=20

					; INTERRUPT AND TRAP VECTORS
; I.IOTV:
	I.IOX
	340
.=40
	HALT
	.BYTE	006,'A
I.44:	.BYTE	0	; FILL COUNT
I.45:	.BYTE	0	; CHAR TO BE FILLED



.=60

; I.KINV:
	I.KBDIR
	200
; I.TINV:
	I.TTYIR
	200
; I.RINV:
	I.HSRIR
	200
; I.PINV:
	I.HSPIR
	200

.EOT
                        .END

                                                                                                                                                                                       