2 TITLE READC TELETYPE DEVICE HANDLER FOR MUDDLE
8 .GLOBAL BUFRIN,CHRCNT,SYSCHR,ECHO,BYTPTR,ERASCH,KILLCH,BRKCH,AGC
9 .GLOBAL IOIN2,READC,WRONGT,WRONGD,WRONGC,CALER1,BRFCHR,ESCAP,TTYOPE,TYI,TYO
10 .GLOBAL RRESET,TTICHN,TTOCHN,CHANNO,STATUS
16 ; READC IS CALLED BY PUSHJ P,READC
17 ; B POINTS TO A TTY FLAVOR CHANNEL
18 ; ONE CHARACTER IS RETURNED IN A
19 ; BECOMES INTERRUPTABLE IF NO CHARACTERS EXISTS
21 READC: PUSH P,E ;SAVE E FROM DEATH
22 MOVE E,BUFRIN(B) ;GOBBLE POINTER TO BUFFER AND INFO
23 SOSGE CHRCNT(E) ;ANY CHARS LEFT?
24 PUSHJ P,INCHAR ;NO, GO READ SOME
25 ILDB A,BYTPTR(E) ;GOBBLE ONE
29 ; HERE TO ASK SYSTEM FOR SOME CHARACTERS
31 INCHAR: IRP A,,[0,C,D] ;SAVE ACS
34 CLEARM CHRCNT(E) ;NO CHARS IN BUFFER
35 MOVE D,[010700,,BYTPTR(E)] ;MAKE A BYTE POINTER TO START OF BUFFER
36 HLRE 0,E ;FIND END OF BUFFER
40 INCHR1: PUSHJ P,GETCH ;GET A CHARACTER
41 CAMN A,ESCAP(E) ;ESCAPE CHAR?
43 CAMN A,BRFCHR(E) ;BUFFER PRINT CHAR
44 JRST CLEARQ ;MAYBE CLEAR SCREEN
45 CAMN A,BRKCH(E) ;IS THIS A BREAK?
47 CAMN A,ERASCH(E) ;ARE IS IT ERASE?
48 JRST ERASE ;YES, GO PROCESS
49 CAMN A,KILLCH(E) ;OR KILL
52 INCHR2: PUSHJ P,PUTCHR ;PUT ACHAR IN BUFFER
56 MOVE D,[010700,,BYTPTR(E)] ;RESET BYTER
64 ERASE: SUBI A,177 ;IS THE ERASE RUBOUT
65 SKIPN CHRCNT(E) ;ANYTHING IN BUFFER?
66 JRST BARFCR ;NO, MAYBE TYPE CR
68 SOS CHRCNT(E) ;DELETE FROM COUNT
69 JUMPN A,NECHO ;DONT ECHO IF ERASE OTHER THAN RUBOUT
70 LDB A,D ;RE-GOBBLE LAST CHAR
71 SKIPE C,ECHO(E) ;DOES AN ECHO INS EXIST?
74 NECHO: ADD D,[70000,,0] ;DECREMENT BYTE POINTER
75 JUMPGE D,INCHR1 ;AND GO ON, UNLESS BYTE POINTER LOST
76 SUB D,[430000,,1] ;FIX UP BYTE POINTER
79 ; HERE TO KILL THE WHOLE BUFFER
81 KILL: CLEARM CHRCNT(E) ;NONE LEFT NOW
82 MOVE D,[010700,,BYTPTR(E)] ;RESET POINTER
84 BARFCR: MOVE A,ERASCH(E) ;GET THE ERASE CHAR
85 CAIE A,177 ;IS IT RUBOUT?
86 JRST INCHR1 ;NO, DO NOT TYPE A CR
87 MOVEI A,15 ;GET THE CR
88 SKIPE C,ECHO(E) ;ECHO INS IN C
92 DOESCP: PUSHJ P,PUTCHR ;PUT INTO BUFFER
93 PUSHJ P,GETCH ;GET NEXT ONE
94 JRST INCHR2 ;INSERT IT AND GO ON
96 CLEARQ: MOVEI A,0 ;INSERT A NULL CHAR
97 IDPB A,D ;DEPOSIT A 0 TERMINATOR
98 MOVE A,STATUS(B) ;CHECK CONSOLE KIND
101 PUSHJ P,CLR ;YES, CLEAR SCREEN
103 MOVE C,[010700,,BYTPTR(E)] ;POINT TO START OF BUFFER
104 SKIPN ECHO(E) ;ANY ECHO INS?
107 XCT ECHO(E) ;WRITE OUT C.R.
109 ILDB A,C ;GOBBLE CHAR
112 JRST .-3 ;DO FOR ENTIRE BUFFER
114 CLR: SKIPN C,ECHO(E) ;ONLY IF INS EXISTS
116 MOVEI A,20 ;ERASE SCREEN
122 PUTCHR: AOS CHRCNT(E) ;COUNT THIS CHARACTER
123 IBP D ;BUMP BYTE POINTER
124 CAIG 0,@D ;DONT SKIP IF BUFFER FULL
125 PUSHJ P,BUFULL ;GROW BUFFER
126 DPB A,D ;CLOBBER BYTE POINTER IN
129 ; BUFFER FULL, GROW THE BUFFER
131 BUFULL: MOVEI E,1000 ;GET GROWTH SPECS
133 PUSH TP,$TCHAN ;SAVE B
135 PUSHJ P,AGC ;GROW THE VECTOR
136 MOVE B,(TP) ;RESTORE CHANNEL POINTER
137 SUB TP,[2,,2] ;AND REMOVE CRUFT
138 MOVE E,BUFRIN(B) ;GET AUX BUFFER POINTER
139 HLRE 0,E ;RECOMPUTE 0
144 GETCH: SOSGE C,SYSCHR(E) ;ANY CHARS IN SYSTEM?
145 JRST ENBL ;NO, ENABLE INTERRUPTS
146 XCT IOIN2(E) ;YES, GOBBLE ONE
149 ENBL: MOVSI A,TCHAN ;SET A'S TYPE
151 ENABLE ;ENABLE INTERRUPTS
153 DISABLE ;GOT A CHARACTER, DISABLE INTERRUPTS
157 ; SUBROUTINE TO FLUSH BUFFER
159 RRESET: MOVE E,BUFRIN(B) ;GET AUX BUFFER
162 MOVE D,[010700,,BYTPTR(E)] ;RESET BYTE POINTER
164 MOVE D,CHANNO(B) ;GOBBLE CHANNEL
167 XCT D ;RESET ITS CHANNEL
170 ; SUBROUTINE TO ESTABLISH ECHO IOINS
172 MFUNCTION ECHOPAIR,SUBR
176 HLRZ A,(AB) ;CHECK ARG TYPES
178 CAIN A,TCHAN ;IS A CHANNEL
179 CAIE C,TCHAN ;IS C ALSO
180 JRST WRONGT ;NO, ONE OF THEM LOSES
182 MOVE A,1(AB) ;GET CHANNEL
183 MOVE B,DIRECT(A) ;GET DIRECTION
186 LDB C,[600,,STATUS(A)] ;GET A CODE
187 CAILE C,2 ;MAKE SURE A TTY FLAVOR DEVICE
189 MOVE D,3(AB) ;GET OTHER CHANNEL
190 MOVE E,DIRECT(D) ;AND ITS DIRECTION
194 MOVE B,BUFRIN(A) ;GET A'S AUX BUFFER
195 MOVE C,IOINS(D) ;AND C'S IO INS
196 MOVEM C,ECHO(B) ;CLOBBER
198 MOVE B,1(AB) ;RETURN 1ST ARG
201 TTYOPEN: .OPEN TTYIN,[SIXBIT / TTY/]
203 .OPEN TTYOUT,[SIXBIT / !TTY/] ;AND OUTPUT
205 .STATUS TTYOUT,A ;CHECK IT OUT
206 ANDI A,77 ;GET DEVICE
207 CAIE A,2 ;IF 2, CAN OPEN IN DISPLAY MODE
210 .OPEN TTYOUT,[21,,(SIXBIT /TTY/)]
213 SETCHN: MOVE B,TTICHN+1(TVP) ;GET CHANNEL
214 MOVEI A,TTYIN ;GET ITS CHAN #
216 .STATUS TTYIN,STATUS(B) ;CLOBBER STATUS
218 MOVE B,TTOCHN+1(TVP) ;GET OUT CHAN
221 .STATUS TTYOUT,STATUS(B)
231 WRONGD: PUSH TP,$TATOM
232 PUSH TP,MQUOTE WROND-DIRECTION-CHANNEL
235 WRONGC: PUSH TP,$TATOM
236 PUSH TP,MQUOTE NOT-A-TTY-TYPE-CHANNEL