.TITLE TERMHDLR Terminal and log file I/O routines .ENABLE SUPPRESSION ; .LIBRARY 'VFELIB' .MACRO INPUT ARG1,ARG2,ARG3,ARG4 CVTWL ARG3,-(SP) PUSHAL ARG4 CVTWL ARG1,-(SP) PUSHAL ARG2 CALLS #4,TERMIO .ENDM .MACRO OUTPUT ARG1,ARG2 CVTWL ARG1,-(SP) PUSHAL ARG2 CALLS #2,TERMIO .ENDM .MACRO OUTMSG ARG1,ARG2 PUSHL #1 CVTWL ARG1,-(SP) PUSHAL ARG2 CALLS #3,TERMIO .ENDM .MACRO OUTMSGC ARG1 PUSHL #1 MOVZBL ARG1,-(SP) PUSHAL ARG1+1 CALLS #3,TERMIO .ENDM $DCDEF $DVIDEF $FABDEF $IODEF $NAMDEF $RABDEF .PSECT CODE,EXE,NOWRT .PAGE .SBTTL TINIT - Intitialize terminal I/O TINIT:: .jsb_entry $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:: .jsb_entry 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:: .jsb_entry TSTB NOLOG BNEQ 900$ $CLOSE FAB=LOGFAB BLBS R0,900$ BRW ERREXT 900$: MOVB #1,NOLOG RSB .SBTTL SHOLOG - Display log file status SHOLOG:: .jsb_entry 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 .entry ctrlcast,^m<> ;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:: .jsb_entry 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 .entry termio,^m ;TERMIO:: ; .WORD ^M 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,quad 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 /[?3l/ SETHIGH: .ASCII /[?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 quad LOGFAB: $FAB FAC=PUT,FOP=,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