Split up files.
[pdp10-muddle.git] / sumex / readch.mcr116
1 TITLE READC TELETYPE DEVICE HANDLER FOR MUDDLE\r
2 \r
3 RELOCATABLE\r
4 \r
5 .INSRT MUDDLE >\r
6 \r
7 SYSQ\r
8 \r
9 IF1,[\r
10 IFE ITS,.INSRT MUDSYS;STENEX >\r
11 ]\r
12 \r
13 .GLOBAL BUFRIN,CHRCNT,SYSCHR,ECHO,BYTPTR,ERASCH,KILLCH,BRKCH,AGC,CHRWRD,W1CHAR,GWB\r
14 .GLOBAL IOIN2,READC,WRONGC,BRFCHR,ESCAP,TTYOPE,MTYI,MTYO,NOTTY,TTYOP2,IBLOCK\r
15 .GLOBAL RRESET,TTICHN,TTOCHN,CHANNO,STATUS,BRFCH2,TTYBLK,TTYUNB,WAITNS\r
16 .GLOBAL EXBUFR,INCHAR,BYTDOP,BUFSTR,LSTCH,CHNCNT,DIRECT,IOINS,IBLOCK,INCONS\r
17 .GLOBAL BADCHN,WRONGD,CHNLOS,MODE1,MODE2,GMTYO,IDVAL,GETCHR,PAGLN,LINLN\r
18 .GLOBAL RDEVIC\r
19 TTYOUT==1\r
20 TTYIN==2\r
21 \r
22 ; FLAGS CONCERNING TTY CHANNEL STATE\r
23 \r
24 N.ECHO==1                       ; NO INPUT ECHO\r
25 N.CNTL==2                       ; NO RUBOUT ^L ^D ECHO\r
26 N.IMED==4                       ; ALL CHARS WAKE UP\r
27 N.IME1==10                      ; SOON WILL BE N.IMED\r
28 \r
29 \r
30 ; OPEN BLOCK MODE BITS\r
31 OUT==1\r
32 IMAGEM==4\r
33 ASCIIM==0\r
34 UNIT==0\r
35 \r
36 \r
37 ; READC IS CALLED BY PUSHJ P,READC\r
38 ; B POINTS TO A TTY FLAVOR CHANNEL\r
39 ; ONE CHARACTER IS RETURNED IN  A\r
40 ; BECOMES INTERRUPTABLE IF NO CHARACTERS EXISTS\r
41 \r
42 ; HERE TO ASK SYSTEM FOR SOME CHARACTERS\r
43 \r
44 INCHAR: IRP     A,,[0,C,D,E]    ;SAVE ACS\r
45         PUSH    P,A\r
46         TERMIN\r
47         MOVE    E,BUFRIN(B)             ; GET AUX BUFFER\r
48         MOVE    D,BYTPTR(E)\r
49         HLRE    0,E             ;FIND END OF BUFFER\r
50         SUBM    E,0\r
51         ANDI    0,-1            ;ISOLATE RH\r
52         MOVE    C,SYSCHR(E)     ; GET FLAGS\r
53 \r
54 INCHR1: TRNE    C,N.IMED+N.CNTL ; SKIP IF NOT IMMEDIATE\r
55         JRST    DONE\r
56         TLZE    D,40            ; SKIP IF NOT ESCAPED\r
57         JRST    INCHR2          ; ESCAPED\r
58         CAMN    A,ESCAP(E)      ; IF ESCAPE\r
59         TLO     D,40            ; REMEMBER\r
60         CAMN    A,BRFCH2(E)\r
61         JRST    BRF\r
62         CAMN    A,BRFCHR(E)             ;BUFFER PRINT CHAR\r
63         JRST    CLEARQ          ;MAYBE CLEAR SCREEN\r
64         CAMN    A,BRKCH(E)      ;IS THIS A BREAK?\r
65         JRST    DONE            ;YES, DONE\r
66         CAMN    A,ERASCH(E)     ;ARE IS IT ERASE?\r
67         JRST    ERASE           ;YES, GO PROCESS\r
68         CAMN    A,KILLCH(E)     ;OR KILL\r
69         JRST    KILL\r
70 \r
71 INCHR2: PUSHJ   P,PUTCHR        ;PUT ACHAR IN BUFFER\r
72 INCHR3: MOVEM   D,BYTPTR(E)\r
73         JRST    DONE1\r
74 \r
75 DONE:   SKIPL   A               ; IF JUST BUFFER FORCE, SKIP\r
76         PUSHJ   P,PUTCHR        ; STORE CHAR\r
77         MOVEI   A,N.IMED        ; TURN OFF IMEDIACY\r
78         ANDCAM  A,SYSCHR(E)\r
79         MOVEM   D,BYTPTR(E)\r
80         PUSH    TP,$TCHAN       ; SAVE CHANNEL\r
81         PUSH    TP,B\r
82         MOVE    A,CHRCNT(E)     ; GET # OF CHARS\r
83         SETZM   CHRCNT(E)\r
84         PUSH    P,A\r
85         ADDI    A,4             ; ROUND UP\r
86         IDIVI   A,5             ; AND DOWN\r
87         PUSHJ   P,IBLOCK        ; GET CORE\r
88         HLRE    A,B             ; FIND D.W.\r
89         SUBM    B,A\r
90         MOVSI   0,TCHRS+.VECT.  ; GET TYPE\r
91         MOVEM   0,(A)           ; AND STORE\r
92         MOVEI   D,(B)           ; COPY PNTR\r
93         POP     P,C             ; CHAR COUNT\r
94         HRLI    D,440700\r
95         HRLI    C,TCHSTR\r
96         PUSH    TP,C\r
97         PUSH    TP,D\r
98         PUSHJ   P,INCONS        ; CONS IT ON\r
99         MOVE    C,-2(TP)        ; GET CHAN BACK\r
100         MOVEI   D,EXBUFR(C)     ; POINT TO BUFFER LIST\r
101         HRRZ    0,(D)           ; LAST?\r
102         JUMPE   0,.+3\r
103         MOVE    D,0\r
104         JRST    .-3             ; GO UNTIL END\r
105         HRRM    B,(D)           ; SPLICE\r
106 \r
107 ; HERE TO BLT IN BUFFER\r
108 \r
109         MOVE    D,BUFRIN(C)     ; POINT TO COMPLETED BUFFER\r
110         HRRZ    C,(TP)          ; START OF NEW STRING\r
111         HRLI    C,BYTPTR+1(D)   ; 1ST WORD OF CHARS\r
112         MOVE    E,[010700,,BYTPTR(E)]\r
113         EXCH    E,BYTPTR(D)     ; END OF STRING\r
114         MOVEI   E,-BYTPTR(E)\r
115         ADD     E,(TP)          ; ADD TO START\r
116         BLT     C,-1(E)\r
117         MOVE    B,-2(TP)        ; CHANNEL BACK\r
118         SUB     TP,[4,,4]       ; FLUSH JUNK\r
119         PUSHJ   P,TTYUNB        ; UNBLOCK THIS TTY\r
120 DONE1:  IRP     A,,[E,D,C,0]\r
121         POP     P,A\r
122         TERMIN\r
123         POPJ    P,\r
124 \r
125 \r
126 ERASE:  SKIPN   CHRCNT(E)       ;ANYTHING IN BUFFER?\r
127         JRST    BARFCR  ;NO, MAYBE TYPE CR\r
128 \r
129         SOS     CHRCNT(E)       ;DELETE FROM COUNT\r
130         LDB     A,D             ;RE-GOBBLE LAST CHAR\r
131 IFN ITS,[\r
132         LDB     C,[600,,STATUS(B)]      ; CHECK FOR IMLAC\r
133         CAIE    C,2             ; SKIP IF IT IS\r
134 ]\r
135         JRST    TYPCHR\r
136         SKIPN   ECHO(E)         ; SKIP IF ECHOABLE\r
137         JRST    NECHO\r
138         PUSHJ   P,CHRTYP        ; FOUND OUT IMALC BEHAVIOR\r
139         SKIPGE  C,FIXIM2(C)\r
140         JRST    (C)\r
141 NOTFUN: PUSHJ   P,DELCHR\r
142         SOJG    C,.-1\r
143 \r
144 NECHO:  ADD     D,[70000,,0]    ;DECREMENT BYTE POINTER\r
145         JUMPGE  D,INCHR3        ;AND GO ON, UNLESS BYTE POINTER LOST\r
146         SUB     D,[430000,,1]   ;FIX UP BYTE POINTER\r
147         JRST    INCHR3\r
148 \r
149 LFKILL: PUSHJ   P,LNSTRV\r
150         JRST    NECHO\r
151 \r
152 BSKILL: PUSHJ   P,GETPOS        ; CURRENT POSITION TO A\r
153         PUSHJ   P,SETPOS        ; POSITION IMLAC CURSOR\r
154         MOVEI   A,20            ; ^P\r
155         XCT     ECHO(E)\r
156         MOVEI   A,"L            ; L , DELETE TO END OF LINE\r
157         XCT     ECHO(E)\r
158         JRST    NECHO\r
159 \r
160 TBKILL: PUSHJ   P,GETPOS\r
161         ANDI    A,7\r
162         SUBI    A,10            ; A -NUMBER OF DELS TO DO\r
163         PUSH    P,A\r
164         PUSHJ   P,DELCHR\r
165         AOSE    (P)\r
166         JRST    .-2\r
167 \r
168         SUB     P,[1,,1]\r
169         JRST    NECHO\r
170 TYPCHR:\r
171 IFE ITS,[\r
172         PUSH    P,A             ; USE TENEX SLASH RUBOUT\r
173         MOVEI   A,"\\r
174         SKIPE   C,ECHO(E)\r
175         XCT     C\r
176         POP     P,A\r
177 ]\r
178         SKIPE   C,ECHO(E)\r
179         XCT     C\r
180         JRST    NECHO\r
181 \r
182 ; ROUTINE TO DEL CHAR ON IMLAC\r
183 \r
184 DELCHR: MOVEI   A,20\r
185         XCT     ECHO(E)\r
186         MOVEI   A,"X\r
187         XCT     ECHO(E)\r
188         POPJ    P,\r
189 \r
190 ; HERE FOR SPECIAL IMLAC HACKS\r
191 \r
192 FOURQ:  PUSH    P,CNOTFU\r
193 FOURQ2: MOVEI   C,2             ; FOR ^Z AND ^_\r
194         CAMN    B,TTICHN+1(TVP) ; SKIP IF NOT CONSOLE TTY\r
195         MOVEI   C,4\r
196 CNOTFU: POPJ    P,NOTFUN\r
197 \r
198 CNECHO: JRST    NECHO\r
199 \r
200 LNSTRV: MOVEI   A,20            ; ^P\r
201         XCT     ECHO(E)\r
202         MOVEI   A,"U\r
203         XCT     ECHO(E)\r
204         POPJ    P,\r
205 \r
206 ; HERE IF KILLING A C.R., RE-POSITION CURSOR\r
207 \r
208 CRKILL: PUSHJ   P,GETPOS        ; COMPUTE LINE POS\r
209         PUSHJ   P,SETPOS\r
210         JRST    NECHO\r
211 \r
212 SETPOS: PUSH    P,A             ; SAVE POS\r
213         MOVEI   A,20\r
214         XCT     ECHO(E)\r
215         MOVEI   A,"H\r
216         XCT     ECHO(E)\r
217         POP     P,A\r
218         XCT     ECHO(E)         ; HORIZ POSIT AT END OF LINE\r
219         POPJ    P,0\r
220 \r
221 GETPOS: PUSH    P,0\r
222         MOVEI   0,10            ; MINIMUM CURSOR POS\r
223         PUSH    P,[010700,,BYTPTR(E)]   ; POINT TO BUFFER\r
224         PUSH    P,CHRCNT(E)     ; NUMBER THEREOF\r
225 \r
226 GETPO1: SOSGE   (P)             ; COUNT DOWN\r
227         JRST    GETPO2\r
228         ILDB    A,-1(P)         ; CHAR FROM BUFFER\r
229         CAIN    A,15            ; SKIP IF NOT CR\r
230         MOVEI   0,10            ; C.R., RESET COUNT\r
231         PUSHJ   P,CHRTYP        ; GET TYPE\r
232         XCT     FIXIM3(C)       ; GET FIXED COUNT\r
233         ADD     0,C\r
234         JRST    GETPO1\r
235 \r
236 GETPO2: MOVE    A,0             ; RET COUNT\r
237         MOVE    0,-2(P)         ; RESTORE AC 0\r
238         SUB     P,[3,,3]\r
239         POPJ    P,\r
240 \r
241 CHRTYP: MOVEI   C,0             ; NUMBER OF FLUSHEES\r
242         CAILE   A,37            ; SKIP IF CONTROL CHAR\r
243         POPJ    P,\r
244         PUSH    TP,$TCHAN\r
245         PUSH    TP,B            ; SAVE CHAN\r
246         IDIVI   A,12.           ; FIND SPECIAL HACKS\r
247         MOVE    A,FIXIML(A)     ; GET CONT WORD\r
248         IMULI   B,3\r
249         ROTC    A,3(B)          ; GET CODE IN B\r
250         ANDI    B,7\r
251         MOVEI   C,(B)\r
252         MOVE    B,(TP)          ; RESTORE CHAN\r
253         SUB     TP,[2,,2]\r
254         POPJ    P,\r
255 \r
256 FIXIM2: 1\r
257         2\r
258         SETZ    FOURQ\r
259         SETZ    CRKILL\r
260         SETZ    LFKILL\r
261         SETZ    BSKILL\r
262         SETZ    TBKILL\r
263 \r
264 FIXIM3: MOVEI   C,1\r
265         MOVEI   C,2\r
266         PUSHJ   P,FOURQ2\r
267         MOVEI   C,0\r
268         MOVEI   C,0\r
269         MOVNI   C,1\r
270         PUSHJ   P,CNTTAB\r
271 \r
272 CNTTAB: ANDCMI  0,7     ; GET COUNT INCUDING TAB HACK\r
273         ADDI    0,10\r
274         MOVEI   C,0\r
275         POPJ    P,\r
276         \r
277 FIXIML: 111111,,115641  ; CNTL @ABCDE,,FGHIJK\r
278         131111,,111111  ; LMNOPQ,,RSTUVW\r
279         112011,,120000  ; XYZ LBRAK \ RBRAK,,^  _\r
280 \r
281 ; HERE TO KILL THE WHOLE BUFFER\r
282 \r
283 KILL:   CLEARM  CHRCNT(E)       ;NONE LEFT NOW\r
284         MOVE    D,[010700,,BYTPTR(E)]   ;RESET POINTER\r
285 \r
286 BARFCR:\r
287 IFN ITS,[\r
288         MOVE    A,ERASCH(E)     ;GET THE ERASE CHAR\r
289         CAIN    A,177           ;IS IT RUBOUT?\r
290 ]\r
291         PUSHJ   P,CRLF1         ; PRINT CR-LF\r
292         JRST    INCHR3\r
293 \r
294 CLEARQ:\r
295 IFN ITS,[\r
296         MOVE    A,STATUS(B)     ;CHECK CONSOLE KIND\r
297         ANDI    A,77\r
298         CAIN    A,2             ;DATAPOINT?\r
299         PUSHJ   P,CLR           ;YES, CLEAR SCREEN\r
300 ]\r
301 \r
302 BRF:    MOVE    C,[010700,,BYTPTR(E)]   ;POINT TO START OF BUFFER\r
303         SKIPN   ECHO(E)         ;ANY ECHO INS?\r
304         JRST    NECHO\r
305 \r
306         PUSHJ   P,CRLF2\r
307         PUSH    P,CHRCNT(E)\r
308 \r
309         SOSGE   (P)\r
310         JRST    DECHO\r
311         ILDB    A,C                     ;GOBBLE CHAR\r
312         XCT     ECHO(E)         ;ECHO IT\r
313         JRST    .-4             ;DO FOR ENTIRE BUFFER\r
314 \r
315 DECHO:  SUB     P,[1,,1]\r
316         JRST    INCHR3\r
317 \r
318 CLR:    SKIPN   C,ECHO(E)       ;ONLY IF INS EXISTS\r
319         POPJ    P,\r
320         MOVEI   A,20            ;ERASE SCREEN\r
321         XCT     C\r
322         MOVEI   A,103\r
323         XCT     C\r
324         POPJ    P,\r
325 \r
326 PUTCHR: AOS     CHRCNT(E)       ;COUNT THIS CHARACTER\r
327         IBP     D               ;BUMP BYTE POINTER\r
328         CAIG    0,@D            ;DONT SKIP IF BUFFER FULL\r
329         PUSHJ   P,BUFULL                ;GROW BUFFER\r
330 IFE ITS,[\r
331         CAIN    A,37            ; CHANGE EOL TO CRLF\r
332         MOVEI   A,15\r
333 ]\r
334         DPB     A,D             ;CLOBBER BYTE POINTER IN\r
335         MOVE    C,SYSCHR(E)     ; FLAGS\r
336         TRNN    C,N.IMED+N.CNTL\r
337         CAIE    A,15            ; IF CR INPUT, FOLLOW WITH LF\r
338         POPJ    P,\r
339         MOVEI   A,12            ; GET LF\r
340         JRST    PUTCHR\r
341 \r
342 ; BUFFER FULL, GROW THE BUFFER\r
343 \r
344 BUFULL: PUSH    TP,$TCHAN       ;SAVE B\r
345         PUSH    TP,B\r
346         PUSH    P,A             ; SAVE CURRENT CHAR\r
347         HLRE    A,BUFRIN(B)\r
348         MOVNS   A\r
349         ADDI    A,100           ; MAKE ONE LONGER\r
350         PUSHJ   P,IBLOCK        ; GET IT\r
351         MOVE    A,(TP)          ;RESTORE CHANNEL POINTER\r
352         SUB     TP,[2,,2]       ;AND REMOVE CRUFT\r
353         MOVE    E,BUFRIN(A)     ;GET AUX BUFFER POINTER\r
354         MOVEM   B,BUFRIN(A)\r
355         HLRE    0,E             ;RECOMPUTE 0\r
356         MOVSI   E,(E)\r
357         HRRI    E,(B)           ; POINT TO DEST\r
358         SUB     B,0\r
359         BLT     E,(B)\r
360         MOVEI   0,100-2(B)\r
361         MOVE    B,A\r
362         POP     P,A\r
363         POPJ    P,\r
364 \r
365 ; ROUTINE TO CRLF ON ANY TTY\r
366 \r
367 CRLF1:  SKIPN   ECHO(E)\r
368         POPJ    P,              ; NO ECHO INS\r
369 CRLF2:  MOVEI   A,15\r
370         XCT     ECHO(E)\r
371         MOVEI   A,12\r
372         XCT     ECHO(E)\r
373         POPJ    P,\r
374 \r
375 ; SUBROUTINE TO FLUSH BUFFER\r
376 \r
377 RRESET: SETZM   LSTCH(B)        ; CLOBBER RE-USE CHAR\r
378         MOVE    E,BUFRIN(B)             ;GET AUX BUFFER\r
379         SETZM   CHRCNT(E)\r
380         MOVEI   D,N.IMED+N.IME1\r
381         ANDCAM  D,SYSCHR(E)\r
382         MOVE    D,[010700,,BYTPTR(E)]   ;RESET BYTE POINTER\r
383         MOVEM   D,BYTPTR(E)\r
384         MOVE    D,CHANNO(B)     ;GOBBLE CHANNEL\r
385         SETZM   CHNCNT(D)       ; FLUSH COUNTERS\r
386 IFN ITS,[\r
387         LSH     D,23.           ;POSITION\r
388         IOR     D,[.RESET 0]\r
389         XCT     D               ;RESET ITS CHANNEL\r
390 ]\r
391 IFE ITS,[\r
392         MOVEI   A,100           ; TTY IN JFN\r
393         CFIBF\r
394 ]\r
395         SETZM   EXBUFR(B)       ; CLOBBER STAKED BUFFS\r
396         MOVEI   C,BUFSTR-1(B)   ; FIND D.W.\r
397         PUSHJ   P,BYTDOP\r
398         SUBI    A,2\r
399         HRLI    A,010700\r
400         MOVEM   A,BUFSTR(B)\r
401         HLLZS   BUFSTR-1(B)\r
402         POPJ    P,\r
403 \r
404 ; SUBROUTINE TO ESTABLISH ECHO IOINS\r
405 \r
406 MFUNCTION ECHOPAIR,SUBR\r
407 \r
408         ENTRY   2\r
409 \r
410         GETYP   A,(AB)          ;CHECK ARG TYPES\r
411         GETYP   C,2(AB)\r
412         CAIN    A,TCHAN         ;IS A CHANNEL\r
413         CAIE    C,TCHAN         ;IS C ALSO\r
414         JRST    WRONGT          ;NO, ONE OF THEM LOSES\r
415 \r
416         MOVE    A,1(AB)         ;GET CHANNEL\r
417         PUSHJ   P,TCHANC        ; VERIFY TTY IN\r
418         MOVE    D,3(AB)         ;GET OTHER CHANNEL\r
419         MOVEI   B,DIRECT-1(D)   ;AND ITS DIRECTION\r
420         PUSHJ   P,CHRWRD\r
421         JFCL\r
422         CAME    B,[ASCII /PRINT/]\r
423         JRST    WRONGD\r
424 \r
425         MOVE    B,BUFRIN(A)     ;GET A'S AUX BUFFER\r
426         HRLZ    C,CHANNO(D)     ; GET CHANNEL\r
427         LSH     C,5\r
428         IOR     C,[.IOT A]      ; BUILD AN IOT\r
429         MOVEM   C,ECHO(B)               ;CLOBBER\r
430 CHANRT: MOVE    A,(AB)\r
431         MOVE    B,1(AB)         ;RETURN 1ST ARG\r
432         JRST    FINIS\r
433 \r
434 TCHANC: MOVEI   B,DIRECT-1(A)   ;GET DIRECTION\r
435         PUSHJ   P,CHRWRD        ; CONVERT\r
436         JFCL\r
437         CAME    B,[ASCII /READ/]\r
438         JRST    WRONGD\r
439         LDB     C,[600,,STATUS(A)]      ;GET A CODE\r
440         CAILE   C,2             ;MAKE SURE A TTY FLAVOR DEVICE\r
441         JRST    WRONGC\r
442         POPJ    P,\r
443 IFE ITS,[\r
444 TTYOPEN:\r
445 TTYOP2: MOVEI   A,-1            ; TENEX JFN FOR TERMINAL\r
446         MOVEI   2,145100        ; MAGIC BITS (SEE TENEX MANUAL)\r
447         SFMOD                   ; ZAP\r
448         RFMOD                   ; LETS FIND SCREEN SIZE\r
449         LDB     A,[220700,,B]   ; GET PAGE WIDTH\r
450         LDB     B,[310700,,B]   ; AND LENGTH\r
451         MOVE    C,TTOCHN+1(TVP)\r
452         MOVEM   A,LINLN(C)\r
453         MOVEM   B,PAGLN(C)\r
454         MOVEI   A,-1            ; NOW HACK CNTL CHAR STUFF\r
455         RFCOC                   ; GET CURRENT\r
456         AND     B,[036377,,-1]  ; CHANGE FOR ^@, ^A AND ^D (FOR NOW)\r
457         SFCOC                   ; AND RESUSE IT\r
458 \r
459         POPJ    P,\r
460 ]\r
461 \r
462 IFN ITS,[\r
463 TTYOP2: .SUSET  [.RTTY,,C]\r
464         SETZM   NOTTY\r
465         JUMPL   C,TTYNO         ; DONT HAVE TTY\r
466 \r
467 TTYOPEN:\r
468         SKIPE   NOTTY\r
469         POPJ    P,\r
470         .OPEN   TTYIN,[SIXBIT /   TTY/]\r
471         JRST    TTYNO\r
472         .OPEN   TTYOUT,[21,,(SIXBIT /TTY/)]     ;AND OUTPUT\r
473         FATAL CANT OPEN TTY\r
474         DOTCAL  TTYGET,[[1000,,TTYOUT],[2000,,0],[2000,,A],[2000,,B]]\r
475         FATAL .CALL FAILURE\r
476         DOTCAL  TTYSET,[[1000,,TTYOUT],MODE1,MODE2,B]\r
477         FATAL .CALL FAILURE\r
478         \r
479 SETCHN: MOVE    B,TTICHN+1(TVP) ;GET CHANNEL\r
480         MOVEI   C,TTYIN         ;GET ITS CHAN #\r
481         MOVEM   C,CHANNO(B)\r
482         .STATUS TTYIN,STATUS(B) ;CLOBBER STATUS\r
483 \r
484         MOVE    B,TTOCHN+1(TVP) ;GET OUT CHAN\r
485         MOVEI   C,TTYOUT\r
486         MOVEM   C,CHANNO(B)\r
487         .STATUS TTYOUT,STATUS(B)\r
488         SETZM   IMAGFL          ;RESET IMAGE MODE FLAG\r
489         HLLZS   IOINS-1(B)\r
490         DOTCAL  RSSIZE,[[1000,,TTYOUT],[2000,,C],[2000,,D]]\r
491         FATAL   .CALL RSSIZE LOSSAGE\r
492         MOVEM   C,PAGLN(B)\r
493         MOVEM   D,LINLN(B)\r
494         POPJ    P,\r
495 \r
496 ; HERE IF TTY WONT OPEN\r
497 \r
498 TTYNO:  SETOM   NOTTY\r
499         POPJ    P,\r
500 ]\r
501 \r
502 MTYI:   SKIPE   NOTTY           ; SKIP IF HAVE TTY\r
503         FATAL TRIED TO USE NON-EXISTANT TTY\r
504 IFN ITS,        .IOT    TTYIN,A\r
505 IFE ITS,        PBIN\r
506         POPJ    P,\r
507 \r
508 MTYO:   SKIPE   NOTTY\r
509         POPJ    P,              ; IGNORE, DONT HAVE TTY\r
510         SKIPE   IMAGFL          ;SKIP RE-OPENING IF ALREADY IN ASCII\r
511         PUSHJ   P,MTYO1 ;WAS IN IMAGE...RE-OPEN\r
512         CAIE    A,177           ;DONT OUTPUT A DELETE\r
513 IFN ITS,        .IOT    TTYOUT,A\r
514 IFE ITS,        PBOUT\r
515         POPJ    P,\r
516 \r
517 MTYO1:  MOVE    B,TTOCHN+1(TVP)\r
518         PUSH    P,0\r
519         PUSHJ   P,REASCI\r
520         POP     P,0\r
521         POPJ    P,\r
522 \r
523 ; HERE FOR TYO TO ANY TTY FLAVOR DEVICE\r
524 \r
525 GMTYO:  PUSH    P,0\r
526         HRRZ    0,IOINS-1(B)    ; GET FLAG\r
527         SKIPE   0\r
528         PUSHJ   P,REASCI        ; RE-OPEN TTY\r
529         HRLZ    0,CHANNO(B)\r
530         ASH     0,5\r
531         IOR     0,[.IOT A]\r
532         CAIE    A,177           ; DONE OUTPUT A DELETE\r
533         XCT     0\r
534         POP     P,0\r
535         POPJ    P,\r
536 \r
537 REASCI: PUSH    P,A\r
538         PUSH    P,C\r
539         PUSHJ   P,DEVTOC\r
540         HRLI    C,21            ; ASCII GRAPHIC BIT\r
541         MOVE    A,CHANNO(B)     ; GET CHANNEL\r
542         ASH     A,23.           ; TO AC FIELD\r
543         IOR     A,[.OPEN 0,C]\r
544         XCT     A\r
545         FATAL TTY OPEN LOSSAGE\r
546         POP     P,C\r
547         POP     P,A\r
548         HLLZS   IOINS-1(B)\r
549         CAMN    B,TTOCHN+1(TVP)\r
550         SETZM   IMAGFL\r
551         POPJ    P,\r
552 \r
553 \r
554 \r
555 WRONGC: PUSH    TP,$TATOM\r
556         PUSH    TP,EQUOTE NOT-A-TTY-TYPE-CHANNEL\r
557         JRST    CALER1\r
558 \r
559 \r
560 \r
561 ; HERE TO HANDLE TTY BLOCKING AND UNBLOCKING\r
562 \r
563 TTYBLK: PUSH    TP,$TCHAN\r
564         PUSH    TP,B\r
565         PUSH    P,0\r
566         PUSH    P,E             ; SAVE SOME ACS\r
567 IFN ITS,[\r
568         MOVE    A,CHANNO(B)     ; GET CHANNEL NUMBER\r
569         SOSG    CHNCNT(A)       ; ANY PENDING CHARS\r
570         JRST    TTYBL1\r
571         SETZM   CHNCNT(A)\r
572         MOVEI   0,1\r
573         LSH     0,(A)\r
574         .SUSET  [.SIFPI,,0]     ; SLAM AN INT ON\r
575 ]\r
576 TTYBL1: MOVE    C,BUFRIN(B)\r
577         MOVE    A,SYSCHR(C)     ; GET FLAGS\r
578         TRZ     A,N.IMED\r
579         TRZE    A,N.IME1        ; IF WILL BE\r
580         TRO     A,N.IMED        ; THE MAKE IT\r
581         MOVEM   A,SYSCHR(C)\r
582 IFN ITS,[\r
583         MOVE    A,[.CALL TTYIOT]; NON-BUSY WAIT\r
584         SKIPE   NOTTY\r
585         MOVE    A,[.SLEEP A,]\r
586 ]\r
587 IFE ITS,[\r
588         MOVE    A,[PUSHJ P,TNXIN]\r
589 ]\r
590         MOVEM   A,WAITNS(B)\r
591         PUSH    TP,$TCHSTR\r
592         PUSH    TP,CHQUOTE BLOCKED\r
593         PUSH    TP,$TPVP\r
594         PUSH    TP,PVP\r
595         MCALL   2,INTERRUPT\r
596         MOVSI   A,TCHAN\r
597         MOVEM   A,BSTO(PVP)\r
598         MOVE    B,(TP)\r
599         ENABLE\r
600 REBLK:  MOVEI   A,-1            ; IN CASE SLEEPING\r
601         XCT     WAITNS(B)       ; NOW WAIT\r
602         JFCL\r
603 IFE ITS,        JRST    .-3\r
604 IFN ITS,        JRST    CHRSNR  ; SNARF CHAR\r
605 REBLK1: DISABLE                 ; FALL THROUG=> UNBLOCKED\r
606         SETZM   BSTO(PVP)\r
607         POP     P,E\r
608         POP     P,0\r
609         MOVE    B,(TP)\r
610         SUB     TP,[2,,2]\r
611         POPJ    P,\r
612 \r
613 CHRSNR: SKIPE   NOTTY           ; TTY?\r
614         JRST    REBLK           ; NO, JUST RESET AND BLOCK\r
615         .SUSET  [.SIFPI,,[1_<TTYIN>]]\r
616         JRST    REBLK           ; AND GO BACK\r
617 \r
618 TTYIOT: SETZ\r
619         SIXBIT /IOT/\r
620         1000,,TTYIN\r
621         0\r
622         405000,,20000\r
623 \r
624 ; HERE TO UNBLOCK TTY\r
625 \r
626 TTYUNB: MOVE    A,WAITNS(B)     ; GET INS\r
627         CAMN    A,[JRST REBLK1]\r
628         JRST    TTYUN1\r
629         MOVE    A,[JRST REBLK1] ; LEAVE THE SLEEP\r
630         MOVEM   A,WAITNS(B)\r
631         PUSH    TP,$TCHAN\r
632         PUSH    TP,B\r
633         PUSH    TP,$TCHSTR\r
634         PUSH    TP,CHQUOTE UNBLOCKED\r
635         PUSH    TP,$TCHAN\r
636         PUSH    TP,B\r
637         MCALL   2,INTERRUPT\r
638         MOVE    B,(TP)          ; RESTORE CHANNEL\r
639         SUB     TP,[2,,2]\r
640 TTYUN1: POPJ    P,\r
641 \r
642 IFE ITS,[\r
643 ; TENEX BASIC TTY I/O ROUTINE\r
644 \r
645 TNXIN:  PUSHJ   P,MTYI\r
646         PUSHJ   P,INCHAR\r
647         POPJ    P,\r
648 ]\r
649 MFUNCTION TTYECHO,SUBR\r
650 \r
651         ENTRY   2\r
652 \r
653         GETYP   0,(AB)\r
654         CAIE    0,TCHAN\r
655         JRST    WTYP1\r
656         MOVE    A,1(AB)         ; GET CHANNEL\r
657         PUSHJ   P,TCHANC        ; MAKE SURE IT IS TTY INPUT\r
658         MOVE    E,BUFRIN(A)     ; EXTRA INFO BUFFER\r
659 IFN ITS,[\r
660         DOTCAL  TTYGET,[CHANNO(A),[2000,,B],[2000,,C],[2000,,0]]\r
661         FATAL .CALL FAILURE\r
662 ]\r
663 IFE ITS,[\r
664         MOVEI   A,100           ; TTY JFN\r
665         RFMOD                   ; MODE IN B\r
666         TRZ     B,6000          ; TURN OFF ECHO \r
667 ]\r
668         GETYP   D,2(AB)         ; ARG 2\r
669         CAIE    D,TFALSE        ; SKIP IF WANT ECHO OFF\r
670         JRST    ECHOON\r
671 \r
672 IFN ITS,[\r
673         ANDCM   B,[606060,,606060]\r
674         ANDCM   C,[606060,,606060]\r
675 \r
676         DOTCAL  TTYSET,[CHANNO(A),B,C,0]\r
677         FATAL .CALL FAILURE\r
678 ]\r
679 IFE ITS,[\r
680         SFMOD\r
681 ]\r
682 \r
683         MOVEI   B,N.ECHO+N.CNTL ; SET FLAGS\r
684         IORM    B,SYSCHR(E)\r
685 \r
686         JRST    CHANRT\r
687 \r
688 ECHOON:\r
689 IFN ITS,[\r
690         IOR     B,[202020,,202020]\r
691         IOR     C,[202020,,202020]\r
692         DOTCAL  TTYSET,[CHANNO(A),B,C,0]\r
693         FATAL .CALL FAILURE\r
694 ]\r
695 IFE ITS,[\r
696         TRO     B,4000\r
697         SFMOD\r
698 ]\r
699         MOVEI   A,N.ECHO+N.CNTL\r
700         ANDCAM  A,SYSCHR(E)\r
701         JRST    CHANRT\r
702 \r
703 \r
704 \r
705 ; USER SUBR FOR INSTANT CHARACTER SNARFING\r
706 \r
707 MFUNCTION UTYI,SUBR,TYI\r
708 \r
709         ENTRY\r
710         CAMGE   AB,[-3,,]\r
711         JRST    TMA\r
712         MOVE    A,(AB)\r
713         MOVE    B,1(AB)\r
714         JUMPL   AB,.+3\r
715         MOVE    B,IMQUOTE INCHAN\r
716         PUSHJ   P,IDVAL         ; USE INCHAN\r
717         GETYP   0,A             ; GET TYPE\r
718         CAIE    0,TCHAN\r
719         JRST    WTYP1\r
720         LDB     0,[600,,STATUS(B)]\r
721         CAILE   0,2\r
722         JRST    WTYP1\r
723         SKIPN   A,LSTCH(B)      ; ANY READ AHEAD CHAR\r
724         JRST    UTYI1           ; NO, SKIP\r
725         SETZM   LSTCH(B)\r
726         TLZN    A,400000        ; ! HACK?\r
727         JRST    UTYI2           ; NO, OK\r
728         MOVEM   A,LSTCH(B)      ; YES SAVE\r
729         MOVEI   A,"!            ; RET AN !\r
730         JRST    UTYI2\r
731 \r
732 UTYI1:  MOVE    0,IOINS(B)\r
733         CAME    0,[PUSHJ P,GETCHR]\r
734         JRST    WTYP1\r
735         PUSH    TP,$TCHAN\r
736         PUSH    TP,B\r
737         MOVE    C,BUFRIN(B)\r
738         MOVEI   D,N.IME1+N.IMED \r
739         IORM    D,SYSCHR(C)     ; CLOBBER IT IN\r
740         DOTCAL  TTYGET,[CHANNO(B),[2000,,A],[2000,,D],[2000,,0]]\r
741         FATAL .CALL FAILURE\r
742         PUSH    P,A\r
743         PUSH    P,0\r
744         PUSH    P,D             ; SAVE THEM\r
745         IOR     D,[030303,,030303]\r
746         IOR     A,[030303,,030303]\r
747         DOTCAL  TTYSET,[CHANNO(B),A,D,0]\r
748         FATAL .CALL FAILURE\r
749         MOVNI   A,1\r
750         SKIPE   CHRCNT(C)       ; ALREADY SOME?\r
751         PUSHJ   P,INCHAR\r
752         MOVE    C,BUFRIN(B)     ; GET BUFFER BACK\r
753         MOVEI   D,N.IME1\r
754         IORM    D,SYSCHR(C)\r
755         PUSHJ   P,GETCHR\r
756         MOVE    B,1(TB)\r
757         MOVE    C,BUFRIN(B)\r
758         MOVEI   D,N.IME1+N.IMED\r
759         ANDCAM  D,SYSCHR(C)\r
760         POP     P,D\r
761         POP     P,0\r
762         POP     P,C\r
763         DOTCAL  TTYSET,[CHANNO(B),C,D,0]\r
764         FATAL .CALL FAILURE\r
765 UTYI2:  MOVEI   B,(A)\r
766         MOVSI   A,TCHRS\r
767         JRST    FINIS\r
768 \r
769 MFUNCTION       IMAGE,SUBR\r
770         ENTRY\r
771         JUMPGE  AB,TFA          ; 1 OR 2 ARGS NEEDED\r
772         GETYP   A,(AB)          ;GET THE TYPE OF THE ARG\r
773         CAIE    A,TFIX          ;CHECK IT FOR CORRECT TYPE\r
774         JRST    WTYP1           ;WAS WRONG...ERROR EXIT\r
775         HLRZ    0,AB\r
776         CAIL    0,-2\r
777         JRST    USEOTC\r
778         CAIE    0,-4\r
779         JRST    TMA\r
780         GETYP   0,2(AB)\r
781         CAIE    0,TCHAN\r
782         JRST    WTYP2\r
783         MOVE    B,3(AB)         ; GET CHANNEL\r
784 IMAGE1: LDB     0,[600,,STATUS(B)]\r
785         CAILE   0,2             ; MUST BE TTY\r
786         JRST    IMAGFO\r
787         MOVE    0,IOINS(B)\r
788         CAMN    0,[PUSHJ P,MTYO]\r
789         JRST    .+3\r
790         CAME    0,[PUSHJ P,GMTYO]\r
791         JRST    WRONGD\r
792         HRRZ    0,IOINS-1(B)\r
793         JUMPE   0,OPNIMG\r
794 IMGIOT: MOVE    A,1(AB)         ;GET VALUE\r
795         HRLZ    0,CHANNO(B)\r
796         ASH     0,5\r
797         IOR     0,[.IOT A]\r
798         XCT     0\r
799 IMGEXT: MOVE    A,(AB)          ;RETURN THE ORIGINAL ARG\r
800         MOVE    B,1(AB)\r
801         JRST    FINIS           ;EXIT\r
802 \r
803 \r
804 IMAGFO: PUSH    TP,$TCHAN       ;IMAGE OUTPUT FOR NON TTY\r
805         PUSH    TP,B\r
806         MOVEI   B,DIRECT-1(B)\r
807         PUSHJ   P,CHRWRD\r
808         JFCL\r
809         CAME    B,[ASCII /PRINT/]\r
810         CAMN    B,[<ASCII /PRINT/>+1]\r
811         JRST    .+2\r
812         JRST    BADCHN          ; CHANNEL COULDNT BE BLESSED\r
813         MOVE    B,(TP)\r
814         PUSHJ   P,GWB           ; MAKE SURE CHANNEL HAS BUFFER\r
815         MOVE    A,1(AB)         ; GET THE CHARACTER TO DO\r
816         PUSHJ   P,W1CHAR\r
817         MOVE    A,(AB)\r
818         MOVE    B,1(AB)         ;RETURN THE FIX\r
819         JRST    FINIS\r
820 \r
821 \r
822 USEOTC: MOVSI   A,TATOM\r
823         MOVE    B,IMQUOTE OUTCHAN\r
824         PUSHJ   P,IDVAL\r
825         GETYP   0,A\r
826         CAIE    0,TCHAN\r
827         MOVE    B,TTICHN+1(TVP)\r
828         JRST    IMAGE1\r
829 \r
830 OPNIMG: HLLOS   IOINS-1(B)\r
831         CAMN    B,TTOCHN+1(TVP)\r
832         SETOM   IMAGFL\r
833         PUSHJ   P,DEVTOC\r
834         HRLI    C,41            ; SUPER IMAGE BIT\r
835         MOVE    A,CHANNO(B)\r
836         ASH     A,23.\r
837         IOR     A,[.OPEN 0,C]\r
838         XCT     A\r
839         FATAL TTY OPEN LOSSAGE\r
840         JRST    IMGIOT\r
841 \r
842 DEVTOC: PUSH    P,D\r
843         PUSH    P,E\r
844         PUSH    P,0\r
845         PUSH    P,A\r
846         MOVE    D,RDEVIC(B)\r
847         MOVE    E,[220600,,C]\r
848         MOVEI   A,3\r
849         MOVEI   C,0\r
850         ILDB    0,D\r
851         SUBI    0,40\r
852         IDPB    0,E\r
853         SOJG    A,.-3\r
854         POP     P,A\r
855         POP     P,0\r
856         POP     P,E\r
857         POP     P,D\r
858         POPJ    P,\r
859 \r
860 IMGBLK: OUT+IMAGEM+UNIT,,(SIXBIT /TTY/)\r
861         0\r
862         0\r
863 \r
864 \r
865 \r
866 IMPURE\r
867 IMAGFL: 0\r
868 PURE\r
869 \r
870 \r
871 END\r
872 \f\r