2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
4 ;;; This program is free software; you can redistribute it and/or
5 ;;; modify it under the terms of the GNU General Public License as
6 ;;; published by the Free Software Foundation; either version 2 of the
7 ;;; License, or (at your option) any later version.
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ;;; General Public License for more details.
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program; if not, write to the Free Software
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 OVHMTR TTY ;MISC TTY CODE
25 ;FIRST FILE NAME MUST BE TTY NUMBER (NOT CHARACTERS)
27 SPYO: JUMPN D,OPNL12 ;ONLY UNIT ASCII INPUT ALLOWED
32 MOVEM E,IOCHST-IOCHNM(R)
38 ;A HAS LH OF IOCHNM =TTY #
40 SPYI: MOVE T,IOCHST-IOCHNM(R) ;POINTER TO INPUT BUFFER
45 SPYILL: CAMN T,TIIP(A)
49 HRRM T,IOCHST-IOCHNM(R)
50 ILDB W,IOCHST-IOCHNM(R)
54 MOVEM T,IOCHST-IOCHNM(R)
57 ;.CALL RFNAME on a SPY channel. A contains LH(IOCHNM) = TTY #
58 SPYRCH: MOVEI B,(A) ;FN1 is TTY #
66 ;3.1=0 => INPUT =1 => OUTPUT (FROM PROGRAM POINT OF VIEW)
67 ;3.2=0 => UNIT =1 => BLOCK
69 ;3.3=0 => FULL DUPLEX =1 => HALF DUPLEX
70 ;3.4=1 => DON'T HANG ON INPUT IOTS, INPUT -1 INSTEAD (IGNORED ON OUTPUT OPEN)
71 ;3.5=1 => WANT TO GET %TDORS ON OUTPUT RESET.
72 ;BIT 3.5 NOTICED ON OUTPUT, TOO, BUT THAT'S NO FEATURE?
74 STTYO: HRRZ I,USTYN(U)
75 JUMPN I,STTYO3 ;JUMP IF STY ALREADY OPEN
76 PUSHJ P,SWTL ;LOCK STY OPEN SWITCH
78 MOVE I,[-NSTTYS,,NFSTTY]
80 STTYO1: TDNE TT,STYSTS-NFSTTY(I) ;SKIP ON FREE SLOT
81 STTYO5: AOBJN I,STTYO1
82 JUMPGE I,OPNL6 ;NO SLOTS. GIVE DEVICE FULL
83 SKIPGE TTYSTA(I) ;SKIP IF CONSOLE FREE MSG NOT TYPED.
84 SKIPE TTNTO(I) ;SKIP IF NOT OPEN.
86 MOVEI I,(I) ;We want to compare left half
87 CAMLE I,STYMAX ;If we're limiting STY's, is this over our
88 JRST OPNL6 ; limit? If so, give DEVICE FULL
89 HRRM I,USTYN(U) ;STORE TTY NUMBER OF STY
91 SETZM STYNTO-NFSTTY(I)
92 SETZM STYMSK-NFSTTY(I)
94 MOVEM TT,STYSTS-NFSTTY(I) ;SET IN USE BIT
95 MOVSI TT,(<.BM ($TTISP)>+<.BM ($TTOSP)>)
96 ANDCAM TT,TTYTYP(I) ;RESET SPEEDS TO ZERO
98 PUSHJ P,NCNSSP ;MAKE THE TTY A PRINTING TTY.
99 PUSHJ P,TTYIN1 ;INIT THE TTYOPT AND TTYCOM USER OPTION BITS.
100 PUSHJ P,STYIR1 ;FLUSH TTY'S OUTPUT BUFFER.
101 PUSHJ P,STYOR1 ;AND ITS INPUT BUFFER.
102 PUSHJ P,LSWPOP ;UNLOCK STY OPEN SWITCH
104 HRRM U,STYSTS-NFSTTY(I)
105 MOVE T,UTMPTR(U) ;Check out this tree
106 CAIE T,SYSRCE-1 ;Is this a top-level non-console tree,
107 CAIN T,SYSRCE ;or a system demon?
108 JRST STTYO3 ; Yes, don't print on console.
109 ; since TELSER, etc., logs in
110 MOVEI T,(I) ;Get TTY number
111 HRLI T,[ASCIZ / STYOPN /]
112 PUSHJ P,SGWAIT ;Ask SYSJOB to print the info
113 MOVE T,JNAME(U) ;Add the JNAME to the info
114 MOVEM T,SLGIV+2 ;to be printed
116 STTYO3: JUMPL D,[MOVSI TT,%SSOHG ;JUMP IF OPENING FOR OUTPUT
119 DPB TT,[400100,,STYSTS-NFSTTY(I)] .SEE %SSHDX
120 DPB TT,[$TOHDX,,TTYOPT(I)]
123 IORM TT,STYSTS-NFSTTY(I)
126 IORM TT,STYSTS-NFSTTY(I)
128 SUBI J,IOCHNM(U) ;CHANNEL BEING OPENED FOR INPUT ON
130 SKIPL D ;SKIP IF OUTPUT
131 IORM J,STYMSK-NFSTTY(I)
132 SKIPGE D ;SKIP IF INPUT
133 IORM J,STYOMS-NFSTTY(I)
135 HRLZ A,I ;LH OF IOCHNM GETS STY NUMBER
142 ;ENTRY FOR OPEN OF PSEUDO-TTY AS SNM OR STN
143 STTYOA: JUMPL I,OPNL1
149 MOVE TT,STYSTS-NFSTTY(I) ;SKIP IF IN USE
151 JRST STTYO4 ;OK TO OPEN IF FREE
153 JRST OPNL10 ;DIFFERENT USER HAS IT OPEN
157 JRST STTS ;STY INPUT SIOT ROUTINE.
158 ;PSEUDO-TTY INPUT ROUTINE. RETURNS CHAR WITHOUT PARITY BIT
160 STTYIA: SKIPGE TTYOAC(I) ;SKIP IF ANY CHARS AVAIL (MAYBE)
171 JRST STTYI2 ;REALLY NO CHARS AVAIL
173 MOVSI R,%SSONT ;FOR TTYO INT TO STYI
174 JRST STTYIC ;INT CLEAR
176 STTYI2: CONO PI,TTYON
177 STTYI1: SKIPGE STYSTS-NFSTTY(I)
178 JRST STTYI3 ;DON'T HANG
184 TLO E,100000 .SEE INBTCH ;UNHANG BLOCK MD IOT IMMEDIATELY.
185 JRST POPJ1 ;UNHANG SIOT IMMEDIATELY.
187 ;STY INPUT SIOT; GOES 1 WORD AT A TIME, WHATEVER THE USER'S BYTE SIZE.
188 STTS: XCTR XRW,[SKIPG E,(C)]
189 JRST POPJ1 ;RETURN AT ONCE IF NO CHARS WANTED BY USER.
190 PUSH P,B ;SAVE ADDRS OF USER'S B.P. AND COUNT.
192 STTSA: SKIPGE TTYOAC(I)
193 JRST STTS4 ;NO INPUT AVAILABLE.
194 STTS2: UMOVE B,@-1(P)
195 STTS1: XCTR XRW,[MOVES D,(B)]
196 ;IT IS ASSUMED THAT E HAS THE # OF CHARS THE USER WANTS.
198 MOVEM D,STYICH ;STORE THE WORD THE USER'S B.P. POINTS AT.
201 IDIV C,D ;HOW MANY MORE CHARS GO IN THIS WORD?
203 PUSH P,B ;SAVE STARTING B.P. AND # CHARS FITTING IN WORD.
204 HRRI B,STYICH ;SET UP TO STORE CHARS AT APPRO. PLACE IN STYICH.
207 MOVE C,E ;GET MIN OF # CAHRS FITTING IN WORD AND # CHARS USER WANTS.
208 MOVEM C,DBBCC ;THAT'S HOW MANY CHARS WE CAN ACCEPT THIS TIME.
210 PUSHJ P,TYP ;FILL UP STYICH WITH CHARS, VIA DBBBP.
211 POP P,B ;NOTE E HAS -<# CHARS GOBBLED>
212 MOVE D,STYICH ;GET USER'S WORD, WITH CHARS STUCK IN IT.
213 UMOVEM D,(B) ;STORE IT WHERE IT CAME FROM.
214 XCTR XRW,[ADDB E,@(P)] ;UPDATE COUNT BY -<# CHARS OBTAINED>.
215 HLL B,DBBBP ;UPDATE B.P. TO THE L.H. CORRESP. TO CHARS STORED IN STYICH.
217 SKIPE DBBCC ;DID WE GET AS MANY CHARS AS WE WANTED?
218 JRST STTS3 ;NO, SO EITHER RETURN OR HANG UP.
220 JUMPG E,STTS7 ;USER WANTS MORE CHARS => TRANSFER ANOTHER WORD.
227 ;COME HERE DURING STY INPUT SIOT IF USER WANTS CHARS BUT THERE ARE NONE.
229 STTS4: SKIPGE STYSTS-NFSTTY(I)
230 JRST STTS5 ;DON'T HANG MODE.
245 BSTTYW: MOVSI T,%SSOHG ;BIT ON SAYS DONT HANG
246 TDNE T,STYSTS-NFSTTY(I)
247 JRST BSTTYX ;J TO NOT HANG. CHARS MAY BE LOST
250 PUSHJ P,UFLS ;HANG UNTIL ROOM IN INPUT BUFFER
251 BSTTYX: CONO PI,TTYOFF
257 STTYIC: ANDCAM R,STYSTS-NFSTTY(I) ;CALLED BY STTYI ABOVE ALSO
260 ANDCAM R,IFPIR(U) ;FLUSH ANY OUTPUT INTERRUPT
285 STYOCL: SUBI R,IOCHNM(U)
287 ANDCAM B,STYOMS-NFSTTY(A)
291 STYICL: SUBI R,IOCHNM(U)
293 ANDCAM B,STYMSK-NFSTTY(A)
294 STYCL: SOSE STYNTO-NFSTTY(A)
296 STYCL1: PUSHJ P,TTYLFC ;LEAVE COM. MODE, PUT TTY # IN I.
298 PUSHJ P,NSTYN0 ;DISCONNECT ANY NET SOCKETS FROM THE STY
301 CONO PI,TTYON#200_<-APRCHN> ;LEAVE CLOCK OFF.
303 JRST STYOC8 ;TTY NOT IN USE.
305 JRST STYOC9 ;OPEN AS DEVICE, NOT AS CONSOLE.
309 JRST STYOC3 ;NOT TOP LEVEL
314 AOS STYNTO-NFSTTY(I) ;IN CASE WE PCLSR, PREVENT JRST 4,.
316 CAME U,USER ;DON'T GET INTO LOOP AT ALOGO1
317 PUSHJ P,ALOGOUT ;TELL SYS JOB TO FLUSH THE TREE UNDER THE STY.
321 STYOC5: PUSHJ P,STYIR1 ;FLUSH TTY OUTPUT BUFFER.
322 STYOC9: SETZM STYSTS-NFSTTY(I)
323 CAIN I,@USTYN(U) ;IF HE'S CLOSING HIS STY:, SAY HE HAS NONE.
327 STYOC8: SKIPGE TTYSTA(I) ;IN TRANSIENT STATE BETWEEN USAGE AND NOT?
328 JRST STYOC5 ;NO, REALLY FREE, SIMPLE.
337 STYOCF: SKIPGE TTYSTS(T) ;IF NOW IN USE
338 SKIPGE TTYSTA(T) ;OR COMPLETELY FREE,
339 AOS (P) ;THEN NO LONGER IN TRANSIENT STATE.
342 ;STY OUTPUT .CALL FINISH
343 STYFIN: SKIPE TICC(A) ;WAIT UNTIL CORRESPONDING INPUT BUFFER IS EMPTY
347 ;STY OUTPUT .CALL WHYINT
348 STOWHY: MOVEI A,%WYSTO ;NULL ROUTINE FOR NOW
351 ;STY INPUT .CALL WHYINT
352 STIWHY: MOVEI A,%WYSTI ;NULL ROUTINE FOR NOW
355 ;STY INPUT RESET. DOES TTY OUTPUT RESET, WITH THE TTY'S OWNER STOPPED.
357 STYIR1: CONO PI,TTYOFF
359 JRST STYIR2 ;TTY IS FREE => NO PROBLEM.
361 PUSHJ P,RPCLSR ;ELSE MUST MAKE SURE ITS OWNER ISN'T TYPING OUT.
363 XOR B,TTYSTS(I) ;WE MIGHT HAVE BEEN DELAYED - HAS TTY MOVED AROUND?
365 JRST STYIR4 ;NO; THE GUY WAS STOPPED WHILE STILL ITS OWNER.
366 PUSHJ P,UPCLSR ;YES; UNSTOP GUY WE STOPPED,
367 JRST STYIR1 ;THEN GO STOP THE NEW OWNER.
369 STYIR4: PUSH P,A ;SAVE JOB STOPPED
370 PUSHJ P,STYIR2 ;ACTUALLY DO THE RESET OF TTY OUTPUT
372 JRST UPCLSR ;THEN UNSTOP THE TTY'S OWNER
374 STYIR2: SETOM TTYOAC(I) ;WE WILL NO LONGER BE LOOKING FOR TTY'S OUTPUT.
375 JRST TYORS1 ;DO THE TTY OUTPUT RESET AND TURN ON PI CHANNELS.
379 STYOR1: CONO PI,TTYOFF
380 PUSHJ P,TYIRS1 ;TURNS INTO TTY INPUT RESET.
383 ;STY OUTPUT STATUS - BIT 2.1 => BUFFER FULL, 2.2 => EMPTY.
386 IORI D,1_<9+1> ;BUFFER EMPTY.
388 IORI D,1_9 ;ALMOST FULL.
391 ;STY INPUT STATUS - THE SAME 2 BITS.
396 IORI D,1_<9+1> ;EMPTY.
399 ;"STYGET" SYSTEM CALL. 1 ARG, A TTY SPECIFYER.
400 ;1ST VALUE IS STYSTS WORD (RH IS JOB NUMBER OF OWNER OF STY). 0 FOR FREE STY.
401 ; %SSHNG AND %SSOHG BITS MAY BE INTERESTING.
402 ;2ND VALUE IS JOB THAT OWNS CORRESP. TTY (OR -1 IF TTY FREE).
403 ;3RD VALUE IS -1 IF TTY NOT CONSOLE; ELSE JOB NUMBER OF TOP OF TREE IN RH
404 ; AND BIT 4.8 SET IFF IT IS LOGGING OUT.
405 ; AND BIT 4.7 SET IF IT IS LOGGED IN.
407 ; 1 IF TTY OWNER IS IN TYO WAIT
408 ; SIGN IF HE'S IN TYI WAIT.
410 ; 4.9 => TTY INPUT AVAILABLE
411 ; 4.8 => TTY OUTPUT BUFFER HAS ROOM
412 ;6TH VALUE IS TTYSTA WORD
414 NSTYGT: JSP J,ATTYCI ;DECODE A TTY-SPECIFYER IN A.
418 TRNN TT,%TYSTY ;IF SPEC'D TTY ISN'T ASSOCIATED WITH A STY, IT HAS NO STYSTS WORD.
420 HRRZ A,STYSTS-NFSTTY(I)
421 IDIVI A,LUBLK ;NUMBER OF JOB USING THE STY.
422 HLL A,STYSTS-NFSTTY(I) ;AND SOME RANDOM BITS.
423 NSTYG3: SETOB B,C ;B GETS # OF JOB THAT HAS TTY, OR -1.
424 ;C GETS (IF TTY IS CONSOLE, JOB # OF TOP OF TRREE, ELSE -1).
425 SETZB D,E ;D, E SHOULD GET 0 IF NO JOB HAS TTY.
427 JUMPL B,NSTYG1 ;JUMP IF CONSOLE NOT IN USE.
428 IDIVI B,LUBLK ;ELSE GET JOB NUMBER OF JOB USING IT.
430 TLNN D,%TSCNS ;TTY NOT CONSOLE => DON'T REPLACE THE -1 IN C WITH ANYTHING.
433 SKIPL D,SUPPRO(C) ;ELSE TRACE SUPPRO'S TO TOP OF TREE.
438 IDIVI C,LUBLK ;GET JOB # OF TOP OF TREE.
445 HRRZ TT,FLSINS(TT) ;WHAT VARIABLE IS FLSINS OF JOB OWNING TTY WAITING ON?
446 CAIE TT,TICC(I) ;RETURN IN D SETZ IFF JOB IS IN TYI WAIT,
450 MOVEI D,1 ;OR 1 IF JOB IS IN TYO WAIT; ELSE 0.
451 NSTYG1: SKIPE TICC(I)
460 ;.CALL STLGET - GET INFO FROM SERVER TELNET
463 ; Val 1: XJNAME of server telnet
464 ; Val 2: TRMNAM of server telnet (has sixbit name of host)
465 ; Val 3: SNAME of server telnet
466 ; Val 4: STY control bits,,STY owner idx
474 SKIPN T,STYSTS-NFSTTY(I) ;Get STY status bits,,STY user.
480 IDIVI D,LUBLK ;Make it into user index.
481 HLL D,T ;Stuff STY status bits in LH.
485 SUBTTL .ATTY, .DTTY - PASS CONTROL OF TTY
487 NATTY: MOVE J,A ;.CALL ATTY
488 JSP T,NCRUI2 ;DECODE JOBSPEC BUT DON'T SET DIELOK
492 JRST OPNL34 ;SORRY, I/O BUS MPXR IS NOT THAT HAIRY
496 JRST OPNL31 ;NOT DIRECT INFERIOR (CAN'T MODIFY JOB)
502 AATTY: HLRZ A,(R) ;A HAS INFERIOR'S USER INDEX
504 SKIPL CLSTB(B) .SEE %CLSU ;SKIP IF USER OPEN ON CHANNEL
506 NATTY1: MOVE TT,APRC(A)
507 TLNE TT,BULGOS ;REFUSE TO GIVE TTY TO A DYING JOB.
508 JRST OPNL42 ;JOB GOING AWAY
511 JUMPL I,AATT1 ;DOESNT HAVE TTY NOW
514 IORM A,TTYTBL(U) ;NO LONGER HAS TTY. STORE USER INDEX GIVEN TO
515 PUSHJ P,AATT6 ;A _ IDX OF USER TO RECEIVE TTY,
516 ;ALSO CHANGE ALL TTYTBL VARS THAT NEED IT.
518 PUSHJ P,AGBLT6 ;TAKE TTY FROM USER IN A (ME),
519 ;GIVE TO USER IN U (HIM)
520 ;CHANGES TTY VARS AND TTSTSV VARS.
521 ;ALSO SETS CHANNELS-OPEN MASKS.
522 ;TURNS ON ALL PI CHNLS.
526 AATT1: TLZN I,%TBDTY ;SAY OUR INFERIOR HAD IT WHEN TAKEN
527 JRST OPNL10 ;DEVICE NOT AVAILABLE, ALREADY GAVE TTY AWAY
530 PUSHJ P,AATT6 ;SET UP HIS VARS
533 ;CHANGE TTYTBL VARS OF ALL JOBS DOWN TO THE ONE GETTING THE TTY.
534 ;RETURN IN A, T, TT THE TTYSTS, TTYST1, TTYST2 SETTINGS FOR THAT JOB.
535 ;IF THAT JOB NEVER HAD THE TTY, INIT HIS TTSTSV VARS.
536 ;I HAS TTY #, U HAS RUNNING JOB.
537 AATT6: MOVE E,TTYTBL(A)
538 MOVSI T,%TSATY ;TELL THIS GUY TTY WAS TAKEN FROM HIM & RETURNED.
540 TLNE E,%TBDTY ;SKIP IF NOT TAKEN FROM ME
541 JRST AATT3 ;GUY IT WAS TAKEN FROM (I.E. HE HADN'T GIVEN IT TO SOMEONE ELSE)
545 AATT3: HRRZS I ;TTY NUMBER
547 TLZ A,%TSFRE+%TSLCZ ;CLEAR TTY NOT OPEN AND ^Z BITS
548 MOVEM A,TTSTSV+2(A) ;UPDATE SAVED TTY STATUS
551 ;SET UP TYIMSK AND TYOMSK. ARGS: TTY # IN I,
552 ;D -> 1ST IOCHNM WORD OF USER TO SET UP FOR.
553 ;MAKE LAST CHAR IN INPUT BFR AN ACTIVATION CHAR. TURN ON TTYCHN.
554 AATT8: SETZM TYOMSK(I)
557 HRLI D,A ;INDIRECTION POINTER TO INFERIOR'S IO CHANNELS
558 MOVSI A,-20 ;AOBJN POINTER
559 AATT9: MOVE B,@D ;GET IOCHNM IN B
560 JUMPGE B,AATT10 ;IF CHANNEL HAS CONSOLE BIT SET,
562 MOVE C,CHNBIT(A) ;GET THE BIT WE MIGHT WANT TO SET.
564 CAIN B,TYOBN ;IF TTY OUTPUT CHNL,
565 IORM C,TYOMSK(I) ;SET BIT IN OUTPUT MASK.
567 CAIN B,TYIBN ;IF INPUT, SET IN INPUT MASK.
569 AATT10: AOBJN A,AATT9 ;TRY NEXT CHANNEL OR CONTINUE IF DONE
570 JRST ATTYS1 ;ALL CHRS SO FAR ARE ACTIVATION CHRS
572 ADTTY: ;DON'T CLOBBER R (SEE AUCL2)
573 SDTTY: CONO PI,CLKOFF
575 JUMPGE A,CLKOJ1 ;I ALREADY HAVE IT
577 JRST CLKOJ1 ;I ALREADY DID A .DTTY AND SO DID MY SUPERIOR
579 ;LOOK FOR SUBJOB THAT HAS TTY, OR DOESN'T WANT TO GIVE TTY
580 ;AWAY IF IT GETS THE TTY.
581 AGBLT3: MOVE I,TTYTBL(A)
582 TLNE I,%TBDTY ;REACHED A JOB THAT DIDN'T GIVE TTY AWAY
583 JRST AGBLT1 ;THIS IMPLIES OUR SUPERIOR TOOK TTY AWAY.
584 JUMPL I,AGBLT2 ;IF THIS GUY GAVE IT AWAY THEN TRY THE ONE HE GAVE IT TO
585 HRRZS A ;A HAS IDX OF TTY OWNER; TAKE TTY FROM HIM.
586 PUSHJ P,RPCLSR ;TURNS CLOCK ON!
588 SKIPGE TTYTBL(A) ;DID TTY MOVE WHILE CLOCK WAS ON?
589 JRST [PUSHJ P,UPCLSR ;IF SO, START OVER
592 TLZ D,%TBCLR ;DON'T ALTER USER-SETTABLE BITS, BUT
593 TLO D,%TBNOT+%TBDTY ;TELL HIM HE HASN'T GOT TTY.
595 AOS (P) ;THE .DTTY SHOULD SKIP.
596 PUSH P,[UPCLSR] ;AFTER RESTARTING THE SUBJOB.
597 AGBLT6: ANDI I,-1 ;LH(TTYTBL) MAY BE NONZERO EVEN IF JOB HAS TTY!
599 TDNE D,TTYCOM(I) ;IF OLD JOB WAS WANTING LOCAL EDITING,
600 PUSHJ P,AGBLT5 ;TELL TERMINAL TO STOP IMMEDIATELY.
601 ANDCAM D,TTYCOM(I) ;ASSUME NEW JOB DOES NOT WANT LOCAL EDITING
602 ;AND SHOULD NOT SEE RESYNCHS (TOP-S).
603 MOVEI D,TTSTSV-1(A) ;SAVE CURRENT TTY STATUS IN
604 PUSH D,TTYST1(I) ;USER VARS OF USER GIVING AWAY THE TTY.
609 MOVE D,TPVB+TPLEN(TT)
612 DPB D,[$TBECL,,TTYTBL(A)]
614 EXCH U,A ;GET USER GIVING AWAY TTY IN U
615 MOVE D,TVVBN(U) ;SAVE THIS
616 PUSHJ P,TVBNCL ;CLEAR OUT CURRENT GUY (MAYBE CLEARING RUN GLITCH ON SCREEN)
617 MOVEM D,TVVBN(A);PASS THE BALL TO HIM
620 ;ENTRY FROM "ATTACH". GIVE TTY TO JOB W/ IDX IN U, WITHOUT
621 ;"TAKING" IT FROM ANY JOB. USED WHEN TTY HAD BEEN FREE; JOB, DISOWNED.
622 AGBLT4: HRROI D,TTSTSV+2(U)
623 POP D,TTYSTS(I) ;RESTORE THE TTY STATUS OF JOB GIVING TTY TO.
626 HRRM I,TTYTBL(U) ;INDICATE THAT IT HAS THE TTY
627 LDB H,[$TBECL,,TTYTBL(U)]
630 PUSHJ P,ASCML1 ;SET # COMMAND LINES FROM H
635 PUSH P,A ;GENERATE CHNLS-OPEN MASKS, CREATE AN
636 PUSHJ P,AATT8 ;ACTIVATION CHAR IF NEC, TURN ON PI.
639 AGBLT2: HRRZ A,TTYTBL(A)
642 AGBLT1: MOVSI A,%TBDTY ;TTY WAS TAKEN AWAY FROM US,
643 IORM A,TTYTBL(U) ;WHEN GIVEN BACK WILL STOP WITH THIS JOB.
646 ;TELL TERMINAL TO STOP DOING LOCAL EDITING IMMEDIATELY.
647 AGBLT5: MOVE H,TTYOPT(I)
649 POPJ P, ;DON'T EVEN TRY ON A TV -- TORM DOESN'T MEAN ANYTHING.
650 SKIPG TORM(I) ;WAIT FOR ROOM IN OUTPUT BUFFER.
655 PUSHJ P,TYOOU1 ;PUT CMD IN OUTPUT BFR,
658 XCT TTYST(I) ;AND TELL INT. LVL. ABOUT IT.
661 SUBTTL CNSSET, TTYSET, ETC. .CALLS FOR TTYS
663 ;DECODING TTY SPECIFIERS. CALL WITH JSP,J. MAY RETURN TO (J),
664 ;OR POPJ AND REPORT AN ERROR.
666 ;DECODE A TTY SPECIFIER, BUT DON'T CHECK FOR PERMISSION TO
667 ;USE THE TTY. ALWAYS RETURN IMMEDIATELY WITH LEGAL TTY SPECIFIER.
668 ATTYCI: MOVEI Q,CPOPJ
671 ;DECODE A TTY SPECIFIER.
672 ;IF W IS GREATER THAN ONE, DO NOT ALLOW RANDOM TTY NUMBERS.
673 ;ALWAYS WAIT FOR PERMISSION TO OUTPUT.
674 ;IF THE SPECIFIED TTY IS OUR CONSOLE AND OUTPUT IS BEING IGNORED,
675 ;CLOBBER W TO ONE, SO THAT ITS PARAMETERS WILL NOT BE CHANGED (FOR SCPOS).
676 ATTYCW: JSP Q,[ CAIGE W,2
684 ;IF THERE ARE TWO OR MORE ARGS, AND IT IS OUR CONSOLE,
685 ;WAIT UNTIL WE OWN IT, OR MAYBE INTERRUPT.
689 ;IF IT IS OUR CONSOLE, WAIT TILL WE OWN IT, OR MAYBE INTERRUPT.
690 ATTYC2: MOVEI Q,TTYWC2
694 ;IF IT IS OUR CONSOLE, WAIT TILL WE CAN DO INPUT,
695 ;OR INTERRUPT IF DOING INPUT WOULD.
696 ATTYCR: MOVEI Q,TTYWI2
699 ;DECODE A TTY SPEC. SKIP IF IT REFERS TO OUR CONSOLE.
700 ;DO NOT ALLOW RANDOM TTY NUMBERS.
701 ATTYCM: MOVEI Q,[AOJA J,CPOPJ]
704 ;DECODE A TTY SPEC. SKIP IF IT REFERS TO OUR CONSOLE.
705 ATTYC9: MOVEI Q,[AOJA J,CPOPJ]
706 ;DECODE CHNL # (IF < 400000) OR TTY # (OTHERWISE) IN A. -1 MEANS TREE'S CONSOLE.
707 ;IF CHNL # BAD, POPJ WITH OPNL. IF NOT STY OR TTY, POPJ WITH OPNL.
708 ;IF OUR CONSOLE, CALL THE ROUTINE Q POINTS TO.
709 ;THEN RETURN WITH TTY # IN I.
710 ATTYC8: TDZE A,[-400000] ;IS IT A TTY NUMBER?
711 JRST ATTYC3 ;YES, DECODE THAT.
712 ;DECODE CHNL #, TTY # NOT ALLOWED.
715 HRLI J,ATTYC5 ;RETURN THERE IF NORMAL, OPEN CHANNEL
716 MOVEI T,AIOCAL ;USE JOB DEVICE CHECKER
717 JRST CHNDCD ;DECODE CHANNEL AND HANDLE JOB DEVICE SPECIALLY.
719 ;CHNDCD RETURNS HERE WITH IOCHNM WORD CONTENTS IN H.
721 LDB I,[$TIIDX,,H] ;FOR EITHER TTY CHNL OR STY CHNL, GET TTY #.
722 CAIN I,%TINON ;TREE HAS NO TTY => RETURN "DEVICE NOT AVAILABLE".
724 CAIG T,4 ;TTY CHNL => GOOD.
728 JRST OPNL34 ;NOT STY => BAD.
729 JRST (J) ;STY => GOOD.
731 ATTYC4: LDB T,[.BP <%TICNS,,>,H] ;GET DEVICE/CONSOLE BIT
732 JUMPE T,ATTYC1 ;JUMP IF IT'S A DEVICE.
733 PUSHJ P,(Q) ;AWAIT TTY OR INTERRUPT
736 JRST (J) ;USER DOESN'T HAVE THE TTY (
\e\e^P), ERROR CHECKS DON'T APPLY
738 BUG ;USER HAS TWO DIFFERENT CONSOLE TTYS
739 ATTYC1: HRRZ T,TTYSTS(I) ;USER INDEX THAT HAS THIS TTY
741 BUG ;USER HAS TTY BUT TTY DOESN'T HAVE THAT USER
745 CAIGE I,NCT ;IS THE ARG THE # OF A REAL TTY?
747 CAIE I,377777 ;SKIP IF ARG WAS -1
748 JRST OPNL1 ;"NO SUCH DEVICE" ERROR.
749 ATTYC6: PUSHJ P,(Q) ;"MY OWN CONSOLE" SPECIFIED; WAIT OR INTERRUPT.
750 HRRZ I,TTYTBL(U);NOW GET TTY NUMBER
751 CAIN I,%TINON ;TREE HAS NO TTY => RETURN "DEVICE NOT AVAILABLE".
756 ;SETS TTYST1, TTYST2, TTYSTS, WHEN THE USER HAS THE TTY
757 ;HANGS UNTIL HE GETS IT
758 ATTYST: JSP J,ATTYCM ;GET TTY NUMBER IN I; SKIP IF IT'S OUR CONSOLE.
761 JRST ATTYS5 ;JUMP IF OUR CONSOLE AND WE DON'T OWN IT.
762 ATTYS6: CONO PI,TTYOFF
766 JRST ATTYS0 ;NO 4TH ARG => DON'T SET TTYSTS.
767 TLNE D,%TSINT ;SETTING "INT ON NEXT CHAR REGARDLESS"?
768 PUSHJ P,ATTYS3 ;MAYBE THE "NEXT CHAR" HAS ALREADY BEEN READ.
769 HRLOI B,%TSFRE+%TSCNS+%TSLCZ+%TSHDX ;DON'T CHANGE THESE.
770 TLZ D,%TSFRE+%TSCNS+%TSLCZ+%TSHDX
774 ATTYS0: AOS (P) ;MAKE ALL CHRS IN BUFFER ACTIVATION CHARS
775 ATTYS1: SKIPG TICC(I)
777 LDB E,TIIP(I) ;MAKE LAST CHAR AN ACTIVATION CHAR
779 AOS TACC(I) ;IF IT WASN'T ONE, IS ONE MORE ACT CHAR NOW
783 ATTYS3: SKIPE B,TINTP(I)
784 ATTYS4: CAMN B,TIIP(I) ;ANY MORE CHARS TO CHECK?
788 ILDB E,B ;YES, CHECK THE NEXT ONE.
789 TRNE E,%TXIGN ;IF IT ISN'T REALLY THERE, IT SHOULDN'T
790 JRST ATTYS4 ;INTERRUPT.
791 TLZ D,%TSINT ;ELSE THIS CHAR IS THE "NEXT CHAR" THAT
792 TROE E,%TXINT ;SHOULD INTERRUPT REGARDLESS.
794 AOS TINTC(I) ;SO MAKE IT AN INT. CHAR IF IT ISN'T.
806 ;TTYSET WHEN WE DON'T OWN OUR CONSOLE.
807 ATTYS5: MOVEM B,TTSTSV(U)
811 HRLOI B,%TSFRE+%TSCNS+%TSLCZ+%TSHDX ;DON'T CHANGE THESE.
812 TLZ D,%TSFRE+%TSCNS+%TSLCZ+%TSHDX ;CHANGE ONLY CERTAIN LH BITS.
819 ;GETS TTYST1, TTYST2 AND TTYSTS WHEN THE USER HAS THE TTY
820 ;HANGS UNTIL HE GETS IT, IF IT'S HIS CONSOLE.
821 ;ALSO RETURNS HIS TTYTYP, TCTYP.
822 ;THE RH OF TTYSTS AS RETURNED IS PRE-DIVIDED BY LUBLK
823 ATTYGT: JSP J,ATTYC9 ;GET TTY NUMBER NOW IN I; SKIP IF IT'S OUR CONSOLE.
827 ;OUR CONSOLE AND WE DON'T CURRENTLY OWN IT.
833 ;EITHER NOT OUR CONSOLE OR WE OWN IT.
834 ATTYG1: MOVE A,TTYST1(I)
837 ATTYG2: HRRZ D,TTYSTS(I) ;GET IDX OF TTY'S OWNER
838 CAIE D,-1 ;(BUT MAY BE NO OWNER IF WE SPECIFIED RANDOM TTY)
839 IDIVI D,LUBLK ;RETURN IN EASY-TO-DIGEST FORM.
842 TLNE D,%TOHDX ;THE %TSHDX BIT REFLECTS THE %TOHDX BIT.
848 ;SCML SYSTEM CALL. 1ST ARG TTY OR STY CHNL,
849 ;2ND ARG IS DESIRED # COMMAND LINES(FOR ECHOING AT BOTTOM OF SCREEN)
850 ;2ND ARG 0 => NO ECHO REGION.
855 DPB B,[$TBECL,,TTYTBL(U)] ;IT'S OUR CONSOLE AND WE DON'T OWN IT.
858 ASCML3: PUSH P,[TTYOJ1]
861 ;I HAS TTY #, H HAS # CMD LINES, TTY CHANNEL OFF (TURNED BACK ON).
862 ASCML1: MOVE TT,TCMXV(I)
864 JRST [ MOVE H,TT ;PRINTING TERMINALS (INFINITE SCREEN) ARE A SPECIAL CASE
869 MOVMS H ;VPOS OF START OF ECHO AREA.
871 MOVEI H,117. ;IF TCMXV GARBAGE, AVOID GETTING GARBAGE INTO TPVP
875 CAMN TT,TTYLPP(I) ;MAKE SURE TTY ISN'T ASSOCIATED WITH PC OF PPR
876 PUSHJ P,TYOMVC ;WHILE THE LATTER'S SIZE IS CHANGING.
878 MOVEM H,TPVB+TPLEN(TT)
879 MOVEM H,TPVP+TPLEN(TT)
880 HRLM H,TPSP+TPLEN(TT)
883 ;RCPOS SYSTEM CALL. (READ CURSOR POSITION)
884 ;1 ARG - TTY OR STY CHNL.
885 ;1ST VALUE <ECHO VERT POS>,,<ECHO HORIZ POS>
886 ;2ND VALUE <MAIN PRGM VERT POS>,,<MAIN PRGM HORIZ POS>
887 ;1ST VALUE IRRELEVANT IF NO ECHO LINES.
896 HRRZ B,TPVP+TPLEN(TT)
904 ;SCPOS SYSTEM CALL GETS OR SETS THE SYSTEM'S IDEA OF WHERE THE TTY'S
905 ;CURSOR IS REALLY LOCATED (AT THE M.P. SIDE OF THE OUTPUT BUFFER).
906 ;TO BE USED AFTER OUTPUTTING IN SUPERIMAGE MODE, TO TELL THE SYSTEM
907 ;WHAT THE CHARS ALREADY OUTPUT WILL DO TO THE TTY. MAY ALSO BE USED
908 ;BY A STY PROGRAM LOOKING AT A SOFTWARE TTY, TO TELL THE SYSTEM HOW
909 ;IT HAS INTERPRETED THE CURSOR-MOVING DISPLAY CODES, PROVIDED THE
910 ;OUTPUT BUFFER IS EMPTY (AS IT WILL BE AFTER AN OUTPUT RESET).
911 ;FOR THAT APPLICATION, A WAY TO SET TTOALC IS PROVIDED.
912 ;3 VALUES - VPOS, HPOS AND TTOALC.
913 ;1 ARG (TTY SPEC) => JUST READ THEM.
914 ;2 MORE ARGS => THEY ARE NEW VPOS AND HPOS.
915 ;A FOURTH ARG WILL SET TTOALC.
918 CAILE T,4 ;IF WE'RE HACKING A TTY CHANNEL
920 SKIPL TTOALC(I) ;THEN MAYBE THE TTY WANTS TO HACK IT FIRST.
922 NSCPO4: SOJE W,NSCPO2
925 CAIG B,118. ;DON'T ALLOW GARBAGE TO GET INTO TPVP
927 JRST OPNL33 ;NOT 3 ARGS??
930 CAIL C,400 ;PREVIOUS LINE MESSES UP ON !-CONTINUED LINES
932 NSCPO2: MOVSI TT,%TCLED ;CONTROL BIT SET => SET %TCLED, ALLOWING THIS JOB TO
933 SKIPE CTLBTS(U) ;READ TOP-E AND TOP-S CHARS. NORMALLY, ITS DISCARDS THEM.
937 JRST NSCPO1 ;WHERE POS LIVES DEPENDS ON WHETHER TTY IS ASSOCIATED.
939 HRL T,B ;FOR DISSOCIATED TTYS, TTYLPS HAS POS, MUST BE SET.
942 SETCA TT, ;MAKE SURE TT HAS THE PC PPR #, UNCOMPLEMENTED.
943 NSCPO1: MOVE A,TPVP(TT) ;FOR ASSOCIATED TTY, POS LIVES IN TPVP AND TPHP OF PC PPR.
949 NSCPO3: MOVE C,TTOALC(I) ;NOW GET OLD TTOALC, AND SET IT IF THERE WERE 4 ARGS.
954 AOSN TTYOAC(I) ;MAY BE RESTARTING FROM ZERO ALLOCATION
958 ;CNSGET OR RSSIZE SYSTEM CALL. 1 ARG - TTY OR STY CHNL.
959 ;RETURNS THE SAME VARS THAT CNSSET SETS, IN THE SAME ORDER.
960 NCNSGET: ;RETURN PERMANENT AND SEMIPERMANENT TTY INFO.
966 MOVE B,TCMXH(I) ;NOTE TCMXH IS LINEL INCLUDING THE CONTIN. COLUMN,
972 ;1ST ARG TTY OR STY CHNL. NEXT ARGS SET
973 ;VERT SIZE, HORIZ SIZE, TCTYP, TTYCOM, TTYOPT VARS RESPECTIVELY.
974 ;TCTYP CAN'T BE SET TO A NONSENSE VALUE, SOME TTYCOM BITS CAN'T BE SET.
975 ;IF 2ND, 3RD OR 4TH ARG IS NEGATIVE, ITS VALUE ISNT CHANGED
979 ;.CALL TTYVAR ENTERS HERE WITH B/TCMXV, C/TCMXH-1, D/TCTYP, E/TTYCOM, H/TTYOPT
981 NCNSS0: SKIPL D ;MAKE SURE D HAS NEW VALUE OF TCTYP,
982 CAIG W,3 ;WHETHER WE'RE CHANGING IT NOW OR NOT.
984 CAIL D,%TNMAX ;DON'T LET TCTYP BE SET TO ILLEGAL VALUE.
987 MOVE T,TTYTYP(I) ;DON'T LET %TPORS BE SET FOR PDP11 TV.
989 TRZA H,%TPORS+7*%TPPCR+%TPCBS
990 TRZA H,%TP11T ;%TP11T MUST REFLECT %TY11T.
993 JRST [ MOVEI B,37. ;DON'T ALLOW A TV TO BE CALLED ANYTHING BUT.
997 CAIN D,%TNTV ;NOT A PDP11 LINE => DON'T LET IT BE TREATED AS ONE.
1002 TLZ H,%TORAW ;"RAW" MODE EXISTS ONLY ON PRINTING TTYS.
1004 TLZ H,%TOMVU+%TOERS ;DON'T CLAIM TO DO SOMETHING WE DON'T KNOW HOW TO DO
1007 MOVEM T,TTYROL(I) ;ON PRINTING TTYS TTYROL MUST BE 1
1008 TRNN H,%TPCBS ;IF ^\ ISN'T TO BE HANDLED SPECIALLY, MAKE SURE ALL OF
1009 SETOM TTOALC(I) ;THE FEATURES IT PROVIDES ARE IN THEIR NORMAL STATES.
1011 TRNN H,%TPCBS+%TPTEL
1014 IMULI TT,TPLEN*2 ;TT HAS IDX OF MAIN PC PPR OF TTY.
1015 XORI W,-1 ;EACH OF THE INSNS AFTER THE JRST SETS ONE PARAMETER.
1016 CAIL W,#6 ;>6 ARGS SAME AS 6 ARGS.
1017 JRST NCNSS1+2(W) ;ELSE DON'T SET VARS WE DIDN'T GET ARGS FOR.
1019 PUSHJ P,NCNSSC ;SET TTYCOM
1020 MOVEM D,TCTYP(I) ;SET TCTYP.
1021 PUSHJ P,[CAIL C,3 ;DON'T ALLOW SCREEN WIDTH LESS THAN 3.
1022 CAIL C,377777 ;DON'T ALLOW AN HPOS THAT WON'T FIT IN HALFWORD.
1023 POPJ P, ;SPEC NO GOOD, IGNORE
1024 JRST NCNSSH ] ;SET TCMXH.
1025 PUSHJ P,[CAMN B,[200000,,] ;200000,, IS SPECIAL (PRINTING TTY).
1027 CAIL B,3 ;DON'T ALLOW SCREEN HEIGHT LESS THAN 3.
1028 CAIL B,120. ;VPOS MUST FIT IN ASCII CHARACTER, USUALLY.
1029 POPJ P, ;NO GOOD, IGNORE
1030 JRST NCNSSV ] ;SET TCMXV
1031 NCNSS1: PUSHJ P,NCNSSG ;COMPUTE TTYEPP FROM NEW SETTINGS OF TTY VARS.
1034 ;SET TTY WIDTH (NOT INCLUDING THE SPACE FOR THE "!") TO ARG IN C.
1035 ;TTY # IN I, MAIN PC PPR IDX IN TT.
1038 CAMG C,TTYIHP(I) ;DON'T ALLOW TTYIHP TO HAVE ILLEGAL VALUE.
1040 .SEE TPHE ; MOVEM C,TPHE(TT)
1041 .SEE TPHE ; MOVEM C,TPHE+TPLEN(TT)
1044 CAMG C,TPHP+TPLEN(TT)
1045 MOVEM C,TPHP+TPLEN(TT)
1048 ;SET TTY SCREEN HEIGHT FROM VALUE IN B.
1049 NCNSSV: MOVEM B,TCMXV(I)
1050 CAMG B,TTYIVP(I) ;DON'T ALLOW TTYIVP TO GET ILLEGAL VALUE.
1052 .SEE TPVE ; MOVEM B,TPVE(TT)
1053 .SEE TPVE ; MOVEM B,TPVE+TPLEN(TT)
1054 HRLM B,TPSP+TPLEN(TT) ;CLOBBER THE 2ND PC PPR TO NULL STATE.
1055 MOVEM B,TPVP+TPLEN(TT)
1056 MOVEM B,TPVB+TPLEN(TT)
1062 ;MAKE A TTY INTO AN ORDINARY PRINTING TTY.
1063 ;TTY # IN I; CLOBBERS TT,B,C.
1064 NCNSSP: SETZM TCTYP(I)
1065 MOVE TT,[%TOMVB+%TOOVR+%TOLWR,,%TPORS]
1071 TLC TT,%TOALT+%TOMVB+%TOLWR ;10CPS => ASSUME TELETYPE.
1072 IFN 0,[ ;THIS WOULD TURN THE MOTOR OF A CRTSTY DISPLAY ON AND OFF.
1073 CAIN B,5 ;120CPS => ASSUME TERMINET.
1074 JRST [ TRC TT,%TPPCR+5*%TPPLF
1080 SETZM TTYSMT(I) ;NO GRAPHICS, NO LOCAL EDITING.
1081 SETOM TTOALC(I) ;%TPCBS TURNED OFF
1082 MOVEI TT,1 ;SCROLLS A LINE AT A TIME (THIS IS
1083 MOVEM TT,TTYROL(I) ; MAINLY FOR THE BENEFIT OF TYIFLS)
1088 CAIE B,2 ;10 CPS => TELETYPE
1089 MOVEI C,79. ;ANYTHING ELSE IS AT LEAST 80 WIDE
1098 ;SET TTYEPP OF TTY # IN I, MAIN PC PPR # IN TT. CLOBBER H,TT.
1099 ;HAD BETTER ALWAYS BE CONO PI,CLKOFF HERE, OR SYSTEM MAY CRASH IN ECHOING CODE.
1100 NCNSSG: MOVE H,TTYOPT(I)
1101 TLNE H,%TOMVU ;NOT DISPLAY OR
1102 TLNN H,%TOERS ;ARDS-LIKE (CAN'T ERASE)
1103 JRST NCNSSF ; => CAN'T HAVE ECHO AREA.
1104 MOVE H,TPLEN+TPVB(TT)
1105 CAMGE H,TCMXV(I) ;NO ECHO LINES => CAN'T USE ECHO AREA.
1106 ADDI TT,TPLEN ;ELSE USE IT.
1107 NCNSSF: MOVEM TT,TTYEPP(I)
1111 ;RE-INIT THE PARAMETERS OF A T.V. WHEN IT BECOMES FREE.
1116 MOVE B,[%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI+%TOLID+%TOCID,,%TP11T+%TPRSC]
1118 MOVEI B,4 ;TV'S SCROLL BY 4 LINES PER GLITCH
1126 NCNSSC: XOR E,TTYCOM(I) ;DON'T CHANGE TTYCOM BITS EXCEPT THESE.
1127 AND E,[%TCQRY+%TCRFS+%TCICO+%TCOCO,,]
1131 TYVSRO: JUMPL A,OPNL33 ;CAN'T BE NEGATIVE
1132 ;CAME D,%TNTV ;CAN'T SET NON-ZERO ON TVS
1133 CAML A,TCMXV(I);CAN'T BE BIGGER THAN SCREEN SIZE
1135 TLNN H,%TOMVU ;ON PRINTING TTYS, TTYROL MUST BE 1 OR GET INTO
1136 CAIN A,1 ; INFINITE RECURSION AT TYOLF3/TYOCLR/TYOCRL
1142 ;TTYVAR SYSTEM CALL - READ AND WRITE VARIOUS TTY VARIABLES
1144 ;TABLES OF TTY VARIABLES.
1145 ;THE NEXT 3 TABLES ARE PARALLEL, IF YOU CHANGE ONE CHANGE THEM ALL.
1147 ;TTY VARIABLE NAMES. MUST BE SORTED IN SIXBIT ORDER.
1149 TYVTAB: SIXBIT/HEIGHT/
1151 SIXBIT/ISPEED/ ;IN BITS PER SECOND
1152 SIXBIT/OSPEED/ ;IN BITS PER SECOND
1162 TYVTL2==.RADIX 2,CONC [.LENGTH/]\.-TYVTAB-1,/ ;BASE 2 LOG-1 OF TABLE SIZE
1163 REPEAT 1_<TYVTL2>-<.-TYVTAB-1>-1, <SETZ>-1 ;PAD OUT TO POWER OF 2 SIZE
1165 ;INSTRUCTIONS TO GET VARIABLE INTO A
1167 TYVGET: MOVE A,TCMXV(I)
1168 PUSHJ P,[MOVE A,TIME ? SUB A,TTITM(I) ? POPJ P,]
1169 PUSHJ P,[LDB A,[$TTISP,,TTYTYP(I)] ? MOVE A,BAUDRT(A) ? POPJ P,]
1170 PUSHJ P,[LDB A,[$TTOSP,,TTYTYP(I)] ? MOVE A,BAUDRT(A) ? POPJ P,]
1178 PUSHJ P,[MOVE A,TCMXH(I) ? SOJA A,CPOPJ]
1180 ;INSTRUCTIONS TO SET VARIABLE FROM A. OPNL33 IF VALUE BAD. OPNL26 IF CAN'T WRITE.
1181 ;OTHERWISE, IF GOES VIA .CALL CNSSET, MOVE A INTO APPROPRIATE AC (SEE COMMENT AT NCNSS0).
1182 ;FOR OTHER VARIABLES, JRST TO ROUTINE TO STORE A INTO VARIABLE.
1184 TYVSET: MOVE B,A ;HEIGHT
1185 JRST [SUB A,TIME ? MOVNM A,TTITM(I) ? JRST TTYOJ1] ;IDLTIM
1197 TYVSSM: MOVEM A,TTYSMT(I)
1200 ;SET SPEED. MAYBE THIS SHOULD CHANGE IT IN HARDWARE ALSO?
1201 TYSISP: SKIPA B,[$TTISP,,TTYTYP(I)]
1202 TYSOSP: MOVE B,[$TTOSP,,TTYTYP(I)]
1203 MOVEI C,17 ;FIND CODE
1206 JUMPL C,OPNL33 ;NON-EXISTENT
1210 ;TRANSLATION FROM INTERNAL SPEED CODES TO BAUDS
1211 BAUDRT: 0 ? 600. ? 110. ? 150.
1212 300. ? 1200. ? 1800. ? 2400.
1213 4800. ? 9600. ? 25000. ? 40000.
1214 50000. ? 80000. ? -1 ? -2
1216 ;CODE FOR TTYVAR SYS CALL BEGINS HERE
1219 JSP J,ATTYC9 ;I TTY NUMBER
1221 SETO J, ;J GETS -1 IF IT'S OUR CONSOLE, 1 IF OTHER TTY CHNL.
1222 AOSGE E ;SKIP IF ARG WAS -1 (OWN CNSL) OR CHANNEL NUMBER
1223 MOVEI J,0 ;J ZERO IF TTY SPECIFIED BY NUMBER.
1224 PUSHJ P,VARCAL ;RETURN WITH SUITABLE STUFF IN E,D,W
1226 JUMPE J,OPNL26 ;ERR OUT IF WRITE LOCKED (SOMEONE ELSE'S TTY)
1227 JUMPG J,NTTYV1 ;IF IT'S OUR CONSOLE, WAIT TILL WE OWN IT, OR INTERRUPT.
1229 NTTYV1: TLNN E,-1 ;DEFAULT LH OF SIXBIT VARIABLE NAME TO 'TTY'
1230 HRLI E,'TTY ;SO CALLER CAN USE IMMEDIATE ARGUMENT -- PRETTY RANDOM
1231 MOVEI B,0 ;LOOK UP IN TABLE OF TTY VARIABLES (TYVTAB)
1232 REPEAT TYVTL2,[CAML E,TYVTAB+1_<TYVTL2-.RPCNT-1>(B)
1233 ADDI B,1_<TYVTL2-.RPCNT-1>
1237 JRST OPNL11 ;IILEGAL TTY VARIABLE NAME
1239 XCT TYVGET(B) ;GET VALUE OF VARIABLE INTO A
1240 JUMPE W,TTYOJ1 ;RETURN IF READING
1242 XCT W ;PUT NEW VALUE INTO A
1243 MOVE W,TYVSET(B) ;GET INSTRUCTION TO PUT A IN PROPER PLACE
1244 MOVE B,TCMXV(I) ;SET UP OLD VARIABLES FOR NCNSS0
1250 XCT W ;CHANGE THE AC CONTAINING THE VARIABLE TO BE CHANGED
1251 MOVEI W,6 ;TELL CNSSET TO CHANGE EVERYTHING
1252 JRST NCNSS0 ;MAKE THE CHANGES, THEN TTYOJ1.
1256 ;WITH CONTROL BITS 0, MARKS LAST INTERRUPT CHARACTER ITYIC'ED
1257 ; TO BE IGNORED AT MAIN PROGRAM LEVEL.
1258 ;WITH CONTROL BIT 1, DISCARDS ALL INPUT THROUGH LAST CHARACTER ITYIC'ED.
1259 NTTYFLS:JSP J,TTYNGT
1264 NTTYF1: MOVE C,TIOP(I)
1270 NTTYF2: LDB A,TINTP(I)
1275 NTTYESC: ;SIMULATES TYPING OF ^_
1276 JSP J,ATTYC2 ;DECODE TTY SPEC. IF OUR CONSOLE, WAIT TILL WE CAN INPUT.
1280 JRST OPNL7 ;DEVICE NOT READY
1285 ;WHOLINE SYSTEM CALL.
1286 ;TAKES A MANDATORY 1ST ARGUMENT SPECIFYING A TTY.
1287 ;RETURNS TWO VALUES - THE OLD SETTINGS OF WHMODE AND WHJOB
1289 ;OPTIONAL 2ND AND 3RD ARGUMENTS SET WHMODE AND WHJOB. IF THEY
1290 ;ARE PRESENT, THE RETURNED VALUES ARE THE OLD SETTINGS.
1291 ;THE CALL FAILS FOR TTY'S OTHER THAN TV'S.
1293 NWHOLI: JSP J,ATTYC ;DECODE THE TTY SPEC.
1295 IFN N11TYS,TRNN H,%TP11T ;FAIL IF NOT PDP11 TV.
1298 SKIPL TT11P ;TV PDP11 DOWN => DON'T USE IT.
1300 CAIGE W,2 ;IF THERE ARE OPTIONAL ARGS, DECODE THEM.
1302 CAIE B,1 ;DECODE 3RD ARG ONLY IF RELEVANT.
1304 MOVE J,C ;IT SHOULD BE A JOB SPEC.
1306 SETO J, ;USE -1 (SELF) AS THE DEFAULT.
1309 JUMPL J,OPNL34 ;PDP6 IS NO GOOD.
1311 IDIVI C,LUBLK ;CONVERT USER IDX TO JOB #.
1312 NWHOL2: ADD I,TT11HD
1315 LDB TT,[$11AD0,,1-NF11TY(I)]
1316 ADDI TT,TT11LO ;TT HAS PDP10 ADDR OF TTY'S WHOLINE VARS.
1318 MOVE T,WHMODE(TT) ;FIRST, GET THE CURRENT SETTINGS.
1319 LDB Q,[$11WD0,,WHJOB(TT)]
1322 DPB B,[$11WD0,,WHMODE(TT)] ;THEN, SET TO NEW VALUES IF REQUIRED.
1323 DPB C,[$11WD0,,WHJOB(TT)]
1324 NWHOL3: CONO PI,TTYON
1325 MOVE A,T ;PUT RETURN VALUES IN APPRO. ACS
1331 ;TVWHER SYSTEM CALL.
1332 ;TAKES 1 ARG SPECIFYING A TTY, WHICH MUST BE A TV TTY.
1334 ;1ST VALUE: THE KEYBOARD NUMBER OF THE PHYSICAL TERMINAL IN USE.
1335 ;2ND VALUE: THE NUMBER OF THE DISPLAY BUFFER IN USE ON THIS TTY.
1337 NTVWHE: JSP J,ATTYCI
1339 IFN N11TYS, TRNN H,%TP11T
1342 NTVWH1: LDB A,[$11AD0,,TT11HA]
1344 LDB B,[$11BY3,,1-NF11TY(A)]
1345 LDB A,[$11BY2,,1-NF11TY(A)]
1349 SUBTTL .ITYIC, .LISTEN, TTY WHYINT
1351 ;.CALL ITYIC. 1 ARG, A TTY INPUT CHANNEL; 1 VALUE, THE INTERRUPT CHAR.
1352 ;FAILS IF THERE ARE NO INTERRUPT CHARACTERS.
1353 NITYIC: JSP J,TTYNGT
1354 AITYI1: SKIPG D,TINTC(I)
1356 MOVE A,TINTP(I) ;SAVE SOME INFO FOR DEBUGGING
1358 MOVE C,TIIP(I) ;GET THE END OF FILLED PART OF BUFFER
1359 AITYI2: CAMN C,TINTP(I) ;IF OUR MOVING POINTER PASSES THERE, THERE ARE REALLY
1360 BUG ;NO INT CHARS IN THE BUFFER. BUT TINTC NON-ZERO??
1362 CAMN B,TIBEP(I) ;WRAP AROUND AT END OF BUFFER
1364 HRRM B,TINTP(I) ;ADVANCE TINTP TO NEXT CHARACTER.
1366 TRZN B,%TXINT ;KEEP LOOKING TILL FIND NEXT INT. CHAR.
1370 HLRZ R,H ;GET IOCHNM BITS IN R. UNLESS %TIFUL IS SET,
1373 JRST TYINRM ;NORMALIZE PDP-11 12-BIT CHARACTERS TO 7-BIT.
1375 ;.CALL WHYINT ON TTY INPUT CHANNEL IS SIMILAR TO ITYIC
1376 TYIWHY: JSP J,TTYNG1
1378 SOS (P) ;DON'T SKIP-RETURN IF NO INTERRUPT CHARS
1379 MOVE B,A ;SECOND RESULT IS INTERRUPT CHARACTER
1380 MOVEI A,%WYTYI ;FIRST RESULT IS DEVICE CODE
1383 AITYI: SETO A, ;.ITYI OBSOLETE.
1385 AITYIC: UMOVE A,(J) ;.ITYIC
1386 PUSH P,J ;TURN INTO NEW SYSTEM CALL ITYIC
1387 MOVE B,[SIXBIT /ITYIC/]
1388 MOVEM B,LSCALL(U) ;FOR JOB DEVICES' SAKE.
1395 ALISTEN:SKIPGE I,TTYTBL(U) ;.LISTEN
1406 TTYFIN: JSP J,TTYNG1 ;HERE FOR .CALL FINISH ON TTY OUTPUT CHANNEL
1410 NLISTE: JSP J,TTYNGT ;HERE FOR .CALL LISTEN
1415 TTYNGT: TRC A,-1 ;RH(A)=-1 => TREE'S CONSOLE
1418 MOVEI T,AIOCAL ;OTHERWISE MUST BE CHANNEL NUMBER
1421 TLNN R,%CLSTI ;CHNDCD RETURNS CLSTB BITS IN R, IOCHNM WD CONTENTS IN H
1425 TRZE I,400000 ;SKIP IF DEVICE (RATHER THAN CONSOLE)
1426 TTYNG2: SKIPL I,TTYTBL(U)
1430 TYOWHY: MOVEI A,%WYTYO ;.CALL WHYINT ON TTY OUTPUT CHANNEL
1431 MOVSI B,(SETZ) ;FOR NOW, JUST ASSUME REASON IS **MORE**
1437 ;3.1 0 -> IN 1 -> OUT
1438 ;3.2 0 -> UNIT 1 -> BLOCK
1441 ;3.3 => IMAGE MODE (SET ALL %TGIMG BITS IN TTYST1 AND TTYST2)
1442 ;3.4 0 -> NORMAL 1 -> ECHO MODE OUTPUT (SET %TJECH, %TJPP2, %TJMOR).
1443 ;3.5 0 -> NORMAL 1 -> DISPLAYMODE, LOOK FOR ^P (SET %TJDIS).
1444 ;3.6 0 -> NORMAL 1 -> SUPER-IMAGE OUTPUT (SET %TJSIO).
1447 ;3.3 => IMAGE MODE (CLEAR ALL ECHO BITS IN TTYST1, TTYST2).
1448 ;3.4 => "DDT" (DON'T ECHO CR, LF, TAB)
1449 ;3.5 => CONVERT LOWER TO UPPER CASE
1450 ;3.6 => WANT 3 LINES IN ECHO AREA.
1452 ;BITS 3.4 AND 3.6 ON INPUT, AND BIT 3.3, HAVE EFFECT
1453 ;ONLY ON THE FIRST OPEN IN EITHER DIRECTION.
1454 ;(THEY ARE OBSOLETED BY THE TTYSET SYSTEM CALL)
1457 ;(SHOWS UP IN RH OF A ON .IOT, .CLOSE, ETC)
1459 %TICNS==400000 ;4.9 1-> CONSOLE 0 -> DEVICE. THIS BIT EXIST IN INPUT AND OUTPUT CHNLS.
1460 %TJCNS==400000 ;4.9 1-> CONSOLE 0 -> DEVICE
1463 %TJCP1==200000 ;^P-CODE ANTICIPATION STATE.
1464 %TJCP2==100000 ; ". 0=>NORMAL, 1=> CHAR AFTER ^P, 2=> ^PH, 3=>^PV.
1465 %TJECH==40000 ;SET => ECHO MODE OUTPUT.-MODE OUTPUT (ALL CHARS OUTPUT THE
1466 ;WAY THEY WOULD BE ECHOED)
1467 %TJCTN==20000 ;SET => DON'T DO LINE-CONTINUATION.
1468 %TJSTP==10000 ;SET => THIS CHANNEL IS HUNG IN **MORE**.
1469 %TJDIS==4000 ;SET => LOOK FOR ^P CODES.
1470 %TJSIO==2000 ;SET => SUPERIMAGE OUTPUT, NO PADDING OR CURSOR CTL.
1471 %TJMOR==1000 ;SET => DON'T DO **MORE** PROCESSING.
1472 %TJPP2==400 ;SET => USE ALTERNATE PC PPR (THE ECHO AREA)
1473 %TJINK==200 ;SET => NEXT CHAR ASSUMED TO BE 1-POSITION PRINTING.
1474 %TJHDE==100 ;SET => ACCOUTING FOR CURSOR MOTION DUE TO
1475 ;CHAR ECHOED ON A HALF-DUPLEX TTY.
1479 %TIECH==40000 ;CAN READ EVEN IF CHAR NEEDS PI ECHOING.
1480 %TIPEK==20000 ;DON'T REMOVE CHAR FROM BUFFER.
1481 %TIACT==4000 ;SET => DON'T WAIT FOR ACTIVATION CHARACTER.
1482 %TIINT==2000 ;SET => CAN READ A CHAR EVEN IF IT IS SUPPOSED TO INTERRUPT & HASN'T YET.
1483 %TINWT==1000 ;SET => IF NO INPUT AVAILABLE, DON'T WAIT, JUST RETURN -1.
1484 %TIFUL==400 ;SET => GIVE FULL CHARACTER (SIGNIFICANT ON IMLAX, TVS)
1486 $TIIDX==220600 ;3.6-3.1 CONSOLE #, OR 77 FOR A "DISOWNED" CONSOLE TTY CHNL
1487 ;IE, ONE THAT CORRESPONDS TO NO REAL TTY. THEY EXIST ONLY IN
1488 ;TREES WITH NO TTY, IN JOBS THAT CAM FROM TREES WITH TTYS.
1489 %TINON==77 ;"TTY #" FOR A CHANNEL WITH NO REAL TTY.
1491 ;ENTRY FOR OPEN OF TTY AS DEVICE TYN OR TNM
1496 SUB J,LPTTIME ;"LPT" INPUTS EVERY ONCE IN A WHILE IF IT IS UP
1497 CAIL J,60. ;2 SECONDS
1501 TTYO: PUSHJ P,TTYFD ;TEST FOR FILE NAME OF .FILE. (DIR)
1503 JRST OPNL1 ;TTY NUM TOO LARGE
1506 .ERR Shouldn't this be using NFNVTY instead?
1507 CAIGE I,NOTYS+NNTYS+NNVTTS
1508 CAIGE I,NOTYS+NNTYS ;SKIP ON NOVA TTY
1511 JRST OPNL10 ;NOVA LINK NOT ACTIVE
1512 TTYO3A: CAMN I,NOVATT
1513 JRST OPNL10 ;CANT OPEN TTY USED AS CNHL TO NOVA
1515 MOVEI A,0 ;MARK AS A DEVICE
1516 CONO PI,TTYOFF ;INTERLOCK WITH OTHER TTY OPENS, AND ^Z'S.
1517 SKIPGE TT,TTYSTS(I) ;SKIP IF TTY OPEN
1518 JRST TTYO3B ;OK IF TTY NOT OPEN
1519 CAIE U,(TT) ;SAME USER THAT HAS IT?
1520 JRST OPNL10 ;TTY ALREADY OPEN AS DEVICE BY SOMEONE ELSE.
1521 TLNN TT,%TSCNS ;OPEN AS CONSOLE?
1522 JRST TTYO8 ;NO, AS DEVICE
1524 JRST TTYO7 ;OPEN, THIS TIME AS CONSOLE.
1526 TTYO3B: SKIPGE TTYSTA(I) ;TTY IS FREE: IS IT IN TRANSITION TO OR FROM BEING IN USE?
1527 JRST TTYO8 ;OK IF NOT;
1528 MOVE T,I ;STYOCF TAKES TTY # IN T.
1529 PUSHJ P,STYOCF ;AND WAIT TILL TTY IS NO LONGER IN TRANSITION
1531 JRST TTYO3C ;THEN TRY AGAIN TO OPEN IT.
1533 ;TTY IS AVAIL. TO OPEN AS A DEVICE.
1534 TTYO8: SKIPN TTNTO(I) ;IF TTY USED TO BE FREE, INIT. IT.
1540 TTYFD: PUSHJ P,FLDRCK ;SKIP IF FILE DIR BEING OPENED
1541 JRST TTYFD1 ;FILE NAMES NOT SPECIAL
1544 JRST LISTF7 ;GO GET DIRCTORY
1546 TTYFD1: JUMPE W,CPOPJ ;0 IS THE ONLY DEFINED MODE FOR ANY TTY OPEN
1550 FLDRCK: CAMN A,[SIXBIT /.FILE./]
1551 CAME B,[SIXBIT /(DIR)/]
1555 ;INIT A TTY WHEN IT CEASES TO BE FREE. (ZFLAG7 FOR TTY, TTYO8 FOR TNM)
1556 ;CHNL 3 (TTYCHN) MUST BE OFF OR IN PROGRESS.
1557 TTYINI: SETZM TTYST1(I)
1559 MOVSI J,%TACFM ;TTY NEEDS A CONSOLE FREE MESSAGE.
1562 TRNN J,%TYSTY ;EXCEPT ON STY TTYS,
1563 PUSHJ P,TTYIN1 ;INIT THE USER OPTIONS IN TTYOPT, TTYCOM.
1565 HRLOI H,%TSFRE ;INITIALIZE TTYSTS FROM TTYOPT
1568 TLNN J,%TOMOR ;NOTE %TOMOR SAYS DO **MORE** PROC,
1569 TLO H,%TSMOR ;%TSMOR SAYS INHIBIT **MORE** PROC.
1576 SETZM TPFLAG+TPLEN(TT)
1577 SETZ H, ;START OUT WITH NO ECHO LINES.
1580 ;INIT A FEW BITS IN TTYOPT, TTYCOM THAT ARE CONSIDERED USER OPTIONS.
1581 ;NORMALLY DONE WHENEVER A TTY BECOMES IN USE, BUT ON STY TTY'S
1582 ;DONE ONLY WHEN THE STY IS INITIALIZED (SO STY-USER CAN SET THESE OPTIONS).
1583 TTYIN1: MOVE J,TTYCOM(I)
1584 TLZ J,%TCRFS+%TCQRY+%TCOCO+%TCICO
1586 MOVE J,TTYOPT(I) ;INIT SOME TTYOPT BITS.
1589 TLO J,%TOMOR ;DO **MORE**
1593 ;TELETYPE OPEN ROUTINES
1595 ;ENTRY FOR OPEN OF "TTY" AS A CONSOLE
1597 TTYO1: PUSHJ P,TTYFD ;TEST FOR FILE NAME OF .FILE. (DIR)
1598 TTYO7: MOVE I,TTYTBL(U)
1599 JUMPGE I,TTYO2 ;JUMP IF HAS TTY NOW
1602 TLNN I,%TBNVR ;IF I SHOULD FAIL IF TRY TO OPEN TTY WHEN DON'T HAVE IT,
1603 TLNN I,%TBDTY ;OR IF I HAVE DONE A .ATTY,
1604 JRST OPNL10 ;THE OPEN SHOULD FAIL.
1607 PUSHJ P,UFLS ;HANG UNTIL HAS TTY
1609 TTYO2: HRRZS I ;TTY NUMBER
1611 JRST 4,OPNL1 ;TTY NUM TOO LARGE
1612 MOVSI A,%TICNS ;SAY TTY CHNL WILL BE OPEN AS CONSOLE.
1614 TTYO3: HRLZI J,(D) ;SET IOCHNM BITS (IN A) FROM OPEN MODE.
1616 TLZ J,700077 ;BUT DON'T USE PARTS OF OPEN WD USED FOR OTHER THINGS.
1619 CAMN I,LPTTTY ;SKIP IF OT TTY
1622 DPB I,[$TIIDX,,A] ;LH OF A WILL BE STORED IN LH OF IOCHNM WORD
1623 HRRZ TT,UUAC(U) ;TT HAS CHNL # BEING OPENED.
1624 JUMPGE D,TTYO4 ;J IF INPUT OPEN.
1626 TLO A,%TJSIO ;SUPER IMAGE OUT.
1628 TLO A,%TJECH+%TJPP2+%TJMOR ;ECHO OUTPUT
1630 TLO A,%TJDIS ;DISPLAY OUTPUT MODE.
1632 IOR J,CHNBIT(TT) ;UPDATE CHANNELS-OPEN MASK
1633 EXCH J,TYOMSK(I) ;FOR THE NEW OUTPUT CHANNEL.
1634 JUMPN J,TTYO5 ;FOR 1ST OUTPUT OPEN, INIT TTYST1,2.
1635 MOVE J,[101010,,101010]
1637 IORM J,TTYST2(I) ;SET ALL THE OUTPUT-IN-IMAGE-MODE BITS.
1639 ANDCAM J,TTYST1(I) ;IF NOT IMAGE, CLEAR THEM.
1644 TTYO4: MOVE J,TYIMSK(I)
1645 IOR J,CHNBIT(TT) ;UPDATE INPUT-CHNLS-OPEN MASK
1646 EXCH J,TYIMSK(I) ;FOR NEWLY OPENED INPUT CHANNEL.
1647 JUMPN J,TTYO5 ;THE 1ST INPUT CHNL OPEN, INIT ECHO BITS...
1650 MOVEI H,3 ;# COMMAND LINES
1653 AND J,[101010,,101010] ;SAVE IMAGE MODE OUTPUT BITS
1654 TRNN D,2 ;SKIP ON IMAGE MODE INPUT
1655 IOR J,[202020,,202020] ;ASCII MODE INPUT
1656 IOR J,[030303,,030303] ;ENABLE INTERRUPT AND ACTIVATE ON ANY CHARACTER
1657 MOVEM J,TTYST1(I) ;STORE BACK
1659 AND J,[101010,,101010] ;SAVE IMAGE MODE OUTPUT BITS
1660 TRNN D,2 ;SKIP ON IMAGE MODE INPUT
1661 IOR J,[202020,,200020] ;SAY ALL CHARS EXCEPT RUBOUT SHOULD ECHO.
1662 TRNE D,4 ;SKIP ON NOT DDT MODE
1663 ANDCM J,[006000,,606000] ;DDT MODE
1664 IOR J,[030303,,030303] ;ENABLE INTERRUPT AND ACTIVATE ON ANY CHARACTER
1665 MOVEM J,TTYST2(I) ;STORE BACK
1666 TTYO5: HRRM U,TTYSTS(I)
1667 AOS TTNTO(I) ;INCREMENT NUMBER OF CHNLS THIS TTY OPEN ON.
1670 JSP Q,OPSLC3 ;SET UP IO CHNM WORD AND RETURN
1674 SUBTTL WAITING FOR ACCESS TO TTY
1676 ;HERE WHEN WANT TO DO TTY INPUT, TO CHECK FOR PERMISSION.
1678 ANDI I,%TICNS+(.BM $TIIDX)
1679 TRZN I,%TICNS ;CLEAR AND CHECK CONSOLE/DEVICE BIT
1680 POPJ P, ;RETURN RIGHT AWAY IF DEVICE
1682 TTYWI2: MOVE T,TTYTBL(U)
1683 TLNN T,%TBNOT ;RETURN RIGHT AWAY IF WE OWN THE TTY.
1685 TLNE T,%TBIIN ;ELSE INTERRUPT IF %TBIIN IS SET.
1687 TTYWC3: TLC T,%TBINT ;ELSE INTERRUPT IF %TBINT IS SET AND NOT %TBWAT.
1688 TLNN T,%TBINT+%TBWAT
1692 PUSHJ P,UFLS ;WAIT TILL HAS TTY (CANT HAVE TTY IF DISOWNED)
1695 ;CALL FROM ATTYC, ATTYC2. WAIT TILL WE OWN THE TTY.
1696 TTYWC2: MOVE T,TTYTBL(U)
1697 TLNN T,%TBNOT ;RETURN RIGHT AWAY IF WE OWN THE TTY.
1701 ;HERE WHEN WANT TO DO A TTY RESET.
1702 ;SKIP IF THE RESET SHOULD REALLY BE DONE.
1704 ANDI I,%TICNS+(.BM $TIIDX)
1705 TRZN I,%TICNS ;CLEAR AND CHECK CONSOLE/DEVICE BIT
1706 JRST POPJ1 ;RETURN YES IF DEVICE
1708 TLNN T,%TBNOT ;RETURN YES IF WE OWN THE TTY.
1710 POPJ P, ;OTHERWISE IGNORE THE RESET.
1712 ;HERE TO WAIT FOR OUTPUT PERMISSION FOR TTY
1713 ;RETURN WITHOUT SKIP IF THE OUTPUT SHOULD BE THROWN AWAY
1714 ;AND REPORTED TO THE USER AS DONE.
1716 ANDI I,%TICNS+(.BM $TIIDX)
1718 JRST POPJ1 ;ALWAYS HAVE PERMISSION IF TTY IS A DEVICE.
1719 ;CALL FROM ATTYC, ETC.
1722 CAIN T,%TINON ;NEVER HAVE PERMISSION FOR CONSOLE IF WE'RE DISOWNED.
1724 MOVE T,TTYTBL(U) ;WE HAVE OUTPUT PERMISSION IFF ALL OUR SUPERIORS
1725 ;HAVE PERMISSION AND WE HAVE %TBOUT
1726 ;AND THE TREE HAS A TTY.
1727 ;THE NEXT INSN IS TEMPORARY, UNTIL DDT ETC. ARE CHANGED TO WIN FULLY.
1728 TTYWO3: JUMPGE T,TTYWO4 ;IF WE HAVE THE TTY, WE CAN TYPE ON IT.
1729 SKIPGE SUPPRO(A) ;ALL OK TO TOP OF TREE => SEE IF TREE HAS A TTY.
1731 TLNN T,%TBOUT ;NOT AT TREE TOP => DOES THIS JOB HAVE PERMISSION
1732 JRST TTYWO1 ;FROM ITS SUPERIOR?
1733 MOVE A,SUPPRO(A) ;AND IS THE SUPERIOR ALLOWING ANY INFERIORS PERMISSION?
1735 TLNE T,%TBINF ;SUPERIOR SAYS WE'RE OK => SEE IF SUPERIOR HAS PERMISSION.
1737 TTYWO1: MOVE T,TTYTBL(U) ;HERE IF WE DON'T HAVE PERMISSION.
1738 TLNE T,%TBOIG ;IF OUTPUT IS TO BE IGNORED,
1739 POPJ P, ;TELL OUR CALLER TO THROW IT AWAY, RIGHT NOW.
1740 TLNE T,%TBWAT+%TBOUT
1744 TLNE T,%TBNVR+%TBDTY
1745 JUMPL I,[ SUB P,[1,,1] ? JRST OPNL10 ]
1746 TTYWO6: MOVE T,TTYTBL(A) ;ELSE MUST WAIT. WAIT FOR A CHANGE IN THE
1747 CAMN T,TTYTBL(A) ;TTYTBL OF THE SUPERIOR DENYING US PERMISSION.
1749 JRST TTYWO ;NOW RE-CHECK EVERYTHING.
1751 ;WE HAVE PERMISSION, BUT MAYBE WAIT ANYWAY TO AVOID MIXING JOBS' OUTPUT.
1752 TTYWO4: SKIPGE TTYTBL(U) ;NO NEED TO WAIT IF WE OWN THE TTY
1753 CAMN U,TTYLJB(I) ;OR WE WERE LAST JOB TO USE IT.
1755 MOVEI T,TOBS ;ELSE WAIT FOR BUFFER TO BE EMPTY
1760 JRST TTYWO ;RECHECK EVERYTHING, SINCE WE MAY HAVE LOST PERMISSION.
1762 ;WE ARE ALLOWED TO OUTPUT RIGHT AWAY.
1763 TTYWO5: MOVEM U,TTYLJB(I) ;MAKE SURE WE DON'T HAVE TO WAIT AGAIN.
1766 ;TURN TTY OFF, THEN WAIT UNTIL EITHER TTY ISN'T IN COM MODE OR
1767 ;ONE OF THE BITS IN T IS SET IN TTYCOM(I).
1768 TTYCMW: CONO PI,TTYOFF
1773 POPJ P, ;SYS JOB TRYING TO HACK
1774 HRR T,I ;WAIT UNTIL NOT COM MODE OR IN COM MODE BUT ONE OR MORE BITS IN LH OF T
1775 PUSHJ P,LWAIT1 ;COME ON. WAIT UNTIL OUT OF COM MODE WITH UTCOFF
1779 TTYSCM: SKIPL TTYCOM(T)
1780 JRST POPJ1 ;NOT COM MODE
1784 AOS -1(P) ;MASKED BIT(S) ON
1789 ;ECHOIN SYSTEM CALL. ASK FOR ECHOING OF CERTAIN CHARACTERS
1790 ;UNTIL A BREAK CONDITION OCCURS.
1791 ;A BREAK CONDITION IS WHEN EITHER A NON-ECHOED CHARACTER IS TYPED IN
1792 ;OR A CERTAIN NUMBER OF CHARACTERS HAVE BEEN TYPED IN.
1793 ;CHARACTERS ECHOED BY THE ECHOIN ARE STORED INTO THE USER'S
1794 ;MEMORY BY THE INTERRUPT LEVEL. IF THE NECESSARY AREAS OF MEMORY
1795 ;ARE SWAPPED OUT, THAT CONSTITUTES A BREAK CONDITION.
1797 ;THE BREAK TABLE IS 128 BITS (DIVIDED INTO 4 WORDS THE LOW 4 BITS OF EACH UNUSED)
1798 ;ONE BIT FOR EACH ASCII CHARACTER. A 1 INDICATES A CHARACTER THAT
1799 ;IS A BREAK CONDITION. A 0 INDICATES A CHARACTER THAT CAN BE ECHOED.
1800 ;A CHARACTER WITH THE CONTROL OR META BIT IS ALWAYS A BREAK.
1802 ;ARG 1 TTY INPUT CHANNEL
1803 ;ARG 2 B.P. TO WHERE IN USER'S MEMORY TO STORE CHARACTERS.
1804 ;ARG 3 NUMBER OF CHARACTERS TO ALLOW
1805 ;ARG 4 ADDRESS OF BREAK TABLE.
1806 ;ARG 5 ADDRESS OF BLOCK OF COUNTERS TO BE INCREMENTED OR DECREMENTED FOR EACH CHARACTER.
1807 ; IF THE ADDRESS IS ZERO, ALL THIS IS OMITTED.
1808 ; THE BLOCK HAS SEVEN WORDS.
1809 ; THE FIRST TWO WORDS ARE LEFT ALONE.
1810 ; THE NEXT FOUR ARE INCREMENTED.
1811 ; THE SEVENTH IS DECREMENTED.
1813 ;THE WORDS OF THE BREAK TABLE RESIDE IN ACS Q, J, R AND W.
1814 ;SIMILARLY, THE ADDRESS OF THE COUNT RESIDES IN AC C,
1815 ;THE ADDRESS OF THE BYTE POINTER IN B,
1816 ;AND THE ADDRESS OF THE BLOCK OF COUNTERS IN E.
1817 ;THEY ARE LOOKED AT BY THE INTERRUPT LEVEL,
1818 ;WHICH KNOWS THAT THE PROGRAM IS EXECUTING AN ECHOIN
1819 ;BY THE FACT THAT THE PC IS NECHO1. IT IS IMPORTANT THAT WE
1820 ;NOT LOCK ANY SWITCHES SO THAT SWAPPING OUT A PAGE WON'T PCLSR
1821 ;US UNTIL WE ARE AWAKENED BY THE INTERRUPT LEVEL WHEN IT SEES
1822 ;THAT THE PAGES IT NEEDS ARE NOT IN CORE.
1825 JSP J,ATTYCR ;DECODE CHANNEL. GET TTY NUMBER IN I.
1826 XCTR XRW,[MOVES A,(C)] ;MAKE SURE COUNT IS IN CORE AND WRITABLE.
1827 JUMPLE A,POPJ1 ;IF WANT ZERO OR FEWER CHARACTERS, RETURN IMMEDIATELY.
1828 XCTR XRW,[MOVES A,(B)] ;MAKE SURE BYTE POINTER IS IN CORE AND WRITABLE.
1829 IBP A ;MAKE SURE BYTE BUFFER IS IN CORE AND WRITABLE.
1830 XCTR XRW,[MOVES (A)] ; (NO LOSSAGE IF IT ISN'T, BUT MIGHT AS WELL SWAP IT IN NOW.)
1831 XCTR XRW,[MOVES (E)] ;MAKE SURE BLOCK OF COUNTERS IS IN CORE AND WRITABLE.
1832 XCTR XRW,[MOVES 6(E)]
1833 UMOVE Q,(D) ;LOAD BREAK TABLE WORDS INTO Q, J, R, W.
1837 SKIPE TICC(I) ;IF TYPE-AHEAD AVAILABLE, WE CAN'T DO ANYTHING.
1839 SKIPG TACC(I) ;WAIT FOR AN ACTIVATION (PROBABLY NON-ECHOED) CHARACTER.
1840 PUSHJ P,TYIFL2 ;CALL TYIFL2 INSTEAD OF UFLS TO PREVENT IMPENDING **MORE**.
1841 NECHO1: JRST POPJ1 ;THE JOB IS INSIDE AN ECHOIN IF ITS PC IS HERE.
1843 SUBTTL TTY INPUT IOT
1845 ;BLOCK MODE INPUT IOT.
1848 ;UNIT MODE INPUT IOT.
1849 ;R HAS THE ADDRESS OF THE IOCHNM WORD.
1850 ;VALUE RETURNED IN W.
1851 TYI: PUSHJ P,TTYWI ;WAIT FOR THE TTY IF ITS A CONSOLE. TTY NUMBER IN I
1852 HLRZ R,(R) ;GET IOCHNM WORD FLAGS, MODIFIED BY CTL BITS
1853 XOR R,CTLBTS(U) ;R HAS CHANNEL FLAGS
1855 PUSHJ P,TYI0 ;GET THE CHAR IN D.
1857 JUMPL D,UNIEOF ;TYI0 RETURN -1 => DON'T FLUSH THE SIGN BIT, AND TERMINATE BLOCK IOT.
1858 ANDI D,%TXPIE+%TXMPE+%TXECI+%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
1860 AOS (P) ;EOF, SKIP RETURN
1864 ;ASSUMING I HAS TTY NUMBER AND R HAS IOCHNM BITS.
1865 ;READ A CHARACTER FROM THE TERMINAL AND RETURN IT IN D.
1866 TYI0: MOVE D,TTYTYP(I)
1867 TRNN D,%TYSTY ;SKIP IF TTY IS ALTER EGO OF STY.
1870 TDNE D,STYSTS-NFSTTY(I)
1871 JRST TYI1B1 ;HAVE ALREADY GIVEN INT
1874 IORB D,STYSTS-NFSTTY(I)
1875 MOVE TT,STYOMS-NFSTTY(I) ;CHANNELS OPEN FOR OUTPUT ON
1879 IORM TT,IFPIR(D) ;GIVE INT ON LOWEST-NUMBERED CHANNEL.
1882 TYI1B1: TRNE R,%TIACT
1883 JRST TYI1B ;GOBBLE NEXT CHR REGARDLESS OF ACTIVATION
1890 TYI1B: PCLT ;WAIT TILL THERE'S A CHAR TO READ.
1893 CONO PI,CLKOFF ;PREVENT ECHOING WHILE WE'RE MESSING WITH POINTERS.
1899 SKIPN TT,TICC(I) ;CHECK FOR CHAR FLUSHED BY ECHO BEFORE WE TURNED OFF CLOCK.
1905 JRST [ PUSHJ P,TYIREM
1908 CAMN T,TIOP(I) ;WAIT FOR ECHOING TO FLUSH THIS CHAR FROM BUFFER,
1910 TYI1A: CONO PI,CLKON ;ALLOW ECHOING.
1911 JRST TYI1B1 ;THEN TRY AGAIN TO READ CHAR.
1913 TYI1: CONO PI,CLKON ;ALLOW ECHOING.
1915 TLNN T,%TSNOE ;ECHOING BEING DEFERRED OR
1916 TRNE R,%TIECH ;THIS CHANNEL NEEDN'T WAIT FOR ECHO
1917 ANDCMI D,%TXPIE ;=> DON'T.
1918 SKIPE PICLR(U) ;AT INT LVL IN USER PRGM OR
1919 TRNE R,%TIINT ;THIS CHNL NEEDN'T WAIT FOR CHAR TO INTERRUPT
1920 ANDCMI D,%TXINT ;=> DON'T WAIT FOR THAT.
1922 ANDI T,%TXINT+%TXPIE ;WAIT FOR THESE BITS TO CLEAR.
1923 TRNE T,%TXINT ;IF ABOUT TO WAIT FOR %TXINT TO CLEAR,
1924 PUSHJ P,TYIIWT ;TAKE CARE OF SEVERAL POSSIBLE SCREWS - MAY SET T.
1929 PUSHJ P,UFLS ;HANG UNTIL PI ECHO BIT FOR THIS CHAR IS TURNED OFF
1930 LDB D,B ;GET CHARACTER
1931 TRNN R,%TIECH ;IF WE AREN'T SUPPRESSING ECHOING,
1932 TRNN D,%TXMPE ;AND M.P. ECHOING NEEDED BUT NOT YET DONE,
1937 JRST TYIMP1 ;GO DO IT.
1939 TYIMP1: PUSH P,R ;DO MAIN-PRGM ECHO IF NECESSARY.
1941 PUSHJ P,[MOVEI J,1(P)
1945 PUSHJ P,NULSET ;NO LOSSET OF IOCHNM
1947 MOVEI R,%TJECH+%TJMOR
1949 ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
1958 TRZ D,%TXMPE ;M.P. ECHOING NO LONGER PENDING FOR THIS CHAR.
1961 TYI2: TRNN R,%TIPEK ;DON'T REMOVE IF CHNL SAYS DON'T.
1962 PUSHJ P,TYIREM ;FINALLY REMOVE CHAR FROM BUFFER.
1964 TLNE TT,%TCLED ;DOES THIS JOB WANT TO SEE LOCAL EDITING PROTOCOL
1965 JRST TYI2Z ;REPLIES, ETC.?
1967 ANDI TT,%TXTOP+%TXASC ;NO. DISCARD THEM.
1968 CAIE TT,%TXTOP+"S ;TOP-S AND TOP-E ARE SPECIAL COMMANDS SENT
1969 CAIN TT,%TXTOP+"E ;BY LOCAL EDITING TTYS.
1970 JRST [SKIPG TICC(I) ;IGNORE THE TOP-E OR TOP-S,
1971 PUSHJ P,UFLS ;AND THE CHARACTER AFTER IT AS WELL.
1974 CAIN TT,%TXTOP+"T ;TOP-T MEANS "LABEL FAILURE" IN LINE SAVING PROTOCOL.
1975 JRST [ MOVEI T,3 ;IGNORE COMMAND AND THREE ARGS.
1982 TYI2Z: MOVE T,TTYSTS(I)
1985 JRST TYI3 ;DEFERRED CALL IGNORED IF TOP-LEVEL, OR NOT A CONSOLE
1987 JRST [ TRNE R,%TIPEK ;DEFERRED CALL
1988 PUSHJ P,TYIREM ;REMOVE IT IF DIDN'T ALREADY
1991 TYI3: MOVSI TT,%TSACT
1993 ;TYIFLS CAN COME HERE AFTER THROWING AWAY 1 WORD FROM STACK, FOR NO CHARS AVAIL WITH %TINWT.
1994 TYI4: MOVSI TT,%SSINT ;IF TTY IS STY'S, MAKE SURE NEXT TTY IOT GIVES STY OUTPUT INT.
1997 ANDCAM TT,STYSTS-NFSTTY(I)
1998 SKIPGE A,D ;CHAR IN A FOR TYINRM
1999 POPJ P, ;DON'T CANONICALIZE A -1 (NO CHARS AVAILABLE) TO A RUBOUT!
2000 PUSHJ P,TYINRM ;CANONICALIZE TO ASCII UNLESS %TIFUL IS SET.
2001 ANDI D,%TXPIE\%TXMPE\%TXECI ;BUT PRESERVE THE EXTRA INFO BITS
2002 IOR D,A ;WHICH ARE NOT REALLY PART OF THE CHARACTER.
2006 ;ASSUME R HAS IOCHNM BITS (OR AT LEAST THE %TIFUL BIT).
2007 ;TURN CHAR. IN A TO 7-BIT ASCII CHAR IF %TIFUL IS OFF.
2008 TYINRM: ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
2011 MOVE TT,A ;LEAVE THE HELP CHARACTER ALONE
2012 ANDI TT,%TXTOP+%TXASC ;(THIS USED TO FLUSH THE SUPER ("SHIFT") BIT
2013 CAIN TT,%TXTOP+"H ; PERHAPS IT SHOULD FLUSH ALL OF CTL/MTA/SUP?)
2015 TYINR2: ANDI A,%TXCTL+%TXASC ;FLUSH THE EXTRA BITS.
2016 TRZE A,%TXCTL ;DON'T WANT FULL CHAR SET: TURN CTL+X INTO ASCII CTL-X
2017 CAIN A,177 ;BUT LEAVE CTL-RUBOUT AS RUBOUT, FOR TECO'S SAKE.
2019 CAIGE A,77 ;CTL-? => RUBOUT
2020 JRST [ CAIN A,40 ;CTL-SPACE => CTL-@
2021 MOVEI A,^@ ;41-76 STAY THE SAME
2022 POPJ P, ] ;LETTERS TURN INTO ASCII CONTROLS
2023 CAIL A,140 ;TO CONTROLIFY, FIRST TURN LOWER CASE TO UPPER,
2025 XORI A,100 ;THEN TOGGLE 100 BIT, TURNING A INTO ^A AND ? INTO RUBOUT.
2028 ;REMOVE THE FIRST CHAR. FROM THE INPUT BUFFER, AND RETURN IT IN D.
2029 ;UPDATES ALL COUNTS AND POINTERS. HALTS IF BUFFER EMPTY.
2031 TYIREM: CONO PI,TTYOFF
2035 TYIRE1: SOSGE TICC(I) ;ENTRY WHEN TTYCHN IS OFF.
2036 BUG PAUSE,[TTY: BUFFER EMPTY AT TYIREM]
2037 MOVE B,TIOP(I) ;SAVE COPY OF BUFFER-EMPTYING POINTER IN TT.
2039 CAMN B,TIBEP(I) ;ADVANCE THE POINTER, FETCHING THE CHARACTER.
2043 TRNE D,%TXACT ;IF CHAR SAYS IT WAS AN ACTIVATION CHAR, UPDATE # OF ACTIVATION
2044 SOS TACC(I) ;CHARS STILL INB THE BUFFER.
2045 TRNE D,%TXPIE ;IF IT NEEDED PI ECHO,
2046 SOS ECHOC(I) ;ONE FEWER CHAR AWAITS PI ECHO.
2048 SOS TINTC(I) ;SIMILAR FOR INT. TO PROGM.
2051 BUG PAUSE,[TTY: TINTC OR ECHOC OVER-DECREMENTED]
2052 CAMN TT,ECHOP(I) ;IF ECHOP POINTED AT THIS CHAR,
2053 MOVEM B,ECHOP(I) ;ADVANCE IT.
2054 CAMN TT,TINTP(I) ;SIMILAR FOR TINTP
2058 ;COME HERE WHEN ABOUT TO WAIT FOR A CHAR'S %TXINT TO CLEAR OUT.
2059 ;CLOBBERS D, TT; MAY ZERO %TXINT IN T, IN WHICH CASE CALLER SHOULD
2060 ;NOT BOTHER TO WAIT FOR %TXINT TO CLEAR.
2061 TYIIWT: MOVE D,MSKST2(U)
2062 AND D,TYIMSK(I) ;D GETS ENABLED TTY INPUT CHANNELS.
2064 ANDCM TT,IDF2(U) ;TT GETS ENABLED, UNDEFERRED TTY INPUT CHANNELS.
2065 TDNE TT,IFPIR(U) ;IF AN INTERRUPT IS PENDING ON ONE OF THEM, %TXINT
2066 POPJ P, ;WILL CLEAR IF WE LET THE INT. HAPPEN.
2067 MOVN TT,D ;ELSE GET LOWEST NUMBERED ENABLED INPUT CHANNEL'S BIT
2069 AND D,IDF2(U) ;IF THAT CHANNEL ISN'T DEFFERED,
2070 IORM D,IFPIR(U) ;REQUEST AN INTERRUPT ON IT, AND WE CAN STILL WIN.
2072 ANDCMI T,%TXINT ;CAN'T RQ AN INT, SO BIT WON'T BE CLEARED, IT IS CERTAIN,
2073 POPJ P, ;SO GIVE UP ON WAIITING FOR IT TO CLEAR.
2075 ;COME HERE TO HANG UP FOR INPUT. LIKE UFLS BUT PREVENTS
2076 ;A **MORE** THIS TIME AROUND THE SCREEN, ON GROUNDS THAT USER
2077 ;HAS COMMANDED THE OUTPUT FOR 1 MORE PAGE AT LEAST.
2078 ;IF %TINWT IS SET, INSTEAD OF HANGING, THROW AWAY RETURN ADDRESS
2079 ;AND JUMP TO TYI4, TO RETURN -1 FROM THE IOT.
2081 TYIFLS: TRNE R,%TINWT
2085 ;ENTER HERE FROM ECHOIN - R IS NOT MEANINGFUL.
2086 TYIFL2: MOVE H,TTYOPT(I)
2087 TLNE H,%TOMVU ;THIS DOESNT APPLY TO ARDS-LIKE DISPLAYS
2093 ANDCAM A,TPFLAG(D) ;CLEAR PENDING MORE
2095 MOVE A,TCMXV(I) .SEE TPVE;(D)
2096 TLNE H,%TOMVU ;PRINTING TTY'S AND DISPLAYS IN SCROLL MODE
2097 TLNE D,%TSROL ;DO ONE THING.
2099 CAME A,TPVB+TPLEN(D) ;FOR WRAP-AROUND DISPLAYS,
2100 JRST UFLS ;IF NOT USING AN ECHO AREA,
2101 MOVEI A,6 ;PREVENT MORES FOR THE NEXT 6 LINES.
2105 TYIFL1: SUB A,TTYROL(I) ;IN SCROLL MODE, **MORE** WHEN THIS LINE GOES OFF THE SCREEN.
2109 SUBTTL TTY OUTPUT IOT
2111 ;THESE PUSHED BY TYOSET, REFERENCED INDEX OF J.
2112 TYOPV0==0 ;COUNT OF NUMBER OF CHARACTERS THAT WE CAN TAKE A SHORTCUT FOR,
2113 ;IN SUPERIMAGE MODE SIOT.
2114 ;TYOPV1 UNUSED, BUT SPACE ALLOCATED.
2115 TYOPV2==2 ;-> IOCHNM WORD OF CHANNEL IOT IS ON.
2116 TYOPV3==3 ;PC PPR IDX,,TTY #.
2119 ;TO OUTPUT TO A TTY (R -> IOCHNM WD OF TTY CHNL)
2120 ; JSP E,TYOSET ;WAIT TILL JOB HAS TTY AND OUT OF COM MODE,
2121 ; ;INIT FOR PCLSRING, PUSH VARS ON STACK.
2122 ; JRST IGNORE ;TYOSET RETURNS HERE IF THIS OUTPUT SHOULD BE DISCARDED.
2123 ; ... ;OUTPUT 1 OR MORE CHARS TO TTY
2124 ; ;MEANWHILE, J -> BLOCK OF 4 STACK VARS.
2125 ; POPJ P, ;RETURNS TO TYOUNS TO FLUSH STACK, ETC.
2127 TYOSET: PUSHJ P,TTYWO ;WAIT TILL THIS JOB HAS OUTPUT PERMISSION.
2128 JRST (E) ;RETURN IF OUTPUT BEING IGNORED.
2129 AOS E ;SKIP THAT RETURN IF WE ARE GOING TO DO THE OUTPUT.
2131 MOVEI T,TYOWNC ;FOR SYSTEM JOB, CHECK TTOALC WITH A TIMEOUT IN CASE
2132 SKIPL TTOALC(I) ;THE TTY IS FORGETTING TO TURN TYPEOUT BACK ON.
2134 JRST TYOSE4 ;NOTE THAT TYOW2 CAN POP1J.
2136 TYOSE3: SKIPL TTOALC(I) ;^\ CAN DELAY TYPEOUT AT M.P. LEVEL THROUGH SIGN OF TTOALC.
2137 PUSHJ P,UFLS ;ALSO USED BY OUTPUT RESET ON SOFTWARE TTY.
2138 TYOSE4: MOVEI J,1(P) ;PROVIDE SPACE FOR TEMPS, WHERE FINSET CAN FIND THEM.
2140 PUSH P,R .SEE TYOPV2
2142 MOVSI T,%TCLFT+%TCOCO+%TCICO
2144 PUSHJ P,TTYCMW ;WAIT TILL TTY IS NOT IN COM MODE, OR OVER-RIDDEN.
2146 MOVEI A,%TJCNS+77+%TJCP1+%TJCP2+%TJSTP+%TJINK ;DON'T LET THESE IOCHNM BITS BE CHANGED
2147 ANDCAB A,CTLBTS(U) ;EVEN TEMPORARILY.
2148 HRLZS A ;ELSE, IF A BIT IS SET IN THE CTL BITS,
2149 XORB A,(R) ;CHANGE IT (TEMPORARILY) IN IOCHNM WORD.
2150 PUSHJ P,LOSSET ;SET UP ROUTINE TO UNDO THAT TEMPORARY CHANGE
2151 [MOVE A,AC0S+J(U) ;IF WE SHOULD PCLSR OUT
2157 TRNE A,%TJSTP ;IF WE ARE HUNG IN A **MORE**, WAIT TILL THERE'S A CHARACTER
2158 PUSHJ P,TYOSMR ;IT'S IMPORTANT WE WAIT WITOUT TYOSW SET - ELSE NO ECHOING!
2159 MOVE TT,I ;NOW MAKE TT -> APPRO. PC PPR FOR THIS CHNL.
2163 TYOSE1: PCLT ;ENTER HERE FROM INPUT IOT WHEN DOING M.P. ECHOING
2164 AOSE TYOSW(I) ;SEIZE THIS TTY FOR MP LEVEL.
2165 JRST [SKIPL TYOSW(I)
2168 PUSHJ P,LSWDEL ;THEN SET UP LOSSET ROUTINE FOR BOTH TYOSW AND
2169 PUSHJ P,LOSSET ;PREVIOUSLY-LOSSET'ED CHANGE TO IOCHNM BITS.
2177 CAMN TT,TTYLPP(I) ;IF TTY IS ASSOCIATED W/ ANOTHER PC PPR,
2181 PUSHJ P,TYOMVC ;DISASSOCIATE THEM.
2184 TYOSE2: PUSH P,I .SEE TYOPV3
2187 TLNE Q,%TCECH ;IF THERE'S ECHOING OUTPUT IN OUTPUT BUFFER,
2188 JRST [ PCLT ;WAIT FOR IT TO GET PRINTED. MUSTN'T HAVE ECHO AND
2189 PUSHJ P,TYOWC ;OUTPUT IN THE OUTPUT BUFFER AT ONE TIME.
2193 TLNE Q,%TCMTR ;IF THIS TTY IS A TERMINET & ITS MOTOR IS OFF,
2194 PUSHJ P,TTTMTO ;TURN THE MOTOR ON BEFORE OUTPUT.
2197 TYOUNS: CAIA ;IF WE ARE SKIPPED INTO, PROPAGATE THE SKIP.
2201 TYOUN1: HRLZ R,CTLBTS(U) ;UNDO TEMPORARY CHANGES IN IOCHNM WD.
2204 SKIPGE TTYERQ(I) ;IF ECHOING ISN'T ALREADY REQUESTED,
2205 SKIPL TTYLPP(I) ;AND THERE IS BUFFERED CURSOR POSITIONING,
2208 MOVEI J,TTEDMY ;SO TYOFNR WON'T CLOBBER RANDOMNESS.
2209 SETCM TT,TTYLPP(I) ;TT -> PC PPR TTY WAS DISSOCIATED FROM.
2212 CAIN A,TOBS ;AND IT CAN BE DONE NOW,
2213 PUSHJ P,TYOFRC ;FORCE OUT BUFFERED CURSOR MOTION.
2217 TYOUN3: SETOM TYOSW(I) ;RELEASE TTY.
2220 ;WAIT TILL THERE'S A TTY INPUT CHARACTER.
2223 MOVEI R,%TIACT+%TIECH+%TIPEK
2234 TTYBO3: CAIN A,EOFCH
2242 ;IGNORE SOME BLOCK MODE OUTPUT.
2243 TTYBOI: XCTR XRW,[MOVES D,(C)]
2248 ADD D,A ;COUNT THE AOBJN POINTER ALL THE WAY OUT.
2249 XCTR XRW,[MOVEM D,(C)]
2252 JRST TYOBP ;SIOT DISPATCH IS -1 + ADDR. OF UNIT MODE ROUTINE.
2253 ;UNIT MODE TTY OUTPUT.
2255 POPJ P, ;JUST RETURN IF WE ARE SUPPOSED TO DISCARD THE OUTPUT.
2259 ;MUSTN'T CLOBBER C OR D.
2260 TTYBO1: HLRZ R,@TYOPV2(J) ;RH(R) GETS LH(IOCHNM WD)
2263 TYOBP2: ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
2264 SKIPGE E,TTYCOM(I);IN COM MODE W/ LOCAL FEED THRU,
2270 PUSH P,TT ;ECHO CHAR ON ALL TTYS IN LOOP
2271 PUSH P,R ;THAT HAVE REMOTE-FEED-THRU.
2272 PUSHJ P,TYCREP ;DO FOLLOWING INSN FOR EACH TTY IN LOOP.
2273 PUSHJ P,TYO7 ;(# OF TTY DOING IT FOR PUT IN I)
2274 JFCL ;(TYCREP WILL SKIP IF THAT INSN ALWAYS DOES)
2282 TYO7: MOVE D,TTYCOM(I) ;IF THIS TTY WANTS MY TYPEOUT.
2284 CAMN I,-2(P) ;AND IF IT ISN'T ME,
2286 PUSHJ P,TYCSET ;SET UP ACS Q,R,U FOR TTY TO ECHO ON.
2289 PUSHJ P,TTYI13 ;ECHO CHAR ON THIS TTY.
2293 ;SIOT ROUTINE FOR TTY OUTPUT - JUST LIKE REPEATED UNIT MODE,
2294 ;BUT MOVES THE TYOSET OUTSIDE THE LOOP TO SAVE TIME.
2295 TYOBP: MOVEM B,SRN3(U) ;SAVE B, C; CAN'T USE STACK SINCE TYOSET PUSHES.
2297 JSP E,TYOSET ;SET UP FOR DOING TTY OUTPUT.
2298 JRST TYOBPI ;RETURN HERE IF WE SHOULD DISCARD THE OUTPUT
2299 HLRZ R,@TYOPV2(J) ;FOR TYOFRC
2301 TRNN R,%TJSIO ;ONLY IN SUPER-IMAGE MODE,
2303 PUSHJ P,TYOFRC ;FORCE OUT ALL PREVIOUS MAIN PROGRAM CURSOR MOTION
2304 MOVE B,SRN3(U) ;BE JUST LIKE ORDINARY REPEATED-UNIT-MODE SIOT,
2305 MOVE C,SRN4(U) ;EXCEPT THAT THE TYOSET IS OUTSIDE THE LOOP.
2306 SETOM TYOPV0(J) ;CAN'T TAKE SHORTCUT AT FIRST.
2307 MOVE D,[%IOTOT,,.+2]
2308 JRST NSIOT1 ;SIOT ROUTINE WILL COME BACK FOR EACH CHAR, PRESERVING I,J,TT
2310 MOVE A,D ;PUSHJ HERE FOR EACH CHARACTER.
2311 SOSG TYOPV0(J) ;PERHAPS THE PREVIOUS CHARACTER DISCOVERED WE CAN
2312 ;START TAKING THE SHORTCUT.
2313 JRST TYOBP2 ;IF NOT, DO THE WHOLE PILE OF WORK.
2314 ANDI A,%TXDIS+%TXASC
2316 TLNN E,%TCLFT ;SHORT CUT IS TO PUT THE CHARACTER RIGHT IN THE OUTPUT BUFFER.
2317 JRST TYONCC ;MAY BE USED ONLY FOR SUPERIMAGE OUTPUT.
2318 JRST TYOBP2 ;AND BETTER NOT BE IN COM MODE WITH LOCAL FEED THRU.
2320 ;IGNORE THIS STRING OF OUTPUT; TELL THE USER WE OUTPUT IT.
2321 TYOBPI: MOVE B,SRN3(U)
2328 XCTR XRW,[MOVEM T,(B)]
2329 XCTR XRW,[MOVEM TT,(C)]
2333 ;A USUALLY HOLDS THE CHAR BEING IOTTED, OR THE CHAR TO BE PUT IN BUFFER.
2335 ;C IS USUALLY UNUSED, AND MUSTN'T BE CLOBBER BY IOT RTN.
2338 ;TT HOLDS THE INDEX OF THE PC PPR BEING USED.
2339 ;I HOLDS THE TTY NUMBER.
2340 ;H HOLDS THE TTY'S TTYOPT WORD.
2341 ;J HOLDS THE INDEX OF A 4-WORD BLOCK USUALLY ON THE STACK
2342 ; INDEX USING TYOPV0, TYOPV1, TYOPV2, TYOPV3.
2344 ;R'S RH HOLDS THE IOCHNM WORD'S LH.
2345 ;Q HOLDS THE BP FOR STORING IN OUTPUT BUFFER.
2346 ; INITTED FROM TOIP, AND STORED BACK IN TOIP WHEN FINALIZED.
2349 MOVEI T,TYOWNC ;MAKE SURE AT LEAST TYOWNC
2350 CAML T,TORM(I) ;CHARS OF SPACE LEFT IN OUTPUT BUFFER.
2351 PUSHJ P,TYOW2 ;NOTE THIS CAN POP1J. SO CAN TYOWN.
2354 TRNN H,%TP11T ;FOR A PDP11 TV TTY,
2356 SKIPL TT11P ;IGNORE IT IF PDP11 ISN'T UP.
2358 PUSHJ P,TYOWN ;WAIT TILL AT LEAST TYOWNC CHARS SPACE.
2359 ] ;(TORM HAS NO INFO ON TV TTYS).
2360 ;A,R,I,TT,H,J SET UP AT THIS POINT.
2361 ;ENTER HERE FROM PI LEVEL TO ECHO CHARS
2362 TYO8: MOVE Q,TOIP(I) ;GET COPY OF BP TO STORE WITH.
2363 ;WHEN OUTPUTTING CHARS, WILL UPDATE Q INSTEAD TOIP.
2364 ;THEN, WHEN CAN NO LONGER PCLSR, DO TOIP(I)_Q.
2366 TYOIG1: TRNE B,%TFEOP+%TFIGL ;ANY EXCEPTIONAL CONDITION FOR THIS PC PPR?
2367 JRST TYOIGL ;IF SO, HANDLE IT.
2368 TYOEO9: TRNE R,%TJCP1+%TJCP2+%TJSTP+%TJSIO+%TJINK
2369 JRST TYOCP1 ;HANDLE ANY EXCEPTIONAL CONDITION FOR CHANNEL.
2370 TRNE A,%TXCTL+%TXMTA+%TXSUP+%TXTOP
2371 JRST TYOMTA ;TAKE CARE OF FUNNY BITS IN CHARACTER.
2373 JRST TYONRM ;PRINTING CHARS AND RUBOUT.
2375 JRST TYOSPC ;SPACE MAY BE EITHER PRINTING OR CURSOR MOTION.
2376 CAIL A,^G ;< ^G OR > ^S => NORMAL CTL CHAR,
2377 IFE 0, CAIL A,^Q ;RIGHT NOW, ^S USES %TGIMG OF GROUP 0.
2378 IFN 0, CAIL A,^T ;BUT FOR INPUT, IT USES GROUP 6. THIS INSN MAKES IT USE GROUP 6 FOR OUTPUT TOO.
2380 JRST @.+1-^G(A) ;ELSE DO WHAT THIS PARTICULAR ONE WANTS.
2382 TYOBEL ;^G DOESN'T MOVE CURSOR.
2383 TYOBS ;^H MOVES BACKWARDS.
2384 TYOTAB ;^I MOVES TO TAB STOP.
2385 TYOLF ;^J IS LINEFEED.
2386 TYOCTL ;^K IS NORMAL.
2387 TYOFF ;^L MAY CAUSE A **MORE**
2388 TYOCR ;^M IS A CARRET
2389 TYOCTL ;^N IS NORMAL
2390 TYOCTL ;^O IS NORMAL
2391 TYOCTP ;^P MAY SIGNIFY A CURSOR CTL CODE.
2392 TYOCTL ;^Q IS NORMAL
2393 TYOCTL ;^R IS NORMAL
2394 TYOCTS ;^S IS NORMAL EXCEPT USES A DIFFERENT GROUP'S %TGIMG.
2396 ;OUTPUT CHARACTER IN SUPERIMAGE MODE.
2398 MOVEI B,TYOWNC ;IF WE'VE GOT THIS FAR, THEN THERE'S AT LEAST TYOWNC CHARS OF SPACE,
2399 CAME TT,TTYLPP(I) ;IF DISSOCIATED,
2402 PUSHJ P,TYOASS ;ASSOCIATE,
2404 CAME T,Q ;AND IF THAT REQUIRED OUTPUT,
2405 SUBI B,5 ;THAT'S SO MANY FEWER CHARS BEFORE TIME TO CHECK TORM AGAIN.
2407 MOVEM B,TYOPV0(J) ;AND NO UNUSUAL CONDITIONS, SO SIOT CAN GO FAST FOR A WHILE.
2408 ;OUTPUT A CHAR WITH NO CURSOR CONTROL.
2409 ;ASSUMES ITS POSITION DOESN'T MATTER.
2410 TYONCC: PUSHJ P,TYOOUT
2413 ;COME HERE WHEN ^P IS OUTPUT.
2414 TYOCTP: TRNN R,%TJDIS ;IS THIS OUTPUT CHNL TREATING ^P SPECIALLY?
2415 JRST TYOCTL ;NO, TREAT ^P AS NORMAL CTL CHAR.
2416 TRO R,%TJCP1 ;YES, SAY TREAT NEXT CHAR AS CURSOR CODE.
2419 ;COME HERE TO OUTPUT A ^S.
2420 TYOCTS: CAME TT,TTYLPP(I)
2421 PUSHJ P,TYOASS ;PREPARE TO OUTPUT PRINTING CHARACTERS.
2422 HLLZ T,TTYST2(I) ;GET THE RELEVANT %TGIMG BIT.
2427 TYOBEL: MOVEI A,%TDBEL
2430 ;COME HERE FOR ^PP - OUTPUT A ^P.
2431 TYOCPP: SKIPA A,[^P]
2433 ;COME HERE FOR ^PQ TO OUTPUT A ^C.
2436 ;COME HERE FOR NORMAL (NON-FORMATTING) CONTROLS.
2437 TYOCTL: CAME TT,TTYLPP(I)
2438 PUSHJ P,TYOASS ;PREPARE TO OUTPUT PRINTING CHARACTERS.
2440 JRST TYOALT ;CHECK FOR ALTMODE.
2441 HLLZ T,TTYST1(I) ;GET THE "OUTPUT IN IMAGE MODE" BIT THAT'S RELEVANT.
2443 TYORU2: TRNE R,%TJECH ;ECHO-MODE OUT => PRINT IN ASCII MODE.
2446 TLNE B,%TSSAI ;SHOULD USE SAIL CHAR SET FOR OUTPUT => DO SO.
2448 JUMPN T,TYOAL1 ;IF "OUTPUT IN IMAGE" IS SET, GO DO SO.
2449 TYOCT1: HRLM A,(P) ;ELSE OUTPUT CTL CHAR IN ASCII MODE,
2450 MOVEI A,"^ ;AS "^" FOLLOWED BY UN-CTL'ED CHAR.
2452 MOVEI A,13 ;IF TTY HAS SAIL MODE, USE A SAIL UPARROW.
2458 TYOAL1: TLNN H,%TOSAI
2462 ;HANDLE CHARACTERS WHICH HAVE %TXCTL, %TXMTA, %TXSUP OR %TXTOP SET.
2463 TYOMTA: MOVE B,TTYSTS(I)
2464 TLNN B,%TSFCO ;IF USER DOESN'T WANT FULL CHAR SET OUTPUT,
2465 JRST TYOMT4 ;IGNORE THE META BITS (USUALLY).
2467 PUSHJ P,TYOMT1 ;ECHO AN ALPHA FOR %TXCTL.
2469 PUSHJ P,TYOMT2 ;TYPE A BETA FOR %TXMTA
2472 TRZN A,%TXCTL+%TXTOP ;IF CTL OR TOP IS SET, THE CHARACTER
2474 CAIN A,40 ;ISN'T AN ASCII CONTROL CHAR EVEN IF < 40
2475 JRST TYOSPC ;(BTW, SPACE IS STILL SPACE)
2478 TYOMT3: TLNE H,%TOSAI
2480 CAME TT,TTYLPP(I) ;WE HAVE WHAT WOULD OTHERWISE BE AN ASCII CTL CHAR.
2486 TYOMT5: MOVEI B,6 ; EPSILON
2489 TYOMT1: SKIPA B,[2] ; ALPHA
2490 TYOMT2: MOVEI B,3 ; BETA
2491 TYOMT6: CAME TT,TTYLPP(I)
2498 TYOMT4: TRNN R,%TJECH ;FOR OUTPUT, IGNORE THE META BITS. FOR ECHO,
2499 ANDI A,%TXASC ; TRY TO ECHO WHAT THE GUY TYPED.
2500 TRNE A,%TXTOP ;IF TOP IS ON,
2501 TLNN H,%TOSAI ;AND THE TTY HAS THE SAIL CHAR SET,
2502 TRZA A,%TXMTA+%TXSUP+%TXTOP
2503 JRST TYONR3 ;ECHO THE CHAR USING SAIL CHAR SET.
2504 PUSHJ P,TYINR2 ;ECHO AS WHAT PROGRAM SEES
2505 JRST TYOMT9 ;ALSO HACKS SUCH AS ^L MAY CLEAR THE SCREEN
2507 ;HANDLE SPACE: ON OVERPRINTING TERMINALS, SPACE = ^PF.
2508 ;ON IMLACS, SPACE = SPACE BECAUSE THE IMLAC PROGRAM LOSES FOR ^PF AT END OF LINE.
2509 ;ON RAW TERMINALS, SPACE OF COURSE GOES OUT AS SPACE.
2510 ;ON OTHER TERMINALS, SPACE = SPACE. THIS IS A CROCK, BUT IT IS NECESSARY
2511 ;BECAUSE ^PF TAKES 6 TIMES AS LONG ON DATAPOINTS BECAUSE OF PADDING,
2512 ;AND TWICE AS LONG ON VT52S BECAUSE IT TAKES TWO CHARACTERS.
2514 TYOSPC: TLNN H,%TOOVR ;NON-OVERPRINTING => OUTPUT A REAL SPACE.
2515 JRST [ TLNE H,%TOMVU
2517 HLRE B,TTYLPS(I) ;BUT ON GLASS TTY'S (NON-OVERPRINTING, NO UPWARD MOTION)
2519 JUMPGE B,.+1 ;IT IS SAFE TO TREAT SPACES AS CURSOR MOTION
2520 JRST TYONRM] ;IF THEY ARE GOING TO FOLLOW DOWNWARD MOTION ANYWAY.
2521 TLNE H,%TORAW+%TOIML ;IMLAC, OR NO OPTIMIZATION => OUTPUT A REAL SPACE.
2522 JRST TYONRM ;NORMAL CHARACTER.
2524 PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
2525 AOS B,TPHP(TT) ;MOVE FORWARD 1 POS.
2526 CAML B,TCMXH(I) .SEE TPHE;(TT)
2529 SOS TPHP(TT) ;IF NECESSARY, CONTINUE TO NEXT LINE AND RETRY.
2533 TYONR3: ANDI A,%TXASC
2534 ;OUTPUT A NORMAL CHARACTER, AND FINALIZE. COME HERE FOR
2535 ;NORMAL CHAR ACTUALLY IOTTED.
2536 TYONRM: CAME TT,TTYLPP(I) ;ABOUT TO OUTPUT PRINTING CHARS SO
2537 PUSHJ P,TYOASS ;FORCE ANY CURSOR MOTION INTO OUTPUT BFR
2541 ;CALL HERE TO OUTPUT NORMAL CHAR, IF CURSOR POSITIONING KNOWN
2542 ;NOT TO BE NECESSARY.
2543 TYONR0: PUSH P,[TYOFNA] ;CAUSE FINALIZATION WHEN FINISHED.
2545 ;CALL HERE TO OUTPUT NORMAL CHAR AS PART OF TASK OF OUTPUTTING
2546 ;SOME LARGER GROUP. DOESN'T FINALIZE, IN CASE WE PCLSR LATER.
2547 TYONR1: AOS B,TPHP(TT) ;ADVANCE CURSOR OF PC PPR 1 SPACE.
2548 CAML B,TCMXH(I) .SEE TPHE;(TT) ;NOT YET AT END OF LINE => OUTPUT CHAR.
2549 TRNE R,%TJCTN ;AT END: NO CONTIN => OUTPUT,
2551 PUSHJ P,TYONR2 ;CONTINUE THE LINE (NOTE CURSOR POS FOR
2552 CAME TT,TTYLPP(I) ;THE "!" WAS ALREADY DONE)
2553 PUSHJ P,TYOASS ;TYONR2 DISSOCIATED THE TTY
2554 JRST TYONR1 ;BUT TYONR1 NEEDS IT ASSOCIATED.
2556 ;TYPE "!<CR><LF>" TO CONTINUE A LINE.
2557 ;THIS FINALIZES THE !CRLF BUT ALSO REMOVES THE CONDITIONS WHICH
2558 ;CAUSED IT TO BE CALLED; SO PCLSRING IS NO PROBLEM.
2559 ;LEAVES TTY DISSOCIATED FROM PC PPR.
2560 TYOCTN: CAME TT,TTYLPP(I)
2562 AOS TPHP(TT) ;ACCOUNT FOR THE "!".
2564 MOVEI A,"! ;PUT "!" IN OUTPUT BUFFER,
2566 PUSHJ P,TYORCR ;AND GO TO NEXT LINE.
2568 MOVE B,TPFLAG(TT) ;IF THAT LF TOOK US TO LAST LINE,
2570 JRST TYOEO5 ;DO **MORE** PROCESSING IF NEC.
2571 JRST POPAJ ;AND RETRY WHATEVER CAUSED CONTINUATION.
2573 ;COME HERE TO OUTPUT A RUBOUT.
2574 TYORUB: TRNN R,%TJECH
2576 TLNN H,%TOERS ;RUBOUT ON A DISPLAY CONSOLE ECHOES AS DELETE BACKWARDS.
2577 TLNN H,%TOOVR ;LIKEWISE ON A GLASS TTY
2579 TYORU3: MOVE T,TTYST2(I)
2580 ANDI T,%TGIMG_6 ;GET RUBOUT'S "OUTPUT IN IMAGE MODE" BIT.
2583 ;COME HERE TO OUTPUT A LF. FINALIZES. LEAVES TTY DISSOCIATED.
2584 TYOLF: CAMN TT,TTYLPP(I) ;BEFORE MUNGING PC PPR'S CURSOR POS,
2585 PUSHJ P,TYOMVC ;MUST DISASSOCIATE TTY'S POS FROM PC PPR.
2586 SOS TPVM(TT) ;COUNT DOWN # LINES TILL NEXT **MORE**.
2587 AOS B,TPVP(TT) ;MOVE PC PPR'S CURSOR 1 LINE DOWN.
2588 CAIG B,118. ;DON'T LET VPOS ON PRINTING TTY GET TOO BIG.
2589 CAML B,TCMXV(I) .SEE TPVE;(TT) ;END OF RANGE => GO TO TOP OR SCROLL.
2591 TYOLF0: MOVE A,TTYSTS(I)
2592 TLNE A,%TSMOR ;IF **MORE** DESIRED,
2594 ADDI B,1 ;THEN IF ENTERING LAST LINE OF RANGE,
2595 CAME B,TCMXV(I) .SEE TPVE;(TT)
2597 SKIPGE TPVM(TT) ;UNLESS NOT TIME YET,
2598 SKIPA B,[%TFEOP] ;TELL NEXT OUTPUT ATTEMPT TO CAUSE **MORE**.
2602 JRST [ MOVEI A,%TDLF ;NO OPTIMIZATION =>
2603 PUSHJ P,TYOOUT ;OUTPUT A REAL LF (PLUS PADDING)
2606 TLNN H,%TOERS ;IF TTY HAS SELECTIVE ERASE,
2609 PUSHJ P,TYORCR ;GO TO BEGINNING OF LINE
2610 HLRZ B,TTYLPS(I) ;IF CR AND LF AND CLR-EOL ARE EXACTLY
2611 ADDI B,1 ;WHAT WE NEED,
2613 SKIPN TTYROL(I) ;AND TTY CAN DO IT, DO THEM ALL AT ONCE.
2614 SKIPA A,[%TDEOL] ;OTHERWISE, OUTPUT MOVE-CURSOR AND %TDEOL.
2615 SKIPA A,[%TDCRL] ;OUTPUT %TDCRL = %TDMOV AND %TDEOL TOGETHER.
2624 ;LINEFEED THAT WRAPS AROUND.
2625 TYOLFE: MOVE A,TTYSTS(I)
2626 TLNN H,%TOMVU ;END OF SCREEN ON PRINTING TTY => SCROLL BY 1.
2628 TLNE A,%TSROL ;DISPLAY IN SCROLL MODE?
2629 SKIPE TPVB(TT) ;CAN'T SCROLL UNLESS PC PPR IS WHOLE SCREEN.
2631 TYOLF2: MOVN A,TTYROL(I) ;A GETS - # LINES TO SCROLL AT ONCE.
2632 JUMPE A,TYOLF3 ;JUMP IF THIS TTY CAN'T SCROLL
2637 PUSHJ P,TYOASS ;MOVE CURSOR DOWN TO LAST LINE ON SCREEN, PREPARING FOR SCROLL
2641 ;SCROLL: A HAS -<# LINES TO ADJUST ALL VPOS'S BY>.
2642 TYOLF6: HLRZ B,TTYLPS(I) ;COMPUTE NEW TTYLPS LH.
2644 JUMPGE B,TYOLF7 ;IF IT WOULD BE NEGATIVE,
2645 TLNN H,%TORAW ;ON DISPLAY WRAP AROUND INSTEAD (LOSSAGE HAPPENING).
2647 SETZ B, ;IN RAW MODE, DON'T WORRY ABOUT IT.
2648 TYOLF7: HRLM B,TTYLPS(I) ;STORE UPDATED M.P. VPOS.
2649 ADDM A,TPVP(TT) ;CHANGE OTHER MAIN PRGM VPOS'S.
2650 MOVE B,TPVP(TT) ;IF SCROLLING 1 LINE AT A TIME,
2651 JRST TYOLF0 ;MAY NEED TO SET %TFEOP.
2652 ;IN ANY CASE, CLEAR NEXT LINE & FINALIZE.
2654 ;HERE TO WRAP AROUND TO TOP OF SCREEN.
2655 TYOLF3: SETZM TPVM(TT) ;TURN OFF ANY SUPPRESSION OF MORES BY INPUT
2656 TLNN H,%TOERS ;ON DISPLAYS WITHOUT SELECTIVE ERASE,
2657 JRST [ PUSHJ P,TYOCLR ;MUST CLEAR SCREEN WHEN WRAP AROUND.
2658 JRST TYOMVC] ;MUST LEAVE TTY DISSOCIATED.
2659 TYOLF4: MOVE B,TPVB(TT) ;ELSE JUST MOVE TO TOP OF PC PPR
2661 JRST TYOLF1 ;AND CLEAR THE TOP LINE.
2664 TYOBS: TLNN H,%TOIML ;BACKSPACE ON IMLAC ISN'T SAME AS MOVE BACK.
2666 MOVE B,TPHP(TT) ;ON IMLAC, FIRST, IF AT LEFT MARGIN,
2667 SKIPG B .SEE TPHB;(TT) ;DO NOTHING.
2669 TYOBS2: CAME TT,TTYLPP(I)
2670 PUSHJ P,TYOASS ;IF WE SHOULD BACKSPACE,
2673 JRST TYORU1 ;DO IT BY SENDING A ^H.
2675 TYOBS1: TLNE H,%TOMVB ;ARE WE ECHOING ^H ON TTY THAT CAN'T BS?
2679 JRST TYOCTL ;ECHO "^H" RATHER THAN CR AND SPACE FWD.
2681 TYOBS4: TLNE H,%TORAW ;IN RAW MODE ON TTY THAT CAN BS?
2682 JRST [ MOVEI A,%TDBS ;IF NO OPTIMIZATION,
2683 JRST TYOBS2 ] ;ARRANGE TO OUTPUT REAL BS.
2684 TYOBS3: CAMN TT,TTYLPP(I) ;BS ON TTY THAT ISN'T AN IMLAC.
2685 PUSHJ P,TYOMVC ;PREPARE TO DO CURSOR MOTION.
2686 SOS B,TPHP(TT) ;MOVE BACK 1 POS.
2687 SKIPGE B .SEE TPHB;(TT)
2688 AOS TPHP(TT) ;AT LEFT MARGIN, DO NOTHING.
2691 ;COME HERE WHEN TAB OUTPUT (AT TOP LEVEL ONLY)
2692 TYOTAB: TRNE R,%TJECH
2694 MOVE B,TTYST2(I) ;MAYBE TABS SHOULD BE OUTPUT IN IMAGE MODE.
2697 TYOTA1: MOVE A,TPHP(TT)
2699 TRZ A,7 ;HPOS OF NEXT TAB STOP.
2700 MOVE B,TCMXH(I) .SEE TPHE;(TT)
2702 SUBI B,1 ;B HAS EFFECTIVE LINEL.
2704 MOVE A,B ;A HAS PLACE TAB MOVES TO.
2705 SUB A,TPHP(TT) ;HOW FAR TO MOVE RIGHT?
2707 JUMPE A,[PUSHJ P,TYOCTN
2710 PUSHJ P,TYOMVC ;PREPARE FOR CURSOR CTL.
2711 ADDM A,TPHP(TT) ;MOVE CURSOR TO TAB STOP.
2715 TYOFF: TRNN R,%TJECH ;ECHOING?
2717 MOVE B,TTYSTS(I) ;YES; ^L ECHOES AS UPARROW-L
2718 TLNE H,%TOMVU ;EXCEPT ON DISPLAYS, UNLESS PRGM HAS DISABLED.
2720 JRST TYOCTL ;ECHO AS UPARROW L
2721 JRST TYOCLR ;ECHO AS CLEAR SCREEN.
2723 ;^M IOTTED - MAYBE DO CR AND LF.
2724 TYOCR: TRNE R,%TJECH ;IF ECHO MODE OUT, CR DOES CRLF.
2727 TRNE B,%TGIMG_12. ;ELSE OUTPUT-CR-IN-IMAGE PREVENTS LF.
2729 PUSHJ P,TYOCRL ;DO CR AND LF,
2730 MOVEI B,%TFIGL ;THEN SAY IGNORE NEXT CHAR IF IT'S A LF.
2734 TYOCRL: PUSHJ P,TYORCR
2738 TYOCR1: PUSHJ P,TYORCR
2741 ;ALTMODE IOTTED - SHOULD WE OUTPUT DOLLARSIGN?
2742 TYOALT: MOVE B,TTYST2(I)
2743 TRNN R,%TJECH ;ECHO MODE => YES.
2744 TLNN B,%TGIMG ;OUTPUT ALT IN ASCII MODE SAYS YES.
2746 JRST TYOAL1 ;NO, OUTPUT AN ALTMODE, WHETHER IT PRINTS OR NOT.
2748 TYOAL4: TLNN H,%TOSAI ;IF ALTMODE IS A GRAPHIC, USE IT;
2749 TYOAL3: MOVEI A,"$ ;ELSE USE DOLLARSIGN.
2750 JRST TYONR0 ;EITHER WAY IT'S A NORMAL PRINTING CHAR.
2752 ;IF ABOUT TO CHANGE PC PPR'S CURSOR POS WITHOUT PUTTING
2753 ;ANYTHING IN THE OUTPUT BUFFER THAT WILL CHANGE THE TTY'S
2754 ;REAL CURSOR POS THE SAME WAY, MUST DISASSOCIATE TTY'S
2755 ;CURSOR POS FROM THIS PC PPR. TTYLPS WILL THEN
2756 ;SAY WHERE THE TTY'S CURSOR WILL BE AFTER CHARS IN OUTPUT
2757 ;BUFFER ARE ALL OUTPUT.
2758 TYOMVC: HRLZ B,TPVP(TT)
2761 SETCAM TT,TTYLPP(I) ;TTY NO LONGER ASSOCIATED.
2764 ;BEFORE PUTTING ANYTHING IN OUTPUT BUFFER USING A PC PPR,
2765 ;TTY'S CURSOR MUST BE ASSOCIATED WITH PC PPR (THAT IS,
2766 ;THE TTY'S CURSOR MUST BE WHERE THE PC PPR'S CURSOR IS)
2767 ;WHEN A TTY IS ASSOCIATED WITH A PC PPR, TTYLPS
2768 ;IS NONSENSE, AND IT IS NECESSARY FOR OUPUT RTNS
2769 ;TO UPDATE PC PPR'S CURSOR IN ACCORDANCE WITH WHAT
2770 ;IS PUT IN THE OUTPUT BUFFER.
2771 ;THIS ROUTINE ASSOCIATES TTY IN I WITH PC PPR IN TT.
2772 TYOASS: TRNE R,%TJHDE
2775 HLRZ T,TTYLPS(I) ;CURRENT VERTICAL POS
2776 HRRZ A,TTYLPS(I) ;CURRENT HORIZONTAL POS
2777 CAMN T,TPVP(TT) ;IF CURSOR IS WHERE WE WANT IT,
2780 JRST TYOAS3 ;JUST SAY WE'RE ASSOCIATED.
2782 BUG ;TTY ALREADY ASSOCIATED WITH A PC PPR?
2783 CAMN T,TPVP(TT) ;SEE IF JUST MOVING ONE SPACE TO THE RIGHT
2785 JRST TYOAS6 ;NO, NEED FULLY GENERAL CURSOR MOTION
2786 MOVEI A,%TDFS ;SAVE BUFFER SPACE IN THIS COMMON CASE
2788 MOVEI A,40 ;IF SPACE OVERPRINTS, IT IS BETTER THAN %TDFS SINCE FEWER CHARS
2789 PUSHJ P,TYOOUT ;IF SENT TO A SOFTWARE TTY OVER HARDWARE LINE.
2792 TYOAS6: MOVEI A,%TDMV0 ;TELL THE TTY TO PUT ITS CURSOR
2796 PUSHJ P,TYOOUT ;WHERE THIS PC PPR WANTS IT.
2800 TYOAS7: PUSHJ P,TYOOUT
2802 CAML A,TCMXV(I) ;ATTEMPT TO GO BELOW SCREEN BOTTOM?
2804 PUSHJ P,TYOOUT ;AND THE NEW POSITION.
2807 TYOAS3: MOVEM TT,TTYLPP(I) ;TELL TTY IT IS ASSOCIATED.
2811 TYOAS5: PUSH P,A ;REGARD TTY AS ASSOCIATED WITHOUT ACTUALLY
2812 JRST TYOAS3 ;MOVING ITS CURSOR.
2814 ;FORCE OUT BUFFERED CURSOR MOTION.
2815 ;CALL ONLY IF TTY DISSOCIATED, FROM M.P. OR CLOCK LEVEL.
2816 ;H MUST BE SET UP ALREADY
2817 TYOFRC: MOVE Q,TOIP(I)
2821 ;PUT CHAR IN OUTPUT BFR (BUT IT DOESN'T BECOME VISIBLE
2822 ;TO INT. LEVEL UNTIL WE FINALIZE - IN CASE WE PCLSR)
2823 TYOOUT: TRNE R,%TJHDE
2825 TYOOU1: CAMN Q,TOBEP(I) ;Going to deposit past end of buffer?
2826 MOVE Q,TOBBP(I) ; Yes, make wrap around instead.
2827 HRRZI T,(Q) ;Get addr part of the buffer pointer.
2828 CAILE T,@TOBEP(I) ;Reasonable buffer pointer?
2829 ; CANT HAVE BEEN DUE TO 11 DOWN
2830 BUG HALT,[TTY: OUTPUT BUFFER POINTER PAST END OF BUFFER]
2831 IDPB A,Q ;Stuff char into output buffer.
2832 IFN N11TYS, TRNN H,%TP11T ;TV-11 ttys dont have TORM.
2833 SOSL TORM(I) ; One less space available in buffer.
2835 BUG HALT,[TTY: OUTPUT BUFFER OVERFLOWED, TYOWNC IS TOO SMALL]
2837 ;FINALIZE, UPDATING TOIP, TORM AND FLAGS.
2838 ;ALSO RESET Q FOR ANOTHER BUNCH OF OUTPUT.
2839 TYOFNX: ;FINALIZE WHEN TTY DISSOCIATED AND NOTHING PUT IN BFR.
2840 TYOFND: ;SIMILAR, WHEN SOMETHING MIGHT HAVE BEEN PUT IN BFR.
2841 TYOFNA: ;FINALIZE WHEN TTY ASSOCIATED W/ PC PPR.
2842 TYOFN2: MOVEM Q,TOIP(I)
2843 AOSN TTYOAC(I) ;START THE TTY.
2847 ;ON ORDINARY TTY, CALL WHEN BUFFER FULL.
2848 ;WAIT TILL AT LEAST 3/4 EMPTY. T HAS MINIMUM # CHARS NEEDED.
2849 ;IF RUNNING SYS JOB, POP1J IF TTY SEEMS TO BE HUNG.
2850 TYOW1: CAIGE T,TOBS*3/4 ;DON'T UNBLOCK TILL BUFFER AT LEAST 3/4 EMPTY.
2852 TYOW2: MOVEM I,EPDL3(U) ;MAY TRAP OUT ON SYSTEM JOB
2856 JRST TYOW5 ;HANG UP SYS JOB FOR MAX OF 5 SEC
2862 SUB P,[1,,1] ;TIMED OUT
2869 TYOW6: MOVE A,AC0S+U(U) ;(IN CASE U DIDN'T EQUAL USER AT TYOW1)
2870 MOVE A,EPDL3(A) ;IF SYS JOB, FLUSH IF NO CHR PROCESSED FOR 15 SEC
2872 SKIPL TTOALC(A) ;TIME OUT ON SOFTWARE TTY'S WITHOUT ALLOCATION.
2873 JRST TYOW6A ;IF THIS IS A PDP-11 TV,
2874 TRNE Q,%TY11T ;TEST FOR ROOM IN BUFFER IS DIFFERENT ON TV'S
2876 CAMG T,TORM(A) ;FOR NON-TV'S, TORM IS VALID.
2877 JRST TYOW6B ;THERES ROOM NOW
2878 TYOW6A: MOVSI T,%TCHNG
2882 JRST TYOW6C ;NO NEW TIMEOUT YET
2883 IORM T,TTYCOM(A) ;MARK THIS TTY AS HUNG FOR SYS JOB
2887 TDNN T,TTYCOM(A) ;SKIP ON CONSOLE WAS LOSING RECENTLY
2889 JRST POPJ1 ;TIME OUT MUCH SHORTER IF CONSOLE DETERMINED TO BE A LOSER
2894 TYOW6B: MOVSI T,%TCHNG ;GET HERE WHEN ROOM EXISTS IN BUFFER
2895 ANDCAM T,TTYCOM(A) ;ITS NOT HUNG NOW
2899 ;ON A PDP-11 TV, CALL HERE TO WAIT UNTIL THERE ARE AT LEAST
2900 ;TYOWNC CHARS OF SPACE IN THE OUTPUT BUFFER.
2901 ;CAN POP1J FOR THE SYS JOB.
2902 TYOWN: PUSHJ P,TYOWN1
2903 LDB B,T ;IS THE POS. 20. CHARS UP VACANT?
2905 POPJ P, ;YES, NO NEED TO WAIT.
2906 JUMPN U,TYOWN2 ;IF SYS JOB, TIME OUT BEFORE TOO LONG.
2912 TYOWN2: PUSH P,A ;SEEMS TO BE NO SPACE, CHECK AGAIN
2913 MOVE B,(T) ;DOING THINGS IN THE RIGHT ORDER THIS TIME
2914 LDB A,T ;TO AVOID GETTING HUNG BY A TIMING ERROR
2916 JRST POPAJ ;SOME SPACE APPEARED IN THE MEANTIME
2919 CAMN T,(B) ;WAIT FOR THIS WORD TO CHANGE
2921 JRST TYOWN ;THEN CHECK IT AGAIN
2923 TYOWN1: MOVE T,TOIP(I)
2924 ADDI T,TYOWNC/<36./TT11BY>
2928 HRLI T,040000+TT11BY_6 ;BP TO WHOLE OF RIGHTMOST BYTE IN WORD
2932 ;COME HERE WHEN DETECT THAT %TFEOP OR %TFIGL IS SET.
2933 TYOIGL: TRZN B,%TFIGL ;%TFIGL TAKES PRIORITY.
2935 MOVEM B,TPFLAG(TT) ;CLEAR IT, AND IGNORE THIS CHAR
2940 ;%TFEOP IS SET AND OUTPUT IS DONE: DO **MORE** PROC.
2941 TYOEOP: PUSH P,[TYOEO9]
2943 TYOEO5: SKIPE USER ;DON'T DO MORES IF SYSTEM JOB IS TYPING
2944 TRNE R,%TJMOR+%TJECH ;OR THIS CHANNEL DOESN'T WANT TO
2947 TDNE B,TTYSTS(I) ;OR THIS JOB DOESN'T WANT TO
2949 HRRZ B,TTYSTS(I) ;DON'T **MORE** AN $$^P'ED JOB'S OUTPUT
2952 MOVE B,TCMXV(I) .SEE TPVE;(TT)
2954 HRRZ B,UUAC(U) ;GET INTERRUPT BIT FOR CHANNEL THIS IOT IS ON
2956 AND B,MSKST2(U) ;HAS USER ENABLED OUTPUT INTERRUPT?
2957 JUMPE B,TYOEO1 ;NO, SYSTEM DOES **MORE** PROC.
2958 IORM B,IFPIR(U) ;YES, JUST GIVE USER INT
2959 MOVEI B,%TFEOP ;HE CAN TYPE **MORE** IF HE WANTS TO.
2960 ANDCAM B,TPFLAG(TT) ;INT. HAS BEEN GIVEN.
2961 PUSHJ P,TYOUN1 ;LSWPOP THE FINSET, ETC.
2964 PUSHJ P,UFLS ;MAKE HIM TAKE THE INT. RIGHT NOW.
2965 TYOEO6: PUSHJ P,LSWCLR
2966 SOS UUOH ;HIS PICLR IS SET? RETRY THE UUO.
2969 TYOEO7: MOVEI B,%TFEOP ;MORE SUPPRESSED, TURN OFF THE FLAG
2973 ;COME HERE AT END OF PAGE IF PROGRAM ISN'T SMART.
2974 TYOEO1: PUSH P,TPHP(TT)
2984 TERMIN ;OUTPUT THE STRING "**MORE**"
2985 IORI R,%TJSTP ;MAKE ALL OUTPUT ON THIS CHNL HANG.
2986 MOVEI B,%TFEOP ;NO LONGER WANT NEXT CHAR TO DO **MORE**
2988 POP P,A ;REMEMBER VALUE TO RESET HPOS TO LATER.
2990 PUSHJ P,TYOFNA ;FINALIZE SO "**MORE**" WILL TYPE OUT;
2991 ;PCLSRING NO PROBLEM; SINCE %TJSTP IS SET THE IOT
2992 ;WILL COME TO TYOEO3.
2995 TRNE H,%TP11T ;WAIT FOR BUFFER SPACE ON TV.
2996 PUSHJ P,TYOWN ;NOTE THIS CAN POP1J
2999 MOVEI T,TOBS ;WAIT FOR ALL OF "**MORE**" TO GET OUT.
3006 MOVEI R,%TIPEK+%TIACT+%TIECH+%TINWT
3007 PUSHJ P,TYI0 ;LOOK AHEAD AT NEXT INPUT CHAR.
3008 JUMPL D,TYOEO6 ;IS NONE => RETRY UUO AND WAIT IN TYOSET.
3013 TLNE C,%TSROL ;IN SCROLL MODE, MAKE NEXT LINE OF OUTPUT OVERWRITE **MORE**.
3014 JRST [ PUSHJ P,TYORCR
3016 SOS TPVM(TT) ;MORE AGAIN BEFORE THIS LINE GOES OFF SCREEN
3018 TRZN R,%TJCP1 ;UNLESS THIS IS ^PN
3019 PUSHJ P,TYOHD1 ;HOME UP (BY HOMING DOWN AND LF'ING)
3020 PUSHJ P,TYOLF ;OTHERWISE (FOR ^PN) JUST LF.
3021 TYOEO4: CAMN TT,TTYLPP(I)
3022 PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
3023 HLRZ A,TPFLAG(TT) ;SET HPOS TO WHAT IT WAS BEFORE THE **MORE**.
3030 CAIN D,40 ;IF A SPACE, FLUSH IT FROM INPUT BFR
3036 ANDCMI R,%TJSTP ;RETURN CHANNEL TO NORMAL.
3039 POP P,A ;RESTORE THE CHAR BEING IOTTED
3040 POPJ P, ;AND TRY AGAIN TO IOT IT.
3042 TYOEO2: PUSH P,[TYOEO9]
3043 PUSH P,A ;COME HERE IF PCLSR OUT OF TYOEO3, ETC.
3044 JRST TYOEO3 ;WHEN THE IOT IS RETRIED.
3046 TYOCP1: TRZE R,%TJINK ;IF THIS IS THE CHAR AFTER A ^PI, TREAT IT AS
3047 JRST TYONR3 ;NORMAL PRINTING CHARACTER.
3049 JRST TYOEO2 ;CHANNEL HUNG IN **MORE**.
3050 ;HANDLE CURSOR CONTROL CODES. COME HERE WITH IOTTED CHAR IN A.
3051 ;IF WE ARE IN THE MIDDLE OF A ^P CODE.
3052 ;OR IF THE CHANNEL IS A SUPERIMAGE OUTPUT CHANNEL.
3053 TRZE R,%TJCP2 ;AFTER A ^PV OR ^PH ?
3055 TRZN R,%TJCP1 ;NO, NEXT CHAR ISN'T IN THE ^P CODE.
3056 JRST TYOSIO ;MUST BE %TJSIO THAT WAS SET.
3057 TYOCP4: CAIL A,"A ;IF ^P CODE IS A LETTER,
3060 MOVE B,TYOCPT-"A(A) ;GET THE DISPATCH ENTRY FOR IT,
3062 JUMPL B,TYOCPA ;TURN SOME CURSOR OPERATIONS INTO CRLF ON PRINTING TTY
3064 PUSH P,[TYOCPR] ;SOME OPERATIONS RETURN HERE FOR FINALIZATION
3065 JRST (B) ;FINALLY, DISPATCH
3067 TYOCPR: MOVEI B,%TFEOP
3071 TYOCP3: CAIL A,140 ;LOWERCASE LETTERS ACT LIKE UPPERCASE
3075 PUSHJ P,TYOUN1 ;OR IT'S ILLEGAL.
3076 JRST IOCR11 ;IOC ERROR.
3078 TYOCPV: IORI R,%TJCP1 ;HERE FOR ^PV
3079 TYOCPH: IORI R,%TJCP2 ;SAME FOR ^PH. SAY NEXT CHAR IS THE CURSOR POS.
3080 TYOFNR: HRLM R,@TYOPV2(J)
3083 TYOCP2: CAMN TT,TTYLPP(I) ;INTERPRET THE CHAR AFTER ^PH OR ^PV.
3086 TRZN R,%TJCP1 ;WHICH OF THOSE 2 WAS IT?
3087 JRST TYOCH1 ;IT WAS ^PH
3090 CAML A,TCMXV(I) .SEE TPVE;(TT) ;DON'T PUT CURSOR PAST END.
3091 JRST [ MOVE A,TCMXV(I) .SEE TPVE;(TT)
3093 CAMGE A,TPVB(TT) ;OR BEFORE BEGINNING.
3098 TYOCH1: .SEE ADD A,TPHB;(TT)
3100 CAML A,TCMXH(I) .SEE TPHE;(TT) ;DON'T PUT CURSOR PAST END.
3101 JRST [ MOVE A,TCMXH(I) .SEE TPHE;(TT)
3103 SKIPGE A .SEE TPHB;(TT) ;OR BEFORE BEGINNING.
3104 SETZ A, .SEE TPHB;(TT)
3108 ;DISPATCH TABLE FOR ^P CODES.
3109 ;SIGN => TURN INTO ^PA ON PRINTING TTY.
3110 ;4.8 => PUSHJ, ELSE JRST
3111 TYOCPT: TYOCPA ;A - ADVANCE TO FRESH LINE.
3112 200000,,TYOMVB ;B - MOVE BACK.
3113 TYOCLR ;C - CLEAR SCREEN.
3114 200000,,TYOMVD ;D - MOVE DOWN.
3115 TYOCEF ;E - CLEAR TO END OF SCREEN.
3116 200000,,TYOMVF ;F - MOVE FORWARD.
3117 TYOCP3 ;G - ILLEGAL.
3118 TYOCPH ;H - NEXT CHAR IS DESIRED HPOS.
3119 TYOCPI ;I - NEXT CHARACTER TREATED AS NORMAL PRINTING.
3120 TYOCP3 ;J - ILLEGAL.
3121 200000,,TYODLF ;K - DELETE FORWARD.
3122 TYOCEL ;L - CLEAR REST OF LINE.
3123 TYOMOR ;M - DO **MORE**.
3124 TYOMO1 ;N - SIMILAR BUT DON'T HOME UP.
3125 TYOCP3 ;O - ILLEGAL.
3126 TYOCPP ;P - TYPE "^P".
3127 TYOCPQ ;Q - TYPE "^C".
3128 600000,,TYORPS ;R - RESTORE SAVED POS.
3129 200000,,TYOSPS ;S - SAVE POSITION (FOR A ^PR).
3130 600000,,TYOHMU ;T - HOME UP.
3131 200000,,TYOMVU ;U - MOVE UP.
3132 TYOCPV ;V - NEXT CHAR IS DESIRED VPOS.
3133 TYOCP3 ;W - ILLEGAL.
3134 200000,,TYODLB ;X - DELETE BACKWARDS.
3135 TYOCP3 ;Y - ILLEGAL.
3136 600000,,TYOHMD ;Z - HOME DOWN.
3137 200000,,TYOILP ;[ - INSERT LINE POSITION
3138 200000,,TYODLP ;\ - DELETE LINE POSITION
3139 TYOCEL ;] - CLEAR TO END OF LINE (USE ^PL IT'S BETTER)
3140 200000,,TYOICP ;^ - INSERT CHARACTER POSITION
3141 200000,,TYODCP ;_ - DELETE CHARACTER POSITION
3142 IFN .-31.-TYOCPT,.ERR WRONG LENGTH TABLE.
3144 ;^PM AND ^PN DON'T WORK IN PROGRAMS THAT TAKE **MORE**
3145 ;INTERRUPTS - OR, PRECISELY, THEY ALWAYS ENTER
3146 ;THE STATE OF A CHANNEL THAT HAS JUST TYPED OUT "**MORE**".
3147 TYOMO1: IORI R,%TJCP1 .SEE TYOEO3 ;^PN - ENTER **MORE** STATE.
3148 TYOMOR: IORI R,%TJSTP ;^PM.
3152 TYOCPI: IORI R,%TJINK
3155 ;INSERT AND DELETE CHARACTERS AND LINES
3156 TYOILP: SKIPA A,[%TDILP]
3157 TYODLP: MOVEI A,%TDDLP
3160 PUSH P,A ;SUPPOSED TO BE AT LEFT MARGIN
3161 PUSHJ P,TYORCR ;MAKE SURE
3165 TYOICP: SKIPA A,[%TDICP]
3166 TYODCP: MOVEI A,%TDDCP
3169 TYOIL1: CAME TT,TTYLPP(I)
3172 MOVEI A,1 ;SUPPLY PARAMETER OF 1
3173 JRST TYORU1 ;IF YOU WANT TO OPTIMIZE CONSECUTIVE ONES
3174 ; USE SUPER-IMAGE OUTPUT, AT LEAST FOR NOW
3176 ;RTNS FOR VARIOUS ^P CODES.
3177 ;THE FIRST FOUR DON'T FINALIZE ANYTHING.
3178 TYOMVF: CAMN TT,TTYLPP(I) ;^PF
3179 PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
3181 CAMGE B,TCMXH(I) .SEE TPHE;(TT)
3183 ;SETZ A, .SEE TPHB;(TT) ;WRAP AROUND FROM LAST POS. TO FIRST.
3185 TYOMVD: CAMN TT,TTYLPP(I) ;^PD
3186 PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
3190 CAML B,TCMXV(I) .SEE TPVE;(TT) ;WRAP AROUND FROM LAST POS. TO FIRST.
3194 TYOMVB: CAMN TT,TTYLPP(I) ;^PB - MOVE BACK.
3196 SOSL B,TPHP(TT) .SEE TPHB;(TT)
3198 MOVE A,TCMXH(I) .SEE TPHE;(TT) ;WRAP AROUND FROM FIRST TO LAST.
3201 TYOMVU: CAMN TT,TTYLPP(I) ;^PU - MOVE UP.
3204 MOVE A,TCMXV(I) .SEE TPVE;(TT) ;WRAP AROUND FROM FIRST TO LAST.
3212 TYOSPS: MOVE B,TPHP(TT) ;^PS - SAVE CURSOR POS.
3217 TYORPS: CAMN TT,TTYLPP(I) ;^PR - RESTORE CURSOR POS FROM SAVED.
3224 TYOCPA: CAMN TT,TTYLPP(I) ;ADVANCE TO FRESH LINE, IN ANY CASE CLEAR REST OF LINE
3226 SKIPE TPHP(TT) ;IF NOT AT THE BEGINNING OF A LINE,
3227 JRST TYOCRL ;CRLF. MAYBE SOMEDAY THIS WILL CHECK
3228 JRST TYOCEL ;WHETHER ANYTHING HAS YET BEEN TYPED ON THIS LINE.
3230 TYOCLR: TLNN H,%TOMVU ;^PC - CLEAR SCREEN.
3231 JRST [ MOVE A,TCMXV(I) ;ON PRINTING TTYS, JUST CRLF.
3232 SUB A,TTYROL(I) ;BUT DON'T --MORE-- UNTIL THIS LINE
3233 MOVEM A,TPVM(TT);GOES OFF THE SCREEN
3235 SKIPN TPVB(TT) ;USE FAST METHOD IF REALLY CLEARING WHOLE SCREEN
3237 TYOCI1: PUSHJ P,TYOHMU
3238 TYOCEF: SKIPA A,[%TDEOF] ;^PE CLEAR EOF
3239 TYOCEL: MOVEI A,%TDEOL ;[ ^P] - CLEAR EOL.
3242 TYONMV: CAME TT,TTYLPP(I) ;HERE FOR CHARS THAT DON'T MOVE THE CURSOR
3243 PUSHJ P,TYOASS ;BUT DO DEPEND ON BEING PRINTED AT THE RIGHT PLACE ON THE SCREEN
3244 TYORU1: PUSHJ P,TYOOUT
3247 TYOCIM: PUSHJ P,TYOHMU ;CLEAR WHOLE SCREEN
3253 TYOHMU: SETZM TPVM(TT) ;^PT - HOME UP
3255 PUSHJ P,TYOMVC ;GO TO COLUMN 0,
3256 MOVE B,TPVB(TT) ;LINE 0.
3259 TYORCR: TLNE H,%TORAW ;GO TO COLUMN 0 - CR IN IMAGE MODE.
3260 JRST [ CAME TT,TTYLPP(I)
3261 PUSHJ P,TYOASS ;NO OPTIMIZATION =>
3263 MOVEI A,%TDRCR ;ARRANGE TO SEND REAL CR.
3267 PUSHJ P,TYOMVC ;ELSE DO CURSOR-MOTION.
3268 SETZ B, .SEE TPHB;(TT)
3272 TYOHMD: PUSHJ P,TYORCR ;^PZ - HOME DOWN.
3273 TYOHD1: MOVE B,TCMXV(I) .SEE TPVE;(TT)
3279 TYODLB: SKIPN TPHP(TT) ;^PX - DELETE BACKWARD.
3280 PUSHJ P,.+1 ;IN COLUMN 0, DO IT TWICE SO AS TO ERASE THE "!" AND CHAR BEFORE IT
3285 AOS TPHP(TT) ;IF WRAPPED AROUND, SET TO TCMXH-1
3286 TYODLF: MOVE B,TPHP(TT) ;^PK - ERASE 1 CHARACTER.
3287 CAML B,TCMXH(I) .SEE TPHE;(TT) ;DO NOTHING AT END OF LINE.
3289 TLNE H,%TOOVR ;IF CAN'T OVERPRINT, USE SPACE TO ERASE
3290 JRST [ TLNN H,%TOERS
3291 POPJ P, ;OTHERWISE, USE SPECIAL CONTROL SEQUENCE IF KNOWN
3297 MOVEI A,40 ;USE REALLY SPACE, NOT CURSOR MOTION!
3299 PUSHJ P,TYOMVB ;THEN BACKSPACE OVER IT
3302 SUBTTL .STATUS AND IOPDL FOR TTY
3305 ;2.3 DDT MODE ON INPUT
3306 ;(STATYI);2.5 CHRS HAVE BEEN ITYI'ED BUT NOT .IOT'ED (STATYI)
3307 ;2.8 TELETYPE NEXT TO 340 OR 340 SLAVE
3308 ;2.9 TELETYPE IS LOCAL, NOT DIAL IN
3311 CAIN A,%TINON ;IF CHANNEL HAS NO REAL TTY,
3312 POPJ P, ;THERE ARE NO SPECIFICS WE CAN SAY.
3314 TRO D,1_9. ;BUF CAP FULL
3316 TRO D,1_<9.+1> ;BUFFER CAP EMPTY
3317 STATY1: SKIPL TTYTBL(U)
3318 TRO D,1_<9.+3> ;HAS TTY
3326 CAIN A,%TINON ;CATCH "DISOWNED" TTY CHNLS.
3328 TRO D,1_<9+1> ;ASSUME BUF CAP EMPTY
3329 SKIPN B,TICC(A) ;SEE IF THERE ARE ANY INPUT CHARACTERS
3330 JRST STATY2 ;NOT INCLUDING COM MODE ECHO
3332 STATY3: CAMN E,TIBEP(A)
3336 TRZA D,1_<9+1> ;INPUT SEEN, BUF CAP NOT EMPTY
3338 STATY2: CAIL B,TIBS-10.
3339 TRO D,1_9. ;BUF CAP NEARLY FULL
3340 LDB B,[400400,,TTYTYP(A)] ;GET LOCAL AND 340 MDS
3341 DPB B,[160400,,D] ;DEPOSIT IN STATUS WORD
3345 TRO D,20000 ;MORE CHRS HAVE BEEN ITYI'ED THAN .IOT'ED
3349 ;TELETYPE IO PUSHDOWN ROUTINES
3351 TYOIOP: TDZA A,A ;OUUTPUT CHNL.
3352 TYIIOP: MOVEI A,TYIMSK-TYOMSK ;INPUT CHNL, SET TYIMSK INSTEAD TYOMSK.
3353 CONO PI,CLKOFF ;TO PREVENT TELETYPE (IF CONSOLE) FROM MOVING AROUND
3354 JUMPGE B,TYIOP1 ;JUMP IF OPEN AS DEVICE
3355 SKIPGE TTYTBL(U) ;IF PROCEDURE DOESN'T HAVE CONSOLE,
3356 JRST CLKONJ ;THEN THAT'S ALL
3357 TYIOP1: LDB E,[$TIIDX,,B] ;GET TTY NUMBER IN E
3358 ADDI E,(A) ;IF INPUT, TYOMSK(E) WILL BE TYIMSK VAR.
3359 HRRZ R,UUAC(U) ;GET "AC FIELD" (IO PUSHDOWN ROUTINES RESTORE R)
3360 MOVE A,CHNBIT(R) ;GET RELEVANT CHANNEL INTERRUPT BIT
3361 XCT TYIOPT(I) ;IORM OR ANDCAM A TO TYOMSK(E)
3364 TYIOPT: ANDCAM A,TYOMSK(E) ;IOPUSH (PSEUDO-CLOSE)
3365 IORM A,TYOMSK(E) ;IOPOP (PSEUDO-OPEN)
3367 ;STY IO PDL ROUTINES
3370 STYIIP: MOVEI A,STYMSK-STYOMS
3371 ADDI A,STYOMS-NFSTTY-TYOMSK
3374 SUBTTL TTY CLOSE ROUTINES
3378 TYICLS: JSP E,TYCLOS ;IGNORE FOR DISOWNED CONSOLE
3379 ANDCAM B,TYIMSK(A) ;INDICATE CHANNEL CLOSURE
3382 TYCLOS: LDB I,[210100,,A]
3383 ANDI A,77 ;THROW AWAY TOP BITS OF IOCHNM WD, GET TTY #.
3384 CAIN A,%TINON ;FOR A CHNL IN A TTYLESS TREE,
3385 POPJ P, ;DON'T SOS ANYONE'S TTNTO.
3386 SKIPGE APRC(U) ;SKIP UNLESS DISOWNED
3387 JUMPN I,[JRST 4,.] ;DISOWNED JOB HAS REAL CONSOLE TTY?
3388 SKIPGE TTYTBL(U);IF IT'S A CONSOLE AND THIS JOB DOESN'T
3389 JUMPN I,TYICL2 ;HAVE TTY, DON'T CHANGE TYIMSK OR TYOMSK.
3391 MOVE B,CHNBIT(R) ;GET THE BIT TO CLEAR IN TYIMSK OR TYOMSK.
3392 JRST (E) ;RETURN & CLEAR IT.
3396 TYOCLS: JSP E,TYCLOS ;IGNORE FOR DISOWNED CONSOLE
3399 PUSHJ P,TYOWC ;WAIT A WHILE FOR OUTPUT TO FINISH
3400 ANDCAM B,TYOMSK(A) ;SET OF OUTPUT CHNLS OPEN.
3401 TYICL2: SOSLE TTNTO(A)
3402 POPJ P, ;MORE OPENS ON TTY
3407 POPJ P, ;OPEN AS CONSOLE
3410 ;WAIT FOR TTY OUTPUT BUFFER TO BE EMPTY,
3411 ;BUT TIME OUT IF TTY DOESN'T TYPE OUT FOR 5 SEC.
3412 TYOWC: MOVEM I,EPDL3(U) ;SAVE TTY # FOR TYOW5.
3418 MOVEI T,TOBS ;WAIT TILL OUTPUT BUFFER EMPTY
3419 PUSHJ P,TYOW5 ;BUT DON'T WAIT TOO LONG.
3420 POPJ P, ;TYOW5 MAY POP1J.
3422 ;TTY # IN A - MAKE THE TTY FREE.
3423 TTYLO1: SETZM TTNTO(A)
3427 IORB B,TTYSTS(A) ;SAY TTY FREE (BUT TTYSTA OFF SO CAN'T ^Z)
3428 PUSHJ P,TTYLFC ;REMOVE TTY FROM COM MODE AND
3429 PUSHJ P,TYIRS0 ;RESET INPUT BUFFER
3431 CAMN I,LPTTTY ;IF TTY'S THE LPT, IT'S NOT IN USE.
3436 PUSHJ P,TTYIN1 ;RE-INIT USER OPTIONS
3437 TRNE T,%TYDIL\%TYRLM ;DIALUP LINE => MAKE IT PRINTING.
3438 TRNE T,%TYMDM ;UNLESS WE CAN DETECT DISCONNECTS, IN WHICH CASE DO IT THEN.
3447 IORM B,SUPCOR ;REQUEST A CONSOLE-FREE MESSAGE.
3448 MOVE A,I ;IN CASE OUR CALLER WANTS TTY # IN A.
3452 TTYLO2: MOVE B,TTYTYP(A) ;TTY BEING CLOSED & CNSL FREE MSG NOT NEEDED,
3453 SKIPGE TT11P ;IF IT'S A PDP11-TV TTY
3456 MOVE I,A ;MAKE ALL JOBS CEASE TO HACK THIS SCREEN
3457 PUSHJ P,NTVWH1 ;B := VIDEO BUFFER NUMBER
3460 TTYLO3: LDB C,[$11BY0,,TVCREG(A)] ;VIDEO BUFFER HACKED BY THIS JOB OR 377
3462 SETOM TVCREG(A) ;IF JOB HACKING THIS VIDEO BUFFER, MAKE IT STOP.
3466 MOVE B,TT11HD ;TELL THE 11 THE TTY IS FREE.
3469 HRROI T,-1_4+10 ;SET TTY'S PHYSLC WORD TO -1.
3471 MOVE T,TOBBP(I) ;RESET OUTPUT BUFFER POINTER TO BEGINNING OF
3472 MOVEM T,TOIP(I) ; BUFFER. THE 11 DOES ALSO.
3476 ;REMOVE A TTY FROM COM MODE IF IT IS COM MODE.
3477 ;CALLED WHEN TTY BECOMES FREE, ETC.
3478 ;TAKES TTY # IN A; LEAVES IT IN A AND I.
3486 TLZ Q,%TCCBK+%TCTPN+%TCCBS
3487 MOVEM Q,TTYCOM(I) ;FLUSH COM MODE TEMP FLAGS.
3488 PUSHJ P,TYCGTM ;REMOVE THE TTY FROM COM LINKS.
3496 SUBTTL TTY RESET ROUTINES
3500 TYIRS: PUSHJ P,TTYWR
3501 POPJ P, ;IGNORE IF WE DON'T OWN THE TTY.
3502 TYIRS0: MOVSI T,%TCLFT+%TCICO
3503 PUSHJ P,TTYCMW ;MAYBE WAIT FOR COM LINK TO FINISH. RETURN WITH TTYCHN OFF.
3504 PUSHJ P,TYIRS1 ;DISCARD THE INPUT.
3507 ;; DISCARD THE CONTENTS OF THE TTY INPUT BUFFER. TTY NUMBER IN I.
3508 TYIRS1: MOVE B,TIIP(I) ;Get input pointer.
3509 MOVEM B,TIOP(I) ;Bash output ptr to it.
3510 MOVEM B,TINTP(I) ;Bash interrupt-peeked ptr to it.
3511 MOVEM B,ECHOP(I) ;Bash echo ptr to it.
3512 SETZM ECHOC(I) ;Nothing to echo.
3513 CLEARM TICC(I) ;Nothing has been input.
3514 CLEARM TACC(I) ;No activation chars either.
3515 CLEARM TINTC(I) ;Nothing to ITYIC either.
3520 TYORS: PUSHJ P,TTYWR ;CHECK FOR OWNING TTY. TTY NUMBER IN I.
3521 POPJ P, ;NON-SKIP MEANS NO; IGNORE THE .RESET.
3524 MOVSI T,%TCLFT+%TCOCO+%TCICO+%TCFPD ;ALSO WAIT FOR OUTPUT SEQ TO FINISH.
3525 PUSHJ P,TTYCMW ;HANG UNTIL OUT OF COM MODE, OR OVER-RIDDEN. MAY UTCOFF.
3526 MOVSI B,%TJCP1+%TJCP2+%TJSTP ;IF LAST CHAR THIS CHNL WAS ^P,
3527 ANDCAM B,(R) ;FORGET IT. ALSO UNHANG CHANNEL FROM **MORE**.
3530 MOVEI B,%TFEOP+%TFIGL ;RESTORE BOTH PCS OF PPR TO NORMAL STATE.
3532 ANDCAM B,TPFLAG+TPLEN(TT)
3533 MOVE B,TTYOPT(I) ;IS OUTPUT RESET SUPPOSED TO DO SOMETHING?
3534 TRNN B,%TPORS ;(ON FAST TTYSS IT DOESN'T)
3539 TYORS1: MOVE B,TOOP(I) ;SCAN BACKWARD 4 CHARS FROM TOOP TO SEE IF A %TDMOV
3541 MOVEI TT,TOBS-4 ;HAS BEEN PARTIALLY REMOVED FROM THE BUFFER.
3542 MOVEM TT,TORM(I) ;TORM HAS THE RIGHT VALUE ASSUMING A %TDMOV APPEARS
3543 ;JUST BEFORE TOOP - THE FIRST PLACE WE WILL LOOK FOR ONE.
3548 CAIN T,%TDMOV ;IF ONE IS FOUND IN THOSE 4 CHARS, IT MUST EXTEND PAST TOOP,
3549 JRST TYORS5 ;SO TAKE TOOP AND INCREMENT IT TO GET NEW TOIP.
3550 IBP B ;DBP B - KNOWING THAT THERE ARE 4 BYTES/WORD.
3556 AOS TT,TORM(I) ;AS THE %TDMOV GETS FARTHER BACK, ITS REMNANT OCCUPIES LESS SPACE.
3557 CAIE TT,TOBS ;IF ITS REMNANT TAKES NO SPACE, FORGET ABOUT IT.
3561 TYORS8: ADDI TT,2 ;THIS REMNANT IS TWO CHARS LONG
3563 JRST [ MOVEI TT,TOBS
3567 TYORS5: SUBI TT,TOBS ;TT GETS -<LENGTH OF REMNANT>
3569 TYORS7: CAMN B,TOBEP(I) ;SCAN FORWARD FROM TOOP TO FIND END OF REMNANT
3573 MOVEM B,TOIP(I) ;AND FLUSH FROM BUFFER ALL BUT THAT REMNANT.
3576 TYORS6: MOVE B,TCTYP(I) ;IF A "SOFTWARE" TTY, SEND A %TDORS.
3578 JRST [ MOVE B,TTYTYP(I)
3579 TRNN B,%TYSTY ;ELSE, ON A STY, IF %SSORS
3581 MOVE B,STYSTS-NFSTTY(I)
3584 JRST .+1] ;THEN SEND %TDORS
3589 MOVEM B,TOIP(I) ;CHECK FOR WRAP
3590 MOVEI B,%TDORS ;RESET CODE
3592 PUSHJ P,TYORS2 ;FINISH RESETTING, TURN TTYCHN BACK ON,
3593 AOSN TTYOAC(I) ;AND ACTIVATE INT. LEVEL, SO %TDORS WILL BE SENT.
3594 XCT TTYST(I) ;(THIS MAY TURN TTYCHN OFF AND ON AGAIN).
3596 TRNN B,%TPCBS ;ON SOFTWARE TTY WITH ^\ TURNED ON, STOP TYPEOUT AT M.P.
3597 POPJ P, ;LEVEL UNTIL THE TTY SAYS WHAT ITS CURSOR POSITION IS NOW,
3598 HRRZS TTOALC(I) ;USING ^\^P... OR SCPOS
3601 TYORS2: SKIPGE TT,TTYLPP(I)
3603 SKIPL B,TTYIHP(I) ;AND UNDO MAIN PRGM CURSOR POS MVT
3609 TYORS3: MOVEM B,TPHP(TT)
3617 ;SEND A %TDINI TO ALL TTYS. CALLED AT SYSTEM STARTUP.
3618 TTRSAL: MOVSI I,-NCT
3619 TTRSA1: MOVE T,TCTYP(I)
3624 PUSHJ P,TYOOU1 ;YES, SEND IT A REINIT CHARACTER
3628 XCT TTYST(I) ;AND MAKE SURE IT GETS SENT TO THE TTY
3629 TTRSA2: AOBJN I,TTRSA1
3632 SUBTTL TV-11 INPUT PROCESSOR
3635 ;CALL HERE FROM CLOCK LEVEL WHEN THERE IS INPUT FROM THE PDP-11.
3636 ;TAKE CHARACTERS FROM THE PDP11 AND CALL THE TTY INPUT INT. LVL.
3637 ;ROUTINES WITH THEM ONE AT A TIME. MAY CLOBBER ANY ACS.
3638 TT11IN: SKIPL TT11P ;IF 11 DOWN, DON'T LOOK FOR INPUT FROM IT.
3640 LDB TT,[$11WD0,,@TT11HD]
3641 SETZM @TT11HD ;GET AND RESET CHAIN OF INPUT BUFFERS.
3642 ;HANDLE THE NEXT INPUT BUFFERFULL. PDP11 ADDRESS IN TT.
3643 TT11I1: LSH TT,-2 ;CONVERT PDP11 ADDRESS TO PDP10 ADDR.
3645 MOVE A,(TT) ;GET -<# CHARS IN BUFFER>
3647 LDB I,[$11WD0,,2(TT)] ;GET # OF TTY THE CHARS ARE FOR.
3648 CAML A,[-400] ;IF A OR I IS RIDICULOUS,
3650 JRST TT11LS ;ASSUME 11 HAS CRASHED.
3653 MOVEI B,3(TT) ;SET UP BP TO DATA AREA OF BUFFER.
3654 HRLI B,$11WD1 ;EACH CHAR IS 16. BITS - A PDP11 WORD.
3655 PUSH P,TT ;SAVE BUFFER ADDR SO CAN FIND NEXT BFR.
3656 CAIL I,NF11TY+N11TYS
3657 JRST [ MOVE A,I ;IF 11 KNOWS MORE TV'S THAN 10, IGNORE THOSE 10 ISN'T USING.
3658 PUSHJ P,TTYLO2 ;AND IF THE 11 STARTS USING ONE, FREE IT SO USER ISN'T CONFUSED.
3665 TT11I2: ILDB A,(P) ;GET NEXT CHAR FROM BFR,
3667 PUSHJ P,NTYI5 ;PRETEND IT CAME FROM A TTY CONTROLLER INT.,
3669 JRST TT11I2 ;MORE CHARS => HANDLE THEM.
3671 TT11I3: CONO PI,TTYON-1
3672 POP P,A ;ADDR. OF BUFFER JUST EMPTIED.
3673 LDB TT,[$11WD1,,1(A)] ;GET ADDR OF NEXT BUFFER.
3674 SETZB B,(A) ;THIS BUFFER NOW FREE.
3675 DPB B,[$11WD1,,1(A)]
3676 JUMPN TT,TT11I1 ;LOOK AT NEXT ONE, IF ANY.
3679 TT11I4: PUSHJ P,TYPEND ;INPUT BUFFER WITH 0 CHARS SAYS OUTPUT BUFFER
3680 JRST TT11I3 ;IS EMPTY, SO MAYBE REQUEST ECHOING.
3682 TT11LS: MOVEM A,TT11ER ;LEAVE DIAGNOSTIC INFO BEHIND
3691 TT1LS1: SETZM TT11P ;MARK 11 DOWN AND DONT TRY TO COME BACK UP FOR NOW
3692 MOVEI A,SCR11D ;MAKE SYS JOB PRINT "11 WENT DOWN" MESSAGE.
3694 TT11D1: MOVEI A,TT11HD+1 ;MAKE SURE CLOCK LEVEL DOESN'T THINK
3695 MOVEM A,TT11HD ;THAT THE 11 IS SENDING INPUT.
3699 SUBTTL TERMINET MOTOR CONTROL
3701 ;COME HERE FROM VERY SLOW CLOCK (2 MIN.), RUNNING IN SYS JOB.
3702 ;TURN OFF MOTORS OF ALL TERMINETS THAT HAVE BEEN IDLE 30. SEC.
3703 ;MAY CLOBBER ANY ACS.
3704 TTTMNT: MOVE TT,TIME
3705 SUBI TT,900. ;TT=30. SECONDS AGO.
3707 TTTMN2: MOVE TT,TIME ;TURN OFF ALL TERMINETS AT SYSTEM STARTUP.
3709 TTTMN0: MOVE T,TCTYP(I)
3712 CAML TT,TTLTM(I) ;IF TTY HAS OUTPUT RECENTLY
3713 CAIE T,%TNTRM ;OR ISN'T A TERMINET,
3714 JRST TTTMN1 ;NOTHING TO DO.
3716 TDNE T,TTYCOM(I) ;DITTO IF MOTOR ALREADY OFF.
3721 MOVEI A,%TDMTF ;PUT A MOTOR-OFF COMMAND IN OUTPUT BFR
3726 XCT TTYST(I) ;AND TELL INT. LVL. ABOUT IT.
3727 TTTMN1: CONO PI,TTYON
3731 ;CALL HERE WHEN ABOUT TO OUTPUT TO A TERMINET WHOSE MOTOR IS OFF
3732 ;TTY # IN I. LEAVES TTY'S TTYCOM IN Q.
3733 TTTMTO: MOVE Q,TOIP(I)
3736 PUSHJ P,TYOOU1 ;PUT MOTOR-ON CMD IN OUTPUT BFR,
3738 MOVSI Q,%TCMTR ;MOTOR NOW ON AS FAR AS MAIN PRGM
3739 ANDCAB Q,TTYCOM(I) ;IS CONCERNED.
3742 SUBTTL PI-LEVEL ECHOING
3744 ;ECHOING - CALLED AT CLOCK LEVEL. MAY CLOBBER ANY AC.
3745 ;ECHOES CHARS BY COPYING THEM FROM INPUT BFR TO OUTPUT BFR.
3746 TTECH: MOVSI I,200000 ;GET LIST OF TTYS NEEDING ECHO, AND REINIT IT.
3748 TTELUP: AOS NTTELU ;TAKE STATISTICS.
3750 POPJ P, ;NO MORE TTYS NEED ECHOING.
3751 ;I HAS IDX OF A TTY NEEDING ECHOING.
3759 TDNE T,TTYCOM(I);CAN'T ECHO UNLESS OUTPUT BUFFER HAS ENOUGH ROOM,
3761 CAMG A,TORM(I) ;NO MAIN PROGRAM OUTPUT IN IT,
3762 SKIPL TTOALC(I);OUTPUT NOT BLOCKED AT M.P. LEVEL,
3764 SKIPL TYOSW(I) ;AND NO MORE OUTPUT COMING SOON.
3765 JRST TTEWAT ;PUT TTY BACK ON LIST.
3768 TLNE Q,%TCMTR ;IF TTY'S MOTOR IS OFF, TURN IT ON.
3770 MOVEI J,TTEDMY ;PROVIDE IOT RTNS WITH VARIABLE-BLOCK.
3771 SKIPGE TT,TTYLPP(I) ;TT HAS IDX OF MOST RECENTLY USED PC PPR
3772 SETCM TT,TTYLPP(I) ;WHETHER NOW ASSOCIATED OR NOT.
3773 MOVE A,TPVB(TT) ;PERHAPS MOST RECENT PC PPR IS ECHO AREA,
3774 CAMN A,TCMXV(I) ;BUT THERE'S NO ECHO AREA NOW. IN THAT CASE,
3775 SUBI TT,TPLEN ;MAKE SURE DON'T TRY TO FORCE OUT BUFFERED CURSOR POS IN THAT PC PPR.
3776 TTEDU2: TLZE Q,%TCDNG ;SHOULD BELL BE TYPED BECAUSE INPUT BFR FULL?
3777 PUSHJ P,[MOVEM Q,TTYCOM(I)
3778 MOVEI R,%TJECH+%TJMOR
3779 MOVEI A,^G ;DING ON TTY IF DESIRED.
3781 TTELP1: SKIPN T,ECHOC(I) ;ANY CHARS TO BE ECHOED NOW IN INPUT BFR?
3782 JRST TTEDUN ;NO, FINISHED ECHOING.
3784 BUG ;ECHOED MORE CHARS THAN THERE WERE?
3786 ;NOW FIND NEXT CHARACTER NEEDING PI ECHO,
3787 ;AND MARK IT AS NO LONGER NEEDING IT.
3788 ;CAN EXIT TO TTEDU5 IF MUST STOP ECHOING BECAUSE ECHOING IS DEFERRED.
3789 CONO PI,TTYOFF-1 ;PREVENT INTERACTION WITH INPUT INTERRUPTS.
3791 TTELP2: MOVE C,TICC(I)
3795 CAMN B,TIBEP(I) ;LOOK FOR 1ST CHAR NEEDING PI ECHO.
3800 TRNN A,%TXIGN ;DON'T ECHO NON-COM-MODE CHARS
3801 JRST [ MOVE T,TTYSTS(I) ;IF ECHOING BEING DEFERRED.
3803 TLNE H,%TOHDX ;BUT IF HALF-DUPLEX, IT ECHOES IN ANY CASE.
3806 SOSGE ECHOC(I) ;FOUND ONE; NOW ECHO IT.
3809 DPB A,B ;MARK IT AS ECHOED.
3810 LDB A,B ;CHECK FOR HARDWARE LOSSAGE.
3812 BUG ;DPB OR TRZN LOST??
3813 TRNN A,%TXIGN ;IF CHAR IS IN BFR ONLY TO BE ECHOED,
3815 CAMN C,TIOP(I) ;IF IT'S 1ST CHAR IN CUFFER,
3816 JRST [ PUSHJ P,TYIRE1 ;REMOVE IT THE NORMAL WAY.
3818 CAMN B,TIIP(I) ;IF CHAR IS LAST CHAR IN BFR,
3819 PUSHJ P,TTEBAK ;DELETE IT, & MAYBE OTHERS BEFORE IT.
3820 TTELP5: CONO PI,TTYON-1
3821 ;DECIDE WHICH PC PPR TO USE.
3823 IMULI T,2*TPLEN ;COMPUTE INDEX OF M.P. PC-PPR.
3824 SKIPGE Q,TTYCOM(I) ;COM MODE, UNLESS %TCICO OR %TCLFT, MEANS USE M.P. AREA.
3825 TDNE Q,[%TCICO+%TCLFT,,400000]
3826 MOVE T,TTYEPP(I) ;OTHERWISE USE THE ECHO AREA IF ANY.
3829 TRNN A,%TXIGN ; FOR ^_ COMMANDS, DON'T OBEY %TSNEA.
3830 TLNN B,%TSNEA ; %TSNEA SAYS USE M.P. AREA.
3834 TTELP4: SKIPGE TT,TTYLPP(I) ;TT GETS LAST PC PPR HACKED WITH THIS TTY.
3836 CAMN TT,T ;IF WE ARE SWITCHING TO A DIFFERENT PC PPR,
3838 SKIPL TTYLPP(I) ;DISASSOCIATE THE OLD ONE IF NEC.
3840 TTELU1: MOVE TT,T ;MOST RECENT PC PPR NOW ECHOING PC PPR.
3841 MOVSI Q,%TCECH ;NOW DEFINITELY GOING TO PUT CHARS IN OUTPUT BUFFER
3843 MOVEI R,%TJECH+%TJMOR
3844 TLNN H,%TOHDX ;ON HALF-DUPLEX TTYS, EXCEPT FOR
3846 TRNN A,%TXCOM ;CHARS PRODUCED BY COM LINKS,
3847 PUSHJ P,[IORI R,%TJHDE
3848 JRST TYOAS5] ;MOVE CURSOR BUT DON'T REALLY OUTPUT.
3849 ;THUS, CURSOR MOTION DUE TO ECHOING BY TTY
3851 TTELP3: LDB B,[.BP %TXASC,A]
3855 CAIE B,^L ;^L ECHOED IN COM MODE SHOULD CLEAR SCREEN.
3857 JRST [ MOVEI A,"C ;(BY SIMULATING A ^PC).
3860 TTELP6: ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
3868 JRST [ PUSHJ P,TYOWN1
3871 JRST TTEDU6 ;LESS THAN 20. FREE SPACES IN BFR => GIVE UP.
3875 CAIGE A,TYOWNC ;IS THERE A CHANCE OUTPUT WOULD HANG UP?
3876 JRST TTEDU4 ;YES, WAIT UNTIL LATER TO ECHO THE REST.
3877 JRST TTELP1 ;NO, ECHO MORE
3879 TTELBG: BUG PAUSE,[ECHOC is ],OCT,T,[ but ECHOP equals TIIP. TICC=],OCT,C,[. TTY ],OCT,I
3881 ;COME HERE WHEN ALL ECHOING DESIRED ON THIS TTY WAS DONE.
3882 TTEDUN: CONO PI,TTYOFF-1
3885 TTEDU5: MOVE Q,TTYCOM(I)
3886 TLNE Q,%TCDNG ;HAS ANOTHER REASON TO ECHO ARISEN AFTER WE CHECKED?
3887 JRST TTEDU1 ;YES, GO PROCESS IT.
3888 PUSH P,TTYERQ(I);SAVE NEXT TTY TO ECHO ON
3889 SETOM TTYERQ(I) ;AND TURN OFF THIS ONE'S ECHO REQUEST
3893 PUSHJ P,TYOFRC ;FORCE OUT BUFFERED CURSOR MOTION.
3898 TTEDU3: SETO A, ;NO, MOVE TO NEXT TTY ON LIST.
3903 TTEDU1: CONO PI,TTYON-1
3906 ;COME HERE WHEN CAN'T ECHO BECAUSE TYOSW IS LOCKED.
3908 MOVE A,I ;IF WE CAN'T DO ANY.
3910 EXCH A,TTERQS ;PUT THIS TTY BACK ON LIST,
3911 EXCH A,TTYERQ(I) ;SO IT WIL BE REEXAMINED NEXT TICK.
3913 MOVE I,A ;MOVE TO NEXT TTY ON OLD LIST.
3918 JRST TTEDU4 ;DON'T ECHO ON PDP11 TTYS IF PDP11 DOWN.
3919 LDB A,TOIP(I) ;DEFER ECHOING UNLESS OUTPUT BFR EMPTY.
3921 JRST TTELU4 ;JUMP IF BUFFER EMPTY (LAST CHAR OUTPUT CHANGED TO -1)
3922 TTEDU6: JRST TTEWAT ;TEMPORARY PATCH
3923 .ERR IS THIS PATCH TEMPORARY OR PERMANENT?
3924 MOVE A,TT11HD ;BFR NOT EMPTY: TELL 11
3925 ADDI A,1-NF11TY(I) ;(BY SETTING ECOFLG)
3927 MOVSI B,400000 ;TO SIGNAL TEN WHEN THE BUFFER BECOMES EMPTY.
3928 IORM B,(A) .SEE TT11I4
3931 ;COME HERE WHEN ARE JUST ABOUT TO ECHO THE LAST CHAR
3932 ;IN THE INPUT BUFFER, AND ITS %TXIGN IS SET.
3933 ;TRY TO FLUSH THE CHARACTER FROM THE INPUT BFR,
3934 ;AND ALSO THE CHARS BEFORE IT, IF THEY TOO HAVE %TXIGN.
3935 TTEBAK: SKIPE C,ECHOC(I)
3936 BUG PAUSE,[ECHOING LAST CHAR BUT ECHOC IS ],OCT,C,[. TTY ],OCT,I
3938 IBP B ;THIS DEPENDS ON 18-BIT BYTES IN INPUT BUFFER.
3947 TTEBA1: MOVE C,TIIP(I)
3956 SUBTTL TTY INTERRUPT HANDLING
3958 ;MACRO TO SAVE ACS AND CONI APR ON ENTERING A TTYCHN INTERRUPT ROUTINE.
3959 ;PCLOC SHOULD BE THE ADDRESS OF THE STORED PC, WHICH IS MOVED TO TTYBRK.
3960 DEFINE TTYSAV PCLOC=TTYBRK
3962 CONSO PI,1_<7-TTYCHN>
3963 JRST 4,. ;HARDWARE BUG ALLEGEDLY FIXED
3965 IFN KA10P, CONI TTYAPC
3968 BLT A,TTYACS+17-B+1-1 ;SAVE ALL ACS BUT 0
3982 TTYSAV ;SAVE ACS AND SET UP P.
3984 CONSZ DTE,%DBL10+560
3985 JRST TTDTE1 ;DTE20 INTERRUPTED (DOORBELL OR BYTE TRANSFER ERROR OR DONE)
3989 JRST TTDLB0 ;DL10 INTERRUPTED
3993 JRST NTY1 ;NEW TELETYPE KLUDGE
3997 JRST MTY1 ;MORTON BOX
4001 JRST DPKPE ;PARITY ERROR OR NXM
4003 JRST DPTI1 ;CHAR AVAIL DPK
4005 JRST DPTO1 ;OUTPUT BUFFER FIN DPK
4013 ;DZ-11 Code The only place that emulates an interrupt on the TTY interrupt
4014 ; channel is the DTE code, handled above, so there should never be a
4015 ; need for a DZ11 entry here.
4017 ; MOVEI J,TTYCHN ;KNIGHT TTY KLUDGE GENERATES SPUR INTS
4018 ; JSP E,SPUR ;SPURIOUS INT
4024 TRNE A,220000 ;DID MPV OR PDL OV COME ON DURING THIS INT?
4025 BUG PAUSE,[MPV OR PDL OV IN TTY INT HANDLER, APR CONI=],OCT,A
4034 CONO DPK,60+TTYCHN ;PARITY ERROR OR NXM
4038 IFN DZ11P,[ ;DZ-11 Code
4040 IFE KS10P, .ERR DZ11 code only works on a KS-10.
4047 CONC DZ,\.RPCNT,RB: 0
4051 ;; <first line>,,<bus address>:
4052 NFDZTY+<DZNLN*.RPCNT>,,CONC DZ,\.RPCNT,BA
4055 CONC DZ,\.RPCNT,XB: 0
4059 ;; <first line>,,<bus address>:
4060 NFDZTY+<DZNLN*.RPCNT>,,CONC DZ,\.RPCNT,BA
4067 BLT A,TTYACS-B+<U-1> ;SAVE ALL ACS BUT 0, A AND U...
4068 MOVE A,-3(U) ;Get return address
4069 MOVEM A,TTYBRK ;Save it in TTYBRK
4070 MOVE P,TTYPDP ;Stack
4071 PUSH P,[TTYRET] ;Set up return address
4072 HRRZ C,(U) ;Get Unibus address
4073 HLRZ I,(U) ;Get ITS TTY # of first DZtty on this board
4076 ; DZ11 receiver interrupts (actually silo overflow)
4077 DZRBK: DZSAV ;Save ACs and setup parameters
4079 TRNN A,%DZCRD ;Character ready?
4080 JRST [ AOS DZRSPR ;Count spurious interrupts
4082 DZRBK1: IORDI A,%DZRDR(C)
4083 TRNN A,%DZDDV ;Data valid?
4084 POPJ P, ;Nope, got it all
4085 ; If parity must be hacked, it should be done here
4086 LDB D,[.BP %DZLM,A] ;Get line number
4087 ANDI A,%DZTCM ;Get character
4088 ADD I,D ;Get TTY number
4089 CAIL I,NFDZTY+NDZTYS
4093 ; The following code can't work because I found the place where NTYI1
4094 ; clobbers U (Alan 3/26/86):
4096 ; PUSHJ P,NTYI1 ;Process the input
4097 ; HRRZ C,(U) ;Get Unibus address
4098 ; HLRZ I,(U) ;Get ITS TTY # of first DZtty on this board
4101 ; DZ11 transmitter interrupts
4102 DZXBK: DZSAV ;Save ACs and setup
4103 AOS DZXINC ;Count interrupts
4104 DZXBK1: IORDI A,%DZRCS(C)
4105 TRNN A,%DZCTR ;Transmitter ready?
4107 LDB D,[.BP %DZLM,A] ;Get line number
4108 ADD I,D ;ITS terminal number of this line
4109 CAIL I,NFDZTY+NDZTYS
4111 AOS DZXCHC ;Count characters sent
4112 PUSHJ P,TYPSC ;Merge with the rest of the world
4113 HRRZ C,(U) ;Get UB address of board again
4114 HLRZ I,(U) ;Get ITS TTY # of first DZtty on this board
4115 JRST DZXBK1 ;Try to send another, maybe we'll get lucky
4120 ;HANDLE INTERRUPTS FROM THE CONSOLE PDP11 VIA THE DTE20
4121 ;CODE FOR HANDLING MULTIPLE CONSOLES, BLOCK TTY OUTPUT, ETC.
4122 ;IN THE FUTURE ETHERNET STUFF WILL GET ADDED HERE.
4124 TTDTE1: CONI DTE,DTECNI ;SAVE FOR DEBUGGING
4125 CONSZ DTE,460 ;TO11 ERROR OR TO10 DONE OR TO10 ERROR
4126 BUG PAUSE,[DTE20 ERROR, CONI=],OCT,DTECNI
4127 CONSZ DTE,100 ;TO11 TRANSFER COMPLETE
4128 JRST [ CONO DTE,100 ;CLEAR TO11 TRANSFER COMPLETE
4129 SETZM DTEBBY ;BUFFER NO LONGER BUSY
4131 CONO DTE,%DBL10+40 ;CLEAR DTE20 INTERRUPTING STATE
4132 SKIPGE A,DTETYI ;CHECK FOR TTY INPUT AVAILABLE
4134 SETOM DTETYI ;AVAILABLE. INDICATE HAS BEEN GOTTEN.
4135 CONO DTE,%DBL11 ;SIGNAL 11 THAT WE'RE READY FOR MORE.
4136 HLRZ I,A ;GET LINE NUMBER
4137 CAIL I,NFETY ;CHECK IT
4139 BUG PAUSE,[BAD TTY NUMBER ],OCT,I,[FROM PDP-11]
4140 PUSHJ P,NTYI1 ;PROCESS THE INPUT
4141 JRST TTDTE1 ;CHECK FOR MORE
4143 TTDTE2: MOVEI A,SCRHNG ;IF HANGUP/DIALIN, SIGNAL SYSTEM JOB TO HANDLE IT
4146 SKIPN DTEBBY ;DON'T CHECK FOR OUTPUT DONE IF BUFFER BUSY
4147 SKIPGE A,DTEODN ;CHECK FOR TTY OUTPUT DONE
4148 POPJ P, ;NOTHING, DISMISS INTERRUPT
4149 SETOM DTEODN ;INDICATE SIGNAL HAS BEEN RECEIVED
4150 HLRZ I,A ;GET LINE NUMBER
4151 CAIL I,NFETY ;CHECK IT
4153 BUG PAUSE,[BAD TTY NUMBER ],OCT,I,[FROM PDP-11]
4154 HRRZS A ;SET UP MULTI-CHARACTER TRANSFER,
4155 HRRZ B,TTOALC(I) ;SETTING MAX# CHARACTERS FROM ELEVEN'S BUFFER SIZE
4156 CAIGE B,(A) ;DON'T SEND MORE CHARACTERS THAN ALLOCATED
4158 CAILE A,DTEOBL ;DON'T EXCEED SIZE OF OUR BUFFER
4162 MOVE A,[441000,,DTEOBF]
4164 JRST TYP ;GO FILL OUTPUT BUFFER
4168 ;HANDLE THE DL-10 (A PDP-11 FRONT END FOR THE KL-10).
4169 ;ALL INTERRUPTS FROM DL-10 COME HERE.
4171 TTDLB0: CONO DLC,10+TTYCHN ;CLEAR INTERRUPT FLAG
4172 SKIPN DL10F ;IGNORE DL10 IF IT IS MARKED OUT OF SERVICE.
4174 IFN CHAOSP, IFN DLCP, PUSHJ P,DLCWAK ;SEE IF INTR IS FOR CHAOS NET
4175 IFN T300P,[ ;CHECK FOR T-300 INTERRUPT, PASS TO DISK LEVEL IF SO
4179 SKIPE I,DL10IL ;IS INPUT AVAIL? IF SO, READ WHICH LINE
4180 PUSHJ P,TTDLIN ;AND PROCESS THE CHARACTER.
4181 MOVEI A,SCRHNG ;DOES THE 11 SAY A MODEM WAS DISCONNECTED?
4183 IORM A,SUPCOR ;IF SO, TELL SYS JOB TO TAKE APPROPRIATE ACTION.
4184 SKIPN DL10LN ;DON'T CHECK OUTPUT-DONE IF OUTPUT BUFFER IS BUSY
4185 SKIPN I,DL10OD ;OUTPUT DONE ON SOME TTY?
4187 MOVE A,DL10BS ;YES, GET 11'S BUFFER SIZE AND
4188 SETZM DL10OD ;MAKE COMMUNICATION CHANNEL FREE FOR -11 AGAIN
4191 MOVE A,B ;DON'T SEND MORE CHARACTERS THAN TERMINAL HAS ALLOCATION FOR
4192 MOVEM A,DBBCC ;INIT CHARACTER COUNTERS TO SIZE OF BUFFER IN 11
4194 MOVE A,[441000,,DL10BF]
4195 MOVEM A,DBBBP ;INIT B.P. USED BY 10 TO STORE INTO BUFFER.
4196 JRST TYP ;GO FILL UP THE OUTPUT BUFFER
4198 TTDLIN: MOVE A,DL10IC ;GET THE CHARACTER TYPED IN
4199 SETZM DL10IL ;FREE THE INPUT CHANNEL SO 11 CAN USE IT AGAIN.
4200 CONO DLC,100040+TTYCHN ;INTERRUPT 11
4201 JRST NTYI1 ;AND PROCESS THE INPUT.
4208 SKIPL @DPKC-NFDPTY(I)
4209 SETOM @DPKC-NFDPTY(I)
4210 LDB J,[$TTOSP,,TTYTYP(I)] ;GET OUTPUT SPEED CODE.
4215 MOVE A,DPSPT(J) ;# CHARS BUFFER SPACE FOR THAT SPEED.
4218 MOVE A,DBBFP-NFDPTY(I)
4219 MOVEM A,DBBBP ;BP FOR STORING CHARS.
4220 MOVSM A,@DPKP-NFDPTY(I)
4229 NTY1: CONSZ NTY,400000
4230 POPJ P, ;SCANNER NOT STOPPED
4231 CONI NTY,I ;READ IN TTY #
4232 IFE NNTYS-10,LDB I,[110300,,I]
4233 IFE NNTYS-20,LDB I,[100400,,I]
4234 IFN <NNTYS-10>*<NNTYS-20>,.ERR
4237 ADDI I,NFNTY ;CALCULATE CONSOLE #
4238 CONO NTY,@TTYLT(I) ;SELECT APPROPRIATE TTY
4240 JRST TYPSC ;DONE FLAG ON TYPEOUT
4242 JRST TTYRT2 ;THIS TTY NOT REALLY UNHAPPY
4246 TTYRT2: CONO NTY,200000+TTYCHN
4252 LDB I,[140500,,I] ;GET SUBDEVICE
4254 JRST MTY2 ;NOT A VALID #
4257 CONSO MTY,40 ;INPUT DONE
4262 MTY6: CONSO MTY,10 ;OUTPUT DONE
4267 MOVEM A,DBBCC ;# CHARS CAN GIVE AT ONCE.
4269 SETZM MTYOW ;SET UP WORD TO FILL WITH OUTPUT CHARS.
4270 MOVE A,[440700,,MTYOW]
4271 MOVEM A,DBBBP ;SET UP BP FOR STUFFING THAT WORD.
4281 CONO MTY,200+TTYCHN(I) ;CLEAR OUTPUT DONE FLAG
4287 JRST TYPSC ;TTO DONE
4290 DATAI TTY,A ;TTI DONE, READ CHR
4294 ;PROCESS INPUT INTERRUPT WITH CHARACTER IN A, TTY # IN I
4296 OVHMTR TTI ;TTY INPUT INTERRUPT LEVEL
4298 ;ENTER HERE FOR "HARDWARE" TTYS, LOW 8 BITS OF A ARE THE INPUT, OTHER BITS ARE GARBAGE
4301 CAME I,NOVATT ;SKIP IF THIS TTY IS NOVA
4303 TRZE A,200 ;SKIP IF DATA AND NOT TTY #
4304 JRST NTYI2 ;SET TTY #
4305 SKIPGE I,NVIPTT ;CURRENTLY SELECTED CONSOLE ON INPUT
4306 POPJ P, ;NONE SELECTED
4312 ANDI A,377 ;FLUSH EXTRANEOUS BITS, KEEP LOW 7
4314 TRNN H,%TPMTA ; OR KEEP LOW 8 IF 8TH IS HARDWARE META KEY
4316 ;ENTER HERE FOR TTYS WHICH MAY INPUT IN FULL-CHARACTER-SET
4317 NTYI5: MOVEM I,LOCTTY ;TTY CHAR ACTUALLY TYPED ON
4319 ANDCAB U,TTYSTS(I) ;CLEAR LAST CHR ^Z BIT
4323 TRNE H,%TPMTA ;PROCESS HARDWARE META KEY IF PRESENT
4327 ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC ;FLUSH MEANINGLESS BITS.
4328 TLNE H,%TOALT ;IF THIS TTY WANTS IT, MAYBE STANDARDIZE ALTMODES
4331 MOVEM D,LTTYIPC ;REMEMBER INPUT RTN FOR DEBUGGING
4334 JRST (D) ;PROCESS THE CHARACTER AND RETURN.
4337 NTYI2: JUMPE A,CPOPJ
4339 CAIGE A,NFNVTY+NNVTTS
4340 MOVEM A,NVIPTT ;SELECT CONSOLE
4344 IFN TTLPTP,[INLPT: MOVE A,TIME
4349 SUBTTL HANDLE ^\ CODES
4350 ;OR PASS CHARACTERS ON TO NEXT LEVEL OF INPUT
4351 ;PROCESSING IF NO ^\ CODE IS IN PROGRESS.
4353 ;THIS IS THE NORMAL VALUE OF TYBPC FOR ALL TTY'S; IT IS THE ONLY POSSIBLE VALUE
4354 ;FOR A TTY WHOSE %TPCBS AND %TPTEL ARE 0.
4357 TRNN H,%TPCBS+%TPTEL
4358 JRST TYBRT2 ;IF NOT ENABLED, JUST PASS CHAR TO NORMAL INPUT LEVEL.
4359 ; USED TO CLEAR %TXSFT (NOW %TXSUP) BEFORE CHECKING FOR ^\
4364 JRST TYBCR1 ;IF NOT AN ENABLED ^\, GO CHECK FOR SPECIAL CR HANDLING
4365 JSP D,TYBRED ;READ THE CHARACTER AFTER THE ^\
4366 CAIGE A,100 ;^\ FOLLOWED BY @ THROUGH _ IS THE HIGH BITS FOR THE NEXT CHARACTER.
4367 JRST TYBCTL ;^\ FOLLOWED BY A CONTROL CHAR, ETC. IS A SPECIAL HACK.
4368 ANDI A,<%TXCTL+%TXMTA+%TXSUP+%TXTOP>_-7
4369 LSH A,7+18. ;GET THE EXCESS OVER 100 AND SHIFT BY 7,
4370 HRRI A,TYBPFX ;AND STORE IN LH OF TYBPC
4372 POPJ P, ;RETURN. NEXT CHAR COMES TO TYBPFX
4374 TYBPFX: HLRZ D,TYBPC(I) ;GET THE HIGH BITS READ IN LAST TIME
4375 IOR A,D ;AND MERGE INTO THE CHAR JUST READ IN
4376 TYBRET: MOVEI D,TYBN ;RESET ^\ STATUS TO NORMAL
4377 TYBRT1: MOVEM D,TYBPC(I)
4379 MOVEM E,TTITM(I) ;UPDATE TIME OF LAST INPUT ON THIS TTY.
4380 ;NOW DETECT SPECIAL TOP-CHARS THAT SHOULD NOT ECHO
4381 ;AND SHOULD BE IGNORED IN COM MODE OR IN ^_ COMMANDS.
4382 SETZ E, ;WE SET E TO -1 BELOW FOR THOSE CHARACTERS.
4384 TLNE D,%TANEC ;IF COUNT OF DON'T-ECHO CHARS IS >0,
4385 JRST [ SUB D,[<.DPB 1,.BP %TANEC>,,] ;DECREMENT IT
4386 SETO E, ;AND DON'T ECHO THIS ONE.
4388 MOVE E,A ;IS THIS INPUT REALLY FOR LOCAL EDITING PROTOCOL?
4389 ANDI E,%TXTOP+%TXASC ;THAT IS, TOP-E OR TOP-S, OR THE CHARACTER FOLLOWING ONE?
4391 CAIN E,%TXTOP+"S ;DON'T ECHO OR INTERRUPT FOR TOP-S OR TOP-E,
4392 TLO D,<.DPB 1,.BP %TANEC> ;OR THE CHAR THAT FOLLOWS IT.
4393 CAIN E,%TXTOP+"T ;DON'T ECHO OR INT FOR TOP-T, OR FOLLOWING 3 CHARS.
4394 TLO D,<.DPB 3,.BP %TANEC>
4395 CAIE E,%TXTOP+"Y ;GRAPHICS INPUT CMDS TAKE 5 ARG CHARS.
4397 TLO D,<.DPB 5,.BP %TANEC>
4401 TYBRT3: MOVEM D,TTYSTA(I)
4402 MOVEM E,LEPCHR ;LEPCHR IS -1 FOR SPECIAL CHARS THAT SHOULD USUALLY BE IGNORED.
4404 JUMPE E,(D) ;IN WHICH CASE, DROP THIS CHAR ENTIRELY
4405 CAIN D,TTYI ;IF IT IS NOT THE NORMAL SORT OF INPUT.
4409 ;COME HERE FOR ^\ FOLLOWED BY A CHARACTER < 100.
4410 TYBCTL: CAIN A,^A ;^\^A => ALLOCATE OUTPUT CHARS.
4412 CAIN A,^Z ;^\^Z => ZERO ALLOCATION
4414 CAIN A,^I ;^\^I => INFINITY ALLOCATION
4416 CAIN A,^R ;^\^R => RESTART OUTPUT AT M.P. LEVEL.
4418 CAIN A,^P ;^\^P => SET CURSOR POSITION AND RESTART OUTPUT AT M.P. LEVEL.
4420 CAIN A,^\ ;^\^\ => INPUT A ^\.
4422 CAIN A,^C ;^\^C => SCREEN HAS BEEN SURREPTITIOUSLY CHANGED
4424 ;RETURN TO NORMAL ^\ STATUS BUT DON'T PASS ANY INPUT UP TO NORMAL INPUT LEVEL.
4425 TYBXIT: MOVEI D,TYBN
4426 TYBRED: MOVEM D,TYBPC(I) ;JSP D,TYBRED TO WAIT FOR NEXT CHARACTER
4429 TYBC: MOVSI D,%TSATY
4438 TYBCR1: CAIN A,15 ;SEE IF ENABLED CR
4440 JRST TYBRT2 ;NO, JUST PASS CHAR TO NORMAL INPUT LEVEL
4441 JSP D,TYBRT1 ;PASS CHAR TO NORMAL INPUT LEVEL BUT HACK NEXT CHAR
4442 CAIE A,12 ;IF IT IS LF OR NULL IGNORE IT
4443 JUMPN A,TYBRET ;BUT OTHERWISE PASS IT TO NORMAL INPUT LEVEL
4444 JRST TYBXIT ;IN ANY CASE RESET TYBPC TO NORMAL
4446 TYBPRN: LDB E,[.BP %TXASC,A]
4455 ;^\^P<VPOS><HPOS> - SET CURSOR POS, THEN RESTART OUTPUT AT M.P. LEVEL.
4456 ;THIS IS THE WAY TO RESPOND TO A %TDORS CHARACTER ON A SOFTWARE TTY,
4457 ;SINCE OUTPUT RESET WILL STOP OUTPUT AT M.P. LEVEL ON SOFTWARE TTY'S
4458 ;WHICH HAVE ^\ TURNED ON.
4459 TYBP: JSP D,TYBRED ;WAIT FOR VPOS TO COME IN
4468 JSP D,TYBRED ;NOW WAIT FOR HPOS TO COME IN
4477 TYBR: HRROS TTOALC(I) ;RESTART AT M.P. LEVEL.
4478 PUSHJ P,TYPEN2 ;REQUEUE ECHOING IF NECESSARY
4481 TYBZ: HLLZS TTOALC(I) ;SET ALLOCATION TO 0.
4484 TYBI: HLLOS TTOALC(I) ;SET ALLOCATION TO INFINITY.
4485 JRST TYBST ;NOW MUST START THE TTY IN CASE IT WAS STOPPED DUE TO NO ALLOC.
4487 TYBA: JSP D,TYBRED ;^\^A<NUM> => INCREMENT ALLOCATION BY <NUM>
4489 TRNN D,400000 ;SKIP IF ALLOCATION = INFINITY
4492 TYBST: AOSN TTYOAC(I)
4496 SUBTTL NORMAL TTY INPUT HANDLER
4497 ;CLOBBERS A - E, EXPECTS R, U, I SET UP.
4498 ;R HAS TTYTYP, U HAS TTYSTS, I HAS # OF TTY.
4499 ;Also seems to expect Q/ TTYCOM and perhaps H/ TTYOPT -Alan 12/18/85
4502 JRST TTYICB ;CHAR IS ^_, MAYBE ENTER COM MODE.
4503 TTYI2: CAIN A,^Z ;TEST FOR ^Z
4504 JRST ZFLAG ;^Z TYPED
4505 TTYI2A: JUMPL U,CPOPJ ;IGNORE CHAR IF NO USER.
4506 TLNE U,%TSSII ;If in superimage input mode,
4507 JRST TTYI2B ; don't check for magic chars.
4508 CAIN A,%TXCTL+^Z ;Control-CALL is Deferred-Call
4509 JRST [ MOVEI A,%TXACT+%TXPIE+%TXCTL+%TXTOP+"Z ;DEFERRED CALL
4511 CAIN A,%TXTOP+"C ; CLEAR-INPUT does like TYCFLS, flushes
4512 ; input buffer of TTY in I.
4513 JRST TYIRS1 ; TYIRS1 does a POPJ P, for us: Hear no
4514 ; evil, see no evil, echo no evil...
4515 TTYI2B: TLZ A,-1 ;IF WE WERE CALLED FROM ^_-QUOTING RTN, BIT 3.1 WAS
4516 ;SET TO FAKE OUT ABOVE JUNK. FLUSH FAKEOUT BIT.
4518 MOVEM E,TTITM(I) ;REMEMBER TIME OF LAST TYPE-IN ON TTY.
4519 TTYI11: MOVE E,TICC(I)
4520 CAIL E,TIBS ;SKIP IF ANY ROOM LEFT IN INPUT BUFFER
4523 ANDI C,%TXTOP+%TXASC
4524 CAIL C,141 ;IF A LOWER CASE CHAR,
4528 TLNE C,%TOCLC ;CONVERT TO UPPER CASE IF WANTED
4530 TTYI15: MOVE E,UPC(U)
4532 CAIN E,NECHO1 ;IS THE JOB EXECUTING AN ECHOIN RIGHT NOW?
4533 SKIPE E,TACC(I) ;IF SO, AND IF IT HASN'T HAD A BREAK CONDITION YET,
4535 PUSHJ P,TTECIN ;MAYBE STORE CHAR IN USER MEMORY, AND JUST ECHO IT.
4536 MOVEI E,0 ;E 0 IF CALLED TTECIN, NON-0 IF DIDN'T
4537 TTYI12: TRNN A,%TXACT ;IF TTECIN DIDN'T ACTIVATE IT, THEN IGNORE TTYSET BITS
4538 JUMPE E,TTYI19 ;AND DON'T ACTIVATE OR INTERRUPT NO MATTER WHAT.
4540 JUMPL C,TTYI19 ;JUMP IF LOCAL EDITING PROTOCOL COMMAND CHAR.
4541 PUSHJ P,GETGRP ;GET 6 BIT BYTE FOR GROUP THIS CHARACTER IS IN
4542 TLZE U,%TSINT ;IF WANT THIS CHAR TO INT. WHATEVER IT IS,
4543 IORI B,%TGINT ;PRETEND IT'S AN INT. CHAR.
4545 LSH B,14 ;PUT %TXACT, %TXPIE, AND %TXMPE IN.
4548 ANDCMI A,%TXIGN+%TXINT+%TXCOM
4549 TRNN B,%TXINT ;TEST INTERRUPT BIT FOR THIS GROUP
4550 JRST TTYI19 ;OFF. DON'T INTERRUPT
4551 HRRE B,U ;RH OF B IS USER INDEX
4552 JUMPL B,[JRST 4,.] ;SHOULDN'T BE NO USER
4553 HRL B,MSKST(B) ;LH OF B IS USER'S INTERRUPT MASK
4554 TLNN B,%PITYI ;SKIP IF INTERRUPTS ON TYPE IN ENABLED
4555 JRST TTYI5 ;DISABLED
4557 IORM C,PIRQC(B) ;GENERATE TYPE IN INTERRUPT REQUEST
4558 TRO A,%TXINT ;INDICATE INTERRUPT
4559 TTYI5: MOVE C,TYIMSK(I) ;GET TTY CHANNELS OPEN MASK
4560 AND C,MSKST2(B) ;MASK OFF CHANNELS NOT ENABLED
4561 JUMPE C,TTYI19 ;JUMP IF NO OPEN CHANNELS HAVE INTERRUPTS ENABLED
4563 AND C,D ;ISOLATE LEAST SIGNIFICANT BIT
4564 IORM C,IFPIR(B) ;GENERATE SECOND WORD INTERRUPT REQUEST
4565 IORI A,%TXINT ;INDICATE INTERRUPT
4568 ;LIKE TTYI18 BUT FOR A CHAR THAT WASN'T REALLY TYPED IN.
4569 TTYI13: IORI A,%TXCOM
4571 ;ECHO BUT DON'T USE AS INPUT THE CHAR IN A,
4572 ;ASSUMING IT WAS ACTUALLY TYPED IN BY USER. MUST NOT CLOBBER H, TT.
4573 TTYI18: IORI A,%TXPIE+%TXIGN ;THIS CHAR WILL ECHO & BE IGNORED.
4575 ;PUT CHARACTER IN A IN INPUT BUFFER, ADJUSTING ALL COUNTS AND POINTERS.
4576 TTYI19: MOVE C,TICC(I)
4578 JRST DING1 ;NO ROOM IN INPUT BFR => COMPLAIN.
4579 TRNE A,%TXACT ;IF ACTIVATION CHAR, COUNT IT.
4581 TRNE A,%TXPIE ;IF PI ECHO CHAR, COUNT IT.
4583 TRNE A,%TXINT ;SIMILAR FOR TINTC, TINTP IF INT. CHAR.
4587 SKIPLE TACC(I) ;BUFFER FULL+ NO ACTV CHRS, GEN ONE
4591 TTYIS5: MOVE E,TIIP(I)
4592 CAMN E,TIBEP(I) ;SKIP IF NOT OFF THE END OF THE CIRCULAR BUFFER
4593 SUBI E,TIBL ;RESET TIIP
4594 HRRM E,TIIP(I) ;STORE BACK IN RH
4595 IDPB A,TIIP(I) ;STORE CHARACTER IN INPUT BUFFER
4597 TRNN A,%TXPIE ;IF PI ECHO NEEDED,
4599 TTYI7: MOVE C,TORM(I)
4601 SKIPL TTYERQ(I);PUT THIS TTY ON LIST OF THOSE NEEDING ECHO
4602 POPJ P, ;UNLESS IT'S ALREADY ON.
4610 DING1: TLNE R,%TTDDI ;SKIP IF WANT TO DING ON EXCESS INPUT
4614 JRST TTYI7 ;TELL CLOCK LEVEL TO LOOK AT THIS TTY.
4616 TYCLWR: PUSHJ P,TCNRM
4617 CAIL E,141 ;CONVERT LOWER CASE LTRS TO UPPER
4623 TTYSAM: ;STANDARDIZE ALT MODE (IF APPRO)
4624 TLNE U,%TSALT+%TSSII ;SKIP IF ALT MODE NOT TO BE STANDARDIZED
4625 POPJ P, ;DON'T STANDARDIZE ALT MODE
4626 CAIE A,176 ;ALT MODE CAN BE 176 OR
4628 MOVEI A,33 ;CHANGE EITHER TO 33
4631 ;GETS BYTE IN B, GROUP NUMBER IN C, BYTE POINTER IN D
4633 PUSHJ P,TYINR2 ;NORMALIZE CHARACTER TO FIND CORRECT GROUP.
4637 LDB C,GRPBPT(C) ;GET GROUP BITS
4641 LDB E,[301400,,SBTBL(C)] ;LOAD LH OF BYTE PTR
4642 GETGR1: DPB E,[301400,,D] ;MAKE TTYST1 OR TTYST2 APPROPRIATE BYTE POINTER
4646 GETGR2: LDB E,[301400,,SBTBL-6(C)]
4650 DEFINE GGRPTB A,B,C,D,E
4651 A_29.+B_22.+C_15.+D_8+E_1
4654 GRPTBL: GGRPTB 0,0,0,0,0
4667 REPEAT 5,GGRPTB 1,1,1,1,1
4670 REPEAT 4,GGRPTB 1,1,1,1,1
4674 GRPBPT: 350700,,GRPTBL(B)
4680 ;HANDLE A CHARACTER TYPED WHILE THE TTY OWNER IS DOING AN ECHOIN.
4681 ;A HOLDS THE CHARACTER, U HOLDS THE JOB INDEX. CLOBBERS B, C, E.
4682 ;IF THE CHARACTER IS A BREAK, ACTIVATE ON IT.
4683 ;OTHERWISE, STORE IT IN THE USER'S BUFFER AND JUST ECHO IT AND DISCARD IT;
4684 ;BUT IF THAT IS IMPOSSIBLE BECAUSE PAGES HAVE BEEN SWAPPED OUT,
4685 ;JUST ACTIVATE INSTEAD.
4686 TTECIN: HRRZ B,U ;PREVENT TIMING ERRORS BY NOT CONSIDERING
4687 ; HIM INSIDE THE ECHOIN IF HE HAS THE
4688 ; PROCESSOR, SINCE UPC NOT VALID.
4689 IFE KA10P,[ ;IF HIS USER-MODE ACS ARE IN AC BLOCK 1, WE
4690 ; HAVE TO GIVE UP SINCE THEY MIGHT BE SAVED
4691 ; IN TTYACS OR SOME PLACE.
4695 IFN KA10P,[ ;ON KA10, DON'T DO THIS IF MPV IS SET
4696 CONSO 20000 ;INTERRUPT OUT OF XCTR WITH PI TRAP SET
4697 ] ;KA10P ;GETS THE MACHINE VERY CONFUSED, I SUSPECT
4700 TRNN A,%TXCTL+%TXMTA+%TXSUP ;DECIDE WHETHER THIS CHAR ECHOES OR
4702 CAIGE A,40 ;CONTROL CHARS, EITHER 9-BIT OR ASCII, BREAK.
4703 JRST TTECI9 ;NOTE THAT SAIL CHARS WILL HAVE %TXTOP.
4704 CAIN A,%TXTOP+"H ;DON'T ECHO HELP CHAR.
4706 LDB B,[050200,,A] ;WHICH WORD OF BREAK TABLE IS THIS CHARACTER IN?
4707 ADD B,U ;JOB OWNING TTY
4708 MOVE B,AC0S+Q(B) .SEE NECHOIN ;GET THAT WORD.
4710 LSH B,(E) ;GET THE BIT FOR THIS CHARACTER INTO THE SIGN BIT.
4711 JUMPL B,TTECI9 ;IF BIT IS SET, THIS IS A BREAK CHARACTER.
4712 SPM TTECIM ;SAVE PAGE MAP AND LOAD UP TTY-OWNING JOB'S MAP.
4715 JRST 2,@[%PSPCU,,.+1] ;XCTR DOESN'T WORK IF THIS BIT NOT SET
4716 DATAI PAG,TTECIX ;SAVE ACS CONTEXT ALSO, SET PREVIOUS AC
4717 ; CONTEXT TO AC BLOCK 2, BUT DON'T CHANGE
4718 ; CURRENT CONTEXT WHICH MAY BE 0 OR 1.
4719 MOVE B,[600200,,400000] .SEE SPCCTX ;THIS DATAO PAG, IS SAME AS IN
4720 ; AC2CTX. (ALTHOUGH THERE ARE
4721 ; A FEW SPURIOUS BITS SET ON
4723 LDB C,[330300,,TTECIX] ;BUT TRANSFER CURRENT AC BLOCK INTO IT
4726 MOVSI B,UUOACS(U) ;COPY THE JOB'S USER MODE ACS INTO THAT BLOCK.
4730 XCTRI XRW,[MOVES E,(C)] ;MAKE SURE THE COUNT IS STILL IN CORE AND > 0.
4734 XCTRI XRW,[MOVES E,(B)] ;MAKE SURE BYTE POINTER STILL IN CORE,
4738 XCTRI XRW,[MOVES (E)] ;AND THAT THE WORD THE CHARACTER WILL GO IN IS IN CORE
4739 SKIPA E,AC0S+E(U) ; AND WRITABLE
4741 XCTRI XRW,[MOVES (E)] ;MAKE SURE THE BLOCK OF COUNTERS IS STILL IN CORE.
4744 XCTRI XRW,[MOVES 6(E)]
4747 XCTRI XBYTE,[IDPB A,(B)] ;STORE THE CHARACTER.
4750 XCTRI XRW,[SOS (C)] ;DECREMENT THE COUNT OF CHARS TO ECHO.
4753 JUMPE E,TTECI2 ;UPDATE THE BLOCK OF COUNTERS, IF THERE IS ONE.
4754 ADDI E,2 ;THE FIRST TWO ARE IGNORED.
4755 HRLI E,-4 ;THE NEXT FOUR ARE INCREMENTED.
4756 TTECI1: XCTRI XRW,[AOS (E)]
4760 XCTRI XRW,[SOS (E)] ;THE SEVENTH IS DECREMENTED.
4763 ;GOOD. CHARACTER HAS BEEN STORED IN THE USER'S MEMORY.
4764 TTECI2: TRO A,%TXIGN\%TXPIE\%TXECI ;NOW MAKE IT ECHO.
4768 ;WE CAN'T HANDLE A CHARACTER, SO MAKE IT ACTIVATE SO THE ECHOIN WILL RETURN.
4769 ;TTECIL IS FOR AFTER THE MAP HAS BEEN SWITCHED. TTECI9 IS FOR BEFORE THEN.
4770 TTECIL: PUSHJ P,TTECIR
4771 TTECI9: IORI A,%TXACT
4774 ;RESTORE THE PAGE MAP THAT WE SAVED.
4777 MOVEI B,UUOACS(U) ;COPY POSSIBLY ALTERED USER ACS BACK INTO
4779 XCTR XBR,[BLT B,UUOACS+17(U)]
4787 TTECIM: BLOCK 10 ;OUTER LEVEL MAP SAVED HERE AND RESTORED AT EXIT.
4788 IF2 IFG UPGMLE-UPGML-10,.ERR TTECIM too short.
4790 TTECIX: 0 ;SAVED DATAI PAG VALUE.
4797 ZFLAG: MOVSI U,%TSLCZ ;EVEN IF THIS BIT IN TTYSTS IS OFF, TTY MAY BE FREE
4798 IORB U,TTYSTS(I) ;GET TTYSTS
4799 JUMPGE U,ZFLAG2 ;(TTY IS IN USE)
4800 SKIPGE TTYSTA(I) ;CONSOLE FREE MSG COMING OUT OR ALREADY TRYING TO ^Z
4801 SKIPGE DEDTIM ;OR SYSTEM IS DOWN. DON'T CREATE A NEW JOB TREE.
4804 SKIPGE SYSDBG ;IF NOT ALLOWING USERS,
4805 CAMN I,B ;ALLOW ONLY THE SPEC'D TTY (= -C(SYSDBG) )
4807 MOVE B,TTYTYP(I) ;AND STY TTY'S, AS WELL AS TTY 0.
4808 TRNN B,%TYSTY ;NOTE STELNT WILL REFUSE NETWORK LOGINS WHEN SYS BEING DEBUGGED.
4810 ZFLAG7: CONO PI,PICOFF\<200_-UTCCHN> .SEE NUJBST
4811 MOVE A,UTTYCT ;SET UP NEW USER
4812 CAIL A,MXCZS ;BUT DON'T OVERFILL BUFFER
4813 JRST [ CONO PI,PICON\<200_-UTCCHN> ? POPJ P,]
4820 CONO PI,PICON\<200_-UTCCHN>
4821 MOVSI A,%TACTZ ;SAY TTY BEING ^Z'D - ELSE SYS JOB MIGHT TYPE CONSOLE-FREE MSG,
4822 IORM A,TTYSTA(I) ;SINCE TTY IS FREE AND %TACFM IS OFF (OR WILL BE AFTER TTYINI)
4825 ZFLAG4: HRR U,SUPPRO(U)
4826 ZFLAG2: SKIPL SUPPRO(U)
4828 JRST ZFLAG3 ;SUPER IMAGE INPUT MODE OR TOP LEVEL JOB
4829 TLNN U,%TSCNS ;OR IN USE AS A DEVICE => DON'T TREAT ^Z SPECIALLY
4832 TDNE E,PIRQC(U) ;IF IMMEDIATE SUPERIOR DOESN'T RESPOND TO ^Z BY TAKING
4833 JRST ZFLAG4 ;THE TTY FROM THE ^Z'ED JOB, TRY FOR HIS SUPERIOR.
4834 IORM E,PIRQC(U) ;OTHERWISE GIVE ^Z INTERRUPT TO JOB
4835 PUSHJ P,TYIRS1 ;DISCARD ALL PENDING INPUT BEFORE THE ^Z.
4836 MOVEI A,^Z+%TXPIE+%TXIGN
4837 JRST TTYI19 ;ARRANGE FOR THE ^Z TO BE ECHOED.
4839 ZFLAG3: MOVSI U,%TSLCZ ;CLEAR <LAST CH WAS ^Z> BIT
4841 JRST TTYI2A ;TREAT ^Z AS ANY OTHER CHAR.
4845 TTYICB: TLNE U,%TSSII ;^_ NOT SPECIAL IF TTY IS IN USE, IN SUPERIMAGE INPUT.
4847 SKIPGE DEDTIM ;DON'T ALLOW ^_ IF ITS IS DOWN
4849 JUMPGE U,TYCGTN ;DO ALLOW THEM ON ANY TTY THAT'S IN USE
4850 SKIPGE SYSDBG ;IF ITS BEING DEBUGGED, ALLOW ^_ IN SAME CASES ^Z IS ALLOWED.
4856 TYCGTN: JSP D,TYCRDE ;ECHO IT, RETURN WITH NEXT CHAR TYPED.
4857 TYCI: SETOM COMT1(I) ;CHR AFTER ^_
4861 JRST TYCI3A ;GIVE EITHER CHARACTER TO MAIN PROGRAM
4863 CAILE E,^D ;^B, ^C, ^D, ^F SIGNIFY META BITS BEING SPEC'D.
4866 CAIL E,"0 ;DIGIT => CHARATER BEING TYPED IN BY ITS ASCII CODE.
4868 JRST TYCI7 ;JUMP IF NOT A DIGIT.
4870 MOVEM B,COMT1(I) ;STORE FIRST DIGIT
4871 JSP D,TYCRDE ;ECHO DIGIT, READ ANOTHR. (TTYIPC LEFT -> TYCI4)
4872 TYCI4: PUSHJ P,TYCI22 ;READ NUM AFTER FIRST DIGIT
4873 JRST TYCI6 ;CHARACTER IS NON-NUMERIC
4874 JRST TTYI18 ;ECHO THE DIGIT - IT'S ALREADY HANDLED.
4876 TYCI3A: TRNN H,%TP11T ;ON NON-TV TERMINALS,
4877 MOVEI A,%TXCTL+100(E) ;MAKE QUOTED ^Z LOOK LIKE "CONTROL" AND "Z" IN FULL
4878 TYCI3: PUSHJ P,TYCI17 ;RESTORE TTYIPC TO NORMAL,
4879 HRLI A,1 ;PREVENT CHAR FROM BEING TAKEN AS ^Z OR ^_.
4880 JRST @TTYIPC(I) ;HANDLE CHAR (BUT QUOTE ^_ AND ^Z)
4883 TYCI22: LDB E,[700,,A]
4886 POPJ P, ;RETURN WITHOUT SKIPPING IF NON-NUMERIC
4890 MOVEM B,COMT1(I) ;UPDATE VALUE SO FAR
4891 JRST POPJ1 ;SKIP RETURN
4893 TYCMB: SETZM COMT1(I) ;^A THRU ^F SEEN - INITIALIZE, AND DECODE THE CHARACTER.
4896 TYCMB1: IORM D,COMT1(I) ;SET THE SPEC'D META-BIT AND READ ANOTHER CHAR.
4897 JSP D,TYCRDE ;WHICH WE THEN DECODE ...
4908 JUMPN D,TYCMB1 ;IF CHAR WAS ^B THRU ^F, SET APPRO META-BIT AND LOOP.
4910 JSP D,TYCRDE ;OTHERWISE, ^Q QUOTES,
4911 IOR A,COMT1(I) ;JUST READ THE CHARACTER, WITH SPEC'D META-BITS MERGED IN.
4914 TYCI2: PUSHJ P,TTYI18 ;ECHO CHAR, RESET TTYIPC TO NORMAL.
4915 TYCI17: MOVEI B,TYCG
4919 TLZ Q,%TCCBS+%TCCBK ;ALSO FLUSH TEMPORARY STATUS INFO.
4923 TYCI6: EXCH A,COMT1(I) ;A NOW HAS CHAR REPRESENTED BY DIGITS; COMT1 HAS THE NON-DIGIT JUST TYPED IN.
4925 PUSH P,I ;IF IN COME MODE, TYCI3 CALLS TYCG AND SMASHES I
4926 PUSHJ P,TYCI3 ;SIMULATE ITS TYPE IN
4928 MOVE A,COMT1(I) ;GET LAST CHARACTER TYPED
4929 CAIN A,40 ;A SPACE GETS FLUSHED FOLLOWING DIGITS
4931 MOVE Q,TTYCOM(I) ;RESTORE ACS BASHED BY TYCG
4933 MOVE H,TTYOPT(I) ;THIS ONE MAY BE SUPERFLUOUS
4935 JRST @TTYIPC(I) ;PROCESS IT NORMALLY
4942 TYCI7: PUSHJ P,TYCLWR ;NON-DIGIT, NON-^Z, NON-^_ AFTER ^_.
4943 CAIN E,^U ;^U is CLEAR INPUT.
4945 CAIL E,"A ;IF IT'S A LETTER,
4948 XCT TYIQT-"A(E) ;JUST DISPATCH ON IT.
4950 TYCI7D: MOVEM U,TTYSTS(I)
4953 TYCI7A: CAIE E,"" ;ASIDE FROM LETTERS, " AND ^ ARE OK.
4956 TYCI7F: MOVEI A,"? ;OTHER CHARS ARE ERRORS.
4957 TYCI2A: PUSHJ P,TTYI13 ;ECHO A CHARACTER THAT WASN'T INPUT, AND RESET TTYCOM AND TTYIPC.
4961 TLCA U,%TSROL ;^_^ COMPLEMENTS SCROLL MODE.
4962 TLC U,%TSSAI ;^_" COMPLEMENTS SAIL CHAR SET USAGE.
4965 TYIQT: JRST TYCA ;A => ACCEPT COM LINKS.
4966 JRST TYCB ;B => TRIGGER A **MORE** (BLOCK TYPEOUT).
4967 JRST TYCC ;C => CREATE COM LINK.
4968 JRST TYCD ;D => DEFERRED CALL
4969 JRST TYCRFT ;E => ENTER REMOTE FEED-THRU.
4970 JRST TYCI7F ;F => ERROR.
4971 TLC U,%TSMOR ;G => COMPLEMENT MORE-PROCESSING.
4972 JRST TYCH ;H => HELP KEY.
4973 TLC Q,%TCICO ;I => COMPLEMENT INPUT OVERRIDE.
4974 JRST TYCJ ;J => Cause %PIJST interrupt.
4975 JRST TYCK ;K => FLUSH SPEC'D TTY FROM COM LINK.
4976 MOVEI A,^L+%TXIGN+%TXCOM ;L => CLEAR SCREEN.
4977 TLC U,%TSMOR ;M => COMPLEMENT MORE-PROCESSING.
4978 JRST TYCN ;N => BREAK COM LINK.
4979 TLC Q,%TCOCO ;O => COMPLEMENT OUTPUT COM OVERRIDE.
4980 JRST TYCI7F ;P => ERROR.
4981 JRST TYCQ ;Q => ENTER QUERY MODE.
4982 JRST TYCR ;R => ENTER REFUSE MODE.
4983 JRST TYCS ;S => SLAVE ANOTHER TTY.
4984 JRST TYCI7F ;T => ERROR.
4985 TLC H,%TOCLC ;U => COMPLEMENT CASE-CONVERSION.
4986 JRST TYCI7F ;V => ERROR.
4987 JRST TYCI7F ;W => ERROR.
4988 JRST TYCI7F ;X => ERROR.
4989 JRST TYCQA ;Y => ACCEPT PENDING QUERIES FOR COM LINKS
4990 JRST TYCQR ;Z => REJECT PENDING QUERIES.
4992 IFN .-TYIQT-26.,.ERR WRONG LENGTH TABLE.
4994 ;PUT IN A DEFERRED CALL
4995 TYCD: PUSHJ P,TTYI18 ;ECHO THE D
4996 MOVEI A,%TXACT+%TXCTL+%TXTOP+"Z
4997 PUSHJ P,TTYI19 ;PUT A DEFERRED CALL IN THE BUFFER
4998 JRST TYCI17 ;RESET ^_ STATE
5001 TYCH: PUSHJ P,TTYI18 ;ECHO THE H
5002 MOVEI A,%TXACT+%TXTOP+"H
5003 PUSHJ P,TTYI19 ;PUT A [HELP] IN THE BUFFER
5004 JRST TYCI17 ;RESET ^_ STATE
5006 ;Cause %PIJST interrupt.
5007 TYCJ: SKIPA B,[%PIJST]
5008 TYCJ1: MOVE U,SUPPRO(U)
5009 JUMPL U,TYCI7F ; Error if tty not in use or nobody enabled
5014 JRST TYCI2 ; Echo the J and reset ^_ state.
5017 TYCFLS: CONO PI,TTYOFF ;No touching buffer while I'm frobbing it.
5018 PUSHJ P,TYIRS1 ;Completely flush input buffer of TTY in I.
5021 PUSHJ P,TTYI13 ;Can echo the ^U now.
5022 JRST TYCI17 ;Reset ^_ state.
5025 TYCB: HRRZ B,I ;COME HERE FOR ^_B.
5031 TYCRFT: PUSH P,A ;COME HERE FOR ^_E.
5032 MOVE A,TTYTYP(I) ;ARE WE A LOCAL TTY?
5033 TRNN A,%TYDIL\%TYRLM\%TYSTY
5034 JRST TYCRF0 ;LOCAL TTYS ARE ALLOWED TO SLAVE W/O LOGIN
5035 TRNN A,%TYSTY ;Is it a STY?
5037 HRRZ A,STYSTS-NFSTTY(I) ;Special Check for TARAKA demons linking
5038 MOVE A,UNAME(A) ;Is the UNAME of the owner of this STY
5039 CAMN A,[SIXBIT /TARAKA/] ;TARAKA?
5040 JRST TYCRF0 ;Yes, let it hack all it wants.
5041 TYCRFA: HRRE A,TTYSTS(I) ;GET OWNER OF THIS TTY
5042 AOJE A,TYCRF2 ;IF THIS IS A FREE TTY, DON'T LET HIM
5043 HLRE A,UNAME-1(A) ;IS HE LOGGED IN?
5044 AOJE A,TYCRF2 ; IF NOT, FAIL
5045 TYCRF0: SETZ B, ;COMPLEMENT OUR %TCRFT BIT.
5046 PUSHJ P,TYCREP ;1ST, COUNT # TTYS IN LOOP.
5049 TLNE A,%TCLFT ;IF ANY TTY IN LOOP HAS %TCLFT SET
5050 POPJ P, ;THEN IT'S OK FOR OUR %TCRFT TO BE.
5052 JRST TYCRF1 ;SOME TTY IN LOOP HAS %TCLFT => OK TO SET %TCRFT.
5053 CAIE B,2 ;ONLY 1 OTHER TTY => SET ITS %TCLFT, THEN OUR %TCRFT.
5054 JRST TYCRF2 ;FAIL TO SET %TCRFT IF CAN'T FIND OTHER WITH %TCLFT.
5058 TYCRF1: TLC Q,%TCRFT
5062 TYCRF2: SUB P,[1,,1]
5065 ;COME HERE AFTER READING UNAME FOR ^_S. B HAS IDX OF SPEC'D TTY.
5066 ;SET THAT TTY'S %TCLFT, ENSLAVING IT. CLEAR %TCLFT OF ALL OTHER TTYS
5067 ;IN THE SAME LOOP AS SPEC'D TTY.
5068 TYCS1: PUSHJ P,TYCREP
5069 CAIN B,(I) ;IF SPEC'D TTY NOT IN COM WITH US
5071 JRST TYCI7F ;THEN IT'S AN ERROR.
5073 PUSHJ P,TYCREP ;CLEAR %TCLFT OF ALL TTY'S LINKED TO US,
5076 IORM A,TTYCOM(B) ;THEN SET IT FOR HIM.
5079 ;CALL WITH JSP D, ECHO CHAR IN A, RETURN WITH NEXT CHAR.
5080 TYCRDE: HRRZM D,TTYIPC(I)
5083 ;LIKE TYCRDE BUT DON'T ECHO THE CHARACTER IN A.
5084 TYCRED: HRRZM D,TTYIPC(I)
5087 ;T -> ASCIZ STRING, ECHO ON TTY # IN I (MUST HAVE DONE TYCSET)
5088 TYCI40: HRLI T,440700
5091 PUSHJ P,TTYI13 ;ECHO CHARACTER ON TTY
5094 ;SET UP ACS FOR ECHOING ON TTY # IN I.
5095 TYCSET: MOVE R,TTYTYP(I)
5100 ;PUT TTY IN COM MODE IF IT ISN'T. TTY # IN I.
5101 TYCI63: TLON Q,400000
5106 ;TTY # IN I, REPEAT OVER THAT TTY AND ALL LINKED TO IT.
5107 ;INSN TO BE REPEATED FOLLOWS CALL.
5108 ;IF THE INSN DOESN'T SKIP, IMMEDIATELY RERURNS
5109 ;SKIPPING ONLY THAT INSN. ELSE RETURNS SKIPPING 2 WHEN ALL TTYS DONE.
5110 TYCREP: PUSH P,I ;PUSH TTY STARTING WITH.
5111 PUSH P,I ;PUSH TTY DOING NEXT.
5112 TYCRE0: XCT @-2(P) ;(THE INSN AFTER THE PUSHJ)
5113 JRST TYCRE1 ;IT DIDN'T SKIP, GIVE UP RIGHT AWAY.
5114 MOVE I,(P) ;ELSE KEEP GOING,
5116 JRST TYCRE2 ;LAST TTY DONE NOT LINKED, THRU.
5118 CAIE I,-1 ;IN COM MD BUT NOT LINKED OR
5119 CAMN I,-1(P) ;HAVE GONE ALL AROUND CIRCULAR LIST
5120 JRST TYCRE2 ;=> DONE.
5121 MOVEM I,(P) ;ELSE DO THE NEXT ONE.
5124 TYCRE2: AOS -2(P) ;RETURN SKIPPING 2.
5125 TYCRE1: SUB P,[1,,1]
5129 ;^_A - ACCEPT ALL PENDING AND FUTURE REQUESTS FOR COM LINKS.
5130 TYCA: TLZ Q,%TCRFS+%TCQRY
5132 ;^_Y - ACCEPT ALL PENDING REQUESTS FOR COM LINKS.
5133 TYCQA: PUSHJ P,TYCI2 ;ECHO THE A OR Y.
5134 PUSHJ P,TYCQRP ;FIND ALL PENDING QUERIES
5135 PUSHJ P,TYCQAC ;ACCEPT EACH ONE.
5138 TYCQAC: PUSHJ P,TYCREP ;DON'T ACCEPT A RQ FROM SOMEONE ALREADY LINKED TO US.
5141 MOVE H,B ;HIS TTY # IN H FOR TYCI43
5143 PUSHJ P,TYCI43 ;LINK HIM AND ME; ECHANGE I AND H.
5145 MOVE I,H ;GET HIS # BACK IN B AND MINE IN I.
5148 ;^_R - REFUSE ALL PENDING AND FUTURE REQUESTS FOR COM LINKS.
5152 ;^_Z - REFUSE ALL PENDING REQUESTS FOR COM LINKS.
5153 TYCQR: PUSHJ P,TYCI2 ;ECHO THE R OR Z.
5154 PUSHJ P,TYCQRP ;FIND ALL PENDING QUERIES
5155 PUSHJ P,TYCQRF ;AND REFUSE EACH ONE.
5159 PUSHJ P,TYCSET ;TYPE ON REQUESTING TTY
5160 PUSHJ P,TYCI36 ;THAT IT IS BEING REJECTED
5161 EXCH B,I ;AND REMOVE IT FROM A QUERYING STATE.
5164 ;^_Q - ALL REQUESTS FOR COM LINKS SHOULD REMAIN PENDING UNTIL ANSWERED
5165 ;WITH ^_Y, ^_Z OR AN INVERSE ^_C.
5166 ;ALSO, LIST ALL REQUESTS THAT ARE NOW PENDING.
5169 PUSHJ P,TYCI2 ;ECHO THE "Q" AND RESET ALL STATUS INFO.
5171 SETZ T, ;INDICATE NOTHING HAS BEEN TYPED YET.
5172 PUSHJ P,TYCQRP ;FIND THE PENDING REQUESTS
5173 PUSHJ P,TYCQLS ;SAY WHO EACH IS FROM.
5176 TYCQLS: JUMPE T,TYCQL1 ;IF THIS ISN'T THE FIRST NAME MENTIONED,
5177 MOVEI T,[ASCIZ/, /] ;SEPARATE FROM THE PREVIOUS NAME.
5179 TYCQL1: MOVE C,B ;THIS IS TTY NUMBER QUERYING US
5180 PUSH P,C .SEE TYCI92
5181 PUSH P,[POPCJ-1] ;TYCI67 ALWAYS SKIP-RETURNS.
5182 JRST TYCI67 ;TYPE THE USER'S NAME OR THE TTY NUMBER.
5186 ;EXECUTES INSN ONCE FOR EACH TTY QHICH IS QUERYING THE TTY IN I.
5187 ;THE QUERYING TTY'S NUMBER IS IN B. INSN MUST PRESERVE B AND I.
5188 ;A IS CLOBBERED BY TYCQRP. OTHER ACS ARE UNTOUCHED.
5191 TYCQR1: MOVE A,TTYIPC(B)
5195 JRST TYCQR2 ;TTY IN B ISN'T QUERYING TTY IN I.
5196 XCT @(P) ;EXECUTE INSN.
5197 TYCQR2: CAIE B,NCT-1
5199 JRST POPJ1 ;SKIP OVER INSN WHEN RETURN.
5201 SUBTTL HANDLE COM-LINKS
5203 TYCC: TLOA Q,%TCTPN ;^_C - WHEN LEAVE COM MODE MUST TYPE ^_N.
5204 TYCK: TLO Q,%TCCBK ;SAY WE'RE DOING ^_K.
5207 TYCS: TLO Q,%TCCBS ;^_S - ENSLAVE SPEC'D TTY.
5208 TYCI19: MOVEM Q,TTYCOM(I)
5209 JSP D,TYCRDE ;ECHO, RETURN, COME BACK WITH NEXT CHAR.
5211 CAIE E,15 ;SPACE OR CR IS 1ST CHAR, IGNORE.
5216 SETZM COMT3(I) ;INIT. ACCUMULATED #.
5217 SETZM COMT1(I) ;AND ACCUM UNAME.
5219 ;READING CHARS AFTER ^_C (AFTER A NON-SPACE HAS BEEN SEEN)
5220 ;COMT1 ACCUMULATES SIXBIT, COMT3 OCTAL NUMBER.
5221 ;SIGN OF COMT3 SET => NONDIGIT WAS SEEN, USE THE SIXBIT.
5222 TYCI27: PUSHJ P,TYCLWR ;CONVERT TO UPPER CASE.
5224 JRST TYCI7F ;ANOTHER ^_ IS NO GOOD.
5227 JRST TYCI28 ;SPACE DELIMITS UNAME OR NUMBER
5231 JRST TYCI7F ;RUBOUT => TYPE ? AND GIVE UP.
5232 MOVE B,COMT3(I) ;ACCUM NUMBER IN RH OF COMT3.
5237 CAILE E,"9 ;NON-DIGIT SEEN => SET SIGN OF COMT3 SAYING
5238 SETOM COMT3(I) ;CERTAINLY NOT NUMBER.
5242 MOVEM B,COMT1(I) ;ADD NEW CHARACTER ONTO THE END OF THE NAME
5243 JRST TTYI18 ;EXIT TO ECHO THE CHARACTER
5245 TYCI28: MOVE H,Q ;SAVE SETTINGS OF %TCCBS, %TCCBK, SINCE TYCI2 WILL CLEAR THEM.
5247 PUSHJ P,TYCI2 ;ECHO TERMINATING CHAR IN A, AND RESET ALL TO NORMAL.
5250 JRST TYCI52 ;TYPEIN WASN'T NUMBER.
5251 CAIGE B,NCT ;IS NUMBER THAT OF A TTY THAT EXISTS?
5253 TYCI52: MOVE D,COMT1(I)
5254 TYCI29: TLNE D,770000 ;LEFT ADJUST THE UNAME
5259 TYCI30: MOVEI U,LUBLK ;START LOOKING AT USER NUMBER 2
5261 SETO B, ;NO REFUSE-MODE TTY FOUND YET
5262 TYCI31: ADDI U,LUBLK
5264 JRST [ JUMPGE B,TYCI36 ;REFUSED
5265 JRST TYCI7F ] ;OUT OF USERS SO GIVE ? AND RETURN
5266 CAMN D,UNAME(U) ;SKIP IF UNAME DOESN'T MATCH
5267 SKIPGE C,TTYTBL(U) ;SKIP IF PROCEDURE HAS THE TTY
5268 JRST TYCI31 ;TRY NEXT PROCEDURE
5269 HRRZ B,C ;TTY NUMBER
5270 TDNE A,TTYCOM(B) ;IN REFUSE MODE?
5271 JRST TYCI31 ;YES, MAY BE CRTSTY, TRY TO FIND A BETTER TTY WITH THIS UNAME
5272 TYCI53: MOVEM B,COMT1(I) ;# OF TTY TRYING TO HACK
5273 SETZM COMT3(I) ;IEC FLAG FOR QUERY MODE
5276 TLZE H,%TCCBK ;JUMP IF DOING ^_K.
5279 CAIN B,APL ;DON'T SEND MESSAGE TO A.P. LINE
5280 JRST TYCI7F ;(OK NOW TO SEND TO SYSTEM CONSOLE, HAS O.C.O. ANYWAY)
5283 JRST TYCS1 ;ALSO CHECK FOR ^_S.
5284 PUSHJ P,TYCREP ;NO, IT'S ^_C.
5285 CAIN B,(I) ;DON'T LET LINK TO SELF OR SOMEONE ALREADY LINKED TO.
5288 AOJN C,TYCI34 ;TTY HAS A USER
5289 MOVEI A,"F ;TTY IS FREE
5290 PUSHJ P,TTYI13 ;TYPE AN F
5292 PUSHJ P,TTYI13 ;FOLLOWED BY A SPACE
5293 MOVE B,COMT1(I) ;RESTORE THAT TTY'S NUMBER.
5296 TYCI34: MOVE C,TTYSTS(B) ;TTY IN USE: AS A DEVICE?
5298 JRST TYCI7F ;^_C NOT ALLOWED TO TTY OPEN AS DEVICE.
5299 TYCI32: MOVE A,TTYIPC(B)
5301 CAIN A,TYCRW ;IF HE'S QUERYING ME, THEN HE AUTOMATICALLY ACCEPTS
5302 JRST [CAME I,COMT1(B) ;REGARDLESS OF HIS %TCRFS AND %TCQRY.
5303 JRST TYCI37 ;IF HE'S QUERYING SOMEONE ELSE, HE'S BUSY.
5306 TLNE C,%TCRFS ;GIVE UP IF HE IS REFUSING ^_C'S.
5308 CAIN A,TTYI ;MUNGING IPC WHILE NOT NORMAL WOULD LEAVE
5309 JRST TYCI44 ;WHAT HE'S DOING UNFINISHED - CAUSING BUGS.
5311 JRST TYCI37 ;IPC NOT NORMAL.
5312 MOVEM B,COMT1(I) ;IPC NORMAL BUT HE'S IN A COM LINK.
5314 MOVE H,B ;MY TTY # IN TT AND I, HIS IN H.
5315 MOVEI T,[ASCIZ/ IN COM: /]
5316 PUSHJ P,TYCI71 ;LIST ALL TTYS IN COM WITH HIM.
5320 PUSHJ P,TYCI40 ;PRINT STRING ON MY TTY.
5321 JSP D,TYCRED ;READ THE ANSWER
5322 PUSHJ P,TTYI18 ;AND ECHO IT.
5323 PUSHJ P,TYCLWR ;NORMALIZE IT AND CONVERT TO UPPER CASE IN E.
5325 JRST TYCI17 ;NO => RESET US TO NORMAL AND GIVE UP.
5326 MOVE B,COMT1(I) ;ANSWER IS YES, GO AHEAD.
5331 JRST TYCI37 ;CAN'T MUNG HIM IF IPC NOT NORMAL.
5334 JRST TYCI36 ;HE'S REFUSING.
5335 TYCI33: PUSHJ P,TYCREP
5336 CAIN B,(I) ;MAYBE HE ENTERED OUR LOOP WHILE WE WAITED.
5337 JRST TYCI7F ;LINKING TO SOMEONE ALREADY LINKED TO CAUSES BUGS.
5338 JRST TYCI44 ;GO AHEAD AND LINK UP.
5340 TYCI37: SKIPA T,[[ASCIZ/BUSY /]] ;TARGET IS BUSY.
5341 TYCI36: MOVEI T,[ASCIZ/REFUSED /] ;TARGET IS REFUSING.
5345 ;NOW WE KNOW IT'S OK TO TRY TO ^_C HIM. HIS TTY # IN B, MINE IN I.
5346 TYCI44: MOVE H,I ;PUT MY TTY # IN H, HIS IN I.
5349 PUSHJ P,TYCSET ;GET HIS TTYCOM IN Q FOR TYCI63
5350 PUSHJ P,TYCI64 ;TYPE MSG FROM ME ON HIM.
5353 CAIE A,TYCRW2 ;IF HE'S QUERYING US, NO NEED TO QUERY HIM;
5354 CAIN A,TYCRW ;JUST PRETEND HE'S IN ACCEPT MODE.
5357 TDNN A,TTYCOM(I) ;SKIP IF HE MUST BE ASKED
5358 JRST TYCI43 ;HE'S IN ACCEPT MODE.
5359 MOVEI T,[ASCIZ /- QUERYING/] ;ELSE JUST MENTION TO HIM THAT WE'RE QUERYING
5362 MOVEM I,COMT1(H) ;AND SETTLE DOWN FOR HIM TO DO SOMETHING ABOUT IT.
5367 MOVEI T,[ASCIZ /QUERYING /] ;TELL OUR USER THAT WE'RE WAITING FOR ANSWER.
5370 TYCI68: CAIN TT,(I) ;ENTRY TO DO FOR ALL LINKED TO HIM BUT NOT HIM.
5372 TYCI64: MOVEI T,[ASCIZ /
\a\a
5379 MOVE R,STYSTS-NFSTTY(R)
5381 CAME R,[SIXBIT /PEEK/] ;THIS SEEMS TO BE A CROCK --RG
5382 TYCI62: MOVEI T,[ASCIZ /
\a\a
5384 TYCI71: PUSHJ P,TYCSET ;SET UP Q,R,U,W FOR HIS TTY (# IN I)
5385 PUSHJ P,TYCI40 ;PRINT MSG <- T ON IT.
5386 PUSH P,I ;SAVE HIS TTY #,
5387 MOVE I,H ;GET MINE (ARG TO TYCREP)
5388 PUSHJ P,TYCREP ;LOOP OVER ME AND ALL ALREADY LINKED TO ME.
5396 ;TYPE UNAME OF 1 OF MY TTYS ON 1 OF HIS.
5397 TYCI66: HRRZ C,TTYCOM(H)
5400 CAIN H,(I) ;BUT DON'T TYPE MY NAME ON HIM.
5404 TYCI72: MOVEI C,(I) ;PUT THIS TTY # IN C,
5405 MOVE I,-4(P) ;GET HIS BACK IN I SINCE STILL TYPING ON HIM.
5406 CAMN C,-2(P) ;IF THIS ISN'T MY TTY,
5408 MOVEI T,[ASCIZ/ AND /] ;THEN IT'S SOMEONE LINKED TO ME
5409 PUSHJ P,TYCI40 ;AND MY NAME WAS ALREADY TYPED
5411 TYCI67: HRRE C,TTYSTS(C) ;MY USER INDEX
5417 MOVSI T,(440600,,(P))
5420 ADDI A,40 ;CONVERT MY UNAME FROM SIXBIT TO ASCII
5421 PUSHJ P,TTYI13 ;ECHO CHARACTER ON HIS TTY
5427 TYCI92: MOVSI C,(SIXBIT /T/)
5428 LDB T,[030300,,-1(P)]
5431 LDB T,[000300,,-1(P)]
5436 ;ACTUALLY JOIN MY TTY AND HIS IN COM LINK.
5437 ;ENTER WITH HIS TTY # IN I AND MINE IN H.
5438 ;LEAVE WITH MINE IN I AND HIS IN H, TT.
5439 TYCI43: TLO Q,%TCTPN ;WHEN HE LEAVES COM MODE TYPE ^_N AT HIM.
5440 PUSHJ P,TYCI63 ;PUT HIM IN COM MODE IF HE ISN'T ALREADY.
5441 MOVE TT,I ;HIS TTY # IN TT, MINE IN H.
5442 PUSHJ P,TYCREP ;LOOP OVER TTYS LINKED TO HIM.
5443 PUSHJ P,TYCI68 ;PRINT OUT MSG FROM ON ALL LINKED TO HIM, NOT HIM.
5445 EXCH TT,H ;INTERCHANGE HIS AND MINE.
5446 MOVE I,TT ;LOOK AT ALL LINKED TO ME.
5447 PUSHJ P,TYCSET ;WHEN I CHANGES, RELATED ACS SHOULD ALSO CHANGE.
5448 TLO Q,%TCTPN ;WHEN HE LEAVES COM MODE TYPE ^_N AT HIM.
5449 PUSHJ P,TYCI63 ;PUT HIM IN COM MODE IF HE ISN'T ALREADY.
5450 PUSHJ P,TYCREP ;ON EACH OF MINE, GIVE NAMES OF HIS.
5454 MOVE A,TTYCOM(TT) ;SET UP LINK
5455 MOVE B,TTYCOM(I) ;LINK TTYCOM WORDS
5473 TYCI69: CAIE I,(TT) ;PRINT MSG ON ONE OF MY TTYS.
5475 SKIPA T,[[ASCIZ/OK /]] ;MY TTY, SAY "G".
5476 TYCI70: MOVEI T,[ASCIZ/
5478 JRST TYCI71 ;DUE TO EXCH'S IN TYCI43,
5479 ;EXCHANGE "ME" AND "HIM" IN COMMENTS IN TYCI71.
5481 ;TTYIPC FOR A ^_C'ER WHO IS QUERYING IS EITHER TYCRW OR TYCRW2.
5482 ;THAT IS DEPENDED ON.
5483 TYCRW: PUSHJ P,TCNRM
5484 CAIE E,^G ;^_C'ER MAY USE ^G TO GET ATTENTION.
5485 SKIPGE COMT3(I);IN IEC MODE CAN ALSO SAY THE NAME
5487 CAIE E,^_ ;IGNORE ALL TYPEIN EXCEPT ^G AND ^_N.
5489 JSP D,TYCRDE ;^_, ECHO IT AND GET NEXT CHAR.
5490 TYCRW2: PUSHJ P,TYCLWR
5493 MOVEI A,"? ;^_ FOLLOWED BY OTHER THAN N.
5496 JRST TTYI13 ;ECHO ? AND GO BACK TO TYCRW
5498 TYCRW4: PUSHJ P,TTYI18 ;^_C'ER TYPED ^G - ECHO ON HIS TTY
5499 MOVE I,COMT1(I) ;AND ^_C'D TTY.
5503 ;THE TTYIPC FOR A TTY IN A COM LINK NORMALLY POINTS HERE.
5504 ;ECHO OR INPUT THE CHAR ON ALL TTYS IN THE LOOP ACCORDING TO SETTINGS
5505 ;OF THE RELEVANT %TCICO, %TCLFT AND %TCRFT BITS.
5507 ANDCMI E,#177 .SEE TYCI3
5508 CAIN E,^_ ;REC CHRS IN COM MODE
5510 TYCG21: PUSH P,TTYCOM(I) ;SAVE COMMUNICATE WORD.
5511 PUSH P,I ;SAVE MY CONSOLE NUMBER
5512 PUSH P,A ;SAVE THE CHARACTER
5513 TLNE Q,%TCICO ;SKIP IF INPUT COM OVERRIDE OFF
5514 PUSHJ P,TTYI2 ;PROCESS INPUT OVERRIDE
5516 PUSHJ P,TTYI18 ;ECHO CHR ON MY TTY IF %TCICO NOT SET, OTHERWISE GIVE TO PROGRAM
5517 MOVE A,(P) ;RESTORE CHARACTER
5518 TYCG5: HRRE B,TTYCOM(I) ;FIRST TTY IN CHAIN
5519 JUMPL B,[JRST 4,.] ;I'M NOT COMMUNICATING WITH ANYONE
5520 CAME B,-1(P) ;SKIP IF I'M COMMUNICATING WITH MYSELF
5521 TYCG3: SKIPL C,TTYCOM(B) ;SKIP IF HE IS IN COMMUNICATE MODE (THIS POINT IS "COM IN")
5523 MOVE I,B ;GET HIS TTY NUMBER IN I
5526 TLNE B,%TCRFT ;IF MY %TCRFT AND HIS %TCLFT SET,
5529 MOVSI U,%TSLCZ ;GIVE CHAR TO HIS PROGM.
5531 PUSHJ P,TTYI2 ;TREAT CHAR AS INPUT FROM HIS TTY.
5532 JRST TYCG2 ;PROCESS NEXT TTY IN CHAIN
5534 TYCG1: PUSHJ P,TTYI13 ;OUTPUT CHAR ON HIS CONSOLE
5535 TYCG2: MOVE A,(P) ;RESTORE CHARACTER
5536 HRRE B,TTYCOM(I) ;NEXT TTY IN CHAIN
5537 JUMPL B,[JRST 4,.] ;CHAIN ENDS STRANGELY
5538 CAME B,-1(P) ;SKIP IF DONE
5539 JRST TYCG3 ;PROCESS NEXT TTY
5543 ;COME AFTER READING UNAME AFTER ^_K, HIS TTY # IN B.
5544 TYCK1: PUSHJ P,TYCREP ;NO GOOD IF THAT TTY ISN'T LINKED TO ME.
5546 CAIN B,(I) ;BUT NO GOOD IF IT IS ME.
5547 JRST TYCK2 ;NO GOOD, COMPLAIN.
5549 PUSHJ P,TYCSET ;GET HIS TTYCOM IN Q.
5550 JRST TYCGTM ;NOW PRETEND HE DID ^_N (READ "HIM" FOR "ME")
5552 TYCK2: MOVE A,TTYIPC(B)
5556 JRST TYCI7F ;NOT LINKED TO THIS GUY, GIVE "?"
5557 JRST TYCQRF ;FLUSH GUY WHO WAS QUERYING
5560 TYCN: TLZ Q,%TCTPN ;I DON'T NEED ^_N SUPPLIED IF I JUST TYPED IT IN MYSELF.
5561 PUSHJ P,TYCI2 ;ECHO THE N AND STORE Q. ALSO RESTORE TTYIPC AND TTYCOM TO NORMAL.
5565 ;ASSUMING THAT TTY IN I IS IN A COM LINK, UNLINK IT.
5566 ;IF ONLY ONE OTHER TTY IS IN THE LINK, REMOVE IT FROM COM MODE TOO.
5567 TYCGTM: HRRE B,TTYCOM(I) .SEE TTYLFC
5568 JUMPL B,[JRST 4,.] ;WASN'T COMMUNICATING WITH ANYONE
5570 BUG ;COMMUNICATING WITH SELF
5571 TYCGT3: HRRE C,TTYCOM(B)
5572 JUMPL C,[JRST 4,.] ;LIST NOT CIRCULAR
5574 JRST TYCGT4 ;B HAS TTY NUMBER OF GUY POINTING TO ME
5578 TYCGT4: HRRZ C,TTYCOM(I)
5581 PUSHJ P,TYCGT2 ;TAKE ME OUT OF COM MODE.
5586 CAME C,I ;SKIP IF ONLY 1 IN LOOP BESIDES ME. IF SO, HE'S UNLINKED TOO.
5588 ;MARK TTY IN I AS UNLINKED AND NOT N COM MODE. TYPE ^_N ON IT IF NECESSARY.
5590 TLZ Q,400000+%TCLFT+%TCRFT
5593 MOVEI T,[ASCIZ/
\1fN/]
5597 TYCGT5: HRRM C,TTYCOM(I) ;TAKE ME OUT OF THE CIRCULAR LIST
5599 SETO TT, ;FOOL TEST AT TYCI66
5600 PUSHJ P,TYCREP ;TELL ALL THE OTHERS THAT I'VE LEFT.
5605 TYCI73: JSP T,TYCI71 ;PRINT MSG AND MY UNAME ON TTY # IN I.
5609 SUBTTL TTY OUTPUT INTERRUPT LEVEL
5611 OVHMTR TTO ;TTY OUTPUT INTERRUPT LEVEL
5613 ;HANDLE AN OUTPUT INTERRUPT FROM A CHAR-AT-A-TIME CONTROLLER.
5617 MOVE B,[444400,,STYICH]
5619 ;HANDLE AN OUTPUT INT. ON A MULTI-CHAR CONTROLLER, ASSUMING
5620 ;COUNT AND B.P. ARE ALREADY SET UP.
5621 TYP: LDB J,[220300,,TTYTYP(I)] ;GET TTY OUTPUT SPEED.
5622 TYP0: ;COME HERE FOR DPK; J ALREADY SET UP.
5631 JUMPE A,[SETOM TTYOAC(I)
5632 JRST TYP1C] ;IF TTY HAS NO SPACE FOR ANY OUTPUT, STOP SENDING.
5634 MOVEM A,TTLTM(I) ;UPDATE TIME OF LAST OUTPUT THIS TTY.
5635 TYP0F: PUSHJ P,TYPLUP ;OUTPUT AT LEAST 1 CHAR.
5638 SKIPLE DBBCC ;SKIP IF OUT OF ROOM
5639 JRST TYP0F ;CONTINUE MESSAGE
5640 TYP1B: SKIPGE A,DBBCC
5641 BUG ;CONTROLLER'S BUFFER OVERFILLED?
5642 SUB A,DBBCC1 ;GET -<# CHARS WE ARE SENDING>
5644 BUG ;SENDING NO CHARS OR NEGATIVELY MANY?
5645 ADD A,TTOALC(I) ;IF THE ALLOCATION ISN'T INFINITE,
5647 HRRM A,TTOALC(I) ;DECREMENT IT BY # CHARS JUST OUTPUT.
5649 TRNN T,%TYMTY ;IF MTY ISN'T THE ONLY CONTROLLER, CHECK FOR THE OTHERS
5659 MOVN A,E ;- - # CHARS OUTPUT
5660 ADDM A,@DPKC-NFDPTY(I) ;GIVES # OF CHARS FOR CONTROLLER.
5661 XCT TTYST(I) ;TELL THE DPK THEY'RE THERE.
5668 MOVNM E,DL10CC ;STORE # CHARS BEING SENT.
5669 MOVE A,[340000,,DL10BF-1]
5670 MOVEM A,DL10BP ;GIVE THE 11 ITS MAGIC POINTER TO SNARF THE BUFFER.
5671 MOVEM I,DL10LN ;STORE LINE # OF TTY, THUS TELLING 11 TO GO AHEAD.
5672 CONO DLC,100040+TTYCHN ;INTERRUPT 11
5679 BUG ;OVER-RUNNING PREVIOUS TRANSFER
5680 MOVE A,[441000,,DTEOBF] ;SET UP BYTE POINTER FOR 10-11 CHANNEL
5682 MOVN A,E ;NUMBER OF CHARACTERS BEING SENT
5683 HRLI A,%DCTYO(I);SEND TYPE-OUT COMMAND, AND LINE NUMBER
5684 MOVEM A,DTEOUT ;GIVE COMMAND TO 11
5685 MOVEM A,DTEBBY ;FLAG BUFFER BUSY (AND REMEMBER WHICH COMMAND FOR DEBUGGING)
5686 MOVEI A,10. ;5-SECOND TIMEOUT FOR LOST TO-11 XFER DONE INTERRUPT
5687 MOVEM A,DTEBBT ;WHICH SEEMS TO HAPPEN NOW & THEN FOR SOME REASON
5688 CONO DTE,%DBL11 ;AND GIVE INTERRUPT
5701 TYP1H: MOVE A,STYICH ;HANDLE CHAR-AT-A-TIME CONTROLLERS.
5702 TLNN T,%TTPAR ;GENERATE A PARITY BIT IF NECESSARY.
5708 TYPDA1: CAIL I,NFDPTY
5710 XCT TTYDO(I) ;DATAO XXX,A
5714 CAME E,DBBCC1 ;SKIP IF NOTHING TO SEND
5715 JRST TYP1F ;SEND WHAT THERE IS
5716 XCT TTYDFF(I) ;CLEAR OUTPUT DONE
5719 TYP1F: AOS TTYOAC(I)
5723 TYP0N: AOSE NVTSIP ;CHAR PENDING?
5725 DATAO NTY,NVTSSC ;SEND CHR AFTER SELECT
5728 TYP0A: SKIPN A,NVOPTT
5729 .ERR Shouldn't this be using NFNVTY Instead?
5730 MOVEI A,NOTYS+NNTYS+NNVTTS-1
5731 MOVEM A,NNVSEC ;SET UP END CHECK
5733 MOVEI I,NOTYS+NNTYS ;INITIALIZE
5734 SETOM NNVSFL ;SET FIRST TIME THRU FLAG
5736 CAIGE A,10 ;SENT TOO MANY CHRS TO THIS CONSOLE W/O LOOKING AT OTHERS?
5737 JRST TYP ;NO, LOOK AT CONSOLE
5739 SETZM NVTCC ;YES LOOK AT OTHERS
5741 CAIL I,NOTYS+NNTYS+NNVTTS
5747 ;FEED SOME CHARACTERS FROM OUTPUT BUFFER TO THE TTY.
5748 TYPLUP: SKIPE TTYBYP(I)
5753 JRST [ MOVEM E,TORM(I) ;OUTPUT BUFFER EMPTY
5759 ILDB A,Q ;GET NEXT CHARACTER FROM OUTPUT BUFFER
5760 CAIL A,%TXDIS-1 ;IF DISPLAY OR CURSOR MOTION, DISPATCH.
5761 JRST [ MOVEM E,TORM(I) ;LEAVING THE FAST LOOP
5762 MOVEM D,TOOP(I) ;WITHOUT EATING THIS CHAR YET
5763 CAIN W,%TNSFW ;"SOFTWARE" TTY GETS THE CODES
5764 JRST TYPSFW ;AS THEY APPEAR IN THE BUFFER.
5767 JRST @TYPDTB-%TXDIS(A)]
5768 TLNN H,%TOSAI ;CTL CHARS ARE SPACING IFF SAIL CHAR SET;
5769 CAIL A,40 ;NON-CONTROLS ARE SPACING.
5772 JUMPE A,[ TRNE T,%TYMTY ;MTY CAN'T SEND NULLS EXCEPT AS FIRST CHAR IN WORD
5774 JRST .+1 ;OUTPUT IT NOW
5775 MOVE Q,D ;BACKUP BYTE POINTER AND OUTPUT IT LATER
5778 IDPB A,DBBBP ;PUT INTO DEVICE BUFFER
5781 AOS E ;MAXIMUM AMOUNT OF CRUFT GENERATED
5782 TYPLU2: MOVEM E,TORM(I)
5787 MNULLO: MOVE A,DBBCC ;SKIPS IF NULL MAY NOT BE OUTPUT TO MTY NOW
5799 ;HERE TO OUTPUT CHARACTER WHEN NOT IN FAST LOOP
5802 JUMPE A,[ TRNE T,%TYMTY ;MTY CAN'T SEND NULLS EXCEPT AS FIRST CHAR IN WORD
5804 JRST .+1 ;OUTPUT IT NOW
5807 MOVEM Q,TOOP(I) ;REMOVE CHAR FROM OUTPUT BUFFER.
5810 ;OUTPUT CHAR IN A TO TTY, AND LOOP BACK TO TYPLUP IF THERE IS
5811 ;ROOM FOR MORE CHARS. (OTHERWISE POPJ OUT OF TYPLUP).
5812 TYPOU2: IDPB A,DBBBP ;FOR FAST CONTROLLERS, STICK CHAR IN LOW LVL BUFFER.
5814 JRST TYPLUP ;ROOM FOR MORE CHARS.
5817 ;ACTUALLY OUTPUT A CHAR TO THE TTY (AND POPJ).
5821 JUMPE A,CPOPJ ;MTY CAN'T HANDLE NULLS.
5828 TYPSFW: TRNE T,%TYSTY ;STY TTY IN SOFTWARE MODE =>
5829 JRST TYPSFS ;SEND THE 8-BIT FROB
5830 SUBI A,%TXDIS-2 ;ELSE SEND IT, ESCAPED BY A RUBOUT, WITH 176
5831 CAIE A,%TDMV0-%TXDIS+2 ; SUBTRACTED FROM IT SO FITS IN 7 BITS
5832 CAIN A,%TDMV1-%TXDIS+2
5833 JRST [ MOVE E,TORM(I) ;FOR %TDMV1, MUST INCREMENT THE 2 ARGS.
5837 CAIE A,%TDMOV-%TXDIS+2
5839 MOVE E,TORM(I) ;AND FOR %TDMOV, MUST INCREMENT THE 4 ARGS SO THEY'RE NOT 0.
5840 CAILE E,TOBS-5 ;IF NOT ALL IN BUFFER, WAIT FOR THEM. TTY WILL BE STARTED AGAIN.
5842 IRPS TYPSF1,,TYPSF4:TYPSF3:TYPSF2:TYPSF1: ;DIGIT MANY CHARS FOLLOW
5843 TYPSF1: DPB A,Q ;STORE PREV. CHAR, FIXED UP.
5847 ADDI A,1 ;UPDATE %TDMOV ARGS BY ADDING 1.
5849 TYPSF0: DPB A,Q ;OK, THE COMMANDS ARE ALTERED, SO SEND THE 177.
5853 IFE NETP,TYPSFS==<TYPORS==TYPSIO>
5855 ;HERE FOR OUTPUT OF 8-BIT FROB TO A SOFTWARE TTY THAT IS A STY
5856 TYPSFS: CAIN A,%TDORS ;SKIPS INTO TYPORS
5857 ;HERE FOR %TDORS IN OUTPUT BUFFER
5858 TYPORS: SKIPN TYPNTF
5860 ;HERE FOR %TDORS OUTPUT BY STY DIRECTLY INTO A NET SOCKET
5861 IFN CHAOSP\TCPP, MOVE T,STYSTS-NFSTTY(I) ; Get flags for STY
5863 TLNE T,%SSCHA ; If Chaosnet,
5864 JRST TYPOR1 ; don't send "INS"
5867 TLNN T,%SSTCP ; If TCP, send magic chars in URGENT mode.
5869 HRRZ A,STYNTI-NFSTTY(I) ; Get TCB index
5870 SKIPL XBSTAT(A) ; Verify that COS is locked down
5871 BUG HALT,[TCP: Buff not locked]
5872 HLRZ T,XBOCOS(A) ; Find orig val of XBOBC
5873 SUB T,XBOBC(A) ; Find # bytes already in buffer
5875 BUG HALT ; Just-in-case check
5876 MOVE H,STYORC-NFSTTY(I) ; Get magic 8-bit chars to send
5877 TLNE H,(377_<<8.*3>+4>) ; Check 1st char
5878 AOJA T,[TLNE H,(377_<<8.*2>+4>) ; Check 2nd char
5879 AOJA T,[ TDNE H,[377_<8.+4>] ; Check 3rd char
5883 MOVEM T,XBSUP(A) ; Store # chars up to # including magic chars
5884 ; as the TCP URGENT pointer.
5889 HRRZ A,STYNTI-NFSTTY(I) ;GET NET INDEX
5891 MOVE T,IMFCQL ;IF INSUFFICIENT SPACE IN
5892 CAIG T,2 ; THE CONTROL QUEUE,
5893 JRST [ MOVSI T,200000 ; DEFER SENDING THIS
5894 IORM T,IMSOC5(A) ;AND REQUEST TTY WAKEUP LATER
5895 AOS IMNAS ;TELL 1/2 SECOND CLOCK
5897 MOVE T,TTYTYP(I) ;NEEDED BY TTY ROUTINES
5899 EXCH A,I ;A TTY IDX, I NET IDX
5903 MOVEM T,IMPCSH ;SECRET ARGUMENT TO IMSTCM
5906 BUG PAUSE,[TTY: NO IMP BUFFERS AVAILABLE FOR "INS" MSG]
5908 LDB C,IMSCLN ;LINK #
5916 TYPOR1: MOVE H,TTYOPT(I)
5919 MOVEI A,STYORC-NFSTTY(I) ;TYPE OUT THE MAGIC CHARACTERS
5924 ;COME HERE FROM TYPLUP WHEN THERE'S NOTHING TO TYPE OUT.
5925 ;CALL ALSO FROM TT11I4 WHEN THE PDP11 SAYS THE OUTPUT BUFFER IS EMPTY.
5926 TYPEND: PUSHJ P,TYPEN2
5927 TYPEN1: SETOM TTYOAC(I)
5930 ;SUBROUTINE TO ACTIVATE ANY ECHOING ETC. THAT MAY NEED TO BE DONE
5931 TYPEN2: SKIPGE TYOSW(I) ;IF ECHOING CAN BE DONE NOW,
5935 TLNN Q,%TCDNG ;IS THERE ECHOING NEEDING TO BE DONE?
5937 PUSHJ P,TTYI7 ;IF SO, QUEUE IT.
5939 PUSHJ P,TTYI7 ;ALSO FORCE OUT BUFFERED CURSOR MVT.
5943 TYP5: CAMN I,NNVSEC ;REACHED END
5944 AOSG NNVSFL ;AND NOT FIRST TIME
5945 JRST TYP0C ;LOOK AT OTHER NOVA CONSOLES
5950 ;IF TTYBYP ISN'T 0, IT IS B.P. TO ASCIZ STRING TO TYPE.
5951 ;COME HERE TO OUTPUT THE NEXT CHAR OF THE STRING OR CLEAR TTYBYP.
5952 TYPBP: ILDB A,TTYBYP(I)
5953 TRZE A,400 ;KLUDGE FOR C-100 (and others) TO GET NULLS OUT
5954 IFE MTYP,JRST TYPOU2
5955 .ELSE [ JRST [ TRNE T,%TYMTY
5956 PUSHJ P,MNULLO ;MTY CAN'T SEND NULLS EXCEPT AS FIRST CHAR IN WORD
5957 JRST TYPOU2 ;OUTPUT THE NULL NOW
5958 MOVSI A,100000 ;BACK UP BYTE POINTER
5960 POPJ P, ] ;OUTPUT PARTIAL WORD THEN SEND NULL NEXT TIME
5962 JUMPN A,TYPOU2 ;NOT END => OUTPUT THE CHAR.
5963 MOVE A,@TTYBYP(I) ;AT END, CHECK FOR SPECIAL
5964 TRNE A,1 ; TEKTRONIX DELAY KLUDGE
5966 TYPBP2: CLEARM TTYBYP(I) ;END OF ASCIZ STRING.
5969 TYPBP1: MOVSI B,7700 ;CLEAR SIZE FIELD
5971 LDB A,[$TTOSP,,TTYTYP(I)]
5972 MOVM A,BAUDRT(A) ;GET BITS PER SECOND
5973 MOVE B,1(B) ;GET SPECIFICATION WORD SAYING WHAT PADDING WE WANT.
5975 JRST TYPBP3 ;JUMP IF SPECIAL KLUDGE FOR TEKTRONIX
5976 JUMPG B,TYPBP4 ;JUMP IF PADDING INDEPENDENT OF VPOS.
5977 ; this is fixed elsewhere now.
5978 ; MOVE Q,TCTYP(I) ;IS THIS AN H19
5979 ; CAIN Q,%TNH19 ;H19'S HAVE TO BE PADDED WITH NUL's
5980 ; JRST TYPBP8 ; SO HANDLE THEM SPECIALLY
5981 PUSHJ P,TYPBP6 ;CALCULATE NUMBER OF CHARACTERS OF PADDING NEEDED
5984 TYPBP4: IMUL B,A ;1000. * NUMBER OF BITS PADDING
5985 IDIVI B,10000. ;NUMBER OF CHARACTERS PADDING (NOTE ROUND-DOWN)
5986 TYPBP5: SETZM TTYBYP(I) ;IN CASE NO PADDING REQUIRED
5987 PUSHJ P,TYMPAD ;PUT THE PADDING BYTE POINTER INTO TTYBYP
5990 TYPBP3: IDIVI A,9 ;GET CHARACTERS PER 1.1 SECOND
5991 SKIPL TTYIHP(I) ;KLUDGE KLUDGE
5992 MOVNM A,TTYIHP(I) ;BUT IT'S GOTTA BE STORED SOMEPLACE
5994 JRST TYPBP2 ;SIGH, DELAY COMPLETED
5995 MOVEI A,^V ;NOT YET COMPLETED, SEND ANOTHER PAD
5999 IMUL A,B ;IF NEGATIVE, TAKE ABS VALUE
6000 MOVE B,TCMXV(I) ;TIMES NUMBER OF LINES AT AND BELOW THE CURSOR.
6002 IMUL B,A ; 1000.* NUMBER OF BITS OF PADDING
6003 IDIVI B,10000.*8. ; DIVIDE BY 10000. TO GET NO. OF CHARS OF PADDING
6004 ; AND THEN BY 8 BECAUSE PER LINE TIMES ARE EXPRESSED
6005 POPJ P, ; IN TERMS OF 1/8 MS FOR BETTER RESOLUTION
6007 ;once upon a time someone thought that this might cause padding with nulls to
6008 ;happen. It didn't work.
6009 ;TYPBP8: SKIPL TTYIHP(I) ;TO EXPAND UPON A KLUDGE
6010 ; JRST [ PUSHJ P,TYPBP6 ;CALCULATE THE # OF CHARS NEEDED
6011 ; MOVNM B,TTYIHP(I) ;AND SAVE THEM AWAY TO BE COUNTED
6013 ; AOSL TTYIHP(I) ;COUNT THIS CHARACTER
6014 ; JRST TYPBP2 ; DELAY COMPLETED, RESET WORLD
6016 ; JRST TYPOU2 ;STUFF IT IN THE BUFFER, AND FIND WAY BACK HERE
6018 ;COME HERE TO DO CURSOR MOTION ON PRINTING TTYS.
6019 ;TT HAS DESIRED HPOS; D HAS DESIRED VPOS.
6020 TYMPRR: MOVE B,TCMXH(I)
6024 TYMPRT: CAIN W,%TNMEM
6025 JRST [ CAMLE D,TTYIVP(I) ;VERTICAL MOTION NEEDED, AND CURSOR NOT AT LEFT MARGIN?
6027 JRST .+1 ;(PREVENT INFINITE CR LOOP).
6028 SETZ TT, ;START WITH A CR.
6029 JRST TYMPH1] ;MEMOWRECK LOSES LF'ING IN MID-LINE.
6030 CAMGE TT,TTYIHP(I) ;BACKWARD MOTION TAKES PRIORITY.
6032 CAMLE D,TTYIVP(I) ;THEN DOWNWARD MOTION.
6034 CAMLE TT,TTYIHP(I) ;THEN FORWARD MOION.
6036 MOVEM D,TTYIVP(I) ;MUST BE UPWARD MOTION
6037 JRST TYMOV8 ;WHICH IS A NO-OP ON PRINTING TTYS.
6039 TYMPV2: AOS TTYIVP(I) ;MOVING DOWN: DO ONE LF
6042 PUSHJ P,TYMOVX ;IF REACHED GOAL, SAY FINISHED.
6043 LDB B,[$TPPLF,,TTYOPT(I)]
6045 ADDI B,TYMTVT-TYMPVT
6047 ADDI B,TYMMVT-TYMPVT
6048 HRRZ B,TYMPVT(B) ;# PADDING AFTER LF.
6054 REPEAT 6,2+.RPCNT ;EXTRA
6055 TYMTVT: 0 ;UNPADDED TERMINET
6060 35 ;120CPS TERMINET (MAX SPEED)
6063 TYMMVT: 0 ;UNPADDED WRECK
6070 TYMPHF: LDB B,[$TPPTB,,TTYOPT(I)] ;FORWARD: CAN WE DO IT WITH TABS?
6071 JUMPE B,TYMPH6 ;TABS NOT ALLOWED ON THIS TTY.
6073 ANDCMI A,7 ;SEE WHERE A TAB WOULD BRING US.
6075 CAILE A,(TT) ;BEYOND WHERE WE WANT TO GO?
6077 SUBI A,(B) ;A HAS TAB STOP - <# PADDING>-1
6078 CAMG A,TTYIHP(I) ;TAB FASTER THAN SPACES (INCLUDING PADDING)?
6079 JRST TYMPH6 ;NO, USE SPACES.
6080 ADDI A,(B) ;A HAS TAB STOP.
6083 SOJA B,TYMPT1 ;B HAS # PADDING AFTER TAB.
6085 TYMPH6: MOVEI A,40 ;GO FORWARD WITH SPACES
6086 MOVE C,[AOS TTYIHP(I)]
6089 TYMPH2: MOVEI A,^H ;GO BACKWARD WITH BACKSPACES
6090 MOVE C,[SOS TTYIHP(I)]
6093 MOVMS B ;HOW MANY TIMES TO PUT CHAR
6101 ;COME HERE TO MOVE BACKWARDS.
6102 TYMPH1: MOVE A,TTYIHP(I)
6103 SUB A,TT ;A HAS # CHARS IF WE BACKSPACE.
6104 LDB B,[$TPPCR,,TTYOPT(I)]
6106 MOVE E,B ;E HAS PADDING TYPE OF TTY,
6107 MOVE B,TTYIHP(I) ;B HAS CURRENT HPOS.
6108 CAIL E,<.BM $TPPCR,_-.TZ .BM $TPPCR>-TYMPHL+1 ;THIS ONE A SPECIAL $TPPCR CODE?
6109 JRST @TYMPHT-<.BM $TPPCR,_-.TZ .BM $TPPCR>-1(E)
6110 LDB C,[$TTOSP,,TTYTYP(I)]
6111 SUBI C,2 ;(THIS ONLY WORKS FOR SPEED CODES 2,3,4,5)
6112 ANDI C,3 ;(= 110, 150, 300, 1200 BAUD).
6113 MOVE C,(C)[33. ? 20. ? 10. ? 5]
6114 IDIV B,C ;1 PAD CHAR FOR EACH (33./20./10./5) SPACES TO MOVE.
6115 ADDI B,1 ;I.E. MOVES AT 300/PADCODE COLUMNS PER SECOND
6116 IMULI B,(E) ; OR 600/PADCODE COLUMNS PER SECOND AT 1200 BAUD
6119 SUB C,TTYIVP(I) ;IF WE'RE MOVING DOWN AFTER THE CR, HOW MANY LF'S?
6121 SUB B,C ;EACH LF REDUCES # PADDING NEEDED BY CR.
6122 CAIGE B, ;BUT CAN'T NEED LESS THAN 0 PADDING.
6124 ;B HAS # CHARS PADDING NEEDED AFTER CR, IF WE DECIDE TO CR.
6125 TYMPH5: TLNN H,%TOMVB ;HOW DO WE MOVE BACKWARD?
6126 JRST TYMPH3 ;CAN'T BS => MUST CR AND SPACE FWD.
6127 JUMPE TT,TYMPH3 ;GOING TO COLUMN 0 => ALWAYS CR
6128 TLNN H,%TOOVR ;ON A GLASS TTY, IF STAYING ON THE SAME LINE, HAVE TO
6129 JUMPLE C,TYMPH2 ; USE BACKSPACES TO NOT OBLITERATE PREVIOUS OUTPUT
6130 LDB E,[$TPPTB,,TTYOPT(I)]
6131 JUMPE E,[MOVE C,TT ;CAN'T USE TABS: C _ TIME IF MOVE FWD.
6133 PUSH P,B ;CAN USE TABS: SEE HOW LONG TO GO FWD
6134 MOVE B,TT ;USING TABS.
6135 IDIVI B,10 ;NEED C(B) TABS AND C(C) SPACES.
6136 IMULI B,(E) ;B _ TIME NEEDED FOR TABS & PADDING.
6137 ADDI C,(B) ;C _ TIME NEEDED TO GO FWD.
6139 TYMPT2: ADDI C,1(B) ;ADD IN TIME TO CR, + PADDING.
6141 JRST TYMPH2 ;FASTER TO BACKSPACE.
6142 TYMPH3: MOVEI A,^M ;OUTPUT A CR (WILL SPACE FORWARD LATER)
6143 SETZM TTYIHP(I) ;WHEN WE COME BACK WE'LL SEE WE
6144 TYMPT1: PUSH P,B ;NEED TO GO FORWARD.
6148 JRST TYMPAD ;PAD THE TTY (# CHARS PADDING IN B)
6150 ;DISPATCH TABLE FOR SPECIAL %TPPCR CODES.
6151 TYMPHZ: TYMPEX ;EXECUPORT.
6154 TYMPH5 ;CODE 7 NOT USED.
6155 TYMPHT: TYMPHL==.-TYMPHZ
6162 TYMPMW: LDB E,[$TPPLF,,TTYOPT(I)]
6163 JUMPE B,TYMPM1 ;NO CHRS
6167 TYMPM1: MOVE B,TYMMVT(E)
6168 CAMLE D,TTYIVP(I) ;BEFORE LF'ING, MEMOWRECK
6169 JRST TYMPH3 ;MUST CR RATHER THAN BS.
6172 TYMPMT: 0 ;MEMOWRECK MIMIMUM LINE SIZE, AS FUNCTION OF SPEED
6173 8 ;VIA THE $TPPLF CODE.
6179 TYMPEX: IDIVI B,10. ;EXECUPORT: 1 PAD CHAR FOR EVERY 10 POSITIONS TO CR THRU.
6183 ;COME HERE TO PAD A PRINTING TERMINAL: # CHARS OF PADDING IN B.
6184 TYMPAD: AOSG A,B ;AOS COMPENSATES FOR ILDB
6186 MOVE Q,TCTYP(I) ;is this an H19?
6187 CAIN Q,%TNH19 ;H19's have to be nullified. I mean, padded with nulls.
6189 CAILE A,199. ;DON'T TRY TO PAD MORE THAN 199 TIMES, WOULD
6190 MOVEI A,199. ; BLOW OUT AT TYPBP1
6193 ADD A,TYMPA1(B) ;CREATE A BP TO A STRING WITH THE RIGHT # OF RUBOUTS.
6196 TYMPNL: CAILE A,399. ;we make an exception for H19's, which need a lot of
6197 MOVEI A,399. ;padding.
6198 IDIVI A,4 ;This works same as with rubouts, but for 9 bits
6204 ;THIS IS AN ASCIZ STRING OF 199. RUBOUTS.
6205 ;SOME FINAL SEGMENT OF IT WILL BE TYPED OUT.
6206 TYMPA0: REPEAT 199./5, -2
6209 TYMPA1: 010700,,TYMPA2
6215 ;This is a not-quite ASCIZ string of 399. pseudo-nulls. They are 9 bits long so
6216 ;that the typeout loop will spot the high bit and see that we're not at the end.
6217 ;This is used by things that want to be padded with nulls, like h19s.
6218 TYPNL0: REPEAT 399./4,<.BYTE 9 ? 400 ? 400 ? 400 ? 400>
6219 TYPNL2: 400400400000
6221 TYPNL1: 001100,,TYPNL2
6226 ;DISPATCH TABLE FOR CURSOR CONTROL CMDS AND RUBOUT
6227 TYPSIO ;RUBOUT DISPATCHES HERE
6228 TYPDTB: OFFSET %TDMOV-.
6229 %TDMOV::TYMOV ;MOVE CURSOR
6230 %TDMV1::TYMOV2 ;DUMMY COMMAND CREATED BY TYMOV.
6231 ;MAKES IT POSSIBLE FOR TYMOV TO STOP WHEN BUFFER FULL
6232 ;AND BE REENTERED NEXT INTERRUPT.
6233 %TDEOF::TYEEOF ;CLEAR REST OF PAGE
6234 %TDEOL::TYEEOL ;CLEAR REST OF LINE
6235 %TDDLF::TYEDLF ;DELETE FORWARD (FOR ERASABLE OVERPRINTING TTYS)
6236 %TDMTF::TYEMTF ;MOTOR OFF (FOR TERMINETS)
6237 %TDMTN::TYEMTN ;MOTOR ON (FOR TERMINETS)
6238 %TDCRL::TYECRL ;CRLF ON DATAPOINTS, IMLACS.
6239 %TDNOP::TYEEO1 ;NO-OP FOR SUPERDUPERIMAGE MODE.
6240 %TDBS:: TYEBS ;BACKSPACE (FOR TTY'S WITH %TORAW SET).
6241 %TDLF:: TYELF ;LINEFEED (").
6242 %TDRCR::TYERCR ;CARRET (").
6243 %TDORS::TYPORS ;"OUTPUT RESET" FOR SAKE OF SOFTWARE TTYS & STYS
6244 %TDQOT::TYEQOT ;DEVICE-DEPENDENT DATA IN NEXT BYTE.
6245 %TDFS:: TYEFS ;FORWARD ONE SPACE
6246 %TDMV0::TYMV0 ;REPLACEMENT FOR %TDMOV
6247 %TDCLR::TYECLR ;CLEAR THE SCREEN
6248 %TDBEL::TYEBEL ;DING THE BELL.
6249 %TDINI::TYEINI ;REINITIALIZE INTELLIGENT TERMINAL
6250 %TDILP::TYEILP ;INSERT LINE POSITION, FOLLOW BY COUNT
6251 %TDDLP::TYEDLP ;DELETE LINE POSITION, FOLLOW BY COUNT
6252 %TDICP::TYEICP ;INSERT CHARACTER POSITION, FOLLOW BY COUNT
6253 %TDDCP::TYEDCP ;DELETE CHARACTER POSITION, FOLLOW BY COUNT
6254 %TDBOW::TYEBOW ;ENTER INVERSE VIDEO MODE
6255 %TDRST::TYERST ;CLEAR ALL SPECIAL MODES (SUCH AS INVERSE VIDEO).
6256 %TDGRF::TYEEO1 ;GRAPHICS, FLUSH IT
6257 %TDRSU::TYERSU ;REGION SCROLL UP
6258 %TDRSD::TYERSD ;REGION SCROLL DOWN
6259 TYEEO1 ;NEXT 4 CODES ARE USED FOR SOME WEIRD FORM OF GRAPHICS OUTPUT
6260 TYEEO1 ;THAT WILL EVENTUALLY BE FLUSHED.
6263 ;FOLLOWING CODES ARE FOR LOCAL EDITING TERMINALS
6264 ;NON-SOTFWARE TERMINALS DON'T HANDLE THEM, SO IGNORE THEM.
6265 %TDSYN::TYEIG1 ;RESYNCH REPLY TO LOCAL EDITING TERMINAL. IGNORE 1 ARG.
6266 %TDECO::TYEEO1 ;ASK TERMINAL TO TRY LOCAL EDITING BY SENDING A RESYNCH. IGNORE.
6267 %TDEDF::TYEIG2 ;SET LOCAL EDITING TERMINAL COMMAND DEFINITION. IGNORE 2 ARGS.
6268 %TDNLE::TYEEO1 ;STOP DOING LOCAL EDITING. IGNORE.
6269 %TDTSP::TYEEO1 ;DISPLAYS LIKE SPACE, BUT IS PART OF A TAB. IGNORE. SHOULDN'T HAPPEN.
6270 %TDCTB::TYEEO1 ;THIS LINE IS CONTINUED AT THE BEGINNING.
6271 %TDCTE::TYEEO1 ;THIS LINE IS CONTINUED AT THE END.
6272 %TDMLT::TYEIG2 ;DECLARE MULTI-POSITION CHAR FOR LOCAL EDITING. IGNORE 2 ARGS.
6273 %TDSVL::TYEIG3 ;SAVE LINE CONTENTS. IGNORE 3 ARGS.
6274 %TDRSL::TYEIG3 ;RESTORE LINE CONTENTS. IGNORE 3 ARGS.
6275 %TDSSR::TYEIG2 ;SET RANGE OF COLUMNS TO SAVE. IGNORE 2 ARGS.
6276 %TDSLL::TYEIG2 ;SET LABEL FOR LOCAL LINE SAVING. IGNORE 2 ARGS.
6280 ;IGNORE THIS COMMAND AND 3 ARGS.
6281 TYEIG3: MOVE A,TORM(I)
6286 ;IGNORE THIS COMMAND AND 2 ARGS.
6287 TYEIG2: MOVE A,TORM(I)
6292 ;IGNORE THIS COMMAND AND 1 ARG.
6293 TYEIG1: MOVE A,TORM(I)
6300 TYEQOT: MOVE A,TORM(I)
6312 ;%TDMOV MOVE CURSOR COMMAND DISPATCHES HERE.
6313 TYMOV: MOVE A,TORM(I)
6314 CAILE A,TOBS-5 ;IF THE 4 ARGUMENT CHARS AREN'T IN THE BUFFER YET,
6315 JRST TYPEND ;GO AWAY; WILL COME BACK WHEN THEY ARE OUTPUT.
6316 CAMN Q,TOBEP(I) ;FETCH THE NEXT 2 CHARS WHICH
6317 MOVE Q,TOBBP(I) ;HOLD THE "OLD" POSITION
6319 MOVEM Q,TOOP(I) ;FLUSH FIRST TWO CHARS (AS IF WAS %TDMV0)
6326 MOVEM A,TTYIVP(I) ;SET INITIAL STARTING PLACE
6330 TYMV0: MOVE A,TORM(I) ;MAKE SURE THE TWO ARG CHARS ARE IN THE BUFFER
6332 JRST TYPEND ;GO AWAY; WILL COME BACK WHEN THEY ARE OUTPUT.
6335 ;%TDMOV COMMAND ON ALL TERMINALS.
6336 TYMV0A: MOVSI C,%TCPAD+%TCFPD ;FOR DATAPOINTS, PADDING WILL BE NECESSARY NOW.
6337 ANDCAM C,TTYCOM(I) ; ALSO, CLEAR FPD IF IT GOT LEFT ON SOMEHOW
6338 MOVEI A,%TDMV1 ;PUT A NEW COMMAND IN OUTPUT BUFFER
6339 DPB A,Q ; IN CASE WE FILL UP BUFFER AND HAVE TO COME BACK.
6340 ; IN THAT CASE WILL RETURN TO TYMOV2.
6342 ; %TDMV1 ? NEW VPOS ? NEW HPOS
6343 TYMOV2: CAMN Q,TOBEP(I)
6344 MOVE Q,TOBBP(I) ;FETCH DESIRED POS. FROM BUFFER.
6351 CAIGE W,%TNMAX ;If pointer to routine is within range,
6352 JUMPGE W,@TYMDTB(W) ;GO TO DEVICE-DEPENDENT CURSOR POSITIONING ROUTINE
6356 %TNPRT::SETZ TYMPRT ;PRINTING
6357 %TNDP:: TYMDP ;DATAPOINT
6358 %TNODP::TYMDP ;LOSING DATAPOINT
6359 %TNIML::TYMIML ;IMLAC
6360 %TNTEK::TYMDP ;TEKTRONIX
6361 %TNTV:: [JRST 4,.+TYMDTB]
6362 %TNMEM::SETZ TYMPRT ;MEMOWRECK
6363 %TNSFW::[JRST 4,.+TYMDTB]
6364 %TNTRM::SETZ TYMPRT ;TERMINET
6365 %TNESC::TYMDP ;ASCII ESCAPE SEQUENCES TTY
6366 %TNDTM::TYMIML ;DATAMEDIA
6367 %TNRAY::TYMDP ;TELERAY 1061
6368 %TNHDS::TYMDP ;HDS CONCEPT-100
6370 %TNAAA::TYMAAA ;Ann Arbor Ambassador
6373 ;DISPLAY TERMINALS THAT HAVE RELATIVE CURSOR POSITIONING
6374 TYMDP: MOVE A,TTYIVP(I) ;CURRENT HARDWARE VERTICAL POSITION
6375 SUB A,D ;SUBTRACT VERTICAL POSITION OF WHERE WE WANT TO BE
6376 MOVMS A ;A IS HOW FAR WE HAVE TO GO UP OR DOWN
6377 CAML TT,TCMXH(I) ;IF TRYING TO MOVE OFF RIGHT MARGIN,
6378 JRST [ MOVE TT,TCMXH(I) ;CODE JUST BELOW CAUSES INFINITE LOOP
6379 SOJA TT,.+1 ] ;SO PRETEND MOVING TO MARGIN
6380 MOVE B,TTYIHP(I) ;COMPUTE NET CHRS TO POSITION
6381 CAML B,TCMXH(I) ;IF WE THINK WE MOVED OFF THE END OF THE LINE,
6382 JRST [ MOVE B,TCMXH(I) ;PRESUMABLY BY PRINTING IN THE LAST COLUMN,
6383 SUBI B,1 ;THE CURSOR ACTUALLY STUCK IN THE LAST COLUMN
6387 MOVM C,B ;C IS HOW FAR WE HAVE TO GO HORIZONTALLY
6388 TRNE H,%TPPTB ;IF TERMINAL HAS TABS
6389 JRST TYMTB1 ;USE DIFFERENT CURSOR POSITIONING ROUTINE
6390 CAMLE B,TT ;SKIP IF NOT SHORTER TO CR FIRST
6391 MOVEI C,1(TT) ;# CHARS IF CR FIRST.
6392 ADD A,C ;A NOW HAS TOTAL NUMBER OF CHARS TO SEND TO GET THERE
6393 JUMPE A,TYMOV8 ;WE'RE THERE
6395 ADDI C,1(TT) ;C HAS NUMBER OF CHARS IT WOULD TAKE IF WE HOMED UP FIRST
6398 SUB E,D ;E HAS NUMBER IF HOME DOWN FIRST
6402 JRST TYMHU ;HOME UP SHORTER
6404 JSP A,TYMHD ;HOME DOWN SHORTER
6405 TYPCPG: JUMPL B,TYMDP3 ;H POS TOO SMALL, MOVE FWD
6406 JUMPG B,TYMDP6 ;MOVE BACKWARD (EITHER BS OR CR).
6407 TYMDPL: MOVE B,TTYIVP(I)
6409 JUMPG B,TYMDP2 ;MOVE UP IF NECESSARY
6410 JUMPL B,TYMDP1 ;OR DOWN.
6411 JRST TYMOV8 ;OR WE'RE DONE.
6413 TYMDP3: JSP E,TYMDPP ;PAD IF NEC.
6414 MOVE C,[AOS TTYIHP(I)]
6415 SKIPL A,CCFS(W) ;GET FORWARD SPACE CHARACTER
6416 JRST TYMDP7 ;IS ONE CHAR
6418 JRST TYMVT7 ;IS TWO CHARS
6422 TYMTB6: MOVEI A,15 ;BETTER TO CR FIRST
6431 CAMN E,TTYIVP(I) ;ON LOSERS, AFTER CR MUST GO LF TO TURN OFF SPOW MODE.
6432 JRST TYMDP2 ;IF ON BOTTOM LINE, GO UP BEFORE CR SO CAN GO DOWN AFTER.
6437 JRST TYMDP5 ;JUMP IF HAVEN'T DONE CR YET
6438 JSP E,TYMDPP ;AFTER CR, PAD
6439 JRST TYMHU3 ;THEN GO SETZM TTYIHP(I) AND TURN OFF SPOW LATCH
6441 TYMDP8: JSP E,TYMDPP
6442 MOVE C,[SOS TTYIHP(I)]
6443 MOVEI A,%DPBS ;DATAPOINT BACK-SPACE.
6446 TYMDP1: JSP E,TYMDPP
6447 MOVEI A,%DPDN ;DATAPOINT LINEFEED.
6448 MOVE C,[AOS TTYIVP(I)]
6451 TYMDP2: JSP E,TYMDPP
6452 MOVE C,[SOS TTYIVP(I)]
6453 SKIPL A,CCUP(W) ;GET LINE-STARVE CHARACTER
6456 JRST TYMVT7 ;IT'S TWO CHARS LONG
6458 TYMHU: SKIPN CCHUP(W) ;SKIP IF TTY CAN HOME UP
6460 CAMLE C,E ;HOME UP IS BETTER THAN DIRECT ROUTE.
6461 JSP A,TYMHD ;MAYBE HOME DOWN IS EVEN BETTER
6464 CLEARM TTYIVP(I) ;NO, HOME UP IS BEST.
6466 TYMHU2: MOVE A,CCHUP(W)
6470 TYMHU1: MOVE E,TTYCOM(I) ;HERE FOR HOME UP ON DISAPPOINT
6474 JRST TYMHU2 ;JUMP IF HAVEN'T HOMED UP YET
6475 MOVSI E,%TCPAD ;DON'T PAD AFTER HOME UP
6477 SETZM TTYIVP(I) ;AND TURN OFF THE SPOW LATCH
6478 TYMHU3: MOVSI E,%TCFPD ;FIRST PART WILL HAVE BEEN DONE WHEN
6479 ANDCAM E,TTYCOM(I) ; WE PUT OUT THE ONE CHAR TO GO DOWN ONE LINE
6481 MOVEI B,1 ;GO DOWN ONE LINE TO RESET SPOW
6485 TYMDP5: JUMPE A,[JRST 4,.]
6493 ;CAN'T OUTPUT ANY MORE: IF REACHED DESIRED POS, FLUSH THE
6494 ;%TDMV1; OTHERWISE RETURN LEAVING IT TO COME BACK HERE WHEN
6495 ;TTY CAN ACCEPT MORE OUTPUT.
6496 TYMOVY: SOJG B,TYMOVP
6497 TYMOVX: CAMN D,TTYIVP(I)
6500 ;WE USED UP ALL THE SPACE BUT GOT WHERE WE'RE GOING.
6501 TYMOV9: MOVEM Q,TOOP(I) ;FLUSH THE %TDMV1 COMMAND.
6506 ;WE FINISHED ONE SET OF OUTPUT CHARS, & HAVE ROOM FOR MORE.
6507 ;EITHER CONTINUE MOVING CURSOR, OR LOOK FOR NEXT THING TO DO.
6508 TYMOVC: CAME TT,TTYIHP(I)
6509 JRST TYMDP ;HORIZ POS STILL NEEDS CHANGING.
6511 JRST TYMDPL ;VERT POS STILL NEEDS CHANGING.
6512 TYMOV8: MOVEM Q,TOOP(I) ;FLUSH THE %TDMV1 COMMAND
6515 JRST TYPLUP ;AND GO GET NEXT THING FROM BUFFER.
6517 ;COME HERE TO PAD DATAPOINT IF NECESSARY.
6518 ;CALL WITH JSP E,. CLOBBERS A, C.
6519 ;MAY JUMP AWAY TO PAD, IN WHICH CASE TYMDP WILL BE RE-ENTERED LATER.
6520 TYMDPP: MOVSI C,%TCPAD
6521 TDNE C,TTYCOM(I) ;PADDING ALREADY DONE FOR THIS COMMAND => RETURN.
6523 LDB A,[$TPPCR,,TTYOPT(I)]
6524 JUMPE A,(E) ;RETURN IF THIS TTY NOT PADDED.
6526 IORM C,TTYCOM(I) ;AFTER WE PAD, PADDING WON'T BE NECESSARY.
6529 JRST TYMDP5 ;GO OUTPUT THEM.
6535 ;JSP A,TYMHD IF HOME-DOWN LOOKS BEST
6537 JRST (A) ;BUT HOME-DOWN ONLY WORKS ON DATAPOINTS
6538 SETZM TTYIHP(I) ;HOME DOWN IS BEST.
6546 ;HERE TO SEND ONE OR MORE COPIES OF AN ESCAPE SEQUENCE.
6547 ;ESCAPED CHAR IN A. # TIMES IN B. INSN TO ADJUST TTYIVP,TTYIHP IN C.
6549 TYMVT5: MOVE E,TTYCOM(I) ;STOPPED IN MIDDLE OF ESC SEQ?
6552 MOVEM E,TTYCOM(I) ;YES, SKIP INITIAL ESC
6557 SOSG DBBCC ;NO MORE ROOM =>
6558 JRST TYMVT3 ;STOPPED WITHIN ESC SEQUENCE
6559 TYMVT6: XCT C ;ELSE SEND THE ESCAPED CHAR
6562 JRST TYMOVY ;NO ROOM => DISMISS
6563 SOJG B,TYMVT4 ;ELSE SEND NEXT ESC SEQ
6564 JRST TYMOVC ;FLUSH THE %TDMOV AND RETURN
6566 TYMVT3: MOVSI E,%TCFPD
6570 ;CURSOR POSITIONING ON A DISPLAY TTY WITH TABS
6573 ADD R,TYMTBC(W) ;COST OF TABBING TO DEST FROM LEFT MARGIN
6574 MOVE W,TCTYP(I) ;RESTORE W, CLOBBERED BY IDIVI
6575 JUMPG B,TYMTB2 ;JUMP IF MOVING BACKWARDS
6576 JUMPE B,TYMTB3 ;JUMP IF NOT MOVING HORIZONTALLY
6578 ADD C,C ;MOVING FORWARDS IS SLOW ON ESCAPE-C TYPE TERMINAL
6581 SUBM R,E ;COST OF TABBING FROM WHERE WE ARE NOW
6583 MOVE C,E ;FASTER IF TABS ARE USED
6584 JRST TYMTB3 ;MOVING FORWARD, SO CR CAN'T HELP
6586 TYMTB2: CAILE C,1(R)
6587 MOVEI C,1(R) ;BETTER TO CR FIRST
6588 TYMTB3: ADD A,C ;TOTAL # CHARS TO BE SENT IF RELATIVE POSITIONING USED
6589 JUMPE A,TYMOV8 ;WE'RE THERE
6591 ADDI E,2(R) ;COST IF HOME-UP FIRST (ASSUMING HOME-UP IS 2 CHARS)
6593 MOVE A,E ;RELATIVE POSITIONING SHOULD START WITH HOME-UP
6594 CAILE A,4 ;COMPARE RELATIVE AND ABSOLUTE POSITIONING
6596 JRST TYMTB8 ;RELATIVE POSITIONING BETTER OR ONLY CHOICE
6597 ;USE ABSOLUTE POSITIONING, DROP INTO STRAIGHT ABS POS CODE.
6598 ;HERE FOR DIRECT POSITIONING ON IMLAC AND DATA MEDIA. SEND MAGIC CHARACTER
6599 ;FOLLOWED BY HORIZONTAL AND VERTICAL POSITION, OFFSET BY SUITABLE AMOUNT
6600 ;D FOR THE VERTICAL, TT FOR THE HORIZONTAL
6601 TYMIML: MOVE Q,TOOP(I) ;CLOBBER OVER THE 3 CHARS IN OUTPUT BUFFER
6604 HLRZ A,CCDPSO(W) ;GET ABS-POSITIONING CHARACTER, IT WILL
6605 IDPB A,Q ; BE FOLLOWED WITH VERTICAL, HORIZONTAL COORDS
6606 MOVEM D,TTYIVP(I) ;CURSOR WILL END UP HERE
6609 EXCH D,TT ;SEND HORIZONTAL THEN VERTICAL
6610 HRRZ E,CCDPSO(W) ;GET TABLE INDEX
6611 MOVE B,D ;FIRST COORD TO SEND
6612 XCT CCDPSM(E) ;MUNG B APPROPRIATELY
6613 ANDI B,177 ;EXTRA BITS CAUSE TROUBLE LATER
6618 MOVE B,TT ;SECOND COORD TO SEND
6619 XCT CCDPSM(E) ;MUNG B APPROPRIATELY
6620 ANDI B,177 ;EXTRA BITS CAUSE TROUBLE LATER
6624 ANDI A,177 ;DON'T LET TYPLUP THINK THESE CHARACTERS PRINT
6636 MOVEI A,33 ;PUT AN ESC BEFORE IT
6640 JRST TYMHU ;HOME-UP FIRST
6641 JUMPL B,TYMTB4 ;JUMP IF MOVING TO THE RIGHT
6642 JUMPE B,TYMDPL ;JUMP IF NOT MOVING HORIZONTALLY
6643 CAIE C,1(R) ;MOVING TO THE LEFT, SKIP IF SHOULD CR FIRST
6644 JRST TYMDP8 ;NO, JUST BS
6647 TYMTB4: MOVE E,TT ;DESTINATION COLUMN
6648 TRO E,7 ;ENSURE NO BORROW
6649 MOVEI A,1(E) ;COLUMN TO TAB TO THEN BACKSPACE BACK
6650 CAMGE A,TCMXH(I) ;BE SURE NOT TO TAB OFF THE RIGHT MARGIN
6651 TRNN TT,4 ;SKIP IF FASTER TO TAB PAST AND BACKSPACE BACK
6652 JRST TYMTB5 ;JUMP IF BETTER TO TAB THEN FORWARD-SPACE
6654 JRST TYMDP3 ;MOVING A SHORT WAY, JUST SEND A FORWARD-SPACE
6657 LSH B,-3 ;# TABS TO GET PAST DESTINATION
6660 ANDCAM E,TTYIHP(I) ;ALIGN TTYIHP WITH TAB STOPS
6661 MOVE C,[ADDM E,TTYIHP(I)] ;EACH TAB ADVANCES TTYIHP BY 8
6662 AOJA E,TYMDP5 ;GO TAB
6664 TYMTB5: SUB E,TTYIHP(I) ;COMPUTE # TABS TO GET JUST TO
6665 LSH E,-3 ; THE LEFT OF THE DESTINATION
6666 JUMPE E,TYMDP3 ;WE'RE CLOSE, DO FORWARD SPACES
6670 TYMTBC: 0 ? 2 ? 4 ? 6 ;COST OF MOVING RIGHT FROM A TAB STOP
6671 1+4 ? 1+3 ? 1+2 ? 1+1 ;COST OF TABBING ONE MORE AND BACKSPACING BACK
6673 ;setup routine for TYMH19, TYMAAA. Gets magnitude of horizontal and vertical
6674 ;motion in B and A, destinations in TT and D respectively, sets TTYIHP and
6676 TYMPOS: MOVE A,TTYIVP(I) ;current hardware vertical position
6677 SUBM D,A ;subtract from vertical destination
6678 CAML TT,TCMXH(I) ;if trying to move off right margin,
6679 JRST [ MOVE TT,TCMXH(I) ;pretend moving to margin
6681 MOVE B,TTYIHP(I) ;compute net chrs to position
6682 CAML B,TCMXH(I) ;if we think we moved off the end of the line,
6683 JRST [ MOVE B,TCMXH(I) ;presumably by printing in the last column,
6684 SUBI B,1 ;the cursor actually stuck in the last column
6687 SUBM TT,B ;now we have horizontal motion in B
6688 MOVEM D,TTYIVP(I) ;put vertical, horizontal destination
6689 MOVEM TT,TTYIHP(I) ;into registers (we'll be there soon).
6692 ;cursor positioning on an H19. TYMDP occasionally stuffs rubouts into the
6693 ;buffer to do its own padding, thereby resulting in ^S ^Q lossage on H19s. I
6694 ;could patch TYMDP up, but it's too silly. Generates HCUF, HCUB, HCUD, HCUU,
6696 TYMH19: PUSHJ P,TYMPOS ;get horizontal and vertical destinations, etc.
6697 MOVEI C,2 ;now flush the first two chars of cursor
6698 ADDM C,TORM(I) ;motion command (TYEEO2 will flush last)
6699 MOVE C,TOCMBF(I) ;get byte pointer to tty command buffer in C
6702 JUMPE A,TYMHOX ;if vertical magnitude 0, only moving in X
6703 JUMPE B,TYMHOY ;same for horizontal and Y
6704 TYMABS: MOVEI E,"Y ;neither is 0, abs. positioning faster
6706 ADDI D,40 ;convert line # to H19 coord system.
6708 ADDI TT,40 ;convert column # to H19 coord system
6710 TYMHDN: MOVEI E,0 ;top it off with a null
6712 MOVE A,TOCMBF(I) ;TYEEO2 wants bp in A
6713 JRST TYEEO2 ;noone seems to think it's necessary to pad
6715 TYMHOX: CAIN B,1 ;if 1 or -1, then relative positioning is
6716 JRST TYMHX2 ;plenty fast
6719 JRST TYMABS ;otherwise absolute positioning is faster
6720 TYMHX2: MOVEI E,"C ;moving forward one space
6723 TYMHX3: MOVEI E,"D ;moving backwards one space
6727 TYMHOY: CAIN A,1 ;if 1 or -1, then relative positioning is
6728 JRST TYMHY2 ;plenty fast
6731 JRST TYMABS ;otherwise absolute positioning is faster
6732 TYMHY2: MOVEI E,"B ;moving down one line
6735 TYMHY3: MOVEI E,"A ;moving up one line
6739 ;cursor positioning on an AAA. Generates either CUP, HPA, or VPA,
6740 ;whichever involves fewest chars.
6741 TYMAAA: PUSHJ P,TYMPOS ;get X-Y motion and set dests.
6742 MOVEI C,2 ;now flush the first two chars of cursor
6743 ADDM C,TORM(I) ;motion command (TYEEO2 will flush last)
6744 MOVE C,TOCMBF(I) ;get byte pointer to tty command buffer in C
6749 JUMPE B,TYMAVT ;going vertically only
6750 JUMPE A,TYMAHZ ;horizontally only
6751 JUMPE D,TYMAP3 ;if going to top line, optimize out 1st coord
6753 PUSHJ P,SNDNUM ;send vertical coord
6754 JUMPE TT,TYMAP5 ;if moving to leftmost col no second coord
6755 TYMAP3: MOVEI A,73 ;or semicolon
6758 PUSHJ P,SNDNUM ;send horizontal coord
6759 TYMAP5: MOVEI A,"H ;absolute positioning char
6761 ;going vertically only, use vertical absolute positioning
6764 MOVEI A,"d ;vertical absolute positioning char
6766 ;going horizontally only, horizontal absolute positioning
6769 MOVEI A,"` ;horizontal absolute positioning char
6770 ;fall through into done code
6772 TYMADN: IDPB A,C ;send that last char
6773 MOVEI A,4 ;padding is A*TT in ms
6774 MOVEI TT,1 ;4 ms of padding ought to be enough
6775 JRST TYDAPD ;go set it up
6777 ;Add one to the number in E, convert it to ASCII decimal, and idpb it
6778 ;in the location pointed to by the bp in C. Assumes no more than 2
6779 ;digits in E. Bashes A, B, E (B because of the IDIVI).
6782 IDIVI A,10. ;divide by 10 for high digit
6783 JUMPE A,SNDNM2 ;only one digit
6784 ADDI A,"0 ;make high digit ascii
6785 IDPB A,C ;put in buffer
6786 SUBI A,"0 ;un-ascii high digit
6787 IMULI A,10. ;find out what we printed
6788 SUB E,A ;take it from what we had to get low digit
6789 SNDNM2: ADDI E,"0 ;make low digit ascii
6790 IDPB E,C ;put in buffer
6793 TYEBS: SOSGE TTYIHP(I) ;%TDBS: OUTPUT BS.
6798 TYERCR: MOVE D,TTYIVP(I) ;%TDRCR: OUTPUT A CR (PLUS PADDING)
6802 TYERC1: SOS TORM(I) .SEE TYMOVX ;WHICH WILL ADD 3 TO TORM.
6806 TYELF: MOVE TT,TTYIHP(I) ;%TDLF: OUTPUT LF (PLUS PADDING)
6811 JRST TYELFE ;DETECT A LF THAT SCROLLS.
6814 TYELFE: SKIPN TTYROL(I) ;IF NOT A SCROLLING TTY, RESET VPOS TO 0
6816 SUB D,TTYROL(I) ;OTHERWISE, GLITCH UP
6817 MOVEM D,TTYIVP(I) ;STORE VPOS AFTER SCROLLING.
6818 SOS TTYIVP(I) ;MAKE SURE 1 LF IS OUTPUT.
6821 TYEFS: CAIN W,%TNAAA ;AAA's use a different format
6823 MOVSI E,%TCFPD ;ON SOME TTYS, IS TWO PARTS
6825 JRST TYEFS2 ;FIRST PART DONE, DO SECOND
6826 IORM E,TTYCOM(I) ;ABOUT TO DO FIRST PART
6827 CAIE W,%TNDP ;DATAPOINTS NEED PADDING
6829 JRST TYEFSD ;SO GO DO IT
6830 MOVEI A,33 ;VT52S ETC. NEED ALTMODE PREFIX
6832 JRST TYPOU2 ;SO GO DO THAT
6833 TYEFS2: ANDCAM E,TTYCOM(I) ;ABOUT TO DO SECOND PART
6834 HRRZ A,CCFS(W) ;GET CHARACTER TO SEND
6835 AOS TTYIHP(I) ;IT WILL MOVE THE CURSOR
6836 JRST TYPSIO ;SEND IT, AND ABSORB THE %TDFS
6838 TYEFSD: LDB B,[$TPPCR,,TTYOPT(I)]
6839 PUSHJ P,TYMPAD ;SET UP TTYBYP TO PAD
6840 JRST TYPLUP ;PAD THEN COME BACK HERE
6842 ;handle forward-space on AAA's
6843 TYFSAA: MOVE A,CCFS(W)
6847 TYEEOL: SKIPA A,CCEOLP(W)
6850 TYEEOF: MOVE A,CCEOFP(W)
6852 PUSHJ P,TYEEO3 ;JUMP IF OUTPUT SEQ IS mn,,TABLE
6853 TYEEO4: MOVEM A,TTYBYP(I) ;STORE BYTE POINTER OR ZERO
6854 TYEEO1: AOS TORM(I) ;FLUSH THE CURSOR CTL CMD FROM OUTPUT BFR.
6858 ;OUTPUT SEQUENCE SPECIFIED AS mn,,TABLE
6859 ;m=LOWEST PAD CODE IN TABLE, n=HIGHEST
6860 TYEEO3: LDB B,[$TPPCR,,TTYOPT(I)]
6861 LDB C,[220300,,A] ;n
6864 LDB C,[250300,,A] ;m
6868 MOVE A,(A) ;PICK UP BYTE POINTER OUT OF TABLE
6871 ;HANDLE CLEAR THE SCREEN
6872 TYECLR: SETZM TTYIHP(I) ;AFTER CLEARING, CURSOR WILL BE AT TOP LEFT
6875 ;HANDLE DELETE FWD, ON OVERPRINTING ERASABLE DISPLAYS, AND IMLACS (ACC TO %TOIML).
6876 TYEDLF: MOVE A,CCDLFP(W)
6879 ;HANDLE ENTER-INVERSE-VIDEO AND LEAVE-ALL-SUCH-MODES
6880 TYEBOW: SKIPA A,CCBOWP(W)
6881 TYERST: MOVE A,CCRSTP(W)
6884 TYEINI: MOVE A,CCINIP(W)
6887 ;REGION-SCROLL UP AND REGION-SCROLL DOWN HANDLED ONLY ON DM2500
6888 ;FOR NOW. REAL DM2500'S CAN'T DO IT, BUT CERTAIN FAKE ONES CAN.
6889 ;SOMEDAY HAIRY CODE COULD BE ADDED TO DO IT ON C100 AND VT100.
6891 TYERSD: SUBI A,%TDRSU-^U ;SEND ^U OR ^V
6894 MOVE B,TORM(I) ;MAKE SURE ARGS IN BUFFER
6896 JRST TYPEND ;NO, COME BACK LATER
6900 ILDB A,Q ;XOR 140 INTO ARGS
6908 MOVNI A,2 ;COMPENSATE FOR "PRINTING" CHARS
6912 ;HANDLE DELETE AND INSERT CHARACTERS AND LINES
6913 ;DOESN'T TRY TO BE TOTALLY HAIRY ABOUT MULTIPLE INSERT/DELETES.
6914 TYEILP: SKIPA A,CCILPP(W)
6915 TYEDLP: MOVE A,CCDLPP(W)
6918 ;if we're on an H19 we don't want to call TYDH19 from TYEICP, because
6919 ;no multiple insert char.
6920 TYEICP: MOVE A,CCICPP(W)
6921 CAIE W,%TNH19 ;if we're on an H19, no multiple insert char
6922 JRST TYEIL1 ;so hack locally, else go to main routine
6923 MOVE B,TORM(I) ;MAKE SURE REPEAT-COUNT ARGUMENT IS IN THE BUFFER
6925 JRST TYPEND ;if it's not, come back when it is
6930 TYEDCP: MOVE A,CCDCPP(W)
6931 TYEIL1: MOVE B,TORM(I) ;MAKE SURE REPEAT-COUNT ARGUMENT IS IN THE BUFFER
6933 JRST TYPEND ;IT'S NOT, COME BACK WHEN IT IS
6937 CAIN W,%TNAAA ;AAA's have a better way of doing this
6939 CAIN W,%TNH19 ;so do H19's
6941 TYEIL2: SOJG B,[DPB B,Q ;NOT LAST TIME, LEAVE DECREMENTED REQUEST IN BUFFER
6944 MOVEM A,TTYBYP(I) ;AND DO ONCE
6946 AOS TORM(I) ;OTHERWISE, REMOVE FROM BUFFER
6947 JRST TYEEO2 ;AND GO DO
6949 ;Handle insert/delete line, delete char on an H19, without weenie
6950 ;weenie. Actually enters ANSI mode for multiple insert/deletes.
6951 TYDH19: CAIG B,6 ;if we're doing < 6, non-hairy way is faster.
6952 JRST [ MOVE A,1(A) ;format of table is
6953 JRST TYEIL2 ] ; [ansicommand ? zdscommand]
6954 MOVE A,@A ;get the command char
6955 AOS TORM(I) ;flush the arg
6956 MOVE C,TOCMBF(I) ;pointer to comand buffer
6957 MOVEI E,33 ;send esc and
6959 MOVEI E,"< ;< to enter ANSI mode
6961 PUSHJ P,TYIDA2 ;send the command and set TT to arg
6962 MOVEI A,19. ;19 ms padding per operation.
6963 MOVE D,H19ZDS ;copy command to enter ZDS mode
6964 ILDB E,D ;into buffer
6965 JUMPE E,TYDAPD ;when done, go do padding
6969 H19ZDS: 440700,,[ASCIZ /
\e[?2h/] ;command to enter ZDS mode
6971 ;Handle insert/delete chars/lines on an AAA. This code avoids the
6972 ;"weenie weenie" syndrome, where lines get deleted one at a time
6973 ;(weenie weenie), and then get inserted one at a time (weenie weenie).
6974 TYIDAA: AOS TORM(I) ;flush arg from buffer
6975 MOVE C,TOCMBF(I) ;get pointer to command buffer
6976 PUSHJ P,TYIDA2 ;send command and set TT to arg
6977 MOVEI A,4 ;4 ms padding per operation
6978 JRST TYDAPD ;send the padding
6980 TYIDA2: MOVEI E,33 ;send esc
6984 MOVE E,B ;SNDNUM takes arg in E
6985 MOVE D,A ;and bashes A
6986 MOVE TT,B ;and B - so save 'em
6987 SOS E ;SNDNUM also adds 1 to its arg.
6988 PUSHJ P,SNDNUM ;send arg
6989 IDPB D,C ;send command char, which is now in D
6992 ;TYDAPD sets up the end of TOCMBF to include a null and the amount of
6993 ;padding needed, and then jumps to TYEEO2. TT contains a number that
6994 ;is multiplied by the contents of A to get the number of ms of padding
6995 ;desired. TT usually has the number of inserts or deletes in it, and
6996 ;A usually has the pad factor.
6997 TYDAPD: MOVEI D,0 ;put a null at end
6998 IDPB D,C ;now do padding - set up for TYEEO2
6999 HLRZ D,C ;did we just deposit in the lowest
7000 CAIN D,010700 ;byte in this word?
7001 JRST [ HRRZ D,C ;yes, put a 1 in the next
7006 JRST [ HRRZ D,C ;turn on the low bit in this one
7011 IMUL TT,A ;ms padding = TT * A
7012 MOVEM TT,@D ;TT usually has arg to command
7013 MOVE A,TOCMBF(I) ;pointer to beginning of buffer
7014 JRST TYEEO2 ;goes in A, where TYEEO2 wants it
7016 ;HANDLE TURN-ON-MOTOR COMMAND.
7017 TYEMTN: CAIE W,%TNTRM
7018 JRST TYEEO1 ;NO-OP EXCEPT ON TERMINETS
7019 LDB B,[$TPPLF,,TTYOPT(I)]
7020 JUMPE B,TYEEO1 ;PADDING CODE 0 => DON'T HACK THE MOTOR.
7025 ADD A,TYEMT1(B) ;CREATE A BP TO A STRING WITH THE RIGHT # OF RUBOUTS.
7028 ;THIS IS AN ASCIZ STRING OF 90. RUBOUTS.
7029 ;SOME FINAL SEGMENT OF IT WILL BE TYPED OUT.
7030 TYEMT0: REPEAT 90./5, -2
7033 TYEMT1: 010700,,TYEMT2-1
7039 ;HANDLE TURN-MOTOR-OFF COMMAND.
7040 TYEMTF: CAIE W,%TNTRM
7042 LDB B,[$TPPLF,,TTYOPT(I)]
7044 MOVE A,[440700,,[ASCIZ/
\eJ/]]
7047 ;CRLF AND CLEAR EOL.
7048 TYECRL: SETZM TTYIHP(I)
7053 MOVE A,CCROLP(W) ;HOW TO SCROLL THIS KIND OF TTY?
7056 SUBTTL TABLES OF CURSOR-CONTROL SEQUENCES
7058 ;Note that a table entry can be (for those tables which are strings):
7059 ; mn,,TABLE - m is lowest pad code in table, n is highest
7060 ; These pad codes from the $TPPCR. The appropriate
7061 ; table entry is selected, indexed by pad code.
7062 ; The table entry should look like 440700,,string.
7063 ; 440700,,string - the string is output. If the low-order
7064 ; bit of the last word in the string is set, the
7065 ; following word contains the number of milliseconds
7066 ; of padding required. (max is 200 ms at 9600 baud,
7067 ; see TYMPAD), or if this word is SETZ, a special kludge
7068 ; for Tektronix screen-clear is invoked.
7069 ; A negative number is the number of 1/8 msec of padding
7070 ; per line below the cursor. Note carefully that is in
7072 ; 0 - output nothing
7074 ; (for those tables which are characters):
7075 ; "ch - output the character
7076 ; SETZ "ch - output esc (033) followed by the character
7078 ;DATAPOINT CURSOR CONTROL CHARACTERS
7079 %DPFS==30 ;30 => FORWARD SPACE
7080 ;31 => (NON-EXISTANT)
7081 %DPUP==32 ;32 => MOVE UP
7082 ;33 => (NON-EXISTANT)
7083 %DPHD==34 ;34 => HOME DOWN (DOESN'T WORK ON OLD DATAPOINTS ABOVE 300 BAUD)
7084 %DPHU==35 ;35 => HOME UP
7087 %DPBS==10 ;BACKSPACE
7088 %DPDN==12 ;LINEFEED.
7090 CCDPSO: 0 ;PRT ;LH DIRECT POSITIONING CHAR, RH INDEX INTO CCDPSM
7091 0 ;DPT ;4.9 ESC BEFORE CHAR, 4.8 HORIZONTAL THEN VERTICAL
7103 0 ;H19's have their own routine
7104 0 ;AAA's have their own routine
7105 IFN .-CCDPSO-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCDPSO
7107 ;INSTRUCTION TO MUNG B TO CONVERT TO TERMINAL'S COORDINATE SYSTEM
7108 CCDPSM: ADDI B,1 ;IMLAC
7109 XORI B,140 ;DATAMEDIA
7110 ADDI B,40 ;VT52, TELERAY, CONCEPT-100, ETC.
7112 CCFS: 40 ;FORWARD-SPACE CHARACTER, 4.9 => IT NEEDS AN ESC IN FRONT OF IT
7126 ;the AAA entry looks strange here, but it's the right thing. TYEFS
7127 ;checks for AAA's specially, and AAA's don't use TYMDP.
7128 440700,,[.BYTE 7 ? 33 ? "[ ? "C ] ;AAA
7129 IFN .-CCFS-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCFS
7131 CCUP: 0 ;LINE-STARVE CHARACTER, - => IT NEEDS AN ESC IN FRONT OF IT
7146 ;this entry isn't here because this is a stupid word table instead
7147 ;of a winning string table.
7148 ; 440700,,[.BYTE 7 ? 33 ? "[ ? "A ] ;AAA
7149 IFN .-CCUP-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCUP
7151 CCHUP: 0 ;HOME-UP SEQUENCE POINTER
7152 440700,,[.BYTE 7 ? %DPHU] ;DPT
7153 440700,,[.BYTE 7 ? %DPHU ? %DPHU ? %DPHU] ;LSR
7160 440700,,[.BYTE 7 ? 33 ? "H] ;ESC
7161 440700,,[.BYTE 7 ? 2] ;DTM
7162 440700,,[.BYTE 7 ? 33 ? "H] ;RAY
7163 440700,,[.BYTE 7 ? 33 ? "?] ;HDS
7164 440700,,[.BYTE 7 ? 33 ? "H] ;H19
7165 440700,,[.BYTE 7 ? 33 ? "[ ? "H] ;AAA
7166 IFN .-CCHUP-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCHUP
7169 CCHD: 34_29.+177_22.+177_15.+177_8
7172 440700,,[.BYTE 7 ? 36 ? 177 ? 177 ? 177] ;DPT
7173 440700,,[.BYTE 7 ? 36 ? 36 ? 36 ? 36] ;LSR
7174 440700,,[.BYTE 7 ? ^Q] ;IMLAC
7180 440700,,[.BYTE 7 ? 33 ? "K] ;ESC
7181 440700,,[.BYTE 7 ? 27] ;DTM
7182 440700,,[.BYTE 7 ? 33 ? "K] ;RAY
7183 01,,[ 440700,,[<.BYTE 7 ? 33 ? 23>+1 ? 8.] ;HDS 300/1200
7184 440700,,[<.BYTE 7 ? 33 ? 23>+1 ? 16.] ] ;HDS 9600
7185 440700,,[.BYTE 7 ? 33 ? "K] ;H19
7186 440700,,[.BYTE 7 ? 33 ? "[ ? "K] ;AAA
7187 IFN .-CCEOLP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDEOL
7190 440700,,[.BYTE 7 ? 37 ? 177 ? 177 ? 177] ;DPT
7191 440700,,[.BYTE 7 ? 37 ? 37 ? 37 ? 37 ? 37 ? 0] ;LSR
7192 440700,,[.BYTE 7 ? ^P] ;IMLAC
7198 440700,,[.BYTE 7 ? 33 ? "J] ;ESC
7199 440700,,[.BYTE 7 ? 27] ;DTM (CAN'T CLEAR TO EOF, SO CLEAR TO EOL)
7200 440700,,[<.BYTE 7 ? 33 ? "J>+1 ? 90.] ;RAY
7201 ;HDS PAD CODES ARE 0 1200 OR LESS, 1 9600 OR MORE
7202 ; AT 9600 OR ABOVE, USE ERASE EOL INSTEAD OF ERASE EOS
7203 01,,[ ; DUE TO INABILITY TO SEND 340 (!!) MILLISECONDS OF PADDING
7204 440700,,[<.BYTE 7 ? 33 ? 3>+1 ? 170.] ;HDS 300/1200
7205 440700,,[<.BYTE 7 ? 33 ? 23>+1 ? 16.] ] ;HDS 9600
7206 440700,,[.BYTE 7 ? 33 ? "J] ;H19
7207 440700,,[<.BYTE 7 ? 33 ? "[ ? "J>+1 ? 5.] ;AAA 5 ms padding
7208 IFN .-CCEOFP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDEOF
7211 440700,,[.BYTE 7 ? 31] ;(DPT) FOR BENEFIT OF GT40
7213 440700,,[.BYTE 7 ? ^X] ;IMLAC
7225 IFN .-CCDLFP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDDLF
7230 440700,,[.BYTE 7 ? ^M ? ^K ? ^Q] ;IMLAC
7236 440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "K] ;ESC
7237 440700,,[.BYTE 7 ? ^M ? ^J ? 27] ;DTM
7238 ;NOTE: REAL DATAMEDIAS IGNORE THE ^J BUT IMITATION ONES MIGHT NOT
7239 440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "K] ;RAY
7240 440700,,[<.BYTE 7 ? ^M ? ^J ? 33 ? 23>+1 ? 16.] ;HDS
7241 440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "K] ;H19
7242 440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "[ ? "K ? 0] ;AAA
7243 IFN .-CCROLP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDCRL
7245 ;CRLF ON DATAPOINTS, DEPENDING ON LOSER-NESS AND SPEED.
7246 CCCRLP: 440700,,[.BYTE 7 ? ^M ? ^J ? 36]
7247 440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 36]
7248 REPEAT 2,440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 177 ? 36]
7250 CCCRL1: 440700,,[.BYTE 7 ? ^M ? ^J ? 36 ? 36 ? 36 ? 36]
7251 440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 36 ? 36 ? 36 ? 36]
7252 REPEAT 2,440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 177 ? 36 ? 36 ? 36 ? 36 ? 0]
7254 CCCLRP: 0 ;CLEAR THE SCREEN SEQUENCE POINTER
7255 440700,,[.BYTE 7 ? %DPHU ? 37 ? 177 ? 177 ? 177 ? 0] ;DPT
7256 440700,,[.BYTE 7 ? %DPHU ? %DPHU ? %DPHU ? 37 ? 37 ? 37 ? 37 ? 37 ? 0] ;LSR
7257 440700,,[.BYTE 7 ? ^L] ;IMLAC
7258 440700,,[<.BYTE 7 ? 33 ? 14>+1 ? SETZ] .SEE TYPBP ;TEKTRONIX
7263 440700,,[.BYTE 7 ? 33 ? "H ? 33 ? "J ? 0] ;ESC
7264 34,,[440700,,[.BYTE 7 ? 36] ;DTM
7265 440700,,[.BYTE 7 ? 36 ? 36]]
7266 440700,,[<.BYTE 7 ? 33 ? "j>+1 ? 90.] ;RAY
7267 440700,,[<.BYTE 7 ? 14>+1 ? 48.] ;HDS (RIGHT FOR 9600 BAUD, NEED HALF AS MUCH AT 300)
7268 440700,,[.BYTE 7 ? 33 ? "H ? 33 ? "J ? 0] ;H19
7269 440700,,[<.BYTE 7 ? 33 ? "[ ? "H ? 33 ? "[ >
7270 <.BYTE 7 ? "J>+1 ? 5.] ;AAA needs 5 ms padding
7272 IFN .-CCCLRP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDCLR
7283 01,,[ ;ESC padding mainly based on H19 - CBF
7284 440700,,[<.BYTE 7 ? 33 ? "L>] ; no padding at all at 1200 baud
7285 440700,,[<.BYTE 7 ? 33 ? "L>+1 ? -6.]] ; .75 ms/line at higher
7286 04,,[440700,,[.BYTE 7 ? ^P ? ^J ? ^X ? 0] ;DTM
7287 440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 3,[177 ? ] ^X ? 0]
7288 440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 5,[177 ? ] ? ^X ? 0]
7289 440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 10.,[177 ? ] ^X ? 0]
7290 440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 20.,[177 ? ] ^X ? 0]]
7291 440700,,[<.BYTE 7 ? 33 ? "L>+1 ? -20.] ;RAY (2.5ms/line)
7293 440700,,[<.BYTE 7 ? 33 ? ^R>+1 ? -14.] ;HDS AT 300/1200 (1.75ms/line)
7294 440700,,[<.byte 7 ? 33 ? ^R>+1 ? -3.*8]] ;HDS AT 9600 (3ms/line)
7295 ["L ? 01,,[ ;H19's use this table differently
7296 440700,,[<.BYTE 7 ? 33 ? "L>] ; no padding at all at 1200 baud
7297 440700,,[<.BYTE 7 ? 33 ? "L>+1 ? -6.]]] ; .75 ms/line at higher
7298 "L ;AAA (AAA's use this table differently)
7300 IFN .-CCILPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDILP
7311 01,,[ ;ESC padding mainly based on H19 - CBF
7312 440700,,[<.BYTE 7 ? 33 ? "M>] ; no padding at all at 1200 baud
7313 440700,,[<.BYTE 7 ? 33 ? "M>+1 ? -6.]] ; .75 ms/line at higher
7314 34,,[440700,,[.BYTE 7 ? ^P ? ^Z ? ^X] ;DTM
7315 440700,,[.BYTE 7 ? ^P ? ^Z ? 177 ? ^X]]
7316 440700,,[<.BYTE 7 ? 33 ? "M>+1 ? -20.] ;RAY (2.5ms/line)
7318 440700,,[<.BYTE 7 ? 33 ? ^B>+1 ? -14.] ;HDS AT 300/1200 (1.75ms/line)
7319 440700,,[<.byte 7 ? 33 ? ^B>+1 ? -3.*8.]] ;HDS AT 9600 (3ms/line)
7320 ["M ? 01,,[ ;H19's use this table differently
7321 440700,,[<.BYTE 7 ? 33 ? "M>] ; no padding at all at 1200 baud
7322 440700,,[<.BYTE 7 ? 33 ? "M>+1 ? -6.]]] ; .75 ms/line at higher
7323 "M ;AAA (AAA's use this table differently)
7324 IFN .-CCDLPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDDLP
7335 440700,,[.BYTE 7 ? 33 ? "Q ? 40 ? 10 ? 33 ? "R] ;ESC
7336 34,,[440700,,[.BYTE 7 ? ^P ? ^\ ? ^X] ;DTM
7337 440700,,[.BYTE 7 ? ^P ? 40 ? 177 ? ^X ? ^H ? 40 ? ^H ? 0]]
7338 440700,,[.BYTE 7 ? 33 ? "P] ;RAY
7339 ; The HDS requires a null in its insert char sequence so we
7340 ; resort to non 7 bit char so the typeout loop won't think its
7341 ; the end of an ASCIZ string.
7343 441100,,[<.byte 9 ? 33 ? 20 ? 40 ? 10 > ?
7344 <.byte 9 ? 33 ? 400 >] ; no padding 1200 or under
7345 441100,,[<.byte 9 ? 33 ? 20 ? 40 ? 10 > ?
7346 <.byte 9 ? 33 ? 400 >+1 ? 16.]] ; 16 ms per insert >1200
7347 440700,,[.BYTE 7 ? 33 ? "@ ? 40 ? 10 ? 33 ? "O] ;H19
7348 "@ ;AAA's use this table differently
7349 IFN .-CCICPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDICP
7360 440700,,[.BYTE 7 ? 33 ? "P] ;ESC
7361 34,,[440700,,[.BYTE 7 ? ^P ? ^H ? ^X] ;DTM
7362 440700,,[.BYTE 7 ? ^P ? ^H ? 177 ? ^X]]
7363 440700,,[.BYTE 7 ? 33 ? "Q] ;RAY
7365 440700,,[.byte 7 ? 33 ? 21] ; no padding 1200 or under
7366 440700,,[<.byte 7 ? 33 ? 21>+1 ? 16.]] ; 16 ms per del at >1200
7367 ["P ? 440700,,[.BYTE 7 ? 33 ? "N]] ;H19's also use this table differently
7368 "P ;AAA's use this table differently
7369 IFN .-CCDCPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDDCP
7373 440700,,[.BYTE 7 ? 16] ;DTM
7375 440700,,[.BYTE 7 ? 33 ? "D] ;HDS
7376 440700,,[.BYTE 7 ? 33 ? "p] ;H19
7377 440700,,[.BYTE 7 ? 33 ? "[ ? "7 ? "m] ;AAA
7378 IFN .-CCBOWP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDBOW
7382 440700,,[.BYTE 7 ? 33 ? "G] ;VT52, ETC.
7383 440700,,[.BYTE 7 ? 30] ;DTM
7385 440700,,[.BYTE 7 ? 33 ? "d] ;HDS
7386 440700,,[.BYTE 7 ? 33 ? "q] ;H19
7387 440700,,[.BYTE 7 ? 33 ? "[ ? "m] ;AAA - this is not RIS,
7388 ;which could screw you over if your default state were a bad one. It's
7390 IFN .-CCRSTP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDRST
7392 CCINIP: ;initialize an intelligent terminal
7394 440700,,[.BYTE 7 ? 33 ? "G] ;VT52, ETC.
7395 440700,,[.BYTE 7 ? 30] ;DTM
7397 440700,,[.BYTE 7 ? 33 ? "d] ;HDS
7398 440700,,[.BYTE 7 ? 33 ? "q] ;H19
7399 ;all sorts of ways the AAA can be messed up. We fix just a few.
7400 440700,,[ASCII "
\e[4;18;20l
\e[6;12h
\e[1Q
\e[>27;29;30;33;34;35;37;40;46;51l
\e[>52h
\e[H
\e["
7401 <ASCIZ "J">+1 ? 5.] ;First line must be multiple of 5 chars!
7402 ;does: turn off insert char, LF is LF, CR is CR, no destructive BS, no
7403 ;wrap forward, no wrap backward, no AUTO XON/XOFF, no half-duplex, no
7404 ;auto kbd disable(!), no alternate cursor mode. Let us clear entire
7405 ;screen, enable sending to host, turn off delete display, turn on META
7406 ;key. Finally, clears the screen, about 5 ms padding.
7407 IFN .-CCINIP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDINI
7410 SUBTTL TTY CONTROL TABLES
7412 ;TOTAL NUMBER OF TTYS
7413 NCT==NOTYS+NKSTYS+NETYS+NNTYS+NNVTTS+NDZTYS+NDPTYS+NMTYS+NDLTYS+NSTTYS+N11TYS
7415 IFGE NCT-%TINON, .ERR EXCESSIVE NUMBER OF TTYS
7417 IFG NOTYS-1, .ERR MORE THAN ONE KA-10 CONSOLE TTY?
7418 IFG NKSTYS-1, .ERR MORE THAN ONE KS-10 CONSOLE TTY?
7420 NFKSTY==NOTYS ;# OF FIRST KS-10 (BETTER BE ONLY) 8080 CONSOLE TTY
7421 NFETY==NFKSTY+NKSTYS ;# OF FIRST DTE20 TTY
7422 NFNTY==NFETY+NETYS ;# OF FIRST TK-10 TTY
7423 NFNVTY==NFNTY+NNTYS ;# OF FIRST NOVA TTY
7424 NFDZTY==NFNVTY+NNVTTS ;# OF FIRST DZ11 TTY.
7425 ; Terminals above this line have slow (char at a time) controllers
7426 ; below they have fast controllers. (Check TYPDA1: and TTYDO:)
7427 NFDPTY==NFDZTY+NDZTYS ;# OF FIRST DATAPOINT LINE
7428 NFMTY==NFDPTY+NDPTYS ;# OF FIRST MORTON TTY
7429 NFDLTY==NFMTY+NMTYS ;# OF FIRST DL10 TTY.
7430 NFSTTY==NFDLTY+NDLTYS ;# OF FIRST PSEUDO-TTY
7431 NF11TY==NFSTTY+NSTTYS ;# OF FIRST PDP11-TV TTY.
7433 IFG NKSTYS, IFN NFKSTY, .ERR KS-10 CONSOLE TTY NOT ZERO?
7434 IFG NETYS, IFN NFETY, .ERR FIRST DTE20 TTY NOT ZERO?
7436 ;INSTRUCTION TO OUTPUT 1 CHAR TO A CHAR-AT-A-TIME CONTROLLER.
7437 ;INSNS NEED NOT EXIST FOR FAST CONTROLLERS.
7438 TTYDO: REPEAT NOTYS,DATAO TTY,A
7439 REPEAT NKSTYS, PUSHJ P,TTKSDO
7441 REPEAT NNTYS,DATAO NTY,A
7442 REPEAT NNVTTS,PUSHJ P,TTNDO
7443 REPEAT NDZTYS,PUSHJ P,TTDZDO
7446 TTKSDO: ANDI A,177 ; Be sure it is ASCII
7447 TRO A,400 ; Tell 8080 there is something there.
7448 MOVEM A,8CTYOT ; Here is where it looks.
7449 CONO 80INT\APRCHN ; Wake up!
7453 IFN NDZTYS,[ ;DZ-11 Code
7455 ANDI A,177 ;Be sure it is ASCII, and no break bits set
7456 HRRZ C,TTYLT(I) ;Unibus address
7457 IOWRBI A,%DZRTD(C) ;Send it
7470 TTNDO1: MOVEM I,NVOPTT ;MUST SELECT NEW CONSOLE
7471 SETOM NVTSIP ;SIGNAL
7472 MOVEM A,NVTSSC ;SAVE CHR
7482 ;INSTRUCTION TO TELL A TTY'S CONTROLLER TO STOP INTERRUPTING FOR IT.
7483 ;(BECAUSE THERE IS NO OUTPUT TO BE SENT)
7484 TTYDFF: REPEAT NOTYS,CONO TTY,200+TTYCHN
7487 REPEAT NNTYS,CONO NTY,20+TTYCHN
7488 REPEAT NNVTTS,JRST TYP5
7489 REPEAT NDZTYS,PUSHJ P,DZTYDF
7490 REPEAT NDPTYS,CONO DPK,.RPCNT_12.+400+TTYCHN
7491 REPEAT NMTYS,CONO MTY,.RPCNT_12.+200+TTYCHN
7495 ;LINE-SPECIFIC INFORMATION
7496 TTYLT: REPEAT NOTYS,500000+TTYCHN
7499 REPEAT NNTYS,.RPCNT_12.+400000+TTYCHN
7501 REPEAT NDZTYS, <.RPCNT&DZLNM>,,<CONC DZ,\<.RPCNT_-DZLNLN>,BA>
7503 REPEAT NMTYS,.RPCNT_12.+TTYCHN
7505 ;INSN TO EXECUTE TO SIGNAL THAT OUTPUT IS AVAILABLE ON A PREVIOUSLY
7506 ;IDLE TTY - TELLS THE CONTROLLER TO CAUSE AN "OUTPUT DONE" INTERRUPT.
7507 TTYST: REPEAT NOTYS,CONO TTY,10+TTYCHN
7508 REPEAT NKSTYS, CONO 10020\APRCHN
7509 REPEAT NETYS,PUSHJ P,TTYSTE
7510 REPEAT NNTYS,PUSHJ P,NTYST
7511 REPEAT NNVTTS,PUSHJ P,NVTYST
7512 REPEAT NDZTYS,PUSHJ P,DZTYST
7513 REPEAT NDPTYS,CONO DPK,.RPCNT_12.+100+TTYCHN
7514 REPEAT NMTYS,CONO MTY,.RPCNT_12.+10+TTYCHN
7515 REPEAT NDLTYS,PUSHJ P,TTYSTD
7516 REPEAT NSTTYS,PUSHJ P,TTYPT
7519 IFN DZ11P,[ ;DZ-11 Code
7520 ; Disable transmitter ready interrupts from this line
7521 DZTYDF: PUSH P,[ANDCM B,DZLBIT(A)] ;Clear this line's bit
7524 ; Enable transmitter ready interrupts from this line
7525 DZTYST: PUSH P,[IOR B,DZLBIT(A)] ;Set this line's bit
7529 HRRZ C,TTYLT(I) ;Unibus address
7530 HLRZ A,TTYLT(I) ;Line number
7533 IOWRBI B,%DZRTC(C) ;Write new state
7540 ; DZ11 initialization.
7541 ; No parity, character length = 8 bits, stop-code = 1 bit.
7542 DZINIT: MOVEI C,NDZTYS-1 ;Relative last DZ TTY
7543 SKIPGE C ;Don't do anything if there aren't any
7545 DZINI1: LDB A,[$TTOSP,,NFDZTY+TTYTYP(C)] ;Ospeed (assume it is = Ispeed)
7546 HLRZ D,NFDZTY+TTYLT(C) ; Line number on board.
7547 HRRZ B,NFDZTY+TTYLT(C) ; Bus address of controller.
7548 SOSL A ;Is speed = 0?
7549 CAILE A,10 ;Is speed > 9600?
7550 BUG HALT,[BAD SPEED CODE FOR DZ-11. LINE],OCT,C
7551 LSH A,32. ;Assemble byte pointer
7552 IOR A,[400,,[.BYTE 4 ? 16 ? 14 ? 12 ? 10 ? 7 ? 5 ? 4 ? 2 ? 6]]
7553 LDB A,A ;Obtain DZ11 speed code
7554 LSH A,%DZLSS ;Assemble LPR code
7555 IORI A,%DZLRO+3*%DZLCL(D) ;Line # to write and various bits
7556 XCTRI [IOWRI A,%DZRLP(B)] ;Initialize this line
7558 BUG HALT,[DZ11 NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS). LINE],OCT,C
7559 SOJGE C,DZINI1 ;Loop over all DZ TTYs.
7561 IFN <NDZTYS&DZLNM>,[
7562 MOVEI C,<NDZTYS&DZLNM> ;First unused line on last used board
7563 DZINI2: IOWRI C,%DZRLP+<CONC DZ,\<NDZTYS_-DZLNLN>,BA> ; Disable line
7564 CAIGE C,DZNLN-1 ;Only disable lines on last used board
7567 MOVEI C,%DZCTE+%DZCRE+%DZCSE+%DZCMS ;Turn board on
7568 MOVEI D,377_8 ; Set all DTR bits, clear enable bits
7569 REPEAT <<NDZTYS+DZNLN-1>_-DZLNLN>,[
7570 IOWRI C,%DZRCS+<CONC DZ,\.RPCNT,BA>
7571 IOWRI D,%DZRTC+<CONC DZ,\.RPCNT,BA>
7575 ;CALLED AT CLOCK LEVEL TO EMPTY DZ INPUT SILOS TO TTY CODE
7576 ; What you really want to do is measure the average interrupt rate of
7577 ; each DZ and use this scanning approach only when the DZ is heavily
7579 DZSCAN: CONO PI,TTYOFF-1 ;No TTY or lower ints, leave clock on
7580 PUSH P,I ;Just in case
7581 REPEAT <<NDZTYS+DZNLN-1>_-DZLNLN>,[
7582 IORDI A,%DZRCS+<CONC DZ,\.RPCNT,BA>
7583 TRNN A,%DZCRD ;Character in silo?
7584 JRST CONC DZS,\.RPCNT,EN
7585 CONC DZS,\.RPCNT,LP:
7586 IORDI A,%DZRDR+<CONC DZ,\.RPCNT,BA> ;Get character from silo
7587 TRNN A,%DZDDV ;Valid character?
7588 JRST CONC DZS,\.RPCNT,EN ;Nope, done with this DZ
7590 LDB I,[.BP %DZLM,A] ;Get line # on DZ
7591 ADDI I,<DZNLN*.RPCNT>+NFDZTY
7592 CAIL I,NFDZTY+NDZTYS
7594 PUSHJ P,NTYI1 ;Send char to TTY code
7595 JRST CONC DZS,\.RPCNT,LP
7596 CONC DZS,\.RPCNT,EN:
7599 CONO PI,TTYON-1 ;Turn ints back on
7604 NTYST: PUSH P,C ;START A TK10 TTY
7606 ANDI C,177 ;SAVE WHICH PI CHANNELS ARE ON
7610 CONO PI,2000(C) ;RESTORE PI STATUS
7623 TTYPT: PUSH P,B ;TTYST ROUTINE FOR STY TTYS.
7625 MOVE B,STYSTS-NFSTTY(I) ;USER
7631 MOVE C,STYMSK-NFSTTY(I) ;CHANNELS OPEN MASK
7633 JUMPE C,POPCBJ ;JUMP IF INTS NOT ENABLED
7636 MOVE B,STYSTS-NFSTTY(I)
7640 IFN NETP,[ ;START STY THAT'S DIRECT CONNECTED TO NETWORK
7642 ANDI C,177 ;SAVE WHICH PI CHANNELS ARE ON
7645 TDNN B,STYSTS-NFSTTY(I)
7646 JRST [ CONO PI,2000(C) ? JRST TTYPT3 ]
7647 SKIPL STYNTL-NFSTTY(I)
7648 JRST TTYPT4 ;ALREADY ON ACTIVATE LIST
7650 MOVEM B,STYNTL-NFSTTY(I)
7652 TTYPT4: CONO PI,2000(C) ;RESTORE PI STATUS
7657 TTYSTE: CONO PI,400 ;PI OFF
7660 HRRZM I,DTEOST ;TELL 11 TO SET OUTPUT DONE
7662 CONO DTE,%DBL11 ;INTERRUPT 11
7665 TYSTE1: CONO PI,200 ;PI ON
7666 CONO DTE,%DBL11 ;INTERRUPT 11
7667 AOS DTEHC ;COUNT NUMBER OF TIMES HAD TO WAIT
7668 SKIPL DTEOST ;THERE'S NO WAY TO AVOID HAVING TO WAIT ONE PLACE
7669 JRST .-2 ; OR ANOTHER. THE -11 TRIES TO PICK UP OUTPUT-DONE FAST.
7679 HRRZM I,DL10SO ;TELL 11 TO SET OUTPUT DONE
7681 CONO DLC,100040+TTYCHN ;INTERRUPT 11
7684 TTYSD1: CONO PI,200 ;PI ON
7685 CONO DLC,100040+TTYCHN ;INTERRUPT 11
7686 AOS DL10HC ;COUNT NUMBER OF TIMES HAD TO WAIT
7687 SKIPE DL10SO ;THERE'S NO WAY TO AVOID HAVING TO WAIT ONE PLACE
7688 JRST .-2 ;OR ANOTHER. THE -11 TRIES TO PICK UP OUTPUT-DONE FAST.
7696 REPEAT NCT,CONC T,\.RPCNT,$!WRD
7700 IFNDEF TIBL,TIBL==41
7701 IFNDEF TOBL,TOBL==101
7705 IFNDEF MICBAA,MICBAA==50. ;MAXIMUM NUMBER OF INPUT BUFFER CHARACTERS BEFORE AUTOMATIC ACTIVATION
7707 IFNDEF TYOWNC,TYOWNC==20. ;MIN # BYTES OF SPACE THERE MUST BE
7708 ;IN OUTPUT BUFFER BEFORE IT IS OK TO TRY TO OUTPUT ANYTHING.
7710 TIB: BLOCK TIBL*NCT ;TTY INPUT BUFFERS (18 BITS PER CHARACTER)
7711 TOB: BLOCK TOBL*<NCT-N11TYS> ;TTY OUTPUT BUFFERS (8 BITS PER CHARACTER)
7714 %TXMPE==400000 ;MAIN PROGRAM ECHO CHARACTER
7715 %TXPIE==200000 ;PI ECHO CHARACTER
7716 %TXCOM==100000 ;COM MODE ECHO CHAR; DO PI ECHO EVEN IF HDX TTY.
7717 %TXIGN==40000 ;IGNORE THIS CHAR AT .IOT TIME.
7718 %TXACT==20000 ;THIS IS AN ACTIVATION CHAR.
7719 %TXINT==10000 ;THIS CHAR SHOULD INTERRUPT THE USER.
7721 ;NOW COME THE BITS OF THE CHARACTER ITSELF:
7722 %TXTOP==4000 ;"TOP" KEY.
7723 %TXECI==2000 ;ECHOED DUE TO ECHOIN SYSTEM CALL
7724 ;%TXSFT==1000 ;"SHIFT" KEY.
7725 %TXSUP==1000 ;"SUPER" KEY.
7726 %TXMTA==400 ;"META" KEY.
7727 %TXCTL==200 ;"CONTROL" KEY.
7728 %TXASC==177 ;THE ASCII PART OF THE CHARACTER.
7729 ;%TXTOP+CERTAIN LETTERS ARE MAGIC KEYS. %TXTOP+"Z IS DEFERRED CALL.
7732 %TXDIS==200 ;1 => THIS IS A %TD CHARACTER.
7733 IF2 EXPUNGE %TXDIS ;SO %TX BIT TYPEOUT MODE LOOKS NICE.
7735 TIIP: REPEAT NCT, (002200)TIB-1+.RPCNT*TIBL+TIBL ;INPUT BUFFER INPUT POINTER
7736 TIOP: REPEAT NCT, (002200)TIB-1+.RPCNT*TIBL+TIBL ;INPUT BUFFER OUTPUT POINTER
7737 (002200)TIB-1 .SEE TTEBAK
7738 TIBEP: REPEAT NCT, (002200)TIB-1+.RPCNT*TIBL+TIBL ;END OF INPUT BUFFER POINTER
7739 TOIP: REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL ;OUTPUT BUFFER INPUT POINTER
7741 TOOP: REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL ;OUTPUT BUFFER OUTPUT POINTER
7743 TOBEP: REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL+TOBL ;END OF OUTPUT BUFFER POINTER
7745 TOBBP: REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL ;BEG OF OUTPUT BUFFER POINTER
7747 TINTP: REPEAT NCT,2200,,TIB-1+.RPCNT*TIBL+TIBL ;INTERRUPT CHARACTER POINTER
7748 ECHOC: REPEAT NCT,0 ;COUNT OF ECHO BUF CHARS THAT ARE REALLY ECHO CHARS
7749 ECHOP: REPEAT NCT,2200,,TIB-1+.RPCNT*TIBL+TIBL ;POINTER TO INPUT CHARACTER TO BE ECHOED NEXT
7750 TINTC: REPEAT NCT,0 ;COUNT OF CHARACTERS AVAILABLE FOR .ITYIC'ING.
7751 TICC: REPEAT NCT,0 ;TYPE IN CHARACTER COUNT
7752 TACC: REPEAT NCT,0 ;ACTIVATION CHARACTER COUNT
7753 TORM: REPEAT NCT,TOBS ;# CHARS ROOM LEFT IN OUTPUT BUFFER.
7754 TOCMBF: REPEAT NCT,440700,,TCMBLK+.RPCNT*5 ;5-word string buffer for each
7755 TCMBLK: BLOCK NCT*5 ;tty for outputting commands that are longer than a few chars.
7757 TTYERQ: REPEAT NCT,-1 ;LIST OF TTYS NEEDING ECHO LINKED THRU THESE WDS. (NIL = 200000,,)
7758 ;-1 FOR TTY NOT NEEDING ECHO.
7759 TYOSW: REPEAT NCT,-1 ;AOSE-STYLE SWITCH FOR MP USE OF TTY.
7760 TTNTO: REPEAT NCT,0 ;# CHANNELS TTY IS OPEN ON (IN ALL JOBS.)
7761 TYIMSK: REPEAT NCT,0 ;BIT SET FOR EACH CHANNEL THE TTY IS OPEN FOR
7762 ;INPUT ON IN THE JOB THAT OWNS THE TTY NOW.
7763 TYOMSK: REPEAT NCT,0 ;SIMILAR, BUT FOR OUTPUT CHANNELS.
7764 TTYBYP: BLOCK NCT ;NOT 0 => B.P. TO ASCIZ STRING TO OUTPUT AT INT. LVL.
7765 TTLTM: REPEAT NCT,0 ;TIME LAST CHRWAS REMOVED FROM OUTPUT BUFFER.
7766 TTYOAC: REPEAT NCT,-1 ;-1 IF TTY OUTPUT INACTIVE
7767 TTITM: REPEAT NCT,0 ;TIME OF LAST TYPE-IN ON TTY (NOT USED BY SYSTEM).
7768 TTYLJB: REPEAT NCT,0 ;LAST JOB TO OUTPUT TO THIS TTY. DOES NO HARM IF ABSURD.
7770 TTYIPC: REPEAT NCT,[
7771 IFG APL,IFE APL-.RPCNT, TTYIS5 ;JUST STORE AND EXIT FOR AP LINE.
7772 .ELSE TTYI ;TTY INPUT PC
7774 TYBPC: REPEAT NCT,TYBN ;PC OF ^\-HANDLING CO-ROUTINE.
7775 TTOALC: REPEAT NCT,-1 ;LH IS -1 TO ALLOW M.P. TYPEOUT, OR 0 TO DELAY IT.
7776 ;RH IS OUTPUT ALLOCATION: -1 => INFINITY (THE NORMAL CASE),
7777 ;ELSE # OF CHARS ALLOWED TO BE OUTPUT. ^\ COMMANDS ARE
7778 ;USED BY THE TTY TO ALLOCATE FOR OUTPUT.
7780 TCMXV: TTYREP VER ;MAX LINES VERT
7781 TCMXH: TTYREP HOR ;MAX CHR HORZ
7782 TTYROL: TTYREP ROL ;# LINES PER GLITCH WHEN SCROLLING.
7783 TTYIHP: REPEAT NCT,30. ;INT LVL HPOS
7784 TTYIVP: REPEAT NCT,5 ;INT LVL VPOS
7785 TTYLPP: REPEAT NCT,<TPLEN*2*.RPCNT>#-1
7786 ;IDX OF PC PPR ASSOCIATED WITH TTY,
7787 ;OR NEGATIVE => NONE NOW ASSOCIATED,
7788 ;AND IS 1'S COMP. OF IDX OF PC PPR
7789 ;FORMERLY ASSOCIATED.
7790 TTYEPP: REPEAT NCT,<TPLEN*2*.RPCNT> ;IDX OF PC PPR TO USE FOR ECHO.
7791 TTYLPS: REPEAT NCT,5,,30. ;IF TTYLPP <0, THIS IS MAIN PRGM VPOS,,HPOS.
7793 TPBEG: ;BEGINNING OF PC PPR VARS.
7794 TPHB: ;USE 0 ;HPOS OF LEFT MARGIN.
7795 TPVB: BLOCK 1 ;VPOS OF TOP MARGIN (1ST LINE OF PC PPR)
7796 TPHE: ;USE TCMXH ;HPOS OF 1ST COLUMN AFTER RIGHT MARGIN
7797 TPVE: ;USE TCMXV ;VPOS OF 1ST LINE BELOW BOTTOM MARGIN
7798 TPHP: BLOCK 1 ;HORIZONTAL POSITION OF CURSOR
7799 TPVP: BLOCK 1 ;VERTICAL POSITION OF CURSOR
7800 TPVM: BLOCK 1 ;NUMBER OF LINES BEFORE A **MORE** IS ALLOWED
7801 TPSP: BLOCK 1 ;SAVED CURSOR POS (FOR ^PS AND ^PR)
7802 TPFLAG: BLOCK 1 ;HOLDS RANDOM FLAGS.
7804 %TFEOP==1 ;1 => HAVE JUST ENTERED LAST LINE OF PC PPR.
7805 ;NEXT ATTEMPT TO OUTPUT SHOULD DO **MORE** PROC.
7806 %TFIGL==2 ;1 => LAST CHAR WAS CR NOT IN IMAGE MODE.
7807 ;IF NEXT CHAR IS LF, IGNORE IT.
7812 REPEAT 2*NCT,[ ;NOW ASSEMBLE INITIAL CONTENTS OF PC PPR VARS.
7814 0+IFE .RPCNT&1,30. ;TPHP & TPVP: NONZERO FOR MAIN PRGM.
7818 EXPUNG TPHB,TPHE,TPVE
7820 IFN .-TPBEG-NCT*TPLEN*2,.ERR
7822 COMT1: BLOCK NCT ;COM TEMPORARY STORAGE
7823 COMT3: BLOCK NCT ;DITTO. WHILE QUERYING FOR A LINK, THIS IS -1 IF
7824 ;IN IEC MODE, WHICH MEANS OK TO PASS TYPEIN THROUGH
7825 DZLBIT:: ; Also Line number bits for DZ11
7826 CHNBIT: REPEAT 20,1_<.RPCNT>
7828 ;DATA POINT CONTROLLER LINE VARIABLES
7829 ;THIS ARRAY LOOKED AT BY HARDWARE
7831 IFNDEF LDBFF,LDBFF==10. ;LENGTH OF OUTPUT BUFFER^2 (PER LINE)
7834 DPKBAS: REPEAT NDPTYS,[
7836 (440701,,0) ;BYTE PNTR
7839 DBBFP: REPEAT NDPTYS, 440700,,DBBF+.RPCNT*LDBFF ;PNTRS TO OUTPUT BUFFER
7840 DPKC: REPEAT NDPTYS, DPKBAS+2*.RPCNT ;PNTR TO HARDWARE COUNT WORD
7841 DPKP: REPEAT NDPTYS, DPKBAS+2*.RPCNT+1 ;PNTR TO BUFFER PNTR WD
7842 DBBF: BLOCK LDBFF*NDPTYS ;OUTPUT BUFFER
7855 DBBCC: 0 ;CHRS REMAINING IN CURRENT BLOCK
7856 ;FOR DPK, SET ACC. TO OUTPUT SPEED, TO
7857 ;REPRESENT APPROX. 100MS TYPEOUT TIME.
7860 DBBCC1: 0 ;INITTED LIKE DBBCC, BUT NOT DECREMENTED.
7862 DBBBP: 0 ;BYTE PNTR TO DBBF BUFFER OR MTYOW.
7864 ;MORTON BOX LINE VARIABLES
7866 MTYOW: 0 ;UP TO 5 CHARS TO BE OUTPUT PUT IN THIS WD.
7867 MTYNC==5 ;NUMBER OF CHARS PACKED IN ABOVE WORD.
7870 ;DTE20 VARIABLES OTHER THAN THOSE IN LOW CORE
7871 ;I.E. NOT (DIRECTLY) REFERENCED BY 11
7873 DTEHC: 0 ;NUMBER OF TIMES LOOPING AT TTYSTE
7874 DTECNI: 0 ;CONI DTE, AT LAST INTERRUPT
7875 DTEBBY: 0 ;NON-ZERO => BUFFER BUSY WITH TRANSFER IN PROGRESS
7876 ; FOR DEBUGGING, THE NON-ZERO VALUE IS THE DTEOUT COMMAND.
7877 DTEBBT: 0 ;TIME-OUT IN HALF-SECOND UNITS
7878 DTEOBL==200 ;NUMBER OF CHARACTERS IN OUTPUT BUFFER
7879 DTEOBF: BLOCK <DTEOBL+3>/4 ;TTY OUTPUT BUFFER
7883 NOVATT: -1 ;TTY # NOVA CONNECTED TO -1 IF NONE
7884 NVIPTT: -1 ;CURRENT NOVA PSEUDO TTY ON INPUT
7885 NVOPTT: 0 ;CURRENT NOVA PSEUDO TTY ON OUTPUT
7886 NVTSIP: 0 ;-1 IF NOVA TTY SELECT IN PROGRESS (OUTPUT)
7887 NVTSSC: 0 ;CHAR SAVED HERE DURING NVTSIP -1
7888 NVTCC: 0 ;# CHARS SENT TO CURRENT TTY SINCE RESCANING OTHER PSEUDO TTYS
7889 NNVSEC: 0 ;LAST CONSOLE TO CHECK IN TYP0 SEARCH
7890 NNVSFL: 0 ;-1 IF SERVING PREV SELECTED
7891 ;IE IF IT CRAPS OUT, SEARCH EVEN THO IT = NNVSEC
7895 ;PDP11-TV COMMUNICATION VARIABLES:
7897 TT11HD: .+1 ;ADDR (IN PDP10 ADDRESS SPACE) OF PDP11 CHANNEL
7898 0 ;HEADER AREA. IF @TT11HD IS NONZERO, THERE
7899 ;IS INPUT TO BE PROCESSED.
7901 TT1111: 0 ;# TV'S THE 11 IS SET UP FOR
7902 TT11RL: 0 ;# TV'S IN USE = MIN (TT1111, N11TYS).
7903 TT11OL: 0 ;# PDP10 WORDS IN A PDP11-TV OUTPUT BUFFER.
7904 TT11ER: BLOCK 6 ;FILLED WHEN BAD DATA COMMING FROM PDP11
7907 TT11LO=400000+TTPG0*2000 ;BEGINNING OF PDP11 MEMORY IN PDP10 ADDRESS SPACE.
7908 TT11HA==10+TT11LO ;PDP10 ADDR OF PDP11'S 40 (CHNL HDR AREA ADDR)
7909 TT11UP==TT11HA+2 ;PDP10 ADDR OF "11 UP" FLAG.
7910 TT11DN==TT11UP+1 ;PDP10 ADDR OF "11 ABOUT TO GO DOWN" FLAG.
7912 $11==1,,777700 ;DEFINE B.P.'S TO PDP11 FIELDS OF A PDP10 WORD.
7913 $11WD0==242000 ;LOW (EVEN) 11 WORD
7914 $11WD1==042000 ;HIGH (ODD) 11 WORD
7916 $11AD0==261600 ;LOW 11 WORD, SHIFTED DOWN 2 (FOR CONVERTING 11-ADDRESS TO 10 ADDRESS).
7917 $11AD1==061600 ;HIGH 11 WORD, SHIFTED DOWN 2
7919 $11BY0==241000 ;LOWEST 11 BYTE. EACH 10-WORD HOLDS 4 11-BYTES.
7920 $11BY1==341000 ;NEXT 11 BYTE
7921 $11BY2==041000 ;THIRD BYTE
7922 $11BY3==141000 ;FOURTH BYTE
7924 ;FORMAT OF AN INPUT BUFFER: (ALL POINTERS ARE PDP11 ADDRS)
7925 ;PDP11 WORD #, ... MEANING.
7926 ; 0 ... 0 => FREE, ELSE -<# DATA CHARS>.
7927 ; 1 ... ZERO, ALWAYS.
7928 ; 2 ... -> NEXT BUFFER FOR THIS TTY.
7929 ; 3 ... -> NEXT ACTIVE BUFFER.
7930 ; 4 ... KEYBOARD NUMBER (= <TTY #>-NF11TY)
7931 ; 5+ ... DATA CHARS, 1 PER PDP11 WORD.
7933 ;FORMAT OF AN OUTPUT BUFFER:
7934 ;STARTS AT A MULTIPLE-OF-FOUR PDP11 ADDRESS, HAS A BUNCH OF BYTES,
7935 ;TT11BY BITS PER BYTE (USED TO BE 16, NOW 8). BYTES ARE IN PDP10 ORDER.
7936 ;AFTER THE PDP11 PICKS UP A BYTE OUT OF THE BUFFER, IT STORES BACK -1,
7937 ;WHICH TELLS THE 10 THAT IT IS OK TO STORE ANOTHER BYTE THERE.
7943 DZXINC: 0 ;Count of DZ transmit interrupts
7944 DZXCHC: 0 ;Count of DZ transmit characters
7946 DZDCRQ: 0 ;Disconnect requests
7947 DZCORQ: 0 ;Connect requests.
7948 IFG NDZTYS-36.,.ERR Too many DZ TTYS, fix code using DZDCRQ or DZCORQ
7951 LOCTTY: 0 ;CONSOLE INPUT CHAR READ FROM
7952 LTTYIPC:0 ;TTYIPC USED IN LAST INPUT INT (DEBUGGING ONLY)
7953 LTYBPC: 0 ;TYBPC USED IN LAST INPUT INT (DEBUGGING ONLY)
7954 LEPCHR: 0 ;-1 IF CURRENT INPUT CHAR IS A LOCAL EDITING PROTOCOL COMMAND CHAR.
7957 TTYACS: BLOCK 17-B+1
7958 IFN KA10P, TTYAPC: 0 ;APR CONI AT TTYBRK.
7959 TTYPDP: -LTTYP,,TTYPDL-1
7963 LPTTTY: TTLPTP ;TTY# THAT IS REALLY LPT
7964 LPTTIME: 0 ;LAST TIME SYSTEM GOT INPUT FROM LPT
7967 STYMAX: NCT ;Highest-numbered STY to be allocated (for limiting load)
7968 STYOSW: -1 ;PSEUDO TTY OPEN SWITCH
7971 TTERQS: MOVE ;LIST (THREADED THRU TTYERQ) OF TTYS NEEDING ECHOING.
7972 ;"MOVE" (= 200000,,) IS THE END OF THE LIST.
7973 ;OTHERWISE, A POINTER IS THE NUMBER OF A TTY
7974 ;WHOSE TTYERQ VAR. HOLDS THE NEXT POINTER.
7976 TTEDMY: 0 .SEE TYOPV0 ;DUMMY VARIABLE BLOCK
7977 0 .SEE TYOPV1 ;PASSED BY ECHO ROUTINE
7978 TTEDMY .SEE TYOPV2 ;TO .IOT RTNS.
7979 0 .SEE TYOPV3,TTELUP
7981 NTTELU: 0 .SEE TTELUP ;ECHOING STATISTICS.
7982 NTTEWA: 0 .SEE TTEWAT
7983 NTTEL1: 0 .SEE TTELP1
7985 STYNTO: BLOCK NSTTYS ;NUMBER TIMES PSEUDO TTY OPEN
7986 STYMSK: REPEAT NSTTYS,0 ;BIT FOR EACH CHNL STY OPEN FOR INPUT ON
7987 STYOMS: REPEAT NSTTYS,0 ;OUTPUT
7988 STYSTS: REPEAT NSTTYS,0 ;STY STATUS 0 => FREE SLOT
7989 ;RH = USER INDEX THAT HAS IT OPEN
7990 %SSHNG==400000 ;4.9 = 1 => DON'T HANG ON INPUT IOTS
7991 %SSUSE==200000 ;4.8 = 1 => IN USE
7992 %SSINT==100000 ;4.7 = 1 => HAVE GIVEN INT ON STY OUTPUT CHNS ALREADY
7993 %SSONT==040000 ;4.6 = 1 => DITTO FOR STY INPUT (TTY OUTPUT)
7994 %SSOHG==20000 ;4.5 = 1 => DON'T HANG ON OUTPUT IOT
7995 %SSORS==10000 ;4.4 = 1 => THIS STY WANTS %TDORS WHEN A
7996 ;TTY OUTPUT RESET IS DONE.
7998 %SSNET==4000 ;4.3 = 1 => THIS STY CONNECTED TO SOME NET SOCKETS.
7999 %SSCHA==2000 ;4.2 = 0 FOR ARPANET, 1 FOR CHAOS NET
8000 %SSTCP==1000 ;4.1 = 1 for TCP internet (%SSCHA must be 0)
8002 STYNTI: REPEAT NSTTYS,-1; If %SSNET set, holds net connection identifier.
8003 ; NCP: Input IMSOC idx,,Output IMSOC idx
8004 ; CHA: connection index
8005 ; TCP: TCB (connection) index
8007 STYNTA: 0 ;HEAD OF LIST OF DIRECT-CONNECTED STYS NEEDING DATA XFER.
8008 ;0 IS NIL; A TTY # POINTS TO A STY.
8009 STYNTB: 0 .SEE STYNTC ;COPIED STYNTA LIST USED INSIDE STYNTC ONLY
8010 STYNTL: REPEAT NSTTYS,-1;STYNTA LIST THREADED THROUGH THIS TABLE.
8011 ;+ NEXT TTY IN LIST, 0 END OF LIST, - NOT IN LIST
8012 STYORC: REPEAT NSTTYS,0 ;OUTPUT-RESET CHARACTERS, 8-BIT BYTES TERMINATED BY 0
8013 TYPNTF: 0 ;-1 WHILE TYP BEING CALLED FROM STYNT0
8014 NTORFU: 0 .SEE TYPOR3
8017 STYICH: 0 ;TEMP STORAGE FOR PSEUDO-TTY INPUT CHAR
8019 TCTYP: TTYREP TCT ;THIS WORD SAYS HOW TO PERFORM
8020 ;CURSOR CTL FUNCTIONS ON TTY.
8021 %TNPRT==0 ;PRINTING TTY.
8022 %TNDP==1 ;TTY USES DATAPOINT CURSOR CTL CODES.
8023 %TNODP==2 ;LOSING DATAPOINT (ML-KA HAS SOME).
8024 %TNIML==3 ;TTY USES IMLAC CURSOR CODES.
8025 %TNTEK==4 ;TEKTRONIX 4000 SERIES
8026 %TNTV==5 ;TTY IS A KNIGHT TV DISPLAY.
8027 %TNMEM==6 ;MEMOWRECK
8028 %TNSFW==7 ;"SOFTWARE" TTY THAT WANTS I.T.S. CURSOR-MOTION CODES.
8029 %TNTRM==10 ;TERMINET
8030 %TNESC==11 ;TTY WANTING STANDARD ASCII ESCAPE SEQUENCES
8031 %TNDTM==12 ;DATAMEDIA
8032 %TNRAY==13 ;TELERAY 1061
8033 %TNHDS==14 ;HDS CONCEPT-100
8038 ;TTYOPT WORD DESCRIBES CHARACTERISTICS OF THE PARTICULAR
8039 ;TERMINAL ATTACHED TO EACH LINE.
8042 ;LEFT HALF BITS ARE:
8043 %TOALT==200000 ;4.8 => STANDARDIZE ALTMODES.
8044 %TOCLC==100000 ;4.7 => CONVERT LOWER CASE TO UPPER.
8045 %TOERS==40000 ;4.6 => THIS TTY CAN SELECTIVELY ERASE.
8046 %TOHDX==20000 ;4.5 => THIS TTY IS HALF-DUPLEX.
8048 %TOMVB==10000 ;4.4 => THIS TTY CAN BACKSPACE.
8049 %TOSAI==4000 ;4.3 => THIS TTY HAS SAIL CHAR SET ON OUTPUT.
8050 %TOSA1==2000 ;4.2 INIT %TSSAI OF NEW JOBS.
8051 %TOOVR==1000 ;4.1 => THIS TTY CAN OVERPRINT SUCCESSFULLY.
8052 %TOMVU==400 ;3.9 => THIS TTY CAN MOVE CURSOR UP (IS A DISPLAY).
8053 %TOMOR==200 ;3.8 => DO **MORE** PROCESSING ON THIS TTY
8054 ;(ACTUALLY JUST USED TO INIT %TSMOR FOR NEW JOBS).
8055 %TOROL==100 ;3.7 SIMILARLY, INIT %TSROL FOR NEW JOBS.
8056 %TORAW==40 ;3.6 => SUPPRESS CURSOR MOTION OPTIMIZATION.
8057 %TOLWR==20 ;3.5 => THIS TTY HAS LOWER CASE KEYBOARD.
8058 %TOFCI==10 ;3.4 => THIS TTY CAN INPUT 12-BIT CHARACTERS (HAS FULL KEYBOARD).
8059 %TOIML==4 ;3.3 => IMLAC, HANDLES CURSOR MOTION STRANGELY.
8060 %TOLID==2 ;3.2 => LINE INSERT AND DELETE WORK
8061 %TOCID==1 ;3.1 => CHARACTER INSERT AND DELETE WORK
8065 $TPPLF==170300 ;3-BIT FIELD SAYING HOW TO PAD LF.
8066 ;0 - DON'T. 1 - MEMOWRECK, 2741. 2 - TERMINET.
8068 $TPPCR==140300 ;3-BIT FIELD SAYING HOW TO PAD CR.
8069 ;7 - UNUSED. 6 - MEMOWRECK. 5 - 2741. 4 - EXECUPORT.
8070 ;0 - DON'T. 1 - NORMAL. 2 - DOUBLE.
8071 ;ON DATAPOINTS, = # CHARS PADDING NEEDED FOR ALL CURSOR MOTION.
8072 ;4 IS RIGHT FOR 2400 BAUD; 3, FOR 1200.
8073 ;ON TERMINETS, 0 => NO PADDING, OTHER CODES ARE
8074 ;1 FOR 10CPS, 2 FOR 15CPS, 3, 4, 5 FOR 30, 60, 120 CPS.
8075 %TPPCW==6 ;FOR MEMO WRECK.
8077 $TPPTB==110300 ;3 BIT FIELD SAYING HOW MUCH PADDING NEEDED AFTER TAB.
8078 ;0 => TABS NOT ALLOWED; ELSE 1 +<# PADDING CHARS NEEDED>
8079 %TPMTA==400 ;1.9 => HARDWARE META KEY SETS 8TH BIT
8080 %TPPRN==200 ;1.8 => INTERCHANGE () WITH [] ON INPUT
8081 %TPTEL==100 ;1.7 => TREAT CRLF INPUT AS CR FOR TELNET PROTOCOL
8082 %TPCBS==40 ;1.6 => ENABLE SPECIAL TREATMENT OF 034 ("CONTROL BACK SLASH") ON INPUT.
8083 ;(THE "INTELLIGENT TERMINAL PROTOCOL").
8084 %TP11T==20 ;1.5 => PDP-11 TV TTY. REFLECTS %TY11T.
8085 ;NOT SETTABLE BY USER.
8086 %TPORS==10 ;1.4 => OUTPUT RESET ON THIS TTY SHOULD REALLY DO SOMETHING.
8087 %TPRSC==4 ;1.3 => THIS TTY SUPPORTS %TDRSU, %TDRSD
8089 ;SMARTS VARIABLE, %TQ IN LH, %TR IN RH, BIT DEFINITIONS IN BITS >
8094 TTYST1: REPEAT NCT,0 ;FIRST SIX GROUPT (SIX BITS PER GROUP)
8095 TTYST2: REPEAT NCT,0 ;SECOND SIX GROUPS (SIX BITS PER GROUP)
8096 TTYSTS: REPEAT NCT,%TSFRE,,-1 ;MODE BITS FOR TTY
8098 ;GROUP NUMBER CHARACTERS
8099 ;[ 0 ^A-^F ^K-^L ^N-^R ^T-^Z ^] ^^ ^_ ^@ ^\
8100 ; 1 A-Z LOWER CASE A-Z
8102 ; 3 !"#$(DOLLAR)%&',.:;?@\ (ACCENT GRAVE) (VERTICAL BAR) (TILDE)
8104 ; 5 <>[]() (LEFT BRACE) (RIGHT BRACE)
8105 ; 6 ^G ^S (^S IS IN GROUP 0 AS FAR AS %TGIMG IS CONCERNED)
8110 ; 13 SPACE ^H(BACKSPACE)
8112 ;TTYST1 HAS GROUPS 0 THROUGH 5 FROM LEFT TO RIGHT
8113 ;TTYST2 HAS 6 THROUGH 13
8114 ;EACH GROUP HAS SIX BITS AS FOLLOWS:
8115 %TGINT==1 ;N.1 => INTERRUPT ON THIS GROUP
8116 %TGACT==2 ;N.2 => ACTIVATE ON THIS GROUP (FOR SWAPPING)
8117 %TGSPC==4 ;N.3 => SPECIAL HACKS. (THIS SET ON GROUP 1 => CONVERT LOWER CASE INPUT)
8118 %TGIMG==10 ;N.4 => IMAGE MODE OUTPUT (N.4=0 => ASCII MODE)
8119 ;N.6-N.5 => ECHO MODE
8121 %TGPIE==20 ; 01 => PI ECHO (ECHO CHARACTER WHEN TYPED)
8122 %TGMPE==40 ; 10 => MAIN PROGRAM ECHO (ECHO WHEN MAIN PROGRAM RECEIVES CHARACTER)
8124 ;TTYSTS HAS RANDOM BITS ASSOCIATED WITH THE TELETYPE
8125 %TSFRE==400000 ;4.9 => TTY FREE
8126 %TSCLE==200000 ;4.8 => ECHO ^L AS UPARROW-L EVEN ON DISPLAYS
8127 ;(OTHERWISE WOULD ECHO AS CLEAR SCREEN)
8128 %TSHDX==100000 ;4.7 REFLECTS %TOHDX BIT.
8129 %TSFCO==040000 ;4.6 => HANDLE 9-BIT CHARS ON OUTPUT, USING ALPHA, BETA.
8130 %TSALT==020000 ;4.5 => DON'T STANDARDIZE ALTMODE.
8131 %TSROL==010000 ;4.4 => SCROLL MODE.
8132 %TSSAI==004000 ;4.3 => ECHO AND ASCII MODE SHOULD USE SAIL CHAR SET.
8133 %TSACT==002000 ;4.2 => GOBBLE NEXT CHAR REGARDLESS OF ACTIVATION STATUS
8134 %TSNEA==001000 ;4.1 => DON'T ECHO IN THE ECHO AREA. ECHO IN M.P. AREA.
8135 %TSINT==000400 ;3.9 => INT ON NEXT CHAR REGARDLESS
8136 %TSMOR==000200 ;3.8 => INHIBIT **MORE**.
8137 %TSATY==000100 ;3.7 SET BY .ATTY, SAYS TTY WAS TAKEN AWAY & RETURNED.
8139 %TSNOE==000010 ;3.4 => DEFER ECHOING, AND MAKE INPUT IOT'S ACT AS IF %TIECH=1.
8140 %TSLCZ==000004 ;3.3 => LAST CHARACTER TYPED WAS ^Z (NOT PRECEEDED BY ^_)
8141 %TSSII==000002 ;3.2 => SUPER IMAGE INPUT MODE
8142 %TSCNS==000001 ;3.1 => CONSOLE
8147 TTYSTA: REPEAT NCT,%TACFM,, ;NOT SAVED AT ATTY
8148 %TACFM==400000 ;4.9 = 0 => NEEDS TO HAVE CONSOLE FREE MSG EVENTUALLY TYPED
8149 ; CLEARED BY OPEN OR ZFLAG WHEN INITIALIZING CONSOLE PROCEDURE
8150 ; SET BY SYS JOB AFTER TYPING CONSOLE FREE MSG
8151 ;WHEN THIS BIT IS 0, TTY ISN'T AVAILABLE FOR BEING GOBBLED DOWN
8153 %TACTZ==200000 ;4.8 ON => TTY IS FREE AND BEING ^Z'D, SO EVEN THOUGH IT APPEARS
8154 ;OTHERWISE TO NEED A CONSOLE-FREE MESSAGE IT SHOULDN'T GET ONE.
8155 %TANJS==100000 ;4.7 ON => TTY IS BEING ^Z'D, BUT THERE ARE NO JOB SLOTS.
8156 ;4.8 WILL BE ON AND 4.9 OFF. SYS JOB WILL RESTORE ALL TO NORMAL
8157 ;AFTER TYPING "SYSTEM FULL" ON THE TTY.
8158 %TANEC==070000 ;4.6-4.3 NUMBER OF FOLLOWING CHARS TO INHIBIT ECHO AND INTS FOR.
8159 ;THIS IS USED FOR THE ARG CHARS THAT FOLLOW TOP-E, TOP-S, TOP-Y, ETC.
8161 TTYCOM: REPEAT NCT,0,,-1 ;COMMUNICATE WORD
8162 ;4.9 => TTY IN COMMUNICATE MODE
8163 %TCLFT==200000 ;4.8 => LOCAL FEED THROUGH (SET IF MY PRGM RECIEVING HIS CHRS)
8164 %TCRFT==100000 ;4.7 => REMOTE FEED THROUGH (SET IF HIS PRGM RECIEVING MY CHRS)
8165 %TCICO==40000 ;4.6 => INPUT COMMUNICATE OVERRIDE (SET IF MY CONSOLE FEEDING MY
8166 ; PRGM EVEN THO IN COMM MODE). ALSO IMPLIES OUTPUT OVER-RIDE.
8167 %TCOCO==20000 ;4.5 => OUTPUT COMMUNICATE OVERRIDE (SET IF MY PRGM'S OUTPUT TO APPEAR ON MY CONSOLE ONLY EVEN THO IN COM MODE)
8168 ;4.4-4.3 => MESSAGE RECEIPT SWITCH
8170 %TCRFS==10000 ;10 => REFUSE
8171 %TCQRY==4000 ;01 => INTERROGATE
8172 %TCMTR==2000 ;4.2 SET FOR TTY WHOSE MOTOR IS OFF & MUST BE TURNED
8173 ;ON BEFORE ANY OTHER OUTPUT IS DONE.
8174 ;(ONLY TERMINETS HAVE THEIR MOTORS SHUT OFF BY ITS).
8175 %TCECH==1000 ;4.1 THE OUTPUT BUFFER CONTAINS ECHOING OUTPUT.
8176 ;THIS MAKES OUTPUT RESET DO NOTHING.
8177 ;THE BUFFER MUST NOT CONTAIN ECHO OUTPUT AND NORMAL OUTPUT AT ONE TIME.
8178 %TCDET==200 ;3.8 CONSOLE'S TREE DETACHED BY TOP LEVEL INTERRUPT.
8179 ;SET BY NDETAC AS SIGNAL TO SYSCFM (CNSL-FREE-MSG TYPER)
8180 %TCDNG==100 ;3.7 => TYPE BELL ON TTY (BECAUSE INPUT BFR FULL).
8181 %TCCBK==40 ;3.6 => READING UNAME OR TTY # AFTER ^_K.
8182 %TCCBS==20 ;3.5 => READING UNAME OR TTY # AFTER ^_S.
8183 %TCFPD==10 ;3.4 => FIRST PART DONE (USED FOR %TNESC ESCAPE SEQUENCES, %TNODP CR)
8184 %TCTPN==4 ;3.3 TYPE ^_N ON LEAVING COM MODE (UNLESS USER EXPLICITLY TYPES ^_N)
8185 %TCPAD==2 ;3.2 0 => PADDING NECESSARY ON DATAPOINT.
8186 %TCHNG==1 ;3.1 TTY'S DONE FLAG APPEARS TO BE FRIED, TIME OUT QUICKLY
8187 ;RH => USER INDEX COMMUNICATING WITH (-1 NONE)
8191 ;THIS TABLE HOLDS BITS THAT DESCRIBE THE LINE
8192 ;AND ITS CONTROLLER, RATHER THAN THE TTY ATTACHED TO THE LINE.
8194 %TTLCL==400000 ;BIT 4.9 ONE => LOCAL TTY
8195 %TT340==200000 ;BIT 4.8 ONE => CONSOLE NEXT TO 340 OR A 340 SLAVE
8196 %TT3HP==100000 ;BIT 4.7 HIGH PRIORITY ON 340
8197 %TTPAR==004000 ;BIT 4.3 THIS TTY NEEDS PARITY BIT SENT.
8198 %TTDDI==002000 ;BIT 4.2 DONT DING ON EXCESS INPUT
8199 $TTISP==260400 ;3.8-3.5 INPUT SPEED CODE
8200 $TTOSP==220400 ;3.4-3.1 OUTPUT SPEED CODE
8202 %TYDPK==400000 ;BIT 2.9 DATAPOINT KLUDGE TERMINAL
8203 %TYSTY==200000 ;BIT 2.8 PSEUDO TTY
8204 %TYNVA==100000 ;BIT 2.7 NOVA TTY
8205 %TYMTY==040000 ;BIT 2.6 MORTON BOX
8206 %TYDIL==020000 ;BIT 2.5 DIAL UP
8207 %TY11T==010000 ;BIT 2.4 PDP-11 TV TTY.
8208 %TYDL== 004000 ;BIT 2.3 DL10 TTY
8209 %TYOTY==002000 ;BIT 2.2 ORDINARY KA-10 CONSOLE TTY
8210 %TYETY==001000 ;BIT 2.1 DTE-20 TTY (KL-10 CONSOLE)
8211 %TYNTY==000400 ;BIT 1.9 TK-10 TTY.
8212 %TYMDM==000200 ;BIT 1.8 LINE HAS MODEM CONTROL, DETECTS DIALINS AND HANGUPS
8213 %TYKST==000100 ;BIT 1.7 KS-10 CONSOLE TTY
8214 %TYDZT==000040 ;BIT 1.6 DZ-11 TTY ON KS-10
8215 %TYRLM==000020 ;BIT 1.5 ROLM DATA SWITCH
8217 TTYTYP: TTYREP TYP ;PART OF TTYTYP MAY BE WRITEABLE.
8219 0 ;DISOWNED JOBS CANT HAVE LPT
8220 %TTLCL,,;SYSTEM JOB CAN GET LPT
8223 IRPS X,,TYP OPT HOR VER TCT ROL SMT
8225 CONC EXPUNG T,\.RPCNT,$!X
8230 OVHMTR UUO ;YET MORE RANDOM UUOS