mirror of
https://github.com/PDP-10/its.git
synced 2026-01-21 02:08:50 +00:00
8217 lines
241 KiB
Plaintext
Executable File
8217 lines
241 KiB
Plaintext
Executable File
;-*-MIDAS-*-
|
||
;;; Copyright (c) 1999 Massachusetts Institute of Technology
|
||
;;; See the COPYING file at the top-level directory of this project.
|
||
|
||
TTYVRS==.IFNM2
|
||
|
||
OVHMTR TTY ;MISC TTY CODE
|
||
|
||
SUBTTL SPY DEVICE
|
||
|
||
;FIRST FILE NAME MUST BE TTY NUMBER (NOT CHARACTERS)
|
||
|
||
SPYO: JUMPN D,OPNL12 ;ONLY UNIT ASCII INPUT ALLOWED
|
||
JUMPL A,OPNL11
|
||
CAIL A,NCT
|
||
JRST OPNL11
|
||
MOVE E,TIIP(A)
|
||
MOVEM E,IOCHST-IOCHNM(R)
|
||
MOVEI C,ISPY
|
||
HRL C,A
|
||
MOVEM C,(R)
|
||
JRST POPJ1
|
||
|
||
;A HAS LH OF IOCHNM =TTY #
|
||
|
||
SPYI: MOVE T,IOCHST-IOCHNM(R) ;POINTER TO INPUT BUFFER
|
||
HRRZ B,TIBEP(A)
|
||
CAIL B,(T)
|
||
CAILE B,TIBL(T)
|
||
JRST SPYIL
|
||
SPYILL: CAMN T,TIIP(A)
|
||
PUSHJ P,UFLS
|
||
CAMN T,TIBEP(A)
|
||
SUBI T,TIBL
|
||
HRRM T,IOCHST-IOCHNM(R)
|
||
ILDB W,IOCHST-IOCHNM(R)
|
||
POPJ P,
|
||
|
||
SPYIL: MOVE T,TIIP(A)
|
||
MOVEM T,IOCHST-IOCHNM(R)
|
||
JRST SPYILL
|
||
|
||
;.CALL RFNAME on a SPY channel. A contains LH(IOCHNM) = TTY #
|
||
SPYRCH: MOVEI B,(A) ;FN1 is TTY #
|
||
POPJ P, ;easy!
|
||
|
||
SUBTTL STY DEVICE
|
||
|
||
;STY OPEN
|
||
|
||
;MODE BITS (LH)
|
||
;3.1=0 => INPUT =1 => OUTPUT (FROM PROGRAM POINT OF VIEW)
|
||
;3.2=0 => UNIT =1 => BLOCK
|
||
;INPUT
|
||
;3.3=0 => FULL DUPLEX =1 => HALF DUPLEX
|
||
;3.4=1 => DON'T HANG ON INPUT IOTS, INPUT -1 INSTEAD (IGNORED ON OUTPUT OPEN)
|
||
;3.5=1 => WANT TO GET %TDORS ON OUTPUT RESET.
|
||
;BIT 3.5 NOTICED ON OUTPUT, TOO, BUT THAT'S NO FEATURE?
|
||
|
||
STTYO: HRRZ I,USTYN(U)
|
||
JUMPN I,STTYO3 ;JUMP IF STY ALREADY OPEN
|
||
PUSHJ P,SWTL ;LOCK STY OPEN SWITCH
|
||
STYOSW
|
||
MOVE I,[-NSTTYS,,NFSTTY]
|
||
MOVSI TT,%SSUSE
|
||
STTYO1: TDNE TT,STYSTS-NFSTTY(I) ;SKIP ON FREE SLOT
|
||
STTYO5: AOBJN I,STTYO1
|
||
JUMPGE I,OPNL6 ;NO SLOTS. GIVE DEVICE FULL
|
||
SKIPGE TTYSTA(I) ;SKIP IF CONSOLE FREE MSG NOT TYPED.
|
||
SKIPE TTNTO(I) ;SKIP IF NOT OPEN.
|
||
JRST STTYO5
|
||
MOVEI I,(I) ;We want to compare left half
|
||
CAMLE I,STYMAX ;If we're limiting STY's, is this over our
|
||
JRST OPNL6 ; limit? If so, give DEVICE FULL
|
||
HRRM I,USTYN(U) ;STORE TTY NUMBER OF STY
|
||
STTYO4: ANDI I,-1
|
||
SETZM STYNTO-NFSTTY(I)
|
||
SETZM STYMSK-NFSTTY(I)
|
||
MOVSI TT,%SSUSE
|
||
MOVEM TT,STYSTS-NFSTTY(I) ;SET IN USE BIT
|
||
MOVSI TT,(<.BM ($TTISP)>+<.BM ($TTOSP)>)
|
||
ANDCAM TT,TTYTYP(I) ;RESET SPEEDS TO ZERO
|
||
PUSH P,C
|
||
PUSHJ P,NCNSSP ;MAKE THE TTY A PRINTING TTY.
|
||
PUSHJ P,TTYIN1 ;INIT THE TTYOPT AND TTYCOM USER OPTION BITS.
|
||
PUSHJ P,STYIR1 ;FLUSH TTY'S OUTPUT BUFFER.
|
||
PUSHJ P,STYOR1 ;AND ITS INPUT BUFFER.
|
||
PUSHJ P,LSWPOP ;UNLOCK STY OPEN SWITCH
|
||
POP P,C
|
||
HRRM U,STYSTS-NFSTTY(I)
|
||
MOVE T,UTMPTR(U) ;Check out this tree
|
||
CAIE T,SYSRCE-1 ;Is this a top-level non-console tree,
|
||
CAIN T,SYSRCE ;or a system demon?
|
||
JRST STTYO3 ; Yes, don't print on console.
|
||
; since TELSER, etc., logs in
|
||
MOVEI T,(I) ;Get TTY number
|
||
HRLI T,[ASCIZ / STYOPN /]
|
||
PUSHJ P,SGWAIT ;Ask SYSJOB to print the info
|
||
MOVE T,JNAME(U) ;Add the JNAME to the info
|
||
MOVEM T,SLGIV+2 ;to be printed
|
||
|
||
STTYO3: JUMPL D,[MOVSI TT,%SSOHG ;JUMP IF OPENING FOR OUTPUT
|
||
JRST STTYO2]
|
||
LDB TT,[240100,,C]
|
||
DPB TT,[400100,,STYSTS-NFSTTY(I)] .SEE %SSHDX
|
||
DPB TT,[$TOHDX,,TTYOPT(I)]
|
||
MOVSI TT,%SSHNG
|
||
STTYO2: TLNE C,10
|
||
IORM TT,STYSTS-NFSTTY(I)
|
||
MOVSI TT,%SSORS
|
||
TLNE C,20
|
||
IORM TT,STYSTS-NFSTTY(I)
|
||
MOVE J,R
|
||
SUBI J,IOCHNM(U) ;CHANNEL BEING OPENED FOR INPUT ON
|
||
MOVE J,CHNBIT(J)
|
||
SKIPL D ;SKIP IF OUTPUT
|
||
IORM J,STYMSK-NFSTTY(I)
|
||
SKIPGE D ;SKIP IF INPUT
|
||
IORM J,STYOMS-NFSTTY(I)
|
||
AOS STYNTO-NFSTTY(I)
|
||
HRLZ A,I ;LH OF IOCHNM GETS STY NUMBER
|
||
MOVSS C
|
||
JSP Q,OPSLC3
|
||
STYDUI,,STYDUO
|
||
STYDBI,,STYDBO
|
||
|
||
|
||
;ENTRY FOR OPEN OF PSEUDO-TTY AS SNM OR STN
|
||
STTYOA: JUMPL I,OPNL1
|
||
CAIL I,NSTTYS
|
||
JRST OPNL1
|
||
ADDI I,NFSTTY
|
||
PUSHJ P,SWTL
|
||
STYOSW
|
||
MOVE TT,STYSTS-NFSTTY(I) ;SKIP IF IN USE
|
||
TLNN TT,%SSUSE
|
||
JRST STTYO4 ;OK TO OPEN IF FREE
|
||
CAIE U,(TT)
|
||
JRST OPNL10 ;DIFFERENT USER HAS IT OPEN
|
||
PUSHJ P,LSWPOP
|
||
JRST STTYO3
|
||
|
||
JRST STTS ;STY INPUT SIOT ROUTINE.
|
||
;PSEUDO-TTY INPUT ROUTINE. RETURNS CHAR WITHOUT PARITY BIT
|
||
STTYI: MOVE I,A
|
||
STTYIA: SKIPGE TTYOAC(I) ;SKIP IF ANY CHARS AVAIL (MAYBE)
|
||
JRST STTYI1
|
||
STTYI4: PUSH P,C
|
||
PUSH P,E
|
||
CONO PI,TTYOFF
|
||
PUSHJ P,TYPSC
|
||
POP P,E
|
||
POP P,C
|
||
MOVE U,USER
|
||
MOVE W,STYICH
|
||
SKIPGE DBBBP
|
||
JRST STTYI2 ;REALLY NO CHARS AVAIL
|
||
CONO PI,TTYON
|
||
MOVSI R,%SSONT ;FOR TTYO INT TO STYI
|
||
JRST STTYIC ;INT CLEAR
|
||
|
||
STTYI2: CONO PI,TTYON
|
||
STTYI1: SKIPGE STYSTS-NFSTTY(I)
|
||
JRST STTYI3 ;DON'T HANG
|
||
SKIPGE TTYOAC(I)
|
||
PUSHJ P,UFLS
|
||
JRST STTYIA
|
||
|
||
STTYI3: MOVNI W,1
|
||
TLO E,100000 .SEE INBTCH ;UNHANG BLOCK MD IOT IMMEDIATELY.
|
||
JRST POPJ1 ;UNHANG SIOT IMMEDIATELY.
|
||
|
||
;STY INPUT SIOT; GOES 1 WORD AT A TIME, WHATEVER THE USER'S BYTE SIZE.
|
||
STTS: XCTR XRW,[SKIPG E,(C)]
|
||
JRST POPJ1 ;RETURN AT ONCE IF NO CHARS WANTED BY USER.
|
||
PUSH P,B ;SAVE ADDRS OF USER'S B.P. AND COUNT.
|
||
PUSH P,C
|
||
STTSA: SKIPGE TTYOAC(I)
|
||
JRST STTS4 ;NO INPUT AVAILABLE.
|
||
STTS2: UMOVE B,@-1(P)
|
||
STTS1: XCTR XRW,[MOVES D,(B)]
|
||
;IT IS ASSUMED THAT E HAS THE # OF CHARS THE USER WANTS.
|
||
CONO PI,TTYOFF
|
||
MOVEM D,STYICH ;STORE THE WORD THE USER'S B.P. POINTS AT.
|
||
LDB C,[360600,,B]
|
||
LDB D,[300600,,B]
|
||
IDIV C,D ;HOW MANY MORE CHARS GO IN THIS WORD?
|
||
JUMPE C,STTS7
|
||
PUSH P,B ;SAVE STARTING B.P. AND # CHARS FITTING IN WORD.
|
||
HRRI B,STYICH ;SET UP TO STORE CHARS AT APPRO. PLACE IN STYICH.
|
||
MOVEM B,DBBBP
|
||
CAML C,E
|
||
MOVE C,E ;GET MIN OF # CAHRS FITTING IN WORD AND # CHARS USER WANTS.
|
||
MOVEM C,DBBCC ;THAT'S HOW MANY CHARS WE CAN ACCEPT THIS TIME.
|
||
MOVEM C,DBBCC1
|
||
PUSHJ P,TYP ;FILL UP STYICH WITH CHARS, VIA DBBBP.
|
||
POP P,B ;NOTE E HAS -<# CHARS GOBBLED>
|
||
MOVE D,STYICH ;GET USER'S WORD, WITH CHARS STUCK IN IT.
|
||
UMOVEM D,(B) ;STORE IT WHERE IT CAME FROM.
|
||
XCTR XRW,[ADDB E,@(P)] ;UPDATE COUNT BY -<# CHARS OBTAINED>.
|
||
HLL B,DBBBP ;UPDATE B.P. TO THE L.H. CORRESP. TO CHARS STORED IN STYICH.
|
||
UMOVEM B,@-1(P)
|
||
SKIPE DBBCC ;DID WE GET AS MANY CHARS AS WE WANTED?
|
||
JRST STTS3 ;NO, SO EITHER RETURN OR HANG UP.
|
||
CONO PI,TTYON
|
||
JUMPG E,STTS7 ;USER WANTS MORE CHARS => TRANSFER ANOTHER WORD.
|
||
STTS5: MOVE U,USER
|
||
MOVSI R,%SSONT
|
||
SUB P,[2,,2]
|
||
AOS (P)
|
||
JRST STTYIC
|
||
|
||
;COME HERE DURING STY INPUT SIOT IF USER WANTS CHARS BUT THERE ARE NONE.
|
||
STTS3: CONO PI,TTYON
|
||
STTS4: SKIPGE STYSTS-NFSTTY(I)
|
||
JRST STTS5 ;DON'T HANG MODE.
|
||
SKIPGE TTYOAC(I)
|
||
PUSHJ P,UFLS
|
||
JRST STTSA
|
||
|
||
STTS7: AOS B
|
||
STTS6: TLZ B,770000
|
||
TLO B,440000
|
||
JRST STTS1
|
||
|
||
;PSEUDO-TTY OUTPUT
|
||
STTYW: MOVE I,A
|
||
SKIPGE C
|
||
SKIPA A,(C)
|
||
UMOVE A,(C)
|
||
BSTTYW: MOVSI T,%SSOHG ;BIT ON SAYS DONT HANG
|
||
TDNE T,STYSTS-NFSTTY(I)
|
||
JRST BSTTYX ;J TO NOT HANG. CHARS MAY BE LOST
|
||
MOVEI T,TIBS
|
||
CAMG T,TICC(I)
|
||
PUSHJ P,UFLS ;HANG UNTIL ROOM IN INPUT BUFFER
|
||
BSTTYX: CONO PI,TTYOFF
|
||
PUSH P,I
|
||
PUSHJ P,NTYI5
|
||
POP P,I
|
||
MOVE U,USER
|
||
MOVSI R,%SSINT
|
||
STTYIC: ANDCAM R,STYSTS-NFSTTY(I) ;CALLED BY STTYI ABOVE ALSO
|
||
HRRZ R,UUAC(U)
|
||
MOVE R,CHNBIT(R)
|
||
ANDCAM R,IFPIR(U) ;FLUSH ANY OUTPUT INTERRUPT
|
||
CONO PI,TTYON
|
||
POPJ P,
|
||
|
||
STTBI: JSP E,INBTCH
|
||
JRST STTYI
|
||
|
||
STTBO: JSP E,NBTOCH
|
||
CAIN A,EOFCH
|
||
POPJ P,
|
||
HLRZ I,(R)
|
||
PUSH P,R
|
||
PUSH P,D
|
||
PUSH P,TT
|
||
PUSH P,E
|
||
PUSH P,C
|
||
PUSHJ P,BSTTYW
|
||
POP P,C
|
||
POP P,E
|
||
POP P,TT
|
||
POP P,D
|
||
POP P,R
|
||
POPJ P,
|
||
|
||
;STY OUTPUT CLOSE.
|
||
STYOCL: SUBI R,IOCHNM(U)
|
||
MOVE B,CHNBIT(R)
|
||
ANDCAM B,STYOMS-NFSTTY(A)
|
||
JRST STYCL
|
||
|
||
;STY INPUT CLOSE
|
||
STYICL: SUBI R,IOCHNM(U)
|
||
MOVE B,CHNBIT(R)
|
||
ANDCAM B,STYMSK-NFSTTY(A)
|
||
STYCL: SOSE STYNTO-NFSTTY(A)
|
||
POPJ P,
|
||
STYCL1: PUSHJ P,TTYLFC ;LEAVE COM. MODE, PUT TTY # IN I.
|
||
IFN NETP,[
|
||
PUSHJ P,NSTYN0 ;DISCONNECT ANY NET SOCKETS FROM THE STY
|
||
JFCL
|
||
]
|
||
CONO PI,TTYON#200_<-APRCHN> ;LEAVE CLOCK OFF.
|
||
SKIPGE C,TTYSTS(I)
|
||
JRST STYOC8 ;TTY NOT IN USE.
|
||
TLNN C,%TSCNS
|
||
JRST STYOC9 ;OPEN AS DEVICE, NOT AS CONSOLE.
|
||
PUSH P,U
|
||
STYOC3: HRRZ U,C
|
||
SKIPL C,SUPPRO(U)
|
||
JRST STYOC3 ;NOT TOP LEVEL
|
||
MOVE C,USER
|
||
STYC4A: HRRZ TT,C
|
||
SKIPL C,SUPPRO(TT)
|
||
JRST STYC4A
|
||
AOS STYNTO-NFSTTY(I) ;IN CASE WE PCLSR, PREVENT JRST 4,.
|
||
PUSH P,I
|
||
CAME U,USER ;DON'T GET INTO LOOP AT ALOGO1
|
||
PUSHJ P,ALOGOUT ;TELL SYS JOB TO FLUSH THE TREE UNDER THE STY.
|
||
POP P,I
|
||
POP P,U
|
||
SOS STYNTO-NFSTTY(I)
|
||
STYOC5: PUSHJ P,STYIR1 ;FLUSH TTY OUTPUT BUFFER.
|
||
STYOC9: SETZM STYSTS-NFSTTY(I)
|
||
CAIN I,@USTYN(U) ;IF HE'S CLOSING HIS STY:, SAY HE HAS NONE.
|
||
HLLZS USTYN(U)
|
||
JRST CLKONJ
|
||
|
||
STYOC8: SKIPGE TTYSTA(I) ;IN TRANSIENT STATE BETWEEN USAGE AND NOT?
|
||
JRST STYOC5 ;NO, REALLY FREE, SIMPLE.
|
||
CONO PI,CLKON
|
||
AOS STYNTO-NFSTTY(I)
|
||
MOVE T,I
|
||
PUSHJ P,STYOCF
|
||
PUSHJ P,UFLS
|
||
MOVE A,I
|
||
JRST STYCL
|
||
|
||
STYOCF: SKIPGE TTYSTS(T) ;IF NOW IN USE
|
||
SKIPGE TTYSTA(T) ;OR COMPLETELY FREE,
|
||
AOS (P) ;THEN NO LONGER IN TRANSIENT STATE.
|
||
POPJ P,
|
||
|
||
;STY OUTPUT .CALL FINISH
|
||
STYFIN: SKIPE TICC(A) ;WAIT UNTIL CORRESPONDING INPUT BUFFER IS EMPTY
|
||
PUSHJ P,UFLS
|
||
JRST POPJ1
|
||
|
||
;STY OUTPUT .CALL WHYINT
|
||
STOWHY: MOVEI A,%WYSTO ;NULL ROUTINE FOR NOW
|
||
JRST POPJ1
|
||
|
||
;STY INPUT .CALL WHYINT
|
||
STIWHY: MOVEI A,%WYSTI ;NULL ROUTINE FOR NOW
|
||
JRST POPJ1
|
||
|
||
;STY INPUT RESET. DOES TTY OUTPUT RESET, WITH THE TTY'S OWNER STOPPED.
|
||
STYIRS: HLRZ I,(R)
|
||
STYIR1: CONO PI,TTYOFF
|
||
SKIPGE B,TTYSTS(I)
|
||
JRST STYIR2 ;TTY IS FREE => NO PROBLEM.
|
||
HRRZ A,B
|
||
PUSHJ P,RPCLSR ;ELSE MUST MAKE SURE ITS OWNER ISN'T TYPING OUT.
|
||
CONO PI,TTYOFF
|
||
XOR B,TTYSTS(I) ;WE MIGHT HAVE BEEN DELAYED - HAS TTY MOVED AROUND?
|
||
TRNN B,-1
|
||
JRST STYIR4 ;NO; THE GUY WAS STOPPED WHILE STILL ITS OWNER.
|
||
PUSHJ P,UPCLSR ;YES; UNSTOP GUY WE STOPPED,
|
||
JRST STYIR1 ;THEN GO STOP THE NEW OWNER.
|
||
|
||
STYIR4: PUSH P,A ;SAVE JOB STOPPED
|
||
PUSHJ P,STYIR2 ;ACTUALLY DO THE RESET OF TTY OUTPUT
|
||
POP P,A
|
||
JRST UPCLSR ;THEN UNSTOP THE TTY'S OWNER
|
||
|
||
STYIR2: SETOM TTYOAC(I) ;WE WILL NO LONGER BE LOOKING FOR TTY'S OUTPUT.
|
||
JRST TYORS1 ;DO THE TTY OUTPUT RESET AND TURN ON PI CHANNELS.
|
||
|
||
;STY OUTPUT RESET.
|
||
STYORS: HLRZ I,(R)
|
||
STYOR1: CONO PI,TTYOFF
|
||
PUSHJ P,TYIRS1 ;TURNS INTO TTY INPUT RESET.
|
||
JRST TTYONJ
|
||
|
||
;STY OUTPUT STATUS - BIT 2.1 => BUFFER FULL, 2.2 => EMPTY.
|
||
STASTO: ANDI A,77
|
||
SKIPN B,TICC(A)
|
||
IORI D,1_<9+1> ;BUFFER EMPTY.
|
||
CAIL B,TIBS-10.
|
||
IORI D,1_9 ;ALMOST FULL.
|
||
POPJ P,
|
||
|
||
;STY INPUT STATUS - THE SAME 2 BITS.
|
||
STASTI: ANDI A,77
|
||
SKIPG B,TORM(A)
|
||
IORI D,1_9 ;FULL.
|
||
CAIN B,TOBS
|
||
IORI D,1_<9+1> ;EMPTY.
|
||
POPJ P,
|
||
|
||
;"STYGET" SYSTEM CALL. 1 ARG, A TTY SPECIFYER.
|
||
;1ST VALUE IS STYSTS WORD (RH IS JOB NUMBER OF OWNER OF STY). 0 FOR FREE STY.
|
||
; %SSHNG AND %SSOHG BITS MAY BE INTERESTING.
|
||
;2ND VALUE IS JOB THAT OWNS CORRESP. TTY (OR -1 IF TTY FREE).
|
||
;3RD VALUE IS -1 IF TTY NOT CONSOLE; ELSE JOB NUMBER OF TOP OF TREE IN RH
|
||
; AND BIT 4.8 SET IFF IT IS LOGGING OUT.
|
||
; AND BIT 4.7 SET IF IT IS LOGGED IN.
|
||
;4TH VALUE BITS ARE:
|
||
; 1 IF TTY OWNER IS IN TYO WAIT
|
||
; SIGN IF HE'S IN TYI WAIT.
|
||
;5TH VALUE BITS ARE:
|
||
; 4.9 => TTY INPUT AVAILABLE
|
||
; 4.8 => TTY OUTPUT BUFFER HAS ROOM
|
||
;6TH VALUE IS TTYSTA WORD
|
||
|
||
NSTYGT: JSP J,ATTYCI ;DECODE A TTY-SPECIFYER IN A.
|
||
CONO PI,CLKOFF
|
||
SETZ A,
|
||
MOVE TT,TTYTYP(I)
|
||
TRNN TT,%TYSTY ;IF SPEC'D TTY ISN'T ASSOCIATED WITH A STY, IT HAS NO STYSTS WORD.
|
||
JRST NSTYG3
|
||
HRRZ A,STYSTS-NFSTTY(I)
|
||
IDIVI A,LUBLK ;NUMBER OF JOB USING THE STY.
|
||
HLL A,STYSTS-NFSTTY(I) ;AND SOME RANDOM BITS.
|
||
NSTYG3: SETOB B,C ;B GETS # OF JOB THAT HAS TTY, OR -1.
|
||
;C GETS (IF TTY IS CONSOLE, JOB # OF TOP OF TRREE, ELSE -1).
|
||
SETZB D,E ;D, E SHOULD GET 0 IF NO JOB HAS TTY.
|
||
HRRE B,TTYSTS(I)
|
||
JUMPL B,NSTYG1 ;JUMP IF CONSOLE NOT IN USE.
|
||
IDIVI B,LUBLK ;ELSE GET JOB NUMBER OF JOB USING IT.
|
||
MOVE D,TTYSTS(I)
|
||
TLNN D,%TSCNS ;TTY NOT CONSOLE => DON'T REPLACE THE -1 IN C WITH ANYTHING.
|
||
JRST NSTYG2
|
||
HRRZ C,TTYSTS(I)
|
||
SKIPL D,SUPPRO(C) ;ELSE TRACE SUPPRO'S TO TOP OF TREE.
|
||
JRST [ HRRZ C,D
|
||
JRST .-1]
|
||
MOVE TT,APRC(C)
|
||
HLRE W,UNAME(C)
|
||
IDIVI C,LUBLK ;GET JOB # OF TOP OF TREE.
|
||
TLNE TT,BULGOS
|
||
TLO C,200000
|
||
AOSE W
|
||
TLO C,100000
|
||
NSTYG2: SETZ D,
|
||
MOVE TT,TTYSTS(I)
|
||
HRRZ TT,FLSINS(TT) ;WHAT VARIABLE IS FLSINS OF JOB OWNING TTY WAITING ON?
|
||
CAIE TT,TICC(I) ;RETURN IN D SETZ IFF JOB IS IN TYI WAIT,
|
||
CAIN TT,TACC(I)
|
||
MOVSI D,(SETZ)
|
||
CAIN TT,TORM(I)
|
||
MOVEI D,1 ;OR 1 IF JOB IS IN TYO WAIT; ELSE 0.
|
||
NSTYG1: SKIPE TICC(I)
|
||
TLO E,400000
|
||
MOVE TT,TORM(I)
|
||
CAIL TT,TYOWNC
|
||
TLO E,200000
|
||
MOVE TT,TTYSTA(I)
|
||
CONO PI,CLKON
|
||
JRST POPJ1
|
||
|
||
;.CALL STLGET - GET INFO FROM SERVER TELNET
|
||
|
||
; Arg 1: a TTY
|
||
; Val 1: XJNAME of server telnet
|
||
; Val 2: TRMNAM of server telnet (has sixbit name of host)
|
||
; Val 3: SNAME of server telnet
|
||
; Val 4: STY control bits,,STY owner idx
|
||
|
||
NSTLGT: JSP J,ATTYCI
|
||
SETZB A,B
|
||
SETZB C,D
|
||
MOVE TT,TTYTYP(I)
|
||
TRNN TT,%TYSTY
|
||
JRST OPNL34
|
||
SKIPN T,STYSTS-NFSTTY(I) ;Get STY status bits,,STY user.
|
||
JRST POPJ1
|
||
MOVE A,XJNAME(T)
|
||
MOVE B,TRMNAM(T)
|
||
MOVE C,USYSNM(T)
|
||
HRRZ D,T
|
||
IDIVI D,LUBLK ;Make it into user index.
|
||
HLL D,T ;Stuff STY status bits in LH.
|
||
JRST POPJ1
|
||
|
||
|
||
SUBTTL .ATTY, .DTTY - PASS CONTROL OF TTY
|
||
|
||
NATTY: MOVE J,A ;.CALL ATTY
|
||
JSP T,NCRUI2 ;DECODE JOBSPEC BUT DON'T SET DIELOK
|
||
JFCL
|
||
IFN PDP6P,[
|
||
CAIN J,-1
|
||
JRST OPNL34 ;SORRY, I/O BUS MPXR IS NOT THAT HAIRY
|
||
]
|
||
HRRZ B,SUPPRO(J)
|
||
CAME B,U
|
||
JRST OPNL31 ;NOT DIRECT INFERIOR (CAN'T MODIFY JOB)
|
||
MOVE A,J
|
||
JRST NATTY1
|
||
|
||
; .ATTY USR, OPER 11
|
||
|
||
AATTY: HLRZ A,(R) ;A HAS INFERIOR'S USER INDEX
|
||
HRRZ B,(R)
|
||
SKIPL CLSTB(B) .SEE %CLSU ;SKIP IF USER OPEN ON CHANNEL
|
||
JRST OPNL34
|
||
NATTY1: MOVE TT,APRC(A)
|
||
TLNE TT,BULGOS ;REFUSE TO GIVE TTY TO A DYING JOB.
|
||
JRST OPNL42 ;JOB GOING AWAY
|
||
CONO PI,CLKOFF
|
||
MOVE I,TTYTBL(U)
|
||
JUMPL I,AATT1 ;DOESNT HAVE TTY NOW
|
||
HLLZS TTYTBL(U)
|
||
HRLI A,%TBNOT
|
||
IORM A,TTYTBL(U) ;NO LONGER HAS TTY. STORE USER INDEX GIVEN TO
|
||
PUSHJ P,AATT6 ;A _ IDX OF USER TO RECEIVE TTY,
|
||
;ALSO CHANGE ALL TTYTBL VARS THAT NEED IT.
|
||
EXCH A,U
|
||
PUSHJ P,AGBLT6 ;TAKE TTY FROM USER IN A (ME),
|
||
;GIVE TO USER IN U (HIM)
|
||
;CHANGES TTY VARS AND TTSTSV VARS.
|
||
;ALSO SETS CHANNELS-OPEN MASKS.
|
||
;TURNS ON ALL PI CHNLS.
|
||
EXCH A,U
|
||
JRST POPJ1
|
||
|
||
AATT1: TLZN I,%TBDTY ;SAY OUR INFERIOR HAD IT WHEN TAKEN
|
||
JRST OPNL10 ;DEVICE NOT AVAILABLE, ALREADY GAVE TTY AWAY
|
||
HRRI I,(A)
|
||
MOVEM I,TTYTBL(U)
|
||
PUSHJ P,AATT6 ;SET UP HIS VARS
|
||
JRST CLKOJ1
|
||
|
||
;CHANGE TTYTBL VARS OF ALL JOBS DOWN TO THE ONE GETTING THE TTY.
|
||
;RETURN IN A, T, TT THE TTYSTS, TTYST1, TTYST2 SETTINGS FOR THAT JOB.
|
||
;IF THAT JOB NEVER HAD THE TTY, INIT HIS TTSTSV VARS.
|
||
;I HAS TTY #, U HAS RUNNING JOB.
|
||
AATT6: MOVE E,TTYTBL(A)
|
||
MOVSI T,%TSATY ;TELL THIS GUY TTY WAS TAKEN FROM HIM & RETURNED.
|
||
IORM T,TTSTSV+2(A)
|
||
TLNE E,%TBDTY ;SKIP IF NOT TAKEN FROM ME
|
||
JRST AATT3 ;GUY IT WAS TAKEN FROM (I.E. HE HADN'T GIVEN IT TO SOMEONE ELSE)
|
||
HRRZ A,TTYTBL(A)
|
||
JRST AATT6
|
||
|
||
AATT3: HRRZS I ;TTY NUMBER
|
||
HLL A,TTSTSV+2(A)
|
||
TLZ A,%TSFRE+%TSLCZ ;CLEAR TTY NOT OPEN AND ^Z BITS
|
||
MOVEM A,TTSTSV+2(A) ;UPDATE SAVED TTY STATUS
|
||
POPJ P,
|
||
|
||
;SET UP TYIMSK AND TYOMSK. ARGS: TTY # IN I,
|
||
;D -> 1ST IOCHNM WORD OF USER TO SET UP FOR.
|
||
;MAKE LAST CHAR IN INPUT BFR AN ACTIVATION CHAR. TURN ON TTYCHN.
|
||
AATT8: SETZM TYOMSK(I)
|
||
SETZM TYIMSK(I)
|
||
CONO PI,TTYOFF
|
||
HRLI D,A ;INDIRECTION POINTER TO INFERIOR'S IO CHANNELS
|
||
MOVSI A,-20 ;AOBJN POINTER
|
||
AATT9: MOVE B,@D ;GET IOCHNM IN B
|
||
JUMPGE B,AATT10 ;IF CHANNEL HAS CONSOLE BIT SET,
|
||
ANDI B,-1
|
||
MOVE C,CHNBIT(A) ;GET THE BIT WE MIGHT WANT TO SET.
|
||
CAIE B,TYODN
|
||
CAIN B,TYOBN ;IF TTY OUTPUT CHNL,
|
||
IORM C,TYOMSK(I) ;SET BIT IN OUTPUT MASK.
|
||
CAIE B,TYIDN
|
||
CAIN B,TYIBN ;IF INPUT, SET IN INPUT MASK.
|
||
IORM C,TYIMSK(I)
|
||
AATT10: AOBJN A,AATT9 ;TRY NEXT CHANNEL OR CONTINUE IF DONE
|
||
JRST ATTYS1 ;ALL CHRS SO FAR ARE ACTIVATION CHRS
|
||
|
||
ADTTY: ;DON'T CLOBBER R (SEE AUCL2)
|
||
SDTTY: CONO PI,CLKOFF
|
||
MOVE A,TTYTBL(U)
|
||
JUMPGE A,CLKOJ1 ;I ALREADY HAVE IT
|
||
TLNE A,%TBDTY
|
||
JRST CLKOJ1 ;I ALREADY DID A .DTTY AND SO DID MY SUPERIOR
|
||
|
||
;LOOK FOR SUBJOB THAT HAS TTY, OR DOESN'T WANT TO GIVE TTY
|
||
;AWAY IF IT GETS THE TTY.
|
||
AGBLT3: MOVE I,TTYTBL(A)
|
||
TLNE I,%TBDTY ;REACHED A JOB THAT DIDN'T GIVE TTY AWAY
|
||
JRST AGBLT1 ;THIS IMPLIES OUR SUPERIOR TOOK TTY AWAY.
|
||
JUMPL I,AGBLT2 ;IF THIS GUY GAVE IT AWAY THEN TRY THE ONE HE GAVE IT TO
|
||
HRRZS A ;A HAS IDX OF TTY OWNER; TAKE TTY FROM HIM.
|
||
PUSHJ P,RPCLSR ;TURNS CLOCK ON!
|
||
CONO PI,CLKOFF
|
||
SKIPGE TTYTBL(A) ;DID TTY MOVE WHILE CLOCK WAS ON?
|
||
JRST [PUSHJ P,UPCLSR ;IF SO, START OVER
|
||
JRST SDTTY]
|
||
HLLZ D,TTYTBL(A)
|
||
TLZ D,%TBCLR ;DON'T ALTER USER-SETTABLE BITS, BUT
|
||
TLO D,%TBNOT+%TBDTY ;TELL HIM HE HASN'T GOT TTY.
|
||
MOVEM D,TTYTBL(A)
|
||
AOS (P) ;THE .DTTY SHOULD SKIP.
|
||
PUSH P,[UPCLSR] ;AFTER RESTARTING THE SUBJOB.
|
||
AGBLT6: ANDI I,-1 ;LH(TTYTBL) MAY BE NONZERO EVEN IF JOB HAS TTY!
|
||
MOVSI D,%TCLED
|
||
TDNE D,TTYCOM(I) ;IF OLD JOB WAS WANTING LOCAL EDITING,
|
||
PUSHJ P,AGBLT5 ;TELL TERMINAL TO STOP IMMEDIATELY.
|
||
ANDCAM D,TTYCOM(I) ;ASSUME NEW JOB DOES NOT WANT LOCAL EDITING
|
||
;AND SHOULD NOT SEE RESYNCHS (TOP-S).
|
||
MOVEI D,TTSTSV-1(A) ;SAVE CURRENT TTY STATUS IN
|
||
PUSH D,TTYST1(I) ;USER VARS OF USER GIVING AWAY THE TTY.
|
||
PUSH D,TTYST2(I)
|
||
PUSH D,TTYSTS(I)
|
||
MOVE TT,I
|
||
IMULI TT,TPLEN*2
|
||
MOVE D,TPVB+TPLEN(TT)
|
||
SUB D,TCMXV(I)
|
||
MOVNS D
|
||
DPB D,[$TBECL,,TTYTBL(A)]
|
||
IFN N11TYS,[
|
||
EXCH U,A ;GET USER GIVING AWAY TTY IN U
|
||
MOVE D,TVVBN(U) ;SAVE THIS
|
||
PUSHJ P,TVBNCL ;CLEAR OUT CURRENT GUY (MAYBE CLEARING RUN GLITCH ON SCREEN)
|
||
MOVEM D,TVVBN(A);PASS THE BALL TO HIM
|
||
EXCH U,A
|
||
]
|
||
;ENTRY FROM "ATTACH". GIVE TTY TO JOB W/ IDX IN U, WITHOUT
|
||
;"TAKING" IT FROM ANY JOB. USED WHEN TTY HAD BEEN FREE; JOB, DISOWNED.
|
||
AGBLT4: HRROI D,TTSTSV+2(U)
|
||
POP D,TTYSTS(I) ;RESTORE THE TTY STATUS OF JOB GIVING TTY TO.
|
||
POP D,TTYST2(I)
|
||
POP D,TTYST1(I)
|
||
HRRM I,TTYTBL(U) ;INDICATE THAT IT HAS THE TTY
|
||
LDB H,[$TBECL,,TTYTBL(U)]
|
||
HRLOI D,#%TBCLR
|
||
ANDM D,TTYTBL(U)
|
||
PUSHJ P,ASCML1 ;SET # COMMAND LINES FROM H
|
||
MOVSI D,%PJATY
|
||
AND D,MSKST(U)
|
||
IORM D,PIRQC(U)
|
||
MOVEI D,IOCHNM(U)
|
||
PUSH P,A ;GENERATE CHNLS-OPEN MASKS, CREATE AN
|
||
PUSHJ P,AATT8 ;ACTIVATION CHAR IF NEC, TURN ON PI.
|
||
JRST POPAJ
|
||
|
||
AGBLT2: HRRZ A,TTYTBL(A)
|
||
JRST AGBLT3
|
||
|
||
AGBLT1: MOVSI A,%TBDTY ;TTY WAS TAKEN AWAY FROM US,
|
||
IORM A,TTYTBL(U) ;WHEN GIVEN BACK WILL STOP WITH THIS JOB.
|
||
JRST CLKOJ1
|
||
|
||
;TELL TERMINAL TO STOP DOING LOCAL EDITING IMMEDIATELY.
|
||
AGBLT5: MOVE H,TTYOPT(I)
|
||
TRNE H,%TP11T
|
||
POPJ P, ;DON'T EVEN TRY ON A TV -- TORM DOESN'T MEAN ANYTHING.
|
||
SKIPG TORM(I) ;WAIT FOR ROOM IN OUTPUT BUFFER.
|
||
PUSHJ P,UFLS
|
||
PUSH P,A
|
||
MOVE Q,TOIP(I)
|
||
MOVEI A,%TDNLE
|
||
PUSHJ P,TYOOU1 ;PUT CMD IN OUTPUT BFR,
|
||
MOVEM Q,TOIP(I)
|
||
AOSN TTYOAC(I)
|
||
XCT TTYST(I) ;AND TELL INT. LVL. ABOUT IT.
|
||
JRST POPAJ
|
||
|
||
SUBTTL CNSSET, TTYSET, ETC. .CALLS FOR TTYS
|
||
|
||
;DECODING TTY SPECIFIERS. CALL WITH JSP,J. MAY RETURN TO (J),
|
||
;OR POPJ AND REPORT AN ERROR.
|
||
|
||
;DECODE A TTY SPECIFIER, BUT DON'T CHECK FOR PERMISSION TO
|
||
;USE THE TTY. ALWAYS RETURN IMMEDIATELY WITH LEGAL TTY SPECIFIER.
|
||
ATTYCI: MOVEI Q,CPOPJ
|
||
JRST ATTYC8
|
||
|
||
;DECODE A TTY SPECIFIER.
|
||
;IF W IS GREATER THAN ONE, DO NOT ALLOW RANDOM TTY NUMBERS.
|
||
;ALWAYS WAIT FOR PERMISSION TO OUTPUT.
|
||
;IF THE SPECIFIED TTY IS OUR CONSOLE AND OUTPUT IS BEING IGNORED,
|
||
;CLOBBER W TO ONE, SO THAT ITS PARAMETERS WILL NOT BE CHANGED (FOR SCPOS).
|
||
ATTYCW: JSP Q,[ CAIGE W,2
|
||
JRST ATTYC8
|
||
JRST ATTYC7 ]
|
||
PUSHJ P,TTYWO2
|
||
MOVEI W,1
|
||
POPJ P,
|
||
|
||
;DECODE A TTY SPEC.
|
||
;IF THERE ARE TWO OR MORE ARGS, AND IT IS OUR CONSOLE,
|
||
;WAIT UNTIL WE OWN IT, OR MAYBE INTERRUPT.
|
||
ATTYC: CAIGE W,2
|
||
JRST ATTYCI
|
||
;DECODE A TTY SPEC.
|
||
;IF IT IS OUR CONSOLE, WAIT TILL WE OWN IT, OR MAYBE INTERRUPT.
|
||
ATTYC2: MOVEI Q,TTYWC2
|
||
JRST ATTYC7
|
||
|
||
;DECODE A TTY SPEC.
|
||
;IF IT IS OUR CONSOLE, WAIT TILL WE CAN DO INPUT,
|
||
;OR INTERRUPT IF DOING INPUT WOULD.
|
||
ATTYCR: MOVEI Q,TTYWI2
|
||
JRST ATTYC7
|
||
|
||
;DECODE A TTY SPEC. SKIP IF IT REFERS TO OUR CONSOLE.
|
||
;DO NOT ALLOW RANDOM TTY NUMBERS.
|
||
ATTYCM: MOVEI Q,[AOJA J,CPOPJ]
|
||
JRST ATTYC7
|
||
|
||
;DECODE A TTY SPEC. SKIP IF IT REFERS TO OUR CONSOLE.
|
||
ATTYC9: MOVEI Q,[AOJA J,CPOPJ]
|
||
;DECODE CHNL # (IF < 400000) OR TTY # (OTHERWISE) IN A. -1 MEANS TREE'S CONSOLE.
|
||
;IF CHNL # BAD, POPJ WITH OPNL. IF NOT STY OR TTY, POPJ WITH OPNL.
|
||
;IF OUR CONSOLE, CALL THE ROUTINE Q POINTS TO.
|
||
;THEN RETURN WITH TTY # IN I.
|
||
ATTYC8: TDZE A,[-400000] ;IS IT A TTY NUMBER?
|
||
JRST ATTYC3 ;YES, DECODE THAT.
|
||
;DECODE CHNL #, TTY # NOT ALLOWED.
|
||
ATTYC7: HRRE T,A
|
||
AOJE T,ATTYC6
|
||
HRLI J,ATTYC5 ;RETURN THERE IF NORMAL, OPEN CHANNEL
|
||
MOVEI T,AIOCAL ;USE JOB DEVICE CHECKER
|
||
JRST CHNDCD ;DECODE CHANNEL AND HANDLE JOB DEVICE SPECIALLY.
|
||
|
||
;CHNDCD RETURNS HERE WITH IOCHNM WORD CONTENTS IN H.
|
||
ATTYC5: HRRZ T,H
|
||
LDB I,[$TIIDX,,H] ;FOR EITHER TTY CHNL OR STY CHNL, GET TTY #.
|
||
CAIN I,%TINON ;TREE HAS NO TTY => RETURN "DEVICE NOT AVAILABLE".
|
||
JRST OPNL10
|
||
CAIG T,4 ;TTY CHNL => GOOD.
|
||
JUMPG T,ATTYC4
|
||
CAIL T,STYDUI
|
||
CAILE T,STYDBO
|
||
JRST OPNL34 ;NOT STY => BAD.
|
||
JRST (J) ;STY => GOOD.
|
||
|
||
ATTYC4: LDB T,[.BP <%TICNS,,>,H] ;GET DEVICE/CONSOLE BIT
|
||
JUMPE T,ATTYC1 ;JUMP IF IT'S A DEVICE.
|
||
PUSHJ P,(Q) ;AWAIT TTY OR INTERRUPT
|
||
LDB I,[$TIIDX,,(R)]
|
||
SKIPGE T,TTYTBL(U)
|
||
JRST (J) ;USER DOESN'T HAVE THE TTY (^P), ERROR CHECKS DON'T APPLY
|
||
CAIE I,(T)
|
||
BUG ;USER HAS TWO DIFFERENT CONSOLE TTYS
|
||
ATTYC1: HRRZ T,TTYSTS(I) ;USER INDEX THAT HAS THIS TTY
|
||
CAME T,U
|
||
BUG ;USER HAS TTY BUT TTY DOESN'T HAVE THAT USER
|
||
JRST (J)
|
||
|
||
ATTYC3: MOVEI I,(A)
|
||
CAIGE I,NCT ;IS THE ARG THE # OF A REAL TTY?
|
||
JRST (J) ;YES, OK.
|
||
CAIE I,377777 ;SKIP IF ARG WAS -1
|
||
JRST OPNL1 ;"NO SUCH DEVICE" ERROR.
|
||
ATTYC6: PUSHJ P,(Q) ;"MY OWN CONSOLE" SPECIFIED; WAIT OR INTERRUPT.
|
||
HRRZ I,TTYTBL(U);NOW GET TTY NUMBER
|
||
CAIN I,%TINON ;TREE HAS NO TTY => RETURN "DEVICE NOT AVAILABLE".
|
||
JRST OPNL10
|
||
JRST ATTYC1
|
||
|
||
;TTYSET SYSTEM CALL
|
||
;SETS TTYST1, TTYST2, TTYSTS, WHEN THE USER HAS THE TTY
|
||
;HANGS UNTIL HE GETS IT
|
||
ATTYST: JSP J,ATTYCM ;GET TTY NUMBER IN I; SKIP IF IT'S OUR CONSOLE.
|
||
JRST ATTYS6
|
||
SKIPGE TTYTBL(U)
|
||
JRST ATTYS5 ;JUMP IF OUR CONSOLE AND WE DON'T OWN IT.
|
||
ATTYS6: CONO PI,TTYOFF
|
||
MOVEM B,TTYST1(I)
|
||
MOVEM C,TTYST2(I)
|
||
CAIGE W,4
|
||
JRST ATTYS0 ;NO 4TH ARG => DON'T SET TTYSTS.
|
||
TLNE D,%TSINT ;SETTING "INT ON NEXT CHAR REGARDLESS"?
|
||
PUSHJ P,ATTYS3 ;MAYBE THE "NEXT CHAR" HAS ALREADY BEEN READ.
|
||
HRLOI B,%TSFRE+%TSCNS+%TSLCZ+%TSHDX ;DON'T CHANGE THESE.
|
||
TLZ D,%TSFRE+%TSCNS+%TSLCZ+%TSHDX
|
||
ANDCMI D,-1
|
||
ANDM B,TTYSTS(I)
|
||
IORM D,TTYSTS(I)
|
||
ATTYS0: AOS (P) ;MAKE ALL CHRS IN BUFFER ACTIVATION CHARS
|
||
ATTYS1: SKIPG TICC(I)
|
||
JRST TTYONJ
|
||
LDB E,TIIP(I) ;MAKE LAST CHAR AN ACTIVATION CHAR
|
||
TRON E,%TXACT
|
||
AOS TACC(I) ;IF IT WASN'T ONE, IS ONE MORE ACT CHAR NOW
|
||
DPB E,TIIP(I)
|
||
JRST TTYONJ
|
||
|
||
ATTYS3: SKIPE B,TINTP(I)
|
||
ATTYS4: CAMN B,TIIP(I) ;ANY MORE CHARS TO CHECK?
|
||
POPJ P,
|
||
CAMN B,TIBEP(I)
|
||
SUBI B,TIBL
|
||
ILDB E,B ;YES, CHECK THE NEXT ONE.
|
||
TRNE E,%TXIGN ;IF IT ISN'T REALLY THERE, IT SHOULDN'T
|
||
JRST ATTYS4 ;INTERRUPT.
|
||
TLZ D,%TSINT ;ELSE THIS CHAR IS THE "NEXT CHAR" THAT
|
||
TROE E,%TXINT ;SHOULD INTERRUPT REGARDLESS.
|
||
POPJ P,
|
||
AOS TINTC(I) ;SO MAKE IT AN INT. CHAR IF IT ISN'T.
|
||
DPB E,B
|
||
MOVE B,TYIMSK(I)
|
||
AND B,MSKST2(U)
|
||
MOVN C,B
|
||
AND B,C
|
||
IORM B,IFPIR(U)
|
||
MOVEI A,%PITYI
|
||
TDNE A,MSKST(U)
|
||
IORM A,PIRQC(U)
|
||
POPJ P,
|
||
|
||
;TTYSET WHEN WE DON'T OWN OUR CONSOLE.
|
||
ATTYS5: MOVEM B,TTSTSV(U)
|
||
MOVEM C,TTSTSV+1(U)
|
||
CAIGE W,4
|
||
JRST POPJ1
|
||
HRLOI B,%TSFRE+%TSCNS+%TSLCZ+%TSHDX ;DON'T CHANGE THESE.
|
||
TLZ D,%TSFRE+%TSCNS+%TSLCZ+%TSHDX ;CHANGE ONLY CERTAIN LH BITS.
|
||
ANDCMI D,-1
|
||
ANDM B,TTSTSV+2(U)
|
||
IORM D,TTSTSV+2(U)
|
||
JRST POPJ1
|
||
|
||
;TTYGET SYSTEM CALL
|
||
;GETS TTYST1, TTYST2 AND TTYSTS WHEN THE USER HAS THE TTY
|
||
;HANGS UNTIL HE GETS IT, IF IT'S HIS CONSOLE.
|
||
;ALSO RETURNS HIS TTYTYP, TCTYP.
|
||
;THE RH OF TTYSTS AS RETURNED IS PRE-DIVIDED BY LUBLK
|
||
ATTYGT: JSP J,ATTYC9 ;GET TTY NUMBER NOW IN I; SKIP IF IT'S OUR CONSOLE.
|
||
CAIA
|
||
SKIPL TTYTBL(U)
|
||
JRST ATTYG1
|
||
;OUR CONSOLE AND WE DON'T CURRENTLY OWN IT.
|
||
MOVE A,TTSTSV(U)
|
||
MOVE B,TTSTSV+1(U)
|
||
MOVE C,TTSTSV+2(U)
|
||
JRST ATTYG2
|
||
|
||
;EITHER NOT OUR CONSOLE OR WE OWN IT.
|
||
ATTYG1: MOVE A,TTYST1(I)
|
||
MOVE B,TTYST2(I)
|
||
HLLZ C,TTYSTS(I)
|
||
ATTYG2: HRRZ D,TTYSTS(I) ;GET IDX OF TTY'S OWNER
|
||
CAIE D,-1 ;(BUT MAY BE NO OWNER IF WE SPECIFIED RANDOM TTY)
|
||
IDIVI D,LUBLK ;RETURN IN EASY-TO-DIGEST FORM.
|
||
HRR C,D
|
||
MOVE D,TTYOPT(I)
|
||
TLNE D,%TOHDX ;THE %TSHDX BIT REFLECTS THE %TOHDX BIT.
|
||
TLO C,%TSHDX
|
||
MOVE D,TTYTYP(I)
|
||
MOVE E,TCTYP(I)
|
||
JRST POPJ1
|
||
|
||
;SCML SYSTEM CALL. 1ST ARG TTY OR STY CHNL,
|
||
;2ND ARG IS DESIRED # COMMAND LINES(FOR ECHOING AT BOTTOM OF SCREEN)
|
||
;2ND ARG 0 => NO ECHO REGION.
|
||
ASCML: JSP J,ATTYCM
|
||
JRST ASCML3
|
||
SKIPL TTYTBL(U)
|
||
JRST ASCML3
|
||
DPB B,[$TBECL,,TTYTBL(U)] ;IT'S OUR CONSOLE AND WE DON'T OWN IT.
|
||
JRST POPJ1
|
||
|
||
ASCML3: PUSH P,[TTYOJ1]
|
||
CONO PI,TTYOFF
|
||
MOVEI H,(B)
|
||
;I HAS TTY #, H HAS # CMD LINES, TTY CHANNEL OFF (TURNED BACK ON).
|
||
ASCML1: MOVE TT,TCMXV(I)
|
||
CAMN TT,[MOVE]
|
||
JRST [ MOVE H,TT ;PRINTING TERMINALS (INFINITE SCREEN) ARE A SPECIAL CASE
|
||
JRST ASCML2 ]
|
||
CAML H,TT
|
||
SOS H,TT
|
||
SUB H,TCMXV(I)
|
||
MOVMS H ;VPOS OF START OF ECHO AREA.
|
||
CAIL H,117.
|
||
MOVEI H,117. ;IF TCMXV GARBAGE, AVOID GETTING GARBAGE INTO TPVP
|
||
ASCML2: MOVE TT,I
|
||
IMULI TT,TPLEN*2
|
||
ADDI TT,TPLEN
|
||
CAMN TT,TTYLPP(I) ;MAKE SURE TTY ISN'T ASSOCIATED WITH PC OF PPR
|
||
PUSHJ P,TYOMVC ;WHILE THE LATTER'S SIZE IS CHANGING.
|
||
SUBI TT,TPLEN
|
||
MOVEM H,TPVB+TPLEN(TT)
|
||
MOVEM H,TPVP+TPLEN(TT)
|
||
HRLM H,TPSP+TPLEN(TT)
|
||
JRST NCNSSG
|
||
|
||
;RCPOS SYSTEM CALL. (READ CURSOR POSITION)
|
||
;1 ARG - TTY OR STY CHNL.
|
||
;1ST VALUE <ECHO VERT POS>,,<ECHO HORIZ POS>
|
||
;2ND VALUE <MAIN PRGM VERT POS>,,<MAIN PRGM HORIZ POS>
|
||
;1ST VALUE IRRELEVANT IF NO ECHO LINES.
|
||
ARCPOS: JSP J,ATTYCW
|
||
HRRZ B,H
|
||
CAILE B,4
|
||
JRST NRCPO1
|
||
SKIPL TTOALC(I)
|
||
PUSHJ P,UFLS
|
||
NRCPO1: MOVE TT,I
|
||
IMULI TT,TPLEN*2
|
||
HRRZ B,TPVP+TPLEN(TT)
|
||
SUB B,TPVB+TPLEN(TT)
|
||
HRLZS B
|
||
HRR B,TPHP+TPLEN(TT)
|
||
HRLZ A,TPVP(TT)
|
||
HRR A,TPHP(TT)
|
||
JRST POPJ1
|
||
|
||
;SCPOS SYSTEM CALL GETS OR SETS THE SYSTEM'S IDEA OF WHERE THE TTY'S
|
||
;CURSOR IS REALLY LOCATED (AT THE M.P. SIDE OF THE OUTPUT BUFFER).
|
||
;TO BE USED AFTER OUTPUTTING IN SUPERIMAGE MODE, TO TELL THE SYSTEM
|
||
;WHAT THE CHARS ALREADY OUTPUT WILL DO TO THE TTY. MAY ALSO BE USED
|
||
;BY A STY PROGRAM LOOKING AT A SOFTWARE TTY, TO TELL THE SYSTEM HOW
|
||
;IT HAS INTERPRETED THE CURSOR-MOVING DISPLAY CODES, PROVIDED THE
|
||
;OUTPUT BUFFER IS EMPTY (AS IT WILL BE AFTER AN OUTPUT RESET).
|
||
;FOR THAT APPLICATION, A WAY TO SET TTOALC IS PROVIDED.
|
||
;3 VALUES - VPOS, HPOS AND TTOALC.
|
||
;1 ARG (TTY SPEC) => JUST READ THEM.
|
||
;2 MORE ARGS => THEY ARE NEW VPOS AND HPOS.
|
||
;A FOURTH ARG WILL SET TTOALC.
|
||
NSCPOS: JSP J,ATTYCW
|
||
HRRZ T,H
|
||
CAILE T,4 ;IF WE'RE HACKING A TTY CHANNEL
|
||
JRST NSCPO4
|
||
SKIPL TTOALC(I) ;THEN MAYBE THE TTY WANTS TO HACK IT FIRST.
|
||
PUSHJ P,UFLS
|
||
NSCPO4: SOJE W,NSCPO2
|
||
JUMPL B,OPNL33
|
||
JUMPL C,OPNL33
|
||
CAIG B,118. ;DON'T ALLOW GARBAGE TO GET INTO TPVP
|
||
CAIGE W,2
|
||
JRST OPNL33 ;NOT 3 ARGS??
|
||
CAMGE B,TCMXV(I)
|
||
;CAML C,TCMXH(I)
|
||
CAIL C,400 ;PREVIOUS LINE MESSES UP ON !-CONTINUED LINES
|
||
JRST OPNL33
|
||
NSCPO2: MOVSI TT,%TCLED ;CONTROL BIT SET => SET %TCLED, ALLOWING THIS JOB TO
|
||
SKIPE CTLBTS(U) ;READ TOP-E AND TOP-S CHARS. NORMALLY, ITS DISCARDS THEM.
|
||
IORM TT,TTYCOM(I)
|
||
CONO PI,TTYOFF
|
||
SKIPL TT,TTYLPP(I)
|
||
JRST NSCPO1 ;WHERE POS LIVES DEPENDS ON WHETHER TTY IS ASSOCIATED.
|
||
HRRZ T,C
|
||
HRL T,B ;FOR DISSOCIATED TTYS, TTYLPS HAS POS, MUST BE SET.
|
||
CAIE W,
|
||
MOVEM T,TTYLPS(I)
|
||
SETCA TT, ;MAKE SURE TT HAS THE PC PPR #, UNCOMPLEMENTED.
|
||
NSCPO1: MOVE A,TPVP(TT) ;FOR ASSOCIATED TTY, POS LIVES IN TPVP AND TPHP OF PC PPR.
|
||
CAIE W,
|
||
MOVEM B,TPVP(TT)
|
||
MOVE B,TPHP(TT)
|
||
CAIE W,
|
||
MOVEM C,TPHP(TT)
|
||
NSCPO3: MOVE C,TTOALC(I) ;NOW GET OLD TTOALC, AND SET IT IF THERE WERE 4 ARGS.
|
||
CAIGE W,3
|
||
JRST TTYOJ1
|
||
MOVEM D,TTOALC(I)
|
||
CONO PI,TTYON
|
||
AOSN TTYOAC(I) ;MAY BE RESTARTING FROM ZERO ALLOCATION
|
||
XCT TTYST(I)
|
||
JRST POPJ1
|
||
|
||
;CNSGET OR RSSIZE SYSTEM CALL. 1 ARG - TTY OR STY CHNL.
|
||
;RETURNS THE SAME VARS THAT CNSSET SETS, IN THE SAME ORDER.
|
||
NCNSGET: ;RETURN PERMANENT AND SEMIPERMANENT TTY INFO.
|
||
ARSSIZ: JSP J,ATTYCI
|
||
MOVE TT,TTYTYP(I)
|
||
MOVE E,TTYOPT(I)
|
||
MOVE D,TTYCOM(I)
|
||
MOVE C,TCTYP(I)
|
||
MOVE B,TCMXH(I) ;NOTE TCMXH IS LINEL INCLUDING THE CONTIN. COLUMN,
|
||
MOVE A,TCMXV(I)
|
||
MOVE I,TTYSMT(I)
|
||
SOJA B,POPJ1
|
||
|
||
;CNSSET SYSTEM CALL.
|
||
;1ST ARG TTY OR STY CHNL. NEXT ARGS SET
|
||
;VERT SIZE, HORIZ SIZE, TCTYP, TTYCOM, TTYOPT VARS RESPECTIVELY.
|
||
;TCTYP CAN'T BE SET TO A NONSENSE VALUE, SOME TTYCOM BITS CAN'T BE SET.
|
||
;IF 2ND, 3RD OR 4TH ARG IS NEGATIVE, ITS VALUE ISNT CHANGED
|
||
NCNSSET:
|
||
JSP J,ATTYC
|
||
MOVE H,TT
|
||
;.CALL TTYVAR ENTERS HERE WITH B/TCMXV, C/TCMXH-1, D/TCTYP, E/TTYCOM, H/TTYOPT
|
||
;AND I/TTY#, W/6
|
||
NCNSS0: SKIPL D ;MAKE SURE D HAS NEW VALUE OF TCTYP,
|
||
CAIG W,3 ;WHETHER WE'RE CHANGING IT NOW OR NOT.
|
||
MOVE D,TCTYP(I)
|
||
CAIL D,%TNMAX ;DON'T LET TCTYP BE SET TO ILLEGAL VALUE.
|
||
JRST OPNL33
|
||
CONO PI,TTYOFF
|
||
MOVE T,TTYTYP(I) ;DON'T LET %TPORS BE SET FOR PDP11 TV.
|
||
TRNE T,%TY11T
|
||
TRZA H,%TPORS+7*%TPPCR+%TPCBS
|
||
TRZA H,%TP11T ;%TP11T MUST REFLECT %TY11T.
|
||
IORI H,%TP11T
|
||
TRNE T,%TY11T
|
||
JRST [ MOVEI B,37. ;DON'T ALLOW A TV TO BE CALLED ANYTHING BUT.
|
||
MOVEI C,95.
|
||
MOVEI D,%TNTV
|
||
JRST NCNSS3]
|
||
CAIN D,%TNTV ;NOT A PDP11 LINE => DON'T LET IT BE TREATED AS ONE.
|
||
MOVEI D,%TNDP
|
||
NCNSS3: CAIGE W,6
|
||
MOVE H,TTYOPT(I)
|
||
SKIPE D
|
||
TLZ H,%TORAW ;"RAW" MODE EXISTS ONLY ON PRINTING TTYS.
|
||
SKIPGE TYMDTB(D)
|
||
TLZ H,%TOMVU+%TOERS ;DON'T CLAIM TO DO SOMETHING WE DON'T KNOW HOW TO DO
|
||
MOVEI T,1
|
||
TLNN H,%TOMVU
|
||
MOVEM T,TTYROL(I) ;ON PRINTING TTYS TTYROL MUST BE 1
|
||
TRNN H,%TPCBS ;IF ^\ ISN'T TO BE HANDLED SPECIALLY, MAKE SURE ALL OF
|
||
SETOM TTOALC(I) ;THE FEATURES IT PROVIDES ARE IN THEIR NORMAL STATES.
|
||
MOVEI TT,TYBN
|
||
TRNN H,%TPCBS+%TPTEL
|
||
MOVEM TT,TYBPC(I)
|
||
MOVE TT,I
|
||
IMULI TT,TPLEN*2 ;TT HAS IDX OF MAIN PC PPR OF TTY.
|
||
XORI W,-1 ;EACH OF THE INSNS AFTER THE JRST SETS ONE PARAMETER.
|
||
CAIL W,#6 ;>6 ARGS SAME AS 6 ARGS.
|
||
JRST NCNSS1+2(W) ;ELSE DON'T SET VARS WE DIDN'T GET ARGS FOR.
|
||
MOVEM H,TTYOPT(I)
|
||
PUSHJ P,NCNSSC ;SET TTYCOM
|
||
MOVEM D,TCTYP(I) ;SET TCTYP.
|
||
PUSHJ P,[CAIL C,3 ;DON'T ALLOW SCREEN WIDTH LESS THAN 3.
|
||
CAIL C,377777 ;DON'T ALLOW AN HPOS THAT WON'T FIT IN HALFWORD.
|
||
POPJ P, ;SPEC NO GOOD, IGNORE
|
||
JRST NCNSSH ] ;SET TCMXH.
|
||
PUSHJ P,[CAMN B,[200000,,] ;200000,, IS SPECIAL (PRINTING TTY).
|
||
JRST NCNSSV
|
||
CAIL B,3 ;DON'T ALLOW SCREEN HEIGHT LESS THAN 3.
|
||
CAIL B,120. ;VPOS MUST FIT IN ASCII CHARACTER, USUALLY.
|
||
POPJ P, ;NO GOOD, IGNORE
|
||
JRST NCNSSV ] ;SET TCMXV
|
||
NCNSS1: PUSHJ P,NCNSSG ;COMPUTE TTYEPP FROM NEW SETTINGS OF TTY VARS.
|
||
JRST TTYOJ1
|
||
|
||
;SET TTY WIDTH (NOT INCLUDING THE SPACE FOR THE "!") TO ARG IN C.
|
||
;TTY # IN I, MAIN PC PPR IDX IN TT.
|
||
NCNSSH: ADDI C,1
|
||
MOVEM C,TCMXH(I)
|
||
CAMG C,TTYIHP(I) ;DON'T ALLOW TTYIHP TO HAVE ILLEGAL VALUE.
|
||
SETZM TTYIHP(I)
|
||
.SEE TPHE ; MOVEM C,TPHE(TT)
|
||
.SEE TPHE ; MOVEM C,TPHE+TPLEN(TT)
|
||
CAMG C,TPHP(TT)
|
||
MOVEM C,TPHP(TT)
|
||
CAMG C,TPHP+TPLEN(TT)
|
||
MOVEM C,TPHP+TPLEN(TT)
|
||
POPJ P,
|
||
|
||
;SET TTY SCREEN HEIGHT FROM VALUE IN B.
|
||
NCNSSV: MOVEM B,TCMXV(I)
|
||
CAMG B,TTYIVP(I) ;DON'T ALLOW TTYIVP TO GET ILLEGAL VALUE.
|
||
SETZM TTYIVP(I)
|
||
.SEE TPVE ; MOVEM B,TPVE(TT)
|
||
.SEE TPVE ; MOVEM B,TPVE+TPLEN(TT)
|
||
HRLM B,TPSP+TPLEN(TT) ;CLOBBER THE 2ND PC PPR TO NULL STATE.
|
||
MOVEM B,TPVP+TPLEN(TT)
|
||
MOVEM B,TPVB+TPLEN(TT)
|
||
CAMG B,TPVP(TT)
|
||
SETZM TPVP(TT)
|
||
HRRZS TPSP(TT)
|
||
POPJ P,
|
||
|
||
;MAKE A TTY INTO AN ORDINARY PRINTING TTY.
|
||
;TTY # IN I; CLOBBERS TT,B,C.
|
||
NCNSSP: SETZM TCTYP(I)
|
||
MOVE TT,[%TOMVB+%TOOVR+%TOLWR,,%TPORS]
|
||
MOVE B,TTYTYP(I)
|
||
TRNN B,%TYSTY
|
||
IORI TT,%TPPCR
|
||
LDB B,[$TTOSP,,B]
|
||
CAIN B,2
|
||
TLC TT,%TOALT+%TOMVB+%TOLWR ;10CPS => ASSUME TELETYPE.
|
||
IFN 0,[ ;THIS WOULD TURN THE MOTOR OF A CRTSTY DISPLAY ON AND OFF.
|
||
CAIN B,5 ;120CPS => ASSUME TERMINET.
|
||
JRST [ TRC TT,%TPPCR+5*%TPPLF
|
||
MOVEI C,%TNTRM
|
||
MOVEM C,TCTYP(I)
|
||
JRST .+1 ]
|
||
];IFN 0
|
||
MOVEM TT,TTYOPT(I)
|
||
SETZM TTYSMT(I) ;NO GRAPHICS, NO LOCAL EDITING.
|
||
SETOM TTOALC(I) ;%TPCBS TURNED OFF
|
||
MOVEI TT,1 ;SCROLLS A LINE AT A TIME (THIS IS
|
||
MOVEM TT,TTYROL(I) ; MAINLY FOR THE BENEFIT OF TYIFLS)
|
||
HRRZ TT,I
|
||
IMULI TT,TPLEN*2
|
||
MOVEM TT,TTYEPP(I)
|
||
MOVEI C,71.
|
||
CAIE B,2 ;10 CPS => TELETYPE
|
||
MOVEI C,79. ;ANYTHING ELSE IS AT LEAST 80 WIDE
|
||
IFN 0,[
|
||
CAIN B,5
|
||
MOVEI C,119.
|
||
]
|
||
MOVSI B,(MOVE)
|
||
PUSHJ P,NCNSSH
|
||
JRST NCNSSV
|
||
|
||
;SET TTYEPP OF TTY # IN I, MAIN PC PPR # IN TT. CLOBBER H,TT.
|
||
;HAD BETTER ALWAYS BE CONO PI,CLKOFF HERE, OR SYSTEM MAY CRASH IN ECHOING CODE.
|
||
NCNSSG: MOVE H,TTYOPT(I)
|
||
TLNE H,%TOMVU ;NOT DISPLAY OR
|
||
TLNN H,%TOERS ;ARDS-LIKE (CAN'T ERASE)
|
||
JRST NCNSSF ; => CAN'T HAVE ECHO AREA.
|
||
MOVE H,TPLEN+TPVB(TT)
|
||
CAMGE H,TCMXV(I) ;NO ECHO LINES => CAN'T USE ECHO AREA.
|
||
ADDI TT,TPLEN ;ELSE USE IT.
|
||
NCNSSF: MOVEM TT,TTYEPP(I)
|
||
POPJ P,
|
||
|
||
IFN N11TYS,[
|
||
;RE-INIT THE PARAMETERS OF A T.V. WHEN IT BECOMES FREE.
|
||
NCNSST: HRRZ TT,I
|
||
IMULI TT,TPLEN*2
|
||
MOVEI B,%TNTV
|
||
MOVEM B,TCTYP(I)
|
||
MOVE B,[%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI+%TOLID+%TOCID,,%TP11T+%TPRSC]
|
||
MOVEM B,TTYOPT(I)
|
||
MOVEI B,4 ;TV'S SCROLL BY 4 LINES PER GLITCH
|
||
MOVEM B,TTYROL(I)
|
||
MOVEI B,37.
|
||
MOVEI C,95.
|
||
PUSHJ P,NCNSSH
|
||
JRST NCNSSV
|
||
];N11TYS
|
||
|
||
NCNSSC: XOR E,TTYCOM(I) ;DON'T CHANGE TTYCOM BITS EXCEPT THESE.
|
||
AND E,[%TCQRY+%TCRFS+%TCICO+%TCOCO,,]
|
||
XORM E,TTYCOM(I)
|
||
POPJ P,
|
||
|
||
TYVSRO: JUMPL A,OPNL33 ;CAN'T BE NEGATIVE
|
||
;CAME D,%TNTV ;CAN'T SET NON-ZERO ON TVS
|
||
CAML A,TCMXV(I);CAN'T BE BIGGER THAN SCREEN SIZE
|
||
JUMPN A,OPNL33
|
||
TLNN H,%TOMVU ;ON PRINTING TTYS, TTYROL MUST BE 1 OR GET INTO
|
||
CAIN A,1 ; INFINITE RECURSION AT TYOLF3/TYOCLR/TYOCRL
|
||
CAIA
|
||
JRST OPNL33
|
||
MOVEM A,TTYROL(I)
|
||
JRST TTYOJ1
|
||
|
||
;TTYVAR SYSTEM CALL - READ AND WRITE VARIOUS TTY VARIABLES
|
||
|
||
;TABLES OF TTY VARIABLES.
|
||
;THE NEXT 3 TABLES ARE PARALLEL, IF YOU CHANGE ONE CHANGE THEM ALL.
|
||
|
||
;TTY VARIABLE NAMES. MUST BE SORTED IN SIXBIT ORDER.
|
||
|
||
TYVTAB: SIXBIT/HEIGHT/
|
||
SIXBIT/IDLTIM/
|
||
SIXBIT/ISPEED/ ;IN BITS PER SECOND
|
||
SIXBIT/OSPEED/ ;IN BITS PER SECOND
|
||
SIXBIT/SMARTS/
|
||
SIXBIT/TCTYP/
|
||
SIXBIT/TTYCOM/
|
||
SIXBIT/TTYOPT/
|
||
SIXBIT/TTYROL/
|
||
SIXBIT/TTYSMT/
|
||
SIXBIT/TTYTYP/
|
||
SIXBIT/WIDTH/
|
||
LTYVTA==:.-TYVTAB
|
||
TYVTL2==.RADIX 2,CONC [.LENGTH/]\.-TYVTAB-1,/ ;BASE 2 LOG-1 OF TABLE SIZE
|
||
REPEAT 1_<TYVTL2>-<.-TYVTAB-1>-1, <SETZ>-1 ;PAD OUT TO POWER OF 2 SIZE
|
||
|
||
;INSTRUCTIONS TO GET VARIABLE INTO A
|
||
|
||
TYVGET: MOVE A,TCMXV(I)
|
||
PUSHJ P,[MOVE A,TIME ? SUB A,TTITM(I) ? POPJ P,]
|
||
PUSHJ P,[LDB A,[$TTISP,,TTYTYP(I)] ? MOVE A,BAUDRT(A) ? POPJ P,]
|
||
PUSHJ P,[LDB A,[$TTOSP,,TTYTYP(I)] ? MOVE A,BAUDRT(A) ? POPJ P,]
|
||
MOVE A,TTYSMT(I)
|
||
MOVE A,TCTYP(I)
|
||
MOVE A,TTYCOM(I)
|
||
MOVE A,TTYOPT(I)
|
||
MOVE A,TTYROL(I)
|
||
MOVE A,TTYSMT(I)
|
||
MOVE A,TTYTYP(I)
|
||
PUSHJ P,[MOVE A,TCMXH(I) ? SOJA A,CPOPJ]
|
||
|
||
;INSTRUCTIONS TO SET VARIABLE FROM A. OPNL33 IF VALUE BAD. OPNL26 IF CAN'T WRITE.
|
||
;OTHERWISE, IF GOES VIA .CALL CNSSET, MOVE A INTO APPROPRIATE AC (SEE COMMENT AT NCNSS0).
|
||
;FOR OTHER VARIABLES, JRST TO ROUTINE TO STORE A INTO VARIABLE.
|
||
|
||
TYVSET: MOVE B,A ;HEIGHT
|
||
JRST [SUB A,TIME ? MOVNM A,TTITM(I) ? JRST TTYOJ1] ;IDLTIM
|
||
JRST TYSISP ;ISPEED
|
||
JRST TYSOSP ;OSPEED
|
||
JRST TYVSSM ;SMARTS
|
||
MOVE D,A ;TCTYP
|
||
MOVE E,A ;TTYCOM
|
||
MOVE H,A ;TTYOPT
|
||
JRST TYVSRO ;TTYROL
|
||
JRST TYVSSM ;TTYSMT
|
||
JRST OPNL26 ;TTYTYP
|
||
MOVE C,A ;WIDTH
|
||
|
||
TYVSSM: MOVEM A,TTYSMT(I)
|
||
JRST TTYOJ1
|
||
|
||
;SET SPEED. MAYBE THIS SHOULD CHANGE IT IN HARDWARE ALSO?
|
||
TYSISP: SKIPA B,[$TTISP,,TTYTYP(I)]
|
||
TYSOSP: MOVE B,[$TTOSP,,TTYTYP(I)]
|
||
MOVEI C,17 ;FIND CODE
|
||
CAME A,BAUDRT(C)
|
||
SOJGE C,.-1
|
||
JUMPL C,OPNL33 ;NON-EXISTENT
|
||
DPB C,B
|
||
JRST TTYOJ1
|
||
|
||
;TRANSLATION FROM INTERNAL SPEED CODES TO BAUDS
|
||
BAUDRT: 0 ? 600. ? 110. ? 150.
|
||
300. ? 1200. ? 1800. ? 2400.
|
||
4800. ? 9600. ? 25000. ? 40000.
|
||
50000. ? 80000. ? -1 ? -2
|
||
|
||
;CODE FOR TTYVAR SYS CALL BEGINS HERE
|
||
|
||
NTTYVA: HRRE E,A
|
||
JSP J,ATTYC9 ;I TTY NUMBER
|
||
SKIPA J,[1]
|
||
SETO J, ;J GETS -1 IF IT'S OUR CONSOLE, 1 IF OTHER TTY CHNL.
|
||
AOSGE E ;SKIP IF ARG WAS -1 (OWN CNSL) OR CHANNEL NUMBER
|
||
MOVEI J,0 ;J ZERO IF TTY SPECIFIED BY NUMBER.
|
||
PUSHJ P,VARCAL ;RETURN WITH SUITABLE STUFF IN E,D,W
|
||
JUMPE W,NTTYV1
|
||
JUMPE J,OPNL26 ;ERR OUT IF WRITE LOCKED (SOMEONE ELSE'S TTY)
|
||
JUMPG J,NTTYV1 ;IF IT'S OUR CONSOLE, WAIT TILL WE OWN IT, OR INTERRUPT.
|
||
PUSHJ P,TTYWC2
|
||
NTTYV1: TLNN E,-1 ;DEFAULT LH OF SIXBIT VARIABLE NAME TO 'TTY'
|
||
HRLI E,'TTY ;SO CALLER CAN USE IMMEDIATE ARGUMENT -- PRETTY RANDOM
|
||
MOVEI B,0 ;LOOK UP IN TABLE OF TTY VARIABLES (TYVTAB)
|
||
REPEAT TYVTL2,[CAML E,TYVTAB+1_<TYVTL2-.RPCNT-1>(B)
|
||
ADDI B,1_<TYVTL2-.RPCNT-1>
|
||
]
|
||
CAME E,[<SETZ>-1]
|
||
CAME E,TYVTAB(B)
|
||
JRST OPNL11 ;IILEGAL TTY VARIABLE NAME
|
||
CONO PI,TTYOFF
|
||
XCT TYVGET(B) ;GET VALUE OF VARIABLE INTO A
|
||
JUMPE W,TTYOJ1 ;RETURN IF READING
|
||
HRRI W,A
|
||
XCT W ;PUT NEW VALUE INTO A
|
||
MOVE W,TYVSET(B) ;GET INSTRUCTION TO PUT A IN PROPER PLACE
|
||
MOVE B,TCMXV(I) ;SET UP OLD VARIABLES FOR NCNSS0
|
||
MOVE C,TCMXH(I)
|
||
SUBI C,1
|
||
MOVE D,TCTYP(I)
|
||
MOVE E,TTYCOM(I)
|
||
MOVE H,TTYOPT(I)
|
||
XCT W ;CHANGE THE AC CONTAINING THE VARIABLE TO BE CHANGED
|
||
MOVEI W,6 ;TELL CNSSET TO CHANGE EVERYTHING
|
||
JRST NCNSS0 ;MAKE THE CHANGES, THEN TTYOJ1.
|
||
|
||
;.CALL TTYFLS
|
||
; ARG 1 - <TTY>
|
||
;WITH CONTROL BITS 0, MARKS LAST INTERRUPT CHARACTER ITYIC'ED
|
||
; TO BE IGNORED AT MAIN PROGRAM LEVEL.
|
||
;WITH CONTROL BIT 1, DISCARDS ALL INPUT THROUGH LAST CHARACTER ITYIC'ED.
|
||
NTTYFLS:JSP J,TTYNGT
|
||
MOVE A,CTLBTS(U)
|
||
TRNN A,1
|
||
JRST NTTYF2
|
||
CONO PI,TTYOFF
|
||
NTTYF1: MOVE C,TIOP(I)
|
||
CAMN C,TINTP(I)
|
||
JRST TTYOJ1
|
||
PUSHJ P,TYIREM
|
||
JRST NTTYF1
|
||
|
||
NTTYF2: LDB A,TINTP(I)
|
||
TRO A,%TXIGN
|
||
DPB A,TINTP(I)
|
||
JRST POPJ1
|
||
|
||
NTTYESC: ;SIMULATES TYPING OF ^_
|
||
JSP J,ATTYC2 ;DECODE TTY SPEC. IF OUR CONSOLE, WAIT TILL WE CAN INPUT.
|
||
CONO PI,TTYOFF
|
||
HRRZ A,TTYIPC(I)
|
||
CAIE A,TTYI
|
||
JRST OPNL7 ;DEVICE NOT READY
|
||
MOVEI A,TYCI
|
||
MOVEM A,TTYIPC(I)
|
||
JRST TTYOJ1
|
||
|
||
;WHOLINE SYSTEM CALL.
|
||
;TAKES A MANDATORY 1ST ARGUMENT SPECIFYING A TTY.
|
||
;RETURNS TWO VALUES - THE OLD SETTINGS OF WHMODE AND WHJOB
|
||
;FOR THAT TTY.
|
||
;OPTIONAL 2ND AND 3RD ARGUMENTS SET WHMODE AND WHJOB. IF THEY
|
||
;ARE PRESENT, THE RETURNED VALUES ARE THE OLD SETTINGS.
|
||
;THE CALL FAILS FOR TTY'S OTHER THAN TV'S.
|
||
|
||
NWHOLI: JSP J,ATTYC ;DECODE THE TTY SPEC.
|
||
MOVE H,TTYOPT(I)
|
||
IFN N11TYS,TRNN H,%TP11T ;FAIL IF NOT PDP11 TV.
|
||
JRST OPNL34
|
||
IFN N11TYS,[
|
||
SKIPL TT11P ;TV PDP11 DOWN => DON'T USE IT.
|
||
JRST OPNL10
|
||
CAIGE W,2 ;IF THERE ARE OPTIONAL ARGS, DECODE THEM.
|
||
JRST NWHOL2
|
||
CAIE B,1 ;DECODE 3RD ARG ONLY IF RELEVANT.
|
||
JRST NWHOL2
|
||
MOVE J,C ;IT SHOULD BE A JOB SPEC.
|
||
CAIGE W,3
|
||
SETO J, ;USE -1 (SELF) AS THE DEFAULT.
|
||
JSP T,NCRUI2
|
||
JFCL
|
||
JUMPL J,OPNL34 ;PDP6 IS NO GOOD.
|
||
MOVE C,J
|
||
IDIVI C,LUBLK ;CONVERT USER IDX TO JOB #.
|
||
NWHOL2: ADD I,TT11HD
|
||
ADD I,TT1111
|
||
ADD I,TT1111
|
||
LDB TT,[$11AD0,,1-NF11TY(I)]
|
||
ADDI TT,TT11LO ;TT HAS PDP10 ADDR OF TTY'S WHOLINE VARS.
|
||
CONO PI,TTYOFF
|
||
MOVE T,WHMODE(TT) ;FIRST, GET THE CURRENT SETTINGS.
|
||
LDB Q,[$11WD0,,WHJOB(TT)]
|
||
CAIGE W,2
|
||
JRST NWHOL3
|
||
DPB B,[$11WD0,,WHMODE(TT)] ;THEN, SET TO NEW VALUES IF REQUIRED.
|
||
DPB C,[$11WD0,,WHJOB(TT)]
|
||
NWHOL3: CONO PI,TTYON
|
||
MOVE A,T ;PUT RETURN VALUES IN APPRO. ACS
|
||
ASH A,-24
|
||
MOVE B,Q
|
||
JRST POPJ1
|
||
]
|
||
|
||
;TVWHER SYSTEM CALL.
|
||
;TAKES 1 ARG SPECIFYING A TTY, WHICH MUST BE A TV TTY.
|
||
;RETURNS 2 VALUES.
|
||
;1ST VALUE: THE KEYBOARD NUMBER OF THE PHYSICAL TERMINAL IN USE.
|
||
;2ND VALUE: THE NUMBER OF THE DISPLAY BUFFER IN USE ON THIS TTY.
|
||
|
||
NTVWHE: JSP J,ATTYCI
|
||
MOVE H,TTYOPT(I)
|
||
IFN N11TYS, TRNN H,%TP11T
|
||
JRST OPNL34
|
||
IFN N11TYS,[
|
||
NTVWH1: LDB A,[$11AD0,,TT11HA]
|
||
ADDI A,TT11LO(I)
|
||
LDB B,[$11BY3,,1-NF11TY(A)]
|
||
LDB A,[$11BY2,,1-NF11TY(A)]
|
||
JRST POPJ1
|
||
]
|
||
|
||
SUBTTL .ITYIC, .LISTEN, TTY WHYINT
|
||
|
||
;.CALL ITYIC. 1 ARG, A TTY INPUT CHANNEL; 1 VALUE, THE INTERRUPT CHAR.
|
||
;FAILS IF THERE ARE NO INTERRUPT CHARACTERS.
|
||
NITYIC: JSP J,TTYNGT
|
||
AITYI1: SKIPG D,TINTC(I)
|
||
POPJ P,
|
||
MOVE A,TINTP(I) ;SAVE SOME INFO FOR DEBUGGING
|
||
MOVE J,TICC(I)
|
||
MOVE C,TIIP(I) ;GET THE END OF FILLED PART OF BUFFER
|
||
AITYI2: CAMN C,TINTP(I) ;IF OUR MOVING POINTER PASSES THERE, THERE ARE REALLY
|
||
BUG ;NO INT CHARS IN THE BUFFER. BUT TINTC NON-ZERO??
|
||
MOVE B,TINTP(I)
|
||
CAMN B,TIBEP(I) ;WRAP AROUND AT END OF BUFFER
|
||
SUBI B,TIBL
|
||
HRRM B,TINTP(I) ;ADVANCE TINTP TO NEXT CHARACTER.
|
||
ILDB B,TINTP(I)
|
||
TRZN B,%TXINT ;KEEP LOOKING TILL FIND NEXT INT. CHAR.
|
||
JRST AITYI2
|
||
DPB B,TINTP(I)
|
||
SOS TINTC(I)
|
||
HLRZ R,H ;GET IOCHNM BITS IN R. UNLESS %TIFUL IS SET,
|
||
MOVE A,B
|
||
AOS (P)
|
||
JRST TYINRM ;NORMALIZE PDP-11 12-BIT CHARACTERS TO 7-BIT.
|
||
|
||
;.CALL WHYINT ON TTY INPUT CHANNEL IS SIMILAR TO ITYIC
|
||
TYIWHY: JSP J,TTYNG1
|
||
PUSHJ P,AITYI1
|
||
SOS (P) ;DON'T SKIP-RETURN IF NO INTERRUPT CHARS
|
||
MOVE B,A ;SECOND RESULT IS INTERRUPT CHARACTER
|
||
MOVEI A,%WYTYI ;FIRST RESULT IS DEVICE CODE
|
||
JRST POPJ1
|
||
|
||
AITYI: SETO A, ;.ITYI OBSOLETE.
|
||
TDZA H,H
|
||
AITYIC: UMOVE A,(J) ;.ITYIC
|
||
PUSH P,J ;TURN INTO NEW SYSTEM CALL ITYIC
|
||
MOVE B,[SIXBIT /ITYIC/]
|
||
MOVEM B,LSCALL(U) ;FOR JOB DEVICES' SAKE.
|
||
MOVEI W,1
|
||
PUSHJ P,NITYIC
|
||
JRST POP1J
|
||
UMOVEM A,@(P)
|
||
JRST POP1J1
|
||
|
||
ALISTEN:SKIPGE I,TTYTBL(U) ;.LISTEN
|
||
JRST ALIS1
|
||
PUSHJ P,TYOWC
|
||
SKIPA B,TICC(I)
|
||
ALIS1: SETZ B,
|
||
MOVE A,PIRQC(U)
|
||
TRNE A,%PIC.Z
|
||
JRST UDELAY
|
||
UMOVEM B,(J)
|
||
POPJ P,
|
||
|
||
TTYFIN: JSP J,TTYNG1 ;HERE FOR .CALL FINISH ON TTY OUTPUT CHANNEL
|
||
PUSHJ P,TYOWC
|
||
JRST POPJ1
|
||
|
||
NLISTE: JSP J,TTYNGT ;HERE FOR .CALL LISTEN
|
||
PUSHJ P,TYOWC
|
||
MOVE A,TICC(I)
|
||
JRST POPJ1
|
||
|
||
TTYNGT: TRC A,-1 ;RH(A)=-1 => TREE'S CONSOLE
|
||
TRCN A,-1
|
||
JRST TTYNG2
|
||
MOVEI T,AIOCAL ;OTHERWISE MUST BE CHANNEL NUMBER
|
||
HRLI J,.+2
|
||
JRST CHNDCD
|
||
TLNN R,%CLSTI ;CHNDCD RETURNS CLSTB BITS IN R, IOCHNM WD CONTENTS IN H
|
||
JRST OPNL34
|
||
TTYNG1: HLRZ I,H
|
||
TRZ I,377700
|
||
TRZE I,400000 ;SKIP IF DEVICE (RATHER THAN CONSOLE)
|
||
TTYNG2: SKIPL I,TTYTBL(U)
|
||
JRST (J)
|
||
JRST OPNL10
|
||
|
||
TYOWHY: MOVEI A,%WYTYO ;.CALL WHYINT ON TTY OUTPUT CHANNEL
|
||
MOVSI B,(SETZ) ;FOR NOW, JUST ASSUME REASON IS **MORE**
|
||
JRST POPJ1
|
||
|
||
SUBTTL TTY OPEN
|
||
|
||
;LH TTY OPEN
|
||
;3.1 0 -> IN 1 -> OUT
|
||
;3.2 0 -> UNIT 1 -> BLOCK
|
||
|
||
;OUTPUT
|
||
;3.3 => IMAGE MODE (SET ALL %TGIMG BITS IN TTYST1 AND TTYST2)
|
||
;3.4 0 -> NORMAL 1 -> ECHO MODE OUTPUT (SET %TJECH, %TJPP2, %TJMOR).
|
||
;3.5 0 -> NORMAL 1 -> DISPLAYMODE, LOOK FOR ^P (SET %TJDIS).
|
||
;3.6 0 -> NORMAL 1 -> SUPER-IMAGE OUTPUT (SET %TJSIO).
|
||
|
||
;INPUT
|
||
;3.3 => IMAGE MODE (CLEAR ALL ECHO BITS IN TTYST1, TTYST2).
|
||
;3.4 => "DDT" (DON'T ECHO CR, LF, TAB)
|
||
;3.5 => CONVERT LOWER TO UPPER CASE
|
||
;3.6 => WANT 3 LINES IN ECHO AREA.
|
||
|
||
;BITS 3.4 AND 3.6 ON INPUT, AND BIT 3.3, HAVE EFFECT
|
||
;ONLY ON THE FIRST OPEN IN EITHER DIRECTION.
|
||
;(THEY ARE OBSOLETED BY THE TTYSET SYSTEM CALL)
|
||
|
||
;LH OF IOCHNM WD
|
||
;(SHOWS UP IN RH OF A ON .IOT, .CLOSE, ETC)
|
||
|
||
%TICNS==400000 ;4.9 1-> CONSOLE 0 -> DEVICE. THIS BIT EXIST IN INPUT AND OUTPUT CHNLS.
|
||
%TJCNS==400000 ;4.9 1-> CONSOLE 0 -> DEVICE
|
||
|
||
;OUTPUT:
|
||
%TJCP1==200000 ;^P-CODE ANTICIPATION STATE.
|
||
%TJCP2==100000 ; ". 0=>NORMAL, 1=> CHAR AFTER ^P, 2=> ^PH, 3=>^PV.
|
||
%TJECH==40000 ;SET => ECHO MODE OUTPUT.-MODE OUTPUT (ALL CHARS OUTPUT THE
|
||
;WAY THEY WOULD BE ECHOED)
|
||
%TJCTN==20000 ;SET => DON'T DO LINE-CONTINUATION.
|
||
%TJSTP==10000 ;SET => THIS CHANNEL IS HUNG IN **MORE**.
|
||
%TJDIS==4000 ;SET => LOOK FOR ^P CODES.
|
||
%TJSIO==2000 ;SET => SUPERIMAGE OUTPUT, NO PADDING OR CURSOR CTL.
|
||
%TJMOR==1000 ;SET => DON'T DO **MORE** PROCESSING.
|
||
%TJPP2==400 ;SET => USE ALTERNATE PC PPR (THE ECHO AREA)
|
||
%TJINK==200 ;SET => NEXT CHAR ASSUMED TO BE 1-POSITION PRINTING.
|
||
%TJHDE==100 ;SET => ACCOUTING FOR CURSOR MOTION DUE TO
|
||
;CHAR ECHOED ON A HALF-DUPLEX TTY.
|
||
|
||
;INPUT
|
||
;3.3 => NO ECHO.
|
||
%TIECH==40000 ;CAN READ EVEN IF CHAR NEEDS PI ECHOING.
|
||
%TIPEK==20000 ;DON'T REMOVE CHAR FROM BUFFER.
|
||
%TIACT==4000 ;SET => DON'T WAIT FOR ACTIVATION CHARACTER.
|
||
%TIINT==2000 ;SET => CAN READ A CHAR EVEN IF IT IS SUPPOSED TO INTERRUPT & HASN'T YET.
|
||
%TINWT==1000 ;SET => IF NO INPUT AVAILABLE, DON'T WAIT, JUST RETURN -1.
|
||
%TIFUL==400 ;SET => GIVE FULL CHARACTER (SIGNIFICANT ON IMLAX, TVS)
|
||
|
||
$TIIDX==220600 ;3.6-3.1 CONSOLE #, OR 77 FOR A "DISOWNED" CONSOLE TTY CHNL
|
||
;IE, ONE THAT CORRESPONDS TO NO REAL TTY. THEY EXIST ONLY IN
|
||
;TREES WITH NO TTY, IN JOBS THAT CAM FROM TREES WITH TTYS.
|
||
%TINON==77 ;"TTY #" FOR A CHANNEL WITH NO REAL TTY.
|
||
|
||
;ENTRY FOR OPEN OF TTY AS DEVICE TYN OR TNM
|
||
|
||
|
||
IFN TTLPTP,[
|
||
LPTO: MOVE J,TIME
|
||
SUB J,LPTTIME ;"LPT" INPUTS EVERY ONCE IN A WHILE IF IT IS UP
|
||
CAIL J,60. ;2 SECONDS
|
||
JRST OPNL7
|
||
SKIPA I,LPTTTY
|
||
]
|
||
TTYO: PUSHJ P,TTYFD ;TEST FOR FILE NAME OF .FILE. (DIR)
|
||
CAIL I,NCT
|
||
JRST OPNL1 ;TTY NUM TOO LARGE
|
||
TTYO3C:
|
||
IFN NNVTTS,[
|
||
.ERR Shouldn't this be using NFNVTY instead?
|
||
CAIGE I,NOTYS+NNTYS+NNVTTS
|
||
CAIGE I,NOTYS+NNTYS ;SKIP ON NOVA TTY
|
||
JRST TTYO3A
|
||
SKIPGE NOVATT
|
||
JRST OPNL10 ;NOVA LINK NOT ACTIVE
|
||
TTYO3A: CAMN I,NOVATT
|
||
JRST OPNL10 ;CANT OPEN TTY USED AS CNHL TO NOVA
|
||
]
|
||
MOVEI A,0 ;MARK AS A DEVICE
|
||
CONO PI,TTYOFF ;INTERLOCK WITH OTHER TTY OPENS, AND ^Z'S.
|
||
SKIPGE TT,TTYSTS(I) ;SKIP IF TTY OPEN
|
||
JRST TTYO3B ;OK IF TTY NOT OPEN
|
||
CAIE U,(TT) ;SAME USER THAT HAS IT?
|
||
JRST OPNL10 ;TTY ALREADY OPEN AS DEVICE BY SOMEONE ELSE.
|
||
TLNN TT,%TSCNS ;OPEN AS CONSOLE?
|
||
JRST TTYO8 ;NO, AS DEVICE
|
||
CONO PI,TTYON
|
||
JRST TTYO7 ;OPEN, THIS TIME AS CONSOLE.
|
||
|
||
TTYO3B: SKIPGE TTYSTA(I) ;TTY IS FREE: IS IT IN TRANSITION TO OR FROM BEING IN USE?
|
||
JRST TTYO8 ;OK IF NOT;
|
||
MOVE T,I ;STYOCF TAKES TTY # IN T.
|
||
PUSHJ P,STYOCF ;AND WAIT TILL TTY IS NO LONGER IN TRANSITION
|
||
PUSHJ P,UFLS
|
||
JRST TTYO3C ;THEN TRY AGAIN TO OPEN IT.
|
||
|
||
;TTY IS AVAIL. TO OPEN AS A DEVICE.
|
||
TTYO8: SKIPN TTNTO(I) ;IF TTY USED TO BE FREE, INIT. IT.
|
||
PUSHJ P,TTYINI
|
||
MOVSI TT,%TSFRE
|
||
ANDCAM TT,TTYSTS(I)
|
||
JRST TTYO3
|
||
|
||
TTYFD: PUSHJ P,FLDRCK ;SKIP IF FILE DIR BEING OPENED
|
||
JRST TTYFD1 ;FILE NAMES NOT SPECIAL
|
||
SUB P,[1,,1]
|
||
MOVEI J,6
|
||
JRST LISTF7 ;GO GET DIRCTORY
|
||
|
||
TTYFD1: JUMPE W,CPOPJ ;0 IS THE ONLY DEFINED MODE FOR ANY TTY OPEN
|
||
SUB P,[1,,1]
|
||
JRST OPNL12
|
||
|
||
FLDRCK: CAMN A,[SIXBIT /.FILE./]
|
||
CAME B,[SIXBIT /(DIR)/]
|
||
POPJ P,
|
||
JRST POPJ1
|
||
|
||
;INIT A TTY WHEN IT CEASES TO BE FREE. (ZFLAG7 FOR TTY, TTYO8 FOR TNM)
|
||
;CHNL 3 (TTYCHN) MUST BE OFF OR IN PROGRESS.
|
||
TTYINI: SETZM TTYST1(I)
|
||
SETZM TTYST2(I)
|
||
MOVSI J,%TACFM ;TTY NEEDS A CONSOLE FREE MESSAGE.
|
||
ANDCAM J,TTYSTA(I)
|
||
MOVE J,TTYTYP(I)
|
||
TRNN J,%TYSTY ;EXCEPT ON STY TTYS,
|
||
PUSHJ P,TTYIN1 ;INIT THE USER OPTIONS IN TTYOPT, TTYCOM.
|
||
MOVE J,TTYOPT(I)
|
||
HRLOI H,%TSFRE ;INITIALIZE TTYSTS FROM TTYOPT
|
||
TLNE J,%TOROL
|
||
TLO H,%TSROL
|
||
TLNN J,%TOMOR ;NOTE %TOMOR SAYS DO **MORE** PROC,
|
||
TLO H,%TSMOR ;%TSMOR SAYS INHIBIT **MORE** PROC.
|
||
TLNE J,%TOSA1
|
||
TLO H,%TSSAI
|
||
MOVEM H,TTYSTS(I)
|
||
HRRZ TT,I
|
||
IMULI TT,TPLEN*2
|
||
SETZM TPFLAG(TT)
|
||
SETZM TPFLAG+TPLEN(TT)
|
||
SETZ H, ;START OUT WITH NO ECHO LINES.
|
||
JRST ASCML1
|
||
|
||
;INIT A FEW BITS IN TTYOPT, TTYCOM THAT ARE CONSIDERED USER OPTIONS.
|
||
;NORMALLY DONE WHENEVER A TTY BECOMES IN USE, BUT ON STY TTY'S
|
||
;DONE ONLY WHEN THE STY IS INITIALIZED (SO STY-USER CAN SET THESE OPTIONS).
|
||
TTYIN1: MOVE J,TTYCOM(I)
|
||
TLZ J,%TCRFS+%TCQRY+%TCOCO+%TCICO
|
||
MOVEM J,TTYCOM(I)
|
||
MOVE J,TTYOPT(I) ;INIT SOME TTYOPT BITS.
|
||
TLZ J,%TOUSR
|
||
TRZ J,%TPUSR
|
||
TLO J,%TOMOR ;DO **MORE**
|
||
HLLM J,TTYOPT(I)
|
||
POPJ P,
|
||
|
||
;TELETYPE OPEN ROUTINES
|
||
|
||
;ENTRY FOR OPEN OF "TTY" AS A CONSOLE
|
||
|
||
TTYO1: PUSHJ P,TTYFD ;TEST FOR FILE NAME OF .FILE. (DIR)
|
||
TTYO7: MOVE I,TTYTBL(U)
|
||
JUMPGE I,TTYO2 ;JUMP IF HAS TTY NOW
|
||
TLNE I,%TBWAT
|
||
JRST TTYO2A
|
||
TLNN I,%TBNVR ;IF I SHOULD FAIL IF TRY TO OPEN TTY WHEN DON'T HAVE IT,
|
||
TLNN I,%TBDTY ;OR IF I HAVE DONE A .ATTY,
|
||
JRST OPNL10 ;THE OPEN SHOULD FAIL.
|
||
TTYO2A: PCLT
|
||
SKIPGE TTYTBL(U)
|
||
PUSHJ P,UFLS ;HANG UNTIL HAS TTY
|
||
MOVE I,TTYTBL(U)
|
||
TTYO2: HRRZS I ;TTY NUMBER
|
||
CAIL I,NCT
|
||
JRST 4,OPNL1 ;TTY NUM TOO LARGE
|
||
MOVSI A,%TICNS ;SAY TTY CHNL WILL BE OPEN AS CONSOLE.
|
||
CONO PI,TTYOFF
|
||
TTYO3: HRLZI J,(D) ;SET IOCHNM BITS (IN A) FROM OPEN MODE.
|
||
LSH J,1
|
||
TLZ J,700077 ;BUT DON'T USE PARTS OF OPEN WD USED FOR OTHER THINGS.
|
||
IOR A,J
|
||
IFN TTLPTP,[
|
||
CAMN I,LPTTTY ;SKIP IF OT TTY
|
||
HRRZM U,LPTUSR
|
||
]
|
||
DPB I,[$TIIDX,,A] ;LH OF A WILL BE STORED IN LH OF IOCHNM WORD
|
||
HRRZ TT,UUAC(U) ;TT HAS CHNL # BEING OPENED.
|
||
JUMPGE D,TTYO4 ;J IF INPUT OPEN.
|
||
TRNE D,20
|
||
TLO A,%TJSIO ;SUPER IMAGE OUT.
|
||
TRNE D,4
|
||
TLO A,%TJECH+%TJPP2+%TJMOR ;ECHO OUTPUT
|
||
TRNE D,10
|
||
TLO A,%TJDIS ;DISPLAY OUTPUT MODE.
|
||
MOVE J,TYOMSK(I)
|
||
IOR J,CHNBIT(TT) ;UPDATE CHANNELS-OPEN MASK
|
||
EXCH J,TYOMSK(I) ;FOR THE NEW OUTPUT CHANNEL.
|
||
JUMPN J,TTYO5 ;FOR 1ST OUTPUT OPEN, INIT TTYST1,2.
|
||
MOVE J,[101010,,101010]
|
||
IORM J,TTYST1(I)
|
||
IORM J,TTYST2(I) ;SET ALL THE OUTPUT-IN-IMAGE-MODE BITS.
|
||
TRNN D,2
|
||
ANDCAM J,TTYST1(I) ;IF NOT IMAGE, CLEAR THEM.
|
||
TRNN D,2
|
||
ANDCAM J,TTYST2(I)
|
||
JRST TTYO5
|
||
|
||
TTYO4: MOVE J,TYIMSK(I)
|
||
IOR J,CHNBIT(TT) ;UPDATE INPUT-CHNLS-OPEN MASK
|
||
EXCH J,TYIMSK(I) ;FOR NEWLY OPENED INPUT CHANNEL.
|
||
JUMPN J,TTYO5 ;THE 1ST INPUT CHNL OPEN, INIT ECHO BITS...
|
||
MOVEI H,0 ;INPUT
|
||
TRNE D,20
|
||
MOVEI H,3 ;# COMMAND LINES
|
||
PUSHJ P,ASCML1
|
||
MOVE J,TTYST1(I)
|
||
AND J,[101010,,101010] ;SAVE IMAGE MODE OUTPUT BITS
|
||
TRNN D,2 ;SKIP ON IMAGE MODE INPUT
|
||
IOR J,[202020,,202020] ;ASCII MODE INPUT
|
||
IOR J,[030303,,030303] ;ENABLE INTERRUPT AND ACTIVATE ON ANY CHARACTER
|
||
MOVEM J,TTYST1(I) ;STORE BACK
|
||
MOVE J,TTYST2(I)
|
||
AND J,[101010,,101010] ;SAVE IMAGE MODE OUTPUT BITS
|
||
TRNN D,2 ;SKIP ON IMAGE MODE INPUT
|
||
IOR J,[202020,,200020] ;SAY ALL CHARS EXCEPT RUBOUT SHOULD ECHO.
|
||
TRNE D,4 ;SKIP ON NOT DDT MODE
|
||
ANDCM J,[006000,,606000] ;DDT MODE
|
||
IOR J,[030303,,030303] ;ENABLE INTERRUPT AND ACTIVATE ON ANY CHARACTER
|
||
MOVEM J,TTYST2(I) ;STORE BACK
|
||
TTYO5: HRRM U,TTYSTS(I)
|
||
AOS TTNTO(I) ;INCREMENT NUMBER OF CHNLS THIS TTY OPEN ON.
|
||
CONO PI,TTYON
|
||
MOVSS C
|
||
JSP Q,OPSLC3 ;SET UP IO CHNM WORD AND RETURN
|
||
TYIDN,,TYODN
|
||
TYIBN,,TYOBN
|
||
|
||
SUBTTL WAITING FOR ACCESS TO TTY
|
||
|
||
;HERE WHEN WANT TO DO TTY INPUT, TO CHECK FOR PERMISSION.
|
||
TTYWI: HLRZ I,(R)
|
||
ANDI I,%TICNS+(.BM $TIIDX)
|
||
TRZN I,%TICNS ;CLEAR AND CHECK CONSOLE/DEVICE BIT
|
||
POPJ P, ;RETURN RIGHT AWAY IF DEVICE
|
||
;CALL FROM ATTYCR.
|
||
TTYWI2: MOVE T,TTYTBL(U)
|
||
TLNN T,%TBNOT ;RETURN RIGHT AWAY IF WE OWN THE TTY.
|
||
POPJ P,
|
||
TLNE T,%TBIIN ;ELSE INTERRUPT IF %TBIIN IS SET.
|
||
JRST TTYLOS
|
||
TTYWC3: TLC T,%TBINT ;ELSE INTERRUPT IF %TBINT IS SET AND NOT %TBWAT.
|
||
TLNN T,%TBINT+%TBWAT
|
||
JRST TTYLOS
|
||
PCLT
|
||
SKIPGE TTYTBL(U)
|
||
PUSHJ P,UFLS ;WAIT TILL HAS TTY (CANT HAVE TTY IF DISOWNED)
|
||
POPJ P,
|
||
|
||
;CALL FROM ATTYC, ATTYC2. WAIT TILL WE OWN THE TTY.
|
||
TTYWC2: MOVE T,TTYTBL(U)
|
||
TLNN T,%TBNOT ;RETURN RIGHT AWAY IF WE OWN THE TTY.
|
||
POPJ P,
|
||
JRST TTYWC3
|
||
|
||
;HERE WHEN WANT TO DO A TTY RESET.
|
||
;SKIP IF THE RESET SHOULD REALLY BE DONE.
|
||
TTYWR: HLRZ I,(R)
|
||
ANDI I,%TICNS+(.BM $TIIDX)
|
||
TRZN I,%TICNS ;CLEAR AND CHECK CONSOLE/DEVICE BIT
|
||
JRST POPJ1 ;RETURN YES IF DEVICE
|
||
MOVE T,TTYTBL(U)
|
||
TLNN T,%TBNOT ;RETURN YES IF WE OWN THE TTY.
|
||
JRST POPJ1
|
||
POPJ P, ;OTHERWISE IGNORE THE RESET.
|
||
|
||
;HERE TO WAIT FOR OUTPUT PERMISSION FOR TTY
|
||
;RETURN WITHOUT SKIP IF THE OUTPUT SHOULD BE THROWN AWAY
|
||
;AND REPORTED TO THE USER AS DONE.
|
||
TTYWO: HLRZ I,(R)
|
||
ANDI I,%TICNS+(.BM $TIIDX)
|
||
TRZN I,%TICNS
|
||
JRST POPJ1 ;ALWAYS HAVE PERMISSION IF TTY IS A DEVICE.
|
||
;CALL FROM ATTYC, ETC.
|
||
TTYWO2: MOVE A,U
|
||
HRRZ T,I
|
||
CAIN T,%TINON ;NEVER HAVE PERMISSION FOR CONSOLE IF WE'RE DISOWNED.
|
||
JRST TTYWO1
|
||
MOVE T,TTYTBL(U) ;WE HAVE OUTPUT PERMISSION IFF ALL OUR SUPERIORS
|
||
;HAVE PERMISSION AND WE HAVE %TBOUT
|
||
;AND THE TREE HAS A TTY.
|
||
;THE NEXT INSN IS TEMPORARY, UNTIL DDT ETC. ARE CHANGED TO WIN FULLY.
|
||
TTYWO3: JUMPGE T,TTYWO4 ;IF WE HAVE THE TTY, WE CAN TYPE ON IT.
|
||
SKIPGE SUPPRO(A) ;ALL OK TO TOP OF TREE => SEE IF TREE HAS A TTY.
|
||
JRST TTYWO4
|
||
TLNN T,%TBOUT ;NOT AT TREE TOP => DOES THIS JOB HAVE PERMISSION
|
||
JRST TTYWO1 ;FROM ITS SUPERIOR?
|
||
MOVE A,SUPPRO(A) ;AND IS THE SUPERIOR ALLOWING ANY INFERIORS PERMISSION?
|
||
MOVE T,TTYTBL(A)
|
||
TLNE T,%TBINF ;SUPERIOR SAYS WE'RE OK => SEE IF SUPERIOR HAS PERMISSION.
|
||
JRST TTYWO3
|
||
TTYWO1: MOVE T,TTYTBL(U) ;HERE IF WE DON'T HAVE PERMISSION.
|
||
TLNE T,%TBOIG ;IF OUTPUT IS TO BE IGNORED,
|
||
POPJ P, ;TELL OUR CALLER TO THROW IT AWAY, RIGHT NOW.
|
||
TLNE T,%TBWAT+%TBOUT
|
||
JRST TTYWO6
|
||
TLNE T,%TBINT
|
||
JRST TTYLOS
|
||
TLNE T,%TBNVR+%TBDTY
|
||
JUMPL I,[ SUB P,[1,,1] ? JRST OPNL10 ]
|
||
TTYWO6: MOVE T,TTYTBL(A) ;ELSE MUST WAIT. WAIT FOR A CHANGE IN THE
|
||
CAMN T,TTYTBL(A) ;TTYTBL OF THE SUPERIOR DENYING US PERMISSION.
|
||
PUSHJ P,UFLS
|
||
JRST TTYWO ;NOW RE-CHECK EVERYTHING.
|
||
|
||
;WE HAVE PERMISSION, BUT MAYBE WAIT ANYWAY TO AVOID MIXING JOBS' OUTPUT.
|
||
TTYWO4: SKIPGE TTYTBL(U) ;NO NEED TO WAIT IF WE OWN THE TTY
|
||
CAMN U,TTYLJB(I) ;OR WE WERE LAST JOB TO USE IT.
|
||
JRST TTYWO5
|
||
MOVEI T,TOBS ;ELSE WAIT FOR BUFFER TO BE EMPTY
|
||
CAMN T,TORM(I)
|
||
JRST TTYWO5
|
||
CAME T,TORM(I)
|
||
PUSHJ P,UFLS
|
||
JRST TTYWO ;RECHECK EVERYTHING, SINCE WE MAY HAVE LOST PERMISSION.
|
||
|
||
;WE ARE ALLOWED TO OUTPUT RIGHT AWAY.
|
||
TTYWO5: MOVEM U,TTYLJB(I) ;MAKE SURE WE DON'T HAVE TO WAIT AGAIN.
|
||
JRST POPJ1
|
||
|
||
;TURN TTY OFF, THEN WAIT UNTIL EITHER TTY ISN'T IN COM MODE OR
|
||
;ONE OF THE BITS IN T IS SET IN TTYCOM(I).
|
||
TTYCMW: CONO PI,TTYOFF
|
||
TDNN T,TTYCOM(I)
|
||
SKIPL TTYCOM(I)
|
||
POPJ P,
|
||
SKIPN USER
|
||
POPJ P, ;SYS JOB TRYING TO HACK
|
||
HRR T,I ;WAIT UNTIL NOT COM MODE OR IN COM MODE BUT ONE OR MORE BITS IN LH OF T
|
||
PUSHJ P,LWAIT1 ;COME ON. WAIT UNTIL OUT OF COM MODE WITH UTCOFF
|
||
PUSHJ P,TTYSCM
|
||
POPJ P,
|
||
|
||
TTYSCM: SKIPL TTYCOM(T)
|
||
JRST POPJ1 ;NOT COM MODE
|
||
PUSH P,A
|
||
HLLZ A,TTYCOM(T)
|
||
TDNE A,T
|
||
AOS -1(P) ;MASKED BIT(S) ON
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
|
||
;ECHOIN SYSTEM CALL. ASK FOR ECHOING OF CERTAIN CHARACTERS
|
||
;UNTIL A BREAK CONDITION OCCURS.
|
||
;A BREAK CONDITION IS WHEN EITHER A NON-ECHOED CHARACTER IS TYPED IN
|
||
;OR A CERTAIN NUMBER OF CHARACTERS HAVE BEEN TYPED IN.
|
||
;CHARACTERS ECHOED BY THE ECHOIN ARE STORED INTO THE USER'S
|
||
;MEMORY BY THE INTERRUPT LEVEL. IF THE NECESSARY AREAS OF MEMORY
|
||
;ARE SWAPPED OUT, THAT CONSTITUTES A BREAK CONDITION.
|
||
|
||
;THE BREAK TABLE IS 128 BITS (DIVIDED INTO 4 WORDS THE LOW 4 BITS OF EACH UNUSED)
|
||
;ONE BIT FOR EACH ASCII CHARACTER. A 1 INDICATES A CHARACTER THAT
|
||
;IS A BREAK CONDITION. A 0 INDICATES A CHARACTER THAT CAN BE ECHOED.
|
||
;A CHARACTER WITH THE CONTROL OR META BIT IS ALWAYS A BREAK.
|
||
|
||
;ARG 1 TTY INPUT CHANNEL
|
||
;ARG 2 B.P. TO WHERE IN USER'S MEMORY TO STORE CHARACTERS.
|
||
;ARG 3 NUMBER OF CHARACTERS TO ALLOW
|
||
;ARG 4 ADDRESS OF BREAK TABLE.
|
||
;ARG 5 ADDRESS OF BLOCK OF COUNTERS TO BE INCREMENTED OR DECREMENTED FOR EACH CHARACTER.
|
||
; IF THE ADDRESS IS ZERO, ALL THIS IS OMITTED.
|
||
; THE BLOCK HAS SEVEN WORDS.
|
||
; THE FIRST TWO WORDS ARE LEFT ALONE.
|
||
; THE NEXT FOUR ARE INCREMENTED.
|
||
; THE SEVENTH IS DECREMENTED.
|
||
|
||
;THE WORDS OF THE BREAK TABLE RESIDE IN ACS Q, J, R AND W.
|
||
;SIMILARLY, THE ADDRESS OF THE COUNT RESIDES IN AC C,
|
||
;THE ADDRESS OF THE BYTE POINTER IN B,
|
||
;AND THE ADDRESS OF THE BLOCK OF COUNTERS IN E.
|
||
;THEY ARE LOOKED AT BY THE INTERRUPT LEVEL,
|
||
;WHICH KNOWS THAT THE PROGRAM IS EXECUTING AN ECHOIN
|
||
;BY THE FACT THAT THE PC IS NECHO1. IT IS IMPORTANT THAT WE
|
||
;NOT LOCK ANY SWITCHES SO THAT SWAPPING OUT A PAGE WON'T PCLSR
|
||
;US UNTIL WE ARE AWAKENED BY THE INTERRUPT LEVEL WHEN IT SEES
|
||
;THAT THE PAGES IT NEEDS ARE NOT IN CORE.
|
||
|
||
NECHOIN:
|
||
JSP J,ATTYCR ;DECODE CHANNEL. GET TTY NUMBER IN I.
|
||
XCTR XRW,[MOVES A,(C)] ;MAKE SURE COUNT IS IN CORE AND WRITABLE.
|
||
JUMPLE A,POPJ1 ;IF WANT ZERO OR FEWER CHARACTERS, RETURN IMMEDIATELY.
|
||
XCTR XRW,[MOVES A,(B)] ;MAKE SURE BYTE POINTER IS IN CORE AND WRITABLE.
|
||
IBP A ;MAKE SURE BYTE BUFFER IS IN CORE AND WRITABLE.
|
||
XCTR XRW,[MOVES (A)] ; (NO LOSSAGE IF IT ISN'T, BUT MIGHT AS WELL SWAP IT IN NOW.)
|
||
XCTR XRW,[MOVES (E)] ;MAKE SURE BLOCK OF COUNTERS IS IN CORE AND WRITABLE.
|
||
XCTR XRW,[MOVES 6(E)]
|
||
UMOVE Q,(D) ;LOAD BREAK TABLE WORDS INTO Q, J, R, W.
|
||
UMOVE J,1(D)
|
||
UMOVE R,2(D)
|
||
UMOVE W,3(D)
|
||
SKIPE TICC(I) ;IF TYPE-AHEAD AVAILABLE, WE CAN'T DO ANYTHING.
|
||
JRST POPJ1
|
||
SKIPG TACC(I) ;WAIT FOR AN ACTIVATION (PROBABLY NON-ECHOED) CHARACTER.
|
||
PUSHJ P,TYIFL2 ;CALL TYIFL2 INSTEAD OF UFLS TO PREVENT IMPENDING **MORE**.
|
||
NECHO1: JRST POPJ1 ;THE JOB IS INSIDE AN ECHOIN IF ITS PC IS HERE.
|
||
|
||
SUBTTL TTY INPUT IOT
|
||
|
||
;BLOCK MODE INPUT IOT.
|
||
TTYBI: JSP E,INBTCH
|
||
|
||
;UNIT MODE INPUT IOT.
|
||
;R HAS THE ADDRESS OF THE IOCHNM WORD.
|
||
;VALUE RETURNED IN W.
|
||
TYI: PUSHJ P,TTYWI ;WAIT FOR THE TTY IF ITS A CONSOLE. TTY NUMBER IN I
|
||
HLRZ R,(R) ;GET IOCHNM WORD FLAGS, MODIFIED BY CTL BITS
|
||
XOR R,CTLBTS(U) ;R HAS CHANNEL FLAGS
|
||
PUSH P,E
|
||
PUSHJ P,TYI0 ;GET THE CHAR IN D.
|
||
POP P,E
|
||
JUMPL D,UNIEOF ;TYI0 RETURN -1 => DON'T FLUSH THE SIGN BIT, AND TERMINATE BLOCK IOT.
|
||
ANDI D,%TXPIE+%TXMPE+%TXECI+%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
|
||
CAIN A,^C
|
||
AOS (P) ;EOF, SKIP RETURN
|
||
MOVE W,D
|
||
POPJ P,
|
||
|
||
;ASSUMING I HAS TTY NUMBER AND R HAS IOCHNM BITS.
|
||
;READ A CHARACTER FROM THE TERMINAL AND RETURN IT IN D.
|
||
TYI0: MOVE D,TTYTYP(I)
|
||
TRNN D,%TYSTY ;SKIP IF TTY IS ALTER EGO OF STY.
|
||
JRST TYI1B1
|
||
MOVSI D,%SSINT
|
||
TDNE D,STYSTS-NFSTTY(I)
|
||
JRST TYI1B1 ;HAVE ALREADY GIVEN INT
|
||
SKIPE TICC(I)
|
||
JRST TYI1B1
|
||
IORB D,STYSTS-NFSTTY(I)
|
||
MOVE TT,STYOMS-NFSTTY(I) ;CHANNELS OPEN FOR OUTPUT ON
|
||
AND TT,MSKST2(D)
|
||
MOVN B,TT
|
||
AND TT,B
|
||
IORM TT,IFPIR(D) ;GIVE INT ON LOWEST-NUMBERED CHANNEL.
|
||
JRST TYI1B1
|
||
|
||
TYI1B1: TRNE R,%TIACT
|
||
JRST TYI1B ;GOBBLE NEXT CHR REGARDLESS OF ACTIVATION
|
||
MOVE TT,TTYSTS(I)
|
||
TLNE TT,%TSACT
|
||
JRST TYI1B
|
||
PCLT
|
||
SKIPG TACC(I)
|
||
PUSHJ P,TYIFLS
|
||
TYI1B: PCLT ;WAIT TILL THERE'S A CHAR TO READ.
|
||
SKIPG TICC(I)
|
||
PUSHJ P,TYIFLS
|
||
CONO PI,CLKOFF ;PREVENT ECHOING WHILE WE'RE MESSING WITH POINTERS.
|
||
MOVE B,TIOP(I)
|
||
MOVE T,B
|
||
CAMN B,TIBEP(I)
|
||
SUBI B,TIBL
|
||
ILDB D,B
|
||
SKIPN TT,TICC(I) ;CHECK FOR CHAR FLUSHED BY ECHO BEFORE WE TURNED OFF CLOCK.
|
||
JRST TYI1A
|
||
TRNN D,%TXIGN
|
||
JRST TYI1
|
||
TRNN R,%TIECH
|
||
TRNN D,%TXPIE
|
||
JRST [ PUSHJ P,TYIREM
|
||
JRST TYI1A ]
|
||
PCLT
|
||
CAMN T,TIOP(I) ;WAIT FOR ECHOING TO FLUSH THIS CHAR FROM BUFFER,
|
||
PUSHJ P,UFLS
|
||
TYI1A: CONO PI,CLKON ;ALLOW ECHOING.
|
||
JRST TYI1B1 ;THEN TRY AGAIN TO READ CHAR.
|
||
|
||
TYI1: CONO PI,CLKON ;ALLOW ECHOING.
|
||
MOVE T,TTYSTS(I)
|
||
TLNN T,%TSNOE ;ECHOING BEING DEFERRED OR
|
||
TRNE R,%TIECH ;THIS CHANNEL NEEDN'T WAIT FOR ECHO
|
||
ANDCMI D,%TXPIE ;=> DON'T.
|
||
SKIPE PICLR(U) ;AT INT LVL IN USER PRGM OR
|
||
TRNE R,%TIINT ;THIS CHNL NEEDN'T WAIT FOR CHAR TO INTERRUPT
|
||
ANDCMI D,%TXINT ;=> DON'T WAIT FOR THAT.
|
||
MOVEI T,(D)
|
||
ANDI T,%TXINT+%TXPIE ;WAIT FOR THESE BITS TO CLEAR.
|
||
TRNE T,%TXINT ;IF ABOUT TO WAIT FOR %TXINT TO CLEAR,
|
||
PUSHJ P,TYIIWT ;TAKE CARE OF SEVERAL POSSIBLE SCREWS - MAY SET T.
|
||
LDB D,[360600,,B]
|
||
LSH T,(D)
|
||
PCLT
|
||
TDNE T,@B
|
||
PUSHJ P,UFLS ;HANG UNTIL PI ECHO BIT FOR THIS CHAR IS TURNED OFF
|
||
LDB D,B ;GET CHARACTER
|
||
TRNN R,%TIECH ;IF WE AREN'T SUPPRESSING ECHOING,
|
||
TRNN D,%TXMPE ;AND M.P. ECHOING NEEDED BUT NOT YET DONE,
|
||
JRST TYI2
|
||
MOVE T,TTYSTS(I)
|
||
TLNE T,%TSNOE
|
||
JRST TYI2
|
||
JRST TYIMP1 ;GO DO IT.
|
||
|
||
TYIMP1: PUSH P,R ;DO MAIN-PRGM ECHO IF NECESSARY.
|
||
PUSH P,C
|
||
PUSHJ P,[MOVEI J,1(P)
|
||
ADD P,[3,,3]
|
||
HRRZM P,(P)
|
||
MOVE TT,TTYEPP(I)
|
||
PUSHJ P,NULSET ;NO LOSSET OF IOCHNM
|
||
JSP E,TYOSE1
|
||
MOVEI R,%TJECH+%TJMOR
|
||
MOVE A,D
|
||
ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
|
||
JRST TYO6]
|
||
POP P,C
|
||
POP P,R
|
||
CONO PI,TTYOFF
|
||
MOVE B,TIOP(I)
|
||
CAMN B,TIBEP(I)
|
||
SUBI B,TIBL
|
||
ILDB D,B
|
||
TRZ D,%TXMPE ;M.P. ECHOING NO LONGER PENDING FOR THIS CHAR.
|
||
DPB D,B
|
||
CONO PI,TTYON
|
||
TYI2: TRNN R,%TIPEK ;DON'T REMOVE IF CHNL SAYS DON'T.
|
||
PUSHJ P,TYIREM ;FINALLY REMOVE CHAR FROM BUFFER.
|
||
MOVE TT,TTYCOM(I)
|
||
TLNE TT,%TCLED ;DOES THIS JOB WANT TO SEE LOCAL EDITING PROTOCOL
|
||
JRST TYI2Z ;REPLIES, ETC.?
|
||
MOVE TT,D
|
||
ANDI TT,%TXTOP+%TXASC ;NO. DISCARD THEM.
|
||
CAIE TT,%TXTOP+"S ;TOP-S AND TOP-E ARE SPECIAL COMMANDS SENT
|
||
CAIN TT,%TXTOP+"E ;BY LOCAL EDITING TTYS.
|
||
JRST [SKIPG TICC(I) ;IGNORE THE TOP-E OR TOP-S,
|
||
PUSHJ P,UFLS ;AND THE CHARACTER AFTER IT AS WELL.
|
||
PUSHJ P,TYIREM
|
||
JRST TYI1B1]
|
||
CAIN TT,%TXTOP+"T ;TOP-T MEANS "LABEL FAILURE" IN LINE SAVING PROTOCOL.
|
||
JRST [ MOVEI T,3 ;IGNORE COMMAND AND THREE ARGS.
|
||
CAMLE T,TICC(I)
|
||
PUSHJ P,UFLS
|
||
PUSHJ P,TYIREM
|
||
PUSHJ P,TYIREM
|
||
PUSHJ P,TYIREM
|
||
JRST TYI1B1]
|
||
TYI2Z: MOVE T,TTYSTS(I)
|
||
TLNE T,%TSCNS
|
||
SKIPGE SUPPRO(U)
|
||
JRST TYI3 ;DEFERRED CALL IGNORED IF TOP-LEVEL, OR NOT A CONSOLE
|
||
CAIN TT,%TXTOP+"Z
|
||
JRST [ TRNE R,%TIPEK ;DEFERRED CALL
|
||
PUSHJ P,TYIREM ;REMOVE IT IF DIDN'T ALREADY
|
||
MOVSI T,(%PIDCL)
|
||
JRST UUOER1 ]
|
||
TYI3: MOVSI TT,%TSACT
|
||
ANDCAM TT,TTYSTS(I)
|
||
;TYIFLS CAN COME HERE AFTER THROWING AWAY 1 WORD FROM STACK, FOR NO CHARS AVAIL WITH %TINWT.
|
||
TYI4: MOVSI TT,%SSINT ;IF TTY IS STY'S, MAKE SURE NEXT TTY IOT GIVES STY OUTPUT INT.
|
||
MOVE B,TTYTYP(I)
|
||
TRNE B,%TYSTY
|
||
ANDCAM TT,STYSTS-NFSTTY(I)
|
||
SKIPGE A,D ;CHAR IN A FOR TYINRM
|
||
POPJ P, ;DON'T CANONICALIZE A -1 (NO CHARS AVAILABLE) TO A RUBOUT!
|
||
PUSHJ P,TYINRM ;CANONICALIZE TO ASCII UNLESS %TIFUL IS SET.
|
||
ANDI D,%TXPIE\%TXMPE\%TXECI ;BUT PRESERVE THE EXTRA INFO BITS
|
||
IOR D,A ;WHICH ARE NOT REALLY PART OF THE CHARACTER.
|
||
ANDI A,%TXASC
|
||
POPJ P,
|
||
|
||
;ASSUME R HAS IOCHNM BITS (OR AT LEAST THE %TIFUL BIT).
|
||
;TURN CHAR. IN A TO 7-BIT ASCII CHAR IF %TIFUL IS OFF.
|
||
TYINRM: ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
|
||
TRNE R,%TIFUL
|
||
POPJ P,
|
||
MOVE TT,A ;LEAVE THE HELP CHARACTER ALONE
|
||
ANDI TT,%TXTOP+%TXASC ;(THIS USED TO FLUSH THE SUPER ("SHIFT") BIT
|
||
CAIN TT,%TXTOP+"H ; PERHAPS IT SHOULD FLUSH ALL OF CTL/MTA/SUP?)
|
||
POPJ P,
|
||
TYINR2: ANDI A,%TXCTL+%TXASC ;FLUSH THE EXTRA BITS.
|
||
TRZE A,%TXCTL ;DON'T WANT FULL CHAR SET: TURN CTL+X INTO ASCII CTL-X
|
||
CAIN A,177 ;BUT LEAVE CTL-RUBOUT AS RUBOUT, FOR TECO'S SAKE.
|
||
POPJ P,
|
||
CAIGE A,77 ;CTL-? => RUBOUT
|
||
JRST [ CAIN A,40 ;CTL-SPACE => CTL-@
|
||
MOVEI A,^@ ;41-76 STAY THE SAME
|
||
POPJ P, ] ;LETTERS TURN INTO ASCII CONTROLS
|
||
CAIL A,140 ;TO CONTROLIFY, FIRST TURN LOWER CASE TO UPPER,
|
||
SUBI A,40
|
||
XORI A,100 ;THEN TOGGLE 100 BIT, TURNING A INTO ^A AND ? INTO RUBOUT.
|
||
POPJ P,
|
||
|
||
;REMOVE THE FIRST CHAR. FROM THE INPUT BUFFER, AND RETURN IT IN D.
|
||
;UPDATES ALL COUNTS AND POINTERS. HALTS IF BUFFER EMPTY.
|
||
;CLOBBERS B,TT.
|
||
TYIREM: CONO PI,TTYOFF
|
||
PUSHJ P,TYIRE1
|
||
JRST TTYONJ
|
||
|
||
TYIRE1: SOSGE TICC(I) ;ENTRY WHEN TTYCHN IS OFF.
|
||
BUG PAUSE,[TTY: BUFFER EMPTY AT TYIREM]
|
||
MOVE B,TIOP(I) ;SAVE COPY OF BUFFER-EMPTYING POINTER IN TT.
|
||
MOVE TT,B
|
||
CAMN B,TIBEP(I) ;ADVANCE THE POINTER, FETCHING THE CHARACTER.
|
||
SUBI B,TIBL
|
||
ILDB D,B
|
||
MOVEM B,TIOP(I)
|
||
TRNE D,%TXACT ;IF CHAR SAYS IT WAS AN ACTIVATION CHAR, UPDATE # OF ACTIVATION
|
||
SOS TACC(I) ;CHARS STILL INB THE BUFFER.
|
||
TRNE D,%TXPIE ;IF IT NEEDED PI ECHO,
|
||
SOS ECHOC(I) ;ONE FEWER CHAR AWAITS PI ECHO.
|
||
TRNE D,%TXINT
|
||
SOS TINTC(I) ;SIMILAR FOR INT. TO PROGM.
|
||
SKIPL TINTC(I)
|
||
SKIPGE ECHOC(I)
|
||
BUG PAUSE,[TTY: TINTC OR ECHOC OVER-DECREMENTED]
|
||
CAMN TT,ECHOP(I) ;IF ECHOP POINTED AT THIS CHAR,
|
||
MOVEM B,ECHOP(I) ;ADVANCE IT.
|
||
CAMN TT,TINTP(I) ;SIMILAR FOR TINTP
|
||
MOVEM B,TINTP(I)
|
||
POPJ P,
|
||
|
||
;COME HERE WHEN ABOUT TO WAIT FOR A CHAR'S %TXINT TO CLEAR OUT.
|
||
;CLOBBERS D, TT; MAY ZERO %TXINT IN T, IN WHICH CASE CALLER SHOULD
|
||
;NOT BOTHER TO WAIT FOR %TXINT TO CLEAR.
|
||
TYIIWT: MOVE D,MSKST2(U)
|
||
AND D,TYIMSK(I) ;D GETS ENABLED TTY INPUT CHANNELS.
|
||
MOVE TT,D
|
||
ANDCM TT,IDF2(U) ;TT GETS ENABLED, UNDEFERRED TTY INPUT CHANNELS.
|
||
TDNE TT,IFPIR(U) ;IF AN INTERRUPT IS PENDING ON ONE OF THEM, %TXINT
|
||
POPJ P, ;WILL CLEAR IF WE LET THE INT. HAPPEN.
|
||
MOVN TT,D ;ELSE GET LOWEST NUMBERED ENABLED INPUT CHANNEL'S BIT
|
||
AND D,TT
|
||
AND D,IDF2(U) ;IF THAT CHANNEL ISN'T DEFFERED,
|
||
IORM D,IFPIR(U) ;REQUEST AN INTERRUPT ON IT, AND WE CAN STILL WIN.
|
||
JUMPN D,CPOPJ
|
||
ANDCMI T,%TXINT ;CAN'T RQ AN INT, SO BIT WON'T BE CLEARED, IT IS CERTAIN,
|
||
POPJ P, ;SO GIVE UP ON WAIITING FOR IT TO CLEAR.
|
||
|
||
;COME HERE TO HANG UP FOR INPUT. LIKE UFLS BUT PREVENTS
|
||
;A **MORE** THIS TIME AROUND THE SCREEN, ON GROUNDS THAT USER
|
||
;HAS COMMANDED THE OUTPUT FOR 1 MORE PAGE AT LEAST.
|
||
;IF %TINWT IS SET, INSTEAD OF HANGING, THROW AWAY RETURN ADDRESS
|
||
;AND JUMP TO TYI4, TO RETURN -1 FROM THE IOT.
|
||
;CLOBBERS A,D,H.
|
||
TYIFLS: TRNE R,%TINWT
|
||
JRST [ SUB P,[1,,1]
|
||
SETO D,
|
||
JRST TYI4]
|
||
;ENTER HERE FROM ECHOIN - R IS NOT MEANINGFUL.
|
||
TYIFL2: MOVE H,TTYOPT(I)
|
||
TLNE H,%TOMVU ;THIS DOESNT APPLY TO ARDS-LIKE DISPLAYS
|
||
TLNE H,%TOERS
|
||
SKIPA D,I
|
||
JRST UFLS
|
||
IMULI D,TPLEN*2
|
||
MOVEI A,%TFEOP
|
||
ANDCAM A,TPFLAG(D) ;CLEAR PENDING MORE
|
||
HLL D,TTYSTS(I)
|
||
MOVE A,TCMXV(I) .SEE TPVE;(D)
|
||
TLNE H,%TOMVU ;PRINTING TTY'S AND DISPLAYS IN SCROLL MODE
|
||
TLNE D,%TSROL ;DO ONE THING.
|
||
JRST TYIFL1
|
||
CAME A,TPVB+TPLEN(D) ;FOR WRAP-AROUND DISPLAYS,
|
||
JRST UFLS ;IF NOT USING AN ECHO AREA,
|
||
MOVEI A,6 ;PREVENT MORES FOR THE NEXT 6 LINES.
|
||
MOVEM A,TPVM(D)
|
||
JRST UFLS
|
||
|
||
TYIFL1: SUB A,TTYROL(I) ;IN SCROLL MODE, **MORE** WHEN THIS LINE GOES OFF THE SCREEN.
|
||
MOVEM A,TPVM(D)
|
||
JRST UFLS
|
||
|
||
SUBTTL TTY OUTPUT IOT
|
||
|
||
;THESE PUSHED BY TYOSET, REFERENCED INDEX OF J.
|
||
TYOPV0==0 ;COUNT OF NUMBER OF CHARACTERS THAT WE CAN TAKE A SHORTCUT FOR,
|
||
;IN SUPERIMAGE MODE SIOT.
|
||
;TYOPV1 UNUSED, BUT SPACE ALLOCATED.
|
||
TYOPV2==2 ;-> IOCHNM WORD OF CHANNEL IOT IS ON.
|
||
TYOPV3==3 ;PC PPR IDX,,TTY #.
|
||
|
||
|
||
;TO OUTPUT TO A TTY (R -> IOCHNM WD OF TTY CHNL)
|
||
; JSP E,TYOSET ;WAIT TILL JOB HAS TTY AND OUT OF COM MODE,
|
||
; ;INIT FOR PCLSRING, PUSH VARS ON STACK.
|
||
; JRST IGNORE ;TYOSET RETURNS HERE IF THIS OUTPUT SHOULD BE DISCARDED.
|
||
; ... ;OUTPUT 1 OR MORE CHARS TO TTY
|
||
; ;MEANWHILE, J -> BLOCK OF 4 STACK VARS.
|
||
; POPJ P, ;RETURNS TO TYOUNS TO FLUSH STACK, ETC.
|
||
|
||
TYOSET: PUSHJ P,TTYWO ;WAIT TILL THIS JOB HAS OUTPUT PERMISSION.
|
||
JRST (E) ;RETURN IF OUTPUT BEING IGNORED.
|
||
AOS E ;SKIP THAT RETURN IF WE ARE GOING TO DO THE OUTPUT.
|
||
JUMPN U,TYOSE3
|
||
MOVEI T,TYOWNC ;FOR SYSTEM JOB, CHECK TTOALC WITH A TIMEOUT IN CASE
|
||
SKIPL TTOALC(I) ;THE TTY IS FORGETTING TO TURN TYPEOUT BACK ON.
|
||
PUSHJ P,TYOW2
|
||
JRST TYOSE4 ;NOTE THAT TYOW2 CAN POP1J.
|
||
|
||
TYOSE3: SKIPL TTOALC(I) ;^\ CAN DELAY TYPEOUT AT M.P. LEVEL THROUGH SIGN OF TTOALC.
|
||
PUSHJ P,UFLS ;ALSO USED BY OUTPUT RESET ON SOFTWARE TTY.
|
||
TYOSE4: MOVEI J,1(P) ;PROVIDE SPACE FOR TEMPS, WHERE FINSET CAN FIND THEM.
|
||
ADD P,[2,,2]
|
||
PUSH P,R .SEE TYOPV2
|
||
MOVE H,TTYOPT(I)
|
||
MOVSI T,%TCLFT+%TCOCO+%TCICO
|
||
SKIPGE TTYCOM(I)
|
||
PUSHJ P,TTYCMW ;WAIT TILL TTY IS NOT IN COM MODE, OR OVER-RIDDEN.
|
||
CONO PI,TTYON
|
||
MOVEI A,%TJCNS+77+%TJCP1+%TJCP2+%TJSTP+%TJINK ;DON'T LET THESE IOCHNM BITS BE CHANGED
|
||
ANDCAB A,CTLBTS(U) ;EVEN TEMPORARILY.
|
||
HRLZS A ;ELSE, IF A BIT IS SET IN THE CTL BITS,
|
||
XORB A,(R) ;CHANGE IT (TEMPORARILY) IN IOCHNM WORD.
|
||
PUSHJ P,LOSSET ;SET UP ROUTINE TO UNDO THAT TEMPORARY CHANGE
|
||
[MOVE A,AC0S+J(U) ;IF WE SHOULD PCLSR OUT
|
||
HLRZ T,@TYOPV2(A)
|
||
XOR T,CTLBTS(U)
|
||
HRLM T,@TYOPV2(A)
|
||
POPJ P,]
|
||
HLRZS A
|
||
TRNE A,%TJSTP ;IF WE ARE HUNG IN A **MORE**, WAIT TILL THERE'S A CHARACTER
|
||
PUSHJ P,TYOSMR ;IT'S IMPORTANT WE WAIT WITOUT TYOSW SET - ELSE NO ECHOING!
|
||
MOVE TT,I ;NOW MAKE TT -> APPRO. PC PPR FOR THIS CHNL.
|
||
IMULI TT,TPLEN*2
|
||
TRNE A,%TJPP2
|
||
MOVE TT,TTYEPP(I)
|
||
TYOSE1: PCLT ;ENTER HERE FROM INPUT IOT WHEN DOING M.P. ECHOING
|
||
AOSE TYOSW(I) ;SEIZE THIS TTY FOR MP LEVEL.
|
||
JRST [SKIPL TYOSW(I)
|
||
PUSHJ P,UFLS
|
||
JRST .-1]
|
||
PUSHJ P,LSWDEL ;THEN SET UP LOSSET ROUTINE FOR BOTH TYOSW AND
|
||
PUSHJ P,LOSSET ;PREVIOUSLY-LOSSET'ED CHANGE TO IOCHNM BITS.
|
||
[MOVE A,AC0S+J(U)
|
||
HLRZ T,@TYOPV2(A)
|
||
XOR T,CTLBTS(U)
|
||
HRLM T,@TYOPV2(A)
|
||
MOVE A,TYOPV3(A)
|
||
SETOM TYOSW(A)
|
||
POPJ P,]
|
||
CAMN TT,TTYLPP(I) ;IF TTY IS ASSOCIATED W/ ANOTHER PC PPR,
|
||
JRST TYOSE2
|
||
PUSH P,TT
|
||
SKIPL TT,TTYLPP(I)
|
||
PUSHJ P,TYOMVC ;DISASSOCIATE THEM.
|
||
POP P,TT
|
||
SETCAM TT,TTYLPP(I)
|
||
TYOSE2: PUSH P,I .SEE TYOPV3
|
||
HRLM TT,(P)
|
||
MOVE Q,TTYCOM(I)
|
||
TLNE Q,%TCECH ;IF THERE'S ECHOING OUTPUT IN OUTPUT BUFFER,
|
||
JRST [ PCLT ;WAIT FOR IT TO GET PRINTED. MUSTN'T HAVE ECHO AND
|
||
PUSHJ P,TYOWC ;OUTPUT IN THE OUTPUT BUFFER AT ONE TIME.
|
||
MOVSI Q,%TCECH
|
||
ANDCAB Q,TTYCOM(I)
|
||
JRST .+1]
|
||
TLNE Q,%TCMTR ;IF THIS TTY IS A TERMINET & ITS MOTOR IS OFF,
|
||
PUSHJ P,TTTMTO ;TURN THE MOTOR ON BEFORE OUTPUT.
|
||
PUSHJ P,(E)
|
||
|
||
TYOUNS: CAIA ;IF WE ARE SKIPPED INTO, PROPAGATE THE SKIP.
|
||
AOS -4(P)
|
||
SUB P,[4,,4]
|
||
|
||
TYOUN1: HRLZ R,CTLBTS(U) ;UNDO TEMPORARY CHANGES IN IOCHNM WD.
|
||
XORM R,@TYOPV2(J)
|
||
PUSHJ P,LSWDEL
|
||
SKIPGE TTYERQ(I) ;IF ECHOING ISN'T ALREADY REQUESTED,
|
||
SKIPL TTYLPP(I) ;AND THERE IS BUFFERED CURSOR POSITIONING,
|
||
JRST TYOUN3
|
||
CONO PI,TTYOFF
|
||
MOVEI J,TTEDMY ;SO TYOFNR WON'T CLOBBER RANDOMNESS.
|
||
SETCM TT,TTYLPP(I) ;TT -> PC PPR TTY WAS DISSOCIATED FROM.
|
||
MOVE H,TTYOPT(I)
|
||
MOVE A,TORM(I)
|
||
CAIN A,TOBS ;AND IT CAN BE DONE NOW,
|
||
PUSHJ P,TYOFRC ;FORCE OUT BUFFERED CURSOR MOTION.
|
||
SETOM TYOSW(I)
|
||
JRST TTYONJ
|
||
|
||
TYOUN3: SETOM TYOSW(I) ;RELEASE TTY.
|
||
POPJ P,
|
||
|
||
;WAIT TILL THERE'S A TTY INPUT CHARACTER.
|
||
TYOSMR: PUSH P,A
|
||
PUSH P,R
|
||
MOVEI R,%TIACT+%TIECH+%TIPEK
|
||
PUSHJ P,TYI0
|
||
POP P,R
|
||
JRST POPAJ
|
||
|
||
;OUTPUT IOT
|
||
|
||
;BLOCK MODE.
|
||
TTYBO: JSP E,TYOSET
|
||
JRST TTYBOI
|
||
JSP E,NBTOCH
|
||
TTYBO3: CAIN A,EOFCH
|
||
POPJ P,
|
||
PUSH P,TT
|
||
PUSHJ P,TTYBO1
|
||
POP P,TT
|
||
MOVEI E,TTYBO3
|
||
POPJ P,
|
||
|
||
;IGNORE SOME BLOCK MODE OUTPUT.
|
||
TTYBOI: XCTR XRW,[MOVES D,(C)]
|
||
TLO D,700000
|
||
HLRE A,D
|
||
MOVNS A
|
||
HRLS A
|
||
ADD D,A ;COUNT THE AOBJN POINTER ALL THE WAY OUT.
|
||
XCTR XRW,[MOVEM D,(C)]
|
||
POPJ P,
|
||
|
||
JRST TYOBP ;SIOT DISPATCH IS -1 + ADDR. OF UNIT MODE ROUTINE.
|
||
;UNIT MODE TTY OUTPUT.
|
||
TYO: JSP E,TYOSET
|
||
POPJ P, ;JUST RETURN IF WE ARE SUPPOSED TO DISCARD THE OUTPUT.
|
||
SKIPGE C
|
||
SKIPA A,(C)
|
||
UMOVE A,(C)
|
||
;MUSTN'T CLOBBER C OR D.
|
||
TTYBO1: HLRZ R,@TYOPV2(J) ;RH(R) GETS LH(IOCHNM WD)
|
||
HRRZ I,TYOPV3(J)
|
||
HLRZ TT,TYOPV3(J)
|
||
TYOBP2: ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
|
||
SKIPGE E,TTYCOM(I);IN COM MODE W/ LOCAL FEED THRU,
|
||
TLNN E,%TCLFT
|
||
JRST TYO6
|
||
PUSH P,C
|
||
PUSH P,D
|
||
PUSH P,U
|
||
PUSH P,TT ;ECHO CHAR ON ALL TTYS IN LOOP
|
||
PUSH P,R ;THAT HAVE REMOTE-FEED-THRU.
|
||
PUSHJ P,TYCREP ;DO FOLLOWING INSN FOR EACH TTY IN LOOP.
|
||
PUSHJ P,TYO7 ;(# OF TTY DOING IT FOR PUT IN I)
|
||
JFCL ;(TYCREP WILL SKIP IF THAT INSN ALWAYS DOES)
|
||
POP P,R
|
||
POP P,TT
|
||
POP P,U
|
||
POP P,D
|
||
POP P,C
|
||
JRST TYO6
|
||
|
||
TYO7: MOVE D,TTYCOM(I) ;IF THIS TTY WANTS MY TYPEOUT.
|
||
TLNE D,%TCRFT
|
||
CAMN I,-2(P) ;AND IF IT ISN'T ME,
|
||
JRST POPJ1
|
||
PUSHJ P,TYCSET ;SET UP ACS Q,R,U FOR TTY TO ECHO ON.
|
||
CONO PI,TTYOFF
|
||
PUSH P,A
|
||
PUSHJ P,TTYI13 ;ECHO CHAR ON THIS TTY.
|
||
CONO PI,TTYON
|
||
JRST POPAJ1
|
||
|
||
;SIOT ROUTINE FOR TTY OUTPUT - JUST LIKE REPEATED UNIT MODE,
|
||
;BUT MOVES THE TYOSET OUTSIDE THE LOOP TO SAVE TIME.
|
||
TYOBP: MOVEM B,SRN3(U) ;SAVE B, C; CAN'T USE STACK SINCE TYOSET PUSHES.
|
||
MOVEM C,SRN4(U)
|
||
JSP E,TYOSET ;SET UP FOR DOING TTY OUTPUT.
|
||
JRST TYOBPI ;RETURN HERE IF WE SHOULD DISCARD THE OUTPUT
|
||
HLRZ R,@TYOPV2(J) ;FOR TYOFRC
|
||
CAME TT,TTYLPP(I)
|
||
TRNN R,%TJSIO ;ONLY IN SUPER-IMAGE MODE,
|
||
CAIA
|
||
PUSHJ P,TYOFRC ;FORCE OUT ALL PREVIOUS MAIN PROGRAM CURSOR MOTION
|
||
MOVE B,SRN3(U) ;BE JUST LIKE ORDINARY REPEATED-UNIT-MODE SIOT,
|
||
MOVE C,SRN4(U) ;EXCEPT THAT THE TYOSET IS OUTSIDE THE LOOP.
|
||
SETOM TYOPV0(J) ;CAN'T TAKE SHORTCUT AT FIRST.
|
||
MOVE D,[%IOTOT,,.+2]
|
||
JRST NSIOT1 ;SIOT ROUTINE WILL COME BACK FOR EACH CHAR, PRESERVING I,J,TT
|
||
HLRZ R,@TYOPV2(J)
|
||
MOVE A,D ;PUSHJ HERE FOR EACH CHARACTER.
|
||
SOSG TYOPV0(J) ;PERHAPS THE PREVIOUS CHARACTER DISCOVERED WE CAN
|
||
;START TAKING THE SHORTCUT.
|
||
JRST TYOBP2 ;IF NOT, DO THE WHOLE PILE OF WORK.
|
||
ANDI A,%TXDIS+%TXASC
|
||
SKIPGE E,TTYCOM(I)
|
||
TLNN E,%TCLFT ;SHORT CUT IS TO PUT THE CHARACTER RIGHT IN THE OUTPUT BUFFER.
|
||
JRST TYONCC ;MAY BE USED ONLY FOR SUPERIMAGE OUTPUT.
|
||
JRST TYOBP2 ;AND BETTER NOT BE IN COM MODE WITH LOCAL FEED THRU.
|
||
|
||
;IGNORE THIS STRING OF OUTPUT; TELL THE USER WE OUTPUT IT.
|
||
TYOBPI: MOVE B,SRN3(U)
|
||
MOVE C,SRN3(U)
|
||
UMOVE T,(B)
|
||
UMOVE TT,(C)
|
||
JUMPE C,POPJ1
|
||
IBP T
|
||
SOJG TT,.-1
|
||
XCTR XRW,[MOVEM T,(B)]
|
||
XCTR XRW,[MOVEM TT,(C)]
|
||
JRST POPJ1
|
||
|
||
|
||
;A USUALLY HOLDS THE CHAR BEING IOTTED, OR THE CHAR TO BE PUT IN BUFFER.
|
||
;B IS A TEMP.
|
||
;C IS USUALLY UNUSED, AND MUSTN'T BE CLOBBER BY IOT RTN.
|
||
;D "
|
||
;E IS A TEMP.
|
||
;TT HOLDS THE INDEX OF THE PC PPR BEING USED.
|
||
;I HOLDS THE TTY NUMBER.
|
||
;H HOLDS THE TTY'S TTYOPT WORD.
|
||
;J HOLDS THE INDEX OF A 4-WORD BLOCK USUALLY ON THE STACK
|
||
; INDEX USING TYOPV0, TYOPV1, TYOPV2, TYOPV3.
|
||
;T IS A TEMP.
|
||
;R'S RH HOLDS THE IOCHNM WORD'S LH.
|
||
;Q HOLDS THE BP FOR STORING IN OUTPUT BUFFER.
|
||
; INITTED FROM TOIP, AND STORED BACK IN TOIP WHEN FINALIZED.
|
||
|
||
TYO6: PCLT
|
||
MOVEI T,TYOWNC ;MAKE SURE AT LEAST TYOWNC
|
||
CAML T,TORM(I) ;CHARS OF SPACE LEFT IN OUTPUT BUFFER.
|
||
PUSHJ P,TYOW2 ;NOTE THIS CAN POP1J. SO CAN TYOWN.
|
||
MOVE H,TTYOPT(I)
|
||
IFN N11TYS,[
|
||
TRNN H,%TP11T ;FOR A PDP11 TV TTY,
|
||
JRST TYO8
|
||
SKIPL TT11P ;IGNORE IT IF PDP11 ISN'T UP.
|
||
POPJ P,
|
||
PUSHJ P,TYOWN ;WAIT TILL AT LEAST TYOWNC CHARS SPACE.
|
||
] ;(TORM HAS NO INFO ON TV TTYS).
|
||
;A,R,I,TT,H,J SET UP AT THIS POINT.
|
||
;ENTER HERE FROM PI LEVEL TO ECHO CHARS
|
||
TYO8: MOVE Q,TOIP(I) ;GET COPY OF BP TO STORE WITH.
|
||
;WHEN OUTPUTTING CHARS, WILL UPDATE Q INSTEAD TOIP.
|
||
;THEN, WHEN CAN NO LONGER PCLSR, DO TOIP(I)_Q.
|
||
MOVE B,TPFLAG(TT)
|
||
TYOIG1: TRNE B,%TFEOP+%TFIGL ;ANY EXCEPTIONAL CONDITION FOR THIS PC PPR?
|
||
JRST TYOIGL ;IF SO, HANDLE IT.
|
||
TYOEO9: TRNE R,%TJCP1+%TJCP2+%TJSTP+%TJSIO+%TJINK
|
||
JRST TYOCP1 ;HANDLE ANY EXCEPTIONAL CONDITION FOR CHANNEL.
|
||
TRNE A,%TXCTL+%TXMTA+%TXSUP+%TXTOP
|
||
JRST TYOMTA ;TAKE CARE OF FUNNY BITS IN CHARACTER.
|
||
TYOMT9: CAILE A,40
|
||
JRST TYONRM ;PRINTING CHARS AND RUBOUT.
|
||
CAIN A,40
|
||
JRST TYOSPC ;SPACE MAY BE EITHER PRINTING OR CURSOR MOTION.
|
||
CAIL A,^G ;< ^G OR > ^S => NORMAL CTL CHAR,
|
||
IFE 0, CAIL A,^Q ;RIGHT NOW, ^S USES %TGIMG OF GROUP 0.
|
||
IFN 0, CAIL A,^T ;BUT FOR INPUT, IT USES GROUP 6. THIS INSN MAKES IT USE GROUP 6 FOR OUTPUT TOO.
|
||
JRST TYOCTL
|
||
JRST @.+1-^G(A) ;ELSE DO WHAT THIS PARTICULAR ONE WANTS.
|
||
|
||
TYOBEL ;^G DOESN'T MOVE CURSOR.
|
||
TYOBS ;^H MOVES BACKWARDS.
|
||
TYOTAB ;^I MOVES TO TAB STOP.
|
||
TYOLF ;^J IS LINEFEED.
|
||
TYOCTL ;^K IS NORMAL.
|
||
TYOFF ;^L MAY CAUSE A **MORE**
|
||
TYOCR ;^M IS A CARRET
|
||
TYOCTL ;^N IS NORMAL
|
||
TYOCTL ;^O IS NORMAL
|
||
TYOCTP ;^P MAY SIGNIFY A CURSOR CTL CODE.
|
||
TYOCTL ;^Q IS NORMAL
|
||
TYOCTL ;^R IS NORMAL
|
||
TYOCTS ;^S IS NORMAL EXCEPT USES A DIFFERENT GROUP'S %TGIMG.
|
||
|
||
;OUTPUT CHARACTER IN SUPERIMAGE MODE.
|
||
TYOSIO: ANDI A,377
|
||
MOVEI B,TYOWNC ;IF WE'VE GOT THIS FAR, THEN THERE'S AT LEAST TYOWNC CHARS OF SPACE,
|
||
CAME TT,TTYLPP(I) ;IF DISSOCIATED,
|
||
PUSHJ P,[
|
||
PUSH P,Q
|
||
PUSHJ P,TYOASS ;ASSOCIATE,
|
||
POP P,T
|
||
CAME T,Q ;AND IF THAT REQUIRED OUTPUT,
|
||
SUBI B,5 ;THAT'S SO MANY FEWER CHARS BEFORE TIME TO CHECK TORM AGAIN.
|
||
POPJ P,]
|
||
MOVEM B,TYOPV0(J) ;AND NO UNUSUAL CONDITIONS, SO SIOT CAN GO FAST FOR A WHILE.
|
||
;OUTPUT A CHAR WITH NO CURSOR CONTROL.
|
||
;ASSUMES ITS POSITION DOESN'T MATTER.
|
||
TYONCC: PUSHJ P,TYOOUT
|
||
JRST TYOFN2
|
||
|
||
;COME HERE WHEN ^P IS OUTPUT.
|
||
TYOCTP: TRNN R,%TJDIS ;IS THIS OUTPUT CHNL TREATING ^P SPECIALLY?
|
||
JRST TYOCTL ;NO, TREAT ^P AS NORMAL CTL CHAR.
|
||
TRO R,%TJCP1 ;YES, SAY TREAT NEXT CHAR AS CURSOR CODE.
|
||
JRST TYOFNR
|
||
|
||
;COME HERE TO OUTPUT A ^S.
|
||
TYOCTS: CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOASS ;PREPARE TO OUTPUT PRINTING CHARACTERS.
|
||
HLLZ T,TTYST2(I) ;GET THE RELEVANT %TGIMG BIT.
|
||
TLZ T,#<%TGIMG_12.>
|
||
JRST TYORU2
|
||
|
||
;HERE TO OUTPUT ^G
|
||
TYOBEL: MOVEI A,%TDBEL
|
||
JRST TYONCC
|
||
|
||
;COME HERE FOR ^PP - OUTPUT A ^P.
|
||
TYOCPP: SKIPA A,[^P]
|
||
|
||
;COME HERE FOR ^PQ TO OUTPUT A ^C.
|
||
TYOCPQ: MOVEI A,^C
|
||
|
||
;COME HERE FOR NORMAL (NON-FORMATTING) CONTROLS.
|
||
TYOCTL: CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOASS ;PREPARE TO OUTPUT PRINTING CHARACTERS.
|
||
CAIN A,33
|
||
JRST TYOALT ;CHECK FOR ALTMODE.
|
||
HLLZ T,TTYST1(I) ;GET THE "OUTPUT IN IMAGE MODE" BIT THAT'S RELEVANT.
|
||
TLZ T,#<%TGIMG_12.>
|
||
TYORU2: TRNE R,%TJECH ;ECHO-MODE OUT => PRINT IN ASCII MODE.
|
||
JRST TYOCT1
|
||
MOVE B,TTYSTS(I)
|
||
TLNE B,%TSSAI ;SHOULD USE SAIL CHAR SET FOR OUTPUT => DO SO.
|
||
JRST TYONR0
|
||
JUMPN T,TYOAL1 ;IF "OUTPUT IN IMAGE" IS SET, GO DO SO.
|
||
TYOCT1: HRLM A,(P) ;ELSE OUTPUT CTL CHAR IN ASCII MODE,
|
||
MOVEI A,"^ ;AS "^" FOLLOWED BY UN-CTL'ED CHAR.
|
||
TLNE H,%TOSAI
|
||
MOVEI A,13 ;IF TTY HAS SAIL MODE, USE A SAIL UPARROW.
|
||
PUSHJ P,TYONR1
|
||
HLRZ A,(P)
|
||
XORI A,100
|
||
JRST TYONR0
|
||
|
||
TYOAL1: TLNN H,%TOSAI
|
||
JRST TYORU1
|
||
JRST TYONR0
|
||
|
||
;HANDLE CHARACTERS WHICH HAVE %TXCTL, %TXMTA, %TXSUP OR %TXTOP SET.
|
||
TYOMTA: MOVE B,TTYSTS(I)
|
||
TLNN B,%TSFCO ;IF USER DOESN'T WANT FULL CHAR SET OUTPUT,
|
||
JRST TYOMT4 ;IGNORE THE META BITS (USUALLY).
|
||
TRNE A,%TXCTL
|
||
PUSHJ P,TYOMT1 ;ECHO AN ALPHA FOR %TXCTL.
|
||
TRZE A,%TXMTA
|
||
PUSHJ P,TYOMT2 ;TYPE A BETA FOR %TXMTA
|
||
TRZE A,%TXSUP
|
||
PUSHJ P,TYOMT5
|
||
TRZN A,%TXCTL+%TXTOP ;IF CTL OR TOP IS SET, THE CHARACTER
|
||
JRST TYOMT9
|
||
CAIN A,40 ;ISN'T AN ASCII CONTROL CHAR EVEN IF < 40
|
||
JRST TYOSPC ;(BTW, SPACE IS STILL SPACE)
|
||
CAIE A,177
|
||
CAIG A,40
|
||
TYOMT3: TLNE H,%TOSAI
|
||
JRST TYONRM
|
||
CAME TT,TTYLPP(I) ;WE HAVE WHAT WOULD OTHERWISE BE AN ASCII CTL CHAR.
|
||
PUSHJ P,TYOASS
|
||
CAIN A,33
|
||
JRST TYOAL3
|
||
JRST TYOCT1
|
||
|
||
TYOMT5: MOVEI B,6 ; EPSILON
|
||
JRST TYOMT6
|
||
|
||
TYOMT1: SKIPA B,[2] ; ALPHA
|
||
TYOMT2: MOVEI B,3 ; BETA
|
||
TYOMT6: CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOASS
|
||
PUSH P,A
|
||
MOVE A,B
|
||
PUSHJ P,TYONR1
|
||
JRST POPAJ
|
||
|
||
TYOMT4: TRNN R,%TJECH ;FOR OUTPUT, IGNORE THE META BITS. FOR ECHO,
|
||
ANDI A,%TXASC ; TRY TO ECHO WHAT THE GUY TYPED.
|
||
TRNE A,%TXTOP ;IF TOP IS ON,
|
||
TLNN H,%TOSAI ;AND THE TTY HAS THE SAIL CHAR SET,
|
||
TRZA A,%TXMTA+%TXSUP+%TXTOP
|
||
JRST TYONR3 ;ECHO THE CHAR USING SAIL CHAR SET.
|
||
PUSHJ P,TYINR2 ;ECHO AS WHAT PROGRAM SEES
|
||
JRST TYOMT9 ;ALSO HACKS SUCH AS ^L MAY CLEAR THE SCREEN
|
||
|
||
;HANDLE SPACE: ON OVERPRINTING TERMINALS, SPACE = ^PF.
|
||
;ON IMLACS, SPACE = SPACE BECAUSE THE IMLAC PROGRAM LOSES FOR ^PF AT END OF LINE.
|
||
;ON RAW TERMINALS, SPACE OF COURSE GOES OUT AS SPACE.
|
||
;ON OTHER TERMINALS, SPACE = SPACE. THIS IS A CROCK, BUT IT IS NECESSARY
|
||
;BECAUSE ^PF TAKES 6 TIMES AS LONG ON DATAPOINTS BECAUSE OF PADDING,
|
||
;AND TWICE AS LONG ON VT52S BECAUSE IT TAKES TWO CHARACTERS.
|
||
|
||
TYOSPC: TLNN H,%TOOVR ;NON-OVERPRINTING => OUTPUT A REAL SPACE.
|
||
JRST [ TLNE H,%TOMVU
|
||
JRST TYONRM
|
||
HLRE B,TTYLPS(I) ;BUT ON GLASS TTY'S (NON-OVERPRINTING, NO UPWARD MOTION)
|
||
CAMGE B,TPVP(TT)
|
||
JUMPGE B,.+1 ;IT IS SAFE TO TREAT SPACES AS CURSOR MOTION
|
||
JRST TYONRM] ;IF THEY ARE GOING TO FOLLOW DOWNWARD MOTION ANYWAY.
|
||
TLNE H,%TORAW+%TOIML ;IMLAC, OR NO OPTIMIZATION => OUTPUT A REAL SPACE.
|
||
JRST TYONRM ;NORMAL CHARACTER.
|
||
CAMN TT,TTYLPP(I)
|
||
PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
|
||
AOS B,TPHP(TT) ;MOVE FORWARD 1 POS.
|
||
CAML B,TCMXH(I) .SEE TPHE;(TT)
|
||
TRNE R,%TJCTN
|
||
JRST TYOFNR
|
||
SOS TPHP(TT) ;IF NECESSARY, CONTINUE TO NEXT LINE AND RETRY.
|
||
PUSHJ P,TYOCTN
|
||
JRST TYOSPC
|
||
|
||
TYONR3: ANDI A,%TXASC
|
||
;OUTPUT A NORMAL CHARACTER, AND FINALIZE. COME HERE FOR
|
||
;NORMAL CHAR ACTUALLY IOTTED.
|
||
TYONRM: CAME TT,TTYLPP(I) ;ABOUT TO OUTPUT PRINTING CHARS SO
|
||
PUSHJ P,TYOASS ;FORCE ANY CURSOR MOTION INTO OUTPUT BFR
|
||
CAIN A,177
|
||
JRST TYORUB
|
||
|
||
;CALL HERE TO OUTPUT NORMAL CHAR, IF CURSOR POSITIONING KNOWN
|
||
;NOT TO BE NECESSARY.
|
||
TYONR0: PUSH P,[TYOFNA] ;CAUSE FINALIZATION WHEN FINISHED.
|
||
|
||
;CALL HERE TO OUTPUT NORMAL CHAR AS PART OF TASK OF OUTPUTTING
|
||
;SOME LARGER GROUP. DOESN'T FINALIZE, IN CASE WE PCLSR LATER.
|
||
TYONR1: AOS B,TPHP(TT) ;ADVANCE CURSOR OF PC PPR 1 SPACE.
|
||
CAML B,TCMXH(I) .SEE TPHE;(TT) ;NOT YET AT END OF LINE => OUTPUT CHAR.
|
||
TRNE R,%TJCTN ;AT END: NO CONTIN => OUTPUT,
|
||
JRST TYOOUT
|
||
PUSHJ P,TYONR2 ;CONTINUE THE LINE (NOTE CURSOR POS FOR
|
||
CAME TT,TTYLPP(I) ;THE "!" WAS ALREADY DONE)
|
||
PUSHJ P,TYOASS ;TYONR2 DISSOCIATED THE TTY
|
||
JRST TYONR1 ;BUT TYONR1 NEEDS IT ASSOCIATED.
|
||
|
||
;TYPE "!<CR><LF>" TO CONTINUE A LINE.
|
||
;THIS FINALIZES THE !CRLF BUT ALSO REMOVES THE CONDITIONS WHICH
|
||
;CAUSED IT TO BE CALLED; SO PCLSRING IS NO PROBLEM.
|
||
;LEAVES TTY DISSOCIATED FROM PC PPR.
|
||
TYOCTN: CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOASS
|
||
AOS TPHP(TT) ;ACCOUNT FOR THE "!".
|
||
TYONR2: PUSH P,A
|
||
MOVEI A,"! ;PUT "!" IN OUTPUT BUFFER,
|
||
PUSHJ P,TYOOUT
|
||
PUSHJ P,TYORCR ;AND GO TO NEXT LINE.
|
||
PUSHJ P,TYOLF
|
||
MOVE B,TPFLAG(TT) ;IF THAT LF TOOK US TO LAST LINE,
|
||
TRNE B,%TFEOP
|
||
JRST TYOEO5 ;DO **MORE** PROCESSING IF NEC.
|
||
JRST POPAJ ;AND RETRY WHATEVER CAUSED CONTINUATION.
|
||
|
||
;COME HERE TO OUTPUT A RUBOUT.
|
||
TYORUB: TRNN R,%TJECH
|
||
JRST TYORU3
|
||
TLNN H,%TOERS ;RUBOUT ON A DISPLAY CONSOLE ECHOES AS DELETE BACKWARDS.
|
||
TLNN H,%TOOVR ;LIKEWISE ON A GLASS TTY
|
||
JRST TYODLB
|
||
TYORU3: MOVE T,TTYST2(I)
|
||
ANDI T,%TGIMG_6 ;GET RUBOUT'S "OUTPUT IN IMAGE MODE" BIT.
|
||
JRST TYORU2
|
||
|
||
;COME HERE TO OUTPUT A LF. FINALIZES. LEAVES TTY DISSOCIATED.
|
||
TYOLF: CAMN TT,TTYLPP(I) ;BEFORE MUNGING PC PPR'S CURSOR POS,
|
||
PUSHJ P,TYOMVC ;MUST DISASSOCIATE TTY'S POS FROM PC PPR.
|
||
SOS TPVM(TT) ;COUNT DOWN # LINES TILL NEXT **MORE**.
|
||
AOS B,TPVP(TT) ;MOVE PC PPR'S CURSOR 1 LINE DOWN.
|
||
CAIG B,118. ;DON'T LET VPOS ON PRINTING TTY GET TOO BIG.
|
||
CAML B,TCMXV(I) .SEE TPVE;(TT) ;END OF RANGE => GO TO TOP OR SCROLL.
|
||
JRST TYOLFE
|
||
TYOLF0: MOVE A,TTYSTS(I)
|
||
TLNE A,%TSMOR ;IF **MORE** DESIRED,
|
||
JRST TYOLF1
|
||
ADDI B,1 ;THEN IF ENTERING LAST LINE OF RANGE,
|
||
CAME B,TCMXV(I) .SEE TPVE;(TT)
|
||
JRST TYOLF1
|
||
SKIPGE TPVM(TT) ;UNLESS NOT TIME YET,
|
||
SKIPA B,[%TFEOP] ;TELL NEXT OUTPUT ATTEMPT TO CAUSE **MORE**.
|
||
TYOLF1: SETZ B,
|
||
PUSH P,B
|
||
TLNE H,%TORAW
|
||
JRST [ MOVEI A,%TDLF ;NO OPTIMIZATION =>
|
||
PUSHJ P,TYOOUT ;OUTPUT A REAL LF (PLUS PADDING)
|
||
PUSHJ P,TYOMVC
|
||
JRST TYOLF5]
|
||
TLNN H,%TOERS ;IF TTY HAS SELECTIVE ERASE,
|
||
JRST TYOLF5
|
||
PUSH P,TPHP(TT)
|
||
PUSHJ P,TYORCR ;GO TO BEGINNING OF LINE
|
||
HLRZ B,TTYLPS(I) ;IF CR AND LF AND CLR-EOL ARE EXACTLY
|
||
ADDI B,1 ;WHAT WE NEED,
|
||
CAMN B,TPVP(TT)
|
||
SKIPN TTYROL(I) ;AND TTY CAN DO IT, DO THEM ALL AT ONCE.
|
||
SKIPA A,[%TDEOL] ;OTHERWISE, OUTPUT MOVE-CURSOR AND %TDEOL.
|
||
SKIPA A,[%TDCRL] ;OUTPUT %TDCRL = %TDMOV AND %TDEOL TOGETHER.
|
||
PUSHJ P,TYOASS
|
||
PUSHJ P,TYOOUT
|
||
PUSHJ P,TYOMVC
|
||
POP P,TPHP(TT)
|
||
TYOLF5: POP P,B
|
||
IORM B,TPFLAG(TT)
|
||
JRST TYOFND
|
||
|
||
;LINEFEED THAT WRAPS AROUND.
|
||
TYOLFE: MOVE A,TTYSTS(I)
|
||
TLNN H,%TOMVU ;END OF SCREEN ON PRINTING TTY => SCROLL BY 1.
|
||
JRST TYOLF2
|
||
TLNE A,%TSROL ;DISPLAY IN SCROLL MODE?
|
||
SKIPE TPVB(TT) ;CAN'T SCROLL UNLESS PC PPR IS WHOLE SCREEN.
|
||
JRST TYOLF3
|
||
TYOLF2: MOVN A,TTYROL(I) ;A GETS - # LINES TO SCROLL AT ONCE.
|
||
JUMPE A,TYOLF3 ;JUMP IF THIS TTY CAN'T SCROLL
|
||
SOS TPVP(TT)
|
||
PUSH P,TPHP(TT)
|
||
HRRZ B,TTYLPS(I)
|
||
MOVEM B,TPHP(TT)
|
||
PUSHJ P,TYOASS ;MOVE CURSOR DOWN TO LAST LINE ON SCREEN, PREPARING FOR SCROLL
|
||
PUSHJ P,TYOMVC
|
||
POP P,TPHP(TT)
|
||
AOS TPVP(TT)
|
||
;SCROLL: A HAS -<# LINES TO ADJUST ALL VPOS'S BY>.
|
||
TYOLF6: HLRZ B,TTYLPS(I) ;COMPUTE NEW TTYLPS LH.
|
||
ADD B,A
|
||
JUMPGE B,TYOLF7 ;IF IT WOULD BE NEGATIVE,
|
||
TLNN H,%TORAW ;ON DISPLAY WRAP AROUND INSTEAD (LOSSAGE HAPPENING).
|
||
JRST TYOLF3
|
||
SETZ B, ;IN RAW MODE, DON'T WORRY ABOUT IT.
|
||
TYOLF7: HRLM B,TTYLPS(I) ;STORE UPDATED M.P. VPOS.
|
||
ADDM A,TPVP(TT) ;CHANGE OTHER MAIN PRGM VPOS'S.
|
||
MOVE B,TPVP(TT) ;IF SCROLLING 1 LINE AT A TIME,
|
||
JRST TYOLF0 ;MAY NEED TO SET %TFEOP.
|
||
;IN ANY CASE, CLEAR NEXT LINE & FINALIZE.
|
||
|
||
;HERE TO WRAP AROUND TO TOP OF SCREEN.
|
||
TYOLF3: SETZM TPVM(TT) ;TURN OFF ANY SUPPRESSION OF MORES BY INPUT
|
||
TLNN H,%TOERS ;ON DISPLAYS WITHOUT SELECTIVE ERASE,
|
||
JRST [ PUSHJ P,TYOCLR ;MUST CLEAR SCREEN WHEN WRAP AROUND.
|
||
JRST TYOMVC] ;MUST LEAVE TTY DISSOCIATED.
|
||
TYOLF4: MOVE B,TPVB(TT) ;ELSE JUST MOVE TO TOP OF PC PPR
|
||
MOVEM B,TPVP(TT)
|
||
JRST TYOLF1 ;AND CLEAR THE TOP LINE.
|
||
|
||
;HANDLE BACKSPACE.
|
||
TYOBS: TLNN H,%TOIML ;BACKSPACE ON IMLAC ISN'T SAME AS MOVE BACK.
|
||
JRST TYOBS1
|
||
MOVE B,TPHP(TT) ;ON IMLAC, FIRST, IF AT LEFT MARGIN,
|
||
SKIPG B .SEE TPHB;(TT) ;DO NOTHING.
|
||
JRST TYOFN2
|
||
TYOBS2: CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOASS ;IF WE SHOULD BACKSPACE,
|
||
SOSGE TPHP(TT)
|
||
SETZM TPHP(TT)
|
||
JRST TYORU1 ;DO IT BY SENDING A ^H.
|
||
|
||
TYOBS1: TLNE H,%TOMVB ;ARE WE ECHOING ^H ON TTY THAT CAN'T BS?
|
||
JRST TYOBS4
|
||
TRNN R,%TJECH
|
||
JRST TYOBS3
|
||
JRST TYOCTL ;ECHO "^H" RATHER THAN CR AND SPACE FWD.
|
||
|
||
TYOBS4: TLNE H,%TORAW ;IN RAW MODE ON TTY THAT CAN BS?
|
||
JRST [ MOVEI A,%TDBS ;IF NO OPTIMIZATION,
|
||
JRST TYOBS2 ] ;ARRANGE TO OUTPUT REAL BS.
|
||
TYOBS3: CAMN TT,TTYLPP(I) ;BS ON TTY THAT ISN'T AN IMLAC.
|
||
PUSHJ P,TYOMVC ;PREPARE TO DO CURSOR MOTION.
|
||
SOS B,TPHP(TT) ;MOVE BACK 1 POS.
|
||
SKIPGE B .SEE TPHB;(TT)
|
||
AOS TPHP(TT) ;AT LEFT MARGIN, DO NOTHING.
|
||
JRST TYOFNX
|
||
|
||
;COME HERE WHEN TAB OUTPUT (AT TOP LEVEL ONLY)
|
||
TYOTAB: TRNE R,%TJECH
|
||
JRST TYOTA1
|
||
MOVE B,TTYST2(I) ;MAYBE TABS SHOULD BE OUTPUT IN IMAGE MODE.
|
||
TLNE B,%TGIMG_6
|
||
JRST TYONMV
|
||
TYOTA1: MOVE A,TPHP(TT)
|
||
ADDI A,10
|
||
TRZ A,7 ;HPOS OF NEXT TAB STOP.
|
||
MOVE B,TCMXH(I) .SEE TPHE;(TT)
|
||
TRNN R,%TJCTN
|
||
SUBI B,1 ;B HAS EFFECTIVE LINEL.
|
||
CAML A,B
|
||
MOVE A,B ;A HAS PLACE TAB MOVES TO.
|
||
SUB A,TPHP(TT) ;HOW FAR TO MOVE RIGHT?
|
||
TRNN R,%TJCTN
|
||
JUMPE A,[PUSHJ P,TYOCTN
|
||
JRST TYOTAB]
|
||
CAMN TT,TTYLPP(I)
|
||
PUSHJ P,TYOMVC ;PREPARE FOR CURSOR CTL.
|
||
ADDM A,TPHP(TT) ;MOVE CURSOR TO TAB STOP.
|
||
JRST TYOFNX
|
||
|
||
;HANDLE ^L.
|
||
TYOFF: TRNN R,%TJECH ;ECHOING?
|
||
JRST TYOCTL
|
||
MOVE B,TTYSTS(I) ;YES; ^L ECHOES AS UPARROW-L
|
||
TLNE H,%TOMVU ;EXCEPT ON DISPLAYS, UNLESS PRGM HAS DISABLED.
|
||
TLNE B,%TSCLE
|
||
JRST TYOCTL ;ECHO AS UPARROW L
|
||
JRST TYOCLR ;ECHO AS CLEAR SCREEN.
|
||
|
||
;^M IOTTED - MAYBE DO CR AND LF.
|
||
TYOCR: TRNE R,%TJECH ;IF ECHO MODE OUT, CR DOES CRLF.
|
||
JRST TYOCRL
|
||
MOVE B,TTYST2(I)
|
||
TRNE B,%TGIMG_12. ;ELSE OUTPUT-CR-IN-IMAGE PREVENTS LF.
|
||
JRST TYOCR1
|
||
PUSHJ P,TYOCRL ;DO CR AND LF,
|
||
MOVEI B,%TFIGL ;THEN SAY IGNORE NEXT CHAR IF IT'S A LF.
|
||
IORM B,TPFLAG(TT)
|
||
POPJ P,
|
||
|
||
TYOCRL: PUSHJ P,TYORCR
|
||
PUSHJ P,TYOLF
|
||
JRST TYOFND
|
||
|
||
TYOCR1: PUSHJ P,TYORCR
|
||
JRST TYOFND
|
||
|
||
;ALTMODE IOTTED - SHOULD WE OUTPUT DOLLARSIGN?
|
||
TYOALT: MOVE B,TTYST2(I)
|
||
TRNN R,%TJECH ;ECHO MODE => YES.
|
||
TLNN B,%TGIMG ;OUTPUT ALT IN ASCII MODE SAYS YES.
|
||
JRST TYOAL4
|
||
JRST TYOAL1 ;NO, OUTPUT AN ALTMODE, WHETHER IT PRINTS OR NOT.
|
||
|
||
TYOAL4: TLNN H,%TOSAI ;IF ALTMODE IS A GRAPHIC, USE IT;
|
||
TYOAL3: MOVEI A,"$ ;ELSE USE DOLLARSIGN.
|
||
JRST TYONR0 ;EITHER WAY IT'S A NORMAL PRINTING CHAR.
|
||
|
||
;IF ABOUT TO CHANGE PC PPR'S CURSOR POS WITHOUT PUTTING
|
||
;ANYTHING IN THE OUTPUT BUFFER THAT WILL CHANGE THE TTY'S
|
||
;REAL CURSOR POS THE SAME WAY, MUST DISASSOCIATE TTY'S
|
||
;CURSOR POS FROM THIS PC PPR. TTYLPS WILL THEN
|
||
;SAY WHERE THE TTY'S CURSOR WILL BE AFTER CHARS IN OUTPUT
|
||
;BUFFER ARE ALL OUTPUT.
|
||
TYOMVC: HRLZ B,TPVP(TT)
|
||
HRR B,TPHP(TT)
|
||
MOVEM B,TTYLPS(I)
|
||
SETCAM TT,TTYLPP(I) ;TTY NO LONGER ASSOCIATED.
|
||
POPJ P,
|
||
|
||
;BEFORE PUTTING ANYTHING IN OUTPUT BUFFER USING A PC PPR,
|
||
;TTY'S CURSOR MUST BE ASSOCIATED WITH PC PPR (THAT IS,
|
||
;THE TTY'S CURSOR MUST BE WHERE THE PC PPR'S CURSOR IS)
|
||
;WHEN A TTY IS ASSOCIATED WITH A PC PPR, TTYLPS
|
||
;IS NONSENSE, AND IT IS NECESSARY FOR OUPUT RTNS
|
||
;TO UPDATE PC PPR'S CURSOR IN ACCORDANCE WITH WHAT
|
||
;IS PUT IN THE OUTPUT BUFFER.
|
||
;THIS ROUTINE ASSOCIATES TTY IN I WITH PC PPR IN TT.
|
||
TYOASS: TRNE R,%TJHDE
|
||
POPJ P,
|
||
PUSH P,A
|
||
HLRZ T,TTYLPS(I) ;CURRENT VERTICAL POS
|
||
HRRZ A,TTYLPS(I) ;CURRENT HORIZONTAL POS
|
||
CAMN T,TPVP(TT) ;IF CURSOR IS WHERE WE WANT IT,
|
||
CAME A,TPHP(TT)
|
||
AOSA A
|
||
JRST TYOAS3 ;JUST SAY WE'RE ASSOCIATED.
|
||
SKIPGE TTYLPS(I)
|
||
BUG ;TTY ALREADY ASSOCIATED WITH A PC PPR?
|
||
CAMN T,TPVP(TT) ;SEE IF JUST MOVING ONE SPACE TO THE RIGHT
|
||
CAME A,TPHP(TT)
|
||
JRST TYOAS6 ;NO, NEED FULLY GENERAL CURSOR MOTION
|
||
MOVEI A,%TDFS ;SAVE BUFFER SPACE IN THIS COMMON CASE
|
||
TLNE H,%TOOVR
|
||
MOVEI A,40 ;IF SPACE OVERPRINTS, IT IS BETTER THAN %TDFS SINCE FEWER CHARS
|
||
PUSHJ P,TYOOUT ;IF SENT TO A SOFTWARE TTY OVER HARDWARE LINE.
|
||
JRST TYOAS3
|
||
|
||
TYOAS6: MOVEI A,%TDMV0 ;TELL THE TTY TO PUT ITS CURSOR
|
||
TLNE H,%TOMVU
|
||
JRST TYOAS7
|
||
MOVEI A,%TDMOV
|
||
PUSHJ P,TYOOUT ;WHERE THIS PC PPR WANTS IT.
|
||
HLRZ A,TTYLPS(I)
|
||
PUSHJ P,TYOOUT
|
||
HRRZ A,TTYLPS(I)
|
||
TYOAS7: PUSHJ P,TYOOUT
|
||
MOVE A,TPVP(TT)
|
||
CAML A,TCMXV(I) ;ATTEMPT TO GO BELOW SCREEN BOTTOM?
|
||
BUG
|
||
PUSHJ P,TYOOUT ;AND THE NEW POSITION.
|
||
MOVE A,TPHP(TT)
|
||
PUSHJ P,TYOOUT
|
||
TYOAS3: MOVEM TT,TTYLPP(I) ;TELL TTY IT IS ASSOCIATED.
|
||
SETOM TTYLPS(I)
|
||
JRST POPAJ
|
||
|
||
TYOAS5: PUSH P,A ;REGARD TTY AS ASSOCIATED WITHOUT ACTUALLY
|
||
JRST TYOAS3 ;MOVING ITS CURSOR.
|
||
|
||
;FORCE OUT BUFFERED CURSOR MOTION.
|
||
;CALL ONLY IF TTY DISSOCIATED, FROM M.P. OR CLOCK LEVEL.
|
||
;H MUST BE SET UP ALREADY
|
||
TYOFRC: MOVE Q,TOIP(I)
|
||
PUSHJ P,TYOASS
|
||
JRST TYOFN2
|
||
|
||
;PUT CHAR IN OUTPUT BFR (BUT IT DOESN'T BECOME VISIBLE
|
||
;TO INT. LEVEL UNTIL WE FINALIZE - IN CASE WE PCLSR)
|
||
TYOOUT: TRNE R,%TJHDE
|
||
POPJ P,
|
||
TYOOU1: CAMN Q,TOBEP(I) ;Going to deposit past end of buffer?
|
||
MOVE Q,TOBBP(I) ; Yes, make wrap around instead.
|
||
HRRZI T,(Q) ;Get addr part of the buffer pointer.
|
||
CAILE T,@TOBEP(I) ;Reasonable buffer pointer?
|
||
; CANT HAVE BEEN DUE TO 11 DOWN
|
||
BUG HALT,[TTY: OUTPUT BUFFER POINTER PAST END OF BUFFER]
|
||
IDPB A,Q ;Stuff char into output buffer.
|
||
IFN N11TYS, TRNN H,%TP11T ;TV-11 ttys dont have TORM.
|
||
SOSL TORM(I) ; One less space available in buffer.
|
||
POPJ P,
|
||
BUG HALT,[TTY: OUTPUT BUFFER OVERFLOWED, TYOWNC IS TOO SMALL]
|
||
|
||
;FINALIZE, UPDATING TOIP, TORM AND FLAGS.
|
||
;ALSO RESET Q FOR ANOTHER BUNCH OF OUTPUT.
|
||
TYOFNX: ;FINALIZE WHEN TTY DISSOCIATED AND NOTHING PUT IN BFR.
|
||
TYOFND: ;SIMILAR, WHEN SOMETHING MIGHT HAVE BEEN PUT IN BFR.
|
||
TYOFNA: ;FINALIZE WHEN TTY ASSOCIATED W/ PC PPR.
|
||
TYOFN2: MOVEM Q,TOIP(I)
|
||
AOSN TTYOAC(I) ;START THE TTY.
|
||
XCT TTYST(I)
|
||
JRST TYOFNR
|
||
|
||
;ON ORDINARY TTY, CALL WHEN BUFFER FULL.
|
||
;WAIT TILL AT LEAST 3/4 EMPTY. T HAS MINIMUM # CHARS NEEDED.
|
||
;IF RUNNING SYS JOB, POP1J IF TTY SEEMS TO BE HUNG.
|
||
TYOW1: CAIGE T,TOBS*3/4 ;DON'T UNBLOCK TILL BUFFER AT LEAST 3/4 EMPTY.
|
||
MOVEI T,TOBS*3/4
|
||
TYOW2: MOVEM I,EPDL3(U) ;MAY TRAP OUT ON SYSTEM JOB
|
||
CAME U,USER
|
||
BUG
|
||
JUMPN U,TYOW4
|
||
JRST TYOW5 ;HANG UP SYS JOB FOR MAX OF 5 SEC
|
||
|
||
PUSHJ P,TYOW6
|
||
TYOW5: PUSHJ P,UFLS
|
||
MOVE T,TTYCOM(I)
|
||
TLNE T,%TCHNG
|
||
SUB P,[1,,1] ;TIMED OUT
|
||
POPJ P,
|
||
|
||
CAMLE T,TORM(I)
|
||
TYOW4: PUSHJ P,UFLS
|
||
POPJ P,
|
||
|
||
TYOW6: MOVE A,AC0S+U(U) ;(IN CASE U DIDN'T EQUAL USER AT TYOW1)
|
||
MOVE A,EPDL3(A) ;IF SYS JOB, FLUSH IF NO CHR PROCESSED FOR 15 SEC
|
||
MOVE Q,TTYTYP(A)
|
||
SKIPL TTOALC(A) ;TIME OUT ON SOFTWARE TTY'S WITHOUT ALLOCATION.
|
||
JRST TYOW6A ;IF THIS IS A PDP-11 TV,
|
||
TRNE Q,%TY11T ;TEST FOR ROOM IN BUFFER IS DIFFERENT ON TV'S
|
||
JRST TYOW7
|
||
CAMG T,TORM(A) ;FOR NON-TV'S, TORM IS VALID.
|
||
JRST TYOW6B ;THERES ROOM NOW
|
||
TYOW6A: MOVSI T,%TCHNG
|
||
MOVE Q,TIME
|
||
SUB Q,TTLTM(A)
|
||
CAIG Q,5.*30.
|
||
JRST TYOW6C ;NO NEW TIMEOUT YET
|
||
IORM T,TTYCOM(A) ;MARK THIS TTY AS HUNG FOR SYS JOB
|
||
JRST POPJ1
|
||
|
||
TYOW6C: CAILE Q,3
|
||
TDNN T,TTYCOM(A) ;SKIP ON CONSOLE WAS LOSING RECENTLY
|
||
POPJ P,
|
||
JRST POPJ1 ;TIME OUT MUCH SHORTER IF CONSOLE DETERMINED TO BE A LOSER
|
||
|
||
TYOW7: LDB Q,T
|
||
CAIE Q,1_TT11BY-1
|
||
JRST TYOW6A
|
||
TYOW6B: MOVSI T,%TCHNG ;GET HERE WHEN ROOM EXISTS IN BUFFER
|
||
ANDCAM T,TTYCOM(A) ;ITS NOT HUNG NOW
|
||
JRST POPJ1
|
||
|
||
IFN N11TYS,[
|
||
;ON A PDP-11 TV, CALL HERE TO WAIT UNTIL THERE ARE AT LEAST
|
||
;TYOWNC CHARS OF SPACE IN THE OUTPUT BUFFER.
|
||
;CAN POP1J FOR THE SYS JOB.
|
||
TYOWN: PUSHJ P,TYOWN1
|
||
LDB B,T ;IS THE POS. 20. CHARS UP VACANT?
|
||
CAIN B,1_TT11BY-1
|
||
POPJ P, ;YES, NO NEED TO WAIT.
|
||
JUMPN U,TYOWN2 ;IF SYS JOB, TIME OUT BEFORE TOO LONG.
|
||
MOVEM I,EPDL3(U)
|
||
MOVE B,TIME
|
||
MOVEM B,TTLTM(I)
|
||
JRST TYOW5
|
||
|
||
TYOWN2: PUSH P,A ;SEEMS TO BE NO SPACE, CHECK AGAIN
|
||
MOVE B,(T) ;DOING THINGS IN THE RIGHT ORDER THIS TIME
|
||
LDB A,T ;TO AVOID GETTING HUNG BY A TIMING ERROR
|
||
CAIN A,1_TT11BY-1
|
||
JRST POPAJ ;SOME SPACE APPEARED IN THE MEANTIME
|
||
POP P,A
|
||
EXCH B,T
|
||
CAMN T,(B) ;WAIT FOR THIS WORD TO CHANGE
|
||
PUSHJ P,UFLS
|
||
JRST TYOWN ;THEN CHECK IT AGAIN
|
||
|
||
TYOWN1: MOVE T,TOIP(I)
|
||
ADDI T,TYOWNC/<36./TT11BY>
|
||
HRRZ B,TOBEP(I)
|
||
CAIGE B,(T)
|
||
SUB T,TT11OL
|
||
HRLI T,040000+TT11BY_6 ;BP TO WHOLE OF RIGHTMOST BYTE IN WORD
|
||
POPJ P,
|
||
]
|
||
|
||
;COME HERE WHEN DETECT THAT %TFEOP OR %TFIGL IS SET.
|
||
TYOIGL: TRZN B,%TFIGL ;%TFIGL TAKES PRIORITY.
|
||
JRST TYOEOP
|
||
MOVEM B,TPFLAG(TT) ;CLEAR IT, AND IGNORE THIS CHAR
|
||
CAIE A,^J
|
||
JRST TYOIG1
|
||
POPJ P,
|
||
|
||
;%TFEOP IS SET AND OUTPUT IS DONE: DO **MORE** PROC.
|
||
TYOEOP: PUSH P,[TYOEO9]
|
||
PUSH P,A
|
||
TYOEO5: SKIPE USER ;DON'T DO MORES IF SYSTEM JOB IS TYPING
|
||
TRNE R,%TJMOR+%TJECH ;OR THIS CHANNEL DOESN'T WANT TO
|
||
JRST TYOEO7
|
||
MOVSI B,%TSMOR
|
||
TDNE B,TTYSTS(I) ;OR THIS JOB DOESN'T WANT TO
|
||
JRST TYOEO7
|
||
HRRZ B,TTYSTS(I) ;DON'T **MORE** AN $$^P'ED JOB'S OUTPUT
|
||
CAME B,U
|
||
JRST POPAJ
|
||
MOVE B,TCMXV(I) .SEE TPVE;(TT)
|
||
MOVEM B,TPVM(TT)
|
||
HRRZ B,UUAC(U) ;GET INTERRUPT BIT FOR CHANNEL THIS IOT IS ON
|
||
MOVE B,CHNBIT(B)
|
||
AND B,MSKST2(U) ;HAS USER ENABLED OUTPUT INTERRUPT?
|
||
JUMPE B,TYOEO1 ;NO, SYSTEM DOES **MORE** PROC.
|
||
IORM B,IFPIR(U) ;YES, JUST GIVE USER INT
|
||
MOVEI B,%TFEOP ;HE CAN TYPE **MORE** IF HE WANTS TO.
|
||
ANDCAM B,TPFLAG(TT) ;INT. HAS BEEN GIVEN.
|
||
PUSHJ P,TYOUN1 ;LSWPOP THE FINSET, ETC.
|
||
SKIPA
|
||
SKIPA
|
||
PUSHJ P,UFLS ;MAKE HIM TAKE THE INT. RIGHT NOW.
|
||
TYOEO6: PUSHJ P,LSWCLR
|
||
SOS UUOH ;HIS PICLR IS SET? RETRY THE UUO.
|
||
JRST URET
|
||
|
||
TYOEO7: MOVEI B,%TFEOP ;MORE SUPPRESSED, TURN OFF THE FLAG
|
||
ANDCAM B,TPFLAG(TT)
|
||
JRST POPAJ
|
||
|
||
;COME HERE AT END OF PAGE IF PROGRAM ISN'T SMART.
|
||
TYOEO1: PUSH P,TPHP(TT)
|
||
MOVE A,TPHP(TT)
|
||
ADDI A,10
|
||
CAML A,TCMXH(I)
|
||
PUSHJ P,TYORCR
|
||
CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOASS
|
||
IRPC X,,**MORE**
|
||
MOVEI A,"X
|
||
PUSHJ P,TYONR1
|
||
TERMIN ;OUTPUT THE STRING "**MORE**"
|
||
IORI R,%TJSTP ;MAKE ALL OUTPUT ON THIS CHNL HANG.
|
||
MOVEI B,%TFEOP ;NO LONGER WANT NEXT CHAR TO DO **MORE**
|
||
ANDCAM B,TPFLAG(TT)
|
||
POP P,A ;REMEMBER VALUE TO RESET HPOS TO LATER.
|
||
HRLM A,TPFLAG(TT)
|
||
PUSHJ P,TYOFNA ;FINALIZE SO "**MORE**" WILL TYPE OUT;
|
||
;PCLSRING NO PROBLEM; SINCE %TJSTP IS SET THE IOT
|
||
;WILL COME TO TYOEO3.
|
||
TYOEO3:
|
||
IFN N11TYS,[
|
||
TRNE H,%TP11T ;WAIT FOR BUFFER SPACE ON TV.
|
||
PUSHJ P,TYOWN ;NOTE THIS CAN POP1J
|
||
]
|
||
PCLT
|
||
MOVEI T,TOBS ;WAIT FOR ALL OF "**MORE**" TO GET OUT.
|
||
CAME T,TORM(I)
|
||
PUSHJ P,TYOW1
|
||
PUSH P,C
|
||
PUSH P,D
|
||
PUSH P,R
|
||
PUSH P,TT
|
||
MOVEI R,%TIPEK+%TIACT+%TIECH+%TINWT
|
||
PUSHJ P,TYI0 ;LOOK AHEAD AT NEXT INPUT CHAR.
|
||
JUMPL D,TYOEO6 ;IS NONE => RETRY UUO AND WAIT IN TYOSET.
|
||
EXCH TT,(P)
|
||
EXCH R,-1(P)
|
||
MOVE Q,TOIP(I)
|
||
MOVE C,TTYSTS(I)
|
||
TLNE C,%TSROL ;IN SCROLL MODE, MAKE NEXT LINE OF OUTPUT OVERWRITE **MORE**.
|
||
JRST [ PUSHJ P,TYORCR
|
||
PUSHJ P,TYOCEL
|
||
SOS TPVM(TT) ;MORE AGAIN BEFORE THIS LINE GOES OFF SCREEN
|
||
JRST TYOEO4]
|
||
TRZN R,%TJCP1 ;UNLESS THIS IS ^PN
|
||
PUSHJ P,TYOHD1 ;HOME UP (BY HOMING DOWN AND LF'ING)
|
||
PUSHJ P,TYOLF ;OTHERWISE (FOR ^PN) JUST LF.
|
||
TYOEO4: CAMN TT,TTYLPP(I)
|
||
PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
|
||
HLRZ A,TPFLAG(TT) ;SET HPOS TO WHAT IT WAS BEFORE THE **MORE**.
|
||
MOVEM A,TPHP(TT)
|
||
HRRZS TPFLAG(TT)
|
||
EXCH TT,(P)
|
||
EXCH R,-1(P)
|
||
ANDI D,177
|
||
CAIE D,177
|
||
CAIN D,40 ;IF A SPACE, FLUSH IT FROM INPUT BFR
|
||
PUSHJ P,TYIREM
|
||
POP P,TT
|
||
POP P,R
|
||
POP P,D
|
||
POP P,C
|
||
ANDCMI R,%TJSTP ;RETURN CHANNEL TO NORMAL.
|
||
MOVE Q,TOIP(I)
|
||
PUSHJ P,TYOFNR
|
||
POP P,A ;RESTORE THE CHAR BEING IOTTED
|
||
POPJ P, ;AND TRY AGAIN TO IOT IT.
|
||
|
||
TYOEO2: PUSH P,[TYOEO9]
|
||
PUSH P,A ;COME HERE IF PCLSR OUT OF TYOEO3, ETC.
|
||
JRST TYOEO3 ;WHEN THE IOT IS RETRIED.
|
||
|
||
TYOCP1: TRZE R,%TJINK ;IF THIS IS THE CHAR AFTER A ^PI, TREAT IT AS
|
||
JRST TYONR3 ;NORMAL PRINTING CHARACTER.
|
||
TRNE R,%TJSTP
|
||
JRST TYOEO2 ;CHANNEL HUNG IN **MORE**.
|
||
;HANDLE CURSOR CONTROL CODES. COME HERE WITH IOTTED CHAR IN A.
|
||
;IF WE ARE IN THE MIDDLE OF A ^P CODE.
|
||
;OR IF THE CHANNEL IS A SUPERIMAGE OUTPUT CHANNEL.
|
||
TRZE R,%TJCP2 ;AFTER A ^PV OR ^PH ?
|
||
JRST TYOCP2
|
||
TRZN R,%TJCP1 ;NO, NEXT CHAR ISN'T IN THE ^P CODE.
|
||
JRST TYOSIO ;MUST BE %TJSIO THAT WAS SET.
|
||
TYOCP4: CAIL A,"A ;IF ^P CODE IS A LETTER,
|
||
CAILE A,"_
|
||
JRST TYOCP3
|
||
MOVE B,TYOCPT-"A(A) ;GET THE DISPATCH ENTRY FOR IT,
|
||
TLNN H,%TOMVU
|
||
JUMPL B,TYOCPA ;TURN SOME CURSOR OPERATIONS INTO CRLF ON PRINTING TTY
|
||
TLNE B,200000
|
||
PUSH P,[TYOCPR] ;SOME OPERATIONS RETURN HERE FOR FINALIZATION
|
||
JRST (B) ;FINALLY, DISPATCH
|
||
|
||
TYOCPR: MOVEI B,%TFEOP
|
||
ANDCAM B,TPFLAG(TT)
|
||
JRST TYOFNX
|
||
|
||
TYOCP3: CAIL A,140 ;LOWERCASE LETTERS ACT LIKE UPPERCASE
|
||
JRST [ SUBI A,40
|
||
JRST TYOCP4]
|
||
HRLM R,@TYOPV2(J)
|
||
PUSHJ P,TYOUN1 ;OR IT'S ILLEGAL.
|
||
JRST IOCR11 ;IOC ERROR.
|
||
|
||
TYOCPV: IORI R,%TJCP1 ;HERE FOR ^PV
|
||
TYOCPH: IORI R,%TJCP2 ;SAME FOR ^PH. SAY NEXT CHAR IS THE CURSOR POS.
|
||
TYOFNR: HRLM R,@TYOPV2(J)
|
||
POPJ P,
|
||
|
||
TYOCP2: CAMN TT,TTYLPP(I) ;INTERPRET THE CHAR AFTER ^PH OR ^PV.
|
||
PUSHJ P,TYOMVC
|
||
ANDI A,177
|
||
TRZN R,%TJCP1 ;WHICH OF THOSE 2 WAS IT?
|
||
JRST TYOCH1 ;IT WAS ^PH
|
||
ADD A,TPVB(TT)
|
||
SUBI A,10
|
||
CAML A,TCMXV(I) .SEE TPVE;(TT) ;DON'T PUT CURSOR PAST END.
|
||
JRST [ MOVE A,TCMXV(I) .SEE TPVE;(TT)
|
||
SOJA A,.+1]
|
||
CAMGE A,TPVB(TT) ;OR BEFORE BEGINNING.
|
||
MOVE A,TPVB(TT)
|
||
MOVEM A,TPVP(TT)
|
||
JRST TYOCPR
|
||
|
||
TYOCH1: .SEE ADD A,TPHB;(TT)
|
||
SUBI A,10
|
||
CAML A,TCMXH(I) .SEE TPHE;(TT) ;DON'T PUT CURSOR PAST END.
|
||
JRST [ MOVE A,TCMXH(I) .SEE TPHE;(TT)
|
||
SOJA A,.+1]
|
||
SKIPGE A .SEE TPHB;(TT) ;OR BEFORE BEGINNING.
|
||
SETZ A, .SEE TPHB;(TT)
|
||
MOVEM A,TPHP(TT)
|
||
JRST TYOCPR
|
||
|
||
;DISPATCH TABLE FOR ^P CODES.
|
||
;SIGN => TURN INTO ^PA ON PRINTING TTY.
|
||
;4.8 => PUSHJ, ELSE JRST
|
||
TYOCPT: TYOCPA ;A - ADVANCE TO FRESH LINE.
|
||
200000,,TYOMVB ;B - MOVE BACK.
|
||
TYOCLR ;C - CLEAR SCREEN.
|
||
200000,,TYOMVD ;D - MOVE DOWN.
|
||
TYOCEF ;E - CLEAR TO END OF SCREEN.
|
||
200000,,TYOMVF ;F - MOVE FORWARD.
|
||
TYOCP3 ;G - ILLEGAL.
|
||
TYOCPH ;H - NEXT CHAR IS DESIRED HPOS.
|
||
TYOCPI ;I - NEXT CHARACTER TREATED AS NORMAL PRINTING.
|
||
TYOCP3 ;J - ILLEGAL.
|
||
200000,,TYODLF ;K - DELETE FORWARD.
|
||
TYOCEL ;L - CLEAR REST OF LINE.
|
||
TYOMOR ;M - DO **MORE**.
|
||
TYOMO1 ;N - SIMILAR BUT DON'T HOME UP.
|
||
TYOCP3 ;O - ILLEGAL.
|
||
TYOCPP ;P - TYPE "^P".
|
||
TYOCPQ ;Q - TYPE "^C".
|
||
600000,,TYORPS ;R - RESTORE SAVED POS.
|
||
200000,,TYOSPS ;S - SAVE POSITION (FOR A ^PR).
|
||
600000,,TYOHMU ;T - HOME UP.
|
||
200000,,TYOMVU ;U - MOVE UP.
|
||
TYOCPV ;V - NEXT CHAR IS DESIRED VPOS.
|
||
TYOCP3 ;W - ILLEGAL.
|
||
200000,,TYODLB ;X - DELETE BACKWARDS.
|
||
TYOCP3 ;Y - ILLEGAL.
|
||
600000,,TYOHMD ;Z - HOME DOWN.
|
||
200000,,TYOILP ;[ - INSERT LINE POSITION
|
||
200000,,TYODLP ;\ - DELETE LINE POSITION
|
||
TYOCEL ;] - CLEAR TO END OF LINE (USE ^PL IT'S BETTER)
|
||
200000,,TYOICP ;^ - INSERT CHARACTER POSITION
|
||
200000,,TYODCP ;_ - DELETE CHARACTER POSITION
|
||
IFN .-31.-TYOCPT,.ERR WRONG LENGTH TABLE.
|
||
|
||
;^PM AND ^PN DON'T WORK IN PROGRAMS THAT TAKE **MORE**
|
||
;INTERRUPTS - OR, PRECISELY, THEY ALWAYS ENTER
|
||
;THE STATE OF A CHANNEL THAT HAS JUST TYPED OUT "**MORE**".
|
||
TYOMO1: IORI R,%TJCP1 .SEE TYOEO3 ;^PN - ENTER **MORE** STATE.
|
||
TYOMOR: IORI R,%TJSTP ;^PM.
|
||
HRRZS TPFLAG(TT)
|
||
JRST TYOFNR
|
||
|
||
TYOCPI: IORI R,%TJINK
|
||
JRST TYOFNR
|
||
|
||
;INSERT AND DELETE CHARACTERS AND LINES
|
||
TYOILP: SKIPA A,[%TDILP]
|
||
TYODLP: MOVEI A,%TDDLP
|
||
TLNN H,%TOLID
|
||
POPJ P,
|
||
PUSH P,A ;SUPPOSED TO BE AT LEFT MARGIN
|
||
PUSHJ P,TYORCR ;MAKE SURE
|
||
POP P,A
|
||
JRST TYOIL1
|
||
|
||
TYOICP: SKIPA A,[%TDICP]
|
||
TYODCP: MOVEI A,%TDDCP
|
||
TLNN H,%TOCID
|
||
POPJ P,
|
||
TYOIL1: CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOASS
|
||
PUSHJ P,TYOOUT
|
||
MOVEI A,1 ;SUPPLY PARAMETER OF 1
|
||
JRST TYORU1 ;IF YOU WANT TO OPTIMIZE CONSECUTIVE ONES
|
||
; USE SUPER-IMAGE OUTPUT, AT LEAST FOR NOW
|
||
|
||
;RTNS FOR VARIOUS ^P CODES.
|
||
;THE FIRST FOUR DON'T FINALIZE ANYTHING.
|
||
TYOMVF: CAMN TT,TTYLPP(I) ;^PF
|
||
PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
|
||
AOS B,TPHP(TT)
|
||
CAMGE B,TCMXH(I) .SEE TPHE;(TT)
|
||
POPJ P,
|
||
;SETZ A, .SEE TPHB;(TT) ;WRAP AROUND FROM LAST POS. TO FIRST.
|
||
SETZM TPHP(TT)
|
||
TYOMVD: CAMN TT,TTYLPP(I) ;^PD
|
||
PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
|
||
AOS B,TPVP(TT)
|
||
MOVE A,TPVB(TT)
|
||
CAIGE B,119.
|
||
CAML B,TCMXV(I) .SEE TPVE;(TT) ;WRAP AROUND FROM LAST POS. TO FIRST.
|
||
MOVEM A,TPVP(TT)
|
||
POPJ P,
|
||
|
||
TYOMVB: CAMN TT,TTYLPP(I) ;^PB - MOVE BACK.
|
||
PUSHJ P,TYOMVC
|
||
SOSL B,TPHP(TT) .SEE TPHB;(TT)
|
||
POPJ P,
|
||
MOVE A,TCMXH(I) .SEE TPHE;(TT) ;WRAP AROUND FROM FIRST TO LAST.
|
||
SUBI A,2
|
||
MOVMM A,TPHP(TT)
|
||
TYOMVU: CAMN TT,TTYLPP(I) ;^PU - MOVE UP.
|
||
PUSHJ P,TYOMVC
|
||
SOS B,TPVP(TT)
|
||
MOVE A,TCMXV(I) .SEE TPVE;(TT) ;WRAP AROUND FROM FIRST TO LAST.
|
||
SUBI A,1
|
||
CAIL A,119.
|
||
MOVEI A,118.
|
||
CAMGE B,TPVB(TT)
|
||
MOVEM A,TPVP(TT)
|
||
POPJ P,
|
||
|
||
TYOSPS: MOVE B,TPHP(TT) ;^PS - SAVE CURSOR POS.
|
||
HRL B,TPVP(TT)
|
||
MOVEM B,TPSP(TT)
|
||
POPJ P,
|
||
|
||
TYORPS: CAMN TT,TTYLPP(I) ;^PR - RESTORE CURSOR POS FROM SAVED.
|
||
PUSHJ P,TYOMVC
|
||
MOVE B,TPSP(TT)
|
||
HRRZM B,TPHP(TT)
|
||
HLRZM B,TPVP(TT)
|
||
POPJ P,
|
||
|
||
TYOCPA: CAMN TT,TTYLPP(I) ;ADVANCE TO FRESH LINE, IN ANY CASE CLEAR REST OF LINE
|
||
PUSHJ P,TYOMVC
|
||
SKIPE TPHP(TT) ;IF NOT AT THE BEGINNING OF A LINE,
|
||
JRST TYOCRL ;CRLF. MAYBE SOMEDAY THIS WILL CHECK
|
||
JRST TYOCEL ;WHETHER ANYTHING HAS YET BEEN TYPED ON THIS LINE.
|
||
|
||
TYOCLR: TLNN H,%TOMVU ;^PC - CLEAR SCREEN.
|
||
JRST [ MOVE A,TCMXV(I) ;ON PRINTING TTYS, JUST CRLF.
|
||
SUB A,TTYROL(I) ;BUT DON'T --MORE-- UNTIL THIS LINE
|
||
MOVEM A,TPVM(TT);GOES OFF THE SCREEN
|
||
JRST TYOCRL ]
|
||
SKIPN TPVB(TT) ;USE FAST METHOD IF REALLY CLEARING WHOLE SCREEN
|
||
JRST TYOCIM
|
||
TYOCI1: PUSHJ P,TYOHMU
|
||
TYOCEF: SKIPA A,[%TDEOF] ;^PE CLEAR EOF
|
||
TYOCEL: MOVEI A,%TDEOL ;[ ^P] - CLEAR EOL.
|
||
TLNN H,%TOERS
|
||
JRST TYOFNR
|
||
TYONMV: CAME TT,TTYLPP(I) ;HERE FOR CHARS THAT DON'T MOVE THE CURSOR
|
||
PUSHJ P,TYOASS ;BUT DO DEPEND ON BEING PRINTED AT THE RIGHT PLACE ON THE SCREEN
|
||
TYORU1: PUSHJ P,TYOOUT
|
||
JRST TYOFNA
|
||
|
||
TYOCIM: PUSHJ P,TYOHMU ;CLEAR WHOLE SCREEN
|
||
MOVEM TT,TTYLPP(I)
|
||
SETOM TTYLPS(I)
|
||
MOVEI A,%TDCLR
|
||
JRST TYONMV
|
||
|
||
TYOHMU: SETZM TPVM(TT) ;^PT - HOME UP
|
||
CAMN TT,TTYLPP(I)
|
||
PUSHJ P,TYOMVC ;GO TO COLUMN 0,
|
||
MOVE B,TPVB(TT) ;LINE 0.
|
||
MOVEM B,TPVP(TT)
|
||
|
||
TYORCR: TLNE H,%TORAW ;GO TO COLUMN 0 - CR IN IMAGE MODE.
|
||
JRST [ CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOASS ;NO OPTIMIZATION =>
|
||
SETZM TPHP(TT)
|
||
MOVEI A,%TDRCR ;ARRANGE TO SEND REAL CR.
|
||
PUSHJ P,TYONCC
|
||
JRST TYOMVC]
|
||
CAMN TT,TTYLPP(I)
|
||
PUSHJ P,TYOMVC ;ELSE DO CURSOR-MOTION.
|
||
SETZ B, .SEE TPHB;(TT)
|
||
MOVEM B,TPHP(TT)
|
||
POPJ P,
|
||
|
||
TYOHMD: PUSHJ P,TYORCR ;^PZ - HOME DOWN.
|
||
TYOHD1: MOVE B,TCMXV(I) .SEE TPVE;(TT)
|
||
SUBI B,1
|
||
CAIGE B,119.
|
||
MOVEM B,TPVP(TT)
|
||
POPJ P,
|
||
|
||
TYODLB: SKIPN TPHP(TT) ;^PX - DELETE BACKWARD.
|
||
PUSHJ P,.+1 ;IN COLUMN 0, DO IT TWICE SO AS TO ERASE THE "!" AND CHAR BEFORE IT
|
||
PUSH P,TPHP(TT)
|
||
PUSHJ P,TYOMVB
|
||
POP P,B
|
||
SKIPN B
|
||
AOS TPHP(TT) ;IF WRAPPED AROUND, SET TO TCMXH-1
|
||
TYODLF: MOVE B,TPHP(TT) ;^PK - ERASE 1 CHARACTER.
|
||
CAML B,TCMXH(I) .SEE TPHE;(TT) ;DO NOTHING AT END OF LINE.
|
||
POPJ P,
|
||
TLNE H,%TOOVR ;IF CAN'T OVERPRINT, USE SPACE TO ERASE
|
||
JRST [ TLNN H,%TOERS
|
||
POPJ P, ;OTHERWISE, USE SPECIAL CONTROL SEQUENCE IF KNOWN
|
||
MOVEI A,%TDDLF
|
||
JRST TYONMV ]
|
||
CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOASS
|
||
AOS TPHP(TT)
|
||
MOVEI A,40 ;USE REALLY SPACE, NOT CURSOR MOTION!
|
||
PUSHJ P,TYOOUT
|
||
PUSHJ P,TYOMVB ;THEN BACKSPACE OVER IT
|
||
JRST TYOFNX
|
||
|
||
SUBTTL .STATUS AND IOPDL FOR TTY
|
||
|
||
;2.4 HAS "TTY"
|
||
;2.3 DDT MODE ON INPUT
|
||
;(STATYI);2.5 CHRS HAVE BEEN ITYI'ED BUT NOT .IOT'ED (STATYI)
|
||
;2.8 TELETYPE NEXT TO 340 OR 340 SLAVE
|
||
;2.9 TELETYPE IS LOCAL, NOT DIAL IN
|
||
|
||
STATYO: ANDI A,77
|
||
CAIN A,%TINON ;IF CHANNEL HAS NO REAL TTY,
|
||
POPJ P, ;THERE ARE NO SPECIFICS WE CAN SAY.
|
||
SKIPN B,TORM(A)
|
||
TRO D,1_9. ;BUF CAP FULL
|
||
CAIN B,TOBS
|
||
TRO D,1_<9.+1> ;BUFFER CAP EMPTY
|
||
STATY1: SKIPL TTYTBL(U)
|
||
TRO D,1_<9.+3> ;HAS TTY
|
||
IORI D,SNTTY
|
||
MOVE H,TTYOPT(A)
|
||
TLNE H,%TOERS
|
||
TRC D,SNTTY#SNTDS
|
||
POPJ P,
|
||
|
||
STATYI: ANDI A,77
|
||
CAIN A,%TINON ;CATCH "DISOWNED" TTY CHNLS.
|
||
POPJ P,
|
||
TRO D,1_<9+1> ;ASSUME BUF CAP EMPTY
|
||
SKIPN B,TICC(A) ;SEE IF THERE ARE ANY INPUT CHARACTERS
|
||
JRST STATY2 ;NOT INCLUDING COM MODE ECHO
|
||
MOVE E,TIOP(A)
|
||
STATY3: CAMN E,TIBEP(A)
|
||
SUBI E,TIBL
|
||
ILDB TT,E
|
||
TLNN TT,%TXIGN
|
||
TRZA D,1_<9+1> ;INPUT SEEN, BUF CAP NOT EMPTY
|
||
SOJG B,STATY3
|
||
STATY2: CAIL B,TIBS-10.
|
||
TRO D,1_9. ;BUF CAP NEARLY FULL
|
||
LDB B,[400400,,TTYTYP(A)] ;GET LOCAL AND 340 MDS
|
||
DPB B,[160400,,D] ;DEPOSIT IN STATUS WORD
|
||
CONO PI,TTYOFF
|
||
MOVE TT,TICC(A)
|
||
CAMLE TT,TINTC(A)
|
||
TRO D,20000 ;MORE CHRS HAVE BEEN ITYI'ED THAN .IOT'ED
|
||
CONO PI,TTYON
|
||
JRST STATY1
|
||
|
||
;TELETYPE IO PUSHDOWN ROUTINES
|
||
|
||
TYOIOP: TDZA A,A ;OUUTPUT CHNL.
|
||
TYIIOP: MOVEI A,TYIMSK-TYOMSK ;INPUT CHNL, SET TYIMSK INSTEAD TYOMSK.
|
||
CONO PI,CLKOFF ;TO PREVENT TELETYPE (IF CONSOLE) FROM MOVING AROUND
|
||
JUMPGE B,TYIOP1 ;JUMP IF OPEN AS DEVICE
|
||
SKIPGE TTYTBL(U) ;IF PROCEDURE DOESN'T HAVE CONSOLE,
|
||
JRST CLKONJ ;THEN THAT'S ALL
|
||
TYIOP1: LDB E,[$TIIDX,,B] ;GET TTY NUMBER IN E
|
||
ADDI E,(A) ;IF INPUT, TYOMSK(E) WILL BE TYIMSK VAR.
|
||
HRRZ R,UUAC(U) ;GET "AC FIELD" (IO PUSHDOWN ROUTINES RESTORE R)
|
||
MOVE A,CHNBIT(R) ;GET RELEVANT CHANNEL INTERRUPT BIT
|
||
XCT TYIOPT(I) ;IORM OR ANDCAM A TO TYOMSK(E)
|
||
JRST CLKONJ ;RETURN
|
||
|
||
TYIOPT: ANDCAM A,TYOMSK(E) ;IOPUSH (PSEUDO-CLOSE)
|
||
IORM A,TYOMSK(E) ;IOPOP (PSEUDO-OPEN)
|
||
|
||
;STY IO PDL ROUTINES
|
||
|
||
STYOIP: TDZA A,A
|
||
STYIIP: MOVEI A,STYMSK-STYOMS
|
||
ADDI A,STYOMS-NFSTTY-TYOMSK
|
||
JRST TYIOP1
|
||
|
||
SUBTTL TTY CLOSE ROUTINES
|
||
|
||
;INPUT CLOSE
|
||
|
||
TYICLS: JSP E,TYCLOS ;IGNORE FOR DISOWNED CONSOLE
|
||
ANDCAM B,TYIMSK(A) ;INDICATE CHANNEL CLOSURE
|
||
JRST TYICL2
|
||
|
||
TYCLOS: LDB I,[210100,,A]
|
||
ANDI A,77 ;THROW AWAY TOP BITS OF IOCHNM WD, GET TTY #.
|
||
CAIN A,%TINON ;FOR A CHNL IN A TTYLESS TREE,
|
||
POPJ P, ;DON'T SOS ANYONE'S TTNTO.
|
||
SKIPGE APRC(U) ;SKIP UNLESS DISOWNED
|
||
JUMPN I,[JRST 4,.] ;DISOWNED JOB HAS REAL CONSOLE TTY?
|
||
SKIPGE TTYTBL(U);IF IT'S A CONSOLE AND THIS JOB DOESN'T
|
||
JUMPN I,TYICL2 ;HAVE TTY, DON'T CHANGE TYIMSK OR TYOMSK.
|
||
HRRZ R,UUAC(U)
|
||
MOVE B,CHNBIT(R) ;GET THE BIT TO CLEAR IN TYIMSK OR TYOMSK.
|
||
JRST (E) ;RETURN & CLEAR IT.
|
||
|
||
;OUTPUT CLOSE
|
||
|
||
TYOCLS: JSP E,TYCLOS ;IGNORE FOR DISOWNED CONSOLE
|
||
MOVE I,A
|
||
SKIPE USER
|
||
PUSHJ P,TYOWC ;WAIT A WHILE FOR OUTPUT TO FINISH
|
||
ANDCAM B,TYOMSK(A) ;SET OF OUTPUT CHNLS OPEN.
|
||
TYICL2: SOSLE TTNTO(A)
|
||
POPJ P, ;MORE OPENS ON TTY
|
||
SKIPE TTNTO(A)
|
||
BUG
|
||
MOVE B,TTYSTS(A)
|
||
TLNE B,%TSCNS
|
||
POPJ P, ;OPEN AS CONSOLE
|
||
JRST TTYLO1
|
||
|
||
;WAIT FOR TTY OUTPUT BUFFER TO BE EMPTY,
|
||
;BUT TIME OUT IF TTY DOESN'T TYPE OUT FOR 5 SEC.
|
||
TYOWC: MOVEM I,EPDL3(U) ;SAVE TTY # FOR TYOW5.
|
||
IFN N11TYS,[
|
||
MOVE T,TTYTYP(I)
|
||
TRNE T,%TY11T
|
||
POPJ P,
|
||
]
|
||
MOVEI T,TOBS ;WAIT TILL OUTPUT BUFFER EMPTY
|
||
PUSHJ P,TYOW5 ;BUT DON'T WAIT TOO LONG.
|
||
POPJ P, ;TYOW5 MAY POP1J.
|
||
|
||
;TTY # IN A - MAKE THE TTY FREE.
|
||
TTYLO1: SETZM TTNTO(A)
|
||
SETZM TYIMSK(A)
|
||
SETZM TYOMSK(A)
|
||
HRLOI B,%TSFRE
|
||
IORB B,TTYSTS(A) ;SAY TTY FREE (BUT TTYSTA OFF SO CAN'T ^Z)
|
||
PUSHJ P,TTYLFC ;REMOVE TTY FROM COM MODE AND
|
||
PUSHJ P,TYIRS0 ;RESET INPUT BUFFER
|
||
IFN TTLPTP,[
|
||
CAMN I,LPTTTY ;IF TTY'S THE LPT, IT'S NOT IN USE.
|
||
SETOM LPTUSR
|
||
]
|
||
MOVE T,TTYTYP(I)
|
||
TRNN T,%TYSTY
|
||
PUSHJ P,TTYIN1 ;RE-INIT USER OPTIONS
|
||
TRNE T,%TYDIL\%TYRLM ;DIALUP LINE => MAKE IT PRINTING.
|
||
TRNE T,%TYMDM ;UNLESS WE CAN DETECT DISCONNECTS, IN WHICH CASE DO IT THEN.
|
||
CAIA
|
||
PUSHJ P,NCNSSP
|
||
IFN N11TYS,[
|
||
TRNE T,%TY11T
|
||
PUSHJ P,NCNSST
|
||
]
|
||
MOVEI B,SCRCFM
|
||
SKIPL TTYSTA(I)
|
||
IORM B,SUPCOR ;REQUEST A CONSOLE-FREE MESSAGE.
|
||
MOVE A,I ;IN CASE OUR CALLER WANTS TTY # IN A.
|
||
POPJ P,
|
||
|
||
IFN N11TYS,[
|
||
TTYLO2: MOVE B,TTYTYP(A) ;TTY BEING CLOSED & CNSL FREE MSG NOT NEEDED,
|
||
SKIPGE TT11P ;IF IT'S A PDP11-TV TTY
|
||
TRNN B,%TY11T
|
||
POPJ P,
|
||
MOVE I,A ;MAKE ALL JOBS CEASE TO HACK THIS SCREEN
|
||
PUSHJ P,NTVWH1 ;B := VIDEO BUFFER NUMBER
|
||
BUG
|
||
SETZ A,
|
||
TTYLO3: LDB C,[$11BY0,,TVCREG(A)] ;VIDEO BUFFER HACKED BY THIS JOB OR 377
|
||
CAMN C,B
|
||
SETOM TVCREG(A) ;IF JOB HACKING THIS VIDEO BUFFER, MAKE IT STOP.
|
||
ADDI A,LUBLK
|
||
CAMGE A,USRHI
|
||
JRST TTYLO3
|
||
MOVE B,TT11HD ;TELL THE 11 THE TTY IS FREE.
|
||
ADDI B,1-NF11TY(I)
|
||
ADD B,TT1111
|
||
HRROI T,-1_4+10 ;SET TTY'S PHYSLC WORD TO -1.
|
||
MOVEM T,(B)
|
||
MOVE T,TOBBP(I) ;RESET OUTPUT BUFFER POINTER TO BEGINNING OF
|
||
MOVEM T,TOIP(I) ; BUFFER. THE 11 DOES ALSO.
|
||
POPJ P,
|
||
]
|
||
|
||
;REMOVE A TTY FROM COM MODE IF IT IS COM MODE.
|
||
;CALLED WHEN TTY BECOMES FREE, ETC.
|
||
;TAKES TTY # IN A; LEAVES IT IN A AND I.
|
||
TTYLFC: HRRZ I,A
|
||
CONO PI,TTYOFF
|
||
SKIPL Q,TTYCOM(I)
|
||
JRST TTLFC1
|
||
PUSH P,I
|
||
PUSH P,U
|
||
PUSHJ P,TYCSET
|
||
TLZ Q,%TCCBK+%TCTPN+%TCCBS
|
||
MOVEM Q,TTYCOM(I) ;FLUSH COM MODE TEMP FLAGS.
|
||
PUSHJ P,TYCGTM ;REMOVE THE TTY FROM COM LINKS.
|
||
POP P,U
|
||
POP P,I
|
||
TTLFC1: MOVE A,I
|
||
MOVEI B,TTYI
|
||
MOVEM B,TTYIPC(A)
|
||
POPJ P,
|
||
|
||
SUBTTL TTY RESET ROUTINES
|
||
|
||
;TTY INPUT RESET
|
||
|
||
TYIRS: PUSHJ P,TTYWR
|
||
POPJ P, ;IGNORE IF WE DON'T OWN THE TTY.
|
||
TYIRS0: MOVSI T,%TCLFT+%TCICO
|
||
PUSHJ P,TTYCMW ;MAYBE WAIT FOR COM LINK TO FINISH. RETURN WITH TTYCHN OFF.
|
||
PUSHJ P,TYIRS1 ;DISCARD THE INPUT.
|
||
JRST TTYONJ
|
||
|
||
;; DISCARD THE CONTENTS OF THE TTY INPUT BUFFER. TTY NUMBER IN I.
|
||
TYIRS1: MOVE B,TIIP(I) ;Get input pointer.
|
||
MOVEM B,TIOP(I) ;Bash output ptr to it.
|
||
MOVEM B,TINTP(I) ;Bash interrupt-peeked ptr to it.
|
||
MOVEM B,ECHOP(I) ;Bash echo ptr to it.
|
||
SETZM ECHOC(I) ;Nothing to echo.
|
||
CLEARM TICC(I) ;Nothing has been input.
|
||
CLEARM TACC(I) ;No activation chars either.
|
||
CLEARM TINTC(I) ;Nothing to ITYIC either.
|
||
POPJ P,
|
||
|
||
;OUTPUT RESET
|
||
|
||
TYORS: PUSHJ P,TTYWR ;CHECK FOR OWNING TTY. TTY NUMBER IN I.
|
||
POPJ P, ;NON-SKIP MEANS NO; IGNORE THE .RESET.
|
||
SKIPL TTOALC(I)
|
||
PUSHJ P,UFLS
|
||
MOVSI T,%TCLFT+%TCOCO+%TCICO+%TCFPD ;ALSO WAIT FOR OUTPUT SEQ TO FINISH.
|
||
PUSHJ P,TTYCMW ;HANG UNTIL OUT OF COM MODE, OR OVER-RIDDEN. MAY UTCOFF.
|
||
MOVSI B,%TJCP1+%TJCP2+%TJSTP ;IF LAST CHAR THIS CHNL WAS ^P,
|
||
ANDCAM B,(R) ;FORGET IT. ALSO UNHANG CHANNEL FROM **MORE**.
|
||
MOVE TT,I
|
||
IMULI TT,TPLEN*2
|
||
MOVEI B,%TFEOP+%TFIGL ;RESTORE BOTH PCS OF PPR TO NORMAL STATE.
|
||
ANDCAM B,TPFLAG(TT)
|
||
ANDCAM B,TPFLAG+TPLEN(TT)
|
||
MOVE B,TTYOPT(I) ;IS OUTPUT RESET SUPPOSED TO DO SOMETHING?
|
||
TRNN B,%TPORS ;(ON FAST TTYSS IT DOESN'T)
|
||
JRST UTCONJ
|
||
MOVE B,TTYCOM(I)
|
||
TLNE B,%TCECH
|
||
JRST UTCONJ
|
||
TYORS1: MOVE B,TOOP(I) ;SCAN BACKWARD 4 CHARS FROM TOOP TO SEE IF A %TDMOV
|
||
MOVEM B,TOIP(I)
|
||
MOVEI TT,TOBS-4 ;HAS BEEN PARTIALLY REMOVED FROM THE BUFFER.
|
||
MOVEM TT,TORM(I) ;TORM HAS THE RIGHT VALUE ASSUMING A %TDMOV APPEARS
|
||
;JUST BEFORE TOOP - THE FIRST PLACE WE WILL LOOK FOR ONE.
|
||
TYORS4: LDB T,B
|
||
CAIE T,%TDMV0
|
||
CAIN T,%TDMV1
|
||
JRST TYORS8
|
||
CAIN T,%TDMOV ;IF ONE IS FOUND IN THOSE 4 CHARS, IT MUST EXTEND PAST TOOP,
|
||
JRST TYORS5 ;SO TAKE TOOP AND INCREMENT IT TO GET NEW TOIP.
|
||
IBP B ;DBP B - KNOWING THAT THERE ARE 4 BYTES/WORD.
|
||
IBP B
|
||
IBP B
|
||
SUBI B,1
|
||
CAMN B,TOBBP(I)
|
||
MOVE B,TOBEP(I)
|
||
AOS TT,TORM(I) ;AS THE %TDMOV GETS FARTHER BACK, ITS REMNANT OCCUPIES LESS SPACE.
|
||
CAIE TT,TOBS ;IF ITS REMNANT TAKES NO SPACE, FORGET ABOUT IT.
|
||
JRST TYORS4
|
||
JRST TYORS6
|
||
|
||
TYORS8: ADDI TT,2 ;THIS REMNANT IS TWO CHARS LONG
|
||
CAIL TT,TOBS
|
||
JRST [ MOVEI TT,TOBS
|
||
MOVEM TT,TORM(I)
|
||
JRST TYORS6 ]
|
||
MOVEM TT,TORM(I)
|
||
TYORS5: SUBI TT,TOBS ;TT GETS -<LENGTH OF REMNANT>
|
||
MOVE B,TOOP(I)
|
||
TYORS7: CAMN B,TOBEP(I) ;SCAN FORWARD FROM TOOP TO FIND END OF REMNANT
|
||
MOVE B,TOBBP(I)
|
||
IBP B
|
||
AOJL TT,TYORS7
|
||
MOVEM B,TOIP(I) ;AND FLUSH FROM BUFFER ALL BUT THAT REMNANT.
|
||
;DROPS THROUGH
|
||
;DROPS IN
|
||
TYORS6: MOVE B,TCTYP(I) ;IF A "SOFTWARE" TTY, SEND A %TDORS.
|
||
CAIE B,%TNSFW
|
||
JRST [ MOVE B,TTYTYP(I)
|
||
TRNN B,%TYSTY ;ELSE, ON A STY, IF %SSORS
|
||
JRST TYORS2
|
||
MOVE B,STYSTS-NFSTTY(I)
|
||
TLNN B,%SSORS
|
||
JRST TYORS2
|
||
JRST .+1] ;THEN SEND %TDORS
|
||
SOS TORM(I)
|
||
MOVE B,TOIP(I)
|
||
CAMN B,TOBEP(I)
|
||
MOVE B,TOBBP(I)
|
||
MOVEM B,TOIP(I) ;CHECK FOR WRAP
|
||
MOVEI B,%TDORS ;RESET CODE
|
||
IDPB B,TOIP(I)
|
||
PUSHJ P,TYORS2 ;FINISH RESETTING, TURN TTYCHN BACK ON,
|
||
AOSN TTYOAC(I) ;AND ACTIVATE INT. LEVEL, SO %TDORS WILL BE SENT.
|
||
XCT TTYST(I) ;(THIS MAY TURN TTYCHN OFF AND ON AGAIN).
|
||
MOVE B,TTYOPT(I)
|
||
TRNN B,%TPCBS ;ON SOFTWARE TTY WITH ^\ TURNED ON, STOP TYPEOUT AT M.P.
|
||
POPJ P, ;LEVEL UNTIL THE TTY SAYS WHAT ITS CURSOR POSITION IS NOW,
|
||
HRRZS TTOALC(I) ;USING ^\^P... OR SCPOS
|
||
POPJ P,
|
||
|
||
TYORS2: SKIPGE TT,TTYLPP(I)
|
||
SETCMB TT,TTYLPP(I)
|
||
SKIPL B,TTYIHP(I) ;AND UNDO MAIN PRGM CURSOR POS MVT
|
||
CAMGE B,TCMXH(I)
|
||
JRST TYORS3
|
||
MOVE B,TCMXH(I)
|
||
SUBI B,1
|
||
MOVEM B,TTYIHP(I)
|
||
TYORS3: MOVEM B,TPHP(TT)
|
||
MOVE B,TTYIVP(I)
|
||
CAML B,TCMXV(I)
|
||
BUG
|
||
MOVEM B,TPVP(TT)
|
||
SETOM TTYLPS(I)
|
||
JRST UTCONJ
|
||
|
||
;SEND A %TDINI TO ALL TTYS. CALLED AT SYSTEM STARTUP.
|
||
TTRSAL: MOVSI I,-NCT
|
||
TTRSA1: MOVE T,TCTYP(I)
|
||
MOVE H,TTYOPT(I)
|
||
MOVE Q,TOIP(I)
|
||
CONO PI,TTYOFF
|
||
MOVEI A,%TDINI
|
||
PUSHJ P,TYOOU1 ;YES, SEND IT A REINIT CHARACTER
|
||
MOVEM Q,TOIP(I)
|
||
CONO PI,TTYON
|
||
AOSN TTYOAC(I)
|
||
XCT TTYST(I) ;AND MAKE SURE IT GETS SENT TO THE TTY
|
||
TTRSA2: AOBJN I,TTRSA1
|
||
POPJ P,
|
||
|
||
SUBTTL TV-11 INPUT PROCESSOR
|
||
|
||
IFN N11TYS,[
|
||
;CALL HERE FROM CLOCK LEVEL WHEN THERE IS INPUT FROM THE PDP-11.
|
||
;TAKE CHARACTERS FROM THE PDP11 AND CALL THE TTY INPUT INT. LVL.
|
||
;ROUTINES WITH THEM ONE AT A TIME. MAY CLOBBER ANY ACS.
|
||
TT11IN: SKIPL TT11P ;IF 11 DOWN, DON'T LOOK FOR INPUT FROM IT.
|
||
JRST TT11D1
|
||
LDB TT,[$11WD0,,@TT11HD]
|
||
SETZM @TT11HD ;GET AND RESET CHAIN OF INPUT BUFFERS.
|
||
;HANDLE THE NEXT INPUT BUFFERFULL. PDP11 ADDRESS IN TT.
|
||
TT11I1: LSH TT,-2 ;CONVERT PDP11 ADDRESS TO PDP10 ADDR.
|
||
ADDI TT,TT11LO
|
||
MOVE A,(TT) ;GET -<# CHARS IN BUFFER>
|
||
ASH A,-24
|
||
LDB I,[$11WD0,,2(TT)] ;GET # OF TTY THE CHARS ARE FOR.
|
||
CAML A,[-400] ;IF A OR I IS RIDICULOUS,
|
||
CAML I,TT1111
|
||
JRST TT11LS ;ASSUME 11 HAS CRASHED.
|
||
JUMPG A,TT11LS
|
||
ADDI I,NF11TY
|
||
MOVEI B,3(TT) ;SET UP BP TO DATA AREA OF BUFFER.
|
||
HRLI B,$11WD1 ;EACH CHAR IS 16. BITS - A PDP11 WORD.
|
||
PUSH P,TT ;SAVE BUFFER ADDR SO CAN FIND NEXT BFR.
|
||
CAIL I,NF11TY+N11TYS
|
||
JRST [ MOVE A,I ;IF 11 KNOWS MORE TV'S THAN 10, IGNORE THOSE 10 ISN'T USING.
|
||
PUSHJ P,TTYLO2 ;AND IF THE 11 STARTS USING ONE, FREE IT SO USER ISN'T CONFUSED.
|
||
JRST TT11I3]
|
||
CONO PI,TTYOFF-1
|
||
JUMPE A,TT11I4
|
||
PUSH P,I
|
||
PUSH P,A
|
||
PUSH P,B
|
||
TT11I2: ILDB A,(P) ;GET NEXT CHAR FROM BFR,
|
||
MOVE I,-2(P)
|
||
PUSHJ P,NTYI5 ;PRETEND IT CAME FROM A TTY CONTROLLER INT.,
|
||
AOSE -1(P)
|
||
JRST TT11I2 ;MORE CHARS => HANDLE THEM.
|
||
SUB P,[3,,3]
|
||
TT11I3: CONO PI,TTYON-1
|
||
POP P,A ;ADDR. OF BUFFER JUST EMPTIED.
|
||
LDB TT,[$11WD1,,1(A)] ;GET ADDR OF NEXT BUFFER.
|
||
SETZB B,(A) ;THIS BUFFER NOW FREE.
|
||
DPB B,[$11WD1,,1(A)]
|
||
JUMPN TT,TT11I1 ;LOOK AT NEXT ONE, IF ANY.
|
||
POPJ P,
|
||
|
||
TT11I4: PUSHJ P,TYPEND ;INPUT BUFFER WITH 0 CHARS SAYS OUTPUT BUFFER
|
||
JRST TT11I3 ;IS EMPTY, SO MAYBE REQUEST ECHOING.
|
||
|
||
TT11LS: MOVEM A,TT11ER ;LEAVE DIAGNOSTIC INFO BEHIND
|
||
MOVEM I,TT11ER+1
|
||
MOVEM TT,TT11ER+2
|
||
MOVE A,(TT)
|
||
MOVEM A,TT11ER+3
|
||
MOVE A,1(TT)
|
||
MOVEM A,TT11ER+4
|
||
MOVE A,2(TT)
|
||
MOVEM A,TT11ER+5
|
||
TT1LS1: SETZM TT11P ;MARK 11 DOWN AND DONT TRY TO COME BACK UP FOR NOW
|
||
MOVEI A,SCR11D ;MAKE SYS JOB PRINT "11 WENT DOWN" MESSAGE.
|
||
IORM A,SUPCOR
|
||
TT11D1: MOVEI A,TT11HD+1 ;MAKE SURE CLOCK LEVEL DOESN'T THINK
|
||
MOVEM A,TT11HD ;THAT THE 11 IS SENDING INPUT.
|
||
POPJ P,
|
||
]
|
||
|
||
SUBTTL TERMINET MOTOR CONTROL
|
||
|
||
;COME HERE FROM VERY SLOW CLOCK (2 MIN.), RUNNING IN SYS JOB.
|
||
;TURN OFF MOTORS OF ALL TERMINETS THAT HAVE BEEN IDLE 30. SEC.
|
||
;MAY CLOBBER ANY ACS.
|
||
TTTMNT: MOVE TT,TIME
|
||
SUBI TT,900. ;TT=30. SECONDS AGO.
|
||
CAIA
|
||
TTTMN2: MOVE TT,TIME ;TURN OFF ALL TERMINETS AT SYSTEM STARTUP.
|
||
MOVSI I,-NCT
|
||
TTTMN0: MOVE T,TCTYP(I)
|
||
CONO PI,TTYOFF
|
||
SKIPL SHUTDN
|
||
CAML TT,TTLTM(I) ;IF TTY HAS OUTPUT RECENTLY
|
||
CAIE T,%TNTRM ;OR ISN'T A TERMINET,
|
||
JRST TTTMN1 ;NOTHING TO DO.
|
||
MOVSI T,%TCMTR
|
||
TDNE T,TTYCOM(I) ;DITTO IF MOTOR ALREADY OFF.
|
||
JRST TTTMN1
|
||
IORM T,TTYCOM(I)
|
||
MOVE H,TTYOPT(I)
|
||
MOVE Q,TOIP(I)
|
||
MOVEI A,%TDMTF ;PUT A MOTOR-OFF COMMAND IN OUTPUT BFR
|
||
PUSHJ P,TYOOU1
|
||
MOVEM Q,TOIP(I)
|
||
CONO PI,TTYON
|
||
AOSN TTYOAC(I)
|
||
XCT TTYST(I) ;AND TELL INT. LVL. ABOUT IT.
|
||
TTTMN1: CONO PI,TTYON
|
||
AOBJN I,TTTMN0
|
||
POPJ P,
|
||
|
||
;CALL HERE WHEN ABOUT TO OUTPUT TO A TERMINET WHOSE MOTOR IS OFF
|
||
;TTY # IN I. LEAVES TTY'S TTYCOM IN Q.
|
||
TTTMTO: MOVE Q,TOIP(I)
|
||
MOVEI A,%TDMTN
|
||
MOVE H,TTYOPT(I)
|
||
PUSHJ P,TYOOU1 ;PUT MOTOR-ON CMD IN OUTPUT BFR,
|
||
MOVEM Q,TOIP(I)
|
||
MOVSI Q,%TCMTR ;MOTOR NOW ON AS FAR AS MAIN PRGM
|
||
ANDCAB Q,TTYCOM(I) ;IS CONCERNED.
|
||
POPJ P,
|
||
|
||
SUBTTL PI-LEVEL ECHOING
|
||
|
||
;ECHOING - CALLED AT CLOCK LEVEL. MAY CLOBBER ANY AC.
|
||
;ECHOES CHARS BY COPYING THEM FROM INPUT BFR TO OUTPUT BFR.
|
||
TTECH: MOVSI I,200000 ;GET LIST OF TTYS NEEDING ECHO, AND REINIT IT.
|
||
EXCH I,TTERQS
|
||
TTELUP: AOS NTTELU ;TAKE STATISTICS.
|
||
CAIL I,-1
|
||
POPJ P, ;NO MORE TTYS NEED ECHOING.
|
||
;I HAS IDX OF A TTY NEEDING ECHOING.
|
||
IFN N11TYS,[
|
||
MOVE T,TTYTYP(I)
|
||
TRNE T,%TY11T
|
||
JRST TTELU3
|
||
TTELU4: ]
|
||
MOVEI A,TOBS
|
||
MOVSI T,%TCECH
|
||
TDNE T,TTYCOM(I);CAN'T ECHO UNLESS OUTPUT BUFFER HAS ENOUGH ROOM,
|
||
MOVEI A,TYOWNC+1
|
||
CAMG A,TORM(I) ;NO MAIN PROGRAM OUTPUT IN IT,
|
||
SKIPL TTOALC(I);OUTPUT NOT BLOCKED AT M.P. LEVEL,
|
||
JRST TTEDU4
|
||
SKIPL TYOSW(I) ;AND NO MORE OUTPUT COMING SOON.
|
||
JRST TTEWAT ;PUT TTY BACK ON LIST.
|
||
MOVE H,TTYOPT(I)
|
||
MOVE Q,TTYCOM(I)
|
||
TLNE Q,%TCMTR ;IF TTY'S MOTOR IS OFF, TURN IT ON.
|
||
PUSHJ P,TTTMTO
|
||
MOVEI J,TTEDMY ;PROVIDE IOT RTNS WITH VARIABLE-BLOCK.
|
||
SKIPGE TT,TTYLPP(I) ;TT HAS IDX OF MOST RECENTLY USED PC PPR
|
||
SETCM TT,TTYLPP(I) ;WHETHER NOW ASSOCIATED OR NOT.
|
||
MOVE A,TPVB(TT) ;PERHAPS MOST RECENT PC PPR IS ECHO AREA,
|
||
CAMN A,TCMXV(I) ;BUT THERE'S NO ECHO AREA NOW. IN THAT CASE,
|
||
SUBI TT,TPLEN ;MAKE SURE DON'T TRY TO FORCE OUT BUFFERED CURSOR POS IN THAT PC PPR.
|
||
TTEDU2: TLZE Q,%TCDNG ;SHOULD BELL BE TYPED BECAUSE INPUT BFR FULL?
|
||
PUSHJ P,[MOVEM Q,TTYCOM(I)
|
||
MOVEI R,%TJECH+%TJMOR
|
||
MOVEI A,^G ;DING ON TTY IF DESIRED.
|
||
JRST TYO8]
|
||
TTELP1: SKIPN T,ECHOC(I) ;ANY CHARS TO BE ECHOED NOW IN INPUT BFR?
|
||
JRST TTEDUN ;NO, FINISHED ECHOING.
|
||
SKIPG T
|
||
BUG ;ECHOED MORE CHARS THAN THERE WERE?
|
||
AOS NTTEL1
|
||
;NOW FIND NEXT CHARACTER NEEDING PI ECHO,
|
||
;AND MARK IT AS NO LONGER NEEDING IT.
|
||
;CAN EXIT TO TTEDU5 IF MUST STOP ECHOING BECAUSE ECHOING IS DEFERRED.
|
||
CONO PI,TTYOFF-1 ;PREVENT INTERACTION WITH INPUT INTERRUPTS.
|
||
MOVE B,ECHOP(I)
|
||
TTELP2: MOVE C,TICC(I)
|
||
CAMN B,TIIP(I)
|
||
JRST TTELBG
|
||
MOVE C,B
|
||
CAMN B,TIBEP(I) ;LOOK FOR 1ST CHAR NEEDING PI ECHO.
|
||
SUBI B,TIBL
|
||
ILDB A,B
|
||
TRZN A,%TXPIE
|
||
JRST TTELP2
|
||
TRNN A,%TXIGN ;DON'T ECHO NON-COM-MODE CHARS
|
||
JRST [ MOVE T,TTYSTS(I) ;IF ECHOING BEING DEFERRED.
|
||
TLNE T,%TSNOE
|
||
TLNE H,%TOHDX ;BUT IF HALF-DUPLEX, IT ECHOES IN ANY CASE.
|
||
JRST .+1
|
||
JRST TTEDU5]
|
||
SOSGE ECHOC(I) ;FOUND ONE; NOW ECHO IT.
|
||
BUG
|
||
MOVEM B,ECHOP(I)
|
||
DPB A,B ;MARK IT AS ECHOED.
|
||
LDB A,B ;CHECK FOR HARDWARE LOSSAGE.
|
||
TRNE A,%TXPIE
|
||
BUG ;DPB OR TRZN LOST??
|
||
TRNN A,%TXIGN ;IF CHAR IS IN BFR ONLY TO BE ECHOED,
|
||
JRST TTELP5
|
||
CAMN C,TIOP(I) ;IF IT'S 1ST CHAR IN CUFFER,
|
||
JRST [ PUSHJ P,TYIRE1 ;REMOVE IT THE NORMAL WAY.
|
||
JRST TTELP5]
|
||
CAMN B,TIIP(I) ;IF CHAR IS LAST CHAR IN BFR,
|
||
PUSHJ P,TTEBAK ;DELETE IT, & MAYBE OTHERS BEFORE IT.
|
||
TTELP5: CONO PI,TTYON-1
|
||
;DECIDE WHICH PC PPR TO USE.
|
||
MOVE T,I
|
||
IMULI T,2*TPLEN ;COMPUTE INDEX OF M.P. PC-PPR.
|
||
SKIPGE Q,TTYCOM(I) ;COM MODE, UNLESS %TCICO OR %TCLFT, MEANS USE M.P. AREA.
|
||
TDNE Q,[%TCICO+%TCLFT,,400000]
|
||
MOVE T,TTYEPP(I) ;OTHERWISE USE THE ECHO AREA IF ANY.
|
||
MOVE B,TTYSTS(I)
|
||
TRNN A,%TXECI
|
||
TRNN A,%TXIGN ; FOR ^_ COMMANDS, DON'T OBEY %TSNEA.
|
||
TLNN B,%TSNEA ; %TSNEA SAYS USE M.P. AREA.
|
||
JRST TTELP4
|
||
MOVE T,I
|
||
IMULI T,2*TPLEN
|
||
TTELP4: SKIPGE TT,TTYLPP(I) ;TT GETS LAST PC PPR HACKED WITH THIS TTY.
|
||
SETCA TT,
|
||
CAMN TT,T ;IF WE ARE SWITCHING TO A DIFFERENT PC PPR,
|
||
JRST TTELU1
|
||
SKIPL TTYLPP(I) ;DISASSOCIATE THE OLD ONE IF NEC.
|
||
PUSHJ P,TYOMVC
|
||
TTELU1: MOVE TT,T ;MOST RECENT PC PPR NOW ECHOING PC PPR.
|
||
MOVSI Q,%TCECH ;NOW DEFINITELY GOING TO PUT CHARS IN OUTPUT BUFFER
|
||
IORB Q,TTYCOM(I)
|
||
MOVEI R,%TJECH+%TJMOR
|
||
TLNN H,%TOHDX ;ON HALF-DUPLEX TTYS, EXCEPT FOR
|
||
JRST TTELP3
|
||
TRNN A,%TXCOM ;CHARS PRODUCED BY COM LINKS,
|
||
PUSHJ P,[IORI R,%TJHDE
|
||
JRST TYOAS5] ;MOVE CURSOR BUT DON'T REALLY OUTPUT.
|
||
;THUS, CURSOR MOTION DUE TO ECHOING BY TTY
|
||
;IS ACCOUNTED FOR.
|
||
TTELP3: LDB B,[.BP %TXASC,A]
|
||
TRNE A,%TXECI
|
||
JRST TTELP6
|
||
TRZE A,%TXIGN
|
||
CAIE B,^L ;^L ECHOED IN COM MODE SHOULD CLEAR SCREEN.
|
||
TRZA R,%TJCP1
|
||
JRST [ MOVEI A,"C ;(BY SIMULATING A ^PC).
|
||
IORI R,%TJCP1
|
||
JRST .+1]
|
||
TTELP6: ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
|
||
PUSHJ P,TYO8
|
||
TRZE R,%TJHDE
|
||
PUSHJ P,TYOMVC
|
||
SKIPN ECHOC(I)
|
||
JRST TTEDUN
|
||
IFN N11TYS,[
|
||
TRNE H,%TP11T
|
||
JRST [ PUSHJ P,TYOWN1
|
||
LDB B,T
|
||
CAIE B,1_TT11BY-1
|
||
JRST TTEDU6 ;LESS THAN 20. FREE SPACES IN BFR => GIVE UP.
|
||
JRST TTELP1]
|
||
]
|
||
MOVE A,TORM(I)
|
||
CAIGE A,TYOWNC ;IS THERE A CHANCE OUTPUT WOULD HANG UP?
|
||
JRST TTEDU4 ;YES, WAIT UNTIL LATER TO ECHO THE REST.
|
||
JRST TTELP1 ;NO, ECHO MORE
|
||
|
||
TTELBG: BUG PAUSE,[ECHOC is ],OCT,T,[ but ECHOP equals TIIP. TICC=],OCT,C,[. TTY ],OCT,I
|
||
SETZM ECHOC(I)
|
||
;COME HERE WHEN ALL ECHOING DESIRED ON THIS TTY WAS DONE.
|
||
TTEDUN: CONO PI,TTYOFF-1
|
||
SKIPE ECHOC(I)
|
||
JRST TTEDU1
|
||
TTEDU5: MOVE Q,TTYCOM(I)
|
||
TLNE Q,%TCDNG ;HAS ANOTHER REASON TO ECHO ARISEN AFTER WE CHECKED?
|
||
JRST TTEDU1 ;YES, GO PROCESS IT.
|
||
PUSH P,TTYERQ(I);SAVE NEXT TTY TO ECHO ON
|
||
SETOM TTYERQ(I) ;AND TURN OFF THIS ONE'S ECHO REQUEST
|
||
CONO PI,TTYON-1
|
||
SETZ R,
|
||
CAME TT,TTYLPP(I)
|
||
PUSHJ P,TYOFRC ;FORCE OUT BUFFERED CURSOR MOTION.
|
||
POP P,I
|
||
JRST TTELUP
|
||
|
||
TTEDU4:
|
||
TTEDU3: SETO A, ;NO, MOVE TO NEXT TTY ON LIST.
|
||
EXCH A,TTYERQ(I)
|
||
MOVE I,A
|
||
JRST TTELUP
|
||
|
||
TTEDU1: CONO PI,TTYON-1
|
||
JRST TTEDU2
|
||
|
||
;COME HERE WHEN CAN'T ECHO BECAUSE TYOSW IS LOCKED.
|
||
TTEWAT: AOS NTTEWA
|
||
MOVE A,I ;IF WE CAN'T DO ANY.
|
||
CONO PI,TTYOFF-1
|
||
EXCH A,TTERQS ;PUT THIS TTY BACK ON LIST,
|
||
EXCH A,TTYERQ(I) ;SO IT WIL BE REEXAMINED NEXT TICK.
|
||
CONO PI,TTYON-1
|
||
MOVE I,A ;MOVE TO NEXT TTY ON OLD LIST.
|
||
JRST TTELUP
|
||
|
||
IFN N11TYS,[
|
||
TTELU3: SKIPL TT11P
|
||
JRST TTEDU4 ;DON'T ECHO ON PDP11 TTYS IF PDP11 DOWN.
|
||
LDB A,TOIP(I) ;DEFER ECHOING UNLESS OUTPUT BFR EMPTY.
|
||
CAIN A,1_TT11BY-1
|
||
JRST TTELU4 ;JUMP IF BUFFER EMPTY (LAST CHAR OUTPUT CHANGED TO -1)
|
||
TTEDU6: JRST TTEWAT ;TEMPORARY PATCH
|
||
.ERR IS THIS PATCH TEMPORARY OR PERMANENT?
|
||
MOVE A,TT11HD ;BFR NOT EMPTY: TELL 11
|
||
ADDI A,1-NF11TY(I) ;(BY SETTING ECOFLG)
|
||
ADD A,TT1111
|
||
MOVSI B,400000 ;TO SIGNAL TEN WHEN THE BUFFER BECOMES EMPTY.
|
||
IORM B,(A) .SEE TT11I4
|
||
JRST TTEDU4
|
||
]
|
||
;COME HERE WHEN ARE JUST ABOUT TO ECHO THE LAST CHAR
|
||
;IN THE INPUT BUFFER, AND ITS %TXIGN IS SET.
|
||
;TRY TO FLUSH THE CHARACTER FROM THE INPUT BFR,
|
||
;AND ALSO THE CHARS BEFORE IT, IF THEY TOO HAVE %TXIGN.
|
||
TTEBAK: SKIPE C,ECHOC(I)
|
||
BUG PAUSE,[ECHOING LAST CHAR BUT ECHOC IS ],OCT,C,[. TTY ],OCT,I
|
||
SETZM ECHOC(I)
|
||
IBP B ;THIS DEPENDS ON 18-BIT BYTES IN INPUT BUFFER.
|
||
SUBI B,1
|
||
CAMN B,TIBEP-1(I)
|
||
ADDI B,TIBL
|
||
SOSN TICC(I)
|
||
JRST TTEBA1
|
||
LDB C,B
|
||
TRNE C,%TXIGN
|
||
JRST TTEBAK
|
||
TTEBA1: MOVE C,TIIP(I)
|
||
CAMN C,TINTP(I)
|
||
MOVEM B,TINTP(I)
|
||
CAME C,ECHOP(I)
|
||
BUG
|
||
MOVEM B,ECHOP(I)
|
||
MOVEM B,TIIP(I)
|
||
POPJ P,
|
||
|
||
SUBTTL TTY INTERRUPT HANDLING
|
||
|
||
;MACRO TO SAVE ACS AND CONI APR ON ENTERING A TTYCHN INTERRUPT ROUTINE.
|
||
;PCLOC SHOULD BE THE ADDRESS OF THE STORED PC, WHICH IS MOVED TO TTYBRK.
|
||
DEFINE TTYSAV PCLOC=TTYBRK
|
||
IFN KL10P,[
|
||
CONSO PI,1_<7-TTYCHN>
|
||
JRST 4,. ;HARDWARE BUG ALLEGEDLY FIXED
|
||
]
|
||
IFN KA10P, CONI TTYAPC
|
||
MOVEM A,TTYA
|
||
MOVE A,[B,,TTYACS]
|
||
BLT A,TTYACS+17-B+1-1 ;SAVE ALL ACS BUT 0
|
||
IFSN PCLOC,TTYBRK,[
|
||
MOVE A,PCLOC
|
||
MOVEM A,TTYBRK
|
||
]
|
||
MOVE P,TTYPDP
|
||
PUSH P,[TTYRET]
|
||
TERMIN
|
||
|
||
EBLK
|
||
|
||
TTYBRK: 0
|
||
|
||
BBLK
|
||
TTYSAV ;SAVE ACS AND SET UP P.
|
||
IFN KL10P,[
|
||
CONSZ DTE,%DBL10+560
|
||
JRST TTDTE1 ;DTE20 INTERRUPTED (DOORBELL OR BYTE TRANSFER ERROR OR DONE)
|
||
] ;KL10P
|
||
IFN DL10P,[
|
||
CONSZ DLC,10
|
||
JRST TTDLB0 ;DL10 INTERRUPTED
|
||
]
|
||
IFN TK10P,[
|
||
CONSZ NTY,200000
|
||
JRST NTY1 ;NEW TELETYPE KLUDGE
|
||
]
|
||
IFN MTYP,[
|
||
CONSZ MTY,50
|
||
JRST MTY1 ;MORTON BOX
|
||
]
|
||
IFN DPKPP,[
|
||
CONSZ DPK,60
|
||
JRST DPKPE ;PARITY ERROR OR NXM
|
||
CONSZ DPK,10
|
||
JRST DPTI1 ;CHAR AVAIL DPK
|
||
CONSZ DPK,400
|
||
JRST DPTO1 ;OUTPUT BUFFER FIN DPK
|
||
]
|
||
IFN NOTYS,[
|
||
MOVEI I,0
|
||
CONSZ TTY,50
|
||
JRST GOTTY
|
||
]
|
||
IFN NDZTYS,[
|
||
;DZ-11 Code The only place that emulates an interrupt on the TTY interrupt
|
||
; channel is the DTE code, handled above, so there should never be a
|
||
; need for a DZ11 entry here.
|
||
]
|
||
; MOVEI J,TTYCHN ;KNIGHT TTY KLUDGE GENERATES SPUR INTS
|
||
; JSP E,SPUR ;SPURIOUS INT
|
||
TTYRET:
|
||
TTYRT3:
|
||
IFN KA10P,[
|
||
CONI A
|
||
ANDCM A,TTYAPC
|
||
TRNE A,220000 ;DID MPV OR PDL OV COME ON DURING THIS INT?
|
||
BUG PAUSE,[MPV OR PDL OV IN TTY INT HANDLER, APR CONI=],OCT,A
|
||
] ;KA10P
|
||
MOVS A,[B,,TTYACS]
|
||
BLT A,17
|
||
MOVE A,TTYA
|
||
JRST 12,@TTYBRK
|
||
|
||
IFN DPKPP,[
|
||
DPKPE: AOS NDPKPE
|
||
CONO DPK,60+TTYCHN ;PARITY ERROR OR NXM
|
||
JRST TTYRT3
|
||
]
|
||
|
||
IFN DZ11P,[ ;DZ-11 Code
|
||
|
||
IFE KS10P, .ERR DZ11 code only works on a KS-10.
|
||
|
||
$INSRT DZ11
|
||
|
||
REPEAT DZ11NB,[
|
||
|
||
EBLK
|
||
CONC DZ,\.RPCNT,RB: 0
|
||
BBLK
|
||
MOVEM U,TTYACS-B+U
|
||
JSP U,DZRBK
|
||
;; <first line>,,<bus address>:
|
||
NFDZTY+<DZNLN*.RPCNT>,,CONC DZ,\.RPCNT,BA
|
||
|
||
EBLK
|
||
CONC DZ,\.RPCNT,XB: 0
|
||
BBLK
|
||
MOVEM U,TTYACS-B+U
|
||
JSP U,DZXBK
|
||
;; <first line>,,<bus address>:
|
||
NFDZTY+<DZNLN*.RPCNT>,,CONC DZ,\.RPCNT,BA
|
||
|
||
];DZ11NB
|
||
|
||
DEFINE DZSAV
|
||
MOVEM A,TTYA
|
||
MOVE A,[B,,TTYACS]
|
||
BLT A,TTYACS-B+<U-1> ;SAVE ALL ACS BUT 0, A AND U...
|
||
MOVE A,-3(U) ;Get return address
|
||
MOVEM A,TTYBRK ;Save it in TTYBRK
|
||
MOVE P,TTYPDP ;Stack
|
||
PUSH P,[TTYRET] ;Set up return address
|
||
HRRZ C,(U) ;Get Unibus address
|
||
HLRZ I,(U) ;Get ITS TTY # of first DZtty on this board
|
||
TERMIN
|
||
|
||
; DZ11 receiver interrupts (actually silo overflow)
|
||
DZRBK: DZSAV ;Save ACs and setup parameters
|
||
IORDI A,%DZRCS(C)
|
||
TRNN A,%DZCRD ;Character ready?
|
||
JRST [ AOS DZRSPR ;Count spurious interrupts
|
||
POPJ P, ]
|
||
DZRBK1: IORDI A,%DZRDR(C)
|
||
TRNN A,%DZDDV ;Data valid?
|
||
POPJ P, ;Nope, got it all
|
||
; If parity must be hacked, it should be done here
|
||
LDB D,[.BP %DZLM,A] ;Get line number
|
||
ANDI A,%DZTCM ;Get character
|
||
ADD I,D ;Get TTY number
|
||
CAIL I,NFDZTY+NDZTYS
|
||
BUG
|
||
JRST NTYI1
|
||
|
||
; The following code can't work because I found the place where NTYI1
|
||
; clobbers U (Alan 3/26/86):
|
||
;
|
||
; PUSHJ P,NTYI1 ;Process the input
|
||
; HRRZ C,(U) ;Get Unibus address
|
||
; HLRZ I,(U) ;Get ITS TTY # of first DZtty on this board
|
||
; JRST DZRBK1
|
||
|
||
; DZ11 transmitter interrupts
|
||
DZXBK: DZSAV ;Save ACs and setup
|
||
AOS DZXINC ;Count interrupts
|
||
DZXBK1: IORDI A,%DZRCS(C)
|
||
TRNN A,%DZCTR ;Transmitter ready?
|
||
POPJ P,
|
||
LDB D,[.BP %DZLM,A] ;Get line number
|
||
ADD I,D ;ITS terminal number of this line
|
||
CAIL I,NFDZTY+NDZTYS
|
||
BUG
|
||
AOS DZXCHC ;Count characters sent
|
||
PUSHJ P,TYPSC ;Merge with the rest of the world
|
||
HRRZ C,(U) ;Get UB address of board again
|
||
HLRZ I,(U) ;Get ITS TTY # of first DZtty on this board
|
||
JRST DZXBK1 ;Try to send another, maybe we'll get lucky
|
||
|
||
];DZ11P
|
||
|
||
IFN KL10P,[
|
||
;HANDLE INTERRUPTS FROM THE CONSOLE PDP11 VIA THE DTE20
|
||
;CODE FOR HANDLING MULTIPLE CONSOLES, BLOCK TTY OUTPUT, ETC.
|
||
;IN THE FUTURE ETHERNET STUFF WILL GET ADDED HERE.
|
||
|
||
TTDTE1: CONI DTE,DTECNI ;SAVE FOR DEBUGGING
|
||
CONSZ DTE,460 ;TO11 ERROR OR TO10 DONE OR TO10 ERROR
|
||
BUG PAUSE,[DTE20 ERROR, CONI=],OCT,DTECNI
|
||
CONSZ DTE,100 ;TO11 TRANSFER COMPLETE
|
||
JRST [ CONO DTE,100 ;CLEAR TO11 TRANSFER COMPLETE
|
||
SETZM DTEBBY ;BUFFER NO LONGER BUSY
|
||
JRST .+1 ]
|
||
CONO DTE,%DBL10+40 ;CLEAR DTE20 INTERRUPTING STATE
|
||
SKIPGE A,DTETYI ;CHECK FOR TTY INPUT AVAILABLE
|
||
JRST TTDTE2
|
||
SETOM DTETYI ;AVAILABLE. INDICATE HAS BEEN GOTTEN.
|
||
CONO DTE,%DBL11 ;SIGNAL 11 THAT WE'RE READY FOR MORE.
|
||
HLRZ I,A ;GET LINE NUMBER
|
||
CAIL I,NFETY ;CHECK IT
|
||
CAIL I,NFETY+NETYS
|
||
BUG PAUSE,[BAD TTY NUMBER ],OCT,I,[FROM PDP-11]
|
||
PUSHJ P,NTYI1 ;PROCESS THE INPUT
|
||
JRST TTDTE1 ;CHECK FOR MORE
|
||
|
||
TTDTE2: MOVEI A,SCRHNG ;IF HANGUP/DIALIN, SIGNAL SYSTEM JOB TO HANDLE IT
|
||
SKIPL DTEHNG
|
||
IORM A,SUPCOR
|
||
SKIPN DTEBBY ;DON'T CHECK FOR OUTPUT DONE IF BUFFER BUSY
|
||
SKIPGE A,DTEODN ;CHECK FOR TTY OUTPUT DONE
|
||
POPJ P, ;NOTHING, DISMISS INTERRUPT
|
||
SETOM DTEODN ;INDICATE SIGNAL HAS BEEN RECEIVED
|
||
HLRZ I,A ;GET LINE NUMBER
|
||
CAIL I,NFETY ;CHECK IT
|
||
CAIL I,NFETY+NETYS
|
||
BUG PAUSE,[BAD TTY NUMBER ],OCT,I,[FROM PDP-11]
|
||
HRRZS A ;SET UP MULTI-CHARACTER TRANSFER,
|
||
HRRZ B,TTOALC(I) ;SETTING MAX# CHARACTERS FROM ELEVEN'S BUFFER SIZE
|
||
CAIGE B,(A) ;DON'T SEND MORE CHARACTERS THAN ALLOCATED
|
||
MOVE A,B
|
||
CAILE A,DTEOBL ;DON'T EXCEED SIZE OF OUR BUFFER
|
||
MOVEI A,DTEOBL
|
||
MOVEM A,DBBCC
|
||
MOVEM A,DBBCC1
|
||
MOVE A,[441000,,DTEOBF]
|
||
MOVEM A,DBBBP
|
||
JRST TYP ;GO FILL OUTPUT BUFFER
|
||
];KL10P
|
||
|
||
IFN DL10P,[
|
||
;HANDLE THE DL-10 (A PDP-11 FRONT END FOR THE KL-10).
|
||
;ALL INTERRUPTS FROM DL-10 COME HERE.
|
||
|
||
TTDLB0: CONO DLC,10+TTYCHN ;CLEAR INTERRUPT FLAG
|
||
SKIPN DL10F ;IGNORE DL10 IF IT IS MARKED OUT OF SERVICE.
|
||
POPJ P,
|
||
IFN CHAOSP, IFN DLCP, PUSHJ P,DLCWAK ;SEE IF INTR IS FOR CHAOS NET
|
||
IFN T300P,[ ;CHECK FOR T-300 INTERRUPT, PASS TO DISK LEVEL IF SO
|
||
SKIPE DSCDON
|
||
CONO PI,DSKRQ
|
||
];T300P
|
||
SKIPE I,DL10IL ;IS INPUT AVAIL? IF SO, READ WHICH LINE
|
||
PUSHJ P,TTDLIN ;AND PROCESS THE CHARACTER.
|
||
MOVEI A,SCRHNG ;DOES THE 11 SAY A MODEM WAS DISCONNECTED?
|
||
SKIPE DL10CL
|
||
IORM A,SUPCOR ;IF SO, TELL SYS JOB TO TAKE APPROPRIATE ACTION.
|
||
SKIPN DL10LN ;DON'T CHECK OUTPUT-DONE IF OUTPUT BUFFER IS BUSY
|
||
SKIPN I,DL10OD ;OUTPUT DONE ON SOME TTY?
|
||
POPJ P,
|
||
MOVE A,DL10BS ;YES, GET 11'S BUFFER SIZE AND
|
||
SETZM DL10OD ;MAKE COMMUNICATION CHANNEL FREE FOR -11 AGAIN
|
||
HRRZ B,TTOALC(I)
|
||
CAMLE A,B
|
||
MOVE A,B ;DON'T SEND MORE CHARACTERS THAN TERMINAL HAS ALLOCATION FOR
|
||
MOVEM A,DBBCC ;INIT CHARACTER COUNTERS TO SIZE OF BUFFER IN 11
|
||
MOVEM A,DBBCC1
|
||
MOVE A,[441000,,DL10BF]
|
||
MOVEM A,DBBBP ;INIT B.P. USED BY 10 TO STORE INTO BUFFER.
|
||
JRST TYP ;GO FILL UP THE OUTPUT BUFFER
|
||
|
||
TTDLIN: MOVE A,DL10IC ;GET THE CHARACTER TYPED IN
|
||
SETZM DL10IL ;FREE THE INPUT CHANNEL SO 11 CAN USE IT AGAIN.
|
||
CONO DLC,100040+TTYCHN ;INTERRUPT 11
|
||
JRST NTYI1 ;AND PROCESS THE INPUT.
|
||
]
|
||
|
||
IFN DPKPP,[
|
||
DPTO1: CONI DPK,A
|
||
LDB I,[220400,,A]
|
||
ADDI I,NFDPTY
|
||
SKIPL @DPKC-NFDPTY(I)
|
||
SETOM @DPKC-NFDPTY(I)
|
||
LDB J,[$TTOSP,,TTYTYP(I)] ;GET OUTPUT SPEED CODE.
|
||
CAIL J,LDPSPT
|
||
MOVEI J,LDPSPT-1
|
||
HRRZ A,TTOALC(I)
|
||
CAMLE A,DPSPT(J)
|
||
MOVE A,DPSPT(J) ;# CHARS BUFFER SPACE FOR THAT SPEED.
|
||
MOVEM A,DBBCC
|
||
MOVEM A,DBBCC1
|
||
MOVE A,DBBFP-NFDPTY(I)
|
||
MOVEM A,DBBBP ;BP FOR STORING CHARS.
|
||
MOVSM A,@DPKP-NFDPTY(I)
|
||
JRST TYP0
|
||
|
||
DPTI1: DATAI DPK,A
|
||
LDB I,[220400,,A]
|
||
ADDI I,NFDPTY
|
||
JRST NTYI1
|
||
]
|
||
IFN TK10P,[
|
||
NTY1: CONSZ NTY,400000
|
||
POPJ P, ;SCANNER NOT STOPPED
|
||
CONI NTY,I ;READ IN TTY #
|
||
IFE NNTYS-10,LDB I,[110300,,I]
|
||
IFE NNTYS-20,LDB I,[100400,,I]
|
||
IFN <NNTYS-10>*<NNTYS-20>,.ERR
|
||
CAIL I,NNTYS
|
||
BUG
|
||
ADDI I,NFNTY ;CALCULATE CONSOLE #
|
||
CONO NTY,@TTYLT(I) ;SELECT APPROPRIATE TTY
|
||
CONSZ NTY,20
|
||
JRST TYPSC ;DONE FLAG ON TYPEOUT
|
||
CONSO NTY,40
|
||
JRST TTYRT2 ;THIS TTY NOT REALLY UNHAPPY
|
||
DATAI NTY,A
|
||
JRST NTYI1
|
||
|
||
TTYRT2: CONO NTY,200000+TTYCHN
|
||
JRST TTYRET
|
||
]
|
||
|
||
IFN MTYP,[
|
||
MTY1: CONI MTY,I
|
||
LDB I,[140500,,I] ;GET SUBDEVICE
|
||
CAIL I,NMTYS
|
||
JRST MTY2 ;NOT A VALID #
|
||
ADDI I,NFMTY
|
||
CONO MTY,@TTYLT(I)
|
||
CONSO MTY,40 ;INPUT DONE
|
||
JRST MTY6
|
||
DATAI MTY,A
|
||
JRST NTYI1
|
||
|
||
MTY6: CONSO MTY,10 ;OUTPUT DONE
|
||
POPJ P,
|
||
HRRZ A,TTOALC(I)
|
||
CAILE A,MTYNC
|
||
MOVEI A,MTYNC
|
||
MOVEM A,DBBCC ;# CHARS CAN GIVE AT ONCE.
|
||
MOVEM A,DBBCC1
|
||
SETZM MTYOW ;SET UP WORD TO FILL WITH OUTPUT CHARS.
|
||
MOVE A,[440700,,MTYOW]
|
||
MOVEM A,DBBBP ;SET UP BP FOR STUFFING THAT WORD.
|
||
JRST TYP
|
||
|
||
MTY2: CONSZ MTY,10
|
||
JRST MTY3 ;OUTPUT
|
||
CONSZ MTY,40
|
||
DATAI MTY,A ;INPUT
|
||
POPJ P, ;AND IGNORE
|
||
|
||
MTY3: LSH I,12.
|
||
CONO MTY,200+TTYCHN(I) ;CLEAR OUTPUT DONE FLAG
|
||
POPJ P,
|
||
]
|
||
|
||
IFN NOTYS,[
|
||
GOTTY: CONSZ TTY,10
|
||
JRST TYPSC ;TTO DONE
|
||
CONSO TTY,40
|
||
POPJ P, ;NONE
|
||
DATAI TTY,A ;TTI DONE, READ CHR
|
||
JRST NTYI1
|
||
]
|
||
|
||
;PROCESS INPUT INTERRUPT WITH CHARACTER IN A, TTY # IN I
|
||
|
||
OVHMTR TTI ;TTY INPUT INTERRUPT LEVEL
|
||
|
||
;ENTER HERE FOR "HARDWARE" TTYS, LOW 8 BITS OF A ARE THE INPUT, OTHER BITS ARE GARBAGE
|
||
NTYI1:
|
||
IFN NNVTTS,[
|
||
CAME I,NOVATT ;SKIP IF THIS TTY IS NOVA
|
||
JRST NTYI3
|
||
TRZE A,200 ;SKIP IF DATA AND NOT TTY #
|
||
JRST NTYI2 ;SET TTY #
|
||
SKIPGE I,NVIPTT ;CURRENTLY SELECTED CONSOLE ON INPUT
|
||
POPJ P, ;NONE SELECTED
|
||
NTYI3:]
|
||
IFN TTLPTP,[
|
||
CAMN I,LPTTTY
|
||
JRST INLPT
|
||
]
|
||
ANDI A,377 ;FLUSH EXTRANEOUS BITS, KEEP LOW 7
|
||
MOVE H,TTYOPT(I)
|
||
TRNN H,%TPMTA ; OR KEEP LOW 8 IF 8TH IS HARDWARE META KEY
|
||
ANDI A,177
|
||
;ENTER HERE FOR TTYS WHICH MAY INPUT IN FULL-CHARACTER-SET
|
||
NTYI5: MOVEM I,LOCTTY ;TTY CHAR ACTUALLY TYPED ON
|
||
MOVSI U,%TSLCZ
|
||
ANDCAB U,TTYSTS(I) ;CLEAR LAST CHR ^Z BIT
|
||
MOVE Q,TTYCOM(I)
|
||
MOVE R,TTYTYP(I)
|
||
MOVE H,TTYOPT(I)
|
||
TRNE H,%TPMTA ;PROCESS HARDWARE META KEY IF PRESENT
|
||
TRZN A,200
|
||
CAIA
|
||
IORI A,%TXMTA
|
||
ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC ;FLUSH MEANINGLESS BITS.
|
||
TLNE H,%TOALT ;IF THIS TTY WANTS IT, MAYBE STANDARDIZE ALTMODES
|
||
PUSHJ P,TTYSAM
|
||
HRRZ D,TTYIPC(I)
|
||
MOVEM D,LTTYIPC ;REMEMBER INPUT RTN FOR DEBUGGING
|
||
MOVE D,TYBPC(I)
|
||
MOVEM D,LTYBPC
|
||
JRST (D) ;PROCESS THE CHARACTER AND RETURN.
|
||
|
||
IFN NNVTTS,[
|
||
NTYI2: JUMPE A,CPOPJ
|
||
ADDI A,NFNVTY
|
||
CAIGE A,NFNVTY+NNVTTS
|
||
MOVEM A,NVIPTT ;SELECT CONSOLE
|
||
POPJ P,
|
||
]
|
||
|
||
IFN TTLPTP,[INLPT: MOVE A,TIME
|
||
MOVEM A,LPTTIME
|
||
POPJ P,
|
||
]
|
||
|
||
SUBTTL HANDLE ^\ CODES
|
||
;OR PASS CHARACTERS ON TO NEXT LEVEL OF INPUT
|
||
;PROCESSING IF NO ^\ CODE IS IN PROGRESS.
|
||
|
||
;THIS IS THE NORMAL VALUE OF TYBPC FOR ALL TTY'S; IT IS THE ONLY POSSIBLE VALUE
|
||
;FOR A TTY WHOSE %TPCBS AND %TPTEL ARE 0.
|
||
TYBN: TRNE H,%TPPRN
|
||
PUSHJ P,TYBPRN
|
||
TRNN H,%TPCBS+%TPTEL
|
||
JRST TYBRT2 ;IF NOT ENABLED, JUST PASS CHAR TO NORMAL INPUT LEVEL.
|
||
; USED TO CLEAR %TXSFT (NOW %TXSUP) BEFORE CHECKING FOR ^\
|
||
; MOVEI E,(A)
|
||
; ANDCMI E,%TXSUP
|
||
CAIN A,^\
|
||
TRNN H,%TPCBS
|
||
JRST TYBCR1 ;IF NOT AN ENABLED ^\, GO CHECK FOR SPECIAL CR HANDLING
|
||
JSP D,TYBRED ;READ THE CHARACTER AFTER THE ^\
|
||
CAIGE A,100 ;^\ FOLLOWED BY @ THROUGH _ IS THE HIGH BITS FOR THE NEXT CHARACTER.
|
||
JRST TYBCTL ;^\ FOLLOWED BY A CONTROL CHAR, ETC. IS A SPECIAL HACK.
|
||
ANDI A,<%TXCTL+%TXMTA+%TXSUP+%TXTOP>_-7
|
||
LSH A,7+18. ;GET THE EXCESS OVER 100 AND SHIFT BY 7,
|
||
HRRI A,TYBPFX ;AND STORE IN LH OF TYBPC
|
||
MOVEM A,TYBPC(I)
|
||
POPJ P, ;RETURN. NEXT CHAR COMES TO TYBPFX
|
||
|
||
TYBPFX: HLRZ D,TYBPC(I) ;GET THE HIGH BITS READ IN LAST TIME
|
||
IOR A,D ;AND MERGE INTO THE CHAR JUST READ IN
|
||
TYBRET: MOVEI D,TYBN ;RESET ^\ STATUS TO NORMAL
|
||
TYBRT1: MOVEM D,TYBPC(I)
|
||
TYBRT2: MOVE E,TIME
|
||
MOVEM E,TTITM(I) ;UPDATE TIME OF LAST INPUT ON THIS TTY.
|
||
;NOW DETECT SPECIAL TOP-CHARS THAT SHOULD NOT ECHO
|
||
;AND SHOULD BE IGNORED IN COM MODE OR IN ^_ COMMANDS.
|
||
SETZ E, ;WE SET E TO -1 BELOW FOR THOSE CHARACTERS.
|
||
MOVE D,TTYSTA(I)
|
||
TLNE D,%TANEC ;IF COUNT OF DON'T-ECHO CHARS IS >0,
|
||
JRST [ SUB D,[<.DPB 1,.BP %TANEC>,,] ;DECREMENT IT
|
||
SETO E, ;AND DON'T ECHO THIS ONE.
|
||
JRST TYBRT3]
|
||
MOVE E,A ;IS THIS INPUT REALLY FOR LOCAL EDITING PROTOCOL?
|
||
ANDI E,%TXTOP+%TXASC ;THAT IS, TOP-E OR TOP-S, OR THE CHARACTER FOLLOWING ONE?
|
||
CAIE E,%TXTOP+"E
|
||
CAIN E,%TXTOP+"S ;DON'T ECHO OR INTERRUPT FOR TOP-S OR TOP-E,
|
||
TLO D,<.DPB 1,.BP %TANEC> ;OR THE CHAR THAT FOLLOWS IT.
|
||
CAIN E,%TXTOP+"T ;DON'T ECHO OR INT FOR TOP-T, OR FOLLOWING 3 CHARS.
|
||
TLO D,<.DPB 3,.BP %TANEC>
|
||
CAIE E,%TXTOP+"Y ;GRAPHICS INPUT CMDS TAKE 5 ARG CHARS.
|
||
CAIN E,%TXTOP+"X
|
||
TLO D,<.DPB 5,.BP %TANEC>
|
||
SETZ E,
|
||
TLNE D,%TANEC
|
||
SETO E,
|
||
TYBRT3: MOVEM D,TTYSTA(I)
|
||
MOVEM E,LEPCHR ;LEPCHR IS -1 FOR SPECIAL CHARS THAT SHOULD USUALLY BE IGNORED.
|
||
HRRZ D,TTYIPC(I)
|
||
JUMPE E,(D) ;IN WHICH CASE, DROP THIS CHAR ENTIRELY
|
||
CAIN D,TTYI ;IF IT IS NOT THE NORMAL SORT OF INPUT.
|
||
JRST (D)
|
||
POPJ P,
|
||
|
||
;COME HERE FOR ^\ FOLLOWED BY A CHARACTER < 100.
|
||
TYBCTL: CAIN A,^A ;^\^A => ALLOCATE OUTPUT CHARS.
|
||
JRST TYBA
|
||
CAIN A,^Z ;^\^Z => ZERO ALLOCATION
|
||
JRST TYBZ
|
||
CAIN A,^I ;^\^I => INFINITY ALLOCATION
|
||
JRST TYBI
|
||
CAIN A,^R ;^\^R => RESTART OUTPUT AT M.P. LEVEL.
|
||
JRST TYBR
|
||
CAIN A,^P ;^\^P => SET CURSOR POSITION AND RESTART OUTPUT AT M.P. LEVEL.
|
||
JRST TYBP
|
||
CAIN A,^\ ;^\^\ => INPUT A ^\.
|
||
JRST TYBRET
|
||
CAIN A,^C ;^\^C => SCREEN HAS BEEN SURREPTITIOUSLY CHANGED
|
||
PUSHJ P,TYBC
|
||
;RETURN TO NORMAL ^\ STATUS BUT DON'T PASS ANY INPUT UP TO NORMAL INPUT LEVEL.
|
||
TYBXIT: MOVEI D,TYBN
|
||
TYBRED: MOVEM D,TYBPC(I) ;JSP D,TYBRED TO WAIT FOR NEXT CHARACTER
|
||
POPJ P,
|
||
|
||
TYBC: MOVSI D,%TSATY
|
||
IORB D,TTYSTS(I)
|
||
JUMPL D,CPOPJ
|
||
HLLZ E,MSKST(D)
|
||
TLZ E,#%PJATY
|
||
TLNE D,%TSCNS
|
||
IORM E,PIRQC(D)
|
||
POPJ P,
|
||
|
||
TYBCR1: CAIN A,15 ;SEE IF ENABLED CR
|
||
TRNN H,%TPTEL
|
||
JRST TYBRT2 ;NO, JUST PASS CHAR TO NORMAL INPUT LEVEL
|
||
JSP D,TYBRT1 ;PASS CHAR TO NORMAL INPUT LEVEL BUT HACK NEXT CHAR
|
||
CAIE A,12 ;IF IT IS LF OR NULL IGNORE IT
|
||
JUMPN A,TYBRET ;BUT OTHERWISE PASS IT TO NORMAL INPUT LEVEL
|
||
JRST TYBXIT ;IN ANY CASE RESET TYBPC TO NORMAL
|
||
|
||
TYBPRN: LDB E,[.BP %TXASC,A]
|
||
CAIE E,"(
|
||
CAIN E,"[
|
||
XORI A,"(#"[
|
||
CAIE E,")
|
||
CAIN E,"]
|
||
XORI A,")#"]
|
||
POPJ P,
|
||
|
||
;^\^P<VPOS><HPOS> - SET CURSOR POS, THEN RESTART OUTPUT AT M.P. LEVEL.
|
||
;THIS IS THE WAY TO RESPOND TO A %TDORS CHARACTER ON A SOFTWARE TTY,
|
||
;SINCE OUTPUT RESET WILL STOP OUTPUT AT M.P. LEVEL ON SOFTWARE TTY'S
|
||
;WHICH HAVE ^\ TURNED ON.
|
||
TYBP: JSP D,TYBRED ;WAIT FOR VPOS TO COME IN
|
||
CAML A,TCMXV(I)
|
||
SETZ A,
|
||
MOVEM A,TTYIVP(I)
|
||
SKIPGE TT,TTYLPP(I)
|
||
SETCA TT,
|
||
MOVEM A,TPVP(TT)
|
||
SKIPGE TTYLPP(I)
|
||
HRLM A,TTYLPS(I)
|
||
JSP D,TYBRED ;NOW WAIT FOR HPOS TO COME IN
|
||
CAML A,TCMXH(I)
|
||
SETZ A,
|
||
MOVEM A,TTYIHP(I)
|
||
SKIPGE TT,TTYLPP(I)
|
||
SETCA TT,
|
||
MOVEM A,TPHP(TT)
|
||
SKIPGE TTYLPP(I)
|
||
HRRM A,TTYLPS(I)
|
||
TYBR: HRROS TTOALC(I) ;RESTART AT M.P. LEVEL.
|
||
PUSHJ P,TYPEN2 ;REQUEUE ECHOING IF NECESSARY
|
||
JRST TYBXIT
|
||
|
||
TYBZ: HLLZS TTOALC(I) ;SET ALLOCATION TO 0.
|
||
JRST TYBXIT
|
||
|
||
TYBI: HLLOS TTOALC(I) ;SET ALLOCATION TO INFINITY.
|
||
JRST TYBST ;NOW MUST START THE TTY IN CASE IT WAS STOPPED DUE TO NO ALLOC.
|
||
|
||
TYBA: JSP D,TYBRED ;^\^A<NUM> => INCREMENT ALLOCATION BY <NUM>
|
||
MOVE D,TTOALC(I)
|
||
TRNN D,400000 ;SKIP IF ALLOCATION = INFINITY
|
||
ADD D,A
|
||
HRRM D,TTOALC(I)
|
||
TYBST: AOSN TTYOAC(I)
|
||
XCT TTYST(I)
|
||
JRST TYBXIT
|
||
|
||
SUBTTL NORMAL TTY INPUT HANDLER
|
||
;CLOBBERS A - E, EXPECTS R, U, I SET UP.
|
||
;R HAS TTYTYP, U HAS TTYSTS, I HAS # OF TTY.
|
||
;Also seems to expect Q/ TTYCOM and perhaps H/ TTYOPT -Alan 12/18/85
|
||
|
||
TTYI: CAIN A,^_
|
||
JRST TTYICB ;CHAR IS ^_, MAYBE ENTER COM MODE.
|
||
TTYI2: CAIN A,^Z ;TEST FOR ^Z
|
||
JRST ZFLAG ;^Z TYPED
|
||
TTYI2A: JUMPL U,CPOPJ ;IGNORE CHAR IF NO USER.
|
||
TLNE U,%TSSII ;If in superimage input mode,
|
||
JRST TTYI2B ; don't check for magic chars.
|
||
CAIN A,%TXCTL+^Z ;Control-CALL is Deferred-Call
|
||
JRST [ MOVEI A,%TXACT+%TXPIE+%TXCTL+%TXTOP+"Z ;DEFERRED CALL
|
||
JRST TTYI19 ]
|
||
CAIN A,%TXTOP+"C ; CLEAR-INPUT does like TYCFLS, flushes
|
||
; input buffer of TTY in I.
|
||
JRST TYIRS1 ; TYIRS1 does a POPJ P, for us: Hear no
|
||
; evil, see no evil, echo no evil...
|
||
TTYI2B: TLZ A,-1 ;IF WE WERE CALLED FROM ^_-QUOTING RTN, BIT 3.1 WAS
|
||
;SET TO FAKE OUT ABOVE JUNK. FLUSH FAKEOUT BIT.
|
||
MOVE E,TIME
|
||
MOVEM E,TTITM(I) ;REMEMBER TIME OF LAST TYPE-IN ON TTY.
|
||
TTYI11: MOVE E,TICC(I)
|
||
CAIL E,TIBS ;SKIP IF ANY ROOM LEFT IN INPUT BUFFER
|
||
JRST DING1
|
||
MOVE C,A
|
||
ANDI C,%TXTOP+%TXASC
|
||
CAIL C,141 ;IF A LOWER CASE CHAR,
|
||
CAILE C,172
|
||
JRST TTYI15
|
||
MOVE C,TTYOPT(I)
|
||
TLNE C,%TOCLC ;CONVERT TO UPPER CASE IF WANTED
|
||
XORI A,40
|
||
TTYI15: MOVE E,UPC(U)
|
||
TLZ E,#%PCUSR
|
||
CAIN E,NECHO1 ;IS THE JOB EXECUTING AN ECHOIN RIGHT NOW?
|
||
SKIPE E,TACC(I) ;IF SO, AND IF IT HASN'T HAD A BREAK CONDITION YET,
|
||
JRST TTYI12
|
||
PUSHJ P,TTECIN ;MAYBE STORE CHAR IN USER MEMORY, AND JUST ECHO IT.
|
||
MOVEI E,0 ;E 0 IF CALLED TTECIN, NON-0 IF DIDN'T
|
||
TTYI12: TRNN A,%TXACT ;IF TTECIN DIDN'T ACTIVATE IT, THEN IGNORE TTYSET BITS
|
||
JUMPE E,TTYI19 ;AND DON'T ACTIVATE OR INTERRUPT NO MATTER WHAT.
|
||
MOVE C,LEPCHR
|
||
JUMPL C,TTYI19 ;JUMP IF LOCAL EDITING PROTOCOL COMMAND CHAR.
|
||
PUSHJ P,GETGRP ;GET 6 BIT BYTE FOR GROUP THIS CHARACTER IS IN
|
||
TLZE U,%TSINT ;IF WANT THIS CHAR TO INT. WHATEVER IT IS,
|
||
IORI B,%TGINT ;PRETEND IT'S AN INT. CHAR.
|
||
MOVEM U,TTYSTS(I)
|
||
LSH B,14 ;PUT %TXACT, %TXPIE, AND %TXMPE IN.
|
||
TRNN A,%TXECI
|
||
IORI A,(B)
|
||
ANDCMI A,%TXIGN+%TXINT+%TXCOM
|
||
TRNN B,%TXINT ;TEST INTERRUPT BIT FOR THIS GROUP
|
||
JRST TTYI19 ;OFF. DON'T INTERRUPT
|
||
HRRE B,U ;RH OF B IS USER INDEX
|
||
JUMPL B,[JRST 4,.] ;SHOULDN'T BE NO USER
|
||
HRL B,MSKST(B) ;LH OF B IS USER'S INTERRUPT MASK
|
||
TLNN B,%PITYI ;SKIP IF INTERRUPTS ON TYPE IN ENABLED
|
||
JRST TTYI5 ;DISABLED
|
||
MOVEI C,%PITYI
|
||
IORM C,PIRQC(B) ;GENERATE TYPE IN INTERRUPT REQUEST
|
||
TRO A,%TXINT ;INDICATE INTERRUPT
|
||
TTYI5: MOVE C,TYIMSK(I) ;GET TTY CHANNELS OPEN MASK
|
||
AND C,MSKST2(B) ;MASK OFF CHANNELS NOT ENABLED
|
||
JUMPE C,TTYI19 ;JUMP IF NO OPEN CHANNELS HAVE INTERRUPTS ENABLED
|
||
MOVN D,C
|
||
AND C,D ;ISOLATE LEAST SIGNIFICANT BIT
|
||
IORM C,IFPIR(B) ;GENERATE SECOND WORD INTERRUPT REQUEST
|
||
IORI A,%TXINT ;INDICATE INTERRUPT
|
||
JRST TTYI19
|
||
|
||
;LIKE TTYI18 BUT FOR A CHAR THAT WASN'T REALLY TYPED IN.
|
||
TTYI13: IORI A,%TXCOM
|
||
|
||
;ECHO BUT DON'T USE AS INPUT THE CHAR IN A,
|
||
;ASSUMING IT WAS ACTUALLY TYPED IN BY USER. MUST NOT CLOBBER H, TT.
|
||
TTYI18: IORI A,%TXPIE+%TXIGN ;THIS CHAR WILL ECHO & BE IGNORED.
|
||
|
||
;PUT CHARACTER IN A IN INPUT BUFFER, ADJUSTING ALL COUNTS AND POINTERS.
|
||
TTYI19: MOVE C,TICC(I)
|
||
CAIL C,TIBS
|
||
JRST DING1 ;NO ROOM IN INPUT BFR => COMPLAIN.
|
||
TRNE A,%TXACT ;IF ACTIVATION CHAR, COUNT IT.
|
||
AOS TACC(I)
|
||
TRNE A,%TXPIE ;IF PI ECHO CHAR, COUNT IT.
|
||
AOS ECHOC(I)
|
||
TRNE A,%TXINT ;SIMILAR FOR TINTC, TINTP IF INT. CHAR.
|
||
AOS TINTC(I)
|
||
MOVE E,TICC(I)
|
||
CAIL E,MICBAA
|
||
SKIPLE TACC(I) ;BUFFER FULL+ NO ACTV CHRS, GEN ONE
|
||
JRST TTYIS5
|
||
AOS TACC(I)
|
||
IORI A,%TXACT
|
||
TTYIS5: MOVE E,TIIP(I)
|
||
CAMN E,TIBEP(I) ;SKIP IF NOT OFF THE END OF THE CIRCULAR BUFFER
|
||
SUBI E,TIBL ;RESET TIIP
|
||
HRRM E,TIIP(I) ;STORE BACK IN RH
|
||
IDPB A,TIIP(I) ;STORE CHARACTER IN INPUT BUFFER
|
||
AOS TICC(I)
|
||
TRNN A,%TXPIE ;IF PI ECHO NEEDED,
|
||
POPJ P,
|
||
TTYI7: MOVE C,TORM(I)
|
||
CAIL C,TOBS
|
||
SKIPL TTYERQ(I);PUT THIS TTY ON LIST OF THOSE NEEDING ECHO
|
||
POPJ P, ;UNLESS IT'S ALREADY ON.
|
||
TLNE I,-1
|
||
BUG
|
||
MOVE C,TTERQS
|
||
MOVEM I,TTERQS
|
||
MOVEM C,TTYERQ(I)
|
||
POPJ P,
|
||
|
||
DING1: TLNE R,%TTDDI ;SKIP IF WANT TO DING ON EXCESS INPUT
|
||
POPJ P,
|
||
MOVSI C,%TCDNG
|
||
IORM C,TTYCOM(I)
|
||
JRST TTYI7 ;TELL CLOCK LEVEL TO LOOK AT THIS TTY.
|
||
|
||
TYCLWR: PUSHJ P,TCNRM
|
||
CAIL E,141 ;CONVERT LOWER CASE LTRS TO UPPER
|
||
CAILE E,172
|
||
POPJ P,
|
||
SUBI E,40
|
||
POPJ P,
|
||
|
||
TTYSAM: ;STANDARDIZE ALT MODE (IF APPRO)
|
||
TLNE U,%TSALT+%TSSII ;SKIP IF ALT MODE NOT TO BE STANDARDIZED
|
||
POPJ P, ;DON'T STANDARDIZE ALT MODE
|
||
CAIE A,176 ;ALT MODE CAN BE 176 OR
|
||
CAIN A,175 ;175
|
||
MOVEI A,33 ;CHANGE EITHER TO 33
|
||
POPJ P,
|
||
|
||
;GETS BYTE IN B, GROUP NUMBER IN C, BYTE POINTER IN D
|
||
GETGRP: PUSH P,A
|
||
PUSHJ P,TYINR2 ;NORMALIZE CHARACTER TO FIND CORRECT GROUP.
|
||
MOVE B,A
|
||
IDIVI B,5
|
||
POP P,A
|
||
LDB C,GRPBPT(C) ;GET GROUP BITS
|
||
MOVEI D,TTYST1(I)
|
||
CAIL C,6
|
||
JRST GETGR2
|
||
LDB E,[301400,,SBTBL(C)] ;LOAD LH OF BYTE PTR
|
||
GETGR1: DPB E,[301400,,D] ;MAKE TTYST1 OR TTYST2 APPROPRIATE BYTE POINTER
|
||
LDB B,D
|
||
POPJ P,
|
||
|
||
GETGR2: LDB E,[301400,,SBTBL-6(C)]
|
||
MOVEI D,TTYST2(I)
|
||
JRST GETGR1
|
||
|
||
DEFINE GGRPTB A,B,C,D,E
|
||
A_29.+B_22.+C_15.+D_8+E_1
|
||
TERMIN
|
||
|
||
GRPTBL: GGRPTB 0,0,0,0,0
|
||
GGRPTB 0,0,6,13,7
|
||
GGRPTB 7,0,0,11,0
|
||
GGRPTB 0,0,0,0,6
|
||
GGRPTB 0,0,0,0,0
|
||
GGRPTB 0,0,10,0,0
|
||
GGRPTB 0,0,13,3,3
|
||
GGRPTB 3,3,3,3,3
|
||
GGRPTB 5,5,4,4,3
|
||
GGRPTB 4,3,4,2,2
|
||
GGRPTB 2,2,2,2,2
|
||
GGRPTB 2,2,2,3,3
|
||
GGRPTB 5,4,5,3,3
|
||
REPEAT 5,GGRPTB 1,1,1,1,1
|
||
GGRPTB 1,5,3,5,4
|
||
GGRPTB 4,3,1,1,1
|
||
REPEAT 4,GGRPTB 1,1,1,1,1
|
||
GGRPTB 1,1,1,5,3
|
||
GGRPTB 5,3,12,0,0
|
||
|
||
GRPBPT: 350700,,GRPTBL(B)
|
||
260700,,GRPTBL(B)
|
||
170700,,GRPTBL(B)
|
||
100700,,GRPTBL(B)
|
||
010700,,GRPTBL(B)
|
||
|
||
;HANDLE A CHARACTER TYPED WHILE THE TTY OWNER IS DOING AN ECHOIN.
|
||
;A HOLDS THE CHARACTER, U HOLDS THE JOB INDEX. CLOBBERS B, C, E.
|
||
;IF THE CHARACTER IS A BREAK, ACTIVATE ON IT.
|
||
;OTHERWISE, STORE IT IN THE USER'S BUFFER AND JUST ECHO IT AND DISCARD IT;
|
||
;BUT IF THAT IS IMPOSSIBLE BECAUSE PAGES HAVE BEEN SWAPPED OUT,
|
||
;JUST ACTIVATE INSTEAD.
|
||
TTECIN: HRRZ B,U ;PREVENT TIMING ERRORS BY NOT CONSIDERING
|
||
; HIM INSIDE THE ECHOIN IF HE HAS THE
|
||
; PROCESSOR, SINCE UPC NOT VALID.
|
||
IFE KA10P,[ ;IF HIS USER-MODE ACS ARE IN AC BLOCK 1, WE
|
||
; HAVE TO GIVE UP SINCE THEY MIGHT BE SAVED
|
||
; IN TTYACS OR SOME PLACE.
|
||
MOVEI C,UUOACS(U)
|
||
CAME C,AC1PTR
|
||
] ;IFE KA10P
|
||
IFN KA10P,[ ;ON KA10, DON'T DO THIS IF MPV IS SET
|
||
CONSO 20000 ;INTERRUPT OUT OF XCTR WITH PI TRAP SET
|
||
] ;KA10P ;GETS THE MACHINE VERY CONFUSED, I SUSPECT
|
||
CAMN B,USER
|
||
JRST TTECI9
|
||
TRNN A,%TXCTL+%TXMTA+%TXSUP ;DECIDE WHETHER THIS CHAR ECHOES OR
|
||
; BREAKS.
|
||
CAIGE A,40 ;CONTROL CHARS, EITHER 9-BIT OR ASCII, BREAK.
|
||
JRST TTECI9 ;NOTE THAT SAIL CHARS WILL HAVE %TXTOP.
|
||
CAIN A,%TXTOP+"H ;DON'T ECHO HELP CHAR.
|
||
JRST TTECI9
|
||
LDB B,[050200,,A] ;WHICH WORD OF BREAK TABLE IS THIS CHARACTER IN?
|
||
ADD B,U ;JOB OWNING TTY
|
||
MOVE B,AC0S+Q(B) .SEE NECHOIN ;GET THAT WORD.
|
||
LDB E,[0500,,A]
|
||
LSH B,(E) ;GET THE BIT FOR THIS CHARACTER INTO THE SIGN BIT.
|
||
JUMPL B,TTECI9 ;IF BIT IS SET, THIS IS A BREAK CHARACTER.
|
||
SPM TTECIM ;SAVE PAGE MAP AND LOAD UP TTY-OWNING JOB'S MAP.
|
||
LPMR UPGML(U)
|
||
IFE KA10P,[
|
||
JRST 2,@[%PSPCU,,.+1] ;XCTR DOESN'T WORK IF THIS BIT NOT SET
|
||
DATAI PAG,TTECIX ;SAVE ACS CONTEXT ALSO, SET PREVIOUS AC
|
||
; CONTEXT TO AC BLOCK 2, BUT DON'T CHANGE
|
||
; CURRENT CONTEXT WHICH MAY BE 0 OR 1.
|
||
MOVE B,[600200,,400000] .SEE SPCCTX ;THIS DATAO PAG, IS SAME AS IN
|
||
; AC2CTX. (ALTHOUGH THERE ARE
|
||
; A FEW SPURIOUS BITS SET ON
|
||
; THE KS-10.)
|
||
LDB C,[330300,,TTECIX] ;BUT TRANSFER CURRENT AC BLOCK INTO IT
|
||
DPB C,[330300,,B]
|
||
DATAO PAG,B
|
||
MOVSI B,UUOACS(U) ;COPY THE JOB'S USER MODE ACS INTO THAT BLOCK.
|
||
XCTR XBW,[BLT B,17]
|
||
] ;IFE KA10P
|
||
MOVE C,AC0S+C(U)
|
||
XCTRI XRW,[MOVES E,(C)] ;MAKE SURE THE COUNT IS STILL IN CORE AND > 0.
|
||
CAIG E,0
|
||
JRST TTECIL
|
||
MOVE B,AC0S+B(U)
|
||
XCTRI XRW,[MOVES E,(B)] ;MAKE SURE BYTE POINTER STILL IN CORE,
|
||
CAIA
|
||
JRST TTECIL
|
||
IBP E
|
||
XCTRI XRW,[MOVES (E)] ;AND THAT THE WORD THE CHARACTER WILL GO IN IS IN CORE
|
||
SKIPA E,AC0S+E(U) ; AND WRITABLE
|
||
JRST TTECIL
|
||
XCTRI XRW,[MOVES (E)] ;MAKE SURE THE BLOCK OF COUNTERS IS STILL IN CORE.
|
||
CAIA
|
||
JRST TTECIL
|
||
XCTRI XRW,[MOVES 6(E)]
|
||
CAIA
|
||
JRST TTECIL
|
||
XCTRI XBYTE,[IDPB A,(B)] ;STORE THE CHARACTER.
|
||
CAIA
|
||
BUG
|
||
XCTRI XRW,[SOS (C)] ;DECREMENT THE COUNT OF CHARS TO ECHO.
|
||
CAIA
|
||
BUG
|
||
JUMPE E,TTECI2 ;UPDATE THE BLOCK OF COUNTERS, IF THERE IS ONE.
|
||
ADDI E,2 ;THE FIRST TWO ARE IGNORED.
|
||
HRLI E,-4 ;THE NEXT FOUR ARE INCREMENTED.
|
||
TTECI1: XCTRI XRW,[AOS (E)]
|
||
CAIA
|
||
BUG
|
||
AOBJN E,TTECI1
|
||
XCTRI XRW,[SOS (E)] ;THE SEVENTH IS DECREMENTED.
|
||
CAIA
|
||
BUG
|
||
;GOOD. CHARACTER HAS BEEN STORED IN THE USER'S MEMORY.
|
||
TTECI2: TRO A,%TXIGN\%TXPIE\%TXECI ;NOW MAKE IT ECHO.
|
||
PUSHJ P,TTECIR
|
||
POPJ P,
|
||
|
||
;WE CAN'T HANDLE A CHARACTER, SO MAKE IT ACTIVATE SO THE ECHOIN WILL RETURN.
|
||
;TTECIL IS FOR AFTER THE MAP HAS BEEN SWITCHED. TTECI9 IS FOR BEFORE THEN.
|
||
TTECIL: PUSHJ P,TTECIR
|
||
TTECI9: IORI A,%TXACT
|
||
POPJ P,
|
||
|
||
;RESTORE THE PAGE MAP THAT WE SAVED.
|
||
TTECIR:
|
||
IFE KA10P,[
|
||
MOVEI B,UUOACS(U) ;COPY POSSIBLY ALTERED USER ACS BACK INTO
|
||
; THE JOB.
|
||
XCTR XBR,[BLT B,UUOACS+17(U)]
|
||
DATAO PAG,TTECIX
|
||
] ;IFE KA10P
|
||
LPMR TTECIM
|
||
POPJ P,
|
||
|
||
EBLK
|
||
|
||
TTECIM: BLOCK 10 ;OUTER LEVEL MAP SAVED HERE AND RESTORED AT EXIT.
|
||
IF2 IFG UPGMLE-UPGML-10,.ERR TTECIM too short.
|
||
IFE KA10P,[
|
||
TTECIX: 0 ;SAVED DATAI PAG VALUE.
|
||
]
|
||
|
||
BBLK
|
||
|
||
SUBTTL HANDLE ^Z
|
||
|
||
ZFLAG: MOVSI U,%TSLCZ ;EVEN IF THIS BIT IN TTYSTS IS OFF, TTY MAY BE FREE
|
||
IORB U,TTYSTS(I) ;GET TTYSTS
|
||
JUMPGE U,ZFLAG2 ;(TTY IS IN USE)
|
||
SKIPGE TTYSTA(I) ;CONSOLE FREE MSG COMING OUT OR ALREADY TRYING TO ^Z
|
||
SKIPGE DEDTIM ;OR SYSTEM IS DOWN. DON'T CREATE A NEW JOB TREE.
|
||
POPJ P,
|
||
MOVN B,SYSDBG
|
||
SKIPGE SYSDBG ;IF NOT ALLOWING USERS,
|
||
CAMN I,B ;ALLOW ONLY THE SPEC'D TTY (= -C(SYSDBG) )
|
||
JRST ZFLAG7
|
||
MOVE B,TTYTYP(I) ;AND STY TTY'S, AS WELL AS TTY 0.
|
||
TRNN B,%TYSTY ;NOTE STELNT WILL REFUSE NETWORK LOGINS WHEN SYS BEING DEBUGGED.
|
||
JUMPN I,CPOPJ
|
||
ZFLAG7: CONO PI,PICOFF\<200_-UTCCHN> .SEE NUJBST
|
||
MOVE A,UTTYCT ;SET UP NEW USER
|
||
CAIL A,MXCZS ;BUT DON'T OVERFILL BUFFER
|
||
JRST [ CONO PI,PICON\<200_-UTCCHN> ? POPJ P,]
|
||
AOS UTTYCT
|
||
HRRZM I,@UTTYI
|
||
AOS A,UTTYI
|
||
CAIL A,UTTYS+MXCZS
|
||
MOVEI A,UTTYS
|
||
MOVEM A,UTTYI
|
||
CONO PI,PICON\<200_-UTCCHN>
|
||
MOVSI A,%TACTZ ;SAY TTY BEING ^Z'D - ELSE SYS JOB MIGHT TYPE CONSOLE-FREE MSG,
|
||
IORM A,TTYSTA(I) ;SINCE TTY IS FREE AND %TACFM IS OFF (OR WILL BE AFTER TTYINI)
|
||
JRST TTYINI
|
||
|
||
ZFLAG4: HRR U,SUPPRO(U)
|
||
ZFLAG2: SKIPL SUPPRO(U)
|
||
TLNE U,%TSSII
|
||
JRST ZFLAG3 ;SUPER IMAGE INPUT MODE OR TOP LEVEL JOB
|
||
TLNN U,%TSCNS ;OR IN USE AS A DEVICE => DON'T TREAT ^Z SPECIALLY
|
||
JRST ZFLAG3
|
||
MOVEI E,%PIC.Z
|
||
TDNE E,PIRQC(U) ;IF IMMEDIATE SUPERIOR DOESN'T RESPOND TO ^Z BY TAKING
|
||
JRST ZFLAG4 ;THE TTY FROM THE ^Z'ED JOB, TRY FOR HIS SUPERIOR.
|
||
IORM E,PIRQC(U) ;OTHERWISE GIVE ^Z INTERRUPT TO JOB
|
||
PUSHJ P,TYIRS1 ;DISCARD ALL PENDING INPUT BEFORE THE ^Z.
|
||
MOVEI A,^Z+%TXPIE+%TXIGN
|
||
JRST TTYI19 ;ARRANGE FOR THE ^Z TO BE ECHOED.
|
||
|
||
ZFLAG3: MOVSI U,%TSLCZ ;CLEAR <LAST CH WAS ^Z> BIT
|
||
ANDCAB U,TTYSTS(I)
|
||
JRST TTYI2A ;TREAT ^Z AS ANY OTHER CHAR.
|
||
|
||
SUBTTL HANDLE ^_
|
||
|
||
TTYICB: TLNE U,%TSSII ;^_ NOT SPECIAL IF TTY IS IN USE, IN SUPERIMAGE INPUT.
|
||
JUMPGE U,TTYI2
|
||
SKIPGE DEDTIM ;DON'T ALLOW ^_ IF ITS IS DOWN
|
||
POPJ P,
|
||
JUMPGE U,TYCGTN ;DO ALLOW THEM ON ANY TTY THAT'S IN USE
|
||
SKIPGE SYSDBG ;IF ITS BEING DEBUGGED, ALLOW ^_ IN SAME CASES ^Z IS ALLOWED.
|
||
TRNE R,%TYSTY
|
||
JRST TYCGTN
|
||
MOVN B,SYSDBG
|
||
CAME B,I
|
||
JUMPN I,CPOPJ
|
||
TYCGTN: JSP D,TYCRDE ;ECHO IT, RETURN WITH NEXT CHAR TYPED.
|
||
TYCI: SETOM COMT1(I) ;CHR AFTER ^_
|
||
PUSHJ P,TCNRM
|
||
CAIE E,^_
|
||
CAIN E,^Z
|
||
JRST TYCI3A ;GIVE EITHER CHARACTER TO MAIN PROGRAM
|
||
CAIL E,^B
|
||
CAILE E,^D ;^B, ^C, ^D, ^F SIGNIFY META BITS BEING SPEC'D.
|
||
CAIN E,^F
|
||
JRST TYCMB
|
||
CAIL E,"0 ;DIGIT => CHARATER BEING TYPED IN BY ITS ASCII CODE.
|
||
CAILE E,"9
|
||
JRST TYCI7 ;JUMP IF NOT A DIGIT.
|
||
MOVEI B,-"0(E)
|
||
MOVEM B,COMT1(I) ;STORE FIRST DIGIT
|
||
JSP D,TYCRDE ;ECHO DIGIT, READ ANOTHR. (TTYIPC LEFT -> TYCI4)
|
||
TYCI4: PUSHJ P,TYCI22 ;READ NUM AFTER FIRST DIGIT
|
||
JRST TYCI6 ;CHARACTER IS NON-NUMERIC
|
||
JRST TTYI18 ;ECHO THE DIGIT - IT'S ALREADY HANDLED.
|
||
|
||
TYCI3A: TRNN H,%TP11T ;ON NON-TV TERMINALS,
|
||
MOVEI A,%TXCTL+100(E) ;MAKE QUOTED ^Z LOOK LIKE "CONTROL" AND "Z" IN FULL
|
||
TYCI3: PUSHJ P,TYCI17 ;RESTORE TTYIPC TO NORMAL,
|
||
HRLI A,1 ;PREVENT CHAR FROM BEING TAKEN AS ^Z OR ^_.
|
||
JRST @TTYIPC(I) ;HANDLE CHAR (BUT QUOTE ^_ AND ^Z)
|
||
|
||
|
||
TYCI22: LDB E,[700,,A]
|
||
CAIL E,"0
|
||
CAILE E,"9
|
||
POPJ P, ;RETURN WITHOUT SKIPPING IF NON-NUMERIC
|
||
MOVE B,COMT1(I)
|
||
LSH B,3
|
||
ADDI B,-"0(E)
|
||
MOVEM B,COMT1(I) ;UPDATE VALUE SO FAR
|
||
JRST POPJ1 ;SKIP RETURN
|
||
|
||
TYCMB: SETZM COMT1(I) ;^A THRU ^F SEEN - INITIALIZE, AND DECODE THE CHARACTER.
|
||
JRST TYCMB2
|
||
|
||
TYCMB1: IORM D,COMT1(I) ;SET THE SPEC'D META-BIT AND READ ANOTHER CHAR.
|
||
JSP D,TYCRDE ;WHICH WE THEN DECODE ...
|
||
TYCMB2: SETZ D,
|
||
PUSHJ P,TCNRM
|
||
CAIN E,^B
|
||
IORI D,%TXCTL
|
||
CAIN E,^C
|
||
IORI D,%TXMTA
|
||
CAIN E,^D
|
||
IORI D,%TXTOP
|
||
CAIN E,^F
|
||
IORI D,%TXSUP
|
||
JUMPN D,TYCMB1 ;IF CHAR WAS ^B THRU ^F, SET APPRO META-BIT AND LOOP.
|
||
CAIN E,^Q
|
||
JSP D,TYCRDE ;OTHERWISE, ^Q QUOTES,
|
||
IOR A,COMT1(I) ;JUST READ THE CHARACTER, WITH SPEC'D META-BITS MERGED IN.
|
||
JRST TYCI3
|
||
|
||
TYCI2: PUSHJ P,TTYI18 ;ECHO CHAR, RESET TTYIPC TO NORMAL.
|
||
TYCI17: MOVEI B,TYCG
|
||
SKIPL Q
|
||
MOVEI B,TTYI
|
||
MOVEM B,TTYIPC(I)
|
||
TLZ Q,%TCCBS+%TCCBK ;ALSO FLUSH TEMPORARY STATUS INFO.
|
||
MOVEM Q,TTYCOM(I)
|
||
POPJ P,
|
||
|
||
TYCI6: EXCH A,COMT1(I) ;A NOW HAS CHAR REPRESENTED BY DIGITS; COMT1 HAS THE NON-DIGIT JUST TYPED IN.
|
||
ANDI A,7777
|
||
PUSH P,I ;IF IN COME MODE, TYCI3 CALLS TYCG AND SMASHES I
|
||
PUSHJ P,TYCI3 ;SIMULATE ITS TYPE IN
|
||
POP P,I
|
||
MOVE A,COMT1(I) ;GET LAST CHARACTER TYPED
|
||
CAIN A,40 ;A SPACE GETS FLUSHED FOLLOWING DIGITS
|
||
POPJ P,
|
||
MOVE Q,TTYCOM(I) ;RESTORE ACS BASHED BY TYCG
|
||
MOVE R,TTYTYP(I)
|
||
MOVE H,TTYOPT(I) ;THIS ONE MAY BE SUPERFLUOUS
|
||
MOVE U,TTYSTS(I)
|
||
JRST @TTYIPC(I) ;PROCESS IT NORMALLY
|
||
|
||
TCNRM: MOVE E,A
|
||
PUSHJ P,TYINR2
|
||
EXCH E,A
|
||
POPJ P,
|
||
|
||
TYCI7: PUSHJ P,TYCLWR ;NON-DIGIT, NON-^Z, NON-^_ AFTER ^_.
|
||
CAIN E,^U ;^U is CLEAR INPUT.
|
||
JRST TYCFLS
|
||
CAIL E,"A ;IF IT'S A LETTER,
|
||
CAILE E,"Z
|
||
JRST TYCI7A
|
||
XCT TYIQT-"A(E) ;JUST DISPATCH ON IT.
|
||
MOVEM H,TTYOPT(I)
|
||
TYCI7D: MOVEM U,TTYSTS(I)
|
||
JRST TYCI2
|
||
|
||
TYCI7A: CAIE E,"" ;ASIDE FROM LETTERS, " AND ^ ARE OK.
|
||
CAIN E,"^
|
||
JRST TYCI7B
|
||
TYCI7F: MOVEI A,"? ;OTHER CHARS ARE ERRORS.
|
||
TYCI2A: PUSHJ P,TTYI13 ;ECHO A CHARACTER THAT WASN'T INPUT, AND RESET TTYCOM AND TTYIPC.
|
||
JRST TYCI17
|
||
|
||
TYCI7B: CAIE E,""
|
||
TLCA U,%TSROL ;^_^ COMPLEMENTS SCROLL MODE.
|
||
TLC U,%TSSAI ;^_" COMPLEMENTS SAIL CHAR SET USAGE.
|
||
JRST TYCI7D
|
||
|
||
TYIQT: JRST TYCA ;A => ACCEPT COM LINKS.
|
||
JRST TYCB ;B => TRIGGER A **MORE** (BLOCK TYPEOUT).
|
||
JRST TYCC ;C => CREATE COM LINK.
|
||
JRST TYCD ;D => DEFERRED CALL
|
||
JRST TYCRFT ;E => ENTER REMOTE FEED-THRU.
|
||
JRST TYCI7F ;F => ERROR.
|
||
TLC U,%TSMOR ;G => COMPLEMENT MORE-PROCESSING.
|
||
JRST TYCH ;H => HELP KEY.
|
||
TLC Q,%TCICO ;I => COMPLEMENT INPUT OVERRIDE.
|
||
JRST TYCJ ;J => Cause %PIJST interrupt.
|
||
JRST TYCK ;K => FLUSH SPEC'D TTY FROM COM LINK.
|
||
MOVEI A,^L+%TXIGN+%TXCOM ;L => CLEAR SCREEN.
|
||
TLC U,%TSMOR ;M => COMPLEMENT MORE-PROCESSING.
|
||
JRST TYCN ;N => BREAK COM LINK.
|
||
TLC Q,%TCOCO ;O => COMPLEMENT OUTPUT COM OVERRIDE.
|
||
JRST TYCI7F ;P => ERROR.
|
||
JRST TYCQ ;Q => ENTER QUERY MODE.
|
||
JRST TYCR ;R => ENTER REFUSE MODE.
|
||
JRST TYCS ;S => SLAVE ANOTHER TTY.
|
||
JRST TYCI7F ;T => ERROR.
|
||
TLC H,%TOCLC ;U => COMPLEMENT CASE-CONVERSION.
|
||
JRST TYCI7F ;V => ERROR.
|
||
JRST TYCI7F ;W => ERROR.
|
||
JRST TYCI7F ;X => ERROR.
|
||
JRST TYCQA ;Y => ACCEPT PENDING QUERIES FOR COM LINKS
|
||
JRST TYCQR ;Z => REJECT PENDING QUERIES.
|
||
|
||
IFN .-TYIQT-26.,.ERR WRONG LENGTH TABLE.
|
||
|
||
;PUT IN A DEFERRED CALL
|
||
TYCD: PUSHJ P,TTYI18 ;ECHO THE D
|
||
MOVEI A,%TXACT+%TXCTL+%TXTOP+"Z
|
||
PUSHJ P,TTYI19 ;PUT A DEFERRED CALL IN THE BUFFER
|
||
JRST TYCI17 ;RESET ^_ STATE
|
||
|
||
;HELP KEY
|
||
TYCH: PUSHJ P,TTYI18 ;ECHO THE H
|
||
MOVEI A,%TXACT+%TXTOP+"H
|
||
PUSHJ P,TTYI19 ;PUT A [HELP] IN THE BUFFER
|
||
JRST TYCI17 ;RESET ^_ STATE
|
||
|
||
;Cause %PIJST interrupt.
|
||
TYCJ: SKIPA B,[%PIJST]
|
||
TYCJ1: MOVE U,SUPPRO(U)
|
||
JUMPL U,TYCI7F ; Error if tty not in use or nobody enabled
|
||
; for it.
|
||
TDNN B,MSKST(U)
|
||
JRST TYCJ1
|
||
IORM B,PIRQC(U)
|
||
JRST TYCI2 ; Echo the J and reset ^_ state.
|
||
|
||
;CLEAR INPUT
|
||
TYCFLS: CONO PI,TTYOFF ;No touching buffer while I'm frobbing it.
|
||
PUSHJ P,TYIRS1 ;Completely flush input buffer of TTY in I.
|
||
CONO PI,TTYON
|
||
MOVEI A,^U
|
||
PUSHJ P,TTYI13 ;Can echo the ^U now.
|
||
JRST TYCI17 ;Reset ^_ state.
|
||
|
||
|
||
TYCB: HRRZ B,I ;COME HERE FOR ^_B.
|
||
IMULI B,TPLEN*2
|
||
MOVEI C,%TFEOP
|
||
IORM C,TPFLAG(B)
|
||
JRST TYCI2
|
||
|
||
TYCRFT: PUSH P,A ;COME HERE FOR ^_E.
|
||
MOVE A,TTYTYP(I) ;ARE WE A LOCAL TTY?
|
||
TRNN A,%TYDIL\%TYRLM\%TYSTY
|
||
JRST TYCRF0 ;LOCAL TTYS ARE ALLOWED TO SLAVE W/O LOGIN
|
||
TRNN A,%TYSTY ;Is it a STY?
|
||
JRST TYCRFA ; Nope
|
||
HRRZ A,STYSTS-NFSTTY(I) ;Special Check for TARAKA demons linking
|
||
MOVE A,UNAME(A) ;Is the UNAME of the owner of this STY
|
||
CAMN A,[SIXBIT /TARAKA/] ;TARAKA?
|
||
JRST TYCRF0 ;Yes, let it hack all it wants.
|
||
TYCRFA: HRRE A,TTYSTS(I) ;GET OWNER OF THIS TTY
|
||
AOJE A,TYCRF2 ;IF THIS IS A FREE TTY, DON'T LET HIM
|
||
HLRE A,UNAME-1(A) ;IS HE LOGGED IN?
|
||
AOJE A,TYCRF2 ; IF NOT, FAIL
|
||
TYCRF0: SETZ B, ;COMPLEMENT OUR %TCRFT BIT.
|
||
PUSHJ P,TYCREP ;1ST, COUNT # TTYS IN LOOP.
|
||
PUSHJ P,[
|
||
MOVE A,TTYCOM(I)
|
||
TLNE A,%TCLFT ;IF ANY TTY IN LOOP HAS %TCLFT SET
|
||
POPJ P, ;THEN IT'S OK FOR OUR %TCRFT TO BE.
|
||
AOJA B,POPJ1]
|
||
JRST TYCRF1 ;SOME TTY IN LOOP HAS %TCLFT => OK TO SET %TCRFT.
|
||
CAIE B,2 ;ONLY 1 OTHER TTY => SET ITS %TCLFT, THEN OUR %TCRFT.
|
||
JRST TYCRF2 ;FAIL TO SET %TCRFT IF CAN'T FIND OTHER WITH %TCLFT.
|
||
MOVE A,TTYCOM(I)
|
||
MOVSI B,%TCLFT
|
||
IORM B,TTYCOM(A)
|
||
TYCRF1: TLC Q,%TCRFT
|
||
POP P,A
|
||
JRST TYCI7D
|
||
|
||
TYCRF2: SUB P,[1,,1]
|
||
JRST TYCI7F
|
||
|
||
;COME HERE AFTER READING UNAME FOR ^_S. B HAS IDX OF SPEC'D TTY.
|
||
;SET THAT TTY'S %TCLFT, ENSLAVING IT. CLEAR %TCLFT OF ALL OTHER TTYS
|
||
;IN THE SAME LOOP AS SPEC'D TTY.
|
||
TYCS1: PUSHJ P,TYCREP
|
||
CAIN B,(I) ;IF SPEC'D TTY NOT IN COM WITH US
|
||
CAIA
|
||
JRST TYCI7F ;THEN IT'S AN ERROR.
|
||
MOVSI A,%TCLFT
|
||
PUSHJ P,TYCREP ;CLEAR %TCLFT OF ALL TTY'S LINKED TO US,
|
||
ANDCAM A,TTYCOM(I)
|
||
JFCL
|
||
IORM A,TTYCOM(B) ;THEN SET IT FOR HIM.
|
||
POPJ P,
|
||
|
||
;CALL WITH JSP D, ECHO CHAR IN A, RETURN WITH NEXT CHAR.
|
||
TYCRDE: HRRZM D,TTYIPC(I)
|
||
JRST TTYI18
|
||
|
||
;LIKE TYCRDE BUT DON'T ECHO THE CHARACTER IN A.
|
||
TYCRED: HRRZM D,TTYIPC(I)
|
||
POPJ P,
|
||
|
||
;T -> ASCIZ STRING, ECHO ON TTY # IN I (MUST HAVE DONE TYCSET)
|
||
TYCI40: HRLI T,440700
|
||
TYCI39: ILDB A,T
|
||
JUMPE A,CPOPJ
|
||
PUSHJ P,TTYI13 ;ECHO CHARACTER ON TTY
|
||
JRST TYCI39
|
||
|
||
;SET UP ACS FOR ECHOING ON TTY # IN I.
|
||
TYCSET: MOVE R,TTYTYP(I)
|
||
MOVE Q,TTYCOM(I)
|
||
MOVE U,TTYSTS(I)
|
||
POPJ P,
|
||
|
||
;PUT TTY IN COM MODE IF IT ISN'T. TTY # IN I.
|
||
TYCI63: TLON Q,400000
|
||
TLZ Q,%TCLFT+%TCRFT
|
||
MOVEM Q,TTYCOM(I)
|
||
JRST TYBC
|
||
|
||
;TTY # IN I, REPEAT OVER THAT TTY AND ALL LINKED TO IT.
|
||
;INSN TO BE REPEATED FOLLOWS CALL.
|
||
;IF THE INSN DOESN'T SKIP, IMMEDIATELY RERURNS
|
||
;SKIPPING ONLY THAT INSN. ELSE RETURNS SKIPPING 2 WHEN ALL TTYS DONE.
|
||
TYCREP: PUSH P,I ;PUSH TTY STARTING WITH.
|
||
PUSH P,I ;PUSH TTY DOING NEXT.
|
||
TYCRE0: XCT @-2(P) ;(THE INSN AFTER THE PUSHJ)
|
||
JRST TYCRE1 ;IT DIDN'T SKIP, GIVE UP RIGHT AWAY.
|
||
MOVE I,(P) ;ELSE KEEP GOING,
|
||
SKIPL I,TTYCOM(I)
|
||
JRST TYCRE2 ;LAST TTY DONE NOT LINKED, THRU.
|
||
ANDI I,-1
|
||
CAIE I,-1 ;IN COM MD BUT NOT LINKED OR
|
||
CAMN I,-1(P) ;HAVE GONE ALL AROUND CIRCULAR LIST
|
||
JRST TYCRE2 ;=> DONE.
|
||
MOVEM I,(P) ;ELSE DO THE NEXT ONE.
|
||
JRST TYCRE0
|
||
|
||
TYCRE2: AOS -2(P) ;RETURN SKIPPING 2.
|
||
TYCRE1: SUB P,[1,,1]
|
||
POP P,I
|
||
JRST POPJ1
|
||
|
||
;^_A - ACCEPT ALL PENDING AND FUTURE REQUESTS FOR COM LINKS.
|
||
TYCA: TLZ Q,%TCRFS+%TCQRY
|
||
|
||
;^_Y - ACCEPT ALL PENDING REQUESTS FOR COM LINKS.
|
||
TYCQA: PUSHJ P,TYCI2 ;ECHO THE A OR Y.
|
||
PUSHJ P,TYCQRP ;FIND ALL PENDING QUERIES
|
||
PUSHJ P,TYCQAC ;ACCEPT EACH ONE.
|
||
POPJ P,
|
||
|
||
TYCQAC: PUSHJ P,TYCREP ;DON'T ACCEPT A RQ FROM SOMEONE ALREADY LINKED TO US.
|
||
CAIN B,(I)
|
||
POPJ P,
|
||
MOVE H,B ;HIS TTY # IN H FOR TYCI43
|
||
PUSHJ P,TYCSET
|
||
PUSHJ P,TYCI43 ;LINK HIM AND ME; ECHANGE I AND H.
|
||
MOVE B,I
|
||
MOVE I,H ;GET HIS # BACK IN B AND MINE IN I.
|
||
POPJ P,
|
||
|
||
;^_R - REFUSE ALL PENDING AND FUTURE REQUESTS FOR COM LINKS.
|
||
TYCR: TLO Q,%TCRFS
|
||
TLZ Q,%TCQRY
|
||
|
||
;^_Z - REFUSE ALL PENDING REQUESTS FOR COM LINKS.
|
||
TYCQR: PUSHJ P,TYCI2 ;ECHO THE R OR Z.
|
||
PUSHJ P,TYCQRP ;FIND ALL PENDING QUERIES
|
||
PUSHJ P,TYCQRF ;AND REFUSE EACH ONE.
|
||
POPJ P,
|
||
|
||
TYCQRF: EXCH B,I
|
||
PUSHJ P,TYCSET ;TYPE ON REQUESTING TTY
|
||
PUSHJ P,TYCI36 ;THAT IT IS BEING REJECTED
|
||
EXCH B,I ;AND REMOVE IT FROM A QUERYING STATE.
|
||
POPJ P,
|
||
|
||
;^_Q - ALL REQUESTS FOR COM LINKS SHOULD REMAIN PENDING UNTIL ANSWERED
|
||
;WITH ^_Y, ^_Z OR AN INVERSE ^_C.
|
||
;ALSO, LIST ALL REQUESTS THAT ARE NOW PENDING.
|
||
TYCQ: TLZ Q,%TCRFS
|
||
TLO Q,%TCQRY
|
||
PUSHJ P,TYCI2 ;ECHO THE "Q" AND RESET ALL STATUS INFO.
|
||
PUSHJ P,TYCSET
|
||
SETZ T, ;INDICATE NOTHING HAS BEEN TYPED YET.
|
||
PUSHJ P,TYCQRP ;FIND THE PENDING REQUESTS
|
||
PUSHJ P,TYCQLS ;SAY WHO EACH IS FROM.
|
||
POPJ P,
|
||
|
||
TYCQLS: JUMPE T,TYCQL1 ;IF THIS ISN'T THE FIRST NAME MENTIONED,
|
||
MOVEI T,[ASCIZ/, /] ;SEPARATE FROM THE PREVIOUS NAME.
|
||
PUSHJ P,TYCI40
|
||
TYCQL1: MOVE C,B ;THIS IS TTY NUMBER QUERYING US
|
||
PUSH P,C .SEE TYCI92
|
||
PUSH P,[POPCJ-1] ;TYCI67 ALWAYS SKIP-RETURNS.
|
||
JRST TYCI67 ;TYPE THE USER'S NAME OR THE TTY NUMBER.
|
||
|
||
; PUSHJ P,TYCQRP
|
||
; INSN
|
||
;EXECUTES INSN ONCE FOR EACH TTY QHICH IS QUERYING THE TTY IN I.
|
||
;THE QUERYING TTY'S NUMBER IS IN B. INSN MUST PRESERVE B AND I.
|
||
;A IS CLOBBERED BY TYCQRP. OTHER ACS ARE UNTOUCHED.
|
||
|
||
TYCQRP: SETZ B,
|
||
TYCQR1: MOVE A,TTYIPC(B)
|
||
CAIE A,TYCRW
|
||
CAIN A,TYCRW2
|
||
CAME I,COMT1(B)
|
||
JRST TYCQR2 ;TTY IN B ISN'T QUERYING TTY IN I.
|
||
XCT @(P) ;EXECUTE INSN.
|
||
TYCQR2: CAIE B,NCT-1
|
||
AOJA B,TYCQR1
|
||
JRST POPJ1 ;SKIP OVER INSN WHEN RETURN.
|
||
|
||
SUBTTL HANDLE COM-LINKS
|
||
|
||
TYCC: TLOA Q,%TCTPN ;^_C - WHEN LEAVE COM MODE MUST TYPE ^_N.
|
||
TYCK: TLO Q,%TCCBK ;SAY WE'RE DOING ^_K.
|
||
JRST TYCI19
|
||
|
||
TYCS: TLO Q,%TCCBS ;^_S - ENSLAVE SPEC'D TTY.
|
||
TYCI19: MOVEM Q,TTYCOM(I)
|
||
JSP D,TYCRDE ;ECHO, RETURN, COME BACK WITH NEXT CHAR.
|
||
PUSHJ P,TCNRM
|
||
CAIE E,15 ;SPACE OR CR IS 1ST CHAR, IGNORE.
|
||
CAIN E,40
|
||
JRST TTYI18
|
||
MOVEI B,TYCI27
|
||
MOVEM B,TTYIPC(I)
|
||
SETZM COMT3(I) ;INIT. ACCUMULATED #.
|
||
SETZM COMT1(I) ;AND ACCUM UNAME.
|
||
|
||
;READING CHARS AFTER ^_C (AFTER A NON-SPACE HAS BEEN SEEN)
|
||
;COMT1 ACCUMULATES SIXBIT, COMT3 OCTAL NUMBER.
|
||
;SIGN OF COMT3 SET => NONDIGIT WAS SEEN, USE THE SIXBIT.
|
||
TYCI27: PUSHJ P,TYCLWR ;CONVERT TO UPPER CASE.
|
||
CAIN E,^_
|
||
JRST TYCI7F ;ANOTHER ^_ IS NO GOOD.
|
||
CAIE E,15
|
||
CAIN E,40
|
||
JRST TYCI28 ;SPACE DELIMITS UNAME OR NUMBER
|
||
CAIN E,^^
|
||
JRST TYCI28
|
||
CAIN E,177
|
||
JRST TYCI7F ;RUBOUT => TYPE ? AND GIVE UP.
|
||
MOVE B,COMT3(I) ;ACCUM NUMBER IN RH OF COMT3.
|
||
LSH B,3
|
||
ADDI B,-"0(E)
|
||
HRRM B,COMT3(I)
|
||
CAIL E,"0
|
||
CAILE E,"9 ;NON-DIGIT SEEN => SET SIGN OF COMT3 SAYING
|
||
SETOM COMT3(I) ;CERTAINLY NOT NUMBER.
|
||
MOVE B,COMT1(I)
|
||
LSH B,6
|
||
IORI B,-40(E)
|
||
MOVEM B,COMT1(I) ;ADD NEW CHARACTER ONTO THE END OF THE NAME
|
||
JRST TTYI18 ;EXIT TO ECHO THE CHARACTER
|
||
|
||
TYCI28: MOVE H,Q ;SAVE SETTINGS OF %TCCBS, %TCCBK, SINCE TYCI2 WILL CLEAR THEM.
|
||
PUSH P,E
|
||
PUSHJ P,TYCI2 ;ECHO TERMINATING CHAR IN A, AND RESET ALL TO NORMAL.
|
||
POP P,E
|
||
SKIPGE B,COMT3(I)
|
||
JRST TYCI52 ;TYPEIN WASN'T NUMBER.
|
||
CAIGE B,NCT ;IS NUMBER THAT OF A TTY THAT EXISTS?
|
||
JRST TYCI53
|
||
TYCI52: MOVE D,COMT1(I)
|
||
TYCI29: TLNE D,770000 ;LEFT ADJUST THE UNAME
|
||
JRST TYCI30
|
||
LSH D,6
|
||
JRST TYCI29
|
||
|
||
TYCI30: MOVEI U,LUBLK ;START LOOKING AT USER NUMBER 2
|
||
MOVSI A,%TCRFS
|
||
SETO B, ;NO REFUSE-MODE TTY FOUND YET
|
||
TYCI31: ADDI U,LUBLK
|
||
CAML U,USRHI
|
||
JRST [ JUMPGE B,TYCI36 ;REFUSED
|
||
JRST TYCI7F ] ;OUT OF USERS SO GIVE ? AND RETURN
|
||
CAMN D,UNAME(U) ;SKIP IF UNAME DOESN'T MATCH
|
||
SKIPGE C,TTYTBL(U) ;SKIP IF PROCEDURE HAS THE TTY
|
||
JRST TYCI31 ;TRY NEXT PROCEDURE
|
||
HRRZ B,C ;TTY NUMBER
|
||
TDNE A,TTYCOM(B) ;IN REFUSE MODE?
|
||
JRST TYCI31 ;YES, MAY BE CRTSTY, TRY TO FIND A BETTER TTY WITH THIS UNAME
|
||
TYCI53: MOVEM B,COMT1(I) ;# OF TTY TRYING TO HACK
|
||
SETZM COMT3(I) ;IEC FLAG FOR QUERY MODE
|
||
CAIN E,^^
|
||
SETOM COMT3(I)
|
||
TLZE H,%TCCBK ;JUMP IF DOING ^_K.
|
||
JRST TYCK1
|
||
IFG APL,[
|
||
CAIN B,APL ;DON'T SEND MESSAGE TO A.P. LINE
|
||
JRST TYCI7F ;(OK NOW TO SEND TO SYSTEM CONSOLE, HAS O.C.O. ANYWAY)
|
||
]
|
||
TLZE H,%TCCBS
|
||
JRST TYCS1 ;ALSO CHECK FOR ^_S.
|
||
PUSHJ P,TYCREP ;NO, IT'S ^_C.
|
||
CAIN B,(I) ;DON'T LET LINK TO SELF OR SOMEONE ALREADY LINKED TO.
|
||
JRST TYCI7F
|
||
HRRE C,TTYSTS(B)
|
||
AOJN C,TYCI34 ;TTY HAS A USER
|
||
MOVEI A,"F ;TTY IS FREE
|
||
PUSHJ P,TTYI13 ;TYPE AN F
|
||
MOVEI A,40
|
||
PUSHJ P,TTYI13 ;FOLLOWED BY A SPACE
|
||
MOVE B,COMT1(I) ;RESTORE THAT TTY'S NUMBER.
|
||
JRST TYCI32
|
||
|
||
TYCI34: MOVE C,TTYSTS(B) ;TTY IN USE: AS A DEVICE?
|
||
TLNN C,%TSCNS
|
||
JRST TYCI7F ;^_C NOT ALLOWED TO TTY OPEN AS DEVICE.
|
||
TYCI32: MOVE A,TTYIPC(B)
|
||
CAIE A,TYCRW2
|
||
CAIN A,TYCRW ;IF HE'S QUERYING ME, THEN HE AUTOMATICALLY ACCEPTS
|
||
JRST [CAME I,COMT1(B) ;REGARDLESS OF HIS %TCRFS AND %TCQRY.
|
||
JRST TYCI37 ;IF HE'S QUERYING SOMEONE ELSE, HE'S BUSY.
|
||
JRST TYCI33]
|
||
MOVE C,TTYCOM(B)
|
||
TLNE C,%TCRFS ;GIVE UP IF HE IS REFUSING ^_C'S.
|
||
JRST TYCI36
|
||
CAIN A,TTYI ;MUNGING IPC WHILE NOT NORMAL WOULD LEAVE
|
||
JRST TYCI44 ;WHAT HE'S DOING UNFINISHED - CAUSING BUGS.
|
||
CAIE A,TYCG
|
||
JRST TYCI37 ;IPC NOT NORMAL.
|
||
MOVEM B,COMT1(I) ;IPC NORMAL BUT HE'S IN A COM LINK.
|
||
MOVE TT,I
|
||
MOVE H,B ;MY TTY # IN TT AND I, HIS IN H.
|
||
MOVEI T,[ASCIZ/ IN COM: /]
|
||
PUSHJ P,TYCI71 ;LIST ALL TTYS IN COM WITH HIM.
|
||
JFCL
|
||
MOVEI T,[ASCIZ/
|
||
BREAK IN? /]
|
||
PUSHJ P,TYCI40 ;PRINT STRING ON MY TTY.
|
||
JSP D,TYCRED ;READ THE ANSWER
|
||
PUSHJ P,TTYI18 ;AND ECHO IT.
|
||
PUSHJ P,TYCLWR ;NORMALIZE IT AND CONVERT TO UPPER CASE IN E.
|
||
CAIE E,"Y
|
||
JRST TYCI17 ;NO => RESET US TO NORMAL AND GIVE UP.
|
||
MOVE B,COMT1(I) ;ANSWER IS YES, GO AHEAD.
|
||
MOVE A,TTYIPC(B)
|
||
CAIE A,TTYI
|
||
CAIN A,TYCG
|
||
CAIA
|
||
JRST TYCI37 ;CAN'T MUNG HIM IF IPC NOT NORMAL.
|
||
MOVE C,TTYCOM(B)
|
||
TLNE C,%TCRFS
|
||
JRST TYCI36 ;HE'S REFUSING.
|
||
TYCI33: PUSHJ P,TYCREP
|
||
CAIN B,(I) ;MAYBE HE ENTERED OUR LOOP WHILE WE WAITED.
|
||
JRST TYCI7F ;LINKING TO SOMEONE ALREADY LINKED TO CAUSES BUGS.
|
||
JRST TYCI44 ;GO AHEAD AND LINK UP.
|
||
|
||
TYCI37: SKIPA T,[[ASCIZ/BUSY /]] ;TARGET IS BUSY.
|
||
TYCI36: MOVEI T,[ASCIZ/REFUSED /] ;TARGET IS REFUSING.
|
||
PUSHJ P,TYCI40
|
||
JRST TYCI17
|
||
|
||
;NOW WE KNOW IT'S OK TO TRY TO ^_C HIM. HIS TTY # IN B, MINE IN I.
|
||
TYCI44: MOVE H,I ;PUT MY TTY # IN H, HIS IN I.
|
||
MOVE I,B
|
||
SETO TT,
|
||
PUSHJ P,TYCSET ;GET HIS TTYCOM IN Q FOR TYCI63
|
||
PUSHJ P,TYCI64 ;TYPE MSG FROM ME ON HIM.
|
||
JFCL
|
||
MOVE A,TTYIPC(I)
|
||
CAIE A,TYCRW2 ;IF HE'S QUERYING US, NO NEED TO QUERY HIM;
|
||
CAIN A,TYCRW ;JUST PRETEND HE'S IN ACCEPT MODE.
|
||
JRST TYCI43
|
||
MOVSI A,%TCQRY
|
||
TDNN A,TTYCOM(I) ;SKIP IF HE MUST BE ASKED
|
||
JRST TYCI43 ;HE'S IN ACCEPT MODE.
|
||
MOVEI T,[ASCIZ /- QUERYING/] ;ELSE JUST MENTION TO HIM THAT WE'RE QUERYING
|
||
SKIPL COMT3(H)
|
||
PUSHJ P,TYCI40
|
||
MOVEM I,COMT1(H) ;AND SETTLE DOWN FOR HIM TO DO SOMETHING ABOUT IT.
|
||
MOVEI A,TYCRW
|
||
MOVEM A,TTYIPC(H)
|
||
MOVE I,H
|
||
PUSHJ P,TYCSET
|
||
MOVEI T,[ASCIZ /QUERYING /] ;TELL OUR USER THAT WE'RE WAITING FOR ANSWER.
|
||
JRST TYCI40
|
||
|
||
TYCI68: CAIN TT,(I) ;ENTRY TO DO FOR ALL LINKED TO HIM BUT NOT HIM.
|
||
JRST POPJ1
|
||
TYCI64: MOVEI T,[ASCIZ /
|
||
MESSAGE FROM /]
|
||
MOVE R,LOCTTY
|
||
MOVE R,TTYTYP(R)
|
||
TRNN R,%TYSTY
|
||
JRST TYCI62
|
||
MOVE R,LOCTTY
|
||
MOVE R,STYSTS-NFSTTY(R)
|
||
MOVE R,JNAME(R)
|
||
CAME R,[SIXBIT /PEEK/] ;THIS SEEMS TO BE A CROCK --RG
|
||
TYCI62: MOVEI T,[ASCIZ /
|
||
LINK FROM /]
|
||
TYCI71: PUSHJ P,TYCSET ;SET UP Q,R,U,W FOR HIS TTY (# IN I)
|
||
PUSHJ P,TYCI40 ;PRINT MSG <- T ON IT.
|
||
PUSH P,I ;SAVE HIS TTY #,
|
||
MOVE I,H ;GET MINE (ARG TO TYCREP)
|
||
PUSHJ P,TYCREP ;LOOP OVER ME AND ALL ALREADY LINKED TO ME.
|
||
PUSHJ P,TYCI66
|
||
JFCL
|
||
TYCI41: POP P,I
|
||
MOVEI A,40
|
||
PUSHJ P,TTYI13
|
||
JRST POPJ1
|
||
|
||
;TYPE UNAME OF 1 OF MY TTYS ON 1 OF HIS.
|
||
TYCI66: HRRZ C,TTYCOM(H)
|
||
CAIE C,-1
|
||
JRST TYCI72
|
||
CAIN H,(I) ;BUT DON'T TYPE MY NAME ON HIM.
|
||
CAME TT,-4(P)
|
||
CAIA
|
||
JRST POPJ1
|
||
TYCI72: MOVEI C,(I) ;PUT THIS TTY # IN C,
|
||
MOVE I,-4(P) ;GET HIS BACK IN I SINCE STILL TYPING ON HIM.
|
||
CAMN C,-2(P) ;IF THIS ISN'T MY TTY,
|
||
JRST TYCI67
|
||
MOVEI T,[ASCIZ/ AND /] ;THEN IT'S SOMEONE LINKED TO ME
|
||
PUSHJ P,TYCI40 ;AND MY NAME WAS ALREADY TYPED
|
||
MOVE C,-1(P)
|
||
TYCI67: HRRE C,TTYSTS(C) ;MY USER INDEX
|
||
JUMPL C,TYCI92
|
||
MOVE C,UNAME(C)
|
||
HLRE A,C
|
||
AOJE A,TYCI92
|
||
TYCI91: PUSH P,C
|
||
MOVSI T,(440600,,(P))
|
||
TYCI42: ILDB A,T
|
||
JUMPE A,POP1J1
|
||
ADDI A,40 ;CONVERT MY UNAME FROM SIXBIT TO ASCII
|
||
PUSHJ P,TTYI13 ;ECHO CHARACTER ON HIS TTY
|
||
TLNE T,770000
|
||
JRST TYCI42
|
||
JRST POP1J1
|
||
|
||
|
||
TYCI92: MOVSI C,(SIXBIT /T/)
|
||
LDB T,[030300,,-1(P)]
|
||
ADDI T,20
|
||
DPB T,[300600,,C]
|
||
LDB T,[000300,,-1(P)]
|
||
ADDI T,20
|
||
DPB T,[220600,,C]
|
||
JRST TYCI91
|
||
|
||
;ACTUALLY JOIN MY TTY AND HIS IN COM LINK.
|
||
;ENTER WITH HIS TTY # IN I AND MINE IN H.
|
||
;LEAVE WITH MINE IN I AND HIS IN H, TT.
|
||
TYCI43: TLO Q,%TCTPN ;WHEN HE LEAVES COM MODE TYPE ^_N AT HIM.
|
||
PUSHJ P,TYCI63 ;PUT HIM IN COM MODE IF HE ISN'T ALREADY.
|
||
MOVE TT,I ;HIS TTY # IN TT, MINE IN H.
|
||
PUSHJ P,TYCREP ;LOOP OVER TTYS LINKED TO HIM.
|
||
PUSHJ P,TYCI68 ;PRINT OUT MSG FROM ON ALL LINKED TO HIM, NOT HIM.
|
||
JFCL
|
||
EXCH TT,H ;INTERCHANGE HIS AND MINE.
|
||
MOVE I,TT ;LOOK AT ALL LINKED TO ME.
|
||
PUSHJ P,TYCSET ;WHEN I CHANGES, RELATED ACS SHOULD ALSO CHANGE.
|
||
TLO Q,%TCTPN ;WHEN HE LEAVES COM MODE TYPE ^_N AT HIM.
|
||
PUSHJ P,TYCI63 ;PUT HIM IN COM MODE IF HE ISN'T ALREADY.
|
||
PUSHJ P,TYCREP ;ON EACH OF MINE, GIVE NAMES OF HIS.
|
||
PUSHJ P,TYCI69
|
||
JFCL
|
||
MOVE TT,H
|
||
MOVE A,TTYCOM(TT) ;SET UP LINK
|
||
MOVE B,TTYCOM(I) ;LINK TTYCOM WORDS
|
||
HRRE E,A
|
||
AOJN E,TYCI45
|
||
HRRM TT,A
|
||
TYCI45: HRRE E,B
|
||
AOJN E,TYCI46
|
||
HRRM I,B
|
||
TYCI46: HRRZ D,A
|
||
HRRZ E,B
|
||
HRRM E,A
|
||
HRRM D,B
|
||
MOVEM A,TTYCOM(TT)
|
||
MOVEM B,TTYCOM(I)
|
||
MOVEI A,TYCG
|
||
MOVEM A,TTYIPC(I)
|
||
MOVEM A,TTYIPC(TT)
|
||
POPJ P,
|
||
|
||
TYCI69: CAIE I,(TT) ;PRINT MSG ON ONE OF MY TTYS.
|
||
JRST TYCI70
|
||
SKIPA T,[[ASCIZ/OK /]] ;MY TTY, SAY "G".
|
||
TYCI70: MOVEI T,[ASCIZ/
|
||
LINK TO /]
|
||
JRST TYCI71 ;DUE TO EXCH'S IN TYCI43,
|
||
;EXCHANGE "ME" AND "HIM" IN COMMENTS IN TYCI71.
|
||
|
||
;TTYIPC FOR A ^_C'ER WHO IS QUERYING IS EITHER TYCRW OR TYCRW2.
|
||
;THAT IS DEPENDED ON.
|
||
TYCRW: PUSHJ P,TCNRM
|
||
CAIE E,^G ;^_C'ER MAY USE ^G TO GET ATTENTION.
|
||
SKIPGE COMT3(I);IN IEC MODE CAN ALSO SAY THE NAME
|
||
JRST TYCRW4
|
||
CAIE E,^_ ;IGNORE ALL TYPEIN EXCEPT ^G AND ^_N.
|
||
POPJ P,
|
||
JSP D,TYCRDE ;^_, ECHO IT AND GET NEXT CHAR.
|
||
TYCRW2: PUSHJ P,TYCLWR
|
||
CAIN E,"N
|
||
JRST TYCI2
|
||
MOVEI A,"? ;^_ FOLLOWED BY OTHER THAN N.
|
||
MOVEI B,TYCRW
|
||
MOVEM B,TTYIPC(I)
|
||
JRST TTYI13 ;ECHO ? AND GO BACK TO TYCRW
|
||
|
||
TYCRW4: PUSHJ P,TTYI18 ;^_C'ER TYPED ^G - ECHO ON HIS TTY
|
||
MOVE I,COMT1(I) ;AND ^_C'D TTY.
|
||
PUSHJ P,TYCSET
|
||
JRST TTYI13
|
||
|
||
;THE TTYIPC FOR A TTY IN A COM LINK NORMALLY POINTS HERE.
|
||
;ECHO OR INPUT THE CHAR ON ALL TTYS IN THE LOOP ACCORDING TO SETTINGS
|
||
;OF THE RELEVANT %TCICO, %TCLFT AND %TCRFT BITS.
|
||
TYCG: MOVE E,A
|
||
ANDCMI E,#177 .SEE TYCI3
|
||
CAIN E,^_ ;REC CHRS IN COM MODE
|
||
JRST TYCGTN
|
||
TYCG21: PUSH P,TTYCOM(I) ;SAVE COMMUNICATE WORD.
|
||
PUSH P,I ;SAVE MY CONSOLE NUMBER
|
||
PUSH P,A ;SAVE THE CHARACTER
|
||
TLNE Q,%TCICO ;SKIP IF INPUT COM OVERRIDE OFF
|
||
PUSHJ P,TTYI2 ;PROCESS INPUT OVERRIDE
|
||
TLNN Q,%TCICO
|
||
PUSHJ P,TTYI18 ;ECHO CHR ON MY TTY IF %TCICO NOT SET, OTHERWISE GIVE TO PROGRAM
|
||
MOVE A,(P) ;RESTORE CHARACTER
|
||
TYCG5: HRRE B,TTYCOM(I) ;FIRST TTY IN CHAIN
|
||
JUMPL B,[JRST 4,.] ;I'M NOT COMMUNICATING WITH ANYONE
|
||
CAME B,-1(P) ;SKIP IF I'M COMMUNICATING WITH MYSELF
|
||
TYCG3: SKIPL C,TTYCOM(B) ;SKIP IF HE IS IN COMMUNICATE MODE (THIS POINT IS "COM IN")
|
||
BUG ;LOSSAGE
|
||
MOVE I,B ;GET HIS TTY NUMBER IN I
|
||
MOVE R,TTYTYP(I)
|
||
MOVE B,-2(P)
|
||
TLNE B,%TCRFT ;IF MY %TCRFT AND HIS %TCLFT SET,
|
||
TLNN C,%TCLFT
|
||
JRST TYCG1
|
||
MOVSI U,%TSLCZ ;GIVE CHAR TO HIS PROGM.
|
||
ANDCAB U,TTYSTS(I)
|
||
PUSHJ P,TTYI2 ;TREAT CHAR AS INPUT FROM HIS TTY.
|
||
JRST TYCG2 ;PROCESS NEXT TTY IN CHAIN
|
||
|
||
TYCG1: PUSHJ P,TTYI13 ;OUTPUT CHAR ON HIS CONSOLE
|
||
TYCG2: MOVE A,(P) ;RESTORE CHARACTER
|
||
HRRE B,TTYCOM(I) ;NEXT TTY IN CHAIN
|
||
JUMPL B,[JRST 4,.] ;CHAIN ENDS STRANGELY
|
||
CAME B,-1(P) ;SKIP IF DONE
|
||
JRST TYCG3 ;PROCESS NEXT TTY
|
||
SUB P,[3,,3]
|
||
POPJ P,
|
||
|
||
;COME AFTER READING UNAME AFTER ^_K, HIS TTY # IN B.
|
||
TYCK1: PUSHJ P,TYCREP ;NO GOOD IF THAT TTY ISN'T LINKED TO ME.
|
||
CAIN B,(I)
|
||
CAIN B,(I) ;BUT NO GOOD IF IT IS ME.
|
||
JRST TYCK2 ;NO GOOD, COMPLAIN.
|
||
MOVE I,B
|
||
PUSHJ P,TYCSET ;GET HIS TTYCOM IN Q.
|
||
JRST TYCGTM ;NOW PRETEND HE DID ^_N (READ "HIM" FOR "ME")
|
||
|
||
TYCK2: MOVE A,TTYIPC(B)
|
||
CAIE A,TYCRW
|
||
CAIN A,TYCRW2
|
||
CAME I,COMT1(B)
|
||
JRST TYCI7F ;NOT LINKED TO THIS GUY, GIVE "?"
|
||
JRST TYCQRF ;FLUSH GUY WHO WAS QUERYING
|
||
|
||
;^_N TYPED IN.
|
||
TYCN: TLZ Q,%TCTPN ;I DON'T NEED ^_N SUPPLIED IF I JUST TYPED IT IN MYSELF.
|
||
PUSHJ P,TYCI2 ;ECHO THE N AND STORE Q. ALSO RESTORE TTYIPC AND TTYCOM TO NORMAL.
|
||
SKIPL TTYCOM(I)
|
||
POPJ P,
|
||
|
||
;ASSUMING THAT TTY IN I IS IN A COM LINK, UNLINK IT.
|
||
;IF ONLY ONE OTHER TTY IS IN THE LINK, REMOVE IT FROM COM MODE TOO.
|
||
TYCGTM: HRRE B,TTYCOM(I) .SEE TTYLFC
|
||
JUMPL B,[JRST 4,.] ;WASN'T COMMUNICATING WITH ANYONE
|
||
CAMN B,I
|
||
BUG ;COMMUNICATING WITH SELF
|
||
TYCGT3: HRRE C,TTYCOM(B)
|
||
JUMPL C,[JRST 4,.] ;LIST NOT CIRCULAR
|
||
CAMN C,I
|
||
JRST TYCGT4 ;B HAS TTY NUMBER OF GUY POINTING TO ME
|
||
MOVE B,C
|
||
JRST TYCGT3
|
||
|
||
TYCGT4: HRRZ C,TTYCOM(I)
|
||
PUSH P,B
|
||
PUSH P,C
|
||
PUSHJ P,TYCGT2 ;TAKE ME OUT OF COM MODE.
|
||
POP P,C
|
||
POP P,B
|
||
EXCH I,B
|
||
PUSHJ P,TYCSET
|
||
CAME C,I ;SKIP IF ONLY 1 IN LOOP BESIDES ME. IF SO, HE'S UNLINKED TOO.
|
||
JRST TYCGT5
|
||
;MARK TTY IN I AS UNLINKED AND NOT N COM MODE. TYPE ^_N ON IT IF NECESSARY.
|
||
TYCGT2: HRRI Q,-1
|
||
TLZ Q,400000+%TCLFT+%TCRFT
|
||
TLZN Q,%TCTPN
|
||
JRST TYCI17
|
||
MOVEI T,[ASCIZ/N/]
|
||
PUSHJ P,TYCI40
|
||
JRST TYCI17
|
||
|
||
TYCGT5: HRRM C,TTYCOM(I) ;TAKE ME OUT OF THE CIRCULAR LIST
|
||
MOVEI H,(B)
|
||
SETO TT, ;FOOL TEST AT TYCI66
|
||
PUSHJ P,TYCREP ;TELL ALL THE OTHERS THAT I'VE LEFT.
|
||
PUSHJ P,TYCI73
|
||
JFCL
|
||
POPJ P,
|
||
|
||
TYCI73: JSP T,TYCI71 ;PRINT MSG AND MY UNAME ON TTY # IN I.
|
||
ASCIZ/
|
||
BYE FROM /
|
||
|
||
SUBTTL TTY OUTPUT INTERRUPT LEVEL
|
||
|
||
OVHMTR TTO ;TTY OUTPUT INTERRUPT LEVEL
|
||
|
||
;HANDLE AN OUTPUT INTERRUPT FROM A CHAR-AT-A-TIME CONTROLLER.
|
||
TYPSC: MOVEI B,1
|
||
MOVEM B,DBBCC
|
||
MOVEM B,DBBCC1
|
||
MOVE B,[444400,,STYICH]
|
||
MOVEM B,DBBBP
|
||
;HANDLE AN OUTPUT INT. ON A MULTI-CHAR CONTROLLER, ASSUMING
|
||
;COUNT AND B.P. ARE ALREADY SET UP.
|
||
TYP: LDB J,[220300,,TTYTYP(I)] ;GET TTY OUTPUT SPEED.
|
||
TYP0: ;COME HERE FOR DPK; J ALREADY SET UP.
|
||
IFN NNVTTS,[
|
||
CAMN I,NOVATT
|
||
JRST TYP0N
|
||
]
|
||
HRRZ W,TCTYP(I)
|
||
MOVE T,TTYTYP(I)
|
||
MOVE H,TTYOPT(I)
|
||
HRRZ A,TTOALC(I)
|
||
JUMPE A,[SETOM TTYOAC(I)
|
||
JRST TYP1C] ;IF TTY HAS NO SPACE FOR ANY OUTPUT, STOP SENDING.
|
||
MOVE A,TIME
|
||
MOVEM A,TTLTM(I) ;UPDATE TIME OF LAST OUTPUT THIS TTY.
|
||
TYP0F: PUSHJ P,TYPLUP ;OUTPUT AT LEAST 1 CHAR.
|
||
SKIPGE TTYOAC(I)
|
||
JRST TYP1C
|
||
SKIPLE DBBCC ;SKIP IF OUT OF ROOM
|
||
JRST TYP0F ;CONTINUE MESSAGE
|
||
TYP1B: SKIPGE A,DBBCC
|
||
BUG ;CONTROLLER'S BUFFER OVERFILLED?
|
||
SUB A,DBBCC1 ;GET -<# CHARS WE ARE SENDING>
|
||
SKIPL E,A
|
||
BUG ;SENDING NO CHARS OR NEGATIVELY MANY?
|
||
ADD A,TTOALC(I) ;IF THE ALLOCATION ISN'T INFINITE,
|
||
TRNN A,400000
|
||
HRRM A,TTOALC(I) ;DECREMENT IT BY # CHARS JUST OUTPUT.
|
||
IFN MTYP,[
|
||
TRNN T,%TYMTY ;IF MTY ISN'T THE ONLY CONTROLLER, CHECK FOR THE OTHERS
|
||
JRST TYP1D
|
||
CONO MTY,@TTYLT(I)
|
||
DATAO MTY,MTYOW
|
||
POPJ P,
|
||
|
||
TYP1D: ]
|
||
IFN DPKPP,[
|
||
TRNN T,%TYDPK
|
||
JRST TYP1E
|
||
MOVN A,E ;- - # CHARS OUTPUT
|
||
ADDM A,@DPKC-NFDPTY(I) ;GIVES # OF CHARS FOR CONTROLLER.
|
||
XCT TTYST(I) ;TELL THE DPK THEY'RE THERE.
|
||
POPJ P,
|
||
|
||
TYP1E:]
|
||
IFN DL10P,[
|
||
TRNN T,%TYDL
|
||
JRST TYP1G
|
||
MOVNM E,DL10CC ;STORE # CHARS BEING SENT.
|
||
MOVE A,[340000,,DL10BF-1]
|
||
MOVEM A,DL10BP ;GIVE THE 11 ITS MAGIC POINTER TO SNARF THE BUFFER.
|
||
MOVEM I,DL10LN ;STORE LINE # OF TTY, THUS TELLING 11 TO GO AHEAD.
|
||
CONO DLC,100040+TTYCHN ;INTERRUPT 11
|
||
POPJ P,
|
||
TYP1G:]
|
||
IFN KL10P,[
|
||
TRNN T,%TYETY
|
||
JRST TYP1I
|
||
SKIPL DTEOUT
|
||
BUG ;OVER-RUNNING PREVIOUS TRANSFER
|
||
MOVE A,[441000,,DTEOBF] ;SET UP BYTE POINTER FOR 10-11 CHANNEL
|
||
MOVEM A,DTEBPO
|
||
MOVN A,E ;NUMBER OF CHARACTERS BEING SENT
|
||
HRLI A,%DCTYO(I);SEND TYPE-OUT COMMAND, AND LINE NUMBER
|
||
MOVEM A,DTEOUT ;GIVE COMMAND TO 11
|
||
MOVEM A,DTEBBY ;FLAG BUFFER BUSY (AND REMEMBER WHICH COMMAND FOR DEBUGGING)
|
||
MOVEI A,10. ;5-SECOND TIMEOUT FOR LOST TO-11 XFER DONE INTERRUPT
|
||
MOVEM A,DTEBBT ;WHICH SEEMS TO HAPPEN NOW & THEN FOR SOME REASON
|
||
CONO DTE,%DBL11 ;AND GIVE INTERRUPT
|
||
POPJ P,
|
||
TYP1I:];KL10P
|
||
TRNN T,%TYSTY
|
||
JRST TYP1H
|
||
MOVEI A,TOBS
|
||
CAML A,TORM(I)
|
||
POPJ P,
|
||
MOVE A,TTYBYP(I)
|
||
ILDB B,A
|
||
JUMPE B,TYPEND
|
||
POPJ P,
|
||
|
||
TYP1H: MOVE A,STYICH ;HANDLE CHAR-AT-A-TIME CONTROLLERS.
|
||
TLNN T,%TTPAR ;GENERATE A PARITY BIT IF NECESSARY.
|
||
JRST TYPDA1
|
||
IMUL A,[2010040201]
|
||
AND A,[21042104377]
|
||
IDIVI A,17_7
|
||
MOVE A,B
|
||
TYPDA1: CAIL I,NFDPTY
|
||
BUG
|
||
XCT TTYDO(I) ;DATAO XXX,A
|
||
POPJ P,
|
||
|
||
TYP1C: MOVE E,DBBCC
|
||
CAME E,DBBCC1 ;SKIP IF NOTHING TO SEND
|
||
JRST TYP1F ;SEND WHAT THERE IS
|
||
XCT TTYDFF(I) ;CLEAR OUTPUT DONE
|
||
POPJ P,
|
||
|
||
TYP1F: AOS TTYOAC(I)
|
||
JRST TYP1B
|
||
|
||
IFN NNVTTS,[
|
||
TYP0N: AOSE NVTSIP ;CHAR PENDING?
|
||
JRST TYP0A ;NO
|
||
DATAO NTY,NVTSSC ;SEND CHR AFTER SELECT
|
||
POPJ P,
|
||
|
||
TYP0A: SKIPN A,NVOPTT
|
||
.ERR Shouldn't this be using NFNVTY Instead?
|
||
MOVEI A,NOTYS+NNTYS+NNVTTS-1
|
||
MOVEM A,NNVSEC ;SET UP END CHECK
|
||
SKIPN I,NVOPTT
|
||
MOVEI I,NOTYS+NNTYS ;INITIALIZE
|
||
SETOM NNVSFL ;SET FIRST TIME THRU FLAG
|
||
MOVE A,NVTCC
|
||
CAIGE A,10 ;SENT TOO MANY CHRS TO THIS CONSOLE W/O LOOKING AT OTHERS?
|
||
JRST TYP ;NO, LOOK AT CONSOLE
|
||
SETZM NVOPTT
|
||
SETZM NVTCC ;YES LOOK AT OTHERS
|
||
TYP0C: AOS I
|
||
CAIL I,NOTYS+NNTYS+NNVTTS
|
||
SUBI I,NNVTTS
|
||
AOS NNVSFL
|
||
JRST TYP
|
||
]
|
||
|
||
;FEED SOME CHARACTERS FROM OUTPUT BUFFER TO THE TTY.
|
||
TYPLUP: SKIPE TTYBYP(I)
|
||
JRST TYPBP
|
||
MOVE Q,TOOP(I)
|
||
MOVE E,TORM(I)
|
||
TYPLU1: CAIL E,TOBS
|
||
JRST [ MOVEM E,TORM(I) ;OUTPUT BUFFER EMPTY
|
||
MOVEM Q,TOOP(I)
|
||
JRST TYPEND ]
|
||
MOVE D,Q
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
ILDB A,Q ;GET NEXT CHARACTER FROM OUTPUT BUFFER
|
||
CAIL A,%TXDIS-1 ;IF DISPLAY OR CURSOR MOTION, DISPATCH.
|
||
JRST [ MOVEM E,TORM(I) ;LEAVING THE FAST LOOP
|
||
MOVEM D,TOOP(I) ;WITHOUT EATING THIS CHAR YET
|
||
CAIN W,%TNSFW ;"SOFTWARE" TTY GETS THE CODES
|
||
JRST TYPSFW ;AS THEY APPEAR IN THE BUFFER.
|
||
CAIL A,%TDMAX
|
||
JRST TYEEO1
|
||
JRST @TYPDTB-%TXDIS(A)]
|
||
TLNN H,%TOSAI ;CTL CHARS ARE SPACING IFF SAIL CHAR SET;
|
||
CAIL A,40 ;NON-CONTROLS ARE SPACING.
|
||
AOS TTYIHP(I)
|
||
IFN MTYP,[
|
||
JUMPE A,[ TRNE T,%TYMTY ;MTY CAN'T SEND NULLS EXCEPT AS FIRST CHAR IN WORD
|
||
PUSHJ P,MNULLO
|
||
JRST .+1 ;OUTPUT IT NOW
|
||
MOVE Q,D ;BACKUP BYTE POINTER AND OUTPUT IT LATER
|
||
JRST TYPLU2]
|
||
];MTYP
|
||
IDPB A,DBBBP ;PUT INTO DEVICE BUFFER
|
||
SOSLE DBBCC
|
||
AOJA E,TYPLU1
|
||
AOS E ;MAXIMUM AMOUNT OF CRUFT GENERATED
|
||
TYPLU2: MOVEM E,TORM(I)
|
||
MOVEM Q,TOOP(I)
|
||
POPJ P,
|
||
|
||
IFN MTYP,[
|
||
MNULLO: MOVE A,DBBCC ;SKIPS IF NULL MAY NOT BE OUTPUT TO MTY NOW
|
||
SETZM DBBCC
|
||
SUBM A,DBBCC1
|
||
MOVNS DBBCC1
|
||
CAIE A,MTYNC
|
||
JRST POPJ1
|
||
SETZB A,MTYOW
|
||
AOS DBBCC
|
||
AOS DBBCC1
|
||
POPJ P,
|
||
];MTYP
|
||
|
||
;HERE TO OUTPUT CHARACTER WHEN NOT IN FAST LOOP
|
||
TYPSIO:
|
||
IFN MTYP,[
|
||
JUMPE A,[ TRNE T,%TYMTY ;MTY CAN'T SEND NULLS EXCEPT AS FIRST CHAR IN WORD
|
||
PUSHJ P,MNULLO
|
||
JRST .+1 ;OUTPUT IT NOW
|
||
POPJ P, ] ;WAIT
|
||
];MTYP
|
||
MOVEM Q,TOOP(I) ;REMOVE CHAR FROM OUTPUT BUFFER.
|
||
AOS TORM(I)
|
||
|
||
;OUTPUT CHAR IN A TO TTY, AND LOOP BACK TO TYPLUP IF THERE IS
|
||
;ROOM FOR MORE CHARS. (OTHERWISE POPJ OUT OF TYPLUP).
|
||
TYPOU2: IDPB A,DBBBP ;FOR FAST CONTROLLERS, STICK CHAR IN LOW LVL BUFFER.
|
||
SOSLE DBBCC
|
||
JRST TYPLUP ;ROOM FOR MORE CHARS.
|
||
POPJ P,
|
||
|
||
;ACTUALLY OUTPUT A CHAR TO THE TTY (AND POPJ).
|
||
TYPOUT:
|
||
IFN MTYP,[
|
||
TRNE T,%TYMTY
|
||
JUMPE A,CPOPJ ;MTY CAN'T HANDLE NULLS.
|
||
]
|
||
IDPB A,DBBBP
|
||
SOSGE DBBCC
|
||
BUG
|
||
POPJ P,
|
||
|
||
TYPSFW: TRNE T,%TYSTY ;STY TTY IN SOFTWARE MODE =>
|
||
JRST TYPSFS ;SEND THE 8-BIT FROB
|
||
SUBI A,%TXDIS-2 ;ELSE SEND IT, ESCAPED BY A RUBOUT, WITH 176
|
||
CAIE A,%TDMV0-%TXDIS+2 ; SUBTRACTED FROM IT SO FITS IN 7 BITS
|
||
CAIN A,%TDMV1-%TXDIS+2
|
||
JRST [ MOVE E,TORM(I) ;FOR %TDMV1, MUST INCREMENT THE 2 ARGS.
|
||
CAILE E,TOBS-3
|
||
JRST TYPEND
|
||
JRST TYPSF2]
|
||
CAIE A,%TDMOV-%TXDIS+2
|
||
JRST TYPSF0
|
||
MOVE E,TORM(I) ;AND FOR %TDMOV, MUST INCREMENT THE 4 ARGS SO THEY'RE NOT 0.
|
||
CAILE E,TOBS-5 ;IF NOT ALL IN BUFFER, WAIT FOR THEM. TTY WILL BE STARTED AGAIN.
|
||
JRST TYPEND
|
||
IRPS TYPSF1,,TYPSF4:TYPSF3:TYPSF2:TYPSF1: ;DIGIT MANY CHARS FOLLOW
|
||
TYPSF1: DPB A,Q ;STORE PREV. CHAR, FIXED UP.
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
ILDB A,Q
|
||
ADDI A,1 ;UPDATE %TDMOV ARGS BY ADDING 1.
|
||
TERMIN
|
||
TYPSF0: DPB A,Q ;OK, THE COMMANDS ARE ALTERED, SO SEND THE 177.
|
||
MOVEI A,%TXDIS-1
|
||
JRST TYPOU2
|
||
|
||
IFE NETP,TYPSFS==<TYPORS==TYPSIO>
|
||
IFN NETP,[
|
||
;HERE FOR OUTPUT OF 8-BIT FROB TO A SOFTWARE TTY THAT IS A STY
|
||
TYPSFS: CAIN A,%TDORS ;SKIPS INTO TYPORS
|
||
;HERE FOR %TDORS IN OUTPUT BUFFER
|
||
TYPORS: SKIPN TYPNTF
|
||
JRST TYPSIO
|
||
;HERE FOR %TDORS OUTPUT BY STY DIRECTLY INTO A NET SOCKET
|
||
IFN CHAOSP\TCPP, MOVE T,STYSTS-NFSTTY(I) ; Get flags for STY
|
||
IFN CHAOSP,[
|
||
TLNE T,%SSCHA ; If Chaosnet,
|
||
JRST TYPOR1 ; don't send "INS"
|
||
];CHAOSP
|
||
IFN TCPP,[
|
||
TLNN T,%SSTCP ; If TCP, send magic chars in URGENT mode.
|
||
JRST TYPOR2
|
||
HRRZ A,STYNTI-NFSTTY(I) ; Get TCB index
|
||
SKIPL XBSTAT(A) ; Verify that COS is locked down
|
||
BUG HALT,[TCP: Buff not locked]
|
||
HLRZ T,XBOCOS(A) ; Find orig val of XBOBC
|
||
SUB T,XBOBC(A) ; Find # bytes already in buffer
|
||
CAIGE T,
|
||
BUG HALT ; Just-in-case check
|
||
MOVE H,STYORC-NFSTTY(I) ; Get magic 8-bit chars to send
|
||
TLNE H,(377_<<8.*3>+4>) ; Check 1st char
|
||
AOJA T,[TLNE H,(377_<<8.*2>+4>) ; Check 2nd char
|
||
AOJA T,[ TDNE H,[377_<8.+4>] ; Check 3rd char
|
||
AOJA T,.+1
|
||
JRST .+1]
|
||
JRST .+1]
|
||
MOVEM T,XBSUP(A) ; Store # chars up to # including magic chars
|
||
; as the TCP URGENT pointer.
|
||
JRST TYPOR1
|
||
TYPOR2:
|
||
];TCPP
|
||
IFN NCPP,[
|
||
HRRZ A,STYNTI-NFSTTY(I) ;GET NET INDEX
|
||
PI2SAF
|
||
MOVE T,IMFCQL ;IF INSUFFICIENT SPACE IN
|
||
CAIG T,2 ; THE CONTROL QUEUE,
|
||
JRST [ MOVSI T,200000 ; DEFER SENDING THIS
|
||
IORM T,IMSOC5(A) ;AND REQUEST TTY WAKEUP LATER
|
||
AOS IMNAS ;TELL 1/2 SECOND CLOCK
|
||
AOS IMNORH
|
||
MOVE T,TTYTYP(I) ;NEEDED BY TTY ROUTINES
|
||
JRST TYPEN1 ]
|
||
EXCH A,I ;A TTY IDX, I NET IDX
|
||
PUSH P,Q
|
||
PUSH P,IMPCSH
|
||
LDB T,IMSCFH
|
||
MOVEM T,IMPCSH ;SECRET ARGUMENT TO IMSTCM
|
||
JSP T,IMSTCM
|
||
2,,1
|
||
BUG PAUSE,[TTY: NO IMP BUFFERS AVAILABLE FOR "INS" MSG]
|
||
MOVSI B,8_10. ;INS
|
||
LDB C,IMSCLN ;LINK #
|
||
DPB C,[241000,,B]
|
||
MOVEM B,10(Q)
|
||
PUSHJ P,IMWCQ
|
||
POP P,IMPCSH
|
||
POP P,Q
|
||
MOVE I,A
|
||
] ;IFN NCPP
|
||
TYPOR1: MOVE H,TTYOPT(I)
|
||
MOVE T,TTYTYP(I)
|
||
MOVE W,TCTYP(I)
|
||
MOVEI A,STYORC-NFSTTY(I) ;TYPE OUT THE MAGIC CHARACTERS
|
||
HRLI A,440800
|
||
JRST TYEEO2
|
||
];NETP
|
||
|
||
;COME HERE FROM TYPLUP WHEN THERE'S NOTHING TO TYPE OUT.
|
||
;CALL ALSO FROM TT11I4 WHEN THE PDP11 SAYS THE OUTPUT BUFFER IS EMPTY.
|
||
TYPEND: PUSHJ P,TYPEN2
|
||
TYPEN1: SETOM TTYOAC(I)
|
||
POPJ P,
|
||
|
||
;SUBROUTINE TO ACTIVATE ANY ECHOING ETC. THAT MAY NEED TO BE DONE
|
||
TYPEN2: SKIPGE TYOSW(I) ;IF ECHOING CAN BE DONE NOW,
|
||
SKIPL TTOALC(I)
|
||
POPJ P,
|
||
MOVE Q,TTYCOM(I)
|
||
TLNN Q,%TCDNG ;IS THERE ECHOING NEEDING TO BE DONE?
|
||
SKIPE ECHOC(I)
|
||
PUSHJ P,TTYI7 ;IF SO, QUEUE IT.
|
||
SKIPGE TTYLPP(I)
|
||
PUSHJ P,TTYI7 ;ALSO FORCE OUT BUFFERED CURSOR MVT.
|
||
POPJ P,
|
||
|
||
IFN NNVTTS,[
|
||
TYP5: CAMN I,NNVSEC ;REACHED END
|
||
AOSG NNVSFL ;AND NOT FIRST TIME
|
||
JRST TYP0C ;LOOK AT OTHER NOVA CONSOLES
|
||
MOVE I,NOVATT
|
||
JRST TYP1C
|
||
]
|
||
|
||
;IF TTYBYP ISN'T 0, IT IS B.P. TO ASCIZ STRING TO TYPE.
|
||
;COME HERE TO OUTPUT THE NEXT CHAR OF THE STRING OR CLEAR TTYBYP.
|
||
TYPBP: ILDB A,TTYBYP(I)
|
||
TRZE A,400 ;KLUDGE FOR C-100 (and others) TO GET NULLS OUT
|
||
IFE MTYP,JRST TYPOU2
|
||
.ELSE [ JRST [ TRNE T,%TYMTY
|
||
PUSHJ P,MNULLO ;MTY CAN'T SEND NULLS EXCEPT AS FIRST CHAR IN WORD
|
||
JRST TYPOU2 ;OUTPUT THE NULL NOW
|
||
MOVSI A,100000 ;BACK UP BYTE POINTER
|
||
ADDM A,TTYBYP(I)
|
||
POPJ P, ] ;OUTPUT PARTIAL WORD THEN SEND NULL NEXT TIME
|
||
];MTYP
|
||
JUMPN A,TYPOU2 ;NOT END => OUTPUT THE CHAR.
|
||
MOVE A,@TTYBYP(I) ;AT END, CHECK FOR SPECIAL
|
||
TRNE A,1 ; TEKTRONIX DELAY KLUDGE
|
||
JRST TYPBP1
|
||
TYPBP2: CLEARM TTYBYP(I) ;END OF ASCIZ STRING.
|
||
JRST TYPLUP
|
||
|
||
TYPBP1: MOVSI B,7700 ;CLEAR SIZE FIELD
|
||
ANDCAB B,TTYBYP(I)
|
||
LDB A,[$TTOSP,,TTYTYP(I)]
|
||
MOVM A,BAUDRT(A) ;GET BITS PER SECOND
|
||
MOVE B,1(B) ;GET SPECIFICATION WORD SAYING WHAT PADDING WE WANT.
|
||
CAMN B,[SETZ]
|
||
JRST TYPBP3 ;JUMP IF SPECIAL KLUDGE FOR TEKTRONIX
|
||
JUMPG B,TYPBP4 ;JUMP IF PADDING INDEPENDENT OF VPOS.
|
||
; this is fixed elsewhere now.
|
||
; MOVE Q,TCTYP(I) ;IS THIS AN H19
|
||
; CAIN Q,%TNH19 ;H19'S HAVE TO BE PADDED WITH NUL's
|
||
; JRST TYPBP8 ; SO HANDLE THEM SPECIALLY
|
||
PUSHJ P,TYPBP6 ;CALCULATE NUMBER OF CHARACTERS OF PADDING NEEDED
|
||
JRST TYPBP5
|
||
|
||
TYPBP4: IMUL B,A ;1000. * NUMBER OF BITS PADDING
|
||
IDIVI B,10000. ;NUMBER OF CHARACTERS PADDING (NOTE ROUND-DOWN)
|
||
TYPBP5: SETZM TTYBYP(I) ;IN CASE NO PADDING REQUIRED
|
||
PUSHJ P,TYMPAD ;PUT THE PADDING BYTE POINTER INTO TTYBYP
|
||
JRST TYPLUP
|
||
|
||
TYPBP3: IDIVI A,9 ;GET CHARACTERS PER 1.1 SECOND
|
||
SKIPL TTYIHP(I) ;KLUDGE KLUDGE
|
||
MOVNM A,TTYIHP(I) ;BUT IT'S GOTTA BE STORED SOMEPLACE
|
||
AOSL TTYIHP(I)
|
||
JRST TYPBP2 ;SIGH, DELAY COMPLETED
|
||
MOVEI A,^V ;NOT YET COMPLETED, SEND ANOTHER PAD
|
||
JRST TYPOU2
|
||
|
||
TYPBP6: MOVMS B
|
||
IMUL A,B ;IF NEGATIVE, TAKE ABS VALUE
|
||
MOVE B,TCMXV(I) ;TIMES NUMBER OF LINES AT AND BELOW THE CURSOR.
|
||
SUB B,TTYIVP(I)
|
||
IMUL B,A ; 1000.* NUMBER OF BITS OF PADDING
|
||
IDIVI B,10000.*8. ; DIVIDE BY 10000. TO GET NO. OF CHARS OF PADDING
|
||
; AND THEN BY 8 BECAUSE PER LINE TIMES ARE EXPRESSED
|
||
POPJ P, ; IN TERMS OF 1/8 MS FOR BETTER RESOLUTION
|
||
|
||
;once upon a time someone thought that this might cause padding with nulls to
|
||
;happen. It didn't work.
|
||
;TYPBP8: SKIPL TTYIHP(I) ;TO EXPAND UPON A KLUDGE
|
||
; JRST [ PUSHJ P,TYPBP6 ;CALCULATE THE # OF CHARS NEEDED
|
||
; MOVNM B,TTYIHP(I) ;AND SAVE THEM AWAY TO BE COUNTED
|
||
; JRST .+1 ]
|
||
; AOSL TTYIHP(I) ;COUNT THIS CHARACTER
|
||
; JRST TYPBP2 ; DELAY COMPLETED, RESET WORLD
|
||
; SETZ A, ;NUL!
|
||
; JRST TYPOU2 ;STUFF IT IN THE BUFFER, AND FIND WAY BACK HERE
|
||
|
||
;COME HERE TO DO CURSOR MOTION ON PRINTING TTYS.
|
||
;TT HAS DESIRED HPOS; D HAS DESIRED VPOS.
|
||
TYMPRR: MOVE B,TCMXH(I)
|
||
SUBI B,1
|
||
CAMGE B,TTYIHP(I)
|
||
MOVEM B,TTYIHP(I)
|
||
TYMPRT: CAIN W,%TNMEM
|
||
JRST [ CAMLE D,TTYIVP(I) ;VERTICAL MOTION NEEDED, AND CURSOR NOT AT LEFT MARGIN?
|
||
SKIPN TTYIHP(I)
|
||
JRST .+1 ;(PREVENT INFINITE CR LOOP).
|
||
SETZ TT, ;START WITH A CR.
|
||
JRST TYMPH1] ;MEMOWRECK LOSES LF'ING IN MID-LINE.
|
||
CAMGE TT,TTYIHP(I) ;BACKWARD MOTION TAKES PRIORITY.
|
||
JRST TYMPH1
|
||
CAMLE D,TTYIVP(I) ;THEN DOWNWARD MOTION.
|
||
JRST TYMPV2
|
||
CAMLE TT,TTYIHP(I) ;THEN FORWARD MOION.
|
||
JRST TYMPHF
|
||
MOVEM D,TTYIVP(I) ;MUST BE UPWARD MOTION
|
||
JRST TYMOV8 ;WHICH IS A NO-OP ON PRINTING TTYS.
|
||
|
||
TYMPV2: AOS TTYIVP(I) ;MOVING DOWN: DO ONE LF
|
||
MOVEI A,^J
|
||
PUSHJ P,TYPOUT
|
||
PUSHJ P,TYMOVX ;IF REACHED GOAL, SAY FINISHED.
|
||
LDB B,[$TPPLF,,TTYOPT(I)]
|
||
CAIN W,%TNTRM
|
||
ADDI B,TYMTVT-TYMPVT
|
||
CAIN W,%TNMEM
|
||
ADDI B,TYMMVT-TYMPVT
|
||
HRRZ B,TYMPVT(B) ;# PADDING AFTER LF.
|
||
JUMPN B,TYMPAD
|
||
POPJ P,
|
||
|
||
TYMPVT: 0 ;NORMAL
|
||
2 ;2741, MEMOWRECK
|
||
REPEAT 6,2+.RPCNT ;EXTRA
|
||
TYMTVT: 0 ;UNPADDED TERMINET
|
||
3 ;10CPS TERMINET
|
||
4 ;15CPS TERMINET
|
||
10 ;30CPS TERMINET
|
||
17 ;60CPS TERMINET
|
||
35 ;120CPS TERMINET (MAX SPEED)
|
||
0
|
||
0
|
||
TYMMVT: 0 ;UNPADDED WRECK
|
||
0
|
||
0
|
||
1 ;30CPS WRECK
|
||
2 ;60CPS
|
||
REPEAT 3,0
|
||
|
||
TYMPHF: LDB B,[$TPPTB,,TTYOPT(I)] ;FORWARD: CAN WE DO IT WITH TABS?
|
||
JUMPE B,TYMPH6 ;TABS NOT ALLOWED ON THIS TTY.
|
||
MOVE A,TTYIHP(I)
|
||
ANDCMI A,7 ;SEE WHERE A TAB WOULD BRING US.
|
||
ADDI A,10
|
||
CAILE A,(TT) ;BEYOND WHERE WE WANT TO GO?
|
||
JRST TYMPH6
|
||
SUBI A,(B) ;A HAS TAB STOP - <# PADDING>-1
|
||
CAMG A,TTYIHP(I) ;TAB FASTER THAN SPACES (INCLUDING PADDING)?
|
||
JRST TYMPH6 ;NO, USE SPACES.
|
||
ADDI A,(B) ;A HAS TAB STOP.
|
||
MOVEM A,TTYIHP(I)
|
||
MOVEI A,^I
|
||
SOJA B,TYMPT1 ;B HAS # PADDING AFTER TAB.
|
||
|
||
TYMPH6: MOVEI A,40 ;GO FORWARD WITH SPACES
|
||
MOVE C,[AOS TTYIHP(I)]
|
||
JRST TYMPH7
|
||
|
||
TYMPH2: MOVEI A,^H ;GO BACKWARD WITH BACKSPACES
|
||
MOVE C,[SOS TTYIHP(I)]
|
||
TYMPH7: MOVE B,TT
|
||
SUB B,TTYIHP(I)
|
||
MOVMS B ;HOW MANY TIMES TO PUT CHAR
|
||
TYMPH8: XCT C
|
||
IDPB A,DBBBP
|
||
SOSG DBBCC
|
||
JRST TYMOVY
|
||
SOJG B,TYMPH8
|
||
JRST TYMOVX
|
||
|
||
;COME HERE TO MOVE BACKWARDS.
|
||
TYMPH1: MOVE A,TTYIHP(I)
|
||
SUB A,TT ;A HAS # CHARS IF WE BACKSPACE.
|
||
LDB B,[$TPPCR,,TTYOPT(I)]
|
||
JUMPE B,TYMPH9
|
||
MOVE E,B ;E HAS PADDING TYPE OF TTY,
|
||
MOVE B,TTYIHP(I) ;B HAS CURRENT HPOS.
|
||
CAIL E,<.BM $TPPCR,_-.TZ .BM $TPPCR>-TYMPHL+1 ;THIS ONE A SPECIAL $TPPCR CODE?
|
||
JRST @TYMPHT-<.BM $TPPCR,_-.TZ .BM $TPPCR>-1(E)
|
||
LDB C,[$TTOSP,,TTYTYP(I)]
|
||
SUBI C,2 ;(THIS ONLY WORKS FOR SPEED CODES 2,3,4,5)
|
||
ANDI C,3 ;(= 110, 150, 300, 1200 BAUD).
|
||
MOVE C,(C)[33. ? 20. ? 10. ? 5]
|
||
IDIV B,C ;1 PAD CHAR FOR EACH (33./20./10./5) SPACES TO MOVE.
|
||
ADDI B,1 ;I.E. MOVES AT 300/PADCODE COLUMNS PER SECOND
|
||
IMULI B,(E) ; OR 600/PADCODE COLUMNS PER SECOND AT 1200 BAUD
|
||
ADDI B,-1(E)
|
||
TYMPH9: MOVE C,D
|
||
SUB C,TTYIVP(I) ;IF WE'RE MOVING DOWN AFTER THE CR, HOW MANY LF'S?
|
||
JUMPLE C,TYMPH5
|
||
SUB B,C ;EACH LF REDUCES # PADDING NEEDED BY CR.
|
||
CAIGE B, ;BUT CAN'T NEED LESS THAN 0 PADDING.
|
||
SETZ B,
|
||
;B HAS # CHARS PADDING NEEDED AFTER CR, IF WE DECIDE TO CR.
|
||
TYMPH5: TLNN H,%TOMVB ;HOW DO WE MOVE BACKWARD?
|
||
JRST TYMPH3 ;CAN'T BS => MUST CR AND SPACE FWD.
|
||
JUMPE TT,TYMPH3 ;GOING TO COLUMN 0 => ALWAYS CR
|
||
TLNN H,%TOOVR ;ON A GLASS TTY, IF STAYING ON THE SAME LINE, HAVE TO
|
||
JUMPLE C,TYMPH2 ; USE BACKSPACES TO NOT OBLITERATE PREVIOUS OUTPUT
|
||
LDB E,[$TPPTB,,TTYOPT(I)]
|
||
JUMPE E,[MOVE C,TT ;CAN'T USE TABS: C _ TIME IF MOVE FWD.
|
||
JRST TYMPT2]
|
||
PUSH P,B ;CAN USE TABS: SEE HOW LONG TO GO FWD
|
||
MOVE B,TT ;USING TABS.
|
||
IDIVI B,10 ;NEED C(B) TABS AND C(C) SPACES.
|
||
IMULI B,(E) ;B _ TIME NEEDED FOR TABS & PADDING.
|
||
ADDI C,(B) ;C _ TIME NEEDED TO GO FWD.
|
||
POP P,B
|
||
TYMPT2: ADDI C,1(B) ;ADD IN TIME TO CR, + PADDING.
|
||
CAMLE C,A
|
||
JRST TYMPH2 ;FASTER TO BACKSPACE.
|
||
TYMPH3: MOVEI A,^M ;OUTPUT A CR (WILL SPACE FORWARD LATER)
|
||
SETZM TTYIHP(I) ;WHEN WE COME BACK WE'LL SEE WE
|
||
TYMPT1: PUSH P,B ;NEED TO GO FORWARD.
|
||
PUSHJ P,TYPOUT
|
||
PUSHJ P,TYMOVX
|
||
POP P,B
|
||
JRST TYMPAD ;PAD THE TTY (# CHARS PADDING IN B)
|
||
|
||
;DISPATCH TABLE FOR SPECIAL %TPPCR CODES.
|
||
TYMPHZ: TYMPEX ;EXECUPORT.
|
||
TYMP27 ;2741.
|
||
TYMPMW ;MEMOWRECK.
|
||
TYMPH5 ;CODE 7 NOT USED.
|
||
TYMPHT: TYMPHL==.-TYMPHZ
|
||
|
||
TYMP27: IDIVI B,10.
|
||
CAILE B,14.
|
||
MOVEI B,14.
|
||
AOJA B,TYMPH5
|
||
|
||
TYMPMW: LDB E,[$TPPLF,,TTYOPT(I)]
|
||
JUMPE B,TYMPM1 ;NO CHRS
|
||
MOVNS B
|
||
ADD B,TYMPMT(E)
|
||
CAMGE B,TYMMVT(E)
|
||
TYMPM1: MOVE B,TYMMVT(E)
|
||
CAMLE D,TTYIVP(I) ;BEFORE LF'ING, MEMOWRECK
|
||
JRST TYMPH3 ;MUST CR RATHER THAN BS.
|
||
JRST TYMPH5
|
||
|
||
TYMPMT: 0 ;MEMOWRECK MIMIMUM LINE SIZE, AS FUNCTION OF SPEED
|
||
8 ;VIA THE $TPPLF CODE.
|
||
11.
|
||
22.
|
||
43.
|
||
REPEAT 3,0
|
||
|
||
TYMPEX: IDIVI B,10. ;EXECUPORT: 1 PAD CHAR FOR EVERY 10 POSITIONS TO CR THRU.
|
||
ADDI B,5
|
||
JRST TYMPH9
|
||
|
||
;COME HERE TO PAD A PRINTING TERMINAL: # CHARS OF PADDING IN B.
|
||
TYMPAD: AOSG A,B ;AOS COMPENSATES FOR ILDB
|
||
POPJ P,
|
||
MOVE Q,TCTYP(I) ;is this an H19?
|
||
CAIN Q,%TNH19 ;H19's have to be nullified. I mean, padded with nulls.
|
||
JRST TYMPNL
|
||
CAILE A,199. ;DON'T TRY TO PAD MORE THAN 199 TIMES, WOULD
|
||
MOVEI A,199. ; BLOW OUT AT TYPBP1
|
||
IDIVI A,5
|
||
MOVNS A
|
||
ADD A,TYMPA1(B) ;CREATE A BP TO A STRING WITH THE RIGHT # OF RUBOUTS.
|
||
MOVEM A,TTYBYP(I)
|
||
POPJ P,
|
||
TYMPNL: CAILE A,399. ;we make an exception for H19's, which need a lot of
|
||
MOVEI A,399. ;padding.
|
||
IDIVI A,4 ;This works same as with rubouts, but for 9 bits
|
||
MOVNS A
|
||
ADD A,TYPNL1(B)
|
||
MOVEM A,TTYBYP(I)
|
||
POPJ P,
|
||
|
||
;THIS IS AN ASCIZ STRING OF 199. RUBOUTS.
|
||
;SOME FINAL SEGMENT OF IT WILL BE TYPED OUT.
|
||
TYMPA0: REPEAT 199./5, -2
|
||
TYMPA2: -400
|
||
|
||
TYMPA1: 010700,,TYMPA2
|
||
100700,,TYMPA2
|
||
170700,,TYMPA2
|
||
260700,,TYMPA2
|
||
350700,,TYMPA2
|
||
|
||
;This is a not-quite ASCIZ string of 399. pseudo-nulls. They are 9 bits long so
|
||
;that the typeout loop will spot the high bit and see that we're not at the end.
|
||
;This is used by things that want to be padded with nulls, like h19s.
|
||
TYPNL0: REPEAT 399./4,<.BYTE 9 ? 400 ? 400 ? 400 ? 400>
|
||
TYPNL2: 400400400000
|
||
|
||
TYPNL1: 001100,,TYPNL2
|
||
111100,,TYPNL2
|
||
221100,,TYPNL2
|
||
331100,,TYPNL2
|
||
|
||
;DISPATCH TABLE FOR CURSOR CONTROL CMDS AND RUBOUT
|
||
TYPSIO ;RUBOUT DISPATCHES HERE
|
||
TYPDTB: OFFSET %TDMOV-.
|
||
%TDMOV::TYMOV ;MOVE CURSOR
|
||
%TDMV1::TYMOV2 ;DUMMY COMMAND CREATED BY TYMOV.
|
||
;MAKES IT POSSIBLE FOR TYMOV TO STOP WHEN BUFFER FULL
|
||
;AND BE REENTERED NEXT INTERRUPT.
|
||
%TDEOF::TYEEOF ;CLEAR REST OF PAGE
|
||
%TDEOL::TYEEOL ;CLEAR REST OF LINE
|
||
%TDDLF::TYEDLF ;DELETE FORWARD (FOR ERASABLE OVERPRINTING TTYS)
|
||
%TDMTF::TYEMTF ;MOTOR OFF (FOR TERMINETS)
|
||
%TDMTN::TYEMTN ;MOTOR ON (FOR TERMINETS)
|
||
%TDCRL::TYECRL ;CRLF ON DATAPOINTS, IMLACS.
|
||
%TDNOP::TYEEO1 ;NO-OP FOR SUPERDUPERIMAGE MODE.
|
||
%TDBS:: TYEBS ;BACKSPACE (FOR TTY'S WITH %TORAW SET).
|
||
%TDLF:: TYELF ;LINEFEED (").
|
||
%TDRCR::TYERCR ;CARRET (").
|
||
%TDORS::TYPORS ;"OUTPUT RESET" FOR SAKE OF SOFTWARE TTYS & STYS
|
||
%TDQOT::TYEQOT ;DEVICE-DEPENDENT DATA IN NEXT BYTE.
|
||
%TDFS:: TYEFS ;FORWARD ONE SPACE
|
||
%TDMV0::TYMV0 ;REPLACEMENT FOR %TDMOV
|
||
%TDCLR::TYECLR ;CLEAR THE SCREEN
|
||
%TDBEL::TYEBEL ;DING THE BELL.
|
||
%TDINI::TYEINI ;REINITIALIZE INTELLIGENT TERMINAL
|
||
%TDILP::TYEILP ;INSERT LINE POSITION, FOLLOW BY COUNT
|
||
%TDDLP::TYEDLP ;DELETE LINE POSITION, FOLLOW BY COUNT
|
||
%TDICP::TYEICP ;INSERT CHARACTER POSITION, FOLLOW BY COUNT
|
||
%TDDCP::TYEDCP ;DELETE CHARACTER POSITION, FOLLOW BY COUNT
|
||
%TDBOW::TYEBOW ;ENTER INVERSE VIDEO MODE
|
||
%TDRST::TYERST ;CLEAR ALL SPECIAL MODES (SUCH AS INVERSE VIDEO).
|
||
%TDGRF::TYEEO1 ;GRAPHICS, FLUSH IT
|
||
%TDRSU::TYERSU ;REGION SCROLL UP
|
||
%TDRSD::TYERSD ;REGION SCROLL DOWN
|
||
TYEEO1 ;NEXT 4 CODES ARE USED FOR SOME WEIRD FORM OF GRAPHICS OUTPUT
|
||
TYEEO1 ;THAT WILL EVENTUALLY BE FLUSHED.
|
||
TYEEO1
|
||
TYEEO1
|
||
;FOLLOWING CODES ARE FOR LOCAL EDITING TERMINALS
|
||
;NON-SOTFWARE TERMINALS DON'T HANDLE THEM, SO IGNORE THEM.
|
||
%TDSYN::TYEIG1 ;RESYNCH REPLY TO LOCAL EDITING TERMINAL. IGNORE 1 ARG.
|
||
%TDECO::TYEEO1 ;ASK TERMINAL TO TRY LOCAL EDITING BY SENDING A RESYNCH. IGNORE.
|
||
%TDEDF::TYEIG2 ;SET LOCAL EDITING TERMINAL COMMAND DEFINITION. IGNORE 2 ARGS.
|
||
%TDNLE::TYEEO1 ;STOP DOING LOCAL EDITING. IGNORE.
|
||
%TDTSP::TYEEO1 ;DISPLAYS LIKE SPACE, BUT IS PART OF A TAB. IGNORE. SHOULDN'T HAPPEN.
|
||
%TDCTB::TYEEO1 ;THIS LINE IS CONTINUED AT THE BEGINNING.
|
||
%TDCTE::TYEEO1 ;THIS LINE IS CONTINUED AT THE END.
|
||
%TDMLT::TYEIG2 ;DECLARE MULTI-POSITION CHAR FOR LOCAL EDITING. IGNORE 2 ARGS.
|
||
%TDSVL::TYEIG3 ;SAVE LINE CONTENTS. IGNORE 3 ARGS.
|
||
%TDRSL::TYEIG3 ;RESTORE LINE CONTENTS. IGNORE 3 ARGS.
|
||
%TDSSR::TYEIG2 ;SET RANGE OF COLUMNS TO SAVE. IGNORE 2 ARGS.
|
||
%TDSLL::TYEIG2 ;SET LABEL FOR LOCAL LINE SAVING. IGNORE 2 ARGS.
|
||
%TDMAX::OFFSET 0
|
||
|
||
|
||
;IGNORE THIS COMMAND AND 3 ARGS.
|
||
TYEIG3: MOVE A,TORM(I)
|
||
CAILE A,TOBS-4
|
||
JRST TYPEND
|
||
AOS A,TORM(I)
|
||
IBP Q
|
||
;IGNORE THIS COMMAND AND 2 ARGS.
|
||
TYEIG2: MOVE A,TORM(I)
|
||
CAILE A,TOBS-3
|
||
JRST TYPEND
|
||
AOS A,TORM(I)
|
||
IBP Q
|
||
;IGNORE THIS COMMAND AND 1 ARG.
|
||
TYEIG1: MOVE A,TORM(I)
|
||
CAILE A,TOBS-2
|
||
JRST TYPEND
|
||
AOS A,TORM(I)
|
||
IBP Q
|
||
JRST TYEEO1
|
||
|
||
TYEQOT: MOVE A,TORM(I)
|
||
CAILE A,TOBS-2
|
||
JRST TYPEND
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
ILDB A,Q
|
||
AOS TORM(I)
|
||
JRST TYPSIO
|
||
|
||
TYEBEL: MOVEI A,7
|
||
JRST TYPSIO
|
||
|
||
;%TDMOV MOVE CURSOR COMMAND DISPATCHES HERE.
|
||
TYMOV: MOVE A,TORM(I)
|
||
CAILE A,TOBS-5 ;IF THE 4 ARGUMENT CHARS AREN'T IN THE BUFFER YET,
|
||
JRST TYPEND ;GO AWAY; WILL COME BACK WHEN THEY ARE OUTPUT.
|
||
CAMN Q,TOBEP(I) ;FETCH THE NEXT 2 CHARS WHICH
|
||
MOVE Q,TOBBP(I) ;HOLD THE "OLD" POSITION
|
||
ILDB A,Q
|
||
MOVEM Q,TOOP(I) ;FLUSH FIRST TWO CHARS (AS IF WAS %TDMV0)
|
||
MOVEI C,2
|
||
ADDM C,TORM(I)
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
ILDB B,Q
|
||
CAMGE A,TCMXV(I)
|
||
MOVEM A,TTYIVP(I) ;SET INITIAL STARTING PLACE
|
||
MOVEM B,TTYIHP(I)
|
||
JRST TYMV0A
|
||
|
||
TYMV0: MOVE A,TORM(I) ;MAKE SURE THE TWO ARG CHARS ARE IN THE BUFFER
|
||
CAILE A,TOBS-3
|
||
JRST TYPEND ;GO AWAY; WILL COME BACK WHEN THEY ARE OUTPUT.
|
||
;DROPS THROUGH
|
||
;DROPS IN
|
||
;%TDMOV COMMAND ON ALL TERMINALS.
|
||
TYMV0A: MOVSI C,%TCPAD+%TCFPD ;FOR DATAPOINTS, PADDING WILL BE NECESSARY NOW.
|
||
ANDCAM C,TTYCOM(I) ; ALSO, CLEAR FPD IF IT GOT LEFT ON SOMEHOW
|
||
MOVEI A,%TDMV1 ;PUT A NEW COMMAND IN OUTPUT BUFFER
|
||
DPB A,Q ; IN CASE WE FILL UP BUFFER AND HAVE TO COME BACK.
|
||
; IN THAT CASE WILL RETURN TO TYMOV2.
|
||
;BUFFER NOW HOLDS:
|
||
; %TDMV1 ? NEW VPOS ? NEW HPOS
|
||
TYMOV2: CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I) ;FETCH DESIRED POS. FROM BUFFER.
|
||
ILDB D,Q
|
||
CAML D,TCMXV(I)
|
||
SETZ D,
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
ILDB TT,Q
|
||
CAIGE W,%TNMAX ;If pointer to routine is within range,
|
||
JUMPGE W,@TYMDTB(W) ;GO TO DEVICE-DEPENDENT CURSOR POSITIONING ROUTINE
|
||
BUG
|
||
|
||
TYMDTB: OFFSET -.
|
||
%TNPRT::SETZ TYMPRT ;PRINTING
|
||
%TNDP:: TYMDP ;DATAPOINT
|
||
%TNODP::TYMDP ;LOSING DATAPOINT
|
||
%TNIML::TYMIML ;IMLAC
|
||
%TNTEK::TYMDP ;TEKTRONIX
|
||
%TNTV:: [JRST 4,.+TYMDTB]
|
||
%TNMEM::SETZ TYMPRT ;MEMOWRECK
|
||
%TNSFW::[JRST 4,.+TYMDTB]
|
||
%TNTRM::SETZ TYMPRT ;TERMINET
|
||
%TNESC::TYMDP ;ASCII ESCAPE SEQUENCES TTY
|
||
%TNDTM::TYMIML ;DATAMEDIA
|
||
%TNRAY::TYMDP ;TELERAY 1061
|
||
%TNHDS::TYMDP ;HDS CONCEPT-100
|
||
%TNH19::TYMH19 ;H19
|
||
%TNAAA::TYMAAA ;Ann Arbor Ambassador
|
||
%TNMAX::OFFSET 0
|
||
|
||
;DISPLAY TERMINALS THAT HAVE RELATIVE CURSOR POSITIONING
|
||
TYMDP: MOVE A,TTYIVP(I) ;CURRENT HARDWARE VERTICAL POSITION
|
||
SUB A,D ;SUBTRACT VERTICAL POSITION OF WHERE WE WANT TO BE
|
||
MOVMS A ;A IS HOW FAR WE HAVE TO GO UP OR DOWN
|
||
CAML TT,TCMXH(I) ;IF TRYING TO MOVE OFF RIGHT MARGIN,
|
||
JRST [ MOVE TT,TCMXH(I) ;CODE JUST BELOW CAUSES INFINITE LOOP
|
||
SOJA TT,.+1 ] ;SO PRETEND MOVING TO MARGIN
|
||
MOVE B,TTYIHP(I) ;COMPUTE NET CHRS TO POSITION
|
||
CAML B,TCMXH(I) ;IF WE THINK WE MOVED OFF THE END OF THE LINE,
|
||
JRST [ MOVE B,TCMXH(I) ;PRESUMABLY BY PRINTING IN THE LAST COLUMN,
|
||
SUBI B,1 ;THE CURSOR ACTUALLY STUCK IN THE LAST COLUMN
|
||
MOVEM B,TTYIHP(I)
|
||
JRST .+1 ]
|
||
SUB B,TT
|
||
MOVM C,B ;C IS HOW FAR WE HAVE TO GO HORIZONTALLY
|
||
TRNE H,%TPPTB ;IF TERMINAL HAS TABS
|
||
JRST TYMTB1 ;USE DIFFERENT CURSOR POSITIONING ROUTINE
|
||
CAMLE B,TT ;SKIP IF NOT SHORTER TO CR FIRST
|
||
MOVEI C,1(TT) ;# CHARS IF CR FIRST.
|
||
ADD A,C ;A NOW HAS TOTAL NUMBER OF CHARS TO SEND TO GET THERE
|
||
JUMPE A,TYMOV8 ;WE'RE THERE
|
||
MOVE C,D
|
||
ADDI C,1(TT) ;C HAS NUMBER OF CHARS IT WOULD TAKE IF WE HOMED UP FIRST
|
||
MOVE E,TCMXV(I)
|
||
SUBI E,1
|
||
SUB E,D ;E HAS NUMBER IF HOME DOWN FIRST
|
||
JUMPL E,TYPCPG
|
||
ADD E,TT
|
||
CAMGE C,A
|
||
JRST TYMHU ;HOME UP SHORTER
|
||
CAMGE E,A
|
||
JSP A,TYMHD ;HOME DOWN SHORTER
|
||
TYPCPG: JUMPL B,TYMDP3 ;H POS TOO SMALL, MOVE FWD
|
||
JUMPG B,TYMDP6 ;MOVE BACKWARD (EITHER BS OR CR).
|
||
TYMDPL: MOVE B,TTYIVP(I)
|
||
SUB B,D
|
||
JUMPG B,TYMDP2 ;MOVE UP IF NECESSARY
|
||
JUMPL B,TYMDP1 ;OR DOWN.
|
||
JRST TYMOV8 ;OR WE'RE DONE.
|
||
|
||
TYMDP3: JSP E,TYMDPP ;PAD IF NEC.
|
||
MOVE C,[AOS TTYIHP(I)]
|
||
SKIPL A,CCFS(W) ;GET FORWARD SPACE CHARACTER
|
||
JRST TYMDP7 ;IS ONE CHAR
|
||
HRRZS A
|
||
JRST TYMVT7 ;IS TWO CHARS
|
||
|
||
TYMDP6: CAMG B,TT
|
||
JRST TYMDP8
|
||
TYMTB6: MOVEI A,15 ;BETTER TO CR FIRST
|
||
CAIE W,%TNODP
|
||
CLEARM TTYIHP(I)
|
||
MOVEI B,1
|
||
MOVSI C,(JFCL)
|
||
CAIE W,%TNODP
|
||
JRST TYMDP5
|
||
MOVE E,TCMXV(I)
|
||
SUBI E,1
|
||
CAMN E,TTYIVP(I) ;ON LOSERS, AFTER CR MUST GO LF TO TURN OFF SPOW MODE.
|
||
JRST TYMDP2 ;IF ON BOTTOM LINE, GO UP BEFORE CR SO CAN GO DOWN AFTER.
|
||
MOVE E,TTYCOM(I)
|
||
TLCN E,%TCFPD
|
||
MOVEM E,TTYCOM(I)
|
||
TLNE E,%TCFPD
|
||
JRST TYMDP5 ;JUMP IF HAVEN'T DONE CR YET
|
||
JSP E,TYMDPP ;AFTER CR, PAD
|
||
JRST TYMHU3 ;THEN GO SETZM TTYIHP(I) AND TURN OFF SPOW LATCH
|
||
|
||
TYMDP8: JSP E,TYMDPP
|
||
MOVE C,[SOS TTYIHP(I)]
|
||
MOVEI A,%DPBS ;DATAPOINT BACK-SPACE.
|
||
JRST TYMDP7
|
||
|
||
TYMDP1: JSP E,TYMDPP
|
||
MOVEI A,%DPDN ;DATAPOINT LINEFEED.
|
||
MOVE C,[AOS TTYIVP(I)]
|
||
JRST TYMDP7
|
||
|
||
TYMDP2: JSP E,TYMDPP
|
||
MOVE C,[SOS TTYIVP(I)]
|
||
SKIPL A,CCUP(W) ;GET LINE-STARVE CHARACTER
|
||
JRST TYMDP5
|
||
HRRZS A
|
||
JRST TYMVT7 ;IT'S TWO CHARS LONG
|
||
|
||
TYMHU: SKIPN CCHUP(W) ;SKIP IF TTY CAN HOME UP
|
||
JRST TYPCPG
|
||
CAMLE C,E ;HOME UP IS BETTER THAN DIRECT ROUTE.
|
||
JSP A,TYMHD ;MAYBE HOME DOWN IS EVEN BETTER
|
||
CAIN W,%TNODP
|
||
JRST TYMHU1
|
||
CLEARM TTYIVP(I) ;NO, HOME UP IS BEST.
|
||
CLEARM TTYIHP(I)
|
||
TYMHU2: MOVE A,CCHUP(W)
|
||
MOVEM A,TTYBYP(I)
|
||
JRST TYMOVX
|
||
|
||
TYMHU1: MOVE E,TTYCOM(I) ;HERE FOR HOME UP ON DISAPPOINT
|
||
TLCN E,%TCFPD
|
||
MOVEM E,TTYCOM(I)
|
||
TLNE E,%TCFPD
|
||
JRST TYMHU2 ;JUMP IF HAVEN'T HOMED UP YET
|
||
MOVSI E,%TCPAD ;DON'T PAD AFTER HOME UP
|
||
IORM E,TTYCOM(I)
|
||
SETZM TTYIVP(I) ;AND TURN OFF THE SPOW LATCH
|
||
TYMHU3: MOVSI E,%TCFPD ;FIRST PART WILL HAVE BEEN DONE WHEN
|
||
ANDCAM E,TTYCOM(I) ; WE PUT OUT THE ONE CHAR TO GO DOWN ONE LINE
|
||
SETZM TTYIHP(I)
|
||
MOVEI B,1 ;GO DOWN ONE LINE TO RESET SPOW
|
||
JRST TYMDP1
|
||
|
||
TYMDP7: MOVMS B
|
||
TYMDP5: JUMPE A,[JRST 4,.]
|
||
TYMDP4: XCT C
|
||
IDPB A,DBBBP
|
||
SOSG DBBCC
|
||
JRST TYMOVY
|
||
SOJG B,TYMDP4
|
||
JRST TYMOVC
|
||
|
||
;CAN'T OUTPUT ANY MORE: IF REACHED DESIRED POS, FLUSH THE
|
||
;%TDMV1; OTHERWISE RETURN LEAVING IT TO COME BACK HERE WHEN
|
||
;TTY CAN ACCEPT MORE OUTPUT.
|
||
TYMOVY: SOJG B,TYMOVP
|
||
TYMOVX: CAMN D,TTYIVP(I)
|
||
CAME TT,TTYIHP(I)
|
||
POPJ P,
|
||
;WE USED UP ALL THE SPACE BUT GOT WHERE WE'RE GOING.
|
||
TYMOV9: MOVEM Q,TOOP(I) ;FLUSH THE %TDMV1 COMMAND.
|
||
MOVEI B,3
|
||
ADDM B,TORM(I)
|
||
POPJ P,
|
||
|
||
;WE FINISHED ONE SET OF OUTPUT CHARS, & HAVE ROOM FOR MORE.
|
||
;EITHER CONTINUE MOVING CURSOR, OR LOOK FOR NEXT THING TO DO.
|
||
TYMOVC: CAME TT,TTYIHP(I)
|
||
JRST TYMDP ;HORIZ POS STILL NEEDS CHANGING.
|
||
CAME D,TTYIVP(I)
|
||
JRST TYMDPL ;VERT POS STILL NEEDS CHANGING.
|
||
TYMOV8: MOVEM Q,TOOP(I) ;FLUSH THE %TDMV1 COMMAND
|
||
MOVEI B,3
|
||
ADDM B,TORM(I)
|
||
JRST TYPLUP ;AND GO GET NEXT THING FROM BUFFER.
|
||
|
||
;COME HERE TO PAD DATAPOINT IF NECESSARY.
|
||
;CALL WITH JSP E,. CLOBBERS A, C.
|
||
;MAY JUMP AWAY TO PAD, IN WHICH CASE TYMDP WILL BE RE-ENTERED LATER.
|
||
TYMDPP: MOVSI C,%TCPAD
|
||
TDNE C,TTYCOM(I) ;PADDING ALREADY DONE FOR THIS COMMAND => RETURN.
|
||
JRST (E)
|
||
LDB A,[$TPPCR,,TTYOPT(I)]
|
||
JUMPE A,(E) ;RETURN IF THIS TTY NOT PADDED.
|
||
MOVE B,A
|
||
IORM C,TTYCOM(I) ;AFTER WE PAD, PADDING WON'T BE NECESSARY.
|
||
MOVEI A,177
|
||
MOVSI C,(JFCL)
|
||
JRST TYMDP5 ;GO OUTPUT THEM.
|
||
|
||
TYMOVP: CAIE A,177
|
||
POPJ P,
|
||
JRST TYMPAD
|
||
|
||
;JSP A,TYMHD IF HOME-DOWN LOOKS BEST
|
||
TYMHD: CAIE W,%TNDP
|
||
JRST (A) ;BUT HOME-DOWN ONLY WORKS ON DATAPOINTS
|
||
SETZM TTYIHP(I) ;HOME DOWN IS BEST.
|
||
MOVE C,TCMXV(I)
|
||
SUBI C,1
|
||
MOVEM C,TTYIVP(I)
|
||
MOVE A,CCHDP
|
||
MOVEM A,TTYBYP(I)
|
||
JRST TYPLUP
|
||
|
||
;HERE TO SEND ONE OR MORE COPIES OF AN ESCAPE SEQUENCE.
|
||
;ESCAPED CHAR IN A. # TIMES IN B. INSN TO ADJUST TTYIVP,TTYIHP IN C.
|
||
TYMVT7: MOVMS B
|
||
TYMVT5: MOVE E,TTYCOM(I) ;STOPPED IN MIDDLE OF ESC SEQ?
|
||
TLZN E,%TCFPD
|
||
JRST TYMVT4
|
||
MOVEM E,TTYCOM(I) ;YES, SKIP INITIAL ESC
|
||
JRST TYMVT6
|
||
|
||
TYMVT4: MOVEI E,33
|
||
IDPB E,DBBBP
|
||
SOSG DBBCC ;NO MORE ROOM =>
|
||
JRST TYMVT3 ;STOPPED WITHIN ESC SEQUENCE
|
||
TYMVT6: XCT C ;ELSE SEND THE ESCAPED CHAR
|
||
IDPB A,DBBBP
|
||
SOSG DBBCC
|
||
JRST TYMOVY ;NO ROOM => DISMISS
|
||
SOJG B,TYMVT4 ;ELSE SEND NEXT ESC SEQ
|
||
JRST TYMOVC ;FLUSH THE %TDMOV AND RETURN
|
||
|
||
TYMVT3: MOVSI E,%TCFPD
|
||
IORM E,TTYCOM(I)
|
||
POPJ P,
|
||
|
||
;CURSOR POSITIONING ON A DISPLAY TTY WITH TABS
|
||
TYMTB1: MOVE R,TT
|
||
IDIVI R,8
|
||
ADD R,TYMTBC(W) ;COST OF TABBING TO DEST FROM LEFT MARGIN
|
||
MOVE W,TCTYP(I) ;RESTORE W, CLOBBERED BY IDIVI
|
||
JUMPG B,TYMTB2 ;JUMP IF MOVING BACKWARDS
|
||
JUMPE B,TYMTB3 ;JUMP IF NOT MOVING HORIZONTALLY
|
||
SKIPGE CCFS(W)
|
||
ADD C,C ;MOVING FORWARDS IS SLOW ON ESCAPE-C TYPE TERMINAL
|
||
MOVE E,TTYIHP(I)
|
||
LSH E,-3
|
||
SUBM R,E ;COST OF TABBING FROM WHERE WE ARE NOW
|
||
CAMLE C,E
|
||
MOVE C,E ;FASTER IF TABS ARE USED
|
||
JRST TYMTB3 ;MOVING FORWARD, SO CR CAN'T HELP
|
||
|
||
TYMTB2: CAILE C,1(R)
|
||
MOVEI C,1(R) ;BETTER TO CR FIRST
|
||
TYMTB3: ADD A,C ;TOTAL # CHARS TO BE SENT IF RELATIVE POSITIONING USED
|
||
JUMPE A,TYMOV8 ;WE'RE THERE
|
||
MOVE E,D
|
||
ADDI E,2(R) ;COST IF HOME-UP FIRST (ASSUMING HOME-UP IS 2 CHARS)
|
||
CAMG E,A
|
||
MOVE A,E ;RELATIVE POSITIONING SHOULD START WITH HOME-UP
|
||
CAILE A,4 ;COMPARE RELATIVE AND ABSOLUTE POSITIONING
|
||
TRNN H,2*%TPPTB
|
||
JRST TYMTB8 ;RELATIVE POSITIONING BETTER OR ONLY CHOICE
|
||
;USE ABSOLUTE POSITIONING, DROP INTO STRAIGHT ABS POS CODE.
|
||
;HERE FOR DIRECT POSITIONING ON IMLAC AND DATA MEDIA. SEND MAGIC CHARACTER
|
||
;FOLLOWED BY HORIZONTAL AND VERTICAL POSITION, OFFSET BY SUITABLE AMOUNT
|
||
;D FOR THE VERTICAL, TT FOR THE HORIZONTAL
|
||
TYMIML: MOVE Q,TOOP(I) ;CLOBBER OVER THE 3 CHARS IN OUTPUT BUFFER
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
HLRZ A,CCDPSO(W) ;GET ABS-POSITIONING CHARACTER, IT WILL
|
||
IDPB A,Q ; BE FOLLOWED WITH VERTICAL, HORIZONTAL COORDS
|
||
MOVEM D,TTYIVP(I) ;CURSOR WILL END UP HERE
|
||
MOVEM TT,TTYIHP(I)
|
||
TRNE A,200000
|
||
EXCH D,TT ;SEND HORIZONTAL THEN VERTICAL
|
||
HRRZ E,CCDPSO(W) ;GET TABLE INDEX
|
||
MOVE B,D ;FIRST COORD TO SEND
|
||
XCT CCDPSM(E) ;MUNG B APPROPRIATELY
|
||
ANDI B,177 ;EXTRA BITS CAUSE TROUBLE LATER
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
IDPB B,Q
|
||
MOVE C,B ;SAVE
|
||
MOVE B,TT ;SECOND COORD TO SEND
|
||
XCT CCDPSM(E) ;MUNG B APPROPRIATELY
|
||
ANDI B,177 ;EXTRA BITS CAUSE TROUBLE LATER
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
IDPB B,Q
|
||
ANDI A,177 ;DON'T LET TYPLUP THINK THESE CHARACTERS PRINT
|
||
TLNN H,%TOSAI
|
||
CAIL A,40
|
||
SOS TTYIHP(I)
|
||
TLNN H,%TOSAI
|
||
CAIL B,40
|
||
SOS TTYIHP(I)
|
||
TLNN H,%TOSAI
|
||
CAIL C,40
|
||
SOS TTYIHP(I)
|
||
SKIPL A,CCDPSO(W)
|
||
JRST TYPLUP
|
||
MOVEI A,33 ;PUT AN ESC BEFORE IT
|
||
JRST TYPOU2
|
||
|
||
TYMTB8: CAMN E,A
|
||
JRST TYMHU ;HOME-UP FIRST
|
||
JUMPL B,TYMTB4 ;JUMP IF MOVING TO THE RIGHT
|
||
JUMPE B,TYMDPL ;JUMP IF NOT MOVING HORIZONTALLY
|
||
CAIE C,1(R) ;MOVING TO THE LEFT, SKIP IF SHOULD CR FIRST
|
||
JRST TYMDP8 ;NO, JUST BS
|
||
JRST TYMTB6 ;GO CR
|
||
|
||
TYMTB4: MOVE E,TT ;DESTINATION COLUMN
|
||
TRO E,7 ;ENSURE NO BORROW
|
||
MOVEI A,1(E) ;COLUMN TO TAB TO THEN BACKSPACE BACK
|
||
CAMGE A,TCMXH(I) ;BE SURE NOT TO TAB OFF THE RIGHT MARGIN
|
||
TRNN TT,4 ;SKIP IF FASTER TO TAB PAST AND BACKSPACE BACK
|
||
JRST TYMTB5 ;JUMP IF BETTER TO TAB THEN FORWARD-SPACE
|
||
CAMN B,[-1]
|
||
JRST TYMDP3 ;MOVING A SHORT WAY, JUST SEND A FORWARD-SPACE
|
||
MOVEI B,8(E)
|
||
SUB B,TTYIHP(I)
|
||
LSH B,-3 ;# TABS TO GET PAST DESTINATION
|
||
TYMTB7: MOVEI A,^I
|
||
MOVEI E,7
|
||
ANDCAM E,TTYIHP(I) ;ALIGN TTYIHP WITH TAB STOPS
|
||
MOVE C,[ADDM E,TTYIHP(I)] ;EACH TAB ADVANCES TTYIHP BY 8
|
||
AOJA E,TYMDP5 ;GO TAB
|
||
|
||
TYMTB5: SUB E,TTYIHP(I) ;COMPUTE # TABS TO GET JUST TO
|
||
LSH E,-3 ; THE LEFT OF THE DESTINATION
|
||
JUMPE E,TYMDP3 ;WE'RE CLOSE, DO FORWARD SPACES
|
||
MOVE B,E ;TAB FIRST
|
||
JRST TYMTB7
|
||
|
||
TYMTBC: 0 ? 2 ? 4 ? 6 ;COST OF MOVING RIGHT FROM A TAB STOP
|
||
1+4 ? 1+3 ? 1+2 ? 1+1 ;COST OF TABBING ONE MORE AND BACKSPACING BACK
|
||
|
||
;setup routine for TYMH19, TYMAAA. Gets magnitude of horizontal and vertical
|
||
;motion in B and A, destinations in TT and D respectively, sets TTYIHP and
|
||
;TTYIVP.
|
||
TYMPOS: MOVE A,TTYIVP(I) ;current hardware vertical position
|
||
SUBM D,A ;subtract from vertical destination
|
||
CAML TT,TCMXH(I) ;if trying to move off right margin,
|
||
JRST [ MOVE TT,TCMXH(I) ;pretend moving to margin
|
||
SOJA TT,.+1 ]
|
||
MOVE B,TTYIHP(I) ;compute net chrs to position
|
||
CAML B,TCMXH(I) ;if we think we moved off the end of the line,
|
||
JRST [ MOVE B,TCMXH(I) ;presumably by printing in the last column,
|
||
SUBI B,1 ;the cursor actually stuck in the last column
|
||
MOVEM B,TTYIHP(I)
|
||
JRST .+1 ]
|
||
SUBM TT,B ;now we have horizontal motion in B
|
||
MOVEM D,TTYIVP(I) ;put vertical, horizontal destination
|
||
MOVEM TT,TTYIHP(I) ;into registers (we'll be there soon).
|
||
POPJ P,
|
||
|
||
;cursor positioning on an H19. TYMDP occasionally stuffs rubouts into the
|
||
;buffer to do its own padding, thereby resulting in ^S ^Q lossage on H19s. I
|
||
;could patch TYMDP up, but it's too silly. Generates HCUF, HCUB, HCUD, HCUU,
|
||
;or HDCA.
|
||
TYMH19: PUSHJ P,TYMPOS ;get horizontal and vertical destinations, etc.
|
||
MOVEI C,2 ;now flush the first two chars of cursor
|
||
ADDM C,TORM(I) ;motion command (TYEEO2 will flush last)
|
||
MOVE C,TOCMBF(I) ;get byte pointer to tty command buffer in C
|
||
MOVEI E,33
|
||
IDPB E,C ;send esc
|
||
JUMPE A,TYMHOX ;if vertical magnitude 0, only moving in X
|
||
JUMPE B,TYMHOY ;same for horizontal and Y
|
||
TYMABS: MOVEI E,"Y ;neither is 0, abs. positioning faster
|
||
IDPB E,C
|
||
ADDI D,40 ;convert line # to H19 coord system.
|
||
IDPB D,C
|
||
ADDI TT,40 ;convert column # to H19 coord system
|
||
IDPB TT,C
|
||
TYMHDN: MOVEI E,0 ;top it off with a null
|
||
IDPB E,C
|
||
MOVE A,TOCMBF(I) ;TYEEO2 wants bp in A
|
||
JRST TYEEO2 ;noone seems to think it's necessary to pad
|
||
|
||
TYMHOX: CAIN B,1 ;if 1 or -1, then relative positioning is
|
||
JRST TYMHX2 ;plenty fast
|
||
CAIN B,-1
|
||
JRST TYMHX3
|
||
JRST TYMABS ;otherwise absolute positioning is faster
|
||
TYMHX2: MOVEI E,"C ;moving forward one space
|
||
IDPB E,C
|
||
JRST TYMHDN
|
||
TYMHX3: MOVEI E,"D ;moving backwards one space
|
||
IDPB E,C
|
||
JRST TYMHDN
|
||
|
||
TYMHOY: CAIN A,1 ;if 1 or -1, then relative positioning is
|
||
JRST TYMHY2 ;plenty fast
|
||
CAIN A,-1
|
||
JRST TYMHY3
|
||
JRST TYMABS ;otherwise absolute positioning is faster
|
||
TYMHY2: MOVEI E,"B ;moving down one line
|
||
IDPB E,C
|
||
JRST TYMHDN
|
||
TYMHY3: MOVEI E,"A ;moving up one line
|
||
IDPB E,C
|
||
JRST TYMHDN
|
||
|
||
;cursor positioning on an AAA. Generates either CUP, HPA, or VPA,
|
||
;whichever involves fewest chars.
|
||
TYMAAA: PUSHJ P,TYMPOS ;get X-Y motion and set dests.
|
||
MOVEI C,2 ;now flush the first two chars of cursor
|
||
ADDM C,TORM(I) ;motion command (TYEEO2 will flush last)
|
||
MOVE C,TOCMBF(I) ;get byte pointer to tty command buffer in C
|
||
MOVEI E,33
|
||
IDPB E,C ;send esc
|
||
MOVEI E,"[ ;[
|
||
IDPB E,C
|
||
JUMPE B,TYMAVT ;going vertically only
|
||
JUMPE A,TYMAHZ ;horizontally only
|
||
JUMPE D,TYMAP3 ;if going to top line, optimize out 1st coord
|
||
MOVE E,D
|
||
PUSHJ P,SNDNUM ;send vertical coord
|
||
JUMPE TT,TYMAP5 ;if moving to leftmost col no second coord
|
||
TYMAP3: MOVEI A,73 ;or semicolon
|
||
IDPB A,C
|
||
MOVE E,TT
|
||
PUSHJ P,SNDNUM ;send horizontal coord
|
||
TYMAP5: MOVEI A,"H ;absolute positioning char
|
||
JRST TYMADN
|
||
;going vertically only, use vertical absolute positioning
|
||
TYMAVT: MOVE E,D
|
||
PUSHJ P,SNDNUM
|
||
MOVEI A,"d ;vertical absolute positioning char
|
||
JRST TYMADN
|
||
;going horizontally only, horizontal absolute positioning
|
||
TYMAHZ: MOVE E,TT
|
||
PUSHJ P,SNDNUM
|
||
MOVEI A,"` ;horizontal absolute positioning char
|
||
;fall through into done code
|
||
|
||
TYMADN: IDPB A,C ;send that last char
|
||
MOVEI A,4 ;padding is A*TT in ms
|
||
MOVEI TT,1 ;4 ms of padding ought to be enough
|
||
JRST TYDAPD ;go set it up
|
||
|
||
;Add one to the number in E, convert it to ASCII decimal, and idpb it
|
||
;in the location pointed to by the bp in C. Assumes no more than 2
|
||
;digits in E. Bashes A, B, E (B because of the IDIVI).
|
||
SNDNUM: AOS E ;bump
|
||
MOVE A,E
|
||
IDIVI A,10. ;divide by 10 for high digit
|
||
JUMPE A,SNDNM2 ;only one digit
|
||
ADDI A,"0 ;make high digit ascii
|
||
IDPB A,C ;put in buffer
|
||
SUBI A,"0 ;un-ascii high digit
|
||
IMULI A,10. ;find out what we printed
|
||
SUB E,A ;take it from what we had to get low digit
|
||
SNDNM2: ADDI E,"0 ;make low digit ascii
|
||
IDPB E,C ;put in buffer
|
||
POPJ P,
|
||
|
||
TYEBS: SOSGE TTYIHP(I) ;%TDBS: OUTPUT BS.
|
||
SETZM TTYIHP(I)
|
||
MOVEI A,^H
|
||
JRST TYPSIO
|
||
|
||
TYERCR: MOVE D,TTYIVP(I) ;%TDRCR: OUTPUT A CR (PLUS PADDING)
|
||
SETZ TT,
|
||
SKIPN TTYIHP(I)
|
||
AOS TTYIHP(I)
|
||
TYERC1: SOS TORM(I) .SEE TYMOVX ;WHICH WILL ADD 3 TO TORM.
|
||
SOS TORM(I)
|
||
JRST TYMPRR
|
||
|
||
TYELF: MOVE TT,TTYIHP(I) ;%TDLF: OUTPUT LF (PLUS PADDING)
|
||
MOVE D,TTYIVP(I)
|
||
AOS D
|
||
CAIG D,118.
|
||
CAML D,TCMXV(I)
|
||
JRST TYELFE ;DETECT A LF THAT SCROLLS.
|
||
JRST TYERC1
|
||
|
||
TYELFE: SKIPN TTYROL(I) ;IF NOT A SCROLLING TTY, RESET VPOS TO 0
|
||
TDZA D,D
|
||
SUB D,TTYROL(I) ;OTHERWISE, GLITCH UP
|
||
MOVEM D,TTYIVP(I) ;STORE VPOS AFTER SCROLLING.
|
||
SOS TTYIVP(I) ;MAKE SURE 1 LF IS OUTPUT.
|
||
JRST TYERC1
|
||
|
||
TYEFS: CAIN W,%TNAAA ;AAA's use a different format
|
||
JRST TYFSAA
|
||
MOVSI E,%TCFPD ;ON SOME TTYS, IS TWO PARTS
|
||
TDNE E,TTYCOM(I)
|
||
JRST TYEFS2 ;FIRST PART DONE, DO SECOND
|
||
IORM E,TTYCOM(I) ;ABOUT TO DO FIRST PART
|
||
CAIE W,%TNDP ;DATAPOINTS NEED PADDING
|
||
CAIN W,%TNODP
|
||
JRST TYEFSD ;SO GO DO IT
|
||
MOVEI A,33 ;VT52S ETC. NEED ALTMODE PREFIX
|
||
SKIPGE CCFS(W)
|
||
JRST TYPOU2 ;SO GO DO THAT
|
||
TYEFS2: ANDCAM E,TTYCOM(I) ;ABOUT TO DO SECOND PART
|
||
HRRZ A,CCFS(W) ;GET CHARACTER TO SEND
|
||
AOS TTYIHP(I) ;IT WILL MOVE THE CURSOR
|
||
JRST TYPSIO ;SEND IT, AND ABSORB THE %TDFS
|
||
|
||
TYEFSD: LDB B,[$TPPCR,,TTYOPT(I)]
|
||
PUSHJ P,TYMPAD ;SET UP TTYBYP TO PAD
|
||
JRST TYPLUP ;PAD THEN COME BACK HERE
|
||
|
||
;handle forward-space on AAA's
|
||
TYFSAA: MOVE A,CCFS(W)
|
||
JRST TYEEO2
|
||
|
||
;HANDLE CLEAR-EOL:
|
||
TYEEOL: SKIPA A,CCEOLP(W)
|
||
|
||
;HANDLE CLEAR-EOF
|
||
TYEEOF: MOVE A,CCEOFP(W)
|
||
TYEEO2: CAILE A,0
|
||
PUSHJ P,TYEEO3 ;JUMP IF OUTPUT SEQ IS mn,,TABLE
|
||
TYEEO4: MOVEM A,TTYBYP(I) ;STORE BYTE POINTER OR ZERO
|
||
TYEEO1: AOS TORM(I) ;FLUSH THE CURSOR CTL CMD FROM OUTPUT BFR.
|
||
MOVEM Q,TOOP(I)
|
||
JRST TYPLUP
|
||
|
||
;OUTPUT SEQUENCE SPECIFIED AS mn,,TABLE
|
||
;m=LOWEST PAD CODE IN TABLE, n=HIGHEST
|
||
TYEEO3: LDB B,[$TPPCR,,TTYOPT(I)]
|
||
LDB C,[220300,,A] ;n
|
||
CAMLE B,C
|
||
MOVE B,C
|
||
LDB C,[250300,,A] ;m
|
||
SUB B,C
|
||
SKIPLE B
|
||
ADD A,B
|
||
MOVE A,(A) ;PICK UP BYTE POINTER OUT OF TABLE
|
||
POPJ P,
|
||
|
||
;HANDLE CLEAR THE SCREEN
|
||
TYECLR: SETZM TTYIHP(I) ;AFTER CLEARING, CURSOR WILL BE AT TOP LEFT
|
||
SETZM TTYIVP(I)
|
||
SKIPA A,CCCLRP(W)
|
||
;HANDLE DELETE FWD, ON OVERPRINTING ERASABLE DISPLAYS, AND IMLACS (ACC TO %TOIML).
|
||
TYEDLF: MOVE A,CCDLFP(W)
|
||
JRST TYEEO2
|
||
|
||
;HANDLE ENTER-INVERSE-VIDEO AND LEAVE-ALL-SUCH-MODES
|
||
TYEBOW: SKIPA A,CCBOWP(W)
|
||
TYERST: MOVE A,CCRSTP(W)
|
||
JRST TYEEO2
|
||
|
||
TYEINI: MOVE A,CCINIP(W)
|
||
JRST TYEEO2
|
||
|
||
;REGION-SCROLL UP AND REGION-SCROLL DOWN HANDLED ONLY ON DM2500
|
||
;FOR NOW. REAL DM2500'S CAN'T DO IT, BUT CERTAIN FAKE ONES CAN.
|
||
;SOMEDAY HAIRY CODE COULD BE ADDED TO DO IT ON C100 AND VT100.
|
||
TYERSU:
|
||
TYERSD: SUBI A,%TDRSU-^U ;SEND ^U OR ^V
|
||
; CAIE W,%TNDTM
|
||
; JRST TYEEO1
|
||
MOVE B,TORM(I) ;MAKE SURE ARGS IN BUFFER
|
||
CAILE B,TOBS-3
|
||
JRST TYPEND ;NO, COME BACK LATER
|
||
DPB A,Q
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
ILDB A,Q ;XOR 140 INTO ARGS
|
||
XORI A,140
|
||
DPB A,Q
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
ILDB A,Q
|
||
XORI A,140
|
||
DPB A,Q
|
||
MOVNI A,2 ;COMPENSATE FOR "PRINTING" CHARS
|
||
ADDM A,TTYIHP(I)
|
||
JRST TYPLUP
|
||
|
||
;HANDLE DELETE AND INSERT CHARACTERS AND LINES
|
||
;DOESN'T TRY TO BE TOTALLY HAIRY ABOUT MULTIPLE INSERT/DELETES.
|
||
TYEILP: SKIPA A,CCILPP(W)
|
||
TYEDLP: MOVE A,CCDLPP(W)
|
||
JRST TYEIL1
|
||
|
||
;if we're on an H19 we don't want to call TYDH19 from TYEICP, because
|
||
;no multiple insert char.
|
||
TYEICP: MOVE A,CCICPP(W)
|
||
CAIE W,%TNH19 ;if we're on an H19, no multiple insert char
|
||
JRST TYEIL1 ;so hack locally, else go to main routine
|
||
MOVE B,TORM(I) ;MAKE SURE REPEAT-COUNT ARGUMENT IS IN THE BUFFER
|
||
CAILE B,TOBS-2
|
||
JRST TYPEND ;if it's not, come back when it is
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
ILDB B,Q ;GET IT
|
||
JRST TYEIL2
|
||
TYEDCP: MOVE A,CCDCPP(W)
|
||
TYEIL1: MOVE B,TORM(I) ;MAKE SURE REPEAT-COUNT ARGUMENT IS IN THE BUFFER
|
||
CAILE B,TOBS-2
|
||
JRST TYPEND ;IT'S NOT, COME BACK WHEN IT IS
|
||
CAMN Q,TOBEP(I)
|
||
MOVE Q,TOBBP(I)
|
||
ILDB B,Q ;GET IT
|
||
CAIN W,%TNAAA ;AAA's have a better way of doing this
|
||
JRST TYIDAA
|
||
CAIN W,%TNH19 ;so do H19's
|
||
JRST TYDH19
|
||
TYEIL2: SOJG B,[DPB B,Q ;NOT LAST TIME, LEAVE DECREMENTED REQUEST IN BUFFER
|
||
CAILE A,0
|
||
PUSHJ P,TYEEO3
|
||
MOVEM A,TTYBYP(I) ;AND DO ONCE
|
||
JRST TYPLUP]
|
||
AOS TORM(I) ;OTHERWISE, REMOVE FROM BUFFER
|
||
JRST TYEEO2 ;AND GO DO
|
||
|
||
;Handle insert/delete line, delete char on an H19, without weenie
|
||
;weenie. Actually enters ANSI mode for multiple insert/deletes.
|
||
TYDH19: CAIG B,6 ;if we're doing < 6, non-hairy way is faster.
|
||
JRST [ MOVE A,1(A) ;format of table is
|
||
JRST TYEIL2 ] ; [ansicommand ? zdscommand]
|
||
MOVE A,@A ;get the command char
|
||
AOS TORM(I) ;flush the arg
|
||
MOVE C,TOCMBF(I) ;pointer to comand buffer
|
||
MOVEI E,33 ;send esc and
|
||
IDPB E,C
|
||
MOVEI E,"< ;< to enter ANSI mode
|
||
IDPB E,C
|
||
PUSHJ P,TYIDA2 ;send the command and set TT to arg
|
||
MOVEI A,19. ;19 ms padding per operation.
|
||
MOVE D,H19ZDS ;copy command to enter ZDS mode
|
||
ILDB E,D ;into buffer
|
||
JUMPE E,TYDAPD ;when done, go do padding
|
||
IDPB E,C
|
||
JRST .-3
|
||
|
||
H19ZDS: 440700,,[ASCIZ /[?2h/] ;command to enter ZDS mode
|
||
|
||
;Handle insert/delete chars/lines on an AAA. This code avoids the
|
||
;"weenie weenie" syndrome, where lines get deleted one at a time
|
||
;(weenie weenie), and then get inserted one at a time (weenie weenie).
|
||
TYIDAA: AOS TORM(I) ;flush arg from buffer
|
||
MOVE C,TOCMBF(I) ;get pointer to command buffer
|
||
PUSHJ P,TYIDA2 ;send command and set TT to arg
|
||
MOVEI A,4 ;4 ms padding per operation
|
||
JRST TYDAPD ;send the padding
|
||
|
||
TYIDA2: MOVEI E,33 ;send esc
|
||
IDPB E,C
|
||
MOVEI E,"[ ;send [
|
||
IDPB E,C
|
||
MOVE E,B ;SNDNUM takes arg in E
|
||
MOVE D,A ;and bashes A
|
||
MOVE TT,B ;and B - so save 'em
|
||
SOS E ;SNDNUM also adds 1 to its arg.
|
||
PUSHJ P,SNDNUM ;send arg
|
||
IDPB D,C ;send command char, which is now in D
|
||
POPJ P,
|
||
|
||
;TYDAPD sets up the end of TOCMBF to include a null and the amount of
|
||
;padding needed, and then jumps to TYEEO2. TT contains a number that
|
||
;is multiplied by the contents of A to get the number of ms of padding
|
||
;desired. TT usually has the number of inserts or deletes in it, and
|
||
;A usually has the pad factor.
|
||
TYDAPD: MOVEI D,0 ;put a null at end
|
||
IDPB D,C ;now do padding - set up for TYEEO2
|
||
HLRZ D,C ;did we just deposit in the lowest
|
||
CAIN D,010700 ;byte in this word?
|
||
JRST [ HRRZ D,C ;yes, put a 1 in the next
|
||
AOS D
|
||
MOVEI E,1
|
||
MOVEM E,@D
|
||
JRST .+2 ]
|
||
JRST [ HRRZ D,C ;turn on the low bit in this one
|
||
MOVEI E,1
|
||
IORM E,@D
|
||
JRST .+1 ]
|
||
AOS D
|
||
IMUL TT,A ;ms padding = TT * A
|
||
MOVEM TT,@D ;TT usually has arg to command
|
||
MOVE A,TOCMBF(I) ;pointer to beginning of buffer
|
||
JRST TYEEO2 ;goes in A, where TYEEO2 wants it
|
||
|
||
;HANDLE TURN-ON-MOTOR COMMAND.
|
||
TYEMTN: CAIE W,%TNTRM
|
||
JRST TYEEO1 ;NO-OP EXCEPT ON TERMINETS
|
||
LDB B,[$TPPLF,,TTYOPT(I)]
|
||
JUMPE B,TYEEO1 ;PADDING CODE 0 => DON'T HACK THE MOTOR.
|
||
HRRZ A,TYMTVT(B)
|
||
LSH A,1
|
||
IDIVI A,5
|
||
MOVNS A
|
||
ADD A,TYEMT1(B) ;CREATE A BP TO A STRING WITH THE RIGHT # OF RUBOUTS.
|
||
JRST TYEEO4
|
||
|
||
;THIS IS AN ASCIZ STRING OF 90. RUBOUTS.
|
||
;SOME FINAL SEGMENT OF IT WILL BE TYPED OUT.
|
||
TYEMT0: REPEAT 90./5, -2
|
||
TYEMT2: ASCIZ /H/
|
||
|
||
TYEMT1: 010700,,TYEMT2-1
|
||
100700,,TYEMT2-1
|
||
170700,,TYEMT2-1
|
||
260700,,TYEMT2-1
|
||
350700,,TYEMT2-1
|
||
|
||
;HANDLE TURN-MOTOR-OFF COMMAND.
|
||
TYEMTF: CAIE W,%TNTRM
|
||
JRST TYEEO1
|
||
LDB B,[$TPPLF,,TTYOPT(I)]
|
||
JUMPE B,TYEEO1
|
||
MOVE A,[440700,,[ASCIZ/J/]]
|
||
JRST TYEEO2
|
||
|
||
;CRLF AND CLEAR EOL.
|
||
TYECRL: SETZM TTYIHP(I)
|
||
AOS B,TTYIVP(I)
|
||
MOVN A,TTYROL(I)
|
||
CAML B,TCMXV(I)
|
||
ADDM A,TTYIVP(I)
|
||
MOVE A,CCROLP(W) ;HOW TO SCROLL THIS KIND OF TTY?
|
||
JRST TYEEO2
|
||
|
||
SUBTTL TABLES OF CURSOR-CONTROL SEQUENCES
|
||
|
||
;Note that a table entry can be (for those tables which are strings):
|
||
; mn,,TABLE - m is lowest pad code in table, n is highest
|
||
; These pad codes from the $TPPCR. The appropriate
|
||
; table entry is selected, indexed by pad code.
|
||
; The table entry should look like 440700,,string.
|
||
; 440700,,string - the string is output. If the low-order
|
||
; bit of the last word in the string is set, the
|
||
; following word contains the number of milliseconds
|
||
; of padding required. (max is 200 ms at 9600 baud,
|
||
; see TYMPAD), or if this word is SETZ, a special kludge
|
||
; for Tektronix screen-clear is invoked.
|
||
; A negative number is the number of 1/8 msec of padding
|
||
; per line below the cursor. Note carefully that is in
|
||
; 1/8 msec units!
|
||
; 0 - output nothing
|
||
;
|
||
; (for those tables which are characters):
|
||
; "ch - output the character
|
||
; SETZ "ch - output esc (033) followed by the character
|
||
|
||
;DATAPOINT CURSOR CONTROL CHARACTERS
|
||
%DPFS==30 ;30 => FORWARD SPACE
|
||
;31 => (NON-EXISTANT)
|
||
%DPUP==32 ;32 => MOVE UP
|
||
;33 => (NON-EXISTANT)
|
||
%DPHD==34 ;34 => HOME DOWN (DOESN'T WORK ON OLD DATAPOINTS ABOVE 300 BAUD)
|
||
%DPHU==35 ;35 => HOME UP
|
||
;36 => CLEAR EOL
|
||
;37 => CLEAR EOF
|
||
%DPBS==10 ;BACKSPACE
|
||
%DPDN==12 ;LINEFEED.
|
||
|
||
CCDPSO: 0 ;PRT ;LH DIRECT POSITIONING CHAR, RH INDEX INTO CCDPSM
|
||
0 ;DPT ;4.9 ESC BEFORE CHAR, 4.8 HORIZONTAL THEN VERTICAL
|
||
0 ;LSR
|
||
200016,,0 ;IMLAC
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
400131,,2 ;ESC
|
||
200014,,1 ;DTM
|
||
400131,,2 ;RAY
|
||
400141,,2 ;HDS
|
||
0 ;H19's have their own routine
|
||
0 ;AAA's have their own routine
|
||
IFN .-CCDPSO-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCDPSO
|
||
|
||
;INSTRUCTION TO MUNG B TO CONVERT TO TERMINAL'S COORDINATE SYSTEM
|
||
CCDPSM: ADDI B,1 ;IMLAC
|
||
XORI B,140 ;DATAMEDIA
|
||
ADDI B,40 ;VT52, TELERAY, CONCEPT-100, ETC.
|
||
|
||
CCFS: 40 ;FORWARD-SPACE CHARACTER, 4.9 => IT NEEDS AN ESC IN FRONT OF IT
|
||
%DPFS ;DPT
|
||
%DPFS ;LSR
|
||
^Y ;IMLAC
|
||
40 ;TEK
|
||
0 ;TV
|
||
40 ;MEM
|
||
0 ;SFW
|
||
40 ;TRM
|
||
SETZ "C ;ESC
|
||
34 ;DTM
|
||
SETZ "C ;RAY
|
||
SETZ "= ;HDS
|
||
SETZ "C ;H19
|
||
;the AAA entry looks strange here, but it's the right thing. TYEFS
|
||
;checks for AAA's specially, and AAA's don't use TYMDP.
|
||
440700,,[.BYTE 7 ? 33 ? "[ ? "C ] ;AAA
|
||
IFN .-CCFS-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCFS
|
||
|
||
CCUP: 0 ;LINE-STARVE CHARACTER, - => IT NEEDS AN ESC IN FRONT OF IT
|
||
%DPUP ;DPT
|
||
%DPUP ;LSR
|
||
0 ;IMLAC
|
||
13 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
SETZ "A ;ESC
|
||
32 ;DTM
|
||
SETZ "A ;RAY
|
||
SETZ "; ;HDS
|
||
SETZ "A ;H19
|
||
0 ;AAA
|
||
;this entry isn't here because this is a stupid word table instead
|
||
;of a winning string table.
|
||
; 440700,,[.BYTE 7 ? 33 ? "[ ? "A ] ;AAA
|
||
IFN .-CCUP-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCUP
|
||
|
||
CCHUP: 0 ;HOME-UP SEQUENCE POINTER
|
||
440700,,[.BYTE 7 ? %DPHU] ;DPT
|
||
440700,,[.BYTE 7 ? %DPHU ? %DPHU ? %DPHU] ;LSR
|
||
0 ;IMLAC
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
440700,,[.BYTE 7 ? 33 ? "H] ;ESC
|
||
440700,,[.BYTE 7 ? 2] ;DTM
|
||
440700,,[.BYTE 7 ? 33 ? "H] ;RAY
|
||
440700,,[.BYTE 7 ? 33 ? "?] ;HDS
|
||
440700,,[.BYTE 7 ? 33 ? "H] ;H19
|
||
440700,,[.BYTE 7 ? 33 ? "[ ? "H] ;AAA
|
||
IFN .-CCHUP-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCHUP
|
||
|
||
CCHDP: 440700,,CCHD
|
||
CCHD: 34_29.+177_22.+177_15.+177_8
|
||
|
||
CCEOLP: 0 ;PRT
|
||
440700,,[.BYTE 7 ? 36 ? 177 ? 177 ? 177] ;DPT
|
||
440700,,[.BYTE 7 ? 36 ? 36 ? 36 ? 36] ;LSR
|
||
440700,,[.BYTE 7 ? ^Q] ;IMLAC
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
440700,,[.BYTE 7 ? 33 ? "K] ;ESC
|
||
440700,,[.BYTE 7 ? 27] ;DTM
|
||
440700,,[.BYTE 7 ? 33 ? "K] ;RAY
|
||
01,,[ 440700,,[<.BYTE 7 ? 33 ? 23>+1 ? 8.] ;HDS 300/1200
|
||
440700,,[<.BYTE 7 ? 33 ? 23>+1 ? 16.] ] ;HDS 9600
|
||
440700,,[.BYTE 7 ? 33 ? "K] ;H19
|
||
440700,,[.BYTE 7 ? 33 ? "[ ? "K] ;AAA
|
||
IFN .-CCEOLP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDEOL
|
||
|
||
CCEOFP: 0 ;PRT
|
||
440700,,[.BYTE 7 ? 37 ? 177 ? 177 ? 177] ;DPT
|
||
440700,,[.BYTE 7 ? 37 ? 37 ? 37 ? 37 ? 37 ? 0] ;LSR
|
||
440700,,[.BYTE 7 ? ^P] ;IMLAC
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
440700,,[.BYTE 7 ? 33 ? "J] ;ESC
|
||
440700,,[.BYTE 7 ? 27] ;DTM (CAN'T CLEAR TO EOF, SO CLEAR TO EOL)
|
||
440700,,[<.BYTE 7 ? 33 ? "J>+1 ? 90.] ;RAY
|
||
;HDS PAD CODES ARE 0 1200 OR LESS, 1 9600 OR MORE
|
||
; AT 9600 OR ABOVE, USE ERASE EOL INSTEAD OF ERASE EOS
|
||
01,,[ ; DUE TO INABILITY TO SEND 340 (!!) MILLISECONDS OF PADDING
|
||
440700,,[<.BYTE 7 ? 33 ? 3>+1 ? 170.] ;HDS 300/1200
|
||
440700,,[<.BYTE 7 ? 33 ? 23>+1 ? 16.] ] ;HDS 9600
|
||
440700,,[.BYTE 7 ? 33 ? "J] ;H19
|
||
440700,,[<.BYTE 7 ? 33 ? "[ ? "J>+1 ? 5.] ;AAA 5 ms padding
|
||
IFN .-CCEOFP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDEOF
|
||
|
||
CCDLFP: 0 ;PRT
|
||
440700,,[.BYTE 7 ? 31] ;(DPT) FOR BENEFIT OF GT40
|
||
0 ;LSR
|
||
440700,,[.BYTE 7 ? ^X] ;IMLAC
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
0 ;ESC
|
||
0 ;DTM
|
||
0 ;RAY
|
||
0 ;HDS
|
||
0 ;H19
|
||
0 ;AAA
|
||
IFN .-CCDLFP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDDLF
|
||
|
||
CCROLP: 0 ;PRT
|
||
25,,CCCRLP ;DPT
|
||
25,,CCCRL1 ;LSR
|
||
440700,,[.BYTE 7 ? ^M ? ^K ? ^Q] ;IMLAC
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "K] ;ESC
|
||
440700,,[.BYTE 7 ? ^M ? ^J ? 27] ;DTM
|
||
;NOTE: REAL DATAMEDIAS IGNORE THE ^J BUT IMITATION ONES MIGHT NOT
|
||
440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "K] ;RAY
|
||
440700,,[<.BYTE 7 ? ^M ? ^J ? 33 ? 23>+1 ? 16.] ;HDS
|
||
440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "K] ;H19
|
||
440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "[ ? "K ? 0] ;AAA
|
||
IFN .-CCROLP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDCRL
|
||
|
||
;CRLF ON DATAPOINTS, DEPENDING ON LOSER-NESS AND SPEED.
|
||
CCCRLP: 440700,,[.BYTE 7 ? ^M ? ^J ? 36]
|
||
440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 36]
|
||
REPEAT 2,440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 177 ? 36]
|
||
|
||
CCCRL1: 440700,,[.BYTE 7 ? ^M ? ^J ? 36 ? 36 ? 36 ? 36]
|
||
440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 36 ? 36 ? 36 ? 36]
|
||
REPEAT 2,440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 177 ? 36 ? 36 ? 36 ? 36 ? 0]
|
||
|
||
CCCLRP: 0 ;CLEAR THE SCREEN SEQUENCE POINTER
|
||
440700,,[.BYTE 7 ? %DPHU ? 37 ? 177 ? 177 ? 177 ? 0] ;DPT
|
||
440700,,[.BYTE 7 ? %DPHU ? %DPHU ? %DPHU ? 37 ? 37 ? 37 ? 37 ? 37 ? 0] ;LSR
|
||
440700,,[.BYTE 7 ? ^L] ;IMLAC
|
||
440700,,[<.BYTE 7 ? 33 ? 14>+1 ? SETZ] .SEE TYPBP ;TEKTRONIX
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
440700,,[.BYTE 7 ? 33 ? "H ? 33 ? "J ? 0] ;ESC
|
||
34,,[440700,,[.BYTE 7 ? 36] ;DTM
|
||
440700,,[.BYTE 7 ? 36 ? 36]]
|
||
440700,,[<.BYTE 7 ? 33 ? "j>+1 ? 90.] ;RAY
|
||
440700,,[<.BYTE 7 ? 14>+1 ? 48.] ;HDS (RIGHT FOR 9600 BAUD, NEED HALF AS MUCH AT 300)
|
||
440700,,[.BYTE 7 ? 33 ? "H ? 33 ? "J ? 0] ;H19
|
||
440700,,[<.BYTE 7 ? 33 ? "[ ? "H ? 33 ? "[ >
|
||
<.BYTE 7 ? "J>+1 ? 5.] ;AAA needs 5 ms padding
|
||
|
||
IFN .-CCCLRP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDCLR
|
||
|
||
CCILPP: 0 ;PRT
|
||
0 ;DPT
|
||
0 ;LSR
|
||
0 ;IML
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
01,,[ ;ESC padding mainly based on H19 - CBF
|
||
440700,,[<.BYTE 7 ? 33 ? "L>] ; no padding at all at 1200 baud
|
||
440700,,[<.BYTE 7 ? 33 ? "L>+1 ? -6.]] ; .75 ms/line at higher
|
||
04,,[440700,,[.BYTE 7 ? ^P ? ^J ? ^X ? 0] ;DTM
|
||
440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 3,[177 ? ] ^X ? 0]
|
||
440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 5,[177 ? ] ? ^X ? 0]
|
||
440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 10.,[177 ? ] ^X ? 0]
|
||
440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 20.,[177 ? ] ^X ? 0]]
|
||
440700,,[<.BYTE 7 ? 33 ? "L>+1 ? -20.] ;RAY (2.5ms/line)
|
||
01,,[
|
||
440700,,[<.BYTE 7 ? 33 ? ^R>+1 ? -14.] ;HDS AT 300/1200 (1.75ms/line)
|
||
440700,,[<.byte 7 ? 33 ? ^R>+1 ? -3.*8]] ;HDS AT 9600 (3ms/line)
|
||
["L ? 01,,[ ;H19's use this table differently
|
||
440700,,[<.BYTE 7 ? 33 ? "L>] ; no padding at all at 1200 baud
|
||
440700,,[<.BYTE 7 ? 33 ? "L>+1 ? -6.]]] ; .75 ms/line at higher
|
||
"L ;AAA (AAA's use this table differently)
|
||
|
||
IFN .-CCILPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDILP
|
||
|
||
CCDLPP: 0 ;PRT
|
||
0 ;DPT
|
||
0 ;LSR
|
||
0 ;IML
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
01,,[ ;ESC padding mainly based on H19 - CBF
|
||
440700,,[<.BYTE 7 ? 33 ? "M>] ; no padding at all at 1200 baud
|
||
440700,,[<.BYTE 7 ? 33 ? "M>+1 ? -6.]] ; .75 ms/line at higher
|
||
34,,[440700,,[.BYTE 7 ? ^P ? ^Z ? ^X] ;DTM
|
||
440700,,[.BYTE 7 ? ^P ? ^Z ? 177 ? ^X]]
|
||
440700,,[<.BYTE 7 ? 33 ? "M>+1 ? -20.] ;RAY (2.5ms/line)
|
||
01,,[
|
||
440700,,[<.BYTE 7 ? 33 ? ^B>+1 ? -14.] ;HDS AT 300/1200 (1.75ms/line)
|
||
440700,,[<.byte 7 ? 33 ? ^B>+1 ? -3.*8.]] ;HDS AT 9600 (3ms/line)
|
||
["M ? 01,,[ ;H19's use this table differently
|
||
440700,,[<.BYTE 7 ? 33 ? "M>] ; no padding at all at 1200 baud
|
||
440700,,[<.BYTE 7 ? 33 ? "M>+1 ? -6.]]] ; .75 ms/line at higher
|
||
"M ;AAA (AAA's use this table differently)
|
||
IFN .-CCDLPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDDLP
|
||
|
||
CCICPP: 0 ;PRT
|
||
0 ;DPT
|
||
0 ;LSR
|
||
0 ;IML
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
440700,,[.BYTE 7 ? 33 ? "Q ? 40 ? 10 ? 33 ? "R] ;ESC
|
||
34,,[440700,,[.BYTE 7 ? ^P ? ^\ ? ^X] ;DTM
|
||
440700,,[.BYTE 7 ? ^P ? 40 ? 177 ? ^X ? ^H ? 40 ? ^H ? 0]]
|
||
440700,,[.BYTE 7 ? 33 ? "P] ;RAY
|
||
; The HDS requires a null in its insert char sequence so we
|
||
; resort to non 7 bit char so the typeout loop won't think its
|
||
; the end of an ASCIZ string.
|
||
01,,[ ;HDS
|
||
441100,,[<.byte 9 ? 33 ? 20 ? 40 ? 10 > ?
|
||
<.byte 9 ? 33 ? 400 >] ; no padding 1200 or under
|
||
441100,,[<.byte 9 ? 33 ? 20 ? 40 ? 10 > ?
|
||
<.byte 9 ? 33 ? 400 >+1 ? 16.]] ; 16 ms per insert >1200
|
||
440700,,[.BYTE 7 ? 33 ? "@ ? 40 ? 10 ? 33 ? "O] ;H19
|
||
"@ ;AAA's use this table differently
|
||
IFN .-CCICPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDICP
|
||
|
||
CCDCPP: 0 ;PRT
|
||
0 ;DPT
|
||
0 ;LSR
|
||
0 ;IML
|
||
0 ;TEK
|
||
0 ;TV
|
||
0 ;MEM
|
||
0 ;SFW
|
||
0 ;TRM
|
||
440700,,[.BYTE 7 ? 33 ? "P] ;ESC
|
||
34,,[440700,,[.BYTE 7 ? ^P ? ^H ? ^X] ;DTM
|
||
440700,,[.BYTE 7 ? ^P ? ^H ? 177 ? ^X]]
|
||
440700,,[.BYTE 7 ? 33 ? "Q] ;RAY
|
||
01,,[ ;HDS
|
||
440700,,[.byte 7 ? 33 ? 21] ; no padding 1200 or under
|
||
440700,,[<.byte 7 ? 33 ? 21>+1 ? 16.]] ; 16 ms per del at >1200
|
||
["P ? 440700,,[.BYTE 7 ? 33 ? "N]] ;H19's also use this table differently
|
||
"P ;AAA's use this table differently
|
||
IFN .-CCDCPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDDCP
|
||
|
||
CCBOWP:
|
||
REPEAT %TNDTM,0
|
||
440700,,[.BYTE 7 ? 16] ;DTM
|
||
0 ;RAY
|
||
440700,,[.BYTE 7 ? 33 ? "D] ;HDS
|
||
440700,,[.BYTE 7 ? 33 ? "p] ;H19
|
||
440700,,[.BYTE 7 ? 33 ? "[ ? "7 ? "m] ;AAA
|
||
IFN .-CCBOWP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDBOW
|
||
|
||
CCRSTP:
|
||
REPEAT %TNESC,0
|
||
440700,,[.BYTE 7 ? 33 ? "G] ;VT52, ETC.
|
||
440700,,[.BYTE 7 ? 30] ;DTM
|
||
0 ;RAY
|
||
440700,,[.BYTE 7 ? 33 ? "d] ;HDS
|
||
440700,,[.BYTE 7 ? 33 ? "q] ;H19
|
||
440700,,[.BYTE 7 ? 33 ? "[ ? "m] ;AAA - this is not RIS,
|
||
;which could screw you over if your default state were a bad one. It's
|
||
;just SGR 0.
|
||
IFN .-CCRSTP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDRST
|
||
|
||
CCINIP: ;initialize an intelligent terminal
|
||
REPEAT %TNESC,0
|
||
440700,,[.BYTE 7 ? 33 ? "G] ;VT52, ETC.
|
||
440700,,[.BYTE 7 ? 30] ;DTM
|
||
0 ;RAY
|
||
440700,,[.BYTE 7 ? 33 ? "d] ;HDS
|
||
440700,,[.BYTE 7 ? 33 ? "q] ;H19
|
||
;all sorts of ways the AAA can be messed up. We fix just a few.
|
||
440700,,[ASCII "[4;18;20l[6;12h[1Q[>27;29;30;33;34;35;37;40;46;51l[>52h[H["
|
||
<ASCIZ "J">+1 ? 5.] ;First line must be multiple of 5 chars!
|
||
;does: turn off insert char, LF is LF, CR is CR, no destructive BS, no
|
||
;wrap forward, no wrap backward, no AUTO XON/XOFF, no half-duplex, no
|
||
;auto kbd disable(!), no alternate cursor mode. Let us clear entire
|
||
;screen, enable sending to host, turn off delete display, turn on META
|
||
;key. Finally, clears the screen, about 5 ms padding.
|
||
IFN .-CCINIP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDINI
|
||
|
||
|
||
SUBTTL TTY CONTROL TABLES
|
||
|
||
;TOTAL NUMBER OF TTYS
|
||
NCT==NOTYS+NKSTYS+NETYS+NNTYS+NNVTTS+NDZTYS+NDPTYS+NMTYS+NDLTYS+NSTTYS+N11TYS
|
||
|
||
IFGE NCT-%TINON, .ERR EXCESSIVE NUMBER OF TTYS
|
||
|
||
IFG NOTYS-1, .ERR MORE THAN ONE KA-10 CONSOLE TTY?
|
||
IFG NKSTYS-1, .ERR MORE THAN ONE KS-10 CONSOLE TTY?
|
||
|
||
NFKSTY==NOTYS ;# OF FIRST KS-10 (BETTER BE ONLY) 8080 CONSOLE TTY
|
||
NFETY==NFKSTY+NKSTYS ;# OF FIRST DTE20 TTY
|
||
NFNTY==NFETY+NETYS ;# OF FIRST TK-10 TTY
|
||
NFNVTY==NFNTY+NNTYS ;# OF FIRST NOVA TTY
|
||
NFDZTY==NFNVTY+NNVTTS ;# OF FIRST DZ11 TTY.
|
||
; Terminals above this line have slow (char at a time) controllers
|
||
; below they have fast controllers. (Check TYPDA1: and TTYDO:)
|
||
NFDPTY==NFDZTY+NDZTYS ;# OF FIRST DATAPOINT LINE
|
||
NFMTY==NFDPTY+NDPTYS ;# OF FIRST MORTON TTY
|
||
NFDLTY==NFMTY+NMTYS ;# OF FIRST DL10 TTY.
|
||
NFSTTY==NFDLTY+NDLTYS ;# OF FIRST PSEUDO-TTY
|
||
NF11TY==NFSTTY+NSTTYS ;# OF FIRST PDP11-TV TTY.
|
||
|
||
IFG NKSTYS, IFN NFKSTY, .ERR KS-10 CONSOLE TTY NOT ZERO?
|
||
IFG NETYS, IFN NFETY, .ERR FIRST DTE20 TTY NOT ZERO?
|
||
|
||
;INSTRUCTION TO OUTPUT 1 CHAR TO A CHAR-AT-A-TIME CONTROLLER.
|
||
;INSNS NEED NOT EXIST FOR FAST CONTROLLERS.
|
||
TTYDO: REPEAT NOTYS,DATAO TTY,A
|
||
REPEAT NKSTYS, PUSHJ P,TTKSDO
|
||
REPEAT NETYS,JFCL
|
||
REPEAT NNTYS,DATAO NTY,A
|
||
REPEAT NNVTTS,PUSHJ P,TTNDO
|
||
REPEAT NDZTYS,PUSHJ P,TTDZDO
|
||
|
||
IFN NKSTYS,[
|
||
TTKSDO: ANDI A,177 ; Be sure it is ASCII
|
||
TRO A,400 ; Tell 8080 there is something there.
|
||
MOVEM A,8CTYOT ; Here is where it looks.
|
||
CONO 80INT\APRCHN ; Wake up!
|
||
POPJ P,
|
||
] ;NKSTYS
|
||
|
||
IFN NDZTYS,[ ;DZ-11 Code
|
||
TTDZDO: PUSH P,C
|
||
ANDI A,177 ;Be sure it is ASCII, and no break bits set
|
||
HRRZ C,TTYLT(I) ;Unibus address
|
||
IOWRBI A,%DZRTD(C) ;Send it
|
||
POP P,C
|
||
POPJ P,
|
||
] ;NDZTYS
|
||
|
||
IFN NNVTTS,[
|
||
TTNDO: ANDI A,177
|
||
CAME I,NVOPTT
|
||
JRST TTNDO1
|
||
AOS NVTCC
|
||
DATAO NTY,A
|
||
POPJ P,
|
||
|
||
TTNDO1: MOVEM I,NVOPTT ;MUST SELECT NEW CONSOLE
|
||
SETOM NVTSIP ;SIGNAL
|
||
MOVEM A,NVTSSC ;SAVE CHR
|
||
PUSH P,I
|
||
SUBI I,NFNVTY-1
|
||
TRO I,200
|
||
DATAO NTY,I
|
||
CLEARM NVTCC
|
||
POP P,I
|
||
POPJ P,
|
||
]
|
||
|
||
;INSTRUCTION TO TELL A TTY'S CONTROLLER TO STOP INTERRUPTING FOR IT.
|
||
;(BECAUSE THERE IS NO OUTPUT TO BE SENT)
|
||
TTYDFF: REPEAT NOTYS,CONO TTY,200+TTYCHN
|
||
REPEAT NKSTYS, JFCL
|
||
REPEAT NETYS,JFCL
|
||
REPEAT NNTYS,CONO NTY,20+TTYCHN
|
||
REPEAT NNVTTS,JRST TYP5
|
||
REPEAT NDZTYS,PUSHJ P,DZTYDF
|
||
REPEAT NDPTYS,CONO DPK,.RPCNT_12.+400+TTYCHN
|
||
REPEAT NMTYS,CONO MTY,.RPCNT_12.+200+TTYCHN
|
||
REPEAT NDLTYS,JFCL
|
||
REPEAT NSTTYS,JFCL
|
||
|
||
;LINE-SPECIFIC INFORMATION
|
||
TTYLT: REPEAT NOTYS,500000+TTYCHN
|
||
REPEAT NKSTYS, 0
|
||
REPEAT NETYS,0
|
||
REPEAT NNTYS,.RPCNT_12.+400000+TTYCHN
|
||
REPEAT NNVTTS,0
|
||
REPEAT NDZTYS, <.RPCNT&DZLNM>,,<CONC DZ,\<.RPCNT_-DZLNLN>,BA>
|
||
REPEAT NDPTYS,0
|
||
REPEAT NMTYS,.RPCNT_12.+TTYCHN
|
||
|
||
;INSN TO EXECUTE TO SIGNAL THAT OUTPUT IS AVAILABLE ON A PREVIOUSLY
|
||
;IDLE TTY - TELLS THE CONTROLLER TO CAUSE AN "OUTPUT DONE" INTERRUPT.
|
||
TTYST: REPEAT NOTYS,CONO TTY,10+TTYCHN
|
||
REPEAT NKSTYS, CONO 10020\APRCHN
|
||
REPEAT NETYS,PUSHJ P,TTYSTE
|
||
REPEAT NNTYS,PUSHJ P,NTYST
|
||
REPEAT NNVTTS,PUSHJ P,NVTYST
|
||
REPEAT NDZTYS,PUSHJ P,DZTYST
|
||
REPEAT NDPTYS,CONO DPK,.RPCNT_12.+100+TTYCHN
|
||
REPEAT NMTYS,CONO MTY,.RPCNT_12.+10+TTYCHN
|
||
REPEAT NDLTYS,PUSHJ P,TTYSTD
|
||
REPEAT NSTTYS,PUSHJ P,TTYPT
|
||
REPEAT N11TYS,JFCL
|
||
|
||
IFN DZ11P,[ ;DZ-11 Code
|
||
; Disable transmitter ready interrupts from this line
|
||
DZTYDF: PUSH P,[ANDCM B,DZLBIT(A)] ;Clear this line's bit
|
||
JRST DZTYDS
|
||
|
||
; Enable transmitter ready interrupts from this line
|
||
DZTYST: PUSH P,[IOR B,DZLBIT(A)] ;Set this line's bit
|
||
DZTYDS: PUSH P,A
|
||
PUSH P,B
|
||
PUSH P,C
|
||
HRRZ C,TTYLT(I) ;Unibus address
|
||
HLRZ A,TTYLT(I) ;Line number
|
||
IORDBI B,%DZRTC(C)
|
||
XCT -3(P) ;Frob bit
|
||
IOWRBI B,%DZRTC(C) ;Write new state
|
||
POP P,C
|
||
POP P,B
|
||
POP P,A
|
||
SUB P,[1,,1]
|
||
POPJ P,
|
||
|
||
; DZ11 initialization.
|
||
; No parity, character length = 8 bits, stop-code = 1 bit.
|
||
DZINIT: MOVEI C,NDZTYS-1 ;Relative last DZ TTY
|
||
SKIPGE C ;Don't do anything if there aren't any
|
||
POPJ P,
|
||
DZINI1: LDB A,[$TTOSP,,NFDZTY+TTYTYP(C)] ;Ospeed (assume it is = Ispeed)
|
||
HLRZ D,NFDZTY+TTYLT(C) ; Line number on board.
|
||
HRRZ B,NFDZTY+TTYLT(C) ; Bus address of controller.
|
||
SOSL A ;Is speed = 0?
|
||
CAILE A,10 ;Is speed > 9600?
|
||
BUG HALT,[BAD SPEED CODE FOR DZ-11. LINE],OCT,C
|
||
LSH A,32. ;Assemble byte pointer
|
||
IOR A,[400,,[.BYTE 4 ? 16 ? 14 ? 12 ? 10 ? 7 ? 5 ? 4 ? 2 ? 6]]
|
||
LDB A,A ;Obtain DZ11 speed code
|
||
LSH A,%DZLSS ;Assemble LPR code
|
||
IORI A,%DZLRO+3*%DZLCL(D) ;Line # to write and various bits
|
||
XCTRI [IOWRI A,%DZRLP(B)] ;Initialize this line
|
||
CAIA
|
||
BUG HALT,[DZ11 NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS). LINE],OCT,C
|
||
SOJGE C,DZINI1 ;Loop over all DZ TTYs.
|
||
|
||
IFN <NDZTYS&DZLNM>,[
|
||
MOVEI C,<NDZTYS&DZLNM> ;First unused line on last used board
|
||
DZINI2: IOWRI C,%DZRLP+<CONC DZ,\<NDZTYS_-DZLNLN>,BA> ; Disable line
|
||
CAIGE C,DZNLN-1 ;Only disable lines on last used board
|
||
AOJA C,DZINI2 ;Loop
|
||
]
|
||
MOVEI C,%DZCTE+%DZCRE+%DZCSE+%DZCMS ;Turn board on
|
||
MOVEI D,377_8 ; Set all DTR bits, clear enable bits
|
||
REPEAT <<NDZTYS+DZNLN-1>_-DZLNLN>,[
|
||
IOWRI C,%DZRCS+<CONC DZ,\.RPCNT,BA>
|
||
IOWRI D,%DZRTC+<CONC DZ,\.RPCNT,BA>
|
||
]
|
||
POPJ P,
|
||
|
||
;CALLED AT CLOCK LEVEL TO EMPTY DZ INPUT SILOS TO TTY CODE
|
||
; What you really want to do is measure the average interrupt rate of
|
||
; each DZ and use this scanning approach only when the DZ is heavily
|
||
; active. What fun.
|
||
DZSCAN: CONO PI,TTYOFF-1 ;No TTY or lower ints, leave clock on
|
||
PUSH P,I ;Just in case
|
||
REPEAT <<NDZTYS+DZNLN-1>_-DZLNLN>,[
|
||
IORDI A,%DZRCS+<CONC DZ,\.RPCNT,BA>
|
||
TRNN A,%DZCRD ;Character in silo?
|
||
JRST CONC DZS,\.RPCNT,EN
|
||
CONC DZS,\.RPCNT,LP:
|
||
IORDI A,%DZRDR+<CONC DZ,\.RPCNT,BA> ;Get character from silo
|
||
TRNN A,%DZDDV ;Valid character?
|
||
JRST CONC DZS,\.RPCNT,EN ;Nope, done with this DZ
|
||
;Check parity?
|
||
LDB I,[.BP %DZLM,A] ;Get line # on DZ
|
||
ADDI I,<DZNLN*.RPCNT>+NFDZTY
|
||
CAIL I,NFDZTY+NDZTYS
|
||
BUG
|
||
PUSHJ P,NTYI1 ;Send char to TTY code
|
||
JRST CONC DZS,\.RPCNT,LP
|
||
CONC DZS,\.RPCNT,EN:
|
||
]
|
||
POP P,I
|
||
CONO PI,TTYON-1 ;Turn ints back on
|
||
POPJ P,
|
||
];DZ11P
|
||
|
||
IFN TK10P,[
|
||
NTYST: PUSH P,C ;START A TK10 TTY
|
||
CONI PI,C
|
||
ANDI C,177 ;SAVE WHICH PI CHANNELS ARE ON
|
||
CONO PI,TTYOFF
|
||
CONO NTY,@TTYLT(I)
|
||
CONO NTY,10+TTYCHN
|
||
CONO PI,2000(C) ;RESTORE PI STATUS
|
||
POP P,C
|
||
POPJ P,
|
||
]
|
||
|
||
IFN NNVTTS,[
|
||
NVTYST: PUSH P,I
|
||
SKIPL I,NOVATT
|
||
PUSHJ P,NTYST
|
||
POP P,I
|
||
POPJ P,
|
||
]
|
||
|
||
TTYPT: PUSH P,B ;TTYST ROUTINE FOR STY TTYS.
|
||
PUSH P,C
|
||
MOVE B,STYSTS-NFSTTY(I) ;USER
|
||
IFN NETP,[
|
||
TLNE B,%SSNET
|
||
JRST TTYPT2
|
||
TTYPT3:
|
||
];NETP
|
||
MOVE C,STYMSK-NFSTTY(I) ;CHANNELS OPEN MASK
|
||
AND C,MSKST2(B)
|
||
JUMPE C,POPCBJ ;JUMP IF INTS NOT ENABLED
|
||
MOVN B,C
|
||
AND C,B
|
||
MOVE B,STYSTS-NFSTTY(I)
|
||
IORM C,IFPIR(B)
|
||
JRST POPCBJ
|
||
|
||
IFN NETP,[ ;START STY THAT'S DIRECT CONNECTED TO NETWORK
|
||
TTYPT2: CONI PI,C
|
||
ANDI C,177 ;SAVE WHICH PI CHANNELS ARE ON
|
||
CONO PI,NETOFF
|
||
MOVSI B,%SSNET
|
||
TDNN B,STYSTS-NFSTTY(I)
|
||
JRST [ CONO PI,2000(C) ? JRST TTYPT3 ]
|
||
SKIPL STYNTL-NFSTTY(I)
|
||
JRST TTYPT4 ;ALREADY ON ACTIVATE LIST
|
||
MOVE B,STYNTA
|
||
MOVEM B,STYNTL-NFSTTY(I)
|
||
MOVEM I,STYNTA
|
||
TTYPT4: CONO PI,2000(C) ;RESTORE PI STATUS
|
||
JRST POPCBJ
|
||
];NETP
|
||
|
||
IFN NETYS,[
|
||
TTYSTE: CONO PI,400 ;PI OFF
|
||
SKIPL DTEOST
|
||
JRST TYSTE1
|
||
HRRZM I,DTEOST ;TELL 11 TO SET OUTPUT DONE
|
||
CONO PI,200 ;PI ON
|
||
CONO DTE,%DBL11 ;INTERRUPT 11
|
||
POPJ P,
|
||
|
||
TYSTE1: CONO PI,200 ;PI ON
|
||
CONO DTE,%DBL11 ;INTERRUPT 11
|
||
AOS DTEHC ;COUNT NUMBER OF TIMES HAD TO WAIT
|
||
SKIPL DTEOST ;THERE'S NO WAY TO AVOID HAVING TO WAIT ONE PLACE
|
||
JRST .-2 ; OR ANOTHER. THE -11 TRIES TO PICK UP OUTPUT-DONE FAST.
|
||
JRST TTYSTE
|
||
];NETYS
|
||
|
||
IFN DL10P,[
|
||
TTYSTD: SKIPN DL10F
|
||
JRST TYPEN1
|
||
CONO PI,400 ;PI OFF
|
||
SKIPE DL10SO
|
||
JRST TTYSD1
|
||
HRRZM I,DL10SO ;TELL 11 TO SET OUTPUT DONE
|
||
CONO PI,200 ;PI ON
|
||
CONO DLC,100040+TTYCHN ;INTERRUPT 11
|
||
POPJ P,
|
||
|
||
TTYSD1: CONO PI,200 ;PI ON
|
||
CONO DLC,100040+TTYCHN ;INTERRUPT 11
|
||
AOS DL10HC ;COUNT NUMBER OF TIMES HAD TO WAIT
|
||
SKIPE DL10SO ;THERE'S NO WAY TO AVOID HAVING TO WAIT ONE PLACE
|
||
JRST .-2 ;OR ANOTHER. THE -11 TRIES TO PICK UP OUTPUT-DONE FAST.
|
||
JRST TTYSTD
|
||
]
|
||
|
||
EBLK
|
||
|
||
DEFINE TTYREP WRD
|
||
.CRFOFF
|
||
REPEAT NCT,CONC T,\.RPCNT,$!WRD
|
||
.CRFON
|
||
TERMIN
|
||
|
||
IFNDEF TIBL,TIBL==41
|
||
IFNDEF TOBL,TOBL==101
|
||
TIBS==TIBL*2-1
|
||
TOBS==TOBL*4
|
||
|
||
IFNDEF MICBAA,MICBAA==50. ;MAXIMUM NUMBER OF INPUT BUFFER CHARACTERS BEFORE AUTOMATIC ACTIVATION
|
||
|
||
IFNDEF TYOWNC,TYOWNC==20. ;MIN # BYTES OF SPACE THERE MUST BE
|
||
;IN OUTPUT BUFFER BEFORE IT IS OK TO TRY TO OUTPUT ANYTHING.
|
||
|
||
TIB: BLOCK TIBL*NCT ;TTY INPUT BUFFERS (18 BITS PER CHARACTER)
|
||
TOB: BLOCK TOBL*<NCT-N11TYS> ;TTY OUTPUT BUFFERS (8 BITS PER CHARACTER)
|
||
|
||
;INPUT BUFFER BITS:
|
||
%TXMPE==400000 ;MAIN PROGRAM ECHO CHARACTER
|
||
%TXPIE==200000 ;PI ECHO CHARACTER
|
||
%TXCOM==100000 ;COM MODE ECHO CHAR; DO PI ECHO EVEN IF HDX TTY.
|
||
%TXIGN==40000 ;IGNORE THIS CHAR AT .IOT TIME.
|
||
%TXACT==20000 ;THIS IS AN ACTIVATION CHAR.
|
||
%TXINT==10000 ;THIS CHAR SHOULD INTERRUPT THE USER.
|
||
|
||
;NOW COME THE BITS OF THE CHARACTER ITSELF:
|
||
%TXTOP==4000 ;"TOP" KEY.
|
||
%TXECI==2000 ;ECHOED DUE TO ECHOIN SYSTEM CALL
|
||
;%TXSFT==1000 ;"SHIFT" KEY.
|
||
%TXSUP==1000 ;"SUPER" KEY.
|
||
%TXMTA==400 ;"META" KEY.
|
||
%TXCTL==200 ;"CONTROL" KEY.
|
||
%TXASC==177 ;THE ASCII PART OF THE CHARACTER.
|
||
;%TXTOP+CERTAIN LETTERS ARE MAGIC KEYS. %TXTOP+"Z IS DEFERRED CALL.
|
||
|
||
;OUTPUT BUFFER BIT:
|
||
%TXDIS==200 ;1 => THIS IS A %TD CHARACTER.
|
||
IF2 EXPUNGE %TXDIS ;SO %TX BIT TYPEOUT MODE LOOKS NICE.
|
||
|
||
TIIP: REPEAT NCT, (002200)TIB-1+.RPCNT*TIBL+TIBL ;INPUT BUFFER INPUT POINTER
|
||
TIOP: REPEAT NCT, (002200)TIB-1+.RPCNT*TIBL+TIBL ;INPUT BUFFER OUTPUT POINTER
|
||
(002200)TIB-1 .SEE TTEBAK
|
||
TIBEP: REPEAT NCT, (002200)TIB-1+.RPCNT*TIBL+TIBL ;END OF INPUT BUFFER POINTER
|
||
TOIP: REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL ;OUTPUT BUFFER INPUT POINTER
|
||
REPEAT N11TYS,0
|
||
TOOP: REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL ;OUTPUT BUFFER OUTPUT POINTER
|
||
REPEAT N11TYS,0
|
||
TOBEP: REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL+TOBL ;END OF OUTPUT BUFFER POINTER
|
||
REPEAT N11TYS,1
|
||
TOBBP: REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL ;BEG OF OUTPUT BUFFER POINTER
|
||
REPEAT N11TYS,1
|
||
TINTP: REPEAT NCT,2200,,TIB-1+.RPCNT*TIBL+TIBL ;INTERRUPT CHARACTER POINTER
|
||
ECHOC: REPEAT NCT,0 ;COUNT OF ECHO BUF CHARS THAT ARE REALLY ECHO CHARS
|
||
ECHOP: REPEAT NCT,2200,,TIB-1+.RPCNT*TIBL+TIBL ;POINTER TO INPUT CHARACTER TO BE ECHOED NEXT
|
||
TINTC: REPEAT NCT,0 ;COUNT OF CHARACTERS AVAILABLE FOR .ITYIC'ING.
|
||
TICC: REPEAT NCT,0 ;TYPE IN CHARACTER COUNT
|
||
TACC: REPEAT NCT,0 ;ACTIVATION CHARACTER COUNT
|
||
TORM: REPEAT NCT,TOBS ;# CHARS ROOM LEFT IN OUTPUT BUFFER.
|
||
TOCMBF: REPEAT NCT,440700,,TCMBLK+.RPCNT*5 ;5-word string buffer for each
|
||
TCMBLK: BLOCK NCT*5 ;tty for outputting commands that are longer than a few chars.
|
||
|
||
TTYERQ: REPEAT NCT,-1 ;LIST OF TTYS NEEDING ECHO LINKED THRU THESE WDS. (NIL = 200000,,)
|
||
;-1 FOR TTY NOT NEEDING ECHO.
|
||
TYOSW: REPEAT NCT,-1 ;AOSE-STYLE SWITCH FOR MP USE OF TTY.
|
||
TTNTO: REPEAT NCT,0 ;# CHANNELS TTY IS OPEN ON (IN ALL JOBS.)
|
||
TYIMSK: REPEAT NCT,0 ;BIT SET FOR EACH CHANNEL THE TTY IS OPEN FOR
|
||
;INPUT ON IN THE JOB THAT OWNS THE TTY NOW.
|
||
TYOMSK: REPEAT NCT,0 ;SIMILAR, BUT FOR OUTPUT CHANNELS.
|
||
TTYBYP: BLOCK NCT ;NOT 0 => B.P. TO ASCIZ STRING TO OUTPUT AT INT. LVL.
|
||
TTLTM: REPEAT NCT,0 ;TIME LAST CHRWAS REMOVED FROM OUTPUT BUFFER.
|
||
TTYOAC: REPEAT NCT,-1 ;-1 IF TTY OUTPUT INACTIVE
|
||
TTITM: REPEAT NCT,0 ;TIME OF LAST TYPE-IN ON TTY (NOT USED BY SYSTEM).
|
||
TTYLJB: REPEAT NCT,0 ;LAST JOB TO OUTPUT TO THIS TTY. DOES NO HARM IF ABSURD.
|
||
|
||
TTYIPC: REPEAT NCT,[
|
||
IFG APL,IFE APL-.RPCNT, TTYIS5 ;JUST STORE AND EXIT FOR AP LINE.
|
||
.ELSE TTYI ;TTY INPUT PC
|
||
]
|
||
TYBPC: REPEAT NCT,TYBN ;PC OF ^\-HANDLING CO-ROUTINE.
|
||
TTOALC: REPEAT NCT,-1 ;LH IS -1 TO ALLOW M.P. TYPEOUT, OR 0 TO DELAY IT.
|
||
;RH IS OUTPUT ALLOCATION: -1 => INFINITY (THE NORMAL CASE),
|
||
;ELSE # OF CHARS ALLOWED TO BE OUTPUT. ^\ COMMANDS ARE
|
||
;USED BY THE TTY TO ALLOCATE FOR OUTPUT.
|
||
|
||
TCMXV: TTYREP VER ;MAX LINES VERT
|
||
TCMXH: TTYREP HOR ;MAX CHR HORZ
|
||
TTYROL: TTYREP ROL ;# LINES PER GLITCH WHEN SCROLLING.
|
||
TTYIHP: REPEAT NCT,30. ;INT LVL HPOS
|
||
TTYIVP: REPEAT NCT,5 ;INT LVL VPOS
|
||
TTYLPP: REPEAT NCT,<TPLEN*2*.RPCNT>#-1
|
||
;IDX OF PC PPR ASSOCIATED WITH TTY,
|
||
;OR NEGATIVE => NONE NOW ASSOCIATED,
|
||
;AND IS 1'S COMP. OF IDX OF PC PPR
|
||
;FORMERLY ASSOCIATED.
|
||
TTYEPP: REPEAT NCT,<TPLEN*2*.RPCNT> ;IDX OF PC PPR TO USE FOR ECHO.
|
||
TTYLPS: REPEAT NCT,5,,30. ;IF TTYLPP <0, THIS IS MAIN PRGM VPOS,,HPOS.
|
||
|
||
TPBEG: ;BEGINNING OF PC PPR VARS.
|
||
TPHB: ;USE 0 ;HPOS OF LEFT MARGIN.
|
||
TPVB: BLOCK 1 ;VPOS OF TOP MARGIN (1ST LINE OF PC PPR)
|
||
TPHE: ;USE TCMXH ;HPOS OF 1ST COLUMN AFTER RIGHT MARGIN
|
||
TPVE: ;USE TCMXV ;VPOS OF 1ST LINE BELOW BOTTOM MARGIN
|
||
TPHP: BLOCK 1 ;HORIZONTAL POSITION OF CURSOR
|
||
TPVP: BLOCK 1 ;VERTICAL POSITION OF CURSOR
|
||
TPVM: BLOCK 1 ;NUMBER OF LINES BEFORE A **MORE** IS ALLOWED
|
||
TPSP: BLOCK 1 ;SAVED CURSOR POS (FOR ^PS AND ^PR)
|
||
TPFLAG: BLOCK 1 ;HOLDS RANDOM FLAGS.
|
||
%TF==0,,777775
|
||
%TFEOP==1 ;1 => HAVE JUST ENTERED LAST LINE OF PC PPR.
|
||
;NEXT ATTEMPT TO OUTPUT SHOULD DO **MORE** PROC.
|
||
%TFIGL==2 ;1 => LAST CHAR WAS CR NOT IN IMAGE MODE.
|
||
;IF NEXT CHAR IS LF, IGNORE IT.
|
||
|
||
TPLEN==.-TPBEG
|
||
.=TPBEG
|
||
|
||
REPEAT 2*NCT,[ ;NOW ASSEMBLE INITIAL CONTENTS OF PC PPR VARS.
|
||
0
|
||
0+IFE .RPCNT&1,30. ;TPHP & TPVP: NONZERO FOR MAIN PRGM.
|
||
0+IFE .RPCNT&1,5
|
||
0 ? 0 ? 0
|
||
]
|
||
EXPUNG TPHB,TPHE,TPVE
|
||
|
||
IFN .-TPBEG-NCT*TPLEN*2,.ERR
|
||
|
||
COMT1: BLOCK NCT ;COM TEMPORARY STORAGE
|
||
COMT3: BLOCK NCT ;DITTO. WHILE QUERYING FOR A LINK, THIS IS -1 IF
|
||
;IN IEC MODE, WHICH MEANS OK TO PASS TYPEIN THROUGH
|
||
DZLBIT:: ; Also Line number bits for DZ11
|
||
CHNBIT: REPEAT 20,1_<.RPCNT>
|
||
|
||
;DATA POINT CONTROLLER LINE VARIABLES
|
||
;THIS ARRAY LOOKED AT BY HARDWARE
|
||
|
||
IFNDEF LDBFF,LDBFF==10. ;LENGTH OF OUTPUT BUFFER^2 (PER LINE)
|
||
|
||
IFN DPKPP,[
|
||
DPKBAS: REPEAT NDPTYS,[
|
||
-1 ;CHR CNT
|
||
(440701,,0) ;BYTE PNTR
|
||
]
|
||
|
||
DBBFP: REPEAT NDPTYS, 440700,,DBBF+.RPCNT*LDBFF ;PNTRS TO OUTPUT BUFFER
|
||
DPKC: REPEAT NDPTYS, DPKBAS+2*.RPCNT ;PNTR TO HARDWARE COUNT WORD
|
||
DPKP: REPEAT NDPTYS, DPKBAS+2*.RPCNT+1 ;PNTR TO BUFFER PNTR WD
|
||
DBBF: BLOCK LDBFF*NDPTYS ;OUTPUT BUFFER
|
||
|
||
DPSPT: 2 ;134
|
||
6 ;600
|
||
1 ;110
|
||
2 ;150
|
||
3 ;300
|
||
24. ;1200
|
||
36. ;1800
|
||
48. ;2400
|
||
48. ;4800
|
||
LDPSPT==.-DPSPT
|
||
]
|
||
DBBCC: 0 ;CHRS REMAINING IN CURRENT BLOCK
|
||
;FOR DPK, SET ACC. TO OUTPUT SPEED, TO
|
||
;REPRESENT APPROX. 100MS TYPEOUT TIME.
|
||
;FOR MTY, SET TO 5.
|
||
|
||
DBBCC1: 0 ;INITTED LIKE DBBCC, BUT NOT DECREMENTED.
|
||
|
||
DBBBP: 0 ;BYTE PNTR TO DBBF BUFFER OR MTYOW.
|
||
|
||
;MORTON BOX LINE VARIABLES
|
||
IFN MTYP,[
|
||
MTYOW: 0 ;UP TO 5 CHARS TO BE OUTPUT PUT IN THIS WD.
|
||
MTYNC==5 ;NUMBER OF CHARS PACKED IN ABOVE WORD.
|
||
]
|
||
|
||
;DTE20 VARIABLES OTHER THAN THOSE IN LOW CORE
|
||
;I.E. NOT (DIRECTLY) REFERENCED BY 11
|
||
IFN NETYS,[
|
||
DTEHC: 0 ;NUMBER OF TIMES LOOPING AT TTYSTE
|
||
DTECNI: 0 ;CONI DTE, AT LAST INTERRUPT
|
||
DTEBBY: 0 ;NON-ZERO => BUFFER BUSY WITH TRANSFER IN PROGRESS
|
||
; FOR DEBUGGING, THE NON-ZERO VALUE IS THE DTEOUT COMMAND.
|
||
DTEBBT: 0 ;TIME-OUT IN HALF-SECOND UNITS
|
||
DTEOBL==200 ;NUMBER OF CHARACTERS IN OUTPUT BUFFER
|
||
DTEOBF: BLOCK <DTEOBL+3>/4 ;TTY OUTPUT BUFFER
|
||
];NETYS
|
||
|
||
IFN NNVTTS,[
|
||
NOVATT: -1 ;TTY # NOVA CONNECTED TO -1 IF NONE
|
||
NVIPTT: -1 ;CURRENT NOVA PSEUDO TTY ON INPUT
|
||
NVOPTT: 0 ;CURRENT NOVA PSEUDO TTY ON OUTPUT
|
||
NVTSIP: 0 ;-1 IF NOVA TTY SELECT IN PROGRESS (OUTPUT)
|
||
NVTSSC: 0 ;CHAR SAVED HERE DURING NVTSIP -1
|
||
NVTCC: 0 ;# CHARS SENT TO CURRENT TTY SINCE RESCANING OTHER PSEUDO TTYS
|
||
NNVSEC: 0 ;LAST CONSOLE TO CHECK IN TYP0 SEARCH
|
||
NNVSFL: 0 ;-1 IF SERVING PREV SELECTED
|
||
;IE IF IT CRAPS OUT, SEARCH EVEN THO IT = NNVSEC
|
||
]
|
||
|
||
IFN N11TYS,[
|
||
;PDP11-TV COMMUNICATION VARIABLES:
|
||
|
||
TT11HD: .+1 ;ADDR (IN PDP10 ADDRESS SPACE) OF PDP11 CHANNEL
|
||
0 ;HEADER AREA. IF @TT11HD IS NONZERO, THERE
|
||
;IS INPUT TO BE PROCESSED.
|
||
|
||
TT1111: 0 ;# TV'S THE 11 IS SET UP FOR
|
||
TT11RL: 0 ;# TV'S IN USE = MIN (TT1111, N11TYS).
|
||
TT11OL: 0 ;# PDP10 WORDS IN A PDP11-TV OUTPUT BUFFER.
|
||
TT11ER: BLOCK 6 ;FILLED WHEN BAD DATA COMMING FROM PDP11
|
||
.SEE TT11LS
|
||
|
||
TT11LO=400000+TTPG0*2000 ;BEGINNING OF PDP11 MEMORY IN PDP10 ADDRESS SPACE.
|
||
TT11HA==10+TT11LO ;PDP10 ADDR OF PDP11'S 40 (CHNL HDR AREA ADDR)
|
||
TT11UP==TT11HA+2 ;PDP10 ADDR OF "11 UP" FLAG.
|
||
TT11DN==TT11UP+1 ;PDP10 ADDR OF "11 ABOUT TO GO DOWN" FLAG.
|
||
|
||
$11==1,,777700 ;DEFINE B.P.'S TO PDP11 FIELDS OF A PDP10 WORD.
|
||
$11WD0==242000 ;LOW (EVEN) 11 WORD
|
||
$11WD1==042000 ;HIGH (ODD) 11 WORD
|
||
|
||
$11AD0==261600 ;LOW 11 WORD, SHIFTED DOWN 2 (FOR CONVERTING 11-ADDRESS TO 10 ADDRESS).
|
||
$11AD1==061600 ;HIGH 11 WORD, SHIFTED DOWN 2
|
||
|
||
$11BY0==241000 ;LOWEST 11 BYTE. EACH 10-WORD HOLDS 4 11-BYTES.
|
||
$11BY1==341000 ;NEXT 11 BYTE
|
||
$11BY2==041000 ;THIRD BYTE
|
||
$11BY3==141000 ;FOURTH BYTE
|
||
|
||
;FORMAT OF AN INPUT BUFFER: (ALL POINTERS ARE PDP11 ADDRS)
|
||
;PDP11 WORD #, ... MEANING.
|
||
; 0 ... 0 => FREE, ELSE -<# DATA CHARS>.
|
||
; 1 ... ZERO, ALWAYS.
|
||
; 2 ... -> NEXT BUFFER FOR THIS TTY.
|
||
; 3 ... -> NEXT ACTIVE BUFFER.
|
||
; 4 ... KEYBOARD NUMBER (= <TTY #>-NF11TY)
|
||
; 5+ ... DATA CHARS, 1 PER PDP11 WORD.
|
||
|
||
;FORMAT OF AN OUTPUT BUFFER:
|
||
;STARTS AT A MULTIPLE-OF-FOUR PDP11 ADDRESS, HAS A BUNCH OF BYTES,
|
||
;TT11BY BITS PER BYTE (USED TO BE 16, NOW 8). BYTES ARE IN PDP10 ORDER.
|
||
;AFTER THE PDP11 PICKS UP A BYTE OUT OF THE BUFFER, IT STORES BACK -1,
|
||
;WHICH TELLS THE 10 THAT IT IS OK TO STORE ANOTHER BYTE THERE.
|
||
];N11TYS
|
||
|
||
IFN DZ11P,[
|
||
;DZ11 STORAGE
|
||
;Temp metering locs
|
||
DZXINC: 0 ;Count of DZ transmit interrupts
|
||
DZXCHC: 0 ;Count of DZ transmit characters
|
||
;
|
||
DZDCRQ: 0 ;Disconnect requests
|
||
DZCORQ: 0 ;Connect requests.
|
||
IFG NDZTYS-36.,.ERR Too many DZ TTYS, fix code using DZDCRQ or DZCORQ
|
||
];DZ11P
|
||
|
||
LOCTTY: 0 ;CONSOLE INPUT CHAR READ FROM
|
||
LTTYIPC:0 ;TTYIPC USED IN LAST INPUT INT (DEBUGGING ONLY)
|
||
LTYBPC: 0 ;TYBPC USED IN LAST INPUT INT (DEBUGGING ONLY)
|
||
LEPCHR: 0 ;-1 IF CURRENT INPUT CHAR IS A LOCAL EDITING PROTOCOL COMMAND CHAR.
|
||
|
||
TTYA: 0
|
||
TTYACS: BLOCK 17-B+1
|
||
IFN KA10P, TTYAPC: 0 ;APR CONI AT TTYBRK.
|
||
TTYPDP: -LTTYP,,TTYPDL-1
|
||
TTYPDL: BLOCK LTTYP
|
||
|
||
IFN TTLPTP,[
|
||
LPTTTY: TTLPTP ;TTY# THAT IS REALLY LPT
|
||
LPTTIME: 0 ;LAST TIME SYSTEM GOT INPUT FROM LPT
|
||
]
|
||
|
||
STYMAX: NCT ;Highest-numbered STY to be allocated (for limiting load)
|
||
STYOSW: -1 ;PSEUDO TTY OPEN SWITCH
|
||
0
|
||
|
||
TTERQS: MOVE ;LIST (THREADED THRU TTYERQ) OF TTYS NEEDING ECHOING.
|
||
;"MOVE" (= 200000,,) IS THE END OF THE LIST.
|
||
;OTHERWISE, A POINTER IS THE NUMBER OF A TTY
|
||
;WHOSE TTYERQ VAR. HOLDS THE NEXT POINTER.
|
||
|
||
TTEDMY: 0 .SEE TYOPV0 ;DUMMY VARIABLE BLOCK
|
||
0 .SEE TYOPV1 ;PASSED BY ECHO ROUTINE
|
||
TTEDMY .SEE TYOPV2 ;TO .IOT RTNS.
|
||
0 .SEE TYOPV3,TTELUP
|
||
|
||
NTTELU: 0 .SEE TTELUP ;ECHOING STATISTICS.
|
||
NTTEWA: 0 .SEE TTEWAT
|
||
NTTEL1: 0 .SEE TTELP1
|
||
|
||
STYNTO: BLOCK NSTTYS ;NUMBER TIMES PSEUDO TTY OPEN
|
||
STYMSK: REPEAT NSTTYS,0 ;BIT FOR EACH CHNL STY OPEN FOR INPUT ON
|
||
STYOMS: REPEAT NSTTYS,0 ;OUTPUT
|
||
STYSTS: REPEAT NSTTYS,0 ;STY STATUS 0 => FREE SLOT
|
||
;RH = USER INDEX THAT HAS IT OPEN
|
||
%SSHNG==400000 ;4.9 = 1 => DON'T HANG ON INPUT IOTS
|
||
%SSUSE==200000 ;4.8 = 1 => IN USE
|
||
%SSINT==100000 ;4.7 = 1 => HAVE GIVEN INT ON STY OUTPUT CHNS ALREADY
|
||
%SSONT==040000 ;4.6 = 1 => DITTO FOR STY INPUT (TTY OUTPUT)
|
||
%SSOHG==20000 ;4.5 = 1 => DON'T HANG ON OUTPUT IOT
|
||
%SSORS==10000 ;4.4 = 1 => THIS STY WANTS %TDORS WHEN A
|
||
;TTY OUTPUT RESET IS DONE.
|
||
IFN NETP,[
|
||
%SSNET==4000 ;4.3 = 1 => THIS STY CONNECTED TO SOME NET SOCKETS.
|
||
%SSCHA==2000 ;4.2 = 0 FOR ARPANET, 1 FOR CHAOS NET
|
||
%SSTCP==1000 ;4.1 = 1 for TCP internet (%SSCHA must be 0)
|
||
|
||
STYNTI: REPEAT NSTTYS,-1; If %SSNET set, holds net connection identifier.
|
||
; NCP: Input IMSOC idx,,Output IMSOC idx
|
||
; CHA: connection index
|
||
; TCP: TCB (connection) index
|
||
; Otherwise -1
|
||
STYNTA: 0 ;HEAD OF LIST OF DIRECT-CONNECTED STYS NEEDING DATA XFER.
|
||
;0 IS NIL; A TTY # POINTS TO A STY.
|
||
STYNTB: 0 .SEE STYNTC ;COPIED STYNTA LIST USED INSIDE STYNTC ONLY
|
||
STYNTL: REPEAT NSTTYS,-1;STYNTA LIST THREADED THROUGH THIS TABLE.
|
||
;+ NEXT TTY IN LIST, 0 END OF LIST, - NOT IN LIST
|
||
STYORC: REPEAT NSTTYS,0 ;OUTPUT-RESET CHARACTERS, 8-BIT BYTES TERMINATED BY 0
|
||
TYPNTF: 0 ;-1 WHILE TYP BEING CALLED FROM STYNT0
|
||
NTORFU: 0 .SEE TYPOR3
|
||
] ;NETP
|
||
|
||
STYICH: 0 ;TEMP STORAGE FOR PSEUDO-TTY INPUT CHAR
|
||
|
||
TCTYP: TTYREP TCT ;THIS WORD SAYS HOW TO PERFORM
|
||
;CURSOR CTL FUNCTIONS ON TTY.
|
||
%TNPRT==0 ;PRINTING TTY.
|
||
%TNDP==1 ;TTY USES DATAPOINT CURSOR CTL CODES.
|
||
%TNODP==2 ;LOSING DATAPOINT (ML-KA HAS SOME).
|
||
%TNIML==3 ;TTY USES IMLAC CURSOR CODES.
|
||
%TNTEK==4 ;TEKTRONIX 4000 SERIES
|
||
%TNTV==5 ;TTY IS A KNIGHT TV DISPLAY.
|
||
%TNMEM==6 ;MEMOWRECK
|
||
%TNSFW==7 ;"SOFTWARE" TTY THAT WANTS I.T.S. CURSOR-MOTION CODES.
|
||
%TNTRM==10 ;TERMINET
|
||
%TNESC==11 ;TTY WANTING STANDARD ASCII ESCAPE SEQUENCES
|
||
%TNDTM==12 ;DATAMEDIA
|
||
%TNRAY==13 ;TELERAY 1061
|
||
%TNHDS==14 ;HDS CONCEPT-100
|
||
%TNH19==15 ;H19/Z19
|
||
%TNAAA==16 ;AAA
|
||
%TNMAX==17
|
||
|
||
;TTYOPT WORD DESCRIBES CHARACTERISTICS OF THE PARTICULAR
|
||
;TERMINAL ATTACHED TO EACH LINE.
|
||
TTYOPT: TTYREP OPT
|
||
|
||
;LEFT HALF BITS ARE:
|
||
%TOALT==200000 ;4.8 => STANDARDIZE ALTMODES.
|
||
%TOCLC==100000 ;4.7 => CONVERT LOWER CASE TO UPPER.
|
||
%TOERS==40000 ;4.6 => THIS TTY CAN SELECTIVELY ERASE.
|
||
%TOHDX==20000 ;4.5 => THIS TTY IS HALF-DUPLEX.
|
||
$TOHDX==370100
|
||
%TOMVB==10000 ;4.4 => THIS TTY CAN BACKSPACE.
|
||
%TOSAI==4000 ;4.3 => THIS TTY HAS SAIL CHAR SET ON OUTPUT.
|
||
%TOSA1==2000 ;4.2 INIT %TSSAI OF NEW JOBS.
|
||
%TOOVR==1000 ;4.1 => THIS TTY CAN OVERPRINT SUCCESSFULLY.
|
||
%TOMVU==400 ;3.9 => THIS TTY CAN MOVE CURSOR UP (IS A DISPLAY).
|
||
%TOMOR==200 ;3.8 => DO **MORE** PROCESSING ON THIS TTY
|
||
;(ACTUALLY JUST USED TO INIT %TSMOR FOR NEW JOBS).
|
||
%TOROL==100 ;3.7 SIMILARLY, INIT %TSROL FOR NEW JOBS.
|
||
%TORAW==40 ;3.6 => SUPPRESS CURSOR MOTION OPTIMIZATION.
|
||
%TOLWR==20 ;3.5 => THIS TTY HAS LOWER CASE KEYBOARD.
|
||
%TOFCI==10 ;3.4 => THIS TTY CAN INPUT 12-BIT CHARACTERS (HAS FULL KEYBOARD).
|
||
%TOIML==4 ;3.3 => IMLAC, HANDLES CURSOR MOTION STRANGELY.
|
||
%TOLID==2 ;3.2 => LINE INSERT AND DELETE WORK
|
||
%TOCID==1 ;3.1 => CHARACTER INSERT AND DELETE WORK
|
||
|
||
;RIGHT HALF:
|
||
%TPPLF==100000
|
||
$TPPLF==170300 ;3-BIT FIELD SAYING HOW TO PAD LF.
|
||
;0 - DON'T. 1 - MEMOWRECK, 2741. 2 - TERMINET.
|
||
%TPPCR==10000
|
||
$TPPCR==140300 ;3-BIT FIELD SAYING HOW TO PAD CR.
|
||
;7 - UNUSED. 6 - MEMOWRECK. 5 - 2741. 4 - EXECUPORT.
|
||
;0 - DON'T. 1 - NORMAL. 2 - DOUBLE.
|
||
;ON DATAPOINTS, = # CHARS PADDING NEEDED FOR ALL CURSOR MOTION.
|
||
;4 IS RIGHT FOR 2400 BAUD; 3, FOR 1200.
|
||
;ON TERMINETS, 0 => NO PADDING, OTHER CODES ARE
|
||
;1 FOR 10CPS, 2 FOR 15CPS, 3, 4, 5 FOR 30, 60, 120 CPS.
|
||
%TPPCW==6 ;FOR MEMO WRECK.
|
||
%TPPTB==1000
|
||
$TPPTB==110300 ;3 BIT FIELD SAYING HOW MUCH PADDING NEEDED AFTER TAB.
|
||
;0 => TABS NOT ALLOWED; ELSE 1 +<# PADDING CHARS NEEDED>
|
||
%TPMTA==400 ;1.9 => HARDWARE META KEY SETS 8TH BIT
|
||
%TPPRN==200 ;1.8 => INTERCHANGE () WITH [] ON INPUT
|
||
%TPTEL==100 ;1.7 => TREAT CRLF INPUT AS CR FOR TELNET PROTOCOL
|
||
%TPCBS==40 ;1.6 => ENABLE SPECIAL TREATMENT OF 034 ("CONTROL BACK SLASH") ON INPUT.
|
||
;(THE "INTELLIGENT TERMINAL PROTOCOL").
|
||
%TP11T==20 ;1.5 => PDP-11 TV TTY. REFLECTS %TY11T.
|
||
;NOT SETTABLE BY USER.
|
||
%TPORS==10 ;1.4 => OUTPUT RESET ON THIS TTY SHOULD REALLY DO SOMETHING.
|
||
%TPRSC==4 ;1.3 => THIS TTY SUPPORTS %TDRSU, %TDRSD
|
||
|
||
;SMARTS VARIABLE, %TQ IN LH, %TR IN RH, BIT DEFINITIONS IN BITS >
|
||
TTYSMT: TTYREP SMT
|
||
.SEE %TQ
|
||
.SEE %TR
|
||
|
||
TTYST1: REPEAT NCT,0 ;FIRST SIX GROUPT (SIX BITS PER GROUP)
|
||
TTYST2: REPEAT NCT,0 ;SECOND SIX GROUPS (SIX BITS PER GROUP)
|
||
TTYSTS: REPEAT NCT,%TSFRE,,-1 ;MODE BITS FOR TTY
|
||
|
||
;GROUP NUMBER CHARACTERS
|
||
;[ 0 ^A-^F ^K-^L ^N-^R ^T-^Z ^] ^^ ^_ ^@ ^\
|
||
; 1 A-Z LOWER CASE A-Z
|
||
; 2 0-9
|
||
; 3 !"#$(DOLLAR)%&',.:;?@\ (ACCENT GRAVE) (VERTICAL BAR) (TILDE)
|
||
; 4 *+-/=^_
|
||
; 5 <>[]() (LEFT BRACE) (RIGHT BRACE)
|
||
; 6 ^G ^S (^S IS IN GROUP 0 AS FAR AS %TGIMG IS CONCERNED)
|
||
; 7 LF ^I(TAB)
|
||
; 10 (ALTMODE)
|
||
; 11 CR
|
||
; 12 RUBOUT
|
||
; 13 SPACE ^H(BACKSPACE)
|
||
|
||
;TTYST1 HAS GROUPS 0 THROUGH 5 FROM LEFT TO RIGHT
|
||
;TTYST2 HAS 6 THROUGH 13
|
||
;EACH GROUP HAS SIX BITS AS FOLLOWS:
|
||
%TGINT==1 ;N.1 => INTERRUPT ON THIS GROUP
|
||
%TGACT==2 ;N.2 => ACTIVATE ON THIS GROUP (FOR SWAPPING)
|
||
%TGSPC==4 ;N.3 => SPECIAL HACKS. (THIS SET ON GROUP 1 => CONVERT LOWER CASE INPUT)
|
||
%TGIMG==10 ;N.4 => IMAGE MODE OUTPUT (N.4=0 => ASCII MODE)
|
||
;N.6-N.5 => ECHO MODE
|
||
; 00 => NO ECHO
|
||
%TGPIE==20 ; 01 => PI ECHO (ECHO CHARACTER WHEN TYPED)
|
||
%TGMPE==40 ; 10 => MAIN PROGRAM ECHO (ECHO WHEN MAIN PROGRAM RECEIVES CHARACTER)
|
||
|
||
;TTYSTS HAS RANDOM BITS ASSOCIATED WITH THE TELETYPE
|
||
%TSFRE==400000 ;4.9 => TTY FREE
|
||
%TSCLE==200000 ;4.8 => ECHO ^L AS UPARROW-L EVEN ON DISPLAYS
|
||
;(OTHERWISE WOULD ECHO AS CLEAR SCREEN)
|
||
%TSHDX==100000 ;4.7 REFLECTS %TOHDX BIT.
|
||
%TSFCO==040000 ;4.6 => HANDLE 9-BIT CHARS ON OUTPUT, USING ALPHA, BETA.
|
||
%TSALT==020000 ;4.5 => DON'T STANDARDIZE ALTMODE.
|
||
%TSROL==010000 ;4.4 => SCROLL MODE.
|
||
%TSSAI==004000 ;4.3 => ECHO AND ASCII MODE SHOULD USE SAIL CHAR SET.
|
||
%TSACT==002000 ;4.2 => GOBBLE NEXT CHAR REGARDLESS OF ACTIVATION STATUS
|
||
%TSNEA==001000 ;4.1 => DON'T ECHO IN THE ECHO AREA. ECHO IN M.P. AREA.
|
||
%TSINT==000400 ;3.9 => INT ON NEXT CHAR REGARDLESS
|
||
%TSMOR==000200 ;3.8 => INHIBIT **MORE**.
|
||
%TSATY==000100 ;3.7 SET BY .ATTY, SAYS TTY WAS TAKEN AWAY & RETURNED.
|
||
;3.6-3.5 UNUSED.
|
||
%TSNOE==000010 ;3.4 => DEFER ECHOING, AND MAKE INPUT IOT'S ACT AS IF %TIECH=1.
|
||
%TSLCZ==000004 ;3.3 => LAST CHARACTER TYPED WAS ^Z (NOT PRECEEDED BY ^_)
|
||
%TSSII==000002 ;3.2 => SUPER IMAGE INPUT MODE
|
||
%TSCNS==000001 ;3.1 => CONSOLE
|
||
$TSCNS==220100
|
||
;RH => USER INDEX
|
||
; -1 => NO USER
|
||
|
||
TTYSTA: REPEAT NCT,%TACFM,, ;NOT SAVED AT ATTY
|
||
%TACFM==400000 ;4.9 = 0 => NEEDS TO HAVE CONSOLE FREE MSG EVENTUALLY TYPED
|
||
; CLEARED BY OPEN OR ZFLAG WHEN INITIALIZING CONSOLE PROCEDURE
|
||
; SET BY SYS JOB AFTER TYPING CONSOLE FREE MSG
|
||
;WHEN THIS BIT IS 0, TTY ISN'T AVAILABLE FOR BEING GOBBLED DOWN
|
||
;FOR ANY NEW USE.
|
||
%TACTZ==200000 ;4.8 ON => TTY IS FREE AND BEING ^Z'D, SO EVEN THOUGH IT APPEARS
|
||
;OTHERWISE TO NEED A CONSOLE-FREE MESSAGE IT SHOULDN'T GET ONE.
|
||
%TANJS==100000 ;4.7 ON => TTY IS BEING ^Z'D, BUT THERE ARE NO JOB SLOTS.
|
||
;4.8 WILL BE ON AND 4.9 OFF. SYS JOB WILL RESTORE ALL TO NORMAL
|
||
;AFTER TYPING "SYSTEM FULL" ON THE TTY.
|
||
%TANEC==070000 ;4.6-4.3 NUMBER OF FOLLOWING CHARS TO INHIBIT ECHO AND INTS FOR.
|
||
;THIS IS USED FOR THE ARG CHARS THAT FOLLOW TOP-E, TOP-S, TOP-Y, ETC.
|
||
|
||
TTYCOM: REPEAT NCT,0,,-1 ;COMMUNICATE WORD
|
||
;4.9 => TTY IN COMMUNICATE MODE
|
||
%TCLFT==200000 ;4.8 => LOCAL FEED THROUGH (SET IF MY PRGM RECIEVING HIS CHRS)
|
||
%TCRFT==100000 ;4.7 => REMOTE FEED THROUGH (SET IF HIS PRGM RECIEVING MY CHRS)
|
||
%TCICO==40000 ;4.6 => INPUT COMMUNICATE OVERRIDE (SET IF MY CONSOLE FEEDING MY
|
||
; PRGM EVEN THO IN COMM MODE). ALSO IMPLIES OUTPUT OVER-RIDE.
|
||
%TCOCO==20000 ;4.5 => OUTPUT COMMUNICATE OVERRIDE (SET IF MY PRGM'S OUTPUT TO APPEAR ON MY CONSOLE ONLY EVEN THO IN COM MODE)
|
||
;4.4-4.3 => MESSAGE RECEIPT SWITCH
|
||
;00 => ACCEPT
|
||
%TCRFS==10000 ;10 => REFUSE
|
||
%TCQRY==4000 ;01 => INTERROGATE
|
||
%TCMTR==2000 ;4.2 SET FOR TTY WHOSE MOTOR IS OFF & MUST BE TURNED
|
||
;ON BEFORE ANY OTHER OUTPUT IS DONE.
|
||
;(ONLY TERMINETS HAVE THEIR MOTORS SHUT OFF BY ITS).
|
||
%TCECH==1000 ;4.1 THE OUTPUT BUFFER CONTAINS ECHOING OUTPUT.
|
||
;THIS MAKES OUTPUT RESET DO NOTHING.
|
||
;THE BUFFER MUST NOT CONTAIN ECHO OUTPUT AND NORMAL OUTPUT AT ONE TIME.
|
||
%TCDET==200 ;3.8 CONSOLE'S TREE DETACHED BY TOP LEVEL INTERRUPT.
|
||
;SET BY NDETAC AS SIGNAL TO SYSCFM (CNSL-FREE-MSG TYPER)
|
||
%TCDNG==100 ;3.7 => TYPE BELL ON TTY (BECAUSE INPUT BFR FULL).
|
||
%TCCBK==40 ;3.6 => READING UNAME OR TTY # AFTER ^_K.
|
||
%TCCBS==20 ;3.5 => READING UNAME OR TTY # AFTER ^_S.
|
||
%TCFPD==10 ;3.4 => FIRST PART DONE (USED FOR %TNESC ESCAPE SEQUENCES, %TNODP CR)
|
||
%TCTPN==4 ;3.3 TYPE ^_N ON LEAVING COM MODE (UNLESS USER EXPLICITLY TYPES ^_N)
|
||
%TCPAD==2 ;3.2 0 => PADDING NECESSARY ON DATAPOINT.
|
||
%TCHNG==1 ;3.1 TTY'S DONE FLAG APPEARS TO BE FRIED, TIME OUT QUICKLY
|
||
;RH => USER INDEX COMMUNICATING WITH (-1 NONE)
|
||
|
||
|
||
;TTYTYP TABLE
|
||
;THIS TABLE HOLDS BITS THAT DESCRIBE THE LINE
|
||
;AND ITS CONTROLLER, RATHER THAN THE TTY ATTACHED TO THE LINE.
|
||
|
||
%TTLCL==400000 ;BIT 4.9 ONE => LOCAL TTY
|
||
%TT340==200000 ;BIT 4.8 ONE => CONSOLE NEXT TO 340 OR A 340 SLAVE
|
||
%TT3HP==100000 ;BIT 4.7 HIGH PRIORITY ON 340
|
||
%TTPAR==004000 ;BIT 4.3 THIS TTY NEEDS PARITY BIT SENT.
|
||
%TTDDI==002000 ;BIT 4.2 DONT DING ON EXCESS INPUT
|
||
$TTISP==260400 ;3.8-3.5 INPUT SPEED CODE
|
||
$TTOSP==220400 ;3.4-3.1 OUTPUT SPEED CODE
|
||
|
||
%TYDPK==400000 ;BIT 2.9 DATAPOINT KLUDGE TERMINAL
|
||
%TYSTY==200000 ;BIT 2.8 PSEUDO TTY
|
||
%TYNVA==100000 ;BIT 2.7 NOVA TTY
|
||
%TYMTY==040000 ;BIT 2.6 MORTON BOX
|
||
%TYDIL==020000 ;BIT 2.5 DIAL UP
|
||
%TY11T==010000 ;BIT 2.4 PDP-11 TV TTY.
|
||
%TYDL== 004000 ;BIT 2.3 DL10 TTY
|
||
%TYOTY==002000 ;BIT 2.2 ORDINARY KA-10 CONSOLE TTY
|
||
%TYETY==001000 ;BIT 2.1 DTE-20 TTY (KL-10 CONSOLE)
|
||
%TYNTY==000400 ;BIT 1.9 TK-10 TTY.
|
||
%TYMDM==000200 ;BIT 1.8 LINE HAS MODEM CONTROL, DETECTS DIALINS AND HANGUPS
|
||
%TYKST==000100 ;BIT 1.7 KS-10 CONSOLE TTY
|
||
%TYDZT==000040 ;BIT 1.6 DZ-11 TTY ON KS-10
|
||
%TYRLM==000020 ;BIT 1.5 ROLM DATA SWITCH
|
||
|
||
TTYTYP: TTYREP TYP ;PART OF TTYTYP MAY BE WRITEABLE.
|
||
BBLK
|
||
0 ;DISOWNED JOBS CANT HAVE LPT
|
||
%TTLCL,,;SYSTEM JOB CAN GET LPT
|
||
|
||
.CRFOFF
|
||
IRPS X,,TYP OPT HOR VER TCT ROL SMT
|
||
REPEAT NCT,[
|
||
CONC EXPUNG T,\.RPCNT,$!X
|
||
]
|
||
TERMIN
|
||
.CRFON
|
||
|
||
OVHMTR UUO ;YET MORE RANDOM UUOS
|