Twenex Muddle.
[pdp10-muddle.git] / <mdl.int> / oreadch.mid.208
1 TITLE READCH TELETYPE DEVICE HANDLER FOR MUDDLE
2
3 RELOCATABLE
4
5 .INSRT MUDDLE >
6
7 SYSQ
8
9 IF1,[
10 IFE ITS,.INSRT STENEX >
11 ]
12
13 .GLOBAL BUFRIN,CHRCNT,SYSCHR,ECHO,BYTPTR,ERASCH,KILLCH,BRKCH,AGC,CHRWRD,W1CHAR,GWB
14 .GLOBAL IOIN2,READC,WRONGC,BRFCHR,ESCAP,TTYOPE,MTYI,MTYO,IMTYO,INMTYO,NOTTY,DEMFLG,TTYOP2,OPSYS
15 .GLOBAL IBLOCK,PVSTOR,SPSTOR
16 .GLOBAL RRESET,TTICHN,TTOCHN,CHANNO,STATUS,BRFCH2,TTYBLK,TTYUNB,WAITNS
17 .GLOBAL EXBUFR,INCHAR,BYTDOP,BUFSTR,LSTCH,CHNCNT,DIRECT,IOINS,IBLOCK,INCONS
18 .GLOBAL BADCHN,WRONGD,CHNLOS,MODE1,MODE2,GMTYO,IDVAL,GETCHR,PAGLN,LINLN
19 .GLOBAL RDEVIC,DEMFLG,READ,MAKACT,CITOP,MPOPJ,CIMAGE,GTLPOS,LINPOS
20 .GLOBAL NTTYPE,CLRSTR
21
22 TTYOUT==1
23 TTYIN==2
24
25 ; FLAGS CONCERNING TTY CHANNEL STATE
26
27 N.ECHO==1                       ; NO INPUT ECHO
28 N.CNTL==2                       ; NO RUBOUT ^L ^D ECHO
29 N.IMED==4                       ; ALL CHARS WAKE UP
30 N.IME1==10                      ; SOON WILL BE N.IMED
31 CNTLPC==20                      ; USE ^P CODE MODE IOT
32
33 ; OPEN BLOCK MODE BITS
34 OUT==1
35 IMAGEM==4
36 ASCIIM==0
37 UNIT==0
38
39 IFE ITS,[
40
41 DP%AG1==200000,,0
42 DP%AG2==100000,,0
43
44 TC%MOV==400000,,0
45 TC%CLR==40000,,0
46
47 .VTUP==3
48 .VTMOV==7
49 .VTCLR==15
50 .VTCEL==17
51 .VTBEC==21
52 ]
53
54 ; READC IS CALLED BY PUSHJ P,READC
55 ; B POINTS TO A TTY FLAVOR CHANNEL
56 ; ONE CHARACTER IS RETURNED IN  A
57 ; BECOMES INTERRUPTABLE IF NO CHARACTERS EXISTS
58
59 ; HERE TO ASK SYSTEM FOR SOME CHARACTERS
60
61 INCHAR: IRP     A,,[0,C,D,E]    ;SAVE ACS
62         PUSH    P,A
63         TERMIN
64         MOVE    E,BUFRIN(B)             ; GET AUX BUFFER
65         MOVE    D,BYTPTR(E)
66         HLRE    0,E             ;FIND END OF BUFFER
67         SUBM    E,0
68         ANDI    0,-1            ;ISOLATE RH
69         MOVE    C,SYSCHR(E)     ; GET FLAGS
70
71 INCHR1: TRNE    C,N.IMED+N.CNTL ; SKIP IF NOT IMMEDIATE
72         JRST    DONE
73         TLZE    D,40            ; SKIP IF NOT ESCAPED
74         JRST    INCHR2          ; ESCAPED
75         CAMN    A,ESCAP(E)      ; IF ESCAPE
76         TLO     D,40            ; REMEMBER
77         CAMN    A,BRFCH2(E)
78         JRST    BRF
79         CAMN    A,BRFCHR(E)             ;BUFFER PRINT CHAR
80         JRST    CLEARQ          ;MAYBE CLEAR SCREEN
81         CAMN    A,BRKCH(E)      ;IS THIS A BREAK?
82         JRST    DONE            ;YES, DONE
83         CAMN    A,ERASCH(E)     ;ARE IS IT ERASE?
84         JRST    ERASE           ;YES, GO PROCESS
85         CAMN    A,KILLCH(E)     ;OR KILL
86         JRST    KILL
87
88 INCHR2: PUSHJ   P,PUTCHR        ;PUT ACHAR IN BUFFER
89 INCHR3: MOVEM   D,BYTPTR(E)
90         JRST    DONE1
91
92 DONE:   SKIPL   A               ; IF JUST BUFFER FORCE, SKIP
93         PUSHJ   P,PUTCHR        ; STORE CHAR
94         MOVEI   A,N.IMED        ; TURN OFF IMEDIACY
95         ANDCAM  A,SYSCHR(E)
96         MOVEM   D,BYTPTR(E)
97         PUSH    TP,$TCHAN       ; SAVE CHANNEL
98         PUSH    TP,B
99         MOVE    A,CHRCNT(E)     ; GET # OF CHARS
100         SETZM   CHRCNT(E)
101         PUSH    P,A
102         ADDI    A,4             ; ROUND UP
103         IDIVI   A,5             ; AND DOWN
104         PUSHJ   P,IBLOCK        ; GET CORE
105         HLRE    A,B             ; FIND D.W.
106         SUBM    B,A
107         MOVSI   0,TCHRS+.VECT.  ; GET TYPE
108         MOVEM   0,(A)           ; AND STORE
109         MOVEI   D,-1(B)         ; COPY PNTR
110         MOVE    C,(P)           ; CHAR COUNT
111         HRLI    D,010700
112         HRLI    C,TCHSTR
113         PUSH    TP,$TUVEC
114         PUSH    TP,B
115         PUSHJ   P,INCONS        ; CONS IT ON
116         MOVE    C,-2(TP)        ; GET CHAN BACK
117         MOVEI   D,EXBUFR(C)     ; POINT TO BUFFER LIST
118         HRRZ    0,(D)           ; LAST?
119         JUMPE   0,.+3
120         MOVE    D,0
121         JRST    .-3             ; GO UNTIL END
122         HRRM    B,(D)           ; SPLICE
123
124 ; HERE TO BLT IN BUFFER
125
126         MOVE    D,BUFRIN(C)     ; POINT TO COMPLETED BUFFER
127         HRRZ    C,(TP)          ; START OF NEW STRING
128         HRLI    C,BYTPTR+1(D)   ; 1ST WORD OF CHARS
129         MOVE    E,[010700,,BYTPTR(E)]
130         EXCH    E,BYTPTR(D)     ; END OF STRING
131         MOVEI   E,-BYTPTR(E)
132         ADD     E,(TP)          ; ADD TO START
133         BLT     C,-1(E)
134         MOVE    B,-2(TP)        ; CHANNEL BACK
135         POP     P,C
136         SOJG    C,.+3
137         MOVE    E,BUFRIN(B)
138         SETZM   BYTPTR+1(E)
139         SUB     TP,[4,,4]       ; FLUSH JUNK
140         PUSHJ   P,TTYUNB        ; UNBLOCK THIS TTY
141 DONE1:  IRP     A,,[E,D,C,0]
142         POP     P,A
143         TERMIN
144         POPJ    P,
145 \f
146 ; HERE TO ERASE A CHARACTER
147
148 BARFC1: PUSHJ   P,RUBALT        ; CAN WE RUBOUT AN ALTMODE?
149          JRST   BARFCR          ; NO, C.R.
150         JRST    ERASAL
151
152 ERASE:  SKIPN   CHRCNT(E)       ;ANYTHING IN BUFFER?
153          JRST   BARFC1          ;NO, MAYBE TYPE CR
154
155 ERASAL: SOS     CHRCNT(E)       ;DELETE FROM COUNT
156         LDB     A,D             ;RE-GOBBLE LAST CHAR
157 IFN ITS,[
158         LDB     C,[600,,STATUS(B)] ; CHECK FOR DISPLAY
159         CAIE    C,2             ; SKIP IF IT IS
160 ]
161 IFE ITS,[
162         HLRE    C,STATUS(B)     ; CONTAINS RESULT OF GTTYP
163         SKIPN   DELSTR(C)       ; INTERESTING DELETION METHOD?
164 ]
165          JUMPGE C,TYPCHR        ; DELETE BY ECHOING DELETED CHAR
166         SKIPN   ECHO(E)         ; SKIP IF ECHOABLE
167          JRST   NECHO
168         PUSHJ   P,CHRTYP        ; FOUND OUT DISPLAY BEHAVIOR
169         SKIPGE  C,FIXIM2(C)     ; METHOD OF FLUSHING THIS CHARACTER
170          JRST   (C)             ; DISPATCH TO FUNNY ONES
171
172 NOTFUN: PUSHJ   P,DELCHR        ; DELETE ONE CHARACTER
173         SOJG    C,.-1           ; AND LOOP UNTIL GOT THEM ALL
174
175 ; REJOINS HERE TO UPDATE BUFFER POINTER, ETC.
176 NECHO:  ADD     D,[70000,,0]    ;DECREMENT BYTE POINTER
177         JUMPGE  D,INCHR3        ;AND GO ON, UNLESS BYTE POINTER LOST
178         SUB     D,[430000,,1]   ;FIX UP BYTE POINTER
179         JRST    INCHR3
180 \f
181 ; RUB OUT A CHARACTER BY ECHOING IT (NON-DISPLAYS)
182 TYPCHR: SKIPE   C,ECHO(E)
183          XCT    C
184         JRST    NECHO
185
186 ; SPECIAL HACKS FOR RUBBING OUT ON DISPLAYS
187
188 ; RUB OUT A LINE FEED
189 LFKILL: PUSHJ   P,LNSTRV
190         JRST    NECHO
191
192 LNSTRV: PUSH    P,0             ; STORE USEFUL DATA
193 IFN ITS,[
194         TLO     0,CNTLPC        ; SWITCH ON TEMPORARY ^P MODE
195         MOVEI   A,20            ; ^P
196         XCT     ECHO(E)
197         MOVEI   A,"U            ; U , MOVE UP ONE LINE
198         XCT     ECHO(E)
199 ]
200 IFE ITS,[
201         PUSH    P,B
202         MOVE    B,TTOCHN+1
203         HLRE    A,STATUS(B)     ; terminal type
204         JUMPGE  A,UPCRF
205         MOVE    A,1(B)          ; DISPLAY IN VTS MODE
206         MOVEI   B,.VTUP
207         VTSOP
208         JRST    UPCXIT
209 UPCRF:  PUSHJ   P,GETPOS        ; HERE FOR DISPLAY STUFF IN IMAGE MODE
210         SOS     LINPOS(B)
211         PUSHJ   P,SETPOS
212 UPCXIT: POP     P,B
213 ]
214         POP     P,0             ; RESTORE USEFUL DATA
215         POPJ    P,
216
217 ; RUB OUT A BACK SPACE
218 BSKILL: PUSHJ   P,GETPOS        ; CURRENT POSITION TO A
219         PUSHJ   P,SETPOS        ; POSITION DISPLAY CURSOR
220         PUSH    P,0             ; STORE USEFUL DATA
221 IFN ITS,[
222         TLO     0,CNTLPC        ; SWITCH ON TEMPORARY ^P MODE
223         MOVEI   A,20            ; ^P
224         XCT     ECHO(E)
225         MOVEI   A,"L            ; L , DELETE TO END OF LINE
226         XCT     ECHO(E)
227 ]
228 IFE ITS,[
229         HLRE    A,STATUS(B)
230         JUMPGE  A,CLECRF
231         PUSH    P,B
232         MOVE    A,1(B)
233         MOVEI   B,.VTCEL
234         VTSOP
235         POP     P,B
236         JRST    CLEXIT
237
238 CLECRF: MOVEI   0,EOLSTR(A)
239         PUSHJ   P,STBOUT
240 ]
241 CLEXIT: POP     P,0             ; RESTORE USEFUL DATA
242         JRST    NECHO
243
244 ; RUB OUT A TAB
245 TBKILL: PUSHJ   P,GETPOS
246         ANDI    A,7
247         SUBI    A,10            ; A -NUMBER OF DELS TO DO
248         PUSH    P,A
249         PUSHJ   P,DELCHR
250         AOSE    (P)
251          JRST   .-2
252         SUB     P,[1,,1]
253         JRST    NECHO
254
255 ; ROUTINE TO DEL CHAR ON DISPLAY
256 DELCHR: PUSH    P,0             ; STORE USEFUL DATA
257 IFN ITS,[
258         TLO     0,CNTLPC        ; SWITCH ON TEMPORARY ^P MODE
259         MOVEI   A,20
260         XCT     ECHO(E)
261         MOVEI   A,"X
262         XCT     ECHO(E)
263 ]
264 IFE ITS,[
265         HLRE    A,STATUS(B)
266         JUMPGE  A,DELCRF
267         PUSH    P,B
268         MOVE    A,1(B)
269         MOVEI   B,.VTBEC        ;BACKSPACE AND ERASE
270         VTSOP
271         POP     P,B
272         JRST    DELXIT
273 DELCRF: MOVEI   0,DELSTR(A)
274         PUSHJ   P,STBOUT
275 ]
276 DELXIT: POP     P,0             ;RESTORE USEFUL DATA
277         POPJ    P,
278
279 ; DELETE FOUR-CHARACTER LOSSAGES
280 FOURQ:  PUSH    P,CNOTFU
281 FOURQ2: MOVEI   C,2             ; FOR ^Z AND ^_
282         CAMN    B,TTICHN+1      ; SKIP IF NOT CONSOLE TTY
283         MOVEI   C,4
284 CNOTFU: POPJ    P,NOTFUN
285
286 ; HERE IF KILLING A C.R., RE-POSITION CURSOR
287 CRKILL: PUSHJ   P,GETPOS        ; COMPUTE LINE POS
288         PUSHJ   P,SETPOS
289         JRST    NECHO
290 \f
291 ; HERE TO SET CURRENT CURSOR POSITION, USUALLY TO END OF LINE
292 ; A/ POSITION TO GO TO
293 SETPOS: PUSH    P,0             ; STORE USEFUL DATA
294 IFN ITS,[
295         TLO     0,CNTLPC        ; SWITCH ON TEMPORARY ^P MODE
296         PUSH    P,A             ; SAVE POS
297         MOVEI   A,20
298         XCT     ECHO(E)
299         MOVEI   A,"H
300         XCT     ECHO(E)
301         POP     P,A
302         ADDI    A,10            ; MINIMUM CURSOR POS
303         XCT     ECHO(E)         ; HORIZ POSIT AT END OF LINE
304 ]
305 IFE ITS,[
306         HLRE    0,STATUS(B)
307         JUMPGE  ABPCRF
308
309         PUSH    P,B             ; VTS ABSOLUTE POSITIONING
310         PUSH    P,C
311         PUSH    P,A
312         PUSHJ   P,GTLPOS
313         HRL     C,A             ; LINE NUMBER
314         POP     P,A
315         HRR     C,A             ; COLUMN NUMBER
316         MOVE    A,1(B)
317         MOVEI   B,.VTMOV
318         HRLI    B,(DP%AG1+DP%AG2)
319         VTSOP
320         POP     P,C
321         POP     P,B
322         JRST    ABPXIT
323
324 ABPCRF: ADD     0,[SETZ POSTAB]
325         XCT     @0              ; ROUTINES FOR ABSOLUTE POSITIONING (UGH)
326 ]
327 ABPXIT: POP     P,0             ; RESTORE USEFUL DATA
328         POPJ    P,
329
330 ; HERE TO CALCULATE CURRENT CURSOR POSITION
331 ; RETURNS A/ CURSOR POS (CORRESPONDS TO EOL, TOO)
332 GETPOS: PUSH    P,0
333         MOVEI   0,0             ; COUNT OF CHARACTER POSITIONS
334         PUSH    P,[010700,,BYTPTR(E)]   ; POINT TO BUFFER
335         PUSH    P,CHRCNT(E)     ; NUMBER THEREOF
336
337 GETPO1: SOSGE   (P)             ; COUNT DOWN
338          JRST   GETPO2
339         ILDB    A,-1(P)         ; CHAR FROM BUFFER
340         CAIN    A,15            ; SKIP IF NOT CR
341          MOVEI  0,0             ; C.R., RESET COUNT
342         PUSHJ   P,CHRTYP        ; GET TYPE
343         XCT     FIXIM3(C)       ; GET FIXED COUNT
344         ADD     0,C
345         JRST    GETPO1
346
347 GETPO2: MOVE    A,0             ; RET COUNT
348         MOVE    0,-2(P)         ; RESTORE AC 0
349         SUB     P,[3,,3]
350         POPJ    P,
351
352 ; FIGURE OUT HOW MANY CHARACTER POSITIONS A CHARACTER TAKES
353 CHRTYP: MOVEI   C,0             ; NUMBER OF FLUSHEES
354         CAILE   A,37            ; SKIP IF CONTROL CHAR
355          POPJ   P,
356         PUSH    TP,$TCHAN
357         PUSH    TP,B            ; SAVE CHAN
358         IDIVI   A,12.           ; FIND SPECIAL HACKS
359         MOVE    A,FIXIML(A)     ; GET CONT WORD
360         IMULI   B,3
361         ROTC    A,3(B)          ; GET CODE IN B
362         ANDI    B,7
363         MOVEI   C,(B)
364         MOVE    B,(TP)          ; RESTORE CHAN
365         SUB     TP,[2,,2]
366         POPJ    P,
367
368 ; TABLE OF HOW MANY OR HOW TO FIND OUT
369 FIXIM2: 1
370         2
371         SETZ    FOURQ
372         SETZ    CRKILL
373         SETZ    LFKILL
374         SETZ    BSKILL
375         SETZ    TBKILL
376
377 ; TABLE OF WHAT TO ADD TO HPOS ON ENCOUNTERING CHARACTER
378 FIXIM3: MOVEI   C,1
379         MOVEI   C,2
380         PUSHJ   P,FOURQ2
381         MOVEI   C,0
382         MOVEI   C,0
383         MOVNI   C,1
384         PUSHJ   P,CNTTAB
385
386 ; HORRIBLE KLUDGE TO COUNT SPACES FOR A TAB
387 CNTTAB: ANDCMI  0,7     ; GET COUNT INCUDING TAB HACK
388         ADDI    0,10
389         MOVEI   C,0
390         POPJ    P,
391         
392 ; TYPE TABLE FOR EACH CONTROL CHARACTER
393 FIXIML: 111111,,115641  ; CNTL @ABCDE,,FGHIJK
394         131111,,111111  ; LMNOPQ,,RSTUVW
395         112011,,120000  ; XYZ LBRAK \ RBRAK,,^  _
396 \f
397 ; HERE TO KILL THE WHOLE BUFFER
398
399 KILL:   PUSHJ   P,RUBALT        ; COULD WE RUB OUT ALT MODE
400         JFCL
401         CLEARM  CHRCNT(E)       ;NONE LEFT NOW
402         MOVE    D,[010700,,BYTPTR(E)]   ;RESET POINTER
403
404 BARFCR:
405 IFN ITS,[
406         MOVE    A,ERASCH(E)     ;GET THE ERASE CHAR
407         CAIN    A,177           ;IS IT RUBOUT?
408 ]
409         PUSHJ   P,CRLF1         ; PRINT CR-LF
410         JRST    INCHR3
411
412 ; SKIP IF CAN RUB OUT AN ALTMODE
413 RUBALT: PUSH    TP,$TCHAN
414         PUSH    TP,B
415         HRRZ    A,FSAV(TB)      ; ARE WE IN READ ?
416         CAIE    A,READ
417          JRST   RUBAL1
418         MOVEI   A,(TP)
419         SUBI    A,(TB)
420 IFN ITS,CAIG    A,53            ; SOMEWHAT HEURISTIC (WATCH OUT IN NEW VERSIONS!!!!!!)
421 IFE ITS,CAIG    A,17
422          JRST   RUBAL1
423         HRRZ    A,BUFSTR-1(B)   ; IS BUFFER OF SAME RUN OUT?
424         JUMPN   A,RUBAL1        ; NO
425         MOVE    B,IMQUOTE INCHAN
426         PUSHJ   P,IDVAL         ; REALLY CHECK IT OUT
427         MOVE    C,(TP)
428         CAME    C,B
429          JRST   RUBAL1
430         MOVE    A,BUFSTR-1(B)
431         MOVE    B,BUFSTR(B)
432         PUSHJ   P,CITOP
433         ANDI    A,-1
434         MOVE    D,[10700,,BYTPTR(E)]
435         MOVE    E,(TP)
436         MOVE    E,BUFRIN(E)
437         MOVEM   A,CHRCNT(E)
438 ; CHECK WINNAGE OF BUFFER
439         ILDB    0,D
440         ILDB    C,B
441         CAIE    0,(C)
442          JRST   RUBAL1
443         SOJG    A,.-4
444         MOVE    B,(TP)
445         MOVEM   D,BYTPTR(E)
446         MOVE    A,[JRST RETREA]
447         MOVEM   A,WAITNS(B)
448         AOS     (P)
449         SUB     TP,[2,,2]
450         POPJ    P,
451
452 RUBAL1: MOVE    B,(TP)
453         MOVE    D,[010700,,BYTPTR(E)]
454         SETZM   CHRCNT(E)
455         SUB     TP,[2,,2]
456         POPJ    P,
457
458 RETREA: PUSHJ   P,MAKACT
459         HRLI    A,TFRAME
460         PUSH    TP,A
461         PUSH    TP,B
462         MCALL   1,RETRY
463         JRST    TTYBLK
464 \f
465 ; HERE TO CLEAR SCREEN AND RETYPE BUFFER
466
467 CLEARQ:
468 IFN ITS,[
469         MOVE    A,STATUS(B)     ; FIGURE OUT CONSOLE TYPE
470         ANDI    A,77
471         CAIN    A,2             ; DISPLAY?
472 ]
473 IFE ITS,[
474         HLRE    A,STATUS(B)
475         SKIPE   CLRSTR(A)       ; TRY IT ONLY ON DISPLAYS
476 ]
477          PUSHJ  P,CLR           ; CLEAR SCREEN
478
479 ; HERE TO RETYPE BUFFER
480
481 BRF:    MOVE    C,[010700,,BYTPTR(E)]   ;POINT TO START OF BUFFER
482         SKIPN   ECHO(E)         ;ANY ECHO INS?
483          JRST   NECHO
484 IFE ITS,PUSH    P,B
485         MOVE    B,TTOCHN+1
486         PUSHJ   P,CRLF2
487 IFE ITS,AOS     LINPOS(B)
488         PUSH    P,CHRCNT(E)
489 BRF1:   SOSGE   (P)
490          JRST   DECHO
491         ILDB    A,C             ;GOBBLE CHAR
492         XCT     ECHO(E)         ;ECHO IT
493 IFE ITS,[
494         CAIN    A,12
495          AOS    LINPOS(B)
496 ]
497         JRST    BRF1            ;DO FOR ENTIRE BUFFER
498
499 DECHO:  SUB     P,[1,,1]
500 IFE ITS,POP     P,B
501         JRST    INCHR3
502
503 ; ROUTINE TO CRLF ON ANY TTY
504
505 CRLF1:  SKIPN   ECHO(E)
506         POPJ    P,              ; NO ECHO INS
507 CRLF2:  MOVEI   A,15
508         XCT     ECHO(E)
509         MOVEI   A,12
510         XCT     ECHO(E)
511         POPJ    P,
512
513 ; CLEAR SCREEN
514 CLR:    SKIPN   C,ECHO(E)       ;ONLY IF INS EXISTS
515          POPJ   P,
516         PUSH    P,0
517 IFN ITS,[
518         TLO     0,CNTLPC        ;SWITCH ON TEMPORARY ^P MODE
519         MOVEI   A,20            ;ERASE SCREEN
520         XCT     C
521         MOVEI   A,103
522         XCT     C
523 ]
524 IFE ITS,[
525         JUMPGE  A,CLRCRF
526         PUSH    P,B
527         MOVE    A,1(B)
528         MOVEI   B,.VTCLR
529         VTSOP
530         POP     P,B
531         JRST    CLRXIT
532
533 CLRCRF: MOVEI   0,CLRSTR(A)
534         PUSHJ   P,STBOUT
535         PUSH    P,B
536         MOVE    B,TTOCHN+1
537         SETZM   LINPOS(B)
538         POP     P,B
539 ]
540 CLRXIT: POP     P,0             ;RESTORE USEFUL DATA
541         POPJ    P,
542
543 IFE ITS,[
544
545 STBOUT: PUSH    P,B
546         SKIPE   IMAGFL
547          JRST   STBOU1
548         MOVE    A,1(B)
549         HRRZ    B,STATUS(B)
550         TRZ     B,300
551         SFMOD
552 STBOU1: HRLI    0,440700
553         ILDB    A,0
554         JUMPE   A,STBOUX
555         PBOUT
556         JRST    .-3
557
558 STBOUX: SKIPE   IMAGFL
559          JRST   STBOU2
560         MOVE    B,(P)
561         MOVE    A,1(B)
562         HRRZ    B,STATUS(B)
563         SFMOD
564 STBOU2: POP     P,B
565         POPJ    P,
566 \f
567 ; SPECIAL CASE GOODIES FOR DISPLAY TERMINALS
568
569 NTTYPE==40      ; MAX TERMINAL TYPES SUPPORTED
570
571
572 ; HOW TO CLEAR SCREENS ON TOPS-20/TENEX
573 CLRSTR: 0
574         0
575         0
576         0
577         ASCII /\7f\12/              ; ITS SOFTWARE
578         ASCII /\1d\1e/              ; DATAMEDIA
579         ASCII /\eH\eJ/            ; HP2640
580         0
581         0
582         0
583         0
584         ASCII /\eH\eJ/            ; VT50
585         0
586         ASCII /\e(\7f/             ; GT40
587         0
588         ASCII /\eH\eJ/            ; VT52
589         0
590         0
591         ASCII /\eH\eJ/            ; VT100
592         ASCII /\eH\eJ/            ; TELERAY
593         ASCII /\eH\eJ/            ; H19
594         0
595         0
596         0
597         0
598         0
599         0
600         0
601         0
602         0
603         0
604         0
605 IFN <.-CLRSTR>-NTTYPE,PRINTC /ERROR -- CLEAR SCREEN TABLE LOSES
606 /
607
608 ; HOW TO RUB OUT ON VARIOUS TERMINALS
609 DELSTR: 0
610         0
611         0
612         0
613         ASCII /\7f\v\7f\ 6/    ; ITS SOFTWARE DISPLAY
614         0
615         ASCII /\eD\eK/            ; HP2640
616         0
617         0
618         0
619         0
620         ASCII /\eD\eK/            ; VT50
621         0
622         0
623         0
624         ASCII /\eD\eK/            ; VT52
625         0
626         0
627         ASCII /\eD\eK/            ; VT100
628         ASCII /\eD\eK/            ; TELERAY
629         ASCII /\eD\eK/            ; H19
630         0
631         0
632         0
633         0
634         0
635         0
636         0
637         0
638         0
639         0
640         0
641 IFN <.-DELSTR>-NTTYPE,PRINTC /ERROR -- DELETE TABLE LOSES
642 /
643
644 ; CLEAR TO EOL
645 EOLSTR: 0
646         0
647         0
648         0
649         ASCII /\7f\ 5/              ; ITS SOFTWARE DISPLAY
650         0
651         ASCII /\eK/              ; HP2640
652         0
653         0
654         0
655         0
656         ASCII /\eK/              ; VT50
657         0
658         0
659         0
660         ASCII /\eK/              ; VT52
661         0
662         0
663         ASCII /\eK/              ; VT100
664         ASCII /\eK/              ; TELERAY
665         ASCII /\eK/              ; H19
666         0
667         0
668         0
669         0
670         0
671         0
672         0
673         0
674         0
675         0
676         0
677 IFN <.-EOLSTR>-NTTYPE,PRINTC /ERROR -- END OF LINE TABLE LOSES
678 /
679
680 POSTAB: JFCL
681         JFCL
682         JFCL
683         JFCL
684         PUSHJ   P,PSOFT         ; ITS SOFTWARE
685         JFCL
686         PUSHJ   P,PVT52         ; HP2640
687         JFCL
688         JFCL
689         JFCL
690         JFCL
691         PUSHJ   P,PVT52         ; VT50
692         JFCL
693         JFCL
694         JFCL
695         PUSHJ   P,PVT52         ; VT52
696         JFCL
697         JFCL
698         PUSHJ   P,PVT52         ; VT100
699         PUSHJ   P,PVT52         ; TELERAY
700         PUSHJ   P,PVT52         ; H19
701         JFCL
702         JFCL
703         JFCL
704         JFCL
705         JFCL
706         JFCL
707         JFCL
708         JFCL
709         JFCL
710         JFCL
711         JFCL
712 IFN <.-POSTAB>-NTTYPE,PRINTC /ERROR -- ABSOLUTE POSITION TABLE LOSES
713 /
714
715
716
717 \f
718 ; ROUTINES FOR ABSOLUTE POSITIONING ON TENEX/TOPS-20
719
720 PSOFT:  PUSH    P,A
721         PUSHJ   P,TNXIMG
722         MOVEI   A,177
723         XCT     ECHO(E)
724         MOVEI   A,21
725         XCT     ECHO(E)
726         PUSHJ   P,GTLPOS
727         XCT     ECHO(E)
728         POP     P,A
729         XCT     ECHO(E)
730         PUSHJ   P,TNXASC
731         POPJ    P,
732
733 PVT52:  PUSH    P,A
734         PUSHJ   P,TNXIMG
735         MOVEI   A,33
736         XCT     ECHO(E)
737         MOVEI   A,"Y
738         XCT     ECHO(E)
739         PUSHJ   P,GTLPOS
740         ADDI    A,40            ; MUDDLE PAGES START AT 0, VT52 AT 1
741         XCT     ECHO(E)
742         POP     P,A
743         ADDI    A,40            ; DITTO COLUMNS
744         XCT     ECHO(E)
745         PUSHJ   P,TNXASC
746         POPJ    P,
747
748 TNXIMG: PUSH    P,B
749         MOVE    A,1(B)
750         MOVE    B,STATUS(B)
751         TRZ     B,300
752         SFMOD
753         POP     P,B
754         POPJ    P,
755
756 TNXASC: PUSH    P,B
757         MOVE    A,1(B)
758         HRRZ    B,STATUS(B)
759         SFMOD
760         POP     P,B
761         POPJ    P,
762 ]
763 \f
764 PUTCHR: AOS     CHRCNT(E)       ;COUNT THIS CHARACTER
765         IBP     D               ;BUMP BYTE POINTER
766 IFE ITS,[
767         HRRZ    C,D
768         ADDI    C,(E)
769         CAIG    0,(C)           ;DONT SKIP IF BUFFER FULL
770 ]
771 IFN ITS,        CAIG    0,@D            ;DONT SKIP IF BUFFER FULL
772          PUSHJ  P,BUFULL        ;GROW BUFFER
773 IFE ITS,[
774         CAIN    A,37            ; CHANGE EOL TO CRLF
775         MOVEI   A,15
776 ]
777         DPB     A,D             ;CLOBBER BYTE POINTER IN
778         MOVE    C,SYSCHR(E)     ; FLAGS
779 IFE ITS,[
780         POPJ    P,
781 ]
782 IFN ITS,[
783         TRNN    C,N.IMED+N.CNTL
784         CAIE    A,15            ; IF CR INPUT, FOLLOW WITH LF
785         POPJ    P,
786         MOVEI   A,12            ; GET LF
787         JRST    PUTCHR
788 ]
789 ; BUFFER FULL, GROW THE BUFFER
790
791 BUFULL: MOVEM   D,BYTPTR(E)
792         PUSH    TP,$TCHAN       ;SAVE B
793         PUSH    TP,B
794         PUSH    P,A             ; SAVE CURRENT CHAR
795         HLRE    A,BUFRIN(B)
796         MOVNS   A
797         ADDI    A,100           ; MAKE ONE LONGER
798         PUSHJ   P,IBLOCK        ; GET IT
799         MOVE    A,(TP)          ;RESTORE CHANNEL POINTER
800         SUB     TP,[2,,2]       ;AND REMOVE CRUFT
801         MOVE    E,BUFRIN(A)     ;GET AUX BUFFER POINTER
802         MOVEM   B,BUFRIN(A)
803         HLRE    0,E             ;RECOMPUTE 0
804         MOVSI   E,(E)
805         HRRI    E,(B)           ; POINT TO DEST
806         SUB     B,0
807         BLT     E,(B)
808         MOVEI   0,100-2(B)
809         MOVE    B,A
810         MOVE    E,BUFRIN(B)
811         POP     P,A
812         MOVE    D,BYTPTR(E)
813         POPJ    P,
814
815 ; SUBROUTINE TO FLUSH BUFFER
816
817 RRESET: SETZM   LSTCH(B)        ; CLOBBER RE-USE CHAR
818         MOVE    E,BUFRIN(B)             ;GET AUX BUFFER
819         SETZM   CHRCNT(E)
820         MOVEI   D,N.IMED+N.IME1
821         ANDCAM  D,SYSCHR(E)
822         MOVE    D,[010700,,BYTPTR(E)]   ;RESET BYTE POINTER
823         MOVEM   D,BYTPTR(E)
824         MOVE    D,CHANNO(B)     ;GOBBLE CHANNEL
825 IFN ITS,[
826         SETZM   CHNCNT(D)       ; FLUSH COUNTERS
827         LSH     D,23.           ;POSITION
828         IOR     D,[.RESET 0]
829         XCT     D               ;RESET ITS CHANNEL
830 ]
831 IFE ITS,[
832         MOVEI   A,100           ; TTY IN JFN
833         CFIBF
834 ]
835         SETZM   EXBUFR(B)       ; CLOBBER STAKED BUFFS
836         MOVEI   C,BUFSTR-1(B)   ; FIND D.W.
837         PUSHJ   P,BYTDOP
838         SUBI    A,2
839         HRLI    A,010700
840         MOVEM   A,BUFSTR(B)
841         HLLZS   BUFSTR-1(B)
842         POPJ    P,
843 \f
844 ; SUBROUTINE TO ESTABLISH ECHO IOINS
845
846 MFUNCTION ECHOPAIR,SUBR
847
848         ENTRY   2
849
850         GETYP   A,(AB)          ;CHECK ARG TYPES
851         GETYP   C,2(AB)
852         CAIN    A,TCHAN         ;IS A CHANNEL
853         CAIE    C,TCHAN         ;IS C ALSO
854         JRST    WRONGT          ;NO, ONE OF THEM LOSES
855
856         MOVE    A,1(AB)         ;GET CHANNEL
857         PUSHJ   P,TCHANC        ; VERIFY TTY IN
858         MOVE    D,3(AB)         ;GET OTHER CHANNEL
859         MOVEI   B,DIRECT-1(D)   ;AND ITS DIRECTION
860         PUSHJ   P,CHRWRD
861         JFCL
862         CAME    B,[ASCII /PRINT/]
863         JRST    WRONGD
864
865         MOVE    B,BUFRIN(A)     ;GET A'S AUX BUFFER
866         HRLZ    C,CHANNO(D)     ; GET CHANNEL
867         LSH     C,5
868         IOR     C,[.IOT A]      ; BUILD AN IOT
869         MOVEM   C,ECHO(B)               ;CLOBBER
870 CHANRT: MOVE    A,(AB)
871         MOVE    B,1(AB)         ;RETURN 1ST ARG
872         JRST    FINIS
873
874 TCHANC: MOVEI   B,DIRECT-1(A)   ;GET DIRECTION
875         PUSHJ   P,CHRWRD        ; CONVERT
876         JFCL
877         CAME    B,[ASCII /READ/]
878         JRST    WRONGD
879 IFN ITS,[
880         LDB     C,[600,,STATUS(A)]      ;GET A CODE
881         CAILE   C,2             ;MAKE SURE A TTY FLAVOR DEVICE
882         JRST    WRONGC
883         POPJ    P,
884 ]
885 IFE ITS,[
886         PUSH    P,A
887         MOVE    A,1(A)
888         DVCHR
889         LDB     A,[221100,,B]   ;DEVICE TYPE FIELD
890         CAIE    A,12            ;TTY
891         CAIN    A,13            ;PTY
892          SKIPA
893           JRST  WRONGC          ;NOT A TTY, HOPE WE DON'T GET HERE IN LISTEN
894         POP     P,A
895         POPJ    P,
896 ]
897 \f
898 ; TTY OPEN
899
900 IFE ITS,[
901 TTYOPEN:
902 TTYOP2: SKIPE   DEMFLG
903          POPJ   P,
904         MOVE    C,TTOCHN+1
905         HLLZS   IOINS-1(C)
906         MOVEI   A,-1            ; TERMINAL; STAYS HERE THROUGHOUT ROUTINE
907         MOVEI   2,175100        ; MAGIC BITS (SEE TENEX MANUAL)
908         SFMOD                   ; ZAP
909         RFMOD                   ; LETS FIND SCREEN SIZE
910         MOVEM   B,STATUS(C)
911         LDB     B,[220700,,B]   ; GET PAGE WIDTH
912         JUMPG   B,.+2
913          MOVEI  B,80.           ; MUST BE VIRTUAL, SO MAKE IT 80.
914         MOVEM   B,LINLN(C)
915         LDB     B,[310700,,STATUS(C)] ; AND LENGTH
916         MOVEM   B,PAGLN(C)
917         SKIPE   OPSYS           ; CHECK FOR TOPS-20
918          JRST   NONVTS          ; ONLY TOPS-20 CAN HAVE VTS
919         RTCHR
920          ERJMP  NONVTS          ; NO RTCHR JSYS, HENCE NO VTS
921         TLNN    B,(TC%MOV+TC%CLR)       ; HAS MINIMAL CHARACTERISTICS?
922          JRST   NONVTS          ; NO GOOD ENOUGH FOR US
923         MOVNI   B,1             ; TERMINAL TYPE -1 IS VTS DISPLAY
924         JRST    HASVTS          ; WINS
925
926 NONVTS: PUSH    P,C             ; IDIOT GETTYP CLOBBERS C
927         GTTYP                   ; FIND TERMINAL TYPE
928         POP     P,C
929 HASVTS: HRLM    B,STATUS(C)     ; USED TO FIGURE OUT DISPLAY STUFF
930         MOVE    B,STATUS(C)
931         MOVE    C,TTICHN+1
932         MOVEM   B,STATUS(C)     ; SET UP INCHAN TOO
933         RFCOC                   ; GET CURRENT
934         AND     B,[036377,,-1]  ; CHANGE FOR ^@, ^A AND ^D (FOR NOW)
935         SFCOC                   ; AND RESUSE IT
936
937         POPJ    P,
938 ]
939
940 IFN ITS,[
941 TTYOP2: .SUSET  [.RTTY,,C]
942         SETZM   NOTTY
943         JUMPL   C,TTYNO         ; DONT HAVE TTY
944
945 TTYOPEN:
946         SKIPE   NOTTY
947         POPJ    P,
948         DOTCAL  OPEN,[[1000,,TTYIN],[[SIXBIT /TTY   /]]]
949         JRST    TTYNO
950         DOTCAL  OPEN,[[1000,,TTYOUT],[[SIXBIT /TTY   /]],[5000,,1]]
951         FATAL CANT OPEN TTY
952         DOTCAL  TTYGET,[[1000,,TTYOUT],[2000,,0],[2000,,A],[2000,,B]]
953         FATAL .CALL FAILURE
954         DOTCAL  TTYSET,[[1000,,TTYOUT],MODE1,MODE2,B]
955         FATAL .CALL FAILURE
956         
957 SETCHN: MOVE    B,TTICHN+1      ;GET CHANNEL
958         MOVEI   C,TTYIN         ;GET ITS CHAN #
959         MOVEM   C,CHANNO(B)
960         .STATUS TTYIN,STATUS(B) ;CLOBBER STATUS
961
962         MOVE    B,TTOCHN+1      ;GET OUT CHAN
963         MOVEI   C,TTYOUT
964         MOVEM   C,CHANNO(B)
965         .STATUS TTYOUT,STATUS(B)
966         SETZM   IMAGFL          ;RESET IMAGE MODE FLAG
967         HLLZS   IOINS-1(B)
968         DOTCAL  RSSIZE,[[1000,,TTYOUT],[2000,,C],[2000,,D]]
969         FATAL   .CALL RSSIZE LOSSAGE
970         MOVEM   C,PAGLN(B)
971         MOVEM   D,LINLN(B)
972         POPJ    P,
973
974 ; HERE IF TTY WONT OPEN
975
976 TTYNO:  SETOM   NOTTY
977         POPJ    P,
978 ]
979
980 GTLPOS:
981 IFN ITS,[
982         DOTCAL  RCPOS,[[CHANNO(B)],[2000,,A]]
983         JFCL
984         HLRZS   A
985         POPJ    P,
986 ]
987 IFE ITS,[
988         PUSH    P,B
989         MOVE    B,TTOCHN+1
990         HLRE    A,STATUS(B)
991         JUMPGE  A,GETCRF
992         MOVE    A,1(B)
993         RFPOS
994         HLRZ    A,B
995         SKIPA
996 GETCRF: MOVE    A,LINPOS(B)
997         POP     P,B
998         POPJ    P,
999 ]
1000
1001 MTYI:   SKIPN   DEMFLG          ; SKIP IF DEMON
1002         SKIPE   NOTTY           ; SKIP IF HAVE TTY
1003         FATAL TRIED TO USE NON-EXISTANT TTY
1004
1005 ; TRY TO AVOID HANGING IN .IOT TO TTY
1006
1007 IFN ITS,[
1008         DOTCAL  IOT,[[1000,,TTYIN],[A],[5000,,1000]]
1009         JFCL
1010 ]
1011 IFE ITS,[
1012         SKIPN   IMAGFL
1013          JRST   MTYI1
1014         PUSH    P,B
1015         PUSHJ   P,MTYO1
1016         POP     P,B
1017 MTYI1:  PBIN
1018 ]
1019         POPJ    P,
1020
1021 INMTYO:                         ; BOTH ARE INTERRUPTABLE
1022 MTYO:   ENABLE
1023         PUSHJ   P,IMTYO
1024         DISABLE
1025         POPJ    P,
1026
1027 ; NON-INTERRUPTABLE VERSION, FOR ECHO INSTRUCTION AND SUCHLIKE
1028 IMTYO:  SKIPE   NOTTY
1029         POPJ    P,              ; IGNORE, DONT HAVE TTY
1030
1031 IFN ITS,[
1032         CAIN    A,177           ;DONT OUTPUT A DELETE
1033          POPJ   P,
1034         PUSH    P,B
1035         MOVEI   B,0             ; SETUP CONTROL BITS
1036         TLNE    0,CNTLPC        ; SKIP IF ^P MODE SWITCH IS OFF
1037         MOVEI   B,%TJDIS        ; SWITCH ON TEMPORARY ^P MODE
1038         DOTCAL  IOT,[[1000,,TTYOUT],[A],[4000,,B]]
1039         JFCL
1040         POP     P,B
1041 ]
1042 IFE ITS, PBOUT
1043         POPJ    P,
1044
1045 MTYO1:  MOVE    B,TTOCHN+1
1046         PUSH    P,0
1047         PUSHJ   P,REASCI
1048         POP     P,0
1049         POPJ    P,
1050
1051 ; HERE FOR TYO TO ANY TTY FLAVOR DEVICE
1052
1053 GMTYO:  PUSH    P,0
1054 IFE ITS,[
1055         HRRZ    0,IOINS-1(B)    ; GET FLAG
1056         SKIPE   0
1057         PUSHJ   P,REASCI        ; RE-OPEN TTY
1058 ]
1059         HRLZ    0,CHANNO(B)
1060         ASH     0,5
1061         IOR     0,[.IOT A]
1062         CAIE    A,177           ; DONE OUTPUT A DELETE
1063         XCT     0
1064         POP     P,0
1065         POPJ    P,
1066
1067 REASCI: PUSH    P,A
1068         PUSH    P,C
1069 IFE ITS,[
1070         PUSH    P,B
1071         MOVE    A,1(B)
1072         RFMOD
1073         TRO     B,102
1074         SFMOD 
1075         STPAR
1076         POP     P,B ]
1077
1078         POP     P,C
1079         POP     P,A
1080         HLLZS   IOINS-1(B)
1081         CAMN    B,TTOCHN+1
1082         SETZM   IMAGFL
1083         POPJ    P,
1084
1085
1086
1087 WRONGC: ERRUUO  EQUOTE NOT-A-TTY-TYPE-CHANNEL
1088
1089
1090
1091 ; HERE TO HANDLE TTY BLOCKING AND UNBLOCKING
1092
1093 TTYBLK: PUSH    TP,$TCHAN
1094         PUSH    TP,B
1095         PUSH    P,0
1096         PUSH    P,E             ; SAVE SOME ACS
1097 IFN ITS,[
1098         MOVE    A,CHANNO(B)     ; GET CHANNEL NUMBER
1099         SOSG    CHNCNT(A)       ; ANY PENDING CHARS
1100         JRST    TTYBL1
1101         SETZM   CHNCNT(A)
1102         MOVEI   0,1
1103         LSH     0,(A)
1104         .SUSET  [.SIFPI,,0]     ; SLAM AN INT ON
1105 ]
1106 TTYBL1: MOVE    C,BUFRIN(B)
1107         MOVE    A,SYSCHR(C)     ; GET FLAGS
1108         TRZ     A,N.IMED
1109         TRZE    A,N.IME1        ; IF WILL BE
1110         TRO     A,N.IMED        ; THE MAKE IT
1111         MOVEM   A,SYSCHR(C)
1112 IFN ITS,[
1113         MOVE    A,[.CALL TTYIOT]        ; NON-BUSY WAIT (IF CHAR READ, LEAVE IN BUFFER
1114                                         ;       TO LET IT BE READ AT INTERRUPT LEVEL)
1115         SKIPE   NOTTY
1116         MOVE    A,[.SLEEP A,]
1117 ]
1118 IFE ITS,[
1119         MOVE    A,[PUSHJ P,TNXIN]
1120 ]
1121         MOVEM   A,WAITNS(B)
1122         PUSH    TP,$TCHSTR
1123         PUSH    TP,CHQUOTE BLOCKED
1124         PUSH    TP,$TPVP
1125         PUSH    TP,PVSTOR+1
1126         MCALL   2,INTERRUPT
1127         MOVSI   A,TCHAN
1128         MOVE    PVP,PVSTOR+1
1129         MOVEM   A,BSTO(PVP)
1130         MOVE    B,(TP)
1131         ENABLE
1132 REBLK:  MOVEI   A,-1            ; IN CASE SLEEPING
1133         XCT     WAITNS(B)       ; NOW WAIT
1134         JFCL
1135 IFE ITS,        JRST    .-3
1136 IFN ITS,        JRST    CHRSNR  ; SNARF CHAR
1137 REBLK1: DISABLE                 ; FALL THROUG=> UNBLOCKED
1138         MOVE    PVP,PVSTOR+1
1139         SETZM   BSTO(PVP)
1140         POP     P,E
1141         POP     P,0
1142         MOVE    B,(TP)
1143         SUB     TP,[2,,2]
1144         POPJ    P,
1145
1146 CHRSNR: SKIPN   DEMFLG          ; SKIP IF DEMON
1147         SKIPE   NOTTY           ; TTY?
1148         JRST    REBLK           ; NO, JUST RESET AND BLOCK
1149         .SUSET  [.SIFPI,,[1_<TTYIN>]]
1150         JRST    REBLK           ; AND GO BACK
1151
1152 TTYIOT: SETZ
1153         SIXBIT /IOT/
1154         1000,,TTYIN
1155         0
1156         405000,,20000
1157
1158 ; HERE TO UNBLOCK TTY
1159
1160 TTYUNB: MOVE    A,WAITNS(B)     ; GET INS
1161         CAMN    A,[JRST REBLK1]
1162         JRST    TTYUN1
1163         MOVE    A,[JRST REBLK1] ; LEAVE THE SLEEP
1164         MOVEM   A,WAITNS(B)
1165         PUSH    TP,$TCHAN
1166         PUSH    TP,B
1167         PUSH    TP,$TCHSTR
1168         PUSH    TP,CHQUOTE UNBLOCKED
1169         PUSH    TP,$TCHAN
1170         PUSH    TP,B
1171         MCALL   2,INTERRUPT
1172         MOVE    B,(TP)          ; RESTORE CHANNEL
1173         SUB     TP,[2,,2]
1174 TTYUN1: POPJ    P,
1175
1176 IFE ITS,[
1177 ; TENEX BASIC TTY I/O ROUTINE
1178
1179 TNXIN:  PUSHJ   P,MTYI
1180         PUSHJ   P,INCHAR
1181         POPJ    P,
1182 ]
1183 MFUNCTION TTYECHO,SUBR
1184
1185         ENTRY   2
1186
1187         GETYP   0,(AB)
1188         CAIE    0,TCHAN
1189         JRST    WTYP1
1190         MOVE    A,1(AB)         ; GET CHANNEL
1191         PUSHJ   P,TCHANC        ; MAKE SURE IT IS TTY INPUT
1192         MOVE    E,BUFRIN(A)     ; EXTRA INFO BUFFER
1193 IFN ITS,[
1194         DOTCAL  TTYGET,[CHANNO(A),[2000,,B],[2000,,C],[2000,,0]]
1195         FATAL .CALL FAILURE
1196 ]
1197 IFE ITS,[
1198         MOVEI   A,100           ; TTY JFN
1199         RFMOD                   ; MODE IN B
1200         TRZ     B,6000          ; TURN OFF ECHO 
1201 ]
1202         GETYP   D,2(AB)         ; ARG 2
1203         CAIE    D,TFALSE        ; SKIP IF WANT ECHO OFF
1204         JRST    ECHOON
1205
1206 IFN ITS,[
1207         ANDCM   B,[606060,,606060]
1208         ANDCM   C,[606060,,606060]
1209
1210         DOTCAL  TTYSET,[CHANNO(A),B,C,0]
1211         FATAL .CALL FAILURE
1212 ]
1213 IFE ITS,[
1214         SFMOD
1215 ]
1216
1217         MOVEI   B,N.ECHO+N.CNTL ; SET FLAGS
1218         IORM    B,SYSCHR(E)
1219
1220         JRST    CHANRT
1221
1222 ECHOON:
1223 IFN ITS,[
1224         IOR     B,[202020,,202020]
1225         IOR     C,[202020,,200020]
1226         DOTCAL  TTYSET,[CHANNO(A),B,C,0]
1227         FATAL .CALL FAILURE
1228 ]
1229 IFE ITS,[
1230         TRO     B,4000
1231         SFMOD
1232 ]
1233         MOVEI   A,N.ECHO+N.CNTL
1234         ANDCAM  A,SYSCHR(E)
1235         JRST    CHANRT
1236
1237
1238
1239 ; USER SUBR FOR INSTANT CHARACTER SNARFING
1240
1241 MFUNCTION UTYI,SUBR,TYI
1242
1243         ENTRY
1244         CAMGE   AB,[-3,,]
1245         JRST    TMA
1246         MOVE    A,(AB)
1247         MOVE    B,1(AB)
1248         JUMPL   AB,.+3
1249         MOVE    B,IMQUOTE INCHAN
1250         PUSHJ   P,IDVAL         ; USE INCHAN
1251         GETYP   0,A             ; GET TYPE
1252         CAIE    0,TCHAN
1253         JRST    WTYP1
1254 IFN ITS,[
1255         LDB     0,[600,,STATUS(B)]
1256         CAILE   0,2
1257         JRST    WTYP1
1258         SKIPN   A,LSTCH(B)      ; ANY READ AHEAD CHAR
1259         JRST    UTYI1           ; NO, SKIP
1260         ANDI    A,-1
1261         SETZM   LSTCH(B)
1262         TLZN    A,400000        ; ! HACK?
1263         JRST    UTYI2           ; NO, OK
1264         HRRM    A,LSTCH(B)      ; YES SAVE
1265         MOVEI   A,"!            ; RET AN !
1266         JRST    UTYI2
1267
1268 UTYI1:  MOVE    0,IOINS(B)
1269         CAME    0,[PUSHJ P,GETCHR]
1270         JRST    WTYP1
1271         PUSH    TP,$TCHAN
1272         PUSH    TP,B
1273         MOVE    C,BUFRIN(B)
1274         MOVEI   D,N.IME1+N.IMED 
1275         IORM    D,SYSCHR(C)     ; CLOBBER IT IN
1276         DOTCAL  TTYGET,[CHANNO(B),[2000,,A],[2000,,D],[2000,,0]]
1277         FATAL .CALL FAILURE
1278         PUSH    P,A
1279         PUSH    P,0
1280         PUSH    P,D             ; SAVE THEM
1281         IOR     D,[030303,,030303]
1282         IOR     A,[030303,,030303]
1283         DOTCAL  TTYSET,[CHANNO(B),A,D,0]
1284         FATAL .CALL FAILURE
1285         MOVNI   A,1
1286         SKIPE   CHRCNT(C)       ; ALREADY SOME?
1287         PUSHJ   P,INCHAR
1288         MOVE    C,BUFRIN(B)     ; GET BUFFER BACK
1289         MOVEI   D,N.IME1
1290         IORM    D,SYSCHR(C)
1291         PUSHJ   P,GETCHR
1292         MOVE    B,1(TB)
1293         MOVE    C,BUFRIN(B)
1294         MOVEI   D,N.IME1+N.IMED
1295         ANDCAM  D,SYSCHR(C)
1296         POP     P,D
1297         POP     P,0
1298         POP     P,C
1299         DOTCAL  TTYSET,[CHANNO(B),C,D,0]
1300         FATAL .CALL FAILURE
1301 UTYI2:  MOVEI   B,(A) ]
1302 IFE ITS,[
1303         MOVE    A,1(B)          ;GET JFN FOR INPUT
1304         ENABLE
1305         BIN                     ;SNARF A CHARACTER
1306         DISABLE
1307 ]
1308         MOVSI   A,TCHRS
1309         JRST    FINIS
1310
1311 MFUNCTION       IMAGE,SUBR
1312         ENTRY
1313         JUMPGE  AB,TFA          ; 1 OR 2 ARGS NEEDED
1314         GETYP   A,(AB)          ;GET THE TYPE OF THE ARG
1315         CAIE    A,TFIX          ;CHECK IT FOR CORRECT TYPE
1316         JRST    WTYP1           ;WAS WRONG...ERROR EXIT
1317         HLRZ    0,AB
1318         CAIL    0,-2
1319         JRST    USEOTC
1320         CAIE    0,-4
1321         JRST    TMA
1322         GETYP   0,2(AB)
1323         CAIE    0,TCHAN
1324         JRST    WTYP2
1325         MOVE    B,3(AB)         ; GET CHANNEL
1326 IMAGE1: MOVE    A,1(AB)
1327         PUSHJ   P,CIMAGE
1328         JRST    FINIS
1329
1330 CIMAGE: SUBM    M,(P)
1331 IFN ITS,[
1332         LDB     0,[600,,STATUS(B)]
1333         CAILE   0,2             ; MUST BE TTY
1334         JRST    IMAGFO
1335         MOVE    0,IOINS(B)
1336         CAMN    0,[PUSHJ P,MTYO]
1337         JRST    .+3
1338         CAME    0,[PUSHJ P,GMTYO]
1339         JRST    WRONGD ]
1340 IFE ITS,[
1341         MOVE    0,CHANNO(B)     ; SEE IF TTY
1342         CAIE    0,101
1343         JRST    IMAGFO
1344 ]
1345
1346 IFN ITS,[
1347         DOTCAL  IOT,[[5000,,2000],[CHANNO(B)],[A]]
1348         JFCL
1349         MOVE    B,A
1350 ]
1351 IFE ITS,[
1352         SKIPE   IMAGFL
1353          JRST   IMGOK
1354         
1355         PUSH    P,A
1356         PUSH    P,B
1357         MOVSI   A,1
1358         HRROI   B,[ASCIZ /TTY:/]
1359         GTJFN
1360          HALTF
1361         MOVE    B,[074000,,102000]
1362         OPENF
1363          HALTF
1364         HRRZM   A,IMAGFL
1365         POP     P,B
1366         POP     P,A
1367 IMGOK:  MOVE    B,IMAGFL
1368         EXCH    A,B
1369         BOUT
1370
1371
1372 IMGEXT: MOVSI   A,TFIX
1373         JRST    MPOPJ
1374
1375
1376 IMAGFO: PUSH    TP,$TCHAN       ;IMAGE OUTPUT FOR NON TTY
1377         PUSH    TP,B
1378         PUSH    P,A
1379         HRRZ    0,-2(B)         ; GET BITS
1380         TRC     0,C.OPN+C.PRIN
1381         TRNE    0,C.OPN+C.PRIN
1382         JRST    BADCHN
1383         MOVE    B,(TP)
1384         PUSHJ   P,GWB           ; MAKE SURE CHANNEL HAS BUFFER
1385         MOVE    A,(P)           ; GET THE CHARACTER TO DO
1386         PUSHJ   P,W1CHAR
1387         POP     P,B
1388         MOVSI   A,TFIX
1389         SUB     TP,[2,,2]
1390         JRST    MPOPJ
1391
1392
1393 USEOTC: MOVSI   A,TATOM
1394         MOVE    B,IMQUOTE OUTCHAN
1395         PUSHJ   P,IDVAL
1396         GETYP   0,A
1397         CAIE    0,TCHAN
1398         MOVE    B,TTOCHN+1
1399         MOVE    A,1(B)
1400         JRST    IMAGE1
1401
1402
1403 DEVTOC: PUSH    P,D
1404         PUSH    P,E
1405         PUSH    P,0
1406         PUSH    P,A
1407         MOVE    D,RDEVIC(B)
1408         MOVE    E,[220600,,C]
1409         MOVEI   A,3
1410         MOVEI   C,0
1411         ILDB    0,D
1412         SUBI    0,40
1413         IDPB    0,E
1414         SOJG    A,.-3
1415         POP     P,A
1416         POP     P,0
1417         POP     P,E
1418         POP     P,D
1419         POPJ    P,
1420
1421 IMGBLK: OUT+IMAGEM+UNIT,,(SIXBIT /TTY/)
1422         0
1423         0
1424
1425
1426
1427 IMPURE
1428 IMAGFL: 0
1429 PURE
1430
1431
1432 END
1433 \f