.TITLE TTYOUT - TTY SERVICE FOR TECOIO .IDENT "X0214" ; ANDREW C. GOLDSTEIN 29-JUN-77 13:31 .MCALL GET$,QIOW$C,QIOW$S,WSIG$S,DIR$ .PSECT PURE,RO,D ; ; CHARACTER DISPATCH TABLE FOR TYPE OUT ROUTINE. ; TYTAB:: .WORD BS .WORD TAB .WORD LF .WORD VT .WORD FF .WORD CR .WORD AM .WORD BELL TYTABL == .-TYTAB TYDISP: .WORD TOBS .WORD TOTAB .WORD TOLF .WORD TOVT .WORD TOFF .WORD TOCR .WORD TOAM .WORD TOBELL .SBTTL PRINT - OUTPUT STRING TO CONSOLE ;+ ; ; *** - PRINT OUTPUT STRING TO CONSOLE ; ; THIS ROUTINE TYPES OUT THE DESIGNATED STRING ON THE CONSOLE TTY. ; ALL CHARACTERS ARE HANDLED AS IN THE TYPE ROUTINE (BELOW). ; ; *** - PRINTF OUTPUT STRING TO CONSOLE WITH CASE FLAGGING ; ; THIS ROUTINE TYPES OUT THE DESIGNATED STRING ON THE CONSOLE ; WITH CASE FLAGGING AS DIRECTED BY THE EU FLAG. ; ; INPUTS: ; ; R3 = POINTER TO CHARACTER STRING ; R4 = LENGTH OF CHARACTER STRING ; ; OUTPUTS: ; ; NONE ; ; ALL REGISTERS ARE PRESERVED. ; ;- .PSECT CODE,RO .ENABL LSB PRINTF:: SAVE MOV #TYPECF,-(SP) ; SET UP TO CALL TYPECF BR 10$ PRINT:: SAVE PRINTI::MOV #TYPEC,-(SP) ; SET UP TO CALL TYPEC 10$: INCB TYO ; MARK TYPE OUT IN PROGRESS TST R4 ; CHECK CHAR COUNT TO PROTECT AGAINST ZERO BEQ 40$ 30$: MOVB (R3)+,R0 ; PICK UP NEXT CHARACTER CALL @(SP) ; AND OUTPUT IT SOB R4,30$ ; COUNT CHARS AND LOOP CALL TYOUT ; AND FLUSH THE TYPE OUT BUFFER 40$: TST (SP)+ ; CLEAN THE STACK DECB TYO ; CLEAR TYPE OUT IN PROGRESS RETURN .DSABL LSB .SBTTL TYPE - OUTPUT CHARACTER TO CONSOLE ;+ ; ; *** - TYPE OUTPUT CHARACTER TO CONSOLE ; ; THIS ROUTINE OUTPUTS ONE CHARACTER TO THE CONSOLE TTY. SINCE THE ; SMALL RSX TTY HANDLER IS IN USE, ALL SPECIAL CHARACTERS ARE ; CAREFULLY INTERPRETED. TABS AND FORM FEEDS ARE SPACED APPROPRIATELY, ; ALT MODES ARE CONVERTED TO "$", AND ALL OTHER CONTROL CHARACTERS ; ARE OUTPUT AS "^". CHARACTERS ARE BUFFERED AND FED TO THE ; HANDLER MANY AT A TIME TO CUT DOWN ON SYSTEM OVERHEAD. ; ; *** TYPEF OUTPUT CHARACTER TO CONSOLE WITH CASE FLAGGING ; ; THIS ENTRY IS IDENTICAL TO TYPE, EXCEPT THAT THE CHARACTER IS ; SUBJECT TO CASE FLAGGING AS CONTROLLED BY THE EU FLAG, PROVIDED ; IMAGE MODE TYPE OUT IS TURNED OFF. ; ; INPUTS: ; ; R0 = CHARACTER TO BE TYPED. ; ; OUTPUTS: NONE ; ; ALL REGISTERS ARE PRESERVED. ; ;- .ENABL LSB TYPEF:: SAVE CLR R4 ; SET SINGLE CHARACTER MODE TYPECF: ; INTERNAL ENTRY INCB TYO ; SET TYPE OUT IN PROGRESS BIT #ET.IMG,ETYPE(R5) ; CHECK FOR IMAGE MODE OUTPUT BNE TOCOMM ; SKIP ALL FILTERING IF ON TST EUFLAG(R5) ; CHECK CASE FLAGGING MODE BMI TYPEC1 ; NEGATIVE MEANS NO FLAGGING BEQ 10$ ; ZERO MEANS FLAG LOWER CASE ; POSITIVE MEANS FLAG UPPER CASE CMP R0,#100 ; SEE IF UPPER CASE BLO TYPEC1 ; BRANCH IF NO CMP R0,#140 ; CHECK UPPER BOUND BHIS 30$ ; BRANCH IF NO BR 20$ ; FLAG IT 10$: CMP R0,#140 ; CHECK FOR LOWER CASE BLO TYPEC1 ; BRANCH IF NO 20$: MOV R0,-(SP) ; SAVE ORIGINAL CHARACTER MOV #'',R0 ; GET FLAG CHARACTER CALL PUT ; OUTPUT IT MOV (SP)+,R0 ; GET CHARACTER BACK 30$: BIC #40,R0 ; CONVERT CHARACTER TO UPPER CASE BR TYPEC1 ; AND PROCEED TYPE:: SAVE CLR R4 ; SET SINGLE CHARACTER MODE TYPEC:: ; ENTRY FOR INTERNAL USE INCB TYO ; MARK TYPE OUT IN PROGRESS TYPEC1: BIT #ET.CCO,ETYPE(R5) ; SEE IF CTRL O TO BE CANCELLED BEQ 40$ ; BRANCH IF NO CALL NOCTLO BIC #ET.CCO,ETYPE(R5) ; CONTROL O CANCEL IS SINGLE SHOT 40$: BIT #ET.IMG,ETYPE(R5) ; CHECK FOR IMAGE MODE BNE TOCOMM ; BYPASS ALL FILTERING IF SET MOV #TYTABL/2,R1 ; GET CHAR TABLE SIZE MOV #TYTAB,R2 ; GET CHAR TABLE ADDRESS 50$: CMP R0,(R2)+ ; TEST CHAR AGAINST TABLE ENTRY BNE 60$ JMP @TYDISP-TYTAB-2(R2) ; DISPATCH TO SPECIAL ROUTINE 60$: SOB R1,50$ ; COUNT TABLE ENTRIES AND LOOP CMP R0,#40 ; SEE IF THIS IS A RANDOM CONTROL CHAR BLO TOCTRL ; IF SO MAKE IT VISIBLE ; ; FOR ALL NORMAL PRINTING CHARACTERS, BUMP THE TAB COUNTER ; NORMAL: INC TABCNT ; ; INVISIBLE CHARACTERS ARE HANDLED THROUGH HERE ; .IF NE,TECTTY TOFF: ; FORM FEED TOVT: ; VERTICAL TAB .ENDC TOLF: ; LINE FEED TOCOMM: CALL PUT ; STUFF CHAR INTO BUFFER TOEXT: TST R4 ; SEE IF THIS IS A TYPE OR PRINT CALL BNE 70$ CALL TYOUT ; TYPE OR ECHO - OUTPUT THE CHARACTER NOW 70$: DECB TYO ; CLEAR TYPE OUT IN PROGRESS RETURN ; AND EXIT ; ; TO HERE TO HANDLE BACKSPACE ; TOBS: DEC TABCNT ; BUMP DOWN THE TAB COUNT BGE TOCOMM ; STOP AT ZERO ; ; TO HERE TO HANDLE CARRIAGE RETURN ; TOCR: CLR TABCNT ; ZERO THE TAB COUNTER BR TOCOMM ; AND OUTPUT A REAL CR ; ; TO HERE TO HANDLE ALT MODE ; TOAM: MOV #'$,R0 ; CONVERT TO DOLLAR SIGN BR NORMAL ; AND OUTPUT ; ; TO HERE TO HANDLE BELL ; TOBELL: CALL PUT ; OUTPUT REAL BELL BR TOCTRL ; THEN OUTPUT "^G" .IF EQ,TECTTY ; ; TO HERE TO HANDLE FORM FEED ; TOFF: MOV #8.,R1 ; CONVERT TO 8 LINE FEEDS BR TOFF1 ; ; TO HERE TO HANDLE VERTICAL TAB ; TOVT: MOV #4.,R1 ; CONVERT TO 4 LINE FEEDS TOFF1: MOV #LF,R0 ; GET LINE FEED 80$: CALL PUT ; AND PUMP THEM OUT SOB R1,80$ BR TOEXT ; ; TO HERE TO HANDLE HORIZONTAL TAB ; TOTAB: MOV #' ,R0 ; OUTPUT SPACES 90$: INC TABCNT ; BUMP THE TAB COUNTER CALL PUT ; OUTPUT A SPACE BIT TABCNT,#7 ; TEST FOR TAB STOP BNE 90$ BR TOEXT .IFF TOTAB: ADD #10,TABCNT ; TTY HANDLER IS DOING TABS - JUST BIC #7,TABCNT ; TRACK THE POSITION BR TOCOMM .ENDC ; ; TO HERE TO HANDLE RANDOM CONTROL CHARACTERS ; TOCTRL: MOV R0,-(SP) ; SAVE ORIGINAL CHARACTER MOV #'^,R0 ; OUTPUT UP ARROW INC TABCNT CALL PUT MOV (SP)+,R0 ; RECOVER THE CHARACTER BIS #100,R0 ; CONVERT TO EQUIVALENT CHAR BR NORMAL ; AND OUTPUT IT ; ; THIS ROUTINE STUFFS A CHARACTER INTO THE TYPE OUT BUFFER AND ; OUTPUTS THE BUFFER WHEN IT IS FULL. ; PUT:: TYPEBF:: .IF EQ,TECTTY MOV R0,-(SP) ; SAVE THE CHAR .ENDC CMP TABCNT,TTLNSZ ; CHECK THE CHARACTER COUNT ON THIS LINE BLE 100$ ; OK IF LESS THAN BIT #ET.TRN,ETYPE(R5) ; SEE IF TRUNCATE MODE IS ON BNE 110$ ; IF YES, FLUSH THE CHARACTER MOV #1,TABCNT ; OTHERWISE, WRAP THE LINE .IF EQ,TECTTY MOV #CR,R0 ; OUTPUT A CR/LF CALL PUT ; TO WRAP THE LINE MOV #LF,R0 ; BECAUSE THE TTY HANDLER CALL PUT ; IS TOO CRETINOUS TO DO IT MOV (SP),R0 ; RECOVER CHARACTER .ENDC 100$: MOVB R0,@BUFPT ; STASH AWAY THE CHAR INC BUFPT ; BUMP THE POINTER CMP BUFPT,#TYOBUF+TYOBL BLO 110$ ; SEE IF THE BUFFER IS FULL CALL TYOUT ; IF SO, OUTPUT IT 110$: .IF EQ,TECTTY MOV (SP)+,R0 ; RESTORE R0 .ENDC RETURN ; ; ROUTINE TO OUTPUT CONTENTS OF TYPEOUT BUFFER TO THE TTY. CHARACTERS ARE ; BUFFERED WHEN FEASIBLE TO CUT DOWN ON QIO OVERHEAD. ; TYOUT:: TYPEFC::MOV R0,-(SP) ; SAVE R0 MOV R2,-(SP) ; AND R2 MOV BUFPT,R2 ; GET TYPE OUT BUFFER POINTER SUB #TYOBUF,R2 ; COMPUTE NUMBER OF CHARACTERS PRESENT BLOS 160$ ; IF NONE, SKIP THE CALL MOVB (PC),OUTDNE ; INDICATE TERMINAL OUTPUT DONE MOV #IO.WLB,R0 ; SET UP FOR NORMAL WRITE BIT #ET.IMG,ETYPE(R5) ; CHECK FOR IMAGE MODE BEQ 120$ BIS #10,R0 ; IMAGE - SET PASS ALL MODE 120$: QIOW$S R0,#TTYLUN,#TTYEFN,,#IOSTAT,,<#TYOBUF,R2,> BCC 140$ ; BRANCH IF DIRECTIVE OK CMP @#$DSW,#IE.UPN ; OUT OF NODES? BNE 150$ ; IF NOT, JUST FORGET IT 130$: WSIG$S ; WAIT A WHILE BR 120$ ; AND TRY AGAIN 140$: TSTB IOSTAT ; CHECK I/O STATUS BGT 150$ ; BRANCH IF OK CMPB IOSTAT,#IE.NOD ; OUT OF OTHER NODES? BEQ 130$ ; BRANCH IF SO 150$: MOV #TYOBUF,BUFPT ; RE-INIT BUFFER POINTER 160$: MOV (SP)+,R2 ; RESTORE REGISTERS MOV (SP)+,R0 RETURN ; ; ATTACH THE TERMINAL ; TTATT:: MOV R0,-(SP) MOV #ATTACH,R0 BR 170$ ; ; DETACH THE TERMINAL ; TTDET:: MOV R0,-(SP) MOV #DETACH,R0 170$: DIR$ R0 BCC 180$ CMP @#$DSW,#IE.UPN BNE 180$ WSIG$S BR 170$ 180$: MOV (SP)+,R0 RETURN .DSABL LSB .END