.TITLE Terminal IO routines for SEDT $IODEF $SSDEF .EXTERNAL Ctrlc_Flag, Got_Char, Echo TT_DESC: .ASCID /SYS$INPUT/ TT_CHAN: .BLKW 1 IN_BUF: .BLKB 20 IN_BUFLEN=.-IN_BUF IN_STATUS: .WORD 0 .WORD 0 IN_IOSB: .BLKQ 1 OLDMODES: .LONG 0 .LONG 0 NEWMODES: .LONG 0 .LONG 0 ONEMASK:: .LONG ONEBUF ONEBUF: .LONG ^D32 .LONG ONEBITS ONEBITS: .LONG ^XFFFFFFFF .LONG ^XFFFFFFFF .LONG ^XFFFFFFFF .LONG ^XFFFFFFFF .LONG ^XFFFFFFFF .LONG ^XFFFFFFFF .LONG ^XFFFFFFFF .LONG ^XFFFFFFFF MANYMASK:: .LONG MANYBUF MANYBUF: .LONG ^D32 .LONG MANYBITS MANYBITS: .LONG ^XFFFFFFFF .LONG ^X00000000 .LONG ^X00000000 .LONG ^X80000000 .LONG ^XFFFFFFFF .LONG ^X00000000 .LONG ^X00000000 .LONG ^X00000000 T$INIT:: ;Assign the terminal channel, read the terminal modes and clear half duplex ; and line wrap .WORD 0 $ASSIGN_S DEVNAM=TT_DESC,CHAN=TT_CHAN $QIOW_S CHAN=TT_CHAN,FUNC=#IO$_SENSEMODE,P1=OLDMODES MOVQ OLDMODES,NEWMODES BICL #,4+NEWMODES BISL #,4+NEWMODES RET T$START:: ;Start the first input QIO to the terminal and set up the AST's for ; input completed and control C .WORD 0 MOVB #0,Got_Char $QIOW_S CHAN=TT_CHAN,FUNC=#IO$_SETMODE,P1=NEWMODES $CLREF_S EFN=#3 $QIO_S CHAN=TT_CHAN,EFN=#3,ASTADR=READAST,- FUNC=#IO$_READVBLK!IO$M_NOECHO!IO$M_NOFILTR!IO$M_ESCAPE,- IOSB=IN_STATUS,P1=@4(AP),P2=@8(AP),P4=ONEMASK $QIOW_S CHAN=TT_CHAN,FUNC=#IO$_SETMODE!IO$M_CTRLCAST,- P1=CTRLCAST CLRB Ctrlc_Flag RET T$STARTONE:: ;Start an input QIO for a single character or escape sequence .WORD 0 MOVB #0,Got_Char $CLREF_S EFN=#3 $QIO_S CHAN=TT_CHAN,EFN=#3,ASTADR=READAST,- FUNC=#IO$_READVBLK!IO$M_NOECHO!IO$M_NOFILTR!IO$M_ESCAPE,- IOSB=IN_STATUS,P1=@4(AP),P2=@8(AP),P4=ONEMASK RET T$STARTMANY:: ;Start a QIO for multiple printable characters or a complete escape sequence .WORD 0 MOVB #0,Got_Char $CLREF_S EFN=#3 $QIO_S CHAN=TT_CHAN,EFN=#3,ASTADR=READAST,- FUNC=#IO$_READVBLK!IO$M_TRMNOECHO!IO$M_NOFILTR!IO$M_ESCAPE,- IOSB=IN_STATUS,P1=@4(AP),P2=@8(AP),P4=MANYMASK RET READAST:: ;AST for read completed. Set the flag so that the application knows .WORD 0 MOVB #1,Got_Char RET CTRLCAST:: ;AST for control C typed. Set the flag so the application knows and set ;the control C QIO up again .WORD 0 MOVB #1,Ctrlc_Flag $SETEF_S EFN=#3 $QIOW_S CHAN=TT_CHAN,FUNC=#IO$_SETMODE!IO$M_CTRLCAST,- P1=CTRLCAST RET T$GET:: ;Get the number of characters read in the last input ;If it was for multiple characters and it terminated on other than count ;we clear the echo flag .WORD ^M $WAITFR_S EFN=#3 MOVZWL IN_STATUS+2,R0 TSTB IN_STATUS+6 BEQL $1 CLRB Echo ADDW IN_STATUS+6,R0 $1: RET T$CANCEL:: ;Cancel the QIO on the terminal channel .WORD 0 $CANCEL_S CHAN=TT_CHAN $QIOW_S CHAN=TT_CHAN,FUNC=#IO$_SETMODE,P1=OLDMODES RET T$PUT:: ;Write output to the terminal .WORD 0 $QIOW_S CHAN=TT_CHAN,FUNC=#IO$_WRITEVBLK!IO$M_NOFORMAT,- P1=@4(AP),P2=@8(AP) RET L$MOVE:: S$MOVE:: C$MOVE:: X$MOVE:: ;Move a block of characters ; Different calls to defeat PASCAL's type checking .WORD ^M MOVC3 @12(AP),@4(AP),@8(AP) RET I$MOVE:: ;Move a block of longwords .WORD ^M MULL3 @12(AP),#4,r0 MOVC3 r0,@4(AP),@8(AP) INCL r0 ; set success RET C$FILL:: ;Fill a block of memory with a character .WORD ^M MOVC5 #0,@4(AP),@12(AP),@8(AP),@4(AP) MOVL #0,R0 RET I$ADD:: ;Add an integer to a block of longwords in memory .WORD ^M MOVL 4(AP),R0 MOVL @12(AP),R1 MOVL @8(AP),R2 1$: ADDL R1,(R0)+ SOBGTR R2,1$ RET I$FILL:: ;Fill a block of longwords with a value .WORD ^M MOVL 4(AP),R0 MOVL @12(AP),R1 MOVL @8(AP),R2 1$: MOVL R1,(R0)+ SOBGTR R2,1$ RET C$SCAN:: ;Scan a block of memory for a character .WORD 0 LOCC @12(AP),@8(AP),@4(AP) MNEGL R0,R0 ADDL @8(AP),R0 RET C$BSCAN:: ;Do a backwards scan for a character .WORD 0 MNEGL @8(AP),R0 ADDL3 4(AP),#1,R1 $2: CMPB @12(AP),-(R1) BEQL $3 SOBGTR R0,$2 $3: ADDL @8(AP),R0 RET C$COMP:: ;Compare two strings .WORD ^M CMPC @12(AP),@8(AP),@4(AP) MNEGL R0,R0 ADDL @12(AP),R0 RET .END