; TTY - generalized driver for hardcopy terminals. ; ; Copyright [c] Noel Alaska Systems Technology, 1983. SEARCH SYS SEARCH SYSSYM SEARCH TRM OBJNAM 0,0,[TDV] ;******************** ;* TTY * TDV communications area ;******************** TTY: WORD 2000 ; TERMINAL ATTRIBUTES (new fmt) BR INPUT ; INPUT ROUTINE BR OUTP ; OUTPUT ROUTINE BR ECHO ; ECHO ROUTINE RTN ; CRT CONTROL (none) BR INIT ; TDV INIT ROUTINE WORD 4 ; IPA SIZE (bytes) ; ----- impure area uses four bytes, as follows --------------------- FIL = 0 ; # NULLS TO APPEND AFTER LF LPP = FIL+1 ; LINES/PAGE FOR FF SIMULATION ROW = LPP+1 ; WORK AREA TO SAVE CURRENT ROW FLG = ROW+1 ; call INIT if not equal x'ff' ; ------------------------------------------------------------------- BYTE 24.,80. ; SCREEN SIZE LWORD 0 ; *NO* functions OUTP: JMP OUTPUT ; "the long branch" ECHO: JMP ECHO2 ; "the long branch" ;******************** ;* INIT * Initialization for TTY ;******************** INIT: PUSH A6 MOV T.IMP(A5),A6 ; ADDRESS IPA CLRB FIL(A6) ; NO NULLS MOVB #51.,LPP(A6) ; 51 LINES/PAGE FOR TTY43 CLRB ROW(A6) ; top OF FORM SETB FLG(A6) ; say INIT done ANDW #^C40000,@A5 ; TURN OFF BS FLAG POP A6 RTN ;******************** ;* INPUT * Input routine for TTY ;******************** INPUT: PUSH D3 MOVW @A5,D7 ; check for image/data mode AND #T$IMI!T$DAT,D7 BNE ARET ; YES - quit AND #177,D1 ; parity off CMPB D1,#14 ; FORMFEED? BNE INPUT2 ; NO MOV #1,D3 ; YES - ECHO IT TRMBFQ CLR D1 ; THEN IGNORE IT BR ARET INPUT2: CMPB D1,#15 ; CARRIAGE RETURN? BNE ARET ; NO MOVW @A5,D7 ; YES - check for full duplex AND #T$LCL,D7 BEQ ARET ; YES MOV #2,D3 ; NO - QUEUE UP CRLF PEA CUSQ+2 POP D1 TRMBFQ CLR D1 MOVB #15,D1 ; RESTORE THE CR ARET: POP D3 RTN ;******************** ;* OUTPUT * Output routine for TTY ;******************** OUTPUT: SAVE A3,A4,D0 MOV T.IMP(A5),A4 ; address the impure area TSTB FLG(A4) ; init done yet? BNE 1$ ; YES CALL INIT ; NO - do it now 1$: CMPB D1,#14 ; FORMFEED? BEQ 4$ ; YES CMP D1,#15 ; CARRIAGE RETURN? BNE 2$ ; NO TSTB FIL(A4) ; YES - WANT ANY NULLS? BEQ 3$ ; NO LEA A3,T.OQX(A5) ; YES - point at output queue QINS A3 ; get another queue block MOVB FIL(A4),7(A3) ; say how many 2$: CMPB D1,#12 ; LINEFEED? BNE 3$ ; NO INCB ROW(A4) ; INCREMENT LINE COUNTER CMMB ROW(A4),LPP(A4) ; TOP YET? BLO 3$ ; NO CLRB ROW(A4) ; CLEAR LINE COUNTER 3$: REST A3,A4,D0 ; send and count LCC #10 RTN 4$: CLR D1 MOVB LPP(A4),D1 ; GET PAGE SIZE BEQ 5$ ; NO ACTION IF LPP = 0 CLR D0 MOVB ROW(A4),D0 ; GET CURRENT POSITION SUB D0,D1 ; CALCULATE NUMBER OF LINEFEEDS TO TOP OF FORM LEA A3,T.OQX(A5) ; point at output queue QINS A3 ; get another queue block MOV D1,4(A3) ; send LF's to sim FF MOV #12,10(A3) 5$: REST A3,A4,D0 ; do not count LCC #4 RTN ;******************** ;* ECHO * Echo routine for TTY ;******************** ECHO2: CMPB D1,#177 ; rubout BEQ RUBOUT BIT #40000,@A5 ; need a terminating backslash? BEQ 10$ ; no - CALL EBKS ; echo terminating backslash 10$: CMPB D1,#25 ; control-U BEQ CTRLU RTN ;Echo rubout as the character which was rubbed out ;Echo a beginning backslash if this is first rubout RUBOUT: MOV D6,D1 ; save the character being rubbed out BIT #40000,@A5 ; backslash sent yet? BNE 10$ ; yes - bypass CALL EBKS ; echo beginning backslash 10$: MOV #1,D3 ; echo the character being rubbed out TRMBFQ RTN ;Echo a control-U and return the carriage CTRLU: MOV #4,D3 ; set character count LEA A6,CUSQ ; set the buffer address MOV A6,D1 ; put address into D1 TRMBFQ ; queue the control-U sequence RTN ;Echo a backslash and flip the backslash flag EBKS: PUSH D1 MOV #1,D3 ; set character count MOVB #'\,D1 ; set backslash TRMBFQ ; queue it up XORW #40000,@A5 ; flip the backslash flag POP D1 RTN CUSQ: BYTE '^,'U,15,12 EVEN END