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 TLZE C,N.ESC ; SKIP IF NOT ESCAPED
76 CAMN A,ESCAP(E) ; IF ESCAPE
77 TLO C,N.ESC ; REMEMBER
80 CAMN A,BRFCHR(E) ;BUFFER PRINT CHAR
81 JRST CLEARQ ;MAYBE CLEAR SCREEN
82 CAMN A,BRKCH(E) ;IS THIS A BREAK?
84 CAMN A,ERASCH(E) ;ARE IS IT ERASE?
85 JRST ERASE ;YES, GO PROCESS
86 CAMN A,KILLCH(E) ;OR KILL
89 INCHR2: PUSHJ P,PUTCHR ;PUT ACHAR IN BUFFER
90 INCHR3: MOVEM D,BYTPTR(E)
93 DONE: SKIPL A ; IF JUST BUFFER FORCE, SKIP
94 PUSHJ P,PUTCHR ; STORE CHAR
95 MOVEI A,N.IMED ; TURN OFF IMEDIACY
98 PUSH TP,$TCHAN ; SAVE CHANNEL
100 MOVE A,CHRCNT(E) ; GET # OF CHARS
105 PUSHJ P,IBLOCK ; GET CORE
108 MOVSI 0,TCHRS+.VECT. ; GET TYPE
109 MOVEM 0,(A) ; AND STORE
110 MOVEI D,-1(B) ; COPY PNTR
111 MOVE C,(P) ; CHAR COUNT
116 PUSHJ P,INCONS ; CONS IT ON
117 MOVE C,-2(TP) ; GET CHAN BACK
118 MOVEI D,EXBUFR(C) ; POINT TO BUFFER LIST
122 JRST .-3 ; GO UNTIL END
125 ; HERE TO BLT IN BUFFER
127 MOVE D,BUFRIN(C) ; POINT TO COMPLETED BUFFER
128 HRRZ C,(TP) ; START OF NEW STRING
129 HRLI C,BYTPTR+1(D) ; 1ST WORD OF CHARS
130 MOVE E,[010700,,BYTPTR(E)]
131 EXCH E,BYTPTR(D) ; END OF STRING
133 ADD E,(TP) ; ADD TO START
135 MOVE B,-2(TP) ; CHANNEL BACK
140 SUB TP,[4,,4] ; FLUSH JUNK
141 PUSHJ P,TTYUNB ; UNBLOCK THIS TTY
142 DONE1: IRP A,,[E,D,C,0]
147 ; HERE TO ERASE A CHARACTER
149 BARFC1: PUSHJ P,RUBALT ; CAN WE RUBOUT AN ALTMODE?
150 JRST BARFCR ; NO, C.R.
153 ERASE: SKIPN CHRCNT(E) ;ANYTHING IN BUFFER?
154 JRST BARFC1 ;NO, MAYBE TYPE CR
156 ERASAL: SOS CHRCNT(E) ;DELETE FROM COUNT
157 LDB A,D ;RE-GOBBLE LAST CHAR
159 LDB C,[600,,STATUS(B)] ; CHECK FOR DISPLAY
160 CAIE C,2 ; SKIP IF IT IS
163 HLRE C,STATUS(B) ; CONTAINS RESULT OF GTTYP
164 SKIPN DELSTR(C) ; INTERESTING DELETION METHOD?
166 JUMPGE C,TYPCHR ; DELETE BY ECHOING DELETED CHAR
167 SKIPN ECHO(E) ; SKIP IF ECHOABLE
169 PUSHJ P,CHRTYP ; FOUND OUT DISPLAY BEHAVIOR
170 SKIPGE C,FIXIM2(C) ; METHOD OF FLUSHING THIS CHARACTER
171 JRST (C) ; DISPATCH TO FUNNY ONES
173 NOTFUN: PUSHJ P,DELCHR ; DELETE ONE CHARACTER
174 SOJG C,.-1 ; AND LOOP UNTIL GOT THEM ALL
176 ; REJOINS HERE TO UPDATE BUFFER POINTER, ETC.
177 NECHO: ADD D,[70000,,0] ;DECREMENT BYTE POINTER
178 JUMPGE D,INCHR3 ;AND GO ON, UNLESS BYTE POINTER LOST
179 SUB D,[430000,,1] ;FIX UP BYTE POINTER
182 ; RUB OUT A CHARACTER BY ECHOING IT (NON-DISPLAYS)
183 TYPCHR: SKIPE C,ECHO(E)
187 ; SPECIAL HACKS FOR RUBBING OUT ON DISPLAYS
189 ; RUB OUT A LINE FEED
190 LFKILL: PUSHJ P,LNSTRV
193 LNSTRV: PUSH P,0 ; STORE USEFUL DATA
195 TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
198 MOVEI A,"U ; U , MOVE UP ONE LINE
204 HLRE A,STATUS(B) ; terminal type
206 MOVE A,1(B) ; DISPLAY IN VTS MODE
210 UPCRF: PUSHJ P,GETPOS ; HERE FOR DISPLAY STUFF IN IMAGE MODE
215 POP P,0 ; RESTORE USEFUL DATA
218 ; RUB OUT A BACK SPACE
219 BSKILL: PUSHJ P,GETPOS ; CURRENT POSITION TO A
220 PUSHJ P,SETPOS ; POSITION DISPLAY CURSOR
221 PUSH P,0 ; STORE USEFUL DATA
223 TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
226 MOVEI A,"L ; L , DELETE TO END OF LINE
239 CLECRF: MOVEI 0,EOLSTR(A)
242 CLEXIT: POP P,0 ; RESTORE USEFUL DATA
246 TBKILL: PUSHJ P,GETPOS
248 SUBI A,10 ; A -NUMBER OF DELS TO DO
256 ; ROUTINE TO DEL CHAR ON DISPLAY
257 DELCHR: PUSH P,0 ; STORE USEFUL DATA
259 TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
270 MOVEI B,.VTBEC ;BACKSPACE AND ERASE
274 DELCRF: MOVEI 0,DELSTR(A)
277 DELXIT: POP P,0 ;RESTORE USEFUL DATA
280 ; DELETE FOUR-CHARACTER LOSSAGES
282 FOURQ2: MOVEI C,2 ; FOR ^Z AND ^_
283 CAMN B,TTICHN+1 ; SKIP IF NOT CONSOLE TTY
285 CNOTFU: POPJ P,NOTFUN
287 ; HERE IF KILLING A C.R., RE-POSITION CURSOR
288 CRKILL: PUSHJ P,GETPOS ; COMPUTE LINE POS
292 ; HERE TO SET CURRENT CURSOR POSITION, USUALLY TO END OF LINE
293 ; A/ POSITION TO GO TO
294 SETPOS: PUSH P,0 ; STORE USEFUL DATA
296 TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
303 ADDI A,10 ; MINIMUM CURSOR POS
304 XCT ECHO(E) ; HORIZ POSIT AT END OF LINE
310 PUSH P,B ; VTS ABSOLUTE POSITIONING
314 HRL C,A ; LINE NUMBER
316 HRR C,A ; COLUMN NUMBER
319 HRLI B,(DP%AG1+DP%AG2)
325 ABPCRF: ADD 0,[SETZ POSTAB]
326 XCT @0 ; ROUTINES FOR ABSOLUTE POSITIONING (UGH)
328 ABPXIT: POP P,0 ; RESTORE USEFUL DATA
331 ; HERE TO CALCULATE CURRENT CURSOR POSITION
332 ; RETURNS A/ CURSOR POS (CORRESPONDS TO EOL, TOO)
334 MOVEI 0,0 ; COUNT OF CHARACTER POSITIONS
335 PUSH P,[010700,,BYTPTR(E)] ; POINT TO BUFFER
336 PUSH P,CHRCNT(E) ; NUMBER THEREOF
338 GETPO1: SOSGE (P) ; COUNT DOWN
340 ILDB A,-1(P) ; CHAR FROM BUFFER
341 CAIN A,15 ; SKIP IF NOT CR
342 MOVEI 0,0 ; C.R., RESET COUNT
343 PUSHJ P,CHRTYP ; GET TYPE
344 XCT FIXIM3(C) ; GET FIXED COUNT
348 GETPO2: MOVE A,0 ; RET COUNT
349 MOVE 0,-2(P) ; RESTORE AC 0
353 ; FIGURE OUT HOW MANY CHARACTER POSITIONS A CHARACTER TAKES
354 CHRTYP: MOVEI C,0 ; NUMBER OF FLUSHEES
355 CAILE A,37 ; SKIP IF CONTROL CHAR
358 PUSH TP,B ; SAVE CHAN
359 IDIVI A,12. ; FIND SPECIAL HACKS
360 MOVE A,FIXIML(A) ; GET CONT WORD
362 ROTC A,3(B) ; GET CODE IN B
365 MOVE B,(TP) ; RESTORE CHAN
369 ; TABLE OF HOW MANY OR HOW TO FIND OUT
378 ; TABLE OF WHAT TO ADD TO HPOS ON ENCOUNTERING CHARACTER
387 ; HORRIBLE KLUDGE TO COUNT SPACES FOR A TAB
388 CNTTAB: ANDCMI 0,7 ; GET COUNT INCUDING TAB HACK
393 ; TYPE TABLE FOR EACH CONTROL CHARACTER
394 FIXIML: 111111,,115641 ; CNTL @ABCDE,,FGHIJK
395 131111,,111111 ; LMNOPQ,,RSTUVW
396 112011,,120000 ; XYZ LBRAK \ RBRAK,,^ _
398 ; HERE TO KILL THE WHOLE BUFFER
400 KILL: PUSHJ P,RUBALT ; COULD WE RUB OUT ALT MODE
402 CLEARM CHRCNT(E) ;NONE LEFT NOW
403 MOVE D,[010700,,BYTPTR(E)] ;RESET POINTER
407 MOVE A,ERASCH(E) ;GET THE ERASE CHAR
408 CAIN A,177 ;IS IT RUBOUT?
410 PUSHJ P,CRLF1 ; PRINT CR-LF
413 ; SKIP IF CAN RUB OUT AN ALTMODE
414 RUBALT: PUSH TP,$TCHAN
416 HRRZ A,FSAV(TB) ; ARE WE IN READ ?
421 IFN ITS,CAIG A,53 ; SOMEWHAT HEURISTIC (WATCH OUT IN NEW VERSIONS!!!!!!)
424 HRRZ A,BUFSTR-1(B) ; IS BUFFER OF SAME RUN OUT?
426 MOVE B,IMQUOTE INCHAN
427 PUSHJ P,IDVAL ; REALLY CHECK IT OUT
435 MOVE D,[10700,,BYTPTR(E)]
439 ; CHECK WINNAGE OF BUFFER
454 MOVE D,[010700,,BYTPTR(E)]
459 RETREA: PUSHJ P,MAKACT
466 ; HERE TO CLEAR SCREEN AND RETYPE BUFFER
470 MOVE A,STATUS(B) ; FIGURE OUT CONSOLE TYPE
476 SKIPE CLRSTR(A) ; TRY IT ONLY ON DISPLAYS
478 PUSHJ P,CLR ; CLEAR SCREEN
480 ; HERE TO RETYPE BUFFER
482 BRF: MOVE C,[010700,,BYTPTR(E)] ;POINT TO START OF BUFFER
483 SKIPN ECHO(E) ;ANY ECHO INS?
488 IFE ITS,AOS LINPOS(B)
492 ILDB A,C ;GOBBLE CHAR
498 JRST BRF1 ;DO FOR ENTIRE BUFFER
504 ; ROUTINE TO CRLF ON ANY TTY
507 POPJ P, ; NO ECHO INS
515 CLR: SKIPN C,ECHO(E) ;ONLY IF INS EXISTS
519 TLO 0,CNTLPC ;SWITCH ON TEMPORARY ^P MODE
520 MOVEI A,20 ;ERASE SCREEN
534 CLRCRF: MOVEI 0,CLRSTR(A)
541 CLRXIT: POP P,0 ;RESTORE USEFUL DATA
553 STBOU1: HRLI 0,440700
568 ; SPECIAL CASE GOODIES FOR DISPLAY TERMINALS
570 NTTYPE==40 ; MAX TERMINAL TYPES SUPPORTED
573 ; HOW TO CLEAR SCREENS ON TOPS-20/TENEX
578 ASCII /
\7f\12/ ; ITS SOFTWARE
579 ASCII /
\1d\1e/ ; DATAMEDIA
580 ASCII /
\eH
\eJ/ ; HP2640
585 ASCII /
\eH
\eJ/ ; VT50
587 ASCII /
\e(
\7f/ ; GT40
589 ASCII /
\eH
\eJ/ ; VT52
592 ASCII /
\eH
\eJ/ ; VT100
593 ASCII /
\eH
\eJ/ ; TELERAY
606 IFN <.-CLRSTR>-NTTYPE,PRINTC /ERROR -- CLEAR SCREEN TABLE LOSES
609 ; HOW TO RUB OUT ON VARIOUS TERMINALS
614 ASCII /
\7f\v\7f\ 6/ ; ITS SOFTWARE DISPLAY
616 ASCII /
\eD
\eK/ ; HP2640
621 ASCII /
\eD
\eK/ ; VT50
625 ASCII /
\eD
\eK/ ; VT52
628 ASCII /
\eD
\eK/ ; VT100
629 ASCII /
\eD
\eK/ ; TELERAY
642 IFN <.-DELSTR>-NTTYPE,PRINTC /ERROR -- DELETE TABLE LOSES
650 ASCII /
\7f\ 5/ ; ITS SOFTWARE DISPLAY
665 ASCII /
\eK/ ; TELERAY
678 IFN <.-EOLSTR>-NTTYPE,PRINTC /ERROR -- END OF LINE TABLE LOSES
685 PUSHJ P,PSOFT ; ITS SOFTWARE
687 PUSHJ P,PVT52 ; HP2640
699 PUSHJ P,PVT52 ; VT100
700 PUSHJ P,PVT52 ; TELERAY
713 IFN <.-POSTAB>-NTTYPE,PRINTC /ERROR -- ABSOLUTE POSITION TABLE LOSES
719 ; ROUTINES FOR ABSOLUTE POSITIONING ON TENEX/TOPS-20
741 ADDI A,40 ; MUDDLE PAGES START AT 0, VT52 AT 1
744 ADDI A,40 ; DITTO COLUMNS
765 PUTCHR: AOS CHRCNT(E) ;COUNT THIS CHARACTER
766 IBP D ;BUMP BYTE POINTER
770 CAIG 0,(C) ;DONT SKIP IF BUFFER FULL
772 IFN ITS, CAIG 0,@D ;DONT SKIP IF BUFFER FULL
773 PUSHJ P,BUFULL ;GROW BUFFER
775 CAIN A,37 ; CHANGE EOL TO CRLF
778 DPB A,D ;CLOBBER BYTE POINTER IN
779 MOVE C,SYSCHR(E) ; FLAGS
785 CAIE A,15 ; IF CR INPUT, FOLLOW WITH LF
790 ; BUFFER FULL, GROW THE BUFFER
792 BUFULL: MOVEM D,BYTPTR(E)
793 PUSH TP,$TCHAN ;SAVE B
795 PUSH P,A ; SAVE CURRENT CHAR
798 ADDI A,100 ; MAKE ONE LONGER
799 PUSHJ P,IBLOCK ; GET IT
800 MOVE A,(TP) ;RESTORE CHANNEL POINTER
801 SUB TP,[2,,2] ;AND REMOVE CRUFT
802 MOVE E,BUFRIN(A) ;GET AUX BUFFER POINTER
804 HLRE 0,E ;RECOMPUTE 0
806 HRRI E,(B) ; POINT TO DEST
816 ; SUBROUTINE TO FLUSH BUFFER
818 RRESET: SETZM LSTCH(B) ; CLOBBER RE-USE CHAR
819 MOVE E,BUFRIN(B) ;GET AUX BUFFER
821 MOVEI D,N.IMED+N.IME1
823 MOVE D,[010700,,BYTPTR(E)] ;RESET BYTE POINTER
825 MOVE D,CHANNO(B) ;GOBBLE CHANNEL
827 SETZM CHNCNT(D) ; FLUSH COUNTERS
830 XCT D ;RESET ITS CHANNEL
833 MOVEI A,100 ; TTY IN JFN
836 SETZM EXBUFR(B) ; CLOBBER STAKED BUFFS
837 MOVEI C,BUFSTR-1(B) ; FIND D.W.
845 ; SUBROUTINE TO ESTABLISH ECHO IOINS
847 MFUNCTION ECHOPAIR,SUBR
851 GETYP A,(AB) ;CHECK ARG TYPES
853 CAIN A,TCHAN ;IS A CHANNEL
854 CAIE C,TCHAN ;IS C ALSO
855 JRST WRONGT ;NO, ONE OF THEM LOSES
857 MOVE A,1(AB) ;GET CHANNEL
858 PUSHJ P,TCHANC ; VERIFY TTY IN
859 MOVE D,3(AB) ;GET OTHER CHANNEL
860 HRRZ 0,-2(D) ; GET BITS
865 MOVE B,BUFRIN(A) ;GET A'S AUX BUFFER
867 HRLZ C,CHANNO(D) ; GET CHANNEL
869 IOR C,[.IOT A] ; BUILD AN IOT
870 MOVEM C,ECHO(B) ;CLOBBER
873 MOVE B,1(AB) ;RETURN 1ST ARG
876 TCHANC: HRRZ 0,-2(A) ; GET BITS
881 LDB C,[600,,STATUS(A)] ;GET A CODE
882 CAILE C,2 ;MAKE SURE A TTY FLAVOR DEVICE
890 LDB A,[221100,,B] ;DEVICE TYPE FIELD
894 JRST WRONGC ;NOT A TTY, HOPE WE DON'T GET HERE IN LISTEN
907 MOVEI A,-1 ; TERMINAL; STAYS HERE THROUGHOUT ROUTINE
908 MOVEI 2,175100 ; MAGIC BITS (SEE TENEX MANUAL)
910 RFMOD ; LETS FIND SCREEN SIZE
912 LDB B,[220700,,B] ; GET PAGE WIDTH
914 MOVEI B,80. ; MUST BE VIRTUAL, SO MAKE IT 80.
916 LDB B,[310700,,STATUS(C)] ; AND LENGTH
918 SKIPE OPSYS ; CHECK FOR TOPS-20
919 JRST NONVTS ; ONLY TOPS-20 CAN HAVE VTS
921 ERJMP NONVTS ; NO RTCHR JSYS, HENCE NO VTS
922 TLNN B,(TC%MOV+TC%CLR) ; HAS MINIMAL CHARACTERISTICS?
923 JRST NONVTS ; NO GOOD ENOUGH FOR US
924 MOVNI B,1 ; TERMINAL TYPE -1 IS VTS DISPLAY
927 NONVTS: PUSH P,C ; IDIOT GETTYP CLOBBERS C
928 GTTYP ; FIND TERMINAL TYPE
930 HASVTS: HRLM B,STATUS(C) ; USED TO FIGURE OUT DISPLAY STUFF
933 MOVEM B,STATUS(C) ; SET UP INCHAN TOO
935 AND B,[036377,,-1] ; CHANGE FOR ^@, ^A AND ^D (FOR NOW)
936 SFCOC ; AND RESUSE IT
942 TTYOP2: .SUSET [.RTTY,,C]
944 JUMPL C,TTYNO ; DONT HAVE TTY
949 DOTCAL OPEN,[[1000,,TTYIN],[[SIXBIT /TTY /]]]
951 DOTCAL OPEN,[[1000,,TTYOUT],[[SIXBIT /TTY /]],[5000,,1]]
953 DOTCAL TTYGET,[[1000,,TTYOUT],[2000,,0],[2000,,A],[2000,,B]]
955 DOTCAL TTYSET,[[1000,,TTYOUT],MODE1,MODE2,B]
958 SETCHN: MOVE B,TTICHN+1 ;GET CHANNEL
959 MOVEI C,TTYIN ;GET ITS CHAN #
961 .STATUS TTYIN,STATUS(B) ;CLOBBER STATUS
963 MOVE B,TTOCHN+1 ;GET OUT CHAN
966 .STATUS TTYOUT,STATUS(B)
967 SETZM IMAGFL ;RESET IMAGE MODE FLAG
969 DOTCAL RSSIZE,[[1000,,TTYOUT],[2000,,C],[2000,,D]]
970 FATAL .CALL RSSIZE LOSSAGE
975 ; HERE IF TTY WONT OPEN
983 DOTCAL RCPOS,[[CHANNO(B)],[2000,,A]]
997 GETCRF: MOVE A,LINPOS(B)
1002 MTYI: SKIPN DEMFLG ; SKIP IF DEMON
1003 SKIPE NOTTY ; SKIP IF HAVE TTY
1004 FATAL TRIED TO USE NON-EXISTANT TTY
1006 ; TRY TO AVOID HANGING IN .IOT TO TTY
1009 DOTCAL IOT,[[1000,,TTYIN],[A],[5000,,1000]]
1018 INMTYO: ; BOTH ARE INTERRUPTABLE
1024 ; NON-INTERRUPTABLE VERSION, FOR ECHO INSTRUCTION AND SUCHLIKE
1026 POPJ P, ; IGNORE, DONT HAVE TTY
1029 CAIN A,177 ;DONT OUTPUT A DELETE
1032 MOVEI B,0 ; SETUP CONTROL BITS
1033 TLNE 0,CNTLPC ; SKIP IF ^P MODE SWITCH IS OFF
1034 MOVEI B,%TJDIS ; SWITCH ON TEMPORARY ^P MODE
1035 DOTCAL IOT,[[1000,,TTYOUT],[A],[4000,,B]]
1042 ; HERE FOR TYO TO ANY TTY FLAVOR DEVICE
1046 HRRZ 0,IOINS-1(B) ; GET FLAG
1048 PUSHJ P,REASCI ; RE-OPEN TTY
1053 CAIE A,177 ; DONE OUTPUT A DELETE
1078 WRONGC: FATAL TTYECHO--NOT ON A TTY-TYPE CHANNEL
1082 ; HERE TO HANDLE TTY BLOCKING AND UNBLOCKING
1084 TTYBLK: PUSH TP,$TCHAN
1087 PUSH P,E ; SAVE SOME ACS
1089 MOVE A,CHANNO(B) ; GET CHANNEL NUMBER
1090 SOSG CHNCNT(A) ; ANY PENDING CHARS
1095 .SUSET [.SIFPI,,0] ; SLAM AN INT ON
1097 TTYBL1: MOVE C,BUFRIN(B)
1098 MOVE A,SYSCHR(C) ; GET FLAGS
1100 TRZE A,N.IME1 ; IF WILL BE
1101 TRO A,N.IMED ; THE MAKE IT
1104 MOVE A,[.CALL TTYIOT] ; NON-BUSY WAIT (IF CHAR READ, LEAVE IN BUFFER
1105 ; TO LET IT BE READ AT INTERRUPT LEVEL)
1110 MOVE A,[PUSHJ P,TNXIN]
1114 PUSH TP,CHQUOTE BLOCKED
1123 REBLK: MOVEI A,-1 ; IN CASE SLEEPING
1124 XCT WAITNS(B) ; NOW WAIT
1127 IFN ITS, JRST CHRSNR ; SNARF CHAR
1128 REBLK1: DISABLE ; FALL THROUG=> UNBLOCKED
1137 CHRSNR: SKIPN DEMFLG ; SKIP IF DEMON
1139 JRST REBLK ; NO, JUST RESET AND BLOCK
1140 .SUSET [.SIFPI,,[1_<TTYIN>]]
1141 JRST REBLK ; AND GO BACK
1149 ; HERE TO UNBLOCK TTY
1151 TTYUNB: MOVE A,WAITNS(B) ; GET INS
1152 CAMN A,[JRST REBLK1]
1154 MOVE A,[JRST REBLK1] ; LEAVE THE SLEEP
1159 PUSH TP,CHQUOTE UNBLOCKED
1163 MOVE B,(TP) ; RESTORE CHANNEL
1168 ; TENEX BASIC TTY I/O ROUTINE
1176 MFUNCTION TTYECHO,SUBR
1183 MOVE A,1(AB) ; GET CHANNEL
1184 PUSHJ P,TCHANC ; MAKE SURE IT IS TTY INPUT
1185 MOVE E,BUFRIN(A) ; EXTRA INFO BUFFER
1187 DOTCAL TTYGET,[CHANNO(A),[2000,,B],[2000,,C],[2000,,0]]
1191 MOVEI A,100 ; TTY JFN
1193 TRZ B,6000 ; TURN OFF ECHO
1195 GETYP D,2(AB) ; ARG 2
1196 CAIE D,TFALSE ; SKIP IF WANT ECHO OFF
1200 ANDCM B,[606060,,606060]
1201 ANDCM C,[606060,,606060]
1203 DOTCAL TTYSET,[CHANNO(A),B,C,0]
1210 MOVEI B,N.ECHO+N.CNTL ; SET FLAGS
1217 IOR B,[202020,,202020]
1218 IOR C,[202020,,200020]
1219 DOTCAL TTYSET,[CHANNO(A),B,C,0]
1226 MOVEI A,N.ECHO+N.CNTL
1232 ; USER SUBR FOR INSTANT CHARACTER SNARFING
1234 MFUNCTION UTYI,SUBR,TYI
1242 MOVE B,IMQUOTE INCHAN
1243 PUSHJ P,IDVAL ; USE INCHAN
1244 GETYP 0,A ; GET TYPE
1248 LDB 0,[600,,STATUS(B)]
1251 SKIPN A,LSTCH(B) ; ANY READ AHEAD CHAR
1252 JRST UTYI1 ; NO, SKIP
1255 TLZN A,400000 ; ! HACK?
1257 HRRM A,LSTCH(B) ; YES SAVE
1258 MOVEI A,"! ; RET AN !
1261 UTYI1: MOVE 0,IOINS(B)
1262 CAME 0,[PUSHJ P,GETCHR]
1267 MOVEI D,N.IME1+N.IMED
1268 IORM D,SYSCHR(C) ; CLOBBER IT IN
1269 DOTCAL TTYGET,[CHANNO(B),[2000,,A],[2000,,D],[2000,,0]]
1273 PUSH P,D ; SAVE THEM
1274 IOR D,[030303,,030303]
1275 IOR A,[030303,,030303]
1276 DOTCAL TTYSET,[CHANNO(B),A,D,0]
1279 SKIPE CHRCNT(C) ; ALREADY SOME?
1281 MOVE C,BUFRIN(B) ; GET BUFFER BACK
1287 MOVEI D,N.IME1+N.IMED
1292 DOTCAL TTYSET,[CHANNO(B),C,D,0]
1294 UTYI2: MOVEI B,(A) ]
1296 MOVE A,1(B) ;GET JFN FOR INPUT
1298 BIN ;SNARF A CHARACTER
1304 MFUNCTION IMAGE,SUBR
1306 JUMPGE AB,TFA ; 1 OR 2 ARGS NEEDED
1307 GETYP A,(AB) ;GET THE TYPE OF THE ARG
1308 CAIE A,TFIX ;CHECK IT FOR CORRECT TYPE
1309 JRST WTYP1 ;WAS WRONG...ERROR EXIT
1318 MOVE B,3(AB) ; GET CHANNEL
1319 IMAGE1: MOVE A,1(AB)
1325 LDB 0,[600,,STATUS(B)]
1326 CAILE 0,2 ; MUST BE TTY
1329 CAMN 0,[PUSHJ P,MTYO]
1331 CAME 0,[PUSHJ P,GMTYO]
1334 MOVE 0,CHANNO(B) ; SEE IF TTY
1340 DOTCAL IOT,[[5000,,2000],[CHANNO(B)],[A]]
1351 HRROI B,[ASCIZ /TTY:/]
1354 MOVE B,[074000,,102000]
1360 IMGOK: MOVE B,IMAGFL
1365 IMGEXT: MOVSI A,TFIX
1369 IMAGFO: PUSH TP,$TCHAN ;IMAGE OUTPUT FOR NON TTY
1372 HRRZ 0,-2(B) ; GET BITS
1377 PUSHJ P,GWB ; MAKE SURE CHANNEL HAS BUFFER
1378 MOVE A,(P) ; GET THE CHARACTER TO DO
1386 USEOTC: MOVSI A,TATOM
1387 MOVE B,IMQUOTE OUTCHAN
1396 IMGBLK: OUT+IMAGEM+UNIT,,(SIXBIT /TTY/)