1 TITLE READCH TELETYPE DEVICE HANDLER FOR MUDDLE
10 IFE ITS,.INSRT STENEX >
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
25 ; FLAGS CONCERNING TTY CHANNEL STATE
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
34 ; OPEN BLOCK MODE BITS
55 ; READC IS CALLED BY PUSHJ P,READC
56 ; B POINTS TO A TTY FLAVOR CHANNEL
57 ; ONE CHARACTER IS RETURNED IN A
58 ; BECOMES INTERRUPTABLE IF NO CHARACTERS EXISTS
60 ; HERE TO ASK SYSTEM FOR SOME CHARACTERS
62 INCHAR: IRP A,,[0,C,D,E] ;SAVE ACS
65 MOVE E,BUFRIN(B) ; GET AUX BUFFER
67 HLRE 0,E ;FIND END OF BUFFER
70 MOVE C,SYSCHR(E) ; GET FLAGS
72 INCHR1: TRNE C,N.IMED+N.CNTL ; SKIP IF NOT IMMEDIATE
74 LDB C,D ; GET PREV CHAR
75 CAMN C,ESCAP(E) ; SKIP IF NOT ESCAPED
79 CAMN A,BRFCHR(E) ;BUFFER PRINT CHAR
80 JRST CLEARQ ;MAYBE CLEAR SCREEN
81 CAMN A,BRKCH(E) ;IS THIS A BREAK?
83 CAMN A,ERASCH(E) ;ARE IS IT ERASE?
84 JRST ERASE ;YES, GO PROCESS
85 CAMN A,KILLCH(E) ;OR KILL
88 INCHR2: PUSHJ P,PUTCHR ;PUT ACHAR IN BUFFER
89 INCHR3: MOVEM D,BYTPTR(E)
92 DONE: SKIPL A ; IF JUST BUFFER FORCE, SKIP
93 PUSHJ P,PUTCHR ; STORE CHAR
94 MOVEI A,N.IMED ; TURN OFF IMEDIACY
97 PUSH TP,$TCHAN ; SAVE CHANNEL
99 MOVE A,CHRCNT(E) ; GET # OF CHARS
104 PUSHJ P,IBLOCK ; GET CORE
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
115 PUSHJ P,INCONS ; CONS IT ON
116 MOVE C,-2(TP) ; GET CHAN BACK
117 MOVEI D,EXBUFR(C) ; POINT TO BUFFER LIST
121 JRST .-3 ; GO UNTIL END
124 ; HERE TO BLT IN BUFFER
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
132 ADD E,(TP) ; ADD TO START
134 MOVE B,-2(TP) ; CHANNEL BACK
139 SUB TP,[4,,4] ; FLUSH JUNK
140 PUSHJ P,TTYUNB ; UNBLOCK THIS TTY
141 DONE1: IRP A,,[E,D,C,0]
146 ; HERE TO ERASE A CHARACTER
148 BARFC1: PUSHJ P,RUBALT ; CAN WE RUBOUT AN ALTMODE?
149 JRST BARFCR ; NO, C.R.
152 ERASE: SKIPN CHRCNT(E) ;ANYTHING IN BUFFER?
153 JRST BARFC1 ;NO, MAYBE TYPE CR
155 ERASAL: SOS CHRCNT(E) ;DELETE FROM COUNT
156 LDB A,D ;RE-GOBBLE LAST CHAR
158 LDB C,[600,,STATUS(B)] ; CHECK FOR DISPLAY
159 CAIE C,2 ; SKIP IF IT IS
162 HLRE C,STATUS(B) ; CONTAINS RESULT OF GTTYP
163 SKIPN DELSTR(C) ; INTERESTING DELETION METHOD?
165 JUMPGE C,TYPCHR ; DELETE BY ECHOING DELETED CHAR
166 SKIPN ECHO(E) ; SKIP IF ECHOABLE
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
172 NOTFUN: PUSHJ P,DELCHR ; DELETE ONE CHARACTER
173 SOJG C,.-1 ; AND LOOP UNTIL GOT THEM ALL
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
181 ; RUB OUT A CHARACTER BY ECHOING IT (NON-DISPLAYS)
182 TYPCHR: SKIPE C,ECHO(E)
186 ; SPECIAL HACKS FOR RUBBING OUT ON DISPLAYS
188 ; RUB OUT A LINE FEED
189 LFKILL: PUSHJ P,LNSTRV
192 LNSTRV: PUSH P,0 ; STORE USEFUL DATA
194 TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
197 MOVEI A,"U ; U , MOVE UP ONE LINE
203 HLRE A,STATUS(B) ; terminal type
205 MOVE A,1(B) ; DISPLAY IN VTS MODE
209 UPCRF: PUSHJ P,GETPOS ; HERE FOR DISPLAY STUFF IN IMAGE MODE
214 POP P,0 ; RESTORE USEFUL DATA
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
222 TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
225 MOVEI A,"L ; L , DELETE TO END OF LINE
238 CLECRF: MOVEI 0,EOLSTR(A)
241 CLEXIT: POP P,0 ; RESTORE USEFUL DATA
245 TBKILL: PUSHJ P,GETPOS
247 SUBI A,10 ; A -NUMBER OF DELS TO DO
255 ; ROUTINE TO DEL CHAR ON DISPLAY
256 DELCHR: PUSH P,0 ; STORE USEFUL DATA
258 TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
269 MOVEI B,.VTBEC ;BACKSPACE AND ERASE
273 DELCRF: MOVEI 0,DELSTR(A)
276 DELXIT: POP P,0 ;RESTORE USEFUL DATA
279 ; DELETE FOUR-CHARACTER LOSSAGES
281 FOURQ2: MOVEI C,2 ; FOR ^Z AND ^_
282 CAMN B,TTICHN+1 ; SKIP IF NOT CONSOLE TTY
284 CNOTFU: POPJ P,NOTFUN
286 ; HERE IF KILLING A C.R., RE-POSITION CURSOR
287 CRKILL: PUSHJ P,GETPOS ; COMPUTE LINE POS
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
295 TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
302 ADDI A,10 ; MINIMUM CURSOR POS
303 XCT ECHO(E) ; HORIZ POSIT AT END OF LINE
309 PUSH P,B ; VTS ABSOLUTE POSITIONING
313 HRL C,A ; LINE NUMBER
315 HRR C,A ; COLUMN NUMBER
318 HRLI B,(DP%AG1+DP%AG2)
324 ABPCRF: ADD 0,[SETZ POSTAB]
325 XCT @0 ; ROUTINES FOR ABSOLUTE POSITIONING (UGH)
327 ABPXIT: POP P,0 ; RESTORE USEFUL DATA
330 ; HERE TO CALCULATE CURRENT CURSOR POSITION
331 ; RETURNS A/ CURSOR POS (CORRESPONDS TO EOL, TOO)
333 MOVEI 0,0 ; COUNT OF CHARACTER POSITIONS
334 PUSH P,[010700,,BYTPTR(E)] ; POINT TO BUFFER
335 PUSH P,CHRCNT(E) ; NUMBER THEREOF
337 GETPO1: SOSGE (P) ; COUNT DOWN
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
347 GETPO2: MOVE A,0 ; RET COUNT
348 MOVE 0,-2(P) ; RESTORE AC 0
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
357 PUSH TP,B ; SAVE CHAN
358 IDIVI A,12. ; FIND SPECIAL HACKS
359 MOVE A,FIXIML(A) ; GET CONT WORD
361 ROTC A,3(B) ; GET CODE IN B
364 MOVE B,(TP) ; RESTORE CHAN
368 ; TABLE OF HOW MANY OR HOW TO FIND OUT
377 ; TABLE OF WHAT TO ADD TO HPOS ON ENCOUNTERING CHARACTER
386 ; HORRIBLE KLUDGE TO COUNT SPACES FOR A TAB
387 CNTTAB: ANDCMI 0,7 ; GET COUNT INCUDING TAB HACK
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,,^ _
397 ; HERE TO KILL THE WHOLE BUFFER
399 KILL: PUSHJ P,RUBALT ; COULD WE RUB OUT ALT MODE
401 CLEARM CHRCNT(E) ;NONE LEFT NOW
402 MOVE D,[010700,,BYTPTR(E)] ;RESET POINTER
406 MOVE A,ERASCH(E) ;GET THE ERASE CHAR
407 CAIN A,177 ;IS IT RUBOUT?
409 PUSHJ P,CRLF1 ; PRINT CR-LF
412 ; SKIP IF CAN RUB OUT AN ALTMODE
413 RUBALT: PUSH TP,$TCHAN
415 HRRZ A,FSAV(TB) ; ARE WE IN READ ?
420 IFN ITS,CAIG A,53 ; SOMEWHAT HEURISTIC (WATCH OUT IN NEW VERSIONS!!!!!!)
423 HRRZ A,BUFSTR-1(B) ; IS BUFFER OF SAME RUN OUT?
425 MOVE B,IMQUOTE INCHAN
426 PUSHJ P,IDVAL ; REALLY CHECK IT OUT
434 MOVE D,[10700,,BYTPTR(E)]
438 ; CHECK WINNAGE OF BUFFER
453 MOVE D,[010700,,BYTPTR(E)]
458 RETREA: PUSHJ P,MAKACT
465 ; HERE TO CLEAR SCREEN AND RETYPE BUFFER
469 MOVE A,STATUS(B) ; FIGURE OUT CONSOLE TYPE
475 SKIPE CLRSTR(A) ; TRY IT ONLY ON DISPLAYS
477 PUSHJ P,CLR ; CLEAR SCREEN
479 ; HERE TO RETYPE BUFFER
481 BRF: MOVE C,[010700,,BYTPTR(E)] ;POINT TO START OF BUFFER
482 SKIPN ECHO(E) ;ANY ECHO INS?
487 IFE ITS,AOS LINPOS(B)
491 ILDB A,C ;GOBBLE CHAR
497 JRST BRF1 ;DO FOR ENTIRE BUFFER
503 ; ROUTINE TO CRLF ON ANY TTY
506 POPJ P, ; NO ECHO INS
514 CLR: SKIPN C,ECHO(E) ;ONLY IF INS EXISTS
518 TLO 0,CNTLPC ;SWITCH ON TEMPORARY ^P MODE
519 MOVEI A,20 ;ERASE SCREEN
533 CLRCRF: MOVEI 0,CLRSTR(A)
540 CLRXIT: POP P,0 ;RESTORE USEFUL DATA
552 STBOU1: HRLI 0,440700
567 ; SPECIAL CASE GOODIES FOR DISPLAY TERMINALS
569 NTTYPE==40 ; MAX TERMINAL TYPES SUPPORTED
572 ; HOW TO CLEAR SCREENS ON TOPS-20/TENEX
577 ASCII /
\7f\12/ ; ITS SOFTWARE
578 ASCII /
\1d\1e/ ; DATAMEDIA
579 ASCII /
\eH
\eJ/ ; HP2640
584 ASCII /
\eH
\eJ/ ; VT50
586 ASCII /
\e(
\7f/ ; GT40
588 ASCII /
\eH
\eJ/ ; VT52
591 ASCII /
\eH
\eJ/ ; VT100
592 ASCII /
\eH
\eJ/ ; TELERAY
605 IFN <.-CLRSTR>-NTTYPE,PRINTC /ERROR -- CLEAR SCREEN TABLE LOSES
608 ; HOW TO RUB OUT ON VARIOUS TERMINALS
613 ASCII /
\7f\v\7f\ 6/ ; ITS SOFTWARE DISPLAY
615 ASCII /
\eD
\eK/ ; HP2640
620 ASCII /
\eD
\eK/ ; VT50
624 ASCII /
\eD
\eK/ ; VT52
627 ASCII /
\eD
\eK/ ; VT100
628 ASCII /
\eD
\eK/ ; TELERAY
641 IFN <.-DELSTR>-NTTYPE,PRINTC /ERROR -- DELETE TABLE LOSES
649 ASCII /
\7f\ 5/ ; ITS SOFTWARE DISPLAY
664 ASCII /
\eK/ ; TELERAY
677 IFN <.-EOLSTR>-NTTYPE,PRINTC /ERROR -- END OF LINE TABLE LOSES
684 PUSHJ P,PSOFT ; ITS SOFTWARE
686 PUSHJ P,PVT52 ; HP2640
698 PUSHJ P,PVT52 ; VT100
699 PUSHJ P,PVT52 ; TELERAY
712 IFN <.-POSTAB>-NTTYPE,PRINTC /ERROR -- ABSOLUTE POSITION TABLE LOSES
718 ; ROUTINES FOR ABSOLUTE POSITIONING ON TENEX/TOPS-20
740 ADDI A,40 ; MUDDLE PAGES START AT 0, VT52 AT 1
743 ADDI A,40 ; DITTO COLUMNS
764 PUTCHR: AOS CHRCNT(E) ;COUNT THIS CHARACTER
765 IBP D ;BUMP BYTE POINTER
769 CAIG 0,(C) ;DONT SKIP IF BUFFER FULL
771 IFN ITS, CAIG 0,@D ;DONT SKIP IF BUFFER FULL
772 PUSHJ P,BUFULL ;GROW BUFFER
774 CAIN A,37 ; CHANGE EOL TO CRLF
777 DPB A,D ;CLOBBER BYTE POINTER IN
778 MOVE C,SYSCHR(E) ; FLAGS
784 CAIE A,15 ; IF CR INPUT, FOLLOW WITH LF
789 ; BUFFER FULL, GROW THE BUFFER
791 BUFULL: MOVEM D,BYTPTR(E)
792 PUSH TP,$TCHAN ;SAVE B
794 PUSH P,A ; SAVE CURRENT CHAR
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
803 HLRE 0,E ;RECOMPUTE 0
805 HRRI E,(B) ; POINT TO DEST
815 ; SUBROUTINE TO FLUSH BUFFER
817 RRESET: SETZM LSTCH(B) ; CLOBBER RE-USE CHAR
818 MOVE E,BUFRIN(B) ;GET AUX BUFFER
820 MOVEI D,N.IMED+N.IME1
822 MOVE D,[010700,,BYTPTR(E)] ;RESET BYTE POINTER
824 MOVE D,CHANNO(B) ;GOBBLE CHANNEL
826 SETZM CHNCNT(D) ; FLUSH COUNTERS
829 XCT D ;RESET ITS CHANNEL
832 MOVEI A,100 ; TTY IN JFN
835 SETZM EXBUFR(B) ; CLOBBER STAKED BUFFS
836 MOVEI C,BUFSTR-1(B) ; FIND D.W.
844 ; SUBROUTINE TO ESTABLISH ECHO IOINS
846 MFUNCTION ECHOPAIR,SUBR
850 GETYP A,(AB) ;CHECK ARG TYPES
852 CAIN A,TCHAN ;IS A CHANNEL
853 CAIE C,TCHAN ;IS C ALSO
854 JRST WRONGT ;NO, ONE OF THEM LOSES
856 MOVE A,1(AB) ;GET CHANNEL
857 PUSHJ P,TCHANC ; VERIFY TTY IN
858 MOVE D,3(AB) ;GET OTHER CHANNEL
859 HRRZ 0,-2(D) ; GET BITS
864 MOVE B,BUFRIN(A) ;GET A'S AUX BUFFER
866 HRLZ C,CHANNO(D) ; GET CHANNEL
868 IOR C,[.IOT A] ; BUILD AN IOT
869 MOVEM C,ECHO(B) ;CLOBBER
872 MOVE B,1(AB) ;RETURN 1ST ARG
875 TCHANC: HRRZ 0,-2(A) ; GET BITS
880 LDB C,[600,,STATUS(A)] ;GET A CODE
881 CAILE C,2 ;MAKE SURE A TTY FLAVOR DEVICE
889 LDB A,[221100,,B] ;DEVICE TYPE FIELD
893 JRST WRONGC ;NOT A TTY, HOPE WE DON'T GET HERE IN LISTEN
906 MOVEI A,-1 ; TERMINAL; STAYS HERE THROUGHOUT ROUTINE
907 MOVEI 2,175100 ; MAGIC BITS (SEE TENEX MANUAL)
909 RFMOD ; LETS FIND SCREEN SIZE
911 LDB B,[220700,,B] ; GET PAGE WIDTH
913 MOVEI B,80. ; MUST BE VIRTUAL, SO MAKE IT 80.
915 LDB B,[310700,,STATUS(C)] ; AND LENGTH
917 SKIPE OPSYS ; CHECK FOR TOPS-20
918 JRST NONVTS ; ONLY TOPS-20 CAN HAVE VTS
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
926 NONVTS: PUSH P,C ; IDIOT GETTYP CLOBBERS C
927 GTTYP ; FIND TERMINAL TYPE
929 HASVTS: HRLM B,STATUS(C) ; USED TO FIGURE OUT DISPLAY STUFF
932 MOVEM B,STATUS(C) ; SET UP INCHAN TOO
934 AND B,[036377,,-1] ; CHANGE FOR ^@, ^A AND ^D (FOR NOW)
935 SFCOC ; AND RESUSE IT
941 TTYOP2: .SUSET [.RTTY,,C]
943 JUMPL C,TTYNO ; DONT HAVE TTY
948 DOTCAL OPEN,[[1000,,TTYIN],[[SIXBIT /TTY /]]]
950 DOTCAL OPEN,[[1000,,TTYOUT],[[SIXBIT /TTY /]],[5000,,1]]
952 DOTCAL TTYGET,[[1000,,TTYOUT],[2000,,0],[2000,,A],[2000,,B]]
954 DOTCAL TTYSET,[[1000,,TTYOUT],MODE1,MODE2,B]
957 SETCHN: MOVE B,TTICHN+1 ;GET CHANNEL
958 MOVEI C,TTYIN ;GET ITS CHAN #
960 .STATUS TTYIN,STATUS(B) ;CLOBBER STATUS
962 MOVE B,TTOCHN+1 ;GET OUT CHAN
965 .STATUS TTYOUT,STATUS(B)
966 SETZM IMAGFL ;RESET IMAGE MODE FLAG
968 DOTCAL RSSIZE,[[1000,,TTYOUT],[2000,,C],[2000,,D]]
969 FATAL .CALL RSSIZE LOSSAGE
974 ; HERE IF TTY WONT OPEN
982 DOTCAL RCPOS,[[CHANNO(B)],[2000,,A]]
996 GETCRF: MOVE A,LINPOS(B)
1001 MTYI: SKIPN DEMFLG ; SKIP IF DEMON
1002 SKIPE NOTTY ; SKIP IF HAVE TTY
1003 FATAL TRIED TO USE NON-EXISTANT TTY
1005 ; TRY TO AVOID HANGING IN .IOT TO TTY
1008 DOTCAL IOT,[[1000,,TTYIN],[A],[5000,,1000]]
1017 INMTYO: ; BOTH ARE INTERRUPTABLE
1023 ; NON-INTERRUPTABLE VERSION, FOR ECHO INSTRUCTION AND SUCHLIKE
1025 POPJ P, ; IGNORE, DONT HAVE TTY
1028 CAIN A,177 ;DONT OUTPUT A DELETE
1031 MOVEI B,0 ; SETUP CONTROL BITS
1032 TLNE 0,CNTLPC ; SKIP IF ^P MODE SWITCH IS OFF
1033 MOVEI B,%TJDIS ; SWITCH ON TEMPORARY ^P MODE
1034 DOTCAL IOT,[[1000,,TTYOUT],[A],[4000,,B]]
1041 ; HERE FOR TYO TO ANY TTY FLAVOR DEVICE
1045 HRRZ 0,IOINS-1(B) ; GET FLAG
1047 PUSHJ P,REASCI ; RE-OPEN TTY
1052 CAIE A,177 ; DONE OUTPUT A DELETE
1077 WRONGC: FATAL TTYECHO--NOT ON A TTY-TYPE CHANNEL
1081 ; HERE TO HANDLE TTY BLOCKING AND UNBLOCKING
1083 TTYBLK: PUSH TP,$TCHAN
1086 PUSH P,E ; SAVE SOME ACS
1088 MOVE A,CHANNO(B) ; GET CHANNEL NUMBER
1089 SOSG CHNCNT(A) ; ANY PENDING CHARS
1094 .SUSET [.SIFPI,,0] ; SLAM AN INT ON
1096 TTYBL1: MOVE C,BUFRIN(B)
1097 MOVE A,SYSCHR(C) ; GET FLAGS
1099 TRZE A,N.IME1 ; IF WILL BE
1100 TRO A,N.IMED ; THE MAKE IT
1103 MOVE A,[.CALL TTYIOT] ; NON-BUSY WAIT (IF CHAR READ, LEAVE IN BUFFER
1104 ; TO LET IT BE READ AT INTERRUPT LEVEL)
1109 MOVE A,[PUSHJ P,TNXIN]
1113 PUSH TP,CHQUOTE BLOCKED
1122 REBLK: MOVEI A,-1 ; IN CASE SLEEPING
1123 XCT WAITNS(B) ; NOW WAIT
1126 IFN ITS, JRST CHRSNR ; SNARF CHAR
1127 REBLK1: DISABLE ; FALL THROUG=> UNBLOCKED
1136 CHRSNR: SKIPN DEMFLG ; SKIP IF DEMON
1138 JRST REBLK ; NO, JUST RESET AND BLOCK
1139 .SUSET [.SIFPI,,[1_<TTYIN>]]
1140 JRST REBLK ; AND GO BACK
1148 ; HERE TO UNBLOCK TTY
1150 TTYUNB: MOVE A,WAITNS(B) ; GET INS
1151 CAMN A,[JRST REBLK1]
1153 MOVE A,[JRST REBLK1] ; LEAVE THE SLEEP
1158 PUSH TP,CHQUOTE UNBLOCKED
1162 MOVE B,(TP) ; RESTORE CHANNEL
1167 ; TENEX BASIC TTY I/O ROUTINE
1175 MFUNCTION TTYECHO,SUBR
1182 MOVE A,1(AB) ; GET CHANNEL
1183 PUSHJ P,TCHANC ; MAKE SURE IT IS TTY INPUT
1184 MOVE E,BUFRIN(A) ; EXTRA INFO BUFFER
1186 DOTCAL TTYGET,[CHANNO(A),[2000,,B],[2000,,C],[2000,,0]]
1190 MOVEI A,100 ; TTY JFN
1192 TRZ B,6000 ; TURN OFF ECHO
1194 GETYP D,2(AB) ; ARG 2
1195 CAIE D,TFALSE ; SKIP IF WANT ECHO OFF
1199 ANDCM B,[606060,,606060]
1200 ANDCM C,[606060,,606060]
1202 DOTCAL TTYSET,[CHANNO(A),B,C,0]
1209 MOVEI B,N.ECHO+N.CNTL ; SET FLAGS
1216 IOR B,[202020,,202020]
1217 IOR C,[202020,,200020]
1218 DOTCAL TTYSET,[CHANNO(A),B,C,0]
1225 MOVEI A,N.ECHO+N.CNTL
1231 ; USER SUBR FOR INSTANT CHARACTER SNARFING
1233 MFUNCTION UTYI,SUBR,TYI
1241 MOVE B,IMQUOTE INCHAN
1242 PUSHJ P,IDVAL ; USE INCHAN
1243 GETYP 0,A ; GET TYPE
1247 LDB 0,[600,,STATUS(B)]
1250 SKIPN A,LSTCH(B) ; ANY READ AHEAD CHAR
1251 JRST UTYI1 ; NO, SKIP
1254 TLZN A,400000 ; ! HACK?
1256 HRRM A,LSTCH(B) ; YES SAVE
1257 MOVEI A,"! ; RET AN !
1260 UTYI1: MOVE 0,IOINS(B)
1261 CAME 0,[PUSHJ P,GETCHR]
1266 MOVEI D,N.IME1+N.IMED
1267 IORM D,SYSCHR(C) ; CLOBBER IT IN
1268 DOTCAL TTYGET,[CHANNO(B),[2000,,A],[2000,,D],[2000,,0]]
1272 PUSH P,D ; SAVE THEM
1273 IOR D,[030303,,030303]
1274 IOR A,[030303,,030303]
1275 DOTCAL TTYSET,[CHANNO(B),A,D,0]
1278 SKIPE CHRCNT(C) ; ALREADY SOME?
1280 MOVE C,BUFRIN(B) ; GET BUFFER BACK
1286 MOVEI D,N.IME1+N.IMED
1291 DOTCAL TTYSET,[CHANNO(B),C,D,0]
1293 UTYI2: MOVEI B,(A) ]
1295 MOVE A,1(B) ;GET JFN FOR INPUT
1297 BIN ;SNARF A CHARACTER
1303 MFUNCTION IMAGE,SUBR
1305 JUMPGE AB,TFA ; 1 OR 2 ARGS NEEDED
1306 GETYP A,(AB) ;GET THE TYPE OF THE ARG
1307 CAIE A,TFIX ;CHECK IT FOR CORRECT TYPE
1308 JRST WTYP1 ;WAS WRONG...ERROR EXIT
1317 MOVE B,3(AB) ; GET CHANNEL
1318 IMAGE1: MOVE A,1(AB)
1324 LDB 0,[600,,STATUS(B)]
1325 CAILE 0,2 ; MUST BE TTY
1328 CAMN 0,[PUSHJ P,MTYO]
1330 CAME 0,[PUSHJ P,GMTYO]
1333 MOVE 0,CHANNO(B) ; SEE IF TTY
1339 DOTCAL IOT,[[5000,,2000],[CHANNO(B)],[A]]
1350 HRROI B,[ASCIZ /TTY:/]
1353 MOVE B,[074000,,102000]
1359 IMGOK: MOVE B,IMAGFL
1364 IMGEXT: MOVSI A,TFIX
1368 IMAGFO: PUSH TP,$TCHAN ;IMAGE OUTPUT FOR NON TTY
1371 HRRZ 0,-2(B) ; GET BITS
1376 PUSHJ P,GWB ; MAKE SURE CHANNEL HAS BUFFER
1377 MOVE A,(P) ; GET THE CHARACTER TO DO
1385 USEOTC: MOVSI A,TATOM
1386 MOVE B,IMQUOTE OUTCHAN
1395 IMGBLK: OUT+IMAGEM+UNIT,,(SIXBIT /TTY/)