1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-17 16:53:23 +00:00
PDP-10.its/src/syseng/lock.154
2016-11-07 08:08:48 +01:00

1218 lines
23 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-*-midas-*-
IF1,EXPUNG TTY
TITLE LOCK
IFNDEF HSNCTL, HSNCTL==1 ;1 means people with GUESTn directories can't
;lock, down, or net, or gun or detach anyone but
;themselves
IFNDEF GUNCTL, GUNCTL==1 ;1 means users who do not have directories
; may not gun or detach anyone but themselves.
IFNDEF SPYCTL, SPYCTL==1 ;1 means users on STYs cannot SPY.
IFNDEF REMCTL, REMCTL==0 ;1 means sty ttys cannot lock, down, or net.
A=1
B=2
C=3
D=4
D1=5
E=6
F=7
U=10
J=11
G=12
H=13
P=17
;CHANNELS 0 UPWARD USED FOR LOCK AND CTEST
MXCH==12 ;MAX FREE CH
GUNC==13 ;USED TO OPEN JOB TO BE GUNNED.
RTYO==14
RTYI==15
TYIC==16
TYOC==17
DEFINE TYICI X
.IOT TYIC,X ;NOW THAT CONVERT TO UPPER CASE MODE IS GONE,
CAIN X,177 ; THIS IS THE QUICKEST FIX
ADDI X,40 ;NOTE THAT X MUST BE AN ACCUMULATOR
CAIL X,140
SUBI X,40
TERMIN
SNGEC==2
LOC 42
JSR TSINT
LOC 100
STY: 0
BEG: MOVEI P,PDL
.SUSET [.RXJNAME,,C]
CAMN C,[SIXBIT /VTFIX/]
JRST VTFIXR
PUSHJ P,REGIO
MOVEI C,INMESG
PUSHJ P,TITYOT
.SUSET [.RUNAME,,RUNAME]
.SUSET [.SMASK,,[1]]
.SUSET [.SPICL,,[-1]]
.CALL [SETZ ? SIXBIT /STYGET/ ? MOVEI TYIC ? SETZM STY]
.LOSE 1000
JRST BLUP
;THESE ARE THE I.T.S. SYMBOLS NEEDED BY THE "SPEED" COMMAND.
;THIS ARRAY'S EVEN WORDS HAVE THE SYMBOL NAMES; THE ODD ONES GET THE VALUES.
;THE SYMBOL "FOO" IN LOCK WILL POINT TO THE WORD WHICH WILL CONTAIN
;"FOO"'S VALUE IN I.T.S.
;IF ANY SYMBOLS ARE ADDED, REMEMBER TO MODIFY AI:SYSTEM;EVSYMS >
SYMST: IRPS X,,NFDPTY NNTYS NCT TTYTYP DPKBAS TTYCHN NDPTYS
SQUOZE 0,X
X: 0
TERMIN
0
TSINT: 0
0
PUSH P,A
MOVE A,TSINT
CAIE A,1
JRST INTAR
MOVEI A,TYIC
.ITYIC A,
JRST INTAR
CAIN A,7 ;^G
JRST QUIT
CAIN A,14 ;^L, DO THE RIGHT THING.
JRST FORMF
INTAR: POP P,A
.DISMISS TSINT+1
QUIT: .RESET TYOC,
SKIPN CHARF ;INSIDE "O" LOOP
JRST QUIT1
XCT FCHRL1 ;SO GET THE FULL-CHAR-SET-CHARACTER
.VALUE
PUSHJ P,OCTPNT ;AND PRINT IT, BUT THEN QUIT
QUIT1: .RESET TYIC,
SETZM CHARF
SETZM KILLF
.DISMI [BLUPR]
FORMF: SKIPN KILLF ;KILL routine wants to see ^Ls ugh bletch
SKIPE CHARF ;so does FCO routine
JRST INTAR
.IOT TYIC,A ;FLUSH THE RANDOM ^L
JRST INTAR
REVIVE: MOVEI B,[ASCIZ /
REVIVE SYSTEM?/]
PUSHJ P,QHACK
.REVIVE
.OPEN GUNC,DWNMAL ;IF SYS;DOWN MAIL EXISTS,
JRST BLUP
.CLOSE GUNC, ;GIVE USER OPTION OF FLUSHING IT.
MOVEI B,[ASCIZ /
DELETE SYS;DOWN MAIL?
/]
PUSHJ P,QEXPL2
TYICI B
CAIE B,"Y+40
CAIN B,"Y
.FDELE DWNMAL
JFCL
JRST BLUP
PVAL: .VALUE [ASCIZ /:VK /]
BEGLUP: MOVEI P,PDL
BLUPR: PUSHJ P,REGIO
BLUP: .CLOSE GUNC,
PUSHJ P,TCRR
.IOT TYOC,["_]
SETZB D,TNUM
MOVE E,[440600,,D]
PUSHJ P,GNUM
JRST NOTNUM
GNUM: SETZM TNUM
GNUM1: TYICI A
CAIL A,"0
CAILE A,"9
POPJ P,
MOVEI B,10
IMUL B,TNUM
ADDI B,-"0(A)
MOVEM B,TNUM
JRST GNUM1
INITST: MOVEI A,SYMST
INITS1: SKIPN B,(A)
POPJ P,
SKIPE 1(A)
AOJA A,[AOJA A,INITS1]
.EVAL B,
SETZ B, ;Don't be nhappy on MC where DPKBAS is undefined.
MOVEM B,1(A)
AOJA A,[AOJA A,INITS1]
REGIO: MOVEI A,21 ;REGULAR I/O
HRLM A,TTY
.OPEN TYOC,TTY
.VALUE
MOVEI A,30
HRLM A,TTY
.OPEN TYIC,TTY
.VALUE
POPJ P,
;; Skip if this person's HSNAME is not a GUESTn directory
IFN HSNCTL,[
HSNCHK: PUSH P,A
.SUSET [.RHSNAME,,A] ;Let's see if this is a tourist
TRZ A,77 ;Ignore low digit
CAME A,[SIXBIT /GUEST/]
AOS -1(P)
POP P,A
POPJ P,
];IFN HSNCTL
PLS:
IFN REMCTL,[
SKIPE STY ;prevents sty terminals from locking
JRST BLUP
];IFN REMCTL,
IFN HSNCTL,[
PUSHJ P,HSNCHK
JRST BLUP
];IFN HSNCTL,
MOVE B,TNUM
MOVE A,CHARAY
SKIPE CHARAY+1(A)
AOBJN A,.-1
JUMPGE A,QLUP
MOVEM B,CHARAY+1(A)
DPB A,[270400,,PLS.]
DPB B,[300,,TY.]
LDB B,[30300,,B]
DPB B,[060300,,TY.]
PLS.: .OPEN .,TY.
JRST LUP9
.IOT TYOC,["W]
MOVEI C,[SIXBIT \THIS CONSOLE LOCKED BY !\]
PUSHJ P,DITYOT
MOVEI C,RUNAME
PUSHJ P,ITYOUT
JRST BLUP
INMESG: SIXBIT / LOCK./
.FNAM2+'!
FLUSH: MOVE B,TNUM
MOVE A,CHARAY
CAME B,CHARAY+1(A)
AOBJN A,.-1
JUMPGE A,QLUP
SETZM CHARAY+1(A)
PUSHJ P,TTYSTA
SKIPN B
JRST QLUP
.IOT TYOC,["*]
DPB A,[270400,,.+1]
.CLOSE .,
JRST BLUP
LFTAR: PUSHJ P,IMOUT
.IOT TYOC,TNUM
JRST BEGLUP
DETACH: SETOM GUNDET ;-1 FOR DETACH.
SETZM TGUNFL
JRST DETAC0
GUN: SETZM GUNDET ;0 FOR GUN.
SETZM TGUNFL
JRST DETAC0
TGUN: SETZM GUNDET
SETOM TGUNFL
DETAC0: SKIPGE B,TNUM
JRST QLUP
JUMPE B,GUN1
PUSHJ P,USER
JRST QLUP
JUMPE U,QLUP
MOVEM U,USTORE
MOVEM J,JSTORE
PUSHJ P,TCRR
MOVE C,GUNDET
MOVE C,[[SIXBIT \DETACH !\]
[SIXBIT \GUN DOWN !\]
]+1(C)
PUSHJ P,ITYOUT
MOVEI C,USTORE
PUSHJ P,ITYOUT
MOVEI C,JSTORE
PUSHJ P,ITYOUT
.IOT TYOC,["?]
PUSHJ P,QHACK1
MOVEM B,UGUNU
JRST GUNACT
USER: .CALL [ SETZ ? SIXBIT/OPEN/
[10,,GUNC] ;INSIST FOREIGN USER CHANNEL.
['USR,,]
1000,,400000(B) ;OPEN JOB BY NUMBER.
SETZ [0]]
POPJ P,
.USET GUNC,[.RUNAME,,U]
.USET GUNC,[.RJNAME,,J]
POPJ1: AOS (P)
POPJ P,
GUN1: MOVEI B,[ASCIZ \
UNAME=\]
PUSHJ P,QEXPL2
PUSHJ P,6NAMEG
JUMPE E,QLUP ;NULL UNAME EQUIVALENT TO SELF IN .OPEN - WHAT A LOSS!
;"GUN<CR>" WOULD SUICIDE IF THIS INSN DIDN'T PREVENT IT.
MOVE F,[SIXBIT \HACTRN\]
JUMPN C,GUN3
MOVE F,E
MOVEI B,[ASCIZ \
JNAME=\]
PUSHJ P,QEXPL2
PUSHJ P,6NAMEG
EXCH E,F
GUN3: MOVE D1,[10,,'USR]
MOVEM E,USTORE
MOVEM F,JSTORE
.OPEN GUNC,D1
JRST QLUP
.USET GUNC,[.RUIND,,UGUNU]
JRST GUNACT
UGUNU: 0
USTORE: 0
SIXBIT \ !\
JSTORE: 0
SIXBIT \!\
6NAMEG: MOVE D,[440600,,E]
MOVEI E,0
6NAME1: TYICI C
SUBI C,40
CAIL C,100
JRST QLUP
JUMPLE C,CPOPJ
TLNE D,770000
IDPB C,D
JRST 6NAME1
;Now that we know who we are supposed to gun or detach, decide whether it is ok.
GUNACT:
IFN GUNCTL,[
.SUSET [.RXUNAME,,B] ;Validate the XUNAME somewhat
CAMN B,[SIXBIT /GUEST/]
JRST GUNCT5 ;GUEST can never gun anyone (except another guest)
.SUSET [.RUNAME,,D]
hlrz c,d ;get the first 3 characters in C
cain c,(sixbit /SYS/) ;is this some system directory?
jrst gunct5 ; yes, what is this foolishness?
GUNCT1: CAMN B,D ;Characters that differ must be digits in UNAME
JRST GUNCT3
SETZB A,C
LSHC A,6
LSHC C,6
CAMN A,C
JRST GUNCT1
CAIL C,'0
CAILE C,'9
CAIA ;Differs by other than trailing digit, flush
JRST GUNCT1
.SUSET [.RUNAME,,A]
CAIA
GUNCT3: .SUSET [.RXUNAME,,A]
.suset [.rhsname,,c]
came a,c ;do we have a directory?
jrst gunct5 ; no, don't permit it unless self
push p,a ;save so we can do some hacking
.suset [.runame,,c] ;look at who we REALLY are
trz a,77 ;we ignore the last char, maybe FOOBA0
trz c,77 ;in both of them, since may be FOOBAR
gunctx: lsh c,-1 ;shift right one
lsh a,-1 ;do it to both of them
trnn a,1 ;is the UNAME right-justified yet?
jrst gunctx ; no, keep looking
;;we now have flushed all the added bits of FOO0, they should be EQUAL
came a,c ;did we win?
jrst [pop p,a ? jrst gunct5] ;no, don't let him do it unless self
pop p,a
.CLOSE GUNC,
JRST GUNCT4
;Compare A with xuname of job to be gunned
GUNCT5: MOVE B,UGUNU
.CALL [ SETZ ? SIXBIT/USRVAR/ ? MOVEI %JSNUM(B)
['XUNAME] ? SETZM B]
JRST DETAC0 ;Job vanished
CAMN A,B
JRST GUNCT6 ;it you, go ahead and do it.
MOVEI B,[ASCIZ/
You aren't allowed to GUN or DETACH anyone but yourself./]
PUSHJ P,QEXPL2
JRST BLUP
GUNCT4:
];IFN GUNCTL
IFN 0,[
SKIPE STY
JRST BLUP ;prevents sty terminals from gunning/detaching
]
IFN HSNCTL,[
PUSHJ P,HSNCHK ;Is this a GUESTn loser?
CAIA
JRST GUNCT6
;can't do it except to yourself.
.suset [.rxuname,,a]
MOVE B,UGUNU
.CALL [ SETZ ? SIXBIT/USRVAR/ ? MOVEI %JSNUM(B)
['XUNAME] ? SETZM B]
JRST DETAC0 ;Job vanished
CAMN A,B
JRST GUNCT6 ;it you, go ahead and do it.
movei b,[ASCIZ/
You aren't allowed to GUN or DETACH anyone but yourself./]
PUSHJ P,QEXPL2
JRST BLUP
];IFN HSNCTL
GUNCT6: MOVE B,UGUNU
PUSHJ P,USER ;Make sure job is still there with same name
JRST QLUP
CAMN U,USTORE
CAME J,JSTORE
JRST DETAC0 ;Not there, try over
.CALL [ SETZ ? SIXBIT/USRVAR/ ? MOVEI %JSNUM(B)
[SIXBIT/CNSL/] ? SETZM C]
JRST DETAC0 ;Job vanished
.CALL [ SETZ ? SIXBIT/USRVAR/ ? MOVEI %JSNUM(B)
[SIXBIT/JNAME/] ? SETZM A]
JRST DETAC0
CAME A,[SIXBIT /HACTRN/]
SETO C, ;We want no message on the terminal unless job was a HACTRN.
SKIPE GUNDET
JRST DETAC1
.GUN B,
JRST QLUP
JRST GUNMSG
DETAC1: .CALL [SETZ? 'DETACH ? SETZI 400000(B)]
JRST QLUP
;Now print message on terminal of the job that was gunned.
GUNMSG: JUMPL C,BLUP ;BUT ONLY IF IT HAD ONE.
MOVEI B,10.
GUNMS1: MOVEI A,30. ;GIVE IT TIME TO BECOME FREE
.SLEEP A,
MOVE A,[.UAO,,'T00]
DPB C,[0300,,A]
LSH C,-3
DPB C,[060300,,A] ;RH(A) NOW HAS TNN, FOR PROPER TTY NUMBER.
.OPEN GUNC,A
JRST [ SOJG B,GUNMS1 ;KEEP WAITING FOR TTY TO BE FREE, UP TO 10 SECONDS.
JRST BLUP]
MOVEI A,[ASCIZ/You have just been /]
PUSHJ P,GUNASC
MOVEI A,[ASCIZ/logged out/]
SKIPE GUNDET
MOVEI A,[ASCIZ/detached/]
PUSHJ P,GUNASC
MOVEI A,[ASCIZ/ by /]
PUSHJ P,GUNASC
.SUSET [.RXUNAM,,A]
PUSHJ P,GUNSIX
SKIPN TGUNFL
JRST [ .IOT GUNC,[".]
.CLOSE GUNC,
JRST BLUP]
MOVEI A,[ASCIZ/
because you did not log out when you were asked to.
Tourists should always log out when legitimate users ask.
Please don't log in again until the system is less loaded./]
PUSHJ P,GUNASC
.CLOSE GUNC,
JRST BLUP
;OUTPUT ASCIZ STRING <- A TO GUNC.
GUNASC: HRLI A,440700
GUNAS1: ILDB B,A
JUMPE B,CPOPJ
.IOT GUNC,B
JRST GUNAS1
;OUTPUT SIXBIT WORD IN B TO GUNC.
GUNSIX: JUMPE A,CPOPJ
SETZ B,
ROTC A,6
ADDI B,40
.IOT GUNC,B
JRST GUNSIX
TGUNFL: 0 ;NONZERO FOR TGUN COMMAND, AS OPPOSED TO GUN OR DETACH.
GUNDET: 0 ;NONZERO FOR DETACH, ZERO FOR GUN OR TGUN.
NOTNUM: CAIE A,177
CAIN A,15
JRST BLUP
NOTNM2: SUBI A,40
JUMPLE A,QLUP
TLNE E,770000
IDPB A,E
MOVSI F,-CTABL
CAME D,COMTAB(F)
AOBJN F,.-1
JUMPG F,CLUP
HRRZ F,COMT2(F)
JRST (F)
CLUP: TYICI A
CAIN A,177
JRST QLUP
JRST NOTNM2
QEXPL: MOVSI F,-CTABL
QEXPLL: HLRZ B,COMT2(F)
JUMPE B,QEXPLE
MOVE A,COMTAB(F)
MOVEM A,QMESST
MOVE A,[440600,,QMESST]
PUSHJ P,TCRR
QEXP2L: ILDB C,A
ADDI C,40
CAIE C,40
.IOT TYOC,C
CAIE C,40
JRST QEXP2L
MOVEI C,^I
.IOT TYOC,C
PUSHJ P,QEXPL2
QEXPLE: AOBJN F,QEXPLL
JRST BEGLUP
QMESST: 0
0 ;TERM
COMTAB: '+_36
'-_36
'"_36
'__36
SIXBIT /DETACH/
SIXBIT /DOWN/
SIXBIT /DPK/
SIXBIT /FCO/
SIXBIT /FLASH/
SIXBIT /GUN/
SIXBIT /I37/
SIXBIT /ISPY/
SIXBIT /KILL/
SIXBIT /NET/
'O_36
'P_36
'Q_36
SIXBIT /RCAVIC/
SIXBIT /REVIVE/
SIXBIT /SPEED/
SIXBIT /SPY/
SIXBIT /SYS/
SIXBIT /TEST/
SIXBIT /TGUN/
SIXBIT /TPL/
SIXBIT /TVQPY/
SIXBIT /UCLEAR/
'?_36
CTABL==.-COMTAB
COMT2: [ASCIZ /Lock TTY (precede by #)/],,PLS
[ASCIZ /Unlock TTY (")/],,FLUSH ;-
[ASCIZ /Output next character in octal/],,1CHAR
[ASCIZ /Type character with ASCII value # (")/],,LFTAR
[ASCIZ /Detach job # from its TTY (")/],,DETACH
[ASCIZ /System down in # minutes (")/],,KILL
[ASCIZ /Reinitialize DataPoint Kludge/],,DPKI
[ASCIZ /Echo characters in octal, with control, meta bits/],,FCHAR
FLASH ;LEFT OVER FROM AP LINE DAYS, UNUSED.
[ASCIZ /Kill user with index # (")/],,GUN
[ASCIZ /Initialize Model 37 Teletype/],,I37
[ASCIZ /Like SPY, but types out in image mode/],,ISPY
KILL ;SAME AS DOWN. NOT DOCUMENTED, DESPITE POEMS.
[ASCIZ /Reinitialize ARPANET interface/],,NET
[ASCIZ /Echo characters in octal/],,CHAR ;O
[ASCIZ /Return to DDT without killing LOCK/],,PVAL
[ASCIZ /Return to DDT killing LOCK/],,[.LOGOUT?.BREAK 16,160000] ;Q
RCAVIC ;IF YOU DUNNO WHAT IT IS, DON'T USE IT.
[ASCIZ /Cancel DOWN command, system will stay up (maybe)/],,REVIVE
[ASCIZ /Change Datapoint linespeed (precede by line #)/],,SPEED
[ASCIZ /Look at input from TTY (precede by TTY #)/],,SPY
[ASCIZ /Change system checker status/],,SYSJ
[ASCIZ /Test core job (casual use NOT recommended)/],,CTEST
[ASCIZ /Gun Tourist who has been asked to log out/],,TGUN
[ASCIZ /Delete top item on TPL stack/],,SYSL ;TPL
[ASCIZ /Change state of TV hardcopy device/],,TVQPY
[ASCIZ /Initialize microtape directory/],,UCLR
[ASCIZ /List commands/],,QEXPL
IFN .-COMT2-CTABL,[PRINT /LOSS AT COMTAB
/]
LUP9: .IOT TYOC,["L]
JRST BLUP
QLUP: .IOT TYOC,["?]
JRST BEGLUP
KILL:
IFN REMCTL,[
SKIPE STY ;prevents sty terminals from killing.
JRST BLUP
]
IFN HSNCTL,[
PUSHJ P,HSNCHK
JRST BLUP
]
MOVE B,TNUM
CAIGE B,5.
JRST QLUP
MOVEI B,[ASCIZ /
DO YOU REALLY WANT THE SYSTEM TO GO DOWN?
/]
PUSHJ P,QHACK
.OPEN GUNC,DWNMAL ;DOES SYS;DOWN MAIL EXIST?
JRST KILL4 ;NO, SHOULD CREATE ONE.
.CLOSE GUNC, ;YES, GIVE OPTION OF LEAVING OLD ONE.
MOVEI B,[ASCIZ /
REPLACE SYS;DOWN MAIL?
/]
PUSHJ P,QEXPL2
TYICI B
CAIE B,"Y+40 ;IF USER ANSWERS NO, GO TO KILL1.
CAIN B,"Y
JRST KILL4
JRST KILL1
KILL4: .OPEN GUNC,[.UAO,,'SYS ? SIXBIT/DOWN/ ? SIXBIT/MAIL/]
.LOSE 1400
MOVEI B,[ASCIZ/
PLEASE ENTER A BRIEF MESSAGE TO USERS, ENDED BY ^C
/]
PUSHJ P,QEXPL2
MOVE B,MBUFPT
SETOM KILLF' ;kludgey flag for FORMF routine
KILL0: .IOT TYIC,A
CAIE A,177
JRST KILL5
CAMN B,MBUFPT ;RUBOUT
JRST KILL0
LDB A,B
.IOT TYOC,A
ADD B,[070000,,]
JUMPGE B,KILL0
SUB B,[430000,,1]
JRST KILL0
KILL5: CAIE A,14
JRST KILL2
PUSHJ P,TCRR
MOVE C,MBUFPT ;^L RETYPE
KILL6: CAMN C,B
JRST KILL0
ILDB A,C
.IOT TYOC,A
JRST KILL6
KILL2: IDPB A,B
CAIN A,15
JRST [ .IOT TYOC,A
MOVEI A,12
.IOT TYOC,A
JRST KILL2 ]
CAIE A,^C
JRST KILL0
SETZM KILLF
MOVE C,MBUFPT
KILL3: ILDB A,C
.IOT GUNC,A
CAME B,C
JRST KILL3
.CLOSE GUNC,
KILL1: MOVE B,TNUM
IMULI B,60.*30.
.SHUTDN B,
JRST QLUP
JRST BLUP
;FOR CHECKING SYS;DOWN MAIL'S EXISTENCE, OR DELETING IT.
DWNMAL: SIXBIT / SYSDOWN MAIL/
0
0
MBUFPT: 010700,,.
BLOCK 100
QHACK: PUSHJ P,QEXPL2
.LISTEN
.RESET TYIC,
QHACK1: TYICI C
CAIN C,"N
JRST BEGLUP
CAIE C,"Y
JRST QLUP
MOVE B,TNUM ;BARF^BARF
POPJ P,
AITEST: .CALL [SETZ
SIXBIT /SSTATU/
REPEAT 5,[2000,,A ? ] ;WE DON'T WANT ALL THIS CRAP,
402000,,A] ;JUST THE MACHINE NAME.
.LOSE 1000
CAMN A,[SIXBIT /AI/]
AOS (P) ;SKIPS IF RUN ON AI.
POPJ P,
TVQPY: PUSHJ P,AITEST
JRST TVLUZ
.CALL [ SETZ
SIXBIT /T11MP/
1000,,200 ;LOW CORE ON 11=>PAGE 200 ON 10.
SETZ [600000,,001777]]
.LOSE 1000
.CALL [ SETZ
SIXBIT /T11MP/
1000,,201
SETZ [600004,,001777]]
.LOSE 1000
.CALL [ SETZ
SIXBIT /T11MP/
1000,,202
SETZ [600010,,001777]]
.LOSE 1000
.CALL [ SETZ
SIXBIT /T11MP/
1000,,203
SETZ [600014,,001777]]
.LOSE 1000
.CALL [ SETZ
SIXBIT /T11MP/
1000,,204
SETZ [600020,,001777]]
.LOSE 1000
.CALL [ SETZ
SIXBIT /T11MP/
1000,,205
SETZ [600024,,001777]] ;ALL MAPPED IN.
.LOSE 1000
MOVE E,400010 ;THESE ARE TV-11 WORDS 40-42, 42 HAS PTR TO PTR AREA.
LSH E,-6 ;MOVE (CONTENTS OF TV LOC 42)/4 TO LOW ORDER BITS.
ANDI E,37777 ;MASK OUT OTHER LOCATIONS.
ADDI E,400004 ;NOW A HAS ADDRESS OF QPYSWT,,0
MOVE F,E ;SAVE THE ADDRESS FOR LATER.
MOVE E,(E) ;AND NOW HAS QPYSWT,,0
LSH E,-24 ;MOVE IT TO THE RIGHT BITS,
CAIN E,177777 ;IF IT'S -1, QPY IS DOWN
JRST QPDOWN
MOVEI B,[ASCIZ / IS UP. DO YOU WANT TO BRING IT DOWN? /]
PUSHJ P,QHACK
HRLZI E,777774 ;SET QPYSWT TO -1
QPZAP: MOVEM E,(F)
.CORE 2
.LOSE 1000
JRST BLUP
QPDOWN: MOVEI B,[ASCIZ / IS DOWN. DO YOU WANT TO BRING IT UP? /]
PUSHJ P,QHACK
SETZI E,
JRST QPZAP
TVLUZ: MOVEI C,[SIXBIT / SORRY, THIS MACHINE DOES NOT HAVE TV'S TO FIX.!/]
PUSHJ P,TITYOT
JRST BLUP
NET:
IFN REMCTL,[
SKIPE STY ;prevents sty terminals from restarting net.
JRST BLUP
];IFN REMCTL,
IFN HSNCTL,[
PUSHJ P,HSNCHK
JRST BLUP
]IFN HSNCTL,
MOVEI B,[ASCIZ / DO YOU REALLY WANT TO BRING DOWN THE NET? /]
PUSHJ P,QHACK ;ACCEPT ONLY Y FOR AN ANSWER.
RETRY: MOVE E,[SQUOZE 0,SCLNET]
.EVAL E, ;FIND OUT WHAT BIT TO DIDDLE.
.VALUE [ASCIZ /:FAILURE TO FIND SYMBOL, FIND A HACKER TO DO IT./]
MOVE F,[SQUOZE 0,SUPCOR]
.EVAL F, ;FIND OUT WHAT WORD TO DIDDLE IT IN.
.VALUE [ASCIZ /:FAILURE TO FIND SYMBOL, FIND A HACKER TO DO IT./]
HRL F,F
HRRI F,PTRLOC
.GETLOC F, ;FINDS CURRENT VALUE OF SUPCOR, PUTS IT IN PLACE FOR IFSET.
MOVSS E
IOR E,PTRLOC ;SET THE APPROPRIATE BIT
MOVEM E,PTRLOC+1;AND PLACE IT FOR IFSET.
HRRI F,PTRLOC
MOVSS F
.IFSET F, ;SET THE BIT, CAUSING ARPANET TO BE RESET.
JRST RETRY ;LOCATION CHANGED, WE'LL TRY AGAIN
JRST BLUP ;DONE, RETURN TO COMMAND READING LOOP.
PTRLOC: 0 ;CONTAINS TEST WORD FOR .IFSET
0 ;CONTAINS NEW VALUE FOR .IFSET
SYSL: MOVEI F,2
.SUPSET F,
JRST BLUP
SYSJ: MOVEI F,1
.SUPSET F,
MOVEI C,[SIXBIT /SYS CHECKER !/]
PUSHJ P,TITYOT
MOVEI C,[SIXBIT /UN!/]
TRNE F,1
PUSHJ P,ITYOUT
MOVEI C,[SIXBIT /BLOCKED?!/]
PUSHJ P,ITYOUT
JRST BLUP
QEXPL2: HRLI B,440700
QEXPL3: ILDB A,B
JUMPE A,CPOPJ
.IOT TYOC,A
JRST QEXPL3
SPEED: PUSHJ P,INITST
SKIPN B,TNUM
.SUSET [.RTTY,,B]
MOVE D,TTYTYP
ADD D,B
MOVSS D
HRRI D,E
.GETLOC D,
SUB B,NFDPTY
SKIPL B
CAMLE B,NNTYS
JRST QLUP
DPB B,[140400,,SSC1]
DPB B,[140400,,SSC2]
MOVEI B,[ASCIZ / INPUT SPEED=/]
PUSHJ P,GSPD
JRST QLUP
MOVE J,B
DPB B,[$TTISP,,E]
MOVE B,DPSP(B)
DPB B,[110300,,SSC1]
MOVEI B,[ASCIZ / OUTPUT SPEED=/]
PUSHJ P,GSPD
JRST QLUP
MOVE U,B
DPB B,[$TTOSP,,E]
MOVE B,DPSP(B)
DPB B,[110300,,SSC2]
MOVNI B,1000
.IOTLSR B,
SPELUP: SKIPL J
SSC1: CONO 604,703 ;+.&77000
SKIPL U
SSC2: CONO 604,503 ;+.&77000
AOJL B,SPELUP
.IOTLSR B,
MOVSS D
.SETLOC D, ;UPDATE TTYTYP TABLE
JRST BLUP
GSPD: PUSHJ P,QEXPL2
PUSHJ P,GNUM
JUMPE B,GSPD1
MOVE C,[-LSPTBL,,0]
CAME B,SPTBL(C)
AOBJN C,.-1
HRRZ B,C
JUMPL C,GSPD2
POPJ P,
GSPD1: SETOM B
GSPD2: AOS (P)
POPJ P,
;SYSTEM BAUD RATES
SPTBL: 134 ;SYSTEM USES THIS FOR UNKNOWN, PUT 134 HERE SO CAN SET DPK TO 134
600 ? 110 ? 150
300 ? 1200 ? 1800 ? 2400
4800 ? 9600 ? 25000 ? 40000
50000 ? 80000
LSPTBL==.-SPTBL
;DATA POINT CODE INDEXED BY SYSTEM BAUD RATE CODE
DPSP: 0 ;134
1 ;600
2 ;110
3 ;150
4 ;300
5 ;1200
5 ;1800 *
6 ;2400
7 ;4800
REPEAT 20-<.-DPSP>, 7 ;FAST *
ISPY:
IFN SPYCTL,[
SKIPE STY ;prevents sty terminals from input spying
JRST BLUP
]
PUSHJ P,IMOUT
SPY:
IFN SPYCTL,[
SKIPE STY ;prevents sty terminals from input spying
JRST BLUP
]
PUSHJ P,INITST
SKIPL B,TNUM
CAMLE B,NCT
JRST QLUP
MOVEM B,SPYS+1
.OPEN RTYI,SPYS
JRST QLUP
SPYLP: .IOT RTYI,A
.CALL [ SETZ ? 'IOT,,
1000,,TYOC ;CHANNEL
A ;IOT OUT OF A
405000,,%TJDIS] ;DON'T USE DISPLAY MODE.
.VALUE
JRST SPYLP
SPYS: SIXBIT / SPY/
WHO: 0
;SET TO IMAGE MODE OUTPUT
IMOUT: MOVEI B,5
HRLM B,TTY
.OPEN TYOC,TTY
.VALUE
POPJ P,
IMIN: MOVEI B,4
HRLM B,TTY
.OPEN TYIC,TTY
.VALUE
POPJ P,
I37: PUSHJ P,IMOUT
.RESET TYOC,
.IOT TYOC,["]
.IOT TYOC,["F]
.IOT TYOC,["]
.IOT TYOC,[":]
MOVEI A,15. ;CHOMP
.SLEEP A,
JRST BEGLUP
1CHAR: PUSHJ P,IMIN
.IOT TYIC,A
PUSHJ P,TCRR
PUSHJ P,OCTPNT
JRST BEGLUP
CHAR: PUSHJ P,IMIN
SETOM CHARF' ;FLAG FOR QUIT TO KNOW
CHARL: PUSHJ P,TCRR
.IOT TYIC,A
PUSHJ P,OCTPNT
JRST CHARL
FCHAR: PUSHJ P,IMIN
SETOM CHARF
FCHARL: PUSHJ P,TCRR
FCHRL1: .CALL [ SETZ ? SIXBIT/IOT/ ? MOVEI TYIC ? 5000,,%TIFUL ? SETZ A]
.VALUE
PUSHJ P,OCTPNT
JRST FCHARL
OCTPNT: IDIVI A,8
HRLM B,(P)
SKIPE A
PUSHJ P,OCTPNT
HLRZ A,(P)
ADDI A,"0
.IOT TYOC,A
CPOPJ: POPJ P,
UCLR: MOVE B,TNUM ;SIGH
DPB B,[260300,,TAPNO]
MOVEI B,UCLMES
PUSHJ P,QHACK
.ASSIGN B,
JRST QLUP
.UINIT B,
JRST QLUP
JRST BLUP
UCLMES: ASCII /
ZAP TAPE/
TAPNO: ASCIZ / 0?
/
FLASH: .OPEN RTYI,SPYF ;MORE THAN ONE AT A TIME
JRST QLUP ;FAILED, BOMB OUT
MOVEI D,100 ;INITIALIZE TO EXPECT UNSHIFTED CHARS
FLLUP: .IOT RTYI,A ;GET A CHAR FROM THE AP LINE
ANDI A,77 ;MASK IT TO 6 BITS
CAIN A,33 ;IS IT "SHIFT"
MOVEI D,0 ;SET SHIFT FLAG OFFSET
CAIN A,37 ;IS IT "UNSHIFT"
MOVEI D,100 ;SET UNSHIFT FLAG OFFSET
ADD A,D ;ADD THE FLAG OFFSET TO THE CHAR
IDIVI A,5 ;SELECT THE WORD AND BYTE
LDB A,BYTAB(B) ;GET THE ASCII CHAR FROM THERE
JUMPE A,FLLUP ;IF IT'S ZERO, IGNORE AND GET NEXT
.IOT TYOC,A ;IF IT'S NOT, TYPE IT
JRST FLLUP ;GET THE NEXT ONE
SPYF: SIXBIT / SPY/
10 ;TTY NUMBER
BYTAB: 350700,,SHIFT(A) ;LEFTMOST CHAR OF 5
260700,,SHIFT(A)
170700,,SHIFT(A)
100700,,SHIFT(A)
010700,,SHIFT(A) ;RIGHTMOST
SHIFT: ASCII \EA SIU
DRJNFCKTZLWHYPQOBGMXV
! -'+, ( ?&:.\
NOSHFT: ASCII \ea siu
drjnfcktzlwhypqobgmxv 3
$ 87'-4, 5) 2609;.1\
DPK==604 ;ROUTINE TO REINITIALIZE DATAPOINT KLUDGE
..D604==0
DPKI: PUSHJ P,INITST ;GET SYSTEM SYMBOLS
MOVSI A,(SETZ)
.IOTLSR A,
CONO DPK,400070 ;CLEAR DPK, CLEAR PIA
MOVE A,DPKBAS
HRLI A,4
DATAO DPK,A ;LOAD BASE REGISTER
MOVEI B,0 ;DPK LINE #
MOVE C,NFDPTY ;ITS LINE #
MOVN A,NDPTYS
HRL C,A
DPKI1: MOVE A,TTYTYP
ADDI A,(C)
HRLI A,A
MOVSS A
.GETLOC A,
LDB D,[$TTOSP,,A] ;OUT SPEED
MOVE D,DPSP(D) ;TRANSLATE TO DPK CODE
LSH D,9
DPB B,[140400,,D] ;LINE#
CONO DPK,500(D) ;LOAD OUT SPEED
LDB D,[$TTISP,,A] ;IN SPEED
MOVE D,DPSP(D)
LSH D,9
DPB B,[140400,,D]
CONO DPK,700(D) ;LOAD IN SPEED
AOS B
AOBJN C,DPKI1
CONO DPK,@TTYCHN ;DPK READY, ALLOW INTERRUPTS
SETZ A,
.IOTLSR A,
MOVEI B,[ASCIZ/
DPK RE-INITIALIZED/]
PUSHJ P,QEXPL2
JRST BLUP
CTEST: .SUSET [.RUNAME,,XUNAME]
PUSHJ P,RAN7
IRPC X,,0123456
DPB A,[270400,,CDPB!X]
TERMIN
CDPB0: .STATUS .,B
ANDI B,77
SKIPN B
JRST CTEST2 ;CH NOT OPEN
CAIE B,61
JRST CTEST ;CH PROBABLY BEING USED TO LOCK TTY
CDPB1: .UCLOSE .,
CTEST2: .GENSYM B,
MOVEM B,XJNAME
CDPB2: .OPEN .,XDEV
JRST CTEST
CDPB3: .USET .,[.SMEMT,,[PRGLEN*2000]]
MOVE B,[-PRGLEN*2000,,0]
CDPB6: .IOT .,B
PUSHJ P,RAN7
MOVEI B,CCORE
SKIPN A
MOVEI B,CTEST
CDPB4: .USET .,[.SUPC,,B]
CDPB5: .USET .,[.SUSTP,,[0]]
PUSHJ P,RAN17
.SLEEP 1,
JRST CTEST
XDEV: 3,,(SIXBIT /USR/)
XUNAME: 0
XJNAME: 0
CCORE: PUSHJ P,RAN17
.CORE PRGLEN(A)
SOJA A,.-1
PUSHJ P,RAN17
.SLEEP 1,
JRST CCORE
RAN17: SKIPA C,[17]
RAN7: MOVEI C,7
RAND: .RDTIME A,
XOR A,RANDN
FMPB A,RANDN
AND A,C
POPJ P,
RANDN: 3.14159
TITYOT: MOVEI A,TYOC
DITYOT: DPB A,[270400,,IOINST]
ITYOUT: HRLI C,440600
ITYOT2: ILDB D,C
CAIN D,'!
POPJ P,
CAIN D,'?
JRST ITYCRR
ADDI D,40
IOINST: .IOT .,D
JRST ITYOT2
ITYCRR: PUSHJ P,CRRF
JRST ITYOT2
TTYSTA: DPB A,[270400,,.+1]
.STATUS .,B
ANDI B,77
POPJ P,
CRRF: MOVEI D,15
XCT IOINST
MOVEI D,12
XCT IOINST
POPJ P,
TCRR: .IOT TYOC,[15]
.IOT TYOC,[12]
POPJ P,
RCAARG: MOVE E,TNUM
MOVEM E,FOBY
JRST RCAVI1
RCAVIC: PUSHJ P,AITEST
JRST QLUP
SKIPE TNUM
JRST RCAARG
RCAVI1: MOVE E,LIT+7
SETZ F,
.CORE 13
.LOSE 1000
.CALL LIT
.LOSE 1000
JUMPA G,CPL24
MOVSI E,760264
SETZ F,
CPL: MOVEI H,674
MOVEI E,400000
MOVEI F,24424
HRLI E,-22
MOVE (E)
MOVEM (F)
AOS F
AOBJN E,CPL+4
SUBI F,44
SOJG H,CPL+3
JUMPA F,CPL16
.LOSE 1000
.CORE 2
.LOSE 1000
JRST QLUP
CPL16: MOVSI E,5000
HRRI E,400000
BLT E,417467
.OPEN LIT+10
JUMPA E,CPL+13
JUMPA E,CPL+14
CPL24: SKIPGE E,FOBY
.SUSET FOBY+1
.CALL FOBY+2
.LOSE 1000
LSH F,24
TLO F,36000
.SUSET FOBY+7
JUMPA E,RCAVI1+7
JUMPA E,RCAVI1+10
LIT: SETZ
SIXBIT /CORBLK/
MOVEI 110000
MOVEI -1
MOVE E
MOVEI -2
SETZ F
-10,,200
20004,,646471
0
FOBY: -1
.RCNSL,,E
SETZ
SIXBIT /TVWHER/
MOVEI 400000(E)
MOVEM E
SETZM F
.STVCREG,,F
0
VTFIXR: .CALL [ SETZ ;FIX A VT52 IN ALTERNATE CHAR SET MODE.
SIXBIT /OPEN/
[%TJSIO+.UIO,,TYOC] ;OPEN TTY FOR SUPERIMAGE OUTPUT
SETZ [SIXBIT /TTY/]]
.LOSE %LSSYS
.IOT TYOC,["]
.IOT TYOC,["G] ;Normal char set
.IOT TYOC,["]
.IOT TYOC,["\] ;not hold-screen mode.
.BREAK 16,160000
PAT:
PATCH: BLOCK 40
EPATCH: -1
TNUM: 0
TTY: SIXBIT / TTY.LOCK..LOCK./
TY.: 5,,(SIXBIT /T00/)
SIXBIT /.LOCK./
RUNAME: BLOCK 1
SIXBIT /?!/
CHARAY: -MXCH-1,,0
BLOCK MXCH+1
PDL: BLOCK 20
CONSTANTS
VARIABLES
NPATCH: BLOCK 20
PRGLEN==<.+1777>/2000 ;NUMBER OF 1K BLOCKS
END BEG