	.TITLE TERMHDLR Terminal and log file I/O routines

	.ENABLE	SUPPRESSION

	.LIBRARY  'VFELIB'

	$DCDEF
	$DVIDEF
	$FABDEF
	$IODEF
	$NAMDEF
	$RABDEF

	.PSECT	CODE,EXE,NOWRT
	.PAGE
	.SBTTL	TINIT - Intitialize terminal I/O
TINIT::
	$ASSIGN_S  DEVNAM=TERM,CHAN=TT
	BLBC	R0,100$
	$QIOW_S	CHAN=TT,FUNC=#IO$_SETMODE!IO$M_CTRLCAST,-
		EFN=#1,P1=CTRLCAST,P3=#3
	BLBS	R0,200$
100$:
	CLRW	TERMFLGS
	BRW	800$
200$:
	$GETDVI_S  EFN=#0,DEVNAM=SYSIN,ITMLST=GETCLS,IOSB=TSTATUS
	BLBS	R0,220$
	BRW	900$
220$:
	$WAITFR_S  EFN=#0
	MOVZWL	TSTATUS,R0
	BLBS	R0,240$
	BRW	900$
240$:
	CMPL	#DC$_TERM,IOCLASS
	BEQL	300$
	CLRB	TERMIN
300$:
	$GETDVI_S  EFN=#0,DEVNAM=SYSOUT,ITMLST=GETCLS,IOSB=TSTATUS
	BLBS	R0,320$
	BRB	900$
320$:
	$WAITFR_S  EFN=#0
	MOVZWL	TSTATUS,R0
	BLBS	R0,340$
	BRB	900$
340$:
	CMPL	#DC$_TERM,IOCLASS
	BEQL	400$
	CLRB	TERMOUT
	BRB	800$
400$:
	$QIOW_S	CHAN=TT,FUNC=#IO$_SENSEMODE,IOSB=TSTATUS,-
		P1=MODBUF,P2=#8
	BLBC	R0,900$
	MOVZWL	TSTATUS,R0
	BLBC	R0,900$
	MOVZWL	TT_WID,TERMWD
800$:
	MOVL	#1,R0
900$:
	RSB
	.PAGE
	.SBTTL	LOGON - Turn on logging or switch log file
LOGON::
	BSBW	LOGOFF
	MOVB	DESC,LOGFAB+FAB$B_FNS
	MOVL	DESC+4,LOGFAB+FAB$L_FNA
	$CREATE	FAB=LOGFAB
	BLBS	R0,100$
	BSBW	ERROUT
	BRW	900$
100$:
	$CONNECT  RAB=LOGRAB
	BLBS	R0,200$
	BRW	ERREXT
200$:
	CLRB	NOLOG
900$:
	RSB

	.SBTTL	LOGOFF - Turn off logging
LOGOFF::
	TSTB	NOLOG
	BNEQ	900$
	$CLOSE	FAB=LOGFAB
	BLBS	R0,900$
	BRW	ERREXT
900$:
	MOVB	#1,NOLOG
	RSB

	.SBTTL	SHOLOG - Display log file status
SHOLOG::
	TSTB	NOLOG
	BEQL	100$
	OUTMSGC	NLGMSG
	BRB	900$
100$:
	MOVL	#100,OUTDSC
	MOVAL	LOGNBK,R6
	MOVB	NAM$B_RSL(R6),DESC
	MOVL	NAM$L_RSA(R6),DESC+4
	$FAO_S	CTRSTR=LOGMSG,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=#DESC
	OUTMSG	OUTDSC,OUT_BUFF
900$:
	RSB
	.PAGE
	.SBTTL	CTRLCAST - Handle user interrupts
CTRLCAST:
	.WORD	0
	$QIOW_S	CHAN=TT,FUNC=#IO$_SETMODE!IO$M_CTRLCAST,-
		EFN=#1,P1=CTRLCAST,P3=#3
	BLBS	R0,100$
	BRW	ERREXT
100$:
	MOVB	#1,STOP
	RET

	.SBTTL	SETWID - Set terminal width (80/132)
SETWID::
	CMPL	NEWWID,TERMWD
	BNEQ	100$
	BRW	500$
100$:
	CMPL	NEWWID,#80
	BGTR	200$
	MOVL	#80,R2
	MOVAL	SETLOW,DESC+4
	BRB	300$
200$:
	MOVL	#132,R2
	MOVAL	SETHIGH,DESC+4
300$:
	BLBC	R1,400$
	MOVL	R2,NEWWID
400$:
	MOVL	NEWWID,TERMWD
	TSTB	TERMOUT
	BEQL	500$
	MOVW	TERMWD,TT_WID
	$QIOW_S	CHAN=TT,FUNC=#IO$_SETMODE,P1=MODBUF,P2=#8
	BLBC	R0,900$
	$QIOW_S	CHAN=TT,FUNC=#IO$_WRITEVBLK,P1=@DESC+4,P2=#5
	BLBC	R0,900$
500$:
	MOVL	#1,R0
900$:
	RSB
	.PAGE
	.SBTTL	TERMIO - Control I/O to the terminal
TERMIO::
	.WORD	^M<R2,R3,R4,R5,R6,R7>
	MOVC3	8(AP),@4(AP),TERMBUFF
	ADDL3	#1,8(AP),R6
	CMPL	(AP),#3
	BLEQ	100$
	BRW	200$
100$:
	CMPL	(AP),#2
	BGTR	120$
	TSTW	TERMON
	BEQL	160$
120$:
	TSTB	TERMOUT
	BEQL	130$
	MOVB	#CR,TERMBUFF-1[R6]
	INCL	R6
	$QIOW_S	CHAN=TT,FUNC=#IO$_WRITEVBLK,P1=TERMLF,P2=R6
	BLBS	R0,150$
	BRW	ERREXT
130$:
	MOVW	8(AP),TERMDSC
	PUSHAQ	TERMDSC
	CALLS	#1,G^LIB$PUT_OUTPUT
	BLBS	R0,150$
	BRW	ERREXT
150$:
	TSTB	NOLOG
	BNEQ	170$
160$:
	MOVL	8(AP),R6
	BRW	600$
170$:
	BRW	900$
200$:
	MOVAL	TERMLF,R7
220$:
	TSTB	TERMIN
	BEQL	450$
	$QIOW_S	CHAN=TT,FUNC=#IO$_READPROMPT,IOSB=TSTATUS,-
		P1=@12(AP),P2=16(AP),P5=R7,P6=R6
	BLBS	R0,300$
	BRW	ERREXT
300$:
	CMPW	TSTATUS+4,#CR
	BEQL	340$
	TSTB	HLPON
	BEQL	350$
	CVTWL	TSTATUS+2,R7
	CMPL	R7,16(AP)
	BGEQ	340$
	ADDL2	12(AP),R7
	MOVB	TSTATUS+4,(R7)
	INCW	TSTATUS+2
340$:
	BRW	500$
350$:
	CMPW	TSTATUS+4,#CZ
	BNEQ	400$
	BRW	EXIT
400$:
	MOVAL	TERMCR,R7
	ADDL3	#2,8(AP),R6
	BRW	220$
450$:
	MOVW	8(AP),TERMDSC
	PUSHAQ	TERMDSC
	CALLS	#1,G^LIB$PUT_OUTPUT
	BLBC	R0,460$
	MOVW	16(AP),DESC
	MOVL	12(AP),DESC+4
	PUSHAW	TSTATUS+2
	PUSHL	#0
	PUSHAQ	DESC
	CALLS	#3,G^LIB$GET_INPUT
	BLBS	R0,470$
	CMPL	R0,#RMS$_EOF
	BNEQ	460$
	BRW	EXIT
460$:
	BRW	ERREXT
470$:
	MOVW	#CR,TSTATUS+4
500$:
	TSTB	NOLOG
	BNEQ	900$
	MOVL	8(AP),R6
	TSTW	TSTATUS+2
	BLEQ	600$
	ADDL3	#TERMBUFF,R6,R7
	MOVC3	TSTATUS+2,@12(AP),(R7)
	ADDW2	TSTATUS+2,R6
600$:
	MOVW	R6,LOGRAB+RAB$W_RSZ
	$PUT	RAB=LOGRAB
	BLBS	R0,900$
	BRW	ERREXT
900$:
	RET
	.PAGE
	.SBTTL	Data definitions

	.PSECT	DATA,WRT,NOEXE,LONG

CR=^X0D
LF=^X0A
CZ=^X1A
ESC=^X1B

TERM:	.ASCID	/TT/
TT:	.BLKW	1

TSTATUS:: .BLKL	2

NLGMSG:	.ASCIC	/        NOLOG/
LOGMSG:	.ASCID	/        LOG=!AS/

SYSIN:	.ASCID	/SYS$INPUT/

SYSOUT:	.ASCID	/SYS$OUTPUT/

SETLOW:	.ASCII	<ESC>/[?3l/
SETHIGH: .ASCII	<ESC>/[?3h/

MODBUF:
TT_CLASS: .BLKB	1
TT_TYPE: .BLKB	1
TT_WID:	.BLKB	2
TT_CHAR: .BLKB	3
TT_LEN:	.BLKB	1

TERMFLGS:
TERMIN:	.BYTE	1
TERMOUT:: .BYTE	1

NEWWID:: .LONG	0
TERMWD:: .LONG	132

TERMCR:	.BYTE	CR
TERMLF:	.BYTE	LF
TERMBUFF:  .BLKB  200
TERMDSC: .WORD	0
	.WORD	^X010E
	.ADDRESS TERMBUFF

GETCLS:	.WORD	4
	.WORD	DVI$_DEVCLASS
	.ADDRESS IOCLASS
	.LONG	0
	.LONG	0
IOCLASS: .LONG	0

	.ALIGN	LONG

LOGFAB:	$FAB	FAC=PUT,FOP=<MXV,SQO,TEF>,ORG=SEQ,RAT=CR,RFM=VAR,SHR=NIL,-
		NAM=LOGNBK
LOGNBK:	$NAM	RSA=RESLOG,RSS=NAM$C_MAXRSS
LOGRAB:	$RAB	FAB=LOGFAB,RBF=TERMBUFF,RAC=SEQ

RESLOG:	.BLKB	NAM$C_MAXRSS

	.END
