.TITLE LISTEN - TTY SERVICE FOR TECOIO .IDENT "X0216" ; ; COPYRIGHT (C) 1976 BY DIGITAL EQUIPMENT CORPORATION, ; MAYNARD, MASSACHUSETTS ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE IN- ; CLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE ; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DIGITAL. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITH- ; OUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ; DIGITAL EQUIPMENT CORPORATION. ; ; DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR ; THE USE OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT WHICH IS ; NOT SUPPLIED BY DIGITAL. ; ; ANDREW C. GOLDSTEIN 1-FEB-78 21:32 .MCALL GET$,QIOW$C,QIOW$S,WSIG$S,DIR$ ;+ ; ; *** - LISTEN TTY INPUT ; ; THIS ROUTINE ACCEPTS INPUT FROM THE CONSOLE TTY AND RETURNS IT ; TO THE CALLER ONE CHARACTER AT A TIME. ; ; INPUTS: ; ; R0 = 0 DELIMITERS ARE ALTMODE, RUBOUT, CTRL/U, CTRL/G ; R0 >< 0 ALL CHARACTERS ARE DELIMITERS. ; ; OUTPUTS: ; ; R0 = CHARACTER (TRIMMED TO 7 BITS, NULLS SUPPRESSED) ; ; ALL OTHER REGISTERS ARE PRESERVED. ; ; ; *** - TLISTN TTY INPUT FOR CONTROL T ; ; THIS ENTRY IS IDENTICAL TO LISTEN, EXCEPT THAT THE CONTROL T ; CONTROL FLAGS IN ETYPE ARE INTERPRETED. ; ;- .PSECT CODE,RO,I .ENABL LSB TLISTN:: MOV SP,R0 ; SET SINGLE CHAR MODE SAVE CLR R1 BIT #ET.NCH,ETYPE(R5) ; CHECK NO ECHO MODE BEQ 10$ ; BRANCH IF NO DEC R1 ; SET CTRL T NO ECHO MODE 10$: DECB R1 ; OR JUST CTRL T MODE BR 20$ LISTEN:: SAVE CLR R1 ; SET NORMAL MODE 20$: INCB TYO ; MARK TYPE IN IN PROGRESS 30$: DEC CMDFDB+F.NRBD ; BUMP DOWN RECORD CHARACTER COUNT BLT 100$ ; BUFFER IS EMPTY BGT 40$ ; BRANCH IF THIS IS NOT THE LAST CHAR TST CMDFDB+F.BDB ; SEE IF A FILE IS REALLY OPEN BNE 40$ ; BRANCH IF YES TST CCLFLG ; NO - SEE IF COMMAND LINE IS WAITING BNE 40$ ; BRANCH IF YES CLR INDIR(R5) ; THIS IS LAST CHAR OF THE CCL COMMAND ; LINE. CLEAR THE FLAG NOW SO THAT THE ; NEXT REQUEST FOR INPUT WILL GIVE A PROMPT. 40$: CLR R0 BISB @CMDFDB+F.NRBD+2,R0 ; GET A CHARACTER INC CMDFDB+F.NRBD+2 ; BUMP RECORD POINTER 50$: TST INDIR(R5) ; IF INPUT IS COMING FROM A FILE BNE 90$ ; SKIP CHARACTER FILTERING BIC #^C177,R0 ; MASK GARBAGE OFF CHARACTER BEQ 30$ ; FLUSH NULLS .IF NE,TECTTY BIT #ET.LOC,ETYPE(R5) ; CHECK FOR LOWER CASE TYPE IN BNE 70$ ; IF SO, SKIP FILTERING CMP R0,#177 ; CHECK FOR RUBOUT BEQ 70$ ; YES - NO CONVERSION CMP R0,#175 ; CHECK FOR OLD ALT MODES BLO 60$ MOV #AM,R0 ; CONVERT TO STANDARD CODE 60$: CMP R0,#'A+40 ; CHECK FOR LOWER CASE BLO 70$ ; IS NOT BIC #40,R0 ; CONVERT TO UPPER CASE .ENDC 70$: TSTB R1 ; SEE IF CONTROL T MODE BEQ 90$ ; BRANCH IF NOT CMP R0,#CTRLC ; SEE IF CONTROL C WAS TYPED BNE 90$ ; BRANCH IF NOT BIT #ET.CC,ETYPE(R5) ; CHECK USER CTRL C INTERCEPT BNE 80$ ; BRANCH IF SET DECB TFLG+1(R5) ; SET ABORT BIT 80$: BIC #ET.CC,ETYPE(R5) ; CLEAR USER CTRL C INTERCEPT 90$: MOV R0,SR0(SP) ; PUT CHAR IN RETURNED R0 DECB TYO ; CLEAR TYPE IN IN PROGRESS RETURN ; ; LINE BUFFER IS EMPTY - GET A NEW ONE ; 100$: CLR CMDFDB+F.NRBD ; RESET RECORD BYTE COUNT MOV INDIR(R5),R0 ; CHECK IF INDIRECT FILE IS OPEN BEQ 140$ ; BRANCH IF NO TST F.BDB(R0) ; SEE IF ITS A REAL OPEN FILE BEQ 130$ ; BRANCH IF NOT ; ; WE GET HERE IF AN INDIRECT FILE IS OPEN ; GET$ R0 ; READ A RECORD BCC 110$ CALL INDER1 ; CHECK UP ON THE ERROR BR 30$ ; AND RETRY 110$: MOV F.NRBD+2(R0),R2 ; POINT TO START OF RECORD ADD F.NRBD(R0),R2 ; POINT TO END OF RECORD CMP @F.BDB(R0),#IS.ESC ; SEE IF I/O TERMINATED WITH ALT MODE BNE 120$ ; BRANCH IF NO MOV #AM,(R2)+ ; PUT ALT MODE IN RECORD INC F.NRBD(R0) ; AND COUNT IT BR 30$ 120$: BITB #FD.CR!FD.FTN,F.RATT(R0) ; SEE IF INPUT NEEDS CRLF BEQ 30$ ; BRANCH IF NO MOVB #CR,(R2)+ ; YES - APPEND CR MOVB #LF,(R2)+ ; AND LF ADD #2,F.NRBD(R0) ; AND COUNT THEM BR 30$ ; GET CHAR FROM BUFFER ; ; TO HERE IF INPUT MUST BE READ FROM THE TERMINAL ; 130$: CLR INDIR(R5) ; END OF FAKED COMMAND LINE 140$: TSTB CCLFLG ; SEE IF COMMAND LINE IS PENDING BEQ 150$ ; BRANCH IF ALREADY USED MOV #CCLPRL,CMDFDB+F.NRBD ; GET BYTE COUNT OF COMMAND TO PROCESS MOV #CCLPRC,CMDFDB+F.NRBD+2 ; GET ADDRESS OF COMMAND CLRB CCLFLG ; MARK AS USED - ONCE ONLY MOV #CMDFDB,INDIR(R5) ; TURN ON INDIRECT MODE BR 30$ 150$: TSTB R1 ; SEE IF CTRL T MODE BEQ 160$ ; BRANCH IF NO BIT #ET.CKE,ETYPE(R5) ; SEE IF CONDITIONAL TYPE IN BEQ 160$ ; BRANCH IF NO MOV #-1,R0 ; IF YES - NO INPUT NOW BR 70$ 160$: MOV CMDFDB+F.URBD+2,R4 ; GET ADDR OF RECORD BUFFER MOV R4,CMDFDB+F.NRBD+2 ; AND RESTORE FOR READING .IF NE,TECTTY MOV CMDFDB+F.URBD,R3 ; GET BUFFER LENGTH MOV #IO.RST,R2 ; ASSUME NORMAL TECO MODE READ TST SR0(SP) ; CHECK TYPE IN MODE BEQ 170$ ; BRANCH IF NORMAL MOV #1,R3 ; SINGLE CHAR TYPE IN TST R1 ; SEE IF CTRL T NO ECHO BGE 170$ ; BRANCH IF NO MOV #IO.RAL!IO.RNE,R2 ; SET READ NO ECHO MODE .IFTF 170$: .IFT QIOW$S R2,#TTYLUN,#TTYEFN,,#IOSTAT,, .IFF .IF NE,RNEPAL QIOW$C IO.RAL!IO.RNE,TTYLUN,TTYEFN,,IOSTAT,,,CODE .IFF QIOW$C IO.RLB,TTYLUN,TTYEFN,,IOSTAT,,,CODE .ENDC .ENDC TIWAIT:: ; INPUT WAIT POINT BCC 190$ 180$: WSIG$S ; WAIT FOR NODES BR 160$ ; AND TRY AGAIN 190$: MOV IOSTAT+2,R3 ; GET BYTE COUNT OF READ BEQ 200$ ; BRANCH IF ZERO COUNT CLRB CTZCNT ; ELSE CLEAR THE CONTROL Z COUNT 200$: .IF NE,TECTTY CMP R2,#IO.RST ; CHECK IF READ ECHOED BNE 220$ ; BRANCH IF NOT MOVB (PC),OUTDNE ; FLAG CHARACTERS ECHOED ADD R3,TABCNT ; ADJUST CURSOR FOR ECHOED CHARACTERS 210$: CMP TABCNT,TTLNSZ ; SEE IF A LINE WRAP OCCURRED BLE 230$ ; BRANCH IF NO SUB TTLNSZ,TABCNT ; TRACK IT BR 210$ 220$: CLR R3 ; READ PASS ALL NO ECHO - MOVB (R4),R0 ; ALWAYS TREAT CHAR AS TERMINATOR FOR FILTERING BNE 240$ ; BRANCH IF REAL 230$: ADD R3,R4 ; POINT TO END OF BUFFER .ENDC MOVB IOSTAT+1,R0 ; GET TERMINATOR, IF ANY 240$: TSTB IOSTAT ; CHECK I/O STATUS BPL 270$ ; BRANCH IF OK CMPB IOSTAT,#IE.EOF ; CHECK FOR EOF, WHICH IS CTRL Z BEQ 250$ ; BRANCH IF YES BR 180$ ; RETRY ON ANY ERROR 250$: MOVB #CTRLZ,R0 ; CONVERT EOF TO CONTROL Z INCB CTZCNT ; BUMP THE CONTROL Z COUNT CMPB CTZCNT,#3 ; SEE IF 3 CONTROL-Z'S IN A ROW BLO 260$ ; BRANCH IF NOT JMP TEXIT ; YES - WE ARE STUCK ON EOF - GET OUT 270$: CLRB CTZCNT ; NOT CONTROL Z - CLEAR THE COUNT 260$: BIC #^C177,R0 ; SEE IF THERE WAS A TERMINATOR .IF NE,TECTTY BEQ 390$ ; BRANCH IF NOT MOVB R0,(R4) ; STORE THE TERMINATOR IN THE BUFFER INC R3 ; AND COUNT IT .IFF BEQ 280$ ; BRANCH IF NOT MOVB R0,(R4) ; STORE THE TERMINATOR IN THE BUFFER INC R3 ; AND COUNT IT 280$: BICB #^C177,(R4) ; MAKE SURE CHAR IS CLEAN BIT #ET.LOC,ETYPE(R5) ; CHECK FOR LOWER CASE TYPE IN BNE 300$ ; IF SO, SKIP FILTERING CMPB (R4),#177 ; CHECK FOR RUBOUT BEQ 300$ ; YES - NO CONVERSION CMPB (R4),#175 ; CHECK FOR OLD ALT MODES BLO 290$ MOVB #AM,(R4) ; CONVERT TO STANDARD CODE 290$: CMPB (R4),#'A+40 ; CHECK FOR LOWER CASE BLO 300$ ; IS NOT BICB #40,(R4) ; CONVERT TO UPPER CASE 300$: .IF EQ,RNEPAL CMPB #'A-100,(R4) ; CONTROL A ? BNE 310$ ; BRANCH IF NO MOVB #RUB,(R4) ; YES, RUBOUT FOR RSX11M 310$: CMPB #'W-100,(R4) ; CONTROL W? BNE 320$ ; BRANCH IF NO MOVB #'U-100,(R4) ; YES, CONTROL U FOR RSX11M 320$: .ENDC MOVB (R4),R0 ; GET CHAR IN R0, REGARDLESS, FOR ECHO .ENDC CMPB R0,#RUB ; CHECK IF IT WAS RUBOUT BEQ 390$ ; IF SO, DON'T ECHO MOV R1,-(SP) ; SAVE THE CONTROL T FLAG .IF NE,RNEPAL BLT 330$ ; BRANCH IF ECHO SUPPRESSED CALL TYPEC ; ELSE ECHO IT 330$: CMPB (R4)+,#CR ; SEE IF TERMINATOR WAS CR BNE 370$ ; BRANCH IF NOT MOVB #LF,R0 ; YES - APPEND LF MOVB R0,(R4)+ ; INTO THE BUFFER INC R3 ; COUNT IT TST (SP) ; CHECK IF ECHO SUPPRESSED BLT 380$ ; BRANCH IF YES CALL TYPEC ; ELSE ECHO IT .IFF MOVB (PC),OUTDNE ; FLAG CHARACTER ECHOED CMP R0,#40 ; ONLY ECHOING SOME CONTROL CHARACTERS BLO 340$ ; BRANCH IF A CONTROL CHARACTER INC TABCNT ; KEEP TRACK OF TAB POSITION BR 380$ 340$: MOV #TYTABL/2,R1 ; GET CHAR TABLE SIZE MOV #TYTAB,R2 ; GET CHAR TABLE ADDRESS 350$: CMP R0,(R2)+ ; IS THIS A SPECIAL CHARACTER BNE 360$ ; BRANCH IF NO JMP @ECHDSP-TYTAB-2(R2) ; HANDLE SPECIAL ECHO 360$: SOB R1,350$ ; CHECK NEXT TABLE ENTRY ECHCTL: CALL TYPEC ; ECHO NORMAL CONTROL CHARACTER .ENDC 370$: CALL TYOUT ; FLUSH THE TYPE OUT BUFFER 380$: MOV (SP)+,R1 390$: MOV R3,CMDFDB+F.NRBD ; STORE THE RECORD BYTE COUNT JMP 30$ ; AND FINALLY GO GET A CHARACTER FOR TECO .IF EQ,RNEPAL ; ; ECHO BACKSPACE ; ECHBS: DEC TABCNT BGE 380$ ; ; ECHO CR ; ECHCR: CLR TABCNT ; RESET THE TAB POSITION ECHLF: ECHFF: ECHVT: BR 380$ ; ; ECHO TAB ; ECHTAB: ADD #10,TABCNT ; ADVANCE TO NEXT TAB POSITION BIC #7,TABCNT BR 380$ ; ; ECHO DISPATCH TABLE. THIS TRACKS THE CHARACTER DISPATCH TABLE IN TTYOUT. ; ECHDSP: .WORD ECHBS .WORD ECHTAB .WORD ECHLF .WORD ECHVT .WORD ECHFF .WORD ECHCR .WORD ECHCTL .WORD ECHCTL .ENDC .DSABL LSB .END