1 TITLE READC TELETYPE DEVICE HANDLER FOR MUDDLE
\r
10 IFE ITS,.INSRT MUDSYS;STENEX >
\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
22 ; FLAGS CONCERNING TTY CHANNEL STATE
\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
30 ; OPEN BLOCK MODE BITS
\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
42 ; HERE TO ASK SYSTEM FOR SOME CHARACTERS
\r
44 INCHAR: IRP A,,[0,C,D,E] ;SAVE ACS
\r
47 MOVE E,BUFRIN(B) ; GET AUX BUFFER
\r
49 HLRE 0,E ;FIND END OF BUFFER
\r
51 ANDI 0,-1 ;ISOLATE RH
\r
52 MOVE C,SYSCHR(E) ; GET FLAGS
\r
54 INCHR1: TRNE C,N.IMED+N.CNTL ; SKIP IF NOT IMMEDIATE
\r
56 TLZE D,40 ; SKIP IF NOT ESCAPED
\r
57 JRST INCHR2 ; ESCAPED
\r
58 CAMN A,ESCAP(E) ; IF ESCAPE
\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
71 INCHR2: PUSHJ P,PUTCHR ;PUT ACHAR IN BUFFER
\r
72 INCHR3: MOVEM D,BYTPTR(E)
\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
80 PUSH TP,$TCHAN ; SAVE CHANNEL
\r
82 MOVE A,CHRCNT(E) ; GET # OF CHARS
\r
86 IDIVI A,5 ; AND DOWN
\r
87 PUSHJ P,IBLOCK ; GET CORE
\r
88 HLRE A,B ; FIND D.W.
\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
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
104 JRST .-3 ; GO UNTIL END
\r
105 HRRM B,(D) ; SPLICE
\r
107 ; HERE TO BLT IN BUFFER
\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
115 ADD E,(TP) ; ADD TO START
\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
126 ERASE: SKIPN CHRCNT(E) ;ANYTHING IN BUFFER?
\r
127 JRST BARFCR ;NO, MAYBE TYPE CR
\r
129 SOS CHRCNT(E) ;DELETE FROM COUNT
\r
130 LDB A,D ;RE-GOBBLE LAST CHAR
\r
132 LDB C,[600,,STATUS(B)] ; CHECK FOR IMLAC
\r
133 CAIE C,2 ; SKIP IF IT IS
\r
136 SKIPN ECHO(E) ; SKIP IF ECHOABLE
\r
138 PUSHJ P,CHRTYP ; FOUND OUT IMALC BEHAVIOR
\r
141 NOTFUN: PUSHJ P,DELCHR
\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
149 LFKILL: PUSHJ P,LNSTRV
\r
152 BSKILL: PUSHJ P,GETPOS ; CURRENT POSITION TO A
\r
153 PUSHJ P,SETPOS ; POSITION IMLAC CURSOR
\r
156 MOVEI A,"L ; L , DELETE TO END OF LINE
\r
160 TBKILL: PUSHJ P,GETPOS
\r
162 SUBI A,10 ; A -NUMBER OF DELS TO DO
\r
172 PUSH P,A ; USE TENEX SLASH RUBOUT
\r
182 ; ROUTINE TO DEL CHAR ON IMLAC
\r
190 ; HERE FOR SPECIAL IMLAC HACKS
\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
196 CNOTFU: POPJ P,NOTFUN
\r
200 LNSTRV: MOVEI A,20 ; ^P
\r
206 ; HERE IF KILLING A C.R., RE-POSITION CURSOR
\r
208 CRKILL: PUSHJ P,GETPOS ; COMPUTE LINE POS
\r
212 SETPOS: PUSH P,A ; SAVE POS
\r
218 XCT ECHO(E) ; HORIZ POSIT AT END OF LINE
\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
226 GETPO1: SOSGE (P) ; COUNT DOWN
\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
236 GETPO2: MOVE A,0 ; RET COUNT
\r
237 MOVE 0,-2(P) ; RESTORE AC 0
\r
241 CHRTYP: MOVEI C,0 ; NUMBER OF FLUSHEES
\r
242 CAILE A,37 ; SKIP IF CONTROL CHAR
\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
249 ROTC A,3(B) ; GET CODE IN B
\r
252 MOVE B,(TP) ; RESTORE CHAN
\r
272 CNTTAB: ANDCMI 0,7 ; GET COUNT INCUDING TAB HACK
\r
277 FIXIML: 111111,,115641 ; CNTL @ABCDE,,FGHIJK
\r
278 131111,,111111 ; LMNOPQ,,RSTUVW
\r
279 112011,,120000 ; XYZ LBRAK \ RBRAK,,^ _
\r
281 ; HERE TO KILL THE WHOLE BUFFER
\r
283 KILL: CLEARM CHRCNT(E) ;NONE LEFT NOW
\r
284 MOVE D,[010700,,BYTPTR(E)] ;RESET POINTER
\r
288 MOVE A,ERASCH(E) ;GET THE ERASE CHAR
\r
289 CAIN A,177 ;IS IT RUBOUT?
\r
291 PUSHJ P,CRLF1 ; PRINT CR-LF
\r
296 MOVE A,STATUS(B) ;CHECK CONSOLE KIND
\r
298 CAIN A,2 ;DATAPOINT?
\r
299 PUSHJ P,CLR ;YES, CLEAR SCREEN
\r
302 BRF: MOVE C,[010700,,BYTPTR(E)] ;POINT TO START OF BUFFER
\r
303 SKIPN ECHO(E) ;ANY ECHO INS?
\r
311 ILDB A,C ;GOBBLE CHAR
\r
312 XCT ECHO(E) ;ECHO IT
\r
313 JRST .-4 ;DO FOR ENTIRE BUFFER
\r
315 DECHO: SUB P,[1,,1]
\r
318 CLR: SKIPN C,ECHO(E) ;ONLY IF INS EXISTS
\r
320 MOVEI A,20 ;ERASE SCREEN
\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
331 CAIN A,37 ; CHANGE EOL TO CRLF
\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
339 MOVEI A,12 ; GET LF
\r
342 ; BUFFER FULL, GROW THE BUFFER
\r
344 BUFULL: PUSH TP,$TCHAN ;SAVE B
\r
346 PUSH P,A ; SAVE CURRENT CHAR
\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
355 HLRE 0,E ;RECOMPUTE 0
\r
357 HRRI E,(B) ; POINT TO DEST
\r
365 ; ROUTINE TO CRLF ON ANY TTY
\r
367 CRLF1: SKIPN ECHO(E)
\r
368 POPJ P, ; NO ECHO INS
\r
375 ; SUBROUTINE TO FLUSH BUFFER
\r
377 RRESET: SETZM LSTCH(B) ; CLOBBER RE-USE CHAR
\r
378 MOVE E,BUFRIN(B) ;GET AUX BUFFER
\r
380 MOVEI D,N.IMED+N.IME1
\r
382 MOVE D,[010700,,BYTPTR(E)] ;RESET BYTE POINTER
\r
384 MOVE D,CHANNO(B) ;GOBBLE CHANNEL
\r
385 SETZM CHNCNT(D) ; FLUSH COUNTERS
\r
387 LSH D,23. ;POSITION
\r
389 XCT D ;RESET ITS CHANNEL
\r
392 MOVEI A,100 ; TTY IN JFN
\r
395 SETZM EXBUFR(B) ; CLOBBER STAKED BUFFS
\r
396 MOVEI C,BUFSTR-1(B) ; FIND D.W.
\r
404 ; SUBROUTINE TO ESTABLISH ECHO IOINS
\r
406 MFUNCTION ECHOPAIR,SUBR
\r
410 GETYP A,(AB) ;CHECK ARG TYPES
\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
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
422 CAME B,[ASCII /PRINT/]
\r
425 MOVE B,BUFRIN(A) ;GET A'S AUX BUFFER
\r
426 HRLZ C,CHANNO(D) ; GET CHANNEL
\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
434 TCHANC: MOVEI B,DIRECT-1(A) ;GET DIRECTION
\r
435 PUSHJ P,CHRWRD ; CONVERT
\r
437 CAME B,[ASCII /READ/]
\r
439 LDB C,[600,,STATUS(A)] ;GET A CODE
\r
440 CAILE C,2 ;MAKE SURE A TTY FLAVOR DEVICE
\r
445 TTYOP2: MOVEI A,-1 ; TENEX JFN FOR TERMINAL
\r
446 MOVEI 2,145100 ; MAGIC BITS (SEE TENEX MANUAL)
\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
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
463 TTYOP2: .SUSET [.RTTY,,C]
\r
465 JUMPL C,TTYNO ; DONT HAVE TTY
\r
470 .OPEN TTYIN,[SIXBIT / TTY/]
\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
479 SETCHN: MOVE B,TTICHN+1(TVP) ;GET CHANNEL
\r
480 MOVEI C,TTYIN ;GET ITS CHAN #
\r
482 .STATUS TTYIN,STATUS(B) ;CLOBBER STATUS
\r
484 MOVE B,TTOCHN+1(TVP) ;GET OUT CHAN
\r
487 .STATUS TTYOUT,STATUS(B)
\r
488 SETZM IMAGFL ;RESET IMAGE MODE FLAG
\r
490 DOTCAL RSSIZE,[[1000,,TTYOUT],[2000,,C],[2000,,D]]
\r
491 FATAL .CALL RSSIZE LOSSAGE
\r
496 ; HERE IF TTY WONT OPEN
\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
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
517 MTYO1: MOVE B,TTOCHN+1(TVP)
\r
523 ; HERE FOR TYO TO ANY TTY FLAVOR DEVICE
\r
526 HRRZ 0,IOINS-1(B) ; GET FLAG
\r
528 PUSHJ P,REASCI ; RE-OPEN TTY
\r
532 CAIE A,177 ; DONE OUTPUT A DELETE
\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
545 FATAL TTY OPEN LOSSAGE
\r
549 CAMN B,TTOCHN+1(TVP)
\r
555 WRONGC: PUSH TP,$TATOM
\r
556 PUSH TP,EQUOTE NOT-A-TTY-TYPE-CHANNEL
\r
561 ; HERE TO HANDLE TTY BLOCKING AND UNBLOCKING
\r
563 TTYBLK: PUSH TP,$TCHAN
\r
566 PUSH P,E ; SAVE SOME ACS
\r
568 MOVE A,CHANNO(B) ; GET CHANNEL NUMBER
\r
569 SOSG CHNCNT(A) ; ANY PENDING CHARS
\r
574 .SUSET [.SIFPI,,0] ; SLAM AN INT ON
\r
576 TTYBL1: MOVE C,BUFRIN(B)
\r
577 MOVE A,SYSCHR(C) ; GET FLAGS
\r
579 TRZE A,N.IME1 ; IF WILL BE
\r
580 TRO A,N.IMED ; THE MAKE IT
\r
583 MOVE A,[.CALL TTYIOT]; NON-BUSY WAIT
\r
588 MOVE A,[PUSHJ P,TNXIN]
\r
592 PUSH TP,CHQUOTE BLOCKED
\r
600 REBLK: MOVEI A,-1 ; IN CASE SLEEPING
\r
601 XCT WAITNS(B) ; NOW WAIT
\r
604 IFN ITS, JRST CHRSNR ; SNARF CHAR
\r
605 REBLK1: DISABLE ; FALL THROUG=> UNBLOCKED
\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
624 ; HERE TO UNBLOCK TTY
\r
626 TTYUNB: MOVE A,WAITNS(B) ; GET INS
\r
627 CAMN A,[JRST REBLK1]
\r
629 MOVE A,[JRST REBLK1] ; LEAVE THE SLEEP
\r
634 PUSH TP,CHQUOTE UNBLOCKED
\r
638 MOVE B,(TP) ; RESTORE CHANNEL
\r
643 ; TENEX BASIC TTY I/O ROUTINE
\r
645 TNXIN: PUSHJ P,MTYI
\r
649 MFUNCTION TTYECHO,SUBR
\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
660 DOTCAL TTYGET,[CHANNO(A),[2000,,B],[2000,,C],[2000,,0]]
\r
661 FATAL .CALL FAILURE
\r
664 MOVEI A,100 ; TTY JFN
\r
666 TRZ B,6000 ; TURN OFF ECHO
\r
668 GETYP D,2(AB) ; ARG 2
\r
669 CAIE D,TFALSE ; SKIP IF WANT ECHO OFF
\r
673 ANDCM B,[606060,,606060]
\r
674 ANDCM C,[606060,,606060]
\r
676 DOTCAL TTYSET,[CHANNO(A),B,C,0]
\r
677 FATAL .CALL FAILURE
\r
683 MOVEI B,N.ECHO+N.CNTL ; SET FLAGS
\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
699 MOVEI A,N.ECHO+N.CNTL
\r
705 ; USER SUBR FOR INSTANT CHARACTER SNARFING
\r
707 MFUNCTION UTYI,SUBR,TYI
\r
715 MOVE B,IMQUOTE INCHAN
\r
716 PUSHJ P,IDVAL ; USE INCHAN
\r
717 GETYP 0,A ; GET TYPE
\r
720 LDB 0,[600,,STATUS(B)]
\r
723 SKIPN A,LSTCH(B) ; ANY READ AHEAD CHAR
\r
724 JRST UTYI1 ; NO, SKIP
\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
732 UTYI1: MOVE 0,IOINS(B)
\r
733 CAME 0,[PUSHJ P,GETCHR]
\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
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
750 SKIPE CHRCNT(C) ; ALREADY SOME?
\r
752 MOVE C,BUFRIN(B) ; GET BUFFER BACK
\r
758 MOVEI D,N.IME1+N.IMED
\r
763 DOTCAL TTYSET,[CHANNO(B),C,D,0]
\r
764 FATAL .CALL FAILURE
\r
769 MFUNCTION IMAGE,SUBR
\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
783 MOVE B,3(AB) ; GET CHANNEL
\r
784 IMAGE1: LDB 0,[600,,STATUS(B)]
\r
785 CAILE 0,2 ; MUST BE TTY
\r
788 CAMN 0,[PUSHJ P,MTYO]
\r
790 CAME 0,[PUSHJ P,GMTYO]
\r
794 IMGIOT: MOVE A,1(AB) ;GET VALUE
\r
799 IMGEXT: MOVE A,(AB) ;RETURN THE ORIGINAL ARG
\r
804 IMAGFO: PUSH TP,$TCHAN ;IMAGE OUTPUT FOR NON TTY
\r
806 MOVEI B,DIRECT-1(B)
\r
809 CAME B,[ASCII /PRINT/]
\r
810 CAMN B,[<ASCII /PRINT/>+1]
\r
812 JRST BADCHN ; CHANNEL COULDNT BE BLESSED
\r
814 PUSHJ P,GWB ; MAKE SURE CHANNEL HAS BUFFER
\r
815 MOVE A,1(AB) ; GET THE CHARACTER TO DO
\r
818 MOVE B,1(AB) ;RETURN THE FIX
\r
822 USEOTC: MOVSI A,TATOM
\r
823 MOVE B,IMQUOTE OUTCHAN
\r
827 MOVE B,TTICHN+1(TVP)
\r
830 OPNIMG: HLLOS IOINS-1(B)
\r
831 CAMN B,TTOCHN+1(TVP)
\r
834 HRLI C,41 ; SUPER IMAGE BIT
\r
839 FATAL TTY OPEN LOSSAGE
\r
860 IMGBLK: OUT+IMAGEM+UNIT,,(SIXBIT /TTY/)
\r