Consolidate license copies
[its.git] / system / its.1644
1 ;-*-MIDAS-*-
2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;;
4 ;;; This program is free software; you can redistribute it and/or
5 ;;; modify it under the terms of the GNU General Public License as
6 ;;; published by the Free Software Foundation; either version 3 of the
7 ;;; License, or (at your option) any later version.
8 ;;;
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 ;;; General Public License for more details.
13 ;;;
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program; if not, write to the Free Software
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18
19 .SYMTAB 12003.,5500.
20 TITLE ITS
21
22 SUBTTL DEFINITIONS
23
24 .NSTGWD         .SEE PATB       ;NO STORAGE WORDS ALLOWED UNTIL PATB
25
26 IF1 [ PRINTX \MACHINE NAME = \
27 ;WELL-KNOWN MACHINE NAMES ARE:
28 ;       AIKA    AI LAB KA10 (R.I.P.)
29 ;       MLKA    MATHLAB KA10 (R.I.P.)
30 ;       DM      DYNAMIC MODELING KA10 (R.I.P.)
31 ;       MC      Mail Computer KS10
32 ;       AI      AI Lab KS10
33 ;       MX      The ex-MC KL10
34 ;       ML      Math Lab KS10
35 ;       MD      Mostly Development KS10
36 ;       SI      Stacken ITS KS10
37 ;       FU      Australian KS10
38 ;       PM      PandaMonium KS10
39 ;       DX      DigeX KS10
40 ;THE FILE "CONFIG" HAS ASSEMBLY SWITCHES AS A FUNCTION OF MACHINE.
41
42 .TTYMAC A
43 IFN ASCII/A/&ASCII/     /,.FATAL USE UPPER CASE!
44 DEFINE MCOND X          ;0 IFF THIS IS MACHINE X.
45 <IFSN X,A,[1]>,TERMIN
46 DEFINE MNAME X          ;USED TO SUBSTITUTE IN THIS MACHINE'S NAME.
47 X!!A!!TERMIN
48 FOO==.TTYFLG            ;MAKE ERR FILE LOOK NICE
49 .TTYFLG==1
50 PRINTX/A
51 /
52 .TTYFLG==FOO
53 TERMIN  ];IF1
54
55 IFNDEF PCLSW,PCLSW==1           ;1 => ASSEMBLE PCLSR TEST FEATURE
56 IFNDEF TT11BY,TT11BY==8         ;PDP11-TV OUTPUT BUFFER BYTE SIZE.
57 .MLLIT==1                       ;MULTI-LINE LITERAL MODE
58 ASTIME==.OP .OPER+@,0,.RTIME    ;GET ASSEMBLY TIME AND DATE IN SIXBIT.
59 ASDATE==.OP .OPER+@,0,.RDATE    ;RH OF INSN MUST BE 0, SO MIDAS WILL PUT IN PROPER AC FLD.
60
61 ;AC DEFS
62
63 A=1
64 B=2
65 C=3
66 D=4
67 E=5
68 TT=6
69 I=7
70 Q=10
71 J=11
72 R=12
73 W=13
74 H=14
75 P=15    ;DO NOT CHANGE! ;PDL POINTER
76 T=16    ;"
77 U=17    ;"              ;USER INDEX
78
79 .XCREF A,B,C,D,E,TT,I,Q,J,R,W,H,P,T,U
80
81 IF1 EXPUNGE APR,OCT,DEC ;FOR NEW CALENDAR HACK
82
83 NULBLK==4       ;NUMBER OF LOCKED SWITCH BLKS IN USR VARIABLES
84                 ;USES 2 WDS OF USER VAR PER
85
86 NPVSEC==30.     ;NUMBER OF SECONDS A USER IS ALLOWED TO BE IN THE PRIVILEDGED SWAPPING CLASS
87 IF2 LIOBLK==<USRSTG+LUBLK*MAXJ+1777>_-10.  ;LOWEST BLOCK NEVER TO BE SHUFFLED
88                         ;ALSO MAX # OF BLOCKS SYS JOB MAY HAVE
89 IF2 MAXJ==<LIOBLK_10.-USRSTG>/LUBLK     ;ROUND UP TO ACTUAL MAX #JOBS
90
91 DIRMAP==1       ;ENABLE DIRECT MAPPING OF HIGH HALF
92                 ;I DON'T THINK IT WORKS TO TURN THIS OFF.
93 NIOCHN==20      ;NUMBER OF I/O CHANNELS PER USER
94 \f
95 DEFINE $INSRT $%$%$%    ;PRINTX MESSAGE WHEN FILE GETS INSERTED
96         .INSRT $%$%$% >
97         PRINTX \    ==> INSERTED:  \
98         .TYO6 .IFNM1
99         .TYO 40
100         .TYO6 .IFNM2
101 PRINTX \
102 \
103 TERMIN
104
105 ;;; CONFIG uses this macro...
106 DEFINE CONC A,B
107 A!B!TERMIN
108
109 $INSRT CONFIG           ;CONFIGURATION SWITCHES FOR ALL KNOWN MACHINES
110
111 $INSRT BITS             ;DEFINITIONS OF MANY BIT NAMES
112
113 ;IN BADBTS => CLASS 2 OR 1 INTERRUPT   ;IN VBDBTS=> CLASS 1 INTERRUPT
114 VBDBTS==%PIB42\%PIVAL\%PIBRK\%PIC.Z\%PI1PR\%PITRP\%PIDCL
115 BADBTS==VBDBTS\%PIMPV\%PIIOC\%PIILO\%PIMAR\%PIDIS\%PIOOB\%PILOS\%PIFET\%PIWRO\%PIPAR\%PITTY\%PIPDL\%PINXI
116
117 UUOMIN==40000,, ;SMALLEST NUM THAT COULD BE A SYSTEM CALL
118 UUOMAX==50000,, ;ONE GREATER THAN LARGEST NUM "
119 UIOT=UUOMAX     ;USE FOR USER I/O INST TRAP
120
121         ;MAX DYN ALLOC ALLOC IO BUFFERS
122 MXIOB==100      ;MAX POSSIBLE
123
124 SIOMT==50       ;MAX SIZE TRANSLATION TABLE
125
126 LUPDL==50       ;LENGTH USER PDL MUST BE >= 40 FOR 2311 GC
127 LUIOP==20       ;LENGTH OF USER IO PDL
128 CPDLL==40       ;LENGTH CLOCK CHANNEL PDL
129 LUTCP==40       ;LENGTH UTC PDL (NETWORKS AND DISKS)
130 LSYSP==100      ;SYSTEM JOB PDL
131 LTTYP==40       ;LENGTH OF TTY (INTERRUPT LEVEL) PDL
132
133 DMNSZ==20       ;# ENTRIES IN DEMON BUFFER (DMNBF)
134
135 MXCZS==5        ;MAX NUMBER ^Z'S PER CLOCK BREAK
136
137 SCLKI==30.      ;60'THS PER SLOW CLOCK
138 VSCLKI==2*60.*60.       ;60'THS PER VERY SLOW CLOCK TICK
139 MXOPT==8.       ;SLOW CLOCK  MAX UT OP CAN TAKE
140 NINFP==8.       .SEE UFIN       ;MAX # OF DIRECT INFERIORS A PROCEDURE MAY HAVE
141
142 SSCHDB==100     ;LENGTH OF SCHEDULER HISTORY BUFFER
143
144 SPD==60.*60.*24.        ;# SECS IN A DAY (FITS IN A HALFWORD)
145         PDUPS==60.      ;# PDCLK INCREMENTS/SEC
146
147 OPNCOM==410300  ;COMMAND FIELD IN LH OF FIRST OPEN WORD
148
149 IFN 340P,N340PB==10.    ;# EXEC PGS USED FOR 340 DATA MUST BE EVEN
150 IFN N11TYS,[
151         NTTPG==6        ;# EXEC PGS FOR PDP11 TV TTYS.
152         NTVBP==11       ;THESE PAGES ADDRESS THE WHOLE VIDEO BUFFER MEMORY ADDRESS
153                         ;SPACE OF THE TV 11.  THE LAST OF THESE ADDRESSES THE
154                         ;TV CONSOLE REGISTER
155 ]
156 NUVPG==256.             ;NUMBER OF VIRTUAL PAGES PER USER.  SIZE OF PAGE TABLE VARS.
157                         ;DON'T TRY TO CHANGE THIS.
158 ;CIRCULAR PAGE LINK FORM
159 ;2.9=0
160 ;1.1-1.8 PAGE #
161 ;2.8-1.9 USER #
162 ;2.9=1
163 ;2.8=0 2.7-1.1 LINK TO MMP TABLE
164 ;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE
165 ;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED
166 \f
167 SUBTTL GOBBLE TTYTYP FILE
168
169 IFN XGP\N11TYS,[IFE TEN11P,[
170         .ERR XGP OR N11TYS WITHOUT TEN11P
171         N11TYS==0
172         XGP==0
173 ]
174 ]
175 IFNDEF UNSPLP,UNSPLP==<TTLPTP+OLPTP+NLPTP>*DEMON*<1-TPLP>
176         ;1 IF THE "UNSPOO" PROGRAM DOES LPT SPOOLING.
177
178 IFNDEF TSYSM,[
179 MNAME PRINTX \NO PARAMS KNOWN FOR , MACHINE.
180 \
181 .INSRT TTY:
182 ]
183
184 IF2,[
185 ;TTY LINES DEFINITIONS
186
187 ;MACRO WHICH RETURNS THE %TY BIT FOR THE CONTROLLER ACCORDING TO THE LINE NUMBER
188
189 DEFINE CNTRLR <N>
190 IRPS F,,[0      NFKSTY  NFETY   NFNTY   NFNVTY  NFDZTY  NFDPTY  NFMTY   NFDLTY  NFSTTY  NF11TY
191    ]NT,,[NOTYS  NKSTYS  NETYS   NNTYS   NNVTTS  NDZTYS  NDPTYS  NMTYS   NDLTYS  NSTTYS  N11TYS
192    ]FG,,[%TYOTY %TYKST  %TYETY  %TYNTY  %TYNVA  %TYDZT  %TYDPK  %TYMTY  %TYDL   %TYSTY  %TY11T]
193  IFGE <N>-F,[IFL <N>-<F+NT>,[FG]]TERMIN TERMIN
194
195 ;MACRO WHICH RETURNS $TTISP, $TTOSP BITS GIVEN BAUD RATES
196
197 DEFINE SPEEDC <IBAUD,OBAUD>
198 <IFB IBAUD,[SPEED1 OBAUD]IFNB IBAUD,[SPEED1 IBAUD]>*%TTISP+<SPEED1 OBAUD>*%TTOSP!TERMIN
199
200 DEFINE SPEED1 <BAUD>
201 IRPS BD,,[0   600 110 150 300 1200 1800 2400 4800 9600 25K 40K 50K 80K
202     ]CD,,[0   1   2   3   4   5    6    7    10   11   12  13  14  15  ]
203 IFSE BAUD,BD,[CD] TERMIN TERMIN
204
205 ;KEYWORD PARAMETERS TO TTY DEFINITION MACROS
206 ; FOR OVER-RIDING DEFAULTS
207 ;SPEED  NUMBER OF BAUDS OUTPUT
208 ;ISPEED NUMBER OF BAUDS INPUT IF DIFFERENT
209 ;TT     LH(TTTYP)       IN ADDITION TO SPEED CODE
210 ;TY     RH(TTYTYP)      IN ADDITION TO CONTROLLER BIT
211 ;TO     LH(TTYOPT)      IN ADDITION TO USUAL CODES FOR TERMINAL TYPE
212 ;TP     RH(TTYOPT)      IN ADDITION TO PAD CODES
213 ;TCT    TCTYP
214 ;HOR    SCREEN WIDTH
215 ;VER    SCREEN HEIGHT
216 ;ROL    LINES PER GLITCH WHEN SCROLLING
217
218 ;DEFINE TTY AS PRINTING.
219 ;IF SPEED IS 110, ASSUME TTY IS TELETYPE,
220 ;MEANING CAN'T BS, STANDARDIZE ALTMODES.
221 ;IF KA10 CONSOLE TTY OR TK10 TTY, NEED PARITY
222 DEFINE TTDPRT N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNPRT,SMARTS=0
223 T!N!$SMT==SMARTS,,
224 T!N!$HOR==80.-IFE 110-SPEED,8
225 T!N!$VER==MOVE
226 T!N!$OPT==TO+%TOOVR+%TOALT+IFN 110-SPEED,[%TOMVB+%TOLWR-%TOALT],,<1+IFE 300-SPEED,[IFE TY&<%TYDIL\%TYRLM>,[3]]>*%TPPCR+TP
227 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>\<IFE N,[IFN NOTYS,[%TTPAR]]>\<IFGE N-NFNTY,[IFL N-<NFNTY+NNTYS>,[%TTPAR]]>,,TY+<CNTRLR N>
228 T!N!$TCT==TCT
229 T!N!$ROL==1
230 TERMIN
231
232 ;DEFINE TTY AS MEMOREX
233 DEFINE TTDMRX N,+SPEED=600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0
234 T!N!$SMT==SMARTS,,
235 T!N!$HOR==HOR
236 T!N!$VER==MOVE
237 T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,4*%TPPLF+6*%TPPCR+TP
238 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
239 T!N!$TCT==%TNMEM
240 T!N!$ROL==1
241 TERMIN
242
243 ;DEFINE TTY AS TERMINET.
244 DEFINE TTDTRM N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0
245 T!N!$SMT==SMARTS,,
246 T!N!$HOR==HOR
247 T!N!$VER==MOVE
248 T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,5*%TPPLF+TP
249 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
250 T!N!$TCT==%TNTRM
251 T!N!$ROL==1
252 TERMIN
253
254 ;DEFINE TTY AS A LPT.
255 DEFINE TTDLPT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=0,HOR=200.,TCT=%TNPRT,SMARTS=0
256 T!N!$SMT==SMARTS,,
257 T!N!$HOR==HOR
258 T!N!$VER==MOVE
259 T!N!$OPT==TO+%TOMVB+%TOOVR,,TP
260 T!N!$TYP==%TTDDI+TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
261 T!N!$TCT==TCT
262 T!N!$ROL==1
263 TERMIN
264
265 ;DEFINE TTY AS AN LA36 DECWRITER.
266 DEFINE TTDLA36 N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=132.,TCT=%TNPRT,SMARTS=0
267 T!N!$SMT==SMARTS,,
268 T!N!$HOR==HOR
269 T!N!$VER==MOVE
270 T!N!$OPT==TO+%TOMVB+%TOOVR+%TOLWR,,TP
271 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
272 T!N!$TCT==TCT
273 T!N!$ROL==1
274 TERMIN
275
276 ;DEFINE TTY AS IMLAC. (RUNNING SOFTWARE-TTY PROGRAM)
277 DEFINE TTDIML N,+SPEED=50K,ISPEED=25K,TT=0,TY=0,TO=0,TP=0,HOR=90.,VER=44.,TCT=%TNSFW,ROL=10.,SMARTS=%TQIM1
278 T!N!$SMT==SMARTS,,
279 T!N!$HOR==HOR
280 T!N!$VER==VER
281 T!N!$OPT==TO+%TOOVR+%TOLWR+%TOMVB+%TOMVU+%TOERS+%TOLID+%TOCID,,TP
282 T!N!$TYP==%TTDDI+TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
283 T!N!$TCT==TCT
284 T!N!$ROL==ROL
285 TERMIN
286
287 ;DEFINE TTY AS VT52
288 DEFINE TTDVT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNESC,ROL=1,SMARTS=0
289 T!N!$SMT==SMARTS,,
290 T!N!$HOR==HOR
291 T!N!$VER==VER
292 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS,,TP+%TPPTB*<IFE SPEED-9600,[1] .ELSE [3]>
293                                                 ;DIRECT POSITIONING LOSES AT 9600
294 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
295 T!N!$TCT==TCT
296 T!N!$ROL==ROL
297 TERMIN
298
299 ;DEFINE TTY AS H19
300 DEFINE TTDH19 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNH19,ROL=1,SMARTS=0
301 T!N!$SMT==SMARTS,,
302 T!N!$HOR==HOR
303 T!N!$VER==VER
304 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3
305 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
306 T!N!$TCT==TCT
307 T!N!$ROL==ROL
308 TERMIN
309
310 ;DEFINE TTY AS AAA
311 DEFINE TTDAAA N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS+%TPMTA,HOR=80.,VER=48.,TCT=%TNAAA,ROL=1,SMARTS=0
312 T!N!$SMT==SMARTS,,
313 T!N!$HOR==HOR
314 T!N!$VER==VER
315 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*2
316 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
317 T!N!$TCT==TCT
318 T!N!$ROL==ROL
319 TERMIN
320
321 ;DEFINE TTY AS C100
322 DEFINE TTDC100 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=79.,VER=24.,TCT=%TNHDS,ROL=1,SMARTS=0
323 T!N!$SMT==SMARTS,,
324 T!N!$HOR==HOR
325 T!N!$VER==VER
326 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3+<IFG SPEED-1200,%TPPCR>
327 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
328 T!N!$TCT==TCT
329 T!N!$ROL==ROL
330 TERMIN
331
332 ;DEFINE TTY AS TEKTRONIX.
333 DEFINE TTDTEK N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNTEK,HOR=73.,VER=35.,SMARTS=0
334 T!N!$SMT==SMARTS,,
335 T!N!$HOR==HOR
336 T!N!$VER==VER
337 T!N!$OPT==TO+%TOMVU+%TOOVR+%TOMVB+%TOLWR+%TOMOR,,TP
338 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
339 T!N!$TCT==TCT
340 T!N!$ROL==0
341 TERMIN
342
343 ;DEFINE TTY AS A LOSING DATAPOINT
344 DEFINE TTDLSR N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,SMARTS=0
345 T!N!$SMT==SMARTS,,
346 T!N!$TCT==%TNODP
347 T!N!$HOR==71.-IFN MCOND AIKA,1  ;OTHER DATAPOINTS HAVE SHORTER SCREENS.
348 T!N!$VER==25.
349 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP
350 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
351 T!N!$ROL==1
352 TERMIN
353
354 ;DEFINE TTY AS DATAPOINT.
355 DEFINE TTDDPT N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=[72.-IFN MCOND AIKA,[1]],SMARTS=0
356 T!N!$SMT==SMARTS,,
357 T!N!$TCT==%TNDP
358 T!N!$HOR==HOR           ;OTHER DATAPOINTS HAVE SHORTER SCREENS.
359 T!N!$VER==25.
360 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP
361 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
362 T!N!$ROL==1
363 TERMIN
364
365 ;DEFINE TTY AS A TELERAY 1061
366 DEFINE TTDRAY N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,SMARTS=0
367 T!N!$SMT==SMARTS,,
368 T!N!$TCT==%TNRAY
369 T!N!$HOR==HOR
370 T!N!$VER==24.
371 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOERS+%TOLWR+%TOLID+%TOCID,,3*%TPPTB+TP
372 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
373 T!N!$ROL==1
374 TERMIN
375
376 ;DEFINE A TTY THAT IS A GT40.
377 DEFINE TTDGT40 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNDP,HOR=72.,VER=32.,ROL=1,SMARTS=0
378 T!N!$SMT==SMARTS,,
379 T!N!$HOR==HOR
380 T!N!$VER==VER
381 T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOOVR+%TOLWR,,TP
382 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
383 T!N!$TCT==TCT
384 T!N!$ROL==ROL
385 TERMIN
386
387 ;DEFINE A TTY THAT IS A LINE TO A PDP11.
388 DEFINE TTD11 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=0,TCT=%TNPRT,HOR=72.,VER=MOVE,ROL=1,SMARTS=0
389 T!N!$SMT==SMARTS,,
390 T!N!$HOR==HOR
391 T!N!$VER==VER
392 T!N!$OPT==TO+%TOMVB+%TOOVR+%TOALT,,TP
393 T!N!$TYP==TT+%TTDDI+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
394 T!N!$TCT==TCT
395 T!N!$ROL==ROL
396 TERMIN
397
398 ;DEFINE A TTY THAT IS RANDOM.
399 DEFINE TTDRAN N,+SPEED=FOO.,ISPEED=,TT=0,TY=0,TO=FOO.,TP=FOO.,TCT=FOO.,HOR=FOO.,VER=FOO.,ROL=FOO.,SMARTS=0
400 T!N!$SMT==SMARTS,,
401 T!N!$HOR==HOR
402 T!N!$VER==VER
403 T!N!$OPT==TO,,TP
404 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
405 T!N!$TCT==TCT
406 T!N!$ROL==ROL
407 TERMIN
408
409 ;DATAMEDIA
410 DEFINE TTDDTM N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS+3*%TPPCR,HOR=80.,VER=24.
411 T!N!$SMT==0
412 T!N!$HOR==HOR
413 T!N!$VER==VER
414 T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOLWR+%TOLID+%TOCID,,TP
415 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
416 T!N!$TCT==%TNDTM
417 T!N!$ROL==1
418 TERMIN
419
420 ;DEFINE A PDP11 TV COMMUNICATING VIA TEN-11 INTERFACE.  NO OPTIONS.
421 DEFINE TTDTV N
422 T!N!$SMT==%TQGRF+%TQVIR+%TQREC+%TQXOR+<.DPB 14,<.BP %TQHGT>>+<.DPB 6,<.BP %TQWID>>,,%TRSCN
423 T!N!$HOR==96.
424 T!N!$VER==45
425 T!N!$OPT==%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI+%TOLID+%TOCID,,%TP11T+%TPRSC
426 T!N!$TYP==%TTLCL+<SPEEDC 9600,9600>,,%TY11T
427 T!N!$TCT==%TNTV
428 T!N!$ROL==4
429 TERMIN
430
431 ;DEFINE A PDP11 TV COMMUNICATING AS A SOFTWARE TTY.  TYPICALLY A GRINNELL (512x512).
432 DEFINE TTDGRN N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPCBS+%TPORS,HOR=86.,VER=50.,TCT=%TNSFW,ROL=0,SMARTS=0
433 T!N!$SMT==SMARTS,,
434 T!N!$HOR==HOR
435 T!N!$VER==VER
436 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI,,TP
437 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
438 T!N!$TCT==TCT
439 T!N!$ROL==ROL
440 TERMIN
441
442 ;DEFINE AN STY LINE.  NO OPTIONS.
443 DEFINE TTDSTY N
444 T!N!$SMT==0,,
445 T!N!$HOR==81.
446 T!N!$VER==MOVE
447 T!N!$OPT==%TOMVB+%TOOVR+%TOLWR+%TORAW,,%TPORS
448 T!N!$TYP==%TYSTY
449 T!N!$TCT==%TNPRT
450 T!N!$ROL==1
451 TERMIN
452
453 DEFINE MCONDX MCHN
454 IFE MCOND MCHN,TERMIN
455
456 ;;; THE NEXT TWO MACROS CAUSE TTYTYP FILE TO BE INSERTABLE BY BOTH
457 ;;; PDP-10 AND PDP-11 PROGRAMS.
458
459 DEFINE .ENDC
460 TERMIN
461
462 DEFINE .ENDR
463 TERMIN
464
465         .CRFOFF
466 $INSRT TTYTYP
467         .CRFON
468 EXPUNGE TTDPRT,TTDTRM,TTDDPT,TTDMRX,TTDGT40,TTD11,TTDRAN,TTDGRN,TTDVT,TTDTEK
469 EXPUNGE TTDTV,TTD2741,TTDSTY,TTDLPT,TTDIML,TTDLA36,TTDLSR
470 EXPUNGE SPEEDC,SPEED1,CNTRLR,MCONDX,.ENDC,.ENDR
471 ]               ;END OF IF2
472 \f
473 SUBTTL BUG MACROLOGY
474
475 ;Macro for reporting a bug or other interesting condition
476 ;Use this in place of JRST 4, especially when condition is automatically
477 ;recoverable or wants explanation typed out for benefit of loser.
478 ;
479 ;First argument is one of the following symbols:
480 ;       INFO - just print on the system console
481 ;       CHECK - same as INFO unless SYSDBG non-zero or buffer full, then same as PAUSE
482 ;       PAUSE - print message, go to DDT, allow alt-P
483 ;       HALT - print message, go to DDT, do not allow alt-P
484 ;       DDT - PAUSE but not because of a bug (shorter message), allow alt-P
485 ;       AWFUL - same as HALT but usable when there is no pdl in P
486 ;         Should there be a combination of AWFUL and PAUSE?
487 ;         That would require restoring P upon attempt to continue
488 ;Arguments after the first are either strings to be printed
489 ;(enclose in brackets), or format,value pairs.  Value is any
490 ;address; indexing and indirection are allowed, however registers
491 ;P and TT may not be referenced.
492 ;A format is one of the following symbols:
493 ;       OCT - octal number, with ,, if bits on in the left halt
494 ;       DEC - decimal number
495 ;       THOU - decimal number with commas every three digits
496 ;       CR - print a carriage return (unfortunately swallows and ignores an arg)
497 ;       SIXBIT - sixbit word
498 ;       ASCIZ - asciz string
499 ;Undefined formats will be taken as strings to be printed.
500 ;The maximum number of value arguments is 6
501 ;A space is printed after each formatted value.  A space is also
502 ;printed after the last string and before any additional formatted values.
503 ;
504 ;With no arguments, BUG may be used in place of JRST 4,.
505 ;It uses the same amount of storage but has the advantage of going
506 ;straight to DDT.  In this case there won't be a specific message
507 ;about what the bug was, of course.
508 ;
509 ;Note that the BUG macro always generates one word of code, and hence
510 ;may be skipped over.
511 ;All registers are preserved.
512 ;P must point at a valid PDL.
513 ;
514 ;Due to Midas inadequacy, the BUG macro may not be used from inside
515 ;a literal.  You will get an error (label inside brackets) if you try it.
516 ;
517 ;Example:
518 ;       BUG PAUSE,[DSK: DRIVE NUMBER ],OCT,Q,[IS OFF-LINE.]
519 ;
520 DEFINE BUG FLAVOR,ARGS/
521 IFNB [FLAVOR][
522         ;Make sure we are not in a literal, since cannot get value of "."
523 BUGBUG: EXPUNGE BUGBUG
524         ;Generate call to appropriate flavour of subroutine
525   ZZ==0
526   IRPS FLA,,[INFO,CHECK,PAUSE,HALT,DDT]SUB,,[BUGINF,BUGCHK,BUGPSE,BUGHLT,BUGDDT]
527     IFSE [FLAVOR]FLA,[
528         PUSHJ P,SUB
529         ZZ==1 ]
530   TERMIN
531   IFSE [FLAVOR]AWFUL, JSR BUGAWF
532   .ELSE IFE ZZ, .ERR "FLAVOR" UNKNOWN FLAVOUR OF BUG
533
534   BUGB==0                       ;Initialize formatting bits
535
536         ;Initialize remote macros
537 DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003*
538 ZZ001!ZZ002!ZZ003!TERMIN
539
540 DEFINE BUGMC4 ZZ001
541 ZZ001
542 TERMIN
543
544   BUGN==0       ;number of accumulated arguments
545   BUGNN==0      ;total number of arguments
546   BUGF==0       ;next thing not argument
547   IRP ARG,,[ARGS]
548     ;; Processing "ARG"
549     IFN BUGF,[                  ;Address of word to print
550      BUGN==BUGN+1
551      BUGNN==BUGNN+1
552      BUGMC5 [ARG]
553      BUGF==0
554      ]
555    .ELSE [                      ;Name of format in which to print?
556     IRPS FMT,,OCT DEC THOU CR UNUSED5 SIXBIT ASCIZ
557       IFSE [ARG]FMT,[
558         BUGF==1
559         BUGB==BUGB+<<.IRPCNT+1>_<<5-BUGNN>*3>>
560         ]
561     TERMIN
562     IFE BUGF,[                  ;Just a string to be printed
563       IFN BUGN,[        ;Say to output some arguments before this string
564         BUGMC3 BUGN
565         BUGN==0
566         ]
567       BUGMC2 [ARG]
568       ] ]
569    TERMIN
570   IFG BUGNN-6, .ERR MORE THAN 6 WORDS TO BE PRINTED IN BUG MACRO
571         ;Make bug table entry: length,,pc ? bits,,string ? args
572   IF1, BUGMC1 'ZZ==[ASCIZ|',,'|]'
573   IF2,[
574    ZZ==.
575    LOC BUGTAB+LBUGTB
576    BUGNN+2,,ZZ
577    BUGMC1 'BUGB,,[ASCIZ|',,'|]'
578    BUGMC4
579    LOC ZZ
580    ]
581   LBUGTB==LBUGTB+BUGNN+2
582 ];end IFNB
583 .ELSE PUSHJ P,BUGNIL
584 TERMIN
585
586 LBUGTB==0       ;Initialize length of bug table
587
588 ;This support macro appends a string to the middle argument of BUGMC1
589 DEFINE BUGMC2 STRING
590 BUGMC1 //,[DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003*
591 ZZ001!ZZ002!]//,STRING!!ZZ003!TERMIN
592 TERMIN
593
594 ;This support macro appends a character, given by number, to the middle
595 ;argument of BUGMC1
596 ;Only for characters 0 through 7
597 DEFINE BUGMC3 #N
598 IRPC C,,.QUOTE/\0\ 1\ 2\ 3\ 4\ 5\ 6\a/
599  IFE .IRPCNT-N,{
600   BUGMC2 C
601   .ISTOP }
602 TERMIN
603 TERMIN
604
605 ;This one is a simple remote macro
606 DEFINE BUGMC5 STR
607 BUGMC4 [DEFINE BUGMC4 ZZ001
608 ZZ001]STR
609 TERMIN
610 TERMIN
611 \f
612 SUBTTL DEFINE PI CHANNELS
613
614 LPTP==OLPTP+NLPTP+GLPTP ;ANY KIND OF LPT EXCEPT A TTY LPT
615 IFE NMTCS,[             ;IF NO MAG TAPES AT ALL
616 TM10A==0                ; CAN'T HAVE ANY KIND!
617 TM10B==0
618 TM03S==0
619 ] ;IFE NMTCS
620 TM10P==TM10A+TM10B      ;SOME KIND OF A TM10 MAGTAPE PRESENT
621 IFN TABP,TABCLK==0      ;1=>PUT TABLET ON CLOCK CHNL
622
623 ;PRIORITY INTERRUPT CHANNEL ASSIGNMENTS
624                 DCCHN==1        ;DC CHANNEL
625                 DCLOC=40+2*DCCHN ;DC INTERRUPT LOCATION
626 IFN IMPP,       IMPCHN==1       ;IMP STUFF
627 IFN NETP,       NETCHN==2       ;SOFTWARE ACTIVATED...
628                 UTCCHN==2       ;UTC CHANNEL
629                 DSKCHN==UTCCHN  ;2314 CHANNEL
630                 MTCCHN==UTCCHN  ;MAG TAPE CONTROL CHANNEL
631                 LPTCHN==4       ;LINE PRINTER, PAPER TAPE, ETC. CHANNEL
632                 TTYCHN==3       ;TTY CHANNEL
633 IFN PLTP,       PLTCHN==4       ;PLOTTER CHANNEL
634 IFN PTRP,       PCHCHN==4       ;PTP CHANNEL
635 IFN PTRP,       PTRCHN==4       ;PAPER TAPE READER CHANNEL
636 IFN NTYP,       NTYCHN==4       ;NTY 11 KLUDGE
637 IFN 340P,       SDCHN==4        ;DISPLAY SPECIAL CHANNEL
638 IFN DSDP,       DSDCHN==4       ;INTERRUPT FROM OTHER PROCESSOR
639 IFN ARMP,       TIPBCH==5       ;ARM TIP BREAK CHNL
640 IFN OMXP,       OMPCHN==5       ;OUTPUT MULTIPLEXOR
641 IFN VIDP,       NVDCHN==5       ;NEW VIDI
642 IFN TABP,       IFE TABCLK,     TABCHN==5       ;TABLET
643 IFN 340P\E.SP,  DISCHN==6       ;DISPLAY DATA CHNL
644 IFN CH10P,      CHXCHN==5       ;CHAOSNET
645                         ;WOULD BE 6 BUT PI 6 BROKEN IN ML-KA TTLIOB
646 IFN CH11P,      CHXCHN==6       ;UNIBUS CHAOSNET PACKET COPYING
647 IFN TABP,       IFN TABCLK,     TABCHN==7       ;TABLET
648                 APRCHN==7       ;DO NOT CHANGE
649
650                 PIOFF==400      ;TURN OFF PI SYSTEM
651                 PION==200       ;TURN ON PI SYSTEM
652                 PICOFF==1200    ;TURN OFF PI CHANNEL
653                 PICON==2200     ;TURN ON PI CHANNEL
654                 PICIRQ==4200    ;REQUEST INTERRUPT ON PI CHANNEL
655                 CLKON==2201     ;ABSOLUTE
656                 CLKOFF==1201
657 IFN OMXP,       OMXON==CLKON\<400_-OMPCHN-1>
658 IFN OMXP,       OMXOFF==CLKOFF\<400_-OMPCHN-1>
659                 LPTON==CLKON\<400_-LPTCHN-1>
660                 LPTOFF==CLKOFF\<400_-LPTCHN-1>
661 IFN PTRP,       PTPON==CLKON\<400_-PCHCHN-1>
662 IFN PTRP,       PTROFF==CLKOFF\<400_-PCHCHN-1>
663 IFN PTRP,       PTRON==CLKON\<400_-PTRCHN-1>
664 IFN PTRP,       PTROFF==CLKOFF\<400_-PTRCHN-1>
665                 TTYON==CLKON\<400_-TTYCHN-1>
666                 TTYOFF==CLKOFF\<400_-TTYCHN-1>
667                 UTCON==CLKON\<400_-UTCCHN-1>
668                 UTCOFF==CLKOFF\<400_-UTCCHN-1>
669 IFN NETP,       NETON==UTCON
670 IFN NETP,       NETOFF==UTCOFF
671 IFN KL10P,      DTEON==CLKON
672 IFN KL10P,      DTEOFF==CLKOFF
673
674         DSKRQ==PICIRQ\PICON\<200_-DSKCHN> ;RQ INT + TURN ON FOR SAKE OF KL
675         MTCRQ==PICIRQ\PICON\<200_-MTCCHN>
676         UTCRQ==PICIRQ\PICON\<200_-UTCCHN>
677         TTYRQ==PICIRQ\PICON\<200_-TTYCHN>
678         CLKRQ==PICIRQ\PICON\<200_-APRCHN>
679 IFN NETP,NETRQ==PICIRQ\PION\<200_-NETCHN>       
680 IFN CH11P,CHXRQ==PICIRQ\PICON\<200_-CHXCHN>
681
682 IFN TABP,[
683 IFN TABCLK,[
684 TABON==CLKON
685 TABOFF==CLKOFF
686 ]
687 IFE TABCLK,[
688 TABON==CLKON\<400_-TABCHN-1>
689 TABOFF==CLKOFF\<400_-TABCHN-1>
690 ]
691 ]
692
693 IFN NUNITS, IFE NEWDTP, CUINT==5000+UTCCHN      ;CONO TO UTC TO ACTIVATE UTAPE INTERRUPT
694
695 PMLCAD==(.BP <PMRCM,,>) ;BYTE POINTER TO L.H. REAL CORE ADR
696 PMRCAD==(.BP PMRCM)     ;BYTE POINTER TO R.H. REAL CORE ADR
697 \f
698 SUBTTL DEFINE DEVICE CODES, IOBFT CHNL NUMBERS
699
700 IFN STKP,       STK==70         ;STANFORD KEYBOARD
701 IFN OLPTP,      OLPT==124       ;LINE PRINTER
702 IFN NLPTP,      NLPT==464
703 IFN TM10P,      MTC==340        ;MAG TAPE CONTROL
704 IFN TM10P,      MTS==344        ;MAG TAPE STATUS
705 IFN VIDP,       NVDX==620       ;NEW VIDI X
706 IFN VIDP,       NVDY==624       ;NEW VIDI Y
707 IFN VIDP,       NVDT==630       ;NEW VIDI T (DEFLECTION DELAY)
708 IFN PLTP,       PLT==654        ;CAL COMP PLOTTER
709 IFN HCLKP,      CLK1==710       ;HOLLOWAY CLOCK
710 IFN HCLKP,      CLK2==714       ; "
711 IFN IMXP,       MPX==574        ;INPUT MULTIPLEXOR
712 IFN OMXP,       OMPX==570       ;OUTPUT MULTIPLEXOR
713 IFN TK10P\NTYP, NTY==600        ;KNIGHT TTY KLUDGE
714 IFN MTYP,       MTY==400
715 IFN DL10P,      DLB==60         ;DL10 BASE
716 .ALSO           DLC==64         ;DL10 CONTROL
717 IFN PDCLKP,     PDCLK==500      ;DE-CORIOLIS CLOCK (FOR ML-KA AND DM, CALENDAR CLOCK)
718 IFN DSDP,       DSDEV==20       ;DE SELECTION AND INTER COM DEVICE
719 IFN DSDP,       DSDEVN==24      ;DE SELECTION DEV (FOR DEVICES YOU DATAO DEV CODE TO DSDEVN)
720 IFN ARMP,       TIPDEV==504     ;TIP BREAK DEVICE
721 IFN RBTCP,      RBTCON==514     ;ROBOT CONSOLE
722 IFN DPKPP,      DPK==604        ;DATA POINT KLUDGE
723 IFN DC10P,      DC0==610        ;2314 DISK CONTROL
724 IFN DC10P,      DC1==614        ;2314 DISK CONTROL
725 IFN RP10P,      DPC==250        ;RP10 DISK CONTROL
726 IFN RH10P,      DSK==270        ;RH10 DISK CONTROL
727 IFN KAIMP,      IMP==460        ; AI-KA/ML-KA/MC-KL IMP interface
728 IFN DMIMP,      FI==424         ; DM IMP hardware
729 IFN NUNITS,[
730 IFN NEWDTP,[
731         DTC==320
732         DTS==324
733 ]               ;END OF IFN NEWDTP
734 ]               ;END OF IFN NUNITS
735
736
737 ;IOBFT CHANNEL NUMBERS - 77 MEANS "FREE"
738
739 IFN NUNITS,     NUTIC==8        ;NUMBER UT IN CHNLS
740 .ELSE           NUTIC==0
741 IFN NUNITS,     NUTOC==8        ;NUMBER UT OUT CHNLS
742 .ELSE           NUTOC==0
743                 NFCLC==NUTIC+NUTOC+1    ;# OF FIRST CORE LINK CHNL
744                 NCLCH==14       ;NUMBER CORE LINK CHNLS
745                 NFNETC==NFCLC+NCLCH     ;# OF FIRST NCP NET CHNL (if any)
746                                         ;NNETCH DEFINED IN CONFIG
747 IFG NFNETC+NNETCH-77, .ERR TOO MANY IOBFT CHANNELS
748 \f
749 SUBTTL RANDOM DEFINITIONS FOR I/O DEVICES
750
751 IFN DSDP,       IFN VIDP,       DSNVID==200000,,        ;DEASSIGN BIT FOR NVD
752 IFN DSDP,       IFN 340P,       DSNDIS==4000,,  ;DEASSIGN BIT FOR DIS
753 IFN DSDP,       IFN NMTCS,      DSMTC==1,,      ;DEASSIGN BIT FOR MAG TAPE
754
755 IFN RBTCP,      RLTSWC==17      ;ROBOT CONSOLE SELECT FOR LIGHTS AND SWITCHES
756 IFN RBTCP,      IFN TABP,       RTABC==16       ;ROBOT CONSOLE SELECT FOR TABLET
757
758 IFN IMXP,       LCHN==177       ;MULTIPLEXOR LIMIT ON READ IN
759
760                 NUDCH==14       ;NUMBER DIRECTORY CHNLS
761 IFN IMXP,       NPOTCH==20.     ;NUMBER POT CHANNELS
762 IFG NQCHN+1+NQS-77, .ERR MORE THAN 6 BITS OF DISK CHANNEL NUMBER
763
764 IFN CODP,       CODBFL==5       ;CODE BUFFER
765 IFN PTRP,       PUNSIZ==20      ;PTP BUF SIZ
766 IFN PTRP,       REDSIZ==200     ;PTR BUF SIZ
767 IFN PLTP,       LPLBUF==200     ;PLT BUF SIZ
768 IFN LPTP,       LPTBSZ==1000    ;LPT BUF SIZ
769 IFN VIDP,       NVDLNG==340     ;NVD BUF SIZE
770 IFN TPLP,       TPLBSZ==100     ;TPL BUFFER SIZE IN SYS JOB
771 IFN TABP,       LTABBF==100     ;TABLET BUFFER
772 IFN N11TYS,     TT11CR==764044  ;UNIBUS ADR OF TV11 CONSOLE REG
773
774 EOFCH==3        ;SYSTEM END OF FILE CHR
775 EOFWRD=REPEAT 5,[EOFCH_<.RPCNT*7+1>\]0  ;WORD OF EOFCH'S
776
777 IFN 340P,       DVEF==4000      ;DISPLAY VERTICAL EDGE FLAG
778 IFN 340P,       DHEF==1000      ;DISPLAY HOR EDGE FLAG
779
780 IFN 340P,       EWRT==400./12.  ;EQIV "COST" IN DISPLAY WRDS FOR TRIP THRU RECYC
781 IFN 340P,       MDISWD=70000    ;MAX # WDS SENT TO SCOPE IN 1/2 SEC
782
783 NSWPV==E.SP\340P+VIDP+IMXP      ;# OF DEVICES THAT CAN SWAPIN PAGES
784
785 IFN C1MXP,[
786 IFN NMTCS,      MAGLOC==76      ;INTERRUPT LOCS FOR MAGTAPE
787 IFN NUNITS,     DCMLOC==74      ;"      "    FOR DC
788 IFN IMXP,       IMXLC==66       ;"     "   IMX
789 IFN IMPP,[
790                 IMPILC==70      ;INPUT FROM IMP
791                 IMPOLC==72      ;OUTPUT TO IMP
792 ]
793 ]
794
795 IFE C1MXP,[
796 IFN NMTCS,      MAGLOC==42
797 IFN NUNITS,     DCMLOC==42
798 ]
799 IFN PLTP,[
800 ;PLOTTER CONTROL BITS
801 SD==4000
802 PD==10000
803 PUP==200
804 PDN==400
805 SDC==20000
806 PDC==40000
807 SDS==1000
808 PDS==2000
809 ]
810 \fIFN KA10P,[
811
812 SUBTTL STUFF PECULIAR TO KA-10 PROCESSOR
813
814 ;;;PAGING BOX INSTRUCTIONS
815
816 LPM=102000,,    ;LOAD PG MEM STATE VECTOR DONT CLR ASSOC MEM
817 LPMR= LPM 2,    ;CLEAR ASSOC MEM AND LOAD
818 SPM= LPM 1,     ;STORE PG MEM STATE VECTOR
819 LPMRI=LPM 6,    ;LOAD PM, CLEAR ASSOC REG, AND CAUSE INTERRUPT
820 EXPGNG==4       .SEE UPQUAN     ;4 TO TURN ON EXEC PAGING
821 XCTR=103000,,   ;EXECUTE INSTRUCTION WITH MAPPING CONTROLLED BY AC FIELD
822                 ;VIOLATION CAUSES USER MEM PROTECT INTERRUPT UNLESS INHIBITED
823                 ;VIOLATION ALSO SKIPS BUT THIS IS OF NO CONSEQUENCE UNLESS
824                 ;INTERRUPT IS INHIBITED SINCE PC WILL BE RESET FROM OPC
825 XCTRI= XCTR 4,  ;XCTR WITH PAGE FAULT INHIBITED (SKIPS ON FAULT)
826                 ; AC FIELD VALUES FOR XCTR AND XCTRI
827         XR==1   ;MAP READ MAIN OPERAND OF SIMPLE INSTRUCTION (MOVE, SKIPL, HLL)
828         XW==2   ;MAP WRITE MAIN OPERAND OF SIMPLE INSTRUCTION (MOVEM)
829         XRW==3  ;MAP READ/WRITE OPERAND OF SIMPLE INSTRUCTION (E.G. IORM)
830         XBYTE==3;MAP BYTE DATA AND BYTE POINTER (ILDB, IDPB)
831         XBR==1  ;MAP BLT READ
832         XBW==2  ;MAP BLT WRITE
833         XBRW==3 ;MAP BOTH OPERANDS OF BLT
834                 ;KA10 PAGING BOX GOES BY WHETHER IT'S A READ OR WRITE (OR RW) CYCLE
835                 ;KL10 PAGING BOX WORKS DIFFERENTLY (SEE BELOW)
836                 ;DO NOT USE MULTI-OPERAND INSTRUCTIONS (DMOVE, PUSH, ETC.) WITH XCTR
837
838 DEFINE CLRPGM U ;CLEAR PAGER ASSOCIATIVE MEMORY.  ARG IS USUALLY "(U)".
839  SPM UPGML!U    ;STORE SO DON'T LOSE QUANTUM TIMER
840  LPMR UPGML!U
841 TERMIN
842
843 ;;; MISCELLANEOUS BUILTIN I/O DEVICES
844
845 PI==4           ;INTERRUPT SYSTEM
846 LIGHTS==PI      ;DEVICE CODE FOR DATAO THAT SETS CONSOLE LIGHTS.
847 CLK==0          ;DEVICE CODE FOR 60 HZ CLOCK INTERRUPT (APR)
848 CLKINT==1000    ;CONI CLK, BIT FOR INTERRUPT.  ALSO CONO BIT TO CLEAR.
849 PTR==104        ;PAPER TAPE READER
850 PTP==100        ;PAPER TAPE PUNCH
851 TTY==120        ;CONSOLE TTY
852 DTC==320        ;DECTAPE CONTROL
853 IFN 340P, DIS==130      ;340 DISPLAY
854
855 PI0LOC==40      ;INTERRUPT VECTOR BASE
856
857 OIPBIT==%PC1PR  ;PC BITS FOR 1-PROCEED.
858 BADPC==%PCUIO+%PCSPC+37 ;BITS IN PC USER NOT ALLOWED TO TURN ON
859
860 DEFINE UUOH     ;UUO HANDLER LOCATIONMS ARE REFERENCED THROUGH THESE MACROS
861 XUUOH!TERMIN
862
863 DEFINE FORTY
864 40!TERMIN
865
866 DEFINE SYSCTX   ;SET UUO LEVEL AC BLOCKS
867 TERMIN
868
869 DEFINE USRCTX   ;SET USER-MODE AC BLOCKS
870 TERMIN
871
872 DEFINE OVHMTR NAME      ;OVERHEAD METERING DOESN'T WORK ON KA'S
873 TERMIN
874 ]               ;END OF IFN KA10P
875 \fIFN KL10P,[
876
877 SUBTTL STUFF PECULIAR TO KL-10 PROCESSOR
878
879 ;;;PAGING BOX INSTRUCTIONS
880
881 XCTR=074000,,   ;EXECUTE INSTRUCTION WITH MAPPING, PAGE FAILS ENABLED
882 XCTRI=075000,,  ;SAME BUT SKIPS IF THERE IS PAGE FAIL (DONE SNEAKILY BY SOFTWARE)
883 LPMR=076000,,   ;LOAD PAGER MEMORY (JPC, DBRS) AND CLEAR PT DIR
884 SPM=077000,,    ;STORE PAGER MEMORY
885                 ;AC FIELD VALUES FOR XCTR AND XCTRI
886         XR==4   ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING)
887         XW==4   ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR WRITING)
888         XRW==4  ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING AND WRITING)
889         XBYTE==5;MAP BYTE DATA AND BYTE POINTER
890         XBR==1  ;MAP BLT SOURCE
891         XBW==4  ;MAP BLT DESTINATION
892         XBRW==5 ;MAP BOTH BLT OPERANDS
893         XEA==16 ;MAP EFFECTIVE ADDRESS COMPUTATION
894                 ;IN KL10 BITS ARE:  14 INDIRECT WORDS
895                 ;                   10 XR UNDER SOME RANDOM WIERD CONDITIONS (?)
896                 ;                    4 MAIN OPERAND "  "  " ALSO BYTE WRITE
897                 ;                    2 INDEX REGISTER, @ AND XR IN BYTE PTRS
898                 ;                    1 2ND OPND - BLT SOURCE, BYTE READ, STACK DATA
899
900 DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS.  ARG IS USUALLY "(U)".
901  CONO PAG,660000+<EPT/1000>
902 TERMIN
903
904 ;;; INTERNAL "I/O" DEVICES
905
906 PI==4           ;INTERRUPT SYSTEM
907 PAG==10         ;CONO, DATAO PAG SET UP PAGING
908  ..D010==0      ;FOR DDT
909 CCA==14         ;CACHE OPERATIONS
910 TIM==20         ;TIMER DEVICE
911 MTR==24         ;METERS DEVICE
912
913 IFN PDCLKP,[    ;IF THIS KL-10 HAS FREEMAN KL-UDGE BOARD,
914 LIGHTS==500     ;DATAO LIGHTS, SETS CONSOLE LIGHTS.
915 CLK==500        ;60 HZ CLOCK INTERRUPT (ON KL-UDGE BOARD)
916 CLKINT==10      ;CONI CLK, BIT FOR INTERRUPT.  ALSO CONO BIT TO CLEAR.
917                 ;ALSO DATAI 500, IS THE DECORIOLIS CLOCK.
918                 ;AND CONO 500,400000 TURNS CLOCK BACK ON AFTER POWER FAIL.
919 ]
920
921 OIPBIT==%PS1PR  ;1-PROCEED BITS IN THE PC.
922 BADPC==%PSUIO+37        ;%PSPUB IS OK?
923
924 ;;; SPECIAL INSTRUCTIONS
925
926 SWPIA=DATAI CCA,        ;INVALIDATE WHOLE CACHE
927 SWPIO=CONI CCA,         ;INVALIDATE ONE PAGE OF CACHE
928 SWPUO=CONSO CCA,        ;UNLOAD ONE PAGE OF CACHE
929 SWPUA=DATAO CCA,        ;UNLOAD WHOLE CACHE
930 WRPAE=702100,,          ;WRITE PERFORMANCE-COUNTER ENABLES
931 APRID==BLKI             ;READ CPU SERIAL NUMBER AND OPTIONS
932 RDERA=BLKI PI,          ;READ ERROR ADDRESS
933 RCCL=DATAI TIM,         ;READ CALENDAR CLOCK (DOUBLE WORD)
934 RPERFC=BLKI TIM,        ;READ PERFORMANCE COUNTER (DOUBLE WORD)
935 REBOXC=DATAI MTR,       ;READ EBOX CYCLE COUNTER (DOUBLE WORD)
936 RMBOXC=BLKI MTR,        ;READ MBOX CYCLE COUNTER (DOUBLE WORD)
937
938 ;;;EPT LOCATIONS
939
940 $INSRT EPT
941
942 ;;;PAGE FAIL WORD - UPFW(U)
943
944  %PF==1,,405000
945  %PFUSR==400000         ;USER PAGE
946  %PFCOD==370000         ;FAILURE CODE:
947   %PFPRO==210000        ;PROPRIETARY VIOLATION
948   %PFMAR==230000        ;MAR BREAK
949   %PFILW==240000        ;ILLEGAL WRITE IN READ ONLY
950   %PFPNA==330000        ;PAGE NO ACCESS
951   %PFPTP==250000        ;PAGE TABLE PARITY
952   %PFPAR==360000        ;PARITY ERROR, DATA IN AR
953   %PFPRX==370000        ;PARITY ERROR, DATA IN ARX
954  %PFPUB==4000           ;PUBLIC PAGE
955  %PFCCH==2000           ;CACHED
956  %PFPAG==1000           ;PAGED
957  $PFPNO==121000         ;VIRTUAL PAGE NUMBER
958                         ;1.1-3.5 VIRTUAL ADDRESS
959
960 DEFINE UUOH     ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS
961 XUUOH(U)TERMIN
962
963 DEFINE FORTY
964 MUUODP(U)TERMIN
965
966 ;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR) OLDACS,
967 ; UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME FOR UPT.
968 ; DISABLE, IF NONBLANK, CAUSES ACCOUNTING UPDATING NOT TO BE DONE EVEN THOUGH
969 ; UPT IS BEING SET.
970 DEFINE SPCCTX CURACS,OLDACS,UPT,DISABLE
971 DATAO PAG,[IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+2^13+CURACS_33+OLDACS_30+UPT/1000+400000-IFNB UPT,[IFB DISABLE,[400000]]]
972 TERMIN
973
974 SYSCTX=SPCCTX 0,1       ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1.
975 USRCTX=SPCCTX 1,1       ;USERS RUN IN BLOCK 1.
976 IRPC N,,[234567]
977  AC!N!CTX=SPCCTX 0,N    ;CUR AC 0, PREV N.  USE XCTR TO ACCESS SPECIAL ACS
978 TERMIN
979
980 ;AC BLOCK USAGE:
981 ; 0   ACCUMULATORS FOR SYSTEM (AT UUO LEVEL)
982 ; 1   ACCUMULATORS FOR USER
983 ; 2   USED TEMPORARILY BY TTY INPUT INTERRUPTS
984 ; 3-5 NOT USED
985 ;     BLOCKS 2 & 3 ARE USED BY THE UNFINISHED MUSIC MICROCODE
986 ;     BLOCKS 4 & 5 ARE USED BY THE UNFINISHED JPC RING FEATURE
987 ; 6-7 USED BY MICROCODE
988 ]               ;END OF IFN KL10P
989 \fIFN KS10P,[
990
991 SUBTTL STUFF PECULIAR TO THE KS-10 PROCESSOR
992
993 EPT==:0                         ; This MUST agree with the Salvager!
994 HSB==:500
995 $INSRT KSDEFS
996
997 DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS.  ARG IS USUALLY "(U)".
998  WREBR 20000+<EPT/1000>
999 TERMIN
1000
1001 OIPBIT==1000            ;BIT 8 (SYMBOLIC NAME %PSINH)
1002 BADPC==%PSUIO+37        ;BITS IN PC THAT USER CANNOT TURN ON
1003
1004 DEFINE UUOH     ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS
1005 XUUOH(U)TERMIN
1006
1007 DEFINE FORTY
1008 MUUODP(U)TERMIN
1009
1010 ;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR)
1011 ; OLDACS, UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME
1012 ; FOR UPT.
1013 DEFINE SPCCTX CURACS,OLDACS,UPT
1014 WRUBR [IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+CURACS_33+OLDACS_30+UPT]
1015 TERMIN
1016
1017 SYSCTX=SPCCTX 0,1       ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1.
1018 USRCTX=SPCCTX 1,1       ;USERS RUN IN BLOCK 1.
1019 IRPC N,,[234567]
1020  AC!N!CTX=SPCCTX 0,N    ;CUR AC 0, PREV N.  USE XCTR TO ACCESS SPECIAL ACS
1021 TERMIN
1022
1023 ;AC BLOCK USAGE:
1024 ; 0   ACCUMULATORS FOR SYSTEM (AT UUO LEVEL)
1025 ; 1   ACCUMULATORS FOR USER
1026 ; 2   USED TEMPORARILY BY TTY INPUT INTERRUPTS
1027 ; 3-6 NOT USED
1028 ; 7   USED BY MICROCODE (AC0 GETS BAD DATA WHEN MEMORY ERROR OCCURS, THIS
1029 ;     COULD BE FIXED IF ANYONE THINKS IT IS WORTH IT...)
1030 ]               ;END OF IFN KS10P
1031
1032 IFE KS10P,[     ; For the benefit of processors without UMOVE and UMOVEM.
1033
1034 DEFINE UMOVE (AC,ADDR)
1035 XCTR XR,[MOVE AC,ADDR]
1036 TERMIN
1037
1038 DEFINE UMOVEM (AC,ADDR)
1039 XCTR XW,[MOVEM AC,ADDR]
1040 TERMIN
1041
1042 ] ;IFE KS10P
1043 \f
1044 SUBTTL SYS IOC STATUS WORD FORMAT
1045
1046 ;RIGHT HALF WORD DEVICE STATUS
1047 ;1.1-1.6 SYS PHYSICAL DEVICE CODE
1048 ;1.7-1.9 OPEN MODE
1049 ;2.1 SYS BUFF CAP FULL
1050 ;2.2 "   "    "  EMPTY
1051 ;2.9-2.3 DEVICE DEPENDANT
1052
1053 ;LEFT HALF WORD CHANNEL STATUS 
1054 ;3.6-3.1 SET BY OPENS THAT DONT SKIP
1055 ;4.5-3.7 SET BY IOC ERRORS (INTERRUPTS) AT IOT OR OPER TIME
1056  ;3.9-3.7 ARE FOR 340 OR E&S ERRORS
1057  ;4.5-4.1 ARE FOR OTHER DEVICES
1058 ;A LIST OF ERROR CODES FOR OPEN FAILURES ARE IN THE FILE  BITS.
1059
1060 NDOPL==7        ;NUM OF DIS OPNL
1061
1062 ;4.5-3.7 SET BY IOC ERRORS AT IOT OR OPER TIME
1063
1064 ;3.9-3.7 SET BY 340 ROUTINES
1065 ;1 ILLEGAL SCOPE MODE
1066 ;2 SCOPE HUNG
1067 ;3 MORE THAN 1K SYS SCOPE BUF
1068 ;4 MEMORY PROTECT
1069 ;5 ILLEGAL SCOPE OP
1070 ;6 MEMORY PROTECT ON PDL POINTER
1071 ;7 ILLEGAL PARAMETER SET
1072
1073 ;4.5-4.1
1074 ;DECIMAL CODE
1075 ;13 DIRECTORY'S ALLOCATION EXHAUSTED
1076 ;12 DIRECTORY FULL
1077 ;11 ILLEGAL CHR AFTER ^P ON TTY DISPLAY
1078 ;10 CHNL IN ILLEGAL MODE WHEN .IOT ATTEMPTED
1079 ;9 DEVICE FULL
1080 ;8 CHANNEL NOT OPEN
1081 ;7 USR OP CHNL DOES NOT HAVE USR OPEN
1082 ;6 ATTEMPT TO OVER IOPUSH
1083 ;5 ATTEMPT TO OVER IOPOP
1084 ;4 NON-EXISTANT SUB DEVICE
1085 ;3 NON-RECOVERABLE DATA ERROR ;NON-EX-MEM ON PDP6 REF
1086 ;2 END OF FILE
1087 ;1 DEVICE HUNG OR REPORTING NON-DATA ERROR
1088
1089 MIOTER==1       ;LOWEST IOCERR CODE USED
1090 NIOTER==13.     ;NUMBER "  "
1091
1092 ;4.9-4.5 ALWAYS ZERO (USED BY IOPUSH FOR CHNL NUM)
1093 \f
1094 ;SYS PERIPHERAL DEVICE CODES
1095
1096 ;1.6 INDICATES DIRECTORY DEVICE
1097 ;1.5 INDICATES NON PHYSICAL DEVICE
1098
1099 SNTTY==1
1100 SNTDS==2        ;TERMINAL DISPLAY
1101 SNLPD==3        ;DATA PRODUCTS LPT
1102 SNVID==4
1103 SNBAT==5
1104 SNPLT==6
1105 SNPTP==7
1106 SNIMPX==10
1107 SNOMPX==11
1108 SNPTR==12
1109 SN340==13       ;340 AS ASCII DEVICE
1110 ;SN340I==14     ;INTERPRETED DISPLAY ON 340
1111 SNMTC==15       ;MAGTAPE
1112 SNCOD==16       ;CODE DEVICE
1113 SNTAB==17
1114 SNNUL==21
1115 SNJOB==22
1116 SNBOJ==23
1117 SNSPY==24
1118 SNSTY==25
1119 SNNET==26       ; Arpanet NCP
1120 SNLPV==27       ;VOGUE LPT
1121 SNSTK==30       ;STANFORD KEYBOARD
1122 SNMSP==31       ;CROCK "IPC" FOR NOW
1123 IFN CHAOSP,SNCHA==32    ;CHAOS NET
1124 IFN TCPP,SNTCP==33      ; Internet TCP/IP network device
1125 SNTRAP==34      ;TRAP "DEVICE"
1126 IFN INETP,SNIPQ==35     ; Internet Queue
1127 IFN KS10P,SNUBI==36     ; Unibus interrupt
1128 SNUTC==41
1129 SN2311==43
1130 SNFUSR==60
1131 SNUSR==61
1132 SNCLK==62       ;CLO, CLU, & CLI
1133 SNDIR==63
1134 SNPDP==64       ;PDP6
1135 SNDIRH==65      ;DIRHNG "DEVICE"
1136 SNLCK==66       ;LOCK "DEVICE"
1137 \f
1138 SUBTTL SYSTEM VERSION NUMBER & MISC MACROS
1139
1140 ITSMCH==:<MNAME SIXBIT/,/>      ; Define SIXBIT machine name symbol
1141 ITSVRS==:.FNAM2 ; Preserve SIXBIT symbol value of ITS version #
1142 FNM==ITSVRS     ;SRI GETS VERSION NUMBER
1143                 ;WORKS FOR DECIMAL IGNORES LOW ORDER NON-NUMERIC CHRS
1144 DEFINE VNAM
1145 .TAG FOO
1146         ZZZQ==FNM&77
1147         IFGE ZZZQ-'0,IFLE ZZZQ-'9,.GO BAR
1148         FNM==FNM_-6
1149         .GO FOO
1150 .TAG BAR
1151         ZZZQ==1
1152         SRI==0
1153 .TAG MUM
1154         IFE FNM,.GO END
1155         ZCHR==FNM&77-'0
1156         IFL ZCHR,.GO END
1157         IFG ZCHR-9,.GO END
1158         SRI==SRI+ZZZQ*ZCHR
1159         ZZZQ==ZZZQ*10.
1160         FNM==FNM_-6
1161         .GO MUM
1162 .TAG END
1163         TERMIN
1164
1165 IF1 VNAM
1166
1167 DEFINE SRITYP A
1168 ZZZ==10 ;SAVE OLD RADIX
1169 RADIX 10.
1170         MOVEI I,[MNAME [.ASCII ?
1171 ] ITS !SRI A?]
1172 RADIX ZZZ
1173         TERMIN
1174
1175                 ;"MONTHS OF THE YEAR" MACRO
1176
1177 DEFINE MNIRP A
1178 IRPS M,,[JAN:FEB:MAR:APR:
1179 MAY:JUN:JUL:AUG:
1180 SEP:OCT:NOV:DEC:]L,,[31. 29. 31. 30.
1181 31. 30. 31. 31.
1182 30. 31. 30. 31.]
1183 A
1184 TERMIN
1185 TERMIN
1186
1187 FOO==-1 ;ACCUMULATED VALUE FOR FOLLOWING DEFINITION:
1188
1189 MNIRP [M==FOO
1190 FOO==FOO+L]     ;JAN=-1, FEB=30., MAR=59., ETC.
1191 \f
1192 DEFINE INFORM A,B
1193 IF1,[PRINTX \A = B
1194 \]TERMIN
1195
1196 ZZZ==10
1197 RADIX 10.
1198 INFORM VERSION,\SRI
1199 RADIX ZZZ
1200
1201 SSYS==0 ;LENGTH OF SYS CODE
1202
1203 DEFINE EBLK
1204 IFN CKPAR,.ERR LOSS AT EBLK
1205 CKPAR==1
1206 IFE .-CKZZ,.STOP                ;NO WORDS BETWEEN BBLK AND EBLK
1207 CONC CK,\CKNUM,==CKZZ-.,,CKZZ
1208 CKNUM==CKNUM+1
1209 SSYS==SSYS+.-CKZZ
1210 TERMIN
1211
1212 DEFINE BBLK
1213 CKZZ==.
1214 IFE CKPAR,.ERR LOSS AT BBLK
1215 CKPAR==0
1216 TERMIN
1217
1218 CKPAR==1
1219 CKNUM==0
1220
1221
1222 ;INSERT CALL TO THIS MACRO AT ANY PLACE IT IS POSSIBLE TO PCLSR
1223 ;(IF IT IS DESIRED FOR PCLSR TEST FEATURE TO TEST THAT SECTION)
1224
1225 DEFINE PCLT
1226 IFN PCLSW,[
1227         SKIPE PCLDBM
1228         PUSHJ P,PCLTST
1229 ]
1230 TERMIN
1231
1232 DEFINE  PCLTH A
1233 IFN PCLSW,[
1234         SKIPN PCLDBM
1235         JRST .+3
1236         PUSHJ P,PCLTSH
1237         A
1238 ]
1239 TERMIN
1240
1241 DEFINE  PI2SAF
1242         CONSO PI,20000
1243          CONSO PI,40
1244           CAIA
1245            JRST 4,.     ;PI 2 NOT OFF AND NOT IN PROGRESS
1246 TERMIN
1247 \f
1248 SUBTTL DEFINE EXEC PAGES
1249
1250 EXPGN==0
1251
1252 DEFINE EXECPG X
1253 X==EXPGN
1254 EXPGN==EXPGN+1
1255 ZZQ==<X+1>&1
1256 ZZQQ==X_-1
1257 .!X==220000*ZZQ+2200,,ZZQQ
1258 TERMIN
1259
1260 ;EXEC MAP ASSIGNMENTS
1261 IFN 340P,[
1262 EXECPG 340P1,   ;USED TO FETCH + TRACE 340 PNTRS
1263 EXECPG 340P2,
1264 REPEAT N340PB,CONC [EXECPG DPG]\.RPCNT,;        ;DATA AREA PNTRS FOR 340 DATA
1265 ]
1266 EXECPG CORJF,   ;CORE JOB FROM PAGE
1267 EXECPG CORJT,   ;CORE JOB TO PAGE
1268 IFN VIDP,[
1269 EXECPG VSB1,    ;.VSCAN B1
1270 EXECPG VSB2,    ;.VSCAN B2
1271 ]
1272 IFN TEN11P,[
1273 EXECPG T11CP,   ;TEN11 CONTROL PAGE
1274 ]
1275 EXECPG PAREP,   ;USED BY SYSTEM IN ITS DILIGENT EFFORTS TO FIX PARITY ERRORS
1276
1277 IFN ECCMEM, EXECPG ECCPG,       ;PAGE USED TO ACCESS ECC HISTORY
1278
1279 IFN XGP,[
1280 EXECPG XGPC,    ;LOW 2K OF XGP PDP-11   (USED TO TRACE BUFF POINTERS)
1281 EXECPG XGPB,    ;2K BUFFER IN PDP-11 (CHANGES LOCATION)
1282 EXECPG XGPUB,   ;XGP USER CORE EXEC PG SETUP TO POINT TO USER CORE DURING XGPIM SYSTEM CALL
1283 ]
1284 IFN N11TYS,[
1285 REPEAT NTTPG,[CONC [EXECPG TTPG]\.RPCNT,
1286 ]
1287 REPEAT NTVBP,[CONC [EXECPG TTR]\.RPCNT,
1288 ]]
1289 IFN CHAOSP,[ IFN T11CHP,[
1290 EXECPG CHSPG    ;CHAOS NET 10-11 COMMUNICATION PAGE
1291 T11CHS=400000+CHSPG*2000
1292 ]] ;CHAOSP, T11CHP
1293 ;^ INSERT NEW EXEC PAGES HERE
1294 ;EXEC PAGES BELOW THIS POINT WILL BE COPYABLE BY USERS
1295 REPEAT NMMP,CONC [EXECPG MMP]\.RPCNT,;  ;MMP TABLE
1296  MMP=MMP0*2000+400000   ;VIRTUAL ADDRESS OF MMP
1297 EXPUNGE EXECPG
1298 NEXPGS==EXPGN   ;# EXEC PGS USED
1299 \f
1300 SUBTTL LOW CORE
1301
1302 .YSTGWD         ;STORAGE WORDS OKAY NOW
1303
1304 IFN KL10P, LOC EPT+1000         ;KL needs a full DEC page for EPT
1305 IFN KS10P,[
1306  IFE KSIMP, LOC EPT+1000        ;KS needs a full DEC page, too,
1307  IFN KSIMP, LOC EPT+2000        ; unless you are losing even worse.
1308 ]
1309
1310 PATB=.
1311 LOC 20
1312         BBLK
1313
1314 IFN KS10P,[
1315 LOC 30                          ; 8080 communications area
1316         EBLK
1317 ] ;IFN KS10P
1318
1319 IFN TM10B,[
1320         LOC 30
1321         EBLK
1322 MICWA:  MIOWD
1323         0
1324 IFE RP10P+RH10P,BBLK
1325 ]
1326 IFN RP10P+RH10P,[
1327         LOC 32
1328 IFE TM10B,EBLK
1329 QICWA:  QIOWD
1330         0
1331 IFN QRDCMP,[
1332 RCICWA: 0
1333         0
1334 ];QRDCMP
1335         BBLK
1336 ]
1337 IFN E.SP,[
1338         LOC 34
1339         E.SPM   ;POINTER , NEVER CHANGES
1340 ]
1341
1342 IFE KS10P,[
1343 LOC 37
1344         EBLK
1345 ] ;IFE KS10P
1346
1347 LOC 41
1348 IFN KA10P, JSR UUOH     ;UUO TRAP
1349 IFE KA10P, JSR LUUOEX   ;USER UUO IN EXEC MODE (ERROR)
1350
1351 LOC PI0LOC+2
1352         REPEAT 2,       JSR RINT1
1353         REPEAT 6*2,     JSR RINT        ;INITIALIZE ANY UNUSED PI LOCNS
1354
1355 LOC 61
1356 IFN KA10P, JSR 60H              ;60 TRAP
1357 IFN C1MXP, REPEAT 2*7., JSR RINT1       ;INITIALIZE C1MPX LOCNS
1358
1359 LOC PI0LOC+2*APRCHN
1360         JSR CLKBRK      ;PROCESSOR OR CLOCK INTERRUPT
1361         JRST 4,.
1362
1363 LOC PI0LOC+2*LPTCHN
1364         JSR LPTBRK      ;LPT,DISPLAY,PTP,PTR,OTHER PROCESSOR
1365 IFN 340P,       JSR DRECYC      ;HACK HACK
1366
1367 LOC PI0LOC+2*TTYCHN
1368         JSR TTYBRK      ;TTY,DATAPOINT KLUDGE
1369         JRST 4,.
1370
1371 LOC PI0LOC+2*UTCCHN
1372         JSR UTCBRK      ;MICRO TAPE OR DISK (S)
1373         JRST 4,.
1374
1375 IFN E.SP,[
1376 LOC PI0LOC+2*DISCHN
1377         JSR ESBRK
1378         JRST 4,.
1379 ]
1380 IFN 340P,[
1381 LOC PI0LOC+2*DISCHN
1382         JSR DIGNOR      ;340 DISPLAY BLKO GETS PATCHED IN HERE
1383         CONO PI,4000+200_<-SDCHN>       ;HACK HACK
1384 ]
1385 IFN CH10P+CH11P,[
1386 LOC PI0LOC+2*CHXCHN
1387         JSR CHXBRK
1388         JRST 4,.
1389 ];CH10P
1390
1391 IFN VIDP,[
1392 LOC PI0LOC+2*OMPCHN
1393         JSR OMPXBK      ;OUTPUT MPXR, NVID, ETC.
1394         JRST 4,.
1395 ]
1396 IFN KAIMP,[
1397 LOC PI0LOC+2*IMPCHN
1398         JSR IMPBRK
1399 LOC IMPILC
1400         JSR IMPIBK
1401         0
1402 LOC IMPOLC
1403         JSR IMPOBK
1404         0
1405 ] ; IFN KAIMP
1406
1407 IFN KL10P,[
1408 LOC PFOPC
1409 PFOPC:  0               ;PAGE FAIL OLD PC STORED HERE
1410 PFNPC:  PFAIL           ;WHERE TO GO FOR PAGE FAIL
1411
1412 LOC EPTDIA
1413 EPTDIA: JRST SALV       ;STD COMMAND START ADDRESS ("DIAGNOSTIC")
1414 EPTDDT: JRST DDT        ;DDT COMMAND START ADDRESS
1415 EPTSTL: JRST DSKDMP     ;STL COMMAND START ADDRESS ("LOADER")
1416 EPTITS: JRST BEG        ;STM COMMAND START ADDRESS ("MONITOR")
1417                         ;SALV THEN GO
1418 LOC EPTTR1
1419 EPTTR1: CAI             ;ARITH OVERFLOW EXEC MODE IGNORED
1420 EPTTR2: JSR ILLTRP      ;PDL OVERFLOW EXEC MODE IS AN ERROR
1421 EPTTR3: JSR ILLTRP      ;ONE PROC CODE?
1422
1423 LOC DTEBPO
1424 DTEBPO: 0               ;BYTE TRANSFER NOT USED
1425 DTEBPI: 0               ;BYTE TRANSFER NOT USED
1426 DTELOC:                 ;INTERRUPT FROM CONSOLE 11
1427 IFE PDCLKP,     JSR DTEBRK      ;IF USING 11 FOR CLOCK, FIRST CHECK FOR CLOCK INTR
1428 .ELSE           JSR TTYBRK      ;OTHERWISE JUST USING 11 FOR TTYS.
1429         0               ;UNUSED WORD
1430 DTEPRO: 0               ;NO PROTECTED EXAMINES
1431 DTERLO: 0               ;..
1432 DTEPRI: 0               ;NOR PROTECTED DEPOSITS
1433 DTERLI: 0               ;..
1434
1435 LOC EPT+430
1436 REPEAT 8,MUUOEX         ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1437
1438 LOC EPTEBC
1439 EPTEBC: 0 ? 0           ;EBOX COUNT FOR PROC BRK ROUTINES AND NULL JOB
1440 EPTMBC: 0 ? 0           ;MBOX DITTO
1441
1442 LOC TIMLOC
1443         JSR OVHBRK      ;INTERVAL TIMER INTERRUPT, EVERY 39 MILLISEC ON CHANNEL 1
1444
1445 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1446 ;ON KL10 OVHBRK CHECKS WHERE THE PC IS IF IT IS IN EXEC MODE.
1447
1448 DEFINE OVHMTR NAME      ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1449 OVHMT1 NAME,\.          ;EVALUATE "." AT THIS POINT IN TIME
1450 TERMIN
1451
1452 ;KLUDGE MACRO
1453 DEFINE OVHMT1 NAME,POINT
1454 OVHTAB [DEFINE OVHTAB FOO
1455 FOO]    <(SIXBIT/NAME/)>,,POINT ? 0
1456 TERMIN
1457 TERMIN
1458
1459 ;THIS IS THE CORRESPONDING REMOTE MACRO
1460 DEFINE OVHTAB FOO
1461 FOO
1462 TERMIN
1463 ]               ;END OF IFN KL10P
1464 \f
1465 IFN KS10P,[
1466
1467 LOC EPTUIT+UBAQ
1468         UBAQIB          ; Pointer to interrupt table for Unibus Q (dsk)
1469
1470 LOC EPTUIT+UBAI
1471         UBAIIB          ; Pointer to interrupt table for Unibus I (other)
1472
1473 LOC EPTPFW
1474 EPTPFW: 0               ; Page fail word
1475 EPTPFO: 0               ; Page fail old PC
1476 EPTPFN: PFAIL           ; Page fail new PC
1477
1478 IRP I,,[1,2,3,4,5,6,7]
1479 LOC EPTP!I!W
1480 EPTP!I!W:       0               ; Page fail word
1481 EPTP!I!O:       0               ; Page fail old PC
1482 EPTP!I!N:       PF!I!AIL        ; Page fail new PC at PI level I
1483 TERMIN
1484
1485 LOC EPTTR1
1486 EPTTR1: CAI             ;ARITH OVERFLOW EXEC MODE IGNORED
1487 EPTTR2: JSR ILLTRP      ;PDL OVERFLOW EXEC MODE IS AN ERROR
1488 EPTTR3: JSR ILLTRP      ;TRAP 3 SHOULD NOT HAPPEN
1489
1490 LOC EPT1PO
1491 EPT1PO: 0               ;ONE-PROCEED OLD-PC
1492 EPT1PN: MUUOEX          ;ONE-PROCEED SHOULD NOT HAPPEN IN UPT=EPT MODE
1493
1494 LOC EPTUEN
1495 EPTUEN: MUUOEX          ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1496 EPTUET: MUUOEX
1497 LOC EPTUUN
1498 EPTUUN: MUUOEX
1499 EPTUUT: MUUOEX
1500
1501 IFN KSIMP,[
1502 ;Here because with EPT at 0, this is the second half of physical
1503 ; page 0, which is uncached, which we want, and otherwise unused.
1504 ;
1505 LOC EPT+1000                    ; IMP data reformatting buffers
1506 IMPIBF: BLOCK 400
1507 IMPBFS==.-IMPIBF
1508 IMPOBF: BLOCK 400
1509 ]
1510
1511 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1512 ;ON KS10 PC SAMPLING FACILITY IS USED, 60-CYCLE CLOCK COLLECTS THAT DATA
1513 ;NOTE THAT THE TABLE FORMAT IS NOT THE SAME AS ON KL10, FOR SPEED REASONS
1514
1515 DEFINE OVHMTR NAME      ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1516 OVHMT1 NAME,\.          ;EVALUATE "." AT THIS POINT IN TIME
1517 TERMIN
1518
1519 ;KLUDGE MACRO
1520 DEFINE OVHMT1 NAME,POINT
1521 OVHTAB [DEFINE OVHTAB FOO
1522 FOO]    POINT,,<(SIXBIT/NAME/)>
1523 TERMIN
1524 TERMIN
1525
1526 ;THIS IS THE CORRESPONDING REMOTE MACRO
1527 DEFINE OVHTAB FOO
1528 FOO
1529 TERMIN
1530 ]               ;END OF IFN KS10P
1531 \f
1532 IFN DL10P,[     ;DL10 COMMUNICATIONS AREA IN NON-ENCACHED LOW CORE
1533 IFN KL10P, LOC 500      ;500-777 RESERVED FOR DL10 AREA AND BUFFERS
1534 IFN KA10P, LOC 100      ;IF KA10, PUT DL10 AREA JUST BELOW START OF SYSTEM
1535 IFN KS10P, .ERR DL10 on KS10 system?
1536
1537 DL10AR: JSR TTYBRK      ;INTERRUPT INSTRUCTION (NOT ACTUALLY USED)
1538
1539 ;FOLLOWING LOCATIONS MUST AGREE WITH IOELEVEN PROGRAM
1540
1541 DL10VR: NDLTYS_8+NFDLTY ;"I/O VERSION NUMBER"
1542 DL10UP: 0               ;INCREMENTED BY -11 EVERY 1/60 SECOND.
1543                         ;SETOM'ED BY 10 EVERY 1/2 SECOND.  DETECTS UP/DOWNNESS.
1544
1545 DL10SO: 0               ;LINE # TO SET OUTPUT DONE FOR, SET BY -10, CLEARED BY -11.
1546
1547 DL10IL: 0               ;LINE # WITH INPUT AVAILABLE.  CLEARED BY -10 AFTER CHAR READ.
1548 DL10IC: 0               ;CHARACTER RECEIVED FROM THAT LINE.
1549
1550 DL10OD: 0               ;LINE # WITH OUTPUT DONE.  CLEARED BY -10 WHEN PROCESSED.
1551 DL10BS: 0               ;BUFFER SIZE FOR THAT LINE.
1552
1553 DL10BP: 0               ;WIERD DL10 BYTE POINTER TO TTY OUTPUT BUFFER.
1554 DL10CC: 0               ;NUMBER OF CHARACTERS BEING OUTPUT TO TTY.
1555 DL10LN: 0               ;LINE # OUTPUT BEING SENT TO.  CLEARED BY -11 WHEN GOBBLED.
1556
1557 DL10CL: 0               ;DIALUP LINE CONNECT OR DISCONNECT INFO. SET BY 11, 0'D BY 10.
1558                         ;0000NN => LINE # NN DISCONNECTED.
1559                         ;01RTNN => LINE # NN CONNECTED, %TTISP=R, %TTOSP=T.
1560
1561 DL10PL: 0               ;LINE # TO SET PARAMETERS OF.  CLEARED BY -11 WHEN PROCESSED.
1562 DL10PR: 0               ;VALUE OF DH11 LPR REGISTER.
1563 DL10PS: 0               ;NUMBER OF BYTES OF OUTPUT BUFFERING DESIRED.
1564
1565 DL10XD: 0               ;1=EXAMINE -11 CORE, 2=DEPOSIT.  CLEARED BY -11 WHEN DONE.
1566 DL10XA: 0               ;EXAMINE/DEPOSIT ADDRESS
1567 DL10XW: 0               ;EXAMINE/DEPOSIT WORD
1568
1569 GLPTBP: 0               ;BYTE POINTER TO BUFFER FOR GOULD LPT
1570 GLPTBC: 0               ;BYTE COUNT " " - IF NONZERO BUFFER IS ACTIVE BY PDP11.
1571 GLPTER: 0               ;NONZERO => PDP11 CLAIMS PRINTER IS BROKEN.
1572 GLPGRF: 0               ;NONZERO => GRAPHICS MODE (SET BY 10).
1573
1574 ;CHAOS NET SHARED VARIABLES
1575 DLCINI: 1               ;THE COMMENTS ARE IN THE CHAOS FILE
1576 DLCSP1: 0
1577 DLCSP2: 0
1578 DLCSS1: 0
1579 DLCSS2: 0
1580 DLCRP1: 0
1581 DLCRP2: 0
1582 DLCRS1: 0
1583 DLCRS2: 0
1584
1585 ;^ ADD MORE HERE
1586
1587 DLXEND:: ;END OF ASSIGNED DL10 AREA
1588
1589 IFG .-DL10AR-100, .ERR DL-10 AREA TOO BIG, CHANGE CONO IN TSS INITIALIZATION
1590 LOC DL10AR+100 ;SKIP OVER 11-ACCESSIBLE AREA
1591         
1592 DL10BF: BLOCK <261.+3>/4        ;OUTPUT BUFFER, 8-BIT BYTES.  HAS TO BE NON-ENCACHED.
1593
1594 IFN GLPTP,[
1595 GLPBSZ==255.    ;BUFFER SIZE IN WORDS.  MAXIMUM POSSIBLE WITHOUT MODIFYING (ELIMINATING)
1596                 ;"WORD COUNT" HARDWARE IN DL-10.
1597 GLPMPP: 0       ;MAIN PROGRAM POINTER - IF NONZERO BUFFER IS ACTIVE BY M.P. LEVEL (PDP10)
1598 GLPMPC: 0       ;MAIN PROGRAM COUNTER
1599 GLPTBF: BLOCK GLPBSZ    ;ONE BUFFER FOR NOW
1600 ]       ;END IFN GLPTP
1601
1602 IFN KL10P, IFG .-1000,.ERR DL10 STORAGE TOO BIG, DOESN'T FIT IN UNENCACHED PAGE
1603 IFN KA10P, PATB=.       ;MOVE ORIGIN OF SYSTEM UP
1604 ]       ;END IFN DL10P
1605 \f
1606 IFN NETYS,[     ;ASSEMBLE DTE20 CONTROL AREA
1607 IFE KL10P, .ERR DTE20 WITHOUT KL10?
1608 LOC 400
1609
1610 DTEVER: NETYS_8+NFETY   ;400 I/O VERSION NUMBER, SET BY 10, CHECKED BY 11
1611
1612 DTECHK: 0               ;401 INCREMENTED BY 11 60 TIMES PER SECOND
1613                         ;SETOMED BY 10 EVERY HALF SECOND.
1614                         ;USED TO TELL 11 THAT 10 IS UP.
1615
1616 DTEINP: -1              ;402 -1 IF IDLE, ELSE INPUT REQUEST FROM 10 TO 11
1617                         ;SETUP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING THIS.
1618                         ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES HERE
1619 DTEOUT: -1              ;403 -1 IF IDLE, ELSE OUTPUT REQUEST FROM 10 TO 11
1620                         ;SETUP DTEBPO IN EPT BEFORE SETTING THIS.
1621                 ;CONTENTS OF DTEINP AND DTEOUT ARE DESCRIBED BELOW.
1622                 ;THESE ARE SET BY THE 10, SETOMED BY 11 WHEN TRANSFER STARTS.
1623                 ;RH # BYTES EXPECTED.  LH COMMAND+LINE#.  COMMANDS ARE:
1624  %DCTYO==1000           ;TELETYPE OUTPUT                (NOTE 4.1=0 INPUT, =1 OUTPUT)
1625  %DCETI==2000           ;ETHERNET INPUT (N.Y.I.)
1626  %DCETO==3000           ;ETHERNET OUTPUT (N.Y.I.)
1627
1628 DTELSP: -1              ;404 LINE # WHOSE SPEED IS TO BE SET, SET BY 10, SETOMED BY 11
1629 DTELPR: -1              ;405 CORRESPONDING DH11 LINE PARAMETER REGISTER,,BUFFER SIZE
1630
1631 DTEOST: -1              ;406 LINE# TO START OUTPUT ON (SET OUTPUT DONE).
1632                         ;SET BY 10, SETOMED BY 11
1633
1634         BLOCK 1         ;407 NOT USED
1635
1636 DTETYI: -1              ;410 TELETYPE INPUT.  SET BY 11, SETOMED BY 10.
1637                         ;LH LINE#,,RH CHAR RCVED.
1638
1639 DTEODN: -1              ;411 TELETYPE OUTPUT DONE.  SET BY 11, SETOMED BY 10.
1640                         ;LH LINE#,,RH BUFFER SIZE.
1641
1642 DTEHNG: -1              ;412 HANGUP/DIALIN WORD.  SET BY 11, SETOMED BY 10.
1643                         ;0000NN LINE # NN HUNG UP.
1644                         ;01RTNN LINE # NN HAS SPEED RCV=R, XMT=T (CODES AS IN TTYTYP)
1645
1646 ;^ ADD MORE LOCATIONS HERE, NOT TO EXCEED 437
1647
1648 ;LOCATIONS 440-457 ARE KNOWN ABOUT BY BOTH IOELEV AND KLDCP,
1649 ;USED MOSTLY FOR NON-TIMESHARING PROGRAMS.
1650 ];NETYS
1651 \f
1652 LOC PATB
1653
1654         ;FOR VARIABLES (MONITORABLE WITH KEYS)
1655 NSKED:  0       ;# TIMES NON-NULL JOB IS RUN
1656 NNSKED: 0       ;# TIMES NULL JOB IS RUN
1657 NRSKED: 0       ;# OF FULL SCHEDULES (MUST SCAN ALL JOBS)
1658 NSSKED: 0       ;# OF SCHEDULES SAVED BY SCHBLN FEATURE.
1659 NRESKED:0       ;# TIMES A JOB SCHEDULED JUST AFTER IT RAN.
1660 NSCHDU: 0       ;TOTAL NUMBER OF JOBS FOUND RUNNABLE IN FULL SCHEDULES
1661 NNULBK: 0       ;# OF CONSECUTIVE BLOCKS OF NULLTIME.
1662 NUINT:  0       ;# TIMES USER GIVEN INTERRUPT
1663 NAUINT: 0       ;# ATTEMPTED USER INT (POSSIBLY UNSUCCESSFUL DUE TO PG FAULT)
1664 NPCLSR: 0       ;# ATT TO PCLSR
1665 NEPCLS: 0       ;# PCLSRS WHERE JOB WAS IN EXEC MODE
1666 NFPCLS: 0       ;# OF PCLSRS THAT FAILED (JOB WAS IN EXEC MODE AND NOT BLOCKED)
1667 NSOUSR: 0       ;# ATT TO SWAP OUT USR
1668 NSOPGS: 0       ;# TIMES THRU LOOP LOOKING FOR PG TO SWAP OUT
1669 NPGSO:  0       ;# TIMES AT SWOPG
1670 NAGEAB: 0       ;# TIMES SWAP OUT ABORTED BY AGE BITS
1671 NSHRAB: 0       ;# TIMES SWAP OUT ABORTED BY SHARING
1672 NPGFLT: 0       ;# PAGE FAULT (ALL CAUSES)
1673 NCLKI:  0       ;# CHNL 7 INTS (ALL CAUSES)
1674 NPGLD:  0       ;# TIMES AT PGLDU
1675 NUFLS:  0       ;# TIMES AT UFLS
1676 NTUSB:  0       ;# TIMES USER SWAP BLOCKED
1677 NTSBUP: 0       ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND LET IN
1678 NTSBUB: 0       ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND BLOCKED
1679 NTSBUU: 0       ;# TIMES SWAP BLOCKED USER UNBLOCKED BEFORE TIME (MEM APPARENTLY AVAIL)
1680 NAGES:  0       ;# TIMES AROUND PAGE-AGEING LOOP
1681
1682 ;THE FOLLOWING FOUR MUST BE CONSECUTIVE
1683 NRPI:   0       ;# REFS TO PAGE IN (BUT MAP WAS NOT SET UP, ETC)
1684 NRPCI:  0       ;# PAGE FAULTS REFS TO PAGE COMMING IN
1685 NRPO:   0       ;# REFS TO PAGE OUT
1686 NRPGO:  0       ;# TO PAGES GOING OUT
1687 CLKBRS: 0       ;CLKBRK COPIED INTO HERE (SINCE CLKBRK GETS CHANGED)
1688
1689 PAT:    IFG .-PATB-40,.ERR PAT TOO HIGH
1690
1691 LOC PATB+40
1692
1693 BBLK
1694
1695 PATCH:  BLOCK 140       ;PATCH SPACE CODE AND CONSTANTS
1696
1697 EBLK
1698
1699 VPATCH:
1700 VPAT:
1701 BLOCK 40        ;PATCH SPACE VARIABLES
1702 \f
1703 SUBTTL PROCESSOR BREAK ROUTINES
1704
1705 DEFINE CLKSAV BRK=CLKBRK
1706 IFE KA10P,      XCT CLCXSV      ;DATAI PAG,CLCX(U)
1707         XCT CLUSAV              ;STORE U IN AC17S FOR CURRENT USER (UNLESS NULL JOB)
1708         MOVE U,BRK              ;SAVE AWAY BRK
1709         MOVEM U,CLKBRS
1710 IFSN BRK,CLKBRK, MOVEM U,CLKBRK ;SAVE IN CLKBRK IF NOT CLKBRK
1711 TERMIN
1712
1713 IFE KA10P,[
1714 DEFINE CLKLEV                   ;ENTER CLOCK-LEVEL CONTEXT
1715         SPCCTX 0,1,EPT          ;UPT = EPT; CLOCK LEVEL CONTEXT.
1716         MOVE U,USER
1717         JRST 2,@.+1             ;MAKE XCTR WORK RIGHT
1718           %PSPCU,,.+1
1719         MOVE P,CPDLP
1720 TERMIN
1721 ] ;IFE KA10P
1722 IFN KA10P,[
1723 DEFINE CLKLEV
1724         MOVE U,USER
1725         MOVE P,CPDLP
1726 TERMIN
1727 ] ;IFN KA10P
1728
1729 IFN KL10P,[     ;CODE USED IF GETTING 60-CYCLE CLOCK FROM PDP11 (IN CASE MAIN CLOCK DOWN)
1730
1731 ;HACKING THE DTE:
1732
1733 ;THE TTY CODE ASSUMES, SINCE THE DTE20 IS USED BY ITS SOLELY AS
1734 ;THE INTERFACE TO THE CONSOLE TTY AND THE LINE-FREQUENCY CLOCK,
1735 ;THAT IT MAY FREELY GIVE THE "MONITOR TTY OUTPUT" COMMAND WHEN
1736 ;THE "MONITOR TTY OUTPUT DONE" INTERRUPT IS RECEIVED.  ANY CODE
1737 ;WHICH HACKS THE DTE OTHER THAN AT PI LEVEL OR IN ITS INITIALIZATION
1738 ;MUST THEREFORE OBSERVE THE FOLLOWING PROTOCOL:
1739 ;       CONO PI,DTEOFF
1740 ;       SKIPN DTEFLG            ;WAIT FOR MONITOR TTY OUTPUT TO GO THROUGH
1741 ;        JRST .-1
1742 ;       SETZM DTEFLG
1743 ;        ;HERE SET DTECMD
1744 ;       CONO DTE,%DBL11
1745 ;       SKIPN DTEFLG            ;WAIT FOR THIS COMMAND TO GO THROUGH
1746 ;        JRST .-1
1747 ;       CONO PI,DTEON
1748 ;
1749
1750 DTEBRK: 0
1751 BBLK
1752         CONSO PI,1_<7-APRCHN>   ;TEMPORARY (I HOPE) HARDWARE BUG IN KL10 PI HARDWARE
1753          JRST 4,.               ;ALLEGEDLY FIXED
1754         CONO PI,TTYRQ           ;REALLY WANTED TO INTERRUPT ON TTY CHANNEL,
1755         JFCL                    ; BUT HAVE TO DO IT THIS WAY DUE TO 
1756         JFCL                    ; MISFEATURES IN THE PI HARDWARE
1757         SKIPN DTECLK            ;DON'T TAKE OUT THE JFCLS!!
1758          JRST 12,@DTEBRK
1759         CLKSAV DTEBRK           ;TAKE CLOCK INTERRUPT
1760         JRST CLKB2A
1761 EBLK
1762 ];KL10P
1763 \f
1764 CLKBRK: 0               ;PC SAVED HERE BY JSR FOR CLOCK INT.
1765
1766 BBLK
1767 IFN KL10P,[
1768         CONSO PI,1_<7-APRCHN>   ;HARDWARE BUG IN KL10 PI SYSTEM
1769          JRST 4,.               ;ALLEGEDLY FIXED
1770 ]
1771 IFE KA10P, CONO PI,020000+200_<-APRCHN> ;BAG-BITING DEC LOSERS CHANGED
1772                                         ;FUNCTIONAL SPECIFICATION OF
1773                                         ;PROGRAMMED REQUESTS
1774 CLKBR2: CLKSAV          ;SAVE AC BLK STATUS AND U.
1775 CLKB2A: AOS NCLKI
1776         SKIPGE U,USER   ;PICK UP INDEX OF CURRENT USER, SKIP UNLESS NULL JOB
1777          JRST [ SPM UPGML       ;JUMP IF NULL JOB WAS RUNNING
1778                 JRST CLKBKR ]
1779         SPM UPGML(U)    ;STORE PAGE MAP AWAY
1780         AOSN UFLSF      ;SKIP UNLESS GOT HERE FROM UFL6
1781          JRST CLUFLS
1782         MOVEM T,AC16S(U)        ;STORE AWAY T
1783         MOVEI T,AC0S(U)
1784         BLT T,AC15S(U)  ;STORE REST OF ACS
1785 CLKBKR: CLKLEV          ;SET UP CROCK-LEVEL CONTEXT HARDWARE
1786
1787 ;;; CHECK FOR THINGS OTHER THAN CLOCK TICKS (PAR ERR, PG FAULT, NXM, PDLOV,
1788 ;;; AROV AND ARFOV ARE POSSIBLE ON ONE MACHINE OR THE OTHER).
1789
1790 IFN KA10P,[
1791         CONSZ 270220    ;CHECK PDL OV, MEM PROTECT, NXM, FOV, AR OV
1792          JRST CLKB1     ;JUMP ON LOSSAGE
1793 CLKB1D: CONSZ PI,200000
1794          JRST CLKB1E    ;PARITY
1795 ] ;KA10P
1796
1797 IFN KL10P,[
1798         AOSG PFAILF
1799          JRST PFA6      ;PAGE FAULT
1800         CONSZ 7740      ;This is all but the cache sweep done bit (=20).
1801          JRST CLKB2     ;APR ERROR INTERRUPT
1802 ] ;KL10P
1803
1804 IFN KS10P,[
1805         AOSG PFAILF
1806          JRST PFLU2
1807         CONSZ 7620      ;This is all but the interval timer's bit (=40).
1808          JRST CLKBKS    ; (Memory ECC (=100) doesn't interrupt)
1809         CONSO 40
1810          JRST CLK1F
1811 ] ;KS10P
1812
1813 IFN PDCLKP\KA10P,[      ;IF 60 HZ CLOCK IS IN HARDWARE
1814         CONSO CLK,CLKINT
1815          JRST CLK1F     ;INTERRUPT NOT FROM CLOCK, MUST BE SPURIOUS (OR
1816                         ;PREEMPT) 
1817 ] ;PDCLKP\KA10P
1818
1819 ;DROP THROUGH FOR PLAIN CLOCK-TICK.
1820 \f;
1821 ; 60-CYCLE CLOCK INTERRUPT
1822 ;
1823 CLKTIC:
1824 ;IFN 340P,      DATAI CLK1,LQTIM
1825         SOSG @CLROOT    ;COUNT DOWN, SKIP IF NOT YET TO NEXT REQUEST
1826          JRST CLQBRK    ;SERVICE CLOCK QUEUE REQUEST
1827 CLQBRT:
1828 IFN KS10P,              CONO 020040+APRCHN      ;Clear interval flag
1829 IFN PDCLKP\KA10P,       CONO CLK,CLKINT+APRCHN  ;Clear hardware clock flag
1830 IFE PDCLKP\KA10P\KS10P, SETZM DTECLK            ;Clear software clock flag
1831 IFN KA10P,[
1832         DATAI CLKBSW
1833         SKIPGE CLKBSW
1834 ] ;KA10P
1835 IFN KL10P, SKIPGE DTESWR
1836 IFN KS10P, SKIPE 8SWIT0
1837          BUG DDT,[SWITCH 0 IS UP]
1838 IFN KS10P, SETZM 8SWIT0         ; Allow hacker to <alt>P
1839 IFN CHAOSP, IFN T11CHP, PUSHJ P,T11WAK  ;RUN TEN-11 CHAOS NET INTERFACE
1840 IFN XGP,[
1841         SKIPL XGPUSR
1842          PUSHJ P,XGPCLK
1843 ]
1844 IFN 340P,[
1845         AOSGE T,DTIME
1846          JRST DSTPD     ;WAIT IF DTIME CLOBERED DUE TO RATE EXCEEDED
1847         CAILE T,2
1848          MOVEI T,2
1849         MOVEM T,DTIME
1850         SKIPL CDISOF
1851          SKIPGE DISOFF
1852           JRST DSTPD
1853         AOSG DISON
1854          CONO DIS,1100\SDCHN_3\DISCHN   ;RESTART DISPLAY
1855 DSTPD:
1856 ]
1857 IFN E.SP,[
1858         SKIPN T,E.SPGW  ; E&S WAITING FOR PAGE
1859          JRST E.SOK
1860         HRRZM T,DISSPG  ; SAVE FOR SWPPIN
1861         SKIPL T,DISUSR  ; -1 IMPLIES NO USER
1862          MOVEM T,DISSWI ; USER INDEX FOR SWPPIN
1863 E.SOK:
1864 ]
1865 IFN N11TYS,[
1866         SKIPE @TT11HD   ;ANY INPUT FROM PDP11?
1867          PUSHJ P,TT11IN ;YES, DO INPUT INT LVL STUFF FOR IT,.
1868 ]
1869 IFN DZ11P,[
1870         PUSHJ P,DZSCAN  ;SCAN DZ'S FOR INPUT
1871 ]
1872         MOVS T,TTERQS
1873         CAIE T,(MOVE)
1874          PUSHJ P,TTECH  ;CHARACTERS TO BE ECHO ED
1875 IFN NETP,[
1876         SKIPE STYNTA    ;IF THERE ARE STY'S CONNECTED TO NETWORK I/O,
1877          PUSHJ P,STYNTC ;XFER BETWEEN THEM.
1878 ]
1879 IFN KS10P, PUSHJ P,OVHCLK
1880         SETCMM CLKFL1
1881         SKIPL CLKFL1
1882          AOS TIME       ;GET HERE EVERY THIRTIETH OF A SECOND
1883 IFN PAGPRE,[
1884         SKIPE PREEMP    ;CHECK FOR PRE-EMPTION INTERRUPT
1885          JRST PRESCD
1886 ];PAGPRE
1887         AOSG SCHFLG
1888          JRST CLKB5     ;TIME NOT UP
1889         AOS NLPCLK
1890         JRST SCHED      ;SCHEDULE
1891
1892 CLK1F:
1893 IFN PAGPRE,[
1894         SKIPE PREEMP    ;CHECK FOR PRE-EMPTION INTERRUPT.  THIS IS HERE
1895          JRST PRESCD    ; BECAUSE OF SCREW CASE WHEREBY DLSRCH PREVENTS
1896                         ; PREEMP FROM DOING ANYTHING, AND PREEMP WOULD
1897                         ; PREVENT CLOCK FLAG FROM GETTING CLEARED IF IT WAS
1898                         ; TESTED BEFORE CLOCK.
1899 ];PAGPRE
1900 ;       MOVEI J,APRCHN  ;DO NOT TAKE THESE OUT WITHOUT SEEING RG!!!!
1901 ;       JSP E,SPUR
1902 ;       JRST SCHED
1903         AOS CHSPUR+APRCHN       ;COUNT SPURIOUS INT
1904         JRST SCHED              ;(MIGHT HAVE BEEN RUNNING NULL JOB)
1905
1906 IFN PAGPRE,[
1907 PRESCD: AOS NLPPRE
1908         JRST SCHED
1909 ];PAGPRE
1910
1911 IFN KL10P,[
1912 CLKB2:  CONSZ 2000              ;NXM
1913          PUSHJ P,MEMHNG
1914         CONSZ 1040              ;POWER FAIL OR I/O PAGE FAIL
1915          BUG HALT,[KL: POWER FAIL OR I/O PAGE FAIL]
1916         CONSZ 300               ;CACHE DIR OR PT DIR PAR ERR.
1917          BUG HALT,[KL: CACHE OR MAP DIR PAR ERR]
1918         CONSO 4400              ;SBUS ERR OR MB PAR ERR
1919          JRST SCHED             ;CALLED MEMHNG, AND NOTHING ELSE => SCHEDULE.
1920         SETOM PARRSN            ;TEL PAR ERR SCANNER THIS IS AN INTERRUPT, NOT A PG FAIL.
1921         RDERA PARERA            ;STORE ADDR OF PAR ERR.
1922         JRST CLKB1E
1923 ] ;IFN KL10P
1924
1925 IFN KS10P,[
1926 CLKBKS: CONSZ 7600      ; Any bad guys? (8080 -> KS is 20, Interval is 40,
1927          JRST CLKKS1    ; Memory ECC is 100.)
1928         CONO 020020+APRCHN      ; 8080 wants service.  Clear the bit.
1929         MOVEI I,NFKSTY          ; TTY # (fancy name for 0)
1930         CONO PI,TTYOFF          ; Pretend this is TTY interrupt level.
1931         SKIPN A,8CTYIN          ; Any input from 8080?
1932          JRST CLKKS2
1933         SETZM 8CTYIN            ; Yes:  Make room for more.
1934         PUSHJ P,NTYI1           ; Stuff it into the tty.
1935         MOVEI I,NFKSTY          ; Just in case...
1936 CLKKS2: SKIPN 8CTYOT            ; Room for output yet?
1937          PUSHJ P,TYPSC          ; Yes:  Get some now.
1938         CONO PI,TTYON           ; No:  8080 will wake us up later.
1939         JRST SCHED              ; Null job might have been running.
1940
1941 CLKKS1: CONSZ 1000              ;Power failure
1942          BUG HALT,[KS: POWER FAIL]
1943         CONSZ 6000              ;KS -> 8080 or Flag 24
1944          BUG HALT,[KS: KS->8080 FLAG OR FLAG 24 SET]
1945         CONSZ 400               ;NXM
1946          PUSHJ P,MEMHNG
1947         CONSO 200               ;Bad memory data
1948          JRST SCHED
1949         IORD B,[KSECCS]
1950         MOVEM B,PARERA
1951         JRST CLKB1E
1952
1953 ] ;IFN KS10P
1954 \f
1955 CLUFLS: CONO PI,CLKON   ;FROM UFLS
1956         CLKLEV
1957         MOVE T,UPC(U)
1958         MOVEM T,CLKBRK
1959         AOS NUFLS
1960         AOS NLPUFL
1961         JRST SCHED2
1962
1963         ;CLOCK QUEUE SERVICE
1964 CLQBRK: SKIPG U,CLROOT  ;GET POINTER TO CURRENT BLOCK
1965          BUG            ;CLK QUEUE SCREWED
1966         SKIPG T,1(U)    ;GET POINTER TO NEXT BLOCK
1967          BUG            ;CLK QUEUE SCREWED
1968         MOVEM T,CLROOT  ;SET UP POINTER FOR NEXT BLOCK
1969         SETOM 1(U)      ;INDICATE CURRENT BLOCK IDLE
1970         XCT 2(U)        ;EXECUTE REQUEST (PROBABLY A JRST)
1971                 ;FALL THROUGH IF SINGLE INST RQ
1972 CLQRET:         ;RETURN FROM REQUEST
1973         SKIPN @CLROOT   ;SKIP IF TIME TILL NEXT RQ NONZERO
1974         JRST CLQBRK     ;ZERO TIME DELTA, DO NEXT RQ
1975         JRST CLQBRT     ;RETURN TO CLOCK ROUTINE
1976
1977 CLQTTR: JUMPE TT,CLQRET ;COMMON RETURN FOR TT IDLE FLAG
1978 CLQREE: MOVEI E,CLQRET  ;RE ENTER RQ
1979
1980 ;CLOCK OFF OR IN PROGRESS LEVEL ADD TO CLOCK QUEUE, CALL BY JSP E,
1981         ; T HAS TIME TILL RQ IN 60'THS
1982         ; C POINTS TO THREE WORD BLOCK, RQ'ED INST IS IN THIRD
1983 CLQPUT: MOVEI B,CLROOT-1
1984 CLQPU2: MOVE A,B        ;REPLACE POINTER TO PREV BLOCK WITH CURRENT
1985         SKIPG B,1(B)    ;GET LINK TO NEXT BLOCK
1986          BUG            ;CLK QUEUE SCREWED
1987         SUB T,(B)       ;SUBTRACT TIME DELTA FOR NEXT BLOCK
1988         JUMPG T,CLQPU2  ;JUMP IF RQ LATER THAN CURRENT BLOCK
1989         JUMPE T,CLQPU6  ;JUMP IF RQ SAME AS " " (COULD USE PU2 BUT THIS FASTER)
1990         ADD T,(B)       ;RQ EARLIER, ADD BACK
1991         MOVEM T,(C)     ;SET DELTA OF BLOCK BEING ADDED
1992         SUB T,(B)       ;COMPUTE NEG OF DELTA FOR NEXT BLOCK
1993         MOVNM T,(B)     ;SET TIME DELTA FOR NEXT BLOCK
1994         MOVEM B,1(C)    ;SET LINK OF NEW BLOCK TO NEXT
1995         MOVEM C,1(A)    ;SET LINK OF PREV BLOCK TO NEW
1996         JRST (E)
1997
1998 CLQPU6: SETZM (C)       ;SET TIME DELTA OF NEW BLOCK TO ZERO
1999         MOVE A,1(B)     ;GET POINTER TO NEXT BLOCK
2000         MOVEM A,1(C)    ;SET POINTER OF NEW TO NEXT BLOCK
2001         MOVEM C,1(B)    ;SET POINT OF CURRENT TO NEW BLOCK
2002         JRST (E)
2003 \f
2004 ;MAIN PROG LEVEL ADD TO CLOCK QUEUE
2005 ;CALL BY PUSHJ P,CLQADD
2006 ;WITH POINTER TO BLOCK IN NEXT WORD AND TIME TILL RQ IN T IN 60'THS
2007 ;POINTER TO BLOCK SHOULD NOT BE INDEXED BY C
2008
2009 CLQAD1: MOVEI T,1       ;RQ IN ONE TICK
2010 CLQADD: PUSH P,C
2011         MOVE C,@-1(P)   ;GET BLOCK POINTER
2012         MOVEI C,@C
2013         SKIPL 1(C)      ;SKIP IF IDLE
2014         JRST POPCJ1     ;IGNORE THIS RQ, BLOCK ALREADY ACTIVE
2015         PUSH P,A
2016         PUSH P,B
2017         PUSH P,E
2018         SKIPN (C)       ;DELTA WORD OF IDLE BLOCK SHOULD BE ZERO
2019         SKIPG T         ;TIME SHOULD BE NON-ZERO
2020          BUG            ;CLK QUEUE SCREWED
2021         CONO PI,CLKOFF
2022         JSP E,CLQPUT    ;ADD RQ
2023 CLQDE4: CONO PI,CLKON
2024         POP P,E
2025         POP P,B
2026         POP P,A
2027         JRST POPCJ1
2028
2029 ;DELETE CLOCK QUEUE ENTRY
2030 ;CALL BY PUSHJ P,CLQDEL WITH POINTER TO BLOCK IN NEXT WORD
2031 CLQDEL: PUSH P,C
2032         MOVE C,@-1(P)   ;GET BLOCK POINTER
2033         MOVEI C,@C
2034         CONO PI,CLKOFF
2035         SKIPGE 1(C)     ;IGNORE RQ TO DELETE  IF IDLE
2036         JRST CKOCJ1
2037         PUSH P,A
2038         PUSH P,B
2039         PUSH P,E
2040         JSP E,CLQCLR
2041         JRST CLQDE4
2042
2043 CLQCLR: MOVEI B,CLROOT-1        ;CLOCK OFF OR IN PROGRESS VERSION
2044 CLQDE2: MOVE A,B
2045         SKIPG B,1(B)    ;GET POINTER TO NEXT BLOCK
2046          BUG            ;CLK QUEUE SCREWED
2047         CAME B,C        ;SKIP IF FOUND BLOCK TO DELETE
2048          JRST CLQDE2
2049         SKIPG B,1(B)    ;GET POINTER TO BLOCK AFTER ONE TO DELETE
2050          BUG            ;CLK QUEUE SCREWED
2051         MOVEM B,1(A)    ;PATCH AROUND DELETED BLOCK
2052         MOVE A,(C)
2053         ADDM A,(B)      ;ADD DELTA OF DELETED BLOCK TO NEXT
2054         SETZM (C)       ;CLEAR DEL
2055         SETOM 1(C)      ;MARK IDLE
2056         JRST (E)
2057 \f
2058 OVHMTR PGF      ;PAGE FAULT
2059
2060 IFN KL10P,[
2061 EBLK
2062 PFAILU: 0       ;SAVED U AS OF A PAGE FAILURE
2063 PFINST: 0       ;PF INSTRUCTION IF XCT
2064 PFOPC1: 0       ;SAVE PFOPC WHILE SWITCHING TO CLK LEVEL (PROTECT AGAINST XCTRI)
2065 BBLK
2066
2067 ;PAGE FAULTS COME HERE, WITH PC IN PFOPC, AND PI SYSTEM TURNED OFF.
2068
2069 PFAIL:  MOVEM U,PFAILU
2070         HLRZ U,EPTPFW
2071         ANDI U,%PFCOD   ;GET THE PFAIL CODE FROM THE PFW
2072         CAIE U,%PFPAR
2073          CAIN U,%PFPRX
2074           JRST PFA2     ;IT'S A PAR ERR; BYPASS XCTR HACKS
2075         MOVE U,PFOPC
2076         TLNE U,%PCUSR
2077          JRST PFA2
2078         LDB U,[331100,,(U)]     ;GET OPCODE OF LOSING INSTRUCTION.
2079                                 ;ASSUME THAT IN EXEC MODE VIRTUAL
2080                                 ; AND PHYSICAL ADDRESSES ARE IDENTICAL
2081                                 ; FOR INSTRUCTION FETCHES.  ALSO ASSUME
2082                                 ; THAT NOBODY DOES XCT OF XCT OF XCTR.
2083 PFA4:   CAIE U,XCTRI_-33        ;SKIP IF "XCTR WITH INHIBIT"
2084          JRST PFA1
2085 REPEAT 2, AOS PFOPC             ;ONCE COMPENSATING FOR INSTR ABORT, AND ONCE TO SKIP
2086         MOVE U,PFAILU
2087         JRST 17,@PFOPC          ;KL-10 CROCK: JRST 17, TURNS ON PI SYSTEM
2088
2089 PFA1:   CAIE U,XCTR_-33         ;SKIP IF "XCTR WITH NO INHIBIT"
2090          JRST PFA3
2091 PFA2:   CONSO PI,77400          ;PI IN PROGRESS?
2092          CONSO PI,1             ;CHANNEL 7 ENABLED?
2093           BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS OR CLKOFF]
2094         SKIPGE USER
2095          BUG AWFUL,[PAGE FAULT IN NULL JOB]
2096         MOVE U,PFOPC
2097         MOVEM U,PFOPC1
2098         MOVE U,PFAILU           ;RESTORE U SO CLKSAV CAN RE-SAVE IT
2099 TPFLT1: SETOM PFAILF
2100         CONO PI,CLKRQ           ;CAUSE CLK BREAK AND PI SYSTEM ON
2101         JRST .                  ;TAKES A WHILE TO GO OFF
2102
2103 ;COME BACK HERE PI IN PROGRESS ON CLK CHANNEL
2104 PFA6:   MOVE T,PFOPC1
2105         MOVEM T,CLKBRK          ;SAVE PC AS OF PAGE FAULT AS PLACE INTERRUPTED FROM
2106         AOSN PFAILF             ;IF INTERRUPTED FROM INTPFL,
2107          JRST PFA9              ; PC DOESN'T POINT TO FAULTING INSTRUCTION
2108         TLNE T,%PSUSR           ;MAYBE SPURIOUS MPV ON IOT IN USER MODE?
2109          TLNE T,%PSUIO
2110           JRST PFA9             ;CAN'T BE, I/O IS LEGAL
2111         HLRZ TT,UPFW(U)         
2112         ANDI TT,%PFCOD
2113         CAIE TT,%PFPNA          ;CAN'T BE IF PAGE FAULT IS REALLY SOME OTHER RANDOM BREAK
2114          CAIN TT,%PFILW         ;SUCH AS A PARITY ERROR
2115           JRST PFA11
2116 PFA9:
2117 ;       MOVE T,PFOPC
2118 ;       MOVEM T,UPOPC(U)        ;SOLELY FOR THE .OPC USER VARIABLE
2119         LDB E,[$PFPNO,,UPFW(U)] ;FAILING PAGE NO
2120         HLRZ D,UPFW(U)
2121         ANDI D,%PFCOD           ;GET THE PAGE-FAULT CODE.
2122         MOVEI A,0               ;INIT USER INT BITS
2123         CAIE D,%PFPNA
2124         CAIN D,%PFILW
2125          JRST PFA5              ;REAL PAGE FAULT OR RWF
2126         CAIN D,%PFMAR
2127          JRST PFA7A
2128         CAIN D,%PFPRO
2129          JRST PFA7              ;OTHER RANDOM BREAKS
2130         CAIE D,%PFPAR
2131         CAIN D,%PFPRX
2132          JRST PFA14             ;PARITY ERROR
2133         MOVSI D,SCLBPF          ;UNKNOWN PFW, GET SYSTEM JOB TO BARF ABOUT IT
2134         TDNE D,SUPCOR
2135          BUG PAUSE,[BAD PAGE FAIL WORD ],OCT,BPFPFW     ;LOSING IN REAL TIME
2136         IORM D,SUPCOR
2137         AOS BPFERR
2138         MOVEM U,BPFUSR
2139         MOVE D,UPFW(U)
2140         MOVEM D,BPFPFW
2141         MOVE D,CLKBRK
2142         MOVEM D,BPFPC
2143         JRST SCHED              ;IGNORE THE FAULT (BUT DO A FULL SCHEDULE SO SYS JOB WAKES)
2144
2145 PFA14:  SETZM PARRSN            ;SAY THIS IS PAR ERR TRAP, NOT PAR ERR INTERRUPT.
2146         MOVE D,UPFW(U)
2147         MOVEM D,PARPFW          ;SAVE PFW OF PAR ERR FOR ERROR MESSAGE
2148         AC7CTX                  ;SELECT AC BLOCK 7, USED BY UCODE.
2149         UMOVE D,0               ;SAVE THE AC THAT HOLDS THE BAD WORD
2150         MOVEM D,PARWRD
2151         SYSCTX                  ;AND RESET THE DATAO PAG TO NORMAL VALUE
2152         JRST CLKB1E             ;GO SCAN FOR THE ERROR.
2153
2154 PFA3:   CAIE U,XCT_-33
2155          BUG HALT,[PAGE FAULT IN SYSTEM AT ],OCT,PFOPC  ;BARF!
2156         MOVE U,@PFOPC           ;QUUX! LET ONE LEVEL OF XCT WIN
2157         MOVEM U,PFINST
2158         MOVE U,PFAILU
2159         LDB U,[331100,,@PFINST]
2160         JRST PFA4
2161
2162 PFA11:  XCTRI XR,[MOVE T,(T)]   ;GET INSTRUCTION IN WHICH PAGE FAIL OCCURRED
2163          TLCA T,700000          ;AND CHECK HIGH THREE BITS OF OPCODE
2164           JRST PFA9             ;JUMP IF FAULT WAS ON INSTRUCTION FETCH
2165         TLCE T,700000
2166          JRST PFA12             ;JUMP IF INSTRUCTION NOT AN IOT
2167 PFA13:  MOVSI TT,(HRRI T,)
2168         DPB T,[2700,,TT]
2169         XCTRI XEA,TT            ;COMPUTE ITS EFFECTIVE ADDRESS
2170          TLZA T,37              ;CLEAR @+XR, BUT LEAVE OPCODE AND AC
2171           JRST PFA9             ;JUMP IF FAULT ON INDIRECT WORD
2172         MOVEM T,MUUODP(U)       ;IT WAS A SPURIOUS MPV, SO
2173         MOVE T,CLKBRK           ; SIMULATE TRAPPING AS A UUO
2174         HRRI T,1(T)
2175         MOVEM T,XUUOH(U)        ;STORE OLD PC
2176         MOVE T,CLCX(U)
2177         MOVEM T,MUUOCX(U)       ;AND OLD CONTEXT
2178         MOVE T,MUUOCN(U)
2179         MOVEM T,CLKBRK          ;GET NEW PC
2180         JRST CLKB5              ;AND RESTART USER AT UUOH0
2181
2182 PFA12:  TLNN T,700000           ;MAYBE AN INSTRUCTION OVERLAYED ON AN MUUO, E.G. LPMR
2183          TLNN T,040000          ;OPCODES 040-077 QUALIFY.
2184           TLCA T,(XCT)
2185            JRST PFA13           ;YUP.
2186         TLNE T,777000           ;SKIP IF OPCODE WAS XCT
2187          JRST PFA9
2188 ;       TLZ T,777740
2189 ;       TLO T,(MOVEI T,)
2190 ;Following instruction is suspected of not working (sometimes using wrong AC block)
2191 ;       XCTRI XEA,T             ;COMP EFFECTIVE ADDRESS OF XCT IN USER CONTEXT
2192 ;;       JRST PFA11             ;AND GO PROCESS INSTRUCTION AT THAT ADDRESS
2193 ;        JRST [ MOVEM T,TRMNAM(U)       ;TEMPORARY FOR DEBUGGING
2194 ;               JRST PFA11 ]
2195 ;       JRST PFA9               ;HERE IF FAULT WAS IN INDIRECT CYCLE
2196 ;Replacement code:
2197 PFA15:  DATAI PAG,TT            ;HMM, SEE IF WRONG AC BLOCK SELECTED
2198         TLNN TT,100
2199          BUG
2200         LDB TT,[220400,,T]      ;CHECK FOR NEED TO SIMULATE INDEXING
2201         JUMPE TT,PFA16
2202         UMOVE TT,(TT)
2203         ADD TT,T
2204         HRR T,TT
2205 PFA16:  TLNN T,(@)              ;CHECK FOR NEED TO SIMULATE INDIRECT
2206          JRST PFA11
2207         XCTRI XR,[MOVE T,(T)]
2208          JRST PFA15             ;PROCESS INDIRECT WORD
2209         JRST PFA9               ;TAKE FAULT ON INDIRECT WORD
2210 ;End replacement code.
2211 ];KL10P
2212 \f
2213 IFN KS10P,[
2214
2215 EBLK
2216
2217 IRP I,,[1,2,3,4,5,6,7]
2218 PF!I!SVU:       0       ;Saved U at PI level I page fail
2219 PF!I!SVT:       0       ;Saved T at PI level I page fail
2220 PF!I!INS:       0       ;Instruction at PI level I page fail
2221 TERMIN
2222 IFN .-PF1SVU-21., .ERR Wrong length PFXSVU block.
2223
2224 BBLK
2225
2226 IRP I,,[1,2,3,4,5,6,7]
2227 PF!I!AIL:       ;;PI level I page fail comes here.
2228         MOVEM T,PF!I!SVT        ;Save T
2229         MOVEM U,PF!I!SVU        ;Save U
2230         JSP U,PIFAIL            ;Set up U and join common code
2231 TERMIN
2232 IFN .-PF1AIL-21., .ERR Wrong length PFXAIL block.
2233 PFXSVT==:0,,<PF7SVT-<PF7AIL+3>>
2234 PFXINS==:0,,<PF7INS-<PF7AIL+3>>
2235 PFXWRD==:0,,<EPTP7W-<PF7AIL+3>>
2236 PFXOPC==:0,,<EPTP7O-<PF7AIL+3>>
2237
2238 PIFAIL: MOVE T,PFXWRD(U)        ;Check page fail word
2239         TLNE T,%PFNXI
2240          BUG AWFUL,[NON-EX IO REG WITH PI IN PROGRESS ],OCT,PFXWRD(U),[PC=],OCT,PFXOPC(U)
2241         TLNE T,%PFNXM\%PFPAR
2242          BUG AWFUL,[NXM OR PARITY ERROR WITH PI IN PROGRESS]
2243         MOVE T,PFXOPC(U)        ;Check for user mode.
2244         TLNE T,%PSUSR
2245          BUG AWFUL,[PAGE FAULT IN USER MODE WITH PI IN PROGRESS]
2246         SKIPA T,(T)             ;We assume that it wasn't the instruction
2247                                 ;fetch itself that caused the fault.
2248 PIFL2:   MOVEI U,PF7AIL-PF7XCT(U)       ;Correct U on return from PFXXCT
2249         MOVEM T,PFXINS(U)       ;Save instruction that caused fault
2250         LSH T,-33               ;Look at opcode
2251         CAIE T,XCTRI_-33        ;XCTRI gets special treatment:
2252          JRST PIFL1
2253 REPEAT 2, AOS PFXOPC(U)         ;Arrange for it to skip.
2254         JRST PFXRET(U)          ;And return.
2255
2256 IRP I,,[1,2,3,4,5,6,7]
2257 PF!I!RET:
2258         MOVE T,PF!I!SVT         ;Restore T
2259         MOVE U,PF!I!SVU         ;Restore U
2260         JRST 2,@EPTP!I!O        ;Return
2261 TERMIN
2262 IFN .-PF1RET-21., .ERR Wrong length PFXRET block.
2263 PFXRET==:0,,<PF7RET-<PF7AIL+3>>
2264
2265 ;;;Let XCT chains that end in XCTRI win.  We assume that none of the
2266 ;;;fetches along the way to the XCTRI itself caused the fault.
2267 PIFL1:  CAIE T,XCT_-33
2268          BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS]
2269         MOVE T,PFXSVT(U)        ;Restore T
2270         JRST PFXXCT(U)          ;Go pick up word XCT'ed
2271
2272 IRP I,,[1,2,3,4,5,6,7]
2273 PF!I!XCT:
2274         MOVE U,PF!I!SVU         ;Restore U
2275         MOVE T,@PF!I!INS        ;Pick up XCTed instruction
2276         JSP U,PIFL2             ;Set up U again and rejoin common code
2277 TERMIN
2278 IFN .-PF1XCT-21., .ERR Wrong length PFXXCT block.
2279 PFXXCT==:0,,<PF7XCT-<PF7AIL+3>>
2280 \f
2281 EBLK
2282
2283 PFLCLK: 0       ; Did page fault happen with CLKOFF?
2284 PFLSVU: 0       ; Saved U during page fail
2285 PFLSVT: 0       ; Saved T during page fail
2286 PFLINS: 0       ; Faulting instruction
2287
2288 BBLK
2289
2290 ;;; Note!
2291 ;;; If we are swapped out while running with Exec mode PC between PFAIL and
2292 ;;; PFAILE inclusive, EPTPFO is saved as our PC.  (There are actually only
2293 ;;; a few PC's for which this is possible given that we mostly run CLKOFF.)
2294
2295 PFAIL:  SETZM PFLCLK
2296         CONSO PI,1
2297          SETOM PFLCLK
2298         CONO PI,CLKOFF          ; Don't bother me
2299         MOVEM U,PFLSVU          ; Save U
2300         MOVEM T,PFLSVT          ; Save T
2301         SKIPGE U,USER
2302          BUG AWFUL,[PAGE FAULT IN NULL JOB]
2303         MOVE T,EPTPFW           ; Get the explanation
2304         MOVEM T,UPFW(U)         ; Save it for others
2305         MOVE U,PFLSVU           ; Restore U, only needed it for a moment.
2306         TLNE T,%PFNXM\%PFPAR    ; Bad stuff should interrupt us, right?
2307          BUG AWFUL,[NXM OR PARITY ERROR DIDN'T INTERRUPT]
2308         MOVE T,EPTPFO
2309         TLNE T,%PSUSR           ; In Exec mode?
2310          JRST PFLUSR
2311         MOVE T,(T)              ; We assume that it wasn't the instruction
2312                                 ; fetch itself that caused the fault.
2313 PFLOOP: MOVEM T,PFLINS          ; Save instruction that caused fault.
2314         LSH T,-33               ; Check opcode for XCTRI
2315         CAIN T,XCTRI_-33        ; Should we skip?
2316          JRST PFLSKP
2317         CAIN T,XCTR_-33         ; Touching user address?
2318          JRST PFLUSR
2319         CAIE T,UMOVE_-33        ; These guys are just like XCTR
2320          CAIN T,UMOVEM_-33
2321           JRST PFLUSR
2322         ;; Let XCT chains win.  We assume that none of the fetches along
2323         ;; the way caused the fault.
2324         CAIE T,XCT_-33
2325          BUG HALT,[PAGE FAULT IN SYSTEM AT],OCT,EPTPFO
2326         MOVE T,PFLSVT           ; Restore T for a moment
2327         MOVE T,@PFLINS          ; Pick up XCTed instruction
2328         JRST PFLOOP
2329
2330 ;;; Come here to cause faulting instruction to skip.
2331 PFLSKP: MOVE T,PFLSVT           ; Restore T
2332 REPEAT 2, AOS EPTPFO
2333         SKIPL PFLCLK            ; Unless clock was already off
2334          CONO PI,CLKON          ; turn it back on
2335 PFAILE: JRST 2,@EPTPFO
2336
2337 ;;; Come here on NXI error.
2338 PFLNXI:
2339
2340 ;;; We come here when the page fault is "soft" and it happened in user mode
2341 ;;; or while using XCTR, UMOVE, or UMOVEM.
2342 PFLUSR: MOVE T,EPTPFW
2343         TLNN T,%PFNXI           ; Non-existent IO Register?
2344          JRST PFLU1             ; Nope
2345         MOVE T,EPTPFO
2346         TLNE T,%PSUSR           ; NXI in User IOT mode is not fatal.
2347          TLNN T,%PSUIO
2348           BUG AWFUL,[NON-EX IO REG ],OCT,EPTPFW,[PC=],OCT,EPTPFO
2349 PFLU1:  MOVE T,PFLSVT           ; Restore T
2350         SKIPGE PFLCLK           ; Check for lossage
2351          BUG AWFUL,[PAGE FAULT WITH CLKOFF AT],OCT,EPTPFO
2352 TPFLT1: SETOM PFAILF            ; Cause CLK level to go to PFLU2
2353 CCLKRQ: CONO PI,CLKRQ
2354         JRST .                  ; Takes a while to go off...
2355
2356 ;;;CLKBRK comes back here at CLK level.
2357 PFLU2:  MOVE T,EPTPFO
2358         MOVEM T,CLKBRK          ;Save PC of page fault as place interrupted
2359                                 ;from.
2360         LDB E,[$PFPNO,,UPFW(U)] ;E: Virtual page number
2361         HLRZ D,UPFW(U)
2362         ANDI D,%PFNXI\%PFWRT\%PF2.9\%PF2.8      ;D: Page fault code
2363         MOVEI A,0               ;A: User interrupt bits
2364         TRNE D,%PFNXI           ;NXI in User IOT mode.
2365          JRST PFA7A
2366
2367 ;Drops through into PFA5
2368
2369 ] ;KS10P
2370 \f
2371 IFN KA10P,[
2372 CLKB1:  MOVE T,CLKBRK
2373         CONSZ 200
2374          JRST CLKFO1    ;FLOATING OVERFLOW ENABLED
2375 CLKFO2: CONSZ 20        ;SKIP IF AR OV INT NOT ENABLED
2376          CONSO 10       ;OV ENABLED, SKIP IF OV
2377           CONSZ 270000  ;NOT OV, CHECK PDL OV, MEM PROTECT, NXM
2378            JRST CLKB1C  ;PDL OV, NXM, ETC
2379         JRST CLKB1D     ;ONLY CLOCK BREAK, AR OV JUST ENABLED
2380
2381 CLKFO1: CONSO 100       ;SKIP ON FLOATING OVERFLOW
2382          JRST CLKFO2    ;NOT REALLY FLOATING OVERFLOW
2383 CLKB1C: JUMPL U,CNLJL   ;NULL JOB LOST
2384         MOVEI A,0       ;SET UP INTERRUPT BITS FOR USER
2385         CONSZ 20        ;SKIP IF OV NOT ENABLED
2386          CONSO 10       ;OV ENABLED, SKIP ON OV
2387           JRST CLB1A    ;NOT AROV
2388         PUSHJ P,AROV
2389 CLB1A:  CONSZ 200       ;SKIP IF FL OV NOT ENABLED
2390          CONSO 100      ;FL OV ENABLED, SKIP ON FL OV
2391           JRST CLB1B    ;NOT FLOATING OVERFLOW
2392         PUSHJ P,ARFOV
2393 CLB1B:  CONSO 270000    ;SKIP IF PDL OV, NXM, OR MEM PROTECT
2394          JRST CLB1X
2395         CONSZ 10000     ;NON EX MEM
2396          PUSHJ P,MEMHNG
2397         CONSO 200000
2398          JRST CLKB1H
2399         TRO A,%PIPDL    ;PDL OVFLO
2400         TLNN T,%PCUSR   ;SKIP IF IN USER MODE
2401          BUG HALT,[PDL OVERFLOW IN EXEC MODE]
2402 CLKB1H: CONSO 20000     ;MEM PROTECT
2403          JRST CLKB1G
2404         HLLZ D,UPQUAN(U)        ;PICK UP FAULT BITS
2405         TLNE D,1000
2406          TLNN D,770     ;ALL CONDITIONS WHICH ABORT INSTRUCTION
2407           JRST CLKB1J   ;(PLUS PAGE NXM FOR RANDOMNESS)
2408         TRZ A,%PIPDL    ;INSTRUCTION ABORTED, DON'T SET PDL OV
2409         HLLZ T,UPOPC(U)
2410         LSH T,5
2411         HRR T,UPOPC(U)  ;FIX UP OPC
2412         MOVEM T,CLKBRK  ;RESET PC FROM OPC
2413         AOS NPGFLT
2414         HLRZ E,UPJPC(U) ;GET VIRTUAL PAGE # (LH OF JPC)
2415         TRNN E,400
2416          JRST CFHFPF
2417         ANDI E,377      ;FLUSH AGE ETC
2418 ] ;KA10P
2419         ;DROP THROUGH INTO PFA5
2420 \f
2421 IFE KA10P,[
2422 PFA5:   AOS NPGFLT
2423 ] ;IFE KA10P
2424         MOVE TT,LUMPS
2425         HRRZ W,USER
2426 IFN KA10P,[
2427         TLNE D,320      ;SKIP IF REALLY PAGE FAULT
2428          JRST CFH4      ;OTHERWISE WRITE IN READ ONLY OR EXECUTING IMPURE PAGE
2429 ] ;KA10P
2430
2431 ;COME HERE WITH
2432 ;  A    BITS FOR USER'S PIRQC
2433 ;  D    PAGE FAULT BITS OR CODE
2434 ;  E    VIRTUAL PAGE NUMBER OF PAGE FAILURE
2435 ;  TT   THE UMAPS SETTING
2436 ;THE MYSTERIES OF W:
2437 ;  RH IS A USER INDEX
2438 ;  LH 0 => NORMAL PAGE FAULT
2439 ;     NON0 => SWAP IN REQUEST FOR OTHER REASON.  D,TT SHOULD BE 0.
2440 ;     SPECIFICALLY,
2441 ;     4.9 => DMA DEVICE SWAP-IN, SEE SWIRQB, SWPPIN
2442 ;     4.8 => FROM SCHEDULER, TO GIVE INTERRUPT (?)  THIS IS NO LONGER USED,
2443 ;            PROBABLY. 
2444 ;     4.7 => FROM CFHAHD, TO PAGE AHEAD.  THIS IS ONE LEVEL OF RECURSIVE
2445 ;            USE OF CFHSW1. 
2446 ;  FOR A NORMAL PAGE FAULT, THE USER PC IS IN CLKBRK.
2447
2448 CFHSW1:         HRRZM E,CFHUVP  ;USER'S VIRTUAL PAGE NUMBER
2449                 TRZN E,200
2450                  JRST CFH1
2451                 MOVEI C,UPGCPH(W)       ;VIRTUAL ADDRESS IN USER'S HIGH SEG
2452                 TLNN TT,%UMMPU  ;IS MY UPPER NORMAL?
2453                  JRST CFH2      ;YES, USE MY UPPER CPB
2454                 MOVEI C,UPGCPH(TT) ;NO, TRY HIS UPPER.
2455                 TLNE TT,%UMUTL  ;IS MY UPPER GOING TO HIS LOWER?
2456                  MOVEI C,UPGCP(TT) ;YES, TRY HIS LOWER.
2457                 JRST CFH2
2458
2459 CFH1:           MOVEI C,UPGCP(W)        ;VIRT ADDRESS IN USER'S LOW SEG
2460                 TLNN TT,%UMMPL
2461                  JRST CFH2      ;MY LOWER DBR NOT HACKED
2462                 MOVEI C,UPGCP(TT)
2463                 TLNE TT,%UMLTU  ;WAS MY LOWER HACKED TO POINT TO UPPER?
2464                  MOVEI C,UPGCPH(TT) ;YES.
2465 CFH2:           ROT E,-1
2466                 ADD C,E
2467                 HRLI C,222200
2468                 SKIPGE E
2469                  HRLI C,2200
2470                 MOVE T,C        ;CALCULATE MAP ENTRY B.P. FROM CIRC PTR B.P.
2471                 ADD T,[(200000-2000)UPGMP-UPGCP]
2472                 LDB E,C         ;CIRC MEM USE POINTER FOR PAGE FAULT
2473                 JUMPE E,CFH4    ;ADDRESS IS IN REAL ILM
2474                 CAIN E,-1
2475                  JRST CFH4      ;ON REFERENCE TO ABS PAGE ALSO ILM
2476 IFN KL10P,[     CAIE D,%PFILW
2477                  JRST CFHW1
2478                 LDB I,T
2479                 JRST .+1(I)
2480                   BUG           ;?
2481                   JRST CFH4     ;WRITE IN READ ONLY?
2482                   JRST CFHRWF   ;READ WRITE FIRST
2483                   BUG           ;?
2484 ] ;KL10P
2485 IFN KS10P,[     CAIN D,%PFWRT\%PF2.8    ;WRITE IN READ ONLY
2486                  JRST CFH4
2487                 CAIN D,%PFWRT\%PF2.9    ;READ WRITE FIRST
2488                  JRST CFHRWF
2489                 TRNE D,%PF2.8\%PF2.9    ;PAGE NOT IN MAP
2490                  BUG HALT,[BOGUS PAGE FAIL CODE]
2491 ] ;KS10P
2492 IFN KA10P,[
2493                 TLNE D,40
2494                  JRST CFHRWF
2495 ] ;KA10P
2496 ;REFERENCE TO PAGE WITH NO ACCESS IN MAP.
2497 CFHW1:          SKIPGE RPCL(W)
2498                  JUMPGE W,CFF1  ;BEING RPCLSRED?
2499                 MOVEM A,CFHAS
2500                 AOSE CIRPSW
2501                  JRST CFH5      ;CIRPSW NOT AVAILABLE
2502                 TRZE E,400000
2503                  TRNE E,200000
2504                   JRST CFHSW3
2505                 CAML E,MMPMX
2506                  BUG            ;MMP OUT OF RANGE
2507                 MOVE C,E        ;CIRC PNTR ALREADY POINTS TO MMP
2508                 ADD C,MMPEAD
2509                 JRST CFHSW4
2510
2511 CFHSW3:         PUSHJ P,UCPRL   ;FIND MMP
2512                   200000,,.+2
2513                  BUG            ;NONE?
2514                 SUB P,[4,,4]
2515 CFHSW4:         LDB D,[410200,,(C)]     ;TWO BITS OF MMP ENTRY GIVES DISPOSITION OF PAGE
2516                 AOS NRPI(D)
2517                 JRST @CFHDT(D)
2518
2519 CFHDT:  CFHPI   ;IN
2520         CFHPCI  ;COMING IN
2521         CFHPO   ;OUT
2522         CFHPGO  ;GOING OUT
2523 \f
2524 ;PAGE FAULT IN JOB BEING PCLSR'D.
2525 CFF1:   MOVE C,CLKBRK
2526         TLNE C,%PCUSR
2527          BUG            ;BEING RPCLSRED IN USER MODE
2528 IFN KA10P,[
2529         MOVSI D,1770
2530         ANDCAM D,UPQUAN(W)      ;CLR PG FLT
2531         LPMR UPGML(W)
2532         CONO 470000+APRCHN      ;CLR PDL OV + QT OV + MPV + NXM
2533 ] ;KA10P
2534         MOVE T,[BADBTS]
2535         IOR T,MSKST(W)
2536         AND T,A
2537         IORM T,PIRQC(W)
2538 IFE KA10P,[
2539         MOVE T,CLCX(W)          ;RESTORE UPT BUT NOT ACS
2540         HRLI T,300000
2541         DATAO PAG,T
2542 ] ;IFE KA10P
2543         CONO PI,CLKOFF          ;GO ALLOW SELF TO GET RPCLSRED
2544         JRST 10,UFL1            ;GO INTO UFLS WITH CLK OFF RATHER THAN
2545                                 ;IN PROGRESS
2546
2547 CFHRWF:                 ;HANDLE "WRITE IN READ-WRITE-FIRST PAGE" PAGE FAULT.
2548 IFN KA10P,[
2549         TLNE D,10
2550          JRST CFHW1     ;SOMETIMES NO ACCESS SEEMS TO BE ON TOO
2551         LDB I,T
2552         CAIE I,2
2553          BUG            ;GOT "WRITE IN R-W-F PAGE" BUT PAGE ISN'T R-W-F.
2554 ] ;KA10P
2555         MOVEI I,3
2556         DPB I,T
2557         MOVEM A,CFHAS
2558         JRST CFHX1
2559
2560 ;; EXIT FROM PAGE FAULT HANDLING FOR NON-ERROR FAULT.
2561 ;; C SHOULD CONTAIN 0 IF CAN CONTINUE NOW, OR A FLSINS TO WAIT WITH.
2562 ;; A SHOULD CONTAIN -1 IF FAULT HANDLED SUCCESFULLY (PAGE IN OR ON ITS WAY), ELSE 0.
2563 CFHX:   SETOM CIRPSW
2564         TLNN W,200000
2565          JUMPL W,CPOPJ
2566 CFH5A:  JUMPE C,CFHX1   ;IF NOT GOING TO WAIT, SKIP NPGWTU CODE
2567         MOVSI D,%SWPGW
2568         IORM D,USWST(W) ;WAITING FOR PAGE
2569         AOS NPGWTU      ;KEEP COUNT OF USERS WAITING FOR A PAGE
2570         SKIPN FLSINS(W)
2571          MOVEM C,FLSINS(W)
2572         SKIPE FLSINS(W)
2573          CLEARM DLSRCH
2574 CFHX1:  MOVE A,CFHAS
2575 IFN KA10P, MOVSI D,1770         ;CLEAR FAULT STATUS BITS
2576         MOVE U,USER
2577         JRST CFH6
2578
2579 ;; WAIT FOR CIRPSW TO BE AVAILABLE.
2580 CFH5:   SETZ A,
2581         JUMPL W,CPOPJ
2582         MOVE C,[SKIPL CIRPSW]
2583         AOS NLPPGC
2584         JRST CFH5A
2585 \f
2586 ;PAGE FAULT ON PAGE THAT'S REALLY IN CORE.
2587 CFHPI:  PUSHJ P,CFHAHC  ;SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2588         MOVSI D,MMPPGA
2589         TDNE D,(C)
2590          AOS NPGAHR     ;COUNT NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2591         ANDCAB D,(C)
2592         MOVSI D,MMPPGB
2593         TDNE D,(C)
2594          AOS NPGBHR     ;COUNT NUMBER OF PAGES AGED BY PAGE-BEHIND WHICH WERE USED AGAIN.
2595         ANDCAB D,(C)
2596         HRLI C,2200
2597         PUSH P,C        ;SAVE MMP ENTRY ADDRESS FOR PPIUM.
2598         PUSHJ P,UCPRL
2599             100000,,.+2 ;RETURN ON MEMPNT
2600          BUG            ;NO MEMORY LINKED IN?
2601         SUB P,[4,,4]    ;FIND MEMBLT INDEX
2602         POP P,C
2603         TLNE D,MMPBAD   ;WAS THIS PAGE RECENTLY A PAR ERR VICTIM?
2604          JRST CFHPB     ;YES; READ IT BACK OFF THE DISK IF POSSIBLE.
2605 IFN E.SP,[
2606         JUMPGE W,E.SBAR ;IF NOT CALLED FROM SWPPIN
2607         HRRZ H,DISUSR   ;CHECK TO SEE IF SERVICING E&S
2608         CAIN H,(W)      ;NOT DISPLAY, THEN SKIP
2609          PUSHJ P,E.SPGI ;ELSE TIE DOWN PAGE
2610 E.SBAR:
2611 ]
2612         MOVE A,T
2613         HLLZS MMSWP(A)  ;CLEAR LENGTH OF CIRC LIST (BUT NOT EXEC PGS COUNT)
2614         MOVE D,C
2615         HRLI D,(TDNE T,)
2616         PUSHJ P,PPIUM   ;PUT PAGE INTO USERS' MAPS
2617 IFN E.SP,SETZM  E.SPGH  ; CLEAR QSWI1 FLAG
2618         MOVEI C,0
2619         MOVNI A,1
2620         JRST CFHX
2621
2622 ;COME HERE FOR PAGE WHICH SEEMS TO BE IN CORE, BUT HAD A PAR ERR RECENTLY.
2623 ;"SWAP IT OUT", SO IF IT'S PURE IT WILL JUST BE READ BACK FROM DISK.
2624 CFHPB:  PUSH P,W
2625         MOVE A,T
2626         SETOM CIRPSW    ;UNLOCK, SO SWPOPG CAN RE-LOCK.
2627         MOVE C,USER     ;TELL SWPOPG WHICH JOB SHOULDN'T BE PCLSR'ED.
2628         PUSHJ P,SWPOPL  ;"SWAP OUT" THE PAGE (EVEN IF LOCKED DOWN)
2629          JRST [ POP P,W ;FAILED TO GO OUT.  COULD BE EXEC PAGE POINTING TO IT,
2630                 SETZ A, ;OR A JOB THAT CAN'T BE PCLSRED RIGHT NOW.
2631                 MOVSI C,(CAIA)  ;WAIT A LITTLE AND TRY AGAIN (HOPE FOR THE BEST)
2632                 JRST CFHX ]
2633         POP P,W
2634         AOSE CIRPSW     ;SWPOPG UNLOCKS; RE-LOCK.
2635          JRST CFH5      ;OR ELSE GO INTO PAGE-WAIT TILL CIRPSW FREE.
2636         MOVE C,SWOMMP
2637         JRST CFHSW4     ;TRY AGAIN TO REFERENCE PAGE, SWAPPING IT BACK IN.
2638 \f
2639 ;ON A RANDOM PAGE FAULT, SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2640 ;ASSUMES W SET UP AS FOR CFHSW1, AND TT
2641 CFHAHC: MOVE D,CFHUVP   ;GET USER'S VIRTUAL PAGE NUMBER.
2642         TLNN W,-1       ;PAGE AHEAD ONLY FOR NORMAL PAGE FAULT (SO PC IS IN CLKBRK).
2643          SKIPN PAGAHD(W)        ;IS PAGE-AHEAD WANTED FOR THIS JOB?
2644           POPJ P,
2645         MOVSI T,%UMMPU
2646         TRNN D,200
2647          MOVSI T,%UMMPL
2648         TDNE TT,T       ;NO PAGE-AHEAD ON PAGE NOT MAPPED NORMALLY.
2649          POPJ P,
2650         HLRZ H,PAGRAN(W)
2651         HRRZ T,PAGRAN(W)
2652         CAML D,H        ;IS PAGE IN RANGE FOR AUTOMATIC PAGE-AHEAD?
2653          CAML D,T       ;IF SO, GO DO IT.
2654           POPJ P,
2655         PUSH P,C
2656         PUSHJ P,CFHAHD
2657         POP P,C
2658         POPJ P,
2659
2660 ;AUTOMATIC PAGE-AHEAD AND PAGE-BEHIND.
2661 ;WHEN PAGE N IS PUT INTO THE MAP, PAGE N+1 IS SWAPPED IN
2662 ;AND PAGE N-1 IS SWAPPED OUT.
2663 ;(ACTUALLY, 1 IS A PARAMETER, IN THE PAGAHD VARIABLE)
2664 CFHAHD: PUSH P,CFHUVP
2665 ;LOOP, REQUESTING SWAP-IN FOR THE NEXT N PAGES.  E HAS PAGE NUMBER TO SWAP IN.
2666 CFHAH1: MOVE E,CFHUVP
2667         HLRE A,PAGAHD(W)
2668         MOVE T,A
2669         ADD A,(P)
2670         CAMN A,E                ;DETECT END OF LOOP.
2671          JRST CFHAH2
2672         SKIPL T                 ;ELSE INCREMENT OR DECREMENT PAGE NUMBER.
2673          AOSA E
2674           SOS E
2675         PUSHJ P,CFHRNG          ;IS PAGE NUMBER IN RANGE FOR PAGE-AHEAD?
2676          JRST CFHAH2
2677         PUSH P,W
2678         HRLI W,500000           ;PAGE AHEAD THE PAGE.  100000 MEANS PAGE-AHEAD.
2679         SETZB D,TT
2680         SETOM CIRPSW            ;ALLOW CFHSW1 TO LOCK CIRPSW.
2681         PUSH P,CFHAS
2682         PUSHJ P,CFHSW1
2683         POP P,CFHAS
2684         SETZM CIRPSW            ;BUT REALLY IT'S ALREADY LOCKED SO KEEP IT SO.
2685         POP P,W
2686         SKIPN A
2687          AOS NPGAH1             ;COUNT NUMBER OF TIMES AN ATTEMPT FAILS.
2688         JRST CFHAH1
2689
2690 ;NOW IT'S TIME FOR PAGE-BEHIND.  E HAS PAGE NUMBER TO SWAP OUT.
2691 CFHAH2: MOVE E,(P)
2692 ;???? IS THERE ANY NEED TO PRESERVE U, EVER, INSIDE CFHSW1?
2693         PUSH P,U
2694         HRRE A,PAGAHD(W)        ;GET PAGE-BEHIND DISTANCE.
2695         JUMPE A,CFHAH4
2696         ADDB A,E                ;COMPUTE WHICH PAGE TO PAGE OUT.
2697         PUSHJ P,CFHRNG          ;SKIP IF PAGE IS IN RANGE FOR PAGE-BEHIND.
2698          JRST CFHAH4
2699         MOVE U,W
2700         PUSHJ P,UPLC            ;LOOK UP THE PAGE IN THE MAP.
2701         LDB D,Q                 ;D GETS CIRC PNTR
2702         JUMPE D,CFHAH4          ;NO PAGE THERE
2703         CAIN D,-1
2704          JRST CFHAH4            ;ABSOLUTE PAGE, DO NOTHING.
2705         LDB D,T
2706         TRO D,PMAGEM            ;AGE THE PAGE, IF THE PAGE IS REALLY IN THE MAP,
2707         TRNE D,600000
2708          DPB D,T
2709         AOS NPGBHA              ;COUNT PAGES AHED FOR PAGE-BEHIND.
2710         MOVE D,T                ;SAVE B.P. TO PAGE MAP HALFWORD, FOR CFHAH6.
2711         MOVE C,Q                ;STARTING FROM CIRC PTR, FIND MMP
2712         PUSHJ P,UCPRL
2713             200000,,.+2
2714          BUG                    ;IF NONE FOUND
2715         SUB P,[4,,4]            ;FOUND MMP, C POINTS TO IT
2716         MOVE E,C                ;SAVE ADDRESS OF MMP ENTRY
2717         MOVSI T,MMPTMP\MMPOUT   ;IF PAGE IS IN TRANSIT OR OUT, DO NOTHING TO IT.
2718         TDNE T,(C)
2719          JRST CFHAH6
2720         MOVE T,CLKBRK
2721         TLNN T,%PCUSR           ;IF JOB IN EXEC MODE, CAN'T SWAP OUT PAGE, SO JUST LEAVE AGED.
2722          JRST CFHAH6
2723         MOVE T,MEMFR
2724         SUB T,NCBCOM            ;IF LOTS OF FREE MEM, DON'T SWAP OUT.
2725         SUB T,SILNG
2726         CAML T,CFHAHS
2727          JRST CFHAH6
2728         PUSHJ P,UCPRL           ;GET CORE PAGE NUMBER IN T.
2729             100000,,.+2
2730          BUG
2731         SUB P,[4,,4]
2732         HLRZ A,MMSWP(T)
2733         JUMPN A,CFHAH6          ;POINTED TO BY AN EXEC PAGE, E.G. 340, CAN'T SWAP OUT.
2734         PUSH P,E
2735         PUSH P,D
2736         PUSH P,W
2737         MOVE A,T                ;PHYSICAL PAGE # TO SWAP OUT
2738         HRRZ C,W                ;DON'T PCLSR ME
2739         SETOM CIRPSW            ;SWPOPG WILL WANT TO RE-LOCK CIRPSW.
2740         PUSHJ P,SWPOPG          ;SWAP OUT
2741          JRST CFHAH5            ;CAN'T SWAP OUT => LEAVE JUST AGED.
2742         AOS NPGBHD              ;COUNT PAGES SWAPPED OUT BY PAGE-BEHIND.
2743 CFHAH5: POP P,W
2744         POP P,D
2745         POP P,E
2746         POP P,U
2747         POP P,CFHUVP
2748         AOS CIRPSW              ;SWPOPG UNLOCKS; RE-LOCK.
2749         POPJ P,                 ;CAN'T GET LOCKED BY SOMEONE ELSE, WE ARE AT CLOCK LEVEL
2750
2751 ;HERE FOR PAGE-BEHIND PAGE WHICH WE CAN'T OR DON'T WANT TO SWAP OUT.
2752 CFHAH6: MOVSI T,MMPPGB          ;IT HAS ALREADY BEEN AGED.  MARK IT FOR METERING PURPOSES.
2753         IORM T,(E)              ;E POINTS TO MMP ENTRY.
2754 CFHAH4: POP P,U
2755         POP P,CFHUVP
2756         POPJ P,
2757
2758 ;SKIP IF PAGE NUMBER IN E IS IN RANGE FOR PAGE-AHEAD OR PAGE-BEHIND.
2759 ;ASSUMES USER INDEX IN W.  CLOBBERS T.
2760 CFHRNG: CAIL E,400
2761          POPJ P,
2762         HLRZ T,PAGRAN(W)
2763         CAIGE E,(T)
2764          POPJ P,
2765         HRRZ T,PAGRAN(W)
2766         CAIL E,(T)
2767          POPJ P,
2768         JRST POPJ1
2769
2770 EBLK
2771
2772 CFHAHS: 20              ;IF LESS THAN THIS MUCH FREE MEM, PAGE-BEHIND SHOULD SWAP OUT.
2773
2774 NPGAHD: 0               ;NUMBER OF PAGES WE ACTUALLY SWAPPED IN FOR PAGE-AHEAD.
2775 NPGAH1: 0               ;NUMBER OF TIMES WE WERE UNABLE TO PAGE AHEAD.
2776 NPGBHD: 0               ;NUMBER OF PAGES WE ACTUALLY SWAPPED OUT FOR PAGE-BEHIND.
2777 NPGBHA: 0               ;NUMBER OF PAGES WE DID PAGE-BEHIND.
2778 NPGAHR: 0               ;NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2779 NPGBHR: 0               ;NUMBER OF PAGES AGED FOR PAGE BEHIND AND USED AGAIN.
2780
2781 BBLK
2782 \f
2783 ;REFERENCE TO SWAPPED OUT PAGE, MMP ADDRESS IN C.  SWAP IN THE PAGE.
2784 ;W HAS THE USER INDEX AND FLAGS.
2785 CFHPO:  PUSHJ P,CFHPOA
2786          JRST [ SETZ A, ;FAILED.  RETURN CODE FOR FAILURE, IF THIS IS FOR DEVICE (W<0).
2787                 JRST CFHX]
2788         TLNN W,100000           ;IF THIS IS A PAGE-AHEAD REQUEST,
2789          JRST CFHPOB
2790         MOVSI A,MMPPGA          ;MARK THE MMP ENTRY SO,
2791         IORM A,(C)
2792         AOS NPGAHD              ;AND COUNT IT AS A SUCCESSFUL ATTEMPT TO PAGE AHEAD.
2793 CFHPOB: TLNN W,200000
2794          JUMPL W,CFHPO2
2795         PUSHJ P,CFHAHC          ;ORDINARY PG FAULT => MAYBE PAGE AHEAD.
2796         MOVSI D,%SWBEM
2797 IFN SWPWSP,[            ;SWAPPING IN A PAGE FOR THIS GUY 
2798          ANDCAM D,USWST(W)      ;SO CLEAR BEST EFFORT MADE TO SWAP OUT BIT
2799 ];SWPWSP
2800 IFE SWPWSP,[
2801         TDNN D,USWST(W)         ;IF JOB IS BRINGING IN FIRST PAGE
2802          JRST CFHPO2            ; SINCE BEING SWAPPED OUT,
2803         ANDCAM D,USWST(W)       ;CLEAR BEST EFFOR MADE TO SWAP OUT BIT
2804         EXCH U,W                ;AND MAKE SWAP HISTORY TABLE ENTRY
2805         MOVSI T,0               ;FOR "BEGIN LOADING"
2806         PUSHJ P,SWPKHT
2807         EXCH U,W
2808 ];SWPWSP
2809 CFHPCI:
2810 CFHPGO:
2811 CFHPO2: MOVNI A,1       ;SIGNAL "SUCCESS"
2812         TLNN W,200000
2813          JUMPL W,CFHX
2814         MOVSI D,MMPTMP          ;BIT ON IF PAGE "IN TRANSIT"
2815         SKIPN FLSINS(W)
2816          MOVEM D,EPDL2(W)       ;HANG USER UNTIL PAGE GETS WHERE IT'S GOING
2817         HRLI C,(TDNE T,)        ;COMBINE WITH ADDRESS OF MMP
2818         AOS NLPPAG
2819         JRST CFHX
2820 \f
2821 ;SWAP IN PAGE.  W HAS USER INDEX AND FLAGS.  C HAS MMP ADDRESS.
2822 ;SKIPS IF SUCCESSFUL.  OTHERWISE RETURNS FLSINS IN C.
2823 ;SIGN BIT IN W IS SET FOR SWAP IN FOR DEVICE OR FOR PAGE-AHEAD
2824 ;(THAT IS, NOT ONE WHICH A JOB MUST WAIT FOR)
2825 ;SO DON'T INCREMENT SOME COUNTERS AND DON'T BOTHER WITH FLSINS IN C.
2826 CFHPOA:
2827 IFE SWPWSP,[
2828         SKIPGE USWSCD(W)        ;IF SWAP BLOCKED, EITHER UNBLOCK OR GIVE UP.
2829          JRST CFBO1
2830 CFBO2:
2831 ];SWPWSP
2832 IFN SWPWSP,[
2833         MOVE E,USWST(W) ;IF SWAPPED OUT, WE ARE EITHER GOING TO ENTER
2834         TLNE E,%SWOUT   ;THE LOADING STATE OR THE SWAP BLOCKED STATE
2835          JRST CFSB
2836 CFSB1:
2837 ];SWPWSP
2838         MOVSI E,MMPISW
2839         AND E,(C)
2840         CONO PI,UTCOFF-1
2841         JUMPN E,CFHPO5  ;INITIAL SWAPIN; GIVE UP AND WAIT NOW IF TUT IS LOCKED.
2842 CFHPO7: PUSHJ P,HMRQC   ;GET PHYS MEM BLOCK, NUMBER IN A.
2843          JRST CFHPO1    ;MEM NOT AVAILABLE
2844         MOVEI B,1
2845         DPB B,[410200,,(C)]     ;INDICATE COMING IN
2846         HRRZ B,(C)              ;OLD CP OF MMP
2847         MOVEM B,MEMPNT(A)       ;BECOMES LINK OUT OF CORE BLOCK
2848         HLRZ B,1(C)             ;B := DISK ADDRESS
2849         LDB I,[$MMPUN,,(C)]     ;I := DISK NUMBER
2850         CAIL I,NQS
2851          BUG
2852         HRLM B,MEMPNT(A)        ;SET DISK ADDRESS CORE BLOCK COMING FROM
2853 IFN SWPWSP,[
2854         MOVE D,USWST(W)
2855         TLNN D,%SWLOD
2856          AOSA NPLBNL
2857           AOS NPLBLJ
2858 ];SWPWSP
2859         SKIPE E         ;IF INITIAL SWAP IN PAGE, SOS THE TUT NOW
2860          PUSHJ P,CFHPO8 ;SINCE WE ARE DISSOCIATING THE PAGE FROM THE DISK BLOCK.
2861         CAIGE A,TSYSM
2862          CAIGE A,SYSB
2863           BUG           ;SHOULDN'T HAVE TO SWAP IN THE SYSTEM
2864         CONO PI,UTCON-1 ;LEAVE CLKCHN OFF.
2865         SOS NPGSWO
2866         AOS SWIPRQ      ;TOTAL SWAP IN REQUESTS
2867 ;; MARK THE PHYSICAL MEMORY BLOCK AS BEING SWAPPED INTO BY THIS PAGE.
2868         MOVEI B,MUSWPG
2869         DPB B,[MUR,,MEMBLT(A)]
2870         MOVEI B,600000(A)
2871         HRRM B,(C)      ;MAKE CP OF MMP POINT TO MEMPNT
2872         MOVE TT,C
2873         SUB TT,MMPEAD
2874         DPB TT,[MMMPX,,MEMBLT(A)]       ;STORE MMP INDEX IN MEMBLT
2875         MOVEI TT,.BM MLO
2876         ANDCAM TT,MEMBLT(A)     ;SET END OF LIST IN THIS BLOCK
2877 ;; PUT THE TRANSFER ON THE SWAP IN LIST.
2878         CONO PI,UTCOFF-1
2879         HLRZ TT,SINLST(I)       ;GET PREV BLOCK
2880         SKIPE TT
2881          DPB A,[MLO,,MEMBLT(TT)]        ;CHAIN TO PREV BLOCK
2882         SKIPN TT
2883          MOVEM A,SINLST(I)      ;OR TO HEADER IF FIRST
2884         HRLM A,SINLST(I)        ;AND SET NEW LAST BLOCK
2885         AOS SILNG               ;AOS NUMBER OF PENDING SWAP IN RQS.
2886         PUSHJ P,QSTRT1          ;WAKE UP DISK INTERRUPT LEVEL.
2887         CONO PI,UTCON-1
2888 ;; UPDATE SWAP HISTORY TABLE.
2889         HRLZ TT,W
2890         IDIVI TT,LUBLK          ;TT 3.1-3.8 GETS USER NUMBER, BASHES I
2891 IFN SWPWSP,[
2892         MOVSI T,%SWLOD
2893         TDNE T,USWST(W)
2894          TLO TT,(SETZ)
2895 ];SWPWSP
2896         MOVE T,CFHUVP
2897         DPB T,[321000,,TT]
2898         HRR TT,TIME
2899         MOVEM TT,@PGIHTP
2900         AOS T,PGIHTP
2901         MOVE TT,UTRNTM(W)
2902         MOVEM TT,PGIHTL-1(T)
2903         MOVEI TT,PGIHTB
2904         CAIL T,PGIHTB+PGIHTL
2905          MOVEM TT,PGIHTP
2906         TLNN W,200000
2907          JUMPL W,POPJ1
2908         AOS USIPRQ(W)
2909         JRST POPJ1      ;HANG USER UNTIL PAGE IN
2910 \f
2911 ;IF SWAPPNG IN "INITIAL SWAP IN" PAGE, CHECK TO SEE WHETHER TUT IS AVAILABLE.
2912 ;WE CAN'T SWAP THE PAGE IN IF NOT.
2913 CFHPO5: LDB I,[$MMPUN,,(C)]     ;GET DSK #
2914         CAIL I,NQS
2915          BUG
2916         SKIPL QTUTO(I)
2917          JRST CFHPO7    ;DISK TUT AVAIL
2918         CONO PI,UTCON-1
2919         TLNN W,200000
2920          JUMPL W,CPOPJ  ;NO COUNTER AOS IF SWAPIN FOR DEVICE OR PAGE AHEAD.
2921         MOVE C,[SKIPGE QTUTO]   ;ALSO MUSTN'T SMASH C
2922         ADD C,I
2923         AOS NLPPGT
2924         POPJ P,
2925
2926 ;LATER ON, COME HERE TO SOS THE TUT, AFTER GETTING THE MEM, WHEN WE CAN NO LONGER BLOCK.
2927 CFHPO8: ANDCAM E,(C)    ;CLEAR INITIAL SWAPIN BIT
2928         MOVE D,B        ;GET TRK #
2929         PUSHJ P,TUTPNT
2930         CAIGE B,TUTMNY
2931          SOJL B,[JRST 4,.]
2932         DPB B,D
2933         HRRZS 1(C)      ;CLEAR ASSIGNED TRACK NUMBER SO NEW SPACE ASSIGNED ON SWAPOUT
2934         POPJ P,
2935
2936 ;HERE IF NO MEMORY TO SWAP PAGE INTO.
2937 CFHPO1: CONO PI,UTCON-1
2938         TLNN W,200000
2939          JUMPL W,CPOPJ
2940         SKIPGE MEMFRZ           ;IF BECAUSE MEMFRZ LOCKED, MAKE JOB WAIT FOR MEMFRZ.
2941          JRST CFHPO4
2942         MOVE C,[SKIPL MEMFRZ]
2943         AOS NLPPGM
2944         POPJ P,
2945
2946 CFHPO4: MOVE C,[PUSHJ P,CFHPO3]
2947         MOVN D,SOLNG
2948         SUB D,SWPOPR    ;- # PGS GOING OUT
2949         ADDI D,10.      ;MAKE SURE AT LEAST 10. GOING OUT
2950         JUMPLE D,.+2
2951          ADDM D,SWPOPR
2952         MOVEI D,1
2953         SKIPN FLSINS(W)
2954          MOVEM D,EPDL2(W)
2955         AOS NLPPG3
2956         POPJ P,
2957
2958 CFHPO3: PUSH P,A        ;FLSINS ROUTINE (NEEDED MEM)
2959         MOVE A,MEMFR
2960         SUB A,NCBCOM
2961         CAIL A,5(T)
2962          JRST POPAJ1    ;NEEDED MEM AVAILABLE
2963         ADD A,SOLNG
2964         ADD A,SWPOPR
2965         SUBI A,10.(T)
2966         JUMPGE A,POPAJ  ;WILL EVENTUALLY WIN
2967         MOVNS A
2968         ADDM A,SWPOPR   ;LOSING - SWAP SOME MORE STUFF OUT
2969         JRST POPAJ
2970
2971 IFE SWPWSP,[
2972 ;HERE IF TRYING TO SWAP IN A PAGE BUT SWAP BLOCKED
2973 CFBO1:  MOVE E,MEMFR    ;GUY SWAPPED BLOCKED
2974         SUB E,NCBCOM
2975         SUB E,AUSOPG
2976         SUB E,SILNG
2977         ADD E,SOLNG
2978         JUMPGE E,CFBO3  ;SEEMS TO BE ROOM SO LET IT COME IN
2979         TLNN W,200000
2980          JUMPL W,CPOPJ  ;HANG GUY UNTIL SWAP BLOCK GOES AWAY
2981         MOVE C,[SKIPGE USWSCD]
2982         ADDI C,(W)
2983         AOS NTSBUB
2984         AOS NLPPGB
2985         POPJ P,
2986
2987 CFBO3:  AOS NTSBUP
2988         JRST CFBO2
2989 ];SWPWSP
2990 \f
2991 OVHMTR WS       ;WORKING-SET COMPUTATIONS
2992
2993 IFN SWPWSP,[
2994 ;HERE WHEN A SWAPPED OUT OR SWAP BLOCKED JOB TRIES TO SWAP IN A PAGE.
2995 ;JOB IN W, C -> MMP, USWST(W) IN E.  RETURN TO CFSB1.
2996 ;WE DECIDE WHETHER ENOUGH CORE CAN BE GARNERED TO LET HIM IN, AND PUT
2997 ;HIM INTO THE LOADING STATE, OR ELSE PUT HIM INTO THE SWAP BLOCKED STATE.
2998
2999 CFSB:   PUSH P,C
3000         TLNN E,%SWSB            ;ALREADY SWAP BLOCKED?
3001          PUSHJ P,WSRCM          ;NO, RECOMPUTE WORKING SET
3002         POP P,C
3003         MOVE B,USWPRI(W)        ;FIND SUM OF WS'S OF SWAPPED IN GUY'S WITH BIGGER USWPRI
3004         PUSHJ P,WSAVL
3005         MOVE D,USVWRK(W)        ;COMPUTE AMT OF WS NOT ALREADY IN CORE
3006         SUB D,UWRKST(W)
3007 IFL TSYSM-356.,[
3008         CAML D,[TSYSM-100.,,]
3009          JRST .+3               ;WS > PHYSICAL MEM, ALLOW IN ANYWAY, FOO!
3010 ];TSYSM
3011         CAMGE A,D               ;WILL IT FIT IN AVAILABLE MEM?
3012          JRST CFSB2             ;NO, SWAP BLOCK
3013         PUSHJ P,CFELD           ;YES, ENTER 'LOADING' STATE
3014         JRST CFSB1              ;AND GO AHEAD AND BRING IN THE PAGE
3015
3016 CFSB2:  TLNN W,200000           ;IF PAGE-AHEAD, JUST RETURN.
3017          JUMPL W,CPOPJ
3018         MOVE T,TIME
3019         MOVSI A,%SWSB           ;ALREADY SWAP BLOCKED?
3020         TDNE A,USWST(W)
3021          JRST CFSB3
3022         IORM A,USWST(W)         ;NO, ENTER SWAP BLOCKED STATE
3023         AOS NUSWB
3024         MOVEM T,USWTIM(W)
3025 CFSB3:  MOVE U,W
3026         MOVSI T,3_16.           ;MAKE SWAP HISTORY TABLE ENTRY FOR SWP BLK
3027         PUSHJ P,SWPKHT
3028         MOVE T,TIME
3029         SUB T,USWTIM(W)         ;HOW LONG SWAP BLOCKED
3030         CAIGE T,20.*30.         ;IF LESS THAN 20 SECONDS,
3031          SKIPA T,[15.]          ; SLEEP FOR 1/2 SECOND,
3032           MOVEI T,5*30.         ; OTHERWISE SLEEP FOR 5 SECONDS
3033         ADD T,TIME
3034         SKIPN FLSINS(W)
3035          MOVEM T,EPDL2(W)
3036         MOVEI A,0               ;WILL THEN TAKE FAULT AGAIN AND
3037         MOVE C,[CAMLE T,TIME]   ;CHECK AVAILABLE MEMORY AGAIN
3038         AOS NLPPGB
3039         POPJ P,
3040
3041 ;ROUTINE TO FIND MEMORY AVAILABLE TO A JOB WHOSE USWPRI IS IN B
3042 ;RETURNS IN LH(A) SUITABLE FOR COMPARING TO UWRKST.  SMASHES T,TT,J
3043
3044 WSAVL:  MOVEI J,2*LUBLK         ;DON'T LOOK AT SYS NOR CORE JOB
3045         MOVSI T,%SWOUT+%SWLOD   ;IF THESE BITS CLEAR, JOB IS SWAPPED IN
3046         MOVE A,MEMFR            ;FREE CORE 
3047         SUB A,NCBCOM            ;FUDGE FOR THINGS IN PROCESS
3048         SUB A,SILNG             ;..
3049         ADD A,SOLNG             ;..
3050         ADD A,NLOOSP            ;LOOSE PAGES ARE EVICTABLE
3051         SUB A,SWPOPR            ;DON'T COUNT PAGES ALREADY COMMITTED TO EVICT
3052         HRLZI A,-4(A)           ;ALIGN AS UWRKST AND ALLOW 4 PAGES OF SLOP
3053         SKIPA TT,TIME           ;TO SEE IF PROTECTED AGAINST MEMORY PREEMPTION
3054 WSAVL1:  ADDI J,LUBLK
3055         CAML J,USRHI
3056          POPJ P,
3057         SKIPE UNAME(J)
3058          TDNE T,USWST(J)
3059           JRST WSAVL1           ;DOESN'T EXIST, OR NOT SWAPPED IN, OR LOADING
3060         CAMGE B,USWPRI(J)
3061          CAMGE TT,USWTIM(J)
3062           JRST WSAVL1           ;HIGHER PRIORITY OR PROTECTED
3063         ADD A,UWRKST(J)         ;THIS GUY'S WORKING SET IS PREEMPTABLE
3064         JRST WSAVL1     
3065 \f
3066 ;Routine to re-compute working set, also re sets up map
3067 ;to point to any pages which are swapped in but not mapped in.
3068 ;This is necessary in order to get the proper estimate of
3069 ;how much core is going to have to be swapped out to make
3070 ;this job fit.  Called when a job leaves the swapped-out state,
3071 ;to enter either Loading or Swap-blocked.
3072 ;Job is in W, smashes A,B,C,D,E,T,TT,H,I,U.
3073 ;Call with CIRPSW locked and clk in progress.
3074 WSRCM:  SETZM UWRKST(W)
3075         MOVEI E,UPGMP(W)        ;SET UP SCAN OF USER'S MAP
3076         HRLI E,442200
3077         MOVEI C,UPGCP(W)        ;AND OF CIRCULAR POINTERS
3078         HRLI C,442200
3079         LDB D,[121100,,HUSRAD(W)]       ;# OF USER PAGES
3080 WSRCM1: ILDB A,E                ;GET PAGE MAP ENTRY
3081         ILDB B,C                ;AND CIRCULAR POINTER
3082         JUMPE A,WSRCM2          ;JUMP IF PAGE DOESN'T EXIST
3083         CAIN B,-1
3084          JRST WSRCM2            ;ABS PAGE, DON'T COUNT
3085         TRNN A,600000           ;ALREADY SWAPPED IN?
3086          JRST WSRCM3            ;NO, GO PONDER
3087         ANDI A,PMRCM            ;GET PAGE MAPPED TO
3088         HRRZ B,MMSWP(A)         ;GET # SHARERS
3089         MOVSI A,1               ;COMPUTE WS ADJUSTMENT
3090         IDIV A,B
3091         ADDM A,UWRKST(W)
3092 WSRCM2: SOJG D,WSRCM1           ;LOOP
3093         POPJ P,
3094
3095 WSRCM3: PUSH P,C                ;PAGE NOT MAPPED, SEE IF IT'S IN
3096         PUSHJ P,UCPRL
3097             100000,,WSRCM4      ;RETURN WITH 4 PUSHES IF MEMORY IN LOOP
3098         POP P,C                 ;NO MEMORY, LEAVE ALONE
3099         SOJG D,WSRCM1
3100         POPJ P,
3101
3102 WSRCM4: SUB P,[4,,4]            ;FOUND MEMORY, IN T
3103         TRNE A,2
3104          MOVEI A,2              ;USE READ/WRITE/FIRST RATHER THAN READ/WRITE
3105         LSH A,20
3106         IORI A,PMCSHM(T)        ;SET UP MAP
3107         DPB A,E
3108         AOS C,MMSWP(T)          ;ONE MORE USER POINTING TO PAGE
3109         MOVSI A,1
3110         MOVEI B,-1(C)
3111         IDIVM A,B               ;ADJUST WS AS IF WAS ALREADY POINTING TO PAGE
3112         ADDM B,UWRKST(W)        ;ADDM DOES NOTHING IF THERE WAS DIVIDE BY ZERO
3113         IMULI C,-1(C)           ;COMPUTE WS DECREASE DUE TO ADDITIONAL SHARING
3114         MOVNI C,(C)
3115         IDIV A,C                ;IF DIVIDE BY ZERO, A GETS RIGHT THING!
3116         MOVE C,(P)              ;ADJUST ALL SHARER'S WS'S
3117         PUSHJ P,UCPRL
3118             SETZ WSRCM5
3119         POP P,C
3120         SOJG D,WSRCM1
3121         POPJ P,
3122
3123 WSRCM5: ADDM A,UWRKST(U)
3124         POPJ P,
3125 \f
3126 ;LEAVE LOADING STATE IF IN IT.  JOB IN U, SMASH C,TT,T,I
3127 LVLOAD: MOVE C,USWST(U)
3128         TLZN C,%SWLOD
3129          POPJ P,                ;NOT IN LOADING STATE
3130 LVLOA0: MOVEM C,USWST(U)        ;TURN OFF LOADING STATE
3131         MOVE T,TIME
3132         SUB T,USWTIM(U)         ;TIME IT TOOK TO LOAD
3133         IMUL T,LODFCT           ;COMPUTE PROTECT TIME
3134         HLRZS T
3135         ADD T,TIME
3136         MOVEM T,USWTIM(U)
3137         MOVSI T,1_16.           ;MAKE SWAP HISTORY TABLE ENTRY
3138         JRST SWPKHT
3139
3140 ;PUT JOB IN W INTO THE 'LOADING' STATE.  CALL WITH D CONTAINING USVWRK-UWRKST.
3141 ;WSRCM MUST HAVE BEEN CALLED ALREADY ON THIS JOB.  SMASHES A,D,T,TT,I
3142
3143 CFELD:  MOVE T,USWST(W)
3144         TLNE T,%SWSB
3145          SOS NUSWB              ;CEASES TO BE SWAP-BLOCKED
3146         TLZ T,%SWOUT+%SWSB+%SWDSO+%SWBEM
3147         TLO T,%SWLOD
3148         MOVEM T,USWST(W)
3149         MOVE T,TIME             ;SAVE TIME STARTED TO LOAD
3150         MOVEM T,USWTIM(W)
3151         MOVE U,W
3152         MOVSI T,0               ;MAKE SWAP HISTORY TABLE ENTRY
3153         PUSHJ P,SWPKHT
3154         JUMPLE D,CPOPJ
3155         HLRZ D,D                ;NUMBER OF PAGES GOING TO NEED, PROBABLY
3156         MOVE A,MEMFR            ;FREE CORE 
3157         SUB A,NCBCOM            ;FUDGE FOR THINGS IN PROCESS
3158         SUB A,SILNG             ;..
3159         ADD A,SOLNG
3160         SUB D,A                 ;NUMBER OF PAGES GOING TO HAVE TO SWAP OUT
3161         SKIPLE D
3162          ADDM D,SWPOPR          ;START THEM GOING OUT NOW
3163         POPJ P,
3164 ];SWPWSP
3165 \f
3166 OVHMTR FLT      ;MISC FAULTS
3167
3168 CFH4:   TLNE W,100000           ;PAGE-AHEAD OF NON-EX PAGE: DO NOTHING.
3169          POPJ P,
3170         JUMPL W,SWIILM          ;IF FROM DMA DEVICE, GIVE ERROR
3171 ;HERE FOR FAULTS WHICH ABORT THE INSTRUCTION.
3172 PFA7:   MOVE T,OPTION(U)        ;IF USER WANTS IT,
3173         TLNN T,%OPOPC           ;GIVE HIM THE OPC RATHER THAN
3174          AOSA T,CLKBRK          ;THE INCREMENTD PC.
3175 PFA7A:    MOVE T,CLKBRK         ;HERE FOR KL10 MAR BREAK AND KS10 NXI
3176                                 ;ERROR, ALWAYS GIVE ORIGINAL PC, INST
3177                                 ;ABORTED
3178         TLNE T,%PCUSR
3179          JRST CLKB1J
3180         MOVEI C,IOADCR          ;FROM EXEC MODE SO RESET PC TO IOADCR
3181         EXCH C,CLKBRK
3182         HRRM C,LEXFDR(U)        ;AND SAVE FAULT EXEC ADR FOR DEBUGGING
3183         CLEARM DLSRCH           ;IN CASE IT WAS SET
3184         CLEARM UMAPS(U)         ;RESTORE NORMAL MAP IN CASE RANDOM ONE WAS
3185                                 ;IN USE
3186
3187 CLKB1J: HRLM D,LEXFDR(U)        ;SAVE PF BITS FOR DEBUGGING PURPOSES
3188
3189 IFN KS10P,[     TRNE D,%PFNXI   ;Non-existent IO register in KS10 Unibus.
3190                  TLO A,(%PINXI)
3191 ] ;KS10P
3192
3193 IFN KS10P,      TRNN D,%PFNXI\%PF2.9\%PF2.8
3194 IFN KA10P,      TLZE D,210      ;NO ACCESS OR DBL
3195 IFN KL10P,      CAIN D,%PFPNA
3196                  TRO A,%PIMPV   ;ILM
3197
3198 IFE KS10P,[
3199 IFN KA10P,      TLZE D,20       ;PURE
3200 IFN KL10P,      CAIN D,%PFPRO
3201                  TLO A,(%PIFET)
3202 ] ;IFE KS10P
3203
3204 IFN KS10P,      CAIN D,%PFWRT\%PF2.8
3205 IFN KA10P,      TLZE D,100      ;W IN RD ONLY
3206 IFN KL10P,      CAIN D,%PFILW
3207                  TLO A,(%PIWRO)
3208
3209                 TDNE A,[%PIMPV\%PIWRO\%PINXI]
3210                  PUSHJ P,MPVMAS         ;SAVE FAULT PAGE # FOR DEBUGGING
3211
3212 ;;; NO ABORT-TYPE FAULTS, CHECK OTHERS:
3213
3214 IFE KS10P,[
3215 IFN KL10P,      CAIN D,%PFMAR
3216 IFN KA10P,      TLZE D,2
3217                  PUSHJ P,PCMARB
3218 ] ;IFE KS10P
3219
3220 IFN KA10P,[     TLZE D,2000
3221                  PUSHJ P,CPROC1 ;ONE PROCEED
3222                 ANDCA D,UPQUAN(U)       ;GET BITS FLUSHED BY TLZE'S
3223 ] ;KA10P
3224
3225 CFH6:
3226 IFN KA10P,[
3227         ANDCMI D,-1     ;DON'T CLOBBER USER'S RUNTIME.
3228         TLZ D,4         ;DON'T CLOBBER EXEC PAGING FLAG.
3229         TLO D,1         ;IGNORE QUANTUM-TIMEOUT INT.
3230         ANDCAM D,UPQUAN(U)
3231 ] ;KA10P
3232 CLKB1K: LPMR UPGML(U)
3233 CLKB1G: IFN KA10P, CONO 470000+APRCHN   ;RESET
3234 CLB1X:  MOVE T,CLKBRK   ;PUT USER'S PC WHERE IT BELONGS
3235         MOVEM T,UPC(U)
3236         MOVE B,[BADBTS]
3237         IOR B,MSKST(U)  ;GET OR OF ENABLED AND BAD BITS
3238         AND B,A         ;GET AND WITH BITS ACTUALLY ON
3239         JUMPE B,CLB1XA  ;NOT BAD OR ENABLED, FORGET ABOUT IT
3240         IORM B,PIRQC(U) ;GIVE INTERRUPT
3241         CAIN T,IOADCR   ;READY TO BE INTERRUPTED?
3242          JRST CLKB5     ;NOT QUITE, RUN MOMENTARILY AND WILL UFLS
3243 IFN SCHBLN,SETZM SCHMNY ;DO FULL SCHEDULE TO DELIVER THE INTERRUPT
3244         JRST SCHED2
3245
3246 CLB1XA: MOVSI T,%SWINT  .SEE INTPFL     ;IF PAGE FAULT DUE TO USER TRYING TO
3247         TDNN T,USWST(U)                 ;INTERRUPT, BETTER SCHED SO HE GETS THE INT.
3248          SKIPE FLSINS(U)        ;ELSE PROCEED THE USER IF HE HAS GOT WHAT HE WANTED.
3249           JRST SCHED2           ;OR IF HE'S WAITING, GO SCHEDULE.
3250         JRST CLKB5
3251
3252 IFN KA10P,[     ;NULL JOB LOST
3253 CNLJL:  CONSZ 230220    ;SKIP ON JUST "ADDR BREAK" (QUANTUM OVERFLOW)
3254          BUG PAUSE,[KA: APR ERROR IN NULL JOB]
3255         CONO 470000+APRCHN
3256         JRST SCHED
3257
3258 CFHFPF: BUG PAUSE,[PAGE FAULT IN SYSTEM, PC=],OCT,CLKBRK,[PAGE=],OCT,E
3259         MOVSI D,1770    ;FALSE PAGE FAULT
3260         MOVEI A,0
3261         JRST CFH6
3262 ] ;KA10P
3263 \f
3264 EBLK
3265 RINT:   0
3266 BBLK
3267         CONI RINTAP     ;SAVE STATUS IN CASE SOMEONE DUMPS IT
3268         CONI PI,RINTPI
3269         BUG AWFUL,[RANDOM INTERRUPT, APR ],OCT,RINTAP,[PI ],OCT,RINTPI
3270         JRST 12,@RINT           ;YOU CAN TRY PROCEEDING
3271
3272 EBLK
3273 RINTAP: 0       ;APR STATUS AT RINT
3274 RINTPI: 0       ;PI STATUS AT RINT
3275
3276 IFN KS10P,[     ; On KS, all random interrupts are created equal.
3277 BBLK
3278 RINT1==:RINT
3279 ] ;IFN KS10P
3280
3281 IFE KS10P,[
3282 R1NTAC: BLOCK 20
3283 RINT1:  0
3284 BBLK
3285         MOVEM 17,R1NTAC+17
3286         MOVEI 17,R1NTAC
3287         BLT 17,R1NTAC+16
3288         MOVEI J,1
3289         JSP E,SPUR
3290         MOVSI 17,R1NTAC
3291         BLT 17,17
3292         JRST 12,@RINT1
3293 ] ;IFE KS10P
3294 \f
3295 IFE KS10P,[     ;KS10 HAS NO MAR
3296
3297 PCMARB:
3298 IFN KA10P,[
3299         HLLZ B,UPOPC(U) ;FLAGS
3300         LSH B,5
3301         HRR B,UPOPC(U)  ;PC
3302         MOVE T,B
3303         XOR T,CLKBRK    ;DID PC CHANGE FROM START OF INST TO PLACE TRAPPED?
3304         TDNE T,[#<%PCFPD,,>]
3305          TLO B,(@)      ;YES, INSTRUCTION COMPLETED, FLAG FOR USER
3306 ] ;KA10P                ;LOSES FOR JSR .-1 WITH MAR AT .-1, BUT OTHERWISE OK
3307 IFN KL10P,[
3308         MOVE B,CLKBRK   ;PC OF FAULTING INST IF USER, OR IOADCR IF EXEC
3309 ;       MOVEM B,UPOPC(U)        ;SOLELY FOR .OPC USER VAR
3310 ;NOTE- ON KL10 THE INSTRUCTION IS NEVER COMPLETED, DON'T SET 3.5
3311 ] ;KL10P
3312         TLNE B,%PCUSR
3313          JRST PCMAR1            ;USR MODE, USE PC FROM PAGER
3314         MOVE B,UUOH             ;EXEC MODE, USE USER PC (UUO)
3315         HRRI B,-1(B)
3316 IFN KL10P,[     ;ON KL10 AVOID DOING AOS UUOH AT IOADCR
3317         MOVEM U,AC0S+U(U)
3318         MOVEI T,UUOER2
3319         MOVEM T,CLKBRK
3320 ];KL10P
3321 PCMAR1: MOVEM B,UMARPC(U)
3322         TRO A,%PIMAR
3323         MOVEI B,0
3324 IFN KA10P,      DPB B,[220300,,UPMAR(U)]        ;DISABLE MAR
3325 IFN KL10P,      DPB B,[270400,,UPMAR(U)]        ;DISABLE MAR
3326         POPJ P,
3327
3328 ] ;IFE KS10P
3329
3330 IFN KA10P,[
3331 CPROC1: MOVE T,CLKBRK
3332         TLNN T,%PCUSR   ;SKIP IF FROM USER MODE
3333          JRST CPRUUO
3334         TRO A,%PI1PR    ;GIVE USER INTERRUPT
3335         POPJ P,
3336
3337 CPRUUO: MOVE T,[JRST ONEPROC]   ;ONE PROCEED INT. FROM EXEC. MODE
3338         MOVEM T,UEXIT   ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
3339         POPJ P,
3340
3341 AROV:   TLZE T,400000
3342          TLNN T,%PCUSR
3343           JRST AROV2    ;NOT REALLY SET OR SET BY SYS
3344         MOVEM T,CLKBRK
3345         SKIPE PICLR(U)  ;SKIP IF INTERRUPTS TO USER NOT ENABLED
3346          TRO A,%PIARO   ;GIVE USER INTERRUPT
3347         POPJ P,
3348
3349 AROV2:  MOVEM T,CLKBRK
3350         POPJ P,
3351
3352 ARFOV:  TLZE T,40000
3353         TLNN T,%PCUSR
3354         JRST AROV2
3355         MOVEM T,CLKBRK
3356         SKIPE PICLR(U)
3357         TLO A,(%PIFOV)
3358         POPJ P,
3359 ] ;KA10P
3360 \f
3361 ;;; HANDLE PARITY ERRORS.
3362
3363 CLKB1E: SETZM PARDIE    ;AT FIRST ASSUME THE PAR ERR ISN'T FATAL.
3364         CONO PI,PIOFF   ;TURN OFF WORLD
3365 IFN KA10P, CONO PI,240000       ;RESET
3366 IFN KL10P,[             ;CLEAR THE CACHE
3367         SWPUA
3368         CONSZ 200000
3369          JRST .-1
3370 ] ;KL10P
3371 IFN KS10P,[
3372         CLRCSH                  ;Clear the cache
3373 ] ;KS10P
3374         MOVSI B,SCLPAR
3375         TDNE B,SUPCOR   ;IF PREV ERROR NOT PRINTED, PRINT IT NOW AND PAUSE
3376          BUG PAUSE,[TOO MANY PARITY ERRORS.  PREV STATUS=],DEC,PARCNT,OCT,PARAAN,OCT,PARAOR,OCT,PARAND,OCT,PARIOR
3377         IORM B,SUPCOR   ;TELL SYS JOB TO PRINT OUR DATA WHEN WE FINISH.
3378         AOS PARERR      ;COUNT # OF PAR ERRS SINCE SYSTEM STARTED.
3379         SETOM PARAND    ;INIT LOGAND AND LOGOR OF ALL BAD DATA WORDS
3380         SETZM PARIOR
3381         SETOM PARAAN    ;AND SIMILAR FOR ADDRESSES OF PAR ERRS.
3382         SETZM PARAOR
3383         MOVE T,CLKBRK
3384         MOVEM T,PARPC
3385         MOVE T,USER
3386         MOVEM T,PARUSR  ;REMEMBER WHICH JOB GOT THE PAR ERR.
3387         JUMPL T,PARSCJ  ;PAR ERR IN NULL JOB? OR WHAT?
3388 IFN KL10P,[
3389         SKIPE PARRSN            ;PAR ERR IN WORD NOT REFERENCED
3390          JRST PARSCJ            ; SHOULDN'T SCREW THE RUNNING JOB
3391 ] ;KL10P
3392         CAIG T,LUBLK
3393          SETOM PARDIE           ;PAR ERR IN A SUPERVISOR-MODE JOB IS HOPELESS.
3394         MOVSI TT,(%PIPAR)
3395         IORM TT,PIRQC(T)        ;GIVE RUNNING USER A PARITY ERROR (CLASS 1 INT)
3396 PARSCJ: SPM PARPG
3397 IFN KL10P,[
3398         PUSH P,PFNPC    ;MAKE SURE THE PAR ERRS WE DETECT WHILE SCANNING DON'T
3399         MOVEI D,PARFX4  ;CALL US RECURSIVELY (ON KA, THAT'S DONE BY HAVING
3400         MOVEM D,PFNPC   ;CLKCHN OFF) 
3401 ] ;KL10P
3402 IFN KS10P,[
3403         PUSH P,EPTP7N           ;Same hack for the KS except page fails trap
3404         MOVEI D,PARFX4          ;as a function of current PI level.
3405         MOVEM D,EPTP7N
3406 ] ;KS10P
3407         MOVEI D,0       ;POINTER TO ERROR BUFFER
3408         MOVSI TT,-TSYSM
3409         PUSHJ P,PARSCN  ;SCAN MAIN MEM BLOCKS
3410 IFN PDP6P,[
3411         MOVE TT,[-LPDP6M,,PDP6BM_-10.]  ;SCAN PDP6 MEM FOR PARITY ERRORS
3412         SKIPGE PDP6UP                   ;BUT NOT IF PDP6 IS DOWN.
3413          PUSHJ P,PARSCN
3414 ]
3415 IFN KL10P,[
3416         POP P,PFNPC
3417         CONO 024400+APRCHN      ;CLEAR PAR ERR FLAGS.
3418 ] ;KL10P
3419 IFN KS10P,[
3420         POP P,EPTP7N
3421         CONO 020200+APRCHN      ;CLEAR FLAG
3422         MOVSI A,%KEHLD+%KEREF   ;CLEAR STATUS AND ERROR ADDR
3423         IOWR A,[KSECCS]
3424 ] ;KS10P
3425         MOVEI A,0
3426         DPB A,[.PAREP+EXEUMP]
3427         LPMR PARPG      ;SET UP MAP WITH PARPG SET TO MPV.
3428         MOVEM D,PARCNT  ;SAVE AWAY COUNT OF ERRORS IN BUFFER
3429         SKIPE PARDIE
3430          BUG HALT,[PARITY ERROR IN SYSTEM MEMORY.  CNT=],DEC,PARCNT,[ADR AND ],OCT,PARAAN,CR,0,[  ADR IOR ],OCT,PARAOR,[DATA AND ],OCT,PARAND,[DATA IOR ],OCT,PARIOR
3431                         ;FATAL ERROR (DONT ALLOW CONTINUE SINCE ERR IS
3432                         ;KNOWN TO BE A LOSER)
3433         CONO PI,PION    ;TURN WORLD BACK ON
3434         JRST SCHED
3435 \f
3436 PARSCN:
3437 PARFX3: HRRZ T,TT       ;SCAN AOBJN POINTER IN TT
3438         CAIL T,TSYSM
3439         JRST PARFX7
3440         LDB T,[MUR,,MEMBLT(TT)]
3441         CAIN T,MUHOLE
3442         JRST PARFX8     ;HOLE THERE
3443 PARFX7: MOVEI T,600000(TT)      ;NOTE THAT WE ARE NOT ENABLING THE CACHE.
3444         DPB T,[.PAREP+EXEUMP]   ;ON KL10 THIS WILL CAUSE A 1-WORD READ.
3445         LPMR PARPG      ;SET UP TO CHECK PAGE # IN TT
3446         MOVEI B,0       ;ADDRESS WITHIN PAGE
3447 PARFX1:
3448 IFN KA10P, CONO PI,200000       ;CLEAR PAR ERR
3449 PARFX5: MOVE C,400000+PAREP*2000(B)     ;REFERENCE EVERY MEMORY LOCATION
3450 IFN KA10P,[
3451         ;;ON KA, MUST CHECK EXPLICITLY.
3452         ;;ON KL AND KS, PAR ERR WILL TRAP RIGHT TO PARFX4.
3453         CONSZ PI,200000 ;PARITY ERR? 
3454          JRST PARFX4    ;YES. 
3455 ] ;KA10P
3456         CAIGE B,1777    ;SKIP ON FINISHED WITH BLOCK
3457          AOJA B,PARFX5
3458 PARFX8: AOBJN TT,PARFX3 ;CHECK NEXT PAGE
3459         POPJ P,         ;DONE
3460 \f
3461 PARFX4:         ;HERE WHEN THE SCAN FINDS A WORD WITH BAD PARITY
3462 IFN KL10P, HRRZ T,PFOPC
3463 IFN KS10P, HRRZ T,EPTP7O
3464 IFE KA10P,[
3465         ;;DID THIS TRAP COME FROM SCAN LOOP WHERE WE EXPECT THEM?
3466         CAIE T,PARFX5
3467          JRST 4,.
3468         AC7CTX
3469         UMOVE C,0       ;GET CONTENTS OF LOCATION WITH BAD PARITY
3470         SYSCTX
3471 ] ;IFE KA10P
3472         SETO T,         ;MAKE SURE T ISN'T ACCIDENTALLY 0 AT PARFX6.
3473         HRRZ E,TT
3474         LSH E,10.
3475         IOR E,B ;MAKE MEM ADR
3476         CAIGE E,20      ;PAR ERR IN SHADOW ACS ISN'T SERIOUS.
3477          JRST PARFX6
3478         ANDM E,PARAAN   ;UPDATE ANDS AND ORS OF DATA AND ADRS
3479         IORM E,PARAOR
3480         ANDM C,PARAND
3481         IORM C,PARIOR
3482         MOVE A,USRHI
3483         CAIGE E,USRSTG(A)
3484          SETOM PARDIE   ;PARITY ERROR IN EXEC CORE
3485         HRRZ T,TT
3486         CAIL T,TSYSM
3487          JRST PARFX6
3488         LDB T,[MUR,,MEMBLT(TT)]
3489         CAIE T,MUFR
3490          CAIN T,MUINP
3491           JRST PARFX6
3492         CAIE T,MUDISB
3493          CAIN T,MUFRT
3494           JRST PARFX6
3495         CAIN T,MUDDT
3496          JRST PARFX6
3497         SOJE T,PARFX6   ;USER
3498         SETOM PARDIE    ;ERR IN CRITICAL MEMORY (DISK DIR, ETC)
3499 PARFX6: MOVEM C,400000+PAREP*2000(B)    ;FIX UP MEMORY AS BEST WE CAN
3500         MOVEM C,PARCON(D)       ;SAVE LOSING CONTENTS
3501         MOVEM E,PARADR(D)       ;SAVE LOSING ADDRESS
3502         CAIL D,MXPARS-1 ;OVERFLOWING BUFFER?
3503          SOS D          ;JUST DON'T CLOBBER STUFF. AT LEAST PARAND, ETC. WILL BE VALID.
3504         JUMPN T,PARFX9
3505         PUSH P,D        ;PAR. ERR IN USER MEMORY,
3506         HRRZ D,TT
3507         CAIL D,TSYSM
3508          JRST PARFXA
3509         PUSHJ P,UCPRL4  ;HAS ANY JOB WRITTEN IN THIS PAGE?
3510          400000,,PARFU1
3511         JUMPL D,PARFXB  ;SOMEONE HAS; JUST GIVE EVERYONE AN INTERRUPT.
3512         PUSHJ P,UCPRL4  ;DOES MMP SAY PAGE WAS WRITTEN? IF SO, SET SIGN(D);
3513          200000,,PARFU2 ;OTHERWISE, SET MMPBAD, CAUSING PAGE TO BE RELOADED FROM DISK.
3514         JUMPGE D,PARFXA
3515 PARFXB: PUSHJ P,UCPRL4  ;PAGE HAS BEEN WRITTEN SINCE LAST ON DISK, SO WE CAN'T ESCAPE
3516          400000,,PARFU3 ;GIVING EVERY JOB AN INTERRUPT.
3517 PARFXA: POP P,D
3518 PARFX9: AOS B                   ;INCREMENT B HERE SO YOU DON'T HACK THE SAME
3519                                 ; WORD AGAIN.  IF THAT WORD WAS SOLIDLY BAD,
3520                                 ; THIS CODE WOULD LOOP
3521         CAIG B,1777             ;MIGHT BE DONE WITH PAGE
3522          AOJA D,PARFX1
3523         AOJA D,PARFX8
3524
3525 PARFU1: CAIG U,LUBLK
3526          SETOM PARDIE   ;SYS JOB OR CORE JOB HAS PAGE
3527         PUSH P,Q
3528         MOVE A,I        ;FIND PAGE-MAP HALFWORD FOR THIS PAGE
3529         PUSHJ P,UPLC
3530         POP P,Q
3531         LDB A,T
3532         LSH A,-20
3533         CAIE A,1        ;MAP SET UP TO A PAGE, AND IN READ-ONLY MODE?
3534          JRST PARFU5
3535         DPB A,T         ;YES, UNMAP IT SO THAT NEXT ACCESS WILL TRAP AND GO TO CFHPB
3536         SOS MMSWP(D)    ; IN CASE WE WILL SET MMPBAD.
3537                 ;NOTE, THIS MAY CRASH THE SYSTEM IF THE JOB WAS RUNNING IN A UUO,
3538                 ;HAD CHECKED ACCESS TO THE PAGE, AND WAS ASSUMING IT COULD ACCESS
3539                 ;IT AGAIN SAFELY.  USUALLY THIS ONLY HAPPENS WHEN WRITING, HOWEVER.
3540 IFN SWPWSP,             ;DON'T BOTHER ADJUSTING WORKING SET.  WILL BE FIXED ON NEXT SWAPIN.
3541 PARFU5: CAIL A,3
3542 PARFU4:  TLO D,400000   ;IF THIS JOB HAS WRITTEN THE PAGE, SET SIGN (D)
3543         POPJ P,         ;TO SIGNAL THAT SETTING MMPBAD IS NO USE.
3544
3545 PARFU2: MOVE T,(C)      ;C HAS ADDR OF MMP ENTRY; HAS PAGE BEEN WRITTEN BY A JOB
3546         TLNN T,MMPWRT   ;THAT NO LONGER HAS IT IN MAP?
3547          TLNN T,MMPWOD  ;OR HAS IT NEVER BEEN ON DISK?
3548           JRST PARFU4   ;IF SO, AVOID SETTING MMPBAD, AND INTERRUPT EVERYONE.
3549         HLRZ T,1(C)
3550         JUMPE T,PARFU4  ;DITTO IF THERE IS NO DISK SPACE ASSIGNED.
3551         MOVSI T,MMPBAD
3552         IORM T,(C)
3553         POPJ P,
3554
3555 PARFU3: MOVSI T,(%PIPAR)
3556         IORM T,PIRQC(U)
3557         POPJ P,
3558 \f
3559 MEMHNG:
3560 IFN PDP6P,[
3561         LDB B,[221100,,UPJPC(U)]        ;FAULT ADDR
3562         TRZN B,400              ;SKIP IF REFERENCE WAS VIA USER MAP
3563          JRST MEMHN1
3564         MOVEI C,UPGMP(U)
3565         ROT B,-1
3566         ADDI C,(B)
3567         HRLI C,PMLCAD           ;POINTER TO CORE ADR FIELD OF LH PAGE IN MAP WD
3568         SKIPGE B
3569          HRLI C,PMRCAD          ;RH MAP WD
3570         LDB C,B                 ;C GETS PAGE #
3571         CAIGE C,<PDP6BM_-10.>+LPDP6M
3572         CAIGE C,PDP6BM_-10.
3573          JRST MEMHN1
3574         MOVE B,CLKBRK
3575         TLNE B,%PCUSR
3576          JRST MEMHN3            ;USER MODE PDP6 NXM
3577         MOVEI B,IOCER3          ;PDP6 MEM
3578         HRRM B,CLKBRK
3579         JRST MEMHN2
3580 ]
3581
3582 MEMHN1:                 ;NXM
3583         ; JRST 4,.+1    ;COMMENTED OUT SINCE NXM STOP SHOULD ALWAYS BE SET.
3584 MEMHN2:
3585 IFN KA10P,CONO 10000+APRCHN     ;CLEAR NON EX MEM AFTER HALT TO RESET MEMORY
3586 IFN KL10P,CONO 22000+APRCHN
3587 IFN KS10P,[
3588         CONO 20400+APRCHN       ;Clear APR flag
3589         MOVSI B,%KEHLD+%KEREF   ;Clear saved error address
3590         IOWR B,[KSECCS]
3591 ] ;KS10P
3592         MOVSI B,SCLNXM
3593         TDNE B,SUPCOR           ;Haven't printed previous error?
3594          BUG PAUSE,[TOO MANY NXM ERRORS.]
3595         IORM B,SUPCOR
3596         MOVE T,CLKBRK
3597         MOVEM T,NXMPC
3598         MOVE T,USER
3599         MOVEM T,NXMUSR
3600         AOS NXMERR
3601         POPJ P,
3602
3603 IFN PDP6P,[
3604 MEMHN3: MOVSI B,%PIMPV  ;PDP6 NXM GIVE MPV INTERRUPT
3605         IORM B,PIRQC(U)
3606         JRST MEMHN2
3607 ]
3608 \fSUBTTL SLOW CLOCK SERVICE ROUTINE
3609
3610 OVHMTR SLW      ;SLOW CLOCK
3611
3612 SSLCK:  SKIPGE SHUTDN   ;SYSTEM "DEAD" =>
3613          PUSHJ P,COFFIN ;GO TO DDT AFTER RIGOR MORTIS SETS IN.
3614         SETCMB A,SCKPHS ;CHECK SYSTEM CHECKSUMS EVERY OTHER SLOW CLOCK TICK
3615         MOVE T,SUPCOP   ;WHICH IS ONCE PER SECOND.
3616         SKIPE A
3617          IORM T,SUPCOR
3618 IFN KS10P,[
3619         CONSO 100               ; Check for memory ECC corrected errors
3620          JRST SSLCK0
3621         IORD A,[KSECCS]         ; A: status and error addr
3622         MOVEM A,ECCERA          ; Remember most recent one
3623         AOS ECCERR              ; Also count 'em
3624         CONO 20100+APRCHN       ; Clear memory ECC APR flag 
3625         MOVSI T,%KEHLD+%KEREF   ; Clear status and error addr
3626         IOWR T,[KSECCS]
3627         MOVE T,A
3628         AND A,ECCAND            ; A: AND of previous errors
3629         IOR T,ECCIOR            ; T: IOR of previous errors
3630         CAMN A,ECCAND           ; If either changes, this is news.
3631          CAME T,ECCIOR
3632           BUG INFO,[MEMORY: ECC CORRECTED ERROR],OCT,ECCERA
3633         MOVEM A,ECCAND
3634         MOVEM T,ECCIOR
3635 SSLCK0: ] ;IFN KS10P
3636 IFN NETP,PUSHJ P,NETCLK ; Run 1/2 sec clock routines for various net stuff
3637 IFN NETYS, SETOM DTECHK         ;TELL 11 WE'RE ALIVE
3638 IFN DPKPP,[
3639         CONSO DPK,7
3640          CONO DPK,TTYCHN        ;CROCK - IF DPK LOSES ITS PIA, GIVE IT BACK.
3641 ]
3642         MOVE A,UTTBF
3643         CAIGE A,30
3644          JRST SSLCK2
3645         SETOM UTBFLF    ;SIGNAL CORE JOB TO FLUSH UTAPE BUFFERS
3646         AOS NCORRQ
3647 SSLCK2: SKIPE UTTYCT    ;SKIP IF NO NEW USERS
3648          SKIPL TREESW   ;SKIP UNLESS SOMEBODY'S MUNGING THE TREE STRUCTURE.
3649           CAIA
3650            PUSHJ P,USTART ;NEW USER TO START
3651 IFN 340P,[
3652         SKIPL T,DWDS
3653          MOVEI T,0
3654         ADDI T,MDISWD
3655         MOVEM T,DWDS    ;RESET DISPLAY RATE COUNTER
3656 ]
3657         CONO PI,UTCOFF  ;UTC OFF WHILE HACKING UTAPE, MTAPE, DISK, ETC.
3658 IFN RH10P+RH11P,[
3659         SKIPLE USFHLT
3660          SOS USFHLT
3661 ];RH10P+RH11P
3662 IFN NUNITS,[
3663 IFE NEWDTP,[
3664         MOVE T,TIME
3665         AOSN UIDLE      ;SKIP IF DEC TAPE NOT IDLE
3666          JRST [MOVEM T,LUTOTM ? JRST SSLCK1]    ;DEC TAPE IDLE
3667         SUB T,LUTOTM    ;SUBTRACT LAST UTC OPERATION TIME
3668         CONSO UTC,4000
3669          CAIGE T,MXOPT*SCLKI    ;SKIP IF DEC TAPE HUNG TOO LONG ON ONE OPERATION
3670           JRST SSLCK3   ;OK
3671         SETOM UTHERR    ;SET UTC HUNG ERR FLAG
3672 SSLCK1: CONO UTC,CUINT  ;CAUSE DEC TAPE INTERRUPT ROUTINE TO RUN
3673 SSLCK3:
3674 ]
3675 IFN NEWDTP,[
3676         MOVE T,TIME
3677         AOSN UIDLE
3678          JRST [MOVEM T,LUTOTM ? JRST SSLCK1]
3679         SUB T,LUTOTM
3680         CAIGE T,MXOPT*SCLKI
3681          JRST SSLCK3
3682         SETOM UTHERR
3683 SSLCK1: SETOM CUINT
3684         CONO PI,UTCRQ
3685 SSLCK3:
3686 ]]      ;END IFN NUNITS
3687         SKIPL QSDU              ;IF DISK TRANSFER IN PROGRESS
3688          JRST [ MOVE T,LQTM     ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3689                 ADDI T,5*30.
3690                 CAMGE T,TIME
3691                  PUSHJ P,QHUNG  ;YES, UNHANG THE DISK
3692                 JRST .+1 ]
3693 IFN T300P,[
3694         SKIPL QSDU1             ;IF TRANSFER IN PROGRESS ON OTHER CONTROLLER
3695          JRST [ MOVE T,LQTM1    ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3696                 ADDI T,5*30.
3697                 CAMGE T,TIME
3698                  PUSHJ P,QHUNG1 ;YES, UNHANG THE DISK
3699                 JRST .+1 ]
3700 ];T300P
3701 IFN DC10P, PUSHJ P,QRCTMO       ;RECALIBRATE TIMEOUT
3702         CONO PI,UTCON
3703         PUSHJ P,QSTRTR          ;WAKE UP DISK ROUTINES
3704 IFN NMTCS, PUSHJ P,MSTRTR       ;WAKE UP MAG TAPE ROUTINES (MUST BE SEPARATE INTR)
3705 ;DROPS THROUGH
3706 \f
3707 ;DROPS IN
3708 IFG NMTYS,[                     ;TRY TO UNHANG MORTON TTY CARDS
3709         MOVE I,[-NMTYS,,NFMTY]
3710         MOVE T,TIME
3711         SUBI T,60.      ;IF HAVEN'T TYPED FOR 2 SECONDS
3712 SSLCM1: SKIPL TTYOAC(I) ;YET SUPPOSED TO BE TYPING
3713          CAMGE T,TTLTM(I)
3714           JRST SSLCM2
3715         CONO PI,TTYOFF-1
3716         CONO MTY,@TTYLT(I)      ;SELECT THE LINE
3717         DATAO MTY,[0]           ;AND BANG ON IT
3718         CONO PI,TTYON-1         ;MAYBE IF WE'RE LUCKY ITS DONE FLAG WILL COME ON 
3719 SSLCM2: AOBJN I,SSLCM1
3720 ]               ;END IFG NMTYS
3721 IFN IMPP,[
3722 IFN KAIMP, CONI IMP,IMPCNI      ;KEEPS HOST READY ON
3723 IFE KSIMP,[
3724         ;KS doesn't drop interrupts, I hope
3725         PUSHJ P,IMPOST          ;START UP OUTPUT
3726 ]
3727 IFN NCPP,[
3728         SKIPLE IMNCS
3729          PUSHJ P,IMPCCL         ;CLOSE NETWORK CHANNELS
3730         SKIPLE IMNAS
3731          PUSHJ P,IMPAAA         ;WAKE UP STYS THAT NEED IT
3732 ];NCPP
3733         SKIPGE IMPTCU           ;IF IMP IS TRYING TO COME UP
3734          AOSE IMPUCT            ;AND UP-COMING TIMEOUT EXHAUSTED
3735           JRST SSLCK8
3736         BUG INFO,[NET: TIMED OUT TRYING TO COME UP]
3737         MOVEI A,1               ;THEN MAKE IT STAY DOWN
3738         MOVEM A,IMPUP           ;IF THIS IS ML-KA THE IMP CABLE PROBABLY BROKE AGAIN
3739 SSLCK8:
3740 ];IMPP
3741 IFN PDP6P,[
3742         SKIPL PDPISR
3743          CONO DSDEV,DSDCHN      ;ENABLE INTERRUPTS FROM 6
3744 ];PDP6P
3745 IFN NETYS,[
3746         SKIPE DTEBBY
3747          SOSL DTEBBT
3748           JRST .+3
3749            BUG CHECK,[TTY: TIMEOUT ON OUTPUT XFER TO DTE, DTEBBY],OCT,DTEBBY
3750            SETZM DTEBBY
3751 ];NETYS
3752 IFN N11TYS,[
3753 ;SEE IF THE TV PDP11 WANTS TO GO DOWN.
3754         SKIPN TEN11F    ;PROVIDED THE PDP11 IS THERE,
3755          SKIPN TT11P    ;AND WE'RE TRYING TO USE IT,
3756           JRST SSLCK5
3757         LDB A,[061600,,TT11HA]  ;DOES 11 WANT WHO LINES UPDATED?
3758         CAIL A,2000*NTTPG       ;RANGE CHECK SO CLOBBERED 11 MEMORY DOESN'T CAUSE ILL MEM REF
3759          BUG HALT,[GARBAGE POINTER IN TV-11 MEMORY]
3760         SKIPGE 1+400000+TTPG0*2000(A)
3761          JRST [ MOVEI T,SCRWHO  ;YES
3762                 IORM T,SUPCOR
3763                 CLEARM 1+400000+TTPG0*2000(A)
3764                 JRST .+1]
3765         SKIPE TT11DN    ;IF IT IS REQUESTING TO GO DOWN,
3766          JRST SSLCK5
3767         SETZM TT11P     ;DON'T USE IT & WAIT FOR IT TO RE-INIT,
3768         MOVSI T,1
3769         MOVEM T,TT11DN  ;GIVE IT OUR PERMISSION TO GO DOWN.
3770         MOVEI T,SCR11D  ;CAUSE "11 DOWN" MESSAGE
3771         IORM T,SUPCOR
3772 SSLCK5: SKIPN TEN11F
3773          SKIPG TT11P    ;WAITING FOR 11 TO BE UP?
3774           JRST SSLCK6
3775         SKIPN TT11UP    ;SKIP ON 11 UP
3776          JRST SSLCK6
3777         MOVEI T,SCR11U
3778         IORM T,SUPCOR   ;INIT THE TTYS
3779 SSLCK6:
3780 ]
3781         SKIPLE T,AGERTE ;IF IT'S ENABLED, AGE SOME PAGES
3782          PUSHJ P,AGE
3783 ;DROPS THROUGH
3784 \f
3785 ;DROPS IN
3786 IFN DL10P,[
3787         SKIPN DL10F
3788          JRST SSLCKA
3789         SETOM DL10UP    ;COULD ALSO CHECK WHETHER PDP11 IS INCREMENTING THIS.
3790         DATAI DLC,A
3791         TRNE A,20       ;SEE IF PDP11 HALTED.
3792          JRST SSLCKA
3793         BUG INFO,[I/O PDP11 WENT DOWN]
3794         SETZM DL10F
3795         MOVEI T,%TYDL
3796         MOVSI A,-NCT
3797         TDNE T,TTYTYP(A)
3798          SETOM TTYOAC(A)
3799         AOBJN A,.-2
3800 SSLCKA: ]
3801         AOS QACTTM              ;Bump this for benefit of QSK dir writers.
3802         SKIPN SWPOPR            ;If there is a request to swap out pages
3803          SKIPE SOLNG            ; or if there are pages now going out
3804           JRST SSKQ2            ; do not bother with LMEMFR, warnings.
3805         MOVN A,LMEMFR           ;See how many free low-memory pages.
3806         ADD A,MINCOR
3807         JUMPLE A,SSRCK          ;Okay
3808         AOS NCORRQ              ;Wake up core job to do some shuffling
3809         SUB A,MEMFR
3810         ADD A,LMEMFR            ;Core wanted minus high free
3811         SKIPLE A
3812          ADDM A,SWPOPR          ;Swap out to make room.
3813 ;Check to see if we are running out of various resources.
3814 ;RSWTIM is a timestamp of last warning, initialized by DATIM6 and PDDCHK.
3815 SSRCK:  MOVE A,RSWTIM           ;Get time we last checked.
3816         ADDI A,2*30.
3817         CAML A,TIMOFF           ;If we checked less then 30 secs ago
3818          JRST SSKQ2             ; don't deluge the console.
3819         MOVE A,TIMOFF           ;Else remember that we are cheking now.
3820         MOVEM A,RSWTIM
3821         MOVEI A,5               ;There should be at least 5 free low pages.
3822         CAMLE A,LMEMFR          ;If there are not, print warning.
3823          BUG INFO,[Warning: Just ],DEC,LMEMFR,[ free pages in low core.]
3824         SKIPN QFCHN             ;Check disk channels.
3825          BUG INFO,[Warning: No free qsk channels.]
3826         MOVN A,USRHI            ;Check job slots.
3827         IDIVI A,LUBLK
3828         ADDI A,MAXJ
3829         SKIPN A
3830          BUG INFO,[Warning: System full - no job slots.]
3831 SSKQ2:
3832 IFN 340P,[
3833         SKIPL DISUSR
3834          PUSHJ P,DISCHK ;CHECK FOR 340 DEATH
3835 ]
3836         PUSHJ P,PDCCHK  ;CHECK ON REAL-TIME HACKS
3837 IFN PTRP,[
3838         PUSHJ P,PTRCHK  ;CHECK ON PAPER TAPE READER
3839         PUSHJ P,PTPCHK  ;CHECK ON PAPER TAPE PUNCH
3840 ] ;PTRP
3841 IFE KS10P,[     ; Silly KS10 doesn't have devices...
3842         SKIPN CCSDEV
3843          JRST SCDCK3
3844         SETZM CCSDEV
3845         MOVSI I,-128.
3846 SCDCK1: SKIPGE A,DCHNTC(I)
3847          TLNE A,300000
3848           JRST SCDCK2
3849         AOS CCSDEV
3850         SUB A,[1,,]
3851         TLNN A,777
3852          TLZ A,400000
3853         MOVEM A,DCHNTC(I)
3854 SCDCK2: AOBJN I,SCDCK1
3855 SCDCK3:;        JSP E,CHECK     ;CHECK FOR CLOBBERED DEVICES
3856 ] ;IFE KS10P
3857 IFN NLPTP,[
3858         CONO PI,LPTOFF
3859         MOVE A,NLPTBR           ;IF LPT OUTPUT BUFFER NOT EMPTY
3860         CAIN A,LPTBSZ
3861          JRST [ CONSZ NLPT,100  ;AND LPT IS READY
3862                  CONSZ NLPT,7   ;BUT HAS NO PIA
3863                   JRST .+1
3864                 CONO NLPT,LPTCHN ;THEN IT LOST AGAIN
3865                 AOS NTNLPL      ;COUNT NUMBER OF TIMES NEW LPT LOST
3866                 JRST .+1 ]
3867         CONO PI,LPTON
3868 ]
3869 IFN ECCMEM,[
3870 ;THIS ASSUMES THAT THE PDP-10/XBUS ADDRESS OFFSET IS ZERO
3871 ECCLOG: MOVE B,400000+ECCPG*2000+1760
3872         LSH B,-32.
3873         CAMN B,ECCIDX           ;DID ECC HISTORY POINTER ADVANCE?
3874          JRST ECCLG9
3875         AOS A,ECCIDX            ;YES, GET NEXT WORD FROM ECC HISTORY
3876         MOVE B,400000+ECCPG*2000+1760-1(A)
3877         ANDI A,17               ;ADVANCE OUR COPY OF POINTER
3878         MOVEM A,ECCIDX
3879         LDB A,[240700,,B]       ;SYNDROME BITS
3880         TLZ B,777774            ;REDUCE B TO ADDRESS BITS
3881         BUG INFO,[MEM: ECC ERROR, ADDRESS ],OCT,B,[SYNDROME],OCT,A
3882         JRST ECCLOG             ;LOOK FOR MORE HISTORY
3883
3884 ECCLG9:
3885 ];ECCMEM
3886         PUSHJ P,GPDTIM          ;WHAT CALENDAR TIME IS IT?
3887          SETOB A,LPDTIM
3888         EXCH A,LPDTIM           ;REMEMBER IT FOR NEXT CLOCK TICK.
3889         JUMPL A,ALCR0           ;TIME NOT KNOWN THIS AND/OR LAST TICK => DO NOTHING
3890         SUB A,LPDTIM            ;ELSE HOW LONG HAS IT BEEN SINCE PREVIOUS TICK?
3891         CAML A,[-5*PDUPS]       ;MORE THAN 5 SECONDS? SHOULD ONLY BE 1/60
3892          JRST ALCR0             ;ONLY EXPLANATION IS ITS WAS STOPPED AND CONTINUED.
3893         SKIPL SYSDBG            ;SO UNLESS THAT'S NORMALLY EXPECTED
3894          PUSHJ P,DEATHM         ;TELL THE WORLD "ITS REVIVED"
3895         MOVE T,TIME             ;REMEMBER WHEN THIS LAST HAPPENED
3896         MOVEM T,RVVTIM
3897
3898 ;DROPS THROUGH
3899 \f
3900 ;DROPS IN
3901 ;DECAY VARIOUS EXPONENTIAL AVERAGES.  ON KA10, RUN IN ACS SINCE IT'S FASTER.
3902 ;ON KL10, DON'T, SINCE IT'S SLOWER.  ON KS10, DON'T, BECAUSE IT IS
3903 ;JUST AS FAST TO RUN IN THE ACS BUT IT WASTES TIME TO MOVE THE CODE
3904 ;INTO THEM.
3905 ALCR0:  MOVSI U,-NCT
3906         SETZM SLOADU
3907 IFN KA10P,[
3908         MOVE I,[ALCR1,,A]
3909         BLT I,I
3910         JRST A
3911 ] ;KA10P
3912
3913 ALCR1:  MOVN T,USRRCE(U)        ;A      ;DECAY USRRCE AVERAGES
3914         ASH T,-4                ;B
3915         ADDB T,USRRCE(U)        ;C
3916         CAMLE T,SLOADU          ;D      ;AND SET SLOADU TO HIGHEST USRRCE
3917          MOVEM T,SLOADU         ;E
3918 IFN KA10P,[
3919         AOBJN U,A               ;TT
3920         JRST .+1                ;I
3921 ] ;KA10P
3922 IFE KA10P, AOBJN U,ALCR1
3923
3924         MOVN T,USRRCE+NCT
3925         ASH T,-4-2              ;DISOWNED JOBS (DECAY SLOWER)
3926         ADDB T,USRRCE+NCT
3927         IMULI T,1999.           ;MAKE COMMENSURATE WITH REGULAR USRRCE'S
3928         ASH T,-13.              ; (You might think that you could just
3929                                 ; divide by 4, but in fact the ratio
3930                                 ; between the two decay rates is
3931                                 ; ln(64/63)/ln(16/15) = .24401474)
3932         ADDM T,SLOADU           ;DISOWNED TIME COULD HAVE BEEN USED BY REAL
3933                                 ; USERS
3934         MOVN T,USRRCE+NCT+1
3935         ASH T,-4+1              ;SYS, CORE, AND SOME DAEMON JOBS (DECAY FASTER)
3936         ADDM T,USRRCE+NCT+1
3937         IRPS RCE,,LOSRCE IDLRCE
3938          MOVN T,RCE             ;LOST TIME AND IDLE TIME
3939          ASH T,-4
3940          ADDB T,RCE
3941          TERMIN
3942         ADDM T,SLOADU           ;IDLE TIME COULD HAVE BEEN USED BY USERS
3943
3944 IFE KS10P, MOVE A,[193682794.]  ; = 100. * 250000. * .5 / ln(16/15)
3945                                 ; (100% of 250000. four usec ticks per second,
3946                                 ; decaying by 16/15 every .5 second.)
3947 IFN KS10P, MOVE A,[198524864.]  ; = 100. * 256250. * .5 / ln(16/15)
3948                                 ; (256250. 3.9 usec ticks per second.)
3949 ; Used to be:
3950 ;       MOVE A,[100.*15.*125000.] ;100% DIVIDED BY MAXIMUM SINGLE TREE %
3951         ADD A,LOSRCE            ;WITH FUDGE FACTOR FOR LOST TIME
3952         IDIVM A,SLOADU          ;GIVES EFFECTIVE # OF COMPETITORS FOR MACHINE.
3953 ; It is possible for SLOADU to drop below 100. (giving a fair share greater
3954 ; than 100%).  This happens because the decay rate for disowned jobs is
3955 ; less than the decay rate for consoles.  If the load switches abruptly
3956 ; from the disowned jobs to some console, the resource word for the console
3957 ; fills up quicker than the disowned resource word decays, causing their
3958 ; sum to briefly exceed the maximum.  This would be hard to fix without
3959 ; introducing additional resource words just for better maintaining SLOADU.
3960 ;
3961 ; An additional odd effect:  If only disowned jobs are running, and a
3962 ; network server starts up, the fair share drops almost to zero.  This is
3963 ; because when such jobs are created, their resource word is zeroed to
3964 ; given them an initial priority boost.
3965
3966         MOVEI T,0
3967 IFN KA10P,[
3968         MOVE W,[ALCR4,,A]
3969         BLT W,W
3970         JRST A
3971 ] ;KA10P
3972
3973 ALCR4:  MOVN H,JTMU(T)  ;A
3974         ASH H,-4
3975         ADDM H,JTMU(T)
3976         MOVE H,MSKST(T)
3977         ANDI H,%PICLK   ;E
3978         SKIPE UNAME(T)  ;TT
3979          IORM H,PIRQC(T);I
3980         ADDI T,LUBLK    ;Q
3981         CAMGE T,USRHI   ;J
3982 IFN KA10P,[
3983          JRST A         ;R
3984         JRST .+1        ;W
3985 ] ;KA10P
3986 IFE KA10P, JRST ALCR4
3987 ;DROPS THROUGH
3988 \f;DROPS IN
3989 IFN SWPWSP,[
3990         MOVE U,USRHI
3991         SUBI U,LUBLK            ;ACCOUNT FOR I/O WAIT TIME IN USWPRI
3992         MOVSI T,%SWOUT+%SWPGW
3993 IFN KA10P,[
3994         MOVE J,[ALCR5,,A]
3995         BLT J,J
3996         JRST A
3997 ] ;KA10P
3998 ALCR5:  SKIPE UNAME(U)          ;A      ;IGNORE JOBS WHICH DON'T EXIST OR
3999          TDNE T,USWST(U)        ;B      ;ARE SWAPPED-OUT OR IN PAGE-WAIT
4000 IFN KA10P, JRST I               ;C
4001 IFE KA10P, JRST ALCR6
4002         SKIPN USTP(U)           ;D      ;CHARGE JOBS WHICH ARE STOPPED 
4003          SKIPE FLSINS(U)        ;E      ;OR BLOCKED
4004           JRST ALCR7            ;TT
4005 ALCR6:  SUBI U,LUBLK            ;I      ;NEXT JOB
4006 IFN KA10P,[
4007         JUMPG U,A               ;Q
4008         JRST .+1                ;J
4009 ] ;KA10P
4010 IFE KA10P, JUMPG U,ALCR5
4011 ];SWPWSP
4012         SKIPGE 37       ;CHECK FOR PLANNED SYSTEM DEATH
4013          PUSHJ P,DEATH  ;ABOUT TO START DYING
4014           JFCL
4015         IRPS 4US,,[IDLTM1 LOSTM1 USRTM1 NULTM1]SEC,,[IDLTIM LOSTIM USRTIM NULTM3]
4016          MOVE A,4US     ;KEEP SYSTEM WIDE USAGES AS TWO WORDS
4017          IDIVI A,250000. ;ONE IN 4.069 USEC UNITS
4018          ADDM A,SEC     ;AND ONE IN SECONDS
4019          MOVEM B,4US    ;SO NO OVERFLOW
4020          TERMIN
4021         IMULI A,60.     ;CONVERT TO 60THS
4022         ADDM A,NULTIM   ;ADD TO 60THS USED (OBSOLETE)
4023         MOVEI T,SCLKI
4024         MOVEI C,SSLCKB
4025         JRST CLQREE     ;RE-ENTER RQ FOR SLOW CLOCK BREAK
4026
4027 IFN SWPWSP,[            ;JOB IN U NEEDS TO BE CHARGED FOR MEMORY USED WHILE BLOCKED OR STOPPED
4028 ALCR7:  HLLO W,UWRKST(U)
4029         JFFO W,.+1      ;H GETS 19 - LOG(WORKING SET SIZE + 1/2)
4030         SUBI H,19.
4031         IMUL H,[-125000.] ;CHARGE FOR 1/2 SECOND OF MEMORY USAGE
4032         ADDM H,USWPRI(U)
4033 IFN KA10P, JRST I
4034 IFE KA10P, JRST ALCR6
4035 ];SWPWSP
4036 \f
4037 ;SYSTEM IN FINAL THROES OF COMING DOWN, SEE IF IT'S OVER YET
4038
4039 COFFIN: MOVE T,NLOOSP           ;MUST SWAP OUT ALL LOOSE PAGES
4040         ADDB T,SWPOPR
4041         JUMPN T,CPOPJ           ;SWAPPAGE OUT STILL GOING ON
4042         MOVEI T,NQCHN+1+NQS-1
4043         SKIPGE QSGL(T)
4044          SOJG T,.-1
4045         SKIPL QSGL(T)           ;NOT OVER IF ANY DISK CHANNELS ARE ACTIVE
4046          POPJ P,
4047         MOVSI T,040000
4048         MOVE TT,QACTB   ;SEE IF DISK STUFF NOT OUT YET
4049         TDNE TT,QMDRO
4050          POPJ P,        ;MFD NOT OUT
4051         MOVSI A,-NQS
4052 COFFI8: TDNE T,QTUTO(A)
4053          JRST COFFI9    ;TUT NEVER CAME IN
4054         TDNE TT,QTUTO(A)
4055          POPJ P,        ;TUT NOT OUT
4056 COFFI9: AOBJN A,COFFI8
4057         MOVSI A,-QNUD
4058 COFFI1: SKIPN QSNUD(A)
4059          JRST COFFI2
4060         TDNE TT,QSNLCN(A)
4061          POPJ P,        ;UFD NOT WRITTEN
4062 COFFI2: AOBJN A,COFFI1
4063
4064 IFN NUNITS,[
4065         MOVSI A,-NUNITS
4066         SKIPGE UFLAPF(A)
4067          POPJ P,        ;TAPE STILL FLAPPING
4068         AOBJN A,.-2
4069 ]
4070         MOVE A,DTHTIM
4071         ADDI A,15.*30.  ;DON'T WAIT FOR CONSOLES MORE THAN 15 SECONDS
4072         CAMGE A,TIME    ;BECAUSE %TCHNG ISN'T NECESSARILY SET
4073          JRST COFFI3
4074         MOVEI A,NFSTTY-1        ;CHECK FOR REAL CONSOLES STILL TYPING OUT
4075         MOVSI T,%TCHNG  ;AND NOT HUNG (NEVER GOING TO FINISH TYPING OUT)
4076         TDNN T,TTYCOM(A)
4077          SKIPGE TTYOAC(A)
4078           SOJGE A,.-2
4079         JUMPGE A,CPOPJ  ;A CONSOLE IS STILL TYPING, DON'T GO DOWN YET
4080 COFFI3: SKIPL A,SYSCN
4081          SKIPGE TTYOAC(A)
4082           CAIA
4083            POPJ P,      ;SYSTEM CONSOLE HAS A LOT OF TYPING TO DO
4084         MOVEI A,2*LUBLK
4085 COFFI7: CAML A,USRHI
4086          JRST COFFI4
4087         SKIPE UNAME(A)
4088          POPJ P,        ;JOBS STILL EXIST
4089         ADDI A,LUBLK
4090         JRST COFFI7
4091
4092 ;SYSTEM FULLY DOWN; GO TO DDT.
4093 COFFI4: BUG DDT,[SHUTDOWN COMPLETE]
4094         SETZM SHUTDN            ;IF USER PROCEEDS, BRING SYSTEM BACK UP
4095         SETZM DEDTIM            ;ARRANGE TO RELOAD ATSIGN DRAGON
4096         SETZM FLSINS            ;BY RESTARTING SYS JOB WHERE IT DOES THAT
4097         MOVEI A,ISYS
4098         MOVEM A,UPC
4099         POPJ P,
4100 \f
4101 ;ROUTINE TO AGE SOME PAGES.  THIS ROUTINE SLOWLY CIRCULATES THROUGH
4102 ;CORE.  IF IT TOUCHES A PAGE TWICE, AND NO USER HAS TOUCHED IT,
4103 ;THE PAGE GETS SWAPPED OUT.  ALSO FLUSHES PAGES NOT IN ANY USER'S MAP.
4104 ;ENTER WITH VALUE OF AGERTE IN T.
4105
4106 AGE:    MOVE TT,MEMFR
4107         CAIL TT,100
4108          POPJ P,        ;NO MEMORY COMPETITION, DON'T BOTHER
4109         ADD T,AGEREQ    ;INCREASE NUMBER OF PAGES NEEDING TO BE AGED
4110         CAIGE T,100     ; BUT DON'T LET IT GET INFINITELY HUGE
4111          MOVEM T,AGEREQ ; IF CIRPSW IS LOCKED FOR A LONG TIME
4112         SKIPN DLSRCH    ;IF MUSTN'T PCLSR ANYONE, OR
4113          SKIPL CIRPSW   ; IF CIRPSW LOCKED, HAVE TO WAIT UNTIL NEXT SLOW CLOCK
4114           POPJ P,
4115         LDB W,[121000,,HUSRAD]  ;DON'T AGE SYSTEM JOB (CIRC PNTRS NOT CONNECTED)
4116         MOVE A,AGEPOS   ;CONTINUE AGEING FROM WHERE LEFT OFF LAST TIME
4117         SKIPGE U,USER   ;CHECK FOR NULJOB
4118          JRST AGE0
4119         MOVE T,CLKBRK   ;PC FOR USER WHO MAY GET PCLSR'D
4120         MOVEM T,UPC(U)  .SEE SWOP2
4121         LPMR UPGML(U)   ;DON'T LEAVE SWAPPED OUT PAGES IN ASSOC MEM
4122 AGE0:   CAIGE A,TSYSM
4123          CAMGE A,W
4124           MOVE A,W
4125         SOSGE AGEREQ
4126          JRST [ MOVEM A,AGEPOS ? SETZM AGEREQ ? POPJ P, ]
4127         AOS NAGES
4128         LDB T,[MUR,,MEMBLT(A)]
4129         CAIE T,MURUSR
4130          AOJA A,AGE0
4131         MOVE D,A
4132         PUSHJ P,UCPRL4
4133             SETZ AGE1
4134         MOVNI C,1       ;NO USERS ACTIVELY USING THIS PAGE, SWAP IT OUT
4135         PUSHJ P,SWPOPG
4136          JFCL
4137         AOJA A,AGE0
4138
4139 AGE1:   MOVEI C,UPGMP(U)
4140         MOVE T,I        ;DON'T CLOBBER I
4141         ROT T,-1
4142         ADD C,T
4143         HRLI C,222200
4144         SKIPGE T
4145          HRLI C,2200
4146         LDB T,C         ;GET PAGE MAP WORD
4147         TRNN T,600000
4148          POPJ P,        ;USER NOT CONNECTED TO THIS PAGE
4149         TROE T,PMAGEM
4150          POPJ P,        ;HASN'T TOUCHED THIS PAGE SINCE AGE BITS LAST SET
4151         DPB T,C         ;HAS TOUCHED PAGE, TURN AGE BITS BACK ON
4152         SUB P,[4,,4]    ;AND BACK OUT OF UCPRL
4153         AOJA A,AGE0
4154 \f
4155 IFN 340P,[
4156
4157 DISCHK: SKIPGE DISOFF
4158         POPJ P,
4159         AOSLE DISDIE
4160         SKIPGE CDISOFF
4161         POPJ P,
4162         MOVEI T,1
4163         MOVEM T,DTIME
4164 DISZAP: MOVE T,[JSR DBLKPB]
4165         MOVEM T,40+2*DISCHN
4166         MOVEI T,DIS300-1        ;CAUSE 340 TO STOP AND INTERRUPT SOON
4167         MOVEM T,DBLKOP
4168         CLEARM DISOFF
4169         CONO DIS,5100+SDCHN_3+DISCHN
4170         POPJ P,
4171 ]
4172
4173 DEATH:  SKIPL SHUTLK
4174         POPJ P,
4175         SETZM 37        ;CLEAR START DYING FLAG
4176         MOVEI T,60.*5.*60.      ;5 MIN
4177         MOVEM T,DEDTIM
4178         LSH T,-1
4179         ADD T,TIME
4180         MOVEM T,SHUTDN
4181         PUSHJ P,CLQDEL
4182          DEDBLK
4183 DEATHX: SKIPN T,DEDTIM
4184          POPJ P,
4185         AOS (P)
4186         MOVEI TT,0
4187         CAIGE T,40.*60.
4188          JRST DEATHY
4189         MOVE TT,T
4190         LSH TT,-2
4191 DEATHY: MOVEM TT,DEDTIM
4192         SUB T,TT
4193         PUSHJ P,CLQADD
4194          DEDBLK
4195 DEATHM: MOVEI A,%PIDWN
4196         PUSHJ P,INTALL  ;TELL THE WORLD
4197         MOVSI T,SCLSHD  ;CAUSE TYPE OUT ON UNLOGGED-IN CONSOLES
4198 SUPSET: IORM T,SUPCOR
4199         POPJ P,
4200
4201 VSSLCK: MOVSI T,SCLVSK
4202         IORM T,SUPCOR   ;CAUSE VERY SLOW CLOCK TO RUN
4203         MOVEI T,VSCLKI
4204         MOVEI C,VSLCKB
4205         JRST CLQREE
4206
4207 IFN CCLKP,[
4208 RCCLK:  DATAI 374,T     ;HACK CHESS CLOCK
4209         TRNE T,4000
4210          AOSA CCLK1
4211           AOS CCLK2
4212         MOVEI T,6
4213         MOVEI C,CCLKB
4214         JRST CLQREE
4215 ]
4216
4217 IFN N11TYS,[
4218 WHOSET: MOVEI T,SCRWHO  ;CAUSE SYS TO UPDATE WHO LINES
4219         IORM T,SUPCOR
4220         MOVEI T,5.*60.-5  ;5 SECONDS MINUS A LITTLE SO DOESN'T SYNC WITH OTHER CLOCKS
4221         MOVEI C,WHOCLB
4222         JRST CLQREE
4223 ]
4224 \f
4225 SUBTTL SWAP SCHEDULER
4226
4227 OVHMTR SWS      ;SWAP SCHEDULER
4228
4229 ;15 SECOND CLOCK
4230 15SCLK:
4231 IFN IMPP,       PUSHJ P,IMRSTO  ;RESET CONTROL LINK RFNM WAIT FOR LOSING IMP.
4232
4233 ;RECOMPUTE SWAP BLOCK DATA.
4234 ;DECAY SWAP PRIORITIES (USWPRI AND SWRCE)
4235 ;RESET BEST-EFFORT-HAS-BEEN-MADE TO SWAP OUT BITS
4236
4237         MOVSI B,%SWBEM  ;SET UP TO CLEAR "BEST EFFORT TO SWAP OUT BIT"
4238         SETOM SBEFLG    ;NOT YET DESPERATE ENOUGH TO TRY USERS WHOSE BEST EFFORT BITS ARE SET
4239 IFE SWPWSP,[
4240         CLEARB T,NUSWB  ;# USERS LOCKED OUT
4241         SETOM BUSR      ;SMALLEST SWAPPED BLOCKED USER
4242         MOVE D,[37777,,777777]
4243         MOVEM D,BUSIZ   ;SIZE OF SMALLEST SWAP-BLOCKED USER.
4244         CLEARM ASBUM    ;REAL MEM OCC BY ACTIVE SWAPPED BLOCKED LOSERS
4245         MOVSI D,400000  ;TO CLEAR SWAPPED BLOCKED BIT
4246 ];SWPWSP
4247 .ELSE   MOVEI T,LUBLK*2
4248 15S1:   CAML T,USRHI
4249          JRST 15S2
4250         SKIPN UNAME(T)
4251          JRST 15S3
4252         MOVN C,USWPRI(T)
4253         ASH C,-2
4254         ADDM C,USWPRI(T)        ;DECAY JOB SWAP PRI'S
4255         MOVE C,NMPGS(T)
4256 IFE SWPWSP,[
4257         SKIPE ENPZRO
4258          SUBI C,1       ;COMPENSATE FOR PAGE ZERO ALWAYS IN
4259 ];SWPWSP
4260         CAMLE C,NSWPGS(T)       ;SKIP ON NOT COMPLETELY OUT
4261          ANDCAM B,USWST(T) .SEE %SWBEM
4262 IFE SWPWSP,[
4263         SKIPGE USWSCD(T)
4264          JRST 15S4      ;CLEAR SWAPPED BLOCK BIT AND MAYBE ADD TO AUSOPG AND TRUMM (IF HE WAS HUNG ON IT)
4265 ];SWPWSP
4266 15S3:   ADDI T,LUBLK
4267         JRST 15S1
4268
4269 15S2:
4270 IFE SWPWSP,[
4271         SKIPE ENSWSC
4272          PUSHJ P,SWSCD  ;SWAP BLOCK LOSERS IF NECESSARY
4273 ];SWPWSP
4274         MOVSI T,-NCT-2
4275 15S5:   MOVN C,SWRCE(T) ;DECAY TREE SWAP PRI'S
4276         ASH C,-2
4277         ADDM C,SWRCE(T)
4278         AOBJN T,15S5
4279         MOVEI T,15.*60.
4280         MOVEI C,15SCLB
4281         JRST CLQREE
4282
4283 IFE SWPWSP,[
4284 15S4:   ANDCAM D,USWSCD(T)      ;CLEAR SWAP BLOCK BIT
4285         SKIPN TT,FLSINS(T)      ;WAS HE HUNG TESTING IT
4286          JRST 15S3
4287         SUBI TT,(T)
4288         CAME TT,[SKIPGE USWSCD]
4289          JRST 15S3              ;HE WASN'T HUNG ON THIS
4290         CLEARM FLSINS(T)        ;HE WAS SO NOW HES ACTIVE
4291         MOVE TT,USWST(T)
4292         TLZE TT,%SWPGW
4293          SOS NPGWTU             ;FLSINS WAS SET BY PAGE FAULT, SO CONSIDERED
4294         TLZ TT,%SWBEM           ;TO BE WAITING FOR A PAGE
4295         MOVEM TT,USWST(T)
4296         MOVE TT,NMPGS(T)
4297         ADDM TT,TRUMM           ;GUY IS NOW RUNNABLE
4298         SUB TT,NSWPGS(T)        ;ANY PAGES HE MAY HAVE IN MEM NO LONGER BELONG TO A BLOCKED USER
4299         MOVNS TT
4300         ADDB TT,BUMPGS
4301         SKIPGE TT
4302          CLEARB TT,BUMPGS
4303         MOVE TT,NSWPGS(T)       ;ANY SWAPPED OUT PAGES BELONG TO AN ACTIVE USER
4304         ADDM TT,AUSOPG
4305         JRST 15S3
4306 ];SWPWSP
4307 \f
4308 IFE SWPWSP,[
4309
4310 PRVCLK: SKIPN ENPVCL
4311          JRST PRVCK4
4312         MOVSI B,%SWPRV
4313         SKIPL U,PRVUSR
4314          ANDCAM B,USWST(U)
4315         SETOM PRVUSR    ;TURN OFF CURRENT PRIVILEDGED USER
4316         MOVEI J,2*LUBLK
4317 PRVCK1: CAML J,USRHI
4318          JRST PRVCK2
4319         SKIPN UNAME(J)
4320          JRST PRVCK3
4321         MOVE B,UTRNTM(J)        ;GET USER RUN TIME
4322         SUB B,LTRNTM(J)
4323         MOVE A,USIPRQ(J)
4324         SUB A,LSIPRQ(J)
4325         IMUL A,[NPVSEC*125000.] ;1/2 NUMBER OF 4 MICROSECOND INTERVALS IN THE PRIV INTERVAL
4326         SKIPE B
4327          IDIV A,B
4328         MOVE B,UPGSEC(J)
4329         LSH B,-1                ;DIVIDE LAST VALUE BY TWO
4330         ADD A,B
4331         MOVEM A,UPGSEC(J)       ; LAST/2 + CURRENT
4332         MOVE A,UTRNTM(J)
4333         MOVEM A,LTRNTM(J)
4334         MOVE A,USIPRQ(J)
4335         MOVEM A,LSIPRQ(J)       ;SAVE OLD VARIABLES
4336 PRVCK3: ADDI J,LUBLK
4337         JRST PRVCK1
4338
4339 PRVCK2: PUSHJ P,NPRVUS  ;GET NEXT PRIV USR
4340 PRVCK4: MOVEI T,NPVSEC*60.
4341         MOVEI C,PRVCLB
4342         JRST CLQREE
4343
4344 NPRVUS: MOVEI J,2*LUBLK
4345         SETOM U
4346         MOVNI T,30.*2   ;DON'T LET A BLOCKED OR STOPPED PERSON BE PRIVILEDGED
4347         ADD T,TIME
4348         MOVE B,PRVCUT
4349         HRLOI E,377777
4350 NPVUS1: CAML J,USRHI
4351          JRST NPVUS2
4352         CAMGE T,LUBTM(J)        ;BLOCKED TOO LONG?
4353          SKIPN UNAME(J)
4354           JRST NPVUS3
4355         CAMG B,UPGSEC(J)
4356          CAMG E,LPRVTM(J)
4357           JRST NPVUS3
4358         MOVE U,J
4359         MOVE E,LPRVTM(J)
4360 NPVUS3: ADDI J,LUBLK
4361         JRST NPVUS1
4362
4363 NPVUS2: MOVEM U,PRVUSR
4364         SKIPG U
4365          POPJ P,
4366         MOVSI B,%SWPRV
4367         IORM B,USWST(U)
4368         MOVE T,TIME
4369         MOVEM T,LPRVTM(U)
4370         POPJ P,
4371 ];SWPWSP
4372 \f
4373 IFE SWPWSP,[
4374 IFNDEF MEMSYS,MEMSYS==50        ;GUESS AT AMOUNT OF MEM SYSTEM NEEDS
4375 IFNDEF MEMSY1,MEMSY1==50        ;AMOUNT OF MEM ANY ONE USER MUST LEAVE TO "FIT".
4376
4377 SWSCD:  MOVE E,TRUMM    ;SEE IF NECESSARY TO SWAP BLOCK SOMEONE
4378         CAIGE E,TSYSM-SYSB-MEMSYS
4379         POPJ P, ;NO SHOULD FIT
4380         MOVE E,MEMFR
4381         SUB E,NCBCOM
4382         ADD E,SOLNG
4383         SUB E,SILNG
4384         SUB E,AUSOPG
4385         ADD E,BUMPGS    ;WILL SWAP OUT BLOCKED USERS FIRST
4386         ADD E,ASBUM
4387         SUBI E,20       ;SLOP
4388         JUMPGE E,CPOPJ  ;SHOULD HAVE ROOM FOR EVERYBODY
4389         MOVMM E,SWSCT1  ;SAVE # PGS REQ
4390         MOVNI E,1       ;NEED TO GRONK USER (MAYBE)
4391         CLEARB T,TT     ;TT SWP PRI OF PROCESS
4392         MOVEI R,0       ;R SWP PRI OF TREE
4393 SWSCP1: CAML T,USRHI
4394         JRST SWSCP2
4395         SKIPE UNAME(T)
4396         SKIPE USTP(T)
4397         JRST SWSCP7
4398         SKIPGE USWSCD(T)
4399         JRST SWSCP7     ;GUY ALREADY LOCKED OUT
4400         SKIPE FLSINS(T)
4401         JRST SWSCP4     ;SEE IF REALLY BLOCKED OR JUST PAGE WAIT
4402 SWSCP5: MOVE B,UTMPTR(T)
4403         CAML R,SWRCE-USRRCE(B)
4404         CAMG TT,USWPRI(T)
4405         JRST SWSCP6     ;THIS GUY A BIGGER LOSER THAT PREV BIGGEST
4406 SWSCP7: ADDI T,LUBLK
4407         JRST SWSCP1
4408
4409 SWSCP6: MOVE E,T
4410         MOVE R,SWRCE-USRRCE(B)
4411         MOVE TT,USWPRI(T)
4412         JRST SWSCP7     ;GUY REALLY BLOCKED
4413
4414 SWSCP4: MOVE B,USWST(T)
4415         TLNE B,%SWPGW
4416          JRST SWSCP5
4417         JRST SWSCP7
4418
4419
4420 SWSCP2: JUMPL E,CPOPJ   ;NO VICTIM
4421         MOVE B,NMPGS(E)
4422         CAIGE B,TSYSM-SYSB-MEMSY1
4423         JRST SWSCP9     ;"SMALL LOSER"
4424         SUB B,NSWPGS(E)
4425         CAMLE B,SWSCT1  ;SKIP ON WILL STILL NEED TO BLOCK MORE LOSERS
4426         POPJ P,
4427 SWSCP9: MOVSI B,400000
4428         IORM B,USWSCD(E)        ;SWAP BLOCK LOSER
4429         AOS NUSWB
4430         AOS NTUSB
4431         MOVE TT,NMPGS(E)
4432         CAMLE TT,BUSIZ
4433         JRST SWSCP8
4434         MOVEM TT,BUSIZ
4435         MOVEM E,BUSR
4436 SWSCP8: SUB TT,NSWPGS(E)
4437         SOSGE TT
4438         MOVEI TT,0
4439         ADDM TT,ASBUM   ;THIS GUY SWAPPED BLOCKED
4440         MOVN TT,NMPGS(E)
4441         ADDM TT,TRUMM   ;DOESNT COUNT ANY MORE
4442         SKIPGE TRUMM
4443         CLEARM TRUMM
4444         MOVN TT,NSWPGS(E)
4445         ADDM TT,AUSOPG  ;NOT REALLY ACTIVE ANY MORE
4446         JRST SWSCD      ;SEE IF THATS ENUF
4447 ];SWPWSP
4448 \f
4449 OVHMTR PPI      ;PPIUM
4450
4451 ;PUT PAGE INTO USERS' MAPS (OF ALL USERS THAT ARE CONNECTED VIA CIRCULAR POINTERS)
4452 ;ALSO UPDATES THE WORKING SETS.
4453 ;CALL WITH PAGE NUMBER IN A, STARTING BYTE POINTER IN C, AND TDNE T,MMP IN D.
4454 ;SMASHES T,H,I,U,E,TT,C
4455 PPIUM:  AOS NPPIUM
4456 IFN SWPWSP,[
4457         MOVEI E,0       ;COUNT USERS OF THE PAGE
4458         PUSHJ P,UCPRL
4459             400000,,[AOJA E,CPOPJ]
4460         HRRM E,MMSWP(A) ;ALL THESE SHARERS WILL BE CONNECTED TO THE PAGE
4461         MOVSI T,1       ;COMPUTE WORKING SET ADJUSTMENT
4462         IDIVM T,E       ;I.E. 1 OVER NUMBER OF SHARERS
4463 ];SWPWSP
4464         PUSHJ P,UCPRL   ;GIVE PAGE TO ALL USERS WAITING FOR IT
4465             400000,,PPIUM1
4466         POPJ P,
4467
4468 ;SET UP MAP TO MEMBLT INDEX IN A
4469 PPIUM1: AOS NPPIU1
4470         CAIG U,LUBLK
4471          BUG            ;SYS JOB OR CORE JOB
4472         PUSH P,I
4473         MOVEI C,UPGMP(U)
4474         ROT I,-1
4475         ADDI C,(I)
4476         HRLI C,222200
4477         SKIPGE I
4478          HRLI C,2200
4479         LDB I,C
4480         JUMPE I,[JRST 4,.]      ;DOESN'T REALLY EXIST?
4481         MOVSI T,MMPPGA          ;DON'T REALLY PUT IN MAP IF PAGE-AHEAD PAGE.
4482         TDNE T,(D)              ;JUST PRE-EMPT.
4483          JRST QSWI2A
4484         TRNE I,600000           ;DO NOTHING IF ALREADY IN MAP.
4485 IFE E.SP,[
4486          JRST QSWI2     ;ALREADY IN MAP, POSSIBLE AS A RESULT OF RIDICULOUS TIMING ERROR
4487 ]
4488 IFN E.SP,[
4489          JRST E.SPGJ    ; CHECK E&S WANTS READ/WRITE FIRST FIX
4490 ]
4491         SOS NSWPGS(U)   ; NUMBER OF SWAPPED-OUT PAGES
4492         SOS SNSWPG      ;DECR CNT OF SWAPPED OUT FOR SYS
4493         SKIPN (P)       ;DON'T SET UP PG 0 AS R-W-F.
4494          JRST QSWI3
4495         TRNE I,2
4496          MOVEI I,2      ;SET READ/WRITE TO READ/WRITE/FIRST
4497 QSWI3:  LSH I,16.
4498         IORI I,PMCSHM(A);BRING IN ADDRESS AND CACHE BITS
4499         DPB I,C
4500 QSWI2:
4501 IFE SWPWSP,[
4502         AOS MMSWP(A)    ;INCREMENT COUNT OF USERS IN RING
4503 ];SWPWSP
4504 IFN SWPWSP,[
4505         ADDM E,UWRKST(U)        ;ADJUST WORKING SET
4506 ];SWPWSP
4507 QSWI2A:
4508 IFN PAGPRE,[
4509 ;IF THIS USER IS WAITING FOR THIS PAGE, MAKE HIM RUNNABLE BY PUTTING
4510 ;HIM ON THE SCHMNY LIST, AND PRE-EMPT THE CURRENTLY-RUNNING USER.
4511 ;THE IDEAS ARE TO START THIS USER'S NEXT PAGE READ AS SOON AS POSSIBLE,
4512 ;AND TO ELIMINATE THE SCHEDULING THAT WOULD OTHERWISE BE NECESSARY TO RUN THIS GUY.
4513         AOS NPREE1
4514         CONSZ PI,200_-APRCHN    ;CAN'T PREEMPT IF CLKOFF
4515          CONSZ PI,100000_-APRCHN        ;OR IN PROGRESS, BECAUSE
4516           JRST POPIJ            ;MIGHT ZERO FLSINS WHILE SCHEDULER
4517                                 ;IS EXECUTING IT & SIMILAR NASTIES
4518         AOS NPREE2
4519         CAME D,FLSINS(U)        ;IF JOB THAT JUST GOT PAGE IS WAITING FOR IT
4520          JRST POPIJ
4521         AOS NPREE3
4522         SETZM FLSINS(U)         ;THEN THAT JOB PREEMPTS CURRENT ONE
4523         MOVSI T,%SWPGW
4524         TDNE T,USWST(U)
4525          SOS NPGWTU             ;FLSINS WAS DUE TO PAGE FAULT (MIGHT BE IN .CALL CORBLK)
4526         ANDCAM T,USWST(U)
4527         HRRZ I,U
4528         PUSHJ P,SCHSB
4529         SETOM PREEMP
4530         CONO PI,CLKRQ           ;REQUEST INT TO SCHEDULER
4531 ];PAGPRE
4532 IFE PAGPRE,[
4533         SKIPE ENPREE
4534          CAME D,FLSINS(U)
4535           JRST POPIJ
4536         MOVE TT,PRVCUT
4537         CAME U,PRVUSR
4538          CAMLE TT,UPGSEC(U)
4539           SETZM SCHFLG
4540 ];PAGPRE
4541 POPIJ:  POP P,I
4542         POPJ P,
4543
4544 IFN E.SP,[
4545 E.SPGJ: SKIPE E.SPGH    ; FLAG FROM E.SPGI
4546          CAME U,DISUSR
4547           JRST QSWI2    ; LEAVE AS IS
4548         TRNN I,400000
4549          JRST QSWI2
4550         MOVEI I,3
4551         JRST QSWI3      ; GO MAKE READ/WRITE
4552         ; DON'T SOS NSWPGS, SINCE PAGE IS ALREADY HERE
4553 ];E.SP
4554 \f
4555 SUBTTL USER SCHEDULER
4556
4557 OVHMTR SC1      ;SCHEDULER 1 - ENTRY
4558
4559 IFN KL10P, IFNDEF SCCOST, SCCOST==250.  ;CHARGE 1 MILLISEC FOR SCHEDULING
4560 IFN KA10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4561 IFN KS10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4562
4563 SCHED:  SKIPGE U,USER
4564          JRST SCHED9
4565         MOVE T,CLKBRK
4566 IFN KS10P,[
4567         ;; If user is swapped out while running in the page fail code, then
4568         ;; EPTPFO is used as the PC.  Either he is on his way in, in which
4569         ;; case he will come back when restarted, or he is on his way out,
4570         ;; in which case this just pushes him on his way.
4571         TLNE T,%PSUSR
4572          JRST SCHED0
4573         HRRZ T,T
4574         CAIL T,PFAIL            ; First instruction inclusive
4575          CAILE T,PFAILE         ; Last instruction inclusive
4576           SKIPA T,CLKBRK
4577            MOVE T,EPTPFO
4578 SCHED0: ] ;IFN KS10P
4579         MOVEM T,UPC(U)
4580 IFN SCHBLN,SETZM SCHMNY ;ENTERED FROM QUANTUM RUNOUT, TIME TO CHECK ALL USERS
4581 SCHED2: ;ENTERED FROM UFLS OR PAGE FAULT, CHECK FOR AUXIL PERSON TO RUN
4582         ;IF SCHMNY IS STILL -1
4583         AOS NSKED
4584         MOVSI T,UEXIT   ;GET HERE FROM CLUFLS
4585         HRRI T,UUO(U)
4586         BLT T,SUEXND-1(U)
4587 IFN KL10P,[
4588         AC7CTX
4589         XCTR XR,[HRRZ A,13]     ;GCSTBR
4590         XCTR XR,[HRL A,14]      ;STBR
4591         SYSCTX
4592         MOVEM A,ULSPBR(U)
4593         SKIPL MTRUSR    ;SKIP IF PERF COUNTER AVAILABLE
4594          JRST [ DMOVE A,MBOXCT(U)       ;COMPUTE EQV CPU TIME FROM MBOX+EBOX ACCT
4595                 DSUB A,STMBOX           ;AS INCREMENTAL RUNTIME
4596                 DMUL A,KLMBCC
4597                 DADD B,EBOXCT(U)
4598                 DSUB B,STEBOX
4599                 DMUL B,KLEBCC
4600                 MOVE A,D
4601                 JRST SCHD2A ]
4602         RPERFC A
4603         DSUB A,STPERF   ;USER RUN TIME IN 80 NS UNITS LEFT 12
4604         DIVI A,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS IN A
4605 SCHD2A:
4606 ] ;KL10P
4607 IFN KS10P, LDB A,[044000,,UPQUAN(U)]    ;GET TIME USED IN 3.9 USEC UNITS
4608 IFN KA10P, LDB A,[022100,,UPQUAN(U)]    ;GET TIME USED IN 4.069 USEC UNITS
4609         ADDM A,USRTM1           ;SYSTEM TOTAL USER RUN TIME
4610         ADDM A,UTRNTM(U)        ;INCREASE RUN TIME
4611         ADDM A,JTMU(U)          ;DECREASE PROCEDURE PRIORITY
4612         MOVEI B,SCCOST(A)       ;ACCOUNT FOR OVERHEAD IN STARTING UP
4613         ADDM B,@UTMPTR(U)       ;DECREASE PROCEDURE TREE PRIORITY
4614 IFE SWPWSP,[
4615         MOVE T,NMPGS(U)         ;USWPRI IS PAGES IN CORE X CPU TIME
4616         SUB T,NSWPGS(U)
4617 ];SWPWSP
4618 IFN SWPWSP,[
4619         HLLO B,UWRKST(U)        ;USWPRI IS LOG(WORKING SET SIZE) X (CPU TIME + IO WAIT TIME)
4620         JFFO B,.+1              ;C GETS 19 - LOG(WORKING SET SIZE + 1/2)
4621         MOVEI T,19.
4622         SUB T,C
4623 ];SWPWSP
4624         IMUL T,A
4625         MOVE Q,UTMPTR(U)
4626         ADDM T,USWPRI(U)        ;CHARGE AGAINST SWAPPINNG PRI
4627         ADDM T,SWRCE-USRRCE(Q)  ;AND FOR TREE
4628         MOVE B,A
4629         LSH B,-7                ;GET RUNTIME IN 512 USEC UNITS
4630         CAILE B,777
4631          MOVEI B,777            ;TO FIT IN SCHEDULER HISTORY TBL
4632         MOVE C,USWST(U)
4633         SKIPE FLSINS(U)
4634          TLNN C,%SWPGW
4635           JRST SCHED8
4636         TRO B,1000              ;BLOCKAGE DUE TO PAGE FAULT
4637 IFN SWPWSP,[
4638         CAML A,LODQNT           ;CHECK FOR LEAVING LOADING STATE
4639 SCHED8:  TLZN C,%SWLOD          ;DUE TO RUNNING FOR MORE THAN LODQNT BETWEEN PAGE FAULTS
4640           JRST .+2              ;OR DUE TO BLOCKAGE FOR REASON OTHER THAN A PAGE FAULT
4641            PUSHJ P,LVLOA0       ;LEAVE LOADING STATE
4642 ];SWPWSP
4643 .ELSE SCHED8:
4644         DPB B,[311200,,@SCHHP]  ;COMPLETE SCHEDULER HISTORY TBL ENTRY
4645         SKIPL Q,RTIMER(U)       ;SKIP UNLESS RUNTIME INT ACTIVE
4646          JRST SEARRT
4647 SCHED3: SKIPGE DLSRCH
4648          JRST SEAREP    ;DELETE SEARCH, EXIT
4649 IFN PAGPRE,[
4650         SKIPE PREEMP            ;PRE-EMPT?
4651          JRST SCHEDP            ;YES, AVOID DOING FULL SCHEDULE
4652 ];PAGPRE
4653 IFN SCHBLN,[
4654         SKIPN SCHMNY    ;IF NOT YET TIME TO DO A FULL SCHEDULE,
4655          JRST SEARL0
4656 SCHED4: HLRZ U,UREALT   ;THEN CHECK LIST OF JOBS SCHEDULED BEFORE
4657         JUMPE U,SEARL0  ;ALWAYS SCHEDULE IF HIGH PRIORITY REAL TIME USER ACTIVE
4658         PUSHJ P,SCHGB   ;POP NEXT JOB OFF LIST
4659         JUMPL U,SEARL0  ;EMPTY
4660         PUSHJ P,SCHACK
4661          JRST SCHED4    ;JOB CEASED TO BE RUNNABLE
4662         AOS NSSKED      ;OK, RUN THIS ONE
4663         JRST SCHED6
4664 ];SCHBLN
4665
4666 SEARRT: SUB Q,A
4667         MOVEM Q,RTIMER(U)
4668         JUMPGE Q,SCHED3
4669         MOVSI T,(%PIRUN)        ;GIVE RUNTIME INTERRUPT
4670         IORM T,PIRQC(U)
4671         JRST SCHED3
4672 \f;
4673 ; HERE TO DO A FULL SCHEDULE (LOOK AT ALL JOBS)
4674 ;
4675
4676 OVHMTR SC2      ;SCHEDULER 2 - SEARCH
4677
4678 SEARL0: AOS NRSKED      ;1 MORE REAL SCHED (ACTUALLY SEARCHES JOBS)
4679         CLEARM TRUMM    ;TOTAL RUNNABLE USER MEM
4680         CLEARM AUSOPG   ;ACTIVE USER SWAPPED OUT PAGES
4681         CLEARM BUMPGS   ;PAGES IN REAL CORE BELONGING TO BLOCKED USERS
4682 IFE SWPWSP,     CLEARM ASBUM    ;PGS IN REAL MEM OCC BY SWAPPED BLOCKED LOSERS
4683         SKIPN SWPOPB
4684          SKIPE SWPOPR
4685           PUSHJ P,SWPON ;SWAP OUT STUFF
4686 IFN NSWPV,[
4687         SKIPGE CIRPSW
4688          PUSHJ P,SWPPIN ;SERVICE SWAPPING REQUESTS FROM OTHER PROCESSORS (DISPLAY)
4689 ]
4690         SETZB U,J       ;JOB BEING SCHEDULED
4691         SETZM RNABLU    ;NUM RUNABLE USERS
4692 IFN SCHBLN,[
4693         SETZM SCHBNJ    ;GOT NO RUNNABLE JOBS YET
4694         SETOM SCHMNY    ;ALLOW ALL THE RUNNABLES WE FIND TO RUN
4695 ];SCHBLN
4696 .ELSE   SETOM I         ;BEST USER SO FAR
4697         MOVNI T,7
4698         MOVEM T,SCHFLG  ;DONT SCHED AGAIN FOR 1/7.5 SEC
4699         JRST SEARL1
4700
4701 ;HERE IF NULL JOB HAD BEEN RUNNING
4702
4703 SCHED9: AOS NNSKED      ;1 MORE TIME NULL JOB WAS RUN
4704 IFN KA10P, LDB C,[022100,,UPQUAN] ;GET TIME NULL JOB RAN IN 4.069 USEC UNITS
4705 IFN KS10P, LDB C,[044000,,UPQUAN] ;GET TIME NULL JOB RAN IN 3.9 USEC UNITS
4706 IFN KL10P,[
4707         CAMN U,MTRJOB   ;IF METERING ONLY NULL JOB, STOP METERS NOW
4708          WRPAE PAEOFF
4709         CAMN U,MTRJOB
4710          CONO MTR,4001  ;TIME-BASE OFF, INTERVAL PIA=1
4711         REBOXC A        ;COMPUTE NULL JOB'S EQUIVALENT RUNTIME IN 4 USEC UNITS
4712         DSUB A,NULEBC
4713         RMBOXC C
4714         DSUB C,NULMBC
4715         DMUL C,KLMBCC   ;CONVERT MBOX COUNT TO EBOX COUNTER UNITS,
4716         DADD A,D        ;ADD TO EBOX COUNT
4717         DMUL A,KLEBCC   ;CONVERT TO 4 USEC UNITS.
4718         SKIPGE MTRUSR
4719          JRST [ RPERFC C        ;PERFORMANCE METER AVAILABLE, USE IT INSTEAD
4720                 DSUB C,NULPRF 
4721                 DIVI C,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS
4722                 JRST .+1 ]
4723 ];KL10P
4724         ADDM C,NULTM1   ;ACCUMULATE TOTAL NULL TIME IN 4 USEC UNITS
4725         SKIPE NPGWTU    ;IF SOMEONE WOULD HAVE BEEN RUNNING IF THEY
4726          ADDM C,LOSTM1  ; WEREN'T WAITING FOR A PAGE, THIS WAS LOST TIME
4727         SKIPN NPGWTU    ;BUT OTHERWISE
4728          ADDM C,IDLTM1  ;IT WAS COMPLETE IDLE TIME
4729         SKIPE NPGWTU    ;NOW COMPUTE % TIME IDLE AND LOST
4730          ADDM C,LOSRCE
4731         SKIPN NPGWTU
4732          ADDM C,IDLRCE
4733 IFN PAGPRE,SKIPN PREEMP ;CHECK FOR PRE-EMPT
4734          JRST SEARL0    ;NOW GO DO A FULL SCHEDULE
4735 IFN PAGPRE,[
4736 SCHEDP: SETZM PREEMP
4737         AOS NPREEL
4738         PUSHJ P,SCHGB   ;U GETS USER TO PRE-EMPT THIS ONE (LAST INTO SCHMNY LIST)
4739         JUMPL U,SCHDP1  ;NO ONE TO PRE-EMPT, RUN SAME USER AGAIN
4740         PUSHJ P,SCHACK  ;MAKE SURE PRE-EMPTING JOB IS RUNNABLE
4741          JRST SCHEDP    ;AFRAID NOT
4742         AOS NPREEM      ;OK, RUN THIS ONE
4743         SKIPL I,USER
4744          PUSHJ P,SCHSB  ;PRE-EMPTED JOB IS STILL A CANDIDATE FOR RUNNING
4745         JRST SCHED6
4746
4747 SCHDP1: SKIPGE U,USER   ;TRY TO RUN SAME USER AGAIN
4748          JRST SCHED1    ;RUN NULL JOB AGAIN
4749         PUSHJ P,SCHACK  ;MAKE SURE THIS JOB IS STILL RUNNABLE (COULD HAVE UFLSED)
4750          JRST SEARL0    ;FOO, BETTER DO A FULL SCHEDULE
4751         JRST SCHED6     ;OK, RUN THIS GUY
4752 ];PAGPRE
4753 \f
4754 ;MAIN SEARCH LOOP, RETURN HERE TO EXAMINE NEXT PROCEDURE
4755 SEARL:  MOVEI U,LUBLK   ;LENGTH OF USER VAR BLOCK
4756         ADDB U,J        ;STEP TO NEXT USER
4757         CAML U,USRHI    ;SKIP IF EXISTS
4758          JRST SEAREN    ;ALL PROCEDURES HAVE BEEN EXAMINED
4759 SEARL1: SKIPE T,USTP(U)
4760          JRST SEARS1    ;EMPTY OR STOPPED JOB SLOT
4761         SKIPE A,PIRQC(U)
4762          JRST SEAR2A    ;FIRST WORD INTERRUPT PENDING
4763 SEARL2: SKIPE B,IFPIR(U)
4764          JRST INTWD2    ;SECOND WORD INTERRUPT PENDING
4765 SEARL3: SKIPN FLSINS(U)
4766          JRST SEARC     ;NOT BLOCKED
4767 SEARL4: MOVE T,EPDL2(U)
4768         XCT FLSINS(U)   ;TEST BLOCKING CONDITION (MAY SKIP ONCE OR TWICE)
4769          JRST SEARLB    ;UNRUNABLE
4770          JRST SEARC     ;LOW PRIORITY UNBLOCK
4771          SKIPA Q,[-1]   ;HIGH PRIORITY UNBLOCK
4772           MOVEI Q,3     ;EXTRA LOW PRIORITY
4773         JRST SEARC2
4774
4775 SEARC:  SETZM Q         ;SET TO NORMAL PRIORITY
4776         PUSHJ P,UPRIVL  ;COMPUTE PRIVELEGE LEVEL (MAY SKIP ONCE OR TWICE)
4777          SOJA Q,SEARC2  ;HIGH-PRIORITY
4778          JRST SEARC2
4779         SKIPGE APRC(U)
4780          ADDI Q,2       ;DISOWNED JOB IN USER MODE
4781 SEARC2: AOS RNABLU      ;ANOTHER RUNABLE USER
4782         MOVE T,TIME
4783         MOVEM T,LUBTM(U)        ;RECORD LAST TIME UNBLOCKED
4784 IFE SWPWSP,[
4785         SKIPGE USWSCD(U)
4786          JRST SEARC7    ;HE'S SWAPPED BLOCKED SO HE DOESNT COUNT
4787 ];SWPWSP
4788         JUMPE U,SEARC4  ;DON'T FIGURE SYSTEM JOB.
4789         MOVSI T,%SWDSO
4790         ANDCAM T,USWST(U)       ;RUNNABLE SO NOT DESIRED OUT
4791         MOVE T,NMPGS(U)
4792         ADDM T,TRUMM    ;TOTAL RUNNABLE USER MEM
4793         MOVE T,NSWPGS(U)
4794         ADDM T,AUSOPG   ;TOTAL PAGES OF RUNNABLE USERS SWAPPED OUT
4795 SEARC4: CAMN U,UREALT           ;IF THIS IS REAL TIME USER IN HIGH PRIORITY
4796          JRST [ MOVEI A,0       ; PHASE, SCHEDULE WITH INFINITE PRIORITY
4797                 JRST SEARP2 ]
4798         SKIPLE T,URTIME(U)      ;NON SKIP IF POSSIBLE REAL TIME BLOCK
4799          TLNN T,1       ;SKIP IF REAL TIME BLOCK UNLESS PI IN PROGRESS
4800           JRST SEARC6
4801         SKIPGE PICLR(U) ;SKIP IF PI IN PROGRESS
4802          JRST SEARL     ;REAL TIME BLOCKED
4803 SEARC6: MOVE A,@UTMPTR(U)       ;GET AMOUNT OF MACHINE TIME USED RECENTLY BY TREE PROCEDURE IS IN
4804         LSH A,3         ;COMBINE WITH TIME FOR JUST THIS PROCEDURE
4805         ADD A,JTMU(U)   ;TO GET PRIORITY FIGURE (SMALLER NUMBER IS HIGHER PRI)
4806         LSH A,(Q)       ;ADJUST PRIORITY BY MULTIPLICATIVE FACTOR IN Q
4807 ;THE EFFECT OF THIS PRIORITY COMPUTATION IS THAT JOBS IN THE SAME TREE
4808 ;ARE COMPARED BY JTMU, WHILE JOBS IN DIFFERENT TREES ARE COMPARED MAINLY
4809 ;BY USRRCE, ALTHOUGH A MUCH SMALLER JTMU CAN OVERRIDE A SOMEWHAT LARGER
4810 ;USRRCE.  THIS IS SOMEWHAT DIFFERENT THAN THE COMPUTATION THAT WAS HERE
4811 ;BEFORE MAY 1980, BUT THAT COMPUTATION'S RESULTS EVEN DEPENDED ON THE
4812 ;ORDER THAT JOBS HAPPENED TO BE INSPECTED, AND ALLOWED A TREE WITH
4813 ;A LARGE NUMBER OF RUNNING JOBS TO GET AN UNFAIR SHARE OF THE MACHINE.
4814 SEARP2:
4815 IFN SCHBLN, PUSHJ P,SCHSJB      ;INSERT JOB INTO PRIORITY-SORTED LIST
4816 .ELSE [ JUMPL I,SEARP5
4817         CAML A,U0P      ;SKIP IF IS BETTER THAN BEST SO FAR
4818          JRST SEARL
4819 SEARP5: MOVEM U,I       ;I GETS NEW BEST USER SO FAR
4820         MOVEM A,U0P     ;U0P GETS PRIORITY OF THAT USER
4821 ];SCHBLN
4822         JRST SEARL      ;TRY NEXT
4823
4824 IFE SWPWSP,[
4825 SEARC7: MOVE T,NMPGS(U) ;RUNNABLE AND SWAPPED BLOCKED
4826         SUB T,NSWPGS(U)
4827         SOSL T
4828          ADDM T,ASBUM
4829         JRST SEARC4
4830 ];SWPWSP
4831
4832 ;JOB IS NOT RUNNABLE
4833 SEARLB: JUMPE U,SEARL   ;DON'T FIGURE SYSTEM JOB
4834         MOVE T,USWST(U)
4835 IFE SWPWSP,     SKIPL USWSCD(U) ;IF LOCKED OUT, DONT COUNT
4836 IFN SWPWSP,     TLNN T,%SWSB
4837          TLNN T,%SWPGW
4838           JRST SEARB1   ;NOT WAITING FOR PAGE
4839         MOVE T,NMPGS(U) ;USER IS WAITING FOR PAGE SO COUNT FOR ACTIVE
4840         ADDM T,TRUMM
4841         MOVE T,NSWPGS(U)
4842         ADDM T,AUSOPG
4843         JRST SEARL
4844
4845 SEARB1: TLNE T,%SWBEM
4846          JRST SEARL     ;HAVE MADE BEST SWAPOUT EFFORT
4847         MOVE T,NMPGS(U)
4848         SUB T,NSWPGS(U)
4849         SOSL T
4850          ADDM T,BUMPGS  ;REAL MEM PGS BELONGING TO BLOCKED USERS
4851         JRST SEARL
4852
4853 SEARS1: SKIPN UNAME(U)
4854          JRST SEARL
4855         MOVE T,USWST(U) ;GUY STOPPED, DOES HE HAVE PAGES IN REAL MEM?
4856         TLNE T,%SWBEM
4857          JRST SEARL     ;HAVE TRIED BEST EFFORT TO SWAP OUT
4858         MOVE T,NMPGS(U)
4859         SUB T,NSWPGS(U)
4860         ADDM T,BUMPGS
4861         JRST SEARL
4862
4863 IFN SCHBLN,[
4864 ;TEST ALL THINGS THAT MAKE A PERSON UNRUNNABLE, OR AT LEAST
4865 ;REQUIRE THE ATTENTION OF THE SCHEDULER
4866 ;SKIP-RETURN IF JOB IS RUNNABLE, BASHES T, A
4867 SCHACK: CAMGE U,USRHI           ;NON-EXISTENT
4868          SKIPE USTP(U)          ;STOPPED
4869           POPJ P,
4870         SKIPE T,PIRQC(U)
4871          JRST [ TDNE T,[BADBTS]
4872                  JRST SCHACI    ;NON-DEFERRABLE
4873                 SKIPN PICLR(U)
4874                  JRST .+3       ;ALL INTERRUPTS DEFERRED
4875                 ANDCM T,IDF1(U)
4876                 TDNE T,MSKST(U)
4877                  JRST SCHACI
4878                 JRST .+1 ]
4879         SKIPE T,IFPIR(U)
4880          JRST [ SKIPN PICLR(U)
4881                  JRST .+1       ;ALL INTERRUPTS DEFERRED
4882                 ANDCM T,IDF2(U)
4883                 TDNE T,MSKST2(U)
4884                  JRST SCHACI
4885                 JRST .+1 ]
4886         SKIPE FLSINS(U)         ;FLUSH INSTRUCTION NOT SATISFIED
4887          JRST [ MOVE T,EPDL2(U)
4888                 XCT FLSINS(U)   ;IT MAY BE SATISFIED BUT NOT CLEARED YET
4889                  POPJ P,        ;STILL BLOCKED
4890                 JRST .+1        ;CAN SKIP VARIOUS RANDOM NUMBERS OF TIMES
4891                 JRST .+1
4892                 JRST .+1 ]
4893 SCHAC1: SKIPLE T,URTIME(U)      ;REAL-TIME BLOCKED
4894          TLNN T,1
4895           SKIPA
4896            SKIPLE PICLR(U)
4897             AOS (P)
4898         POPJ P,
4899
4900 SCHACI: MOVE T,UPC(U)           ;TRYING TO INTERRUPT, NEEDS SCHEDULER
4901         TLNN T,%PCUSR           ;ATTENTION UNLESS RUNNING IN EXEC MODE
4902          SKIPE FLSINS(U)        ;IN WHICH CASE NEED TO LET IT FINISH
4903           POPJ P,               ;SO IT CAN BE PCLSRED
4904         JRST SCHAC1
4905
4906 ;PUT JOB IN U, PRIORITY IN A, INTO STACK IN PRIORITY ORDER.  BASH T,TT,B.
4907 SCHSJB: SKIPG T,SCHBNJ  ;FIRST SEARCH FOR SLOT IN WHICH TO INSERT
4908          JRST SCHSJ1    ;BUFFER NOW EMPTY, SKIP SEARCH
4909         MOVE TT,T
4910         CAML A,SCHBPR-1(T)
4911          SOJG T,.-1     ;LOOP TERMINATES WITH T SLOT WHERE IT BELONGS
4912         CAIL TT,SCHBLN
4913          SOJA T,SCHSJ3  ;BUFFER FULL, WORK DIFFERENTLY
4914 SCHSJ0: MOVE B,SCHBTB-1(TT)     ;MOVE STUFF UP TO ADD ANOTHER ENTRY
4915         MOVEM B,SCHBTB(TT)
4916         MOVE B,SCHBPR-1(TT)
4917         MOVEM B,SCHBPR(TT)
4918         CAILE TT,1(T)
4919          SOJA TT,SCHSJ0
4920 SCHSJ1: AOS SCHBNJ
4921 SCHSJ5: MOVEM U,SCHBTB(T)
4922         MOVEM A,SCHBPR(T)
4923         POPJ P,
4924
4925 SCHSJ3: AOS NSCHOV      ;BUFFER NOT BIG ENOUGH FOR ALL RUNNABLE JOBS
4926         JUMPL T,CPOPJ   ;THIS JOB IS LOWEST PRIORITY, FORGET IT
4927         JUMPE T,SCHSJ5  ;THIS JOB IS SECOND-LOWEST PRIORITY, FORGET LOWEST
4928         MOVE TT,[SCHBTB+1,,SCHBTB]
4929         BLT TT,SCHBTB-1(T)      ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4930         MOVE TT,[SCHBPR+1,,SCHBPR]
4931         BLT TT,SCHBPR-1(T)
4932         JRST SCHSJ5
4933
4934 ;PUSH JOB IN I ONTO STACK OF RUNNABLE JOBS
4935 SCHSB:  AOS T,SCHBNJ
4936         CAILE T,SCHBLN
4937          JRST [ SOS SCHBNJ      ;BUFFER OVERFLOW
4938                 AOS NSCHOV      ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4939                 MOVE T,[SCHBTB+1,,SCHBTB]
4940                 BLT T,SCHBTB+SCHBLN-2
4941                 MOVEM I,SCHBTB+SCHBLN-1
4942                 POPJ P, ]
4943         MOVEM I,SCHBTB-1(T)
4944         POPJ P,
4945
4946 ;POP STACK OF RUNNABLE JOBS INTO U (RETURNS -1 IF STACK EMPTY)
4947 SCHGB:  SOSL U,SCHBNJ
4948          SKIPA U,SCHBTB(U)
4949           SETZM SCHBNJ  ;BUFFER EMPTY, U HAS -1
4950         POPJ P,
4951 ];SCHBLN
4952 \f
4953 .ALSKF==0
4954 DEFINE ALTSKP A
4955 IFE .ALSKF,[
4956         DEFINE .ALSKS
4957 A TERMIN
4958 ]
4959 IFN .ALSKF,[
4960         CAME U,.ALSKS
4961          CAMN U,A
4962           POPJ P,
4963 ]
4964 .ALSKF==.ALSKF#1
4965 TERMIN
4966
4967 ;DETERMINES USER PRIVILEGE LEVEL FOR SCHEDULING AND SWAPPING
4968 UPRIVL: SKIPN RPCL(U)   ;BEING RPCLSR'ED?
4969          CAMN U,UMASTER ;MASTER?
4970           POPJ P,       ;HIGHLY PRIVILEGED
4971         AOS (P)         ;SKIP AT LEAST ONCE
4972 IFN 340P\E.SP,  ALTSKP DISUSR
4973 IFN VIDP,       ALTSKP NVDUSR
4974 IFN TABP,       ALTSKP TABUSR
4975 IFN ARMP,       ALTSKP ARMUSR
4976 IFN LPTP,       ALTSKP LPTUSR
4977 IFG LPTP-1,     ALTSKP OLPUSR
4978 IFN PLTP,       ALTSKP PLTUSR
4979 IFN .ALSKF,[
4980         CAMN U,.ALSKS
4981          POPJ P,        ;DON'T FIGURE DISOWNED IF USING ABOVE DEVICES
4982 ]
4983         MOVE T,UPC(U)
4984         TLNE T,%PCUSR
4985          AOS (P)        ;SKIP TWICE
4986         POPJ P,
4987 \f
4988 OVHMTR SC3      ;SCHEDULER 3 - EXIT
4989
4990 ;SEARCH END (EXIT)
4991 SEAREN:
4992 IFE SWPWSP,[
4993         SKIPE NUSWB
4994          PUSHJ P,SSWC1  ;SEE IF ENUF CORE TO UNBLOCK A SWAPPED BLOCKED LOSER
4995 ];SWPWSP
4996 IFE SCHBLN,[
4997         SKIPGE U,I      ;SKIP IF NON-NULL JOB BEST
4998          JRST SCHED1
4999         AOS NSCHDU
5000 ];SCHBLN
5001 IFN SCHBLN,[
5002         MOVE T,SCHBNJ
5003         ADDM T,NSCHDU
5004         PUSHJ P,SCHGB   ;GET HIGHEST-PRIORITY JOB
5005         JUMPL U,SCHED1  ;NONE, RUN NULL JOB
5006 ];SCHBLN
5007 SCHED6: SKIPE FLSINS(U)
5008          JRST SCHED5
5009 SCHED1: EXCH U,USER
5010         JUMPL U,SCHDN   ;JUMP IF SWITCHING FROM NULL JOB
5011         CAMN U,USER     ;SKIP UNLESS RUNNING SAME JOB AGAIN
5012          JRST SEAREP    ;JUMP ON SAME JOB
5013 IFN KL10P,[
5014         CAMN U,MTRJOB           ;IF LEAVING JOB BEING METERED, STOP METER AND
5015          WRPAE PAEOFF
5016         CAMN U,MTRJOB
5017          CONO MTR,4001          ;TIME-BASE OFF, INTERVAL PIA=1
5018 ]
5019 ;SWAP OUT THE OLD JOB'S CONSOLE REGISTER, AND CLEAR ITS BLINKER.
5020 IFN N11TYS,[
5021         SKIPGE TT11P
5022          SKIPE TEN11F
5023           JRST SSTVR1           ;DONT HACK 11
5024         SKIPL TVCREG(U)         ;DO WE WANT TO SAVE TV CONSOLE REG FOR THIS GUY?
5025          SKIPN T,400000+TTR10*2000 ;0 IS NOT A (VERY) LEGITIMATE CONSOLE REG FCN
5026           JRST SSTVR2           ;SO ASSUME 11 STOPPED, DONT CLOBBER PREV THING
5027         MOVEM T,TVCREG(U)
5028 SSTVR2: SKIPGE T,TVVBN(U)       ;DID WE SET RUNNING BLINKER FOR THIS GUY?
5029          JRST SSTVR1            ;NO
5030         MOVEM T,400000+TTR10*2000       ;SET TO VIDEO BUFFER WE SET IT IN
5031         MOVE A,TVBLAD           ;ADDR IN VIDEO BUFFER WE FLASHED
5032         CLEARM 400000+TTR0*2000(A)      ;CLEAR IT
5033 SSTVR1:]
5034 IFN KA10P,[
5035         MOVE T,40
5036         MOVEM T,SV40(U) ;SAVE LAST UUO EXECUTED FOR THIS USER
5037         MOVE T,UPC(U)   ;IF USER HAS JUST TRAPPED TO 60,
5038         TLNE T,%PCUSR
5039          JRST SCHDN
5040         ANDI T,-1
5041         CAIL T,60H0
5042          CAILE T,60HE
5043           JRST SCHDN
5044         MOVNI T,60H0-UUOH0
5045         ADDM T,UPC(U)   ;THEN MOVE HIM INTO UUOH INSTEAD
5046         MOVE T,60       ;AND MOVE 60H'S VARIABLES INTO UUOH'S VARS
5047         MOVEM T,SV40(U) ;(THAT'S ALL 60H DOES ANYWAY).
5048         MOVE T,60H
5049         MOVEM T,SUUOH(U)
5050 ] ;KA10P
5051 ;DROPS THROUGH.
5052 \f;DROPS IN
5053 ;COME HERE TO SET UP A JOB THAT WASN'T ALREADY RUNNING.
5054
5055 SCHDN:  MOVE A,U
5056         SKIPGE U,USER
5057          JRST SCHDN2    ;JUMP IF SWITCHING TO NULL JOB
5058 IFN KA10P,[
5059         MOVE T,SV40(U)  ;LOAD NEW KRUFT
5060         MOVEM T,40
5061 ] ;KA10P
5062 IFN N11TYS,[
5063         SKIPGE TT11P    ;DONT HACK 11 IF ITS DOWN (MOSTLY IN CASE ITS BEING HACKED
5064                         ;HARDWARILY
5065          SKIPE TEN11F
5066           JRST SLTVR1   ;DONT HACK 11
5067         SKIPGE T,TVVBN(U)       ;BLINK RUNNING FROB?
5068          JRST SLTVR2
5069         MOVEM T,400000+TTR10*2000
5070         MOVE A,TVBLAD
5071         MOVNI T,20
5072         MOVEM T,400000+TTR0*2000(A)
5073         SKIPA T,TVVBN(U)
5074 SLTVR2:  MOVSI T,12_<8+4+16.-18.>       ;ALU NOP
5075         SKIPL TVCREG(U)
5076          MOVE T,TVCREG(U)
5077         MOVEM T,400000+TTR10*2000
5078 SLTVR1:]        
5079 IFN KL10P,[
5080         CAMN U,MTRJOB   ;IF THIS JOB'S BEING METERED, TURN ON METER AND TIME BASE.
5081          WRPAE PAEON
5082         CAMN U,MTRJOB
5083          CONO MTR,2001  ;TIME-BASE ON, INTERVAL PIA=1
5084 ];KL10P
5085         SOS NRESKED     ;COMPENSATE FOR EXTRA AOS ON NEXT PAGE
5086
5087 ;DROPS THROUGH
5088 \f;DROPS IN
5089 ;COME HERE TO START UP A JOB EVEN IF IT WAS ALREADY RUNNING BEFORE THIS SCHEDULE.
5090
5091 SEAREP: AOS NRESKED
5092 IFN KA10P,[
5093         HRLOI T,1
5094         ANDCAM T,UPQUAN(U)      ;RESET QUANTUM TIMER
5095 ] ;KA10P
5096 IFN KL10P,[
5097         RPERFC STPERF           ;SAVE PERF METERS FOR LATER USE
5098         DMOVE A,EBOXCT(U)       ;COMPUTING RUN TIME EFFECTIVELY RESETS
5099         DMOVEM A,STEBOX         ;QUANTUM TIMER 
5100         DMOVE A,MBOXCT(U)
5101         DMOVEM A,STMBOX
5102 ] ;KL10P
5103 IFN KS10P, SETZM UPQUAN(U)      ;RESET QUANTUM TIMER
5104         PUSHJ P,PGLDU
5105         MOVN A,U
5106         IDIVI A,LUBLK
5107         SKIPE B
5108          BUG
5109 IFE KS10P,[     ; KS has no lights.
5110         MOVSI B,400000
5111         LSH B,(A)
5112         SKIPN MIPGDS
5113          DATAO LIGHTS,B ;LIGHTS HAVE ONE BIT, SHOWING WHICH JOB IS RUNNING.
5114 ] ;IFE KS10P
5115         MOVN B,A        ;GET JOB'S NUMBER IN B
5116         MOVE T,UPC(U)   ;USER'S PC WORD
5117         MOVEM T,CLKBRK
5118         AOS A,SCHHP     ;SET UP SCHEDULER HISTORY TBL
5119         CAIL A,SCHHB+SSCHDB
5120          MOVEI A,SCHHB
5121         MOVEM A,SCHHP
5122         HRRM T,(A)      ;STORE PC
5123         TLNN T,%PCUSR
5124          TRO B,400000
5125         HRLM B,(A)      ;STORE USER INDEX AND USER BIT
5126         MOVSI T,UUO(U)
5127         HRRI T,UEXIT
5128         BLT T,UEXND-1   ;BLT IN UEXIT BLOCK
5129 IFN KL10P,[
5130         MOVE T,ULSPBR(U)
5131         AC7CTX
5132         XCTR XW,[HRRZM T,13]    ;GCSTBR
5133         XCTR XW,[HLRZM T,14]    ;STBR
5134 ] ;KL10P                ;CONTEXT WILL BE RESTORED AT CLKB5 BELOW
5135 IFN KA10P, CONO @APRC(U)
5136
5137 ;
5138 ; THIS IS THE ONE PLACE WHERE CLOCK LEVEL RETURNS TO THE USER JOB
5139 ;
5140 CLKB5:
5141 IFE KA10P, DATAO PAG,@CLCXSV    ;RESTORE CONTEXT
5142         MOVE U,USER
5143         MOVSI U,AC0S(U)         ;RESTORE AC BLOCK 0
5144         BLT U,U
5145         JRST 12,@CLKBRK         ;RESTORE PC, FLAGS, AND PI
5146 \f
5147 ;HERE WHEN STARTING A USER WHO HAD BEEN FLSING
5148
5149 SCHED5: MOVE T,USWST(U)
5150 IFN SWPWSP,[
5151         TLNN T,%SWPGW   ;PAGE WAITS DON'T COUNT AS BLOCKING
5152          TLNN T,%SWOUT  ;IF SWAPPED-OUT, UNBLOCKING BUMPS SWAP-IN PRIORITY
5153           JRST SCHD5A
5154         MOVE TT,USWPRI(U)       ; (A SOMEWHAT QUESTIONABLE FEATURE)
5155         LSH TT,-1
5156         MOVEM TT,USWPRI(U)
5157 SCHD5A:
5158 ];SWPWSP
5159         TLNE T,%SWPCL
5160          JRST SCHED7            ;JUMP IF PAGES SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5161         TLNE T,%SWPGW
5162          SOS NPGWTU             ;NOT WAITING FOR A PAGE ANY MORE
5163         MOVSI T,%SWPGW+%SWRUN+%SWINT    ;NOT WAITING FOR PAGE,NOT UNBLOCKED SWAPOUT,
5164         ANDCAM T,USWST(U)       ;NOT WAITING FOR INTERRUPT PAGE
5165         SETZM FLSINS(U)         ;NOT WAITING FOR ANYTHING
5166         JRST SCHED1
5167
5168 SCHED7: PUSHJ P,PCLSR           ;PAGES WERE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5169          BUG                    ;SO PCLSR JOB SINCE IT MIGHT BE COUNTING ON THOSE PAGES
5170         JRST SCHED1             ;PCLSR MUST SUCCEED.  JOB WAS BLOCKED WITH EMPTY LSWPR.
5171
5172
5173 ;COME HERE TO RUN THE NULL JOB.
5174
5175 SCHDN2: SKIPL A         ;WERE RUNNING IT ALREADY?
5176          AOS NNULBK     ;NO, INCREMENT # CONSECUTIVE BLOCKS OF NULLTIME.
5177         MOVSI T,(JFCL)
5178         MOVEM T,CLUSAV  ;AVOID LOSSAGE AT CLKBRK+1 NEXT CLOCK INT
5179 IFE KA10P, MOVEM T,CLCXSV
5180 IFE KS10P,[     ; KS has no lights.
5181         SKIPN MIPGDS
5182          DATAO LIGHTS,[0] ;LOAD LIGHTS WITH JOB RUNNING (NONE)
5183 ] ;IFE KS10P
5184 IFN KA10P,[
5185         HRLOI T,1
5186         ANDCAM T,UPQUAN
5187 ] ;KA10P
5188 IFN KL10P,[
5189         CAMN U,MTRJOB
5190          WRPAE PAEON
5191         CAMN U,MTRJOB
5192          CONO MTR,2001  ;TIME-BASE ON, INTERVAL PIA=1
5193         REBOXC NULEBC
5194         RMBOXC NULMBC
5195         RPERFC NULPRF
5196 ] ;KL10P
5197 IFN KS10P, SETZM UPQUAN
5198         CLEARM SCHFLG   ;RESCHEDULE ON NEXT CLK INT
5199         LPMR UPGML
5200         JRST 12,@[%PSPCU,,NULJOB]       ;DISMISS INT AND GO TO NULL JOB
5201
5202 NULJOB: MOVSI (JRST 4,)
5203         MOVEI 17,1              ;SET ACS 0 TO 16 TO JRST 4,0
5204         BLT 17,16               ;TO CATCH SPURIOUS TRANFERS TO ACS
5205         MOVE 17,[AOJA 17]       ;RUNS IN ACS TO FREE MEMORY FOR OTHER PROCESSORS
5206         JRST 2,@[%PCUSR,,17]    ;RUNS IN USER MODE FOR SAKE OF RANDOMNESS
5207 \f
5208 IFE SWPWSP,[
5209 OVHMTR SC4      ;SCHEDULER 4 - UNSWAPBLOCKER
5210
5211 ;SEE IF THERE IS ENOUGH CORE TO UNBLOCK A SWAP-BLOCKED JOB.
5212 SSWC1:  SKIPGE U,BUSR
5213          POPJ P,
5214         MOVN T,NSWPGS(U)
5215         ADD T,MEMFR
5216         SUB T,NCBCOM
5217         ADD T,SOLNG
5218         SUB T,SILNG
5219         SUB T,AUSOPG
5220         ADD T,ASBUM
5221         ADD T,BUMPGS
5222         CAIGE T,20
5223          POPJ P,                ;THERE ISN'T ENOUGH ROOM.
5224         MOVSI T,400000
5225         ANDCAM T,USWSCD(U)      ;CLEAR SWAP BLOCKED
5226         SETOM BUSR
5227         MOVE T,[-1_-1]
5228         MOVEM D,BUSIZ   ;SIZE OF SMALLEST SWAP-BLOCKED USER.
5229         AOS NTSBUU
5230         SOSN NUSWB
5231          JRST SSWSC3
5232         MOVEI U,0
5233         MOVNI R,1
5234         MOVSI T,200000
5235 SSWSC4: CAML U,USRHI
5236          JRST SSWSC6
5237         SKIPGE USWSCD(U)
5238          SKIPN UNAME(U)
5239           JRST SSWSC5
5240         CAMGE T,NMPGS(U)
5241          JRST SSWSC5
5242         MOVE R,U
5243         MOVE T,NMPGS(U)
5244 SSWSC5: ADDI U,LUBLK
5245         JRST SSWSC4
5246
5247 SSWSC6: MOVEM R,BUSR    ;STORE NEW SMALLEST SWAPPED BLOCKED LOSER
5248         SKIPGE R
5249          MOVEI T,0
5250         MOVEM T,BUSIZ
5251 SSWSC3: JUMPL I,SEARL0  ;MAYBE CAN RUN THIS GUY NOW
5252         POPJ P,
5253 ];SWPWSP
5254 \f
5255 OVHMTR SWU      ;SWAP USER
5256
5257 ;SWAP OUT N PAGES (N IS IN SWPOPR)
5258 SWPON:  MOVE C,SOLNG
5259         SKIPGE CIRPSW           ;CAN'T DO ANYTHING WITHOUT CIRPSW
5260          CAILE C,2*NQS
5261           POPJ P,               ;ALREADY STUFF ON WAY OUT
5262         SKIPL U,PSWOUS          ;SEE IF CONTINUING TO SWAP OUT A USER
5263          CAML U,USRHI
5264           JRST SWPON1
5265         MOVE C,PSWCLS
5266         SKIPE LSWPR(U)          ;PREFER NOT TO SWAP OUT
5267          JRST SWPON1            ;USER WHO HAS SWITCHES LOCKED
5268         SKIPE UNAME(U)          ;SKIP ON USER KILLED
5269          SKIPL USWST(U) .SEE %SWDSO     ;OR NOT DESIRED OUT ANY MORE
5270 SWPON1:   PUSHJ P,SWPON2        ;FIND NEW USER TO FLUSH
5271         JUMPL U,SWUP8
5272 SWPON6: MOVSI A,%SWDSO          ;THIS USER NOW DESIRED OUT
5273         IORM A,USWST(U)
5274         MOVEM C,PSWCLS
5275         MOVEM U,PSWOUS
5276         MOVE T,UPC(U)
5277         TLNE T,%PCUSR
5278          JRST SWPU1             ;OK TO SWAP USER
5279         SKIPN LSWPR(U)          ;PCLSR IF HAS LOCKS, OR AT JBFLS,
5280          SKIPN FLSINS(U)        ;OR IF NOT BLOCKED
5281           JRST SWPON8
5282         MOVSI T,%SWPCL          ;OTHERWISE, DON'T PCLSR NOW, BUT
5283         IORM T,USWST(U)         ;WHEN IT UNBLOCKS
5284         JRST SWPU1              ;AND START SWAPPING OUT ITS PAGES
5285
5286 SWPON8: PUSHJ P,PCLSR           ;GET OUT OF SYS BEFORE SWAPPING OUT
5287          POPJ P,
5288         JRST SWPU1
5289
5290 ;FOUND NO USER TO SWAP OUT
5291 SWUP8:  SKIPE NLOOSP
5292          JRST SWOL1     ;SWAP OUT SOME LOOSE PAGES
5293         AOSE SBEFLG     ;HAVE WE COME HERE TWICE?
5294          JRST SWUP6     ;YES, GIVE UP
5295         MOVSI B,%SWBEM  ;NO, TURN OFF EVERYONE'S BEST EFFORT BIT
5296         MOVEI J,2*LUBLK ;AND LOOK AT EVERYONE AGAIN SINCE WE'RE DESPERATE
5297 SWUP9:  CAML J,USRHI    ;TO FIND A PAGE TO SWAP OUT
5298          JRST SWUP7
5299         ANDCAM B,USWST(J)
5300         ADDI J,LUBLK
5301         JRST SWUP9
5302
5303 SWUP7:  PUSHJ P,SWPON2          ;HAVING TURNED OFF %SWBEM, FIND A USER TO SWAP OUT
5304         JUMPG U,SWPON6          ;GO SOMEONE, GO DO
5305 SWUP6:  SETZM SWPOPR            ;CAN'T FIND ANYONE TO SWAP OUT, GIVE UP
5306         SETOM PSWOUS
5307         POPJ P,
5308
5309 SWOL1:  SKIPN A,FLOOSP          ;SWAP OUT SOME LOOSE PAGES
5310          BUG                    ;NLOOSP WAS TOO HIGH?
5311         MOVNI C,1
5312         PUSHJ P,SWPOPG
5313          BUG                    ;CIRPSW, EXEC PAGE COUNT ALREADY CHECKED
5314         SETOM SBEFLG            ;WE FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5315         MOVE C,SOLNG
5316         SOSLE SWPOPR            ;ENOUGH
5317          CAIL C,20.             ;ENOUGH FOR NOW
5318           POPJ P,
5319         SKIPE NLOOSP            ;SWAP OUT MORE PAGES
5320          JRST SWOL1
5321         JRST SWPON
5322 \f;START SWAPPING OUT THIS USER'S PAGES
5323 SWPU1:  AOS NSOUSR
5324         MOVSI A,%SWRUN
5325         CAILE C,1               ;CLASS
5326          IORM A,USWST(U)        ;INDICATE USER WAS RUNNABLE AT TIME OF SWAP OUT
5327 IFE SWPWSP,[
5328         SETZM SWUPC
5329         SKIPN ENUPC
5330          JRST SWPU1B
5331         MOVE T,UPC(U)           ;CALCULATE WHAT PAGE HIS PC IS ON
5332         LDB C,[121000,,UPC(U)]
5333         ROT C,-1
5334         ADDI C,UPGMP(U)
5335         MOVE A,[222200,,(C)]
5336         SKIPGE C
5337          IBP A
5338         LDB A,A
5339         TRNN A,600000
5340          SETZM A
5341         ANDI A,PMRCM            ;MASK TO REAL CORE ADR BITS
5342         SKIPN USTP(U)           ;ONLY IF RUNNING
5343          TLNN T,%PCUSR          ;AND IN USR MODE
5344           CAIA
5345            MOVEM A,SWUPC        ;THEN DON'T ALLOW UPC PAGE TO BE SWAPPED OUT
5346 SWPU1B:
5347 ];SWPWSP
5348         MOVE B,PSWLC
5349         AOSE PSWSFL
5350          JRST SWPU3A            ;PICK UP FROM WHERE LEFT OFF
5351 IFE SWPWSP,[
5352         SKIPE ENPZRO
5353          SETOM SWPP0F
5354 ];SWPWSP
5355         MOVEI C,UPGMP(U)        ;ADDRESS OF PAGE MAP (START FROM PG 0)
5356         MOVEI J,UPGCP(U)
5357         HRLI C,442200           ;CNVRT TO BYTE PNTR TO MAP
5358         HRLI J,442200
5359         MOVEM C,SWPMBP
5360         MOVEM J,SWPCBP
5361         LDB B,[121100,,HUSRAD(U)]       ;DO ALL PAGES THAT MIGHT EXIST
5362 SWPU2:  ILDB D,SWPCBP           ;CIRC PNTR ENTRY
5363         ILDB A,SWPMBP           ;PAGE MAP ENTRY
5364         AOS NSOPGS
5365         JUMPE D,SWPU3A          ;DOESN'T HAVE PAGE
5366 IFE SWPWSP,[
5367         AOSN SWPP0F
5368          SKIPE USTP(U)          ;DON'T SWAP OUT PAGE 0 IF NOT STOPPED
5369           CAIN D,-1             ;PAGE IS ABSOLUTE
5370            JRST SWPU3A
5371         TRNN A,600000           ;NO ACCESS
5372          JRST SWPU3A
5373         SKIPN ENAGE
5374          JRST SWPU2A
5375         TRON A,PMAGEM           ;HAS PAGE BEEN REFERENCED? (AGE MASK)
5376          JRST [ DPB A,SWPMBP
5377                 AOS NAGEAB
5378                 JRST SWPU3A ]
5379 SWPU2A: ANDI A,PMRCM            ;MASK TO REAL CORE PAGE #
5380         CAMN A,SWUPC            ;DON'T SWAP OUT PAGE WHERE PC IS IF RUNNING
5381          JRST SWPU3A
5382 ];SWPWSP
5383 IFN SWPWSP,[                    ;I DOUBT THAT MOST OF THAT NONSENSE DOES ANYTHING
5384         TRNE A,600000           ;NO ACCESS
5385          CAIN D,-1              ;OR PAGE IS ABSOLUTE
5386           JRST SWPU3A           ;MEANS DON'T SWAP OUT
5387         ANDI A,PMRCM            ;MASK TO REAL CORE PAGE #
5388 ];SWPWSP
5389         HRRZ D,MMSWP(A)         ;NUMBER OF USERS WHO HAVE THIS PAGE MAPPED
5390         SOJN D,SWPU4            ;PAGE IS SHARED
5391 SWPU6:  MOVEM B,PSWLC           ;SAVE HOW FAR SWAP-OUT SCAN GOT
5392         MOVE C,PSWOUS
5393         PUSHJ P,SWPOPG          ;SWAP OUT THIS PAGE
5394          JRST SWPU3
5395         SETOM SBEFLG            ;FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5396         MOVE C,SOLNG
5397         SOSLE SWPOPR            ;ENOUGH
5398          CAIL C,20.             ;ENOUGH FOR NOW
5399           POPJ P,
5400 SWPU3:  MOVE B,PSWLC
5401         MOVE U,PSWOUS
5402 SWPU3A: SOJG B,SWPU2
5403         SETOM PSWOUS
5404         MOVSI B,%SWBEM
5405         IORM B,USWST(U)         ;SET BEST EFFORT BIT
5406 IFN SWPWSP,[
5407         SKIPL APRC(U)           ;IF DISOWNED,
5408          JRST SWPON
5409         MOVE B,USWPRI(U)        ;DECREASE PRIORITY TO COME BACK IN
5410         LSH B,2
5411         MOVEM B,USWPRI(U)
5412 ];SWPWSP
5413         JRST SWPON
5414 \f;TRYING TO SWAP OUT A SHARED PAGE
5415 SWPU4:  MOVEM B,PSWLC           ;SAVE HOW FAR SWAP-OUT SCAN GOT
5416         AOSE CIRPSW
5417          BUG            ;CIRPSW LOCKED IN SWAP OUT CODE
5418         MOVE C,[2200,,MEMPNT(A)]
5419         MOVEM A,SWOBK
5420         PUSHJ P,UCPRL
5421             400000,,SWPU5       ;CONSULT THE OTHER USERS OF THE PAGE
5422         SETOM CIRPSW
5423         MOVE A,SWOBK
5424         JRST SWPU6      ;OK TO SWAP IT OUT
5425
5426 SWPU5:  SKIPGE TT,USWST(U) .SEE %SWDSO
5427          POPJ P,        ;USER DESIRED OUT, CAN'T HOLD PAGE IN
5428 IFN SWPWSP,     TLNN TT,%SWLOD  ;IF USER IS LOADING, HOLDS PAGE IN
5429          SKIPN AGERTE
5430           JRST SWPU5A
5431         MOVE TT,I
5432         LSH TT,-1
5433         ADDI TT,UPGMP(U)
5434         HRLI TT,2200
5435         TRNN I,1
5436          HRLI TT,222200
5437         LDB TT,TT
5438         TRNE TT,600000  ;SKIP IF NO ACCESS, IGNORE AGE
5439          TRNE TT,PMAGEM ;HAS SHE USED THIS PAGE?
5440           POPJ P,       ;NO, CAN'T HOLD PAGE IN
5441 SWPU5A: SUB P,[4,,4]
5442         SETOM CIRPSW    ;SHARED W/USER WHO IS WANTED IN CORE
5443         AOS NSHRAB      ;SO DON'T SWAP IT OUT
5444         JRST SWPU3
5445
5446 ;COME HERE WITH BEST USER TO SWAP OUT IN U, CLASS IN C
5447 SWPONX: JUMPL U,CPOPJ   ;NO SWAP OUTTABLE LOSER
5448 IFN SWPWSP,[
5449         CAILE C,1
5450          SKIPN NLOOSP
5451           JRST SWPNX2
5452         SETO U,         ;WOULD RATHER SWAP OUT LOOSE PAGES
5453         POPJ P,
5454
5455 SWPNX2: MOVSI T,%SWOUT  ;MAKE USER SWAPPED OUT
5456         TDNE T,USWST(U)
5457          JRST SWPNX3    ;ALREADY IS?
5458         IORM T,USWST(U)
5459         MOVE T,UWRKST(U)
5460         MOVEM T,USVWRK(U)
5461         MOVE T,TIME
5462         MOVEM T,USWTIM(U)       ;DROPS INTO SWPNX3
5463 ];SWPWSP
5464 IFE SWPWSP,[
5465         CAILE C,1
5466          SKIPN NLOOSP
5467           SKIPA B,USWST(U)
5468            JRST [ SETO U, ? POPJ P, ]   ;WOULD RATHER SWAP OUT LOOSE PAGES
5469         SKIPGE USWSCD(U)
5470          JRST SWPNX3    ;HE'S ALREADY SWAP BLOCKED
5471         TLNN B,%SWPGW   ;IS HE RUNNABLE?
5472          SKIPN FLSINS(U)
5473           SKIPE USTP(U)
5474            JRST SWPNX3
5475         MOVE B,NMPGS(U) ;HE'S RUNNABLE
5476         CAIGE B,TSYSM-SYSB-MEMSY1
5477          JRST SWPNX1    ;SMALL, NO THRASH
5478         SUB B,NSWPGS(U)
5479         ADD B,MEMFR
5480         SUB B,NCBCOM
5481         ADD B,SOLNG
5482         SUB B,SILNG
5483         SUB B,AUSOPG
5484         JUMPG B,SWPNX3  ;LET THIS GUY THRASH
5485 SWPNX1: SKIPN ENSWBK
5486          JRST SWPNX3
5487         MOVSI B,(SETZ)  ;SWAP BLOCK THIS LOSER
5488         IORM B,USWSCD(U)
5489         AOS NTUSB
5490         AOS NUSWB
5491         MOVE B,NMPGS(U) ;SMALLEST SWAP BLOCKED LOSER?
5492         CAML B,BUSIZ
5493          JRST SWPNX3
5494         MOVEM U,BUSR    ;YES
5495         MOVEM B,BUSIZ           ;DROP INTO SWPNX3
5496 ];SWPWSP
5497 ;HAVING DECIDED TO SWAP OUT JOB IN U, MAKE SWAP HISTORY TABLE ENTRY
5498 SWPNX3: MOVSI T,2_16.
5499 ;GENERAL SWAP HISTORY TABLE KEEPER.  ENTER WITH JOB IN U, EVENT IN T, BASHES TT,I,T
5500 SWPKHT: HRLZ TT,U
5501         IDIVI TT,LUBLK          ;TT 3.1-3.8 GETS JOB NUMBER, BASHES I
5502         IOR TT,T
5503         HRR TT,TIME
5504 IFN SWPWSP, HLRZ T,UWRKST(U)
5505 IFE SWPWSP,[
5506         MOVE T,NMPGS(U)
5507         SUB T,NSWPGS(U)
5508 ];SWPWSP
5509         SOSL T
5510          DPB T,[321000,,TT]
5511         MOVEM TT,@SWPHTP
5512         AOS T,SWPHTP
5513         MOVE TT,UTRNTM(U)
5514         MOVEM TT,SWPHTL-1(T)
5515         MOVEI TT,SWPHTB
5516         CAIL T,SWPHTB+SWPHTL
5517          MOVEM TT,SWPHTP
5518         POPJ P,
5519 \f
5520 OVHMTR SWF      ;SWAP FIND USER
5521
5522 ;FIND A USER TO SWAP OUT, RETURN IN U, -1 IF NONE
5523 SWPON2: SETOM PSWSFL    ;START FROM BEG OF USER
5524 IFE SWPWSP,[
5525         SKIPL U,PRVUSR
5526          PUSHJ P,CKPRUS ;MAKE SURE PRIV USER EXISTS AND HAS NOT BEEN BLOCKED FOR A LONG TIME
5527 ];SWPWSP
5528         MOVNI T,30.*60.
5529         ADD T,TIME      ;A MINUTE AGO
5530         MOVNI U,1
5531         MOVEI J,2*LUBLK
5532         MOVEI C,NSSCDC  ;# SWAP OUT CLASSES
5533 SWPON4: CAML J,USRHI    ;C HAS INDEX OF MAX CLASS INTERESTED IN
5534          JRST SWPONX    ;LOOKED AT ALL USERS, GO PONDER RESULTS
5535         SKIPE UNAME(J)  ;SEE IF FOR REAL
5536          SKIPN NMPGS(J) ;DON'T BOTHER IF HAS NO MEMORY
5537           JRST SWPON3
5538 IFN SWPWSP,[
5539         MOVE B,USWST(J)
5540         TLNE B,%SWBEM+%SWLOD    ;DON'T SWAP OUT IF BEST EFFORT ALREADY MADE, 
5541          JRST SWPON3    ; OR STILL LOADING IN
5542         MOVEI I,7
5543         MOVE TT,USWTIM(J)
5544         CAMLE TT,TIME   ;IF PROTECT TIME HASN'T ELAPSED YET, GETS HIGHER PRIORITY
5545          JRST SWPTK     ;TO PREVENT THRASHING
5546 ];SWPWSP
5547 IFE SWPWSP,[
5548         MOVE B,USWST(J)
5549         TLNE B,%SWBEM
5550          JRST SWPON3    ;BEST EFFORT ALREADY MADE
5551 ];SWPWSP
5552         SKIPE LSWPR(J)
5553          JRST SWPON7    ;PREFER NOT TO SWAP OUT LOSER WITH SWITCHES LOCKED
5554         MOVEI I,1
5555         TLNE B,%SWPGW
5556          JRST SWPON5    ;FLSINS IS WAITING FOR A PAGE (NOT REALLY BLOCKED)
5557         CAML T,LUBTM(J)
5558          SOJA I,SWPTK   ;BLOCKED FOR A LONG TIME (CLASS 0)
5559         SKIPN FLSINS(J)
5560 SWPON5:  SKIPE USTP(J)
5561           JRST SWPTK    ;CLASS 1 (BLOCKED)
5562 IFE SWPWSP,[
5563         TLNE B,%SWPRV
5564          JRST [ MOVEI I,7       ;CLASS 7 (PRIV USER)
5565                 JRST SWPTK ]
5566 ];SWPWSP
5567         JUMPL B,[AOJA I,SWPTK] .SEE %SWDSO      ;DESIRED OUT (CLASS 2)
5568         MOVEI I,4
5569         SKIPGE APRC(J)
5570          SOJA I,SWPTK   ;DISOWNED (CLASS 3)
5571 IFE SWPWSP,[
5572         SKIPGE USWSCD(J)
5573          JRST SWPTK     ;SWAP BLOCKED (CLASS 4)
5574 ];SWPWSP
5575         SKIPGE TTYTBL(J)
5576          AOJA I,SWPTK   ;DOESNT HAVE TTY (CLASS 5)
5577 SWPON7: MOVEI I,6       ;OTHERWISE....
5578
5579 SWPTK:  CAMGE C,I
5580          JRST SWPON3    ;THIS GUY IN MORE WINNING CLASS
5581 IFE SWPWSP,[
5582         MOVE A,NMPGS(J)
5583         SUB A,NSWPGS(J)
5584 ];SWPWSP
5585 .ELSE   MOVE A,UWRKST(J)
5586         CAME C,I
5587          JRST SWPTK2
5588         XCT SWPTT(C)    ;IN SAME CLASS, COMPARE CLASS-DEPENDENT PRIORITY MEASURES
5589          JRST SWPON3
5590 SWPTK2: MOVE E,@SWPTT(I)        ;MAKE THIS GUY BEST VICTIM
5591         MOVE C,I
5592         MOVE U,J
5593 SWPON3: ADDI J,LUBLK
5594         JRST SWPON4
5595 \f
5596 ;SKIP IF THIS GUY (J) IS BETTER LOSER TO FLUSH THAN PREV BEST (IN E)
5597 SWPTT:  CAMG E,LUBTM(J) ;BLOCKED FOR A LONG TIME (0) - LATER LUBTM WINS
5598         CAMG E,LUBTM(J) ;BLOCKED (1)                 - LATER LUBTM WINS
5599         CAML E,A        ;DESIRED OUT (2)             - SMALLER WORKING SET WINS
5600         CAML E,A        ;DISOWNED (3)                - SMALLER WORKING SET WINS
5601         CAML E,A        ;RUNNABLE, SWAP BLOCK SET (4) - SMALLER WORKING SET WINS
5602         CAML E,USWPRI(J)        ;RUNNABLE, W/O TTY (5) - GO BY PRIORITY
5603         CAML E,USWPRI(J)        ;OTHERWISE (6)       - GO BY PRIORITY
5604 IFE SWPWSP,     BUG             ;PRIVELEGED USER (7) - SHOULD ONLY BE ONE
5605 IFN SWPWSP,     CAMG E,USWTIM(J);PROTECTED (7)       - LATER UNPROTECT TIME WINS
5606 NSSCDC==.-SWPTT
5607
5608 IFE SWPWSP,[
5609 CKPRUS: MOVSI B,%SWPRV
5610         CAMGE U,USRHI
5611          ANDCAM B,USWST(U)      ;TURN OFF PRIV USER BIT
5612         MOVNI TT,30.*2
5613         ADD TT,TIME     ;TWO SECONDS AGO
5614         SKIPE UNAME(U)
5615          CAML TT,LUBTM(U)
5616           PUSHJ P,NPRVUSR
5617         SKIPG U,PRVUSR
5618          POPJ P,
5619         MOVSI B,%SWPRV
5620         IORM B,USWST(U)
5621         POPJ P,
5622 ];SWPWSP
5623 \f
5624 OVHMTR UUO      ;RANDOM UUOS
5625
5626 ;AC: A.9 =>1  SWAP OUT USER
5627 ;4.8 => 1 ALL PAGES
5628 ;4.7=1 => LOOP FOR A WHILE
5629 ;3.9-3.1 USER # SELF IF 0
5630 ;RH => USER VIRTUAL PG # 
5631 ;OR 4.9=0, 4.8=0, 4.7=0 SWAP OUT RH # OF PAGES
5632 ;IF 4.9=0, 4.8=1 AND 4.7=0, HACK PCLSR TEST FEATURE ON CURRENT USER
5633 ;RH =0 LEAVE PCLSR TEST MODE =1 ENTER IN ADVANCE MODE =-1 ENTER IN HOLD MODE
5634 ;   =2 ENTER IN ADVANCE BUT DON'T ^Z
5635
5636 ASWAP:  SKIPN SYSDBG
5637          JRST ILUUO
5638         UMOVE A,(J)
5639         TLNE A,100000
5640          JRST ASWAP3
5641         JUMPL A,ASWAP1
5642         TLNE A,200000
5643          JRST ASWPCL    ;PC LSR TEST MODE.
5644         HRRZM A,SWPOPR  ;CLOBBER CLOBBER
5645         POPJ P,
5646
5647 ASWAP1: HLRZ B,A
5648         ANDI B,777      .SEE MAXJ ;FIELD SHOULD BE BIG ENOUGH
5649         IMULI B,LUBLK
5650         SKIPE B
5651          MOVE U,B
5652         TLNN A,200000
5653          JRST ASWAP2
5654         MOVE D,NMPGS(U)
5655         SUB D,NSWPGS(U)
5656         JUMPL D,[JRST 4,.]
5657         JUMPE D,CPOPJ
5658         CONO PI,CLKOFF
5659         MOVEM U,PSWOUS
5660         SETOM PSWSFL
5661         ADDM D,SWPOPR
5662         MOVSI D,%SWDSO
5663         IORM D,USWST(U)
5664         CONO PI,CLKON
5665         POPJ P,
5666
5667 ASWAP2: PUSHJ P,CWAIT   ;RETURNS WITH CLKOFF AND CIRPSW AVAILABLE
5668             SKIPL CIRPSW
5669         HRRZS A         ;A HAS VIRTUAL PAGE #
5670         PUSHJ P,UPLC    ;RETURN POINTERS IN T AND Q
5671         LDB A,T         ;GET MAP ENTRY
5672         LDB C,Q         ;GET CIRC PNTR
5673         CAIE C,-1       ;DON'T SWAP OUT ABS PAGE
5674          TRNN A,600000
5675           POPJ P,       ;ALREADY OUT OR DOESN'T HAVE PAGE
5676         ANDI A,PMRCM    ;MASK TO REAL CORE PAGE #
5677         MOVNI C,1
5678         PUSHJ P,SWPOPG
5679          JFCL
5680         JRST CLKONJ
5681
5682 ASWAP3: MOVE B,[1250000.]
5683         SOJG B,.
5684         UMOVE A,2000
5685         JRST ASWAP3
5686
5687 ASWPCL: MOVEM U,PCLUSR
5688         CLEARM PCLL
5689         CLEARM PCLHSH
5690         SETOM PCLNXT
5691         HRRES A
5692         MOVEM A,PCLDBM
5693         POPJ P,
5694 \f
5695 ;.CALL PGWRIT
5696 ; ARG 1 - A <JOB>
5697 ; ARG 2 - PAGE NUMBER IN <JOB>'S ADDRESS SPACE
5698 ;IF ONLY ONE ARGUMENT IS GIVEN, IT IS ARG 2, AND ARG 1 DEFAULTS TO CURRENT USER
5699
5700 ;THE PAGE IS SWAPPED OUT.  THE CALL DOESN'T RETURN UNTIL THE SWAP IS COMPLETED.
5701 ; THIS ALLOWS USER TO BE SURE THAT THE COPY ON DISK IS UP TO DATE.
5702 ;CONTROL BIT 1.1 => RETURN IMMEDIATELY, NO WAITING.  TO WAIT LATER, JUST DO
5703 ; ANOTHER PGWRIT WITHOUT SETTING 1.1.
5704 ;CONTROL BIT 1.2 => UNLOCK PAGE.  IF YOU CALL THIS ON A LOCKED PAGE,
5705 ; WITHOUT SETTING BIT 1.2, THE PAGE WILL BE SWAPPED OUT, BUT THE NEXT
5706 ; TIME IT IS SWAPPED IN IT WILL BE LOCKED AGAIN.  THIS IS USEFUL FOR
5707 ; CONTROLLING EXACTLY WHEN A DATA BASE PAGE GETS WRITTEN TO DISK.
5708
5709 NPGWRT: CAIGE W,2
5710          JRST [ MOVE J,U ? JRST NPGWR1 ]
5711         MOVE J,A
5712         JSP T,NCORUI    ;DECODE THE JOB SPEC
5713          JRST NPGWR0
5714         JSP T,NCORWR    ;WHICH MUST BE WRITABLE
5715          JRST OPNL31
5716 NPGWR0:
5717 IFN PDP6P,[
5718         CAIN J,-1       
5719          JRST OPNL34    ;CAN'T HACK PDP6
5720 ];PDP6P
5721         MOVE A,B        ;NOTE: SWPOPG TAKES CARE OF THE PCLSR'ING
5722         PUSHJ P,NPGWR1  ;CALL MAIN ROUTINE
5723          POPJ P,        ;LOST, OPNL CLEARED LSWPR
5724         JRST LSWPJ1     ;WON, UNLOCK DIELOK
5725
5726 ;USER INDEX IN J, PAGE NUMBER IN A
5727 NPGWR1: TDNE A,[-1,,-400]
5728          JRST OPNL32    ;PAGE NUMBER NOT VALID
5729         PUSHJ P,CWAIT   ;DON'T ALLOW PAGE MAPS TO CHANGE, AND TURN CLK OFF
5730            SKIPL CIRPSW ;DON'T NEED UTCOFF BECAUSE UTC LEVEL CAN ONLY PUT PAGES INTO MAPS
5731         EXCH U,J
5732         PUSHJ P,UPLC
5733         EXCH U,J
5734         LDB D,Q         ;D GETS CIRC PNTR
5735         JUMPE D,OPNL32  ;NO PAGE THERE
5736         CAIN D,-1
5737          JRST OPNL12    ;ABSOLUTE PAGE
5738         PUSH P,U
5739         MOVE C,Q        ;STARTING FROM UPGCP, FIND MMP
5740         PUSHJ P,UCPRL
5741             200000,,.+2
5742          BUG            ;IF NONE FOUND
5743         SUB P,[4,,4]    ;FOUND MMP, C POINTS TO IT
5744         MOVSI T,MMPTMP  ;IF PAGE IS IN TRANSIT
5745         TDNE T,(C)
5746          JRST [ POP P,U
5747                 TDNE T,(C)      ;AWAIT COMPLETION
5748                  PUSHJ P,UFLS
5749                 JRST NPGWR1 ]   ;THEN TRY AGAIN
5750         MOVE E,C        ;SAVE ADDRESS OF MMP ENTRY
5751         PUSHJ P,UCPRL   ;SEE IF PAGE IS IN MEMORY
5752             100000,,NPGWR3
5753         POP P,U         ;NOT SWAPPED IN, BYPASS SWAP-OUT CODE
5754         JRST NPGWR2
5755
5756 NPGWR3: SUB P,[4,,4]    ;IT'S SWAPPED-IN TO CORE PAGE IN T
5757         POP P,U
5758         HLRZ D,MMSWP(T)
5759         JUMPN D,OPNL12  ;POINTED TO BY AN EXEC PAGE, E.G. 340, SHOULDN'T MESS.
5760         PUSH P,A        ;SAVE USER'S VIRTUAL PAGE #
5761         PUSH P,J        ;SAVE WHAT JOB THAT IS
5762         PUSH P,E        ;SAVE ADDRESS OF MMP ENTRY
5763         MOVE A,T        ;PHYSICAL PAGE # TO SWAP OUT
5764         MOVE C,USER     ;DON'T PCLSR ME
5765         PUSHJ P,SWPOPL  ;SWAP OUT, EVEN IF LOCKED
5766          JRST NPGWR4    ;NO DISK SPACE, OR SOME JOB NOT PCLSRABLE
5767         POP P,E
5768         POP P,J
5769         POP P,A
5770 NPGWR2: MOVE T,CTLBTS(U)
5771         MOVSI D,MMPLOK
5772         TRNE T,2        ;CONTROL BIT 1.2 UNLOCKS
5773          ANDCAM D,(E)
5774         TRNE T,1        ;CONTROL BIT 1.1 INHIBITS WAITING FOR SWAP TO FINISH.
5775          JRST CLKOJ1
5776         MOVSI T,MMPTMP  ;PAGE IN TRANSIT BIT
5777         TDNE T,(E)      ;WAIT FOR BIT TO TURN OFF
5778          PUSHJ P,UFLS
5779         JRST CLKOJ1
5780
5781 ;COULDN'T SWAP OUT, WAIT A WHILE AND TRY AGAIN
5782 NPGWR4: PUSHJ P,UDELAY  ;UDELAY TURNS CLKON
5783         POP P,E
5784         POP P,J
5785         POP P,A
5786         JRST NPGWR1
5787 \f
5788 EBLK
5789
5790 ;SWAP IN RQ BLOCKS
5791 SWIRQB:
5792 IFN 340P\E.SP,  DISSWI: -1      ;USER
5793 IFN VIDP,       VIDSWI: -1
5794 IFN IMXP,       POTSWI: -1
5795 IFN NSWPV-.+SWIRQB,.ERR NSWPV ERR
5796
5797 SWIVPN:
5798 IFN 340P\E.SP,  DISSPG: 0       ;VIRTUAL PAGE NUMBER
5799 IFN VIDP,       VIDSPG: 0
5800 IFN IMXP,       POTSPG: 0
5801
5802 SWPNTB:         ;SIGNAL BITS IN LH OF W TO CFHSW1
5803 IFN 340P\E.SP,  400000  ;DISPLAY
5804 IFN VIDP,       400000  ;VID
5805 IFN IMXP,       400000  ;POTS
5806
5807 SWILMT:         ;PIRQC BIT TO SET ON ILM
5808 IFN 340P\E.SP,  %PIDIS
5809 IFN VIDP,       %PIMPV
5810 IFN IMXP,       %PIMPV
5811
5812 PSWOUS: -1      ;INDEX OF PARTIALLY SWAPPED OUT USER
5813 PSWCLS: 0       ;CLASS OF PARTIALLY SWAPPED OUT USER
5814 PSWSFL: 0       ;-1 START FROM BEG OF USER, ELSE PICK UP WHERE LEFT OFF
5815 SWPMBP: 0       ;PNTR TO MAP
5816 SWPCBP: 0       ;PNTR TO CIRC DESC SPACE
5817 PSWLC:  0       ;LOOP COUNT
5818 SBEFLG: -1      ;0 => ALREADY ONCE WANTED TO CLEAR ALL "BEST EFFORT" BITS.
5819 SWPOPR: 0       ;NUMBER OF PAGES DESIRED TO BE SWAPPED OUT
5820 SWPOPB: 0       ;SWAP OUT REQUEST BUT ONLY SWAP OUT NON-RUNNING USERS TO MEET (UNUSED?)
5821 SILNG:  0       ;TOTAL LENGTH OF SWAP IN LISTS
5822 SOLNG:  0       ;TOTAL LENGTH OF SWAP OUT LISTS
5823                 ;SINLST AND SOUTLS ARE IN DISK CODE.  VARIATION ON QBFP.
5824 SWODSK: NQS-1   ;UNIT TO SWAP OUT ON NEXT
5825 SWOBK:  0       ;MEMBLT BEING SWAPPED OUT
5826 SWOMMP: 0       ;MMP ADDRESS (NOT INDEX)
5827 SPGNMF: 0       ;-1 => PAGE NOT MODIFIED
5828 CFHAS:  0       ;TEMP FOR A AT CFH
5829 SWPIQS: 0       ;SAVE Q AT SWPPIN
5830 CFHUVP: 0       ;USER'S VIRTUAL PAGE NUMBER TOOK FAULT ON
5831 LUMPS:  0       ;UMAPS USED FOR CURRENT USER, MAY DIFFER FROM
5832                 ;UMAPS(U) IF TOOK FAULT TRYING TO CAUSE INTERRUPT
5833 TRUMM:  0       ;TOTAL USER MEM ACTIVE USERS
5834 NPGSWO: 0       ;NUMBER OF CURRENTLY SWAPPED OUT PAGES
5835 AUSOPG: 0       ;ACTIVE USER SWAPPED OUT PAGES
5836 BUMPGS: 0       ;REAL CORE PAGES OCC BY BLOCKED + STOPPED LOSERS
5837 NUSWB:  0       ;# LOSERS SWAP BLOCKED
5838 SWPOPU: 0       ;USER PG "BELONGS" TO (IE NOT NECC TO PCLSR THIS GUY,
5839                         ;BUT PCLSR ANYONE ELSE LINKED TO PG.)
5840 AGEREQ: 0       ;NUMBER OF PAGES BEING AGED AT SLOW CLOCK
5841 AGEPOS: 0       ;LAST PAGE # AGED
5842
5843 IFE SWPWSP,[
5844 PRVUSR: -1      ;PRIV USR
5845 PRVCUT: 1500    ;CUT OFF FOR PRIV USR
5846 SWUPC:  0       ;ABSOLUTE PAGE NUMBER OF USER MODE PC DURNING SWAP OUT
5847 SWPP0F: -1      ;-1 IF CONSIDERING PAGE 0
5848 ASBUM:  0       ;REAL MEM OCC BY ACTIVE "SWAPPED BLOCKED" LOSERS
5849 SWSCT1: 0       ;TEM AT SWSCD
5850 BUSR:   0       ;INDEX OF SMALLEST SWAP BLOCKED LOSER
5851 BUSIZ:  0       ;SIZE OF BUSR
5852 ];SWPWSP
5853
5854 IFN PAGPRE,[
5855 PREEMP: 0       ;IF NON-ZERO, A PRE-EMPT IS IN PROGRESS (WHEN WE NEXT GET TO CLK LVL)
5856 NPREEL: 0       ;NUMBER OF LOOPS AT SCHEDP (ATTEMPTED PREEMPTS)
5857 NPREEM: 0       ;NUMBER OF SUCCESSFULL PREEMPTS
5858 NPREE1: 0       ;NUMBER OF TIMES A PAGE CAME IN AND WE STARTED TO THINK ABOUT PREEMPTION
5859 NPREE2: 0       ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE OF CLKOFF OR IN PROGRESS
5860 NPREE3: 0       ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE FLSINS WAS WRONG
5861 ];PAGPRE
5862
5863 ;COUNTS OF REASONS FOR ENTRY TO SCHED
5864 ;THESE METERS MAY BE TEMPORARY - SOME OF THEM ARE REDUNDANT
5865 ;REASONS NOT COUNTED - VARIOUS PARITY, NXM, AND OTHER ERROR CASES
5866 NLPPRE: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PREEMPT
5867 NLPCLK: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO CLOCK
5868 NLPUFL: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO UFLS
5869 NLPPAG: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE-IN
5870 NLPPGT: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND TUT LOCKED
5871 NLPPGC: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CIRPSW LOCKED
5872 NLPPGM: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND MEMFRZ LOCKED
5873 NLPPG3: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CALLED CFHPO3 (NO MEM)
5874 NLPPGB: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND SWAP-BLOCKED
5875 NPPIUM: 0       ;NUMBER OF TIMES PAGE PUT INTO BUNCHA USERS' MAPS
5876 NPPIU1: 0       ;NUMBER OF USERS PAGES PUT INTO MAPS OF  (RATIO OF THESE 2 IS SHARING)
5877
5878 IFN SWPWSP,[
5879 LODQNT:         ;RUN TIME IN 4-USEC UNITS BETWEEN PG FAULTS TO LEAVE
5880                 ;LOADING STATE 
5881  IFN KL10P, 3000.  ;12 MS
5882  IFN KA10P, 9000.  ;36 MS
5883  IFN KS10P, 3000.       .ERR Guessed LODQNT on KS10?
5884 LODFCT: 3,,0    ;MULTIPLY LOADING TIME BY THIS TO GET PROTECT TIME (INT,,FRAC)
5885 NUPTAW: 0 .SEE SWOP6 ;NUMBER OF USERS PAGE TAKEN AWAY FROM
5886
5887 ;METERS
5888
5889 NPLBLJ: 0       ;NUMBER OF PAGE LOADS BY LOADING JOBS
5890 NPLBNL: 0       ;NUMBER OF PAGE LOADS BY NON-LOADING JOBS
5891
5892 ;Still to be done
5893 ;       1-, 5-, 15- minute average population of each state,
5894 ;               also avg of NPGWTU and RNABLU (for load avg)
5895 ;       avg of core occupied by jobs in each state,
5896 ;               i.e. UWRKST for load, pro, sw in.
5897 ;       Relationship of sum of UWRKST's of loading and swapped in
5898 ;               versus total core occupied by user pages.
5899 ;       Average time spent in each state before moving on,
5900 ;               versus size of job.  Maybe cpu time as well as
5901 ;               real time?
5902
5903 ];SWPWSP
5904 BBLK
5905
5906 \f
5907 OVHMTR SWP      ;SWAP PAGE
5908
5909 ;SWAP OUT PAGE WHOSE MEMBLT INDEX IS IN A
5910 ;SKIP IF SUCCESSFUL
5911 ;C IS USER WHO DOESN'T NEED TO BE PCLSRED BEFORE HIS PAGES CAN BE SWAPPED.
5912 SWPOPL: TDZA B,B        ;THIS ENTRY IGNORES LOCK BIT
5913 SWPOPG:  MOVSI B,MMPLOK ;THIS ENTRY RESPECTS LOCK BIT
5914         MOVEM C,SWPOPU
5915         MOVEM A,SWOBK
5916         CAIGE A,TSYSM
5917          CAIGE A,SYSB
5918           BUG           ;DON'T SWAP OUT PART OF SYSTEM
5919         AOSE CIRPSW
5920          POPJ P,
5921         LDB C,[MMMPX,,MEMBLT(A)]
5922         ADDI C,MMP
5923         HRRZM C,SWOMMP  ;STORE ADDRESS OF FIRST WORD OF MMP ENTRY
5924         TDNE B,(C) .SEE MMPLOK  ;LOCKED IN CORE?
5925          JRST [ CAIGE A,256.    ;IF SO, DON'T SWAP OUT UNLESS IN "LOW" MEMORY
5926                  CAIGE A,LIOBLK ;IN WHICH CASE MUST GO OUT TO AVOID SYSTEM DEADLOCK
5927                   JRST SCRPSJ   ;SEE CODE AT CIMEMR
5928                 CAIGE A,128.
5929                  JRST .+1
5930                 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES
5931                  SKIPN USEMDM
5932                   JRST SCRPSJ
5933                 JRST .+1 ]
5934         SOS CIRPSW      ;RELEASE SWITCH
5935         HLRZ B,1(C)
5936         JUMPN B,SWOP1   ;JUMP IF DISK SPACE ALREADY ASSIGNED
5937 SWODF3: MOVSI B,-NQS
5938 SWODF6: AOS I,SWODSK
5939         CAIL I,NQS
5940          SUBI I,NQS     ;WRAP AROUND
5941         MOVEM I,SWODSK  ;CURRENT SWAPPING DSK
5942         CONO PI,UTCOFF-1        ;DON'T CHANGE STATE OF CLOCK CHNL.
5943         SKIPGE QTUTO(I) ;TUT LOCKED
5944          JRST SWODF7
5945         SKIPL QACT(I)
5946         SKIPG QSFTS(I)  ;DSK FULL IN SWAPPING AREA
5947          JRST SWODF7
5948         MOVSI A,(SETZ)
5949         IORM A,QTUTO(I)
5950         CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL.
5951         MOVEI A,NQCHN+1(I)      ;QMFTP(A) CONTAINS TRACK TO START FROM
5952         PUSHJ P,QGTK4   ; RETURNS TRACK IN D
5953         SOS QSFTS(I)
5954 SWODF5: MOVSI A,(SETZ)
5955         ANDCAM A,QTUTO(I)
5956         MOVE A,SWOMMP
5957         HRLM D,1(A)             ;STORE DISK ADDRESS IN MMP ENTRY        
5958         DPB I,[$MMPUN,,(A)]
5959         JRST SWOP1
5960
5961 SWODF7: AOBJN B,SWODF6  ;TRY NEXT DSK FOR SWAPPING AREA
5962         CONO PI,UTCON-1 ;NON FOUND FIND FILE SPACE
5963         MOVNI D,1
5964         MOVNI I,1
5965         MOVSI E,-NQS
5966 SWODF2: SKIPL QTUTO(E)  ;FIND WHICH DISK HAS MOST FREE SPACE
5967         SKIPGE QACT(E)
5968          JRST SWODF4
5969         CAMGE D,QSFT(E)
5970          HRRZ I,E
5971         CAMGE D,QSFT(E)
5972          MOVE D,QSFT(E)
5973 SWODF4: AOBJN E,SWODF2
5974         JUMPL I,CPOPJ   ;NO DSK SPACE AVAIL
5975         HRRZM I,SWODSK  ;LAST DSK HACKED
5976         JUMPLE D,CPOPJ  ; NO ROOM ANYWHERE
5977         CONO PI,UTCOFF-1
5978         SKIPGE QTUTO(I)
5979          JRST UTCNJ     ;TUT LOCKED
5980         MOVSI A,(SETZ)
5981         IORM A,QTUTO(I)
5982         CONO PI,UTCON-1
5983         MOVEI D,NBLKS/2 ;STARTING POINT
5984         MOVEI A,NQCHN+1(I) ;DISK CHANNEL
5985         MOVEM D,QMFTP(A)
5986         PUSHJ P,QGTK4   ;RETURNS TRACK IN D
5987         MOVEI E,NUDSL
5988         MOVEM E,QMFTP(A);DON'T LEAVE SWAPPING CHNL POINTING INTO FILE SPACE
5989         SOS QSFT(I)
5990         JRST SWODF5
5991
5992 SCRPSJ: SETOM CIRPSW
5993         POPJ P,
5994 \f
5995 SWOP1:  AOSE CIRPSW
5996          POPJ P,
5997         AOS NPGSO
5998
5999 ;COME HERE FROM SWPOPG AND MMPRTN TO SWAP OUT A PAGE.
6000 ;CLOCK OFF OR IN PROGRESS AND ARGUMENTS IN SWOBK AND SWOMMP.
6001 ;PUTS BLOCK ON SWAPOUT LIST IF DISK COPY NEEDS TO BE UPDATED, ELSE
6002 ;JUST DELETES MEMORY.  IF NO USERS ARE USING THE PAGE,
6003 ;RETURNS THE MMP ENTRY OR ARRANGES FOR THE DISK ROUTINES TO.
6004
6005 SWOP1A: CONO PI,UTCOFF-1        ;DON'T CHANGE STATE OF CLOCK CHNL.
6006         MOVE A,SWOBK            ;CORE BLOCK # CONTAINING PAGE TO BE SWAPPED OUT
6007         HLRZ C,MMSWP(A)         ;NUMBER OF EXEC PAGES POINTING TO THIS PAGE
6008         JUMPN C,SWOP5           ;POINTED TO BY EXEC PAGE, CAN'T SWAP OUT
6009 IFN 340P,[
6010         MOVSI C,-N340PB-2
6011 SWOPT2: LDB I,DPEP(C)
6012         TRZN I,600000
6013          JRST SWOPT1
6014         ANDI I,PMRCM    ;MASK TO REAL CORE PAGE #
6015         CAIN I,(A)
6016          BUG            ;DISPLAY STILL SET UP TO PAGE BEING SWAPPED OUT
6017 SWOPT1: AOBJN C,SWOPT2
6018 ]
6019         MOVSI C,MMPPGA
6020         ANDCAM C,@SWOMMP
6021         MOVSI C,(SETZ)
6022         IORM C,MEMBLT(A)        ;PREVENT NEW EXEC PAGES FROM BEING SET UP POINTING HERE
6023         CONO PI,UTCON-1
6024         MOVE C,[2200,,MEMPNT]
6025         ADD C,SWOBK
6026         SETOB B,SPGNMF  ;INITIALIZE PAGE NOT MODIFIED FLAG, AND COUNT USERS IN B
6027 IFN SWPWSP,[
6028         LDB I,C
6029         PUSH P,I
6030         SETZM NUPTAW
6031         MOVSI D,-1      ;COMPUTE WORKING SET CONTRIBUTION TO BE TAKEN AWAY
6032         IDIV D,MMSWP(A) ;LH(MMSWP) KNOWN TO BE ZERO!
6033         PUSHJ P,UCPRL   ;CHECK ALL USERS, TAKE PAGE AWAY FROM SOME
6034             400000,,SWOP6       ;ALSO COUNTS USERS IN B
6035         POP P,I
6036         AOJE B,SWOP7    ;JUMP IF NO USERS USING PAGE, RETURN MMP ENTRY
6037         CAMN B,NUPTAW   ;ANY USERS STILL MAPPED TO PAGE?
6038          JRST SWOP8     ;NO, GO SWAP IT OUT
6039         MOVSI D,1       ;YES, COMPUTE WORKING SET ADJUSTMENT
6040         IDIV D,MMSWP(A) ;TO BE ADDED BACK IN TO THEM
6041         PUSHJ P,UCPRL   ;GO BACK AND FIX WORKING SETS
6042             400000,,SWOP6B
6043         JRST SWOP6E     ;ABORT SWAP OUT
6044 ];SWPWSP
6045 IFE SWPWSP,[
6046         LDB I,C
6047         PUSH P,I        ;NOTE: CAN BACK OUT OF THIS PUSH AT SWOP2B
6048         PUSHJ P,UCPRL
6049             400000,,SWOP2       ;RETURN ON USERS (CAN BACK OUT AT SWOP2B)
6050         POP P,I
6051         JUMPGE B,SWOP8
6052 ];SWPWSP
6053 SWOP7:  MOVSI B,MMPGON  ;NO USERS USING PAGE, SO MMP ENTRY WILL BE RETURNED
6054         IORM B,@SWOMMP  ;FLAG THAT MMP ENTRY WILL SOON GO AWAY
6055         MOVEI A,0       ;REMOVE FROM LOOSE PAGE LIST
6056         MOVE T,FLOOSP
6057 SWOP7A: MOVE B,A        ;B PREDECESSOR
6058         SKIPN A,T       ;T SUCCESSOR
6059          BUG            ;NOT IN LIST?
6060         LDB T,[MLO,,MEMBLT(A)]
6061         CAME A,SWOBK
6062          JRST SWOP7A
6063         SKIPE B         ;FOUND, PATCH OUT OF LIST
6064          DPB T,[MLO,,MEMBLT(B)]
6065         SKIPN B
6066          MOVEM T,FLOOSP
6067         SKIPN T
6068          MOVEM B,LLOOSP
6069         SOSL NLOOSP
6070          JRST SWOP8
6071         BUG             ;NLOOSP TOO LOW.
6072 \f
6073 IFN SWPWSP,[
6074
6075 ;THIS UCPRL ROUTINE SCANS ALL USERS, COUNTS THEM IN B,
6076 ;USES D TO ADJUST WORKING SETS OF USERS WHICH ARE MAPPED TO
6077 ;THE PAGE, AND TAKES THE PAGE AWAY FROM ANY USERS IT CAN,
6078 ;COUNTING THEM IN NUPTAW.
6079 SWOP6:  AOS B           ;COUNT USERS OF THIS PAGE
6080         CAIG U,LUBLK
6081          BUG            ;SYS JOB OR CORE JOB?
6082         PUSH P,I
6083         MOVEI C,UPGMP(U)        ;MAKE C POINT TO UPGMP ENTRY (PTW)
6084         ROT I,-1
6085         ADDI C,(I)
6086         HRLI C,222200
6087         SKIPGE I
6088          HRLI C,2200
6089         LDB I,C
6090         SKIPN I
6091          BUG            ;NO ACCESS?
6092         TRNE I,600000
6093          ADDM D,UWRKST(U)       ;IS MAPPED TO PAGE, ADJUST WORKING SET
6094         CAMN U,SWPOPU
6095          JRST SWOP6A    ;DON'T CONSIDER PCLSRING SWPOPU
6096         MOVE T,UPC(U)
6097         TLNE T,%PCUSR
6098          JRST SWOP6A
6099         SKIPN LSWPR(U)  ;PCLSR IF HAS SWITCHES LOCKED
6100          SKIPN FLSINS(U)
6101           JRST SWOP6D
6102         MOVSI T,%SWPCL  ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6103         IORM T,USWST(U)
6104         JRST SWOP6A
6105
6106 SWOP6D: PUSH P,D
6107         PUSH P,C
6108         PUSH P,I
6109         PUSHJ P,PCLSR   ;BETTER NOT CLOBBER U OR H OR A
6110          JRST [ SUB P,[2,,2]
6111                 POP P,D
6112                 JRST SWOP6C ]
6113         POP P,I
6114         POP P,C
6115         POP P,D
6116 ;WHEN WE GET HERE, THIS JOB CAN'T HOLD THIS PAGE IN
6117 SWOP6A: TRNN I,600000
6118          JRST SWOP6C    ;NOT SET UP SINCE PREV SWAPPED OUT
6119         AOS NUPTAW      ;TAKE IT AWAY
6120         LSH I,-16.      ;SAVE ACCESS MODE IN LOW ADR BITS
6121         CAILE I,2       ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6122          CLEARM SPGNMF  ;PAGE HAS BEEN MODIFIED
6123         CAIN I,2        ;FLUSH R.W.F.
6124          MOVEI I,3
6125         DPB I,C         ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6126         AOS NSWPGS(U)   ;INCR COUNT OF SWAPPED OUT PGS OF USER
6127         AOS SNSWPG      ;INCR CNT OF SWAPPED OUT FOR SYS
6128         SOS MMSWP(A)    ;DECR COUNT OF PAGE SHARERS
6129 IFN E.SP,[
6130         CAMN U,DISUSR   ;IF USER OF E&S
6131          PUSHJ P,E.SLPM ;LOAD ITS MAP
6132 ]
6133 SWOP6C: POP P,I
6134         POPJ P,
6135
6136 SWOP6F: CAMN U,-4(P)            ;DON'T LOOK AT USER TAKING PAGE AWAY FROM
6137          POPJ P,                ;ELSE DROP INTO SWOP6B
6138 ;THIS UCPRL ROUTINE ADJUSTS WORKING SETS OF JOBS THAT
6139 ;ARE MAPPED TO THE PAGE USING D.
6140 SWOP6B: PUSH P,I
6141         MOVEI C,UPGMP(U)        ;MAKE C POINT TO UPGMP ENTRY (PTW)
6142         ROT I,-1
6143         ADDI C,(I)
6144         HRLI C,222200
6145         SKIPGE I
6146          HRLI C,2200
6147         LDB I,C
6148         SKIPN I
6149          BUG                    ;NO ACCESS?
6150         TRNE I,600000
6151          ADDM D,UWRKST(U)       ;IS MAPPED TO PAGE, ADJUST WORKING SET
6152         POP P,I
6153         POPJ P,
6154 ];SWPWSP
6155 \f
6156 IFE SWPWSP,[
6157 ;COME HERE VIA UCPRL FOR ALL USERS OF PAGE BEING SWAPPED OUT
6158
6159 SWOP2:  AOS B   ;COUNT USERS OF THIS PAGE
6160         CAIG U,LUBLK
6161          BUG            ;SYS JOB OR CORE JOB?
6162         PUSH P,I
6163         CAMN U,SWPOPU
6164          JRST SWOP2A
6165         MOVE T,UPC(U)
6166         TLNE T,%PCUSR
6167          JRST SWOP2A
6168         SKIPN LSWPR(U)  ;PCLSR IF HAS SWITCHES LOCKED
6169          SKIPN FLSINS(U)
6170           JRST SWOP2D
6171         MOVSI T,%SWPCL  ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6172         IORM T,USWST(U)
6173         JRST SWOP2A
6174
6175 SWOP2D: PUSHJ P,PCLSR
6176          JRST SWOP2B
6177 SWOP2A: MOVEI C,UPGMP(U)
6178         ROT I,-1
6179         ADDI C,(I)
6180         HRLI C,222200
6181         SKIPGE I
6182          HRLI C,2200
6183         LDB I,C
6184         SKIPN I
6185          BUG            ;NO ACCESS?
6186         TRNN I,600000
6187          JRST SWOP2C    ;NOT SET UP SINCE PREV SWAPPED OUT
6188         LSH I,-16.      ;SAVE ACCESS MODE IN LOW ADR BITS
6189         CAILE I,2       ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6190          CLEARM SPGNMF  ;PAGE HAS BEEN MODIFIED
6191         CAIN I,2        ;FLUSH R.W.F.
6192          MOVEI I,3
6193         DPB I,C         ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6194         AOS NSWPGS(U)   ;INCR COUNT OF SWAPPED OUT PGS OF USER
6195         AOS SNSWPG      ;INCR CNT OF SWAPPED OUT FOR SYS
6196         MOVE I,SWOBK
6197         SOS MMSWP(I)    ;KEEP ACCURATE COUNT OF UPGMP'S POINTING AT THIS PAGE
6198 IFN E.SP,[
6199         CAMN U,DISUSR   ;IF USER OF E&S
6200          PUSHJ P,E.SLPM ;LOAD ITS MAP
6201 ]
6202 SWOP2C: POP P,I
6203         POPJ P,
6204
6205 SWOP2B: SUB P,[6,,6]    ;2 PUSHES OF I AND 4 FOR UCPRL
6206 ];SWPWSP
6207 SWOP6E: MOVE A,SWOBK    ;ABORT SWAP-OUT
6208         MOVSI I,(SETZ)
6209         ANDCAM I,MEMBLT(A)
6210         SOS CIRPSW
6211         POPJ P,
6212
6213 SWOP8:  DPB I,C         ;DELINK MEMPNT
6214         MOVEI I,3 .SEE MMPOUT .SEE MMPTMP
6215         DPB I,[410200,,@SWOMMP] ;INDICATE ON THE WAY OUT
6216         MOVSI I,MMPBAD
6217         ANDCAM I,@SWOMMP
6218         MOVE A,SWOBK
6219         MOVSI B,(SETZ)
6220         CONO PI,UTCOFF-1
6221         ANDCAM B,MEMBLT(A)
6222         MOVE C,@SWOMMP
6223         TLNN C,MMPGON   ;UNLESS PAGE WILL BE FORGOTTEN AFTER SWAP OUT,
6224          AOS NPGSWO     ; KEEP COUNT OF PAGES CURRENTLY SWAPPED OUT
6225         TLNE C,MMPWRT   ;IF WAS WRITTEN BY USER WHO LATER DELETED IT,
6226          JRST SWOP3
6227         SKIPGE SPGNMF   ;OR IF PAGE MODIFIED,
6228          TLNN C,MMPWOD
6229           JRST SWOP3    ;OR IF HASN'T BEEN WRITTEN TO DISK, MUST WRITE OUT.
6230         MOVEI I,2       ;NO NEED TO WRITE OUT.  INDICATE OUT.
6231         DPB I,[410200,,@SWOMMP]
6232         PUSHJ P,IMEMR   ;RETURN THE MEMORY
6233         MOVE A,SWOMMP
6234         TLNE C,MMPGON
6235          PUSHJ P,RETMMP ;ALSO RETURN THE MMP ENTRY IF NECESSARY
6236         JRST SWOP4
6237 \f
6238 SWOP5:  SOS CIRPSW
6239 UTCNJ:  CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL
6240         POPJ P,
6241
6242 SWOP3:  CAIGE A,TSYSM           ;HAVE TO WRITE THIS PAGE OUT
6243         CAIGE A,SYSB
6244          BUG
6245         HRRZ B,SWOMMP
6246         LDB I,[$MMPUN,,(B)]
6247         CAIL I,NQS
6248          BUG                    ;DISK NUMBER NOT LEGITIMATE
6249         MOVEI C,.BM MLO
6250         ANDCAM C,MEMBLT(A)      ;SET END OF LIST IN THIS BLOCK
6251         HLRZ C,SOUTLS(I)        ;GET PREV BLOCK
6252         SKIPE C
6253          DPB A,[MLO,,MEMBLT(C)] ;CHAIN TO PREV BLOCK
6254         SKIPN C
6255          MOVEM A,SOUTLS(I)      ;OR TO HEADER IF FIRST
6256         HRLM A,SOUTLS(I)        ;AND SET NEW LAST BLOCK
6257         AOS SOLNG
6258         HLRZ C,1(B)
6259         HRLM C,MEMPNT(A)        ;STORE DISK ADDRESS
6260         MOVEI B,MUSWPG
6261         DPB B,[MUR,,MEMBLT(A)]
6262         PUSHJ P,QSTRT1
6263 SWOP4:  SOS CIRPSW
6264 UTCNJ1: CONO PI,UTCON-1
6265         JRST POPJ1
6266
6267 IFN NSWPV,[
6268 SWPPIN: MOVSI Q,-NSWPV          ;# OF DEVICES THAT CAN SWAP IN PAGES
6269 SWPPI4: SKIPGE W,SWIRQB(Q)      ;USER INDEX
6270          JRST SWPPI6
6271         MOVE E,SWIVPN(Q)        ;VIRTUAL PAGE NUMBER
6272         HRL W,SWPNTB(Q)
6273         CLEARB TT,D
6274         MOVEM Q,SWPIQS
6275         PUSHJ P,CFHSW1
6276         MOVE Q,SWPIQS
6277         SETOM SWIRQB(Q)
6278 SWPPI6: AOBJN Q,SWPPI4
6279         POPJ P,
6280 ]
6281
6282 SWIILM:
6283 IFN E.SP,[
6284         TRNN Q,-1       ; IS DEVICE DIS? (E&S IS INDEX 0 IN SWIRQB)
6285          SETZM E.SPGW   ; IF SO, CLEAR PAGE WAIT.
6286 ]
6287         SKIPGE E,SWILMT(Q)
6288          BUG
6289         IORM E,PIRQC(W)
6290         MOVEI A,0
6291         POPJ P,
6292 \f
6293 SUBTTL LOAD USER PAGE MAP
6294
6295 OVHMTR UUO      ;RANDOM UUOS (WELL, SOME MINOR SCHED STUFF, TOO)
6296
6297 ;SET PAGE MAP AT M.P. LEVEL, ASSUMING UMAPS HAS BEEN ALTERED.
6298 ;UMAPS EXISTS SO SCHEDULER CAN RESTORE THE MAP AFTER OTHER JOBS RUN.
6299 ;FORMAT OF A MAP SPECIFICATION IS:
6300 %UM==1,,525252
6301 %UMMPL==200000  ;1 => MAP LOWER HALF TO SPEC'D JOB'S; 0 => USE LOWER OF JOB IN U.
6302 %UMMPU==100000  ;1 => MAP UPPER HALF TO SPEC'D JOB'S; 0 => USE UPPER OF JOB IN U. 
6303 %UMALL==300000  ;SET => SELECT WHOLE MAP OF SPEC'D JOB.
6304 %UMUTL==40000   ;IGNORED IF %UMMPU=0. IF %UMMPU=1, MEANS USE SPEC'D JOB'S LOWER
6305                 ;INSTEAD OF ITS UPPER, AS OUR UPPER HALF. READ "%UM UPPER-TO-LOWER".
6306 %UMLTU==20000   ;"%UM-LOWER-TO-UPPER". WITH %UMMPL, MAKES LOWER -> SPEC'D JOB'S UPPER.
6307 %UMSOA==4000    ;1 => USE AC0S AS THE USER'S ACS, INSTEAD OF UUOACS.
6308                 ;NOTE IF %UMLTU=1, OR IF LOWER -> PDP6, THE GARBAGS ACS ARE USED.
6309                 ;ELSE, THE ACS COME FROM THE JOB WHICH OUR LOWER HALF COMES FROM.
6310 ;RH             ;JOB INDEX OF THE "SPECIFIED JOB". -1 => PDP6.
6311                 ;NOT NEEDED IF %UMMPL=%UMMPU=0.
6312
6313 PGLDU:  MOVE R,UMAPS(U)
6314 ;SET PAGE MAP AT INT. LEVEL, NOT CLOBBERING JOB'S UMAPS. ARG IN R.
6315 PGLD:   MOVEM R,LUMPS   ;LAST UMAPS ACTUALLY USED
6316         AOS NPGLD       ;COUNT # CALLS TO PGLD
6317         PUSH P,A        ;R HAS UMAPS CODE
6318         PUSH P,B
6319         PUSH P,C
6320         HRRZ C,U
6321 IFN KA10P, MOVSI B,NUVPG/2      ;SET UP NORMAL DBL, MIGHT BE CHANGED IF PDP6
6322 IFE KA10P, MOVSI B,0            ;ONLY KA10 HAS DBL
6323         TLNN R,%UMMPL
6324          JRST PGLD3A    ;USE NORMAL LOW SEG
6325 IFN PDP6P,[
6326         TRNE R,400000
6327          JRST PGLD3B    ;USE PNTR TO PDP6
6328 ]
6329         HRRZ C,R
6330         TLNE R,%UMLTU   ;SKIP ON USE HIS LOWER
6331          JRST PGLD3D    ;USE HIS UPPER
6332 PGLD3A: HRRI B,UDBR1A(C)
6333         TLNE R,%UMSOA
6334          JRST PGLD3G    ;MAKE AC'S POINT AT SWAP OUT AC'S
6335         MOVEI A,UUOACS(C)
6336 PGLD3F: MOVEM B,UPDBR1(U)
6337 IFN KA10P, DPB A,[2300,,UPACP(U)]       ;STORE AC PNTR
6338 IFE KA10P,[
6339         CAMN A,AC1PTR   ;IF CHANGING AC BLOCK 1
6340          JRST PGLD3H
6341         EXCH A,AC1PTR   ;STORE OLD BLOCK 1
6342         MOVE B,A
6343         XCTR XBR,[BLT B,17(A)]
6344         MOVS A,AC1PTR   ;AND LOAD NEW BLOCK 1
6345         XCTR XBW,[BLT A,17]
6346 PGLD3H: ] ;IFE KA10P
6347 IFN KA10P, MOVSI B,NUVPG/2      ;SET UP DBL FOR DBR2
6348 IFE KA10P, MOVSI B,0
6349         HRRI B,UDBR2A(U)
6350         TLNN R,%UMMPU
6351          JRST PGLD6     ;USE NORMAL UPPER SEG
6352         HRRI B,UDBR2A(R)
6353         TLNE R,%UMUTL
6354          HRRI B,UDBR1A(R)
6355 IFN PDP6P,[
6356         TRNE R,400000
6357          MOVE B,PDP6MP
6358 ]
6359 PGLD6:  MOVEM B,UPDBR2(U)
6360 PGLDR1: LPMR UPGML(U)
6361         POP P,C
6362         POP P,B
6363         POP P,A
6364         POPJ P,
6365
6366 IFN PDP6P,      PGLD3B: SKIPA B,PDP6MP
6367 PGLD3D: HRRI B,UDBR2A(R)
6368         MOVEI A,GACS
6369         JRST PGLD3F
6370
6371 PGLD3G: MOVEI A,AC0S(C)
6372         JRST PGLD3F
6373
6374 GACS:   BLOCK 20        ;GARBAGE AC'S POINTED TO BY ACPNTR WHEN ITS REALLY POINTING
6375                 ;AT UPPER PAGES OR PDP6  SHOULD HOPEFULLY NEVER GET REFERENCED
6376
6377 ;MAIN PROGRAM MAP-SETTING ROUTINES.
6378 IFN PDP6P,[
6379 MP6LD:  SKIPA J,[%UMMPU,,-1]    ;LOAD UPPER DBR TO PNT TO 6
6380 ];PDP6P
6381 MPLDZ:   MOVEI J,0              ;SET NORMAL MAP - OUR OWN CORE.
6382 MPLD1:  CAMN J,UMAPS(U)         ;SET UMAPS AS SPEC'D
6383          JRST CLKONJ
6384         MOVEM J,UMAPS(U)
6385 MPLD:   CONO PI,CLKOFF
6386         PUSHJ P,PLD
6387         JRST CLKONJ
6388
6389 ;SET MAP TO JOB # IN J; MIGHT OR MIGHT NOT BE THE CURRENT JOB. SAVES RH(J)
6390 MPLDJ:  CAME J,USER
6391          TLOA J,%UMSOA+%UMALL   ;OTHER JOB'S ACS ARE IN ITS AC0S.
6392           TLO J,%UMALL          ;THIS JOB => WANT UUOACS.
6393         JRST MPLD1
6394
6395 ;SIMILAR ROUTINES, BUT FOR USE WHEN CLKCHN IS OFF AND SHOULD STAY OFF.
6396 IFN PDP6P,[
6397 PLD6:   SKIPA J,[%UMMPU,,-1]    ;MAKE UPPER DBR POINT TO PDP6.
6398 ];PDP6P
6399 PLDZ:    MOVEI J,0              ;NORMAL MAP
6400 PLD1:   MOVEM J,UMAPS(U)
6401 PLD:    SPM UPGML(U)    ;IF ANY INHIBITED FAULT PRESENT, CAUSE IT TO GET STORED AWAY
6402         PUSH P,R
6403         PUSHJ P,PGLDU   ;CAUSE ACTUAL PG LOAD TO HAPPEN
6404         POP P,R
6405         POPJ P,
6406 \f
6407 SUBTTL GIVING THE USER INTERRUPTS
6408
6409 SEAR2E: MOVE A,PIRQC(U)
6410
6411 ;ROUTINE TO HANDLE FIRST WORD (PIRQC) INTS
6412 SEAR2A: JUMPL A,SEAR2B  ;REQUEST TO PCLSR
6413         SKIPN PICLR(U)
6414          JRST SEAR2C    ;PI IN PROG, ONLY LOOK FOR FATAL INTS.
6415         SETCM Q,IDF1(U)
6416         AND Q,MSKST(U)  ;ENABLED UNDEFERRED INTS.
6417         TDNN A,Q        ;ANY OF THOSE PENDING,
6418          TDNE A,[BADBTS]        ;OR ANY CLASS 1 OR 2 => INTERRUPT.
6419           CAIA
6420            JRST SEARL2
6421         ANDCA Q,A       ;GET DISABLED OR DEFERRED PENDING INTS.
6422         TDNN Q,[BADBTS] ;ANY CLASS 1 OR 2 DISABLED OR DEFERRED
6423          JRST INTWD1     ;NO, INT. THIS JOB.
6424         JRST SEAR2D     ;YES, INT. SUPERIOR.
6425
6426 SEAR2C: TDNN A,[BADBTS] ;PI IN PROG: ANY CLASS 1 OR 2 ?
6427          JRST SEARL2     ;NO, NOTHING TO DO.
6428 SEAR2D: PUSHJ P,PCLSR   ;INT. THE SUPERIOR: PCLSR FIRST.
6429          JRST SEARC     ;CAN'T STOP THIS JOB IN EXEC MODE.
6430         SETZ B,         ;OK, HANDLE FATAL 1ST WORD INTS IN A, AND NO 2ND WORD INTS.
6431
6432 ;HANDLE A FATAL INTERRUPT BY INTERRUPTING THE SUPERIOR.
6433 ;FATAL 1ST WORD INTERRUPTS IN A,  FATAL 2ND WORD INTS IN B.
6434 INTSUP: MOVEM A,SRN4(U) ;.FTL1
6435         MOVEM B,SRN5(U) ;.FTL2 ;PUT THE FATAL INTERRUPTS WHERE SUPERIOR CAN READ THEM.
6436         MOVSI T,BUSRC
6437         IORM T,USTP(U)  ;STOP INFERIOR
6438 IFN SWPWSP, PUSHJ P,LVLOAD
6439         MOVSI T,BULGOS  ;IF LOST TRYING TO LOG OUT, ABORT LOGOUT
6440         ANDCAM T,APRC(U)
6441         MOVE Q,U        ;SAVE USER INTERRUPTING
6442         SKIPGE U,SUPPRO(U)      ;SKIP UNLESS TOP LEVEL
6443          JRST INTTOP    ;REALLY TOP LEVEL
6444         HLLZ T,U        ;GET INT BIT
6445         IORM T,IFPIR(U) ;TURN ON INTERRUPT BIT IN SUPERIOR
6446         HRRZS U         ;CLEAR LEFT HALF OF U
6447         CAIL J,(U)      ;SKIP IF SUPERIOR HAS NOT YET BEEN SCHEDULED
6448          JRST SEARL1    ;RESCHEDULE SUPERIOR
6449         JRST SEARL      ;HAVEN'T GOT TO HIM YET SO CONTINUE
6450
6451 INTTOP: MOVEI T,SCRDET
6452         SKIPL APRC(Q)   ;IF JOB ISN'T ALREADY DISOWNED
6453          IORM T,SUPCOR  ;SAY SOMEONE WANTS TO BE DETACHED.
6454         JRST SEARL      ;LEAVE STOPPED, SYS JOB WILL DETACH SOMEDAY.
6455
6456 SEAR2B: PUSHJ P,PCLSR   ;PCLSR THE JOB, E.G. SO IT CAN GET AN IOC ERROR
6457          JRST SEARC     ;RUNNING IN EXEC MODE, GO RUN IT
6458         MOVSI A,(SETZ)  ;CLEAR REQUEST
6459         ANDCAM A,PIRQC(U)
6460         JRST SEARL1     ;INSPECT THIS JOB AGAIN
6461 \f
6462 ;IFPIR IS NONZERO BUT PIRQC IS ZERO.
6463 INTWD2: SKIPN PICLR(U)
6464          JRST SEARL3    ;IGNORE 2ND WD INTS IF PI IN PROG.
6465         AND B,MSKST2(U)
6466         ANDCM B,IDF2(U) ;GET ENABLED UNDEFERRED INTS.
6467         JUMPE B,SEARL3  ;ALL DISABLED OR DEFERRED.
6468         JSP T,INTPAG    ;MAKE SURE NOT WAITING FOR PAGE NEEDED FOR INT.
6469         PUSHJ P,PCLSR   ;DON'T INT. EXCEPT IN USER MODE.
6470          JRST SEARC
6471         SETZ A,         ;1ST WD INTS TO GIVE = 0.
6472         JRST INTSRC     ;2ND WD INTS TO GIVE ALREADY IN B.
6473
6474 ;PIRQC WAS NONZERO BUT NO FATAL INTS.
6475 INTWD1: JSP T,INTPAG    ;IF TRIED BEFORE & WENT TO INTPFL, WAIT FOR PAGE.
6476         PUSHJ P,PCLSR   ;CAN INT. ONLY IN USER MODE.
6477          JRST SEARC
6478         MOVE B,IFPIR(U)
6479         AND B,MSKST2(U) ;GET PENDING ENABLED UNDEFERRED 2ND WD INTS IN B.
6480         ANDCM B,IDF2(U)
6481         AND A,MSKST(U)
6482         ANDCM A,IDF1(U) ;PENDING ENABLED UNDEFERRED 1ST WD INTS IN A.
6483 INTSRC: AOS NAUINT      ;ELSE 1 MORE ATTEMPT TO INTERRUPT.
6484         MOVSI R,%UMSOA  ;LOAD ORDINARY MAP FOR THIS USER.
6485         PUSHJ P,PGLD    ;BUT ACS -> SWAP OUT ACS.
6486         HRRZ T,40ADDR(U) ;GET ADDR OF USER'S LOCATION "40"
6487         XCTRI XR,[MOVE T,2(T)] ;TRY TO GET CONTENTS OF "42" (..I SO STOP ON EXEC PG FAULT DOESNT)
6488          SKIPA R,T
6489           JRST INTPFL   ;PAGE FAULT IN XCTR, GIVE UP & WAIT FOR PAGE.
6490         ANDI R,-1
6491         JUMPE R,INTBAD  ;42 POINTS TO 0 => BADPI ERROR.
6492         MOVE TT,OPTION(U)
6493         TLNN TT,%OPINT  ;NEW STYLE INTERRUPTS?
6494          JRST INTOLD     ;NO, OLD STYLE.
6495         XCTRI XR,[MOVE R,(R)] ;GET ADDR OF HIS INT PDL PTR.
6496          CAIA
6497           JRST INTPFL
6498         JUMPGE T,INTBAD
6499         CAMGE T,[-72.*5-1,,]
6500          JRST INTBAD
6501         XCTRI XR,[MOVE H,(R)] ;GET CONTENTS OF INT PDL PTR.
6502         JRST INTSR2     ;ADVANCE T PAST INT PDL PTR ADDR.
6503          JRST INTPFL
6504
6505 INTSR0: XCTRI XR,[MOVE C,(T)] ;GET THE INTS NEXT INT TABLE ENTRY
6506          SKIPA D,B
6507           JRST INTPFL   ;APPLIES TO.
6508         XCTRI XR,[AND D,1(T)]
6509          CAIA
6510           JRST INTPFL
6511         AND C,A         ;WHICH OF THEM ARE WE TRYING TO GIVE?
6512         JUMPN C,.+2
6513          JUMPE D,INTSR1 ;NOT GIVING ANY OF THEM, TRY NEXT ENTRY.
6514         MOVE Q,IDF1(U)  ;GET CURRENT SETTINGS OF DEFER WORDS.
6515         XCTRI XW,[MOVEM Q,3(H)]
6516          SKIPA Q,IDF2(U)        ;AND PUT INTO NEXT INT PDL FRAME.
6517           JRST INTPFL
6518         XCTRI XW,[MOVEM Q,4(H)]
6519          SKIPA Q,UPC(U) ;ALSO PUT CURRENT PC IN FRAME.
6520           JRST INTPFL
6521         XCTRI XW,[MOVEM Q,5(H)]
6522          CAIA
6523           JRST INTPFL
6524         XCTRI XR,[MOVE E,2(T)] ;NOW SEE WHICH DEFER BITS TO TURN ON NOW.
6525          CAIA
6526           JRST INTPFL
6527         XCTRI XR,[MOVE TT,3(T)]
6528          CAIA
6529           JRST INTPFL
6530         XCTRI XR,[MOVE Q,4(T)] ;AND THE NEW PC.
6531          TLOA Q,%PCUSR
6532           JRST INTPFL
6533         TLZ Q,BADPC
6534         SKIPGE IOTLSR(U)
6535          TLO Q,%PCUIO   ;DON'T CHANGE HIS IOTLSR STATUS.
6536         XCTRI XW,[MOVEM C,1(H)]
6537          CAIA           ;PUT INTS BEING GIVEN IN
6538           JRST INTPFL   ;INT. PDL FRAME.
6539         XCTRI XW,[MOVEM D,2(H)]
6540          TDZA B,D
6541           JRST INTPFL
6542         MOVE W,H        ;REMEMBER PDL PTR BEFORE INCREMENT, FOR PDL OV TESTING
6543         ADD H,[5,,5]
6544         LDB J,[220500,,R]       ;HOW MANY ACS SHOULD WE SAVE?
6545         JUMPE J,INTSR5          ;NONE?
6546         HRLS J
6547         ADD H,J                 ;ADVANCE THE PDL PTR OVER WHERE THEY'LL GO.
6548         SUBM H,J                ;GET BACK THE OLD UN-ADVANCED PDL PTR IN J.
6549         ROT R,14
6550         HRLI J,(R)              ;PUT 3.7-4.1 OF R INTO LH(J) CIRCUITOUSLY
6551         TLZ J,777760
6552         ROT R,-14
6553         AOS J                   ;MAKE J POINT AT 1ST UNUSED PDL WORD.
6554         XCTRI XBRW,[BLT J,(H)]
6555          CAIA
6556           JRST INTPFL
6557 INTSR5: JUMPGE R,INTSR4 ;SAVE DEBUGGING INFO ON INT PDL IF USER WISHES
6558         HRRZ J,UPJPC(U)
6559         XCTRI XW,[MOVEM J,1(H)]
6560          SKIPA J,SUUOH(U)
6561           JRST INTPFL
6562         XCTRI XW,[MOVEM J,2(H)]
6563          SKIPA J,LSPCL(U)
6564           JRST INTPFL
6565         XCTRI XW,[MOVEM J,3(H)]
6566          CAIA
6567           JRST INTPFL
6568         ADD H,[3,,3]
6569 INTSR4: MOVE J,U        ;MAYBE? SCHED LOOP WANTS USER IDX IN J?
6570         XCTRI XW,[MOVEM H,(R)]  ;STORE BACK THE PDL POINTER, THUS FINALIZING ALL
6571          TDZA A,C       ;INTS HAVE BEEN GIVEN; NOW WE CAN CHANGE THE USER VARS.
6572           JRST INTPFL
6573         ANDCAM C,PIRQC(U)
6574         ANDCAM D,IFPIR(U)
6575         IORM E,IDF1(U)  ;SET THE DEFER BITS SPEC'D IN TABLE ENTRY.
6576         IORM TT,IDF2(U)
6577         MOVEM Q,UPC(U)  ;START USER AT INT HANDLER.
6578         JUMPL H,INTSR3  ;NOW CHECK FOR INT PDL OVFLO.
6579         JUMPGE W,INTSR3
6580         MOVEI TT,%PIPDL ;THERE WAS OVFLO, SET PDL OV INT
6581         TDNN TT,MSKST(U) ;IF ENABLED.
6582          JRST INTSR3
6583         IORM TT,PIRQC(U)
6584         JRST SEAR2E     ;RE-TRY THE INTERRUPT.
6585
6586 INTSR3: JUMPN A,SEAR2E  ;MORE INTS TO GIVE => RETRY.
6587         JUMPN B,SEAR2E
6588 INTSRX: AOS NUINT       ;1 MORE INT GIVEN SUCESSFULLY.
6589         SPM UPGML(U)
6590         JRST SEARC      ;SCHEDULE.
6591
6592 INTSR1: ADD T,[4,,4]    ;NO INTS GIVEN, TRY NEXT ENTRY.
6593 INTSR2: AOBJN T,INTSR0
6594         JRST INTSUP     ;ENABLED INTS BUT NO ENTRIES FOR THEM.
6595
6596 ;GIVE INTS THE OLD WAY.
6597 INTOLD: SKIPN C,A       ;GIVE INTS OF 1 WD AT A TIME.
6598          SKIPA C,B       ;(NO 1ST WD, GIVE ALL 2ND WD)
6599         TDZA B,B        ;(SOME 1ST WD INTS, GIVE NO 2ND WD INTS)
6600          TLO C,4^5       ;(GIVING 2ND WD, SET SIGN TO SAY SO)
6601         XCTRI XW,[MOVEM C,(T)]
6602          SKIPA Q,UPC(U) ;STORE INTS BEING GIVEN,
6603           JRST INTPFL
6604         MOVEI T,2(T)    ;ADVANCE -> PLACE TO START USER.
6605         XCTRI XW,[MOVEM Q,-1(T)]
6606          TLOA T,%PCUSR  ;OLD PC STORED, SET UP NEW.
6607           JRST INTPFL
6608         ANDCAM A,PIRQC(U) ;SAY THESE INTS NOW GIVEN.
6609         ANDCAM B,IFPIR(U)
6610         SKIPGE IOTLSR(U)
6611          TLO T,%PCUIO
6612         MOVEM T,UPC(U)  ;SET HIS PC -> TSINT+2
6613         SETZM PICLR(U)
6614         JRST INTSRX
6615 \f       
6616 ;IF WE ARE WAITING FOR A PAGE NEEDED FOR TAKING AN INTERRUPT,
6617 ;GIVE UP ON TRYING TO TAKE TE INT. UNLESS PAGE HAS COME IN SINCE LAST TRY.
6618 INTPAG: MOVSI E,%SWPGW
6619         SKIPE FLSINS(U)
6620          TDNN E,USWST(U)
6621           JRST (T)      ;JOB NOT WAITING FOR PAGE
6622         MOVSI E,%SWINT
6623         TDNN E,USWST(U)
6624          JRST (T)       ;NOT WAITING FOR INTERRUPT PAGE
6625         MOVE E,T
6626         MOVE T,EPDL2(U)
6627         XCT FLSINS(U)
6628          JRST SEARL     ;PAGE NOT IN
6629         MOVSI T,%SWPGW+%SWINT   ;PAGE IN
6630         ANDCAM T,USWST(U)
6631         SETZM FLSINS(U)
6632         SOS NPGWTU
6633         JRST (E)
6634
6635 ;COME HERE WHEN AN XCTRI TAKES FAULT WHILE TRYING TO STORE AN INTERRUPT.
6636 INTPFL: MOVE J,U        ;MAYBE? SCHED MAIN LOOP WANTS USR IDX IN J.
6637         SPM UPGML(U)    ;STORE MAP IN INTERRUPTING STATE
6638 IFN KA10P, LDB T,[221000,,UPJPC(U)]     ;FAULT ADDRESS
6639 IFN KL10P, LDB T,[$PFPNO,,UPFW(U)]
6640 IFN KS10P, LDB T,[$PFPNO,,EPTP7W]       ; Fault happened at PI level 7.
6641         ROT T,-1
6642         ADDI T,UPGCP(U)
6643         SKIPL T
6644          TLOA T,222200
6645           HRLI T,2200
6646         LDB E,T
6647         JUMPE E,INTBAD  ;DON'T HAVE PAGE
6648 IFN KA10P,[
6649         HLLZ T,UPQUAN(U)
6650         TLNE T,100
6651          JRST INTBAB    ;WRITE IN RD ONLY
6652 INTBAC: HLLZ T,UPC(U)   ;SIMULATE SETUP OF OPC
6653         LSH T,-5
6654         HRR T,UPC(U)
6655         MOVEM T,UPOPC(U)        ;FAULT STATUS
6656         MOVSI T,1000
6657         IORM T,UPQUAN(U)        ;BIT NOT SET BY XCTRI
6658         MOVSI T,%SWINT
6659         IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATT
6660         LPMRI UPGML(U)  ;SET MPV FLAG, WILL CAUSE INT. LATER LPMR'S WON'T
6661                         ; CLEAR IT.
6662         JRST SCHED6     ;"RUN" USER, TAKING PAGE FAULT IMMEDIATELY
6663
6664 INTBAB: TLNE T,50       ;NO ACCESS OR W IN RWF
6665          JRST INTBAC    ;PAGING BOX BUG? IGNORE RD ONLY
6666         JRST INTBAD     ;REALLY IS READ-ONLY.
6667 ] ;KA10P
6668 IFN KL10P,[
6669         SUBI T,UPGCP-UPGMP
6670         LDB E,T
6671         TRNE E,600000
6672          LSH E,-20
6673         CAIN E,2        ;RWF
6674          JRST INTBAB
6675         MOVS T,UPFW(U)
6676         ANDI T,%PFCOD
6677         CAIE T,%PFPNA
6678          JRST INTBAD    ;REAL VIOLATION
6679 ;DROPS THROUGH
6680 \f;DROPS IN
6681 ;KL10P  ;PF OR RWF, TAKE THE FAULT, READ IN THE PAGE, THEN TRY TO INTERRUPT AGAIN
6682
6683 INTBAB: MOVSI T,%SWINT
6684         IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATTEMPT
6685         SETOM DLSRCH    ;DON'T INTERRUPT AT INTBA1, SCHEDULE, TRY TO PCLSR
6686                         ; WITH WRONG PC
6687         MOVEI T,INTBA1
6688         EXCH T,UPC(U)   ;HACK USER'S PC
6689         MOVEM T,EPDL3(U)
6690         JRST SCHED6     ;RUN USER, RETURNING IMMEDIATELY TO INTBA1
6691
6692 INTBA1: CONO PI,PIOFF
6693         SETZM DLSRCH
6694         MOVEM U,PFAILU  ;SIMULATE A PAGE FAULT ON THE INTERRUPT WORD
6695         MOVE U,USER
6696         MOVE U,EPDL3(U)
6697         MOVEM U,PFOPC1  ;RESTORE USER'S PC
6698         MOVNI U,2
6699         MOVEM U,PFAILF  ;FLAG FAULT FROM INTPFL
6700         MOVE U,PFAILU   ;RESTORE U SO CLKSAV CAN RE-SAVE IT
6701         CONO PI,CLKRQ   ;TURN PI SYSTEM ON AND CAUSE CLOCK BREAK
6702         JRST .          ;TAKES A WHILE TO GO OFF
6703 ] ;KL10P
6704 IFN KS10P,[
6705         MOVE T,EPTP7W
6706         TLNE T,%PF2.8           ; Write in read only?
6707          JRST INTBAD            ; Yes:  %PIB42
6708         MOVEM T,UPFW(U)         ; No:  Set up for a simulated fault
6709         MOVSI T,%SWINT
6710         IORM T,USWST(U)         ; Signal fault as result of interrupt attempt
6711         SETOM PFAILF            ; Cause CLK level to go to PFLU2 at
6712                                 ; first opportunity.
6713         MOVEI T,CCLKRQ          ; Make sure that happens real fast
6714         EXCH T,UPC(U)           ; by setting his PC thusly.
6715         MOVEM T,EPTPFO          ; Save old PC as location of fault.
6716         JRST SCHED6             ; Go run this user.
6717 ] ;KS10P
6718
6719 INTBAD: MOVEI A,%PIB42  ;TURN ON BAD PI LOC INT BIT
6720         IORB A,PIRQC(U) ;GIVE USER INTERRUPT(MUST IORM TO AVOID TIMING ERR)
6721         JRST SEAR2A     ;RE-PERFORM ACTIONS FOR NON-ZERO PIRQC
6722                 ;WILL CAUSE AN INTERRUPT TO SUPERIOR
6723
6724 ;INTERRUPT ALL USERS THAT WANT IT
6725 ;  C(A) IS BIT IN PIRQC TO TURN ON
6726 DBGINT: MOVSI A,(%PIDBG)        ;"SYS BEING DEBUGGED" INT
6727 INTALL: MOVEI U,0       ;ENTRY INITIALIZE
6728 INTA2:  ADDI U,LUBLK    ;ADVANCE TO NEXT BLOCK OF USER VARIABLES
6729         CAML U,USRHI    ;SKIP UNLESS AT END
6730         POPJ P,         ;THROUGH, RETURN
6731         SKIPN UNAME(U)  ;SKIP IF BLOCK IN USE
6732         JRST INTA2      ;IDLE, IGNORE
6733         LDB T,[410100,,USTP(U)] ;GET BUCSTP OF USERS STOP WORD
6734         JUMPN T,INTA2   ;IF USER CONTROL STOPPED, JUMP TO IGNORE
6735         MOVE B,MSKST(U) ;PICK UP INTERRUPT MASK
6736         AND B,A         ;MASK C(B) TO APPROPRIATE BIT
6737         IORM B,PIRQC(U) ;GIVE INT TO USER
6738         JRST INTA2      ;LOOP
6739 \f
6740 SUBTTL PCLSR ROUTINES
6741
6742 ; PUT PC OF USER WHOSE INDEX IS IN U IN USER MODE
6743 ;  (CALL ONLY WITH CLOCK OFF OR CLOCK BREAK IN PROGRESS)
6744 ;SKIPS IF SUCCESSFUL, FAILS IF USER RUNNING IN EXEC CODE OR HAS TO BE FINALIZED
6745 ;
6746 PCLSR:  AOS NPCLSR
6747         CAIG U,L
6748          BUG                    ;PCLSR'ING NULL, SYS OR CORE JOB?
6749         MOVEI T,L
6750         IDIVM U,T
6751         IMULI T,L
6752         CAMN T,U                ;IS U REALLY A MULTIPLE OF LUBLK?
6753          SKIPN UNAME(U)         ;SHOULD NOT HAPPEN TO NONEXTANT JOB
6754           BUG
6755         SKIPE USTP(U)
6756          JRST POPJ1             ;USER STOPPED (MUST ALREADY BE IN USER MODE)
6757         AOS NEPCLS
6758         SKIPLE T,RPCL(U)
6759          JRST PCLSR2            ;LOSER IS RPCLSR'ING SOMEONE
6760 PCLSR3: MOVE T,SUEXIT(U)
6761 IFE KA10P,SUB T,U
6762         CAME T,[JRST 2,@XUUOH]
6763          JRST PCLSR5            ;EXIT ALREADY CLOBBERED
6764         MOVE T,UPC(U)           ;PICK UP PROGRAM COUNTER (FLAGS IN L.H.)
6765         TLNN T,%PCUSR           ;SKIP IF USER MODE ON
6766          JRST PCLSR8            ;JOB CURRENTLY IN EXEC MODE
6767         SOS NEPCLS              ;WAS WRONGLY AOS'ED
6768         CLEARM FLSINS(U)        ;IN CASE HE WAS WAITING FOR A PAGE OR CIRPSW
6769         MOVE T,USWST(U)
6770         TLNE T,%SWPGW
6771          SOS NPGWTU
6772         MOVSI T,%SWPGW+%SWRUN+%SWINT
6773         ANDCAM T,USWST(U)
6774         AOS (P)
6775         POPJ P,
6776
6777 PCLSR8: SKIPE FLSINS(U)         ;SKIP IF UNBLOCKED
6778          JRST PCLSR1            ;HUNG, TRY TO BACK UP TO UUO
6779 PCLSR4: MOVE T,[JRST ONEFLS]
6780         MOVEM T,SUEXIT(U)       ;MUNG EXIT OF UUO, COME BACK LATER
6781 PCLSRF: AOS NFPCLS
6782         POPJ P,
6783
6784 PCLSR2: SETZM RPCL(U)           ;CLEAR OUT POINTERS IN BOTH DIRECTIONS
6785         SETZM RPCL(T)
6786         JRST PCLSR3
6787
6788 PCLSR5: SKIPN FLSINS(U)
6789          JRST PCLSRF            ;NOT HUNG, LET RUN TO COMPLETION
6790 IFN KA10P,[                     ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6791         CAME T,[JRST ONEPROC]   ;SKIP IF ONE PROCEEDING A SYS CALL
6792          JRST PCLSR6
6793         MOVSI T,%PC1PR
6794         IORM T,SUUOH(U)         ;RESET SINGLE INSTRUCTION PROCEED
6795 PCLSR6:] ;KA10P
6796 IFN KS10P,[                     ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6797         CAME T,[JRST ONEPR4]    ;SKIP IF ONE PROCEEDING A SYS CALL
6798          JRST PCLSR6
6799         MOVSI T,OIPBIT
6800         IORM T,XUUOH(U)         ;RESET SINGLE INSTRUCTION PROCEED
6801 PCLSR6:] ;KS10P
6802         MOVE T,UPC(U)
6803         TLNE T,%PCUSR
6804          BUG
6805 IFN KA10P,      MOVE T,[JRST 2,@UUOH]
6806 IFE KA10P,[
6807         MOVSI T,(JRST 2,@)
6808         HRRI T,UUOH
6809 ] ;IFE KA10P
6810         MOVEM T,SUEXIT(U)       ;UNCLOBBER EXIT
6811 PCLSR1: HLRZ T,LSPCL(U)         ;SAVE LAST TWO DISTINCT LOCS PCLSR'ED FROM
6812         CAIN T,@UPC(U)
6813          JRST PCLSR9
6814         HRL T,UPC(U)
6815         MOVEM T,LSPCL(U)
6816 PCLSR9: SOS T,SUUOH(U)          ;GET USER LOCATION OF HIS CURRENT UUO
6817 UFL5:
6818 IFN KL10P,[
6819         TLC T,%PS1PR-%PSINH
6820         TLCN T,%PS1PR-%PSINH
6821          TLO T,%PSINH           ;ONE PROCEEDING AND INSTR NOT COMPLETE
6822 ] ;KL10P
6823         MOVEM T,UPC(U)          ;SET USERS PROGRAM COUNTER
6824 IFE KA10P,[
6825         MOVSI T,701100          ;RESTORE PAGE-CONTEXT TO USER MODE
6826         HLLM T,CLCX(U)
6827 ] ;IFE KA10P
6828         CLEARM UMAPS(U)         ;RESTORE TO NORMAL MAP
6829         SETZM FLSINS(U)         ;CLEAR OUT ANY BLOCKING CONDITION
6830         MOVE T,USWST(U)
6831         TLNE T,%SWPGW
6832          SOS NPGWTU
6833         MOVSI T,%SWPGW+%SWRUN+%SWPCL+%SWINT     ;NOT BLOCKED ON PAGE, NOT UNBLOCKED SWAPOUT,
6834         ANDCAM T,USWST(U)       ; NOT INTERRUPT PAGE, NOT SWAPPED OUT WHILE BLOCKED
6835         SKIPE T,LSWPR(U)
6836          JRST LSWZAP            ;REQUIRED TO UNLOCK SWITCHES
6837 PCLSR7:
6838 IFE KA10P,[
6839         MOVEI T,UUOACS(U)       ;IF JOB U'S ACS ARE IN HARDWARE AC BLOCK 1,
6840         CAMN T,AC1PTR           ;COPY THEM INTO UUOACS WHERE THEY BELONG.
6841          XCTR XBR,[BLT T,UUOACS+17(U)]
6842 ] ;IFE KA10P
6843         MOVEI T,AC0S(U)
6844         HRLI T,UUOACS(U)
6845         BLT T,AC17S(U)
6846         JRST POPJ1              ;EXIT AFTER BACKING UP TO UUO
6847 \f;
6848 ; AOS USTP OF USER IN A
6849 ;
6850 NJRPCL: CAIE A,-1       ;ENTRY TO IGNORE IF NULL JOB
6851 RPCLSR: CAMN A,USER     ;NORMAL ENTRY
6852         POPJ P,         ;TRYING TO RPCLSR SELF OR NULL JOB
6853         PCLT
6854         PUSH P,U        ;SAVE U
6855         MOVE U,A        ;GET INDEX OF RPCLSRED JOB IN U
6856         MOVE A,USER     ;GET RPCLSRING USER INDEX IN A
6857         CONO PI,CLKOFF  ;TURN OFF CLOCK BREAKS
6858         PUSHJ P,PCLSR   ;PUT USER IN USER MODE
6859         JRST RPCLOS     ;JUMP IF CAN'T DO IT RIGHT NOW
6860         AOS USTP(U)     ;WIN,STOP USER
6861         CONO PI,CLKON   ;RE-ENABLE CLOCK BREAKS
6862 RPCLS1: MOVE A,U        ;RESTORE A
6863         POP P,U         ;RESTORE U
6864         POPJ P,
6865 ;
6866 RPCLOS: SKIPE RPCL(U)   ;SKIP IF ZERO RPCL FOR USER BEING RPCLSRED
6867         JRST RPCLS2     ;SOMEONE GOT THERE FIRST
6868         SKIPE RPCL(A)   ;SKIP IF ZERO RPCL FOR RPCSRING USER
6869         JRST UDELAY     ;YOU ARE BEING RPCLSR'ED, SURRENDER
6870         HRROM A,RPCL(U) ;SET UP RPCL IN VARS OF RPCLSRED USER
6871         HRRM U,RPCL(A)  ;" OF RPCLSRING USER
6872         PCLT
6873         SKIPE RPCL(A)   ;WILL NOT SKIP AT FIRST
6874         PUSHJ P,UFLS    ;WAIT FOR PERSON BEING RPCLSRED TO GET TO ONEFL2
6875         JRST RPCLS1
6876 ;
6877 RPCLS2: MOVE A,U        ;RESTORE A AND U
6878         POP P,U
6879         PCLT
6880         SKIPE RPCL(A)   ;WAIT FOR OTHER GUY TO WIN
6881         PUSHJ P,UFLS
6882         JRST RPCLSR     ;THEN TRY AGAIN
6883
6884 ;
6885 ; UNDO AN RPCLSR
6886 ;
6887 NJUPCL: CAIE A,-1       ;ENTRY TO IGNORE IF NULL JOB
6888 UPCLSR: CAMN A,USER     ;REGULAR ENTRY
6889         POPJ P,         ;TRYING TO UPCLSR SELF OR NULL JOB
6890         SOSGE USTP(A)
6891          BUG
6892         POPJ P,
6893
6894 IFN KA10P,[
6895 ;
6896 ; RETURN FROM SYSTEM CALL IN ONE PROCEED MODE
6897 ;
6898 ONEPROC:CONO PI,CLKOFF  ;TURN OFF CLOCK BREAKS
6899         MOVE U,USER     ;BE SURE U HAS RUNNING USER INDEX IN IT
6900         MOVEI T,%PI1PR
6901         IORM T,PIRQC(U) ;GIVE USER INTERRUPT
6902         JRST ONEPR2
6903 ]
6904 \f
6905 SUBTTL KS-10 ONE-PROCEED
6906
6907 IFN KS10P,[
6908 ONEPRO: SYSCTX                  ;SWITCH TO SYSTEM AC BLOCK
6909         SKIPGE U,USER
6910          BUG AWFUL,[ONE-PROCEED IN NULL JOB]
6911         MOVE T,1PROPC(U)        ;PC OF NEXT INSTRUCTION TO EXECUTE
6912         TLNE T,%PSUSR           ;NORMALLY USER MODE IS EXPECTED
6913          JRST ONEPR3
6914         HRRZ T,T                ;SEE IF IT'S FIRST INSTRUCTION OF EXEC ENTRY
6915         CAIE T,UUOH0
6916          CAIN T,MUUOTR
6917           SKIPA TT,[JRST ONEPR4]
6918            BUG AWFUL,[ONE-PROCEED IN EXEC MODE],OCT,1PROPC(U)
6919         MOVEM TT,UEXIT          ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
6920         CAIE T,UUOH0            ;AND RESUME PROCESSING UUO
6921          JRST [ USRCTX
6922                 JRST MUUOTR ]
6923         USRCTX
6924         JRST UUOH0
6925
6926 ONEPR3: MOVEM T,UUOH            ;PUT USER PC WHERE ONEFLS WANTS IT
6927 ONEPR4: SYSCTX                  ;COME HERE WHEN ONE-PROC'D UUO FINISHES
6928         MOVE U,USER             ;BE SURE U HAS RUNNING USER INDEX IN IT 
6929         MOVEI T,%PI1PR
6930         IORM T,PIRQC(U)         ;GIVE USER INTERRUPT
6931         JRST ONEFLS
6932 ];KS10P
6933 \f
6934 SUBTTL USER START ROUTINES
6935 ;
6936 ; CALLED EVERY SLOW CLOCK TICK WHEN TTY WANTING TOP PROCEDURE LOADED
6937 ;
6938 USTART: PUSH P,U
6939 USTRT1: SKIPL T,@UTTYO  ;GET TTY TO BE STARTED
6940          JRST [ MOVE U,MMPFR    ;WHEN STARTING A HACTRN, MAKE SURE CORE IS AVAILABLE
6941                 CAIGE U,100
6942                  JRST USTRTL    ;IT'S NOT, SAY SYSTEM FULL
6943                 JRST .+2 ]      ;T HAS INITIAL TTYTBL
6944          MOVSI T,%TBNOT+%TBDTY+%TBNVR   ;NOT A REAL TTY, INITIALIZE TTYTBL TO NO TTY
6945         PUSHJ P,USTRA   ;CREATE NEW USER SLOT ENTRY
6946          JRST USTSC1    ;LOSE, HAVE TO WAIT
6947         SKIPGE T,@UTTYO ;SKIP IF REALLY A TTY
6948          JRST USTRTS    ;DONT LOAD A HACTRN
6949         MOVE T,[SIXBIT /HACTRN/]        ;LOAD HACKTRN
6950 USTRT2: MOVEM T,JNAME(U)        ;SET JOB NAME
6951         MOVEM T,XJNAME(U)
6952         HRLZI T,%PCUSR
6953         HRRI T,1
6954         MOVEM T,UPC(U)
6955         MOVEI T,AC0S(U)
6956         HRLI T,NUSTCD
6957         BLT T,AC17S(U)
6958         MOVE T,JNAME(U)
6959         MOVEM T,AC0S+11(U)
6960         SETZM @UTMPTR(U)        ;GIVE TEMPORARY HIGH PRIORITY
6961         SETZM USTP(U)   ;START UP
6962 USTSC2: AOS T,UTTYO     ;AOS RING BUFF
6963         CAIL T,UTTYS+MXCZS
6964          MOVEI T,UTTYS
6965         MOVEM T,UTTYO
6966         SOSE UTTYCT
6967          JRST USTRT1    ;MORE JOBS TO SET UP
6968         JRST POPUJ
6969
6970 USTRTS: MOVEM U,1(T)    ;STORE USER'S INDEX IN SECOND WORD
6971         MOVE T,(T)      ;GET JNAME FROM FIRST WORD (POINTED TO BY RH OF @UTTYO)
6972 IFN DEMON,[
6973         CAME T,[SIXBIT /LDRDEM/]
6974          CAMN T,[SIXBIT /UNSPOO/]
6975           AOS UTMPTR(U)         ;LOADER, UNSPOOLER -> SYSTEM TREE
6976 ]
6977         JRST USTRT2
6978
6979 USTSC1: MOVE U,USRHI    ;IF A USER IS ^Z'ING AND THERE IS NO POSSIBILITY
6980         SKIPL T,@UTTYO  ;OF GETTING MORE JOB SLOTS,
6981          CAIGE U,LUBLK*MAXJ
6982           JRST POPUJ
6983 USTRTL: MOVSI U,%TANJS  ;THEN MARK THE TTY AS IN NEED OF A "SYSTEM FULL" MESSAGE
6984         IORM U,TTYSTA(T)
6985         MOVEI U,SCRCFM  ;AND WAKE UP THE SYS JOB.
6986         IORM U,SUPCOR
6987         JRST USTSC2     ;REMOVE THIS TTY FROM LIST OF THOSE NEEDING A ^Z.
6988 \f
6989 ;GOBBLE NEW USER SLOT, RESET VARIABLES (SKIPS IF IT WINS)
6990 ;RETURNS INDEX IN U.  IF FAILS, CLOBBERS U!
6991 USTRA:  MOVEI U,0
6992 USTR3:  CAML U,USRHI
6993          JRST USTR1     ;ASSIGN MORE CORE TO USER STORAGE
6994         SKIPN UNAME(U)
6995          JRST USTR2     ;HAVE FOUND FREE USER SLOT (IN U)
6996         ADDI U,LUBLK
6997         JRST USTR3
6998
6999 USTR1:  SKIPGE SJCFF
7000          POPJ P,        ;SYSTEM JOB FLUSHING CORE, WAIT UNTIL IT STABILIZES
7001         MOVEI U,LUBLK   ;MOVE UP USRHI IF SYS HAS ENOUGH CORE
7002         ADD U,USRHI
7003         PUSH P,T
7004         MOVE T,HUSRAD   ;LENGTH OF SYS
7005         CAIGE T,USRSTG(U)
7006          JRST MORCOR    ;SYS NEEDS MORE CORE FOR USER VARIABLES
7007         POP P,T
7008 USSINI: SETOM USTP-LUBLK(U)     ;SYS INITIALIZATION ENTRY
7009         EXCH U,USRHI
7010 USTR2:  PUSHJ P,USTR4   ;RESET USER VARIABLES
7011         MOVEI T,SIOCHN-1(U)
7012         MOVEM T,SIOCP(U)
7013         CLEARM IOCHNM(U)
7014         HRLI T,IOCHNM(U)
7015         HRRI T,IOCHNM+1(U)
7016         BLT T,IOCHNM+17(U)      ;CLEAR ALL I/O CHANNELS
7017 USRST4: HRLI T,AC0S(U)
7018         HRRI T,AC0S+1(U)
7019         SETZM AC0S(U)
7020         BLT T,AC17S(U)  ;CLEAR AC'S & RETURN HAPPY
7021         JRST POPJ1
7022
7023 MORCOR: SUB P,[1,,1]
7024         MOVSI T,SCLDEC
7025         ANDCAM T,SUPCOR ;CLEAR ANY SYS CORE DECREASE REQ
7026         MOVSI T,SCLEX
7027         JRST SUPSET     ;REQUEST MORE CORE FROM SYS JOB
7028 \f;
7029 ; INITIALIZE A SET OF USER VARIABLES
7030 ;  T HAS INITIAL TTYTBL, POSITIVE IT IS TTY # ELSE NO TTY
7031 USTR4:  MOVEM T,TTYTBL(U)
7032         JUMPL T,USTR4B
7033         PUSH P,U
7034         HRRM U,TTYSTS(T) ;TELL TTY IT NOW BELONGS TO NEW JOB,
7035         MOVSI U,%TSCNS  ;AND IS NOW A CONSOLE.
7036         IORM U,TTYSTS(T)
7037         MOVSI U,%TSFRE
7038         ANDCAM U,TTYSTS(T)      ;AND IS NO LONGER FREE
7039         MOVSI U,%TACFM+%TACTZ
7040         ANDCAM U,TTYSTA(T)      ;AND WILL NEED CONSOLE FREE MESSAGE
7041         POP P,U
7042         ADDI T,USRRCE
7043 USTR4A: MOVEM T,UTMPTR(U)
7044         HRROI T,'000
7045         MOVEM T,UNAME(U)
7046         PUSH P,U
7047         MOVE T,U
7048         IDIVI T,LUBLK
7049         POP P,U
7050         DPB T,[000300,,UNAME(U)]
7051         LSH T,-3
7052         DPB T,[060300,,UNAME(U)]
7053         LSH T,-3
7054         DPB T,[140300,,UNAME(U)]
7055         MOVE T,UNAME(U)
7056         MOVEM T,XUNAME(U)
7057         MOVEM T,HSNAME(U)
7058         MOVE T,JNAME(U)
7059         MOVEM T,XJNAME(U)
7060         MOVEI T,(U)
7061         HRLI T,%TSCNS
7062         MOVEM T,TTSTSV+2(U)
7063         SETZM USWST(U)
7064 IFN SWPWSP,[    
7065         SETZM UWRKST(U)
7066         SETZM USVWRK(U)
7067         MOVE T,TIME
7068         ADDI T,2*30.    ;PROTECT FROM SWAPOUT FOR 2 SECONDS (RANDOMLY)
7069         MOVEM T,USWTIM(U)
7070 ];SWPWSP
7071         SETZM NSWPGS(U)
7072         SETZM NMPGS(U)
7073         SETOM JBI(U)            ;NOT JOB DEVICE HANDLER (NOT YET, ANYWAY)
7074         SETZM OPTION(U)
7075         SETZM STTYOP(U)
7076         SETOM TRNLST(U)         ;INIT TRANSL LISTS TO NIL
7077         SETOM TRNLS1(U)
7078         SETZM HUSRAD(U)
7079         JUMPE U,.+5             ;SYSTEM JOB DOESN'T HAVE A MAP
7080                 CLEARM UPGMP(U)
7081                 MOVSI T,UPGMP(U)
7082                 HRRI T,UPGMP+1(U)
7083                 BLT T,UPGCP+NUVPG/2-1(U)
7084         MOVSI T,(MOVEM U,)
7085         HRRI T,AC17S(U)
7086         MOVEM T,SCLUSV(U)
7087 IFE KA10P,[
7088         MOVSI T,(DATAI PAG,)
7089         HRRI T,CLCX(U)
7090         MOVEM T,SCLCXS(U)
7091         MOVEI T,USRSTG(U)
7092 IFN KL10P, LSH T,-9
7093         HRLI T,701100
7094         MOVEM T,CLCX(U)
7095         MOVSI T,(JRST 2,@)
7096         HRRI T,XUUOH(U)
7097         MOVEM T,SUEXIT(U)
7098         MOVSI T,(CAI)           ;INITIALLY IGNORE TRAPS 1 AND 2
7099         MOVEM T,TR1INS(U)
7100         MOVEM T,TR2INS(U)
7101 IFE KS10P,MOVEI T,%PI1PR        ;TRAP 3 IS IGNORED TOO ON KS
7102         MOVEM T,TR3INS(U)       ;TRAP 3 GIVES ONE-PROCEED INTERRUPT ON KL
7103 ] ;IFE KA10P
7104 IFN KL10P,[
7105         SETZM ULSPBR(U)
7106         MOVSI T,MUUOKN          ;UUO NEW PC'S ARE SAME AS SYS JOB'S,
7107         HRRI T,MUUOKN(U)        ; EXCEPT THAT UUO IN EXEC MODE IS AN ERROR
7108         BLT T,MUUOPT(U)
7109         MOVEI T,MUUOEX
7110         HRRM T,MUUOKN(U)
7111 ] ;KL10P
7112 IFN KS10P,[
7113         MOVE T,[%PSPCU,,MUUOEX]
7114         MOVEM T,MUUOKN(U)       ; UUO in Exec mode is an error
7115         MOVEM T,MUUOKT(U)       ; (either case)
7116         HRRI T,UUOH0
7117         MOVEM T,MUUOCN(U)       ; Normal UUO
7118         HRRI T,MUUOTR
7119         MOVEM T,MUUOCT(U)       ; UUO as trap instruction
7120         HRRI T,ONEPRO
7121         MOVEM T,1PRNPC(U)       ; One-proceed jumps to ONEPRO
7122 ] ;KS10P
7123 IFN KA10P,[
7124         MOVE T,[JRST 2,@UUOH]
7125         MOVEM T,SUEXIT(U)
7126 ] ;KA10P
7127         MOVSI T,BUSRC
7128         MOVEM T,USTP(U)
7129         SETOM SUPPRO(U)
7130         SETZM UCLBLK(U)
7131         SETOM UCLBLK+1(U)
7132         MOVE T,[JRST UREALB]
7133         MOVEM T,UCLBLK+2(U)
7134         CLEARM UPGML(U)         ;CLEAR USER PG MAP VARIABS
7135         MOVEI T,UPGML+1(U)
7136         HRLI T,-1(T)
7137         BLT T,UPGMLE(U)
7138 IFN KA10P,[
7139         MOVSI T,1+EXPGNG        ;DONT ENABLE QUAN COUNTER FOR NOW (BUT SET
7140                                 ; EXEC PAGING)
7141         MOVEM T,UPQUAN(U)
7142         MOVE T,EXECMP
7143         MOVEM T,UPDBR3(U)       ;SET UP EXEC DBR
7144         MOVSI T,IFN MCOND DM,[1040] .ELSE [0] ;ON DM, B+C MEMORIES DON'T WORK
7145         MOVEM T,UPACP(U)        ;SET UP B+C MEMORY PTRS
7146 ] ;KA10P
7147 IFN KS10P, SETZM UPQUAN(U)      ; Clear quantum counter.
7148
7149 ;DROPS THROUGH
7150 \f
7151 ;DROPS THROUGH, AND .RESET OF USR DEVICE COMES HERE.
7152 USRST2: MOVE T,UNAME(U)
7153         MOVEM T,USYSNM(U)       ;CLOCK MUST BE OFF OR PI IN PROG ON 7
7154         MOVE T,TIME             ;DON'T SWAP JOB OUT RIGHT AWAY
7155         MOVEM T,LUBTM(U)
7156         PUSH P,A
7157         PUSH P,B
7158         PUSH P,C
7159         PUSH P,E
7160         MOVEI C,UCLBLK(U)
7161         SKIPL 1(C)
7162          JSP E,CLQCLR
7163         SETOM SERVER(U)
7164         SETZM PAGAHD(U)
7165         SETZM PAGRAN(U)
7166         SETZM UWHO1(U)
7167         SETZM UWHO2(U)
7168         SETZM UWHO3(U)
7169 IFN N11TYS,[
7170         SETZM NVDBA(U)  ;0 VIDEO BUFFERS ASSIGNED BY JOB.
7171         SETOM TVCREG(U)
7172         SKIPL T,TTYTBL(U)
7173          PUSHJ P,USTTV0
7174           SETOM TVVBN(U)
7175 USTTV1: ];N11TYS
7176         POP P,E
7177         POP P,C
7178         POP P,B
7179         POP P,A
7180         SETZM URTIME(U)
7181         SETZM UTIME(U)
7182         SETOM RTIMER(U)
7183         MOVSI T,%PCUSR
7184         MOVEM T,UPC(U)
7185         HRLI T,-LUPDL
7186         HRRI T,UPDL-1(U)
7187         MOVEM T,USRPDL(U)
7188         SETZM MSKST(U)
7189         SETZM MSKST2(U)
7190         MOVE T,[20,,40]
7191         MOVEM T,40ADDR(U)
7192         MOVEI T,APRCHN+440
7193         MOVEM T,APRC(U)
7194         SETZM USTYN(U)
7195         SETZM PIRQC(U)
7196         SETZM IFPIR(U)
7197         SETZM IDF1(U)
7198         SETZM IDF2(U)
7199         SETOM PICLR(U)
7200         SETZM FLSINS(U)
7201         SETZM UTRNTM(U)
7202 IFN KL10P,[
7203         SETZM EBOXCT(U)
7204         SETZM EBOXCT+1(U)
7205         SETZM MBOXCT(U)
7206         SETZM MBOXCT+1(U)
7207 ]
7208         SETZM USIPRQ(U)
7209         SETZM TRUNTM(U)
7210         SETZM TSIPRQ(U)
7211 IFE SWPWSP,[
7212         SETZM LTRNTM(U)
7213         SETZM LSIPRQ(U)
7214         SETZM UPGSEC(U)
7215 ];SWPWSP
7216         SETZM IOTLSR(U)
7217         MOVSI T,%OPOJB          ;USR RESET DOESN'T CLEAR OJB OPTION BIT
7218         ANDM T,OPTION(U)
7219         SETOM CORRQ(U)
7220         POPJ P,
7221
7222 USTR4B: MOVEI T,USRRCE+NCT
7223         JRST USTR4A
7224
7225 IFN N11TYS,[
7226 ;SET UP THE BLINKER FOR THE JOB IN U.
7227 USTTV0: SKIPN TEN11F
7228          SKIPL TT11P
7229           POPJ P,
7230         HRL T,TTYTYP(T)
7231         TLNN T,%TY11T
7232          POPJ P,        ;NOT A TV
7233         MOVE A,TT11HD   ;11 HEADER ADR
7234         ADDI A,-NF11TY(T)
7235         LDB B,[141000,,1(A)]    ;VIDEO BUFFER #
7236         TRO B,17_8      ;CSET ALU FCTN
7237         LSH B,4+16.     ;INTO POSITION FOR MOVEMING INTO CONSOLE REG
7238         MOVEM B,TVVBN(U)
7239         JRST POPJ1
7240 ] ;END IFN N11TYS
7241 \f
7242 ;       USER START CODE
7243
7244 NUSTCD: JFCL            ;0
7245         .OPEN 1,7
7246          .LOGOUT        ;2
7247         .CALL 12
7248          .LOGOUT
7249         .IOT 1,2
7250         JRST (2)
7251         .UII,,(SIXBIT/SYS/)     ;7
7252         SIXBIT /ATSIGN/
7253         SIXBIT /HACTRN/
7254         SETZ            ;12
7255         SIXBIT /LOAD/
7256         16
7257         SETZ 17
7258         -1              ;16
7259         1               ;17
7260
7261 USTCDR: SYSCTX          ;GOT HERE FROM ULEAVE WHICH SELECTED THE USER ACS,
7262         MOVE U,USER     ; SELECT SYSTEM ACS INSTEAD.
7263         MOVEI A,USTCDR+1        ;COME BACK HERE IN CASE OF PCLSR
7264         MOVEM A,UUOH
7265         MOVE P,USRPDL(U)
7266         PUSHJ P,UBLAM
7267         MOVE U,USER
7268         MOVSI T,NUSTCD
7269         XCTR XBW,[BLT T,17]
7270         MOVE T,JNAME(U)
7271         UMOVEM T,11
7272         MOVE T,[%PCUSR,,1]
7273         MOVEM T,UUOH
7274         JRST URET
7275 \f
7276 SUBTTL USER KILL ROUTINES
7277
7278 ;
7279 ; CLOSE ALL DEVICES AND INFERIOR PROCEDURES OF A JOB (INDEX IN U)
7280 ;
7281 IODCL:  MOVNI I,1       ;SET TO STOP
7282         PUSHJ P,IODCL3  ;STOP ALL INFERIOR JOBS (RECURSIVE)
7283         MOVEI I,0       ;THEN KILL.
7284 IODCLA: PUSH P,I
7285         MOVE A,OPTION(U)
7286         TLNE A,%OPLOK   ;IF USER HAS ENABLED THE SWITCH-UNLOCK FEATURE,
7287          PUSHJ P,IODCSW ;UNLOCK HIS LOCKED SWITCHES.
7288 IFN 340P\E.SP,  PUSHJ P,ADCLOSE ;FLUSH DISPLAY
7289 IFN IMXP,       PUSHJ P,POTCLS  ;DISCONNECT HIS POTS
7290 IFN VIDP,[
7291         CAMN U,SCNUSR
7292          PUSHJ P,SCNSTP ;KILL SCANNER IF HIS
7293 ]
7294 IFN ARMP,       PUSHJ P,AARMOFF ;FLUSH ARM
7295 IFN DEMON,      PUSHJ P,DEMOUT  ;FLUSH EXISTANCE (CURRENT OR FORMER) AS DAEMON.
7296 IFN N11TYS,[
7297         SKIPE NVDBA(U)
7298          PUSHJ P,VBDFLS ;DEASSIGN ALL VIDEO BUFFERS.
7299 ]
7300 IFN KL10P,[
7301         CAMN U,MTRUSR   ;DEASSIGN THE PERFORMANCE COUNTER
7302          PUSHJ P,PRFOFF
7303 ];KL10P
7304         PUSHJ P,CLQDEL  ;RELEASE AND STOP CLOCK QUEUE BLOCK
7305          UCLBLK(U)
7306         HRRZ A,UREALT
7307         CAMN A,U
7308          SETOM UREALT   ;UN REAL TIME
7309         CAMN U,UMASTER  ;UNMASTER
7310          SETOM UMASTER
7311         PUSHJ P,AIOPDL  ;POP UP ALL OF IO PDL (CLOSING CHNLS POPPED INTO)
7312         MOVEI R,IOCHNM(U)
7313 IODCL1: PUSHJ P,CCLOSE  ;CLOSE ALL CHANNELS
7314         CAIGE R,IOCHNM+NIOCHN-1(U)
7315          AOJA R,IODCL1
7316         PUSH P,U
7317         SKIPGE T,JBI(U) ;IF THIS JOB IS A JOB-DEVICE,
7318          JRST IODCL2
7319         HRROS JBCJUI(T) ;TELL THE JOB CHANNEL THAT THE HANDLER IS GONE.
7320         CONO PI,CLKOFF
7321         SKIPGE JBCG(T)  ;IF OUR CREATOR STILL HAS A JOB CHANNEL,
7322          JRST IODCL6
7323         MOVE A,JBCUI(T) ;FLUSH THE CREATOR'S JOB CHANNELS,
7324         CONO PI,CLKON
7325         PUSHJ P,RPCLSR  ;STOPPING THE CREATOR IN CASE HE'S USING THEM NOW.
7326         MOVE T,JBI(U)   ;RPCLSR CLOBBERS T.
7327         MOVSI C,%CLSJ
7328         PUSHJ P,CHSCAA
7329             PUSHJ P,[HRRZ B,(R)
7330                      TDNN C,CLSTB(B)
7331                       POPJ P,
7332                      HLRZ B,(R)
7333                      CAMN B,T
7334                       SETZM (R)
7335                      POPJ P,]
7336         PUSHJ P,UPCLSR  ;ALLOW THE CREATOR TO CONTINUE AND GET IOC ERROR OR RETRY OPEN
7337 IODCL6: CONO PI,CLKON
7338         SETOM JBCUI(T)  ;FLUSH THE JOB-DEVICE SLOT.
7339         SETOM JBI(U)    ;SAY THIS JOB NO LONGER A JOB-DEVICE.
7340         JRST IODCL2
7341
7342 IODCL3:  PUSH P,I       ;I=0 KILL I=-1 STOP I=1 JUST CLOSE CHANNELS.
7343         PUSH P,U
7344 IODCL2: MOVEI A,0
7345 IODCL4: HRRZ E,SUPPRO(A)
7346         SKIPE UNAME(A)  ;SKIP IF VARIABLES BLOCK IDLE
7347         CAIE E,(U)      ;SKIP ONLY IF IT IS A DIRECT INF.
7348         JRST IODCL5     ;TRY NEXT SET OF VARS
7349         PUSH P,A
7350         MOVE U,A
7351         PUSHJ P,1USTOP  ;STOP (WITH BUSRC BIT)
7352         MOVE R,P
7353         MOVE P,USRPDL(U)
7354         PUSH P,R
7355         SKIPGE I,-2(R)
7356         JRST IODCL8     ;STOP
7357         PUSHJ P,IODCLA  ;KILL OR CLOSE CHNLS, RECURSE
7358 IODCL9: MOVE P,(P)
7359         SKIPE -2(P)     ;KILLING?
7360         JRST IODCL7     ;JUST CLOSING CHNLS.
7361         MOVE A,U        ;KILLING; WAIT TILL NO OTHER JOB
7362         PUSHJ P,AUCL3   ;IS LOOKING AT THE ONE THAT WE'RE KILLING.
7363         PUSHJ P,UBLST2  ;FLUSH CORE
7364         SETZ R,
7365         PUSHJ P,ZUSLOG  ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
7366         CONO PI,CLKON
7367 IODCL7: POP P,A
7368         HRRZ U,(P)
7369 IODCL5: ADDI A,LUBLK
7370         CAMGE A,USRHI
7371         JRST IODCL4     ;LOOP FOR ALL SETS OF USER VARIABLES
7372         POP P,U
7373         SUB P,[1,,1]
7374         POPJ P,
7375
7376 IODCL8: PUSHJ P,IODCL3
7377         JRST IODCL9
7378 \f
7379 ;SYSTEM CALL UNLOCK.  1 ARG, A JOB SPEC.
7380 ;THAT JOB'S LOCKS ARE ALL UNLOCKED.
7381 NUNLOCK:
7382         MOVE J,A
7383         JSP T,NCORUI    ;DECODE THE JOB SPEC.
7384          JRST NUNLO1     ;WE'RE CERTAINLY ALLOWED TO WRITE THIS JOB.
7385         JUMPE U,NUNLO1  ;SYSTEM JOB CAN DO IT TO ANYBODY
7386         JSP T,NCORWR    ;NOT SURE, SO CHECK.
7387          JRST OPNL31     ;NO, NOT ALLOWED.
7388 NUNLO1:
7389 IFN PDP6P,[
7390         CAIN J,-1
7391          JRST OPNL34
7392 ];PDP6P
7393         ;THE CALL IS ALLOWED, SO UNLOCK THAT JOB'S LOCKS
7394         CAMN J,USER
7395          JRST NUNLO2
7396         MOVE A,J                ; If not self,
7397         PUSHJ P,RPCLSR          ; assure a User mode PC
7398         PUSHJ P,SOSSET
7399          USTP(A)
7400         JRST NUNLO3
7401
7402 NUNLO2: MOVE A,UUOH             ; If we are asked to unlock
7403         SUBI A,1                ; our own locks, put our PC in
7404         MOVEM A,SRN3(U)         ; SRN3 where IODCSW will look for it
7405 NUNLO3: MOVE U,J
7406         MOVE A,OPTION(U)
7407         TLNE A,%OPLOK           ; Provided it is using locks at all...
7408          PUSHJ P,IODCSW
7409         CAME U,USER
7410          PUSHJ P,LSWPOP         ; USTP
7411         JRST LSWPJ1             ; DIELOK
7412         ; Returns with U clobbered, which seems to be OK for .CALL's?
7413
7414
7415 ;CALL HERE TO UNLOCK THE SWITCHES A JOB HAS LOCKED (USER IDX IN U).
7416 ;LOCATION 43 (ACTUALLY, 3+C(40ADDR)) HAS THE LIST POINTER. 0 IS NIL.
7417 ;ANYTHING ELSE POINTS TO 2-WORD BLOCK; THE 1ST WORD IS THE SWITCH OR THE
7418 ;ADDRESS OF THE SWITCH. THE RH OF THE SECOND IS THE CDR OF THE LIST.
7419 ;THE LH OF THE SECOND IS THE UNLOCK INTRUCTION. THE INDEX FIELD IS IGNORED,
7420 ;ONE LEVEL OF INDIRECTION IS PERMITTED, AND THE INSN MUST BE EITHER
7421 ;AOS OR SOS WITH 0 IN AC FLD, A LOGICAL INSTRUCTION (TOP 3 BITS = 4),
7422 ;A HALFWORD INSTRUCTION, OR A MOVE,MOVN,MOVS,MOVN,ADD OR SUB SERIES INSN,
7423 ;OR 0 WHICH MEANS SETOM. ONLY INSNS THAT MODIFY MEMORY ARE USEFUL.
7424 ;44 IS AN AOBJN POINTER TO THE CRITICAL RTNS TABLE, OF 2-WORDS ENTRIES.
7425 ;THE 1ST WORD EACH IS <BEGINNING OF RANGE>,,<END OF RANGE>+1.
7426 ;THE SECOND IS THE UNLOCK INSTRUCTION, WITH THE ADDRESS OF THE SWITCH
7427 ;IN THE RH (AGAIN, 1 LEVEL OF INDIRECTION IS PERMITTED).
7428 ;IF THE PC IS IN THAT RANGE, THE UNLOCK INSN IS EXECUTED.
7429 ;43 AND 44 ARE UPDATED DURING PROCESSING TO PREVENT PCLSR LOSSAGE.
7430 ;SEE .INFO.;ITS LOCKS
7431
7432
7433 ;MACRO TO DO XCTR, OR POPJ IF THAT WOULD CAUSE INTERRUPT.
7434 DEFINE XCTRIJ
7435         JSP TT,IODCXC
7436         XCTR!TERMIN
7437
7438 ; IODCSW: Unlock locks for user in U
7439 ; User should be stopped so that he is in user mode.
7440 ; The only exception is if we are unlocking the locks of the running job,
7441 ; in which case the contents of SRN3 will be used as our PC.
7442 ; Clobbers just about everything except U.
7443 IODCSW: PUSH P,U
7444         PUSHJ P,IODCS0          ; Do actual work, if any...
7445         MOVE U,USER             ; But be sure to always
7446         PUSHJ P,MPLDZ           ; restore normal page map of running user.
7447         JRST POPUJ              ; And U
7448
7449 IODCS0: HRRZ J,U
7450         MOVE U,USER     ;SET UP MAP TO USER BEING HACKED (IDX IN J).
7451         PUSHJ P,MPLDJ   ;LH(J) CLOBBERED, RH SAVED.
7452         HRRZ U,J        ;U HAS WHAT IT HAD AT CALL (USR BEING HACKED).
7453         MOVEI C,1000    ;COUNT LENGTH OF LIST SO CIRCULAR LISTS DON'T HANG US UP.
7454         HRRZ E,40ADDR(U)
7455         XCTRIJ XRW,[MOVES B,3(E)] ;GET HIS "43" (AND MAKE SURE IT'S WRITABLE)
7456 IODCS1: JUMPE B,IODCS2          ;REACHED END OF LOCKED SWITCH LIST, MAYBE?
7457         XCTRIJ XR,[HLL B,1(B)]  ;MERGE LOCK INSN WITH ADDR OF SWITCH.
7458         PUSHJ P,IODCDO          ;EXECUTE THE UNLOCK INSN
7459          POPJ P,                 ;IODCDO DETECTED MPV OR PUR INTERRUPT.
7460         XCTR XR,[HRRZ B,1(B)]   ;REPLACE LIST BY ITS CDR.
7461         UMOVEM B,3(E)
7462         SOJG C,IODCS1
7463
7464 IODCS2: XCTRIJ XRW,[MOVES E,4(E)]       ;GET JOB'S "44", AND MAKE SURE IT'S WRITEABLE.
7465         HRRZ C,UPC(U)           ;GET ITS PC, FOR COMPARISON.
7466         CAMN U,USER             ; Except if this is us,
7467          HRRZ C,SRN3(U)         ; then unlock PC is in SRN3
7468         JUMPGE E,CPOPJ          ;THERE ARE NO PROTECTED RANGES => DONE.
7469 IODCS3: XCTRIJ XR,[MOVS B,(E)]  ;GET BOUNDS OF NEXT PROTECTED RANGE.
7470         CAIGE C,(B)             ;IS PC ABOVE LOWER BOUND?
7471          JRST IODCS4
7472         MOVSS B
7473         CAIL C,(B)              ;IS IT BELOW UPPER?
7474          JRST IODCS4
7475         XCTRIJ XR,[MOVE B,1(E)] ;PC IS IN THIS RANGE; GET UNLOCK INSN
7476         PUSHJ P,IODCDO          ;EXECUTE IT
7477          POPJ P,                ;NO SKIP => MPV OR PUR INTERRUPT DETECTED.
7478 IODCS4: ADD E,[2,,2]            ;CHECK ALL ENTRIES IN CRITICAL RTN TABLE, 1 BY 1.
7479         HRRZ B,40ADDR(U)        ;UPDATE 44 SO ENTRIES ALREADY PROCESSED ARE
7480         UMOVEM E,4(B)           ;ACTUALLY IN THE TABLE. THIS IS IN CASE PCLSR.
7481         JUMPL E,IODCS3
7482         POPJ P,
7483 \f
7484 ;PRECEDE AN XCTR WITH JSP TT,IODCXC TO POPJ IF THE XCTR WOULD
7485 ;CAUSE AN INTERRUPT (MPV OR PUR). CLOBBERS A,T,Q.
7486 IODCXC: MOVEI A,@(TT)   ;GET EFFECTIVE ADDR OF XCTR.
7487         MOVEI A,@(A)    ;GET EFFECTIVE ADDR OF XCTR'ED INSN.
7488         LSH A,-10.      ;GET PAGE # BEING REFERENCED.
7489         PUSHJ P,UPLC    ;SET T = B.P. TO PAGE MAP HALFWORD. CLOBBERS Q.
7490         LDB T,T
7491         TRNE T,600000   ;IF PAGE IS SWAPPED IN, PUT ACCESS BITS IN
7492          LSH T,-20      ;SAME PLACE THEY ARE WHEN SWAPPED OUT (LOW 2 BITS).
7493 ;FOLLOWING CODE COMMENTED OUT BECAUSE IT DOESN'T WORK ON THE KL10 XCTR
7494 ;       TRNE T,2        ;CHANGE CODE 2 (READ-WRITE, NOT WRITTEN) TO 3 (READ-WRITE).
7495 ;        IORI T,1
7496 ;       LSH T,27        ;PUT ACCESS CODE IN AC FIELD, AND TEST
7497 ;       ANDCA T,(TT)    ;AGAINST WHAT THE XCTR WILL TRY TO DO.
7498 ;       TLNN T,(0 3,)   ;ALL DESIRED ACCESS AVAILABLE =>
7499 ;        JRST (TT)      ;WE WIN.
7500 ;       POPJ P,         ;ELSE QUIT OUT OF CALLING ROUTINE.
7501 ;
7502 ;FOLLOWING CODE INSERTED INSTEAD.  THIS RELIES ON THE FACT
7503 ;THAT ONLY THE FOLLOWING INSTRUCTIONS ARE XCTRIJ'ED:
7504 ; BOOLE,HWT,MOVXX,ADDX,SUBX,AOSX,SOSX
7505         MOVE A,@(TT)    ;GET INSTRUCTION XCTR'ED
7506         TLC A,300000
7507         TLCE A,300000   ;SKIP IF AOS OR SOS
7508          TLNE A,002000  ;SKIP IF DOESN'T WRITE IN MEMORY
7509           TRNE T,2      ;INSTRUCTION WRITES, SKIP IF RW OR RWF ACCESS NOT PRESENT
7510            TRNN T,3     ;INSTRUCTION READS, SKIP IF ANY ACCESS PRESENT
7511             POPJ P,     ;INSUFFICIENT ACCESS, QUIT OUT OF CALLING ROUTINE
7512         JRST (TT)       ;WINNING, GO DO THE XCTR
7513
7514 ;PUSHJ P,IODCDO WITH INSN IN B TO XCTRIJ IT, CHECKING FOR LEGALITY
7515 ;AND PERFORMING ONE LEVEL OF INDIRECTION IF THE @ BIT IS SET.
7516 ;(WE CAN'T AFFORD AN INFINITE LOOP WHILE KILLING A JOB EVEN IF IT IS
7517 ;INTERRUPTABLE)
7518 ;INDEX FIELD IS IGNORED. IF THE OPCODE IS 0, SETOM IS USED INSTEAD.
7519 ;SKIPS IF INSN IS LEGAL AND DOESN'T CAUSE MPV OR PUR INTERRUPT.
7520 ;CLOBBERS A,D,J,T,TT,Q
7521 IODCDO: MOVE J,B        ;B IS NOT CLOBBERED.
7522         TLZN J,(@)
7523          JRST IODCD1
7524         XCTRIJ XR,[HRR J,(J)]   ;INDIRECTION IS WANTED; DO IT.
7525 IODCD1: TLNN J,-1       ;IF LH IS 0, REPLACE BY (SETOM)
7526          HRLI J,(SETOM)
7527         LDB A,[271500,,J]
7528         CAIE A,AOS_-27  ;AOS AND SOS ARE LEGAL WITH 0 IN AC FIELD.
7529          CAIN A,SOS_-27
7530           JRST IODCD2
7531         LDB A,[410300,,J]
7532         CAIE A,4        ;ALL INSNS WITH 4 IN TOP 3 BITS (LOGICAL INSNS) ARE OK.
7533          CAIN A,5       ;HALFWORD INSTRUCTIONS ALSO OK.
7534           JRST IODCD3
7535         LDB A,[360600,,J]
7536         CAIE A,MOVE_-36 ;ALL FORMS OF MOVE, MOVS, MOVN AND MOVM OK
7537          CAIN A,MOVN_-36
7538           JRST IODCD3
7539         CAIE A,ADD_-36  ;ADD & SUB OK.      (OF COURSE, ONLY TO-MEMORY INSNS MAKE SENSE)
7540          POPJ P,
7541 IODCD3: LDB A,[270400,,J] ;AC FIELD NEED NOT BE 0, SO GET CONTENTS OF SPEC'D AC,
7542         UMOVE D,(A)
7543         MOVEI A,D
7544         DPB A,[270400,,J] ;AND MAKE THE INSN USE AC D, WHERE THE VALUE IS.
7545 IODCD2: TLZ J,17
7546         XCTRIJ XRW,J    ;EXECUTE INSN, CHECKING FOR INTERRUPTS.
7547         AOS (P)
7548         POPJ P,
7549 \f
7550 ; FLUSH LAST VESTIGES OF USER
7551 ;  ELIMINATES ALL POINTERS TO USER & FREES USER VARIABLES (CLOBBERS U TO "USER")
7552 ;  R, IF NON-ZERO, IS ADDRESS OF CHANNEL NOT TO BE CLOSED UNTIL LAST MINUTE
7553 ;       (IN CASE PCLSR OUT OF .UCLOSE)
7554
7555 ZUSER:  MOVEI A,(U)     ;CLEAR BOTH TRANSLATION LISTS
7556         HRLI A,300000   ;FOR THIS JOB.
7557         PUSHJ P,NTRNC
7558          JFCL
7559         MOVEI A,0       ;AND GET RID OF EXISTING FOREIGN-USER CHANNELS.
7560 ZUSER2: SKIPE UNAME(A)
7561          PUSHJ P,ZUSES  ;SEE IF THIS USER HAS ANY POINTERS TO BE FLUSHED
7562         CAMN U,SERVER(A)        ; If we were a server for this guy,
7563          SETOM SERVER(A)        ; clear it out.
7564         ADDI A,LUBLK
7565         CAMGE A,USRHI
7566          JRST ZUSER2    ;LOOP FOR ALL SETS OF USER VARIABLES
7567         SKIPE R
7568          SETZM (R)
7569         CONO PI,CLKOFF
7570         SKIPE NMPGS(U)  ;USER SHOULD HAVE NO MEMORY BY NOW
7571          BUG
7572         SETZM UNAME(U)  ;ONLY PLACE THAT UNAME IS ZEROED
7573         SETOM USTP(U)   ;SET USTP TO SPEED SEARCH
7574         MOVE A,U        ;USER FLUSHED
7575         MOVE U,USER
7576         MOVSI T,SCLDEC
7577         IORM T,SUPCOR   ;CAUSE USER VARIABLE BLOCKS DECREASE PROGRAM TO RUN
7578         POPJ P,         ;RETURN WITH CLOCK OFF
7579
7580
7581 ;CALLED BY ADISOWN, NATTACH, NDETACH, ETC.
7582 ZUSES:  MOVEI D,%CLSU\%CLSFU\%CLSJI\%CLSJO      ;CLSTB BITS FOR CHANNELS TO CLOSE
7583 ZUSES1: PUSH P,B
7584         PUSH P,R
7585         PUSH P,C
7586         MOVE C,R
7587         SETZM B         ;CLEAR STOPPED PROC FLAG
7588         PUSHJ P,CHSCAA  ;EXECUTE FOLLOWING INST FOR EACH CHANNEL AND I/O PDL SLOT
7589             PUSHJ P,ZACHEK
7590         POP P,C
7591         POP P,R
7592         SKIPE B         ;SKIP UNLESSS YOU STOPPED THE PROC
7593          PUSHJ P,UPCLSR ;RESTART USER
7594         JRST POPBJ
7595
7596 ZACHEK: HLRZ T,(R)      ;CHECK FOR CHANNEL TO ZAP
7597         CAME T,U
7598          POPJ P,
7599 ZACHK4: HRRZ T,(R)
7600         HLRZ T,CLSTB(T)
7601         TRNN T,(D)
7602          POPJ P,        ;IS IT EITHER TYPE OF USER CHANNEL? OR JOB CHNL?
7603         TRON B,-1       ;SET FLAG
7604          PUSHJ P,RPCLSR ;STOP USER
7605         HRRZ T,(R)
7606         HLRZ T,CLSTB(T)
7607         TRNN T,%CLSFU   ;IS IT A FOREIGN USR CHNL?
7608          JRST ZACHK2    ;NO, SUPERIOR OR JOB CHNL.
7609         JUMPG R,ZACHK1  ;IOPDL CHANNEL
7610         MOVEI T,LUBLK   ;SEE IF A HAS BEEN CLOBBERED
7611         IDIVM A,T       ;(AT LEAST MAKE SURE IT'S A VALID USER INDEX)
7612         IMULI T,LUBLK
7613         CAMN T,A
7614          CAML A,USRHI
7615           BUG
7616         HRRZ T,R        ;NORMAL CHANNEL, INTERRUPT ON IT.
7617         SUBI T,IOCHNM(A)
7618         MOVE T,CHNBIT(T)
7619         AND T,MSKST2(A)
7620         IORM T,IFPIR(A)
7621 ZACHK2: CAIE C,(R)      ;UNLESS THE ONE NOT TO BE CLOSED UNTIL LAST MINUTE,
7622          SETZM (R)      ;FOR ANY KIND OF CHANNEL, CLEAR IT OUT.
7623         POPJ P,
7624
7625 ZACHK1: MOVEI T,IIOPOP  ;FOREIGN USR IN IOPDL SLOT: INTERRUPT WHEN IOPOPPED.
7626         MOVEM T,(R)
7627         POPJ P,
7628 \f
7629 ZUSLOG: PUSH P,[ZUSER]          ;DO LOGUSE THEN ZUSER
7630
7631 ;LOG RUNTIME AND SWAPIN REQUESTS USED BY JOB IN U
7632 ;JOB CALLED FOR SHOULD NOT BE CURRENT OR ABLE TO RUN DURING CALL
7633 ;JOB SHOULD NOT BE TOP LEVEL EXCEPT WHEN DMNPLO CALLS
7634 ; HERE JUST BEFORE SENDING THE USAGE TO THE DEMON
7635 ;CLOBBERS T,TT,I
7636
7637 LOGUSE: MOVN TT,UTRNTM(U)
7638         MOVN T,USIPRQ(U)
7639         EXCH TT,TRUNTM(U)       ;AVOID CHARGING FOR THIS USAGE TWICE
7640         EXCH T,TSIPRQ(U)
7641         SUB TT,TRUNTM(U)        ;COMPUTE TOTAL USAGE NOT YET CHARGED
7642         SUB T,TSIPRQ(U)
7643         SKIPGE I,SUPPRO(U)      ;FIND HIGHEST JOB IN TREE
7644          POPJ P,                ;BUT IF TOP LEVEL RETURN WITH USAGE IN TT, T
7645 ;THIS IS TO FIND A BUG.  -- CStacy, 4/30/82
7646         CAME I,U                ;IS THIS JOB ITS OWN SUPERIOR?
7647          JRST LOGUS1
7648         BUG PAUSE,[SOME JOB IS ITS OWN SUPERIOR, U AND I=],OCT,U
7649 LOGUS1: SKIPL SUPPRO(I)
7650          JRST [ MOVE I,SUPPRO(I) ? JRST .-1 ]
7651         ADDM TT,TRUNTM(I)       ;ADD CHARGES TO TREE'S ACCOUNT
7652         ADDM T,TSIPRQ(I)
7653         POPJ P,
7654
7655 ;DO LOGOUT FOR TREE HEADED BY JOB IN U
7656 ;CALLER SHOULD THEN PUSHJ P,DMNPLI TO LOG JOB BACK IN
7657 ;THIS IS USED TO KEEP ACCOUNTING STRAIGHT WHEN DETACH, CHUNAME, RELOAD (SIGH)
7658 ;IF JOB IS CURRENTLY RUNNING, TIME USED IN CURRENT QUANTUM
7659 ;WON'T GET CHARGED THIS TIME AROUND.  TOO BAD.
7660 ;CLOBBERS T,TT,I,J,D. CALL WITH CLKOFF OR IN PROGRESS.
7661
7662 LOGUPD: PUSH P,U
7663         MOVE J,UTMPTR(U)
7664         MOVEI U,LUBLK
7665 LOGUP1: ADDI U,LUBLK
7666         CAML U,USRHI
7667          JRST LOGUP2
7668         CAMN J,UTMPTR(U)        ;SKIP JOBS IN OTHER TREES (FOR SPEED)
7669          SKIPGE SUPPRO(U)       ;AND SKIP TOP LEVEL JOBS
7670           JRST LOGUP1
7671         SKIPE UNAME(U)          ;DON'T GET CONFUSED BY EMPTY SLOTS
7672          PUSHJ P,LOGUSE         ;PROBABLY AN INFERIOR IN TREE LOGGING OUT, UPDATE ACCT
7673         JRST LOGUP1
7674
7675 LOGUP2: POP P,U
7676         JRST DMNPLO             ;TELL DEMON ABOUT TREE'S USAGE
7677 \f
7678 SUBTTL USER UUO WAIT (HANG UP) ROUTINE
7679 ;  DOES NOT WORK FOR XCT T OR FOR X (T)
7680 ;  THE INSTRUCTION BEFORE THE PUSHJ P,UFLS GETS EXECUTED WITH AN
7681 ;  ARGUMENT PASSED IN T AND ITS USER INDEX IN U.  I BELIEVE IT
7682 ;  IS ONLY ALLOWED TO BASH T AND A.
7683 ;
7684 UFLS:   CONSZ PI,77400
7685          BUG HALT,[UFLS WITH PI IN PROGRESS]
7686         CONO PI,CLKOFF  ;DOES NOT ALLOW CLOCK INTS
7687         XCT CLUSAV
7688         SKIPGE U,USER   ;GET INDEX OF USER BEING BLOCKED
7689          JRST 4,.       ;NULL JOB SHOULD NOT GET BLOCKED
7690         MOVEM T,EPDL2(U)        ;SAVE C(T) FOR FLSINS AT PCLSR
7691         MOVEM T,AC16S(U)        ;SAVE IN SWAP OUT AC ALSO
7692         POP P,UPC(U)            ;WORK FOR INST INDEX OF P
7693         MOVEI T,AC0S(U)
7694         BLT T,AC15S(U)  ;STORE REST OF ACS
7695         MOVE T,UPC(U)   ;GET PC AT CALL (=CALL+1 ; =SKIP +2)
7696         SKIPA T,-2(T)   ;GET POINTER TO SKIP
7697 UFL3:    MOVE T,(T)     ;GET CONTENTS OF E (WAS AN XCT)
7698         MOVE U,AC17S(U) ;WIN FOR INSNS INDEX OF U.
7699         HRRI T,@T       ;CALCULATE E
7700         TLZ T,37        ;CLEAR OUT @ AND INDEX BITS
7701         MOVE U,USER
7702         MOVEM T,FLSINS(U)       ;STORE AS BLOCKING CONDITION
7703         TLC T,(XCT)
7704         TLNN T,777740
7705          JRST UFL3      ;JUMP IF INSTRUCTION WAS XCT
7706         CONO PI,UTCON-1 ;TURN ON ALL PIS EXCEPT CLOCK
7707         MOVSI T,%SWPGW+%SWINT
7708         ANDCAM T,USWST(U) ;CLEAR WAITING FOR PAGE TYPE FLSINS
7709         SKIPGE RPCL(U)  ;SKIP IF NOT BEING RPCLSRED
7710          JRST UFL1      ;LOSER IS BEING RPCLSRED
7711 UFL6:   MOVE U,AC17S(U) ;FOR CLUSAV TO STORE
7712         SETOM UFLSF
7713         CONO PI,CLKRQ   ;CAUSE INTERRUPT TRANSFERING TO CLOCK ROUTINE PI IN
7714                         ; PROGRESS
7715 IFE KA10P, JRST .       ;ON KL AND KS SEEMS TO TAKE A WHILE TO GO OFF ("I
7716                         ; CAN WAIT FOREVER, YOU KNOW")
7717 IFN KA10P, JRST 4,.     ;ON KA SHOULD GO OFF RIGHT AWAY
7718
7719 UFL1:   MOVE P,CPDLP    ;MUST NOT USE USR PDL SINCE THAT CAN
7720                         ;GET CLOBBERED BY LSWDIS VIA UFL5
7721                         ;CLOCK IS OFF, SO CPDLP IS OK
7722 IFN KA10P,[
7723         MOVE T,UEXIT    ;PICK UP EXIT INSTR
7724         CAME T,[JRST ONEPROC]   ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7725                                 ; THAT HUNG
7726          JRST UFL1A     ;NOT ONE PROCEEDING
7727         MOVSI T,%PC1PR  ;GET ONE PROCEED BIT
7728         IORM T,UUOH     ;TURN IT ON IN PC
7729 UFL1A:] ;KA10P
7730 IFN KS10P,[
7731         MOVE T,UEXIT    ;PICK UP EXIT INSTR
7732         CAME T,[JRST ONEPR4]    ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7733                                 ; THAT HUNG
7734          JRST UFL1A     ;NOT ONE PROCEEDING
7735         MOVSI T,OIPBIT  ;GET ONE PROCEED BIT
7736         IORM T,UUOH     ;TURN IT ON IN PC
7737 UFL1A:] ;KS10P
7738         SOS T,UUOH      ;UUOH HAS REAL PC IF UFL5 SKIPS. WILL GET SET BY ONEPR1
7739         PUSHJ P,UFL5    ;BACK UP TO UUO
7740          JRST UFL6      ;FINALIZATION REQUIRED
7741         MOVE T,RPCL(U)
7742         JRST ONEFL2     ;WIN
7743 \f
7744 SUBTTL VARIOUS WAIT & LOCK-SWITCH ROUTINES
7745 ;
7746 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH UTCCHN OFF
7747 ;
7748 LWAIT1: CONO PI,UTCON   ;TURN INTERRUPTS ON
7749 LWAIT:  PCLT
7750         XCT @(P)        ;ENTRY, EXECUTE INSTRUCTION
7751          PUSHJ P,UFLS   ;HANG TILL INSTRUCTION SKIPS
7752         CONO PI,UTCOFF  ;TURN INTERRUPTS OFF
7753         XCT @(P)        ;TRY AGAIN
7754          JRST LWAIT1    ;LOSE
7755         JRST POPJ1      ;WIN, RETURN SKIPPING OVER ARG
7756 ;
7757 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE -1 AND SEIZE IT
7758 ;
7759 SWTL:   PCLT
7760         MOVEI T,(@)     ;ENTRY
7761         HRLM T,(P)      ;MAKE PC STORED ON PDL INDIRECT
7762         SKIPGE @(P)     ;SKIP IF ALREADY LOCKED
7763          JRST SWTL1     ;NOT LOCKED SO TRY TO GRAB IT
7764         MOVEI T,@(P)    ;ADDRESS OF SWITCH
7765         HLRZ T,1(T)     ;USER THAT HAS SWITCH
7766         ANDI T,777
7767         IMULI T,LUBLK
7768         CAMN T,USER     ;SKIP IF THIS USER DOESN'T HAVE IT
7769          BUG            ;THIS USER ALREADY HAS THAT SWITCH
7770 SWTL1:  SKIPL @(P)      ;(DO NOT CHANGE TO AOSE)
7771          PUSHJ P,UFLS   ;HANG TILL NEGATIVE
7772         CONO PI,CLKOFF
7773         AOSE @(P)
7774          JRST SWTL1
7775 SWTL2:  MOVEI T,@(P)
7776 SWTL3:  PUSH P,U
7777         PUSH P,T
7778         MOVE T,USER
7779         IDIVI T,LUBLK
7780         ADDI T,600000
7781         MOVE U,USER
7782         HRL T,LSWPR(U)
7783         POP P,U
7784         MOVSM T,1(U)
7785         MOVE T,USER
7786         HRRZM U,LSWPR(T)
7787         POP P,U
7788         JRST CLKOJ1
7789 ;
7790 ;IF LOCK ALREADY SEIZED, JUST SET UP POINTERS
7791 SWTLZ:  MOVEI T,(@)
7792         HRLM T,(P)
7793         JRST SWTL2
7794
7795 SWTAD:  PCLT            ;TRY TO LOCK SWITCH (@NEXT LOCN). IF SUCEED, SKIP EXTRA TIME.
7796         MOVE T,@(P)     ;IF FAIL, DO N LSWPOPS (AS SPEC IN 4.6-4.1 OF NEXT WORD)
7797         SKIPGE (T)      ;AND WAIT FOR SWITCH TO SEEM TO BE AVAILABLE.
7798          JRST SWTAD1    ;THEN RETURN (NOTE: NOT LOCKING IT).
7799 SWTAD2: TLNN T,77000
7800          JRST SWTAD3
7801         PUSH P,T
7802         PUSHJ P,LSWPOP
7803         POP P,T
7804         SUB T,[1000,,]
7805         JRST SWTAD2
7806
7807 SWTAD3: SKIPL (T)
7808          PUSHJ P,UFLS
7809         JRST POPJ1
7810
7811 SWTAD1: CONO PI,CLKOFF
7812         AOSE (T)
7813          JRST [ CONO PI,CLKON
7814                 JRST SWTAD2 ]
7815         AOS (P) ;SKIP OVER FAILURE RETURN
7816         JRST SWTL3
7817 \f
7818 ;
7819 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH CLKCHN OFF
7820 CWAIT1: CONO PI,CLKON   ;TURN CLOCK ON
7821 CWAIT:  PCLT
7822         XCT @(P)        ;ENTRY, EXECUTE INSTRUCTION
7823          PUSHJ P,UFLS   ;HANG TILL INSTRUCTION SKIPS
7824         CONO PI,CLKOFF  ;TURN CLOCK OFF
7825         XCT @(P)        ;TRY AGAIN
7826          JRST CWAIT1    ;LOSE
7827         JRST POPJ1      ;WIN, RETURN SKIPPING OVER ARG
7828
7829 ;
7830 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE NON-NEGATIVE AND SEIZE IT
7831 LSWTL:  PCLT
7832         MOVEI T,(@)     ;IF 4.9 OF NEXT LOCN =1, RETURN WITH UTCOFF
7833         HRLM T,(P)
7834         MOVSI T,400000
7835         PUSHJ P,LWAIT
7836             SKIPGE @-1(P)
7837         IORM T,@(P)
7838         MOVE T,(P)
7839         SKIPL (T)
7840          CONO PI,UTCON
7841         MOVEI T,@(P)
7842 LSWTL2: PUSH P,TT
7843         MOVEI TT,601000
7844         PUSHJ P,LSWSET
7845         POP P,TT
7846         JRST POPJ1
7847 \f
7848 ;SWITCH LIST LOCK, DOES NOT WORK FOR SWITCHES POINTED TO INDEX OF A, B, OR D
7849 ;FOLLOW BY LIST OF SWITCHES
7850 ;4.9-4.4=0 4.3-4.1 0 AOSE SWITCH 1 SIGN SWITCH
7851 SLUGH:  PCLT
7852         PUSH P,A
7853         PUSH P,B
7854         PUSH P,D
7855         MOVEI T,AC0S(U)
7856         BLT T,AC0S+17(U)        ;FOR SLWAIT FIRST TIME
7857 SLUGH1: HRRZ T,-3(P)    ;POINTER TO SWITCH LIST
7858         PUSHJ P,SLWAIT
7859          PUSHJ P,UFLS
7860         HRRZ T,-3(P)
7861 SLUGH2: MOVE A,(T)      ;TRY TO LOCK LIST
7862         TLNE A,770000
7863          JRST SLUWIN    ;REACHED END OF LIST
7864         LDB B,[220400,,A]       ;INDEX
7865         LDB D,[330300,,A]
7866         SKIPE B
7867          ADD A,(B)
7868         HRRZS A
7869         CAIL D,2
7870          BUG
7871         XCT SLLOCK(D)
7872          JRST SLULOS
7873         AOBJP T,SLUGH2  ;LH COUNTS SWITCHES SUCCESSFULLY SEIZED
7874                         ;SHOULD NVERE FALL THROUGH
7875 SLWAIT: MOVE A,(T)
7876         TLNE A,770000
7877          JRST POPJ1             ;WIN
7878         LDB B,[220400,,A]       ;INDEX
7879         LDB D,[330300,,A]       ;TYPE CODE
7880         JUMPE B,SLWT1
7881         ADD B,U
7882         ADD A,AC0S(B)
7883 SLWT1:  CAIL D,2
7884          BUG
7885         XCT SLWATT(D)
7886          POPJ P,        ;LOSE
7887         AOJA T,SLWAIT   ;THAT SWITCH OK, TRY OTHERS
7888
7889 SLWATT: SKIPL (A)       ;WAIT FOR NEG (AOSE SW)
7890         SKIPGE (A)      ;WAIT FOR POS (SIGN SW)
7891
7892 SLUWIN: POP P,D
7893         POP P,B
7894         POP P,A
7895         SUB P,[1,,1]    ;"RETURN" BUT NOT INCREMENTED
7896         JRST (T)
7897
7898 SLLOCK: PUSHJ P,SWTLX
7899         PUSHJ P,LSWTLX
7900
7901 SLULOS: HLRZ A,T
7902 SLULO2: JUMPE A,SLUGH1  ;NONE SEIZED TRY AGAIN
7903         PUSHJ P,LSWPOP  ;RELEASE THOSE SEIZED
7904         SOJA A,SLULO2
7905
7906 SWTLX:  CONO PI,CLKOFF  ;DON'T GO OFF HALF-LOCKED
7907         AOSE (A)
7908          JRST CLKONJ
7909         EXCH A,T
7910         PUSHJ P,SWTL3
7911          BUG
7912 SWTLX1: EXCH A,T
7913         JRST POPJ1
7914
7915 LSWTLX: CONO PI,UTCOFF
7916         SKIPGE (A)
7917          JRST UTCONJ
7918         MOVSI B,400000
7919         IORM B,(A)
7920         CONO PI,UTCON
7921         EXCH A,T
7922         PUSH P,TT
7923         MOVEI TT,601000
7924         PUSHJ P,LSWSET
7925         POP P,TT
7926         JRST SWTLX1
7927 \f
7928 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING SWITCH
7929 STMSET: PUSH P,TT
7930         MOVEI TT,606000
7931         JRST COMSET
7932
7933 IFN 0,[
7934 ;SET UP ROUTINE TO BE CALLED ON PCLSR'ING OUT
7935 FINSET: MOVE T,@(P)
7936         HRLI T,-1(P)
7937         PUSH P,TT
7938         MOVEI TT,402000
7939         PUSHJ P,LSWSET
7940         POP P,TT
7941         JRST POPJ1
7942 ]
7943
7944 ;SET UP ROUTINE TO AOS VARIABLE UPON UNLOCKING SWITCH
7945 AOSSET: PUSH P,TT
7946         MOVEI TT,605000
7947         JRST COMSET
7948
7949 ;SET UP ROUTINE TO SOS VARIABLE UPON UNLOCKING SWITCH
7950 SOSSET: PUSH P,TT
7951         MOVEI TT,603000
7952         JRST COMSET
7953
7954 ;SET UP ROUTINE TO SOS LH UPON UNLOCKING SWITCH
7955 ;HALT IF SWITCH'S LH EVER BECOMES NEGATIVE
7956 SOLSET: PUSH P,TT
7957         MOVEI TT,607000
7958         JRST COMSET
7959
7960 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING SWITCH
7961 ;THAT ROUTINE MAY ONLY CLOBBER A AND T!!  IT GETS CALLED
7962 ;WITH USER IN U, AND THE JOB'S ACS IN AC0S(U)-AC17S(U)
7963 LOSSET: MOVE T,@(P)
7964         HRLI T,-1(P)
7965         PUSH P,TT
7966         MOVEI TT,602000
7967         PUSHJ P,LSWSET
7968         POP P,TT
7969         JRST POPJ1
7970
7971 ;SET UP ROUTINE TO CLEAR SIGN BIT OF VARIABLE UPON UNLOCKING SWITCH
7972 SGNSET: PUSH P,TT
7973         MOVEI TT,601000
7974         JRST COMSET
7975
7976 ;SET UP ROUTINE TO DO NOTHING UPON UNLOCKING SWITCH
7977 NULSET: PUSH P,TT
7978         MOVEI TT,0
7979         PUSHJ P,LSWSET
7980         POP P,TT
7981         POPJ P,
7982 \f
7983 ;ROUTINE TO ADD THIS PROCEDURE TO A LIST POINTED TO
7984 ;BY THE WORD AFTER THE CALL.  UNLOCKING REMOVES IT FROM THE LIST
7985 LSTSET: PUSH P,TT       ;LEAVES CLKON
7986         MOVEI TT,604000
7987         PUSHJ P,LSTST3
7988         POP P,TT
7989         JRST POPJ1
7990
7991 LSTST3: PUSH P,U
7992         PUSH P,Q
7993         MOVEI Q,LSWB0(U)
7994 REPEAT NULBLK,[
7995 IFN .RPCNT,ADDI Q,2
7996         SKIPN 1(Q)
7997         JRST LSTST2
7998 ]
7999         BUG             ;NOT ENOUGH BLOCKS
8000 LSTST2: MOVE T,@-4(P)   ;ADDRESS OF HEAD OF LIST
8001         CONO PI,CLKOFF
8002         PUSH P,(T)      ;PUSH HEAD OF LIST
8003         POP P,(Q)       ;POP INTO LSWB BLOCK
8004         MOVEM Q,(T)
8005         HRLM T,(Q)
8006         MOVE T,(Q)
8007         TRNE T,-1
8008         HRLM Q,(T)
8009         CONO PI,CLKON
8010         JRST LSWSE3
8011
8012 IFN 0,[
8013 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING OF SWITCH
8014 ;BY OTHER THAN PCLSRING OUT
8015 STMNPS: PUSH P,TT
8016         MOVEI TT,206000
8017         JRST COMSET
8018
8019 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING OF SWITCH
8020 ;BY OTHER THAN PCLSRING OUT
8021 LNPSET: PUSH P,TT
8022         MOVEI TT,202000
8023         JRST COMSET
8024 ];END IFN 0
8025
8026 COMSET: EXCH TT,(P)
8027         MOVE T,@-1(P)
8028         MOVEI T,@T
8029         EXCH TT,(P)
8030         PUSHJ P,LSWSET
8031         POP P,TT
8032         JRST POPJ1
8033 \f
8034 ;SET USER LOCK SWITCH BLOCK,  WD1 IN T,  MODE IN TT
8035 LSWSET: PUSH P,U
8036         MOVE U,USER
8037         PUSH P,Q
8038         MOVEI Q,LSWB0(U)
8039 REPEAT NULBLK,[IFN .RPCNT,ADDI Q,2
8040         SKIPN 1(Q)
8041         JRST LSWSE2
8042 ]
8043         BUG             ;NOT ENOUGH BLOCKS
8044
8045 LSWSE2: MOVEM T,(Q)
8046 LSWSE3: MOVE T,U
8047         IDIVI T,LUBLK
8048         MOVE U,USER
8049         HRL T,LSWPR(U)
8050         IOR T,TT        ;GET TYPE
8051         MOVSM T,1(Q)
8052         HRRZM Q,LSWPR(U)
8053         JRST POPQUJ
8054
8055 LSWCJ1: AOS (P)         ;EXIT TO DO LSWCLR AND SKIP-RETURN.
8056
8057 ;UNLOCK ALL SWITCHES, CALLED BY OPENL, ADISOWN, IOADCR
8058 LSWCLR: PUSH P,T
8059 LSWCL1:
8060 ;TEMPORARY CODE ADDED 1/22/80 TO SEE IF THERE ARE ANY MORE OF
8061 ;THIS CLASS OF BUGS
8062         CAME U,USER
8063          BUG
8064 ;END TEMPORARY CODE
8065         SKIPN T,LSWPR(U)        ;MUST HAVE USER IN U
8066         JRST POPTJ
8067         PUSHJ P,LSWPOP
8068         JRST LSWCL1
8069
8070 LSWPJ1: AOS (P)
8071 LSWPOP: PUSH P,U
8072         MOVE U,USER
8073         TLO U,400000    ;SIGNAL NOT PCLSR
8074         SKIPN T,LSWPR(U)
8075          BUG
8076         PUSHJ P,LSWPPP
8077         JRST POPUJ
8078
8079 LSWPPP: PUSH P,A
8080         PUSH P,T
8081         MOVE A,1(T)
8082         HRRZM A,LSWPR(U)
8083         CAIL T,USRSTG
8084          SETZM 1(T)
8085         PUSHJ P,LSWDIS
8086         POP P,T
8087         POP P,A
8088         POPJ P,
8089
8090 LSWZAP: PUSH P,U        ;FROM PCLSR
8091         PUSH P,A
8092 LSWZP1: PUSH P,T
8093         MOVE A,1(T)
8094         HRRZM A,LSWPR(U)
8095         CAIL T,USRSTG
8096          SETZM 1(T)
8097         PUSHJ P,LSWDIS
8098         POP P,T
8099         HRR U,-1(P)
8100         SKIPE T,LSWPR(U)
8101          JRST LSWZP1
8102         POP P,A
8103         SUB P,[1,,1]
8104         TLZN U,200000   ;HAS PC BEEN CLOBBERED?         ;THIS IS ONLY FOR FINSET R.I.P.
8105          JRST PCLSR7    ;NO
8106         SKIPLE PCLDBM
8107          SETZM LSUUO(U) ;INDICATE OCCURRENCE OF FINSET (WILL MEAN WE HAVEN'T MISSED MARK)
8108         JRST PCLSR4     ;REQUIRED TO START UP ROUTINE
8109 \f
8110 ;-1(P) HAS POINTER TO SWITCH BLOCK TO UNDO.
8111 ;A HAS SECOND WORD OF THAT BLOCK.
8112 ; 4.9=1 => PERFORM FUNCTION ON PCLSR
8113 ; 4.8=1 => PERFORM FUNCTION ON ANY LSWPOP OTHER THAN PCLSR
8114 ; 4.1-4.3 => FUNCTION
8115 ; 3.1-3.9 USER # LAST LOCKED BY
8116 ; 1.1-2.9 LSWPR THREAD
8117
8118 LSWDIS: LDB T,[330300,,A]       ;FUNCTION
8119         TLNE A,400000   ;SKIP IF NOT FOR PCLSR
8120          JUMPGE U,LSWDS1        ;PCLSRED AND 4.9=1
8121         TLNN A,200000   ;NOT FOR PCLSR OR FOR PCLSR BUT NOT PCLSRED
8122          POPJ P,        ;NOT FOR EITHER LSWPOP
8123         JUMPGE U,CPOPJ  ;FOR OTHER LSWPOP BUT PCLSRED
8124 LSWDS1: JRST LSWTAB(T)
8125
8126 LSWTAB: JRST UNSWTL     ;0 (AOSE) ALSO USED FOR QUSR
8127         JRST UNLSWT     ;1 (SIGN)
8128         JRST ULROUT     ;2 (GO TO ROUTINE)
8129         JRST ULAOS      ;3 (AOS, SOS)
8130         JRST UNLST      ;4 (UNLOCK FROM LIST)
8131         JRST ULSOS      ;5 (SOS, AOS)
8132         JRST ULSTM      ;6  (SETOM)
8133         JRST ULAOSL     ;7 (AOS,SOS LEFT HALF)
8134
8135 UNSWTL: MOVE T,-1(P)
8136         SETOM (T)
8137         POPJ P,
8138
8139 ULSTM:  MOVE T,@-1(P)
8140         SETOM (T)
8141         POPJ P,
8142
8143 UNLSWT: MOVE T,@-1(P)
8144         MOVSI A,400000
8145         ANDCAM A,(T)
8146         POPJ P,
8147
8148 ULAOSL: MOVE T,@-1(P)
8149         MOVSI A,-1
8150         ADDB A,(T)
8151         JUMPGE A,CPOPJ
8152         BUG                     ;OVER-SOS'ED
8153
8154 ULAOS:  MOVE T,@-1(P)
8155         SOS (T)
8156         POPJ P,
8157
8158 UNLST:  SETOM DLSRCH
8159         MOVS T,@-1(P)
8160         HLRM T,(T)
8161         MOVSS T
8162         TRNE T,-1
8163         HLLM T,(T)
8164         SETZM DLSRCH
8165         POPJ P,
8166
8167 ULSOS:  MOVE T,@-1(P)
8168         AOS (T)
8169         POPJ P,
8170
8171 ULROUT: MOVE T,@-1(P)
8172         TLNE A,200000
8173          JRST ULROU1    ;A LOSSET - MAY CLOBBER A OR T; USR INDEX IN U
8174         HRRZM T,UPC(U)  ;IT'S A FINSET, EXPECTS THE OLD METHOD OF CALL.
8175         TLNE T,-1
8176          HLRM T,AC15S(U)
8177 IFE KA10P,[
8178         MOVSI T,%PSPCU  ;IT MIGHT TRY AN XCTR
8179         HLLM T,UPC(U)
8180 ] ;IFE KA10P
8181         TLOE U,200000   ;SIGNAL PC CLOBBERED
8182          BUG            ;PC TRIED TO BE CLOBBERED TWICE
8183         POPJ P,
8184
8185 ULROU1: JUMPGE U,(T)    ;IF LOSSET, AND LSWPOPPING,
8186         MOVE A,[B,,AC0S+B]
8187         ADDI A,(U)      ;PUT THE ACS IN THE AC0S, SINCE
8188         BLT A,AC0S+H(U) ;THAT'S WHERE THEY'LL BE IF CALL LOSSET ROUTINE WHILE PCLSRING.
8189         JRST (T)
8190 \f
8191 ;FIND SWITCH POINTED TO BY WORD AFTER
8192 ;PUSHJ P,LSWREM AND UNLOCK IT
8193 LSWREM: PUSH P,T
8194         PUSH P,U
8195         PUSH P,Q
8196         MOVE U,USER
8197         SKIPN U,LSWPR(U)
8198          BUG
8199         HRRZ Q,@-3(P)
8200         MOVEI T,1
8201 LSWRM1: CAMN U,Q
8202          JRST LSWRM2
8203         HRRZ U,1(U)
8204         SKIPN U
8205          BUG
8206         AOJA T,LSWRM1
8207 LSWRM2: POP P,Q
8208         POP P,U
8209         PUSHJ P,LSWPON
8210         AOS -1(P)
8211         JRST POPTJ
8212
8213 LSWDEL: PUSH P,U        ;REMOVE SWITCH FROM HEAD OF LIST
8214         MOVE U,USER     ;DO NOT ATTEMPT TO UNLOCK IT
8215         PUSH P,T
8216         SKIPN T,LSWPR(U)
8217          BUG
8218         PUSHJ P,LSWDDD
8219         JRST POPTUJ
8220
8221 LSWDDD: PUSH P,Q
8222         HRRZ Q,1(T)
8223         HRRZM Q,LSWPR(U)
8224         CAILE T,USRSTG
8225          SETZM 1(T)
8226         POP P,Q
8227         POPJ P,
8228
8229 ;POP C(T)'TH FROB BACK
8230 LSWPON: PUSHJ P,LSWBAK
8231         PUSHJ P,LSWPPP
8232         POPJ P,
8233
8234 ;DELETE C(T)'TH FROB BACK
8235 LSWDLN: PUSHJ P,LSWBAK
8236         PUSHJ P,LSWDDD
8237         POPJ P,
8238
8239 LSWBAK: PUSH P,U
8240         MOVE U,USER
8241         TLO U,400000    ;SIGNAL NOT PCLSR IN CASE OF LSWPPP
8242         PUSH P,Q
8243         MOVE Q,T
8244         MOVEI T,LSWPR-1(U)
8245         SOJE Q,LSWBA3   ;UNLOCKING FIRST FROB
8246         MOVE T,1(T)
8247         SOJG Q,.-1
8248 LSWBA2: MOVE Q,T
8249         HRRZ T,1(T)
8250         PUSH P,LSWPR(U) ;DON'T WORRY, YOU CAN'T GET PCLSR'ED JUST BELOW
8251         XCT @-3(P)
8252         HRRZ T,LSWPR(U)
8253         HRRM T,1(Q)
8254         POP P,LSWPR(U)
8255         JRST POPQU1
8256
8257 LSWBA3: MOVE T,LSWPR(U)
8258         XCT @-2(P)
8259         JRST POPQU1
8260 \f
8261 SUBTTL VARIOUS RETURNS
8262
8263 PPBAJ1: POP P,B
8264 POPAJ1: AOSA -1(P)
8265 POPBAJ: POP P,B
8266 POPAJ:  POP P,A
8267 CPOPJ:  POPJ P,
8268
8269 POPQJ:  POP P,Q
8270         POPJ P,
8271
8272 POPBJ1: AOSA -1(P)
8273 POPCBJ: POP P,C
8274 POPBJ:  POP P,B
8275         POPJ P,
8276
8277 POPJ3:  AOS (P)
8278 POPJ2:  AOSA (P)
8279 POPCJ1: POP P,C
8280 POPJ1:  AOSA (P)
8281 POPCJ:  POP P,C
8282         POPJ P,
8283
8284 POPJJ1: AOS -1(P)
8285 POPJJ:  POP P,J
8286         POPJ P,
8287
8288 POPUJ1: AOSA -1(P)
8289 POPTUJ: POP P,T
8290 POPUJ:  POP P,U
8291         POPJ P,
8292
8293 POPTJ:  POP P,T
8294         POPJ P,
8295
8296 POPTTJ: POP P,TT
8297         POPJ P,
8298
8299 POPWJ2: AOS -1(P)
8300 POPWJ1: AOS -1(P)
8301 POPWJ:  POP P,W
8302         POPJ P,
8303
8304 PIONJ:  CONO PI,PION
8305         POPJ P,
8306
8307 CKOCJ1: CONO PI,CLKON
8308         JRST POPCJ1
8309
8310 CLKOJ1: AOS (P)
8311 CLKONJ: CONO PI,CLKON
8312         POPJ P,
8313
8314 CKOPJ1: AOS (P)
8315 CLKOPJ: CONO PI,CLKON
8316         JRST LSWPOP
8317
8318 IFN OMXP,[
8319 OMXONJ: CONO PI,OMXON
8320         POPJ P,
8321 ]
8322
8323 TTYOJ1: AOS (P)
8324 TTYONJ: CONO PI,TTYON
8325         POPJ P,
8326
8327 IFN PTRP, PTRONJ:: PTPONJ::
8328 LPTONJ: CONO PI,LPTON
8329         POPJ P,
8330
8331 IFN NETP,NETOJ1:
8332 UTCOJ1: AOSA (P)
8333 UTCOAJ:  POP P,A
8334 IFN NETP,NETONJ:
8335 UTCONJ: CONO PI,UTCON
8336         POPJ P,
8337
8338 POPQU1: AOS -2(P)
8339 POPQUJ: POP P,Q
8340         POP P,U
8341         POPJ P,
8342
8343 POP1J1: AOS -1(P)
8344 POP1J:  SUB P,[1,,1]
8345         POPJ P,
8346
8347 POP2J:  SUB P,[2,,2]
8348         POPJ P,
8349
8350 POP3J1: AOS -3(P)
8351 POP3J:  SUB P,[3,,3]
8352         POPJ P,
8353
8354 POP4J:  SUB P,[4,,4]
8355         POPJ P,
8356
8357 POP7J:  SUB P,[2,,2]
8358 POP5J:  SUB P,[5,,5]
8359         POPJ P,
8360 \f
8361 SUBTTL UUO PROCESSOR
8362
8363 .IOT=UUOMIN
8364 .OPEN=UUOMIN+1_27.
8365 .OPER=UUOMIN+2_27.
8366 .CALL=UUOMIN+3_27.
8367 .USET=UUOMIN+4_27.
8368 .BREAK=UUOMIN+5_27.
8369 .STATUS=UUOMIN+6_27.
8370 .ACCESS=UUOMIN+7_27.
8371
8372 DEFINE GLOSYM X
8373         IRP Y,,[X]
8374         SQUOZE 4,.!Y
8375         .!Y
8376         TERMIN
8377         TERMIN
8378
8379 ;REPEAT OVER USET NAMES FROM 0 TO 77.
8380         DEFINE USTIRP A
8381         IRPS X,,[UPC VAL TTY FLS UNAME JNAME MASK USTP
8382 PIRQC INTB MEMT SV40 IPIRQ APIRQ SNAME PICLR
8383 MARA MARPC UUOH UIND RUNT MSK2 IFPIR APRC
8384 CNSL UTRP IIFPI AIFPI IMASK AMASK IMSK2 AMSK2
8385 JPC OPC RTMR HSNAME BCHN MPVA IDF1 ADF1
8386 IDF2 ADF2 DF1 DF2 OPTION 40ADDR TVCREG
8387 TTST TTS1 TTS2 WHO1 WHO2 WHO3 SUPPRO TR1INS
8388 TR2INS MBOX MBO1 EBOX EBO1 XUNAME XJNAME FTL1 FTL2]
8389 A
8390 TERMIN
8391 TERMIN
8392
8393 ;REPEAT OVER USET NAMES 600 AND UP.
8394         DEFINE USTIR1 A
8395         IRPS X,,[PAGRAN PAGAHD SERVER]
8396            A
8397         TERMIN TERMIN
8398
8399 ;NOTE:  OPER'S BELOW ARE 8 PER LINE
8400 ;    USE UP ILUUO'S BEFORE ADDING TO END
8401 ; THE FOLLOWING SHOULD GO AWAY EVENTUALLY
8402 ;       ITYI (=ITYIC)
8403 ;       SETMSK (=SUSET)
8404 ;       WSNAME (=SUSET)
8405 ;       UPISET (=SUSET)
8406 ;       RDSW (=DATAI)
8407 ;       EOFC (OBSOLETE)
8408 DEFINE OPRIRP A
8409         IRPS X,,[ITYI LISTEN SLEEP SETMSK SETM2 DEMON CLOSE
8410 UCLOSE ATTY DTTY IOPUSH IOPOP DCLOSE DSTOP RDTIME
8411 RDSW GUN UDISMT GETSYS IPDP GETLOC SETLOC DISOWN
8412 DWORD DSTEP GENSYM LOGOUT REALT WSNAME UPISET RESET
8413 ARMOVE DCONTIN CBLK ASSIGN DESIGN RTIME RDATE HANG
8414 EOFC IOTLSR RSYSI SUPSET PDTIME ARMRS UBLAT IOPDL
8415 ITYIC MASTER VSTST NETAC NETS REVIVE DIETIM SHUTDN
8416 ARMOFF NDIS FEED EVAL REDEF IFSET UTNAM UINIT
8417 RYEAR RLPDTM RDATIM RCHST RBTC DMPCH SWAP MTAPE
8418 GENNUM NETINT]
8419         A
8420 TERMIN
8421 TERMIN
8422
8423 DEFINE CALIRP A
8424 IRPS X,,[DISMIS LOSE TRANAD VALUE UTRAN CORE TRAND
8425 DSTART FDELE DSTRTL SUSET LTPEN VSCAN POTSET]
8426 A TERMIN TERMIN
8427 \f
8428 ;THESE ARE THE SYMBOLS USED BY MIDAS AND DDT. THEY ALSO
8429 ;EXIST IN SYS:ITS DEFS.
8430 ;SYMBOLS SHOULD BE LEFT IN CURRENT ORDER OR DDT WILL LOSE
8431 SYSYMB: USTIRP [SQUOZE 44,.R!X
8432         .IRPCNT]
8433         SQUOZE 44,.RIOC
8434         100
8435         SQUOZE 44,.RIOS
8436         120
8437         SQUOZE 44,.RIOP
8438         140
8439         SQUOZE 44,.RPMAP
8440         200
8441         USTIR1 [SQUOZE 44,.R!X
8442         600+.IRPCNT]
8443         USTIRP [SQUOZE 44,.S!X
8444         400000+.IRPCNT]
8445         USTIR1 [SQUOZE 44,.S!X
8446         400600+.IRPCNT]
8447
8448         GLOSYM [IOT,OPEN,OPER]
8449
8450 DEFINE DEFSYM X/
8451 IRPS Z,,[X]
8452 SQUOZE 44,Z
8453 Z
8454 .ISTOP
8455 TERMIN TERMIN
8456
8457 .INSRT BITS >
8458
8459 EXPUNG DEFSYM
8460
8461         ZZ=1
8462         OPRIRP [IFSN X,ILUUO,[.!X=.OPER ZZ
8463         SQUOZE 4,.!X
8464         .!X]
8465         ZZ==ZZ+1]
8466
8467 MXOPR==ZZ
8468
8469         SQUOZE 4,.CALL
8470         .CALL
8471
8472 CALIRP [
8473 IFSN X,UNUSD,[
8474         .!X=.CALL .IRPCNT+1,
8475         SQUOZE 4,.!X
8476         .!X
8477 ]]
8478
8479         GLOSYM [USET,BREAK,STATUS,ACCESS]
8480 SYSYME==.-1
8481 \f
8482 ;THESE SYMBOLS ARE USED BY DDT, SO THE USER CAN OPEN .PIRQC, ETC.
8483                 ;BEGINNING FOR .GETSYS (USYMS)
8484 SYSUSB:
8485 USTIRP [
8486         SQUOZE 4,.!X
8487         .IRPCNT
8488 ]
8489         SQUOZE 4,.IOC
8490         100
8491         SQUOZE 4,.IOS
8492         120
8493         SQUOZE 4,.IOP
8494         140
8495         SQUOZE 4,.PMAP
8496         200
8497 USTIR1 [
8498         SQUOZE 4,.!X
8499         600+.IRPCNT
8500 ]
8501 SYSUSE==.-1     ;END FOR .GETSYS (USYMS)
8502
8503 ;SIXBIT NAME TABLES FOR WHO LINE GENERATION.
8504 ;ALSO USED BY PEEK FOR PRINTING OUT JOBS' STATUS.
8505
8506 OPRSXB: SIXBIT/OPER/
8507 OPRIRP [
8508 .1STWD  SIXBIT/X/
8509 ]
8510
8511 CALSXB: SIXBIT/CALL/
8512 CALIRP [
8513 .1STWD  SIXBIT/X/
8514 ]
8515         SIXBIT/UNUSD/
8516
8517 UUOSXB:
8518 IRPS X,,IOT OPEN OPER CALL USET BREAK STATUS ACCESS
8519 .1STWD  SIXBIT/X/
8520 TERMIN
8521 NUUOSX==.-UUOSXB
8522 \f
8523 ;MACRO TO SAVE ACS AS APPROPRIATE FOR OUR CPU, LOAD UP U,
8524 ;CHECK VARIOUS ERROR CONDITIONS.
8525
8526 DEFINE UUOSAV
8527         CONSZ PI,77400
8528          BUG AWFUL,[UUO WITH PI IN PROGRESS]
8529 IFN KA10P,[
8530         UMOVEM U,17             ;SAVE 17
8531         SKIPGE U,USER           ;LOAD CURRENT USERS INDEX,
8532          BUG AWFUL,[UUO IN NULL JOB]
8533         UMOVEM T,16             ;SAVE LOC 16 FOR USER
8534         MOVEI T,0               ;HA HA
8535         XCTR XBW,[BLT T,15]     ;SAVE REST OF ACS IN USERS SHADOW 0-15
8536 ] ;KA10P
8537 IFE KA10P,[
8538         SYSCTX
8539         SKIPGE U,USER
8540          BUG AWFUL,[UUO IN NULL JOB]
8541         LDB T,[330300,,MUUOCX(U)]
8542         CAIE T,1
8543          BUG AWFUL,[UUO WHILE IN AC BLK ],DEC,T
8544 ] ;IFE KA10P
8545 TERMIN
8546
8547 ; UUO AND ILLOP TRAP HANDLER
8548 ;
8549 ;EITHER DISPATCHES TO APPROPRIATE UUO ROUTINE,
8550 ;   RETURNS CONTROL TO USERS UUO ROUTINE, GOES TO ILLOP, USRTRP, OR USRIOT.
8551 ;CODE ON THIS PAGE IS INTERRUPTABLE AT ANY POINT
8552
8553 ;COME HERE TO RETURN A UUO TO THE USER. RESTORES USER ACS W THROUGH U ONLY.
8554 USRUUO: CAIG U,LUBLK
8555          BUG AWFUL,[RETURNABLE UUO FROM SYS OR CORE JOB,PC=],OCT,UUOH
8556         MOVE W,UUOH
8557         TLNN W,%PCUSR
8558          BUG AWFUL,[RETURNABLE UUO FROM EXEC MODE,PC=],OCT,UUOH
8559         HRRZ W,40ADDR(U)
8560         MOVE P,USRPDL(U) ;IN CASE AN XCTR FAULTS.
8561         XCTR XR,[HLRZ H,1(W)]
8562         CAIE H,(JSR)    ;ELSE OK ONLY IF OPCODE IN 41 IS 0 OR JSR.
8563          JUMPN H,ILUUO  ;THIS IS IN CASE USER IS HANDLING USER-UUO'S WITH PUSHJ
8564                         ;AND HIS UUOH ISN'T ABLE TO BE JSR'D TO.
8565         XCTR XR,[HRRZ H,1(W)]
8566         JUMPE H,ILUUO           ;0 ISN'T ACCEPTABLE AS UUOH ADDRESS.
8567         MOVE T,FORTY
8568         UMOVEM T,(W)    ;ALL IS LEGAL; PLANT UUO INTO USERS "40".
8569         MOVE T,UUOH     ;SIMULATE A JSR AT USER'S "41"
8570         UMOVEM T,(H)
8571         AOS H
8572         HRRM H,UUOH     ;SET TO RETURN TO USER AT FIRST INSTRUCTION OF UUO HANDLER
8573 IFN KA10P,[
8574         MOVE U,[W,,W]
8575         XCTR XBR,[BLT U,U]
8576 ] ;KA10P
8577 ULEAVE: USRCTX          ;SELECT USER MODE AC BLOCK IF NEC.
8578
8579 EBLK
8580
8581 ;THE FOLLOWING BLOCK OF LOCATIONS IS SWITCHED WITH SOME USER VARS
8582
8583 UEXIT:  JRST 2,@XUUOH   ;EXIT FROM UUO (FOR KL-10, POINTS TO APPROPRIATE
8584                         ;UPT LOC) 
8585
8586 CLUSAV: MOVEM U,AC17S   ;CLOCK SAVE OF U
8587
8588 IFE KA10P,[
8589 CLCXSV: DATAI PAG,CLCX  ;CLOCK LEVEL CONTEXT SAVE
8590 ] ;IFE KA10P
8591
8592 IFN KA10P,[
8593 XUUOH:  0               ;UUO AND ILLOP TRAP GETS HERE - UUOH0 MUST BE . + 1.
8594 ] ;KA10P
8595
8596 UEXND:: ;END OF SWAPPED UEXIT BLOCK.
8597
8598 BBLK
8599
8600 UUOH0:  UUOSAV
8601 MUUOT1: SKIPGE UTRAPM(U) ;IF SUPERIOR WANTS TO CATCH UUOS, THIS IS FATAL INT.
8602          JRST USRTRP
8603         SKIPGE T,FORTY  ;PICK UP THE UUO OR ILLOP
8604          JRST USRIOT
8605         CAML T,[UUOMIN]
8606          CAML T,[UUOMAX]
8607           JRST USRUUO   ;NOT A SYSTEM CALL, GIVE TO USER
8608 ;DROPS THROUGH
8609 \f;DROPS IN
8610 ;HERE WITH UUO TO BE HANDLED BY SYSTEM IN T
8611 ILLOP1: JUMPN U,UUOH1
8612         MOVEI Q,0       ;SAVE SYS JOB EXEC MODE LSWPR PNTR
8613         EXCH Q,LSWPR
8614         MOVEM Q,SLSWPR
8615 UUOH1:  SKIPE LSWPR(U)
8616          JRST 4,.
8617         MOVEM T,LSUUO(U)        ;SAVE UUO FOR DEBUGGING PURPOSES
8618         LSH T,-27.              ;RIGHT JUSTIFY OP CODE
8619         SKIPL UUODSP-UUOMIN_-27.(T)
8620          JRST UUOTR3
8621         MOVE H,OPTION(U)
8622         TLNE H,%OPDEC
8623          JRST USRUUO
8624 UUOTR3: SETZM SYSCVL(U)         ;DIDN'T GET INTO SYSTEM VIA .CALL
8625         MOVE P,USRPDL(U)        ;SET UP USER PDL
8626         HRRZ C,FORTY            ;PICK UP EFFECTIVE ADDRESS OF UUO
8627         LDB R,[270400,,FORTY]   ;PICK UP AC FIELD OF UUO
8628         MOVEM R,UUAC(U)         ;SAVE AC FLD
8629         PUSHJ P,@UUODSP-UUOMIN_-27.(T)  ;DISPATCH ON UUO TYPE
8630          JRST URET      ;NORMAL RETURN (NON SKIP)
8631 URETJ1:
8632 IFE KA10P, MOVE U,USER  ;(SINCE UUOH IS IN THE USER VARIABLES)
8633         AOS UUOH        ;UUO ROUTINE SKIPPED, AOS USER RETURN POINT
8634 URET:   MOVE U,USER
8635         MOVE A,PIRQC(U) ;CHECK FOR RETURNING TO USER WITH PCLSR'ING FATAL
8636                         ; INT SET.
8637         TDNE A,[BADBTS&#<%PIC.Z\%PIDIS>] ;A FEW BITS ARE FATAL BUT SET
8638                                          ; ASYNCHRONOUSLY.
8639          JRST [ HRRZ A,UEXIT            ;INT SET, MAKE SURE UEXIT IS CLOBBERED
8640             IFN KA10P, CAIE A,ONEPRO    ;TO A LOCATION WHICH WILL CHECK PIRQC.
8641             IFN KS10P, CAIE A,ONEPR4
8642                 CAIE A,ONEFLS
8643                  BUG
8644                 JRST .+1]
8645         SKIPE UMAPS(U)
8646          PUSHJ P,MPLDZ
8647         CAMN U,PCLUSR
8648          SKIPG PCLDBM
8649           JRST URET2
8650         SKIPL PCLNXT
8651          JRST URPCL1
8652 URET2:  SKIPE LSWPR(U)
8653          BUG
8654         JUMPN U,URETC
8655         MOVEI T,0       ;RESTORE SYS JOB EXEC LSWPR
8656         EXCH T,SLSWPR
8657         MOVEM T,LSWPR
8658 URET1:  CONSO PI,1
8659          BUG            ;RETURNING TO USER MODE WITH CLOCK OFF
8660 IFN KA10P,[
8661         MOVEI U,0
8662         XCTR XBR,[BLT U,U]      ;RESTORE USERS ACS FROM USERS SHADOW 0-17
8663 ] ;KA10P
8664         JRST ULEAVE
8665
8666 URETC:  REPEAT NULBLK/2,[
8667         SKIPN CONC LSWB,\<2*.RPCNT>,+1(U)
8668         SKIPE CONC LSWB,\<2*.RPCNT+1>,+1(U)
8669         BUG
8670 ]
8671         REPEAT NULBLK&1,[
8672         SKIPE CONC LSWB,\<NULBLK-1>,+1(U)
8673         BUG
8674 ]
8675         JRST URET1
8676
8677 URPCL1: SKIPN LSUUO(U)
8678         JRST URET2      ;DIDN'T REALLY MISS MARK (DUE TO FINSET)
8679         SETOM PCLNXT    ;MISSED MARK, REINITIALIZE
8680         SETZM PCLL
8681         SETZM PCLHSH
8682         JRST URET2
8683
8684 UUOTRO: MOVE T,FORTY
8685         JRST UUOH1
8686
8687 USRIOT: MOVSI T,(UIOT)  ;I/O INST TURNS INTO PSEUDO UUO TO DISPATCH ON
8688         JRST ILLOP1
8689 \f
8690 IFE KA10P,[
8691
8692 ;HANDLE UUOS EXECUTED FOR TRAPS (PDL OV, ARITH OV, ONE PROCEED).
8693 ;MOST ARE AS USUAL, BUT OPCODE 0 IORM'S ADDRESS INTO PIRQC.
8694 ;NOTE: LOSER IS NOT PERMITTED TO USE OPCODE 0 - SEE USTR1I, ETC.
8695
8696 MUUOTR: UUOSAV
8697         MOVE T,FORTY
8698         TLNE T,-1
8699          JRST MUUOT1    ;IF OPCODE ISN'T 0, TREAT UUO NORMALLY (STARTING A
8700                         ; ONE PROCEED)
8701         MOVSI A,%PSTR1+%PSTR2
8702         ANDCAB A,UUOH   ;TURN OFF TRAP FLAGS, GET PC
8703         TRNN T,%PIARO
8704          JRST MUUOT2
8705         TLNE A,%PCFOV   ;DISTINGUISH FIXED AND FLOATING OVERFLOW.
8706          TLO T,(%PIFOV)
8707 MUUOT2: MOVE A,MSKST(U)
8708         IOR A,[BADBTS]
8709         AND T,A         ;INTS SETTING WHICH AREN'T DISABLED
8710         IORM T,PIRQC(U)
8711         SKIPN PICLR(U)
8712          TDZA A,A
8713           SETCM A,IDF1(U)
8714         IOR A,[BADBTS]  ;MASK FOR INTS WHICH AREN'T DEFERRED
8715         TDNE T,A
8716          JRST ONEPR1    ;TAKE INT
8717         JRST URET       ;IGNORE INT
8718
8719 MUUOEX: BUG AWFUL,[MUUO IN EXEC MODE, PC=],OCT,EPT+425
8720                         ;UUO IN EXEC MODE NOT IN SYS JOB
8721
8722 LUUOEX: 0
8723         BUG AWFUL,[LUUO IN EXEC MODE,PC=],OCT,LUUOEX
8724
8725 ILLTRP: 0
8726         BUG AWFUL,[TRAP IN EXEC MODE,PC=],OCT,ILLTRP
8727 ] ;IFE KA10P
8728
8729 IFN KA10P,[
8730 EBLK
8731 60H:    0               ;TRAPS FROM 60
8732 BBLK
8733 60H0:   UUOSAV          ;IF WE LOSE PROCESSOR HERE, 60 GETS COPIED INTO 40,
8734                         ; 60H IS COPIED INTO UUOH, AND UPC GETS MOVED INTO
8735                         ; UUOH0.
8736 60HE:   CONO PI,CLKOFF
8737         MOVE T,60H
8738         MOVEM T,UUOH
8739         MOVE T,60
8740         MOVEM T,FORTY
8741         CONO PI,CLKON
8742         JRST MUUOT1
8743 ] ;KA10P
8744 \f
8745 ;COME HERE FROM UEXIT WHEN USER IS BEING PCLSR'ED
8746 ; KA10 - ALL USER ACS ARE IN MACHINE ACS AND IN UUOACS
8747 ; KL10 & KS10 - ALL USERS ACS ARE IN AC BLOCK 1
8748
8749 ONEFLS: CONO PI,CLKOFF          ;TURN OFF CLOCK BREAKS
8750         SYSCTX
8751         MOVE U,USER             ;GET INDEX OF CURRENT USER
8752 ONEPR2: SKIPE T,RPCL(U)         ;SKIP IF NO RPCLSRING OCCURING
8753          JRST ONEFL2            ;RPCLSRING GOING ON
8754 ONEPR1: MOVE U,USER             ;GET INDEX OF CURRENT USER
8755         CONO PI,CLKOFF          ;TURN OFF CLOCK BREAKS
8756         SKIPE LSWPR(U)
8757          JRST 4,.
8758         MOVEI T,AC0S(U)         ;PUT USER ACS INTO SWAP OUT ACS
8759         XCTR XBR,[BLT T,AC17S(U)]
8760         MOVE T,UUOH
8761         MOVEM T,UPC(U)          ;SIMULATE JRST 2,@UUOH
8762 IFN KA10P, MOVE T,[JRST 2,@UUOH]
8763 IFE KA10P,[
8764         MOVSI T,(JRST 2,@)
8765         HRRI T,UUOH
8766 ] ;IFE KA10P
8767         MOVEM T,UEXIT           ;RESTORE UEXIT
8768         USRCTX
8769         MOVE U,USER             ;AS IF HAD RETURNED TO USER THEN CLKBRK
8770                                 ;EXCEPT THAT AC'S ARE ALREADY STORED IN AC0S
8771         JRST UFL6               ;RESCHEDULE, ETC
8772
8773 ONEFL2: JUMPG T,[JRST 4,.]      ;LOSEY LOSEY (SHOULD NOT TRY TO EXIT WHILE TRYING TO RPCLSR SOMEONE)
8774         MOVE A,FLSINS(T)        ;GET FLSINS OF USER SUPPOSEDLY RPCLSRING YOU
8775         SUBI A,RPCL(T)          ;HIS FLSINS SHOULD BE A SKIPE OF HIS RPCL
8776         CAME A,[SKIPE]          ;SKIP IF HE HAS THE RIGHT FLSINS
8777          JRST 4,.               ;LOSEY LOSEY
8778         CLEARM FLSINS(T)        ;ASSURE NO INTERRUPT
8779         SETZM RPCL(U)           ;ACS IN UUO ACS CLOCK OFF
8780         AOS USTP(U)             ;STOP SELF
8781         SETZM RPCL(T)           ;UNHANG LOSER RPCLSR'ING YOU
8782         JRST ONEPR1
8783 \f
8784 ;ROUTINES TO GIVE THE RUNNING JOB AN INTERRUPT AND ABORT THE CURRENT INSTRUCTION
8785
8786 TTYLOS: SKIPA T,[%PITTY] ;JOB WHOSE %TBINT IS SET TRIED TO USE ITS TTY WHEN DIDN'T OWN IT
8787 IOADC:   MOVEI T,%PIMPV ;I/O UUO MEMORY PROTECT VIOLATION
8788         JRST UUOERR
8789
8790 ABREAK: MOVEI T,%PIBRK  ;.BREAK - INTERRUPT TO SUPERIOR
8791 ILLOP4: IORM T,PIRQC(U)
8792         JRST ONEPR1
8793
8794         RADIX 10.
8795 IOCERF: ;ADDRESS OF FIRST IO CHANNEL ERROR
8796 ZZ==NIOTER
8797 IFG ZZ-9,ZZ==9
8798 REPEAT ZZ,CONC IOCER,\.RPCNT+MIOTER,:   JSP T,IOCERX
8799 IFG NIOTER-9,[REPEAT NIOTER-9,CONC IOCR,\.RPCNT+MIOTER+9,:      JSP T,IOCERX
8800 ]
8801 IFN 0, IOCER1: IOCER2: IOCER3: IOCER4: IOCER5: IOCER6: IOCER7:  ;FOR @
8802 .ALSO  IOCER8: IOCER9: IOCR10: IOCR11: IOCR12: IOCR13: IOCR14:
8803
8804         RADIX 8
8805 IOCERX: CONSZ PI,77400
8806          JRST 4,.       ;ERR WITH PI IN PROGRESS
8807         SUBI T,IOCER9-9+1
8808         MOVE U,USER
8809         HRRZ TT,UUAC(U)
8810         DPB TT,[BCHPTR] ;STORE LAST CHNL IN ERROR
8811         ADD TT,U
8812         DPB T,[330600,,IOCHST(TT)]
8813 IOCERR: MOVEI T,%PIIOC
8814         JRST UUOERR
8815
8816 AILUUO::
8817 ILUUO:  SKIPA T,[%PIILO]        ;ILLEGAL SYSTEM UUO
8818 TRPDEV:                         ;ATTEMPTED USE OF TRAP DEVICE
8819 USRTRP:  MOVSI T,(%PITRP)       ;SYSTEM UUO IN TRAP MODE
8820
8821 UUOERR: MOVE U,USER
8822         IORM T,PIRQC(U) ;GIVE USER INT BIT
8823 IOADCR: MOVE U,USER
8824         MOVE T,OPTION(U);PC CLOBBERED TO HERE IF MPV IN EXEC MODE - INTR OUT OF UUO
8825         TLNN T,%OPOPC   ;UNLESS USER HAS SAID NOT TO,
8826          AOS UUOH       ;UNDO SOS THAT PCLSR'ING WILL DO; PC SHOULD END UP -> AFTER UUO.
8827 UUOER2: CONO PI,CLKON   ;THERE HAD BETTER BE A CLASS 1 OR 2 INT. PENDING.
8828         MOVE P,USRPDL(U)
8829         SETZM SCHMNY    ;CAUSE FULL SCHEDULE SO INTERRUPT WILL BE SEEN
8830         JFCL            ; (IT'S A CROCK TO HAVE TO DO THIS, BUT HARD TO FIX)
8831         PUSHJ P,UFLS    ;LET THE INTERRUPT PCLSR US.
8832         JRST 4,.
8833
8834 UUOER1: MOVE U,USER     ;UUOERR ASSUMING %OPOPC
8835         IORM T,PIRQC(U)
8836         JRST UUOER2
8837
8838 IFN KA10P,[
8839 ILEXPF: CONO PI,CLKOFF  ;GET HERE AFTER EXEC PAGE FAULT TAKEN ON XCTRI
8840         SPM UPGML(U)
8841         MOVSI A,1770    ;CLEAR FAULT REASON BITS
8842         ANDCAM A,UPQUAN(U)
8843         LPMR UPGML(U)
8844         JRST ILUUO
8845 ] ;KA10P
8846 IFE KA10P, ILEXPF==ILUUO        ;NO CLEANUP NECESSARY
8847 \f
8848 ;UUO DISPATCH
8849
8850 ;AT DISPATCH TIME, P HAS UPDL, C HAS RH OF 40
8851 ;R HAS AC FIELD OF UUO, U HAS USER INDEX
8852
8853 UUODSP: SETZ AIOT       ;SETZ FLAGS UUO'S TO REFLECT TO USER WHEN %OPDEC OPTIONS
8854         SETZ AOPEN      ;IN EFFECT. THEY ARE THE UUOS WHICH OVERLAP DEC
8855         AOPER
8856         ACALL
8857         AUSET
8858         ABREAK
8859         ASTATUS 
8860         SETZ AACCESS
8861         SETZ AUIOT
8862 IF2,IFN <UIOT-UUOMIN>_-27.+UUODSP-.+1,.ERR LOSE AT UUODSP
8863
8864 ;.CALL IOT
8865 NIOT:   CAIL W,3        ;SET IOTBTS TO USER'S 3RD ARG, OR TO 0.
8866          SETZ C,
8867         MOVEM C,IOTBTS(U)
8868         HRRZ C,B        ;ADDRESS OF 2ND ARG
8869         SKIPGE SYSCVL(U)
8870          SKIPA C,[SETZ] ;USING OUTPUT ARG INSTEAD OF INPUT, FOR UNIT INPUT MODE
8871           CAIL W,2
8872            AOSA (P)     ;GOING TO SUCCEED NOW
8873             JRST OPNL30 ;NOT ENOUGH ARGS
8874         JRST AIOT1
8875
8876 ;.IOT
8877 AIOT:   SETZM CTLBTS(U)
8878         SETZM IOTBTS(U)
8879         ADDI R,IOCHNM(U) ;GET IOCHNM WD ADDR IN R.
8880 AIOT1:  MOVE A,U
8881         IDIVI A,LUBLK
8882         SKIPE B
8883          BUG
8884         HLRZ A,(R)      ;PICK UP LEFT HALF (DEVICE DEPENDENT)
8885         HRRZ B,(R)      ;PICK UP RIGHT HALF (INDEX INTO IOTTB, ETC.)
8886         MOVE D,IOTTB(B) ;GO TO ROUTINE FOR PARTICULAR DEV AND MODE
8887         TLNE D,%IOTOT+%IOTBK+%IOTSP     ;BUT FOR "NORMAL" UNIT MODE INPUT, SPECIAL:
8888          JRST (D)
8889         XCTR XRW,[MOVES (C)] ;MAKE SURE XCTR XW, BELOW WON'T PCLSR.
8890         PUSH P,C
8891         PUSHJ P,(D)     ;CALL IOT ROUTINE, EXPECTING VALUE IN W.
8892 AIOT3:   JRST AIOT2     ;NOTE AIOT3 MAY BE CHECKED FOR ON PDL.
8893           JRST AIOT2
8894
8895 AIOT2:  POP P,C
8896         SKIPGE C
8897          SKIPA A,W      ;RETURNING IN NEW SYSTEM-CALL STYLE
8898           UMOVEM W,(C)
8899         POPJ P,
8900
8901 ;RANDOM ACCESS
8902
8903 AACCES: HRRZ A,UUAC(U)
8904         UMOVE B,(C)
8905         MOVE T,['ACCESS]
8906         MOVEM T,LSCALL(U)       ;IN CASE PASSED TO JOB DEVICE
8907         MOVEI W,2
8908         PUSHJ P,NACCES
8909          JRST IOCER8    ;FOR .ACCESS, SIGNAL FAILURE WITH IOC ERROR.
8910         POPJ P,         ;ONLY POSSIBLE FAILURE IS CHANNEL NOT OPEN.
8911
8912 NACCES: MOVEI T,AIOCAL  ;GET <CLSTB BITS>,,<IOCHNM WD ADDR> IN R
8913         MOVSI J,NACCE1
8914         JRST CHNDCD
8915
8916 NACCE1: TLNN R,%CLSQ\%CLSU\%CLSFU
8917          JRST OPNL34
8918         HRRM B,IOCHST-IOCHNM(R) ;STORE USR .ACCESS POINTER
8919         TLNN R,%CLSQ
8920          JRST POPJ1             ;NOT DISK
8921         HLRZ I,(R)
8922         MOVEM B,QRADAD(I)       ;STORE ACCESS POINTER FOR DSK
8923         MOVSI D,%QAACC
8924         IORM D,QSRAC(I) ;SET ADR HAS BEEN HACKED FLAG
8925         JRST POPJ1
8926 \f
8927 ;SIOT SYMBOLIC SYSTEM CALL - IOT A STRING.
8928 ; 1ST ARG CHANNEL NUMBER.
8929 ; 2ND ARG BYTE POINTER
8930 ; 3RD ARG STRING LENGTH
8931 ; 4TH (OPTIONAL) ARG DEVICE-INDEPENDENT CONTROL BITS
8932 ; CTLBTS  DEVICE DEPENDENT CONTROL BITS
8933
8934 NSIOT:  TLNN B,1000     ;OBJECT IF B.P. OR COUNT IS IMMEDIATE.
8935          TLNE C,1000
8936           JRST OPNL33
8937         CAIGE W,4
8938          SETZ D,
8939         MOVEM D,IOTBTS(U)
8940         MOVE D,IOTTB(H)
8941         TLNE D,%IOTBK+%IOTSP    ;SIOT ALLOWED ONLY ON UNIT MODE CHANNELS.
8942          JRST OPNL12            ;"MODE NOT AVAILABLE".
8943         XCTR XRW,[MOVES A,(B)]  ;ENSURE BYTE POINTER WRITABLE
8944         TLNE A,(@)              ;CAN'T HACK BYTE POINTER WITH INDIRECT ADDRESSING
8945          JRST OPNL33            ;MEANINGLESS ARGS
8946         TLNE A,17
8947          PUSHJ P,NSIOT9         ;HACK INDEXING
8948         XCTR XRW,[MOVES A,(C)]  ;ENSURE BYTE COUNT WRITABLE
8949         JUMPLE A,POPAJ1         ;0 BYTES TO BE XFERED => SUCCEED IMMEDIATELY.
8950         HLRZ A,(R)
8951         MOVE TT,B               ;IN CASE SPECIAL ROUTINE WANTS TO CALL SIOKT
8952         TLNE D,%IOTBP           ;IF THERE'S A SPECIAL DEVICE ROUTINE FOR SIOT,
8953          JRST -1(D)             ;GO TO IT.
8954 ;THIS CALL IS LEGAL AND ORDINARY. LOOP, CALLING THE UNIT MODE ROUTINE.
8955 NSIOT1: PUSH P,A
8956         PUSH P,B
8957         PUSH P,C
8958         PUSH P,D                ;PUT ALL IMPORTANT INFO ON STACK FOR MAIN LOOP
8959         HRRZS (P)               ;TO LOOK AT.
8960         PUSH P,R
8961         TLNN D,%IOTOT
8962          JRST NSIOIL            ;INPUT AND OUTPUT PART HERE
8963 NSIOOL: UMOVE A,@-3(P)
8964         IBP A                   ;THIS HAIR IS TO AVOID INCREMENTING THE USER'S COPY
8965         UMOVE D,(A)             ;OF THE BYTE POINTER BEFORE THE BYTE HAS BEEN
8966         HRRI A,D                ;FINALLY TAKEN WITH NO POSSIBILITY OF PCLSR'ING OUT.
8967         LDB D,A                 ;CAN'T USE XCTR XR,[LDB D,A] BECAUSE ON THE KA10
8968         MOVE C,[SETZ D]         ;THAT WOULD USE THE LOSER'S AC A.
8969         MOVE R,(P)
8970         MOVE A,-4(P)    ;SET UP ARGS FOR IOT ROUTINE; C HAS ADDR OF VALUE.
8971         PUSHJ P,@-1(P)  ;CALL THE IOT ROUTINE.
8972         XCTR XRW,[IBP @-3(P)]   ;NOW STEP THE B.P. AND COUNT.
8973         XCTR XRW,[SOS A,@-2(P)]
8974         JUMPG A,NSIOOL
8975         JRST NSIOTX
8976
8977 NSIOIL: UMOVE A,@-3(P)
8978         IBP A           ;MAKE SURE NO FAULT IDPB'ING THE BYTE
8979         XCTR XRW,[MOVES (A)]
8980         MOVE R,(P)      ;NOW GET THE ARGS FOR THE IOT ROUTINE,
8981         MOVE A,-4(P)
8982         PUSHJ P,@-1(P)  ;AND CALL IT, WITH VALUE COMING IN W.
8983          JRST NSIOI3    ;NO SKIP => WE WIN.
8984           JRST NSIOTX   ;1 SKIP => THERE'S NO INPUT; RETURN WITHOUT STEPPING B.P.
8985                         ;2 SKIPS => THIS BYTE IS THE LAST ONE AVAILABLE.
8986         XCTR XBYTE,[IDPB W,@-3(P)]
8987         XCTR XRW,[SOS @-2(P)]
8988         JRST NSIOTX
8989
8990 NSIOI3: XCTR XBYTE,[IDPB W,@-3(P)]
8991         XCTR XRW,[SOS A,@-2(P)]
8992         JUMPG A,NSIOIL
8993 NSIOTX: SUB P,[5,,5]
8994         JRST POPJ1
8995
8996 NSIOT9: EXCH A,R        ;INDEXED BYTE POINTER, EVAL INDEX ONCE AND WRITE BACK
8997         PUSHJ P,ASCIND
8998         EXCH A,R
8999         UMOVEM A,(B)
9000         POPJ P,
9001 \f;
9002 ; ROUTINES TO SIMULATE SOME I/O INSTRUCTIONS WHEN EXECUTED BY USER
9003
9004 IFE KS10P,[     ; KS10 will never have any devices so we might as well punt
9005                 ; this sham right from the start.
9006
9007 AUIOT:  MOVE I,FORTY    ;GET I/O INST
9008         ANDI R,7        ;GET IOT TYPE FIELD
9009         LDB J,[320700,,FORTY]
9010         LDB D,[420200,,IOTTYP(R)]
9011         JRST @IOTTYP(R) ;DISPATCH ON TYPE
9012
9013 IOTTYP: 000000,,IOTTY3          ;BLKI
9014         000000,,IOTTY2          ;DATAI
9015         200000,,IOTTY3          ;BLKO
9016         200000,,IOTTY2          ;DATAO
9017         600000,,IOTTY2          ;CONO
9018         400000,,IOTTY2          ;CONI
9019         400000,,IOTTY1          ;CONSZ
9020         400000,,IOTTY1          ;CONSO
9021
9022 IOTTY1: CAIN J,177      ;IF EQ INST WAS 7777XX,,XXXXXX
9023         JRST ILUUO      ;USER HAS EXECUTED A SMALL NEGATIVE NUMBER
9024         JRST IOTTY2
9025
9026 IOTTY3:
9027 IFN KL10P,[
9028         MOVE C,DCHNTB(J)
9029         TRNE C,10000
9030          JRST IOTTY2    ;SPECIAL BLKI THAT IS TREATED LIKE DATAI
9031 ]
9032         TLO I,40        ;BLOCK TYPE, TURN ON BIT TO CONVERT TO UNIT
9033         UMOVE C,(I)     ;GET BLOCK POINTER
9034         ADD C,[1,,1]    ;ADVANCE
9035         TLNE C,-1       ;SKIP IF OVERFLOW
9036         AOS (P)         ;CAUSE RETURN TO SKIP
9037         UMOVEM C,(I)    ;STORE BACK
9038         HRR I,C         ;MODIFY INST ADR TO RH OF BLOCK POINTER
9039 IOTTY2: SKIPL C,DCHNTB(J)
9040         JRST IOTTYA
9041         LSH C,19.(D)
9042         SKIPL C
9043         JRST ILUUO
9044 IOTTYB: XCTR XRW,I      ;DO IOT
9045         POPJ P,         ;NORMAL RETURN
9046         JRST POPJ1      ;IOT SKIPPED RETURN
9047
9048 IOTTYA: SKIPGE DCHNTC(J)
9049         JRST ILUUO      ;SUSPICIOUS DEVICE
9050         JRST IOTTYB
9051
9052 ] ;IFE KS10P
9053
9054 IFN KS10P, AUIOT==:ILUUO        ; For now.
9055
9056 IFN 0,[         ; Simple IO instruction simulating for the KS should look
9057                 ; like this.  Unfortunately XCTR XRW,[APRID 100] clobbers
9058                 ; exec location 100.  Further investigation is needed
9059                 ; before figuring out how to deal with this.
9060
9061 AUIOT:  LDB R,[271500,,FORTY]   ; Get opcode and AC.
9062         CAIE R,APRID_-27        ; For now this is the only instruction we
9063                                 ; simulate on the KS
9064          JRST ILUUO
9065         XCTR XRW,FORTY          ; Do it
9066          POPJ P,                ; Return normally
9067         JRST POPJ1              ; It skipped (well APRID can't, but perhaps
9068                                 ; someday something else will)
9069 ] ;IFN 0
9070 \f
9071 SUBTTL .SUSET, .USET, .CALL USRVAR
9072
9073 ;COMMON CODE FOR USRVAR, TTYVAR, ETC. SYMBOLIC SYSTEM CALLS
9074 ;PUSHJ P,VARCAL WITH FIRST ARG DECODED INTO H,I,J,R; B,C,W,U SET UP AS IN .CALL
9075 ;NOTE B IS A POINTER TO THE SECOND ARG (IN BLOCK MODE IS WRITTEN BACK)
9076 ;POPJS (OR PUSHJS IN THE CASE OF BLOCK MODE) BACK WITH E CONTAINING
9077 ;VARIABLE SPEC, D INPUT DATA, W INSTRUCTION TO HACK IT (0 TO READ INTO A,
9078 ;OTHERWISE OP D, WITH RH CLEAR WHERE OP IS MOVEM, ANDCAM, ADDM, ETC.)
9079
9080 VARCAL: HRRZ E,B        ;USE 2ND ARG AND NUM OF ARGS TO DETERMINE TYPE OF OPERATION
9081         TLNE B,1000
9082          JRST VARCA1    ;IMMEDIATE 2ND ARG
9083         UMOVE E,(B)     ;GET VALUE OF 2ND ARG
9084         TLC E,777000
9085         TLCN E,777000
9086          JRST VARCBL    ;BLOCK MODE (2ND ARG LOOKS LIKE AOBJN POINTER)
9087 VARCA1: EXCH D,C        ;D GETS 3RD ARG, INPUT DATA
9088         CAIL W,4
9089          JRST VARCA2    ;JUMP IF IMMEDIATE INSTRUCTION MODE
9090         CAIGE W,3       ;SKIP IF WRITING
9091          TDZA W,W       ;W 0 FOR READING
9092           MOVSI W,(MOVEM D,) ;SIMPLE CASE OF WRITING (SEE VARCBL FOR HAIR)
9093         POPJ P,         ;CALLER WILL DO OPERATION AND POPJ1 OR OPEN-LOSS
9094
9095 VARCA2: ADD P,[2,,2]    ;IMMEDIATE INSTRUCTION MODE.  MAKE STACK SAME AS AT VARCAL.
9096         TLNN C,-1       ;E HAS VARIABLE SPEC
9097          MOVSS C        ;C GETS INSTRUCTION
9098         PUSHJ P,VARCA3  ;PERFORM THE INSTRUCTION
9099         JRST POP3J1     ;TAKE GOOD RETURN FROM THE CALL
9100
9101 VARCBL: PUSH P,J        ;BLOCK MODE.  SAVE J WHICH SOME SUSETS CLOBBER
9102         PUSH P,B        ;SAVE POINTER TO AOBJN POINTER TO SPEC,INSN PAIR LIST
9103         XCTR XRW,[MOVES B,@(P)] ;GET AOBJN POINTER, TEST WRITEABILITY
9104 VARCB1: UMOVE E,(B)     ;GET VARIABLE SPEC
9105         UMOVE C,1(B)    ;GET "INSTRUCTION"
9106         MOVE J,-1(P)    ;GET DECODED FIRST ARG OR WHATEVER (SOME USRVAR ROUTINES CLOBBER J)
9107         PUSHJ P,VARCA3  ;PERFORM THE INSTRUCTION
9108         MOVE B,[2,,2]
9109         XCTR XRW,[ADDB B,@(P)]  ;ADVANCE AOBJN POINTER
9110         JUMPL B,VARCB1          ;MORE STUFF TO DO
9111         JRST POP3J1             ;POINTER COUNTED OUT, POP B, J, PUSHJ TO VARCAL
9112
9113 VARCA3: EXCH C,R        ;HERE TO PERFORM INSTRUCTION IN C
9114         TLNE R,37
9115          PUSHJ P,ASCIND         ;EVALUATE INSTRUCTION'S EFFECTIVE ADDRESS
9116         EXCH C,R
9117         LDB B,[410300,,C]       ;GET MAJOR PDP10 OPCODE CLASS
9118         JRST @.+1(B)
9119          VARCBE         ;0 UUO ILLEGAL
9120          VARCBE         ;1 FP/BYTE ILLEGAL
9121          VARCB2         ;2 MOVE/ADD/SUB
9122          VARCBE         ;3 CAM ETC. RESERVED FOR .HANGING IN THE FUTURE
9123          VARCB4         ;4 BOOLE
9124          VARCBE         ;5 HWT ILLEGAL
9125          VARCB6         ;6 TEST
9126          VARCBE         ;7 IOT ILLEGAL
9127
9128 VARCBE: SUB P,[4,,4]    ;POP PUSHJ TO VARCA3, B, J, PUSHJ TO VARCAL
9129         JRST OPNL33     ;BAD ARG
9130
9131 VARCB6: TLNE C,006000   ;TEST INSTRUCTION - SKIP IF NO SKIP
9132          JRST VARCBE    ;SKIPPING TESTS RESERVED FOR FUTURE .HANGS
9133         TLNE C,010000   ;SKIP IF IMMEDIATE
9134          XCTR XR,[SKIPA D,(C)]
9135           HRRZ D,C
9136         TLNE C,001000   ;SKIP IF TDX OR TRX
9137          MOVSS D        ;TSX OR TLX
9138         LDB C,[370200,,C] ;GET MODIFICATION TYPE
9139         XCT (C)[JRST VARCBE     ;NO MODIFICATION OBVIOUSLY AN ERROR
9140                 MOVSI W,(ANDCAM D,) ;TXZ
9141                 MOVSI W,(XORM D,)   ;TXC
9142                 MOVSI W,(IORM D,)]  ;TXO
9143         JRST VARCBA
9144 \f
9145 VARCB4: TLNE C,002000   ;BOOLEAN INSTRUCTION - OK IF RESULT TO AC
9146          JRST VARCBE
9147         TLNN C,001000   ;SKIP IF IMMEDIATE
9148          XCTR XR,[SKIPA D,(C)]
9149           HRRZ D,C
9150         HLLZ W,C        ;SET UP OPCODE TO HAVE A+M EXCHANGED
9151         TLZ W,003777    ;AND RESULT TO BE SENT TO MEMORY
9152         TLCE W,030000
9153          TLCE W,030000
9154           TLC W,030000
9155         TLO W,(<002000,,> D,)
9156         JRST VARCBA
9157
9158 VARCB2: SETZB W,D               ;MOVE/ADD/SUB GROUP
9159         HLRZ B,C
9160         CAIN B,(MOVEM)
9161          JRST VARCBB            ;SIMPLY READING
9162         TLNE C,002000
9163          JRST VARCBE            ;RESULT MUST BE TO AC
9164         TLZ C,(0 17,)           ;CHANGE AC FIELD TO D
9165         TLO C,(0 D,)
9166         TLNE C,060000           ;SKIP IF MOVE GROUP
9167          JRST VARCB5
9168         XCTR XR,C               ;FETCH OPERAND, DO MODIFICATION IF CALLED FOR (MOVN)
9169         MOVSI W,(MOVEM D,)      ;OPERATION WILL BE SIMPLE STORE
9170         JRST VARCBA
9171
9172 VARCB5: TLC C,070000
9173         TLCE C,070000
9174          JRST VARCBE            ;NOT ADD/SUB
9175         XCTR XR,C               ;ADD TO/SUBTRACT FROM ZERO IN D
9176         MOVSI W,(ADDM D,)       ;DROP INTO VARCBA
9177
9178 ;HERE WITH E, W, D ALL SET UP FOR WRITING.
9179 VARCBA: PUSHJ P,@-3(P)          ;CALL BACK TO CALLER OF VARCAL
9180          JRST POP4J             ;LOST, POP PUSHJ TO VARCA3, B, J, VARCAL, TAKE ERR RETURN
9181         POPJ P,                 ;WON, RETURN FROM VARCA3
9182         
9183 ;HERE WITH E AND W SET UP FOR READING.
9184 VARCBB: PUSH P,C                ;SAVE ADDRESS TO BE READ INTO
9185         XCTR XRW,[MOVES (C)]    ;NO FAULT.  INSURANCE OF WRITEABILITY.
9186         PUSHJ P,@-4(P)          ;GET VALUE OF VARIABLE INTO A
9187          JRST POP5J             ;LOST POP C, VARCA3, B, J, VARCAL, TAKE ERR RETURN TO USER
9188         POP P,C                 ;WON, STORE RESULT INTO USER
9189         UMOVEM A,(C)
9190         POPJ P,                 ;AND RETURN FROM VARCA3
9191 \f
9192 USETBT: 420200,,USETL(E)        ;BYTE POINTER TO UENTRY FIELD A
9193         400200,,USETL(E)        ; " B
9194         200200,,USETL(E)        ; " C
9195         160200,,USETL(E)        ; " D
9196
9197 USETRL: 221600,,USETL(E)        ;BYTE POINTER TO UENTRY FIELD E
9198         001600,,USETL(E)        ; " F
9199
9200 ;IN EACH UENTRY ENTRY:  A IS THE METHOD FOR USET READ
9201 ;                       B IS THE METHOD FOR SUSET READ
9202 ;                       C IS THE METHOD FOR USET SET
9203 ;                       D IS THE METHOD FOR SUSET SET
9204 ;                       E & F ARE USED BY THE METHODS AS LISTED BELOW
9205 ;METHOD 0 = ILLEGAL MODE
9206 ;METHOD 1 = USE F AS RELATIVE LOC OF VAR
9207 ;METHOD 2 = USE E AS ROUTINE TO TRANSFER TO
9208 ;METHOD 3 = USE F AS ROUTINE TO TRANSFER TO
9209
9210 DEFINE UENTRY A,B,C,D,E,F
9211         ZZ==.SUCCESS
9212         A_20+B_16+E,,C_20+D_16+F
9213         IF2 [
9214         IFN 777774&<A\B\C\D>,[PRINTX /UENTRY A,B,C,D TOO BIG
9215 /]      IFN 740000&<E\F>,[PRINTX /UENTRY E,F TOO BIG
9216 /]      IFSE [E!F],[PRINTX /UENTRY E,F NULL
9217 /]      ]
9218         .SUCCESS==ZZ
9219         TERMIN
9220
9221 USETL:  UENTRY 1,1,2,0,UPCSET,UPC-USRSTG        ;.UPC
9222         UENTRY 1,1,1,1,,VALUE-USRSTG            ;.VAL
9223         UENTRY 3,3,2,2,USTTY,URTTY              ;.TTY
9224         UENTRY 1,1,0,0,,FLSINS-USRSTG           ;.FLS
9225         UENTRY 1,1,0,2,UUNAME,UNAME-USRSTG      ;.UNAME
9226         UENTRY 1,1,2,2,UJNAME,JNAME-USRSTG      ;.JNAME
9227         UENTRY 1,1,2,2,USMASK,MSKST-USRSTG      ;.MASK
9228         UENTRY 1,1,2,0,USTOP,USTP-USRSTG        ;.USTP
9229
9230         UENTRY 1,1,2,2,USPIRQ,PIRQC-USRSTG      ;.PIRQC
9231         UENTRY 2,2,0,0,UGSUPR,                  ;.INTB
9232         UENTRY 1,1,2,2,USMEMT,HUSRAD-USRSTG     ;.MEMT
9233         UENTRY 1,1,0,0,,SV40-USRSTG             ;.SV40
9234 REPEAT 2,UENTRY 1,1,2,2,IAPIRQ,PIRQC-USRSTG     ;.IPIRQ/.APIRQ
9235         UENTRY 1,1,2,2,USYNST,USYSNM-USRSTG     ;.SNAME
9236         UENTRY 1,1,2,2,UPISET,PICLR-USRSTG      ;.PICLR
9237
9238         UENTRY 2,2,3,3,URMAR,USMAR              ;.MARA
9239         UENTRY 1,1,1,1,,UMARPC-USRSTG           ;.MARPC
9240         UENTRY 1,1,0,0,,SUUOH-USRSTG            ;.UUOH
9241         UENTRY 2,2,0,0,UINDEX,                  ;.UIND
9242         UENTRY 1,2,0,0,UTRNTR,UTRNTM-USRSTG     ;.RUNT
9243         UENTRY 1,1,2,2,USMSK2,MSKST2-USRSTG     ;.MSK2
9244         UENTRY 1,1,2,2,USIFPI,IFPIR-USRSTG      ;.IFPIR
9245         UENTRY 1,1,0,0,,APRC-USRSTG             ;.APRC
9246
9247         UENTRY 3,3,0,0,,URCNSL                  ;.CNSL
9248         UENTRY 2,0,3,0,RUTRAP,SUTRAP            ;.UTRP
9249 REPEAT 2,UENTRY 1,1,2,2,IAIFPI,IFPIR-USRSTG     ;.IIFPI/.AIFPI
9250 REPEAT 2,UENTRY 1,1,2,2,IAMASK,MSKST-USRSTG     ;.IMASK/.AMASK
9251 REPEAT 2,UENTRY 1,1,2,2,IAMSK2,MSKST2-USRSTG    ;.IMSK2/.AMSK2
9252
9253         UENTRY 3,3,2,2,UJPCS,UJPCR,             ;.JPC
9254         UENTRY 2,2,0,0,UROPC,                   ;.OPC
9255         UENTRY 1,1,1,1,,RTIMER-USRSTG           ;.RTMR
9256         UENTRY 1,1,1,1,,HSNAME-USRSTG           ;.HSNAME
9257 ;IFN KL10P,UENTRY 1,1,1,1,,ULSPBR-USRSTG        ;.LSPBR
9258 ;.ELSE  UENTRY 1,1,1,1,,SRN3-USRSTG
9259         UENTRY 2,2,3,3,RUBCHN,SUBCHN,           ;.BCHN
9260         UENTRY 2,2,0,0,MPVARD                   ;.MPVA
9261 REPEAT 2,UENTRY 1,1,2,2,IADF1,IDF1-USRSTG       ;.IDF1, .ADF1
9262
9263 REPEAT 2,UENTRY 1,1,2,2,IADF2,IDF2-USRSTG       ;.IDF2, .ADF2
9264         UENTRY 1,1,2,2,USDF1,IDF1-USRSTG        ;.DF1
9265         UENTRY 1,1,2,2,USDF2,IDF2-USRSTG        ;.DF2
9266         UENTRY 1,1,1,1,,OPTION-USRSTG           ;.OPTION
9267         UENTRY 1,1,1,1,,40ADDR-USRSTG           ;.40ADDR
9268 IFE N11TYS,     UENTRY 1,1,1,1,,SRN3-USRSTG     ;.TVCREG - JOB'S CONSOLE REGISTER CONTENTS
9269 IFN N11TYS,     UENTRY 1,1,1,2,STVCRG,TVCREG-USRSTG
9270         UENTRY 1,1,1,1,,TTSTSV+2-USRSTG         ;.TTST
9271
9272         UENTRY 1,1,1,1,,TTSTSV-USRSTG           ;.TTS1
9273         UENTRY 1,1,1,1,,TTSTSV+1-USRSTG         ;.TTS2
9274         UENTRY 1,1,1,1,,UWHO1-USRSTG            ;.WHO1
9275         UENTRY 1,1,1,1,,UWHO2-USRSTG            ;.WHO2
9276         UENTRY 1,1,1,1,,UWHO3-USRSTG            ;.WHO3
9277         UENTRY 3,3,0,0,,RUSUPP                  ;.SUPPRO
9278 IFN KA10P, UENTRY 2,2,0,0,URTR1I                ;.TR1INS
9279 IFE KA10P, UENTRY 1,1,1,1,,TR1INS-USRSTG
9280 IFN KA10P, UENTRY 2,2,0,0,URTR2I                ;.TR2INS
9281 IFE KA10P, UENTRY 1,1,1,1,,TR2INS-USRSTG
9282
9283 IFE KL10P,[
9284 REPEAT 4,UENTRY 1,1,0,0,,SRN3-USRSTG
9285 ] ;IFE KL10P
9286 IFN KL10P,[
9287         UENTRY 1,0,0,0,,MBOXCT-USRSTG           ;.MBOX
9288         UENTRY 1,0,0,0,,MBOXCT+1-USRSTG         ;.MBO1
9289         UENTRY 1,0,0,0,,EBOXCT-USRSTG           ;.EBOX
9290         UENTRY 1,0,0,0,,EBOXCT+1-USRSTG         ;.EBO1
9291 ] ;KL10P
9292         UENTRY 1,1,1,1,,XUNAME-USRSTG           ;.XUNAME (USER'S REAL NAME)
9293         UENTRY 1,1,1,1,,XJNAME-USRSTG           ;.XJNAME
9294         UENTRY 1,1,1,1,,SRN4-USRSTG             ;.FTL1
9295         UENTRY 1,1,1,1,,SRN5-USRSTG             ;.FTL2
9296         UENTRY 1,1,1,1,,PAGRAN-USRSTG           ;.PAGRANGE
9297         UENTRY 1,1,1,1,,PAGAHD-USRSTG           ;.PAGAHEAD
9298         UENTRY 2,2,3,3,URSERV,USSERV            ;.SERVER
9299 MXVAL==.-USETL
9300 EXPUNGE UENTRY  ;NO MORE UENTRY'S
9301 \f
9302 MXVAL2==.RADIX 2,CONC [.LENGTH/]\MXVAL-1,/      ;BASE 2 LOG OF TABLE SIZE
9303
9304 ;SIXBIT TABLE OF USER VARIABLE NAMES.  MUST BE IN CORRECT ORDER,
9305 ;SAME AS SYSCTB.
9306
9307 USETTB: SIXBIT/ADF1/
9308         SIXBIT/ADF2/
9309         SIXBIT/AIFPIR/
9310         SIXBIT/AMASK/
9311         SIXBIT/AMSK2/
9312         SIXBIT/APIRQC/
9313         SIXBIT/APRC/
9314         SIXBIT/BCHN/
9315         SIXBIT/CNSL/
9316         SIXBIT/DF1/
9317         SIXBIT/DF2/
9318         SIXBIT/EBO1/
9319         SIXBIT/EBOX/
9320         SIXBIT/FLS/
9321         SIXBIT/FTL1/
9322         SIXBIT/FTL2/
9323         SIXBIT/HSNAME/
9324         SIXBIT/IDF1/
9325         SIXBIT/IDF2/
9326         SIXBIT/IFPIR/
9327         SIXBIT/IIFPIR/
9328         SIXBIT/IMASK/
9329         SIXBIT/IMSK2/
9330         SIXBIT/INTB/
9331         SIXBIT/IPIRQC/
9332         SIXBIT/JNAME/
9333         SIXBIT/JPC/
9334         SIXBIT/MARA/
9335         SIXBIT/MARPC/
9336         SIXBIT/MASK/
9337         SIXBIT/MBO1/
9338         SIXBIT/MBOX/
9339         SIXBIT/MEMT/
9340         SIXBIT/MPVA/
9341         SIXBIT/MSK2/
9342         SIXBIT/OPC/
9343         SIXBIT/OPTION/
9344         SIXBIT/PAGAHE/
9345         SIXBIT/PAGRAN/
9346         SIXBIT/PICLR/
9347         SIXBIT/PIRQC/
9348         SIXBIT/RTMR/
9349         SIXBIT/RUNT/
9350         SIXBIT/SERVER/
9351         SIXBIT/SNAME/
9352         SIXBIT/SUPPRO/
9353         SIXBIT/SV40/
9354         SIXBIT/TR1INS/
9355         SIXBIT/TR2INS/
9356         SIXBIT/TTS1/
9357         SIXBIT/TTS2/
9358         SIXBIT/TTST/
9359         SIXBIT/TTY/
9360         SIXBIT/TVCREG/
9361         SIXBIT/UIND/
9362         SIXBIT/UNAME/
9363         SIXBIT/UPC/
9364         SIXBIT/USTP/
9365         SIXBIT/UTRP/
9366         SIXBIT/UUOH/
9367         SIXBIT/VAL/
9368         SIXBIT/WHO1/
9369         SIXBIT/WHO2/
9370         SIXBIT/WHO3/
9371         SIXBIT/XJNAME/
9372         SIXBIT/XUNAME/
9373         SIXBIT/40ADDR/
9374 IFN .-USETTB-MXVAL, .ERR USETTB INCONSISTENT WITH USETL
9375 REPEAT 1_<MXVAL2>-<MXVAL-1>-1, <SETZ>-1 ;PAD TO POWER OF 2 WITH PLUS INFINITY
9376 \f
9377 ;THE FOLLOWING TABLE IS PARALLEL TO USETTB AND GIVES THE NUMERIC USET CODE
9378 ;WHICH SHOULD BE IN THE RANGE 0 - 77 OR 600 AND UP.
9379 USETBN: 47      ;.ADF1
9380         51      ;.ADF2
9381         33      ;.AIFPI
9382         35      ;.AMASK
9383         37      ;.AMSK2
9384         15      ;.APIRQ
9385         27      ;.APRC
9386         44      ;.BCHN
9387         30      ;.CNSL
9388         52      ;.DF1
9389         53      ;.DF2
9390         73      ;.EBO1
9391         72      ;.EBOX
9392         3       ;.FLS
9393         76      ;.FTL1
9394         77      ;.FTL2
9395         43      ;.HSNAME
9396         46      ;.IDF1
9397         50      ;.IDF2
9398         26      ;.IFPIR
9399         32      ;.IIFPI
9400         34      ;.IMASK
9401         36      ;.IMSK2
9402         11      ;.INTB
9403         14      ;.IPIRQ
9404         5       ;.JNAME
9405         40      ;.JPC
9406         20      ;.MARA
9407         21      ;.MARPC
9408         6       ;.MASK
9409         71      ;.MBO1
9410         70      ;.MBOX
9411         12      ;.MEMT
9412         45      ;.MPVA
9413         25      ;.MSK2
9414         41      ;.OPC
9415         54      ;.OPTION
9416         601     ;.PAGAHE
9417         600     ;.PAGRAN
9418         17      ;.PICLR
9419         10      ;.PIRQC
9420         42      ;.RTMR
9421         24      ;.RUNT
9422         602     ;.SERVER
9423         16      ;.SNAME
9424         65      ;.SUPPRO
9425         13      ;.SV40
9426         66      ;.TR1INS
9427         67      ;.TR2INS
9428         60      ;.TTS1
9429         61      ;.TTS2
9430         57      ;.TTST
9431         2       ;.TTY
9432         56      ;.TVCREG
9433         23      ;.UIND
9434         4       ;.UNAME
9435         0       ;.UPC
9436         7       ;.USTP
9437         31      ;.UTRP
9438         22      ;.UUOH
9439         1       ;.VAL
9440         62      ;.WHO1
9441         63      ;.WHO2
9442         64      ;.WHO3
9443         75      ;.XJNAME
9444         74      ;.XUNAME
9445         55      ;.40ADDR
9446 IFN .-USETBN-MXVAL, .ERR USETBN INCONSISTENT WITH USETL
9447 \f
9448 ;.CALL USRVAR HACK USER VARIABLES.
9449 ;ARG 1 - <JOB> SPEC
9450 ;ARG 2 - AOBJN PNTR FOR BLOCK MODE OR 0,,USER-VAR-NUMBER OR SIXBIT/USER-VAR-NAME/
9451 ;ARG 3 - DATA IF WRITING AND NOT IN BLOCK MODE. (OPTIONAL)
9452 ;ARG 4 - IMMEDIATE INSTRUCTION, OVERRIDES ARG 3. (OPTIONAL)
9453 ;VAL 1 - DATA IF READING AND NOT IN BLOCK MODE
9454
9455 NUSRVA: MOVE J,A                ;DECODE FIRST ARG
9456         JSP T,NCORUI            ;GET JOB AND LOCK ITS DIELOK
9457          JRST NUSRV0            ;DEFINITELY WRITEABLE
9458         JSP T,NCORWR            ;NOT SURE, CHECK FURTHER
9459          TLO J,(SETZ)           ;SET WRITE PROTECT BIT
9460 NUSRV0:
9461 IFN PDP6P,[
9462         TRNE J,400000
9463          PUSHJ P,NULSET
9464 ]
9465         PUSHJ P,NUSRV5          ;DO IT
9466          POPJ P,                ;LOST
9467         JRST LSWPJ1             ;WON, UNLOCK DIELOK AND TAKE SUCCESS RETURN
9468
9469 NUSRV5: PUSHJ P,VARCAL          ;DECODE ARGS, HACK BLOCK MODE, SET E, W, D.
9470 NUSRV3: SETZB B,I               ;ENTER HERE FROM .USET AND .SUSET
9471         TLNN E,-1               ;NOW DECODE USER VARIABLE SPEC
9472          JRST NUSRV1            ;JUMP IF OLD STYLE NUMERIC SPEC
9473 REPEAT MXVAL2,[                 ;SIXBIT SPEC LOOK UP IN TABLE
9474         CAML E,USETTB+1_<MXVAL2-.RPCNT-1>(B)
9475          ADDI B,1_<MXVAL2-.RPCNT-1>
9476 ]
9477         CAMN E,USETTB(B)
9478          CAIL B,MXVAL
9479           JRST OPNL11           ;ILLEGAL USER VARIABLE NAME
9480         MOVE E,USETBN(B)        ;TRANSLATE TO NUMERIC SPEC
9481 NUSRV1: JUMPE W,NUSRV2          ;READING
9482         JUMPL J,OPNL31          ;WRITING AND WRITE PROTECTED
9483         MOVEI I,2               ;MAGIC INDEX 1.2=R/W 1.1=OTHER/SELF
9484 NUSRV2: CAIN U,(J)
9485          IORI I,1
9486 IFN PDP6P,[
9487         HRRE B,J
9488         AOJE B,PDPPMT           ;USER IS PDP6
9489 ]
9490         CAIL E,600
9491          JRST [ SUBI E,500
9492                 JRST NUSRV4]
9493         CAIL E,100
9494          JRST AUSET2            ;100 TO 577 ARE .IOC, .IOS, .IOP, .PMAP VARS.
9495 NUSRV4: CAIL E,MXVAL            ;DETECT USET CODE BEYOND 6XX MAXIMUM.
9496          JRST OPNL11
9497         LDB B,USETBT(I)         ;GET METHOD BITS
9498         SOJL B,OPNL12           ;VARIABLE NOT AVAILABLE THIS MODE (WRITE PROTECT?)
9499         SOJL B,AUSVAR           ;SIMPLE VARIABLE
9500         LDB B,USETRL(B)         ;GET ADDRESS OF ROUTINE TO CALL
9501         HRRZ A,J                ;SOME ROUTINES WANT USER INDEX IN A
9502         JUMPE W,(B)
9503         CAMN W,[MOVEM D,]
9504          JRST (B)
9505         PUSH P,D                ;READ/ALTER/REWRITE
9506         PUSH P,E
9507         PUSH P,I
9508         PUSH P,W
9509         PUSH P,J
9510         TRZ I,2                 ;FIRST READ IT
9511         MOVEI W,0
9512         PUSHJ P,NUSRV4
9513          JRST POP5J             ;READ LOST
9514         POP P,J
9515         POP P,W
9516         POP P,I
9517         POP P,E
9518         POP P,D
9519         HRRI W,A
9520         XCT W                   ;MODIFY THE VALUE IN A
9521         MOVE D,A
9522         MOVSI W,(MOVEM D,)
9523         JRST NUSRV4             ;THEN WRITE IT BACK
9524 \f
9525 ;
9526 ;       .SUSET [N,,LOC] ;SAME AS .USET (SEE BELOW) BUT REFERS TO SELF
9527 ;
9528 ASUSET: HRRZ J,U        ;JOB TO BE HACKED IS SELF
9529         SETZM UUAC(U)   ;IF ERROR, RETURN LOSS IN .IOS+0
9530         JRST AUSET0
9531
9532 ;                               ;IF N&200000=1, BLOCK MODE
9533 ;       .USET CH,[N,,LOC]       ;IF N&400000=0, READS USER VAR SPECIFIED BY REST OF N
9534                                 ;       FOR INFERIOR OR FOREIGN USER OPEN ON CHANNEL CH
9535                                 ;       INTO USER LOCATION LOC
9536                                 ;IF N&400000.NE.0, SETS USER VAR SPECIFIED BY REST OF N
9537                                 ;       FOR DIRECTLY INFERIOR USER OPEN ON CHANNEL CH
9538                                 ;       FROM USER LOCATION LOC
9539 AUSET:  MOVE J,R        ;DECODE AC FIELD AS CHANNEL NUMBER
9540         PUSHJ P,AUSETJ
9541          JRST IOCER7    ;USR OP CHNL DOES NOT HAVE USR OPEN
9542 AUSET0: XCTR XR,[HRRZ B,(C)]    ;GET ADDRESS READING INTO OR WRITING FROM
9543         XCTR XR,[HLRZ E,(C)]    ;GET VARIABLE AND DIRECTION
9544         TRNE E,200000
9545          JRST ABUSET    ;BLOCK MODE
9546         TRZN E,400000
9547          JRST AUSET1    ;JUMP IF READING
9548         JUMPL J,IOCER7  ;WRITE PROTECT VIOLATION
9549         MOVSI W,(MOVEM D,)      ;FLAG WRITING
9550         UMOVE D,(B)     ;GET DATA TO WRITE
9551         PUSHJ P,NUSRV3  ;DO THE WRITE
9552          JRST ILUUO     ;LOST
9553         POPJ P,
9554
9555 ;BLOCK-MODE .USET
9556 ABUSET: TRNE E,400000
9557          TLOE J,(MOVE)  ;SET BLOCK BIT
9558           JRST ILUUO    ;BLOCK IN BLOCK LOSES
9559         UMOVE Q,(C)     ;GET AOBJN PTR AGAIN
9560 ABUST2: UMOVEM Q,(C)    ;STORE AWAY UPDATED POINTER
9561         PUSH P,C
9562         PUSH P,J
9563         MOVE C,Q
9564         PUSHJ P,AUSET0
9565         POP P,J
9566         POP P,C
9567         UMOVE Q,(C)
9568         AOBJN Q,ABUST2
9569         POPJ P,
9570
9571 AUSET1: MOVEI W,0       ;FLAG READING
9572         XCTR XRW,[MOVES (B)]    ;ENSURE WRITEABILITY
9573         PUSH P,B
9574         PUSHJ P,NUSRV3  ;GET VALUE OF VARIABLE INTO A
9575          JRST ILUUO     ;LOST
9576         POP P,J
9577 APTUAJ: UMOVEM A,(J)
9578         POPJ P,
9579
9580 ;DECODE ARG FOR USET
9581 AUSETJ: JSP T,NCRUI2
9582          JRST POPJ1
9583         JSP T,NCORWR
9584          TLO J,(SETZ)
9585         JRST POPJ1
9586
9587 AUSVAR: LDB C,USETRL+1  ;GET ADDRESS OF VARIABLE
9588         ADDI C,USRSTG(J)
9589         JUMPE W,[MOVE A,(C)
9590                  JRST POPJ1]
9591         HRR W,C
9592         XCT W
9593         JRST POPJ1
9594
9595 IFN PDP6P,[
9596 PDPPMT: MOVEI A,%JSSIX#%JSNUM   ;PDP6 HAS ONLY A FEW VARIABLES, WHICH ARE READ-ONLY
9597         CAIN E,.RUIND
9598          JRST POPJ1
9599         MOVEI A,LPDP6M*2000     ;FIXED MEM BOUND FOR PDP-6
9600         CAIN E,.RMEMT
9601          JRST POPJ1
9602         JRST POPJ1              ;IGNORE OTHER VARIABLES
9603 ]
9604 \f
9605 ;VARIABLES 100 - 577 (.IOC, .IOS, .IOP, .PMAP)
9606 AUSET2: JUMPN W,OPNL31  ;JUMP IF TRYING TO WRITE
9607         SUBI E,100
9608         CAIL E,40
9609          JRST AUSET4    ;>140=>.RIOP+M
9610         TRZE E,20
9611          JRST AUSET3    ;117<E<140=>.RIOS+M
9612         ADDI E,IOCHNM(J)        ;77<E<120=>.RIOC+M
9613 AUSETX: MOVE A,(E)      ;GET VAR
9614         JRST POPJ1
9615
9616 AUSET3: MOVE R,J        ;INFERIOR USER INDEX
9617         ADDI R,IOCHNM(E)        ;GET CHANNEL POINTER
9618         MOVE H,(R)
9619         JRST NSTATUS    ;DO A .CALL STATUS
9620
9621 AUSET4: CAIL E,40+LUIOP ;COMPARE AGAINST LAST IO PDL LOC
9622          JRST AUSET5    ;READ MAP ENTRY
9623         ADDI E,SIOCHN-40(J)     ;MAKE UP POINTER TO VAR
9624         JRST AUSETX
9625
9626 ;USET VARIABLE 200+N  --  READ MAP VARIABLE FOR PAGE N.
9627 ; (0 <= N < 400)  E CONTAINS N+100.
9628
9629 ;VALUE OF MAP WORD READ:
9630
9631 ;4.9  -  PAGE WRITEABLE.
9632 ;4.8  -  PAGE EXISTS (IF THIS OFF, WHOLE WORD IS 0)
9633 ;4.7  -  PAGE IS IN CORE.
9634 ;4.6  -  PAGE IS PUBLIC (ANYONE CAN WRITE IT)
9635
9636 ;3.1 - 3.9  -  # TIMES PAGE SHARED (LIKE CORTYP'S 4TH VALUE'S RH)
9637 ;2.1 - 2.9  -  ABS PAGE # OR PAGE # IN NEXT SHARER
9638 ;               (LIKE CORTYP'S 3RD VALUE)
9639 ;1.1 - 1.9  -  0 => ABS PAGE  (OR NO PAGE, OF COURSE)
9640 ;               -1 => UNSHARED PAGE,
9641 ;               ELSE USR NUM. OF NEXT SHARER.
9642
9643 AUSET5: CAIGE E,100
9644          JRST OPNL11
9645         PUSHJ P,SWTL
9646             CIRPSW      ;DON'T LET PAGE TABLES CHANGE.
9647         MOVEI A,-100(E) ;PAGE NUMBER IN JOB.
9648         PUSH P,J
9649         PUSHJ P,NCORT0  ;PUT CORTYP'S VALUES IN A THRU D.
9650         POP P,J
9651         PUSHJ P,LSWPOP  ;FREE CIRPSW.
9652         ANDI B,777      ;CORTYP'S 2ND VALUE IN 1.1 - 1.9
9653         DPB C,[111100,,B]       ;3RD VALUE IN 2.1 - 2.9
9654         TLO B,(D)       ;4TH VALUE RH INTO 3.1-3.9
9655         LSH D,-20.
9656         TLO B,(D)       ;4TH VAL BITS 4.8-4.9 INTO 4.6-4.7
9657         IOR A,B         ;TOGETHER WITH 1ST VALUE'S 4.8, 4.9.
9658         JRST POPJ1
9659 \f
9660 USTOP:  AOS (P)         ;GOING TO WIN
9661         JUMPN D,1USTOP  ;NONZERO VALUE => STOP THE JOB.
9662         MOVE B,APRC(A)  ;ZERO => START.
9663         TLNE B,BULGOS   ;BUT DON'T EVER START A JOB THAT'S BEING KILLED.
9664          POPJ P,
9665         JRST 1USTRT
9666
9667 1USTOP: MOVNI D,1       ;SET TO STOP
9668 1USTRT: PUSHJ P,RPCLSR  ;STOP USER IN A
9669         DPB D,[.BP BUSRC_22,USTP(A)]    ;BUSRC
9670 IFN SWPWSP,[
9671         EXCH U,A
9672         PUSHJ P,LVLOAD
9673         EXCH U,A
9674 ];SWPWSP
9675         JRST UPCLSR
9676
9677 ;SET INFERIOR'S PC
9678 UPCSET: PUSHJ P,RPCLSR  ;STOP USER IN USER MODE
9679         TLO D,%PCUSR    ;BE SURE USER MODE IS ON IN NEW PC
9680         TLZ D,BADPC     ;BE SURE PRIVILEGED BITS ARE OFF
9681         SKIPGE IOTLSR(A) ;SKIP UNLESS USER IS SUPPOSED TO BE IN IOT-USER MODE
9682          TLO D,%PCUIO   ;TURN ON IOT-USER MODE
9683         MOVEM D,UPC(A)  ;SET PC
9684         PUSHJ P,UPCLSR  ;RESTART
9685         JRST POPJ1
9686
9687 UJPCS:  CAIN U,(A)      ;SET .JPC, WITH CARE IF SETTING OWN
9688          SPM UPGML(U)
9689         HRRM D,UPJPC(A)
9690         CAIN U,(A)
9691          LPMR UPGML(U)
9692         JRST POPJ1
9693
9694 UJPCR:  CAIN U,(A)      ;READ .JPC:
9695          SPM UPGML(U)   ;IF READING ONE'S OWN, MAKE SURE IT'S UP TO DATE.
9696         HRRZ A,UPJPC(A)
9697         JRST POPJ1
9698
9699 IFN KA10P,[
9700 UROPC:  HLLZ A,UPOPC(J)
9701         LSH A,5
9702         HRR A,UPOPC(J)
9703         JRST POPJ1
9704 ] ;KA10P
9705 IFE KA10P, UROPC: JRST OPNL12   ;.OPC NOT SUPPORTED ON KL AND KS  ((CAN'T
9706                                 ; USE == DUE TO FWD REF))
9707
9708 IFN N11TYS,[                    ;SET OWN TV CONSOLE REGISTER
9709 STVCRG: MOVEM D,TVCREG(U)       ;ENABLE TVCREG TO BE SWAPPED IN AND OUT OF HARDWARE
9710         JUMPL D,POPJ1           ;IF TURNING ON; OR, IF TURNING OFF, ALL DONE
9711         SKIPGE TT11P            ;ALLOWED TO TOUCH HARDWARE?
9712          SKIPE TEN11F
9713           CAIA
9714            MOVEM D,400000+TTR10*2000 ;UPDATE REG IN HARDWARE
9715         MOVEM D,TVCREG(U)       ;AND UPDATE AGAIN IN SOFTWARE IN CASE CLOBBERED AT SSTVR2
9716         JRST POPJ1
9717 ]
9718 \f
9719 IFE KS10P,[     ; KS10 doesn't have a MAR and it never will...
9720
9721 ;READ MAR
9722 URMAR:  MOVE A,UPMAR(J)
9723 IFN KA10P,      TLZ A,777770
9724 IFN KL10P,      LDB B,[270400,,A]
9725 IFN KL10P,      HRL A,MARPTB(B)
9726         JRST POPJ1
9727
9728 ;SET MAR
9729 USMAR:  CONO PI,CLKOFF  ;TURN OFF CLOCK INTERRUPTS
9730         CAMN J,USER
9731          SPM UPGML(J)   ;STORE PG VARIABLES IF HACKING CURRENT USER
9732 IFN KA10P,[
9733         TLZ D,777770
9734         TLO D,4         ;SET USER MODE
9735 ] ;KA10P
9736 IFN KL10P,[
9737         LDB B,[220400,,D]
9738         HLL D,MARPTB(B)
9739 ] ;KL10P
9740         MOVEM D,UPMAR(J)
9741         CAMN J,USER
9742          LPMR UPGML(J)  ;USE LPMR BECAUSE KL10 DOESN'T HAVE VANILLA LPM
9743         JRST CLKOJ1
9744
9745 IFN KL10P,[     ;MAR PERMUTATION TABLE.  MAYBE CAN DO BETTER????   *****
9746
9747 MARPTB: 0  1,  0        ;OFF            ;NONE (EXEC)
9748         0 11,  0        ;FETCH          ;NONE (USER)
9749         0  3,  2        ;WRITE          ;WRITE(EXEC)
9750         0 17,  6        ;ANY            ;WRITE (USER)
9751         0  1, 10        ;OFF            ;READ (EXEC)
9752         0 11, 14        ;FETCH          ;READ (USER)
9753         0  3, 12        ;WRITE          ;NOT FETCH (EXEC)
9754         0 17, 16        ;ANY            ;NOT FETCH (USER)
9755         0  5,  1        ;READ           ;FETCH (EXEC)
9756         0 15,  5        ;READ+FETCH     ;FETCH (USER)
9757         0  7, 13        ;NOT FETCH      ;NOT READ (EXEC)
9758         0 13, 17        ;NOT READ       ;NOT READ (USER)
9759         0  5, 11        ;READ           ;READ+FETCH (EXEC)
9760         0 15, 15        ;READ+FETCH     ;READ+FETCH (USER)
9761         0  7,  3        ;NOT FETCH      ;ANY (EXEC)
9762         0 13,  7        ;NOT READ       ;ANY (USER)
9763 ] ;KL10P
9764 ] ;IFE KS10P
9765
9766 IFN KS10P,[
9767 URMAR:
9768 USMAR:  JRST OPNL12
9769 ] ;KS10P
9770 \f
9771 RUSUPP: HRRE A,SUPPRO(J) ;READ SUPERIOR'S USER INDEX
9772         JUMPL A,POPJ1   ;-1 => TOP LEVEL
9773 UINDEX: IDIVI A,LUBLK   ;GET INDEX NUMBER
9774         JRST POPJ1      ;GIVE TO USER
9775
9776 ;READ OWN RUN TIME
9777 UTRNTR: CONO PI,CLKOFF
9778 IFN KA10P,[
9779         SPM UPGML(U)
9780         LDB A,[2300,,UPQUAN(U)]
9781         LSH A,-2        ;SIMULATE 4.069 USEC CLOCK
9782 ] ;KA10P
9783 IFN KL10P,[
9784         SKIPL MTRUSR    ;SKIP IF PERFORMANCE METER AVAILABLE
9785          JRST [ RMBOXC A        ;REQUIRES AC ORDER - A,B,C,D,E
9786                 DSUB A,STMBOX
9787                 DMUL A,KLMBCC   ;BECAUSE DMUL PRODUCES FOUR WORD RESULT
9788                 REBOXC D
9789                 DSUB D,STEBOX
9790                 DADD B,D
9791                 DMUL B,KLEBCC
9792                 MOVE A,D
9793                 JRST UTRNT1 ]
9794         RPERFC A
9795         DSUB A,STPERF
9796         DIVI A,50.*4096.
9797 UTRNT1:
9798 ] ;KL10P
9799 IFN KS10P,[
9800         SPM UPGML(U)
9801         LDB A,[400400,,UPQUAN(U)]       ; 3.9 USEC CLOCK
9802 ] ;KS10P
9803         ADD A,UTRNTM(U)
9804         JRST CLKOJ1
9805
9806 ;SET JOB'S TTYTBL (.TTY VARIABLE).
9807 USTTY:  CONO PI,CLKOFF          ;PREVENT TIMING ERROR.
9808         HLLZ E,TTYTBL(J)        ;GET CURRENT VALUE
9809         XOR E,D                 ;GET WHICH BITS USER WANTS TO CHANGE
9810         AND E,[%TBNVR+%TBINT+%TBWAT+%TBOUT+%TBINF+%TBIIN+%TBOIG,,]      ;GET BITS USER IS ALLOWED TO CHANGE
9811         TRNE I,1
9812          TLZ E,%TBWAT           ;THESE BITS CAN BE ALTERED ONLY BY THE SUPERIOR
9813         XORM E,TTYTBL(J)        ;ALTER THE USER-CONTROLLED BITS WITHOUT WRITING THE OTHERS.
9814         JRST CLKOJ1
9815
9816 ;READ JOB'S TTYTBL (.TTY) VARIABLE
9817 URTTY:  CONO PI,CLKOFF
9818         HRRZ A,TTYTBL(J)
9819         SKIPGE TTYTBL(J)
9820          IDIVI A,LUBLK
9821         HLL A,TTYTBL(J)
9822         JRST CLKOJ1
9823
9824 ;READ JOB'S .CNSL VARIABLE - TTY# OF TREE'S CONSOLE
9825 URCNSL: MOVE A,UTMPTR(J)
9826         SUBI A,USRRCE
9827         CAIL A,NCT
9828          SUBI A,NCT+2           ;DISOWNED -1 SYS -2
9829         JRST POPJ1
9830 \f
9831 UJNAME: JUMPE D,OPNL33  ;SET INFERIOR'S JNAME
9832         CAME D,[SIXBIT/PDP6/]
9833          CAMN D,[SIXBIT/PDP10/]
9834           JRST OPNL33   ;CHANGING TO ILLEGAL NAME
9835         CAIN I,3        ;.SUSET?
9836          JRST UJNAMS    ;YES...
9837         PUSHJ P,RPCLSR
9838         PUSHJ P,UJNAMU  ;IS NEW JNAME UNIQUE?
9839          JRST UJNAMG    ;NO
9840         MOVEM D,JNAME(A)        ;YES
9841         CONO PI,CLKON
9842         PUSHJ P,UPCLSR
9843         JRST POPJ1
9844
9845 UJNAMU: MOVE B,UNAME(A)
9846         MOVEI E,0
9847         CONO PI,CLKOFF
9848 UJNAM1: CAME B,UNAME(E)
9849          JRST UJNAMF
9850         CAMN D,JNAME(E)
9851          POPJ P,
9852 UJNAMF: ADDI E,LUBLK
9853         CAMGE E,USRHI
9854          JRST UJNAM1
9855         JRST POPJ1
9856
9857 UJNAMG: PUSHJ P,UPCLSR
9858         CAME A,E
9859          JRST OPNL13            ;DUPLICATE NAME
9860         JRST CLKOJ1             ;WASN'T REALLY CHANGING THE NAME
9861
9862 UUNAME: HLRE I,D                ;SET OWN UNAME
9863         AOJE I,OPNL33           ;CHECK FOR ILLEGAL ___nnn UNAME
9864         SKIPA I,U
9865 UJNAMS:  SETO I,                ;SET OWN JNAME
9866         JUMPE D,OPNL33          ;CHECK FOR EVIL NAMES
9867         CAME A,U                ;SELF?
9868          BUG                    ;SOMETHING SCREWED
9869         SKIPL SUPPRO(U)
9870          JRST OPNL40            ;MUST BE TOP LEVEL
9871         CONO PI,CLKOFF          ;TURN CLOCK OFF NOW SO WE DON'T GET REOWNED OR SOMETHING
9872         SKIPL I
9873          SKIPA C,JNAME(U)       ;CHANGING UNAME, KEEPING JNAME
9874           SKIPA C,UNAME(U)      ;VICE VERSA
9875            EXCH D,C             ;NOW C=UNAME, D=JNAME
9876         MOVEI E,0               ;CHECK FOR DUPLICATE NAMES
9877 UUNAM0: SKIPE UNAME(E)
9878          CAMN E,U               ;ALLOW SETTING TO SAME NAME AS BEFORE
9879           JRST UUNAM1
9880         HRRZ A,SUPPRO(E)
9881         CAMN C,UNAME(E)
9882         CAME D,JNAME(E)
9883          CAMN A,I               ;JOB CAN'T HAVE INFERIORS IF SETTING UNAME
9884           JRST OPNL13           ;OR DUPLICATE U-JNAME IF SETTING EITHER
9885 UUNAM1: ADDI E,LUBLK
9886         CAMGE E,USRHI
9887          JRST UUNAM0
9888         CAMN C,UNAME(U)
9889          CAME D,JNAME(U)
9890           SKIPA A,D             ;D GETS CLOBBERED
9891            JRST CLKOJ1          ;THE NAMES WEREN'T ACTUALLY CHANGED! (SYNCOM DOES IT).
9892         CAME C,UNAME(U)         ;IF NOT LOGGED IN, AND CHANGING UNAME,
9893          SKIPGE TTYTBL(U)       ; AND CONSOLE-CONTROLLED,
9894            JRST UUNAM3
9895         HLLO J,UNAME(U)
9896         AOJN J,UUNAM2
9897           AOS SUSRS             ;DISGUST! SHOULD BE USING LOGIN
9898 UUNAM2: HRRZ T,TTYTBL(U)
9899         HRLI T,[ASCIZ / CHUNAM /]
9900         PUSHJ P,SGWAIT          ;REQUEST SYSTEM JOB TO PRINT OUR MSG
9901         MOVEM C,SLGIV+2         ;INCLUDE NEW UNAME AS SECOND NAME
9902 UUNAM3: PUSHJ P,LOGUPD          ;CHARGE OLD NAME FOR USAGE SO FAR
9903         MOVEM C,UNAME(U)        ;THEN SWITCH NAMES
9904         MOVEM A,JNAME(U)
9905         PUSHJ P,DMNPLI          ;LOG BACK IN UNDER NEW NAMES
9906         JRST CLKOJ1
9907
9908 ;WAIT FOR SLGIV VARIABLES TO BECOME FREE, AND REQUEST THE
9909 ;SYSTEM JOB TO PROCESS THEM.  TAKES STRING,,TTY IN T, AND
9910 ;PLACES UNAME(U) IN SLGIV, AND T INTO SLGIV+1.  THE CALLER
9911 ;IS RESPONSIBLE FOR FILLING IN SLGIV+2
9912
9913 SGWAIT: PUSH P,T
9914         MOVSI T,SCLLGI          ;SOMEBODY ELSE IS USING THOSE VARIABLES
9915         PUSHJ P,CWAIT           ;WAIT FOR THE SYSTEM JOB TO FINISH WITH
9916           TDNE T,SUPCOR         ;THEM.
9917         IORM T,SUPCOR           ;REQUEST THE SYSTEM JOB TO PRINT OUR MSG
9918         POP P,SLGIV+1           ;STRING,,TTY #
9919         MOVE T,UNAME(U)         ;STORE AWAY THE UNAME
9920         MOVEM T,SLGIV
9921         POPJ P,
9922
9923 RUTRAP: LDB A,[430100,,UTRAPM(J)]       ;GET SPECIAL TRAP MODE INDICATOR
9924         JRST POPJ1
9925
9926 SUTRAP: DPB D,[430100,,UTRAPM(J)]       ;SET    "     "    "       "
9927         JRST POPJ1
9928
9929 IFN KA10P,[
9930 URTR1I: SKIPA A,[0,,%PIARO]     ;READ "TRAP 1 INSTRUCTION" FOR KA-10
9931 URTR2I:  MOVEI A,%PIPDL         ;TRAP 2
9932         JRST POPJ1
9933 ] ;KA10P
9934 \f
9935 ;SET MEMORY BOUND
9936 USMEMT: CAMN U,A
9937          JRST USMEM2
9938         PUSHJ P,RPCLSR
9939         MOVSI B,BSSTP
9940         IORM B,USTP(A)
9941         PUSHJ P,UPCLSR
9942 USMEM2: ADDI D,1777
9943         LSH D,-10.
9944         MOVE B,D
9945         MOVEM A,SRN5(U) ;ARGUMENT TO NCORFS
9946         PUSHJ P,LOSSET
9947             NCORFS      ;CLEARS BSSTP IN USTP(A).
9948         EXCH U,A
9949         PUSHJ P,ACORE
9950          JRST OPNL33    ;LOST
9951         EXCH U,A
9952         JRST LSWPJ1
9953
9954 ;SET SYSTEM NAME (ZERO IGNORED)
9955 USYNST: SKIPE D
9956          MOVEM D,USYSNM(J)
9957         JRST POPJ1
9958
9959 ;SET INFERIOR'S INTERRUPT MASK
9960 USMASK: SKIPA E,[2]     ;MOVEM
9961 IAMASK:  ANDI E,1       ;ANDCAM OR IORM
9962         ANDCM D,[VBDBTS] ;BITS FOR CLASS 1 INTS CAN'T BE CHANGED.
9963         XCT (E)[ IORB D,MSKST(A)
9964                  ANDCAB D,MSKST(A)
9965                  MOVEM D,MSKST(A)]
9966 IFN KA10P,[
9967         MOVEI B,440+APRCHN ;NOW UPDATE JOB'S APRC VARIABLE.
9968         TRNE D,%PIARO
9969          TRC B,60
9970         TLNE D,(%PIFOV)
9971          TRC B,600
9972         HRRM B,APRC(A)
9973         TRNE I,1
9974          CONO @APRC(A)
9975 ] ;KA10P
9976 IFE KA10P, PUSHJ P,TRINST
9977         JRST UPISE1
9978
9979 IFE KA10P,[
9980 ;SET THE AROV AND PDLOV TRAP INSNS ACCORDING TO WHETHER THE
9981 ;INTERRUPTS ARE ENABLED; BUT DON'T OVERRIDE AN EXPLICIT SPECIFICATION
9982 ;BY THE USER, WHICH IS ANYTHING OTHER THAN 0 OR (CAI) IN THE LH.
9983
9984 TRINST: MOVE D,MSKST(A)
9985         MOVSI B,(CAI)           ;CAI IS FASTER THAN JFCL - NO AC DECODE
9986         TDNE D,[%PIFOV+%PIARO]  ;AND OVERFLOW GOES OFF A LOT
9987          MOVEI B,%PIARO
9988         HLRZ C,TR1INS(A)
9989         SKIPE C
9990          CAIN C,(CAI)
9991            MOVEM B,TR1INS(A)
9992 ;       MOVSI B,(CAI)           ;THESE LINES COMMENTED OUT TO MAKE 
9993 ;       TRNE D,%PIPDL           ; PDL OVERFLOW CLASS 2 INSTEAD OF CLASS 3
9994          MOVEI B,%PIPDL
9995         HLRZ C,TR2INS(A)
9996         SKIPE C
9997          CAIN C,(CAI)
9998           MOVEM B,TR2INS(A)
9999         POPJ P,
10000 ] ;IFE KA10P
10001 \f
10002 ;SET INFERIOR'S PI IN PROGRESS FLAG
10003 UPISET: ASH D,-35.      ;SHIFT SIGN BIT TO BOTTOM BIT
10004         MOVEM D,PICLR(A)        ;SET VARIABLE
10005 ;COME HERE WHEN ANY INTERRUPT VARIABLE'S VALUE IS CHANGED
10006 ;BY A .USET OR .SUSET; TAKE ANY INTS THAT ARE NOW PENDING.
10007 UPISE1: HRRZ A,J        ;IAMASK, ETC. MODIFY A. RESTORE IT.
10008         AOS (P)         ;GOING TO WIN
10009         TRNN I,1        ;SKIP IF A SUSET
10010          JRST APISE6
10011         JRST APISE1     ;SEE IF SHOULD REINTERRUPT
10012
10013 IAMSK2: ADDI A,MSKST2-IDF1
10014 IADF1:  ADDI A,IDF1-IDF2
10015 IADF2:  ADDI A,IDF2-PIRQC       ;IORM OR ANDCAM INTO IDF2.
10016 IAPIRQ: ADDI A,PIRQC-IFPIR
10017 IAIFPI: ANDI E,1        ;GET USET PARITY (0=IORM, 1=ANDCAM)
10018         XCT IAINS(E)    ;DO APPRO OP
10019         JRST UPISE1
10020
10021 IAINS:  IORB D,IFPIR(A) ;SET BITS
10022         ANDCAB D,IFPIR(A)       ;FLUSH BITS
10023
10024 USMSK2: ADDI A,MSKST2-IDF1      ;SET .MSK2, ETC.
10025 USDF1:  ADDI A,IDF1-IDF2
10026 USDF2:  ADDI A,IDF2-PIRQC
10027 USPIRQ: ADDI A,PIRQC-IFPIR
10028 USIFPI: MOVEM D,IFPIR(A)
10029         JRST UPISE1
10030
10031 ;.RBCHN, .SBCHN  READ/SET NUMBER OF LAST CHANNEL ON WHICH ERROR OCCURRED
10032 RUBCHN: LDB A,[BCHPTR#(A#U)]
10033         JRST POPJ1
10034
10035 SUBCHN: DPB D,[BCHPTR#(A#U)]
10036         JRST POPJ1
10037
10038 ;GET INT BIT
10039 UGSUPR: HLLZ A,SUPPRO(J)
10040         JRST POPJ1
10041
10042 ;SAVE AWAY MA (HIGH BITS) ON LAST MPV OR WIRO
10043 ;CALLED FROM CLKBRK, DONT CLOBBER A OR D
10044
10045 MPVMAS:
10046 IFN KA10P,[
10047         HLRZ T,UPJPC(U)
10048         LSH T,10.               ;HIGH BITS ONLY ON KA
10049 ] ;KA10P
10050 IFE KA10P, HRRZ T,UPFW(U)
10051         HRRM T,IOTLSR(U)
10052         POPJ P,
10053
10054 ;.RMPVA READ VIRTURAL PAGE # (8 BITS) OF LAST MPV OR WIRO
10055
10056 MPVARD: HRRZ A,IOTLSR(J)
10057         JRST POPJ1
10058
10059 ;.RSERVER  Read server user number, or -1 if none.
10060 URSERV: SKIPL A,SERVER(J)
10061          IDIVI A,LUBLK
10062         JRST POPJ1
10063
10064 ;.SSERVER  Set server user number, or clear if negative.
10065 ; (To prevent timing screws, you should really use the SSERVE call to set
10066 ; this variable, but for debugging convenience...)
10067 USSERV: IMULI D,LUBLK
10068         SKIPGE D
10069          SETOI D,
10070         MOVEM D,SERVER(J)
10071         JRST POPJ1
10072 \f
10073 SUBTTL USER INSTRUCTION HANG ROUTINE (.HANG)
10074
10075 ; .HANG was rewritten by Alan Feb 87:
10076
10077 ; The general theory is that .HANG should behave -exactly- like JRST .-1 as
10078 ; much as possible.  Thus, it is considered to make sense to put any
10079 ; skipping or jumping instruction before a .HANG.  We are always careful to
10080 ; return from the .HANG by jumping to the previous instruction, so any side
10081 ; effects (such as clearing bits or incrementing accumulators or memory) are
10082 ; always performed, and jumps will be correctly taken.
10083 ;
10084 ; There are two ways to leave a .HANG, either the job can get PCLSR'ed, or
10085 ; the awaited condition can become true.  We arrange for -both- cases to
10086 ; return the job to the previous instruction by SOSing UUOH -once- before
10087 ; calling UFLS, and once more if UFLS returns.
10088
10089 ; As an additional feature, .HANG with a non-zero accumulator behaves like
10090 ; the disjunction of ordinary .HANG and .SLEEP, allowing the user to do a
10091 ; timeout.  The accumulator should initially contain an argument, as for
10092 ; .SLEEP, that indicates when .HANG should timeout.  In that case only,
10093 ; .HANG returns to the following instruction and the designated accumulator
10094 ; will contain zero.  If such a .HANG is interrupted, or if it returns
10095 ; because the awaited condition is now true, that accumulator will contain
10096 ; the correct negative number indicating the absolute time it would have
10097 ; timed out.
10098 ;
10099 ; Accepted instructions are:
10100 ; Any CAI, CAM, JUMP, SKIP, AOJ, AOS, SOJ, or SOS class instruction.
10101 ; Any test instruction.
10102 ; JFFO.
10103 ; JFCL with 0 in the AC field.
10104 ; Or an XCT that eventually fetches one of the above.
10105
10106 ; As special cases SKIPA 0, and CAIA 0, are taken to request a schedule,
10107 ; and JFCL 0, and SKIP 0, set %SWDSO.
10108
10109 ; As before, it is a limitation that changes to memory referenced by .HANG
10110 ; when computing effective addresses and fetching XCT'ed instructions will
10111 ; not cause the job to wake up.  But how could it be otherwise?  Changes to
10112 ; the accumulators will of course cause the job to be PCLSR'ed.
10113
10114 AHANG:  MOVE R,UUOH
10115         UMOVE R,-2(R)           ; Get user's flush instruction
10116         HRLOI A,377777          ; A: most positive fixnum
10117         JUMPE J,AHANG2          ; No AC => timeout when hell freezes over
10118         XCTR XR,[MOVN A,(J)]    ; A: argument as for .SLEEP
10119         JUMPG A,AHANG2          ; 'twas already neg., so wait 'til then
10120         SUB A,TIME              ; else compute time
10121         UMOVEM A,(J)            ; store back negative for PCLSRing
10122         MOVN A,A                ; A: time to wait for
10123 AHANG2: PUSHJ P,ASCIND          ; Compute E for instruction
10124         HLRZ C,R                ; C: Opcode and AC
10125         CAIE C,(JFCL)
10126          CAIN C,(SKIP)
10127           JRST AHANGI           ; User might be waiting for a while
10128         CAIE C,(SKIPA)
10129          CAIN C,(CAIA)
10130           JRST AHANGF           ; User is just trying to cause a schedule
10131         LSH C,-9                ; C: 9-bit opcode
10132         CAIN C,XCT_-33
10133          JRST AHANG1            ; XCT - Go loop
10134         CAIN C,JFFO_-33
10135          JRST AHANGO            ; JFFO is like JUMPN
10136         LSH C,-6                ; C: First 3 bits of opcode
10137         CAIN C,CAI_-41
10138          JRST AHANGC            ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS
10139         CAIN C,TRN_-41
10140          JRST AHANGT            ; Txxx
10141 IFN KS10P, JRST ILUUO
10142 IFE KS10P,[
10143 ;CODE TO ALLOW CONSO, CONSZ AS .HANG INSTRUCTIONS
10144         HLRZ C,R                ;CHECK FOR CONSO, CONSZ
10145         TRZ C,077477
10146         LDB B,[320700,,R]       ;GET DEVICE CODE/4
10147         SKIPGE T,DCHNTB(B)
10148          TRNE T,40000
10149           CAIE C,(CONSZ\CONSO)
10150            JRST ILUUO           ;UNRECOGNIZED INSTRUCTION, OR USER CONI NOT
10151                                 ; ALLOWED
10152         MOVEM R,EPDL(U)
10153         MOVE T,A
10154         SOS UUOH
10155         PUSHJ P,AHANG9
10156          PUSHJ P,UFLS
10157         JRST AHANGX
10158
10159 AHANG9: XCT EPDL(U)
10160          CAMGE T,TIME
10161           AOS (P)
10162            POPJ P,
10163
10164 ] ;IFE KS10P
10165
10166 ; XCT ? .HANG
10167 AHANG1: PUSHJ P,OPBRK           ; Don't let "XCT ." hang you up
10168         UMOVE R,(R)             ; Get new instruction
10169         JRST AHANG2             ; And start over
10170
10171 ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS ? .HANG
10172 AHANGC: TLNN R,040000
10173          JRST AHANG3            ; CAI, CAM, JUMP, SKIP
10174         TLNN R,010000
10175          JRST AHANGJ            ; AOJ, SOJ
10176         TLNN R,020000
10177          SKIPA T,[-1]           ; AOS: Compare with -1
10178           MOVEI T,1             ; SOS: Compare with 1
10179         TLZ R,770777            ; Clear all but last 3 bits of opcode
10180         TLO R,(CAM T,)          ; Build a CAM instruction
10181         TLNE R,001000           ; With the opposite sense
10182          TLC R,006000
10183         JRST AHANGM
10184
10185 AHANG3: TLNN R,020000
10186          JRST AHANG4            ; CAI, CAM
10187         TLNN R,010000
10188          JRST AHANGJ            ; JUMP
10189         TLZ R,(0 17,)           ; SKIP
10190         JRST AHANGM
10191
10192 ; JFFO ? .HANG
10193 AHANGO: TLC R,(JFFO#JUMPN)
10194 AHANGJ: HRRI R,AHANGX
10195         JRST AHANGA
10196
10197 ; SKIPA ? .HANG -- just flush once (ignores timeout)
10198 AHANGF: SOSA UUOH
10199          SKIPA
10200           PUSHJ P,UFLS
10201         JRST AHANGX
10202
10203 ; JFCL ? .HANG -- hang infinitely (or until timeout)
10204 AHANGI: MOVE B,TIME
10205         ADDI B,60.*30.          ; If sleeping for more than a minute
10206         MOVSI C,%SWDSO          ; Desire swap out
10207         CAML A,B                ; (just like .SLEEP)
10208          IORM C,USWST(U)
10209         SOS UUOH
10210 AHANG5: MOVE T,A
10211         CAML T,TIME
10212          PUSHJ P,UFLS
10213         JRST AHANGX
10214
10215 ; Txxx ? .HANG
10216 AHANGT: TLZ R,060000            ; Make opcode be TRN or TDN series
10217         TLNE R,010000           ; If TRN, only AC matters
10218          JRST AHANGB            ; TDN: Both AC and memory matter
10219 ; Wait for something that only references the user's accumulators.
10220 ; (Instruction in R might be some kind of jump to AHANGX.)
10221 AHANGA: PUSHJ P,AHANGG          ; Get contents of user's AC into T
10222         SOS UUOH
10223         XCT R                   ; Must try it once to prevent timing screw
10224          JRST AHANG5            ; OK, wait forever for PCLSR
10225         JRST AHANGX
10226
10227 AHANG4: TLNN R,010000           ; If CAM, both AC and memory matter
10228          JRST AHANGA            ; CAI: Only AC matters
10229 ; Wait for something that references memory.
10230 ; (Instruction in R better not be a jump!)
10231 AHANGB: PUSHJ P,AHANGG          ; Get contents of user's AC into T
10232 AHANGM: MOVEM R,EPDL(U)
10233         SOS UUOH
10234         TRNE R,-20              ; Memory reference really only AC?
10235          JRST AHANG6            ; No, real memory, go wait
10236         XCTR XRW,R              ; Must try it once to prevent timing screw
10237          JRST AHANG5            ; OK, wait forever for PCLSR
10238         JRST AHANGX
10239
10240         PUSHJ P,UHANG
10241 AHANG6:  PUSHJ P,UFLS
10242 AHANGX: ;; Everyone exits here after SOSing UUOH once (before hanging).
10243         ;; Thus we always exit to the previous instruction (just like being
10244         ;; PCLSRed), unless we timeout instead.
10245         CAMGE A,TIME            ; Timeout?
10246          JRST AHANGY            ; Yes
10247         SOS UUOH
10248         POPJ P,
10249
10250 AHANGY: XCTR XW,[SETZM (J)]     ; Let user know we timed out
10251         AOS UUOH                ; And fall through instead of backing out
10252         POPJ P,
10253
10254 ;.HANG flush instruction routine, called with PUSHJ only on clock level
10255 UHANG:
10256 IFE KS10P,[
10257         MOVEI TT,0              ; Save MAR word
10258         EXCH TT,UPMAR(U)        ; so will not MAR
10259         LPMR UPGML(U)
10260         MOVEM TT,UPMAR(U)       ; Restore MAR
10261 ] ;IFE KS10P
10262 IFN KS10P, LPMR UPGML(U)
10263         MOVE TT,AC0S+A(U)
10264         XCTRI XRW,EPDL(U)
10265          CAMGE TT,TIME
10266           AOS (P)               ; Might be because location swapped out or
10267            POPJ P,              ; missing, but that's OK because we always
10268                                 ; exit to the previous instruction!
10269
10270 ; Kind of like ASCIND for the accumulators...
10271 AHANGG: LDB T,[270400,,R]
10272         UMOVE T,(T)             ; Get contents of AC from user
10273         TLZ R,(0 17,)           ; Clear out AC field in instruction
10274         TLO R,(0 T,)            ; Replace AC field with T
10275         POPJ P,
10276
10277 ; Allow interrupt if being PCLSRed
10278 OPBRK:  PUSH P,T
10279         MOVE T,UEXIT
10280         CAMN T,[JRST ONEFLS]
10281          PUSHJ P,UDELAY
10282         POP P,T
10283         POPJ P,
10284 \f
10285 SUBTTL .OPEN AND FRIENDS
10286
10287 ;
10288 ;.FDELE FILBLK  ;DELETE OR RENAME FILE SPECIFIED AT FILBLK
10289 ;
10290 AFDELE: SETZM UUAC(U)
10291         UMOVE A,(C)             ;GET DEVICE
10292         MOVEI W,4
10293         DPB W,[OPNCOM,,A]       ;SET OP TO SPECIFY AN .FDELE
10294         JRST AFDEL1
10295 ;
10296 ;OPEN SET UP AND DISPATCH
10297 ;3.1=0 => INPUT  =1 OUTPUT
10298 ;3.2=0  => UNITS   =1  BLOCK
10299 ;3.3=0  => ASCII   =1 IMAGE
10300 ;4.9-4.7 OPERATION FIELD
10301 ;   0=> NORMAL READ OR WRITE
10302 ;   1=> WRITE OVER MODE
10303 ;   2=> MAKE LINK
10304 ;   4=> DELETE OR RENAME (INTERNAL)
10305 ;
10306 ;.OPEN CH,FILBLK        ;OPEN FILE SPECIFIED AT FILBLK ON LOGICAL CHANNEL CH
10307 ;
10308 AOPEN:          ;C HAS EFF ADR OF UUO AND R ITS AC FIELD
10309         ADDI R,IOCHNM(U)        ;MAKE R POINT TO SPECIFIED I/O CHANNEL WORD
10310         PUSH P,C
10311         PUSHJ P,ACLOSE  ;CLOSE PREV
10312         POP P,C
10313         UMOVE A,(C)     ;GET DEV AND MODE BITS
10314         LDB W,[OPNCOM,,A]
10315         CAIN W,4
10316          JRST OPNL23    ;BARF IF TRY TO DELETE WITH .OPEN
10317 AFDEL1: MOVEI TT,SRN3(U)        ;MOVE 4TH-6HT ARGS
10318         HRLI TT,3(C)            ;TO SRN3 THRU SRN5
10319         MOVEI Q,3(TT)
10320         XCTR XBR,[BLT TT,-1(Q)]
10321         UMOVE B,1(C)    ;GET 2ND, 3RG ARGS (FILENAMES)
10322         UMOVE C,2(C)
10323         MOVE D,USYSNM(U)        ;USE DEFAULT SNAME.
10324         HLRZ E,A                ;GET MODE BITS.
10325         HRLZI A,(A)     ;LEFT-JUSTIFY DEVICE NAME.
10326         SETZM EPDL(U)
10327         SETZM EPDL3(U)
10328 NOPNE:  CAIN W,4        ;SKIP ON NOT .FDELE (ENTRY FOR NCALL TYPE OPEN, ETC COMMANDS)
10329          SKIPN SRN3(U)  ;SKIP ON RENAME
10330           JRST AOPEN3   ;JUMP IF A .OPEN OR DELETING .FDELE
10331         JUMPN B,AOPEN3  ;JUMP UNLESS RENAME WHILE OPEN.
10332         MOVE TT,C       ;GET CH ON WHICH FILE IS SUPPOSIDLY OPEN
10333         TDNE TT,[-NIOCHN]       ;SKIP IF CH LOGICALLY LESS THAN 20
10334          JRST OPNL14    ;BAD CHANNEL NUM
10335         ADDI TT,IOCHNM(U)       ;RELOCATE TO POINT TO CH WORD FOR USER
10336         MOVE Q,(TT)     ;GET CH WORD
10337         JUMPE Q,OPNL44  ;CHNL NOT OPEN
10338         HLRZ Q,CLSTB(Q) ;GET LEFT HALF OF CLOSE TABLE ENTRY FOR INDEX IN I/O CH WORD
10339         TRNE Q,%CLSJI\%CLSJO
10340          JRST JFDEL4            ;JOB DEVICE CHNL
10341         TRNN Q,%CLSDO\%CLSQ     ;SKIP IF A DIRECTORY DEVICE
10342          JRST POPJ1     ;JUMP IF NOT DIRECTORY DEVICE
10343         HLRZ J,(TT)     ;PICK UP DEV CHNL NO
10344         EXCH A,B        ;PUT FN1, FN2 IN A, B.
10345         EXCH B,C
10346 IFN NUNITS,[
10347         TRNN Q,%CLSDO   ;SKIP IF DEC TAPE
10348          JRST NOPNE1
10349         MOVSI C,'UT0    ;GET DUMMY UT DEV NAME.
10350         HRRZ I,UTTNO(J) ;GET POSSIBLE (?) TAPE NUM
10351         TLO C,(I)       ;STORE IN DEV NAME
10352         MOVE TT,DVAUT   ;WILL EXIT TO UTAPE OPEN RTN.
10353         JRST OPEN2B
10354 NOPNE1:
10355 ]
10356         MOVSI C,'DSK    ;NOT UT, MUST BE DSK.
10357         MOVE TT,DVAQSK  ;NOBODY ELSE HANDLES RENAME WHILE OPEN.
10358         JRST OPEN2B
10359 \f
10360 AOPEN3: PUSHJ P,TRAN    ;PERFORM I/O TRANSLATIONS
10361          JRST OPNL3     ;TOO MANY TRANSLATIONS.
10362         MOVEM D,USYSN1(U);SAVE TRAN'D SNAME FOR OPEN RTN.
10363         PUSH P,A        ;PUT NAMES ON STACK.
10364         PUSH P,B
10365         PUSH P,C
10366         MOVSI B,-NDEVS  ;LOAD LENGTH OF FIRST DEV NAME TABLE
10367         CAME A,DEVTAB(B);SEARCH FIRST DEV NAME TABLE
10368          AOBJN B,.-1    ;LOOP TILL FOUND OR COUNTED OUT
10369         JUMPG B,OPEN1   ;JUMP IF NOT FOUND
10370 OPEN2:  MOVE TT,DEVADR(B) ;LOAD BITS,,OPEN-ROUTINE-ADDRESS
10371 OPEN21: POP P,B         ;UNSAVE SECOND FILE NAME
10372         POP P,A         ;UNSAVE FIRST FILE NAME
10373         POP P,C         ;UNSAVE DEVICE NAME
10374         CAIN W,4
10375          JRST [ TLNN TT,%DVDEL
10376                  JRST OPNL34    ;DEVICE DOES NOT ALLOW DELETE
10377                 JRST OPEN2B ]
10378         CAIN W,2
10379          JRST [ TLNN TT,%DVLNK
10380                  JRST OPNL34    ;DEVICE DOES NOT ALLOW LINK
10381                 JRST OPEN2B ]
10382 OPEN2B: HRRZ D,E        ;MODE BITS
10383         EXCH E,C        ;SAVE DEVICE IN E
10384         HLL C,E         ;SET UP OLD-STYLE C: MODE,,DEV
10385         MOVSS C
10386 ;
10387 ;AT THIS POINT: A & B HAVE FILE NAMES, C HAS MAPPED DEV AND MODE BITS, D HAS MODE BITS,
10388 ;W HAS OPEN COMMAND, E HAS DEVICE NAME, TT HAS DEVADR WORD (BITS,,ROUTINE)
10389 ;
10390         ROT D,-1        ;ROTATE IN/OUT BIT TO SIGN
10391         CAIN W,4        ;SKIP IF NOT A .FDELE
10392          TDZ D,[400000,,7]      ;A .FDELE, MAKE LOOK LIKE OPEN FOR READ
10393         PUSHJ P,FLDRCK
10394          JRST OPEN2D    ;NORMAL OPEN
10395         JUMPL D,OPNL2   ;WRITING DIRECTORY?
10396         JUMPN W,OPNL12  ;DELETING, RENAMING, LINKING, WRITING OVER DIRECTORY?
10397         TLNE TT,%DVDIR
10398          JRST (TT)      ;OPEN DEVICE FOR DIRECTORY
10399 ;ASKING FOR DIR OF DEVICE SYSTEM DOESN'T HAVE DIR ROUTINE FOR.
10400 ;PASS IT OFF TO THE UNKNOWN-DEVICE HANDLER.
10401         PUSH P,E        ;PUSH DEVICE NAME
10402         PUSH P,A        ;PUSH FN1
10403         PUSH P,B        ;PUSH FN2
10404         HLRZ E,C        ;GET MODE BITS
10405         JRST OPEN22     ;PASS TO UNKNOWN DEVICE JOB
10406
10407 OPEN2D: TLNE TT,%DVIN
10408          JUMPGE D,(TT)  ;OPENING FOR INPUT AND DEVICE CAN DO INPUT
10409         TLNE TT,%DVOUT
10410          JUMPL D,(TT)   ;OPENING FOR OUTPUT AND DEVICE CAN DO OUTPUT
10411         JRST OPNL2      ;DEVICE DOESN'T GO THAT DIRECTION
10412 \f
10413 ;CHECK FOR NUMBERED DEV
10414 OPEN1:  MOVE B,[-NDV1,,DVT1-DEVTAB]     ;LOAD AOBJN POINTER WITH COUNT FOR 2ND DEV TABLE
10415 OPEN1A: MOVEI I,0               ;INITIALIZE NUMBERED DEV NUM TO ZERO
10416         MOVE D,[440600,,-2(P)]  ;GET BYTE POINTER INTO DEV REQUESTED
10417         MOVE C,[440600,,DEVTAB(B)]      ;GET BYTE POINTER INTO CURRENT TABLE ENTRY
10418 OPENA1: ILDB A,C        ;GET CHAR FROM TABLE
10419         ILDB J,D        ;GET CHAR FROM DEV
10420         JUMPE A,OPEN1B  ;JUMP ON SPACE IN TABLE, "MATCHES" DIGIT IN DEV
10421         CAIN A,(J)      ;SKIP IF CHAR DIFFER
10422          JRST OPEN1C    ;SAME, TRY FOR NEXT CHAR
10423 OPENZ1: AOBJN B,OPEN1A  ;LOOP TO NEXT TABLE ENTRY OR COUNT OUT
10424 ;CHECK FOR NAMED SECONDARY PACK
10425 ;FIND THE ONE WITH THIS NAME AND THE BIGGEST QSFT.
10426 ;ASSUME THAT BY THE TIME WE GET HERE TUTS HAVE BEEN READ IN AND SO FORTH
10427         SKIPE A,-2(P)   ;GET DEVICE NAME AGAIN
10428          CAMN A,[-1]    ;0 OR -1 ARE NOT LEGAL PACK NAMES
10429           JRST OPEN22
10430         MOVEI C,NQS-1   ;SEARCH NAMES OF SECONDARY PACKS
10431         SETOB TT,I      ;I BEST DRIVE SO FAR, TT BEST QSFT SO FAR
10432 OPENZ2: CAMN A,QRESRV(C)
10433          JRST [ CAML TT,QSFT(C)
10434                  JRST .+1
10435                 MOVE TT,QSFT(C)
10436                 MOVE I,C
10437                 JRST .+1 ]
10438         SOJGE C,OPENZ2
10439         MOVE TT,[%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,,QSKOB]
10440         JUMPGE I,OPEN21
10441 ;
10442 ;"UNKNOWN DEVICE" HANDLER.  FOO DEVICE IS LOADED BY
10443 ;SYS;ATSIGN DEVICE FROM FILE DEVICE;JOBDEV FOO
10444 ;
10445 OPEN22: POP P,EPDLT2(U) ;WHEN WE USE SYS:ATSIGN DEVICE AS A JOB DEVICE,
10446         POP P,EPDLT1(U) ;SET UP THE "NAMES BEFORE LAST TRANSLATION" TO BE
10447         POP P,EPDLT4(U) ;THE NAMES BEING USED, INCLUDING "FOO" AS THE DEVICE.
10448         MOVE A,USYSN1(U)
10449         MOVEM A,EPDLT3(U)
10450         MOVSI C,'JOB
10451         MOVE TT,DVAJOB  ;DEVADR ENTRY FOR JOB:
10452         MOVSI A,'SYS
10453         MOVEM A,USYSN1(U)
10454         MOVE A,['ATSIGN]        
10455         MOVE B,['DEVICE]
10456         JRST OPEN2B
10457
10458 OPEN1B: JUMPE J,OPEN1C  ;JUMP IF DEV ARG EXHAUSTED
10459         SUBI J,'0       ;CONVERT SIXBIT DIGIT TO NUMBER
10460         JUMPL J,OPENZ1  ;JUMP IF TOO SMALL, NOT A DIGIT
10461         CAILE J,9       ;SKIP IF LESS THAN 10.
10462          JRST OPENZ1    ;LOSE, TRY NEXT
10463         ASH I,3         ;MULTIPLY NUM SO FAR BY 8
10464         ADD I,J         ;ADD NEW DIGIT
10465 OPEN1C: TLNE C,770000   ;SKIP IF ALL SIX CHAR POSITIONS COMPARED
10466          JRST OPENA1    ;GO TO NEXT POSITION
10467         JRST OPEN2
10468 \f
10469 NSOPEN: HRRZ R,A        ;Args: 1 mode (LH) chnl (RH), 2 BP or aobjn -> block of BPs.
10470         CAIL R,NIOCHN
10471          JRST OPNL14
10472         ADDI R,IOCHNM(U)
10473         PUSH P,A        ;Save channel number.
10474         PUSH P,B        ;Save BP or BP block ptr.
10475         PUSHJ P,CCLOSE
10476         POP P,R         ;Get back the BP or aobjn pointer.
10477         MOVEM R,EPDL(U) ;Save where job device can get it.
10478         PUSHJ P,FNPRS   ;Parse into DEV, FN1, FN2, SNM in A, B, C, D.
10479         MOVEM D,SRN3(U) ;Make symbolic open of network win using 5th arg as foreign host.
10480         POP P,R         ;Pop back channel number argument.
10481         MOVE E,CTLBTS(U)
10482         TSC E,E
10483         TRZ E,-1
10484         XOR R,E
10485         LDB E,[OPNCOM,,R]
10486         CAIE E,2
10487          CAIN E,4
10488           JRST OPNL12   ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10489         HLRZ E,R
10490         JRST NDEL1
10491
10492 ;Given in R a BP into user memory, or an aobjn -> of BPs block in user memory,
10493 ;parse filenames into A, B, C, D.  Clobbers Q, T, R, H, I.
10494 FNPRS:  SETZ Q,         ;Guess that it is a BP, not a block of them.
10495         SETZ A,         ;Clear out the old-fashioned filename words.
10496         SETZ B,
10497         SETZ C,
10498         SETZ D,
10499         SETCM T,R       ;Is our "BP" realy an aobjn pointer to fewer than 64 things?
10500         TLNE R,-1       ;If LH is 0, treat as BP and replace with 440700 later.
10501         TLNE T,777700
10502          JRST FNPRS8
10503         MOVE Q,R        ;Put the aobjn pointer in Q and get the first BP in R.
10504         UMOVE R,(Q)
10505 FNPRS8: PUSHJ P,ASCIND
10506 FNPRS7: PUSHJ P,FNPRS4          ; Read a sixbit word
10507         JUMPL I,FNPRS9          ; Nothing there at all!
10508         CAIN H,";               ; Directory?
10509          JRST FNPRS0            ;  Go do special hack
10510         MOVEI I,B               ; assume FN1
10511         SKIPE B                 ; unless we already have a FN1
10512          MOVEI I,C              ; in which case assume FN2
10513         CAIN H,":
10514          MOVEI I,A              ; unless it was a device
10515         SKIPN (I)       ;Put it there, unless already something there.
10516          MOVEM T,(I)
10517         JUMPN H,FNPRS7  ;H=0 means end of last arg string.
10518 FNPRS9: ;; Supply default values for all components except FN1.
10519         SKIPN A
10520          MOVSI A,(SIXBIT /DSK/)
10521         SKIPN D
10522          MOVE D,USYSNM(U)
10523         SKIPN C
10524          MOVSI C,(SIXBIT />/)
10525         POPJ P,
10526
10527 FNPRS0: SKIPN I,D
10528          JRST FNPRS2
10529         LSH T,-6
10530         TLO T,(SIXBIT /./)
10531 FNPRS1: LSH T,-6
10532         LSH I,6
10533         JUMPN I,FNPRS1
10534 FNPRS2: IOR D,T
10535         JRST FNPRS7
10536
10537 ;;; Extract in T the next SIXBIT word from user memory off bp in R,
10538 ;;; clobbering I (test 4.9 to see if there was no word read at all).
10539 ;;; Terminating character returned in H (0 means we got to the end of the
10540 ;;; string).  Q should be an aobjn pointer to a block in user memory of
10541 ;;; additional BPs.
10542 FNPRS4: SETZ T,
10543         MOVE I,[440600,,T]
10544 FNPRS6: PUSHJ P,FNPRS3
10545         JUMPE H,CPOPJ           ; that was the end of the string
10546         CAIE H,":
10547          CAIN H,";
10548           JRST FNPRS5           ; done?
10549         CAIN H,40
10550          JRST FNPRS5            ; done?
10551         CAIN H,^Q
10552          PUSHJ P,FNPRS3
10553         CAIL H,140
10554          SUBI H,40
10555         SUBI H,40
10556         TLNE I,770000
10557          IDPB H,I
10558         JRST FNPRS6
10559
10560 FNPRS5: JUMPL I,FNPRS6          ; keep looking if we haven't seen anything yet.
10561         POPJ P,
10562
10563 ;Extract in H the next character from user memory off the byte pointer in R.
10564 ;Q should be an aobjn pointer to a block of further BPs
10565 ;(in user memory) to use after this one is exhausted.
10566 FNPRS3: TLNN R,-1
10567          HRLI R,440700
10568         IBP R
10569         UMOVE H,(R)             ;Fetch the word the BP points to.
10570         PUSH P,R
10571         HRRI R,H                ;Change the BP to point to H.
10572         LDB H,R                 ;Extract the desired byte.
10573         POP P,R
10574         JUMPN H,CPOPJ
10575         AOBJP Q,CPOPJ           ;When one BP is exhausted, go to the next (if any).
10576         UMOVE R,(Q)
10577         PUSHJ P,ASCIND
10578         JRST FNPRS3
10579 \f
10580 NOPEN:  HRRZ R,A        ;ARGS 1 MODE (LH) CHNL (RH) 2-5 LIKE NOPEN1 1-4
10581         CAIL R,NIOCHN
10582          JRST OPNL14
10583         ADDI R,IOCHNM(U)
10584         PUSH P,A
10585         PUSH P,B
10586         PUSH P,C
10587         PUSH P,D
10588         PUSH P,E
10589         PUSH P,W
10590         PUSHJ P,CCLOSE
10591         POP P,W
10592         SOS W           ;STRIP OF FIRST ARG
10593         POP P,D         ;B-E POPPED INTO A-D
10594         POP P,C
10595         POP P,B
10596         POP P,A
10597         POP P,R         ;A POPPED INTO R
10598         TLC R,@CTLBTS(U)
10599         LDB E,[OPNCOM,,R]
10600         CAIE E,2
10601          CAIN E,4
10602           JRST OPNL12   ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10603         JSP T,NOPEN1
10604         MOVEM D,SRN3(U) ;MAKE SYMBOLIC OPEN OF NETWORK WIN USING 5TH ARG AS FOREIGN HOST.
10605 NDEL1:  CLEARM SRN4(U)
10606 NRN2:   CLEARM SRN5(U)
10607 NOPENX: TRNE R,-NIOCHN
10608          BUG            ;BAD CHANNEL #
10609         HRRZM R,UUAC(U) ;CHNL # (MAYBE ONLY FOR ERRS) IN R
10610         ADDI R,IOCHNM(U)
10611         LDB W,[OPNCOM,,R]
10612         JRST NOPNE
10613
10614 ;DEFAULT THE ARGS FOR .CALL OPEN, ETC,; PUT MODE IN E.
10615 NOPEN1: SETZM EPDL(U)
10616         SETZM EPDL3(U)
10617         CAIGE W,2
10618          MOVSI B,(SIXBIT /@/)
10619         CAIGE W,3
10620          MOVSI C,(SIXBIT /@/)
10621         CAIGE W,4
10622          MOVE D,USYSNM(U)       ;SYSTEM NAME
10623         HLRZ E,R        ;GET MODE BITS FOR TRAN.
10624         JRST (T)
10625
10626 ;MAKE LINK 1-4 AS NOPEN1, 5 SNAME 2 6,7 FN1,2(2)
10627 NMLINK: MOVSI R,200000
10628         CAIN W,2        ;Only 2 args are BPs.
10629          JRST [ PUSHJ P,2FNPRS
10630                 JRST NOPENX]
10631         CAIGE W,7       ;Otherwise, must be seven word of sixbit.
10632          JRST OPNL33
10633         MOVEM E,SRN3(U)
10634         MOVEM TT,SRN4(U)
10635         MOVEM I,SRN5(U)
10636         JSP T,NOPEN1
10637         JRST NOPENX
10638
10639 NDEL:   SETZM SRN3(U)
10640         CAIN W,2
10641          JRST OPNL33
10642         CAIN W,1        ;If it's just a BP (or block of them),
10643          JRST [ MOVE R,A        ;Parse it into filenames in A-D.
10644                 MOVEM R,EPDL(U)
10645                 PUSHJ P,FNPRS
10646                 JRST .+2]
10647          JSP T,NOPEN1
10648         MOVSI R,400000  ;DELETE, ARGS AS NOPEN1
10649         SETZ E,
10650         JRST NDEL1
10651
10652 NRNAM:  MOVSI R,400000
10653         CAIN W,2        ;Only 2 args are BPs.
10654          JRST [ PUSHJ P,2FNPRS
10655                 JRST NRN2]
10656         CAIGE W,6       ;Otherwise, must be six word of sixbit.
10657          JRST OPNL33
10658         MOVEM E,SRN3(U)
10659         MOVEM TT,SRN4(U)
10660         MOVSI R,400000  ;RENAME 1-4 AS NOPEN1 5,6 NEW FN1,2
10661         JSP T,NOPEN1
10662         JRST NRN2
10663
10664 ;Parse two BPs (or aobjn pointers to blocks of BPs) into user memory
10665 ;into filenames.  The second bunch go in SRN3 - SRN5; the first in A - D.
10666 ;The two args are saved in EPDL and EPDL3.  Clears E, preserves R.
10667 2FNPRS: PUSH P,R
10668         MOVEM A,EPDL(U)         ;Save two BPs for job device.
10669         MOVEM B,EPDL3(U)
10670         PUSH P,A                ;Decode the second BP first, to get the new names.
10671         MOVE R,B
10672         PUSHJ P,FNPRS
10673         MOVEM B,SRN3(U)         ;Stick them where RENAME looks.
10674         MOVEM C,SRN4(U)
10675         MOVEM D,SRN5(U)
10676         POP P,R                 ;Parse the first BP, to get the old file filenames.
10677         PUSHJ P,FNPRS
10678         SETZ E,
10679         POP P,R
10680         POPJ P,
10681
10682 ;Takes either channel, FN1 (sixbit) and FN2 (sixbit)
10683 ;or channel and BP (or aobjn -> block of BPs).
10684 NRNWO:  SETZM EPDL(U)
10685         SETZM EPDL3(U)
10686         PUSH P,A
10687         CAIN W,2
10688          PUSHJ P,[MOVE R,B      ;If channel and BP, parse the BP into filenames.
10689                   MOVEM R,EPDL3(U)      ;But also save it for job device.
10690                   JRST FNPRS]
10691         MOVEM B,SRN3(U) ;PUT AWAY NEW NAMES.
10692         MOVEM C,SRN4(U)
10693         POP P,C
10694         ANDI C,-1       ;We call "RENAME" with old fn2 = channel number.
10695         SETZB A,B
10696         MOVEI D,0
10697         MOVSI R,400000  ;OPNCOM IS .FDELE .
10698         MOVEI E,400000
10699         JRST NRN2
10700 \f
10701 SUBTTL HACKS FOR OPENS THAT LOSE
10702
10703
10704 IFN 0,[         ;THESE "DEFNS" EXIST ONLY SO @ WILL CREF THEM
10705         OPNL1:  OPNL2:  OPNL3:  OPNL4:  OPNL5:  OPNL6:  OPNL7:
10706 OPNL10: OPNL11: OPNL12: OPNL13: OPNL14: OPNL15: OPNL16: OPNL17:
10707 OPNL20: OPNL21: OPNL22: OPNL23: OPNL24: OPNL25: OPNL26: OPNL27:
10708 OPNL30: OPNL31: OPNL32: OPNL33: OPNL34: OPNL35: OPNL36: OPNL37:
10709 OPNL40: OPNL41: OPNL42: OPNL43: OPNL44: OPNL45: OPNL46: OPNL47:
10710 OPNL50: OPNL51: OPNL52: OPNL53: OPNL54: OPNL55: OPNL56: OPNL57:
10711 OPNL60: OPNL61: OPNL62: OPNL63: OPNL64: OPNL65: OPNL66: OPNL67:
10712 OPNL70: OPNL71: OPNL72: OPNL73: OPNL74: OPNL75: OPNL76: OPNL77: 
10713 ]               ;END OF IFN 0
10714
10715 ;HERE ARE THE REAL DEFNS
10716 REPEAT NOPNLS,CONC OPNL,\.RPCNT+1,:     JSP D,OPENL
10717 ;
10718 OPENL:  CONSZ PI,77400
10719          BUG            ;ERROR WITH PI IN PROGRESS
10720         MOVE U,USER     ;BE SURE U=CURRENT USER'S INDEX
10721         MOVEI D,-OPNL1(D)       ;GET LOSSAGE NUMBER
10722         MOVE R,SYSCVL(U);POSSIBLY RETURN IN ERROR-CODE ARG TO .CALL
10723         TLNE R,%SCVER
10724          UMOVEM D,(R)
10725         HRRZ R,UUAC(U)  ;GET CH NUM
10726         CAILE R,NIOCHN-1
10727          BUG            ;UUAC BAD
10728         PUSHJ P,LSWCLR  ;UNLOCK SWITCHES
10729         DPB R,[BCHPTR]  ;SAVE AS MOST RECENT CHANNEL IN ERR
10730         ADD R,U         ;RELOCATE TO POINT TO USER VARS
10731         DPB D,[220600,,IOCHST(R)]       ;STORE IN STATUS WORD
10732         JRST CLKONJ
10733 \f
10734 SUBTTL RCHST, STATUS, RFNAME, RFPNTR, WHYINT CALLS
10735
10736 ;.CALL RFNAME
10737 ;1ST ARG IS A <JOB>, WHOSE CHANNEL IS TO BE LOOKED AT.
10738 ;2ND ARG IS A CHANNEL NUMBER.
10739 ;3RD ARG IS BP TO STORE ASCIZ FILENAME STRING THROUGH.
10740 ;4TH ARG IS MAXIMUM NUMBER OF CHARACTERS TO STORE (DEFAULTS TO 1,,0).
10741 ;ONLY 1 ARG => IT IS CHANNEL #, AND JOB IS "SELF".
10742 ;FIRST 4 VALUES ARE THE DEVICE, FN1, FN2 AND SNAME
10743 ;  AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10744 ;FIFTH VALUE IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN
10745
10746 NRFNAM: MOVE J,A        ;FIRST ARG IS JOB SPEC
10747         CAIL W,2
10748          SKIPA A,B      ;GET CHANNEL # INTO A IN EITHER CASE
10749           MOVEI J,%JSELF ;IF ONLY ONE ARG, JOB SPEC IS SELF
10750         MOVE Q,C        ;SAVE BP FOR STORING ASCIZ FILENAME STRING - IF ANY.
10751         CAIGE W,3
10752          SETZ Q,
10753         CAIGE W,4
10754          MOVSI D,1
10755         JSP T,NCORUI    ;DECODE JOB SPEC
10756          JFCL
10757 IFN PDP6P,[
10758         CAIN J,-1
10759          JRST OPNL34    ;PDP6 DOESN'T HAVE CHANNELS
10760 ]
10761         PUSH P,D
10762         PUSH P,Q
10763         MOVE W,D
10764         MOVE U,J        ;LOOK IN THAT JOB'S CHANNELS
10765         PUSHJ P,NRFNM1  ;GET THE CRUFT
10766          JRST POP2J
10767         PUSHJ P,LSWPOP  ;UNSOS DIELOK.
10768         MOVE T,Q
10769         POP P,Q
10770         POP P,I         ;I GETS 4TH ARG: MAX NUMBER OF CHARS TO STORE IN STRING.
10771         JUMPE T,POPJ1   ;IF DEVICE ROUTINE HAS CLEARED Q, IT HAS STORED THE STRING.
10772                 ;NOTE NETRCH PUTS AN EXTRA VALUE FOR .RCHST (GARBAGE, TO US) IN Q!
10773         JUMPE Q,POPJ1   ;IF BP ARG WAS 0, CALLER DOESN'T WANT A STRING.
10774         MOVE R,Q
10775         PUSHJ P,ASCIND
10776         MOVE Q,R
10777         MOVE J,A        ;IF SO, STORE ALL 4 FILENAMES DOWN IT, ONE BY ONE.
10778         MOVEI T,":
10779         PUSHJ P,NRFNS1
10780         MOVE J,D
10781         MOVEI T,";
10782         PUSHJ P,NRFNS1
10783         MOVE J,B
10784         MOVEI T,40
10785         PUSHJ P,NRFNS1
10786         MOVE J,C
10787         MOVEI T,0
10788         PUSHJ P,NRFNS1
10789         JRST POPJ1
10790
10791 ;STORE THE SIXBIT WORD IN J FOLLOWED BY THE ASCII CHAR IN T
10792 ;INTO USER ADDRESS SPACE DOWN THE BP IN Q.
10793 NRFNS1: JUMPE J,CPOPJ           ;OUTPUT NOTHING AT ALL IF THE SIXBIT WORD IS EMPTY.
10794         CAIGE I,4               ;GIVE UP NOW IF TOO CLOSE TO END OF ALLOCATED SPACE.
10795          POPJ P,
10796         SETZ R,
10797         ROTC J,6                ;ELSE GET NEXT CHAR IN R, AND CONVERT TO ASCII AND STORE.
10798         ADDI R,40
10799         SETZ TT,
10800         CAIE R,":               ;PRECEDE ANY SPECIAL CHARACTERS WITH ^Q.
10801          CAIN R,";
10802           MOVEI TT,^Q
10803         CAIN R,40
10804          MOVEI TT,^Q
10805         JUMPE TT,NRFNS2
10806         SOS I
10807         PUSHJ P,NRFNSB
10808 NRFNS2: SOS I
10809         MOVE TT,R
10810         PUSHJ P,NRFNSB
10811         JUMPN J,NRFNS1
10812         SOS I
10813         MOVE TT,T
10814         PUSHJ P,NRFNSB          ;IF NAME FINISHED BUT NOT EMPTY, FOLLOW BY TERMINATOR.
10815         JUMPE T,CPOPJ
10816         CAIN T,40
10817          POPJ P,
10818         MOVEI TT,40
10819         PUSHJ P,NRFNSB          ;IF TERMINATOR IS : OR ;, FOLLOW IT WITH A SPACE.
10820         SOJA I,CPOPJ
10821
10822 ;STORE A BYTE IN TT DOWN BP IN Q TO USER SPACE, INCREMENTING FIRST.
10823 ;XCTR XBYTE LOSES BECUSE IT GETS THE BP FROM USER SPACE.
10824 NRFNSB: IBP Q
10825         PUSH P,T
10826         PUSH P,Q
10827         UMOVE T,(Q)
10828         HRRI Q,T
10829         DPB TT,Q
10830         POP P,Q
10831         UMOVEM T,(Q)
10832         POP P,T
10833         POPJ P,
10834
10835 ;GET THE FILENAMES FOR THE CHANNEL IN A OF JOB IN U INTO A THRU D.
10836 ;IF Q IS NONZERO, IT IS A BP TO STORE AN ASCIZ STRING, AND W IS THE
10837 ;MAX NUMBER OF CHARACTERS TO STORE.
10838 ;THE DEVICE DEPENDENT ROUTINE CAN STORE THE STRING ITSELF
10839 ;AND SET Q TO ZERO SO THAT IT WILL NOT BE STORED THE STANDARD WAY.
10840 NRFNM1: MOVE T,[4,,NRFNM2]
10841         JRST CHNDCD     ;R GETS ADDR OF IOCHNM WD, H GETS CONTENTS.
10842 NRFNM2: HLRZ A,H        ;PUT LH(IOCHNM WD) WHERE DEVICE RTN LOOKS
10843         HLLZ J,DCHSTB(H)
10844         JUMPG J,[       ;IF 6-LETTER DEVICE NAME, LH IS POSITIVE ADDRESS
10845                 HLRZS J ;OF FULL NAME.  NOTE THERE BETTER BE NO
10846                 MOVE J,(J)      ;3-CHAR DEVICES WHOSE NAME DOES NOT START
10847                 JRST .+1 ]      ;WITH A LETTER.
10848         PUSH P,J        ;SAVE THE PROBABLE VALUE OF DEVICE NAME
10849         LDB J,[1400,,DCHSTB(H)]
10850         HLRZ J,DRFNTB(J) ;GET RFNAME ROUTINE POINTER
10851         SETZB B,C       ;FN1, FN2 ARE 0 FOR NON-DIR-DEV
10852         SETZ D,         ;SNAME IS 0 FOR NON-MULTI-DIR-DEV
10853         LDB E,[.BP (%IOTOM),IOTTB(H)]   ;PROBABLE VALUE OF MODE
10854         PUSHJ P,(J)     ;CALL DEVICE-SPECIFIC ROUTINE
10855          SKIPA A,(P)    ;NO SKIP => USE DEVICE NAME FROM DCHSTB
10856           MOVE A,J      ;SKIP => USE DEVICE NAME RETURNED IN J
10857         JRST POP1J1
10858
10859 ;.CALL RFPNTR
10860 ;ARG 1 - CHANNEL NUMBER
10861 ;VAL 1 - ACCESS POINTER OF CHANNEL
10862 ;VAL 2 - BYTE SIZE OF CHANNEL.
10863 ;FAILS IF NOT A RANDOM-ACCESS DEVICE
10864
10865 NRFPNT: HLRZ A,H        ;CHANNEL ALREADY DECODED, SET UP LH(IOCHNM) FOR DEV RTN
10866         LDB J,[1400,,DCHSTB(H)]
10867         HRRZ J,DRFNTB(J) ;GET RFPNTR ROUTINE POINTER
10868         JRST (J)        ;IT SHOULD PUT POINTER IN A AND POPJ1, OR OPNL34
10869
10870 ;SYMBOLIC CALL "RCHST"
10871 ;1ST ARG IS A CHANNEL NUMBER.
10872 ;6 OR MORE VALUES. THE FIRST 4 ARE THE DEVICE, FN1, FN2 AND SNAME
10873 ;  AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10874 ;THE 5TH IS THE ACCESS POINTER, OR -1 IF NOT RANDOM ACCESS.
10875 ;THE 6TH IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN.
10876 ;MORE VALUES ARE RETURNED ONLY FOR NET:, AT THE MOMENT.
10877 ;THE DEV SUBROUTINE MAY PUT EXTRA RESULTS IN TT, I, AND Q, AND PUT # RESULTS INTO W
10878
10879 NRCHST: SETO I,                 ;DEFAULT POSSIBLE EXTRA RESULTS
10880         SETO TT,                ;DEFAULT ACCESS POINTER TO -1
10881         MOVEI W,6               ;NORMAL NUMBER OF RESULTS IS 6
10882         SETZ Q,
10883         PUSHJ P,NRFNM1          ;GET RESULTS 1 THROUGH 4 AND 6, AND SET UP R AND H
10884          POPJ P,                ;CHANNEL NUMBER MUST HAVE BEEN BAD
10885         PUSH P,A
10886         PUSH P,B                ;SAVE THE AC THAT RFPNTR CLOBBERS.
10887         HLRZ A,H                ;GET ROUTINE TO GET ACCESS POINTER
10888         LDB J,[1400,,DCHSTB(H)]
10889         HRRZ J,DRFNTB(J)        ;ROUTINE BETTER PRESERVE B,C,D,E,TT,I,Q
10890         CAIL J,OPENL            ;KLUDGILY SKIP IF WOULD OPEN-LOSS
10891          PUSHJ P,(J)            ;GET ACCESS POINTER IN A, ALWAYS SKIPS
10892           MOVE A,TT             ;NOT RANDOM ACESS, USE DEFAULT VALUE
10893         MOVE TT,E               ;OPEN MODE IS 6TH RESULT
10894         MOVE E,A                ;ACCESS POINTER IS 5TH RESULT
10895         JRST PPBAJ1
10896 \f
10897 ;.RCHST AC,  WITH  AC/ CH,,ADDR
10898 ;RETURNS, IN THE 5 OR MORE WORDS STARTING AT ADDR,
10899 ;THE RESULTS OF A SYMBOLIC RCHST ON CHANNEL CH.
10900 ;EXCEPTION - THE DEVICE NAME IS RETURNED IN THE RH
10901 ;OF THE FIRST WORD , SO IT IS TRUNCATED TO 18 BITS.
10902 ;EXCEPTION - THE OPEN MODE VALUE IS NOT RETURNED. LATER VALUES
10903 ;ARE SHIFTED DOWN ONE WORD.
10904 ;NEVER SKIPS.
10905
10906 ARCHST: UMOVE J,(J)     ;GET CONTENTS OF AC
10907         HLRZ A,J
10908         CAIL A,NIOCHN
10909          JRST ILUUO     ;BAD CHANNEL NUMBER
10910         PUSH P,J
10911         PUSHJ P,NRCHST  ;DO THE REAL WORK.
10912          BUG            ;ONLY ERROR RETURN SHOULD BE BAD CHANNEL NUMBER
10913         HLRZS A         ;PUT DEV NAME IN RH FOR HISTORY'S SAKE
10914         POP P,J         ;RH(J) HAS PLACE TO STORE DATA
10915         MOVE TT,I
10916         MOVE I,Q        ;SHIFT DOWN LAST 2 VALS OVER THE OPEN MODE.
10917         HRLI J,A
10918         ADDI W,-2(J)    ;W HAD 1+ # VALS, NOW HAS PLACE TO PUT LAST ONE
10919         XCTR XBW,[BLT J,(W)]
10920         POPJ P,
10921
10922 ;.STATUS CH,LOC ;STORE IN LOC THE STATUS OF CHANNEL CH
10923                 ;AND OF THE DEV OPEN ON IT IF ANY
10924 ;1.1-1.6 SYS PERIPHERAL DEVICE CODE
10925 ;1.7-2.9 DEVICE DEPENDENT
10926 ;3.1-4.9 LH(IOCHST)
10927
10928 ASTATUS:ADDI R,IOCHNM(U)        ;SET UP AC'S LIKE CHNDCD
10929 ASTAT1: MOVE H,(R)              ;ENTER HERE FROM .USET [.RIOS,,]
10930         HLL R,CLSTB(H)
10931         PUSHJ P,NSTATUS         ;CALL NEW SYSTEM CALL VERSION
10932          BUG
10933         UMOVEM A,(C)    ;GIVE TO USER
10934         POPJ P,
10935
10936 ;.CALL STATUS
10937 ;ARG 1 - CHANNEL NUMBER
10938 ;VAL 1 - SAME AS .STATUS
10939
10940 NSTATUS:HLRZ A,H                ;SET UP LH(IOCHNM)
10941         LDB D,[140600,,DCHSTB(H)] ;GET SYS PERIPHERAL DEVICE CODE
10942         LDB J,[340300,,IOTTB(H)]        ;GET I/O CHANNEL MODE FROM 4.5-4.2
10943         DPB J,[060300,,D]       ;RETURN IN BITS 1.9-1.7
10944         LDB J,[1400,,DCHSTB(H)]
10945         HLRZ J,DSTSTB(J)        ;GET STATUS ROUTINE POINTER
10946         PUSHJ P,(J)             ;ROUTINE FILLS OUT STATUS WORD IN D
10947         HLL D,IOCHST-IOCHNM(R)  ;FILL IN LEFT HALF FROM IOCHST
10948         TLZ D,740000            ;CLEAR BITS USED FOR CHANNEL NUM ON IO PDL
10949         MOVE A,D                ;RETURN VALUE IN A
10950         JRST POPJ1              ;THIS CALL ALWAYS SUCCEEDS
10951
10952 ;.CALL WHYINT
10953 ;ARG 1 - CHANNEL NUMBER
10954 ;VAL 1 - %WY CODE FOR TYPE OF DEVICE
10955 ;ADDITIONAL VALUES DEVICE-DEPENDENT
10956 ;THIS IS THE USUAL CALL TO GIVE IN RESPONSE TO A SECOND WORD INTERRUPT
10957
10958 NWHYINT:HLRZ A,H                ;SET UP LH(IOCHNM)
10959         LDB J,[1400,,DCHSTB(H)]
10960         HRRZ J,DSTSTB(J)        ;GET WHYINT ROUTINE POINTER
10961         JRST (J)
10962 \f
10963 ;DEVICE-SPECIFIC RFNAME/RCHST ROUTINES
10964 ;CALLED WITH STANDARD CHNDCD STUFF IN H AND R, LH(IOCHNM) IN A
10965 ;MUST PRESERVE H AND R; CAN CLOBBER W TO INDICATE EXTRA STUFF FOR RCHST
10966
10967 RCHUSR: MOVE B,UNAME(A)         ;GET UNAME
10968         MOVE C,JNAME(A)         ;GET JNAME
10969         POPJ P,
10970
10971 IFN NUNITS,[            ;UTAPE .RCHST
10972 RCHUTP: HRRZ C,UTTNO(A)
10973         MOVSI J,'UT0(C) ;GET REAL DEV NAME "UTN" IN J
10974         AOS (P)         ;SKIP TO RETURN CHANGED DEV NAME
10975         MOVE D,UTASS(C) ;THE "SNAME" IS THE USER TAPE IS ASSIGNED TO.
10976         CAIGE A,NUTIC
10977          JRST RCHUTI    ;INPUT
10978         MOVE B,UTN1(A)  ;OUTPUT, GET FN1
10979         MOVE C,UTN2(A)  ;NOW FN2
10980         POPJ P,
10981
10982         ;UTAPE INPUT .RCHST
10983 RCHUTI: LDB T,[220500,,UTDBC(A)]        ;GET FILE NUMBER
10984         SUBI T,1
10985         LSH T,1                 ;TURN INTO INDEX INTO DIRECTORY
10986         CONO PI,CLKOFF
10987         ADD T,UDIRO(C)          ;GET POINTER TO FILE NAMES
10988         MOVE B,(T)              ;GET FN1
10989         MOVE C,(T)              ;GET FN2
10990         JRST CLKONJ
10991 ]
10992
10993 ;RCHST ROUTINE FOR TTY
10994 RCHTTY: MOVE J,A
10995         ANDI J,#%TICNS#(.BM $TIIDX)
10996         IOR E,J         ;MERGE TTY OPEN MODE BITS WITH THE GENERAL ONES.
10997         TRNE A,%TICNS
10998          POPJ P,
10999         ANDI A,7
11000         MOVEI J,'T00(A)
11001         HLRZ A,(R)
11002 RCHST1: ANDI A,70
11003         LSH A,3
11004         ADD J,A
11005         HRLZS J         ;J NOW HAS SIXBIT/TNM/, NM = TTY #.
11006         JRST POPJ1      ;SKIP TO SAY DEV NAME IS IN J.
11007
11008 ;RCHST ROUTINE FOR STY
11009 RCHSTY: MOVE J,TTYOPT(A)
11010         TLNE J,%TOHDX
11011          IORI E,4       ;STY BIT 1.3 => TTY IS HALF-DUPLEX.
11012         MOVE J,STYSTS-NFSTTY(A)
11013         TLNE J,%SSORS
11014          IORI E,20      ;BIT 1.5 => WANT TO RECEIVE %TDORS ON .RESET OF TYOC,
11015         TRNN E,1        ;FIND THE DON'T-HANG-BIT FOR THIS DIRECTION.
11016          TLZA J,#%SSOHG ;AND FLUSH THE ONE FOR THE OTHER DIRECTION.
11017           TLZ J,#%SSHNG
11018         TLNE J,-1       ;THEN TESTING BOTH TESTS ONLY THE RELEVANT ONE.
11019          IORI E,10
11020         SUBI A,NFSTTY
11021         ANDI A,7
11022         MOVEI J,'S00(A)
11023         HLRZ A,(R)
11024         SUBI A,NFSTTY
11025         JRST RCHST1
11026
11027 RCHDRH: HRRZ A,IOCHST-IOCHNM(R) ;TRACK NUMBER
11028         IMULI A,LMNBLK          ;DIRHNG DEVICE RFNAME
11029         ADDI A,2000-LMNBLK*NUDSL
11030         ADD A,QMDRO
11031         MOVE D,MNUNAM(A)
11032         POPJ P,
11033 \f
11034 ;RCHST ROUTINE FOR DIRECTORY CHANNELS AND THE ERR DEVICE.
11035 RCHDIR: MOVE T,DSKLST(A)        ;GET THE TYPE OF DIRECTORY CODE.
11036         SKIPE J,UDUSR(A)        ;IF DEVICE # IS NONZERO, ADD IT TO DEV NAME
11037          HRLZS J                ;(ONLY HAPPENS FOR UTAPE)
11038         ADD J,RCHDRD-1(T)       ;DETERMINE DEV NAME FROM DIRECTORY TYPE
11039         MOVE B,RCHDR1-1(T)      ;SAME FOR FN1
11040         SKIPN C,RCHDR2-1(T)     ;AND FN2, EXCEPT 0 FOR ERR DEVICES
11041          MOVE C,UUDPP(A)        ; SO WE WILL GET THE STATUS WORD BEING DECODED.
11042         CAIN T,3
11043          MOVE D,UDSYSN(A)       ;FOR DISK UFD'S, GET THE SNAME
11044         JRST POPJ1              ;RETURN, SAYING WE HAVE SPEC'D THE DEVICE NAME.
11045
11046 .SEE UDT        ;THESE TABLES ARE IN PARALLEL WITH UDT
11047 RCHDRD: 'UT0,, ? 'CLU,, ? 'DSK,, ? 'DSK,,
11048         'ERR,, ? 'TTY,, ? 'COR,,
11049 IF2 IFN .-UDTLN-RCHDRD,.ERR RCHDRD WRONG LENGTH
11050
11051 RCHDR1: '.FILE. ? '.FILE. ? '.FILE. ? 'M.F.D.
11052         3 ? '.FILE. ? '.FILE.
11053 IF2 IFN .-UDTLN-RCHDR1,.ERR RCHDR1 WRONG LENGTH
11054
11055 RCHDR2: SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(FILE)/
11056         0 ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/
11057 IF2 IFN .-UDTLN-RCHDR2,.ERR RCHDR2 WRONG LENGTH
11058
11059
11060
11061 ;CORE LINK .RCHST ROUTINE
11062
11063 RCHCLO: CONO PI,CLKOFF
11064         MOVE B,CLN1(A)  ;GET FN1
11065         MOVE C,CLN2(A)  ;GET FN2
11066         MOVE D,CLSYN(A) ;GET SYSTEM NAME
11067         JRST CLKONJ
11068
11069 ;RFNAME ROUTINE FOR DSK
11070
11071 RCHQSK: MOVE H,QUDPR(A) ;FILE STATUS FOR DISK PICKUP USER DIR POINTER
11072         PUSHJ P,QUDLK   ;LOCK DIRECTORY
11073         MOVE C,QSNLCN(H)        ;LOCATION OF DIRECTORY
11074         MOVE D,UDNAME(C)
11075         ADD C,QUDFPR(A) ;ADD LOCN OF FILE WITHIN DIRECTORY
11076         MOVE B,(C)      ;GET FIRST FILE NAME
11077         MOVE C,1(C)     ;GET SECOND FILE NAME
11078         PUSHJ P,QUDULK
11079         MOVE H,QSRAC(A)
11080         TLNE H,%QALNK
11081          TRO E,20       ;LINK MODE
11082         MOVE H,(R)      ;PRESERVE H
11083         POPJ P,
11084
11085 ;RFNAME ROUTINE FOR BOJ:
11086
11087 RCHBOJ: CONO PI,CLKOFF  ;BOJ DEVICE .RCHST ROUTINE
11088         MOVE T,JBCUI(A) ;RETURNS CREATOR'S NAME
11089         MOVE B,UNAME(T)
11090         MOVE C,JNAME(T)
11091         SKIPGE JBCG(A)
11092          SETZB B,C      ;CREATOR GONE, RETURN BLANK NAMES
11093         JRST CLKONJ
11094 \f
11095 ;RFNAME ROUTINE FOR JOB:
11096
11097 RFNJOB: SKIPE Q
11098          PUSHJ P,RFNJ1
11099         CONO PI,CLKOFF
11100         MOVE B,JBFN1(A)
11101         MOVE C,JBFN2(A)
11102         MOVE D,JBSYS(A)
11103         MOVE E,JBOPNM(A)
11104         MOVE J,JBDEV(A)
11105         JRST CLKOJ1
11106
11107 ;COPY THE BOJ JOB'S ASCIZ FILENAME STRING INTO OUR CALLER'S STRING.
11108 ;THE CALLER'S BP IS IN Q, AND HIS MAX CHARS TO STORE IS IN W.
11109 RFNJ1:  SKIPN B,JBFNP(A)
11110          POPJ P,
11111         PUSH P,TT
11112         PUSH P,T
11113         MOVE J,JBCJUI(A)
11114         AOS DIELOK(J)   ;PREVENT THE JOB FROM DIEING.
11115         PUSHJ P,SOSSET
11116          DIELOK(J)
11117         TLZ B,37
11118         MOVE D,B
11119         PUSHJ P,RFNJ3
11120         MOVEI TT,1
11121 ;D HAS BP TO FETCH WITH, POINTING INTO C, WHICH CONTAINS WORD FETCHED FROM BOJ JOB.
11122 ;RH(B) HAS ADDR OF NEXT WORD TO FETCH FROM THE BOJ JOB.
11123 ;TT CONTAINS THE PREVIOUS CHARACTER TRANSFERRED, OR 1
11124 ;IF THE PREVIOUS CHARACTER WAS QUOTED WITH A ^Q.
11125 RFNJ2:  ILDB E,D
11126         TRNN D,#C               ;IF THE BP IN D ADVANCES PAST C,
11127          JRST RFNJ4
11128         PUSHJ P,RFNJ3           ;FETCH ANOTHER WORD INTO C, MAKE D POINT THERE AGAIN,
11129         LDB E,D                 ;AND FETCH THE SAME BYTE OVER AGAIN.
11130 RFNJ4:  SOJL W,RFNJ5
11131         EXCH TT,E
11132         PUSHJ P,NRFNSB          ;STORE BYTE INTO CALLER, UNLESS HIS STRING IS FULL.
11133         EXCH TT,E
11134         CAIN TT,^Q              ;A QUOTED CHAR DOES NOT TERMINATE AND DOES NOT QUOTE.
11135          MOVEI E,1
11136         MOVE TT,E
11137         JUMPN E,RFNJ2           ;STOP STORING AFTER A NULL WHICH ISN'T QUOTED.
11138 RFNJ5:  SETZ Q,
11139         POP P,T
11140         POP P,TT
11141         JRST LSWPOP
11142
11143 ;READ THE NEXT WORD (ADDR IN B) FROM THE BOJ JOB.
11144 RFNJ3:  SETZ C,
11145         PUSH P,U
11146         PUSH P,A
11147         PUSH P,Q
11148         MOVE U,JBCJUI(A)
11149         LDB A,[121000,,B]
11150         PUSHJ P,UPLC            ;LOOK UP THE BOJ JOB'S PAGE.
11151         POP P,Q
11152         POP P,A
11153         POP P,U
11154         LDB J,T                 ;IF IT DOESN'T EXIST, LOAD A ZERO,
11155         JUMPE J,RFNJ6           ;AVOID GETTING MPV.
11156         MOVE J,JBCJUI(A)
11157         PUSHJ P,MPLDJ
11158         UMOVE C,(B)
11159 RFNJ6:  HRRI D,C
11160         AOJA B,MPLDZ
11161 \f
11162 ;RFPNTR FOR USR:
11163
11164 RFPUSR: HRRZ A,IOCHST-IOCHNM(R) ;GET THE ACCESS PTR
11165         MOVEI B,36.             ;BYTE SIZE IS ALWAYS FULL WORD.
11166         JRST POPJ1
11167
11168 ;RFPNTR FOR DISK
11169
11170 RFPQSK: LDB B,[QSBSIZ(A)]       ;GET FILE BYTE SIZE
11171         MOVSI T,%QAACC
11172         TDNN T,QSRAC(A)         ;IF .ACCESS WAS DONE AND NOT HANDLED,
11173          JRST RFPQS1
11174         MOVE A,QRADAD(A)        ;GET WHAT THE .ACCESS SPECIFIED.
11175         JRST POPJ1
11176
11177 RFPQS1: MOVE J,QFBLNO(A)        ;GET BYTE # OF STRAT OF CURRENT BLOCK.
11178         SKIPGE QSMDN(A)         ;SKIP ON A BUFFER ACTIVE
11179          JRST RFPQS2            ;NONE ACTIVE => QFBLNO POINTS TO NEXT BLOCK TO BE READ.
11180         ADD J,QMPBSZ(A)         ;ELSE CORRECT FOR THE NUMBER OF BYTES WE'VE PROCESSED
11181         SUB J,QSMPRC(A)         ;IN THE ACTIVE BLOCK (QFBLNO -> 1ST WD OF BLOCK).
11182 RFPQS2: MOVE A,J
11183         JRST POPJ1
11184 \f
11185 SUBTTL RESET,IOPUSH,IOPOP,IOPDL,FORCE,FLUSH .CALLS
11186
11187 ;.RESET CH,     ;RESET BUFFERED INFO ON CHANNEL CH
11188                 ;NOT IMPLEMENTED FOR MANY DEVICES
11189                 ;HAS SPECIAL EFFECTS ON "USR" DEVICE
11190 ;.CALL RESET
11191 ;ARG 1 - CHANNEL NUMBER
11192
11193 NRESET: HRRZ A,H
11194         AOSA (P)
11195 ARESET:  HRRZ A,(R)     ;PICK UP INDEX FROM I/O CH WORD
11196         SKIPA T,[HRRZ T,RSTB1(A)]       ;.RESET USES RH OF TABLE
11197 AIOPP1:  MOVE T,[HLRZ T,RSTB1(A)]       ;.IOPUSH, .IOPOP USE LH OF TABLE
11198         IDIVI A,7       ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11199         ADD A,[440500,,RSTB]
11200         IBP A
11201         SOJGE B,.-1
11202         LDB A,A         ;GET BYTE FROM TABLE
11203         XCT T           ;GET REAL TABLE ENTRY IN T
11204         JRST (T)        ;DISPATCH
11205
11206 ;IO CHANNEL PUSH DOWN LIST ROUTINES
11207 ;C(I) =0 AT DSP => IOPUSH =1 => IOPOP
11208
11209 NIOPUS: AOS (P)
11210 AIOPUSH:MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11211         CAML T,[LUIOP-1,,0]     ;LUIOP-2,,<ptr> is OK, leaves room for 1 more.
11212          JRST IOCER6    ;OVER PUSH ERROR
11213         PUSH T,(R)      ;PUSH CURRENT IOCHNM
11214         PUSH T,IOCHST-IOCHNM(R) ;&IOCHST
11215         HRRZ A,(R)
11216         HRRZ J,UUAC(U)
11217         DPB J,[400400,,(T)]     ;STORE CHANNEL NUM FOR POSSIBLE USE BY AIOPDL
11218         MOVEM T,SIOCP(U)        ;STORE BACK PDL POINTER
11219         MOVEI I,0       ;INDICATE IOPUSH
11220         PUSH P,R
11221         PUSHJ P,AIOPP1  ;CALL DEVICE'S IOPDL HANDLER.  SHOULD NOT HANG
11222         POP P,R
11223         SETZM (R)       ;CLEAR OUT IOCHNM
11224         SETZM IOCHST-IOCHNM(R)  ;&IOCHST
11225         POPJ P,
11226
11227 NIOPOP: AOS (P)
11228 AIOPOP: PUSHJ P,ACLOSE  ;CLOSE WHATEVER MAY BE OPEN ON CHANNEL POPPING INTO
11229         MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11230         TLNN T,-1
11231          JRST IOCER5    ;OVER POP ERROR
11232         POP T,IOCHST-IOCHNM(R)  ;POP BACK IOCHST
11233         POP T,(R)               ;&IOCHNM
11234         HRRZ A,(R)
11235         SETZM 1(T)      ;CLEAR OUT PDL WORD TO AVOID CONFUSION IN
11236                         ;ROUTINES THAT GROVEL OVER I/O PDL
11237         MOVEM T,SIOCP(U)        ;STORE BACK PDL POINTER
11238         MOVEI I,1       ;INDICATE IOPOP
11239         JRST AIOPP1     ;CALL DEVICE'S IOPDL HANDLER
11240
11241 AIOPDL: MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11242         TLNN T,-1       ;SKIP UNLESS IO PDL EMPTY
11243         POPJ P,
11244         LDB R,[400400,,(T)]     ;FIND OUT WHAT CHNL TOP ENTRY WAS PUSHED FROM
11245         ADDI R,IOCHNM(U)
11246         PUSHJ P,AIOPOP  ;POP BACK INTO CHNL PUSHED FROM
11247         JRST AIOPDL
11248
11249 IIOPPR: JUMPE I,[JRST 4,CPOPJ]  ;IOPUSH
11250         SETZM (R)       ;CLOSE CHANNEL
11251         SUBI R,IOCHNM(U)        ;GET CHANNEL NUMBER
11252         MOVE R,CHNBIT(R)        ;SECOND WORD INTERRUPT BIT
11253         IORM R,IFPIR(U) ;GIVE TO USER
11254         POPJ P,
11255 \f
11256 ;.CALL FORCE
11257 ;ARG 1 - CHANNEL NUMBER
11258 ;IF ANY OUTPUT IS BUFFERED UP, CAUSES IT TO BE SENT TO THE DEVICE
11259 ;(IF FORCE WAS NOT DONE, IT MIGHT NOT BE SENT UNTIL A COMPLETE
11260 ;BUFFERFULL HAD BEEN OUTPUT BY THE USER.)
11261
11262 NFORCE: SKIPA T,[HLRZ T,DFRCTB(D)]      ;FORCE USES LH OF TABLE
11263 NFINI1:  MOVE T,[HRRZ T,DFRCTB(D)]      ;FINISH USES RH OF TABLE
11264         HLRZ A,(R)      ;PASS LH(IOCHNM) TO DEVICE ROUTINES
11265         HRRZ D,(R)      ;USE RH(IOCHNM) AS BYTE INDEX INTO RSTB
11266         IDIVI D,7       ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11267         ADD D,[440500,,RSTB]
11268         IBP D
11269         SOJGE E,.-1
11270         LDB D,D         ;GET BYTE FROM TABLE
11271         XCT T           ;GET REAL TABLE ENTRY IN T
11272         JRST (T)        ;DISPATCH
11273
11274 ;.CALL FINISH
11275 ;ARG 1 - CHANNEL NUMBER
11276 ;FIRST DOES A FORCE, THEN WAITS FOR ALL OUTPUT TO GET TO THE DEVICE
11277
11278 NFINIS: PUSHJ P,NFORCE  ;CALL DEV ROUTINE FOR FORCING
11279          POPJ P,
11280         JRST NFINI1     ;THEN CALL DEV ROUTINE FOR WAITING
11281
11282 ;.NETS CH, - UUO VERSION OF .CALL FORCE.
11283 ANETS:  PUSHJ P,NFORCE
11284          JRST IOCER1    ;ILLEGAL HARDWARE OPERATION
11285         POPJ P,
11286 \f
11287 SUBTTL I/O DEVICE DISPATCH TABLES
11288
11289 COMMENT |
11290         This page tries to document the ITS I/O device dispatch tables and
11291 dispatch environment.  It is not completed yet.
11292
11293 The tables use several different indices, which are:
11294         opnidx - result of device name lookup in DEVTAB
11295         ioidx  - result of OPEN; has symbolic values.  This is the index
11296                 stored in RH of IOCHNM (per-job channel table)
11297         sidx  - secondary index from DCHSTB(ioidx)
11298         ridx  - secondary index from RSTB(ioidx)
11299
11300 The following system calls are dispatched through these tables.
11301 There are 11 dispatch routines that each device must specify.
11302 The format is "CALL [table name(index-used) -> device-routine]"
11303
11304 OPEN [DEVADR(opnidx) -> devO]
11305         "opnidx" is looked up from DEVTAB which holds the device names.
11306         The device's OPEN routine is in the RH of DEVADR.
11307         It must set up the user's IOCHNM word for the channel,
11308         by setting the RH to the right "ioidx" and the LH to whatever
11309         the device wants.
11310
11311         Context:
11312
11313 CLOSE [CLSTB(ioidx) -> devCLS]
11314         The device's CLOSE routine is in the RH of CLSTB.
11315         It must zero the user's IOCHNM word for the channel.
11316
11317         Context:
11318
11319 IOT, SIOT [IOTTB(ioidx) -> devVarious]
11320         These routines do I/O transfers.  The main reason "ioidx"
11321         has so many possible values (causing IOTTB to be large) is
11322         because lots of devices specify different ioidx's for different
11323         modes - input/output, block/unit, image/ascii, etc - in order
11324         to speed up actual I/O transfers, which are probably the most
11325         common device-related system calls.
11326
11327         Context:
11328
11329 STATUS  [LH(DTSTB(sidx)) -> devSTA]     
11330
11331 WHYINT  [RH(DTSTB(sidx)) -> devWHY]
11332
11333 RCHST, RFNAME   [LH(DRFNTB(sidx)) -> devRCH]
11334
11335 RFPNTR  [RH(DRFNTB(sidx)) -> devRFP]
11336
11337 IOPUSH, IOPOP   [LH(RSTBI(ridx)) -> devIOP]
11338
11339 RESET   [RH(RSTBI(ridx)) -> devRST]
11340
11341 FORCE   [LH(DFRCTB(ridx)) -> devFRC]
11342
11343 FINISH  [RH(DFRCTB(ridx)) -> devFIN]
11344
11345 |
11346 \f
11347 ;DISPATCH TABLE FOR .CLOSE UUO
11348 ;TRANSFERED THROUGH USING RIGHT HALF OF IOCHNM WORD AS AN INDEX
11349 ;R HAS THE ADDRESS OF THE IOCHNM WORD.
11350 ;
11351 ;VARIOUS ROUTINES USE THE BITS IN THE L.H. TO DECIDE WHETHER
11352 ;A CHANNEL IS ACCEPTABLE FOR SOME OPERATION.
11353 %CLS==1,,525252
11354 %CLSU==400000   ;USR DEVICE (INFERIOR)
11355 %CLSDO==200000  ;DECTAPE OUTPUT
11356 %CLSJI==100000  ;JOB INPUT
11357 %CLSDI==40000   ;DECTAPE INPUT
11358 %CLSTI==20000   ;TTY INPUT
11359 %CLSCL==10000   ;CORE-LINK DEVICE
11360 %CLSBJ==4000    ;BOJ DEVICE
11361 %CLSQO==2000    ;DISK OUTPUT
11362 %CLSFU==1000    ;NON-INFERIOR USR
11363 %CLSNRM==400    ;STANDARD CLOSE ROUTINE USED FOR THIS DEVICE.
11364                 ;RH SHOULD POINT, NOT AT THEROUTINE, BUT AT THE USR-USE PAIR
11365 %CLSQ==200      ;DISK
11366 %CLS6==100      ;PDP6
11367 %CLSJO==40      ;JOB OUTPUT
11368 %CLSST==20      ;STY DEVICE
11369 %CLST==10       ;TRAP DEVICE
11370
11371 %CLSJ==%CLSJI\%CLSJO    ;EITHER DIRECTION OF JOB DEVICE
11372 %CL1QO==%CLSQO\%CLSQ    ;BOTH BITS FOR DISK OUTPUT
11373
11374 CLSTB:                                          CPOPJ
11375         OFFSET -CLSTB
11376 TYIDN::                 REPEAT 2,       %CLSTI,,TYICLS  ;TYI
11377 TYODN::                 REPEAT 2,               TYOCLS  ;TYO
11378 NLIDN::                 REPEAT 4,               CPOPJ   ;NULL
11379 UWIDN::                 REPEAT 4,       %CLSU ,,CPOPJ   ;USER
11380 FUWIDN::                REPEAT 2,       %CLSFU,,CPOPJ   ;FOREIGN USER
11381 DNDIRH::                                        DIRHCL  ;DIRHNG
11382 DNTRAP::                                %CLST,,CPOPJ    ;TRAP
11383 DNLCK::                                         LCKCL   ;LOCK
11384 IFN KS10P,DNUBI::                               UBICL   ;UNIBUS INTERRUPT
11385 IFN CHAOSP,CHAIDN::     REPEAT 2,               CHACLS  ;CHAOS NET
11386 IFN NUNITS,[
11387 DNUACII::               REPEAT 3,[
11388                                         %CLSDI,,UTICL   ;UTAPE.
11389                                         %CLSDO,,UTOCL
11390 ]]
11391 IFN OLPTP,LPTDN::       REPEAT 2,               LPTCLS  ;LPT
11392 IFN NLPTP,[
11393 NLPTDN::                                        NLPDCL
11394                                                 NLPTCL
11395 ]
11396 IFN GLPTP,GLPTDN::      REPEAT 2,               GLPCLS
11397 DIRCHN::                REPEAT 4,               UTDCLS  ;DIRECTORY DEVICE
11398 IFN VIDP,NVIDOP::       REPEAT 2,               NVDCLS  ;NVIDI
11399 IFN PLTP,PLTDN::        REPEAT 2,       %CLSNR,,PLTUSR  ;PLOTTER
11400 IFN PTRP,[
11401 PTPI::                  REPEAT 5,       %CLSNR,,PTPUSR  ;PAPER  TAPE PUNCH
11402 ]
11403 IFN IMXP,IMPXDN::       REPEAT 4,               IMPXCL  ;IMX
11404 IFN OMXP,OMPXDN::       REPEAT 4,               OMPXCL  ;OMX
11405 DCLUAI::                                %CLSCL,,CLCLRA  ;CORE LINK
11406                                         %CLSCL,,CLCLWU
11407                         REPEAT 2,[
11408                                         %CLSCL,,CLCLRB
11409                                         %CLSCL,,CLCLWB
11410                         ]
11411 IFN PTRP,[
11412 REDUAI::                REPEAT 5,               PTRCLS  ;PAPER TAPE READER
11413 ]
11414 IFN 340P,[
11415 DN340B::                REPEAT 4,               ADCL1   ;340
11416 ;                                               ADCL1   ;IDS
11417 ]
11418 IFN CODP,[
11419 CODDN::                 REPEAT 2,               CODCLS  ;CODE DEV
11420 ]
11421 DQUAI::                                 %CLSQ ,,QICL    ;DISK
11422                                         %CL1QO,,QOCLR
11423                                         %CLSQ ,,QICL
11424                                         %CL1QO,,QOCL
11425                                         %CLSQ ,,QICL
11426                                         %CL1QO,,QOCL
11427 IFN VIDP,DNVDIU::       REPEAT 4,               TVCCLS  ;TVC
11428 IFN PDP6P,PDPUIO::      REPEAT 4,       %CLS6 ,,PDPCLS  ;USR IN PDP10 MODE
11429 IFN TABP,DTABUI::       REPEAT 2,       %CLSNR,,TABUSR  ;TABLET
11430 IFN NMTCS,[
11431 MTUAIX::                REPEAT 3,               MTICL   ;MAG TAPE
11432                         REPEAT 3,               MTOCL
11433         ]
11434 JDUAI::         REPEAT 3,[
11435                                         %CLSJI,,JOBCLS  ;JOB DEVICE
11436                                         %CLSJO,,JOBCLS
11437                         ]
11438 BDUAI::                 REPEAT 6,       %CLSBJ,,CPOPJ   ;BOJ
11439 IIOPOP::                                [JRST 4,CPOPJ]  ;INTERRUPT ON IOPOP DEVICE
11440 ISPY::                                          CPOPJ   ;SPY
11441 STYDUI::        REPEAT 2,[                              ;PSEUDO TTY
11442                                         %CLSST,,STYICL
11443                                         %CLSST,,STYOCL
11444                         ]
11445 IFN NCPP,NETDUI::       REPEAT 4,               NETCLS  ; Arpanet NCP
11446 IFN TCPP,TCPDUI::       REPEAT 4,               TCPCLS  ; Internet TCP
11447 IFN INETP,IPQDN::                               IPQCLS  ; Internet Queue
11448 IFN MSPP,MSPIO::                                MSCLOS  ;MESS SWITCHER (DM)
11449 IFN STKP,STKDP::                                STKCLS  ;STANFORD KEYBOARD
11450 IFN NTYP,NTYIT::        REPEAT 4,               NTYCLS  ;A KLUDGE ON THE NTY
11451         OFFSET 0
11452 IF2,IFN .-CLSTB-LIOTTB,.ERR BARF AT CLSTB
11453 \f
11454 ;DISPATCH TABLE FOR .IOT UUO
11455 ;TRANSFERED THROUGH USING RIGHT HALF OF I/O CHANNEL WORD AS AN INDEX
11456 %IOT==1,,525252
11457 %IOTBK==400000  ;4.9 = 1 => BLOCK  = 0 => UNIT
11458 %IOTOT==200000  ;4.8 = 1 => OUTPUT  = 0 => INPUT     "
11459 %IOTBP==100000  ;4.7 = 1 => THERE IS A SPECIAL ROUTINE FOR SIOT,
11460                  ;AND ITS ADDRESS IS -1 + RH(IOTTB WORD).
11461 %IOTSP==40000   ;4.6 => THIS DEVICE IS FUNNY. SIOT ISN'T ALLOWED,
11462                  ;AND IOT LETS THE DEVICE RTN DO ALL THE WORK.
11463                 ;PRESENT ONLY FOR UNIT INPUT MODES.
11464 %IOT10==20000   ;4.5 => THIS CHANNEL WAS OPENED WITH BIT 1.4 SET IN MODE
11465 %IOTIM==10000   ;4.4 => THIS CHANNEL WAS OPENED WITH BIT 1.3 (IMAGE MODE) SET IN MODE
11466 ;       4000    ;4.3 COPIES %IOTBK.   THUS, BITS 4.5-4.2 REFLECT THE BOTTOM 4 BITS
11467 ;       2000    ;4.2 COPIES %IOTOT.    OF THE OPEN-MODE.
11468 %IOTOM==36000   ;BITS 4.5 - 4.2
11469
11470 %IOTBO==606000  ;BLOCK OUTPUT.
11471 %IOTBI==404000  ;BLOCK INPUT.
11472 %IOTUO==202000  ;UNIT OUTPUT.
11473 %IOTUI==000000  ;UNIT INPUT.
11474
11475 IOTTB:          IOCER8
11476         OFFSET -IOTTB
11477 TYIDN::         %IOTUI,,TYI     ;TTY ENTRIES MUST BE COMPACT
11478 TYIBN::         %IOTBI,,TTYBI
11479 TYODN::         %IOTUO,,TYO (%IOTBP)
11480 TYOBN::         %IOTBO,,TTYBO   ;LAST TTY DEVICE
11481 NLIDN::         %IOTUI,,NULI
11482 NLBIDN::        %IOTBI,,NULBI
11483 NLODN::         %IOTUO,,CPOPJ
11484 NLBDN::         %IOTBO,,NULBOD
11485 UWIDN::         %IOTUI,,UWI (%IOTIM)
11486 UBIDN::         %IOTBI,,UBI
11487 UWODN::         %IOTUO,,UWO (%IOTIM)
11488 UBODN::         %IOTBO,,UBO
11489 FUWIDN::        %IOTUI,,UWI (%IOT10)
11490 FUBIDN::        %IOTBI,,UBI (%IOT10)
11491 DNDIRH::        %IOTUI,,IOCR10
11492 DNTRAP::        TRPDEV
11493 DNLCK::         %IOTUO,,IOCR10
11494 IFN KS10P,[
11495 DNUBI::         %IOTUI,,IOCR10
11496 ];KS10P
11497 IFN CHAOSP,[
11498 CHAIDN::        %IOTUI+%IOTBP,,CHAUI
11499 CHAODN::        %IOTUO+%IOTBP,,CHAUO
11500 ];CHAOSP
11501 IFN NUNITS,[
11502 DNUACII::       %IOTUI,,UASCII
11503 DNUACCO::       %IOTUO,,UASCCO
11504 DNUBKI::        %IOTBI,,UBLKI
11505 DNUBKO::        %IOTBO,,UBLKO
11506 DNUDTI::        %IOTUI,,UDATAI (%IOTIM)
11507 DNUDTO::        %IOTUO,,UDATAO (%IOTIM)
11508 ]
11509 IFN OLPTP,[
11510 LPTDN::         %IOTUO,,PILPT1
11511 LPTBN::         %IOTBO,,BLPTO
11512 ]
11513 IFN NLPTP,[
11514 NLPTDN::        %IOTUO,,NLPT1
11515 NLPTBN::        %IOTBO,,BNLPTO
11516 ]
11517 IFN GLPTP,[
11518 GLPTDN::        %IOTUO,,GLPTDO (%IOTBP)
11519 GLPTBN::        %IOTBO,,GLPTBO
11520 ]
11521 DIRCHN::        %IOTUI,,DIRCH
11522 DIRBN::         %IOTBI,,DIRB
11523 NDATAI::        %IOTUI,,DDATAI (%IOTIM+%IOTBP)
11524 NBLKI::         %IOTBI,,DBLKI (%IOTIM)
11525 IFN VIDP,[
11526 NVIDOP::        %IOTUI,,NVIDIT (%IOTSP)
11527 BNVIDO::        %IOTBI,,BNVIDI
11528 ]
11529 IFN PLTP,[
11530 PLTDN::         %IOTUO,,PLOT
11531 PLTBN::         %IOTBO,,BPLOT
11532 ]
11533 IFN PTRP,[
11534 PTPI::          %IOTUO,,PIPUN (%IOT10)
11535 PTPA::          %IOTUO,,APIPUN
11536 PTPB::          %IOTBO,,BPIPUN
11537 PTPWA::         %IOTUO,,WAPIPN (%IOTIM)
11538 PTPWB::         %IOTBO,,WBPIPN (%IOTIM)
11539 ]
11540 IFN IMXP,[
11541 IMPXDN::        %IOTUI,,IMPXS (%IOTSP)
11542 IMXDN::         %IOTUI,,IMPXS1 (%IOTSP)
11543 BIMXDN::        %IOTBI,,BIMXS1 (%IOTSP)
11544 BIMPXD::        %IOTBI,,BIMPXS (%IOTSP)
11545 ]
11546 IFN OMXP,[
11547 OMPXDN::        %IOTUO,,OMPXS (%IOTSP)
11548 OMXDN::         %IOTUO,,OMXDS (%IOTSP)
11549 BOMXDN::        %IOTBO,,BOMXDS (%IOTSP)
11550 BOMPXD::        %IOTBO,,BOMPXS (%IOTSP)
11551 ]
11552 DCLUAI::        %IOTUI,,CLUAI
11553 DCLUAO::        %IOTUO,,CLUAO
11554 DCLBI::         %IOTBI,,CLBI
11555 DCLBO::         %IOTBO,,CLBO
11556 DCLUBI::        %IOTUI,,CLUBI (%IOTIM)
11557 DCLUBO::        %IOTUO,,CLUBO (%IOTIM)
11558 IFN PTRP,[
11559 REDUAI::        %IOTUI,,PTRUAI
11560 REDBAI::        %IOTBI,,PTRBAI
11561 REDUII::        %IOTUI,,PTRUII (%IOTIM)
11562 REDBII::        %IOTBI,,PTRBII (%IOTIM)
11563 REDUTI::        %IOTUI,,PTRUTI (%IOT10)
11564 ]
11565 IFN 340P,[
11566 DN340B::        %IOTBO,,340B    ;340 ENTRIES MUST BE COMPACT; BLOCK FIRST, THEN UNIT
11567 DN340W::        %IOTUO,,340W (%IOTSP)
11568 DN340C::        %IOTUO,,340C (%IOTSP)
11569 DN340H::        %IOTUO,,340H (%IOTSP)
11570 ;DN340I::       %IOTUO,,340I (%IOTSP)
11571 DN340L::        ;LAST 340 DEVICE ENTRY
11572 ]
11573 IFN CODP,[
11574 CODDN::         %IOTUO,,SEND
11575 CODBN::         %IOTBO,,BSEND
11576 ]
11577 DQUAI::         %IOTUI,,QUAI (%IOTBP)
11578 DQUAO::         %IOTUO,,QUAO (%IOTBP)
11579 DQBI::          %IOTBI,,QBI
11580 DQBO::          %IOTBO,,QBO
11581 DQUII::         %IOTUI,,QUII (%IOTIM %IOTBP)
11582 DQUIO::         %IOTUO,,QUIO (%IOTIM %IOTBP)
11583 IFN VIDP,[
11584 DNVDIU::        %IOTUI,,RNVDIU (%IOTSP)
11585 DNVDIB::        %IOTBI,,RNVDIB (%IOTSP)
11586 DNVDOU::        %IOTUO,,RNVDOU (%IOTSP)
11587 DNVDOB::        %IOTBO,,RNVDOB (%IOTSP)
11588 ]
11589 IFN PDP6P,[
11590 PDPUIO::        %IOTUO,,UWO     ;BUT JOB WILL BE -1 TO INDICATE PDP6
11591 PDPBIO::        %IOTBO,,UBO
11592 PDPUII::        %IOTUI,,UWI
11593 PDPBII::        %IOTBI,,UBI
11594 ]
11595 IFN TABP,[
11596 DTABUI::        %IOTUI,,UTABI
11597 DTABBI::        %IOTBI,,BTABI
11598 ]
11599 IFN NMTCS,[
11600 MTUAIX::        %IOTUI,,MTUAI (%IOTBP)  ;MAGTAPE
11601 MTUIIX::        %IOTUI,,MTUII (%IOTIM %IOTBP)
11602 MTBIX::         %IOTBI,,MTBI
11603 MTUAOX::        %IOTUO,,MTUAO (%IOTBP)
11604 MTUIOX::        %IOTUO,,MTUIO (%IOTIM %IOTBP)
11605 MTBOX::         %IOTBO,,MTBO
11606 ]
11607 JDUAI::         %IOTUI,,JBUI(%IOTBP)
11608 JDUAO::         %IOTUO,,JBUI(%IOTBP)
11609 JDBI::          %IOTBI,,JBBI
11610 JDBO::          %IOTBO,,JBBI
11611 JDUII::         %IOTUI,,JBUI (%IOTBP %IOTIM)
11612 JDUIO::         %IOTUO,,JBUI (%IOTBP %IOTIM)
11613 BDUAI::         %IOTUI,,BJUI
11614 BDUAO::         %IOTUO,,BJUO
11615 BDBI::          %IOTBI,,BJBI
11616 BDBO::          %IOTBO,,BJBO
11617 BDUII::         %IOTUI,,BJUI (%IOTIM)
11618 BDUIO::         %IOTUO,,BJUO (%IOTIM)
11619 IIOPOP::                [JRST 4,CPOPJ]  ;INTERRUPT ON IOPOP DEVICE
11620 ISPY::          %IOTUI,,SPYI
11621 STYDUI::        %IOTUI,,STTYI   ;PSEUDO TTY
11622 STYDUO::        %IOTUO,,STTYW
11623 STYDBI::        %IOTBI,,STTBI
11624 STYDBO::        %IOTBO,,STTBO
11625 IFN NCPP,[
11626 NETDUI::        %IOTUI,,NETI
11627 NETDUO::        %IOTUO,,NETW (%IOTBP)
11628 NETDBI::        %IOTBI,,NETBI
11629 NETDBO::        %IOTBO,,NETBO
11630 ]
11631 IFN TCPP,[
11632 TCPDUI::        %IOTUI,,TCPI (%IOTBP)
11633 TCPDUO::        %IOTUO,,TCPW (%IOTBP)
11634 TCPDBI::        %IOTBI,,TCPBI
11635 TCPDBO::        %IOTBO,,TCPBO
11636 ]
11637 IFN INETP,[
11638 IPQDN::         IPQIO           ; No I/O calls used on this dev!
11639 ]
11640 IFN MSPP,[
11641 MSPIO::         IOCR10
11642 ]
11643 IFN STKP,[
11644 STKDP::         STKI
11645 ]
11646 IFN NTYP,[
11647 NTYIT::         %IOTUI,,NTYTI   ;KLUDGE FOR FAST, LARGE BUFFER ON NTY
11648 NTYOT::         %IOTUO,,NTYTO
11649 NTYBIT::        %IOTBI,,NTYBI
11650 NTYBOT::        %IOTBO,,NTYBO
11651 ]
11652         OFFSET 0
11653 LIOTTB==.-IOTTB
11654 \f
11655 ;TABLES FOR VARIOUS CHANNEL STATUS CALLS
11656
11657 ;DCHSTB - INDEXED BY IOTTB INDEX (RH OF IOCHNM)
11658 ;LH SIXBIT MAIN DEVICE NAME
11659 ;1.1-2.3 INDEX INTO THE NEXT TWO TABLES
11660 ;2.4-2.9 SYSTEM PERIPHERAL DEVICE CODE (FOR .STATUS)
11661 .SEE DCHSTB     ;ASSEMBLED SECOND TO GET VALUES OF THE TEMPORARY %%dev SYMBOLS.
11662
11663 ;DSTSTB - INDEX FROM DCHSTB
11664 ;LH STATUS ROUTINE, RH WHYINT ROUTINE (OPNL34 IF DEVICE DOESN'T GIVE 2ND WD INTS)
11665
11666 DSTSTB:         CPOPJ,,OPNL44   ;0 CHANNEL NOT OPEN
11667                 STDSTA,,OPNL34  ;1 RANDOM DEVICE
11668                 CPOPJ,,OPNL34   ;2 OTHER KIND OF RANDOM DEVICE
11669                 STATYI,,TYIWHY  ;3 TTY INPUT
11670                 STATYO,,TYOWHY  ;4 TTY OUTPUT
11671                 CPOPJ,,OPNL34   ;5 USR DEVICE
11672                 CPOPJ,,OPNL34   ;6 DIR "DEVICE"
11673                 CLISTA,,OPNL34  ;7 CORE LINK INPUT
11674                 STDSTA,,OPNL34  ;10 CORE LINK OUTPUT
11675                 CPOPJ,,OPNL34   ;11 DISK
11676                 JBSTAT,,OPNL22  ;12 JOB DEVICES (WHYINT SHOULDN'T GET HERE)
11677                 CPOPJ,,OPNL34   ;13 BOJ DEVICE
11678                 STASTI,,STIWHY  ;14 STY INPUT
11679                 STASTO,,STOWHY  ;15 STY OUTPUT
11680                 CPOPJ,,TRPDEV   ;16 TRAP DEVICE
11681                 CPOPJ,,OPNL34   ;17 DIRHNG DEVICE
11682                 CPOPJ,,OPNL34   ;20 SPY DEVICE
11683                 CPOPJ,,OPNL34   ;21 LOCK DEVICE
11684 OFFSET -DSTSTB          ;BEGIN OPTIONAL DEVICES
11685 IFN KS10P, %%UBI:: CPOPJ,,UBIWHY
11686 IFN NMTCS, %%MT::  STAMTC,,OPNL34
11687 IFN NUNITS,%%UTP:: CPOPJ,,OPNL34
11688 IFN OLPTP, %%OLP:: STALPT,,OPNL34
11689 IFN NCPP,  %%NET:: STANET,,NETWHY
11690 IFN TCPP,  %%TCP:: TCPSTA,,TCPWHY
11691 IFN INETP, %%IPQ:: IPQSTA,,IPQWHY
11692 IFN CHAOSP,%%CHA:: CPOPJ,,CHAWHY
11693 OFFSET 0
11694
11695 ;DRFNTB - INDEX FROM DCHSTB
11696 ;LH RFNAME ROUTINE, RH RFPNTR ROUTINE OR OPNL34 IF NOT RANDOM ACCESS
11697
11698 DRFNTB:         CPOPJ,,OPNL44   ;0 CHNL NOT OPEN
11699                 CPOPJ,,OPNL34   ;1 RANDOM DEVICE
11700                 CPOPJ,,OPNL34   ;2 OTHER KIND OF RANDOM DEVICE
11701                 RCHTTY,,OPNL34  ;3 TTY INPUT
11702                 RCHTTY,,OPNL34  ;4 TTY OUTPUT
11703                 RCHUSR,,RFPUSR  ;5 USR DEVICE
11704                 RCHDIR,,OPNL34  ;6 DIR "DEVICE"
11705                 RCHCLO,,OPNL34  ;7 CORE LINK INPUT
11706                 RCHCLO,,OPNL34  ;10 CORE LINK OUTPUT
11707                 RCHQSK,,RFPQSK  ;11 DISK
11708                 RFNJOB,,RFPJOB  ;12 JOB DEVICES
11709                 RCHBOJ,,OPNL34  ;13 BOJ DEVICE
11710                 RCHSTY,,OPNL34  ;14 STY INPUT
11711                 RCHSTY,,OPNL34  ;15 STY OUTPUT
11712                 CPOPJ,,CPOPJ    ;16 TRAP DEVICE
11713                 RCHDRH,,OPNL34  ;17 DIRHNG DEVICE
11714                 SPYRCH,,OPNL34  ;20 SPY DEVICE
11715                 LCKRCH,,OPNL34  ;21 LOCK DEVICE
11716 OFFSET -DRFNTB          ;BEGIN OPTIONAL DEVICES
11717 IFN KS10P, %%UBI:: UBIRCH,,OPNL34
11718 IFN NMTCS, %%MT::  RCHMGT,,OPNL34
11719 IFN NUNITS,%%UTP:: RCHUTP,,OPNL34
11720 IFN OLPTP, %%OLP:: CPOPJ,,OPNL34
11721 IFN NCPP,  %%NET:: NETRCH,,OPNL34
11722 IFN TCPP,  %%TCP:: TCPRCH,,TCPRFP
11723 IFN INETP, %%IPQ:: IPQRCH,,IPQRFP
11724 IFN CHAOSP,%%CHA:: CHARCH,,OPNL34
11725 OFFSET 0
11726 IFN <.-DRFNTB>-<DRFNTB-DSTSTB>, .ERR DRFNTB & DSTSTB NOT SAME LENGTH
11727 \f
11728 DEFINE XX NTIMES,DEVNAM,DN,SNXXX,IDX
11729 IFNB DN, DN==:.-DCHSTB  ;CHECK THAT DCHSTB IS IN SAME ORDER AS IOTTB
11730 IFG SIXBIT/DEVNAM/, ZZ==[SIXBIT/DEVNAM/]  ;DECIDE WHETHER FITS IN LH
11731 .ELSE [
11732 IFE SIXBIT/DEVNAM/&777777, ZZ==(SIXBIT/DEVNAM/)
11733 .ELSE ZZ==[SIXBIT/DEVNAM/]
11734 ]
11735 REPEAT NTIMES, ZZ,,SNXXX_14+IDX
11736 TERMIN
11737
11738 DCHSTB: XX 1,,,,0                       ;CHNL NOT OPEN
11739         XX 2,TTY,TYIDN,,3               ;TTY INPUT
11740         XX 2,TTY,TYODN,,4               ;TTY OUTPUT
11741         XX 4,NUL,NLIDN,SNNUL,1          ;NUL DEVICE
11742         XX 4,USR,UWIDN,SNUSR,5          ;USR DEVICE
11743         XX 2,USR,FUWIDN,SNFUSR,5        ;FOREIGN USR
11744         XX 1,DIRHNG,DNDIRH,SNDIRH,17    ;DIRHNG
11745         XX 1,TRAP,DNTRAP,SNTRAP,16      ;TRAP
11746         XX 1,LOCK,DNLCK,SNLCK,21        ;LOCK
11747 IFN KS10P,  XX 1,UBI,DNUBI,SNUBI,%%UBI  ;UBIBUS INTERRUPT
11748 IFN CHAOSP, XX 2,CHAOS,CHAIDN,SNCHA,%%CHA       ;CHAOS NET
11749 IFN NUNITS, XX 6,UT,DNUACII,SNUTC,%%UTP ;MICRO TAPE
11750 IFG LPTP-1, XX 2,OLP,LPTDN,SNLPD,%%OLP  ;DATA PRODUCTS LPT IN 2-LPT SYSTEM
11751 .ELSE IFN OLPTP, XX 2,LPT,LPTDN,SNLPD,%%OLP     ;DATA PRODUCTS LPT
11752 IFN NLPTP,  XX 2,LPT,NLPTDN,SNLPV,1     ;"VOGUE" LPT (ACTUALLY ODEC)
11753 IFN GLPTP,  XX 2,LPT,GLPTDN,SNLPV,1     ;GOULD LPT
11754         XX 4,DIR,DIRCHN,SNDIR,6         ;DIR "DEVICE"
11755 IFN VIDP,   XX 2,NVD,NVIDOP,SNBAT,2     ;VIDISSECTOR
11756 IFN PLTP,   XX 2,PLT,PLTDN,SNPLT,1      ;PLOTTER
11757 IFN PTRP,   XX 5,PTP,PTPI,SNPTP,1       ;PAPER TAPE PUNCH
11758 IFN IMXP,   XX 4,IMX,IMPXDN,SNIMPX,1    ;INPUT A/D MULTIPLEXOR
11759 IFN OMXP,   XX 4,OMX,OMPXDN,SNOMPX,1    ;OUTPUT A/D MULTIPLEXOR
11760         XX 3,CLO,DCLUAI,SNCLK,7         ;CORE LINK INPUT
11761         XX 3,CLO,DCLBO,SNCLK,10         ;CORE LINK OUTPUT
11762 IFN PTRP,   XX 5,PTR,REDUAI,SNPTR,1     ;PAPER TAPE READER
11763 IFN 340P,   XX 4,DIS,DN340B,SN340,2     ;340 DISPLAY
11764 ;IFN 340P,  XX 1,IDS,DN340I,SN340I,2    ;340 INTERPRETIVE DISPLAY
11765 IFN CODP,   XX 2,COD,CODDN,SNCOD,1      ;CODE
11766         XX 6,DSK,DQUAI,SN2311,11        ;DISK
11767 IFN VIDP,   XX 4,TVC,DNVDIU,SNBAT,2     ;TV CAMERA
11768 IFN PDP6P,  XX 4,PDP,PDPUIO,SNPDP,5     ;PDP-6 DEVICE
11769 IFN TABP,   XX 2,TAB,DTABUI,SNTAB,2     ;TABLET
11770 IFN NMTCS,  XX 6,MT0,MTUAIX,SNMTC,%%MT  ;MAGTAPE
11771         XX 6,JOB,JDUAI,SNJOB,12         ;JOB DEVICES
11772         XX 6,BOJ,BDUAI,SNBOJ,13         ;BOJ DEVICE
11773         XX 1,IIP,IIOPOP,0,2             ;INTERRUPT-ON-IOPOP DEVICE
11774         XX 1,SPY,ISPY,SNSPY,20          ;SPY
11775 REPEAT 2,[
11776         XX 1,STY,,SNSTY,14              ;STY INPUT
11777         XX 1,STY,,SNSTY,15              ;STY OUTPUT
11778 ]
11779 IFN NCPP,  XX 4,NET,NETDUI,SNNET,%%NET  ; Arpanet NCP
11780 IFN TCPP,  XX 4,TCP,TCPDUI,SNTCP,%%TCP  ; Internet TCP
11781 IFN INETP, XX 1,IPQ,IPQDN,SNIPQ,%%IPQ   ; Internet Queue
11782 IFN MSPP,  XX 1,MSP,MSPIO,SNMSP,2       ;MS SWITCH HACK
11783 IFN STKP,  XX 1,STK,STKDP,SNSTK,2       ;STANFORD KEYBOARD
11784 IFN NTYP,  XX 4,NTY,NTYIT,SNNUL,2       ;NTY 11 KLUDGE
11785
11786 IFN .-DCHSTB-LIOTTB,.ERR BARF AT DCHSTB
11787 EXPUNGE XX,%%UBI,%%MT,%%UTP,%%OLP,%%NET,%%TCP,%%CHA,%%IPQ
11788
11789 DCHSTE==.-1     ;END FOR GETSYS (CHDEVS)
11790 \f
11791 ;RSTB - INDEXED BY IOTTB INDEX FROM RH(IOCHNM)
11792 ;THIS TABLE IS IN 5-BIT BYTES; THE VALUES ARE THE INDICES
11793 ;INTO THE RSTB1 AND DFRCTB TABLES.
11794 .SEE RSTB       ;ASSEMBLED SECOND TO GET VALUES OF TEMPORARY %%dev SYMBOLS.
11795
11796 ;RSTB1 - INDEX FROM RSTB (BELOW)
11797 ;LH IOPUSH/POP ROUTINE, RH RESET ROUTINE
11798 RSTB1:  CPOPJ,,CPOPJ    ;0 RANDOM DEVICE
11799         TYIIOP,,TYIRS   ;1 TTY INPUT
11800         TYOIOP,,TYORS   ;2 TTY OUTPUT
11801         CPOPJ,,USRST    ;3 USR DEVICE
11802         CPOPJ,,JBIRS    ;4 JOB INPUT
11803         CPOPJ,,JBORS    ;5 JOB OUTPUT
11804         IIOPPR,,[JRST 4,CPOPJ]  ;6 INTERRUPT ON IOPOP DEVICE
11805         STYIIP,,STYIRS  ;7 STY INPUT
11806         STYOIP,,STYORS  ;10 STY OUTPUT
11807         CPOPJ,,CPOPJ    ;11 DISK OUTPUT
11808         DIRHIP,,CPOPJ   ;12 DIRHNG
11809         CPOPJ,,TRPDEV   ;13 TRAP
11810         OFFSET -RSTB1   ;OPTIONAL DEVICES BEGIN HERE
11811 IFN KS10P, %%UBI:: UBIIOP,,CPOPJ
11812 IFN OLPTP, %%LPT:: CPOPJ,,LPTRS
11813 IFN NLPTP, %%NLP:: CPOPJ,,NLPTRS
11814 IFN PLTP,  %%PLT:: CPOPJ,,PLTRS
11815 IFN PTRP,  %%PTR:: CPOPJ,,PTRRS
11816 IFN PTRP,  %%PTP:: CPOPJ,,PUNCLR
11817 IFN IMXP,  %%IMX:: CPOPJ,,IMPXRS
11818 IFN 340P,  %%340:: CPOPJ,,DSIZAP
11819 IFN CODP,  %%COD:: CODIOP,,CODRS
11820 IFN PDP6P, %%PDP:: PDPIOP,,PDPRST
11821 IFN TABP,  %%TAB:: CPOPJ,,TABCLR
11822 IFN NCPP,  %%NET:: NETIOP,,NETRS
11823 IFN TCPP,  %%TCP:: TCPIOP,,TCPRST
11824 IFN INETP, %%IPQ:: IPQIOP,,IPQRST
11825 IFN STKP,  %%STK:: CPOPJ,,STKRS
11826 IFN CHAOSP,%%CHA:: CHAIOP,,CPOPJ
11827         OFFSET 0
11828
11829 ;DFRCTB - INDEX FROM RSTB (BELOW)
11830 ;LH FORCE ROUTINE, RH FINISH ROUTINE
11831 DFRCTB: OPNL34,,OPNL34  ;0 RANDOM DEVICE
11832         OPNL2,,OPNL2    ;1 TTY INPUT (ILLEGAL)
11833         POPJ1,,TTYFIN   ;2 TTY OUTPUT
11834         OPNL34,,OPNL34  ;3 USR
11835         OPNL2,,OPNL2    ;4 JOB (SHOULDN'T GET HERE?)
11836         OPNL22,,OPNL22  ;5 JOB (SHOULDN'T GET HERE?)
11837         OPNL22,,OPNL22  ;6 IIP (SHOULDN'T GET HERE)
11838         OPNL2,,OPNL2    ;7 STY INPUT (ILLEGAL)
11839         POPJ1,,STYFIN   ;10 STY OUTPUT
11840         QSKFRC,,QSKFIN  ;11 DISK OUTPUT
11841         OPNL34,,OPNL34  ;12 DIRHNG
11842         TRPDEV,,TRPDEV  ;13 TRAP
11843         OFFSET -DFRCTB  ;OPTIONAL DEVICES BEGIN HERE
11844 IFN KS10P, %%UBI:: OPNL34,,OPNL34
11845 IFN OLPTP, %%LPT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11846 IFN NLPTP, %%NLP:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11847 IFN PLTP,  %%PLT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11848 IFN PTRP,  %%PTR:: OPNL34,,OPNL34
11849 IFN PTRP,  %%PTP:: POPJ1,,PUNFIN
11850 IFN IMXP,  %%IMX:: OPNL34,,OPNL34
11851 IFN 340P,  %%340:: OPNL34,,OPNL34
11852 IFN CODP,  %%COD:: POPJ1,,CODFIN
11853 IFN PDP6P, %%PDP:: OPNL34,,OPNL34
11854 IFN TABP,  %%TAB:: OPNL34,,OPNL34
11855 IFN NCPP,  %%NET:: NETFRC,,NETFIN
11856 IFN TCPP,  %%TCP:: TCPFRC,,TCPFIN
11857 IFN INETP, %%IPQ:: IPQFRC,,IPQFIN
11858 IFN STKP,  %%STK:: OPNL34,,OPNL34
11859 IFN CHAOSP,%%CHA:: CHAFRC,,CHAFIN
11860         OFFSET 0
11861 \f
11862 ;TABLE OF INDICES INTO THE RSTB1, DFRCTB TABLES ON THE PRECEDING PAGE
11863 ;THESE INDICES ARE UNRELATED TO THE INDICES IN DCHSTB A COUPLE PAGES BACK.
11864 ;NOTE THAT THE %% SYMBOLS ARE PURELY TEMPORARY AND EXPUNGED AT THE BOTTOM OF THIS PAGE.
11865
11866 RSTB:   .BYTE 5
11867
11868                         0       ;CHNL NOT OPEN
11869                 REPEAT 2,1      ;TTY INPUT
11870                 REPEAT 2,2      ;TTY OUTPUT
11871                 REPEAT 4,0      ;NUL DEVICE
11872                 REPEAT 4,3      ;USR DEVICE
11873                 REPEAT 2,0      ;FOREIGN USR
11874                         12      ;DIRHNG
11875                         13      ;TRAP
11876                         0       ;LOCK
11877 IFN KS10P,              %%UBI   ;UNIBUS INTERRUPT
11878 IFN CHAOSP,     REPEAT 2,%%CHA
11879 IFN NUNITS,     REPEAT 6,0      ;DEC TAPE
11880 IFN OLPTP,      REPEAT 2,%%LPT
11881 IFN NLPTP,      REPEAT 2,%%NLP
11882 IFN GLPTP,      REPEAT 2,0
11883                 REPEAT 4,0      ;DIR "DEVICE"
11884 IFN VIDP,       REPEAT 2,0
11885 IFN PLTP,       REPEAT 2,%%PLT
11886 IFN PTRP,       REPEAT 5,%%PTP
11887 IFN IMXP,       REPEAT 4,%%IMX
11888 IFN OMXP,       REPEAT 4,0
11889                 REPEAT 6,0      ;CORE LINK.
11890 IFN PTRP,       REPEAT 5,%%PTR
11891 IFN 340P,       REPEAT 4,%%340
11892 ;IFN 340P,              0
11893 IFN CODP,       REPEAT 2,%%COD  ;CODE
11894                 REPEAT 3, 0 ? 11 ;DISK IN, DISK OUT
11895 IFN VIDP,       REPEAT 4,0
11896 IFN PDP6P,      REPEAT 4,%%PDP  ;PDP-6 DEVICE
11897 IFN TABP,       REPEAT 2,%%TAB
11898 IFN NMTCS,      REPEAT 6,0      ;MAGTAPE
11899                 REPEAT 3,[4
11900                           5
11901                 ]               ;JOB
11902                 REPEAT 3,[0     ;BOJ INPUT
11903                           0     ;BOJ OUTPUT
11904                 ]               ;BOJ
11905                         6       ;INTERRUPT ON IOPOP DEVICE
11906                         0       ;SPY
11907                 7 ? 10 ? 7 ? 10 ;PSEUDO-TTY
11908 IFN NCPP,       REPEAT 4,%%NET  ;NET RESET INR/INS
11909 IFN TCPP,       REPEAT 4,%%TCP  ; TCP RESET
11910 IFN INETP,      %%IPQ           ; Internet Queue
11911 IFN MSPP,               0       ;MS SWITCH HACK
11912 IFN STKP,               %%STK   ;STANFORD KEYBOARD
11913 IFN NTYP,       REPEAT 4,0      ;NTY 11 KLUDGE
11914
11915 IFN LIOTTB-.BYTC,.ERR BARF AT RSTB
11916         .BYTE
11917 EXPUNGE %%UBI,%%LPT,%%NLP,%%PLT,%%PTR,%%PTP,%%IMX,%%340,%%COD,%%PDP,%%TAB,%%NET,%%TCP,%%STK,%%CHA,%%IPQ
11918 \f
11919 DEFINE DVHR X,Y
11920 X!Y!TERMIN
11921
11922 DEFINE DV NAME,OPNRTE,BITS,TAG
11923         SIXBIT/NAME/
11924 DVHR [DEFINE DVHR X,Y
11925 X!][TAG BITS,,OPNRTE
11926 Y!TERMIN]
11927 TERMIN
11928
11929 ;DEVICE TABLES FOR AOPEN
11930 ;
11931 ;DEVTAB  SIXBIT NAME
11932 ;DEVADR
11933  %DVIN==400000  ;4.9 DEVICE CAN DO INPUT
11934  %DVOUT==200000 ;4.8 DEVICE CAN DO OUTPUT
11935  %DVDIR==100000 ;4.7 DEVICE CAN GIVE DIRECTORY
11936  %DVDEL==40000  ;4.6 ALLOW DELETE/RENAME
11937  %DVLNK==20000  ;4.5 ALLOW MLINK
11938                 ;RIGHT HALF, OPEN ROUTINE ADDRESS
11939 %DV==1,,520000  ;BIT TYPEOUT MASK
11940
11941 DEVTAB:
11942 IFN NLPTP,      DV LPT,NLPTO,%DVOUT
11943 IFG OLPTP-NLPTP,DV LPT,LPTO,%DVOUT
11944 IFG LPTP-1,     DV OLP,LPTO,%DVOUT
11945 IFN GLPTP,      DV LPT,GLPTO,%DVOUT
11946 IFN TTLPTP,     DV LPT,LPTO,%DVOUT
11947
11948                 DV DSK,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAQSK:
11949                 DV COM,COMO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11950         MNAME [ DV ],QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK     ;"AI:" ON
11951                                                                 ; AI, ETC.
11952                 DV SYS,SYSO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11953                 DV DNRF,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11954                 DV DNR,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11955                 DV DIRHNG,DIRHO,%DVIN
11956                 DV TRAP,TRPDEV,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11957                 DV LOCK,LCKO,%DVOUT
11958                 DV UBI,UBIO,%DVIN
11959                 DV TTY,TTYO1,%DVIN+%DVOUT+%DVDIR
11960                 DV NUL,NULO,%DVIN+%DVOUT
11961                 DV USR,USRO,%DVIN+%DVOUT
11962 IFN VIDP,       DV NVD,NVIDI,%DVIN+%DVOUT
11963 IFN CHAOSP,     DV CHAOS,CHASO,%DVIN+%DVOUT
11964 IFN NCPP,       DV NET,NETO,%DVIN+%DVOUT
11965 IFN TCPP,       DV TCP,TCPO,%DVIN+%DVOUT
11966 IFN INETP,      DV IPQ,IPQO,%DVIN+%DVOUT
11967 IFN MSPP,       DV IPC,IPCO,%DVIN+%DVOUT
11968                 DV STY,STTYO,%DVIN+%DVOUT
11969                 DV JOB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAJOB:
11970                 DV BOJ,BOJO,%DVIN+%DVOUT
11971                 DV OJB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11972 IFN STKP,       DV STK,STKO,%DVIN
11973 IFN PLTP,       DV PLT,PLOTO,%DVOUT
11974 IFN PLTP,       DV IPL,IPLO,%DVOUT              ;INTERPRETED PLOTTER
11975 IFN XGP,        DV XPL,XPLO,%DVOUT
11976 IFN IMXP,       DV IMX,IMPXO,%DVIN
11977 IFN OMXP,       DV OMX,OMPXO,%DVOUT
11978 IFN PTRP,       DV PTR,PTRO,%DVIN
11979 IFN PTPP,       DV PTP,PTPO,%DVOUT
11980 IFN 340P,       DV DIS,DISO,%DVOUT              ;340 AS OUTPUT DEVICE
11981 ;IFN 340P,      DV IDS,IDISO,%DVOUT             ;340 AS INTERPRETED DISPLAY
11982                 DV CLU,CLUO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11983                 DV CLO,CLOO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11984                 DV CLI,CLIO,%DVOUT+%DVDIR+%DVDEL
11985                 DV CLA,CLAO,%DVIN+%DVDIR+%DVDEL
11986 IFN CODP,       DV COD,CODO,%DVOUT
11987 IFN VIDP,       DV TVC,TVCO,%DVIN+%DVOUT
11988                 DV ERR,ERRO,%DVIN
11989 IFN TPLP+TTLPTP&DEMON, DV TPL,TPLO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11990 IFN TABP,       DV TAB,TABO,%DVIN
11991                 DV SPY,SPYO,%DVIN
11992                 DV COR,CORO,%DVDIR              ;DIR=LAST LINE OF TTY^F
11993 IFN NTYP,       DV NTY,NTYOPN,%DVIN+%DVOUT      ;NTY 11 KLUDGE
11994
11995 NDEVS==.-DEVTAB
11996
11997 DVT1:           DV TTY,TTYO,%DVIN+%DVOUT+%DVDIR
11998                 DV TY,TTYO,%DVIN+%DVOUT+%DVDIR
11999                 DV T,TTYO,%DVIN+%DVOUT+%DVDIR
12000 IFN NUNITS,     DV UT,UTO,%DVIN+%DVOUT+%DVDIR+%DVDEL,DVAUT:
12001                 DV STY,STTYOA,%DVIN+%DVOUT
12002                 DV ST,STTYOA,%DVIN+%DVOUT
12003                 DV S,STTYOA,%DVIN+%DVOUT
12004                 DV DSK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK  ;PARTICULAR UNIT
12005                 DV DK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK   ;PARTICULAR UNIT
12006                 DV PK,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK   ;PARTICULAR PACK
12007                 DV P,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK    ;PARTICULAR PACK
12008 IFN NMTCS,      DV MT,MAGTO,%DVIN+%DVOUT        ;MAGTAPE
12009
12010 NDV1==.-DVT1
12011 EDEVS==.-1      ;END FOR GETSYS (DEVS)
12012
12013 DEVADR: DVHR
12014 IFN .-DEVADR-NDEVS-NDV1,.ERR DVHR LOST
12015 \f
12016 SUBTTL .OPER, .CALL DISPATCH
12017
12018 AOPER:  MOVE J,R        ;AC FIELD OF UUO
12019         ADDI R,IOCHNM(U)        ;SET UP IO CHANNEL REFERENCE POINTER
12020         CAIL C,MXOPR    ;SKIP IF UUO E FIELD IS LESS THAN MAX OPR
12021         JRST ILUUO      ;ILLEGAL OPER
12022         JRST @OPRDSP(C) ;LEGAL OPER-- DISPATCH ON E FIELD OF UUO
12023
12024 OPRDSP: ILUUO
12025         OPRIRP A!X      ;AITYI,ALISTEN,ASLEEP,ETC.
12026
12027 ;
12028 ;CALL DISPATCH
12029 ;
12030 ACALL:  MOVE B,C        ;SET UP COPY OF ERR ADR NOT TO BE RELOCATED
12031         JRST @CALDIS(R) ;DISPATCH INDEX OF UUO'S AC FIELD
12032
12033 CALDIS: ASYSC
12034         ADISMIS
12035         ALOSE
12036         ATRANAD
12037         AVALRET ;4
12038         AUTRAN
12039         UACORE
12040         ATRNDL
12041         ADSTART ;10
12042         AFDELE
12043         ADSTL
12044         ASUSET
12045         ALTPEN  ;14
12046         AVSCAN
12047         APOTSET
12048 REPEAT 20-.+CALDIS,ILUUO
12049 \f
12050 SUBTTL MISCELLANEOUS UUO'S
12051
12052 ;SHUT DOWN SYSTEM
12053
12054 ASHUTD: UMOVE C,(J)             ;Arg is time to down in thirtieths.
12055         JUMPL C,AREVIV          ;Negative time means REVIVE.
12056         CAMG C,[43200.*30.*60.] ;If time is longer than thirty days
12057          CAIGE C,5*60.*30.      ; or less than five minutes
12058           POPJ P,               ;   Fail (prevent clock delta-T from losing).
12059         ADD C,TIME              ;Interval+now is when we will die.
12060         PUSHJ P,SWTL            ;Seize shutdown lock.
12061             SHUTLK
12062         SKIPGE SHUTDN           ;Already down?
12063          JRST LSWPOP            ; Yes.
12064         PUSHJ P,CLQDEL          ;Flush obsolete clock queue entry, if any.
12065             DEDBLK
12066         MOVEM C,SHUTDN          ;Remember time we will die.
12067         SUB C,TIME              ;Interval until death.
12068         LSH C,1                 ;Time till death after next clock-queue int.
12069         MOVEM C,DEDTIM          ;Remember time until death.
12070         PUSHJ P,DEATHX          ;Make DEATH entry on clock queue.
12071          BUG                    ; DEDTIM says time to die already?
12072         JRST LSWPJ1             ;Unlock shutdowns.
12073
12074 ;READ TIME TILL SYSTEM DOWN
12075
12076 ADIETI: XCTR XW,[SETOM (J)]     ;READ -1 IF NOT GOING DOWN
12077         SKIPG A,SHUTDN
12078          POPJ P,                ;NOT DYING
12079         SUB A,TIME
12080         JRST APTUAJ             ;GIVE TO USER
12081
12082 ;REVIVE SYS
12083
12084 AREVIV: PUSHJ P,SWTL
12085             SHUTLK
12086         SKIPN SHUTDN
12087          JRST LSWPOP            ;NOT DYING
12088         PUSHJ P,CLQDEL
12089             DEDBLK
12090         SETZM SHUTDN
12091         SETZM DEDTIM
12092         PUSHJ P,DEATHM
12093         JRST LSWPOP
12094
12095 ;FROM CLOCK QUEUE BLOCK
12096
12097 DEATHZ: PUSHJ P,DEATHX
12098          SKIPA
12099           JRST CLQRET
12100         MOVSI T,SCLOUT
12101         PUSHJ P,SUPSET  ;DIE
12102         SETOM DEDTIM
12103         JRST CLQRET
12104
12105 ;GET VARIOUS SYS STATUS
12106
12107 ASSTAT: CONO PI,CLKOFF
12108         SKIPLE A,SHUTDN
12109          SUB A,TIME
12110         SKIPG SHUTDN
12111          SUBI A,1       ;TIME TILL DOWN IF > 0,  -1 IF UP,  -2 IF DOWN
12112         CONO PI,CLKON
12113         MOVE B,SYSDBG
12114         MOVE C,SUSRS
12115         MOVE D,PARERR
12116         ADD D,NXMERR
12117         MOVE E,TIME
12118         MOVE TT,[ITSMCH]        ;SIXBIT NAME OF THIS MACHINE.
12119         MOVE I,[ITSVRS]
12120         MOVN Q,USRHI            ;Q GETS NUMBER OF FREE JOB SLOTS
12121         IDIVI Q,LUBLK
12122         ADDI Q,MAXJ
12123         MOVE J,USRHI
12124 ASSTT1: SUBI J,LUBLK
12125         SKIPN UNAME(J)
12126          ADDI Q,1
12127         JUMPG J,ASSTT1
12128         JRST POPJ1
12129 \f
12130 SUBTTL SYMBOLIC SYSTEM CALL HANDLER
12131
12132 ;IN ORDER @A...Z[\]^_ !".../0...9:;,=.? (THAT IS IN NUMERICAL ORDER)
12133
12134 SYSCTB: SIXBIT /ACCESS/ ;IOCHNL, ADR
12135         SIXBIT /ATTACH/
12136         SIXBIT /ATTY/
12137         SIXBIT /CALL/   ;SIXBIT /<NEXT CALL>/
12138 IFN CHAOSP,[
12139         SIXBIT /CHAOSO/
12140         SIXBIT /CHAOSQ/
12141 ];CHAOSP
12142         SIXBIT /CLOSE/  ;IOCHNL
12143         SIXBIT /CNSGET/ ;GET SEMIPERMANENT TTY INFO
12144         SIXBIT /CNSSET/ ;SET SEMIPERMANENT INFO (TCMXH, TCTYP, TTYOPT, TTYCOM, ETC)
12145         SIXBIT /CORBLK/ ;HACK PAGE MAP
12146         SIXBIT /CORTYP/ ;READ STATUS OF PAGE.
12147         SIXBIT /DELETE/ ;FILE DELETE
12148         SIXBIT /DELEWO/ ;DELETE FILE OPEN ON SPEC'D CHANNEL
12149 IFN DEMON,SIXBIT /DEMSIG/       ;SIGNAL DAEMON
12150         SIXBIT /DETACH/ ;DISOWN ENTIRE TREE
12151         SIXBIT /DIRSIZ/
12152         SIXBIT /DISMIS/
12153         SIXBIT /DISOWN/ ;DISOWN AN INFERIOR JOB
12154 IFN DL10P, SIXBIT /DL10MP/
12155         SIXBIT /DSKUPD/ ;SIMULATE REFERENCE OF FILE
12156         SIXBIT /ECHOIN/ ;ECHO-NEGOTIATE
12157         SIXBIT /FILBLK/ ; READ NAME AREA OF FILE
12158         SIXBIT /FILLEN/ ;READ FILE LENGTH
12159         SIXBIT /FINISH/
12160         SIXBIT /FLAP/   ;TAPE #
12161         SIXBIT /FLUSH/  ;OLD NAME FOR FINISH, EVENTUALLY "
12162         SIXBIT /FORCE/
12163         SIXBIT /IOPOP/
12164         SIXBIT /IOPUSH/
12165         SIXBIT /IOT/    ;IOCHNL, QUAN OR BLK POINTER
12166 IFN INETP,SIXBIT /IPKIOT/
12167         SIXBIT /ITYIC/
12168         SIXBIT /JOBCAL/ ;GENERAL JOBGET
12169         SIXBIT /JOBGET/ ;JOB CHNL
12170         SIXBIT /JOBINT/ ;JOB CHNL
12171         SIXBIT /JOBIOC/
12172         SIXBIT /JOBRET/ ;JOB CHNL
12173         SIXBIT /JOBREU/
12174         SIXBIT /JOBSTS/ ;SET JOB CHNL STATUS
12175 IFN KL10P,SIXBIT /KLPERF/ ;ACTIVATE & CONTROL PERFORMANCE METER
12176         SIXBIT /LISTEN/ ;IOCHNL, ADR
12177         SIXBIT /LNKEDP/ ;DISK CH.  RETURNS NONZERO IF LINKS WERE TRACED TO OPEN IT.
12178         SIXBIT /LOAD/   ;USER CH, I/O CH, VARBLK
12179         SIXBIT /LOGIN/  ;SIXBIT /<NAME>/
12180         SIXBIT /LOGOUT/ ;. . .
12181         SIXBIT /LOSE/
12182         SIXBIT /MLINK/  ;MAKE LINK
12183 IFN NCPP,       SIXBIT /NETAC/
12184         SIXBIT /NETBLK/ ;HANG ON NCP STATE
12185 IFN IMPP,[
12186         SIXBIT /NETHST/ ;GETS STATUS OF HOST
12187         SIXBIT /NETIMP/ ;GETS STATUS OF IMP
12188 ];IMPP
12189 IFN NCPP,       SIXBIT /NETINT/
12190 IFN INETP,[     ; A temporary cond, should become permanent.
12191         SIXBIT /NETRFC/ ; Get pending request for connection
12192 ]
12193         SIXBIT /OPEN/   ;FILE OPEN
12194         SIXBIT /PDUMP/  ;USER CH, I/O CH, VARBLK
12195         SIXBIT /PGDUMP/ ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12196         SIXBIT /PGWRIT/ ;DUMP PAGE OUT OF CORE
12197 IFN CHAOSP,     SIXBIT /PKTIOT/
12198 IFN QAUTHP,     SIXBIT /RAUTH/  ;READ AUTHOR OF FILE
12199         SIXBIT /RCHST/  ;READ OPENED FILENAMES & ACCESS POINTER
12200         SIXBIT /RCPOS/  ;READ CURSOR POS
12201 IFN DEMON,SIXBIT /RDDMST/       ;READ DEAMON STATUS
12202         SIXBIT /RDMPBT/ ;READ FILE DUMPED BIT IOCHN, ADR
12203         SIXBIT /RELOAD/
12204         SIXBIT /RENAME/ ;FILE RENAME
12205         SIXBIT /RENMWO/ ;RENAME WHILE OPEN
12206         SIXBIT /REOWN/
12207         SIXBIT /RESET/
12208         SIXBIT /RESRDT/ ;RESTORE REFERENCE DATE
12209         SIXBIT /RFDATE/ ;READ TIME OF CREATION OF FILE IOCHN, ADR
12210         SIXBIT /RFNAME/ ;READ FILE NAME AND MODE CHANNEL OPEN TO
12211         SIXBIT /RFPNTR/ ;READ ACCESS POINTER
12212         SIXBIT /RQDATE/ ;READ DSK DATE
12213         SIXBIT /RSSIZE/ ;READ SCREEN SIZE
12214 IFN QAUTHP,     SIXBIT /SAUTH/  ;SET AUTHOR OF FILE
12215         SIXBIT /SCML/   ;SET # COMMAND LINES
12216         SIXBIT /SCPOS/  ;SET TTY CURSOR POSITION
12217         SIXBIT /SDMPBT/ ;SET FILE DUMPED BIT IOCHN, ADR
12218         SIXBIT /SETIOC/ ;CAUSE IO CHANNEL ERROR IN JOB/BOJ CHANNEL
12219         SIXBIT /SFDATE/ ;SET TIME OF CREATION OF FILE IOCHN, ADR
12220         SIXBIT /SIOT/   ;IOT A STRING GIVEN B.P. AND LENGTH
12221         SIXBIT /SOPEN/  ;OPEN, TAKING MODE,,CHNL AND BP.
12222         SIXBIT /SRDATE/ ;SET REFERENCE DATE
12223         SIXBIT /SREAPB/ ;SET THE DO NOT REAP BIT
12224         SIXBIT /SSERVE/ ;Set .SERVER without timing errors
12225         SIXBIT /SSTATU/ ;READS VARIOUS SYSTEM STATUS
12226         SIXBIT /STATUS/
12227 IFN DEMON,SIXBIT /STDMST/       ;SET DEAMON STATUS
12228         SIXBIT /STLGET/ ;GET INFO ON SERVER TELNET CONTROLLING A STY
12229         SIXBIT /STYGET/ ;GET INFO ABOUT SPECIFIED STY
12230 IFN NETP,SIXBIT /STYNET/        ;CONNECT STY TO NETWORK SOCKETS, FOR TELNET SERVERS.
12231         SIXBIT /T11MP/  ;TEMP ? TEN11 HACKER
12232 IFN TCPP,SIXBIT /TCPOPN/        ; Open TCP Internet connection
12233         SIXBIT /TRANAD/ ;CREATE TRANSLATION ENTRY
12234         SIXBIT /TRANCL/ ;CLEAR TRANSL. LIST(S) FOR A JOB.
12235         SIXBIT /TRANDL/ ;DELETE A TRANSL. ENTRY.
12236         SIXBIT /TRANEX/ ;READ A JOB'S TRANSL. LIST.
12237         SIXBIT /TRANS/  ;TRANSLATE A FILENAME.
12238         SIXBIT /TRPOPN/ ;OPEN TRAP DEVICE FOR AN INFERIOR
12239         SIXBIT /TTYESC/ ;SIMULATE TYPING OF ^_
12240         SIXBIT /TTYFLS/ ;FLUSH ITYIC'ED INPUT
12241         SIXBIT /TTYGET/ ;SUPPLY TTY CH, RETURNS THREE WORDS OF TTY STATUS
12242         SIXBIT /TTYSET/ ;SUPPLY TTY CH AND THREE WORDS OF TTY STATUS
12243         SIXBIT /TTYVAR/ ;HACK TTY VARIABLES
12244         SIXBIT /TVWHER/
12245         SIXBIT /UNLOCK/ ;UNLOCK A SPEC'D JOBS LOCKS.
12246         SIXBIT /USRMEM/ ;READ OR WRITE A JOB'S MEMORY.
12247         SIXBIT /USRVAR/ ;HACK USER VARIABLES
12248         SIXBIT /VIDBUF/ ;ASSIGN/DEASSIGN VIDEO BUFFER.
12249         SIXBIT /VIDSW/  ;SET VIDEO SWITCH.
12250         SIXBIT /WHOLIN/ ;GET OR SET WHO-LINE MODE AND JOB.
12251         SIXBIT /WHYINT/ ;FIND OUT WHY AN I/O CHANNEL INTERRUPTED
12252         SIXBIT /XGPIM/  ;OUTPUT TO XGP IN IMAGE MODE
12253 LSYSCT==:.-SYSCTB
12254
12255 ZZ==.-SYSCTB-1
12256 RADIX 2
12257 ZZ2==CONC [.LENGTH /]\ZZ,/
12258 RADIX 8
12259 REPEAT 1_<ZZ2>-ZZ-1,377777,,-1
12260 ;4.X BIT IMPLIES SUPPLY ROUTINE WITH POINTER TO X'TH ARG, NOT ARG ITSELF
12261 ;3.9-3.7 = MINIMUM NUMBER OF ARGS
12262 ;3.1 => DECODE 1ST ARG AS IO CHNL, LEAVING IOCHNM WD ADDR IN RH(R),
12263 ; IOCHNM WD CONTENTS IN H, CLSTB ENTRY'S LH IN LH(R).
12264 ;3.2 => NEVER PASS TO SPECIAL CHECKER FOR JOB CHNL
12265 ;3.3 => DON'T BARF IF CHNL NOT OPEN, CALLED ROUTINE WILL HANDLE IT
12266
12267 ;# ARGS ACTUALLY SUPPLIED IN W WHEN DISPATCHING THRU SYSCTD, ARGS IN A...J
12268 SYSCTD: 200,,NACCES
12269         100,,NATTAC
12270         100,,NATTY
12271         100,,NCALL
12272 IFN CHAOSP,[
12273         200,,CHAOSO
12274         100,,CHAOSQ
12275 ];CHAOSP
12276         100,,NCLOSE(7)
12277         100,,NCNSGET
12278         100,,NCNSSET
12279         24300,,NCORBL
12280         100,,NCORTY
12281         100,,NDEL
12282         100,,DELEWO(1)
12283 IFN DEMON,100,,ADEMSIG
12284         NDETAC
12285         100,,NDIRSIZ(1)
12286         1100,,NDISMIS
12287         100,,NDISOWN
12288 IFN DL10P, 100,,DL10MP
12289         100,,ADSKUP(1)
12290         6500,,NECHOIN(1)
12291         100,,NFILBLK(1)
12292         100,,NFILLEN(1)
12293         100,,NFINIS(1)
12294 IFN NUNITS,     100,,NFLAP
12295 IFE NUNITS,     100,,OPNL1
12296         100,,NFINIS(1)  ;OLD NAME FOR FINISH, EVENTUALLY FLUSH
12297         100,,NFORCE(1)
12298         100,,NIOPOP(7)
12299         100,,NIOPUS(7)
12300         2100,,NIOT(7)   ;(7) FOR CHNL NOT OPEN TO BE IOC ERROR, (3) TO BE OPEN LOSS
12301 IFN INETP, 100,,IPKIOT(1)       ; Requires at least 1 arg
12302         100,,NITYIC
12303         100,,NJBCL(1)
12304         100,,NJBGT(1)
12305         100,,NJBINT(1)
12306         100,,NSTIOC(1)
12307         100,,NJBRT(1)
12308         20500,,NJBREU
12309         100,,NJBSTS(1)
12310 IFN KL10P,KLPERF
12311         100,,NLISTE
12312         100,,NLNKEDP(1)
12313         200,,NLOAD
12314         200,,NLOGIN
12315         ALOGOU
12316         100,,NLOSE
12317         200,,NMLINK
12318 IFN NCPP,       100,,ANETAC(1)
12319 IFE INETP,[
12320 IFE CHAOSP,     4200,,ANETBLK(1)
12321 IFN CHAOSP,     4200,,CHANBK(1)
12322 ]
12323 IFN INETP,      4200,,NETBLK(1) ; Block (.hang) on net I/O channel
12324 IFN IMPP,[
12325         100,,ANETHST
12326         ANETIMP
12327 ];IMPP
12328 IFN NCPP,       100,,NNETINT(1)
12329 IFN INETP,      100,,NETRFC
12330         200,,NOPEN
12331         4300,,PDUMP
12332         100,,NPGWRT     ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12333         100,,NPGWRT
12334 IFN CHAOSP,     200,,PKTIOT(1)
12335 IFN QAUTHP,     100,,ARAUTH(1)
12336         100,,NRCHST
12337         100,,ARCPOS
12338 IFN DEMON,100,,ARDDMST
12339         100,,NRDMPBT(1)
12340         000,,NRELOAD
12341         200,,NRNAM
12342         200,,NRNWO
12343         100,,NREOWN(3)
12344         100,,NRESET(7)
12345         100,,NRESRDT(1)
12346         100,,NRFDATE(1)
12347         100,,NRFNAM
12348         100,,NRFPNT(3)
12349         ARQDAT
12350         100,,ARSSIZ
12351 IFN QAUTHP,     200,,ASAUTH(1)
12352         200,,ASCML
12353         100,,NSCPOS
12354         200,,NSDMPBT(1)
12355         200,,NSTIOC(1)
12356         200,,NSFDATE(1)
12357         6300,,NSIOT(7)  ;(7) FOR IOC ERROR IF CHNL NOT OPEN, (3) FOR OPEN LOSS
12358         200,,NSOPEN
12359         200,,NSRDATE(1)
12360         100,,ASREAP(1)
12361         100,,NSSERV
12362         ASSTAT
12363         100,,NSTATUS(7)
12364 IFN DEMON,100,,ASTDMST
12365         100,,NSTLGT
12366         100,,NSTYGT
12367 IFN NETP,200,,NSTYNT(3)
12368         200,,NT11M
12369 IFN TCPP,500,,TCPOPN
12370         300,,NTRNAD
12371         100,,NTRNCL
12372         200,,NTRNDL
12373         200,,NTRNEX
12374         100,,NTRNS
12375         200,,TRPOPN
12376         100,,NTTYESC
12377         100,,NTTYFLS
12378         100,,ATTYGT
12379         300,,ATTYST
12380         2200,,NTTYVA
12381         100,,NTVWHERE
12382         100,,NUNLOCK
12383         2200,,NUSRME
12384         2200,,NUSRVA
12385         100,,NVDBF
12386         200,,NVIDSW
12387         100,,NWHOLI
12388         100,,NWHYINT(1)
12389         1100,,NXGPIM
12390
12391 IFN .-SYSCTD-1-ZZ,.ERR NEW SYS CALL DISPATCH LOSES!!!
12392
12393 REPEAT 1_<ZZ2>-ZZ-1,ILUUO
12394 \f
12395 ;.CALL ADR1  SKIPS UNLESS SOMETHING WRONG
12396 ;ADR1:  SETZ
12397 ;       SIXBIT /<CALL NAME>/
12398 ;       REPEAT #ARGS,BITS,, <ADDRESS OF ARGUMENT>
12399 ;       BITS=   4.9 => LAST ARG
12400 ;               4.3 - 4.1 0 = NORMAL ARG
12401 ;                         1 = IMMEDIATE
12402 ;                         2 = OUTPUT ARG
12403 ;                         3 = RETURN THE FAILURE CODE IF FAIL
12404 ;                         4 = WORD OF CONTROL BITS
12405 ;                         5 = IMMEDIATE CONTROL BITS
12406
12407 ASYSC:  PUSHJ P,ASCGRG  ;B HAS E OF UUO
12408          JRST OPNL43    ;CALL NAME UNKNOWN.
12409          JRST OPNL15    ;MORE THAN 8 ARGS
12410          JRST OPNL30    ;TOO FEW ARGS
12411         PUSHJ P,ASYSC1  ;DISPATCH TO ROUTINE.
12412          POPJ P,        ;NO SKIP - OPENL HAS ALREADY BEEN CALLED.
12413         AOS (P)         ;SKIP - PROPAGATE THE SKIP UP THE PDL
12414         MOVE U,USER     ;!!
12415         MOVE R,SYSCVL(U);SUCCESS RETURN, ZERO ERROR CODE ARG IF ANY
12416         TLNE R,%SCVER
12417          XCTR XW,[SETZM (R)]
12418         JUMPGE R,CPOPJ  ;JUMP IF NO OUTPUT VALUES WANTED
12419 SYSCPT: HRRZ W,FORTY    ;VALUES WANTED, PUT INTO USER MEMORY FROM ACS
12420         ADDI W,2
12421         MOVSI T,-8
12422 SYSCP2: UMOVE R,(W)
12423         TLNN R,1000
12424         TLNN R,2000
12425          JRST SYSCP3
12426         PUSHJ P,ASCIND
12427         MOVE J,1(T)
12428         UMOVEM J,(R)
12429         AOBJP T,CPOPJ
12430 SYSCP3: JUMPL R,CPOPJ
12431         AOJA W,SYSCP2
12432
12433 ASYSC1: MOVE T,SYSCTD(H)
12434         TLNN T,1        ;DECODE 1ST ARG AS IO CHNL?
12435          JRST (T)       ;NO, DISPATCH TO CALL.
12436         TLNE T,2        ;OK TO GIVE TO JOB CHNL CHECKER?
12437         JRST CHNDCD     ;NO - GO DECODE CHANNEL
12438         HRL J,T         ;SAVE DISPATCH ADDR
12439         HRRI T,AIOCAL   ;MAKE DECODER RETURN TO CHECK FOR JOB DEVICE
12440         JRST CHNDCD
12441
12442 NCALL:  MOVE T,A
12443         MOVE R,[B,,A]
12444         BLT R,A+6
12445         SETZM A+7       ;MAX 8 ARGS, 1 USED FOR NAME
12446         SOS W
12447         PUSHJ P,ASCRCH
12448          JRST OPNL43
12449         MOVEI J,ASYSC+2 ;LOOK LIKE PUSHJ'ED FROM ASYSC
12450         MOVEM J,(P)
12451         LDB J,[331000,,SYSCTD(H)]
12452         JUMPE J,NCALL2
12453         AOS B,FORTY
12454         JRST NCALL3     ;HE WANTS POINTERS, WE HAVE JUST VALUES.
12455                 ;MUST GET ARGS AGAIN
12456
12457 ASCRCH: MOVEI H,0
12458         REPEAT ZZ2,[CAML T,SYSCTB+1_<ZZ2-.RPCNT-1>(H)
12459         ADDI H,1_<ZZ2-.RPCNT-1>
12460         ]
12461         CAMN T,SYSCTB(H)
12462         AOS (P)
12463         POPJ P,
12464 \f
12465 ;JSP T,HERE TO DECODE IO CHNL IN A, MODIFIERS IN 3.1-3.3 OF T.
12466 ;IF RH(T) = AIOCAL, LH(J) IS REAL RETURN ADDRESS.
12467 ;RETURNS IOCHNM ADDR IN RH(R), IOCHNM WD CONTENTS IN H, CLSTB BITS IN LH(R)
12468 ;CAN POPJ OUT FOR INVALID CHANNEL.
12469
12470 CHNDCD: TRNE A,-NIOCHN  ;IS 1ST ARG A LEGAL CHNL NUM?
12471          JRST OPNL14
12472         CAMN U,USER
12473          HRROM A,UUAC(U);REMEMBER CHNL # FOR IOC ERRORS, ETC.
12474         MOVEI R,(A)
12475         ADDI R,IOCHNM(U) ;YES, COMPUTE IOCHNM WD ADDR
12476         MOVE H,(R)      ;RETURN CONTENTS IN H.
12477         HLL R,CLSTB(H)  ;RETURN CLSTB BITS IN LH(R).
12478         TLNE R,%CLST
12479          JRST [ CAME U,USER     ;TRAP DEVICE
12480                  JRST .+1       ;IF CHANNEL BELONGS TO THIS USER, TRAP
12481                 JRST TRPDEV ]   ;OTHERWISE, IS PROBABLY RFNAME, LET IT THROUGH
12482         TRNN H,-1       ;IF CHNL NOT OPEN
12483          TLNE T,4       ;AND NOT SPECIALLY OK FOR THIS SYSTEM CALL
12484           JRST (T)
12485         JRST OPNL44     ;THEN BARF
12486
12487 ;JOB DEVICE CHECKER - PUT AIOCAL IN RH(T), JRST CHNDCD
12488
12489 AIOCAL: HLRZ T,J                ;GET DISPATCH ADR BACK
12490         TLNN R,%CLSJ            ;IS CHANNEL JOB DEVICE?
12491          JRST (T)               ;NO - DISPATCH
12492         HLRZS H                 ;ISOLATE JOB DEVICE INDEX
12493         DPB W,[230400,,JBSTS(H)]        ;SAVE ARG COUNT
12494         MOVNS W
12495         HRLZS W
12496         HRRI W,1                ;NOW HAVE AOBJN PNTR TO DATA
12497         MOVE T,(W)              ;COPY ARGS TO JOB AC TABLES
12498         MOVEM T,@JBACTB-1(W)
12499         AOBJN W,.-2
12500         MOVEI W,10              ;SET NON-STANDARD OP-CODE
12501         HRRM W,JBSTS(H)
12502         MOVE E,H                ;PUT JOB INDEX IN E FOR JBWT
12503         CONO PI,CLKOFF
12504 AIOCA1: PUSHJ P,JBWT            ;WAIT FOR JOB TO ANSWER
12505         MOVE H,E                ;GET JOB INDEX BACK IN H (FOR JBACTB)
12506         MOVE W,[-8,,1]          ;LOAD ANSWERS INTO ACS
12507         MOVE T,@JBACTB-1(W)
12508         MOVEM T,(W)
12509         AOBJN W,.-2
12510         LDB T,[350400,,JBSTS(H)]        ;GET SKIP COUNT
12511         JUMPN T,POPJ1                   ;SKIP COUNT NOT ZERO - SKIP
12512         LDB C,[270600,,JBSTS(H)]        ;GET OPEN LOSS CODE
12513         SKIPE C                         ;MAKE SURE IN BOUNDS
12514         CAILE C,NOPNLS
12515         MOVEI C,22
12516         JRST OPNL1-1(C) ;GO REPORT LOSSAGE AND DON'T SKIP
12517 \f
12518 ;SYSTEM CALL GET ARGS
12519 ASCGRG: UMOVE T,(B)
12520         CAME T,[SETZ]
12521          JRST ILUUO
12522         UMOVE T,1(B)
12523         MOVEM T,LSCALL(U)
12524         PUSHJ P,ASCRCH
12525          POPJ P,        ;CALL NAME UNRECOGNIZED.
12526         AOS (P)
12527         LDB J,[331000,,SYSCTD(H)]       ;GET BITS CORRESP TO ARGS WHICH SAY SUPPLY PNTR TO NTH ONE
12528 NCALL3: MOVEI W,2(B)
12529         MOVE T,[-9,,A]
12530         SETZM CTLBTS(U)
12531 ASYSC2: UMOVE R,(W)
12532         TLNE R,37
12533          PUSHJ P,ASCIND ;CALC EFFECTIVE ADDRESS
12534         TLNE R,2000
12535          JRST ASYSC3    ;OUTPUT OR ERRORCODE ARG
12536         TLNE R,4000
12537          JRST ASYSC5    ;CONTROL BITS
12538         AOBJP T,CPOPJ
12539         ROT J,-1
12540         JUMPL J,ASYSC7  ;J IF WANT ADDRESS, NOT VALUE
12541         TLNE R,1000
12542          TLZA R,-1      ;IMMEDIATE, GET 0,,ADR
12543           UMOVE R,(R)   ;ELSE GET WORD POINTED TO
12544 ASYSC7: MOVEM R,-1(T)   ;PUT INTO AC
12545         JRST ASYSC4
12546
12547 ASYSC5: TLNE R,1000     ;CTL BITS
12548          TLZA R,-1      ;IMMEDIATE, GET 0,,ADR
12549           XCTR XR,[HRRZ R,(R)]  ;ELSE WORD ADDRESS
12550         XORM R,CTLBTS(U)        ;XOR ALL THESE ARGS TOGETHER
12551 ASYSC4: XCTR XR,[SKIPL (W)]     ;SKIP IF TERMINATE BIT ON
12552          AOJA W,ASYSC2
12553         HLRE W,T
12554         ADDI W,9        ;COMPUTE NUMBER OF ARGUMENTS SUPPLIED
12555 NCALL2: LDB T,[300300,,SYSCTD(H)]
12556         SUB T,W
12557         JUMPG T,POPJ1   ;NOT ENOUGH ARGS
12558         JRST POPJ2      ;OK
12559
12560 ASYSC3: TLNE R,1000
12561          JRST ASYSC8    ;ERROR CODE ARG
12562         XCTR XRW,[MOVES (R)] ;OUTPUT ARG, JUST MAKE SURE IT'S THERE
12563         MOVSI R,%SCVOT  ;AND FLAG PRESENCE
12564 ASYSC9: IORM R,SYSCVL(U)
12565         JRST ASYSC4
12566
12567 ASYSC8: HRLI R,%SCVER   ;ERROR-CODE ARG
12568         TDNE R,SYSCVL(U);CAN'T HAVE MORE THAN ONE ERRORCODE ARG
12569          JRST CPOPJ     ;SAY "TOO MANY ARGS"
12570         XCTR XRW,[MOVES (R)] ;MAKE SURE IT'S THERE; MUSTN'T PCLSR OUT OF OPENL
12571         JRST ASYSC9
12572 \f
12573 ;PERFORM INDEXING AND INDIRECTION ON ADDRESS WORD IN R.
12574 ;DON'T CLOBBER BITS 3.6 - 4.9.  SET BITS 3.1 - 3.5 TO ZERO
12575 ;PUT ADDR IN RH.
12576 ASCIND: TLNN R,37
12577         POPJ P,
12578 ASCIN1: PUSH P,R
12579         LDB R,[220400,,R]
12580         CAIE R,0
12581         XCTR XR,[HRRZ R,(R)]
12582         ADD R,(P)
12583         HLL R,(P)       ;GET ORIG @, MAY HAVE BEEN CARRIED INTO BY -1(17)
12584         TLZ R,17
12585         TLZE R,(@)
12586         UMOVE R,(R)
12587         DPB R,[2700,,(P)]
12588         POP P,R
12589         TLNN R,37
12590         POPJ P,
12591         PUSHJ P,OPBRK   ;ALLOW PCLSR
12592         JRST ASCIN1
12593
12594 TPFLT:  CONO PI,CLKOFF          ;PREVENT INTERRUPT AFTER IORM SPM ING BACK
12595                                 ; ON TOP OF 1000 BIT
12596 IFN KA10P,[
12597         SPM UPGML(U)
12598         PUSH P,B
12599         MOVSI B,1000
12600         IORM B,UPQUAN(U)
12601         POP P,B
12602         LPMRI UPGML(U)  ;TAKE TRAP, MAYBE DONT COME BACK
12603         JRST CLKONJ
12604 ] ;KA10P
12605 IFN KL10P,[
12606         POP P,PFOPC1    ;IF RESTART FAULT, RETURN FROM TPFLT
12607         JRST TPFLT1     ;JOIN REGULAR PAGE FAIL CODE
12608 ] ;KL10P
12609 IFN KS10P,[
12610         POP P,EPTPFO            ; If fault returns, just return from TPFLT
12611         JRST TPFLT1
12612 ] ;KS10P
12613 \f
12614 SUBTTL PURE DUMP
12615
12616 ;`PDUMP' SYMBOLIC SYSTEM CALL
12617 ; ARG 1 - JOB SPEC FOR JOB TO BE DUMPED
12618 ; ARG 2 - DISK CHANNEL TO DUMP ONTO
12619 ; ARG 3 - STATE WORD (MODIFIED) INITIALLY 0, THEN 4.9 + PAGE # ABOUT TO DUMP
12620
12621 PDUMP:  MOVE J,A
12622         JSP T,NCRUI2    ;DECODE JOB SPEC (1ST ARG)
12623          JFCL
12624         MOVE A,J
12625         JUMPL J,OPNL31  ;CAN'T PDUMP THE PDP6.
12626         MOVE D,B
12627         JSP T,PDUMDC    ;DECODE 2ND ARG, B-> IOCHNM WORD.
12628         TLNN J,%CLSQO
12629          JRST OPNL34    ;NOT DISK WRITE CHANNEL.
12630         HRRZM D,UUAC(U) ;SO SET IN CASE OF ERROR
12631         HLRZ D,(B)
12632         MOVEM D,SRN3(U) ;REMEMBER DISK CHANNEL NUMBER FOR LATER.
12633         PCLT
12634         XCTR XRW,[MOVES D,(C)]
12635         MOVEM C,SRN4(U) ;REMEMBER STATE WORD ADDRESS FOR LATER
12636         MOVEM A,EPDL(U) ;USER INDEX
12637 PDUMA:  CAIN A,(U)      ;IF PDUMP'ING SELF, MUSTN'T PCLSR,
12638          PUSHJ P,NULSET ;SO DO A NULSET INSTEAD OF THE SOSSET
12639         CAIN A,(U)
12640          JRST PDUMP9    ;SO THAT A LSWPOP CAN BE DEON AT THE END IN EITHER CASE.
12641         PUSHJ P,RPCLSR  ;HACKING ANOTHER JOB: STOP IT.
12642         PUSHJ P,SOSSET
12643           USTP(A)
12644 PDUMP9: MOVE A,SRN3(U)  ;GET DISK CHANNEL NUMBER
12645         MOVE C,SRN4(U)
12646         UMOVE D,(C)     ;PICK UP STATE WORD
12647         JUMPN D,PDUMP5  ;JUMP IF ALREADY WROTE MAP PAGE
12648         PUSHJ P,PDBWG   ;GET BUFFER AND COMMIT DISK TRACK FOR MAP PAGE
12649         SETZM (E)       ;CLEAR FIRST WORD OF MAP
12650                         ;AND DROP INTO PDUMP4
12651 ;HANDLE THE NEXT PAGE.
12652 PDUMP4: PUSHJ P,PUPLC   ;GET BYTE POINTERS
12653         LDB W,Q         ;CIRC POINTER ENTRY
12654         LDB R,T         ;PAGE MAP ENTRY
12655         ANDCMI R,PMAGEM ;CLEAR AGE BITS
12656         CAIN W,-1
12657          TLO R,(SETZ)   ;ABS PAGE
12658         SKIPN W
12659          MOVEI R,0      ;PAGE NON-EXISTANT
12660         TRNN R,600000
12661          LSH R,16.      ;SWAPPED OUT
12662         MOVE W,D        ;VIRTUAL PAGE NUMBER
12663         ADDI W,1(E)     ;ADDRESS OF ENTRY IN BLOCK
12664         MOVEM R,(W)     ;STORE ENTRY
12665         CAIGE D,377
12666          AOJA D,PDUMP4
12667         HRLI W,1(W)
12668         SETZM 1(W)
12669         HRRI W,2(W)
12670         BLT W,1777(E)
12671         MOVE D,EPDL(U)
12672         MOVEI W,1000(E) ;1000-1017 ACS
12673         CAMN D,U
12674          JRST [ XCTR XBR,.+2
12675                 JRST .+3]
12676         HRLI W,AC0S(D)
12677         BLT W,1017(E)
12678         PUSHJ P,QSBWW
12679         SETZM QSMPRC(A) ;SO NEXT IOT GETS A NEW BUFFER
12680         MOVSI D,(SETZ)  ;SET STATE WORD TO `DUMPING PAGE 0'
12681 ;DROPS THROUGH
12682 \f;DROPS IN
12683 ;DUMP NEXT PAGE
12684 PDUMP5: MOVE C,SRN4(U)  ;STORE BACK STATE WORD
12685         UMOVEM D,(C)
12686 PDUMP8: PUSHJ P,PUPLC
12687         LDB W,Q
12688         CAIE W,-1
12689         SKIPN W
12690          AOJA D,PDUMP6  ;PAGE ABSOLUTE OR NONEXISTANT
12691 PDUMP3: PUSHJ P,PDBWG   ;GET BUFFER AND COMMIT DISK TRACK TO DUMP THIS PAGE INTO
12692         MOVE J,EPDL(U)  ;SET UP MAP TO POINT TO USER BEING DUMPED
12693         PUSHJ P,MPLDJ
12694         HRLZ J,D        ;GET VIRTUAL ADDRESS OF PAGE BEING DUMPED
12695         LSH J,10.
12696         HRR J,E         ;BLT POINTER TO COPY THE PAGE
12697         XCTR XBR,[BLT J,1777(E)]        ;COPY PAGE INTO DISK BUFFER
12698         PUSHJ P,MPLDZ   ;RESTORE TO NORMAL MAP
12699         PUSH P,D
12700         PUSHJ P,QSBWW   ;WRITE OUT THE COPIED PAGE
12701         SETZM QSMPRC(A) ;SO NEXT IOT GETS NEW BUFFER
12702         POP P,D
12703         AOS D           ;DONE WITH THIS PAGE
12704 PDUMP6: TRNN D,400      ;SKIP IF FINISHED WHOLE ADDRESS SPACE
12705          JRST PDUMP5
12706         JRST LSWPJ1     ;UNSTOP USER AND POPJ1
12707
12708 ;ROUTINE TO GET DISK BUFFER AND COMMIT TRACK (FOR PDUMP)
12709 ;RETURNS BUFFER ADDRESS IN E.  PRESERVES D.
12710
12711 PDBWG:  SKIPL E,QSMDN(A)        ;GET CORE BLOCK # OF DISK BUFFER
12712          JRST [ LSH E,10.       ;CONVERT TO ADDRESS
12713                 POPJ P, ]
12714         MOVE E,[444400,,1]      ;NO BUFFER, GET ONE
12715         MOVEI B,QBOV
12716         PUSHJ P,QSBWG
12717          PUSHJ P,UDELAY         ;CAN'T GET MEMORY, WAIT A WHILE
12718         JRST PDBWG
12719
12720 ;ROUTINE TO LOOK UP PAGE (FOR PDUMP AND PURE LOAD)
12721 ;PAGE# IN RH(D), USER# IN EPDL(U).  RESULTS FROM UPLC IN Q AND T.
12722
12723 PUPLC:  PUSH P,A
12724         PUSH P,U
12725         MOVE U,EPDL(U)
12726         MOVE A,D
12727         ANDI A,377
12728         PUSHJ P,UPLC
12729         POP P,U
12730         JRST POPAJ
12731
12732 ;DECODE 2ND ARG TO PDUMP & LOAD.
12733 ;B GETS IOCHNM WORD ADDR, LH OF J GETS LH OF CLSTB ENTRY, RH GETS LH(IOCHNM).
12734
12735 PDUMDC: TRNE B,-NIOCHN
12736          JRST OPNL14
12737         ADDI B,IOCHNM(U)
12738         HRRZ J,(B)
12739         HLLZ J,CLSTB(J)
12740         HLR J,(B)
12741         JRST (T)
12742 \f
12743 SUBTTL PURE AND SBLK LOAD
12744
12745 ;`LOAD' SYMBOLIC SYSTEM CALL
12746 ; ARG 1 - JOB SPEC FOR JOB TO BE LOADED
12747 ; ARG 2 - DISK CHANNEL TO LOAD FROM
12748 ; ARG 3 - (OPTIONAL) FIRST ADDR,,LAST ADDR TO BE LOADED
12749 ;         OR ZERO => LOAD ONLY PURE PAGES
12750 ;         WHEN LOADING A PDUMPED FILE, FIRST,,LAST ROUNDED OFF TO PAGES
12751 ; DEFAULT 3RD ARG IS 0,,-1 NORMALLY, 20,,-1 LOADING SELF, 20,,37777 LOADING PDP6
12752
12753 ;PAGE WORD
12754 ;4.9=1 ABSOLUTE, 1.1-2.9 = PTW
12755 ;4.8=1 SHARED WITH OTHER PAGES AT LEAST ONE OF WHICH IS WRITE
12756 ;4.7=1 LINK WITH VIRT PG IN RH 1.8-1.1
12757 ;2.9-2.8 0 NXM, 1 RD ONLY, 2 OR 3 READ/WRITE
12758 ;2.7=1 WORD ALREADY PROCESSED
12759
12760 NLOAD:  MOVE J,A
12761         JSP T,NCORUI    ;DECODE THE JOB SPEC.
12762          JRST NLOAD6     ;JOB GUARANTEED WRITEABLE.
12763         JSP T,NCORWR    ;ELSE CHECK IF WRITEABLE.
12764          CAIN J,-1      ;BUT CAN WRITE PDP6.
12765           CAIA
12766            JRST OPNL31  ;NOT WRITEABLE.
12767 NLOAD6: HRREI A,(J)     ;MAKE SURE EXTEND SIGN IF PDP6.
12768         JSP T,PDUMDC    ;DECODE 2ND ARG.
12769         TLNN J,%CLSQO
12770          TLNN J,%CLSQ
12771           JRST OPNL34   ;NOT DISK READ CHANNEL.
12772         LDB J,[QSBSIZ(J)]
12773         CAIE J,36.
12774          JRST OPNL12    ;"MODE NOT AVAILABLE" IF CHANNEL NOT 36-BIT BYTES.
12775         MOVE R,B        ;IOCHNM ADDRESS IN CASE WE GET TO QICL
12776         JUMPL A,NLOADE  ;DONT STOP THE 6
12777         CAMN A,U
12778          JRST NLOADA    ;DONT STOP IF LOADING INTO SELF
12779         PUSHJ P,RPCLSR
12780         PUSHJ P,LSWPOP  ;SOS JOB'S DIELOK - IT CAN'T DIE WHILE STOPPED.
12781         MOVSI T,BSSTP   ;STOPPING WITH BSSTP INSTEAD OF RH OF USTP
12782         IORM T,USTP(A)  ;AVOIDS DEADLY EMBRACE WITH CORE JOB (SEE CUSTOP)
12783         SOS USTP(A)
12784         PUSHJ P,LOSSET  ;ARRANGE TO CLEAR BSSTP ON PCLSR.
12785             NLUPCL
12786         CAIGE W,3
12787          HRLOI C,0      ;DEFAULT 3RD ARG
12788         JRST NLOADE
12789
12790 NLOADA: PUSHJ P,LSWPOP  ;DIELOK
12791         CAIGE W,3
12792          HRLOI C,20     ;DEFAULT 3RD ARG
12793 NLOADE: MOVEM A,SRN3(U) ;SAVE USER INDEX (-1 => PDP6)
12794 IFN PDP6P,[
12795         JUMPL A,[HLRZ A,C       ;PDP6, ENSURE LIMITS SMALL ENOUGH
12796                 CAIGE A,20
12797                  HRLI C,20      ;ACS NOT ACCESSIBLE
12798                 MOVEI A,LPDP6M*2000-1
12799                 CAIGE A,(C)
12800                  HRR C,A        ;HAS ONLY 16K MEMORY
12801                 JRST .+1]
12802 ]
12803         HLRZ A,(B)
12804         MOVEM A,SRN4(U) ;SAVE # OF DISK CHANNEL
12805         SETZM SRN5(U)   ;START LOADING AT VIR PG #0
12806         MOVEM C,EPDLT1(U) ;SAVE LOAD LIMITS
12807         HLRZ D,C
12808         CAILE D,(C)
12809          JRST OPNL33    ;FIRST > LAST
12810         HLRZ C,QPCLSR(A)
12811         JUMPE C,NLOADD
12812         HRRZ Q,SRN3(U)
12813         CAIN C,(Q)
12814          JRST NLDSBB    ;(COMING BACK AFTER PCLSR)
12815         SETZM QPCLSR(A)
12816 ;DROPS THROUGH
12817 \f;DROPS IN
12818 ;GET FIRST BLOCK OF FILE BEING LOADED
12819 NLOADD: CAMN U,PCLUSR
12820         SETZM PCLIDX
12821         SKIPL TT,QSMDN(A)
12822          JRST NLOADB
12823         PCLT
12824         SKIPG QSBFS(A)
12825          PUSHJ P,UFLS   ;HANG UNTIL A BLOCK IS READ IN
12826         MOVE Q,QSRAC(A)
12827         TLNE Q,%QAACC+%QAMPU+%QAPAR
12828          JRST OPNL7     ;LOST ONE WAY OR ANOTHER
12829         MOVE E,[444400,,1]
12830         MOVEI B,QBIV
12831         PUSHJ P,QSBGB   ;SET UP CHNL AREA. TT ADDR OF FIRST WORD OF BLOCK
12832          BUG
12833          JRST NLOADC    ;QSBGB SKIPS FOR NORMAL RETURN
12834          JRST OPNL46    ;SKIPPED TWICE => EOF
12835
12836 NLOADB: MOVE J,QMPBSZ(A)
12837         LSH TT,10.
12838 NLOADC: SKIPE (TT)      ;SKIP IF PURE DUMPED FILE
12839          JRST NLDSB     ;SBLK
12840         SKIPGE SRN3(U)
12841          JRST OPNL34    ;TRYING TO PURE LOAD PDP6
12842         MOVSI Q,%QAACC  ;WILL GO RANDOM ACCESSING THROUGH FILE
12843         IORM Q,QSRAC(A) ;THIS ALSO INHIBITS ACTIVATION AT PI LEVEL
12844         HLRZ H,EPDLT1(U);LOW LOAD BOUNDARY
12845         SKIPE EPDLT1(U)
12846          CAIL H,20
12847           JRST NLOADH   ;ACS NOT BE LOADED
12848         MOVSI Q,1000(TT);ADDRESS OF DUMPED ACS
12849         HRLS H
12850         ADD Q,H
12851         HRRZ H,EPDLT1(U);HIGH LOAD BOUNDARY
12852         CAILE H,17
12853          MOVEI H,17
12854         HRRZ J,SRN3(U)  ;JOB TO BE LOADED
12855         PUSHJ P,MPLDJ
12856         XCTR XBW,[BLT Q,(H)] ;LOAD UP HIS ACS
12857         PUSHJ P,MPLDZ
12858 NLOADH: MOVEI R,1(TT)   ;ADDRESS OF FIRST WORD OF DUMPED MAP
12859         MOVEM R,EPDL3(U)        ;SAVE
12860         MOVEI Q,2000
12861         PUSHJ P,QFNTR   ;FIND DISK ADDRESS OF SECOND BLOCK
12862          JRST OPNL46    ;OFF END OF FILE
12863         SOS QSBI(A)     ;UNDO QFNTR HACK
12864         AOS QSLGL(A)
12865         PUSHJ P,QUDULK  ;UNLOCK USER DIRECTORY
12866         PUSHJ P,SWTL    ;LOCK CIRPSW
12867             CIRPSW
12868 ;DROPS THROUGH
12869 \f;DROPS IN
12870 ;HERE TO DO NEXT PAGE (WHEN LOADING PDUMPED FILE)
12871 NLOAD0: PUSHJ P,OPBRK
12872         MOVE A,@EPDL3(U)
12873         TRNE A,600000   ;SKIP IF NO ACCESS (IGNORE)
12874          TRNE A,100000
12875           JRST NLD14    ;THIS PAGE ALREADY DONE OR NO ACCESS
12876         MOVE Q,EPDLT1(U)
12877         TRNE A,400000   ;SKIP IF READ ONLY
12878          JUMPE Q,NLD14  ;IMPURE NOT BE LOADED
12879         MOVE A,SRN5(U)  ;VIRTUAL PAGE NUMBER
12880         JUMPE Q,NLD16
12881         AND Q,[-2000,,-2000]
12882         LSH Q,-10.      ;FIRST PAGE,,LAST PAGE
12883         HLRZ T,Q
12884         CAIL A,(T)
12885          CAILE A,(Q)
12886           JRST NLD14    ;PAGE OUTSIDE OF RANGE TO BE LOADED
12887 NLD16:  MOVE U,SRN3(U)  ;USER INDEX
12888         PUSHJ P,UPLC
12889         LDB R,Q         ;LOOK IN CIRCULAR POINTER ENTRY FOR THIS PAGE
12890         JUMPE R,NLOAD1  ;DOESN'T ALREADY HAVE THIS VIRTUAL PAGE
12891         PUSH P,T        ;SAVE BYTE POINTER TO PAGE MAP FOR THIS VIRTUAL PAGE
12892         PUSH P,Q        ;SAVE BYTE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12893         PUSHJ P,PAGERT  ;FLUSH THE ALREADY EXISTING VIRTUAL PAGE
12894         POP P,Q
12895         POP P,T
12896 NLOAD1: MOVE U,USER
12897         MOVE R,@EPDL3(U)        ;PICK UP DUMPED PAGE MAP WORD
12898         ANDCMI R,PMAGEM ;CLEAR AGE BITS (WOULD LOSE AT NLOAD4+4)
12899         JUMPGE R,NLOAD3 ;NOT ABSOLUTE PAGE
12900         ANDI R,PMRCM    ;ABS PG #
12901         CAIL R,TSYSM
12902 IFE PDP6P,      JRST OPNL32
12903 .ELSE [
12904         JRST [  CAIGE R,<PDP6BM_-10.+LPDP6M>
12905                  CAIGE R,<PDP6BM_-10.>
12906                   JRST OPNL32
12907                 HRRZ R,@EPDL3(U)        ;ALLOW USER TO LOAD WRITABLE PDP6 PAGES.
12908                 ANDCMI R,PMAGEM\PMUNSD  ;GIVE HIM WHATEVER ACCESS HE RQ'S.
12909                 JRST NLOAD5]]
12910 ;IFN TEN11P,[           ;NOT NECESSARY SINCE 10-11 PAGES ABOVE TSYSM NOW
12911 ;       TRNN R,400
12912 ;       JRST .+3
12913 ;       MOVE E,T11MP-400(R)
12914 ;       AOJN E,NLOAD2   ;DONT ALLOW PAGE TO POINT TO TEN11
12915 ;]
12916
12917         LDB E,[MUR,,MEMBLT(R)]
12918         CAIN E,MUHOLE
12919          TDZA R,R       ;IF PAGE NXM TODAY, DON'T ACTUALLY GIVE ACCESS
12920
12921 NLOAD5:   TRO R,200000  ;RD ONLY
12922         DPB R,T         ;STORE ENTRY IN PAGE MAP
12923         MOVEI R,-1
12924         DPB R,Q         ;STORE -1 IN CIRCULAR POINTER
12925 NLOAD2: MOVE E,SRN5(U)  ;VIRTUAL PAGE NUMBER
12926         MOVE U,SRN3(U)  ;USER INDEX LOADING INTO
12927         PUSHJ P,GHUSRA  ;RECOMPUTE HUSRAD
12928 NLD14:  MOVE U,USER
12929         MOVEI R,100000
12930         IORB R,@EPDL3(U)        ;MARK DUMPED PAGE WORD AS ALREADY DONE
12931         MOVE A,SRN4(U)  ;DISK CHANNEL
12932         TLNN R,500000   ;SKIP IF NO CORRESPONDING BLOCK IN FILE
12933         TRNN R,600000   ;SKIP IF MUST ADVANCE ONE BLOCK
12934          JRST .+3       ;DON'T ADVANCE FILE POINTER
12935           PUSHJ P,QFNTN ;ADVANCE TO NEXT DISK ADDRESS
12936            JRST OPNL46  ;PREMATURE EOF
12937         AOS R,SRN5(U)   ;NEXT VIRTUAL PAGE
12938         CAMN U,PCLUSR
12939          MOVEM R,PCLIDX
12940         AOS EPDL3(U)    ;NEXT MAP WORD
12941         CAIGE R,400
12942          JRST NLOAD0    ;LOOP
12943         PUSHJ P,LSWPOP  ;RELEASE CIRPSW
12944         MOVE B,SRN3(U)  ;USER INDEX LOADING INTO
12945         CAME B,U        ;SKIP IF LOADING INTO SELF
12946          PUSHJ P,LSWPOP ;UNSTOP USER
12947         MOVE B,QFBLNO(A)
12948         SETZM QFBLNO(A)
12949         MOVEM B,QRADAD(A)
12950         JRST POPJ1
12951 \f
12952 NLOAD3: TLNN R,100000   ;SKIP IF LINK WITH PAGE IN RH OF R
12953          JRST NLOAD4
12954         PUSH P,T        ;SAVE BYTE POINTER TO MAP ENTRY FOR THIS VIRTUAL PAGE
12955         PUSH P,Q        ;SAVE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12956         LDB A,[1700,,R] ;VIRTUAL PAGE NUMBER BEING LINKED TO
12957         CAIL A,400
12958          JRST NLOAD8    ;BAD VIRT PAGE #
12959         MOVE E,SRN5(U)  ;VIRTUAL PAGE NUMBER OF PAGE BEING LINKED
12960         MOVE U,SRN3(U)  ;USER INDEX LOADING INTO
12961         PUSHJ P,UPLC
12962         LDB W,Q         ;CIRCULAR POINTER OF OTHER ENTRY
12963         JUMPE W,NLOAD8  ;DIDN'T EXIST
12964         CAIN W,-1
12965          JRST NLOAD8    ;POINTS TO AN ABSOLUTE PAGE
12966         MOVE C,U
12967         IDIVI C,LUBLK
12968         SKIPE D
12969          BUG            ;L DOESN'T DIVIDE U
12970         LSH C,10        ;USER NUMBER _ 8
12971         TRZE C,400000
12972          BUG            ;USER INDEX WAS TOO LARGE
12973         IOR C,E         ;NEW CIRCULAR POINTER
12974         POP P,D         ;NEW CIRCULAR POINTER BYTE POINTER
12975         DPB W,D         ;STORE OTHER ENTRY AS NEW CIRCULAR POINTER ENTRY
12976         DPB C,Q         ;MAKE OTHER CIRCULAR POINTER ENTRY POINT TO NEW ONE
12977         LDB E,T         ;OTHER MAP ENTRY
12978         POP P,T         ;POINTER TO NEW MAP ENTRY
12979         ANDI R,600000   ;PROTECTION BITS
12980         TRZN E,600000
12981          JRST NLD11
12982         IOR E,R
12983         JRST NLD10
12984 NLD11:  LSH R,-20
12985         DPB R,T
12986 NLOAD9: AOS SNSWPG      ;INCR CNT OF SWAPPED OUT FOR SYS
12987         AOSA NSWPGS(U)  ;USER LOADING INTO HAS ONE MORE SWAPPED OUT PAGE
12988 NLD10:   DPB E,T
12989 NLD13:  AOS NMPGS(U)    ;USER HAS ONE MORE PAGE
12990         AOS SNMPGS      ;SYSTEM HAS 1 MORE PAGE
12991 NLD15:  MOVE U,USER
12992         JRST NLOAD2     ;RECOMPUTE HUSRAD AND LOOP
12993
12994 NLOAD4: MOVE A,SRN4(U)  ;DISK CHANNEL
12995         MOVEI TT,(R)    ;PUT DESIRED ACCESS IN RH(TT),
12996         ANDI TT,600000
12997         TDNE R,[200000,,400000]
12998          IORI TT,%CBCPY ;ALONG WITH INITIAL-SWAPIN BIT IF NEC.
12999         PUSHJ P,NCORQ7  ;FIND OR CREATE MMP ENTRY.
13000          JRST OPNL37    ;MMP FULL
13001         MOVE E,SRN5(U)  ;GET PAGE # IN JOB BEING LOADED
13002         MOVE U,SRN3(U)  ;TARGET USER.
13003         PUSHJ P,NCORR1  ;INSERT THE PAGE.
13004         JRST NLD15
13005
13006 NLOAD8: SUB P,[2,,2]
13007         JRST OPNL46
13008
13009 NLOADZ: PUSHJ P,LSWPOP  ;FREE CIRPSW
13010         MOVEI T,3
13011         CAMLE T,LMEMFR
13012          PUSHJ P,UFLS
13013         PUSHJ P,SWTL
13014             CIRPSW
13015 POPSM2: SOS (P)         ;RETURN TO LOCN BEFORE PUSHJ
13016         SOS (P)
13017         POPJ P,
13018
13019 ;QTAOS: PUSHJ P,QTLOCK  ;LOCK TUT
13020 QTAOS1: MOVE D,QSLGL(A) ;DISK TRACK
13021         PUSHJ P,TUTPNT
13022         SKIPG B
13023          BUG            ;NOT PART OF ANY FILE
13024         CAIGE B,TUTMNY
13025          AOS B
13026         DPB B,D         ;ADD ONE TO TUT ENTRY FOR THIS TRACK
13027         JRST QTULK
13028 \f
13029 NLUPCL: MOVSI T,BSSTP   ;THIS IS THE LOSSET ROUTINE TO CLEAR BSSTP.
13030         SKIPGE A,SRN3(U)
13031          BUG
13032         ANDCAM T,USTP(A)
13033         POPJ P,
13034
13035 NLDSBB: HRRZ J,SRN3(U)  ; (COMING BACK AFTER PCLSRING OUT) A HAS DSK CHNL #)
13036         PUSHJ P,MPLDJ   ;LOAD MAP (ALSO CLOBBER UMAPS)
13037         SKIPL C,SRN3(U)
13038          CAIN U,(C)
13039           JRST NLDSBH
13040         PUSHJ P,LSWPOP
13041         PUSHJ P,LOSSET
13042             NLUPCL
13043         MOVSI B,BSSTP
13044         IORM B,USTP(C)
13045 NLDSBH: HRRZ B,QPCLSR(A)
13046         JRST (B)
13047
13048 NLDSB:  SKIPN EPDLT1(U)
13049          JRST OPNL12    ;LOAD ONLY PURE FROM SBLK FILE LOSES
13050         HRLZ B,SRN3(U)
13051         HRRI B,NLDSBD
13052         MOVEM B,QPCLSR(A)       ;RESTART POINT IN CASE OF PCLSR
13053         MOVEM J,QSMPRC(A)
13054         MOVEM TT,QSMPRP(A)
13055         HRRZ J,SRN3(U)
13056         PUSHJ P,MPLDJ   ;LOAD MAP (ALSO CLOBBER UMAPS)
13057
13058 ;DROPS THROUGH
13059 \f
13060 ;DROPS IN
13061 NLDSB1: HRROI I,EPDL3(U)
13062         MOVEM I,SRN4(U) ;SET UP AOBJN PTR TO READ INTO EPDL3
13063 NLDSBD: MOVEI C,SRN4(U) ;SET C UP TO POINT TO AOBJN PTR
13064         HRLI C,(TRN)    ;INDICATE EXEC MODE ADR
13065         PUSHJ P,QBI
13066         SKIPGE SRN4(U)
13067          JRST NLDSB9    ;PREMATURE EOF
13068         MOVE I,EPDL3(U)
13069         CAME I,[JRST 1]
13070          JRST NLDSB1    ;IGNORE INITIAL STUFF UNTIL JRST 1
13071 NLDSBK: MOVEI B,NLDSBE
13072         HRRM B,QPCLSR(A)
13073 NLDSBE: HRROI I,QLDPTR(A)
13074         MOVEM I,SRN4(U)
13075         MOVEI C,SRN4(U)
13076         HRLI C,(TRN)
13077         PUSHJ P,QBI     ;GET AN AOBJN POINTER
13078         SKIPGE SRN4(U)
13079          JRST NLDSB9    ;PREMATURE EOF
13080         SKIPL B,QLDPTR(A)
13081          JRST NLDSB6    ;NOT AN AOBJN POINTER
13082         HLRZ C,EPDLT1(U);FIRST ADDRESS TO BE LOADED
13083         SUBI C,(B)
13084         JUMPLE C,NLDSB3
13085         HLROS B         ;SKIP # WDS IN C
13086         ADD B,C         ;-# WDS REMAINING IN BLOCK
13087         SKIPLE B
13088          SUB C,B        ;FLUSH WHOLE BLOCK
13089         LDB D,[1200,,QSMPRP(A)]
13090         SKIPGE QSMDN(A)
13091          MOVEI D,0
13092         ADD D,QFBLNO(A)
13093         ADD D,C         ;ADVANCE ACC PTR TO SKIP PART OR ALL OF BLOCK
13094         MOVEM D,QRADAD(A)
13095         MOVSI D,%QAACC
13096         IORM D,QSRAC(A)
13097         JUMPGE B,[AOS QRADAD(A) ;SKIPPING WHOLE BLOCK, ALSO SKIP CHECKSUM
13098                   JRST NLDSBK]  ;AND GO READ NEXT BLOCK
13099         HRLS C
13100         ADDM C,QLDPTR(A) ;UPDATE AOBJN POINTER
13101 NLDSB3: MOVEI B,NLDSBF  ;MAYBE FLUSH EXISTING MEMORY AND GET NEW
13102         HRRM B,QPCLSR(A)
13103 NLDSBF: HRRZ E,QLDPTR(A) ;START ADR OF BLOCK
13104         HLRE C,QLDPTR(A) ;-LENGTH OF BLOCK
13105         SUB E,C         ;DON'T COMBINE THIS INSN WITH NEXT, MIGHT BE MOBY BLOCK
13106         SUBI E,1        ;GET END ADR OF BLOCK
13107         HRRZ T,EPDLT1(U);HIGH LOAD LIMIT
13108         SUBM E,T        ;NUMBER OF WORDS OF EXCESS IN BLOCK
13109         MOVEM T,EPDLT2(U) ;SAVE FOR LATER USE
13110         JUMPLE T,NLDSB7 ;JUMP IF BLOCK HAS NO EXCESS
13111         SUB E,T         ;ADJUST END ADDRESS
13112         HRLZS T
13113         ADDM T,QLDPTR(A);DECREASE COUNT IN AOBJN POINTER
13114 NLDSB7: LSH E,-10.      ;LAST PAGE NEEDED
13115         PUSH P,A
13116         PUSH P,R        ;R HAS IOCHNM WD, NEEDED IF REACH QICL VIA QBI.
13117         PUSH P,E        ;PAGE NO. OF LAST PAGE NEEDED
13118 NLDSB4: MOVE E,(P)
13119         CAMGE E,SRN5(U)
13120          JRST NLDSB5    ;ALREADY HAVE NEEDED PAGES
13121         MOVE A,SRN5(U)
13122         PUSH P,U
13123         MOVE U,SRN3(U)  ;LOOK UP THIS PAGE IN MAP OF USER WE'RE HACKING.
13124         PUSHJ P,UPLC    ;IF THERES A WRITABLE PAGE
13125         POP P,U
13126         LDB A,T         ;IN THE SLOT ALREADY, KEEP IT.
13127         TRNN A,600000
13128          TRNN A,2
13129           TRNE A,400000
13130            JRST NLDSBM
13131         CAME U,SRN3(U)  ;IF NOT HACKING SELF, NCORLL WILL LSWPOP
13132          PUSHJ P,NULSET ;WHAT IT THINKS IS A LOSSET LIKE NLUPCL
13133         PUSHJ P,SWTL
13134           CIRPSW
13135         MOVEI R,%JSNEW  ;GET FRESH PAGE
13136         MOVE TT,SRN3(U) ;INTO THE JOB WE'RE HACKING.
13137         MOVE C,SRN5(U)  ;PAGE # TO GIVE IT.
13138         MOVSI A,%CBRED+%CBWRT+%CBNDW    ;WANT WRITE ACCESS.
13139         PUSHJ P,NCORL   ;UNDOES NULSET AND SWTL.
13140          JRST NLSBPL    ;COULDNT GET PAGE (CALLED LSWCLR)
13141 NLDSBM: AOS SRN5(U)
13142         JRST NLDSB4     ;CHECK WHETHER WE NEED MORE PAGES.
13143 \f
13144 NLDSB5: SUB P,[1,,1]    ;NOW WE HAVE ALL PAGES NEEDED TO LOAD THIS BLOCK.
13145         POP P,R
13146         POP P,A
13147 NLDSBQ: MOVEI B,NLDSBC
13148         HRRM B,QPCLSR(A)
13149 NLDSBC: HRRZI C,QLDPTR(A)
13150         HRLI C,(SETZ)
13151         PUSHJ P,QBI     ;DO A BLOCK IOT, USING THAT AOBJN POINTER.
13152         AOSG B,EPDLT2(U);SKIP RESIDUE OF BLOCK AND CHECKSUM
13153          MOVEI B,1      ;NO RESIDUE, JUST SKIP CHECKSUM
13154         LDB D,[1200,,QSMPRP(A)]
13155         SKIPGE QSMDN(A)
13156          MOVEI D,0
13157         ADD D,QFBLNO(A)
13158         ADD D,B
13159         MOVEM D,QRADAD(A)
13160         MOVSI D,%QAACC
13161         IORM D,QSRAC(A)
13162         JRST NLDSBK
13163
13164 NLDSB6: LDB D,[1200,,QSMPRP(A)]
13165         SKIPGE QSMDN(A)
13166          MOVEI D,0
13167         ADD D,QFBLNO(A)
13168         SUBI D,1
13169         MOVEM D,QRADAD(A)
13170         MOVSI D,%QAACC
13171         IORM D,QSRAC(A)
13172 NLDSB8: CAME U,SRN3(U)  ;UNLESS HACKING SELF OR PDP6, WE HAVE A SOSSET OF USTP TO POP.
13173          SKIPGE SRN3(U)
13174           CAIA
13175            PUSHJ P,LSWPOP
13176         AOSA (P)
13177 NLDSB9:  PUSHJ P,OPNL46 ;LOAD FILE NOT IN VALID SBLK FORMAT
13178 NLSBP1: PUSHJ P,MPLDZ
13179         SETZM QPCLSR(A)
13180         POPJ P,
13181
13182 NLSBPL: SUB P,[2,,2]    ;FLUSH PUSHES OF E AND R.
13183         POP P,A
13184         JRST NLSBP1
13185 \f
13186 SUBTTL .GUN, .LOGOUT
13187
13188 ;DESTROY PROCEDURE TREE WHOSE TOP INDEX SUPPLIED BY USER
13189 AGUN:   XCTR XR,[SKIPG A,(J)]
13190          POPJ P,        ;LOSE, NEG OR SYSTEM JOB
13191         IMULI A,LUBLK
13192         CONO PI,CLKOFF
13193         CAMGE A,USRHI   ;USER INDEX UNREASONABLE => LOSE.
13194         CAIG A,LUBLK
13195          JRST CLKONJ
13196         JRST ALOGO6
13197
13198 ALOGOU: SKIPL SUPPRO(U)
13199          JUMPN J,ABREAK ;.LOGOUT N, TURNS INTO .BREAK N,33 IF NOT TOP LEVEL
13200         MOVE A,U        ;.LOGOUT, AND STY CLOSE.
13201         CONO PI,CLKOFF
13202 ;A HAS JOB BEING LOGGED OUT; U HAS JOB THAT'S DOING IT.
13203 ;.GUN AND .LOGOUT ACT BY PUTTING THE JOB IN SUCH A STATE THAT
13204 ;IT CAN DO NOTHING BUT TRY TO DISAPPEAR. IF THE JOB IS ALREADY
13205 ;IN THAT STATE, THIS ROUTINE DOES NOTHING. THAT PREVENTS
13206 ;RECURSION LOOPS WHEN KILLING CYCLIC STRUCTURES INVOLVING STY'S.
13207 ;EXCEPTION: IF THE JOB TO BE LOGGED OUT IS THE RUNNING JOB,
13208 ;WE DO THE REAL WORK BY GOING TO ALOGO1.
13209 ALOGO6: SKIPE UNAME(A)  ;JOB TO BE LOGGED OUT IS GONE.
13210         SKIPL SUPPRO(A) ;CAN'T LOG OUT UNLESS TOP LEVEL.
13211          JRST CLKONJ
13212         CAME A,U
13213          AOS (P)        ;IF .GUN GETS THIS FAR, IT HAS "SUCCEEDED".
13214         MOVSI T,BULGOS+BULGO
13215         TDNE T,APRC(A)  ;IF JOB IS ALREADY LOGGING OUT,
13216          JRST ALOGO7    ; SEE IF IT IS THE RUNNING JOB
13217         MOVSI B,%PCUSR
13218         CAMN A,USER
13219          AOJA B,ALOGO5
13220         PUSH P,U
13221         MOVE U,USER
13222         MOVEM A,SRN3(U) ;AUCL4 FINDS USR IDX TO HACK HERE.
13223         PUSHJ P,LOSSET
13224             AUCL4       ;CLEAR BULGOS IF AUCL3 PCLSR'S
13225         PUSHJ P,AUCL3   ;SET BULGOS AND WAIT FOR DIELOK TO CLEAR.
13226         POP P,U
13227         CONO PI,CLKOFF
13228         PUSHJ P,LSWDEL
13229         EXCH B,UPC(A)   ;SET HIM UP TO LOG OUT.
13230 ALOGO4: MOVEM B,SRN3(A)         ; Remember old PC for unlocking locks.
13231         MOVE B,[.LOGOUT]        ;PUT THE FOLLOWING ROUTINE IN JOB'S AC'S:
13232         MOVEM B,AC0S(A)         ;       0/      .LOGOUT
13233         CAMN A,USER             ;       1/      .VALUE
13234          UMOVEM B,0             ;       2/      JRST 0
13235         MOVSI B,(.VALUE)
13236         MOVEM B,AC0S+1(A)
13237         CAMN A,USER
13238          UMOVEM B,1
13239         MOVSI B,(JRST)
13240         MOVEM B,AC0S+2(A)
13241         CAMN A,USER
13242          UMOVEM B,2
13243         MOVSI B,BULGOS
13244         IORM B,APRC(A)  ;SAY HE'S DIEING SO NO-ONE WILL HACK HIM.
13245         MOVEM U,EPDL(A) ;RECORD WHO IS KILLING HIM.
13246         MOVE B,UNAME(U)
13247         MOVEM B,SRN4(A)
13248         MOVE B,JNAME(U)
13249         MOVEM B,SRN5(A)
13250         SETZM PICLR(A)  ;PREVENT INTERRUPTS.
13251         SETZM MSKST(A)
13252         SETZM PIRQC(A)
13253         MOVSI B,BUSRC
13254         ANDCAM B,USTP(A) ;MAKE SURE HE CAN RUN - ELSE HE WOULDN'T LOG OUT.
13255 ALOGO7: CONO PI,CLKON
13256         CAME A,USER
13257          POPJ P,
13258         JRST ALOGO1     ;IF JOB IS RUNNING JOB, MUST HACK AROUND
13259
13260 ALOGO5: EXCH B,UUOH     ;LOGGING OUT SELF - MAKE OUR PC LOOK
13261         SOJA B,ALOGO4   ; AS IF WE HAD EXECUTED THE .LOGOUT IN AC 0
13262 \f
13263 ;COME HERE IF LOGGING OUT ONESELF (A=USER).
13264 ALOGO1: MOVE U,A
13265         PUSHJ P,AUCL3   ;WAIT TILL NO-ONE IS LOOKING AT ME,
13266         PUSHJ P,UBLAM   ;CLOSE MY CHANNELS AND KILL MY INFERIORS AND CORE.
13267         MOVE A,USER
13268         CONO PI,CLKOFF  ;DON'T SCHEDULE WHILE GOING AWAY
13269         MOVSI T,BULGO
13270         IORM T,APRC(A)  ;SYS JOB KILLS ANY TREES WITH BULGO SET.
13271         MOVSI T,SCLGUN
13272         IORM T,SUPCOR   ;TELL SYS JOB TO LOOK AROUND FOR TREES TO KILL.
13273         MOVSI T,BUSRC   ;SUICIDE: MAKE SURE WE DON'T RUN ANY MORE.
13274         IORM T,USTP(A)
13275         JRST UDELAY     ;CAUSE A SCHEDULE
13276
13277 ;COME WITH JOB INDEX IN A. INDICATE THAT JOB IS ABOUT TO DIE,
13278 ;THEN WAIT TILL IT'S SAFE TO KILL IT.
13279 ;TURNS CLOCK ON.
13280 AUCL3:  MOVSI T,BULGOS
13281         IORM T,APRC(A)  ;SAY THIS JOB STARTING TO GO AWAY.
13282         CONO PI,CLKON   ;NOONE CAN START HACKING US NOW; SAFE.
13283         CAME A,USER     ;IF NOT LOGGING OUT RUNNING USER,
13284          PUSHJ P,1USTOP ;STOP THE JOB BEING KILLED.
13285         SKIPE DIELOK(A) ;WAIT TILL NO-ONE IS LOOKING AT THAT JOB.
13286          PUSHJ P,UFLS
13287         HRLOI T,#BUSRC  ;AND NO-ONE ELSE HAS HIM PCLSR'ED.
13288         TDNE T,USTP(A)
13289          PUSHJ P,UFLS
13290         POPJ P,         ;WE SUCCEEDED, BUT CALLER HAS WORK TO DO.
13291 \f
13292 SUBTTL REAL TIME USER FEATURE
13293 ;
13294 ;.REALT AC,     SKIPS ONLY IF REAL TIME FACILITY REQUESTED AND SEIZED
13295 ;AC=    4.9=>TURN OFF OLD CLOCK RATE, FLUSHING REAL TIME FACILITY AND
13296 ;                REMAINDER OF CURRENT TICK AND ZEROING TICK COUNT
13297 ;       4.8=>TURN ON NEW CLOCK RATE
13298 ;       4.7=>TRY TO SEIZE REAL TIME USER FACILITY
13299 ;       4.6=>DON'T SETTLE FOR PSEUDO-REAL TIME STATUS
13300 ;       4.5 =>ONLY WANT PSEUDO
13301 ;       4.4=>PROGRAM TO BE BLOCKED EXCEPT FOR HIGH PRIORITY PHASE OR INT. LEVEL
13302 ;       4.3=>READ INTO WD3+4 AS DESCRIBED BELOW (BEFORE ANY OTHER BITS INTERPRETED)
13303 ;       3.1-4.2=RESERVED FOR EXPANSION, SHOULD BE ZERO
13304 ;       1.1-2.9=RH=POINTER TO 4 WORD BLOCK
13305 ;       WD1=FRAME TIME IN 60'THS (MUST BE <2**18.)
13306 ;       WD2=PRIORITY TIME IN 60'THS (MUST BE <7 AND <WD1/2)
13307 ;       WD3= IF 4.3 ON, SET RH TO FRAME TIME, LH TO TICKS SINCE EXAMINED
13308 ;       WD4= IF 4.3 ON, SET RH TO HIGH PRIORITY TIME, LH TO 0 IF CURRENTLY LOW
13309                 ;PRIORITY OR -1 IF CURRENTLY HIGH PRIORITY
13310 ;
13311 AREALT: UMOVE A,(J)
13312         TLNN A,4000
13313         JRST AREAL1
13314         CONO PI,CLKOFF
13315         MOVE T,UTIME(U)
13316         MOVE Q,URTIME(U)
13317         CONO PI,CLKON
13318         UMOVEM T,2(A)
13319         UMOVEM Q,3(A)
13320 AREAL1: TLNN A,700000
13321         POPJ P,
13322         HRRZ T,UREALT
13323         CAMN T,U
13324         SETOM UREALT
13325         SETZM URTIME(U)
13326         TLNN A,400000
13327         JRST AREAL2
13328         PUSHJ P,CLQDEL  ;TURN OFF OLD INTS
13329         UCLBLK(U)
13330         SETZM UTIME(U)  ;ZERO TICK COUNT
13331 AREAL2: TLNN A,200000
13332         JRST AREAL4
13333         XCTR XR,[SKIPG T,(A)]
13334         JRST ILUUO
13335         HRRM T,UTIME(U)
13336 AREAL4: TLNN A,100000
13337         JRST AREAL6
13338         XCTR XR,[SKIPLE T,1(A)]
13339         CAIL T,13.
13340         JRST ILUUO
13341         HRRZ B,UTIME(U)
13342         LSH B,-1
13343         CAMLE T,B
13344         JRST ILUUO
13345         HRROS T
13346         TLNE A,10000
13347         TLZ T,1
13348         MOVEM T,URTIME(U)
13349         TLNE A,20000
13350         JRST AREAL6
13351         CONO PI,CLKOFF
13352         SKIPGE UREALT
13353         JRST AREAL7
13354         TLNE A,40000
13355         SETZM URTIME(U)
13356         JRST AREAL5
13357 AREAL7: MOVEM U,UREALT
13358         AOS (P)
13359 AREAL5: CONO PI,CLKON
13360 AREAL6: SKIPN T,UTIME(U)
13361         POPJ P,
13362         SKIPE B,URTIME(U)
13363         MOVE T,B
13364         HRRZS T
13365         PUSHJ P,CLQADD
13366         UCLBLK(U)
13367         POPJ P,
13368
13369
13370 ;CLOCK LEVEL ROUTINE
13371 UREALB: SUBI U,UCLBLK   ;SET INDEX TO QUEUE BLOCK
13372         SKIPE B,URTIME(U)
13373         JRST URLTB2
13374 URLTB1: MOVSI T,(%PIRLT)
13375         IORM T,PIRQC(U)
13376         MOVSI T,1
13377         ADDM T,UTIME(U)
13378         HRRZ T,UTIME(U)
13379         SKIPGE B
13380         HRRZ T,B
13381 URLTBX: SETZM SCHFLG    ;CAUSE SCHEDULE THIS CLOCK BREAK
13382         MOVEI C,UCLBLK(U)
13383         JRST CLQREE
13384
13385 URLTB2: TLC B,-1
13386         MOVEM B,URTIME(U)
13387         MOVSI T,1
13388         HRRZ C,UREALT
13389         JUMPGE B,URLTB4
13390         CAMN C,U
13391         HRRZS UREALT
13392         JRST URLTB1
13393
13394 URLTB4: CAMN C,U
13395         IORM T,UREALT
13396         HRRZ T,UTIME(U)
13397         HRRZS B
13398         SUB T,B
13399         JUMPG T,URLTBX
13400         BUG
13401 \f
13402 SUBTTL MISCELLANEOUS SYSTEM CALLS
13403
13404 $INSRT TIME             ;ROUTINES HAVING TO DO WITH CLOCKS AND THINGS
13405
13406 ;
13407 ;.CLOSE CH,     ;CLOSE ANY I/O TRANSACTION OPEN ON CHANNEL CH
13408 ;
13409 CCLOSE: HRREI C,-IOCHNM(R)      ;CLOSE CALLED INTERNALLY
13410         SUB C,U
13411         TRNE C,-NIOCHN
13412          BUG            ;R WAS NOT AN IOCHNM WORD ADDRESS.
13413         HRRZM C,UUAC(U) ;SOME CLOSE ROUTINES LOOK AT UUAC
13414         JRST ACLOSE
13415
13416 NCLOSE: AOS (P)
13417 ACLOSE: HLRZ A,(R)      ;SET UP A WITH L.H. OF I/O CH WORD
13418         HRRZ B,(R)      ;SET UP B WITH R.H. "
13419         MOVE C,CLSTB(B) ;GET CLOSE TABLE ENTRY
13420         TLNE C,%CLSNRM  ;SKIP IF NOT STANDARD CLOSE
13421          JRST STDCLS    ;JUMP TO STANDARD CLOSE
13422         PUSH P,R        ;SAVE R
13423         PUSHJ P,(C)     ;CALL CLOSE ROUTINE
13424         POP P,R         ;RESTORE R
13425 STDCLX: SETZM (R)       ;CLEAR I/O CHANNEL WORD
13426         SETZM IOCHST-IOCHNM(R)  ;CLEAR I/O CHNL STATUS WORD
13427         POPJ P,
13428
13429 STDCLS: CONO PI,CLKOFF  ;INHIBIT CLOCK BREAKS
13430         SOSGE 1(C)      ;DECREMENT USE COUNTER, SKIP IF STILL IN USE AT LEAST ONCE
13431          SETOM (C)      ;NO LONGER IN USER, FREE BY SETOM'ING "XXXUSR" VARIABLE
13432         CONO PI,CLKON   ;ENABLE CLOCK BREAKS
13433         JRST STDCLX
13434
13435 AVALRET:UMOVE A,(B)     ;CALL 4,
13436         MOVEM A,VALUE(U)
13437         MOVEI T,%PIVAL
13438         JRST ILLOP4
13439
13440 AUTRAN: UMOVE C,(B)
13441         HRR C,U
13442         CONO PI,CLKOFF          ;Don't let USRHI change or anything like that
13443         MOVE A,USRHI
13444 UTRNL:  SUBI A,LUBLK
13445         JUMPL A,CLKONJ
13446         SKIPE D,UNAME(A)
13447          CAME C,SUPPRO(A)
13448           JRST UTRNL
13449         MOVE E,JNAME(A)
13450         CONO PI,CLKON
13451         UMOVEM D,1(B)
13452         UMOVEM E,2(B)
13453         JRST POPJ1
13454
13455 ;RETURN WITH LOSER IN A IN LOSER MODE AND CLOCK OFF
13456 ;
13457 RPCCK:  PUSHJ P,RPCLSR  ;STOP USER (ALSO PUTS HIM IN USER MODE)
13458         CONO PI,CLKOFF  ;TURN OFF CLOCK
13459         JRST UPCLSR     ;"RESTART USER" (HE CAN'T RUN TILL CLOCK BACK ON)
13460 \f
13461 ;.LOSE X <=> .CALL [SETZ ? SIXBIT/LOSE/ ? 401000,,X ]
13462
13463 ;.CALL LOSE
13464 ;       USED TO REPORT LOSSAGE TO SUPERIOR PROCEDURE
13465 ;ARG 1 - LOSING INSTRUCTION ADDR,,LOSSAGE CODE (CODES DEFINED BY DDT)
13466 ;ARG 2 - NEW PC (DEFAULT = PC-2 SO CAN USE AS A NON-SKIP-RETURN HANDLER)
13467 ;CTL 1.1 - DEFAULT ARG 2 TO PC INSTEAD OF PC-2
13468 ;CTL 1.2 - SETZM @.40ADDR
13469 ;CTL 1.3 - DON'T USE THE NEW PC AS THE LOSING INSTRUCTION ADDR
13470
13471 ALOSE:  HRRZ A,FORTY            ;ARG 1 = EFF ADDR OF UUO
13472         MOVEI W,1
13473         TDZA T,T
13474 NLOSE:   MOVE T,CTLBTS(U)
13475         MOVE D,40ADDR(U)
13476         TRNE T,2
13477          XCTR XRW,[MOVES (D)]
13478         TLZ B,BADPC             ;COMPUTE NEW PC FROM ARG 2 OR UUOH
13479         SKIPGE IOTLSR(U)
13480          TLO B,%PCUIO
13481         TLO B,%PCUSR
13482         MOVE C,UUOH
13483         TRNN T,1
13484          HRRI C,-2(C)
13485         CAIGE W,2
13486          MOVE B,C
13487         TRNN T,4
13488          HRL A,B
13489         HRRI B,1(B)             ;PCLSR'ING WILL SOS
13490         MOVEM A,VALUE(U)        ;PASS TO SUPERIOR
13491         MOVEM B,UUOH
13492         TRNE T,2
13493          XCTR XW,[SETZM (D)]
13494         MOVSI T,%PJLOS
13495         JRST UUOERR
13496 \f
13497 AUCLOSE:
13498 IFN PDP6P,[
13499         MOVE A,(R)      ;OPER 10
13500         MOVE A,CLSTB(A)
13501         TLNE A,%CLS6
13502          JRST PDPUCL
13503 ]
13504         PUSHJ P,AUCL2
13505          POPJ P,
13506         PUSHJ P,1USTOP
13507         MOVEM A,SRN3(U)
13508         PUSHJ P,LOSSET
13509            AUCL4
13510         PUSHJ P,AUCL3   ;STOP JOB, AND WAIT TILL SAFE TO KILL IT
13511                         ;(TURNS CLOCK ON)
13512         EXCH U,A
13513         PUSH P,A
13514         HLLZ T,SUPPRO(U)
13515         PUSH P,T
13516         PUSH P,R
13517         PUSHJ P,UBLAST
13518         POP P,R
13519         PUSHJ P,ZUSLOG  ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
13520         CONO PI,CLKON
13521         POP P,T
13522         POP P,U
13523         ANDCAM T,IFPIR(U)
13524         JRST LSWDEL
13525
13526 AUCL4:  HRRZ A,SRN3(U)
13527         MOVSI T,BULGOS
13528         ANDCAM T,APRC(A)
13529         POPJ P,
13530
13531 AUCL2:  HLRZ A,(R)      ;GUY BEING CLOSED
13532         HRRZ B,(R)
13533         LDB TT,[.BP (%CLSFU),CLSTB(B)]
13534         JUMPN TT,OPNL31 ;FOREIGN JOB => .UCLOSE ISCAN'T MODIFY JOB
13535         SKIPL CLSTB(B)  .SEE %CLSU
13536          JRST OPNL34    ;NOT A JOB AT ALL?
13537         CONO PI,CLKOFF
13538         MOVE TT,TTYTBL(U)
13539         JUMPGE TT,AUCL1 ;HAVE TTY NOW
13540         TLNN TT,%TBDTY  ;NOT GIVING IT AWAY.
13541          CAIE A,(TT)    ;SKIP IF GAVE IT TO GUY WE'RE KILLING
13542           JRST AUCL1
13543         PUSHJ P,SDTTY   ;TAKE IT BACK FROM HIM.
13544          JFCL
13545 AUCL1:  HLRZ A,(R)
13546         JRST POPJ1
13547 \f
13548 ;DISMIS SYSTEM CALL. 1ST ARG INT PDL PTR (WILL BE DECREMENTED
13549 ;IF NOT AN IMMEDIATE ARG)
13550 ;2ND ARG OPTIONAL PC TO DISMIS TO (OVERRIDES THAT IN INT PDL)
13551 ;3RD ARG OPTIONAL NEW .DF1 VALUE       "       "    "     "
13552 ;4TH ARG OPTIONAL NEW .DF2 VALUE ...
13553 ;5TH ARG OPTIONAL ERROR CODE AS IN LOSE.  IF PRESENT WILL LOSE RIGHT AFTER DISMISSING.
13554 ;IF 4 ARGS GIVEN, 1ST IGNORED EXCEPT FOR POSSIBLY DECREMENTING, OR POPPING OF ACS.
13555 ;CTL BITS (SAME FORMAT AS LH OF 1ST WORD OF INTERRUPT DISPATCH TABLE)
13556 ;SPECIFY POPPING OF SAME EXTRA INFO THAT INTERRUPTS CAN PUSH.
13557
13558 NDISMIS:CAIL W,5
13559          MOVEM E,VALUE(U)
13560         MOVE E,A        ;GET IN E THE INT PDL PTR.
13561         TLNN E,1000     ;IF 1ST ARG IMMEDIATE, IT IS PTR,
13562          UMOVE E,(A) ;ELSE IT PTS TO PTR.
13563         MOVE H,E        ;SAVE UNPOPPED PDL POINTER FOR PDL OV CHECKING.
13564         TLNE A,1000     ;IF PDL PTR ISN'T IMMEDIATE, POP IT ACC. TO CTL BITS.
13565          JRST NDISM2
13566         MOVE T,CTLBTS(U)
13567         TRNE T,400000
13568          SUB E,[3,,3]   ;POP OFF DEBUGGING INFO IF IT WAS PUSHED.
13569         LDB TT,[000500,,T]
13570         JUMPE TT,NDISM2 ;IF ACS WERE PUSHED, POP THEM TOO.
13571         HRLS TT
13572         SUB E,TT        ;DECREMENT THE PDL POINTER ENOUGH
13573         LDB I,[060500,,T]
13574         HRLI I,1(E)     ;AND COPY FROM THE PDL TO THE ACS.
13575         ADDI TT,-1(I)
13576         XCTR XBRW,[BLT I,(TT)]
13577 NDISM2: CAIGE W,2       ;IF NO 2ND ARG, GET PC FROM INT PDL
13578          UMOVE B,(E)
13579         CAIGE W,3       ;IF NO 3RD ARG, GET .DF1 FROM INT PDL
13580          UMOVE C,-2(E)
13581         CAIGE W,4       ;IF NO 4TH ARG GET .DF2 FROM INT PDL
13582          UMOVE D,-1(E)
13583         TLNE A,1000     ;IF 1ST ARG NOT IMMED, DECREMENT IT
13584          JRST NDISM3
13585         SUB E,[5,,5]
13586         UMOVEM E,(A)
13587         JUMPGE E,NDISM3 ;AND CHECK FOR PDL OVFLO.
13588         SKIPL H
13589          PUSHJ P,NDISMP ;PDL OVFLO, SET INT BIT IF INT ENABLED.
13590 NDISM3: MOVEM C,IDF1(U) ;RESTORE THE PC, .DF1, .DF2
13591         MOVEM D,IDF2(U)
13592         MOVSI T,%PJLOS
13593         CAIL W,5
13594          IORM T,PIRQC(U)
13595         JRST NDISM1
13596
13597 NDISMP: MOVEI TT,%PIPDL ;PDL OV INT BIT.
13598         TDNE TT,MSKST(U)
13599          IORM TT,PIRQC(U)
13600         POPJ P,
13601 \f
13602 ;OLD-STYLE DISMISS JOINS HERE
13603 ADISMIS:UMOVE B,(B)     ;CALL 1,
13604 NDISM1: TLO B,%PCUSR
13605         TLZ B,BADPC
13606         SKIPGE IOTLSR(U)
13607          TLO B,%PCUIO
13608 IFN KL10P,[
13609         SETCM A,UUOH            ;IF ONE-PROCEEDING THE .DISMISS
13610         TLNN A,%PS1PR-%PSINH
13611          TLO B,%PS1PR-%PSINH    ;TRAP IMMEDIATELY AT THE NEW PC
13612 ]
13613         MOVEM B,UUOH
13614         SETOM PICLR(U)
13615
13616 ;CHECK FOR PENDING INTERRUPTS AND TAKE THEM RIGHT AWAY
13617 APISE1:
13618 IFN PDP6P,[
13619         CAMN U,PDPISR
13620          CONO DSDEV,DSDCHN      ;ENABLE INTERRUPT FROM 6
13621 ]
13622         MOVE A,U
13623         PUSHJ P,APISE6  ;SEE IF ANY DEVICES WANT TO RE-INTERRUPT.
13624         MOVEI C,%PIARO
13625         ANDCAB C,PIRQC(U)
13626         SETCM D,MSKST(U)
13627         IOR D,IDF1(U)   ;FIND ALL DISABLED OR DEFERRED
13628         SKIPN PICLR(U)  ;(ALL ARE DEFERRED WHEN PI IS OFF).
13629          SETO D,
13630         AND D,[BADBTS]  ;BAD
13631         TDNE C,D        ;PENDING INTERRUPTS
13632          JRST ADISM7    ;IF THERE ARE ANY, LET THEM HAPPEN.
13633         AND C,MSKST(U)
13634         ANDCM C,IDF1(U)
13635         JUMPN C,ADISM7  ;1ST WD INT. PENDING.
13636         MOVE C,IFPIR(U)
13637         AND C,MSKST2(U)
13638         ANDCM C,IDF2(U)
13639         JUMPE C,CPOPJ   ;JUMP IF NO 2ND WORD INT PENDING.
13640 ADISM7: MOVE C,[JRST ONEFLS]
13641         MOVEM C,UEXIT
13642         POPJ P,
13643 \f
13644 APISE6: MOVE D,MSKST(A) ;IF INTERRUPT FROM CONSOLE ENDBLED,
13645         TRNN D,%PITYI
13646          JRST APISE7
13647         SKIPL T,TTYTBL(A) ;IF THIS JOB HAS ITS CONSOLE
13648         SKIPN TINTC(T)  ;AND THE CONSOLE HAS INT. CHARS,
13649          JRST APISE7
13650         MOVEI D,%PITYI  ;GENERATE AN INTERRUPT.
13651         IORM D,PIRQC(A)
13652 APISE7: MOVE D,MSKST2(A) ;LOOK AT HIS ENABLED IO CHANNELS.
13653         ANDI D,177777
13654 APISE0: JFFO D,APISE9   ;CHECK EACH ONE.
13655         JRST APISE8     ;ALL CHECKED.
13656
13657 APISE9: MOVNS E         ;CHECK ONE IO CHNL THAT'S ENABLED TO INT.
13658         ANDCM D,CHNBIT+35.(E) ;MARK THIS CHNL AS HANDLED.
13659         ADDI E,35.+IOCHNM(A)  ;GET ADDR OF IOCHNM WD FOR CHANNEL.
13660         HRRZ T,(E)      ;IS IT A TTY INPUT CHANNEL?
13661         CAIL T,TYIDN
13662         CAILE T,TYIBN
13663          JRST APISE2
13664         LDB T,[$TIIDX,,(E)] ;YES, GET THE TTY NUMBER.
13665         HRRZ C,TTYSTS(T)
13666         CAIE T,%TINON   ;IF IT ISN'T A DISOWNED TY CHANNEL,
13667         CAIE C,(A)      ;AND THE TTY BELONGS TO THIS JOB,
13668          JRST APISE0
13669         SKIPN TINTC(T)  ;AND IT HAS AN INT. CHAR WAITING,
13670          JRST APISE0
13671         MOVE C,TYIMSK(T)
13672 APISE4: AND C,MSKST2(A) ;GIVE AN INT. ON ONE OF THE CHANNELS IT'S OPEN ON.
13673         MOVN T,C
13674         AND C,T
13675         IORM C,IFPIR(A)
13676         JRST APISE0
13677
13678 APISE2: CAIN T,STYDUI   ;NOT A TTY CHNL. IS IT A STY CHNL?
13679          JRST APISE3
13680         CAIE T,STYDBI
13681          JRST APISE0
13682 APISE3: LDB T,[$TIIDX,,(E)]     ;YES, GET TTY #.
13683         SKIPL C,STYSTS-NFSTTY(T) ;STY IN USE BY THIS JOB?
13684         CAIE C,(A)
13685          JRST APISE0
13686         SKIPGE TTYOAC(T)        ;TTY OUTPUT PENDING?
13687          JRST APISE0
13688         MOVE C,STYMSK-NFSTTY(T) ;YES, INT. ON ONE CHANNEL.
13689         JRST APISE4
13690
13691 APISE8:
13692 IFN STKP,[
13693         SKIPL C,STKUSR
13694         CAIE C,(A)
13695          POPJ P,
13696         HRRZ C,STKMSK
13697         AND C,MSKST2(A)
13698         SKIPLE STKBC
13699         IORM C,IFPIR(A)
13700 ]
13701         POPJ P,
13702 \f
13703 ;.SLEEP AC,     ;IF C(AC) + OR ZERO:    ;BECOME DORMANT FOR C(AC) 1/30'THS OF A SEC
13704                 ;IF C(AC) -:    ;BECOME DORMANT TILL MAGNITUDE OF C(AC) > C(TIME)
13705 ASLEEP: XCTR XR,[MOVN T,(J)]    ;PICK UP NEGATIVE OF C(AC)
13706         JUMPGE T,ASLP1  ;JUMP IF C(AC) WAS NEG
13707         SUB T,TIME      ;COMPUTE NEG OF TIME SLEEP SHOULD RUN OUT
13708         UMOVEM T,(J)    ;STORE BACK SO YOU WILL WIN IF PCLSR'ED OUT
13709 ASLP1:  MOVMS A,T               ;MAKE POSITIVE
13710         SUBI A,60.*30.          ;IF SLEEPING FOR MORE THAN A MINUTE
13711         MOVSI B,%SWDSO
13712         CAMLE A,TIME
13713         IORM B,USWST(U)         ;PUT RIP VAN WINKLE ON ICE
13714         PCLT
13715         JRST ASLP2              ;ALWAYS GO TO UFLS AT LEAST ONCE
13716
13717         CAMLE T,TIME    ;HANG TILL C(T) LESS THAN C(TIME)
13718 ASLP2:  PUSHJ P,UFLS
13719         XCTR XW,[SETZM (J)]     ;CLEAR OUT ARG (FOR COMPATIBILITY WITH WHEN AC WAS COUNTED OUT)
13720         JRST CLKONJ     ;MAKE SURE CLKCHN ON IN CASE SLEEP WAS 0 & SKIPPED UFLS ENTIRELY
13721
13722 ;RELOAD CALL - IGNORE ARGS
13723 ;MUST BE FROM TOP LEVEL NON-DISOWNED JOB
13724 ;RELOADS AND STARTS SYS: ATSIGN WHATEVER
13725
13726 NRELOAD:SKIPGE SUPPRO(U)
13727         SKIPGE APRC(U)
13728          JRST OPNL40            ;NOT TOP LEVEL
13729         CONO PI,CLKOFF
13730         PUSHJ P,LOGUPD          ;LOG OUT
13731         PUSHJ P,DMNPLI          ;AND IN AGAIN
13732         PUSHJ P,USRST2          ;RESET USER VARS
13733         CONO PI,CLKON
13734         SETZM @UTMPTR(U)        ;TEMPORARY HIGH PRIORITY
13735         JRST USTCDR             ;LOAD FILE AND START IT
13736
13737 AMASTER:UMOVE J,(J)
13738         CONO PI,CLKOFF  ;OPER 61
13739         SKIPL A,UMASTER
13740          JRST AMAST2
13741         SKIPGE J
13742 AMAST1:  HRRZM U,UMASTER
13743         JRST CLKOJ1
13744
13745 AMAST2: CAME U,A
13746          JRST AMAST3
13747         SKIPL J
13748          SETOM UMASTER
13749         JRST CLKOJ1
13750
13751 AMAST3: JUMPGE J,CLKOJ1
13752         SKIPGE TTYTBL(U)
13753          JRST CLKONJ    ;LOSEY
13754         PUSHJ P,RPCCK
13755         CAME A,UMASTER
13756          JRST AMASTER
13757         JRST AMAST1
13758 \f
13759 ;.CALL SSERVE - Set .SERVER variable without timing screw.
13760 ; ARG1: <job>, the client whose .SERVER variable is to be munged
13761 ; ARG2: <job>, the server to be stored in the variable
13762 ; If one arg is given, it is the server and the client defaults to %JSELF
13763 NSSERVER:
13764         MOVE J,A
13765         CAIL W,2
13766          SKIPA A,B
13767           MOVEI J,%JSELF
13768         JSP T,NCORUI            ; Decode client and AOS his DIELOK
13769          JRST NSSRV1            ; OK to write
13770         JSP T,NCORWR            ; Check further
13771          JRST OPNL31            ; CAN'T MODIFY JOB
13772 NSSRV1:
13773 IFN PDP6P,[
13774         CAIN J,-1               ; PDP6?
13775          JRST OPNL34            ; WRONG TYPE DEVICE
13776 ];PDP6P
13777         EXCH J,A                ; A: client  J: server
13778         JSP T,NCORUI            ; Decode server and AOS his DIELOK
13779          JFCL                   ; Don't give a damn about writability
13780 IFN PDP6P,[
13781         CAIN J,-1               ; PDP6?
13782          JRST OPNL34            ; WRONG TYPE DEVICE
13783 ];PDP6P
13784         MOVEM J,SERVER(A)       ; Safe to set it now
13785         PUSHJ P,LSWPOP          ; Server's DIELOK
13786         JRST LSWPJ1             ; Client's DIELOK
13787
13788 \f
13789         SUBTTL LOGIN/ATTACH/DETACH/DISOWN CODE
13790
13791 ;SYMBOLIC CALL LOGIN:  LOG A TREE IN.  MUST BE GIVEN BY TOP-LEVEL NON-LOGGED-IN JOB
13792 ;WITH NO INFERIORS.
13793 ;ARG 1 - DESIRED UNAME
13794 ;ARG 2 - "TERMINAL NAME", PUT IN TRMNAM USER VARIABLE AND PRINTED AS SIXBIT ON SYSCON.
13795 ;ARG 3 - DESIRED XUNAME, FOR DEMON TO KNOW WHO TO ACCOUNT.
13796
13797 NLOGIN: HLRE T,UNAME(U) 
13798         AOJN T,OPNL31   ;JUMP ON ALREADY LOGGED IN
13799         SKIPL SUPPRO(U)
13800          JRST OPNL40    ;CAN'T LOG IN IF NOT TOP LEVEL
13801         JUMPE A,OPNL11
13802         HLRE T,A
13803         AOJE T,OPNL11           ;BAD NAME
13804         CAIGE W,3
13805          MOVE C,A       ;IF XUNAME (ARG 3) MISSING, DEFAULT TO UNAME.
13806         MOVEI D,0
13807         CONO PI,CLKOFF
13808 ALOG2:  SKIPN UNAME(D)
13809          JRST ALOG4
13810         MOVE T,JNAME(D)
13811         CAMN T,JNAME(U)
13812          CAME A,UNAME(D)
13813           JRST ALOG3
13814         JRST OPNL13     ;CONSOLE CONTROLLED TREE ALREADY LOGGED IN THAT NAME
13815
13816 ALOG3:  HRRZ T,SUPPRO(D)
13817         CAMN T,U        ;CAN'T LOGIN IF HAVE INFERIOR.  RESTRICTION IMPOSED HERE
13818          JRST OPNL12    ;SINCE WE NO CODE HERE TO SET INFERIOR'S UNAME.
13819 ALOG4:  ADDI D,LUBLK
13820         CAMGE D,USRHI
13821          JRST ALOG2     ;LOOP FOR ALL SETS OF PROCEDURE VARIABLES
13822         HRRZ T,TTYTBL(U)
13823         HRLI T,[ASCIZ / LOGIN  /]
13824         PUSHJ P,SGWAIT          ;ASK THE SYSTEM JOB TO PRINT OUT THE RELEVANT INFO
13825         SKIPL TTYTBL(U)         ;SKIP IF NOT CONSOLE CONTROLLED
13826          AOS SUSRS              ;INCREMENT COUNT OF LOGGED IN CONSOLE CONTROLLED TREES
13827         MOVEM A,UNAME(U)        ;SET UNAME TO WHAT LOGGED IN AS
13828         MOVEM A,SLGIV
13829         MOVEM A,USYSNM(U)       ;SET SNAME "
13830         MOVEM A,HSNAME(U)       ;SET HOME SNAME "
13831         MOVEM C,XUNAME(U)       ;SET XUNAME " " (USER MAY MUNG LATER)
13832         MOVEM B,TRMNAM(U)
13833         MOVEM B,SLGIV+2         ;INCLUDE TRMNAM AS SECOND NAME PRINTED
13834         PUSHJ P,DMNPLI          ;GIVE INFO TO DEMON
13835         JRST CLKOJ1             ;TURN CLK ON AND SKIP RETURN
13836
13837 ASETM2: UMOVE A,1(J)    ;.OPER 5
13838         MOVEM A,MSKST2(U)
13839 ASETMSK:        UMOVE D,(J)     ;OPER 4
13840         MOVE A,U
13841         MOVEI I,1
13842         SOS (P)         ;WILL SKIP RETURN
13843         JRST USMASK     ;ACT LIKE .SUSET.
13844
13845 ARSYSI: SKIPA A,[ITSVRS]        ;OPER 52
13846 ARDTIME:MOVE A,TIME             ;OPER 17
13847         JRST APTUAJ
13848
13849 IFE KS10P,[     ; On the KS10 they made DATAI 0, a UUO!
13850 ARDSW:  DATAI A                 ;OPER 20
13851         JRST APTUAJ
13852 ] ;IFE KS10P
13853 IFN KS10P, ARDSW==:ILUUO
13854
13855 ASUPSET:MOVEI C,003777  ;OPER 53
13856         XCTR XR,[AND C,(J)]
13857         MOVE D,SUPCOR   ;SAVE OLD CONTENTS
13858         XORB C,SUPCOR
13859         UMOVEM C,(J)
13860         HRROI A,SUPCOR
13861         JRST ASPST2
13862 \f
13863 ;       .CALL DET
13864 ;       ERROR RETURN
13865 ;       NORMAL RETURN
13866
13867 ;DET:   SETZ
13868 ;       SIXBIT /DETACH/
13869 ;       SETZ [<JOB SPEC>]       ;SEE NCORUI
13870
13871 ;DISOWN JOB'S ENTIRE TREE AND FREE CONSOLE.  IF TREE HAS NO
13872 ;CONSOLE, JUST MAKES IT DISOWNED.  NO ARG => THIS JOB'S TREE
13873 ;ALWAYS SKIPS IF THE JOB SPEC IS REASONABLE.
13874
13875 ;CTL BIT 1.1 => DON'T SET SIGN OF APRC (DON'T MAKE TREE "DISOWNED").
13876 ;CTL BIT 1.2 => USE SYSTEM TREE'S RESOURCE WORD
13877 ;CTL BIT 1.4 => KILL TREE AN HOUR FROM NOW IF IT ISN'T REOWNED
13878 ;CTL BIT 1.5 => SUPPRESS THE CONSOLE-FREE MESSAGE ON THE TTY
13879
13880 NDETAC: HLRZ B,A        ;XOR LH OF 1ST ARG INTO CTL BITS
13881         XORM B,CTLBTS(U)
13882         PUSHJ P,SWTL    ;MAKE SURE NOBODY ELSE IS REARRANGING TREES.
13883             TREESW
13884         MOVEI J,(U)     ;DEFAULT TO OUR TREE
13885         JUMPE W,NDETA0  ;JUMP IF NO ARGS SUPPLIED
13886         MOVE J,A        ;JOB SPEC
13887         JSP T,NCORUI    ;DECODE ARG, GET USER INDEX IN J
13888          JFCL           ;IGNORE INFO ON WRITEABILITY
13889         CAIG J,LUBLK    ;DONT DETACH SYSJOB OR CORE JOB
13890          JRST OPNL31
13891 NDETA0: SKIPL T,SUPPRO(J)       ;FIND TOP LEVEL JOB OF TREE (IN J)
13892          JRST [ MOVE J,T 
13893                 JRST NDETA0 ]
13894         HRRZ A,J        ;TOP OF TREE
13895         SKIPGE APRC(A)
13896          JRST LSWCJ1    ;TREE IS ALREADY DISOWNED.
13897         MOVEI Q,NDETA8
13898         PUSHJ P,IFPLUP  ;STOP ALL BUT THIS JOB
13899         PUSHJ P,NDETA7  ;DO THE WORK
13900         JRST LSWCJ1     ;UNSTOP THE TREE
13901
13902 NDETA7: PUSH P,U        ;US
13903         PUSH P,A        ;TOP LEVEL
13904         MOVEI U,(A)
13905         CONO PI,CLKOFF
13906         PUSHJ P,LOGUPD  ;FOR ACCOUNTING PURPOSES, THIS IS LIKE A LOGOUT
13907         CONO PI,CLKON
13908 NDETA1: MOVEI U,(A)     ;GET IN U USER INDEX OF OWNER OF TTY
13909         MOVE A,TTYTBL(U)        ;GET IN A TTY NUMBER
13910         TLNE A,%TBDTY   ;TREE HAS NO TTY =>
13911          JRST [ POP P,A ;JUST MAKE IT DISOWNED.
13912                 POP P,U
13913                 JRST NDETA5 ]
13914         JUMPL A,NDETA1  ;GAVE TTY AWAY
13915         MOVE T,(P)              ;TOP-LEVEL JOB OF TREE SAVES USER TTY OPTIONS IN
13916         MOVE B,TTYOPT(A)        ;HIS STTYOP VARIABLE
13917         AND B,[%TOUSR,,%TPUSR]
13918         MOVEM B,STTYOP(T)
13919         LDB B,[.BP (%TCRFS+%TCQRY),TTYCOM(A)]
13920         IORI B,4                ;MAKE STTYOP NON-ZERO TO SHOW IT WAS STORED
13921         DPB B,[170300,,STTYOP(T)]       ;OVERLAPS PADLF FIELD
13922         HRRZS A
13923         PUSH P,TTYSTS(A)        ;SAVE THIS TTY INFO
13924         PUSH P,TTYST1(A)        ;WILL PUT INTO TTY OWNER'S USER VARS
13925         PUSH P,TTYST2(A)        ;AFTER SUCCEED IN FREEING THE TTY
13926         MOVE B,A
13927         IMULI B,TPLEN*2
13928         MOVN B,TPVB+TPLEN(B)
13929         ADD B,TCMXV(A)
13930         PUSH P,B
13931         MOVSI B,%TCDET  ;IF TREE DETACHED DUE TO TOP LVL INT,
13932         SKIPN USER      ;THE CONSOLE FREE MESSAGE SHOULD SAY SO.
13933          IORM B,TTYCOM(A)       .SEE SYSCFM
13934                         ;THIS ALSO HAPPENS IF DIALUP LINE HUNG UP, OS'ERS BEWARE!
13935 ;DROPS THROUGH
13936 \f;DROPS IN
13937 IFN N11TYS,[
13938         CONO PI,CLKOFF
13939         PUSHJ P,TVBNCL  ;CLEAR VIDEO BUFFER #
13940         CONO PI,CLKON
13941 ];N11TYS
13942         MOVE B,-5(P)    ;GET BACK IDX OF RUNNING JOB
13943         MOVE B,CTLBTS(B)
13944         MOVSI T,%TACFM
13945         TRNE B,20       ;CTL BIT 1.5 => MARK THE TTY AS NOT NEEDING CNSL FREE MSG.
13946          IORM T,TTYSTA(A)
13947         PUSHJ P,TTYLO1  ;NOW MAKE CONSOLE FREE.
13948         POP P,B         ;CAN'T PCLSR AFTER THIS POINT
13949         DPB B,[$TBECL,,TTYTBL(U)]
13950         POP P,TTSTSV+1(U)       ;STORE INTO TTY'S OLD OWNER
13951         POP P,TTSTSV(U) ;OLD TTY VARS FROM BEFORE FREEING IT
13952         POP P,B
13953         MOVEM B,TTSTSV+2(U)
13954         SKIPA A,(P)     ;TOP LEVEL JOB
13955 NDETAA:  HRRZ A,T
13956         SKIPGE T,TTYTBL(A)      ;SKIP IF HE HAS IT
13957          JRST NDETAA    ;NOW DO GUY HE GAVE IT TO
13958         CAIE A,(U)
13959          BUG            ;BUT.  BUT.  BUT.
13960         MOVSI B,%TBNOT+%TBDTY   ;TAKEN FROM --ME-- AND DOESN'T HAVE IT
13961         IORM B,TTYTBL(A)
13962         HLLZS TTYTBL(A)
13963         POP P,A         ;TOP LEVEL
13964         POP P,U         ;US
13965         HLRO B,UNAME(A)
13966         AOSE B          ;IF DETACHED TREE WAS LOGGED IN
13967          SOS SUSRS      ;ONE LESS CONSOLE CONTROLLED TREE
13968 NDETA5: MOVSI B,BUMRTL  ;IF REQUESTED, MARK TREE AS DUE TO DIE
13969         MOVE D,CTLBTS(U) ;IN AN HOUR.
13970         ANDCAM B,APRC(A)
13971         TRNE D,10
13972          IORM B,APRC(A)
13973         CONO PI,CLKOFF  ;PERFORM ACCOUNTING FOR THIS USER AS IF HE WERE LOGGING OUT.
13974         EXCH U,A
13975         PUSHJ P,LOGUPD
13976         EXCH U,A
13977         MOVE D,JNAME(A) ;IF TOP LEVEL JOB ...
13978         CAME D,[SIXBIT /HACTRN/]        ;IS A HACTRN,
13979          JRST NDETA3
13980 NDETA2: AOS D           ;AOS ITS NAME LEVEL UNTIL ...
13981         PUSHJ P,UJNAMU  ;IT IS UNIQUE
13982          JRST NDETA2    ;(UJNAMU TURNS OFF CLOCK)
13983         MOVEM D,JNAME(A)
13984 NDETA3: EXCH U,A
13985         PUSHJ P,DMNPLI  ;LOG BACK IN, NAME MAY HAVE CHANGED FROM HACTRN TO HACTRO
13986         EXCH U,A
13987         CONO PI,CLKON
13988         MOVEI Q,NDETA9  ;NOW SAY ALL JOBS IN TREE
13989         JRST IFPLUP     ;ARE DISOWNED
13990
13991 NDETA8: CAIE A,(U)      ;IF JOB ISN'T SELF, STOP IT
13992          JRST IFSTOP
13993         POPJ P,
13994 \f
13995 ;"ATTACH" SYSTEM CALL:
13996 ;1ST ARG - JOB SPEC -> OUR INFERIOR, OR TOP OF A DISOWNED TREE.
13997 ;2ND ARG - TTY SPEC (OF A TTY WHICH MUST BE FREE)
13998  ;2ND ARG ABSENT => USE OUR CONSOLE, AND GUN OUR TREE
13999 ;CONTROL BIT 400000 => CHANGE JOB'S NAME TO HACTRN (IF 2 ARGS)
14000 ;                 4 => START JOB AFTER ATTACHING (JUST LIKE DETACH)
14001
14002 ;CONNECTS THE SPECIFIED JOB TO THE SPECIFIED TTY, AS A CONSOLE CONTROLLED TREE.
14003 ;IF THE TTY IS OUR CONSOLE, WE ARE LOGGED OUT.
14004 ;IF THE JOB IS OUR INFERIOR, IT IS FIRST DISOWNED.
14005
14006 NATTAC: PUSHJ P,SWTL
14007             TREESW
14008         SOJE W,NATTAN
14009         EXCH A,B        ;2ND ARG => IT IS TTY SPEC, SO DECODE IT.
14010         JSP J,ATTYCI
14011         MOVE A,B
14012         MOVE B,I        ;AND PUT IT IN B.
14013         JRST NATTA6
14014
14015 NATTAN: SKIPL B,SUPPRO(U) ;NO 2ND ARG => WE MUST BE TOP LEVEL, SINCE WE'LL HAVE
14016          JRST OPNL40      ;TO LOG OUT. B GETS NEGATIVE.
14017 NATTA6: MOVE J,A
14018         JSP T,NCRUI2    ;DECODE 1ST ARG, GET USR IDX IN J.
14019          JFCL
14020         SKIPGE A,SUPPRO(J)
14021          JRST NATTA5    ;JOB SPEC'D MUST BE EITHER
14022         CAIE U,(A)      ;OUR INFERIOR, OR
14023          JRST OPNL31
14024         JRST NATTA7
14025
14026 NATTA5: SKIPL APRC(J)   ;THE TOP OF A DISOWNED TREE.
14027          JRST OPNL31
14028 ;NOW IF TTY IS OUR CONSOLE, B IS NEGATIVE; OTHERWISE, B HAS TTY #.
14029 NATTA7: PUSH P,CTLBTS(U)
14030         SETZM CTLBTS(U) ;DON'T GET FAKED OUT AT NATTA1, NATTA2, DSWNTY.
14031         PUSH P,J
14032         MOVE A,J
14033         MOVEI Q,NDETA8  ;STOP SPEC'D JOB AND ITS INFERIORS.
14034         PUSHJ P,IFPLUP
14035         JUMPL B,NATTAG
14036 NATTAM: CONO PI,TTYOFF
14037         SKIPL T,TTYSTA(B)       ;SEE IF TTY IS FREE
14038          JRST NATTAL
14039         MOVSI T,(SETZ)  ;IT IS, GRAB IT
14040         ANDCAM T,TTYSTA(B)      .SEE %TACFM
14041         ANDCAM T,TTYSTS(B)      .SEE %TSFRE
14042         CONO PI,TTYON
14043         JRST NATTA8     ;SINCE NO PCLSR POSSIBLE, DON'T BOTHER WITH A LOSSET OF THESE
14044
14045 NATTAL: HRRE Q,TTYSTS(B)
14046         CONO PI,TTYON
14047         SKIPG Q         ;IF TTY IS IN USE
14048         TLNE T,%TACTZ   ;OR BEING ^Z'ED, DEVICE NOT AVAIL
14049          JRST [ SUB P,[2,,2] ? JRST OPNL10 ]
14050         MOVSI T,%TACFM+%TACTZ   ;OTHERWISE JUST WAIT FOR CONSOLE FREE
14051         TDNN T,TTYSTA(B)        ;MESSAGE TO FINISH COMING OUT
14052          PUSHJ P,UFLS
14053         JRST NATTAM
14054 \f
14055 NATTAG: MOVE A,U        ;IF HACKING OUR CONSOLE, MUST STOP OUR WHOLE TREE
14056         MOVEI Q,NDETA8  ;(EXCEPT US, OF COURSE - NDETA8 CHECKS THAT).
14057         PUSHJ P,IFPLUP
14058         MOVEI B,(U)
14059 NATTA4: MOVE B,TTYTBL(B) ;FIND THE TTY'S NUMBER.
14060         TLNE B,%TBDTY
14061          JRST NATTAL    ;THIS TREE HAS NO TTY?
14062         JUMPL B,NATTA4  .SEE %TBNOT
14063         PUSHJ P,SDTTY   ;GET TTY BACK TO TOP OF TREE FOR AGBLT3 LATER.
14064          BUG
14065         HRRO B,TTYTBL(U)
14066 ;I BELIEVE THAT NOTHING CAN PCLSR BEYOND THIS POINT.
14067 ;RH OF B HAS TTY #; SIGN IS SET IF TTY IS OUR CONSOLE.
14068 NATTA8: AOS TTNTO(B)    ;KEEP DSWNTZ FROM HALTING (WILL UNDO THIS LATER)
14069         PUSH P,B        ;PUSH <CONSOLE-FLAG>,,<TTY #>
14070         HRRZ A,-1(P)    ;LEGALITY OF CALL FULLY CHECKED; CAN START ALTERING.
14071         SKIPGE APRC(A)  ;IF SPEC'D JOB IS OUR INFERIOR, DISOWN IT.
14072          JRST NATTA9
14073         MOVE B,TTYTBL(A)
14074         TLNE B,%TBDTY   ;IF THE INFERIOR HAS THE TTY, TAKE IT AWAY.
14075          JRST NATTAF
14076         PUSHJ P,SDTTY
14077          BUG
14078 NATTAF: HRRZ A,-1(P)
14079         MOVEI Q,DSWNTY  ;JUST LIKE .DISOWN, BUT KNOW JOBS ARE ALREADY STOPPED.
14080         PUSHJ P,IFPLUP
14081         PUSHJ P,NATTA1
14082 NATTA9: MOVEI Q,NATTA2
14083         MOVE A,U
14084         SKIPGE (P)      ;IF HACKING OUR CONSOLE, DISOWN OUR TREE SO IT IS FREE.
14085          PUSHJ P,IFPLUP
14086                         ;OUR TTY NOW IN INCONSISTENT STATE SINCE WE ARE DISOWNED
14087                         ;BUT TTY STILL BELONGS TO US. AGBLT3 FIXES THAT.
14088         MOVE B,(P)
14089         SOSGE TTNTO(B)
14090          BUG
14091         MOVE TT,-1(P)   ;NOW "RE-OWN" THE SPEC'D JOB
14092         MOVE A,UNAME(TT);NOT CHANGING ITS UNAME
14093         HRRZ J,B        ;TO THE DESIRED TTY, WITH APPRO. RESOURCE WORD.
14094         MOVEI D,USRRCE(B)
14095         TLO D,400000    ;TELLS UFN2A THE TREE SHOULD BECOME UN-DISOWNED.
14096         SETZ B,         ;NO INTERRUPT BIT NEEDED.
14097         SETOM DLSRCH    ;INHIBIT SCHEDULING (UFN2A UNDOES THIS)
14098         PUSH P,U
14099         PUSHJ P,UFN2A
14100         POP P,U
14101         HRRZ A,-1(P)
14102         SKIPA C,A
14103 NATTAH:  MOVE C,D       ;FIND THE JOB IN THE TREE BEING ATTACHED
14104         MOVE D,TTYTBL(C)
14105         TLNN D,%TBDTY   ;THAT IS SUPPOSED TO GET CONTROL OF THE TTY.
14106          JRST NATTAH
14107         SETOM SUPPRO(A) ;BUT DON'T LEAVE IT THINKING IT IS OUR INFERIOR.
14108         SKIPGE I,(P)
14109          JRST NATTAD
14110         HLRE B,UNAME(A) ;ATTACHING JOB TO FREE TTY:
14111         AOSE B  
14112          AOS SUSRS      ;THIS MAY MEAN 1 MORE LOGGED IN CONSOLE-CTL'ED TREE.
14113         CONO PI,TTYOFF
14114         PUSHJ P,TTYINI  ;INIT TTYOPT, ECHO AREA, TTYCOM, TTYSTA.
14115         MOVSI B,%TSFRE  ;NOW MAKE TTY'S TTYSTS HAPPY
14116         ANDCAM B,TTYSTS(I)
14117         MOVSI B,%TSCNS
14118         IORM B,TTYSTS(I)
14119         HRRM A,TTYSTS(I)
14120         CONO PI,TTYON#1 ;TTYCHN ON, BUT NOT CLKCHN.
14121         PUSH P,U
14122         PUSH P,I        ;IF THE JOB BEING ATTACHED IS LOGGED IN,
14123         MOVE U,-3(P)    ;PERFORM ACCOUNTING FOR IT.
14124         HLRO T,UNAME(U)
14125         AOSE T
14126          PUSHJ P,LOGUPD
14127         POP P,I
14128         POP P,U
14129 ;DROPS THROUGH
14130 \f;DROPS IN
14131         MOVE D,['HACTRN]
14132         PUSHJ P,UJNAMU
14133          JRST NATTAI
14134         MOVE B,-2(P)    ;SAVED CTLBTS(U) AT ENTRY
14135         TRNE B,400000
14136          MOVEM D,JNAME(A)
14137 NATTAI: MOVE B,-2(P)    ;CTLBTS
14138         MOVSI D,%USTSP  ;BUSRC
14139         TRNE B,4
14140          ANDCAM D,USTP(A)       ;START JOB BEING ATTACHED, IF REQUESTED TO
14141         PUSH P,U
14142         HRRZ U,C        ;GET USR IDX GIVING TTY TO IN U,
14143 IFN N11TYS,[
14144         HRRZ T,I        ;TTY # IN T FOR USTTV0
14145         PUSHJ P,USTTV0  ;GIVE THE JOB A BLINKER IF IT DESERVES ONE.
14146          JFCL
14147 ]
14148         POP P,A         ;USR IDX TAKING TTY FROM (BUT NOT REALLY TAKING). I AND U STILL SET.
14149         PUSHJ P,AGBLT4  ;MOVE HIS PER-JOB VARIABLES INTO THE TTY'S VARIABLES, ETC.
14150         JRST NATTAE     ;CLOCK IS NOW BACK ON.
14151
14152 NATTAD: CONO PI,CLKOFF
14153         MOVE J,JNAME(U) ;ATTACHING OUR TTY TO JOB:
14154         MOVEM J,JNAME(A) ;GIVE JOB OUR JNAME ALONG WITH OUR TTY.
14155         MOVE A,U
14156         HRRZ U,C
14157         PUSHJ P,AGBLT6  ;TRANSFER TTY TO HIM, SAVING OUR TTY STATE AND LOADING HIS.
14158 NATTAE: MOVE U,A
14159         POP P,B
14160         EXCH U,(P)      ;U := USER INDEX OF TOP OF TREE BEING ATTACHED
14161         MOVSI T,BUMRTL  ;SINCE TREE HAS BEEN ATTACHED, IT SHOULDN'T
14162         ANDCAM T,APRC(U) ;DIE AN HOUR AFTER IT WAS DETACHED.
14163         SKIPN STTYOP(U) ;RESTORE SAVED TTY OPTIONS, IF ANY
14164          JRST NATTAP
14165         LDB T,[170200,,STTYOP(U)]
14166         DPB T,[.BP (%TCRFS+%TCQRY),TTYCOM(I)]
14167         MOVE T,[%TOUSR,,%TPUSR]
14168         ANDCAM T,TTYOPT(I)
14169         AND T,STTYOP(U)
14170         IORM T,TTYOPT(I)
14171 NATTAP: HLRE T,UNAME(U)
14172         CONO PI,CLKOFF
14173         AOSE T
14174          PUSHJ P,DMNPLI ;LOG HIM IN
14175         CONO PI,CLKON
14176         POP P,U
14177         SUB P,[1,,1]    ;FLUSH SAVED CTLBTS
14178         PUSHJ P,LSWCLR  ;UNSTOP THE JOBS AND FREE TREESW
14179         JUMPGE B,POPJ1  ;RETURN IF WE DIDN'T GIVE AWAY OUR CONSOLE.
14180         SETOM TTYTBL(U) ;DON'T WANT ALOGOU TO TYPE LOGOUT MESSAGE.
14181         JRST ALOGOUT    ;LOG THIS JOB OUT.
14182 \f
14183 ;.CALL DISOWN
14184 ; RH OF ARG IS JOB SPEC, OF OUR INFERIOR.
14185 ; LH OF ARG XOR CONTROL BITS:
14186 ;  1.1 => RETAIN PRIORITY (DON'T SET APRC)
14187 ;  1.2 => USE SYSTEM RESOURCE
14188 ;  1.3 => CLEAR .USTP AFTER DISOWNING (THUS AVOIDING TIMING ERROR)
14189 ;  1.4 => SET BUMRTL SO THAT JOB WILL BE GUNNED IF IT IS STOPPED FOR A WHOLE HOUR
14190 ;          AND NOT REOWNED OR ATTACHED.
14191
14192 NDISOWN:HLRZ J,A
14193         XORM J,CTLBTS(U) ;XOR LH OF 1ST ARG INTO CTL BITS.
14194         HRRZ J,A
14195         JSP T,NCRUI2    ;DECODE JOB SPEC; DON'T SET DIELOK.
14196          JFCL
14197         CAIN J,-1
14198          JRST OPNL31    ;PDP6 NO GOOD.
14199         MOVEI R,IOCHNM(U)
14200         ADD R,A         ; R GETS ADDR OF IOCHNM WORD IF ARG WAS CHANNEL #,
14201         TRNE A,400000   ;GET S0 IF ARG WAS OTHER SORT OF JOB SPEC.
14202          SETZ R,
14203         HRRZ A,J
14204         HRRZ J,SUPPRO(A)
14205         CAME J,U
14206          JRST OPNL31    ;NO GOOD IF NOT OUR INFERIOR.
14207         JRST NDISO1     ;JOIN OLD-STYLE DISOWN
14208
14209 ;.DISOWN CH,    ;MAKES DIRECTLY INFERIOR PROCEDURE OPEN ON CHANNEL CH
14210                 ;THE TOP LEVEL JOB OF A DISOWNED JOB
14211
14212 ADISOWN:HRRZ B,(R)      ;PICK UP CH TYPE INDEX
14213         SKIPL CLSTB(B) .SEE %CLSU       ;SKIP IF AN INF. USER CHANNEL
14214          JRST IOCER7    ;OTHER TYPE, GIVE IOC ERROR
14215         HLRZ A,(R)      ;PICK UP INF.'S INDEX
14216         SETZM CTLBTS(U)
14217 NDISO1: PUSHJ P,SWTL
14218             TREESW
14219         SETZM STTYOP(A)
14220         MOVE B,TTYTBL(A)
14221         TLNE B,%TBDTY   ;SKIP IF TTY TAKEN AWAY
14222          JRST ADISO1
14223         PUSH P,R
14224         PUSH P,A        ;JOB TO BE DISOWNED HAS THE TTY: TAKE IT AWAY.
14225         PUSHJ P,SDTTY
14226          BUG
14227         POP P,A
14228         POP P,R
14229 ADISO1: MOVEI Q,DSWNTY
14230         PUSHJ P,IFPHAK  ;HACK INFERIORS
14231         CAME U,USER
14232          BUG
14233         PUSHJ P,NATTA1  ;FLUSH OUR POINTERS TO INFERIOR, AND SET FLAGS
14234         CAME U,USER
14235          BUG
14236         JRST LSWCJ1     ;UNSTOP HIS TREE AND FREE TREESW
14237
14238 ;FLUSH INFERIOR-JOB CHANNELS FROM JOB IN U TO JOB IN A
14239 ;CANNOT PCLSR BECAUSE JOB IS CURRENT OR STOPPED ALREADY
14240 NATTA1: MOVEI R,0       ;NO PROTECTED CHANNEL
14241         MOVEI D,%CLSU
14242         EXCH U,A
14243         PUSHJ P,ZUSES1  ;FLUSH POINTERS TO INFERIOR
14244         EXCH U,A
14245         SETOM SUPPRO(A) ;MARK AS TOP LEVEL
14246         MOVE W,CTLBTS(U)
14247         MOVSI TT,BUSRC  ;CLEAR .USTP IF REQUESTED
14248         TRNE W,4
14249          ANDCAM TT,USTP(A)
14250         MOVSI TT,BUMRTL
14251         TRNE W,10
14252          IORM TT,APRC(A)
14253         POPJ P,
14254
14255 DSWNTY: SKIPL TTYTBL(A)
14256          BUG            ;CHECKED AT HIGHER LEVEL, DATA INCONSISTENT
14257 NATTA2: TDZA T,T        ;DO SOS TTNTO OF CONSOLE TTY.
14258 NDETA9:  SETO T,        ;DON'T.
14259         PUSHJ P,CHSCAA  ;LOOK AT ALL CNHLS
14260             PUSHJ P,DSWNTZ      ;BLESSING CONSOLE TTY CHNLS
14261         MOVEI TT,SYSRCE ;SET RESOURCE POINTER TO SYSTEM OR DISOWNED
14262         MOVE W,CTLBTS(U);DEPENDING ON CTLBTS
14263         TRNN W,2
14264          MOVEI TT,USRRCE+NCT
14265         MOVEM TT,UTMPTR(A)
14266         MOVSI T,400000
14267         TRNN W,1
14268          IORM T,APRC(A) ;MARK AS DISOWNED
14269         POPJ P,
14270
14271 ;BLESS CONSOLE TTY CHANNELS. IF T NONZERO, DON'T SOS TTNTO.
14272 DSWNTZ: HLRZ B,(R)      ;GET LH OF IOCHNM WORD
14273         HRRZ J,(R)      ;GET DEV TYPE INDEX
14274         CAIL J,TYIDN    ;SKIP IF LESS THAN LEAST TTY INDEX
14275          CAILE J,TYOBN  ;SKIP UNLESS .LTEQ. HIGHEST
14276           POPJ P,       ;NOT A TTY CHANNEL
14277         TRZ B,#%TICNS#(.BM $TIIDX)
14278         TRZE B,%TICNS   ;SKIP IF NOT A CONSOLE TTY
14279          CAIN B,%TINON  ;DO NOTHING TO "DISOWNED" TTY CHNLS
14280           POPJ P,
14281         MOVEI J,%TINON  ;CHANGE OTHER TTY CHNLS TO DISOWNED
14282         DPB J,[$TIIDX,,(R)]     ;CHNLS.
14283         JUMPN T,CPOPJ   ;IN NDETAC, TTNTO ALREADY SETZM'D.
14284         SOSLE TTNTO(B)  ;DECREMENT OPEN COUNT
14285          POPJ P,
14286         BUG             ;SHOULD BE OPEN AT HIGHER LEVELS
14287
14288 ;ROUTINE TO SCAN ALL I/O CHANNEL AND I/O PDL SLOTS OF A PROCEDURE
14289 ;R 4.9=1 => REGULAR CHANNEL  4.9=0 => IOPUSHED CHANNEL
14290 CHSCAA: MOVEI R,IOCHNM(A)
14291 CHSCAN: HRLI R,-20
14292 CHSCA2: XCT @(P)
14293         AOBJN R,CHSCA2
14294         HRLI R,-<LUIOP/2>+400000
14295 CHSCA4: XCT @(P)
14296         ADD R,[1,,2]
14297         JUMPG R,CHSCA4
14298         JRST POPJ1
14299 \f;
14300 ;IFPHAK AND IFPLUP TAKE A USER INDEX IN A AND THE ADDRESS OF A ROUTINE
14301 ;       IN Q.  THEY CALL THE ROUTINE FOR THE PROCEDURE AND ALL OF ITS
14302 ;       INFERIORS BUT IFPHAK ALSO STOPS THE SPECIFIED PROCEDURE AND
14303 ;       ALL ITS INFERIORS STRINGING THEIR USTP'S INTO THE CURRENT USER'S
14304 ;       LSWPR.
14305 ;
14306 IFPHAK: PUSH P,U
14307         PUSH P,Q
14308         MOVE U,USER     ;MADE SURE YOU USE THE RIGHT LSWPR
14309         MOVEI Q,IFSTOP  ;SET UP TO STOP
14310         PUSHJ P,IFPLUP
14311         POP P,Q
14312         POP P,U
14313 IFPLUP: PUSH P,E        ;SAVE E
14314         PUSH P,H        ; " H
14315         SKIPA H,A
14316 IFPLU5: MOVE A,E        ;RECURSE
14317         PUSH P,H
14318         PUSH P,Q
14319         PUSHJ P,(Q)     ;CALL ROUTINE
14320         POP P,Q
14321         POP P,H
14322         MOVEI E,LUBLK*2 ;INITIALIZE TO INDEX OF JOB AFTER CORE JOB
14323 IFPLU2: SKIPN UNAME(E)
14324         JRST IFPLU3
14325         HRRZ T,SUPPRO(E)
14326         CAIN T,(A)
14327         JRST IFPLU5
14328 IFPLU3: ADDI E,LUBLK    ;STEP TO NEXT VAR BLOCK
14329         CAMGE E,USRHI   ;SKIP IF ALL EXAMINED
14330         JRST IFPLU2     ;NOT ALL, CONTINUE
14331         CAME H,A        ;ALL, SKIP IF BACK TO TOP LEVEL
14332         JRST IFPLU4     ;NOT AT TOP LEVEL, POP UP
14333         POP P,H         ;RESTORE H
14334         POP P,E         ; " E
14335         POPJ P,         ;RETURN FROM CALL TO IFPLUP
14336
14337 IFPLU4: MOVE E,A        ;POP
14338         HRRZ A,SUPPRO(A)        ;UP
14339         JRST IFPLU3     ;AND CONTINE
14340
14341 IFSTOP: PUSHJ P,RPCLSR  ;STOP ROUTINE WHOSE INDEX IS IN A
14342         HRRZ T,USTP(A)
14343         SOJE T,IFSTP1
14344         SKIPE LSWB0+1(A)
14345         JRST UPCLSR     ;HAVE ALREADY HACKED THIS GUY
14346 IFSTP1: MOVEI T,USTP(A) ;GET LOC OF USTP (WAS AOSED BY RPCLSR)
14347         MOVEI H,LSWB0(A)        ;GET LOC OF A LOCKED SWITCH BLOCK OF PROC STOPPED
14348         MOVEM T,(H)     ;SET WD1
14349         PUSH P,U
14350         HRRZ T,U
14351         IDIVI T,LUBLK
14352         POP P,U
14353         HRL T,LSWPR(U)
14354         IORI T,603000   ;SOS WHEN UNLOCKED
14355         MOVSM T,1(H)
14356         MOVEM H,LSWPR(U)        ;ADD TO LOCKED SWITCH LIST OF USER
14357         POPJ P,
14358 \f
14359 UBLAM:  SKIPL APRC(U)   ;SKIP IF DISOWNED
14360          PUSHJ P,SDTTY  ;GET TTY UP TO THIS LEVEL
14361           JFCL
14362 UBLAST: PUSHJ P,IODCL   ;CLOSE IO DEVICES ETC
14363 UBLST2: SETZ B,
14364         PUSH P,U        ;DO NOT USE THIS ROUTINE FOR CORING UP.
14365         HRRZ Q,U
14366 IFE SWPWSP,[
14367         CAME Q,BUSR
14368          JRST UBLST4
14369         SETOM BUSR      ;SWAP-BLOCKED NO MORE
14370         SOS NUSWB
14371         MOVSI TT,(SETZ)
14372         ANDCAM TT,USWSCD(U)
14373 ];SWPWSP
14374 UBLST4: MOVE U,USER
14375         PUSHJ P,ACRF1   ;CORE DOWN TO NUM OF BLOCKS IN B
14376          BUG
14377         MOVE U,USER     ;;CHECK FOR ALLEGED BUG SOMEPLACE IN ACRF1
14378         SKIPL CORRQ(U)  ;
14379          BUG            ;;NOT SUPPOSED TO RETURN UNTIL CORE REQUEST SATISFIED
14380         POP P,U
14381         SKIPE NMPGS(U)  ;
14382          BUG            ;;THUS GUY'S CORE SHOULD BE GONE BY NOW
14383         POPJ P,
14384
14385
14386 AEOFC:  UMOVE B,(J)
14387         LDB B,[400,,B]  ;OPER 50
14388         ADDI B,IOCHNM(U)
14389         MOVE A,(B)
14390         MOVE A,CLSTB(A)
14391         HLR A,(B)
14392 IFN NUNITS,     TLNE A,%CLSDI
14393 .ALSO           SKIPA A,UTEOF(A)
14394         MOVEI A,EOFCH
14395         JRST APTUAJ
14396
14397 ;OPER TO REQUEST OR FLUSH RUNNING IN IOT USER MODE
14398 AIOTLS: MOVSI A,400000
14399         MOVSI B,%PCUIO
14400         XCTR XR,[SKIPGE (J)]
14401          JRST AIOTL1    ;JUMP IF WANT TO ENTER IOTLSR MODE
14402         ANDCAM A,IOTLSR(U)
14403         ANDCAM B,UUOH
14404         POPJ P,
14405
14406 AIOTL1: SKIPGE IOTLSR(U)
14407          JRST AIOTL2    ;ALREADY IN IOTLSR, JUST TURN THE BIT ON AGAIN FOR HIM
14408         BUG INFO,SIXBIT,UNAME(U),SIXBIT,JNAME(U),[IOTLSR]
14409         MOVEI T,SCRMSG  ;WAIT FOR IT TO BE PRINTED (HA HA WHAT ABOUT BUFFERING?)
14410         TDNE T,SUPCOR
14411          PUSHJ P,UFLS
14412         IORM A,IOTLSR(U)
14413 AIOTL2: IORM B,UUOH
14414         JRST CLKONJ
14415 \f
14416 SUBTTL FILENAME TRANSLATION
14417
14418 ;ROUTINE TO TRANSLATE A FILENAME.
14419 ;WANTS DEV, FN1, FN2, SNAME IN A, B, C, D RESP. LEFT-JUST.
14420 ;WANTS MODE IN RH OF E.
14421 ;RETURNS TRANSLATED NAMES IN SAME PLACE.
14422 TRAN:   SKIPN D ;MAYBE DEFAULT THE SNAME.
14423 TRAN6:  MOVE D,USYSNM(U)
14424         MOVEM B,EPDLT1(U)
14425         MOVEM C,EPDLT2(U)
14426         MOVEM D,EPDLT3(U)
14427         MOVEM A,EPDLT4(U)
14428         SKIPN TRNCNT    ;IF NO TRANSL. ENTRIES IN USE,
14429         JRST POPJ1      ;SHORT CUT.
14430         PUSHJ P,TRANRF  ;GET READ ACCESS TO TRANSL LISTS.
14431         LDB I,[100,,E]  ;GET INPUT/OUTPUT BIT.
14432         MOVEI H,10      ;MAX. NUM. TRANSLS ALLOWED.
14433 TRAN0:  HRROI Q,(U)     ;1ST TRY THIS JOB'S TRNLST.
14434         MOVE J,TRNLST(U)
14435         JRST TRAN5
14436 TRAN1:  SKIPGE Q,SUPPRO(Q)      ;MOVE UP TREE TO TRNLS1.
14437         SETZ Q,         ;AFTER TOP OF TREE, USE SYS.
14438 TRAN2:  MOVE J,TRNLS1(Q)        ;USE THIS GUY'S TRNLS1.
14439         MOVEI Q,(Q)     ;INDICATE THAT FACT IN SIGN.
14440         JRST TRAN5
14441 TRAN3:  CAME B,TRANI1(J)        ;ENTRY'S FN1 MATCHES
14442         SKIPN TRANI1(J) ;OR IS NULL?
14443         SKIPA TT,TRANI2(J)      ;YES, GET FN2.
14444         JRST TRAN4      ;NO, TRY NEXT ENTRY.
14445         CAME TT,C       ;FN2 MTCHES OR NULL.
14446         JUMPN TT,TRAN4
14447         CAME D,TRANIS(J)        ;SNAME ?
14448         SKIPN TRANIS(J)
14449         SKIPA TT,TRANID(J)      ;YES, GET DEV.
14450         JRST TRAN4
14451         CAME A,TT
14452         JUMPN TT,TRAN4  ;TEST DEV.
14453         HLRZ TT,TRANLK(J)       ;GET ENTRY'S MODE BITS.
14454         TRNN TT,1(I)    ;TRANSLATE OUR MODE?
14455         JRST TRAN4      ;NO.
14456         MOVEM B,EPDLT1(U)
14457         MOVEM C,EPDLT2(U)
14458         MOVEM D,EPDLT3(U)
14459         MOVEM A,EPDLT4(U)
14460 IRPS X,,OD O1 O2 OS
14461         SKIPE TRAN!X(J)
14462         MOVE A+.IRPCN,TRAN!X(J)
14463 TERMIN                  ;REPLACE NAMES FROM ENTRY.
14464         TRNE TT,400000  ;ATOMIC?
14465         JRST TRANX3     ;YES, EXIT.
14466         SOJG H,TRAN0    ;ELSE RETRANSL.
14467         JRST TRANX2     ;IF TOO MANY TRANSL., DON'T SKIP.
14468
14469 TRAN4:  HRRE J,TRANLK(J)        ;CDR DOWN LIST.
14470 TRAN5:  JUMPGE J,TRAN3  ;TRY NEXT UNLESS AT END.
14471         JUMPL Q,TRAN2   ;IF DID TRNLST, DO SAME JOB'S TRNLS1.
14472         JUMPN Q,TRAN1   ;ELSE DO SUPPRO'S TRNLS1.
14473 TRANX3: AOS (P)         ;EXIT IF DID SYS.
14474 TRANX2: SOS TRNREF      ;NO LONGER USING TRANSL. LISTS.
14475         POPJ P,
14476
14477 TRANRF: AOS TRNREF      ;SAY USING TRANSL. LISTS.
14478         SKIPGE TRANSW
14479         POPJ P,         ;OK IF NOT BEING CHANGED.
14480         SOS TRNREF      ;NOT REFERENCING AFTER ALL.
14481         SKIPL TRANSW    ;WAIT TILL FREE.
14482         PUSHJ P,UFLS
14483         JRST TRANRF     ;TRY AGAIN.
14484 \f;TRANS SYSTEM CALL.
14485 NTRNS:  JSP T,DEFARG    ;DEFAULT 5 ARGS TO 0.
14486         5
14487         XOR E,CTLBTS(U) ;XOR CTL BITS WITH ARG S
14488         PUSHJ P,TRAN    ;TRANSLATE NAME.
14489          JRST OPNL3             ;FAIL IF TOO MANY TRANSL.
14490         JRST POPJ1      ;ELSE GIVE BACK TRANSL'D NAMES.
14491
14492
14493 DEFARG: CAML W,(T)      ;IF NOT ALL SPEC'D,
14494         JRST 1(T)
14495         SETZM A(W)      ;DEFAULT ONE AND RETRY.
14496         AOJA W,DEFARG
14497
14498 ;LOCK TRANSW, AND SET UP 1ST ARG FOR NTRNAD, NTRNDL, NTRNCL.
14499 ;RH OF A HAS JOB SPEC; CONTROL BIT ARGS XOR'D INTO LH.
14500 ;THE 4.8 BIT, IF SET, INDICATES TRNLS1 RATHER THAN TRNLST.
14501 ;OTHER LH BITS IGNORED,, NOT CHANGED BY NTRNUI.
14502 ;ON RETURN, A'S LH IS UNCHANGED, RH IS SUCH THAT
14503 ;   TRANLK(A) IS THE ADDR OF THE SPECIFIED TRNLS VAR.
14504 NTRNUI: PUSHJ P,SWTL
14505          TRANSW
14506         TSC A,CTLBTS(U)
14507         MOVEI J,(A)
14508         JSP T,NCRUI2    ;DECODE THE JOB-SPEC.
14509          JRST NTRNU1    ;JOB GUARANTEED WRITEABLE.
14510         JUMPE J,NTRNU1  ;ALLOW JOBS TO MUNG THE SYSTEM TRANSLATION LIST.
14511         JSP T,NCORWR    ;ELSE CHECK.
14512          JRST OPNL31    ;NOT WRITEABLE.
14513 NTRNU1: CAIN J,-1
14514          JRST OPNL34    ;PDP6??
14515         HRRI A,TRNLST-TRANLK(J)
14516         TLNE A,200000   ;4.8 BIT SAYS WHICH TRNLS TO USE.
14517         ADDI A,TRNLS1-TRNLST
14518         JRST (Q)
14519
14520 ;GET UP TO 4 ARGS INTO D ... D+3, FROM AOBJN PTR IN B.
14521 NTRNGA: MOVSI H,-4      ;UP TO 4 ARGS.
14522         JUMPGE B,NTRNG3
14523 NTRNG0: UMOVE J,(B)
14524         JUMPGE W,NTRNG2 ;W IS -1 FOR .TRANA, .TRAND;
14525         TRNN H,-1       ;IN THAT CASE LEFT-JUST. DEV. (1ST ARG)
14526         HRLZI J,(J)
14527 NTRNG2: CAMN J,[SIXBIT/*/]
14528         MOVEI J,0       ;REPLACE * BY BLANK.
14529         MOVEM J,D(H)    ;STORE AWAY.
14530         AOBJP H,CPOPJ   ;DONE AFTER 4TH ARG.
14531         AOBJN B,NTRNG0  ;ELSE GET NEXT.
14532 NTRNG3: SETZM D(H)      ;ZERO REMAINING ARGS.
14533         AOBJN H,NTRNG3
14534         POPJ P,
14535 \f;TRANEX CALL  --  READ IN A JOB'S TRANSL LIST.
14536 ;1ST ARG RH - JOB SPEC. BIT 4.8 - IF SET, TRNLS1 NOT TRNLST.
14537 ;2ND ARG AOBJN -> PLACE TO STORE LIST INTO.
14538 ;UPDATED AOBJN PTR IS OUTPUT ARG.
14539 ;SKIPS IF ENTIRE LIST FIT IN BUFFER.
14540 ;EACH ENTRY TAKES 9 WDS OF SPACE: MODE,, IN 1ST,
14541 ;INPUT DEV, FN1, FN2, SNAME; THEN OUTPUT DEV, FN1, FN2, SNAME.
14542 NTRNEX: PUSHJ P,TRANRF  ;GET READ ACCESS TO TRANSL LISTS.
14543         PUSHJ P,SOSSET  ;RELINQUISH IF BLOCKED.
14544         TRNREF
14545         TSC A,CTLBTS(U)
14546         MOVEI J,(A)
14547         JSP T,NCRUI2    ;DECODE THE JOB SPEC.
14548          JFCL           ;NOT TRYING TO WRITE.
14549         HRRI A,TRNLST-TRANLK(J)
14550         TLNE A,200000   ;MAKE TRANLK(A) BE TRNLS VAR.
14551         ADDI A,TRNLS1-TRNLST
14552         SUB B,[1,,1]    ;SINCE WE AOBJ BEFORE ACTING.
14553 NTRNE1: HRRE T,TRANLK(A)        ;AT END -> RETURN SKIPPING.
14554         JUMPL T,NTRNE8
14555         HLLZ D,TRANLK(T)        ;RETURN LH ONLY OF 1ST WD.
14556         TLOA T,-9
14557 NTRNE2: MOVE D,TRANLK(T)        ;ALL OF OTHER 8 WDS.
14558         AOBJP B,[       PUSHJ P,OPNL37
14559                         JRST NTRNE9]
14560         ;FAIL IF NO ROOM.
14561         UMOVEM D,(B)
14562         ADDI T,SIOMT-1
14563         AOBJN T,NTRNE2  ;STORE ALL 9.
14564         MOVEI A,-9*SIOMT(T)     ;GO TO NEXT.
14565         JRST NTRNE1
14566
14567 NTRNE8: AOS (P)
14568         AOBJP B,.+1     ;COMPENSATE FOR SUB .
14569         PUSHJ P,LSWPOP  ;RELEASE READ ACCESS.
14570 NTRNE9: MOVE A,B
14571         JRST SYSCPT     ;RETURN AOBJN PTR.
14572 \f;TRANDL CALL -- DELETE ENTRY FROM TRANSL LIST.
14573 ;1ST ARG RH JOB SPEC. OF JOB WHICH IS OK TO MODIFY.
14574 ;1ST ARG LH MODE BITS AS FOR .TRANAD, ALSO 4.8 BIT SAYS TRNLS1
14575 ;       (SPEC'D JOB AND INFS, RATHER THAN JUST SPEC'D JOB)
14576 ;2ND ARG AOBJN -> INPUT DEV, FN1, FN2, SNAME. (ONLY DEV NEC.).
14577 ;SKIPS IF SOMETHING WAS DELETED.
14578 NTRNDL: JSP Q,NTRNUI    ;PROCESS 1ST ARG., LOCK TRANSW.
14579 NTRND:  PUSHJ P,NTRNDA  ;ACTUALLY DELETE.
14580         JRST OPNL4      ;NOTHING TO DELETE => FILE NOT FOUND
14581         JRST LSWPJ1     ;SKIP IF NTRNDA DID.
14582
14583 NTRNDA: TLZ A,-1#400003
14584         PUSHJ P,NTRNGA  ;ELSE GET INPUT NAMES.
14585         SKIPGE TRANLK(A)
14586         POPJ P,
14587         HRRZS (P)       ;CLEAR SKIP FLAG.
14588         SKIPA T,A
14589 NTRND2: MOVEI T,(H)     ;CDR DOWN BOTH PTRS.
14590 NTRND0: HRRE H,TRANLK(T)        ;LOOK AT NEXT ENTRY.
14591         JUMPL H,NTRNDX  ;EXIT IF END.
14592         CAMN D,TRANID(H)        ;ALL 4 INPUT NAMES MUST MATCH.
14593         CAME E,TRANI1(H)
14594         JRST NTRND2     ;ELSE NOT TO BE DELETED.
14595         CAMN TT,TRANI2(H)
14596         CAME I,TRANIS(H)
14597         JRST NTRND2
14598         HLLZ R,A        ;GET MODE FROM ARG.
14599         TLZ R,400000    ;DONT CLOBBER ATOM BIT
14600         ANDCA R,TRANLK(H)       ;TURN OFF IN MODE FROM ENTRY.
14601         CAME R,TRANLK(H)        ;IF DELETED ONE, CALL WILL SKIP.
14602         HRROS (P)
14603         MOVEM R,TRANLK(H)
14604         TLNE R,3                ;IF NEITHER DIRECTION LEFT, SPLICE OUT.
14605         JRST NTRND2
14606         SKIPE TRNREF    ;WAIT TILL NOONE READING TRANSL LISTS.
14607         PUSHJ P,UFLS
14608         SOS TRNCNT      ;ONE LESS ENTRY IN USE.
14609         HRRZ R,TRANFL   ;MAKE LINK -> CURRENT FREE LIST.
14610         EXCH R,TRANLK(H)
14611         HRRM R,TRANLK(T)        ;REST OF TRNLS INTO PREDECESSOR'S LINK.
14612         HRRZM H,TRANFL  ;ADD THIS ONE TO FREE LIST.
14613         JRST NTRND0
14614
14615 NTRNDX: HRRES TRANLK(A) ;IN CASE DELETED 1ST ENTRY.
14616         SKIPGE (P)
14617         AOS (P)         ;SKIP IF SET FLAG.
14618         POPJ P,
14619 \f;TRANAD CALL. -- ADD AN ENTRY TO A TRANSL LIST.
14620 ;1ST 2 ARGS AS FOR TRANDL.
14621 ;3RD ARG LIKE 2ND BUT GIVES OUTPUT NAMES.
14622 ;SKIPS UNLESS ALL ENTRIES WERE IN USE.
14623 NTRNAD: JSP Q,NTRNUI
14624 NTRNA:  TLNN A,3        ;IF RELLY NOTHING WOULD BE TRANSL'D,
14625          JRST LSWPJ1    ;DON'T BOTHER ADDING..
14626         PUSHJ P,NTRNDA  ;DELETE ANY EXISTING TRANSL. FOR THESE INPUT NAMES.
14627         JFCL            ;IF WERE NONE.
14628         SKIPGE T,TRANFL
14629         JRST OPNL5      ;NO FREE ENTRIES - DIRECTORY FULL.
14630         AOS TRNCNT      ;1 MORE ENTRY IN USE.
14631 IRPS X,,ID I1 I2 IS
14632         MOVEM D+.IRPCN,TRAN!X(T)
14633 TERMIN                  ;PUT INPUT NAMES INTO ENTRY.
14634         MOVE B,C
14635         PUSHJ P,NTRNGA  ;GET OUTPUT NAMES.
14636 IRPS X,,OD O1 O2 OS
14637         MOVEM D+.IRPCN,TRAN!X(T)
14638 TERMIN                  ;STORE OUTPUT NAMES.
14639         MOVE H,TRANLK(A)        ;PUT CURRENT TRNLS INTO LINK.
14640         EXCH H,TRANLK(T)
14641         HRREM H,TRANFL  ;STORE BACK REST OF FREE LIST.
14642         MOVEM T,TRANLK(A)       ;TRNLS NOW STARTS WITH THSI ONE.
14643         HLLM A,TRANLK(T)        ;STORE MODE BITS.
14644         JRST LSWPJ1
14645 \f;TRANCL CALL -- RESET A ONE OR BOTH TRANSL LISTS FOR A JOB.
14646 ;1ST ARG RH HAS JOB SPEC OF MODIFYABLE JOB.
14647 ; BIT 4.8 CLEAR TRNLS1 VAR. (TRANSL FOR THIS JOB & INFS).
14648 ; BIT 4.7 CLEAR TRNLST VAR. (TRANSL FOR THIS JOB ONLY).
14649 ; ALWAYS SKIPS IF VALID.
14650 NTRNCL: JSP Q,NTRNUI    ;RH(A) -> TRNLST OR TRNLS1 VAR.
14651         TLNE A,200000
14652         SUBI A,TRNLS1-TRNLST    ;MAKE -> TRNLST VAR.
14653         SUBI A,TRNLST-TRANLK
14654         JRST NTRNC4
14655
14656 NTRNCA: SUBI A,TRNLST-TRANLK    ;MAKE HOLD USR IDX.
14657 NTRNC:  PUSHJ P,SWTL    ;GET WRITE ACCESS.
14658         TRANSW
14659 NTRNC4: AOS (P)
14660         SKIPE TRNREF    ;WAIT FOR READ REFS TO FINISH.
14661         PUSHJ P,UFLS
14662         TLNN A,100000   ;IF 4.7, HANDLE TRNLST.
14663         JRST NTRNC0
14664         HRRE T,TRNLST(A)
14665         SETOM TRNLST(A) ;SET LIST TO NIL.
14666         JUMPGE T,NTRNC1 ;IF WASN'T NIL, FREE ENTRIES ON IT.
14667 NTRNC0: TLZN A,200000   ;MAYBE HANDLE TRNLS1.
14668         JRST LSWPOP
14669         HRRE T,TRNLS1(A)
14670         SETOM TRNLS1(A)
14671         JUMPL T,LSWPOP  ;NOTHING TO DO IF ALREADY NIL.
14672 NTRNC1: MOVEI C,(T)     ;SAVE START OF LIST.
14673 NTRNC2: SOS TRNCNT      ;UPDATE NUM ENTRIES IN USE.
14674         HRRES H,TRANLK(T)
14675         JUMPL H,NTRNC3  ;AT END, SPLICE INTO FREELIST.
14676         MOVEI T,(H)     ;ELSE CDR DOWN.
14677         JRST NTRNC2
14678 NTRNC3: EXCH C,TRANFL
14679         HRRZM C,TRANLK(T)
14680         JRST NTRNC0     ;MAYBE CONSIDER THE OTHER LIST.
14681 \f;.TRANA, .TRAND CALLS.
14682 ATRANA: UMOVE E,(B)
14683         JSP T,ATRNDT    ;SET UP ARGS FOR NTRNA .
14684         PUSHJ P,SWTL    ;GET WRITE ACCESS.
14685         TRANSW
14686         JRST NTRNA
14687
14688 ATRNDL:
14689 ATRAND: XCTR XR,[SKIPN E,(B)]
14690         JRST ATRND0     ;ZERO UNAME -> TRANCL .
14691         JSP T,ATRNDT    ;SET UP ARGS.
14692         PUSHJ P,SWTL    ;GET WRITE ACCESS.
14693         TRANSW
14694         JRST NTRND
14695
14696 ATRND0: JSP T,ATRNDT
14697         TLO A,300000    ;SAY CLEAR BOTH LISTS.
14698         CAMN D,[SIXBIT/*/]
14699         SUBI A,TRNLS1-TRNLST    ;NAKE SURE -> TRNLST VAR.
14700         JRST NTRNCA
14701
14702 ATRNDT: MOVE C,JNAME(U)
14703         MOVEM C,ATRNJN  ;WHO THE HELL'S USING THESE?
14704         CAME E,UNAME(U) ;UNAME MUST BE 0 OR THSI JOB'S.
14705         JUMPN E,CPOPJ   ;ELSE MAKE UUO FAIL.
14706         MOVNI W,1       ;SIGNAL TO NTRNGA.
14707         MOVEI C,5(B)    ;SET UP 2 AOBJN PTRS
14708         MOVEI B,2(B)
14709         HRLI C,-3       ;-> INPUT NAMES (B), OUTPUT NAMES (C).
14710         HRLI B,-3
14711         XCTR XR,[HLL A,(B)]     ;GET MODE BITS.
14712         UMOVE D,-1(B)
14713         JUMPE D,CPOPJ   ;JNAME MUSTN'T BE 0.
14714         CAME D,[SIXBIT/*/]      ;IF *, USE THIS JOB'S TRNLS1.
14715         JRST ATRND2
14716         HRRI A,TRNLS1-TRANLK(U)
14717         JRST (T)
14718
14719 ATRND2: MOVEI H,0       ;ELSE FIND JOB WITH THAT JNAME.
14720         MOVE E,UNAME(U) ;THIS JOB'S UNAME.
14721 ATRND1: CAMN E,UNAME(H)
14722         CAME D,JNAME(H)
14723         JRST ATRND3     ;NOT THE ONE WE'RE LOOKING FOR.
14724         HRRE E,SUPPRO(H)
14725         CAIE U,(E)      ;IS THIS OUR INF.
14726         CAIN U,(H)      ;IS IT THE CURRENT JOB?
14727         CAIA
14728         POPJ P,         ;NO, CAN'T SET ITS TRANSL LIST.
14729         HRRI A,TRNLST-TRANLK(H)
14730         JRST (T)        ;OK, SET ITS TRNLST VAR.
14731 ATRND3: ADDI H,LUBLK
14732         CAMGE H,USRHI   ;LOOK AT ALL JOBS.
14733         JRST ATRND1
14734         POPJ P,         ;CAN'D TRANAD NON EX JOB.
14735 \f
14736 SUBTTL JOB, BOJ DEVICE ROUTINES
14737
14738 EBLK
14739 JBMN==10        ;MAXIMUM NUMBER OF JOBS ON JOB DEVICE
14740
14741 JBCUI:  REPEAT JBMN,-1  ;-1 => CHNL FREE, ELSE (IF JBCG POSITIVE) CREATOR'S USR IDX.
14742 JBCG:   BLOCK JBMN      ;-1 IF CREATOR GONE AWAY
14743 JBWST:  REPEAT JBMN,SNJOB       ;CREATED JOB'S WAIT STATUS (CREATED JOB=HANDLER JOB)
14744 %JB==1,,525252
14745 %JBWIN==400000  ;4.9 => CREATED JOB HAS DONE A SUCCESSFUL JOBRET
14746 %JBREU==200000  ;4.8 => JOB CLOSED AND MADE ITSELF AVAILABLE FOR REUSE
14747 %JBVAL==020000  ;4.5 => VALID BIT (CREATOR CAME IN, NO JOBRET YET)
14748 %JBSTR==010000  ;4.4 => STORED BIT (CREATOR CAME IN, NO JOBGET YET)
14749 %JBUNH==004000  ;4.3 => BOJ BLK UNHANG BIT
14750 %JBSIO==001000  ;4.1 => IF DOING AN IOT, THIS BITS SAYS ITS REALLY A SIOT
14751 %JBLOS==000400  ;3.9 => CREATED JOB WAS CLOSED AND KNOWS IT, SO DON'T REUSE
14752         ;1.1-2.9 => LAST STATUS SET BY BOJ
14753
14754 JBDEV:  BLOCK JBMN      ;DEVICE NAME, USER-SETTABLE (MOSTLY FOR PEEK AND WHO LINES)
14755 JBFN1:  BLOCK JBMN      ;FN1
14756 JBFN2:  BLOCK JBMN      ;FN2
14757 JBSYS:  BLOCK JBMN      ;SYSNAME
14758 JBOPNM: BLOCK JBMN      ;OPEN MODE
14759 JBFNP:  BLOCK JBMN      ;BP TO ASCIZ FILENAME STRING IN USER ADDRESS SPACE (OR 0 IF NONE).
14760 JBCJUI: BLOCK JBMN      ;RH = CREATED JOB'S USER INDEX.
14761                         ;LH = -1 IFF CREATED JOB GOING AWAY.  JOB MUST EXIST
14762                         ;SINCE WHEN IT DIES IT FLUSHES THE JOB CHANNEL
14763                         ;AND ITS CREATOR'S CHANNELS.
14764 JBSTS:  BLOCK JBMN      ;STATUS OF JOB-BOJ INTERACTIONS
14765 ;4.9=1 => IMAGE =0 => ASCII
14766 ;4.8=1 => BLOCK =0 => UNIT
14767 ;4.7=1 => WRITE =0 => READ
14768 ;4.6-4.3 => NUMBER OF TIMES TO SKIP
14769 ;4.2-3.6 => OPEN LOSS
14770 ;3.5-3.2 => # OF ARGS ON LAST .CALL
14771 ;1.4 => SYSTEM CALL OTHER THAN THOSE BELOW.
14772 ;1.3-1.1 => SYSTEM CALL
14773         ;0      OPEN
14774         ;1      IOT OR SIOT
14775         ;2      MLINK
14776         ;3      RESET
14777         ;4      RCHST
14778         ;5      ACCESS
14779         ;6      FDELE (DELETE OR RENAME)
14780         ;7      FDELE (RENAME WHILE OPEN)
14781
14782 JBST2:  BLOCK JBMN      ;SECOND WORD OF JOBGET INFO
14783                         ;FOR UNIT IOT, 1
14784                         ;FOR SIOT, THE BYTE COUNT
14785                         ;FOR BLOCK IOT, THE BLOCK POINTER
14786                         ;NEW FN1 FOR RENAME, MLINK.
14787 JBOFN1: BLOCK JBMN      ;FN1 BEFORE LAST TRANS
14788 JBOFN2: BLOCK JBMN      ;FN2 "" ""
14789 JBOSYN: BLOCK JBMN      ;SYSNAM ""
14790 JBODEV: BLOCK JBMN      ;DEV  " "
14791 JBNFN2: BLOCK JBMN      ;NEW FN2 FOR FDELE.
14792 JBAC7:  BLOCK JBMN      ;7TH ARG TO .CALL, NEW SNAME FOR MLINK.
14793 JBAC10: BLOCK JBMN      ;TABLE FOR .CALL ARG 10, FIRST BP ARG TO SOPEN/RENAME/MLINK/DELETE.
14794 JBAC11: BLOCK JBMN      ;TABLE FOR .CALL ARG 11, SECOND BP ARG TO RENAME, MLINK OR RENMWO.
14795
14796 JBACTB: JBST2(H)        ;TABLE OF POINTERS TO .CALL ARG TABLES
14797         JBOFN1(H)
14798         JBOFN2(H)
14799         JBOSYN(H)
14800         JBODEV(H)
14801         JBNFN2(H)
14802         JBAC7(H)
14803         JBAC10(H)
14804         JBAC11(H)
14805
14806 JBIOCJ: BLOCK JBMN      ;IO CHNL ERROR WORD.  4.9 => IOCER ON NEXT JOB IOT
14807                         ;RH = IOCER TYPE
14808
14809 JBSW:   -1              ;LOCK ON ASSIGNMENT OF INDEX IN ABOVE TABLES
14810         0
14811 BBLK
14812 \f
14813 ;OPEN ON BOJ: DEVICE
14814
14815 ;3.5 = 1 => UNHANG ON BLK IOT AFTER EACH XFER OF MAXIMAL SIZE
14816 BOJO:   JUMPN W,OPNL12  ;NO SUCH MODE
14817         SKIPGE E,JBI(U) ;JOB CHANNEL INDEX
14818          JRST [ MOVE E,OPTION(U) ;IF THIS JOB ISN'T A JOB DEVICE,
14819                 TLNN E,%OPOJB   ;IF IT'S EXPECTING TO BE AN OJB DEVICE, OK.
14820                  JRST OPNL10    ;OTHERWISE IT CAN'T WIN.
14821                 SKIPGE JBI(U)   ;IF IT CAN WIN, WAIT TILL IT HAS.
14822                  PUSHJ P,UFLS
14823                 JRST BOJO]      ;THEN TRY AGAIN.
14824         CAIL E,JBMN
14825          BUG            ;JOB CHANNEL INDEX TOO BIG
14826         CAME U,JBCJUI(E)
14827          BUG
14828         HRLZ A,E
14829         HLRZS C
14830         MOVSI TT,%JBUNH
14831         TRNE C,20
14832          IORM TT,JBWST(E)
14833         JSP Q,OPSLC7
14834             BDUAI,,BDUAO
14835             BDBI,,BDBO
14836             BDUII,,BDUIO
14837             BDBI,,BDBO
14838 \f
14839 ;OPEN ON JOB: DEVICE
14840 ;MODE BITS:
14841 ;3.1-3.3 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
14842 ;A,B HAVE FILENAMES, RH(C) HAS DEVICE (JOB OR OJB)
14843 ;RH(D) AND LH(C) BOTH HAVE OPEN-MODE.
14844
14845 JOBO:   PUSHJ P,FLDRCK
14846          JRST JOBO3
14847           JRST OPNL11   ;ILLEGAL FILE NAME
14848 JOBO3:  CAMN A,[SIXBIT /M.F.D./]
14849          CAME B,[SIXBIT /(FILE)/]
14850           JRST JOBO2
14851         JRST OPNL11     ;ILLEGAL FILE NAME
14852 JOBO2:  MOVEI J,0       ;SET J TO JOBGET "COMMAND" NUMBER
14853         CAIN W,2
14854          MOVEI J,2      ;MLINK, MOSTLY JUST LIKE FDELE, BUT SEE JOBOF3
14855         CAIN W,4
14856          MOVEI J,6      ;FDELE
14857         MOVNI E,1
14858         MOVSI Q,-JBMN
14859         PUSHJ P,SWTL    ;LOCK JOB CHNL ASSIGN SWITCH
14860             JBSW
14861 JOBO5:  SKIPGE TT,JBCUI(Q)      ;SKIP IF NOT FREE
14862          JRST JOBO4
14863         MOVE T,UUOH
14864         TLNN T,%PCFPD
14865          JRST JOBORU    ;JUMP IF THIS IS FIRST ATTEMPT TO OPEN
14866         HRRZ H,C
14867         CAIN H,'OJB
14868          JRST JOBO6
14869         SKIPGE JBCG(Q)  ;LOOK FOR CHANNEL ON WHICH THIS USER
14870          CAIE TT,(U)    ;PREVIOUSLY ATTEMPTED TO OPEN, BUT PCLSRED
14871           JRST JOBO6
14872         MOVE T,EPDLT1(U)
14873         MOVE TT,EPDLT2(U)
14874         CAMN T,JBFN1(Q)
14875          CAME TT,JBFN2(Q)
14876           JRST JOBO6            ;NOT OPENING SAME FILE
14877         MOVE TT,EPDLT4(U)
14878         MOVE T,EPDLT3(U)
14879         CAMN TT,JBDEV(Q)
14880          CAME T,JBSYS(Q)
14881           JRST JOBO6            ;NOT FOR SAME FILE
14882         CONO PI,CLKOFF
14883         HLRZ H,C
14884         HRRZ T,JBSTS(Q)
14885         CAIN T,(J)
14886          CAME H,JBOPNM(Q)
14887           JRST JOBO6            ;NOT FOR SAME OPEN TYPE AND MODE
14888         MOVE TT,JBWST(Q)
14889         TLNE TT,%JBLOS+%JBWIN+%JBREU
14890          JRST JOBO6             ;HANDLER JOB NOT IN CORRECT STATE
14891         HRRZ E,Q        ;REUSE SAME HANDLER JOB AS IN PREVIOUS ATTEMPT TO OPEN
14892         SETZM JBCG(E)   ;I'M BACK
14893         PUSHJ P,LSWPOP  ;FREE JBSW
14894         TLO TT,%JBVAL
14895         MOVEM TT,JBWST(E) ;RE-GIVE OPEN COMMAND STILL SITTING IN JBSTS ETC.
14896         HRLI E,400000   ;OPEN-TYPE WAIT
14897         PUSHJ P,JBWT2   ;WAIT FOR HANDLER JOB TO PROCESS IT
14898         JRST JOBO8      ;FINISH OFF THEN OPEN
14899
14900 ;FIRST ATTEMPT TO OPEN, CHECK FOR REUSEABLE HANDLER JOBS BEFORE CREATING NEW
14901 JOBORU: CONO PI,CLKOFF
14902         MOVE TT,JBWST(Q)
14903         SKIPGE JBCG(Q)
14904          TLZN TT,%JBREU
14905           JRST JOBO6    ;IN USE ALREADY OR NOT WILLING TO BE REUSED
14906         MOVE T,EPDLT4(U)
14907         CAMN T,JBODEV(Q)
14908          JRST JOBOR1    ;IF SAME SIMULATED DEVICE, OK TO SIEZE
14909         CAMN A,JBOFN1(Q)
14910          CAME B,JBOFN2(Q)
14911           JRST JOBO6    ;DIFFERENT HANDLER NAME
14912         MOVE T,USYSN1(U)
14913         CAME T,JBOSYN(Q)
14914          JRST JOBO6     ;DIFFERENT HANDLER NAME
14915 JOBOR1: MOVEM TT,JBWST(Q) ;THIS ONE OK, SIEZE IT
14916         HRRZ E,Q
14917         MOVEM U,JBCUI(E)
14918         HLRZM C,JBOPNM(E)
14919         SETZM JBCG(E)
14920         SETZM JBIOCJ(E)
14921         PUSHJ P,LSWPOP  ;FREE JBSW
14922         JRST JOBO7
14923 \f
14924 JOBO4:  HRRZ E,Q        ;REMEMBER FREE JOB CHNL IN CASE NEEDED
14925 JOBO6:  CONO PI,CLKON
14926         AOBJN Q,JOBO5   ;SCAN REST OF JOB CHANNELS
14927         JUMPL E,OPNL6   ;DEVICE FULL
14928         MOVEM U,JBCUI(E);STORE CREATOR'S USER INDEX
14929         PUSHJ P,LSWPOP  ;FREE JOBSW
14930         PUSHJ P,STMSET  ;SETOM JBCUI(E) ON LOSSAGE
14931             JBCUI(E)
14932         SETZM JBDEV(E)
14933         SETZM JBFNP(E)
14934         HLRZM C,JBOPNM(E)
14935         SETZM JBCG(E)
14936         SETZM JBIOCJ(E)
14937         MOVEI T,SNJOB   ;INITIALIZE STATUS
14938         MOVEM T,JBWST(E)
14939         PUSH P,R
14940         PUSH P,U
14941         PUSH P,J
14942         PUSH P,D
14943         PUSH P,E
14944         PUSH P,A
14945         PUSH P,B
14946         ANDI C,-1       ;FOR OJB DEVICE, LOOK FOR EXISTING JOB.
14947         CAIN C,'OJB
14948          JRST JOBO6B
14949         MOVE A,UNAME(U) ;FOR JOB DEVICE, CREATE NEW JOB.
14950         IDIVI E,10.
14951         MOVEI B,'0(E)
14952         LSH B,6
14953         ADDI B,'0(TT)
14954         ADD B,[SIXBIT /JOB./]   ;CREATE JNAME = 'JOB.MN'
14955         MOVE C,[7,,(SIXBIT /USR/)]
14956         MOVE D,[SETZ 3]
14957         PUSHJ P,USROJ   ;GENERATE USER(CAN ONLY PCLSR BEFORE CREATING INFERIOR)
14958          JRST POP7J     ;USER OPEN FAILED, MUST HAVE GONE TO OPNL ALREADY
14959         CONO PI,CLKOFF
14960         POP P,B
14961         POP P,A
14962         POP P,E
14963         SETOM SUPPRO(TT)
14964         MOVE T,[JBSTCD,,AC0S]
14965         ADDI T,(TT)
14966         BLT T,AC17S(TT)
14967         HRLZI T,%PCUSR
14968         MOVEM T,UPC(TT)
14969         MOVEM A,AC0S+10(TT)
14970         MOVEM B,AC0S+11(TT)
14971         MOVE T,USYSN1(U)
14972         MOVEM T,USYSNM(TT)      ;SET CREATED JOB'S SYS NAME TO OURS
14973         SETZM USTP(TT)          ;START JOB AS SOON AS CLK BACK ON
14974         JRST JOBO6C
14975 \f
14976 ;OJB: DEVICE, LOOK FOR JOB WHOSE NAMES ARE THE FILENAMES SPECIFIED IN THE OJB OPEN.
14977 JOBO6B: MOVE C,[7+UBPFJ,,'USR]  ;DON'T EVER CREATE JOB FOR OJB.
14978         MOVE D,[SETZ 3+UBPFJ_<-1>]
14979         PUSHJ P,USROOJ
14980          JRST POP7J
14981         SUB P,[2,,2]
14982         POP P,E
14983 ;TT HAS USER IDX OF JOB TO BE USED; CAN'T PCLSR AFTER THIS POINT.
14984 JOBO6C: PUSHJ P,LSWDEL  ;SETOM JBCUI(E)
14985         POP P,D
14986         POP P,J
14987         POP P,U
14988         POP P,R
14989         HRRZM TT,JBCJUI(E)
14990         MOVEM E,JBI(TT)
14991 JOBO7:  CONO PI,CLKOFF
14992         MOVE TT,EPDLT1(U)
14993         MOVEM TT,JBOFN1(E)
14994         MOVEM TT,JBFN1(E)
14995         MOVE TT,EPDLT2(U)
14996         MOVEM TT,JBOFN2(E)
14997         MOVEM TT,JBFN2(E)
14998         MOVE TT,EPDLT3(U)
14999         MOVEM TT,JBOSYN(E)
15000         MOVEM TT,JBSYS(E)
15001         MOVE TT,EPDLT4(U)
15002         MOVEM TT,JBODEV(E)
15003         MOVEM TT,JBDEV(E)
15004         MOVE TT,EPDL(U)
15005         MOVEM TT,JBAC10(E)
15006         MOVE TT,EPDL3(U)
15007         MOVEM TT,JBAC11(E)
15008         JUMPN J,[PUSHJ P,JFDEL5 ;DELETE/RENAME/MLINK
15009                  JRST JOBO9]
15010         LDB TT,[000300,,JBOPNM(E)]
15011         ROT TT,-3
15012         MOVEM TT,JBSTS(E)
15013         HRRZ C,JBOPNM(E)        ;GET ALL OF OPEN MODE
15014         MOVEM C,JBNFN2(E)       ;GIVE IT
15015 JOBO9:  PUSHJ P,JBWT1           ;STORE STUFF AND HANG
15016 JOBO8:  LDB TT,[350400,,JBSTS(E)]
15017         JUMPE TT,JOBOPL         ;OPEN LOST
15018         LDB C,[000400,,JBSTS(E)]
15019         JUMPN C,[ SETOM JBCG(E) ;DELETE/RENAME/MLINK
15020                   JRST POPJ1 ]
15021         MOVE C,JBOPNM(E)
15022         SETZM IOCHST-IOCHNM(R)
15023         HRLZ A,E
15024         JSP Q,OPSLC7
15025             JDUAI,,JDUAO
15026             JDBI,,JDBO
15027             JDUII,,JDUIO
15028             JDBI,,JDBO
15029
15030 JOBOPL: LDB C,[270600,,JBSTS(E)]
15031         SETOM JBCG(E)
15032         SKIPE C
15033          CAILE C,NOPNLS
15034           MOVEI C,22
15035         JRST OPNL1-1(C)
15036
15037 ;RENAME WHILE OPEN ON JOB CHNL
15038 JFDEL4: HLRZ E,(TT)     ;JOB CHNL INDEX
15039         MOVEI J,7
15040         PUSHJ P,JFDEL5  ;DO "FDELE"
15041         MOVE TT,EPDL3(U) ;PASS ALONG THE BP ARG IF THERE WAS ONE.
15042         MOVEM TT,JBAC11(E)
15043         SETZM JBAC10(E)
15044         JRST AIOCA1     ;GET RESULTS
15045
15046 ;FDELE/RENMWO/MLINK ON JOB CHANNEL
15047 JFDEL5: MOVEM J,JBSTS(E)
15048         MOVE TT,SRN3(U)   ;REMEMBER NAMES TO RENAME AS
15049         MOVEM TT,JBST2(E) ;FOR JOBGET TO RETURN.
15050         MOVE TT,SRN4(U)
15051         MOVEM TT,JBNFN2(E)
15052         MOVE TT,SRN5(U)   ;IN CASE THIS IS MLINK, MAKE SURE THE "TO" SNAME
15053         MOVEM TT,JBAC7(E) ;IS GIVEN TO JOBGET.
15054         CONO PI,CLKOFF
15055         POPJ P,
15056 \f
15057 ;GIVE AN INTERRUPT TO THE JOB DEVICE HANDLER.
15058 ;JOB CHNL INDEX IN E,  CLOBBERS TT,J,Q,H
15059 ;CALL WITH CLKOFF
15060
15061 JBINT:  HRRZ TT,JBCJUI(E)
15062         MOVEI J,IOCHNM(TT)
15063         HRLI J,-20
15064         MOVSI H,%CLSBJ
15065 JBINT1: MOVE Q,(J)
15066         TDNN H,CLSTB(Q) ;SKIP IF BOJ
15067 JBINT2:  AOBJN J,JBINT1
15068         JUMPGE J,CPOPJ
15069         SUBI J,IOCHNM(TT)
15070         MOVE Q,CHNBIT(J)
15071         IORM Q,IFPIR(TT)
15072         ADDI J,IOCHNM(TT)
15073         JRST JBINT2
15074
15075 ;THIS IS THE CODE PUT IN THE ACS TO LOAD IN THE JOB DEVICE HANDLER
15076
15077 JBSTCD: .OPEN 1,7       ;0
15078          .LOGOUT
15079         .CALL 12
15080          .LOGOUT
15081         .IOT 1,2
15082         .CLOSE 1,
15083         JRST (2)
15084         4,,(SIXBIT /DSK/)       ;7
15085         0       ;10 FN1
15086         0       ;11 FN2
15087         SETZ    ;12
15088         SIXBIT /LOAD/
15089         16
15090         SETZ 17
15091         -1      ;16 (LOAD INTO SELF)
15092         1       ;17
15093
15094 ;HAND THE JOB DEVICE HANDLER A SYSTEM CALL AND WAIT FOR IT TO BE HANDLED.
15095 ;CALL WITH CLOCK OFF, JOB CHNL IN E
15096 JBWT1:  TLOA E,400000   ;OPEN/FDELE/MLINK, CLOSE CHANNEL IF PCLSR
15097 JBWT:    TLZ E,400000   ;NORMAL ENTRY POINT, DON'T CLOSE IF PCLSR
15098         TLZA E,200000
15099 JBWTI:   HRLI E,200000  ;ENTER HERE TO INHIBIT SETTING %PCFPD IF PCLSR
15100         MOVSI TT,%JBVAL+%JBSTR
15101         IORM TT,JBWST(E)        ;TURN ON VALID AND STORED
15102 JBWT2:  PUSHJ P,JBINT   ;GIVE INT
15103         PUSHJ P,LOSSET
15104             JBPCL       ;CLEAR VALID AND STORED IF PCLSR
15105         MOVE T,E        ;CAUSES EPDL2 TO HAVE JOB INDEX
15106         PCLT
15107 JBFLS:  SKIP JBFLS
15108         PUSHJ P,UFLS    ;AWAIT RESULTS FROM HANDLER JOB
15109         MOVSI TT,%PCFPD
15110         ANDCAM TT,UUOH  ;NOW WE KNOW WE'LL RETURN TO USER WITHOUT PCLSRING FIRST
15111         JRST LSWDEL
15112
15113 JBPCL:  MOVE A,AC0S+E(U)        ;HERE IF PCLSR OUT
15114         SKIPL JBCJUI(A)         ;UNLESS HANDLER GOING AWAY
15115          TLNE A,200000          ;OR THIS SYSTEM CALL DOESN'T WANT IT,
15116           JRST JBPCL1
15117         MOVSI T,%PCFPD          ;SET FIRST PART DONE FLAG
15118         IORM T,UPC(U)           ;NOTE PCLSR HAS ALREADY MOVED UUOH INTO UPC
15119 JBPCL1: MOVSI T,%JBVAL+%JBSTR   ;NOT VALID, NOT STORED
15120         ANDCAM T,JBWST(A)
15121         JUMPGE A,CPOPJ
15122         SETOM JBCG(A)   ;SAY THE CREATOR HAS CLOSED IT
15123 IRPS X,,E TT J Q H
15124         PUSH P,X
15125 TERMIN
15126         MOVE E,A        ;AND GIVE THE HANDLER AN INTERRUPT
15127         PUSHJ P,JBINT
15128 IRPS X,,H Q J TT E
15129         POP P,X
15130 TERMIN
15131         POPJ P,
15132 \f
15133 ;JOB DEVICE BLOCK MODE IOT EITHER DIRECTION
15134 JBBI:   XCTR XRW,[MOVES D,(C)]  ;REFERENCE POINTER
15135         LDB B,[410300,,D]
15136         CAIGE B,3
15137          POPJ P,
15138         MOVEM D,JBST2(A)
15139         MOVE B,C
15140         HRRZ T,D        ;-> FIRST WORD TO TRANSFER
15141         HLROS D         ;MINUS WORD COUNT
15142         IORI D,700000   ;FLUSH CHAR COUNT
15143         SUBM T,D        ;D -> LAST WORD + 1 TO TRANSFER
15144         JRST JBIPG      ;SWAP IN BUFFER THEN DO IOT
15145
15146 ;JOB DEVICE UNIT MODE IOT EITHER DIRECTION
15147         JRST JBSI       ;SIOT
15148 JBUI:   MOVSI T,%JBSIOT
15149         ANDCAM T,JBWST(A)
15150         MOVEI T,1
15151         MOVEM T,JBST2(A)
15152         UMOVE W,(C)     ;FOR UNIT OUTPUT
15153 JBIOT1: HRRZ TT,JBOPNM(A)
15154         ROT TT,-3       ;MODE
15155         HRRI TT,1       ;IOT CMD
15156         HRRZ E,A        ;JOB CHNL INDEX
15157         MOVEM TT,JBSTS(E)
15158         MOVEM C,SRN3(U) ;MAY BE ADDRESS OF BLOCK IOT POINTER
15159         CONO PI,CLKOFF
15160         SKIPL TT,JBIOCJ(E)
15161          JRST JBWTI     ;GO SIGNAL HANDLER JOB
15162         SETZM JBIOCJ(E) ;TAKE IOC ERROR INSTEAD
15163         JRST IOCERF-MIOTER(TT)
15164
15165 ;JOB DEVICE SIOT EITHER DIRECTION
15166 JBSI:   AOS (P)                 ;SIOT SHOULD SKIP RETURN
15167         MOVSI T,%JBSIOT
15168         IORM T,JBWST(A)
15169         XCTR XRW,[MOVES T,(B)]  ;BYTE PNTR ARG
15170         LDB E,[300600,,T]       ;BYTE SIZE
15171         MOVEI D,36.
15172         IDIVM D,E       ;E := # BYTES PER WORD
15173         XCTR XRW,[MOVES D,(C)]  ;BYTE COUNT ARG
15174         MOVEM D,JBST2(A)
15175         IDIV D,E        ;D := WORD COUNT, E := EXCESS BYTES
15176         IBP T           ;-> FIRST WORD TO TRANSFER
15177         ADD D,T
15178         SOJLE E,JBIPG
15179 JBSI1:  IBP D
15180         SOJG E,JBSI1
15181 JBIPG:  HRRZS D         ;-> LAST WORD TO TRANSFER + 1
15182         ANDI T,-2000    ;-> FIRST PAGE INVOLVED IN TRANSFER
15183         LDB E,[.BP .UII#.UIO,JBOPNM(A)] ;0 INPUT 1 OUTPUT
15184 JBIPG1: SKIPE E         ;SWAP IN THE NECESSARY PAGES
15185          XCTR XR,[SKIPA 20(T)]
15186           XCTR XRW,[MOVES 20(T)]
15187         ADDI T,2000
15188         CAMGE T,D
15189          JRST JBIPG1
15190         JRST JBIOT1
15191 \f
15192 ;FLSINS ROUTINE TO WAIT FOR CREATOR TO BE HUNG AT JBFLS
15193 ;4.9 OF SRN3 = 1 => WAIT FOR WRITE   0 => READ
15194 ;1.1-1.4 => CODE OF UUO TO WAIT FOR
15195
15196 BJWAIT: SKIPE B,FLSINS(T)
15197          CAME B,JBFLS
15198           POPJ P,       ;NOT HUNG AT JBFLS
15199         HRRZ B,EPDL2(T) ;JOB INDEX THAT CREATOR IS HACKING
15200         HLRZ E,T        ;JOB INDEX OF BOJ USER
15201         CAME B,E
15202          POPJ P,        ;CREATOR HACKING JOB DEVICE ON SOME OTHER CHANNEL
15203         MOVE TT,JBSTS(B)
15204         LSH TT,2        ;4.9 => READ/WRITE BIT NOW
15205         EQV TT,SRN3(U)  ;4.9 OF SRN3 => WHAT TO LOOK FOR
15206         JUMPGE TT,CPOPJ ;DOESN'T MATCH
15207         MOVE TT,JBSTS(B) ;INSN CREATOR IS DOING
15208         XOR TT,SRN3(U)  ;INSN LOOKING FOR
15209         TRNN TT,17
15210          AOS (P)        ;THEY MATCH, AWAKEN BOJ JOB
15211         POPJ P,
15212 \f
15213 ;BOJ DEVICE UNIT MODE OUTPUT
15214 BJUO:   SKIPGE C
15215          SKIPA H,(C)
15216           UMOVE H,(C)
15217         MOVEI B,1       ;WAIT FOR INPUT IOT
15218         MOVEM B,SRN3(U)
15219         HRLZ T,A        ;JOB INDEX
15220         HRR T,JBCUI(A)  ;CREATOR'S USER INDEX
15221         PUSHJ P,CWAIT   ;WAIT FOR CREATOR TO BE IN IOT, RETURN WITH CLK OFF
15222             PUSHJ P,BJWAIT
15223         PUSHJ P,BJUO1
15224         JRST CLKONJ
15225
15226 BJUO1:  MOVE TT,JBSTS(A)
15227         TLNE TT,200000
15228          JRST BJUOB     ;BLOCK MODE CREATOR IOT
15229         LDB D,[.BP (%JBSIOT),JBWST(A)]
15230         JUMPN D,BJUOS   ;CREATOR SIOT
15231         MOVEM H,AC0S+W(T)
15232 BJIUNH: MOVSI D,%JBWIN
15233         IORM D,JBWST(A) ;SET SUCCESSFUL JOBRET BIT
15234         MOVSI D,%JBVAL+%JBSTR
15235         ANDCAM D,JBWST(A)
15236         MOVEI D,0
15237         DPB D,[350400,,JBSTS(A)]        ;DON'T SKIP
15238         EXCH D,FLSINS(T)        ;RESTART CREATOR
15239         CONSO PI,1
15240          CAME D,JBFLS
15241           BUG           ;HE WASNT WHERE HE BELONGED
15242         POPJ P,         ;NEED NOT CLKON, CALLER WILL TURN IT ON
15243
15244 ;BOJ UNIT OUTPUT TO JOB SIOT
15245 BJUOS:  PUSHJ P,BJBINI
15246         XCTRI XBYTE,[IDPB H,(B)]
15247          SKIPA C,AC0S+C(T)
15248           BUG
15249         XCTR XRW,[SOSG (C)]
15250          JRST BJIUNP
15251         JRST PLDZ
15252
15253 BJBINI: HRLI T,%UMALL
15254         MOVE J,T
15255         PUSHJ P,PLD1
15256         MOVE B,AC0S+B(T)
15257         XCTRI XRW,[MOVE D,(B)]
15258          POPJ P,
15259         BUG
15260
15261 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT
15262 BJUOB:  PUSHJ P,BJBINI
15263         SKIPL JBSTS(A)
15264          JRST BJUOBA    ;ASCII
15265         XCTRI XW,[MOVEM H,(D)]
15266          CAIA
15267           BUG
15268         ADD D,[1,,1]
15269         XCTRI XW,[MOVEM D,(B)]
15270          CAIA
15271           BUG
15272         JUMPGE D,BJIUNP
15273         JRST PLDZ
15274
15275 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT, ASCII MODE
15276 BJUOBA: LDB E,[410300,,D]       ;CHAR COUNT
15277         CAIGE E,3
15278          JRST BJIUNP
15279         XCTRI XR,[MOVE W,(D)]
15280          SKIPA E,BTOCHT-3(E)
15281           BUG
15282         IDPB H,E
15283         XCTRI XW,[MOVEM W,(D)]
15284          CAIA
15285           BUG
15286         ADD D,[700000,,]
15287         TLNN D,500000
15288          ADD D,[500001,,1]
15289         XCTRI XW,[MOVEM D,(B)]
15290          CAIA
15291           BUG
15292         TLNE D,700000
15293          JRST PLDZ
15294 BJIUNP: PUSHJ P,BJIUNH  ;UNHANG CREATOR
15295         JRST PLDZ
15296 \f
15297 ;BOJ DEVICE BLOCK OUTPUT
15298 BJBO:   SKIPGE JBCG(A)
15299          POPJ P,
15300         XCTR XRW,[MOVES D,(C)]  ;D GETS IOT POINTER
15301         LDB E,[410300,,D]
15302         CAIGE E,3
15303          POPJ P,
15304         HLRO B,D
15305         IORI B,700000   ;FLUSH CHAR CNT
15306         HRRZ T,D
15307         SUB T,B
15308         CAILE T,-1
15309          JRST IOADC             ;DON'T WRAP AROUND (WHY NOT?)
15310         UMOVE H,(D)             ;H GETS FIRST WORD
15311         MOVEI B,1
15312         PUSHJ P,BJBWT           ;WAIT FOR JOB INPUT IOT, COME BACK WITH CLK OFF.
15313          JRST CLKONJ            ;UNHANG
15314         MOVEI I,1               ;FOR BJBB
15315         MOVE TT,JBSTS(A)
15316         TLNE TT,200000
15317          JRST BJBB      ;CREATOR IOT IS IN BLOCK MODE
15318         JUMPGE TT,BJBOA ;CREATOR IOT IS ASCII
15319         ADD D,[1,,1]
15320 BJBO1:  PUSH P,C
15321         PUSH P,D
15322         PUSHJ P,BJUO1
15323         POP P,D
15324         POP P,C
15325         XCTRI XW,[MOVEM D,(C)]
15326          SKIPA T,IOTTB+BDBO
15327           BUG
15328 BJBEX:  TLNN D,700000
15329          JRST CLKONJ    ;BOJ BLOCK POINTER EXHAUSTED
15330         MOVE E,JBWST(A)
15331         CONO PI,CLKON
15332         TLNN E,%JBVAL   ;SKIP IF JOB IOT STILL WAITING FOR MORE
15333          TLNN E,%JBUNH
15334           JRST (T)      ;TRANSFER MORE
15335         POPJ P,         ;UNHANG BOJ IOT PREMATURELY
15336
15337 ;BOJ BLOCK ASCII OUTPUT FETCH CHARACTER
15338 BJBOA:  MOVE E,BTOCHT-3(E)
15339         MOVE W,H
15340         ILDB H,E
15341         ADD D,[700000,,]
15342         TLNN D,500000
15343          ADD D,[500001,,1]
15344         JRST BJBO1
15345
15346 ;BOJ BLOCK IOT WAIT.  AWAITS JOB IOT, UNLESS UNHANGING.
15347 ;TURNS CLKOFF.  SKIPS UNLESS SUPPOSED TO UNHANG.
15348 BJBWT:  MOVEM B,SRN3(U)         ;SAVE WHAT JOB UUO TO WAIT FOR
15349         HRLZ T,A                ;SET UP ARG FOR BJWAIT FLSINS
15350         HRR T,JBCUI(A)
15351         MOVE TT,JBWST(A)        ;CHECK FOR DON'T HANG MODE
15352         TLNE TT,%JBUNH
15353          JRST BJBWT1
15354         PUSHJ P,CWAIT           ;WAIT FOR JOB IOT
15355             PUSHJ P,BJWAIT
15356         JRST POPJ1
15357
15358 BJBWT1: CONO PI,CLKOFF          ;IF NOT ALREADY IN JOB IOT, DON'T WAIT
15359         JRST BJWAIT             ;TEST CREATOR STATUS, POPJ OR POPJ1
15360 \f
15361 ;BOJ DEVICE UNIT MODE INPUT
15362 BJUI:   MOVE B,[SETZ 1] ;WAIT FOR OUTPUT IOT
15363         MOVEM B,SRN3(U)
15364         HRLZ T,A        ;JOB INDEX
15365         HRR T,JBCUI(A)  ;CREATOR'S USER INDEX
15366         PUSHJ P,CWAIT   ;WAIT FOR CREATOR TO IOT, RETURN WITH CLKOFF
15367             PUSHJ P,BJWAIT
15368         PUSHJ P,BJUI1
15369         JRST CLKONJ
15370
15371 BJUI1:  MOVE TT,JBSTS(A)
15372         TLNE TT,200000
15373          JRST BJUIB     ;BLOCK MODE CREATOR IOT
15374         LDB D,[.BP (%JBSIOT),JBWST(A)]
15375         JUMPN D,BJUIS
15376         MOVE W,AC0S+W(T)
15377         JRST BJIUNH     ;SUCCESSFUL
15378
15379 ;BOJ UNIT INPUT FROM JOB SIOT
15380 BJUIS:  PUSHJ P,BJBINI
15381         XCTRI XBYTE,[ILDB W,(B)]
15382          SKIPA C,AC0S+C(T)
15383           BUG
15384         XCTR XRW,[SOSG (C)]
15385          JRST BJIUNP
15386         JRST PLDZ
15387
15388 ;BOJ UNIT INPUT FROM JOB BLOCK IOT
15389 BJUIB:  PUSHJ P,BJBINI
15390         SKIPL JBSTS(A)
15391          JRST BJUIBA
15392         XCTRI XR,[MOVE W,(D)]
15393          CAIA
15394           BUG
15395         ADD D,[1,,1]
15396         XCTRI XW,[MOVEM D,(B)]
15397          CAIA
15398           BUG
15399         JUMPGE D,BJIUNP
15400         JRST PLDZ
15401
15402 ;BOJ UNIT INPUT FROM JOB BLOCK IOT, ASCII MODE
15403 BJUIBA: LDB E,[410300,,D]       ;CHAR COUNT
15404         MOVEI W,0
15405         CAIGE E,3
15406          JRST BJIUNP
15407         XCTRI XR,[MOVE W,(B)]
15408          SKIPA E,BTOCHT-3(E)
15409           BUG
15410         ILDB W,E
15411         ADD D,[700000,,]
15412         TLNN D,500000
15413          ADD D,[500001,,1]
15414         XCTRI XW,[MOVEM D,(B)]
15415          CAIA
15416           BUG
15417         TLNN D,700000
15418          JRST BJIUNP
15419         JRST PLDZ
15420 \f
15421 ;BOJ DEVICE BLOCK MODE INPUT
15422 BJBI:   SKIPGE JBCG(A)
15423          POPJ P,                ;EOF
15424         XCTR XRW,[MOVES D,(C)]  ;D GETS IOT POINTER
15425         LDB B,[410300,,D]
15426         CAIGE B,3
15427          POPJ P,
15428         HLRO E,D
15429         IORI E,700000   ;FLUSH CHAR CNT
15430         HRRZ T,D
15431         SUB T,E
15432         CAILE T,-1
15433          JRST IOADC     ;DON'T WRAP AROUND
15434         MOVE B,[SETZ 1]
15435         PUSHJ P,BJBWT           ;WAIT FOR JOB OUTPUT IOT, COME BACK WITH CLK OFF
15436          JRST CLKONJ            ;UNHANG
15437         MOVEI I,0               ;FOR BJBB
15438         MOVE TT,JBSTS(A)
15439         TLNE TT,200000
15440          JRST BJBB      ;CREATOR IOT IS IN BLOCK MODE
15441         PUSH P,C
15442         PUSH P,D
15443         PUSHJ P,BJUI1   ;GET DATA OUT OF CREATOR UNIT MODE IOT
15444         POP P,D
15445         POP P,C
15446         MOVE H,W
15447         MOVEI T,BJBI
15448         JUMPGE TT,BJBIA ;ASCII
15449         XCTRI XW,[MOVEM H,(D)]
15450          CAIA
15451           BUG
15452         ADD D,[1,,1]
15453         JRST BJBIX
15454
15455 ;BOJ BLOCK ASCII INPUT STORE CHAR
15456 BJBIA:  LDB E,[410300,,D]
15457         CAIGE E,3
15458          JRST CLKONJ
15459         XCTRI XR,[MOVE W,(D)]
15460          SKIPA E,BTOCHT-3(E)
15461           BUG
15462         IDPB H,E
15463         XCTRI XW,[MOVEM W,(D)]
15464          CAIA
15465           BUG
15466         ADD D,[700000,,]
15467         TLNN D,500000
15468          ADD D,[500001,,1]
15469 BJBIX:  MOVEI T,BJBI
15470         XCTRI XW,[MOVEM D,(C)]
15471          JRST BJBEX
15472           BUG
15473 \f
15474 BJOV:   BJBI
15475         BJBO
15476
15477 ;BOJ BLOCK IOT TO/FROM JOB BLOCK IOT
15478 BJBB:   MOVE J,T
15479         HRLI J,%UMALL   ;UMAPS FOR PURELY CREATOR IOT
15480         MOVEM J,SRN4(U)
15481 BJBBL:  MOVE J,SRN4(U)
15482         PUSHJ P,PLD1
15483         MOVE E,SRN3(T)
15484         XCTRI XRW,[MOVES H,(E)]
15485          CAIA           ;H HAS JOB BLOCK IOT POINTER
15486           BUG
15487         PUSHJ P,PLDZ
15488         XCTRI XRW,[MOVES D,(C)]
15489          CAIA           ;D HAS BOJ BLOCK IOT POINTER
15490           BUG
15491         JUMPGE H,[PUSHJ P,BJIUNH
15492                   MOVE T,BJOV(I)
15493                   JRST BJBEX]
15494         JUMPGE D,CLKONJ
15495         HLRE B,H
15496         CAML D,H
15497          HLRE B,D       ;CHOOSE SMALLER OF TWO BLOCK SIZES
15498         MOVNS B         ;COUNT TO BE XFERRED
15499         HRLZ E,H        ;JOB ADDRESS
15500         HRR E,D         ;JOB,,BOJ  (FROM,,TO FOR BOJ INPUT)
15501         HLRZ Q,E        ;JOB ADDRESS
15502         CAIGE Q,20
15503          JRST BJBB1     ;JOB ADDR IS AN AC
15504         HRRZ J,T        ;SET UP UMAPS (JOB USER INDEX IN RH)
15505         TRZE E,400000
15506          TLOA J,%UMMPL  ;TO HI PG, HACK OUR LO PAGE
15507           TLO J,%UMMPU  ;TO LO PG, HACK OUR HI PAGE
15508         TLZE E,400000
15509          TLOA J,%UMLTU  ;TO POINT TO HIS UPPER
15510           TLO J,%UMUTL  ;TO POINT TO HIS LOWER
15511         TLNN J,%UMMPU+%UMUTL    ;MAPPING HIS UPPER FROM OUR LOWER?
15512          JRST BJBB3     ;YES.  MAKE SURE NOT SCREWED BY AC PNTR
15513 BJBB3A: PUSHJ P,PLD1
15514         TRZ Q,400000
15515         MOVNS Q         ;LIMIT SIZE OF XFER TO MIN OF
15516         ADDI Q,400000   ;DIST OF TO ADR FROM SEG BOUNDARY
15517         CAMLE B,Q       ;AND DIST OF FROM ADR FROM SEG BOUNDARY
15518          HRRZ B,Q
15519         MOVNI Q,(E)     ; - BOJ ADDR
15520         ADDI Q,400000
15521         CAMLE B,Q
15522          HRRZ B,Q
15523         TLNN J,%UMMPL   ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
15524          TLOA E,400000  ;SET JOB ADDR TO HI SEG
15525           TRO E,400000  ;SET BOJ ADDR TO HI SEG
15526         SKIPE I
15527          MOVSS E        ;XFER OTHER DIRECTION
15528         MOVE Q,E        ;SAVE COPY OF BLT POINTER
15529         ADDI B,(E)      ;GET LA + 1
15530         XCTRI XBRW,[BLT E,-1(B)]        ;XFER DATA
15531          HRRZS E,B      ;NO FAULT.  SIMULATE STORE BACK OF POINTER (CAN BE 1,,0)
15532         PUSH P,J
15533         PUSHJ P,PLDZ
15534         SUBM E,Q
15535 BJBB2:  HRLS Q          ;NUMBER OF WORDS ACTUALLY XFERRED IN BOTH HALVES
15536         XCTRI XRW,[ADDM Q,(C)]  ;UPDATE BOJ BLK PNTR
15537          JRST .+2
15538           BUG
15539         MOVE J,SRN4(U)
15540         PUSHJ P,PLD1    ;MAP TO CREATOR
15541         POP P,J
15542         MOVE W,SRN3(T)
15543         XCTRI XRW,[ADDM Q,(W)] ;UPDATE JOB BLK PNTR
15544          JRST .+2
15545           BUG
15546         CAIN B,(E)
15547          JRST BJBBL     ;NO FAULT, LOOP BACK
15548         PUSHJ P,PLD1    ;RESTORE TO FROB AT TIME OF FAULT
15549 BJBBF:  PUSHJ P,TPFLT   ;TAKE FAULT (TURNS CLK ON)
15550         PUSHJ P,MPLDZ   ;RESTORE NORMAL MAP
15551         JRST @BJOV(I)   ;RESTART THE IOT
15552 \f
15553 ;JOB ADDR IS AN AC
15554 BJBB1:  ADDI Q,UUOACS(T)
15555         JUMPN I,BJBB1A
15556         MOVE B,(Q)      ;READ JOB WORD
15557 BJBB3C: XCTRI XW,[MOVEM B,(E)]
15558          JRST .+2
15559           JRST BJBBF
15560 BJBB2A: MOVEI Q,1       ;1 WORD XFERRED
15561         HRRZ B,E        ;FAKE OUT FAULT TEST
15562         PUSH P,J
15563         JRST BJBB2
15564
15565 BJBB1A: XCTRI XR,[MOVE B,(E)]
15566          JRST .+2
15567           JRST BJBBF
15568         MOVEM B,(Q)
15569         JRST BJBB2A
15570
15571 BJBB3:  TLNE E,777760   ;SKIP ON XFERRING FROM AC AREA, HI TO HI
15572          JRST BJBB3A    ;NO.  OK TO DO BLT
15573         JUMPN I,BJBB3B
15574         HRLI J,%UMALL   ;HACK OUR HI TO POINT TO HIS HI
15575         PUSHJ P,PLD1
15576         XCTRI XR,[MOVE B,(Q)]
15577          JRST .+2
15578           BUG
15579         PUSHJ P,PLDZ
15580         HRRZ E,D        ;TO ADDRESS
15581         JRST BJBB3C
15582
15583 BJBB3B: XCTRI XR,[MOVE B,(D)]
15584          JRST .+2
15585           JRST BJBBF
15586         HRLI J,%UMALL
15587         PUSHJ P,PLD1    ;HACK OUR HI TO POINT TO HIS HI
15588         XCTRI XW,[MOVEM B,(Q)]
15589          JRST .+2
15590           BUG
15591         PUSHJ P,PLDZ
15592         JRST BJBB2A
15593 \f
15594 ;.CALL JOBGET
15595 ;ARG 1 - BOJ CHNL
15596 ;UP TO SIX WDS RETURNED
15597 ;WD1 BITS:
15598 %JG==1,,525252
15599                 ;4.9-4.7 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
15600                 ;    4.9-4.7 SHOULDN'T BE USED, SINCE THE FULL MODE IS IN WD7 ON AN OPEN
15601 %JGCLS==40000   ;4.6 => CLOSE  (NOTE 4.5 USED TO BE A CLS BIT ALSO)
15602 %JGSIO==1000    ;4.1 => SIOT (ONLY IF OPCODE = 1)
15603 %JGFPD==200     ;3.8 => THIS CALL WAS PCLSRED AND IS RESTARTING
15604 ;1.4-1.1 => TYPE OF OPERATION
15605 %JO==,,-1
15606 %JOOPN==0       ;OPEN
15607 %JOIOT==1       ;IOT/SIOT
15608 %JOLNK==2       ;MLINK
15609 %JORST==3       ;RESET
15610 %JORCH==4       ;RCHST
15611 %JOACC==5       ;ACCESS
15612 %JORNM==6       ;FDELE (DELETE OR RENAME)
15613 %JORWO==7       ;FDELE (RENAME WHILE OPEN)
15614 %JOCAL==10      ;SYMBOLIC .CALL
15615
15616 ;WD2 SET ONLY FOR BLOCK IOT POINTER, ACCESS POINTER, NEW FN1 FOR FDELE
15617 ;WD3    FN1
15618 ;WD4    FN2
15619 ;WD5    SYS NAME
15620 ;WD6    LEFT ADJUSTED DEVICE NAME
15621 ;WD7    NEW FN2 FOR FDELE.
15622 ;IGNORE ALL RETURNED INFO ON AN ERROR RETURN
15623 ;IF 4.5 OR 4.6 IS SET THEN ALL ELSE IS MEANINGLESS
15624
15625 NJBGT:  SETZM T         ;INDICATE JOBGET, NOT JOBCAL
15626 NJBCL0: HLRZ E,H        ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15627         TLNN R,%CLSBJ   ;NOT A BOJ CHANNEL => WRONG TYPE DEVICE
15628          JRST OPNL34
15629         CONO PI,CLKOFF
15630         MOVE C,JBWST(E)
15631         TLNN C,%JBVAL
15632          JRST NJBGTE    ;FAIL IF VALID NOT SET
15633         TLZ C,%JBSTR
15634         MOVEM C,JBWST(E)        ;CLEAR STORED BIT
15635         MOVE B,JBCUI(E)
15636         MOVE B,SUUOH(B)
15637         CONO PI,CLKON
15638         MOVE A,JBSTS(E)
15639         TLZ A,077777    ;FLUSH RANDOM BITS FROM LH
15640         TLNE B,%PCFPD
15641          TLO A,%JGFPD
15642         TLNE C,%JBSIOT
15643          TLO A,%JGSIO
15644         JUMPN T,NJBCL1  ;BRANCH IF JOBCAL
15645 NJBGT0: MOVE B,JBST2(E)
15646         MOVE C,JBOFN1(E)
15647         MOVE D,JBOFN2(E)
15648         MOVE TT,JBODEV(E)
15649         MOVE I,JBNFN2(E)
15650         MOVE E,JBOSYN(E)
15651         CONO PI,CLKON
15652         JRST POPJ1
15653
15654 NJBGTE: SKIPL JBCG(E)   ;HAS CREATOR GONE AWAY?
15655          JRST OPNL36    ;NO, VALID CLEAR
15656         CONO PI,CLKON   ;YES, GIVE CLOSE
15657         MOVSI A,%JBLOS
15658         IORM A,JBWST(E)
15659         MOVSI A,%JGCLS  ;GIVE CLOSE BITS
15660         JRST POPJ1      ;DON'T GIVE ANYTHING ELSE WHETHER JOBGET OR JOBCAL
15661 \f
15662 ;       .CALL ADR
15663 ;       ERROR RETURN
15664 ;       NORMAL RETURN
15665
15666 ;ADR:   SETZ
15667 ;       SIXBIT /JOBCAL/
15668 ;       [BOJCHNL]
15669 ;       [-N,,ADR OF DATA BUFFER]        ;OPTIONAL
15670 ;       SETZM OPCODE
15671 ; OPCODE WILL BE THE SAME AS RETURNED IN WD1 BY JOBGET
15672 ; IF OPCODE<10 THEN WD2-WD7 OF JOBGET WILL BE WRITTEN INTO DATA BUFFER
15673 ;       FOLLOWED BY JOB'S EPDL AND EPDL3 (THE BPS FOR BP-STYLE OPENS, ETC).
15674 ;IF OPCODE=10 THEN JOB'S LAST .CALL WILL BE DESCRIBED:
15675 ;       WORD 1 OF DATA BUFFER => SIXBIT OF OPERATION (I.E. THE NAME
15676 ;               OF THE .CALL)
15677 ;       WORD 2 OF DATA BUFFER => FLAG BITS OF .CALL
15678 ;       WORD 3 OF DATA BUFFER => # OF ARGS TO .CALL
15679 ;       WORDS 4-12 => INPUT ARGS TO .CALL
15680
15681 NJBCL:  CAIL W,2                ;DID CALLER SUPPLY AOBJN POINTER?
15682          SKIPN T,B              ;IF SO AND NON-ZERO USE IT
15683           MOVEI T,1             ;OTHERWISE SET T NONZERO
15684         JRST NJBCL0             ;GO JOIN JOBGET CODE FOR ERROR CHECKING
15685
15686 NJBCL1: JUMPGE T,POPJ1          ;BACK FROM JOBGET - ANY AOBJN PNTR?
15687         MOVEI C,9               ;YES - OPCODE 10?
15688         TRNN A,10
15689          JRST NJBCL2            ;NO - JUST COPY 9 STANDARD ARGS
15690         HLRE D,T                ;GET LENGTH OF USERS DATA BUFFER
15691         MOVE B,JBCUI(E)         ;GET JOB'S USER INDEX
15692         MOVE C,LSCALL(B)        ;GET NAME OF JOB'S LAST CALL
15693         UMOVEM C,(T)            ;PUT INTO CALLERS BUFFER
15694         AOJE D,POPJ1            ;IF NO MORE ROOM - DONE
15695         MOVE C,CTLBTS(B)        ;GET USER'S .CALL FLAG BITS
15696         UMOVEM C,1(T)
15697         AOJE D,POPJ1
15698         LDB C,[230400,,JBSTS(E)]        ;GET # OF ARGS
15699         UMOVEM C,2(T)
15700         JUMPE C,POPJ1           ;ANY ARGS TO PASS?
15701         ADD T,[3,,3]            ;YES - COPY INTO BUFFER
15702 NJBCL2: JUMPGE T,POPJ1          ;ANY ROOM LEFT?
15703         MOVNS C                 ;GET SMALLEST WORD COUNT
15704         HLRE B,T
15705         CAMLE C,B
15706          HRL T,C                ;MAKE AOBJN PNTR AS SMALL AS POSSIBLE
15707         MOVE H,E                ;JOB INDEX IN H FOR USING JBACTB
15708         MOVEI B,JBACTB          ;GET PNTR TO ARG TABLES
15709 NJBCL3: MOVE C,@(B)             ;GET NEXT ARG
15710         UMOVEM C,(T)            ;GIVE TO CALLER
15711         AOS B
15712         AOBJN T,NJBCL3
15713         JRST POPJ1              ;DONE - GO SKIP
15714 \f
15715 ;       .CALL ADR
15716 ;       ERROR RETURN
15717 ;       NORMAL RETURN
15718
15719 ;ADR:   SETZ
15720 ;       SIXBIT /JOBRET/
15721 ;       [BOJCHNL]
15722 ;       [OPEN LOSS #(IF RH = 0),,# TIMES FOR CREATING JOB TO SKIP]
15723 ;       SETZ [-N,,ADR OF DATA BUFFER]
15724
15725 ;RETURN DATA (E.G. RETURN TO RCHST,STATUS OR THE RETURN ARGS TO A .CALL)
15726 ;WILL BE COPIED FROM THE CALLER'S DATA BUFFER
15727
15728 NJBRT:  HLRZ E,H        ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15729         TLNN R,%CLSBJ   ;NOT BOJ CHNL => WRONG TYPE DEVICE.
15730          JRST OPNL34
15731         CAIGE W,3       ;RETURN ARGS PROVIDED?
15732          SETZM C        ;NO - ZERO IT
15733         JUMPGE C,NJBRT1 ;DO NOTHING IF NO RETURNS OR NO AOBJN
15734         HLRE D,C        ;GET LENGTH OF BUFFER
15735         CAMGE D,[-8.]   ;MAKE SURE AREA AT MOST 8 LONG
15736          MOVNI D,8      ;OVER 8 - USE 8
15737         HRL C,D         ;FIX AOBJN PNTR
15738         MOVMS D
15739         ADDI D,-1(C)    ;GET ADDRESS OF LAST WORD NEEDED
15740         XCTR XR,[SKIP (C)]      ;MAKE SURE PAGES ARE IN
15741         XCTR XR,[SKIP (D)]
15742 NJBRT1: CONO PI,CLKOFF  ;NOW OK TO TURN CLOCK OFF
15743         MOVE A,JBWST(E)
15744         TLNE A,%JBVAL
15745          TLNE A,%JBSTR
15746           JRST OPNL36   ;FAIL IF STORED IS SET OR IF VALID IS CLEARED
15747         SKIPGE JBCG(E)
15748          JRST OPNL41
15749         HRRZ TT,JBCUI(E)
15750         MOVE D,FLSINS(TT)
15751         CAME D,JBFLS
15752          BUG
15753         TLO A,%JBWIN
15754         TLZ A,%JBVAL+%JBSTR
15755         MOVEM A,JBWST(E)        ;SET SUCCESSFUL JOBRET BIT, CLEAR VALID AND STORED
15756         DPB B,[350400,,JBSTS(E)]        ;NUMBER OF TIMES TO SKIP
15757         MOVSS B
15758         DPB B,[270600,,JBSTS(E)]        ;OPEN LOSS
15759         MOVSI B,-6              ;DEFAULT # WDS TO RETURN FOR .RCHST IS 6.
15760         MOVEM B,JBAC11(E)
15761         JUMPGE C,NJBRT3         ;ANY RETURN ARGS?
15762         MOVEM C,JBAC11(E)       ;REMEMBER HOW MANY, FOR .RCHST TO RETURN THAT MANY.
15763         MOVE H,E                ;YES - COPY THEM
15764         MOVEI D,JBACTB
15765 NJBRT2: XCTRI XR,[MOVE B,(C)]   ;GET IT
15766          AOSA D
15767           BUG                   ;PAGE IS TIED - NO?
15768         MOVEM B,@-1(D)          ;PUT INTO ARG TABLE
15769         AOBJN C,NJBRT2
15770 NJBRT3: SETZM FLSINS(TT)        ;RESTART CREATOR
15771         JRST CLKOJ1
15772
15773 ;JOB DEVICE CLOSE ROUTINE
15774 JOBCLS: SETOM JBCG(A)
15775         MOVE E,A
15776         CONO PI,CLKOFF
15777         PUSHJ P,JBINT   ;INTERRUPT POOR BOJ GUY
15778         JRST CLKONJ     ;SINCE HE HAS NO CREATOR
15779 \f
15780 ; ROUTINES FOR JOB ACCESS, RFPNTR, RESET, AND STATUS
15781
15782 RFPJOB: MOVEI J,4               ;USE OLD .RCHST OPERATION, OPCODE 4
15783         HRRM J,JBSTS(A)
15784         MOVE E,A
15785         CONO PI,CLKOFF
15786         PUSHJ P,JBWT            ;SIGNAL JOB, WAIT FOR ANSWER
15787         HLRE TT,JBAC11(E)       ;GET # VALUES RETURNED
15788         MOVNS TT
15789         CAIL TT,5
15790          SKIPA A,JBODEV(E)      ;GET ACCESS POINTER RETURNED
15791           SETO A,               ;NO ACCESS POINTER RETURNED, USE -1
15792         CAIL TT,6               ;UP TO TWO MORE EXTRA RCHST RESULTS MIGHT BE RETURNED
15793          MOVE Q,JBNFN2(E)
15794         CAIL TT,7
15795          MOVE I,JBAC7(E)
15796         CAIL TT,5
15797          MOVEI W,1(TT)          ;# RESULTS FOR RCHST
15798         MOVEI B,36.             ;ALWAYS RETURN 36. AS BYTE SIZE UNTIL MORE WINNING
15799         JRST POPJ1              ;CONVENTIONS EXIST.
15800
15801 JBSTAT: HLRZ A,(R)      ;GET JOB INDEX
15802         HRRZ D,JBWST(A) ;GET MOST RECENT STATUS
15803         POPJ P,
15804
15805 JBORS:
15806 JBIRS:  MOVEI D,3       ;RESET IS OPCODE 3
15807         HLRZ A,(R)
15808         HRRM D,JBSTS(A)
15809         CONO PI,CLKOFF
15810         MOVE E,A
15811         PUSHJ P,JBWT    ;WAIT FOR IT TO GET PROCESSED
15812         POPJ P,
15813
15814 JBACCS: MOVEI D,5       ;ACCESS IS OPCODE 5
15815         HLRZ A,(R)
15816         HRRM D,JBSTS(A)
15817         MOVEM B,JBST2(A)
15818         CONO PI,CLKOFF
15819         MOVE E,A
15820         PUSHJ P,JBWT
15821         JRST POPJ1
15822 \f
15823 ;.CALL JOBIOC           (OLD NAME SETIOC STILL WORKS)
15824 ;ARG1:  CHANNEL BOJ DEVICE IS OPEN ON
15825 ;ARG2:  TYPE OF IOCER TO CAUSE
15826
15827 ;THIS CALL CAUSES THE NEXT IOT EXECUTED BY THE
15828 ;PROCEDURE ON THE OTHER END OF THE CHANNEL TO GET
15829 ;THE SPECIFIED IO CHANNEL ERROR
15830
15831 NSTIOC: HLRZ E,H        ;GET JOB CHNL IDX FROM LH OF IOCHNM WD.
15832         CAIL B,MIOTER
15833          CAILE B,NIOTER
15834           JRST OPNL33   ;BAD ARG. (NOT LEGAL IOCER)
15835         TLO B,(SETZ)    ;IN CASE IOCER 0 EVER EXISTS
15836         TLNN R,%CLSBJ
15837          JRST OPNL34    ;NOT BOJ CHANNEL
15838         CONO PI,CLKOFF
15839         MOVE A,JBCUI(E) ;PREPARE TO STOP CREATOR.
15840         SKIPGE JBCG(E)
15841          JRST OPNL41    ;CREATOR WENT AWAY
15842         MOVE H,APRC(A)
15843         TLNE H,BULGOS
15844          JRST OPNL41    ;HE'S BEING KILLED NOW.
15845         PUSHJ P,RPCLSR  ;STOP
15846         MOVEM B,JBIOCJ(E)
15847         AOS (P)
15848         JRST UPCLSR
15849
15850
15851 ;.CALL JOBSTS
15852 ;ARG1 - CHANNEL BOJ IS OPEN ON   - REMAINING ARGS ARE OPTIONAL  -
15853 ;ARG2 - NEW STATUS (RIGHT HALF OF STATUS WORD ONLY - I.E. DEVICE DEPENDENT STUFF)
15854 ;ARG3 - NEW DEVICE NAME FOR PEEK, WHO-LINE STATUS, RFNAME/RCHST
15855 ;ARG4 - NEW FN1 FOR ..
15856 ;ARG5 - NEW FN2 FOR ..
15857 ;ARG6 - NEW SNAME FOR ..
15858 ;ARG7 - NEW OPEN MODE FOR ..
15859 ;ARG8 - BP TO ASCIZ STRING IN USER ADDRESS SPACE CONTAINING FULL FILENAMES.
15860
15861 NJBSTS: TLNN R,%CLSBJ
15862          JRST OPNL34
15863         HLRZ A,(R)      ;GET JOB INDEX
15864         CAIGE W,2       ;DID HE SUPPLY STATUS?
15865          MOVEI B,SNJOB  ;NO - RESET TO INITIAL
15866         HRRM B,JBWST(A) ;REMEMBER WHAT HE SAYS
15867         MOVEI B,8
15868         SUB B,W
15869         JUMPGE B,.+1(B) ;STORE WHATEVER ADDITIONAL ARGS WERE GIVEN
15870           JSP B,NJBST2          ;8
15871           JSP B,NJBST1          ;7
15872           MOVEM TT,JBSYS(A)     ;6
15873           MOVEM E,JBFN2(A)      ;5
15874           MOVEM D,JBFN1(A)      ;4
15875           MOVEM C,JBDEV(A)      ;3
15876           JRST POPJ1            ;2
15877           JRST POPJ1            ;1   (DON'T TAKE THIS INSN OUT)
15878
15879 NJBST1: XOR I,JBOPNM(A)
15880         TRNE I,.BAO#.UAI
15881          JRST OPNL12            ;NOT ALLOWED TO CHANGE BLOCK VS UNIT, IN VS OUT
15882         XORM I,JBOPNM(A)
15883         JRST (B)
15884
15885 NJBST2: MOVE R,Q                ;STORE BP IN Q INTO JBFNP WORD,
15886         PUSHJ P,ASCIND          ;AFTER DOING INDEXING AND INDIRECT.
15887         MOVEM R,JBFNP(A)
15888         JRST (B)
15889 \f
15890 ;       .CALL ADR       ;SKIPS UNLESS JOB END OF CHNL NOT THERE
15891
15892 ;ADR:   SETZ
15893 ;       SIXBIT /JOBINT/
15894 ;       401000,,BOJCH
15895
15896 ;GIVE CREATOR A SECOND WORD INT ON CHANNEL CORRESP TO BOJCH
15897
15898 NJBINT: TLNN R,%CLSBJ   ;ERROR IF NOT BOJ CHNL.
15899          JRST OPNL34
15900         CONO PI,CLKOFF
15901         HLRZ E,H
15902         SKIPGE JBCG(E)
15903          JRST OPNL41
15904         MOVE A,JBCUI(E)
15905         MOVSI D,%CLSJ
15906         SETZ C,
15907         PUSHJ P,CHSCAA
15908             PUSHJ P,[HRRZ B,(R)
15909                      SKIPGE R           ;IOPDL CHNLS DON'T INTERRUPT
15910                       TDNN D,CLSTB(B)
15911                        POPJ P,
15912                      HRRZ B,R
15913                      SUBI B,IOCHNM(A)
15914                      IOR C,CHNBIT(B)
15915                      POPJ P,]
15916         AND C,MSKST2(A)
15917         JUMPE C,OPNL41  ;I CAN'T
15918         MOVN B,C
15919         AND C,B         ;INT ONLY ONCE, ON HIGHEST NUMBERED CHANNEL
15920         IORM C,IFPIR(A)
15921         JRST CLKOJ1
15922
15923
15924 ;.CALL JOBREU
15925 ;ARG 1 - SIMULATED DEVICE NAME
15926 ;ARG 2 - FN1 OF ..
15927 ;ARG 3 - FN2 OF ..
15928 ;ARG 4 - SNAME OF FILE WHICH HANDLER LOADED FROM
15929 ;ARG 5 - AMOUNT OF TIME TO SLEEP WAITING FOR SOMEONE TO OPEN
15930
15931 ;THIS CALL, WHEN EXECUTED BY A JOB DEVICE HANDLER JOB, MAKES
15932 ;THE HANDLER AVAILABLE FOR RE-USE.  TAKES SUCCESS RETURN IF
15933 ;SOMEONE REUSES YOU; YOU SHOULD THEN DO THE "INITIAL JOBGET"
15934
15935 NJBREU: SKIPGE H,JBI(U)
15936          JRST OPNL10    ;NOT A BOJ HANDLER JOB
15937         SKIPL JBCG(H)
15938          PUSHJ P,UFLS   ;WAIT FOR CLOSE TO FINISH HAPPENING
15939         MOVEM A,JBODEV(H)
15940         MOVEM B,JBOFN1(H)
15941         MOVEM C,JBOFN2(H)
15942         MOVEM D,JBOSYN(H)
15943         TLNE E,1000
15944          JRST [ MOVNI E,(E)     ;IMMEDIATE TIME, LOSE ON PCLSR
15945                 SUB E,TIME      ;BUT ACCEPT ANYWAY SINCE NETBLK DOES
15946                 JRST NJBRU1 ]
15947         MOVE TT,E
15948         UMOVE E,(TT)    ;GET TIME ARGUMENT
15949         JUMPL E,NJBRU1
15950         MOVNS E
15951         SUB E,TIME
15952         UMOVEM E,(TT)   ;POS REL TIME GIVEN, MAKE NEG ABS AND WRITE BACK
15953 NJBRU1: MOVSI TT,%JBREU         ;E NOW HAS NEGATIVE TIME TO SLEEP UNTIL
15954         IORM TT,JBWST(H)
15955         PUSHJ P,LOSSET
15956             NJBRUL              ;TURN OFF %JBREU WHEN CALL EXITED FOR WHATEVER REASON
15957         SKIPA T,H
15958          PUSHJ P,NJBRUW
15959           PUSHJ P,UFLS
15960         SKIPGE JBCG(H)
15961          JRST OPNL41    ;TIMED OUT
15962         JRST LSWPJ1
15963
15964 ;FLSINS ROUTINE TO WAIT UNTIL TIMED OUT OR OPENED BY SOMEONE
15965 NJBRUW: MOVN A,AC0S+E(U)
15966         CAML A,TIME
15967          SKIPL JBCG(T)
15968           AOS (P)
15969         POPJ P,
15970
15971 ;LOSSET ROUTINE TO LEAVE AWAITING-REUSE STATE
15972 NJBRUL: MOVSI A,%JBREU
15973         MOVE T,AC0S+H(U)
15974         ANDCAM A,JBWST(T)
15975         POPJ P,
15976 \f
15977 SUBTTL PERIPHERAL DEVICE ROUTINES IN SEPARATE FILES
15978
15979 IFN NMTCS,[
15980  IFN TM10P,[
15981 $INSRT MTAPE
15982  ]
15983  IFN TM03S,[
15984 $INSRT NMTAPE
15985 ]
15986 ]
15987 IFN NUNITS,[
15988 $INSRT UTAPE
15989 ]
15990
15991 $INSRT DISK
15992
15993 IFN NETP,[      ; General ITS network code, includes specific nets
15994 OVHMTR NET
15995 $INSRT NET
15996 ]
15997
15998 IFN E.SP,[
15999 $INSRT ITSDIS
16000 ]
16001
16002 IFN MSPP,[
16003 $INSRT ITSMSP
16004 ]
16005
16006 $INSRT TS3TTY
16007
16008 $INSRT ITSDEV
16009
16010 .BYTE 0         ;RECORD THE SYMS .EVAL'ED BY USER PROGRAMS
16011 $INSRT EVSYMS
16012 .BYTE
16013 \f
16014 SUBTTL DM DAEMON UUO'S
16015
16016 IFE DEMON,ADEMON==ILUUO
16017
16018 IFN DEMON,[
16019 ADEMON: JUMPE J,[AOJA J,.+2]    ;IF J = 0 THEN SUBTRACT ONE
16020         UMOVE J,(J)     ;GET VALUE HERE
16021         PUSHJ P,LSWTL
16022         400000,,DEMSW
16023         PUSHJ P,DEMUSR  ;FIND CURRENT USER IN DEMON TABLE
16024         JRST UTOLKJ     ;FAIL, JUST RETURN, NOT DEMON
16025         HRRE TT,DMTTBL+2(B)
16026         SUB TT,J
16027         HRRM TT,DMTTBL+2(B)     ;PUT NEW COUNT IN DEMON TABLE
16028         SKIPLE TT
16029 UTOLJ1: AOS (P)
16030 UTOLKJ: CONO PI,UTCON
16031         JRST LSWPOP
16032
16033 ADEMSIG:MOVE D,B
16034         CONO PI,CLKOFF  ;DON'T LET SYS JOB LOOK TILL WE'RE READY.
16035         MOVSI T,SCLDMN  ;TELL IT TO LOOK FOR US, AFTER UFLS TURNS CLOCK ON.
16036         IORM T,SUPCOR
16037         SETZB T,SRN3(U) ;SYS JOB WILL SETOM SRN3 TO RESTART US
16038         SKIPN SRN3(U)   ;WITH 0 IN T => FILE EXISTS, OR OPNL CODE.
16039          PUSHJ P,UFLS   ;SYS JOB DETECTS US BY PC=ADEMS1.
16040                         ;DEMON NAME IS EXPECTED TO BE IN A.
16041 ADEMS1: JUMPN T,OPNL1-1(T)
16042         CAIGE W,2       ;NO SECOND ARG, JST SIGNAL
16043          JRST ADEMS3
16044         JUMPL D,NUDMTB  ;IF 2ND ARG < MERELY CALL NUJBST, NO DEMON ENTRY
16045         TDZA TT,TT      ;ZERO OUT TT
16046 ADEMS3:  SETOM TT       ;SET FLAG
16047         PUSHJ P,LSWTL   ;SIEZE SWITCH
16048             DEMSW
16049         PUSHJ P,DEMSIG
16050          JRST LSWPOP    ;SIGNAL FAILED
16051         SKIPN TT        ;FLAG NOT SET
16052          HRLM D,DMTTBL +2(B)    ;SET TIME RQ
16053         JRST CKOPJ1     ;RELEASE SWITCH
16054
16055 NUDMTB: PCLT
16056         PUSHJ P,DMBLK1  ;WAIT TILL DEMON BLOCK IS CLEARED
16057          PUSHJ P,UFLS
16058         HRROI T,DMBLK
16059         MOVEM A,DMBLK   ;SAVE IN BLOCK NOW
16060         PUSHJ P,NUJBST
16061          JRST NUDMTB    ;IF FAILURE AFTER WAIT LOOP BACK
16062         JRST POPJ1      ;SUCCESS
16063
16064 DMBLK1: SKIPGE DMBLK+1  ;FOR DEMON BLOCK TEST
16065          POPJ P,        ;RETURN, NOT FINISHED LOADING
16066         MOVE T,UTTYCT
16067         CAIGE T,MXCZS   ;ROOM IN RING BUFFER
16068          AOS (P)
16069         POPJ P, ;SKIP IF ROOM
16070 \f;UTILITY ROUTINES FOR DEAMONS
16071
16072 DEMSIG: PUSHJ P,DEMNAM  ;LOOK FOR NAME
16073         JRST DEMSG2     ;HAVE TO MAKE NEW ENTRY
16074 DEMSG1: AOS (P)
16075         HLLZ E,DMTTBL+2(B)      ;18 BITS 2'S COMPLEMENT
16076         AOS DMTTBL+2(B)
16077         HLLM E,DMTTBL+2(B)      ;MUST DO THIS WAY TO FIT ABOVE
16078         SKIPE DMTTBL+1(B)       ;DOWN, WANT SYS JOB TO LOOK AT
16079         POPJ P,
16080         MOVSI E,SCLDMN
16081         IORM E,SUPCOR
16082         AOS REQCNT      ;ONLY SIGNAL IF NECESSARY
16083         POPJ P,
16084
16085 DEMSG2: SOSGE DEMCNT    ;IF NO ROOM FLUSH
16086         POPJ P,
16087         PUSH P,A
16088         MOVEI A,DMTLL   ;BUMP POINTER
16089         ADDB A,DMTPTR
16090         IDIVI A,DMLNG   ;TRUNCATE TO LENGNTH OF TABLE
16091         SKIPE DMTTBL(B)
16092         JRST .-4        ;SEARCH FOR NEW ENTRY
16093         POP P,DMTTBL(B) ;SET NAME IN TABLE
16094         JRST DEMSG1
16095
16096 ;ROUTINES TO FIND ENTRY IN TABLE.
16097 ;DEMNAM TAKES NAME IN A, DEMUSR TAKES USER INDEX IN U
16098 ;THEY SKIP RETURN IF SUCCESSFUL, RETURN OTHERWISE
16099 ;IF SUCCESSFUL DEMON TABLE INDEX IS IN B
16100
16101 DEMUSR: JUMPL U,CPOPJ
16102         MOVSI B,-DMLNG
16103         CAMN U,DMTTBL+1(B)
16104         JRST POPJ1
16105         ADD B,[DMTLL,,DMTLL]
16106         JUMPL B,.-3
16107         POPJ P,
16108
16109 DEMNAM: MOVSI B,-DMLNG  ;SEARCH BY NAME
16110         CAMN A,DMTTBL(B)
16111         JRST POPJ1
16112         ADD B,[DMTLL,,DMTLL]
16113         JUMPL B,.-3
16114         POPJ P,
16115
16116 DEMOUT: PUSHJ P,LSWTL   ;CALLED BY KILLING JOB (IN CASE OWNED)
16117         400000,,DEMSW
16118         PUSHJ P,DEMUSR
16119         JRST UTOLKJ
16120         SETZM DMTTBL+1(B)       ;MARK AS DOWN,SYSTEM JOB DECIDES WHAT TO DO
16121         AOS REQCNT
16122         MOVSI B,SCLDMN
16123         IORM B,SUPCOR
16124         JRST UTOLKJ
16125
16126 DEMMRV: SETZM DMTTBL+2(B)       ;CALL WITH UTCOFF (SYS JOB) REMOVES ENTRY FROM TBL
16127         SETZM DMTTBL+3(B)       ;WITH INDEX OF DEMON IN B
16128         SETZM DMTTBL(B)
16129         MOVEI B,1
16130         AOSGE DEMCNT
16131         MOVEM B,DEMCNT
16132         JRST UTCONJ
16133
16134 \f
16135 ;DEAMON READ AND SET STATUS ROUTINES
16136
16137 ARDDMST:        PUSHJ P,LSWTL   ;READ DEAMON STATUS
16138         DEMSW
16139         PUSHJ P,DEMNAM
16140         JRST RDDMS1     ;LOST TRY USER INDEX
16141         MOVE A,DMTTBL+1(B)
16142         MOVEI C,L
16143         IDIVM C,A       ;DIVIDE BY L, DON'T CLOBBER B
16144 RDDMS2: MOVE C,DMTTBL+3(B)
16145         MOVE B,DMTTBL+2(B)
16146         PUSHJ P,LSWPOP
16147         JRST POPJ1
16148
16149 RDDMS1: PUSH P,U
16150         MOVE U,A
16151         PUSHJ P,DEMUSR  ;BAD USER
16152         JRST LKUPOP
16153         POP P,U
16154         MOVE A,DMTTBL(B)
16155         JRST RDDMS2
16156 LKUPOP: POP P,U
16157         JRST LSWPOP
16158
16159 ASTDMST:        PUSHJ P,LSWTL   ;SET DEAMON STATUS
16160         400000,,DEMSW
16161         MOVE D,B
16162         PUSHJ P,DEMNAM
16163         JRST STDMS1
16164 STDMS2: JUMPL D,STDMS4
16165 STDMS3: SOSLE W
16166         MOVEM D,DMTTBL+2(B)
16167         SOSLE W
16168         MOVEM C,DMTTBL+3(B)
16169         JRST UTOLJ1
16170 STDMS1: PUSH P,U
16171         MOVE U,A
16172         PUSHJ P,DEMUSR
16173         JRST UTULKP
16174         POP P,U
16175         JUMPGE D,STDMS2
16176 STDMS4: SKIPGE DMTTBL+1(B)      ;REMOVE FROM TABLE IF POSSIBLE
16177         JRST UTOLKJ     ;CAN'T DELETE, LOADING
16178         SETZM DMTTBL+1(B)       ;DOWN
16179         SETZM DMTTBL+2(B)       ;REMOVE REQUESTS
16180         AOS REQCNT      ;SIGNAL SYS JOB
16181         MOVSI B,SCLDMN
16182         IORM B,SUPCOR
16183         JRST UTOLJ1
16184 UTULKP: POP P,U
16185         JRST UTOLKJ
16186 ]
16187
16188 \f
16189 SUBTTL .GETSYS UUO
16190
16191 ;.GETSYS AC,    ;TRANSFERS SYSTEM AREA SPECIFIED BY C(AC+1)
16192                 ;TO USER AREA STARTING AT R.H. C(AC) OF LENGTH MINUS L.H. C(AC)
16193
16194 AGETSYS:
16195 ; Alan 4/2/86:  Took this out because people don't use .GETSYS this way
16196 ; anymore:
16197 ;       PUSHJ P,UDELAY          ;CAUSE A SCHEDULE TO STOP GETSYSER FROM
16198 ;                               ; MONOPOLIZING SYSTEM
16199         MOVSI A,-LGSNAM         ;NEGATIVE OF TABLE LENGTH
16200         UMOVE B,1(J)            ;LOOK AT USERS AC+1, THE 6BIT NAME
16201         CAME B,GSNAME(A)        ;CYCLE THROUGH TABLE
16202          AOBJN A,.-1            ;OF NAMES, POINTER IN RIGHT HALF OF A
16203         JUMPGE A,AGETSL         ;JUMP IF NOT IN TABLE
16204         UMOVE B,(J)             ;GET POINTER TO USERS RECEPTACLE BLOCK
16205 AGETS1: HLRZ C,GSYS1(A)         ;GET LOW END OF BLOCK
16206         HRRZS A                 ;CLEAR COUNT IN L.H. OF A
16207         CAIGE A,NUTCFN          ;SKIP IF UTC OFF NOT REQUIRD
16208          CONO PI,UTCOFF         ;TURN OFF ALL CHANNELS BUT CH 1
16209         skipn c                 ; If LH contains 0, RH is routine to call.
16210          jrst @gsys1(a)         ; (JUMPE C,@GSYS1(A) generates spurious
16211                                 ; page faults, so don't "fix" this.)
16212         HRRZ D,GSYS1(A)         ;GET HIGH END OF BLOCK
16213 ;AT THIS POINT:         ;B USER'S POINTER (UNRELOCATED)
16214                         ;C BEGINNING OF AREA IN SYS
16215                         ;D END OF AREA
16216 agets2: SUBI D,-1(C)            ;BLOCK LENGTH TO BE SENT
16217         HLRZ E,B                ;GET NEG BLK LENGTH FROM USERS PNTR
16218         ADDI E,-1(D)            ;-1 CAUSES CARRY BIT IF .GT.
16219         TLNE E,-1               ;CARRY INDICATES LOSS
16220          JRST AGETS5            ;MORE THAN USER WANTS
16221         HRLS D                  ;BLOCK LENGTH IN BOTH HALVES
16222         HRRZ E,B                ;FIRST WORD (UNRELOCATED)
16223         HRL E,C                 ;SOURCE ADDRESS FOR BLT
16224         HRRZ C,E                ;DESTINATION INTO C
16225         ADD C,D                 ;FINAL ADDRESS +1
16226 AGETS7: XCTRI XBW,[BLT E,-1(C)] ;BLT IT TO HIM
16227          AOSA (P)               ;INCREMENT RETURN, INDICATE SUCCESS
16228           JRST AGETS6
16229         CONO PI,UTCON
16230         ADD B,D
16231         UMOVEM B,(J)            ;TELL USER HOW MUCH HE GOT
16232 AGETS4: POPJ P,
16233
16234 AGETSL: XCTR XW,[SETZM 1(J)]    ;INDICATE BAD SIXBIT
16235         POPJ P,
16236
16237 AGETS5: MOVNS D                 ;TELL USER HOW MUCH HE NEEDS
16238         CONO PI,UTCON           ;NEGATIVE OF RIGHT BLOCK LENGTH
16239         XCTR XRW,[HRLM D,(J)]   ;SET UP PROPER BLOCK LENGTH IN HIS AC
16240         JRST AGETS4
16241
16242 AGETS6: CONO PI,UTCON           ;ONE PAGE WASN'T THERE
16243         XCTR XRW,[MOVES (E)]    ;SO TOUCH IT (TAKE MPV INTERRUPT IF REAL MPV)
16244         JRST AGETS1             ;AND TRY AGAIN (BLT WILL GET FARTHER THIS TIME)
16245                                 ;HAD TO RETRY FROM BEGINNING SINCE THIS MAY BE
16246                                 ;ONE THAT HAS TO BE TRANSFERRED INTACT WITH UTCOFF
16247 \f
16248 GSNAME: SIXBIT /MEMORY/
16249 IFN NUNITS,SIXBIT /UTAPE/
16250 IFN NCPP,[SIXBIT /NCPSM/
16251         SIXBIT /NCPPQ/
16252         SIXBIT /NCPHT/
16253 ]
16254 NUTCFN==.-GSNAME        ;NUMBER TO GET WITH UTCOFF (same as NETOFF)
16255         SIXBIT /USERS/
16256         SIXBIT /USER/
16257         SIXBIT /GETS/
16258         SIXBIT /DEVS/
16259         SIXBIT /CALLS/
16260 IFN IMXP,       SIXBIT /IMPX/
16261         SIXBIT /CLINK/
16262         SIXBIT /DSYMS/
16263         SIXBIT /USYMS/  ;.UPC, .VAL, .TTY, ETC.
16264         SIXBIT /CHDEVS/
16265         SIXBIT /NCALLS/
16266         SIXBIT /TTYVAR/
16267         SIXBIT /USRVAR/
16268         SIXBIT /ITSNMS/
16269 LGSNAM==:.-GSNAME
16270
16271 ;ENTRIES ARE:   BOTTOM,,TOP  OF AREA TO BE TRANSMITTED OR INST TO EXECUTE
16272 GSYS1:  IOBFTL,,EMEMTL          ;lh zero => jrst to THIS ENTRY
16273 IFN NUNITS, UTCHNT,,UTCHE       ;UTAPE
16274 IFN NCPP,[IMSOKB,,IMSOKE        ;NCP SOCKET MAP
16275         IMPBPQ-1,,IMPEPQ        ;NCP PENDING RFC QUEUE
16276         IMPHTB,,IMPHTB+255.     ;NCP HOST TABLE
16277 ]
16278         0,,USRSV                ;USERS
16279         0,,USR1V                ;USER
16280         GSNAME,,GSNAME+LGSNAM-1 ;GETS
16281         DEVTAB,,EDEVS           ;DEVS
16282         SYSYMB,,SYSYME          ;CALLS
16283 IFN IMXP,       IMXTBB,,IMXTBE  ;IMPX
16284         CLVBEG,,CLVEND          ;CLINK
16285         0,,DSYMS                ;DSYMS
16286         SYSUSB,,SYSUSE          ;USYMS
16287         DCHSTB,,DCHSTE          ;CHDEVS
16288         SYSCTB,,SYSCTB+LSYSCT-1 ;NCALLS
16289         TYVTAB,,TYVTAB+LTYVTA-1 ;TTYVAR
16290         USETTB,,USETTB+MXVAL-1  ;USRVAR
16291         ITSNMS,,ITSNMS+LITSNM-1 ;ITSNMS
16292 IFN LGSNAM-<.-GSYS1>, .ERR GSNAME and GSYS1 don't match.
16293
16294 ITSNMS: ITSIRP [
16295         SIXBIT /ITS/
16296         ]
16297 LITSNM==:.-ITSNMS
16298         0
16299         0                       ; Make it easy to add more.
16300
16301 USRSV:  MOVEI C,USRSTG
16302         MOVE D,USRHI
16303         ADDI D,USRSTG-1
16304         JRST agets2
16305
16306 USR1V:  UMOVE C,2(J)
16307         IMULI C,LUBLK
16308         CAML C,USRHI
16309          JRST USR1VL
16310         ADDI C,USRSTG
16311         MOVE D,C
16312         ADDI D,LUBLK-1
16313         JRST agets2
16314
16315 USR1VL: XCTR XW,[SETOM 2(J)]
16316         JRST AGETS4
16317
16318 DSYMS:  HRRZ C,DDT-2
16319         HLRE D,DDT-2
16320         SETCMM D        ;OFFSET BY ONE
16321         ADD D,C
16322         JRST agets2
16323 \f
16324 SUBTTL .GETLOC, .EVAL, ETC.
16325
16326 ;GET AN ABSOLUTE LOCATION       ;.GETLOC AC,    ;C(A)=FROM(ABS),,TO(RELATIVE)
16327 ;
16328 AGETLOC:UMOVE A,(J)             ;GET TO ADDRESS
16329         HLRZ B,A                ;GET FROM ADDRESS
16330         XCTRI [MOVE C,(B)]
16331          JRST .+2
16332           JRST ILEXPF           ;ILLEGAL EXEC PAGE FAULT
16333         UMOVEM C,(A)            ;GIVE TO USER
16334         POPJ P,
16335
16336 ;SET AN ABSOLUTE LOCATION       ;.SETLOC AC,    ;C(AC)=FROM(RELATIVE),,TO(ABS)
16337 ;
16338 ASETLOC:TDZA D,D        ;CLEAR COND FLAG, SKIP
16339
16340 ;SET AN ABSOLUTE LOCATION ONLY IF C(ABS)=C(TEST) & SKIP IF SUCCESSFUL
16341 ;.IFSET AC,     ;C(AC)=<POINTER TO 2 WORD BLOCK>,,TO ADR(ABS)
16342 ;WORD 1=TEST    ;WORD 2=NEW C(ABS)
16343
16344 AIFSET: MOVNI D,1       ;SET COND FLAG
16345         XCTR XR,[HRRZ A,(J)]    ;GET TO ADDRESS (ABSOLUTE)
16346         XCTR XR,[HLRZ B,(J)]
16347         UMOVE C,(B)             ;GET WORD
16348         XCTRI [MOVES (A)]
16349          JRST .+2
16350           JRST ILEXPF
16351         JUMPE D,ASPST1  ;NORMAL SETLOC
16352         UMOVE D,1(B)    ;GET NEW VALUE
16353         CONO PI,CLKOFF  ;PREVENT INTERRUPTS
16354         CAME C,(A)      ;CHECK WORD AGAINST TEST WORD
16355          JRST CLKONJ    ;NOT EQUAL => IGNORE
16356         MOVE C,D
16357         AOS (P)         ;CAUSE RETURN TO SKIP
16358         CAIG A,SYSB_10. ;CHECK IF IN SYS
16359          JRST ASPST1    ;YES SO DO REG SETLOC
16360         EXCH D,(A)      ;NO SO DO NOW BEFORE SHUFFLE & GET OLD
16361 ASPST2: MOVE C,D
16362         HRROS A         ;LET SYS JOB KNOW ALREADY DONE
16363 ASPST1: CAMN C,(A)      ;SKIP IF DIFFERENT FROM C(TO ADR)
16364          JRST CLKONJ    ;SAME
16365         MOVE D,SYSITM   ;IF SYSTEM JOB HAS BEEN HUNG OR LOOPING FOR 30 SEC,
16366         ADDI D,30.*30.
16367         CAMGE D,TIME
16368          JUMPGE A,ASPST3        ;GO DO THE WORK OURSELVES (BUT DON'T DO IT TWICE).
16369 ASPST4: MOVE D,UNAME(U) ;GET UNAME OF SETLOCER
16370         MOVSI T,SCLSET
16371         PUSHJ P,CWAIT   ;WAIT TILL VARIABLES TO COMMUNICATE WITH SYS JOB ARE FREE
16372             TDNE T,SUPCOR       ;ARG TO CALL IN .-1
16373         MOVEM A,SETSLC  ;REMEMBER ABS LOCATION
16374         MOVEM C,SETSLQ  ; " NEW CONTENTS (OR OLD IF LH(SETSLC)=-1)
16375         MOVEM D,SETSU   ; " USER
16376 CSPST:  IORM T,SUPCOR   ;TELL SYS JOB TO DO IT
16377         JRST CLKONJ
16378
16379 ASPST3: HRRZ D,UPC      ;SYS JOB HAS BEEN HANGING FOR 30 SEC.
16380         CAIN D,SCOR1    ;WHY? JUST SLEEPING?
16381          JRST ASPST4    ;YES => SIGNAL IT TO DO THE WORK
16382         MOVEM C,(A)     ;ELSE GIVE UP ON IT AND DO IT NOW
16383         JRST CLKONJ
16384 \f
16385 ;LOOK UP ITS SYMBOL     ;.EVAL AC,      ;C(AC)=SQUOZE SYMBOL
16386 ;REPLACES SYMBOL BY VALUE & SKIPS IF SUCCESSFUL
16387 ;IF YOU WANT TO .EVAL A SYMBOL IN A PROGRAM HABITUALLY AND IMPLICITLY,
16388 ;AND WANT IT TO CONTINUE TO WORK, YOU HAD BETTER ADD AN ENTRY TO THE FILE
16389 ;AI:SYSTEM;EVSYMS > SAYING WHAT PROGRAM AND WHAT SYMBOL. THEN, ITS HACKERS
16390 ;CAN AVOID SCREWING YOU WITHOUT WARNING.
16391
16392 AEVAL:  PUSHJ P,SWTL
16393         ARDFSW
16394         UMOVE B,(J)     ;GET SYM
16395         PUSHJ P,SYMLK   ;LOOK UP
16396         JRST LSWPOP     ;NOT FOUND
16397         MOVE A,(C)      ;GET VALUE
16398         PUSHJ P,LSWPOP
16399         AOS (P)         ;CAUSE UUO TO SKIP
16400         JRST APTUAJ     ;RETURN VALUE
16401
16402 ;REDEFINE ITS SYMBOL    ;.REDEF AC,     ;C(AC)=POINTER TO 2 WORD BLOCK
16403 ;WORD 1 = SYMBOL        ;WORD 2 = VALUE
16404 ;DELETE SYM IF ALL 4 FLAG BITS SET
16405 ;  OTHERWISE SET SYMBOL FLAGS TO THOSE SPECIFIED, EXCEPT REJECT ANY ATTEMPT TO
16406 ;  ADD A PROGRAM NAME
16407 ;ADD SYM IF NOT FOUND   ;FAIL ONLY IF NOT ENOUGH ROOM
16408 ;SKIPS IF SUCCESSFUL
16409
16410 AREDEF: PUSHJ P,SWTL
16411             ARDFSW
16412         XCTR XR,[HRRZ D,(J)]    ;GET POINTER FROM AC
16413         UMOVE B,(D)     ;GET SYMBOL
16414         PUSHJ P,SYMLK   ;LOOK UP
16415         JRST ARDF2      ;NOT FOUND, CREATE
16416         XCTR XR,[SETCM A,(D)]   ;GET SYM (COMPLEMENTED)
16417         TLNN A,740000   ;SKIP IF ANY FLAGS NOT SET
16418         JRST ARDF3      ;ALL SET => DELETE
16419         SETCA A,
16420         TLNN A,740000
16421         JRST LSWPOP
16422         MOVEM A,-1(C)
16423         UMOVE A,1(D)    ;GET VALUE
16424         MOVEM A,(C)     ;STORE IN SYMTAB
16425         JRST ARDF4      ;SORT AND SKIP-RETURN.
16426
16427 ARDF2:  MOVE C,DDT-2    ;GET POINTER
16428         SUB C,[2,,2]    ;DECREMENT FOR NEW ENTRY
16429         MOVEI A,-1(C)   ;FUDGE FOR BLOCK CALC
16430         LSH A,-10.      ;CONVERT TO # OF BLOCKS UP TO SYMTAB -1
16431         UMOVE B,(D)     ;GET SYM
16432         MOVE T,FDDTPG
16433         LSH T,10.
16434         TLNE B,740000   ;LOSE IF PROG NAME
16435         CAMLE A,T       ;CHECK FOR LOSSAGE
16436          JRST LSWPOP    ;DON'T OVERWRITE ITS
16437         EXCH B,2(C)     ;STORE OVER GLOBAL BLOCK HEADER,
16438         MOVEM B,(C)     ;MOVE THAT HEADER DOWN 2 WDS.
16439         UMOVE A,1(D)    ;GET VALUE
16440         EXCH A,3(C)
16441         ADD A,[-2,,]    ;1 MORE SYM IN GLOBAL BLOCK.
16442         MOVEM A,1(C)    ;STORE
16443         MOVEM C,DDT-2   ;UPDATE POINTER
16444         JRST ARDF4      ;GO SORT AND SKIP-RETURN.
16445
16446 ARDF3:  MOVE B,DDT-2    ;GET POINTER
16447         MOVE A,(B)      ;MOVE THE GLOBAL HEADER
16448         EXCH A,2(B)     ;UP OVER 1ST SYM
16449         MOVEM A,-1(C)   ;WHICH GOES INTO FREE SLOT.
16450         MOVE A,1(B)
16451         ADD A,[2,,]     ;GLOBAL BLOCK 1 SYM SHORTER.
16452         EXCH A,3(B)
16453         MOVEM A,(C)
16454         MOVE A,[2,,2]
16455         ADDM A,DDT-2    ;UPDATE POINTER
16456 ARDF4:  MOVSI E,(SETZ)  ;TELL DDT ITS SYMTAB WAS ALTERED.
16457         IORM E,DDT-1
16458         PUSHJ P,SBUBL   ;DO 1 BUBBLE-SORT UP AND 1 DOWN.
16459         JRST LSWPJ1     ;FREE ARDFSW AND EXIT.
16460 \f
16461 ;DO ONE BUBBLE SORT PASS UP, ONE DOWN; LEAVE J <0 IFF DID AN EXCHANGE.
16462 ;CLOBBER A-E.
16463 SBUBL:  MOVE E,DDT-2
16464         HLL E,1(E)
16465         ADD E,[2,,2]    ;AOBJN -> SYMS IN GLOBAL BLOCK.
16466 SBUBL0: SETZ J,
16467         MOVE B,[2,,2]   ;INCREMENT FOR UPWARD PASS.
16468         MOVE C,[JUMPL A,SBUBL1]
16469         SUBI E,2        ;(WILL INCREMENT BEFORE ACTING)
16470         MOVE A,E
16471         PUSHJ P,SBUBL2
16472         MOVNS B         ;DECREMENT FOR DOWNWARD PASS.
16473         MOVE C,[CAMN A,E]
16474         JRST SBUBL2
16475
16476 SBUBL1: MOVE D,1(A)     ;CHECK NEXT PAIR OF ENTRIES.
16477         CAMG D,3(A)
16478          JRST SBUBL2    ;IN CORRECT ORDER.
16479         EXCH D,3(A)
16480         MOVEM D,1(A)    ;WRONG ORDER, EXCHANGE.
16481         MOVE D,(A)
16482         EXCH D,2(A)
16483         MOVEM D,(A)
16484         SETO J,         ;SAY DID AN EXCHANGE.
16485 SBUBL2: ADD A,B         ;MOVE TO NEXT ENTRY.
16486         XCT C           ;TEST IF FINISHED.
16487          POPJ P,
16488         JRST SBUBL1     ;(NOT FINISHED)
16489
16490 ;LOOK UP SYMBOL IN B IN ITS SYMBOL TABLE (CLOBBERS A,B,C)
16491 ;RETURN WITH POINTER TO VALUE WORD IN C
16492 ;SKIPS IF SUCCESSFUL
16493
16494 SYMLK:  TLZ B,740000    ;FLUSH FLAGS
16495         MOVE C,774000-2 ;PICK UP AOBJN POINTER TO SYMTAB FROM EXEC DDT
16496 SYMLK2: MOVE A,(C)      ;GET SYM
16497         AOBJP C,[JRST 4,.+1]    ;INCREMENT POINTER
16498         TLNE C,376      ;GO THROUGH HAIR EVERY 200 SYMS
16499         JRST SYMLK3     ;NOT THIS TIME
16500         PUSHJ P,OPBRK
16501 SYMLK3: TLNN A,200000   ;SKIP IF DELETE INPUT (FLAG PREVENTS MATCH)
16502         TLZE A,740000   ;FLUSH FLAGS & CAUSE LOSS IF ALL 0 (PROG NAME)
16503         CAME A,B        ;COMPARE
16504         AOBJN C,SYMLK2  ;LOSS, TRY ANOTHER
16505         JUMPL C,POPJ1   ;SKIP RETURN IF FOUND
16506         POPJ P,         ;NOT SO IF LOSS
16507
16508 AWSNAME:XCTR XR,[SKIPE B,(J)]   ;OPER 35
16509          MOVEM B,USYSNM(U)
16510         POPJ P,
16511
16512 AUPISET:UMOVE B,(J)     ;OPER 36
16513         ASH B,-35.
16514         EXCH B,PICLR(U)
16515         UMOVEM B,(J)
16516         SKIPN PICLR(U)
16517          POPJ P,
16518         JRST APISE1
16519 \f
16520 ;GENERATE A UNIQUE SYM  ;.GENSYM AC,    ;LOADS AC WITH SYM
16521 ;
16522 AGENSYM:PUSHJ P,SWTL    ;WAIT TILL INTERLOCK FREE THEN SEIZE IT
16523           GENSSW
16524         MOVEI TT,IGNSYM
16525         PUSHJ P,SIXAOS  ;INCREMENT SYM
16526         MOVE A,IGNSYM   ;GET SYM
16527         PUSHJ P,LSWPOP  ;UNLOCK FOR NEXT USER
16528         JRST APTUAJ     ;GIVE USER GENERATED SYMBOL
16529
16530 ;GENERATE A UNIQUE NUM  ;.GENNUM AC,    ;LOADS AC WITH NUMBER 
16531 ;
16532 AGENNUM:AOS A,IGNNUM    ;INCREMENT NUMBER
16533         JRST APTUAJ     ;AND GIVE IT TO USER
16534
16535 EBLK
16536
16537 GENSSW: -1
16538         0
16539 IGNSYM: SIXBIT /SYS/
16540
16541 IGNNUM: 0
16542
16543 BBLK
16544
16545 SIXAOS: PUSH P,I
16546         PUSH P,J
16547         AOS (TT)        ;INCREMENT SYM
16548         MOVE I,[440600,,(TT)]   ;GET POINTER TO FIRST CHAR
16549 SIXAS2: ILDB J,I        ;GET FIRST (NEXT) CHAR
16550         SKIPN J         ;SKIP IF NOT ZERO
16551         MOVEI J,1       ;REPLACE EMBEDDED SPACE WITH "!"
16552         DPB J,I         ;PUT BACK
16553         CAME I,[60600,,(TT)]    ;SKIP IF FIRST FIVE CHARS HAVE BEEN EXAMINED
16554          JRST SIXAS2    ;GO TO NEXT CHAR
16555         POP P,J
16556         POP P,I
16557         POPJ P,
16558 \f
16559 IFN KL10P,[
16560
16561 SUBTTL KL10 PERFORMANCE COUNTER
16562
16563 ;KLPERF SYMBOLIC SYSTEM CALL
16564 ;ARG 1: <JOB> TO MEASURE PERFORMANCE DURING;
16565         ;-3 => NULL JOB, -4 => ALL JOBS
16566 ;ARG 2: P.A. ENABLES WORD (SEE NON-EXISTENT KL10 SYS REF MAN)
16567         ;0 => FREE THE FACILITY, ELSE TRIES TO GRAB IT
16568 ;NO ARGS => JUST READS THE VALUES WITHOUT CHANGING THE ENABLING CONDITIONS.
16569         ;IN THAT CASE, IT IS OK IF FACILITY IS OWNED BY SOMEONE ELSE
16570 ;VAL 1: PREVIOUS <JOB> SETTING
16571 ;VAL 2: PREVIOUS P.A. ENABLE WORD
16572 ;VAL 3: TIME BASE HIGH WORD
16573 ;VAL 4: TIME BASE LOW WORD
16574 ;VAL 5: PERF CTR HIGH WORD
16575 ;VAL 6: PERF CTR LOW WORD
16576
16577 KLPERF: CONO PI,CLKOFF
16578         JUMPN W,KLPER1
16579 KLPER0: MOVE J,MTRJOB   ;NO ARGS => DONT CHANGE SETTINGS,
16580         MOVE B,PAEON    ;JUST RETURN CURRENT COUNT.
16581         JRST KLPER3
16582
16583 KLPER1: JUMPN B,KLPER2  ;TRYING TO TURN IT ON?
16584         CAME U,MTRUSR
16585          JRST KLPER0    ;FREEING THE FACILITY WHEN DON'T OWN IT?
16586         PUSHJ P,PRFOFF  ;NO, TRYING TO FREE IT - DO SO.
16587         MOVEI J,-2
16588         JRST KLPER3
16589
16590 KLPER2: SKIPGE MTRUSR   ;IF FACILITY IS FREE, SIEZE IT.
16591          MOVEM U,MTRUSR
16592         CAME U,MTRUSR
16593          JRST OPNL10    ;ALREADY BELONGS TO SOME OTHER JOB.
16594         MOVEI J,2(A)
16595         CAIN J,-2       ;ALL JOBS?
16596          JRST KLPER4
16597         CAIN J,-1       ;NULL JOB?
16598          JRST KLPER3
16599         MOVE J,A
16600         JSP T,NCRUI2    ;ELSE DECODE JOB SPEC; OBJECT TO PDP6
16601          JFCL
16602         CAME J,U
16603          JRST KLPER3
16604 ;TRYING TO TURN ON FOR SELF OR ALL JOBS - IT OUGHT TO BE ON RIGHT NOW!
16605 KLPER4: CONO MTR,2001   ;TURN ON TIME BASE, INTERVAL PIA=1
16606         WRPAE B         ;SET ENABLES
16607 KLPER3: EXCH B,PAEON
16608         SKIPGE A,MTRJOB
16609          TRZA A,2       ;UN CONVERT -1 => -3, -2 => -4
16610           LSH A,-9      ;IDIVI A,LUBLK
16611 IF2 IFN LUBLK-1000,.ERR NO DIVIDE
16612         HRREM J,MTRJOB
16613         RCCL C          ;C,D GET TIME BASE
16614         RPERFC E        ;E,TT GET PERFC
16615         JRST CLKOJ1
16616
16617 ;TURN OFF THE PERFORMANCE COUNTER.  PUT BACK IN RUN-TIME MEASURING MODE
16618 PRFOFF: MOVNI A,2       ;NOT ATTACHED TO ANY JOB
16619         MOVEM A,MTRJOB
16620         WRPAE [1576,,1200]      ;MEASURE MAIN-PROGRAM TIME IN 80 NS UNITS (MODEL A)
16621         CONO MTR,4001   ;TIME-BASE OFF, INTERVAL PIA=1
16622         RPERFC STPERF   ;START-OF-QUANTUM TIME IS NOW
16623         RPERFC NULPRF   ;ALSO FOR NULL-JOB
16624         SETOM MTRUSR    ;NO LONGER IN USE
16625         POPJ P,
16626 ] ;END IFN KL10P
16627 \f
16628 $INSRT CORE             ;CORE JOB AND MEMORY MANAGEMENT ROUTINES
16629
16630 SUBTTL NULL DEVICE
16631 ;  IMMEDIATE EOF ON INPUT, HAS NO EFFECT ON OUTPUT
16632 ;
16633 NULO:   HLRS A,C                ;REMEMBER MODE FOR .STATUS
16634         JSP Q,OPSLC3            ;SET UP IOCHNM WORD AND EXIT
16635             NLIDN,,NLODN        ;ARG
16636             NLBIDN,,NLBDN       ;ARG
16637
16638 ;UNIT NULL DEVICE INPUT
16639 NULI:   JRST UNIEOF
16640
16641 ;BLOCK NULL DEVICE INPUT
16642 NULBI:  POPJ P,
16643
16644 ;BLOCK NULL DEVICE OUTPUT ENTRY
16645 ;ADVANCE BLOCK MODE .IOT POINTER
16646 NULBOD: XCTR XR,[HLRE A,(C)]    ;GET NEG LENGTH FROM LEFT HALF
16647         MOVNS A                 ;GET POSITIVE LENGTH
16648         XCTR XR,[ADD A,(C)]     ;ADD STARTING LOC (R.H.)
16649         XCTR XW,[HRRZM A,(C)]   ;STORE BACK "COUNTED OUT" POINTER
16650         POPJ P,
16651
16652 ;STANDARD DEVICE .STATUS ROUTINE
16653 STDSTA: DPB A,[60300,,D]        ;A HAS LH OF IOC WORD
16654         TRO D,1_9               ;SYS BUF CAP FULL
16655         TRNE D,1_6              ;SKIP IF INPUT
16656         TRC D,3_9               ;TURN OFF SYS BUF CAP FULL, SET EMPTY
16657         POPJ P,
16658 \f
16659 SUBTTL USER DEVICE
16660
16661 UBPFJ==10       ;DEMAND FOREIGN JOB (BIT IN LH (DEV) FOR .OPEN (USR))
16662
16663 USROJ:  TDZA J,J        ;ENTRY FROM JOB DEVICE DONT GET CORE.
16664 USRO:   MOVNI J,1       ;INDICATE NOT FROM JOB OPEN
16665         CAIA
16666 USROOJ:  MOVEI J,1      ;OJB DEVICE; EXISTING JOB OK ONLY IF %OPOJB BIT SET.
16667         PCLT
16668         SKIPL CORRQ(U)
16669         PUSHJ P,UFLS    ;PREVENT ATTEMPT TO CORE, PCLSR OUT, AND THINK YOU'VE WON AT SETBF1, ETC
16670         PUSHJ P,SWTL
16671             TREESW
16672         JUMPE B,USRO4   ;JNAME = 0 => UNAME IS JOB SPEC.
16673         SKIPN A         ;IF UNAME=0
16674          MOVE A,UNAME(U)        ;MAKE IT THIS JOB'S UNAME
16675         CAME A,UNAME(U) ;SKIP IF FIRST FILE NAME IS UNAME OF OPENER
16676          JRST USROA
16677         CAME B,[SIXBIT /PDP10/] ;SKIP IF SECOND FILE NAME IS "PDP10"
16678          CAMN B,[SIXBIT /PDP6/] ;OR PDP6
16679 IFN PDP6P,JRST PDPO
16680     .ELSE JRST OPNL1
16681 USROA:  CONO PI,CLKOFF
16682         PUSHJ P,LSWPOP  ;TREESW
16683 USROB:  SETZ TT,
16684 USRO3:  CAME A,UNAME(TT)
16685          JRST AGIN
16686         CAMN B,JNAME(TT)
16687          JRST UFN1      ;FOUND UNAME JNAME PAIR
16688 AGIN:   ADDI TT,LUBLK
16689         CAMGE TT,USRHI
16690          JRST USRO3
16691         TLNE C,UBPFJ    ;JOB MUST EXIST TO WIN IF UBPFJ SET
16692          JRST OPNL4
16693         CAME A,UNAME(U) ;INFERIOR PROCEDURE MUST HAVE SAME UNAME
16694          JRST OPNL20
16695         PUSH P,U
16696 TCORS:  MOVSI T,%TBNOT+%TBDTY   ;DOESN'T HAVE TTY, ISN'T GIVING IT AWAY
16697         PUSHJ P,USTRA
16698          JRST TCORS1    ;USTRA FAILED - SEE WHY, MAYBE RETRY (U CLOBBERED)
16699         MOVEM A,UNAME(U)
16700         MOVEM B,JNAME(U)
16701         MOVEM A,USYSNM(U)
16702         MOVE TT,U
16703         POP P,U
16704         MOVE A,UTMPTR(U)
16705         MOVEM A,UTMPTR(TT)
16706         MOVE A,HSNAME(U)
16707         MOVEM A,HSNAME(TT)
16708         MOVE A,XUNAME(U)
16709         MOVEM A,XUNAME(TT)
16710         MOVEM B,XJNAME(TT)
16711         PUSHJ P,USRST5  ;SET UP TTY STUFF
16712         MOVSI A,400000
16713         SKIPGE APRC(U)
16714          IORM A,APRC(TT)        ;NEW INFERIOR IS DISOWNED IF CREATOR IS.
16715         JUMPE J,CLKOJ1  ;RETURN HERE FOR JOB DEVICE (INDEX IN TT)
16716         PUSHJ P,ULUP1   ;FIND AN INTERRUPT BIT FOR THE JOB.
16717          JRST NOGO1     ;NONE => GO KILL THE JOB AND RETURN FAILURE.
16718         CONO PI,CLKON   ;NOW CAN'T FAIL TO CREATE THE JOB FOR GOOD.
16719         HRLZ B,B
16720         HRR B,U
16721         MOVEM B,SUPPRO(TT)
16722         MOVE U,TT
16723         PUSHJ P,UFOUND  ;SET UP THE OPENER'S CHANNEL.
16724          JFCL
16725         MOVE Q,TT
16726         MOVEI B,1
16727         PUSHJ P,ACORE1  ;MAY PCLSR OUT, BUT CORE JOB WILL DO WORK ANYWAY.
16728          SKIPA R,UUAC(U);NO CORE AVAILABLE, KILL THE JOB
16729           JRST POPJ1    ;SUCCESS
16730         ADDI R,IOCHNM(U)
16731         PUSHJ P,AUCLOSE
16732         JRST OPNL37     ;NO CORE AVAILABLE
16733 \f
16734 ULUP1:  CLEARB A,T
16735 ULUP:   HRRZ E,SUPPRO(T)
16736         SKIPN UNAME(T)  ;SKIP IF VARIABLE BLOCK IN USE
16737         JRST ULUP2
16738         CAIN E,(U)      ;SKIP IF NOT AN INFERIOR
16739         IOR A,SUPPRO(T) ;IOR IN INTERRUPT BIT OF INFERIOR
16740 ULUP2:  ADDI T,LUBLK    ;ADVANCE TO NEXT BLOCK
16741         CAMGE T,USRHI   ;SKIP IF ALL EXAMINED
16742         JRST ULUP       ;LOOP
16743 UFIN:   MOVEI B,1       ;SELECT INT BIT
16744 UFIN2:  TLON A,(B)
16745         JRST POPJ1
16746         LSH B,1
16747         CAIGE B,1_<NINFP>
16748         JRST UFIN2
16749         POPJ P,
16750
16751 NOGO1:  MOVSI T,BULGO+BULGOS
16752         IORM T,APRC(TT) ;TELL THE SYS JOB TO KILL THE JOB WE JUST GOT
16753         MOVSI T,SCLGUN
16754         IORM T,SUPCOR
16755         JRST OPNL5      ;DIREC FULL (TOO MANY LOSERS)
16756
16757 NOGO4:  SUB P,[1,,1]
16758         JRST OPNL6
16759
16760 TCORS1: PCLT            ;COME HERE FROM TCORS IF ATTEMPT TO FIND FREE JOB SLOT FAILED.
16761         SKIPGE SJCFF    ;IF THIS IS NEGATIVE, USTRA DIDN'T EVEN REQUEST MORE
16762          JRST [ SKIPGE SJCFF
16763                  PUSHJ P,UFLS
16764                 JRST TCORS2]
16765         MOVE TT,USRHI
16766         CAIL TT,MAXJ*LUBLK
16767          JRST NOGO4                     ;USER MEM EXPANDED TO MAX
16768         SKIPGE SUPCOR   .SEE SCLEX      ;PRESUMABLY USTRA ASKED SYS JOB FOR MORE JOB SLOTS
16769          PUSHJ P,UFLS                   ;SO WAIT TILL SYS JOB ANSWERS THE REQUEST
16770 TCORS2: CONO PI,CLKOFF                  ;AND SEE IF THERE ARE NOW ENOUGH SLOTS.
16771         JRST TCORS
16772 \f
16773 USRO4:  EXCH J,A        ;USR: OPEN WITH JNAME=0: USE UNAME AS JOB SPEC.
16774         JSP T,NCORUI
16775          JFCL
16776 IFN PDP6P,[
16777         CAIN J,-1       ;SPEC'D JOB IS PDP6 => OK,
16778          JRST PDPO
16779 ]
16780         CONO PI,CLKOFF
16781         PUSHJ P,LSWPOP  ;SOS DIELOK(J)
16782         PUSHJ P,LSWPOP  ;TREESW
16783         MOVE TT,J
16784         MOVE J,A
16785 ;COME HERE WHEN JOB ALREADY EXISTS, WITH CLOCK OFF AND USR IDX IN TT.
16786 ;A, B, C STILL HAVE UNAME, JNAME AND OPEN MODE.
16787 UFN1:   JUMPE J,[ADDI B,10000   ;OPENING JOB-DEVICE AND JOB EXISTS??
16788                  JRST USROB]    ;KEEP CHANGING JNAME UNTIL WE CREATE A JOB.
16789         CAIG TT,LUBLK
16790          JUMPL J,UFNDF          ;SKIP SOME CHECKS ON SYS & CORE
16791         JUMPG J,[MOVSI T,%OPOJB         ;OJB DEVICE OPEN; IF JOB DOESN'T HAVE %OPOJB SET,
16792                 TDNE T,OPTION(TT)       ;THEN IT HASN'T GIVEN PERMISSION TO BE HACKED.
16793                  SKIPL JBI(TT)          ;IF IT'S ALREADY A JOB DEVICE DON'T HACK IT.
16794                   JRST [CONO PI,CLKON   ;IN EITHER CASE, WAIT TILL ALL'S OK,
16795                         SKIPL JBI(TT)
16796                          PUSHJ P,UFLS
16797                         TDNN T,OPTION(TT)
16798                          PUSHJ P,UFLS
16799                         JRST USROOJ]    ;THEN RE-TRY THE OPEN.
16800                 LDB T,[.BP BULGOS_22,APRC(TT)]
16801                 JUMPN T,OPNL42
16802                 JRST CLKOJ1]    ;RETURN SUCCESS TO JOBO6C.
16803         TLNE C,UBPFJ
16804          JRST UFNDF     ;USER WANTS IT AS FOREIGN JOB
16805         HRRZ E,SUPPRO(TT)
16806         CAIN E,(U)
16807          JRST UFN1C     ;OPENING UP INFERIOR
16808         SKIPGE T,APRC(TT)
16809          SKIPL SUPPRO(TT)       ;UNLESS IT'S A TOP-LEVEL DISOWNED JOB,
16810           JRST UFNDF    ;THEN FOREIGN JOB
16811         PUSHJ P,UFN2B   ;REOWN DISOWNED TREE
16812          POPJ P,        ;CAN'T
16813         JRST UFOUND     ;DID
16814
16815 UFN1C:  MOVE U,TT       ;OPENING PROCEDURE IMMEDIATE SUPERIOR OF PROCEDURE BEING OPENED
16816         JRST UFOUND
16817 \f
16818 ;
16819 ; REOWN A DISOWNED PROCEDURE TREE
16820 ;
16821
16822 NREOWN: TLNN R,%CLSFU           ;MUST BE A FOREIGN USER CHANNEL
16823          JRST OPNL34
16824         CONO PI,CLKOFF
16825         HLRZ TT,H
16826         SKIPGE T,APRC(TT)
16827          SKIPL SUPPRO(TT)
16828           JRST OPNL31           ;TO A TOP-LEVEL DISOWNED JOB
16829         HRLM R,(P)
16830         PUSHJ P,UFN2B           ;REOWN THE JOB (TURNS CLOCK ON)
16831          POPJ P,                ;FAILED
16832         HLRZ R,(P)              ;TURN THE CHANNEL INTO AN INFERIOR CHANNEL.
16833         MOVNI T,FUWIDN-UWIDN
16834         ADDM T,(R)
16835         JRST POPJ1
16836
16837 ;REOWN JOB TT POINTS TO, ITS APRC IS IN T.  SKIPS IF SUCCESSFUL.
16838 ;CALL WITH CLKOFF, WILL TURN IT ON.
16839 UFN2B:  TLNE T,BULGOS
16840          JRST OPNL42    ;CAN'T REOWN JOB WHICH IS LOGGING OUT.
16841         SKIPGE APRC(U)  ;IF REOWNING JOB IS DISOWNED, PROHIBIT SO THAT
16842          JRST OPNL31    ;IT DOESN'T REOWN ITSELF AND SCREW THINGS UP
16843         PUSHJ P,ULUP1   ;FIND AN INTERRUPT BIT FOR IT. (IN B)
16844          JRST OPNL5     ;WE HAVE 8 INFERIORS ALREADY.
16845         AOS (P)         ;GOING TO WIN
16846         SETOM DLSRCH    ;INHIBIT SCHEDULING
16847         CONO PI,CLKON   ;TURN CLOCK BACK ON, THIS MAY TAKE A WHILE
16848         MOVSI A,BUMRTL  ;DOOMED DETACHED JOBS ARE RESCUED BY REOWNING.
16849         ANDCAM A,APRC(TT)
16850         MOVE A,UNAME(U) ;PICK UP NEW UNAME
16851         SETCM D,APRC(U)
16852         TLZ D,#400000   ;SIGN OF D SET IFF REOWNER ISN'T DISOWNED.
16853         MOVE J,UTMPTR(U) ;PICK UP NEW USER RESOURCE POINTER
16854         HRR D,J
16855         SUBI J,USRRCE   ;GET NEW CONSOLE #
16856         CAIL J,NCT      ;IF NEW TREE STILL HAS NO TTY,
16857          MOVEI J,%TINON ;"DISOWNED" TTY CHNLS SHOULD REMAIN SUCH
16858 ;HERE, A HAS UNAME, D HAS <SIGN IFF MAKING NON-DISOWNED>,,UTMPTR, J HAS CONSOLE # OR %TINON,
16859 ;U HAS REOWNER, TT HAS JOB BEING REOWNED.
16860 UFN2A:  PUSH P,B        ;SAVE INTERRUPT BIT
16861 UFN3:   MOVEM A,UNAME(TT)       ;SET TO NEW UNAME
16862         HRRZM D,UTMPTR(TT)      ;SET TO NEW USER RESOURCE POINTER
16863         MOVEI R,IOCHNM(TT)
16864         PUSHJ P,CHSCAN
16865         PUSHJ P,UFN3ZZ
16866         HLLZ T,D                ;LH(D) HAS 0 IF REOWNER DISOWNED, ELSE 400000
16867         ANDCAM T,APRC(TT)       ;MARK AS NOT DISOWNED IF REOWNER ISN'T DISOWNED.
16868 UFNL3:  MOVE B,JNAME(TT)        ;PICK UP CURRENT JNAME
16869         MOVEI E,0       ;LOOP ON ALL USERS
16870 UFNL1:  CAMN A,UNAME(E) ;SKIP ON NOT SAME UNAME
16871          CAME B,JNAME(E) ;SKIP ON SAME UNAME-JNAME
16872           JRST UFNL2    ;NOT SAME NAME AND/OR VAR BLK NOT IN USE
16873         JRST UFN7       ;NAME CONFLICT, RESOLVE
16874 UFNL2:  ADDI E,LUBLK
16875         CAMGE E,USRHI
16876          JRST UFNL1
16877         MOVEI E,0       ;INITIALIZE FOR LOOP TO LOOK FOR INFERIORS AND DUPLICATE NAMES
16878 UFN4:   SKIPN UNAME(E)  ;SKIP IF VAR BLOCK IN USE
16879          JRST UFN5      ;TRY NEXT
16880         HRRZ I,SUPPRO(E)        ;PICK UP SUPERIOR POINTER OF BLOCK BEING EXAMINED
16881         CAIN I,(TT)     ;SKIP IF NOT INFERIOR
16882          JRST UFN6      ;INFERIOR, PSEUDO-RECURSE
16883 UFN5:   ADDI E,LUBLK    ;ADVANCE TO NEXT BLOCK
16884         CAMGE E,USRHI   ;SKIP IF ALL EXAMINED
16885          JRST UFN4      ;LOOP
16886         SKIPGE SUPPRO(TT)       ;SKIP IF NOT BACK TO TOP
16887          JRST UFNX      ;BACK TO TOP LEVEL
16888         MOVE E,TT       ;POP BACK UP
16889         HRRZ TT,SUPPRO(E)       ;TO PREVIOUS LEVEL
16890         MOVE B,JNAME(TT)        ;RESTORE B
16891         JRST UFN5       ;PROCEED AT PREVIOUS LEVEL
16892 \f
16893 UFNX:   POP P,B
16894         HRLM B,SUPPRO(TT)
16895         HRRM U,SUPPRO(TT)       ;SET UP SUPERIOR POINTER IN TO LEVEL DISOWNED
16896         SETZM DLSRCH            ;RE-ENABLE SCHEDULING
16897         MOVE U,TT
16898         POPJ P,
16899
16900 UFN6:   MOVE TT,E       ;PSEUDO-RECURSE
16901         JRST UFN3       ;START UP ON LOWER LEVEL
16902
16903 UFN7:   CAMN E,TT       ;SKIP UNLESS FOUND SELF
16904          JRST UFNL2
16905         ADDI TT,JNAME   ;SET UP ARG TO SIXAOS
16906         PUSHJ P,SIXAOS  ;INCREMENT JNAME
16907         SUBI TT,JNAME   ;RESTORE TT
16908         JRST UFNL3      ;RESTART LOOP
16909
16910 ;RESUSCITATE TTY CHNLS
16911 UFN3ZZ: HRRZ Q,(R)
16912         CAIL Q,TYIDN
16913         CAILE Q,TYOBN
16914          POPJ P,        ;NOT A TTY CH
16915         HLRZ Q,(R)
16916         TRNN Q,%TICNS
16917          POPJ P,        ;NOT CONSOLE
16918         CAIE J,%TINON
16919          AOS TTNTO(J)
16920         DPB J,[$TIIDX,,(R)]
16921         POPJ P,
16922
16923 UFOUND: HLRZS C         ;U HAS INF PROC
16924         HRL A,U
16925         MOVE U,USER
16926         HRRZ R,UUAC(U)
16927         ADDI R,IOCHNM(U)        ;CLOBBERED BY CORE
16928         JSP Q,OPSLC3
16929             UWIDN,,UWODN
16930             UBIDN,,UBODN
16931
16932 UFNDF:  TLNE C,1
16933          JRST OPNL12    ;ATTEMPTED OUTPUT
16934         LDB A,[.BP BULGOS_22,APRC(TT)]
16935         JUMPN A,OPNL42  ;USER GOING AWAY
16936         HRL A,TT
16937         JSP Q,OPSLD1
16938             FUWIDN,,FUBIDN
16939 \f
16940 USRST:  PUSHJ P,AUCL2   ;.RESET SIMULATES CLOSING AND REOPENING
16941          POPJ P,
16942         CONO PI,CLKON
16943         PUSHJ P,1USTOP
16944         EXCH U,A        ;BUT WITH LESS OVERHEAD
16945         PUSH P,A
16946         PUSHJ P,IODCL
16947         MOVEI B,BULGOS  ;WE'RE NOT REALLY TRYING TO KILL THE INFERIOR,
16948         ANDCAM B,APRC(U) ;SO DON'T LET OTHERS THINK HE'S BEING KILLED.
16949         MOVE Q,U
16950         SETZ B,
16951         EXCH U,(P)
16952         PUSHJ P,ACRF1   ;FLUSH ALL OF CORE
16953          BUG
16954 USRST1: MOVEI B,1
16955         MOVE Q,(P)
16956         PUSHJ P,ACRF1   ;THEN GET 1 PAGE
16957          JRST [ PUSHJ P,UDELAY
16958                 JRST USRST1]
16959         EXCH U,(P)
16960         MOVSI T,%TBNOT+%TBDTY
16961         MOVEM T,TTYTBL(U)
16962         MOVE J,U
16963         EXCH U,(P)
16964         PUSHJ P,MPLDJ
16965         XCTR XW,[CLEARM 0]
16966         MOVEI T,1
16967         XCTR XBRW,[BLT T,1777]
16968         PUSHJ P,MPLDZ
16969         EXCH U,(P)
16970         PUSHJ P,LOGUSE
16971         CONO PI,CLKOFF
16972         PUSHJ P,USRST2
16973         CONO PI,CLKON
16974         PUSHJ P,USRST4  ;SHOULD SKIP
16975          BUG
16976         POP P,A
16977         EXCH U,A
16978         MOVE TT,A
16979 USRST5: MOVE A,TTSTSV(U)        ;INITIALIZE SAVED TTYSET OF NEW JOB EQUAL TO CREATOR'S.
16980         SKIPL B,TTYTBL(U)       ;NOTE THAT THE WHEREABOUTS OF THE CREATOR'S TTYSET
16981          MOVE A,TTYST1(B)       ;DEPENDS ON WHETHER HE HAS THE TTY NOW.
16982         MOVEM A,TTSTSV(TT)
16983         MOVE A,TTSTSV+1(U)
16984         SKIPL B
16985          MOVE A,TTYST2(B)
16986         MOVEM A,TTSTSV+1(TT)
16987         MOVEI A,(TT)            ;RH OF NEW JOB'S SAVED TTYSTS IS HIS INDEX.
16988         HRLI A,%TSCNS           ;NOW CONSTRUCT THE LH.
16989         MOVE B,UTMPTR(TT)       ;TO DO THAT, FIND THE TREE'S TTY NUMBER
16990         MOVE B,TTYOPT-USRRCE(B) ;TO FIND THE TTY'S TTYOPT WORD,
16991         TLNE B,%TOROL           ;WHICH TELLS HOW TO INIT THE BITS IN THE TTYSTS.
16992          TLO A,%TSROL
16993         TLNN B,%TOMOR
16994          TLO A,%TSMOR
16995         TLNE B,%TOSA1
16996          TLO A,%TSSAI
16997         MOVEM A,TTSTSV+2(TT)
16998         POPJ P,
16999 \f
17000 ;.CALL USRMEM
17001 ; ARG 1   JOB WHOSE MEMORY SHOULD BE READ OR WRITTEN
17002 ; ARG 2   ADDRESS TO READ OR WRITE
17003 ; ARGS 3,4  LIKE USRVAR, TTYVAR
17004 ; VAL 1   PREVIOUS CONTENTS OF LOCATION
17005 ; VAL 2   NEW CONTENTS OF LOCATION (SAME AS PREVIOUS IF NOT WRITING).
17006 ;         (NOT VALID IN BLOCK MODE)
17007
17008 ; BIT 1.1  IF SET, THEN IF PAGE ISN'T READABLE OR WRITEABLE, GIVE AN MPV
17009 ;               OR PURE INTERRUPT TO THE JOB BEING REFERENCED.
17010 ; BIT 2.9  IF SET, ALLOWS US TO WRITE IN ANY JOB.
17011
17012 NUSRMEM:
17013         MOVE J,A
17014         JSP T,NCORUI
17015          JRST NUSRM1            ;WE CAN SURELY WRITE.
17016         MOVE H,CTLBTS(U)
17017         CAIGE W,3               ;ELSE, IF WE WANT TO WRITE,
17018          TRNE H,1               ;OR WANT TO GIVE THE REFERENCED JOB INTERRUPTS,
17019           TRNE H,400000         ;THEN UNLESS WE ARE FORCING IT,
17020            JRST NUSRM1
17021         JSP T,NCORWR            ;SEE IF IT IS A JOB WE ARE ALLOWED TO WRITE IN.
17022          JRST OPNL31
17023 NUSRM1: MOVE H,CTLBTS(U)
17024         CAIE J,-1
17025          CAIG J,LUBLK           ;CAN'T GIVE SYS OR CORE JOBS INTERRUPTS, OR PDP6.
17026           TRNN H,1
17027            CAIA
17028             JRST OPNL31
17029 IFN PDP6P,[
17030         CAIN J,-1
17031          JRST NUSRMS
17032 ];PDP6P
17033         CAILE J,LUBLK
17034          CAMN J,U
17035           JRST NUSRMS
17036         MOVE A,J                ;IF TARGET JOB ISN'T SELF OR PDP6
17037         PUSHJ P,RPCLSR          ; OR SYS OR CORE, STOP IT.
17038         PUSHJ P,SOSSET
17039             USTP(J)
17040 NUSRMS: PUSHJ P,NUSRM2          ;DO THE WORK
17041          POPJ P,                ;LOST, OPNL HAS LSWCLR'ED
17042         JRST LSWCJ1             ;POSSIBLY UNLOCK USTP, DIELOK AND TAKE SUCCESS RETURN
17043
17044 NUSRM2: PUSHJ P,VARCAL          ;E:=ADDR, D:=DATA, W:=INSTRUCTION
17045         HRRZS E
17046         CAIGE E,20
17047          JRST NUSRM6            ;ACS ALWAYS SWAPPED-IN AND ACCESSIBLE
17048         PUSH P,U
17049         MOVE U,J
17050         LDB A,[121000,,E]       ;GET PAGE # IN A AND REF'D JOB IN U.
17051 IFE PDP6P, PUSHJ P,UPLC
17052 IFN PDP6P,[
17053         PUSHJ P,[ CAIE J,-1     ;SKIP IF PDP6
17054                    JRST UPLC    ;DECODE THEM FOR ORDINARY JOB.
17055                   CAIL A,LPDP6M
17056                    TDZA T,T     ;FOR PDP6, MOST PAGES DON'T EXIST,
17057                     MOVE T,[002200,,[600000]]   ;AND THE REST ARE WRITABLE.
17058                   POPJ P,]
17059 ];PDP6P
17060         POP P,U
17061         LDB A,T                 ;GET PAGE ACCESS HALFWORD.
17062         TRNN A,600000           ;IF PAGE SWAPPED OUT, PUT ACCESS BITS IN PLACE THEY WOULD BE
17063          LSH A,16.              ; FOR AN IN-CORE PAGE.
17064         JUMPE A,NUSRM9          ;LOSE IF NO PAGE THERE
17065         TRNN A,400000           ;OR IF WE ARE TRYING TO WRITE THE WORD AND PAGE IS READ-ONLY.
17066          JUMPN W,NUSRM8
17067 NUSRM6: PUSHJ P,MPLDJ           ;NOW LOAD MAP OF JOB IN J
17068         HRLI E,(SKIP)           ;GET ACCESS TO DATA WORD, SWAP IN PAGE
17069         SKIPE W
17070          HRLI E,(MOVES)
17071 NUSRM4: CONO PI,CLKOFF          ;CLK OFF SO ONCE IN CAN'T SWAP OUT AGAIN
17072         XCTRI XRW,E             ;NOT GETTING BENEFIT OF USUAL PCLSR BEFORE
17073          JRST NUSRM5            ;SWAP OUT FEATURE SINCE IT'S ANOTHER JOB
17074         PUSHJ P,TPFLT
17075         JRST NUSRM4
17076
17077 NUSRM5: UMOVE B,(E)             ;NOW THAT PAGE IS IN, GET OLD CONTENTS
17078         MOVE A,B                ;IN A AND B
17079         JUMPE W,NUSRM3
17080         HRRI W,B                ;IF WRITING,
17081         XCT W                   ;EXECUTE USER'S INSN., MODIFYING 2ND VALUE IN B,
17082         TRNN J,-1               ;SYSTEM JOB?
17083          JRST OPNL31            ;******* WRITING SYS, TURN INTO .SETLOC *******
17084         UMOVEM B,(E)            ;AND STORE IT BACK INTO REF'D JOB.
17085 NUSRM3: PUSHJ P,MPLDZ           ;RESTORE NORMAL PAGE MAP, TURN CLKON.
17086         JRST POPJ1              ;SUCCESS
17087
17088 NUSRM8: SKIPA T,[%PIWRO]        ;HERE IF TRYING TO WRITE IN READ ONLY PAGE.
17089 NUSRM9:  MOVEI T,%PIMPV         ;HERE IF ACCESSING NONEXISTENT PAGE.
17090         TRNN H,1                ;SKIP IF TO GIVE INTERRUPT
17091          JRST OPNL32
17092         CAMN J,USER
17093          JRST UUOERR            ;INTERRUPT TO SELF
17094         IORM T,PIRQC(J)         ;INTERRUPT OTHER USER
17095         JRST OPNL32             ;CAN'T GET THAT ACCESS TO PAGE.
17096 \f
17097 ;COMMENTS BELOW APPLY TO UBI IN MANY CASES.  FOR UBO, TRANSFER GOES THE
17098 ;OTHER DIRECTION
17099
17100 UBO:    MOVNI I,1
17101         JRST UBIL
17102
17103 UBI:    MOVEI I,0       ;SIGNAL UBI
17104
17105 UBIL:   JUMPL C,UBIA
17106         XCTR XRW,[MOVES TT,(C)] ;MAKE SURE WRITE CYCLES WILL WIN
17107 UBIB:   TRNE A,200000   ;SKIP UNLESS 6
17108          MOVNI A,1      ;SO CAILE BELOW WILL SKIP OVER SUSTPR AMONG OTHER REASONS
17109         CAILE A,LUBLK   ;SKIP ON SYS JOB, CORE JOB, PDP6 OR JOB ALREADY STOPPED
17110          PUSHJ P,SUSTPR ;RANDOM JOB STOP
17111         JUMPGE TT,UBI4  ;THRU
17112         TLO A,400000    ;INDICATE ALREADY STOPPED SO WONT TRY IT AGAIN
17113         HLRO B,TT
17114         MOVNS B         ;COUNT TO BE XFERRED
17115         HRLZ E,IOCHST-IOCHNM(R) ;EXAMINED USER ADDRESS
17116         HRR E,TT        ;FROM,,TO (INFERIOR ADR,,SUPERIOR ADR)
17117         HLRZ Q,E
17118         TLNE A,200000
17119          JRST UBI5A     ;PDP6
17120 UBI5:   CAIGE Q,20      ;INF ADR IN Q
17121          JRST UBI3      ;READ AC
17122         HRRZ J,A        ;SET UP UMAPS WORD
17123         TRZE E,400000
17124          TLOA J,%UMMPL  ;TO HI PG, HACK OUR LOW PG
17125           TLO J,%UMMPU  ;TO LOW PG, HACK OUR HI PG
17126         TLZE E,400000
17127          TLOA J,%UMLTU  ;TO POINT TO HIS UPPER
17128           TLO J,%UMUTL  ;TO POINT TO HIS LOWER
17129         TLNN J,%UMMPU+%UMUTL    ;MAPPING HIS UPPER WITH OUR LOWER?
17130          JRST UBI3A     ;YES MAKE SURE NOT SCREWED BY AC PNTR
17131 UBI3B:  PUSHJ P,MPLD1
17132         TRZ Q,400000
17133         MOVNS Q         ;LIMIT SIZE OF XFER TO MIN OF DESIRED
17134         ADDI Q,400000   ;DIST OF TO ADR FROM SEG BOUNDARY
17135         CAMLE B,Q
17136          HRRZ B,Q
17137         MOVNI Q,(E)     ;AND DIST OF FROM ADR FROM SEQ BOUNDARY
17138         ADDI Q,400000
17139         CAMLE B,Q
17140          HRRZ B,Q
17141         TLNN J,%UMMPL   ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
17142          TLOA E,400000  ;SET FROM ADR TO HI PG
17143           TRO E,400000  ;SET TO ADR TO HI PG
17144         SKIPE I         ;SKIP ON UBI
17145          MOVSS E                ;UBO, XFERR OTHER DIRECTION
17146         MOVE Q,E        ;SAVE COPY OF BLT PNTR
17147         ADDI B,(E)      ;GET LA +1
17148 UBI3H:  XCTRI XBRW,[BLT E,-1(B)]        ;XFERR DATA
17149 UBI3K:   MOVEI E,(B)    ;NO FAULT, SIMULATE STORE BACK OF BLT PNTR AFTER COMP OF BLT (RH ANYWAY)
17150 UBI3L:  PUSH P,J
17151         PUSHJ P,MPLDZ   ;RETURN TO NORMAL MAP TO STORE BACK USER PNTR
17152         POP P,J         ;SAVE PREV MAP FOR EVENTUAL USE
17153         SUBM E,Q        ;FIGURE OUT HOW MANY WDS ACTUALLY XFERRED
17154         HRRZS Q
17155 UBI3E:  HRLS Q          ;# WDS TRANSFERRED,,SAME
17156         JUMPL C,UBIC    ;UPDATE USER PNTR
17157         XCTRI XRW,[ADDM Q,(C)]
17158          JRST .+2
17159           BUG           ;SHOULD HAVE ALREADY CHECKED THIS
17160 UBID:   ADD Q,IOCHST-IOCHNM(R)  ;UPDATE INFERIOR PNTR
17161         HRRM Q,IOCHST-IOCHNM(R) ;WRAPPING AROUND IF PASS 1,,0
17162         TLZ B,-1
17163         CAIN B,(E)      ;WAS THERE A FAULT?
17164          JRST UBIL      ;NO, LOOP
17165         PUSHJ P,UBI4    ;UNSTOP THE JOB.
17166         PUSHJ P,MPLD1   ;RESTORE TO FROB AT TIME OF FAULT
17167 UBI3C:  PUSHJ P,TPFLT
17168         PUSHJ P,MPLDZ
17169         JRST UBIL
17170 \f
17171 UBI4:   TLNN A,200000   ;SKIP ON REALLY PDP6
17172          TLZ A,400000   ;FLUSH RANDOM BIT SO COMPARE WILL WORK
17173         CAILE A,LUBLK
17174          JRST UPCLSR
17175         POPJ P,
17176
17177 UBMCK1: PUSHJ P,UBI4
17178         JRST IOADC
17179
17180 UBIA:   TRNE C,777760
17181          BUG
17182         MOVE TT,(C)
17183         JRST UBIB
17184
17185 UBIC:   TRNE C,777760
17186          BUG
17187         ADDM Q,(C)
17188         JRST UBID
17189
17190 UBI5A:  CAIL Q,400000
17191          JRST UBMCK1
17192         JRST UBI5
17193
17194 UWO:    SKIPGE C
17195          SKIPA D,(C)
17196           UMOVE D,(C)
17197         TDZA I,I
17198 UWI:     SETO I,        ;0 FOR OUTPUT, -1 FOR INPUT.
17199         TRNE A,200000
17200          MOVNI A,1      ;-1 MEANS PDP6.
17201         CAMN A,USER
17202          HRLI A,-1      ;DON'T STOP SELF
17203         CAIG A,LUBLK
17204          JRST UWI1      ;SYS, CORE, SELF, OR PDP6
17205         PUSHJ P,SUSTPR
17206         PUSHJ P,SOSSET  ;MIGHT TAKE PAGE FAULT AND GET PCLSRED
17207             USTP(A)
17208 UWI1:   HRRZ E,IOCHST-IOCHNM(R)
17209         HRRZ J,A
17210         PUSHJ P,MPLDJ   ;MAP JOB BEING IOT'ED FROM.
17211         XCTR XRW,[      MOVE W,(E)
17212                         MOVEM D,(E)]+1(I)
17213         AOS IOCHST-IOCHNM(R)    ;ADVANCE ACCESS POINTER
17214         CAILE A,LUBLK
17215          PUSHJ P,LSWPOP
17216         JRST MPLDZ
17217 \f
17218 UBI3A:  TLNE E,777760   ;SKIP ON XFERRING FROM AC AREA, HI TO HI
17219          JRST UBI3B     ;NO OK
17220         JUMPN I,UBO3A   ;UBO
17221         PUSHJ P,MPLDJ
17222         XCTRI XR,[MOVE B,(Q)]   ;PICK UP WD
17223          JRST .+2       ;OK
17224           JRST UBI3C    ;TAKE FAULT
17225         PUSHJ P,MPLDZ   ;BACK TO NORMAL MAP
17226         HRRZ E,TT       ;TO ADR
17227         JRST UBI3D
17228
17229 ;USR DEV IOT STOP ROUTINE
17230 USUSTP: SOS USTP(A)
17231 SUSTPR: MOVSI T,BCSTOP+BUCSTP
17232         TDNE T,USTP(A)  ;WAIT TILL NOT BEING SHUFFLED
17233          PUSHJ P,UFLS
17234         PUSHJ P,RPCLSR  ;AOS'ES USTP
17235         MOVSI T,BCSTOP+BUCSTP
17236         TDNE T,USTP(A)
17237          JRST USUSTP
17238         POPJ P,
17239
17240 UBI3:   ADDI Q,AC0S(A)
17241         JUMPN I,UBO3    ;UBO
17242         TLNE A,200000
17243          TDZA B,B       ;READ PDP6 AC
17244           MOVE B,(Q)    ;READ NORMAL AC
17245 UBI3D:  XCTRI XW,[MOVEM B,(E)]
17246          JRST .+2
17247           JRST UBI3C    ;TAKE FAULT
17248 UBI3G:  MOVEI Q,1       ;1 WD XFERRED
17249         HRRZ B,E        ;FAKE OUT FAULT TEST
17250         JRST UBI3E
17251
17252 UBO3:   TLNE A,200000
17253          JRST UBI3G     ;TRYING TO WRITE PDP6 AC IGNORE
17254         XCTRI XR,[MOVE B,(E)]
17255          JRST .+2
17256           JRST UBI3C
17257         MOVEM B,(Q)
17258         JRST UBI3G
17259
17260
17261 UBO3A:  XCTRI XR,[MOVE B,(TT)]
17262          JRST .+2
17263           JRST UBI3C    ;TAKE FAULT
17264         PUSHJ P,MPLDJ   ;MAP HIM.
17265         XCTRI XW,[MOVEM B,(Q)]
17266          JRST .+2
17267           JRST UBI3C
17268         PUSHJ P,MPLDZ   ;BACK TO NORMAL
17269         JRST UBI3G
17270 \f
17271 SUBTTL CORE LINK DEVICE
17272
17273 EBLK
17274 CLVBEG: NCLCH
17275 CLSYN:  BLOCK NCLCH     ;SYSTEM NAME ;0=>VARIABLES FREE
17276 CLN1:   BLOCK NCLCH     ;FN1
17277 CLN2:   BLOCK NCLCH     ;FN2
17278 CLUSR:  REPEAT NCLCH,-1 ;LH=WRITING USER ;RH=READING USER ;-1=>NOT OPEN THAT HALF
17279 CLRAC:  BLOCK NCLCH     ;4.9=LOCKED BY CORE ALLOCATOR
17280                         ;4.8=VERY SLOW CLOCK ROUTINE CONSIDERING FLUSHING THIS BUFFER
17281  %CAFLS==100000         ;4.7=INPUT CLOSED, TURN OUTPUT INTO NUL DEVICE
17282  %CA==1,,500000         ;RH=UT BUFFER NUMBER (IOBFT ADR)
17283
17284 CLOSW:  -1      ;USER LOCK TO STOP MORE THAN ONE PERSON FROM SIMULTANEOUSLY MODIFYING
17285         0       ;THE CORE LINK VARIABLES
17286 CLVEND==.-1
17287 BBLK
17288
17289 ;FORMAT OF CORE LINK 200 WORD BUFFER
17290 ;
17291 CLBVSP==8
17292 CLBCHS==100.
17293 CLBEOF==<CLBCHS+4>/5
17294 IFG CLBVSP+CLBCHS+CLBEOF-128.,.ERR CLBXXX LOSSAGE
17295
17296 ;
17297 ;0:   CHARACTER COUNT
17298 ;1&2: READ AND WRITE CHARACTER OR WORD POINTERS
17299 ;3&4: READ AND WRITE EOF POINTERS
17300 ;CLBVSP TO CLBVSP+CLBCHS-1: CHARACTERS OR WORDS
17301 ;CLBVSP+CLBCHS UP: EOF BITS STORED AS SEVEN FIVE BIT BYTES PER WORD,
17302 ;               EACH BIT CORRESPONDING TO A CHARACTER POSITION.
17303
17304 CLAO:   SKIPA J,[2]     ;CLA .OPEN (TO ANSWER A CLI INTERRUPT)
17305 CLIO:    MOVNI J,1      ;CLI .OPEN (INTERRUPTS USER SPECIFIED BY FILE NAME)
17306         JRST CLI2
17307
17308 CLUO:   TDZA J,J        ;CLU .OPEN
17309 CLOO:    MOVEI J,1      ;CLO .OPEN
17310 CLI2:   JUMPL C,CLFDEL  ;JUMP IF AN .FDELE
17311         PUSHJ P,FLDRCK
17312          JRST CLO1      ;NOT FILE DIRECTORY
17313         MOVEI J,2
17314         JRST LISTF7
17315 \f
17316 CLFDEL: MOVEI J,3
17317 CLO1:   PUSHJ P,SWTL    ;SEIZE SWITCH TO STOP VARIABLES FROM CHANGING UNDER YOU
17318             CLOSW
17319         LDB H,[220100,,C]       ;DIRECTION BIT
17320         JUMPL J,CLOO5
17321 CLOO5B: MOVE Q,USYSN1(U)        ;PICK UP SNAME
17322         MOVSI I,-NCLCH
17323         CAIN J,2        ;SKIP UNLESS CLA
17324          JRST CLO1A     ;JUMP IF CLA .OPEN
17325         CAIGE J,0
17326 CLO1A1:  MOVE Q,[SIXBIT/_CLI_/]
17327 CLOL:   CAMN Q,CLSYN(I) ;LOOK FOR SNAME, FN1, & FN2
17328          CAME A,CLN1(I)
17329           JRST CLOO1
17330         CAME B,CLN2(I)
17331          JRST CLOO1
17332         JUMPL J,OPNL23  ;"FILE LOCKED" IF ALREADY EXISTS, FOR CLI:.
17333         CAIN J,3        ;SKIP UNLESS DELETE
17334          JRST CLO1D     ;FOUND FILE TO DELETE
17335 CLO1A6: LDB TT,CLOOT1(H)
17336         CAIE TT,-1
17337          JRST OPNL23    ;ALREADY OPEN THIS DIRECTION (FILE LOCKED)
17338         HRRZ TT,CLRAC(I)
17339         LDB Q,[IOSA,,IOBFT(TT)]
17340         LSH Q,6
17341 CLOX:   DPB U,CLOOT1(H) ;STORE USER INDEX
17342         MOVSI TT,200000
17343         ANDCAM TT,CLRAC(I)      ;CLEAR VERY SLOW CLOCK BIT
17344         PUSHJ P,LSWPOP  ;RELEASE SWITCH
17345         HRL A,I
17346         LDB C,[220300,,C]
17347         SKIPGE J
17348          PUSHJ P,CLOX1  ;FOR CLI:, PUT OUR UNAME AND JNAME INTO BUFFER.
17349         MOVEI TT,44     ;WORD
17350         TRNN C,6
17351          MOVEI TT,7     ;UNIT ASCII
17352         ADD Q,H         ;OFFSET FOR DIRECTION
17353         DPB TT,[300600,,1(Q)]   ;SET UP ITEM POINTER
17354         MOVEI TT,5      ;WORD
17355         TRNN C,6
17356          MOVEI TT,1     ;UNIT ASCII
17357         DPB TT,[300600,,3(Q)]   ;SETUP EOF POINTER
17358         JSP Q,OPSLC7    ;SET UP IOCHNM OF USER
17359          DCLUAI,,DCLUAO ;UNIT ASCII INPUT ;UNIT ASCII OUTPUT
17360          DCLBI,,DCLBO   ;BLOCK INPUT ;BLOCK OUTPUT
17361          DCLUBI,,DCLUBO ;UNIT BINARY INPUT ;UNIT BINARY OUTPUT
17362          DCLBI,,DCLBO
17363
17364 CLOX1:  MOVEI TT,44     ;CHANGE OUTPUT BYTE SIZE TO 36.
17365         DPB TT,[300600,,2(Q)]
17366         MOVEI TT,5      ;WHICH INVOLVES STORING 5 CHARACTERS OF EOF BITS AT ONCE.
17367         DPB TT,[300600,,4(Q)]
17368         PUSH P,C
17369         HRROI C,TT
17370         MOVE TT,UNAME(U)
17371         PUSHJ P,CLOXO   ;NOW WE CAN IOT WORDS OUT, EVEN IF CHANNEL IS ASCII MODE.
17372         SUBI Q,1
17373         MOVE TT,JNAME(U)
17374         PUSHJ P,CLOXO
17375         SOJA Q,POPCJ    ;NOW RETURN, AND SET UP THE CORRECT BYTE SIZES.
17376 \f
17377 CLOO1:  AOBJN I,CLOL    ;LOOP FOR ALL SETS OF CORE LINK VARIABLES
17378         CAIE J,1
17379          JUMPGE J,OPNL4 ;CLA, CLU DELETE LOSE
17380         MOVSI I,-NCLCH
17381 CLOO3:  SKIPN CLSYN(I)  ;LOOK FOR FREE VARIABLES TO CREATE FILE
17382          JRST CLOO2
17383         AOBJN I,CLOO3
17384         JRST OPNL5      ;GIVE DIREC FULL ERROR
17385
17386 CLOOT1: 2200,,CLUSR(I)  ;READING
17387         222200,,CLUSR(I) ;WRITING
17388
17389 CLOO2:  MOVEM A,CLN1(I) ;SET UP VARIABLES
17390         MOVEM B,CLN2(I)
17391         MOVEI D,SCNCLO(I)       ;SYS CHNL NO
17392         PUSHJ P,TCALL   ;GET 200 WORD BUFFER
17393             JRST IUTCONS
17394          JRST CLOO4     ;NO MEM AVAIL
17395         MOVEM Q,CLSYN(I)        ;DONT SET UP SYS UNTIL MEM AVAIL
17396         HRRM A,CLRAC(I)
17397         LDB Q,[IOSA,,IOBFT(A)]  ;SET UP BUFFER
17398         LSH Q,6
17399         SETZM (Q)       ;CHAR COUNT
17400         MOVE TT,Q
17401         ADDI TT,CLBVSP  ;SET UP BUF POINTERS
17402         MOVEM TT,1(Q)
17403         MOVEM TT,2(Q)
17404         HRLI TT,440000
17405         ADDI TT,CLBCHS  ;SET UP EOF POINTERS
17406         MOVEM TT,3(Q)
17407         MOVEM TT,4(Q)
17408         JRST CLOX
17409
17410 ;NO MEMORY AVAILABLE FOR 200-WD BUFFERS
17411 CLOO4:  AOS SWPOPR      ;MAYBE SWAPPING SOMETHING OUT WILL HELP
17412         PUSHJ P,LSWPOP  ;UNLOCK CLOSW
17413         PUSHJ P,UDELAY  ;WAIT A WHILE
17414         JRST CLO1       ;TRY AGAIN
17415 \f
17416 CLOO5:  CONO PI,CLKOFF  ;TURN OFF CLOCK TO STOP U&J NAMES FROM CHANGING
17417         MOVEI Q,2*LUBLK
17418 CLOO5A: CAMN A,UNAME(Q) ;LOOK FOR USER WHOSE NAMES MATCH THE SPECIFIED FILE NAMES
17419         CAME B,JNAME(Q)
17420          JRST CLOO6
17421         MOVEI T,%PICLI  ;IF GET TO HERE, HAVE FOUND USER WITH RIGHT NAMES
17422         TDNN T,MSKST(Q) ;SKIP IF HE HAS CLI INT DISABLED
17423          JRST OPNL11
17424         IORM T,PIRQC(Q) ;GIVE USER INT
17425         CONO PI,CLKON
17426         JRST CLOO5B
17427
17428 CLOO6:  ADDI Q,LUBLK    ;GO TO NEXT USER SLOT
17429         CAMGE Q,USRHI   ;SKIP IF ALL EXAMINED
17430          JRST CLOO5A
17431         JRST OPNL11
17432
17433 CLO1D:  MOVE T,CLUSR(I)
17434         AOJN T,OPNL23   ;FILE LOCKED
17435         AOS (P)
17436         MOVE A,I
17437         PUSHJ P,CLIOTB  ;NO TIMING ERROR SINCE CORE JOB WILL PCLSR USR ON
17438         SKIPN B,SRN3(U) ;CORE LINK BEFORE MOVING BUFFER
17439          JRST CLO1D2
17440         MOVEM B,CLN1(A)
17441         MOVE B,SRN4(U)
17442         MOVEM B,CLN2(A)
17443         JRST LSWPOP     ;CLOSW
17444
17445 CLO1A:  MOVE A,UNAME(U)
17446         MOVE B,JNAME(U)
17447         JRST CLO1A1
17448 \f
17449 ;CORE LINK .IOT SET UP ROUTINE
17450
17451 CLIOTB: SKIPGE CLRAC(A) ;WAIT IF BUFFER LOCKED BY CORE ALLOCATOR
17452          PUSHJ P,UFLS   ;(DO NOT CHANGE ABOVE TO "SKIPGE TT,CLRAC(A)")
17453         HRRZ TT,CLRAC(A)
17454         LDB Q,[IOSA,,IOBFT(TT)] ;GET POINTER TO BUFFER
17455         LSH Q,6
17456         POPJ P,
17457
17458
17459 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII INPUT
17460
17461 CLUAI:  PUSHJ P,CLIOTB  ;SETUP
17462         MOVSI T,%CAFLS
17463         TDNE T,CLRAC(A)
17464          PUSHJ P,UFLS
17465         SKIPN (Q)       ;WAIT TILL CHAR COUNT NON-ZERO
17466          PUSHJ P,UFLS
17467 CLUAI1: MOVE J,3(Q)
17468         ILDB I,J        ;GET EOF BIT
17469         JUMPN I,UNIEOF
17470 CLUAIE: ILDB W,1(Q)     ;GET CHARACTER
17471         SOS (Q)         ;DECREMENT BUF COUNT
17472 CLFAXP: LDB TT,[700,,1(Q)]      ;FIX UP POINTERS
17473         CAIN TT,CLBVSP+CLBCHS-1
17474          PUSHJ P,CLFAX2 ;MAYBE TIME TO RING BUFFER
17475         HLRZ TT,J       ;GET BYTE POSITION AND SIZE
17476         CAIN TT,010100  ;IF TO END OF 35-BIT WORD, ADVANCE
17477          IBP J          ;TO NEXT WORD (5-BIT BYTES 1 BIT AT A TIME)
17478         MOVEM J,3(Q)
17479         POPJ P,
17480
17481 UNIEOF: HRROI W,EOFCH
17482         JRST POPJ1
17483
17484 CLFAX2: LDB TT,[370500,,1(Q)]   ;PICK UP TOP 5 BITS OF BYTE POSITION
17485         JUMPN TT,CPOPJ  ;NOT QUITE YET
17486 CLFBX2: MOVEI TT,CLBVSP ;J HAS NEW EOF PNTR
17487         DPB TT,[700,,1(Q)]      ;RING CHAR POINTER
17488         MOVEM J,3(Q)
17489         MOVEI J,44
17490         DPB J,[360600,,1(Q)]
17491         MOVEI TT,CLBVSP+CLBCHS
17492         DPB TT,[700,,3(Q)]      ;RING EOF POINTER
17493         DPB J,[360600,,3(Q)]
17494         MOVE J,3(Q)
17495         POPJ P,
17496 \f
17497 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII OUTPUT
17498
17499 CLUAO:  MOVE T,CLRAC(A)
17500         TLNE T,%CAFLS
17501          POPJ P,
17502         PUSHJ P,CLIOTB  ;SETUP
17503         MOVEI T,CLBCHS*5-11.
17504         CAMGE T,(Q)     ;WAIT TILL THERE IS SPACE IN BUF
17505          PUSHJ P,UFLS
17506         MOVE J,4(Q)
17507         SKIPGE C
17508          SKIPA B,(C)    ;GET CHAR FROM EXEC
17509           UMOVE B,(C)   ;GET CHAR FROM USER
17510         MOVEI TT,0
17511         IDPB TT,J       ;INDICATE NOT AN EOF
17512         IDPB B,2(Q)     ;STORE IN BUF
17513         MOVEI TT,1      ;GET MASK FOR LOW ORDER BIT
17514         ANDCAM TT,@2(Q) ;FLUSH IN CURRENT WORD
17515 CLCWU2: AOS (Q)         ;INCREMENT BUF COUNT
17516         MOVEI I,0       ;FAKE OUT EOF TEST
17517         AOJA Q,CLFAXP   ;FAKE OUT CLFAXP AND FIX UP POINTERS
17518
17519
17520 CLBI:   JSP W,WRDBTI    ;BLOCK INPUT.
17521
17522 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY INPUT
17523
17524 CLUBI:  PUSHJ P,CLIOTB  ;SETUP
17525         MOVSI T,%CAFLS
17526         TDNE T,CLRAC(A)
17527          PUSHJ P,UFLS
17528         MOVEI T,5
17529         CAMLE T,(Q)     ;WAIT TILL A WORD IS AVAILABLE
17530          PUSHJ P,UFLS
17531 CLUBI1: MOVE J,3(Q)
17532         ILDB I,J        ;GET EOF BITS
17533         JUMPN I,CLUBIF  ;JUMP ON EOF
17534 CLUBIE: ILDB W,1(Q)     ;GET WORD
17535 CLCRB2: MOVNI T,5
17536         ADDB T,(Q)      ;DECREMENT COUNT
17537         JUMPGE T,CLFBXP
17538         SETZM (Q)       ;CAME FROM CLCLRL WITH PARTIAL WORD IN BUFFER
17539 CLFBXP: JRST CLFAXP
17540
17541 CLUBIF: TROE I,20       ;SKIP IF EOF NOT ON FIRST CHAR OF WORD
17542          JRST POPJ1
17543         DPB I,J         ;SET EOF ON FIRST CHAR
17544         MOVE J,1(Q)
17545         ILDB W,J        ;PICK UP WORD WITH EOF IN MIDDLE
17546         POPJ P,
17547 \f
17548 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY OUTPUT
17549
17550 CLUBO:  MOVE T,CLRAC(A)
17551         TLNE T,%CAFLS
17552          POPJ P,
17553         PUSHJ P,CLIOTB  ;SETUP
17554 ;CLI: OPEN CALLS HERE TO OUTPUT UNAME AND JNAME.
17555 CLOXO:  MOVEI T,CLBCHS*5-11.
17556         CAMGE T,(Q)     ;WAIT TILL THERE IS SPACE FOR A WORD
17557          PUSHJ P,UFLS
17558         MOVE J,4(Q)
17559         SKIPGE C
17560          SKIPA B,(C)    ;GET WORD FROM EXEC
17561           UMOVE B,(C)   ;GET WORD FROM USER
17562         MOVEI TT,0
17563         IDPB TT,J       ;INDICATE NOT AN EOF
17564         IDPB B,2(Q)     ;STORE IN BUF
17565 CLCWB2: MOVEI TT,5
17566         ADDM TT,(Q)     ;INCREMENT COUNT
17567         AOJA Q,CLFAXP   ;FAKE OUT CLFBXP AND FIX UP POINTERS
17568
17569
17570 ;CORE LINK .IOT ROUTINE FOR BLOCK OUTPUT
17571
17572 CLBO:   MOVE I,C        ;SAVE A POINTER TO USERS BLKO POINTER
17573         XCTR XR,[SKIPL H,(I)]   ;PICKUP BLKO POINTER
17574          POPJ P,
17575         SKIPA E,H       ;SECOND COPY, ALSO FLAG TO CLBIN
17576 CLBI2:   UMOVEM E,(I)   ;TO INFORM USER & IN CASE YOU ARE PCLSR'ED
17577         HRRZ C,E
17578         PUSHJ P,CLUBO   ;TRANSFER ONE WORD
17579         AOBJN E,CLBI2   ;TRY FOR NEXT
17580 CLBI3:  UMOVEM E,(I)    ;COUNT EXHAUSTED OR EOF
17581         POPJ P,
17582 \f
17583 ;CORE LINK .CLOSE ROUTINE FOR BINARY OR BLOCK OUTPUT
17584
17585 CLCLWB: PUSHJ P,CLCWC   ;STORE EOF BITS FOR WORD
17586          JRST CLCWU6    ;NO ROOM SO LAST MUST HAVE BEEN EOF HACK SO FLUSH
17587         IBP 2(Q)        ;KEEP WORD POINTER IN STEP
17588         PUSHJ P,CLCWB2  ;FIX UP COUNT AND POINTERS
17589 CLCWU6: MOVNI B,1
17590         DPB B,[222200,,CLUSR(A)]        ;OBLITERATE USER INDEX
17591         MOVSI B,%CAFLS
17592         ANDCAM B,CLRAC(A)
17593         JRST LSWPOP     ;RELEASE SWITCH
17594
17595 ;CORE LINK .CLOSE ROUTINE FOR UNIT ASCII OUTPUT
17596
17597 CLCLWU: PUSHJ P,CLCWC   ;STORE EOF BIT FOR CHAR
17598          JRST CLCWU6
17599         MOVEI TT,EOFCH
17600         IDPB TT,2(Q)    ;STORE AN EOF CHAR
17601         PUSHJ P,CLCWU2  ;FIX UP COUNT AND POINTERS
17602         SOS Q           ;CLCWU2 AOJAS
17603         LDB TT,[360600,,2(Q)]
17604         SOJE TT,CLCWU6  ;JUST FILLED A WHOLE WORD => STOP PADDING.
17605         PUSHJ P,LSWPOP  ;ELSE PAD ONCE MORE.
17606         JRST CLCLWU
17607
17608
17609 ;COMMON SUBROUTINE FOR CORE LINK OUTPUT .CLOSE ROUTINES
17610
17611 CLCWC:  PUSHJ P,SWTL    ;LOCK SWITCH (IF SIGN OF CLRAC IS EVER REALLY USED,
17612             CLOSW       ;THIS MIGHT CAUSE A DEADLY EMBRACE).
17613         PUSHJ P,CLIOTB  ;SETUP
17614         MOVEI T,CLBCHS*5-5.
17615         CAMGE T,(Q)     ;WAIT FOR THERE TO BE ROOM
17616          POPJ P,
17617         MOVE J,4(Q)
17618         MOVNI TT,1
17619         IDPB TT,J       ;SET EOF BIT(S)
17620         JRST POPJ1
17621 \f
17622 ;CORE LINK .CLOSE ROUTINE FOR INPUT
17623
17624 CLO1D2: SETZM CLSYN(A)  ;FREE VARIABLES
17625         HRRZS A,CLRAC(A) ;CORE LINK NO LONGER IN USE
17626         PUSHJ P,BRTN    ;RETURN BUFFER TO FREE STATE
17627         JRST LSWPOP
17628
17629 CLISTA: PUSHJ P,CLIOTB  ;CORE LINK INPUT STATUS
17630         SKIPN J,(Q)     ;COUNT
17631          TRO D,1_10.    ;SYS BUF CAP EMPTY
17632         CAIL J,CLBCHS*5-5
17633          TRO D,1_9      ;SYS BUF CAP EMPTY
17634         POPJ P,
17635
17636 CLCLRA: TDZA C,C        ;UNIT ASCII
17637 CLCLRB:  MOVNI C,1      ;IMAGE OR BLOCK (I.E. WORDS)
17638         PUSHJ P,CLIOTB
17639         PUSHJ P,SWTL
17640             CLOSW
17641 ;FLUSH ALL REAL DATA
17642 CLCLRL: SKIPN (Q)       ;SKIP IF BUFFER CONTAINS DATA, READ IT UNTIL EOF
17643          JRST CLCLR1
17644         PUSHJ P,[JUMPE C,CLUAI1 ? JRST CLUBI1]
17645          JRST CLCLRL
17646 CLCLR2: MOVE J,3(Q)     ;FOUND AN EOF, FLUSH THE EOF WORD
17647         ILDB I,J
17648         PUSHJ P,[JUMPE C,CLUAIE ? JRST CLUBIE]
17649         MOVE T,1(Q)
17650         TLNE T,760000
17651          JRST CLCLR2    ;NOT YET TO WORD BOUNDARY
17652         JRST CLCLR3
17653
17654 CLCLR1: MOVSI B,%CAFLS
17655         IORM B,CLRAC(A)
17656         PUSH P,A
17657         PUSH P,Q
17658         HLRZ A,CLUSR(A)
17659         PUSHJ P,NJRPCL
17660         PUSHJ P,NJUPCL
17661         POP P,Q
17662         POP P,A
17663 CLCLR3: HLLOS B,CLUSR(A)        ;NO LONGER OPEN FOR INPUT
17664         SKIPN (Q)               ;IF NO DATA IN BUFFER
17665          AOJE B,CLO1D2          ;AND NOT OPEN FOR OUTPUT, GO FREE THE BUFFER AND VARS
17666         JRST LSWPOP
17667 \f
17668 SUBTTL LOCK DEVICE
17669
17670 NLCKCH==:8                      ; Should be enough.
17671
17672 EBLK
17673
17674 LCKNAM: REPEAT NLCKCH, 0        ; 0 => free lock channel, else contains
17675                                 ; name of lock held by this channel.
17676 LCKUSR: REPEAT NLCKCH, 0        ; Job that holds the lock.  Nothing looks
17677                                 ; at this currently.
17678 LCKSW:  -1 ? 0                  ; Prevent more than one user from trying to
17679                                 ; lock a lock at the same time.
17680 BBLK
17681
17682 ; LCKO is .OPEN routine for LOCK device.  First filename is name of lock to
17683 ; seize.  0 is illegal.  Only opens for output are permitted (some day we
17684 ; might allow multiple opens for input).
17685 ;
17686 ; Bit 1.4 controls what happens if lock is already held:
17687 ;  0 => error: %ENAFL
17688 ;  1 => Hang until you can seize it
17689 LCKO1:  PUSHJ P,LSWPOP          ; We lose this time
17690         TLNN C,10               ; 1.4 => HANG MODE
17691          JRST OPNL23            ; FILE LOCKED
17692         MOVE T,A
17693         CAMN T,LCKNAM(I)        ; Wait for unlock, then try again
17694          PUSHJ P,UFLS
17695 LCKO:   JUMPE A,OPNL11          ; ILLEGAL FILE NAME
17696         PUSHJ P,SWTL            ; One potential locker at a time
17697             LCKSW
17698         MOVSI I,-NLCKCH         ; Check if it is already locked
17699         CAME A,LCKNAM(I)
17700          AOBJN I,.-1
17701         JUMPL I,LCKO1           ; Already held
17702         MOVSI I,-NLCKCH         ; Search for free lock channel
17703         SKIPE LCKNAM(I)
17704          AOBJN I,.-1
17705         JUMPGE I,OPNL6          ; DEVICE FULL
17706         HRRZM U,LCKUSR(I)
17707         MOVEM A,LCKNAM(I)
17708         HRLZI T,(I)
17709         HRRI T,DNLCK
17710         MOVEM T,(R)             ; Set up channel
17711         JRST LSWPJ1             ; And return
17712
17713 ; .CALL RFNAME returns name of lock:
17714 LCKRCH: MOVE B,LCKNAM(A)
17715         POPJ P,
17716
17717 ; .CLOSE releases the lock:
17718 LCKCL:  SETZM LCKNAM(A)
17719         POPJ P,
17720 \f
17721 SUBTTL COMMON I/O ROUTINES
17722
17723 ;STANDARD DEVICE OPEN
17724
17725 STDOP1: MOVEI R,R       ;ENTRY TO NOT CLOBBER IOCHNM
17726 STDOPN: HLRZ A,(Q)      ;LH MASK ON 4.9-3.2 OF LH OPEN WRD
17727         AND D,A ;RH POINTER TO ..USR,..USE PAIR
17728         ROT D,-1        ;FOLLOWING WORDS CONTAIN LIST FOR ALL MASKED STATES
17729         ADDI D,(Q)      ;LH MSKED STATE =0, RH =1, IOTTB ENTRY NUMBERS
17730         HRRZ A,1(D)
17731         SKIPL D
17732         HLRZ A,1(D)
17733         JUMPE A,OPNL12  ;MODE NOT AVAIL
17734         HRRZ E,(Q)
17735         CONO PI,CLKOFF
17736         CAME U,(E)
17737         SKIPGE 1(E)
17738         AOSA 1(E)
17739         JRST OPNL10     ;DEVICE NOT AVAIL
17740         MOVEM U,(E)
17741         HLL A,C
17742         JRST OPNSLT
17743
17744 OPSLD1: ANDI D,1        ;ENTRY TO USE BOTTOM BIT OF AC D
17745 OPSLD3: ANDI D,3        ;ENTRY TO USE BOTTOM TWO BIT OF AC D
17746         MOVE C,D
17747 OPSLC3: ANDI C,3        ;ENTRY TO USE BOTTOM TWO BITS OF AC C
17748 OPSLC7: ANDI C,7        ;ENTRY TO USE BOTTOM THREE BITS OF AC C
17749         ROT C,-1
17750         ADDI C,(Q)
17751         HRR A,(C)
17752         SKIPL C
17753         HLR A,(C)
17754 OPNSLT: MOVEM A,(R)     ;SET USERS IOCHNM
17755         JRST CLKOJ1
17756 \f
17757 ;BLOCK OUTPUT TO CHARACTER DEVICE 
17758 ;ADR OF CHR ROUTINE IN E
17759 ; THAT ROUTINE MUST NOT CLOBBER C, D, E, OR TT
17760 ;C POINTS TO AOBJN POINTER IN USER SPACE
17761 ;MUSTN'T CLOBBER J (TTY OUTPUT ASSUMES).
17762
17763 NBTOCH: XCTR XRW,[MOVES D,(C)]  ;CHECK WRITEABILITY OF AOBJN PTR
17764         LDB TT,[410300,,D]      ;USE HIGH 3 BITS OF USER PNTR AS CHR CNT
17765         CAIGE TT,3
17766          POPJ P,                ;USER TRYING TO XFER >32K FLUSH
17767         SKIPA TT,BTOCHT-3(TT)   ;PICK UP APPROPRIATE BYTE PTR (WORD IN W)
17768 NBTO1:   UMOVEM D,(C)           ;UPDATE USER'S AOBJN PTR
17769         UMOVE W,(D)             ;FETCH CURRENT WORD FROM USER
17770         ILDB A,TT               ;FETCH CURRENT CHARACTER
17771         PUSHJ P,(E)             ;SEND TO DEVICE
17772         ADD D,[700000,,]        ;UPDATE PTR
17773         TLNE D,500000
17774          JRST NBTO1             ;GO TO NEXT CHR
17775         MOVE TT,BTOCHT+4
17776         ADD D,[500001,,1]       ;INCR TO NEXT WORD
17777         JUMPL D,NBTO1
17778         UMOVEM D,(C)    ;COUNTED OUT, UPDATE FINAL TIME & RETURN
17779         POPJ P,
17780
17781 BTOCHT: REPEAT 5,<44-<4-.RPCNT>*7>_14+700,,W
17782
17783 ;BLOCK INPUT FROM CHARACTER DEVICE
17784 ;E AND C SET UP LIKE NBTOCH
17785 ;INTERNALLY LH OF E USED FOR FLAGS:
17786 ; 4.9 EOF FLAG (SIGN)
17787 ; 4.8 => JUST RETURN WITHOUT ERROR IF AT BEGINNING OF WORD,
17788 ;        OTHERWISE IGNORE BIT.
17789 ; 4.7 => RETURN WITHOUT ERROR EVEN IF NOT AT BEGINNING OF WORD.
17790
17791 INBTCH: HRRZS E         ;CLEAR GARBAGE IN LH
17792         XCTR XRW,[MOVES D,(C)] ;SET UP LIKE NBTOCH
17793         LDB TT,[410300,,D]
17794         CAIGE TT,3
17795          POPJ P,
17796         SKIPA TT,BTOCHT-3(TT)
17797 INBTO1:  UMOVEM D,(C)
17798         XCTR XRW,[MOVES (D)] ;CHECK WRITABILITY OF CURRENT WORD
17799         JUMPL E,INBTO2  ;JUMP IF EOF
17800         PUSH P,C
17801         PUSH P,D
17802         PUSH P,TT
17803         PUSH P,R
17804         HLRZ A,(R)
17805         PUSHJ P,(E)     ;RETN CHR IN W
17806          JRST .+3
17807           TLO E,200000
17808         TLO E,400000
17809         MOVE I,W
17810         POP P,R
17811         POP P,TT
17812         POP P,D
17813         POP P,C
17814         LDB W,[410300,,D]
17815         TLNN E,100000
17816          CAIN W,7       ;SKIP IF NOT AT 1ST CHAR.
17817           TLNN E,300000
17818            JRST INBTO3
17819         POPJ P,
17820
17821 INBTO3: UMOVE W,(D)             ;PICK UP CURRENT WORD
17822         IDPB I,TT               ;INSERT CHARACTER
17823         UMOVEM W,(D)            ;PUT WORD BACK
17824         ADD D,[700000,,]
17825         TLNE D,500000
17826          JRST INBTO1            ;DO ANOTHER CHR THIS WORD
17827         MOVE TT,BTOCHT+4
17828         ADD D,[500001,,1]       ;INCR TO NEXT WD
17829         SKIPL E                 ;SKIP IF EOF
17830          JUMPL D,INBTO1
17831         UMOVEM D,(C)            ;DONE, UPDATE POINTER AND RETURN
17832         POPJ P,
17833
17834 INBTO2: MOVEI I,EOFCH           ;EOF, STORE EOF CHARACTER
17835         JRST INBTO3
17836
17837 ;BLOCK IO TO WORD DEVICE
17838 ;C POINTS TO AOBJN POINTER IN USER SPACE
17839 ;Q POINTS TO WORD HANDLING ROUTINE (POINTER WILL BE IN C)
17840 ;MUST NOT CLOBBER Q OR H (PTR ROUTINES DO POPJ2 SOMETIMES)
17841 ;WRDBRT CHECKED FOR ON PDL BY TVC ROUTINES
17842
17843 WRDBT:  MOVE H,C
17844         UMOVE C,(H)             ;FETCH USER'S AOBJN POINTER
17845         JUMPGE C,CPOPJ
17846         JRST WRDBT3
17847
17848 WRDBT2: PUSHJ P,OPBRK
17849 WRDBT3: ANDI C,-1
17850         PUSHJ P,(Q)
17851 WRDBRT:  JRST WRDBT5            ;NO SKIP - WORD XFERRED
17852          SKIPA C,[1,,1]         ;1 SKIP - LAST WORD XFERRED
17853           POPJ P,               ;2 SKIPS - EOF, NO WORD XFERRED
17854         XCTR XRW,[ADDM C,(H)]
17855         POPJ P,
17856
17857 WRDBT5: MOVE C,[1,,1]
17858         XCTR XRW,[ADDB C,(H)]
17859         JUMPL C,WRDBT2
17860         POPJ P,
17861
17862 ;JSP W,WRDBTI TO DO WRDBT FOR A UNIT MODE INPUT ROUTINE SATISFYING NEW
17863 ;CALLING CONVENTION FOR THOSE.
17864 WRDBTI: JSP Q,WRDBT
17865         XCTR XRW,[MOVES (C)]
17866         PUSH P,W
17867         PUSHJ P,(W)
17868          JRST WRDBT4
17869          JRST POPWJ2
17870         AOS -1(P)
17871 WRDBT4: UMOVEM W,(C)
17872         MOVEI Q,WRDBTI+1
17873         POP P,W
17874         POPJ P,
17875 \f
17876 ;CHANGED CONVENTIONS: 
17877  ;1) EOF IS NO LONGER CHECKED FOR CHARACTER BY CHARACTER.
17878  ;   INSTEAD, THE GET-BUFFER ROUTINE SHOULD SET UP THE BYTE COUNT
17879  ;   TO A SMALLER VALUE THAN USUAL.
17880  ;   AN ATTEMPT TO GET ANOTHER BUFFER AFTER REACHING EOF
17881  ;   SHOULD CAUSE THE GET-BUFFER ROUTINE TO SKIP TWICE.
17882  ;2) THE THE BUFFER POINTER IS NOW A B.P. EVEN IN IMAGE MODE.
17883  ;   ALSO, THE L.H. OF THE B.P. IS NOT INITTED HERE.
17884  ;   IT MUST BE SET UP BY THE OPEN ROUTINE. ALSO, ACCESS ROUTINES
17885  ;   FOR DSK MUST KNOW HOW TO SET IT UP.
17886  ;   ALSO, THE BUFFER GET ROUTINE SHOULD SET IT UP,
17887  ;   INSTEAD OF RETURNING THE BUFFER ADDRESS IN TT.
17888  ;3) THE BYTE SIZE THE FILE IS OPEN ON IS PASSED AS AN ARGUMENT.
17889  ;   THIS ROUTINE WORKS FOR ANY CHANNEL BYTE SIZE WITH ANY
17890  ;   SIOT BYTE SIZE.
17891
17892 ;GENERAL BLOCK I/O
17893 ;RH OF E HAS # BYTES/WORD OF FILE BYTE SIZE.  LH OF E HAS B.P. 44NN00.
17894 ;RH(C) = ADDR OF COUNT, IN USER MEMORY
17895 ;RH(TT) = ADDR OF USER'S B.P.
17896 ; ARGUMENTS B ->
17897 ;0(B)   ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
17898 ;1(B)   ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
17899 ;2(B)   ROUTINE TO GET NEXT BUFFER.  NO SKIP IF NO MEMORY
17900 ;        OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
17901 ;        AND BUFFER BYTE POINTER ALREADY SET UP.
17902 ;         2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
17903 ;       WHEN THIS ROUTINE IS CALLED, E CONTAINS THE
17904 ;       NUMBER OF BYTES/WORD (GOOD FOR DETERMINING CHANNEL MODE).
17905 ;3(B)   ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
17906 ;       MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO,
17907 ;       IN WHICH CASE IT SHOULD CONTAIN THE NEW NUMBER OF BYTES.
17908 ;4(B)   NOT USED
17909 ;5(B)   IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
17910 ;       IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
17911
17912 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
17913 ;SIOKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
17914
17915 SIOKT:  PUSH P,E
17916         PUSH P,TT
17917         PUSH P,C
17918         JRST SIOKT1
17919
17920 ;NEXT BUFFER
17921
17922 SIOKNB: PUSHJ P,@3(B)   ;"DISCARD" BUFFER
17923         SKIPE J,@1(B)   ;CHECK AMOUNT REMAINING ONE MORE TIME
17924          JRST SIOKT1    ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
17925         SKIPG 5(B)      ;NEED TO WAIT FOR DEVICE?
17926          JRST SIOKF1    ;NO.
17927 SIOKN1: SKIPG 5(B)      ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
17928          JRST SIOKW1    ;DEVICE CAN'T WAIT SO UDELAY
17929         XCT 5(B)        ;DEVICE WAIT
17930 SIOKF:  PUSHJ P,UFLS
17931
17932 SIOKF1: PUSHJ P,@2(B)   ;NOW GET NEXT BUFFER
17933          JRST SIOKN1    ;HMM, HAVE TO WAIT
17934           JRST SIOKT1   ;BUFFER HAS BEEN GOT.
17935         JRST POP3J1     ;EOF, TRANSFER IS COMPLETE
17936
17937 SIOKT1: UMOVE TT,@(P)   ;GET COUNT OF BYTES TO TRANSFER
17938         JUMPLE TT,POP3J1        ;COUNT DECREMENTED TO 0; TRANSFER DONE.
17939         SKIPG D,@1(B)   ;CHECK AMOUNT LEFT IN BUFFER
17940          JRST SIOKNB    ;NEW BUFFER NEEDED
17941         CAMLE TT,D      ;AMT OF ROOM LEFT IN CURRENT BUFFER
17942          MOVE TT,D      ;TRANSFER ONLY AMT LEFT IN BUFFER
17943         UMOVE J,@-1(P)
17944         IBP J
17945         LDB D,[301400,,J]
17946         MOVE C,@(B)
17947         IBP C           ;TO TRANSFER WORD-WISE, BOTH B.P.'S MUST
17948         HRL J,C
17949         LDB C,[301400,,C]
17950         CAIE C,(D)      ;HAVE SAME BYTE SIZE,
17951          JRST SIOKS1
17952         LDB D,[060600,,C]
17953         ANDI C,77
17954         ADDI C,(D)
17955 ;DROPS THROUGH
17956 \f;DROPS IN
17957         CAIGE TT,@-2(P) ;THERE MUST BE AT LEAST 1 WORD TO TRANSFER,
17958          JRST SIOKS1
17959         CAIE C,44       ;AND MUST BE ABOUT TO START THE NEXT WORD.
17960          JRST SIOKSL
17961         PUSH P,TT+1
17962         IDIVI TT,@-3(P) ;GET # WDS TO BLT
17963         POP P,TT+1
17964         SKIPGE (B)
17965          MOVSS J        ;WRITING, SWAP BLT POINTER
17966         MOVE D,J
17967         ADDI TT,(D)     ;1+LAST WORD TO BLT INTO
17968         SKIPGE (B)
17969          JRST SIOKN6    ;JUMP IF WRITING
17970         XCTRI XBW,[BLT D,-1(TT)] ;READING
17971 SIOKN7:  MOVEI D,(TT)   ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
17972 SIOKN8: SUBM D,J
17973         HRRZS J         ;# WDS ACTUALLY XFERRED
17974         ADDM J,@(B)     ;INCR BUFFER PNTR
17975         XCTR XRW,[ADDM J,@-1(P)]
17976         IMULI J,@-2(P)
17977         MOVNS J
17978         XCTR XRW,[ADDM J,@(P)]
17979         ADDM J,@1(B)    ;DECREMENT COUNT LEFT IN BUFFER
17980         CAIE D,(TT)     ;SKIP IF TRANSFERRED ALL WE COULD
17981          PUSHJ P,TPFLT  ;TAKE FAULT
17982 SIOKN3: SKIPN @1(B)
17983          PUSHJ P,@3(B)  ;BUFFER EXHAUSTED, DISCARD (MAY COME BACK TO LIFE).
17984         JRST SIOKT1     ;TRY AGAIN TO TRANSFER.
17985
17986 SIOKW1: PUSHJ P,UDELAY
17987         JRST SIOKF1
17988
17989 SIOKN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
17990          JRST SIOKN7
17991         JRST SIOKN8
17992
17993 ;COME HERE FOR SLOW (BYTE AT A TIME) SIOT TO BLOCK MODE DEVICE.
17994 ;TT HAS NUMBER OF BYTES TO TRANSFER - IT IS KNOWN THAT THE DEVICE
17995 ;CAN SUPPLY THAT MANY FROM ITS CURRENT BUFFER.
17996 SIOKSL: SUBM C,D        ;D GETS SIZE; C HAS # BITS REMAINING TO BE HANDLED
17997         IDIV C,D        ;C GETS # BYTES TO XFER TILL REACH WORD BOUNDARY.
17998         MOVE TT,C       ;XFER THAT MANY, THEN TRY AGAIN, SO WILL USE FAST MODE.
17999 SIOKS1: SKIPL (B)
18000          JRST SIOKSI    ;INPUT AND OUTPUT PART HERE
18001         LDB D,[300600,,@(B)]    ;BYTE SIZE IN THE BUFFER
18002         MOVEI C,36.
18003         IDIV C,D        ;D := # EXTRA BITS AT RIGHT END OF WORD
18004         MOVEI J,1
18005         LSH J,(D)
18006         SOS J           ;J := MASK FOR THEM
18007         UMOVE C,@-1(P)  ;GET COPY OF USER'S B.P. FOR SWAPPING IN PAGES.
18008 SIOKS3: IBP C           ;IF NOT FOR THESE 2 INSNS, ILDB MIGHT GET PAGE FAULT
18009         UMOVE (C)       ;WHICH WOULD CAUSE EXTRA INCREMENTING OF B.P.
18010         XCTR XBYTE,[ILDB D,@-1(P)] ;FETCH NEXT BYTE,
18011         IDPB D,@(B)
18012         MOVE D,@(B)
18013         ANDCAM J,(D)    ;TURN OFF EXTRA BITS IN THIS WORD OF BUFFER
18014         SOS @1(B)
18015         XCTR XRW,[SOS @(P)]
18016         SOJG TT,SIOKS3
18017         JRST SIOKN3
18018
18019 SIOKSI: UMOVE C,@-1(P)  ;GET COPY OF USER'S B.P., FOR WRITEABILITY TESTING.
18020 SIOKS2: IBP C
18021         XCTR XRW,[MOVES (C)]    ;MAKE SURE WE CAN WRITE IN NEXT BYTE.
18022         ILDB D,@(B)             ;GET NEXT BYTE FROM DEVICE BUFFER
18023         XCTR XBYTE,[IDPB D,@-1(P)];GIVE IT TO USER.
18024         XCTR XRW,[SOS @(P)]     ;UPDATE USER'S COUNT
18025         SOS @1(B)               ;AND THE SYSTEM'S COUNT.
18026         SOJG TT,SIOKS2
18027         JRST SIOKN3
18028
18029 ;CONVENIENT EXIT ROUTINE FOR BUFFER-GET ROUTINES.
18030 ;ASSUMES ADDR OF START OF BUFFER IN TT,
18031 ;SIZE (IN WORDS) OF DATA AREA IN J.
18032 ;E SHOULD HAVE WHAT IT HAD WHEN SIOKT WAS CALLED.
18033 SIOBGX: IMULI J,(E)
18034 SIOBG1: HLL TT,E
18035 SIOBG2: MOVEM TT,@(B)
18036         MOVEM J,@1(B)
18037         JRST POPJ1
18038 \f
18039 ;BYTE AT A TIME I/O TO BLOCK MODE DEVICE
18040 ;SEE PRECEDING PAGE (SIOKT) FOR COMMENTS ON CALLING SEQUENCE
18041 ;EXCEPT: ON INPUT, VALUE RETURNED IN W, AND C,D HAVE NO SIGNIFICANCE;
18042 ;ON OUTPUT, RH(C) HAS ADDRESS OF ARG, SIGN(C) SET IFF ADDRESS IS EXEC-MODE,
18043 ; AND D HAS NO SIGNIFICANCE.
18044
18045 CHRKT:  SKIPGE (B)
18046          JRST CHRKTO    ;WRITING
18047         JRST CHRKTI     ;READING
18048
18049 CHRKTI: SOSGE @1(B)     ;DECREMENT ACTIVE CHAR COUNT
18050          JRST CHRKT1    ;GET NEW BUFFER
18051         ILDB W,@(B)     ;READ - GET NEXT CHAR
18052         POPJ P,
18053
18054 CHRKTO: SKIPGE C        ;USED WHEN FILLING OUT BLOCK AT CLOSE, AND ELSEWHERE.
18055          SKIPA J,(C)
18056           UMOVE J,(C)   ;GET CHAR. FROM USER
18057         SOSGE @1(B)     ;DECREMENT ACTIVE CHAR COUNT
18058          JRST CHRKT1    ;GET NEW BUFFER
18059         IDPB J,@(B)     ;DEPOSIT IN BUFFER
18060         CAIE E,5        ;SKIP IF ASCII
18061          POPJ P,
18062         MOVEI J,1
18063         MOVE D,@(B)
18064         ANDCAM J,(D)    ;CLEAR EXTRA BIT
18065         POPJ P,
18066
18067 CHRKT1: AOS @1(B)       ;COMPENSATE FOR OVER-SOS
18068         PUSHJ P,@3(B)   ;GET RID OF THIS BUFFER
18069         SKIPLE J,@1(B)  ;CHECK AMOUNT REMAINING ONE MORE TIME
18070          JRST CHRKT     ;SPRUNG BACK TO LIFE (LAST BLOCK OF FILE WRITE OVER)
18071         SKIPG 5(B)      ;NEED TO WAIT FOR DEVICE?
18072          JRST CHRKF1    ;NO.
18073 CHRKN1: SKIPG 5(B)      ;HAVE TO WAIT
18074          JRST [ PUSHJ P,UDELAY
18075                 JRST CHRKF1 ]
18076         XCT 5(B)        ;DEVICE WAIT
18077          PUSHJ P,UFLS
18078
18079 CHRKF1: PUSHJ P,@2(B)   ;GOBBLE NEW BLOCK
18080          JRST CHRKN1    ;NOT READY, WAIT
18081           JRST CHRKT
18082         CAME E,[444400,,1]
18083          JRST UNIEOF    ;READING PAST EOF IN ASCII MODE.
18084         JRST IOCER2     ;READING PAST EOF IN IMAGE MODE.
18085 \f
18086 ;GENERAL BLOCK I/O
18087 ;E HAS BPLH,,# BYTES/WORD OF FILE BYTE SIZE - MUST BE 444400,,1
18088 ;RH(C) = ADDR OF AOBJN POINTER
18089 ; AND 4.9 => AOBJN PTR IS IN EXEC ADDRESS SPACE,
18090 ;     4.8 => BLOCK IT POINTS TO IS IN EXEC ADDRESS SPACE. (INPUT ONLY)
18091 ; ARGUMENTS B ->
18092 ;0(B)   ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
18093 ;1(B)   ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
18094 ;2(B)   ROUTINE TO GET NEXT BUFFER.  NO SKIP IF NO MEMORY
18095 ;        OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
18096 ;        AND BUFFER B.P. IN @(B) ALREADY SET UP.
18097 ;         2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
18098 ;3(B)   ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
18099 ;       MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO.
18100 ;4(B)   NOT USED
18101 ;5(B)   IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
18102 ;       IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
18103
18104 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
18105 ;BLKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
18106
18107 ;CODE IS ON NEXT PAGE
18108 \f
18109 BLKT:   CAME E,[444400,,1]
18110          BUG            ;BLKT CALLED ON UNIT ASCII MODE CHANNEL??
18111         SKIPL C         ;SKIP IF POINTER IN USER SPACE
18112          XCTR XRW,[MOVES (C)] ;USER SPACE, MAKE SURE WRITE CYCLE WILL WIN
18113         JRST BLKT1
18114
18115 ;NEXT BUFFER
18116
18117 BLKTNB: PUSHJ P,@3(B)   ;"DISCARD" BUFFER
18118         SKIPE @1(B)     ;CHECK AMOUNT REMAINING ONE MORE TIME
18119          JRST BLKT1     ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
18120         SKIPG 5(B)      ;NEED TO WAIT FOR DEVICE?
18121          JRST BLKTF1    ;NO.
18122 BLKTN1: SKIPG 5(B)      ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
18123          JRST BLKTW1    ;DEVICE CAN'T WAIT SO UDELAY
18124         XCT 5(B)        ;DEVICE WAIT
18125 BLKTF:  PUSHJ P,UFLS
18126
18127 BLKTF1: PUSHJ P,@2(B)   ;NOW GET NEXT BUFFER
18128          JRST BLKTN1    ;HMM, HAVE TO WAIT
18129           JRST BLKT1
18130         POPJ P,         ;EOF, TRANSFER FINISHED
18131
18132 BLKT1:  SKIPGE C        ;SET UP FOR TRANSFER
18133          SKIPA J,(C)    ;GET EXEC MODE BLOCK .IOT (AOBJN) POINTER
18134           UMOVE J,(C)   ;GET USER MODE AOBJN POINTER
18135         JUMPGE J,CPOPJ  ;POINTER COUNTED OUT, TRANSFER DONE
18136         SKIPG D,@1(B)   ;CHECK AMOUNT LEFT IN BUFFER
18137          JRST BLKTNB    ;NEW BUFFER NEEDED
18138         HLRE TT,J
18139         MOVNS TT        ;DESIRED SIZE OF BLOCK
18140         CAMLE TT,D      ;AMT OF ROOM LEFT IN CURRENT BUFFER
18141          MOVE TT,D      ;TRANSFER ONLY AMT LEFT IN BUFFER
18142         MOVE D,@(B)     ;CANONICALIZE THE BUFFER B.P. SO RH => NEXT WORD TO XFER
18143         IBP D
18144         HRL J,D         ;MERGE WITH USER'S BLOCK ADDR TO GET BLT AC.
18145         SKIPGE (B)
18146          MOVSS J        ;WRITING, SWAP BLT POINTER
18147         MOVE D,J
18148         ADDI TT,(D)     ;1+LAST WORD TO BLT INTO
18149         TLNE C,200000
18150          JRST BLKTN9    ;JUMP IF EXEC AOBJN POINTER
18151         SKIPGE (B)
18152          JRST BLKTN6    ;JUMP IF WRITING
18153         XCTRI XBW,[BLT D,-1(TT)] ;READING
18154 BLKTN7:  MOVEI D,(TT)   ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
18155 BLKTN8: SUBM D,J
18156         HRRZS J         ;# WDS ACTUALLY XFERRED
18157         ADDM J,@(B)     ;INCR BUFFER PNTR
18158         HRLS J          ;PUT # WDS IN BOTH HALVES
18159         JUMPL C,BLKTN3  ;UPDATE AOBJN PTR IN EXEC SPACE
18160         XCTRI XRW,[ADDM J,(C)] ;UPDATE AOBJN PTR IN USER SPACE
18161          JRST .+2
18162           BUG           ;MUMBLE.  THIS WAS SUPPOSED TO BE THERE.
18163
18164 BLKTN4: MOVNI J,(J)
18165         ADDM J,@1(B)    ;DECREMENT COUNT LEFT IN BUFFER
18166         CAIE D,(TT)     ;SKIP IF TRANSFERRED ALL WE COULD
18167          PUSHJ P,TPFLT  ;TAKE FAULT IF ANY
18168         SKIPN @1(B)
18169          PUSHJ P,@3(B)  ;BUFFER EXHAUSTED, "DISCARD"
18170         JRST BLKT1      ;GO TRANSFER ANOTHER CHUNK
18171
18172 BLKTN3: ADDM J,(C)      ;UPDATE EXEC AOBJN POINTER
18173         JRST BLKTN4
18174
18175 BLKTW1: PUSHJ P,UDELAY
18176         JRST BLKTF1
18177
18178 BLKTN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
18179          JRST BLKTN7
18180         JRST BLKTN8
18181
18182 BLKTN9: BLT D,-1(TT)    ;READING INTO EXEC SPACE
18183         JRST BLKTN7
18184 \f
18185 SUBTTL DIRECTORY AND ERR DEVICES
18186
18187 QMLSTF: MOVEI J,4       ;ENTRY TO GET MASTER 2314 DIRECTORY
18188         JRST LISTF7
18189
18190 QLISTF: MOVEI J,3       ;ENTRY FOR 2314 USER DIRECTORY
18191 LISTF7: MOVEI I,0
18192 LISTFE: PUSHJ P,SWTL    ;ENTER HERE FOR ALL KINDS OF DIRECTORIES.
18193         UDCSW
18194         MOVSI TT,-NUDCH
18195 UD1:    SKIPGE UDUSR(TT)
18196          JRST UD2
18197         AOBJN TT,UD1
18198         PUSHJ P,LSWPOP
18199         PUSHJ P,UDELAY  ;DIRECTORY NOT AVAILABLE NOW, WAIT
18200         JRST LISTFE
18201
18202 UD2:    MOVEM J,DSKLST(TT)
18203         MOVEM I,UDUSR(TT)
18204         MOVEM U,UDUIND(TT)
18205         PUSHJ P,LSWPOP
18206         MOVE Q,USYSN1(U)
18207         MOVEM Q,UDSYSN(TT)
18208         JUMPG J,UDIF    ;JUMP IF NOT UTAPE DIR.
18209 IFE NUNITS, BUG         ;HOW DID UTAPE GET HERE?
18210 IFN NUNITS,[
18211         CONO PI,CLKOFF
18212         MOVE Q,UDIRO(I)
18213         MOVEM Q,DIRPT(TT)
18214         CONO PI,CLKON
18215         MOVEI J,200
18216         TRNE D,2
18217         JRST UDBIN      ;IMAGE MODE UTAPE DIR
18218         MOVEI Q,LISTF   ;ASCII MODE UTAPE DIR
18219 ]
18220 UDIF1:  MOVEM Q,DIRPC(TT)
18221         HRL A,TT
18222         JSP Q,OPSLD1
18223         DIRCHN,,DIRBN
18224
18225 UDIF:   HLRZ Q,UDT-1(J) ;INITIAL COROUTINE PC
18226         HRRZ T,UDT-1(J) ;PLACE TO FINISH OPENING - USUALLY UDIF1.
18227         JRST (T)
18228
18229 UQL1:   HRRZM H,UUDPP(TT)       ;2314 MFD (FROM UDIF)
18230         MOVEI J,2000
18231         TRNE D,2
18232         JRST QUDBIN
18233         JRST UDIF1
18234
18235 UQL1A:  PUSHJ P,STMSET  ;DISK UFD (FROM UDIF). WE CAN STILL PCLSR,
18236         UDUSR(TT)       ;ARRANGE TO GIVE BACK THE DIRECTORY CHANNEL.
18237 UQL1B:  PUSH P,TT
18238         PUSHJ P,QUDLK
18239         PUSHJ P,TCALL   ;GET A LOW-HALF PAGE TO COPY UFD INTO.
18240           JRST IOMQ     ;GET LOW HALF PAGE
18241          JRST UQL1W     ;NOT AVAIL NOW
18242         MOVEI T,MU23LS
18243         DPB T,[MUR,,MEMBLT(A)]  ;MARK THE PAGE AS A UFD COPY.
18244         LSH A,10.
18245         MOVEM A,DIRPT(TT)
18246         MOVEM A,UUDPP(TT)
18247         HRL A,QSNLCN(H)
18248         HRRI T,2000(A)
18249         BLT A,-1(T)     ;COPY UFD
18250         PUSHJ P,QUDULK
18251         PUSHJ P,LSWDEL  ;STMSET OF UDUSR.
18252         SKIPG QSNNR(H)
18253          BUG            ;WE ALWAYS GET OUR MAN
18254         PUSHJ P,LSWPOP  ;SOS QSNNR
18255         POP P,TT
18256         MOVEI J,2000
18257         TRNE D,2
18258         JRST UDBIN
18259         JRST UDIF1
18260
18261 UQL1W:  PUSHJ P,QUDULK
18262         POP P,TT
18263         PUSHJ P,UDELAY
18264         JRST UQL1B
18265 \f
18266 ;LH INITIAL PC RH DISP ADR AT OPEN TIME
18267 UDT:    NDLF,,UDIF1     ;NON DIR DEVICE
18268         UCL1,,UDIF1     ;CORE LINK
18269         UQL2,,UQL1A     ;2314 UFD
18270         QMLS1,,UQL1     ;2314 MFD
18271         ERR1,,ERR2      ;ERR DEVICE
18272         TTYFLD,,UDIF1   ;TTY DIR
18273         TTYF99,,UDIF1   ;COR DIR (LAST LINE OF TTY DIR)
18274 UDTLN==.-UDT
18275
18276 QUDBIN: HRRZ T,QMDRO
18277         MOVEM T,DIRPT(TT)
18278 UDBIN:  MOVEM J,NUM(TT) ;DOESN'T USE DIRPC THIS PC
18279         MOVEM J,ENDT(TT)
18280         MOVEI J,444400
18281         HRLM J,DIRPT(TT)
18282         HRL A,TT
18283         JSP Q,OPSLD1
18284         NDATAI,,NBLKI
18285
18286 UTDCLS: MOVE B,DSKLST(A)
18287         CAIN B,3
18288         JRST UTDCL1
18289 UTDCLX: SETOM UDUSR(A)
18290         POPJ P,
18291
18292 UTDCL1: PUSH P,A
18293         MOVE A,UUDPP(A)
18294         LSH A,-10.
18295         PUSHJ P,MEMR
18296         POP P,A
18297         JRST UTDCLX
18298
18299 ;UNIT MODE IOT ON DIR DEVICE COMES HERE (RETURN CHAR IN W)
18300 DIRCH:  SETOM SRN3(U)   ;SAY WE WANT ONLY 1 CHARACTER.
18301         PUSHJ P,DIRCHR
18302         HRRZ W,I
18303         CAIN W,^C
18304          JRST UNIEOF
18305         POPJ P,
18306
18307 ;BLOCK MODE IOT ON DIR DEVICE.
18308 DIRB:   JSP Q,WRDBT     ;PUSHJ'S TO .+1 FOR EACH WORD.
18309 DIRB1:  XCTR XRW,[MOVES (C)]    ;MAKE SURE WE CAN WRITE.
18310         PUSH P,C
18311         PUSH P,H
18312         SETZM SRN3(U)   ;SAY WE WANT A WHOLE WORD OF CHARS.
18313         PUSHJ P,DIRCHR
18314         POP P,H
18315         POP P,C
18316         LDB Q,[350700,,SRN3(U)]
18317         CAIN Q,^C       ;IF THE WORD STARTS WITH ^C,
18318          JRST POPJ2     ;IT IS EOF; DON'T RETURN IT, UNHANG IOT.
18319         MOVE Q,SRN3(U)
18320         UMOVEM Q,(C)
18321         MOVEI Q,DIRB1   ;FASTER THAN PUSHING AND POPPING Q.
18322         POPJ P,         ;RETURN INTO WRDBT
18323
18324         SKIPA T,[SIOKT]
18325 DDATAI:  MOVEI T,CHRKTI ;UNIT IMAGE INPUT FROM DIRECTORY.
18326         CAIA
18327 DBLKI:   MOVEI T,BLKT   ;BLOCK IMAGE INPUT FROM DIRECTORY
18328         MOVE E,[444400,,1]
18329         JSP B,(T)       ;TO BLKT, SIOKT, OR CHRKTI
18330           DIRPT(A)
18331           NUM(A)
18332           POPJ2         ;EOF IF TRY TO GET ANOTHER BUFFER
18333           CPOPJ         ;BUFFER DISCARD ROUTINE
18334           BUG
18335           SKIPA
18336 \f
18337 ;ERR DEVICE AND ERROR MESSAGE TABLES
18338 ; ERR DEVICE WORKS MUCH LIKE DIR DEVICE
18339
18340 ERRO:   MOVEI J,5
18341         JRST LISTF7
18342
18343 ERR2:   SOJE A,ERR21    ;LAST ERRONEOUS CHANNEL
18344         SOJE A,ERR22    ;CHANNEL SPECIFIED IN B
18345         SOJE A,ERR23    ;STATUS WORD IN B
18346         SOJE A,ERR24    ;.CALL ERROR ARG IN B
18347         SETOM UDUSR(TT)
18348         JRST OPNL11
18349
18350 ERR21:  LDB B,[BCHPTR]
18351 ERR22:  ANDI B,17
18352         ADDI B,IOCHST(U)
18353         SKIPA B,(B)
18354 ERR24:   MOVSS B
18355 ERR23:  MOVEM B,UUDPP(TT)
18356         JRST UDIF1
18357
18358 CORO:   PUSHJ P,FLDRCK
18359         JRST OPNL11
18360         MOVEI J,7
18361         JRST LISTF7
18362
18363 ERR1:   SKIPN I,UUDPP(A)
18364         JRST ERR3
18365         LDB B,[220600,,UUDPP(A)]        ;OPEN LOSS FIELD
18366         JUMPE B,ERR1B
18367         CAIL B,NERMES+1
18368          MOVEI B,NERMES+1
18369         MOVE TT,ERMST1-1(B)
18370         JSP B,MESPNT
18371 ERR1B:  LDB B,[300300,,UUDPP(A)]        ;IDS ERROR FIELD
18372         JUMPE B,ERR1C
18373         MOVE TT,ERMST2-1(B)
18374         JSP B,MESPNT
18375 ERR1C:  LDB B,[330400,,UUDPP(A)]        ;IOCERR FIELD
18376         JUMPE B,UCL7
18377         CAIL B,MIOTER
18378         CAIL B,NERM1+MIOTER
18379         MOVEI B,NERM1+MIOTER
18380         MOVE TT,ERMST3-MIOTER(B)
18381         JSP B,MESPNT
18382         JRST UCL7
18383
18384 ERR3:   MOVEI TT,[ASCIZ /ISE0
18385 /]
18386         JSP B,MESPNT
18387         JRST UCL7
18388 \f
18389 ;LISP ASSUMES THAT NO "ERR" DEVICE MESSAGE WILL EVER CONTAIN
18390 ; !, #, ^, OR LOWER CASE LETTERS.  PLEASE MAINTAIN THIS STATE
18391 ;   GLS (GUY STEELE)
18392
18393 ERMST1: [ASCIZ /NO SUCH DEVICE
18394 /]
18395         [ASCIZ /WRONG DIRECTION
18396 /]
18397         [ASCIZ /TOO MANY TRANSLATIONS
18398 /]
18399         [ASCIZ /FILE NOT FOUND
18400 /]
18401         [ASCIZ /DIRECTORY FULL
18402 /]
18403         [ASCIZ /DEVICE FULL
18404 /]
18405         [ASCIZ /DEVICE NOT READY
18406 /]
18407         [ASCIZ /DEVICE NOT AVAILABLE
18408 /]
18409         [ASCIZ /ILLEGAL FILE NAME
18410 /]
18411         [ASCIZ /MODE NOT AVAILABLE
18412 /]
18413         [ASCIZ /FILE ALREADY EXISTS
18414 /]
18415         [ASCIZ /BAD CHANNEL NUMBER
18416 /]
18417         [ASCIZ /TOO MANY ARGUMENTS (CALL)
18418 /]
18419         [ASCIZ /PACK NOT MOUNTED
18420 /]
18421         [ASCIZ /DIRECTORY NOT AVAIL
18422 /]
18423         [ASCIZ /NON-EXISTENT DIRECTORY
18424 /]
18425         [ASCIZ /LOCAL DEVICE ONLY
18426 /]
18427         [ASCIZ /SELF-CONTRADICTORY OPEN
18428 /]
18429         [ASCIZ /FILE LOCKED
18430 /]
18431         [ASCIZ /M.F.D. FULL
18432 /]
18433         [ASCIZ /DEVICE NOT ASSIGNABLE TO THIS PROCESSOR
18434 /]
18435         [ASCIZ /DEVICE WRITE-LOCKED
18436 /]
18437         [ASCIZ /LINK DEPTH EXCEEDED
18438 /]
18439         [ASCIZ /TOO FEW ARGUMENTS (CALL)
18440 /]
18441         [ASCIZ /CAN'T MODIFY JOB
18442 /]
18443         [ASCIZ /CAN'T GET THAT ACCESS TO PAGE
18444 /]
18445         [ASCIZ /MEANINGLESS ARGS
18446 /]
18447         [ASCIZ /WRONG TYPE DEVICE
18448 /]
18449         [ASCIZ /NO SUCH JOB
18450 /]
18451         [ASCIZ /VALID CLEAR OR STORED SET
18452 /]
18453         [ASCIZ /NO CORE AVAILABLE
18454 /]
18455         [ASCIZ /NOT TOP LEVEL
18456 /]
18457         [ASCIZ /OTHER END OF PIPELINE GONE OR NOT OPEN
18458 /]
18459         [ASCIZ /JOB GONE OR GOING AWAY
18460 /]
18461         [ASCIZ /ILLEGAL SYSTEM CALL NAME
18462 /]
18463         [ASCIZ /CHANNEL NOT OPEN
18464 /]
18465         [ASCIZ /INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18466 /]
18467         [ASCIZ /UNRECOGNIZABLE FILE
18468 /]
18469         [ASCIZ /LINK TO NON-EXISTENT FILE
18470 /]
18471 IFN .-ERMST1-NOPNLS,.ERR WRONG TABLE LENGTH
18472 ;ADD NEW MESSAGES HERE
18473
18474 IFN 0,[         A CLASSIFICATION OF OPEN-LOSS MESSAGES
18475
18476 FULL -  NO CORE (MMP FULL)
18477         DIR NOT AVAIL (DIR CHNL TABLE FULL)
18478         DEVICE FULL
18479         DIR FULL
18480         MFD FULL
18481         INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18482
18483 NO SUCH - DEVICE, FILE, JOB, DIRECTORY, PAGE (CAN'T GET ACCESS)
18484           ILLEGAL SYSTEM CALL NAME
18485
18486 ALREADY ONE SUCH - FILE (FILE ALREADY EXISTS - RENAME)
18487
18488 WRITING - CAN'T MODIFY JOB
18489          DEVICE WRITE-LOCKED
18490          WRONG DIRECTION
18491          MODE NOT AVAILABLE
18492          CAN'T GET ACCESS TO PAGE
18493
18494 ARGS (THE PARAMETERS ARE RIDICULOUS) -
18495         SELF-CONTRADICTORY OPEN COMMAND
18496         ILLEGAL FILE NAME
18497         BAD CHANNEL NUMBER
18498         TOO FEW ARGS
18499         TOO MANY ARGS
18500         MEANINGLESS ARGS
18501         CHANNEL NOT OPEN
18502
18503 NOT AVAILABLE (IT EXISTS BUT YOU CAN'T USE IT) -
18504         DEVICE NOT READY
18505         DEVICE NOT AVAILABLE
18506                NOT ASSIGNABLE TO THIS PROCESSOR
18507         LOCAL DEVICE
18508         PACK NOT MOUNTED
18509         FILE LOCKED
18510         OTHER END OF PIPELINE GONE
18511         JOB GONE OR GOING AWAY
18512
18513 DEPTH - LINK DEPTH EXCEEDED
18514         TOO MANY TRANSLATIONS
18515
18516 OTHER - NOT TOP LEVEL
18517         VALID CLEAR OR STORED SET
18518 ]
18519 \f
18520 NERMES==.-ERMST1
18521         [ASCIZ /OPEN TYPE NOT DETERMINED
18522 /]
18523
18524 ERMST2: [ASCIZ /IDS ILLEGAL SCOPE MODE
18525 /]
18526         [ASCIZ /IDS SCOPE HUNG
18527 /]
18528         [ASCIZ /MORE THAN 1K SCOPE BUFFER
18529 /]
18530         [ASCIZ /IDS MEM PROTECT
18531 /]
18532         [ASCIZ /IDS ILLEGAL SCOPE OP
18533 /]
18534         [ASCIZ /IDS MEM PROTECT ON PDL PNTR
18535 /]
18536         [ASCIZ /IDS ILLEGAL PARAMETER SET
18537 /]
18538
18539 ERMST3: [ASCIZ /DEVICE HUNG OR REPORTING NON-DATA ERROR
18540 /]
18541         [ASCIZ /END OF FILE
18542 /]
18543         [ASCIZ /NON-RECOVERABLE DATA ERROR
18544 /]
18545         [ASCIZ /NON-EXISTENT SUB DEVICE
18546 /]
18547         [ASCIZ /OVER IOPOP
18548 /]
18549         [ASCIZ /OVER IOPUSH
18550 /]
18551         [ASCIZ /USR OP CHNL DOES NOT HAVE USR OPEN
18552 /]
18553         [ASCIZ /CHNL NOT OPEN
18554 /]
18555         [ASCIZ /DEVICE FULL
18556 /]
18557         [ASCIZ /CHNL IN ILLEGAL MODE ON IOT
18558 /]
18559         [ASCIZ /ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY
18560 /]
18561         [ASCIZ /DIRECTORY FULL
18562 /]
18563         [ASCIZ /DIRECTORY'S ALLOCATION EXHAUSTED
18564 /]
18565 ;INSERT NEW MESSAGES HERE
18566 NERM1==.-ERMST3
18567         [ASCIZ /IOT OR OPR TYPE NOT DETERMINED
18568 /]
18569 \f
18570 ;DIRECTORY LISTING ROUTINES
18571
18572 UQL3C:  SKIPA I,["*]
18573 UQL3:    MOVEI I,"-
18574         PUSHJ P,OUTC
18575         JRST UQL3A
18576
18577 UQL2:   MOVEI TT,[MNAME ASCIZ /,  /]    ;GENERATE USER DIRECTORY
18578         JSP B,MESPNT
18579         MOVE I,UUDPP(A)
18580         MOVEI J,UDNAME(I)
18581         JSP B,SIXTYC    ;SEND DIRECTORY NAME
18582         MOVEI TT,[ASCIZ /
18583 FREE BLOCKS /]
18584         JSP B,MESPNT
18585         MOVSI E,-NQS
18586 UQL2A:  SKIPGE QACT(E)
18587          JRST UQL3      ;UNIT NOT ENGAGED
18588         MOVE J,QTUTO(E)
18589         TLNE J,40000
18590          JRST UQL3C     ;TUT FOR UNIT NOT IN
18591         MOVEI I,"#
18592         PUSHJ P,OUTC
18593         MOVE TT,QPKID(E)
18594         JSP B,GDPT      ;AND #
18595         MOVEI I,"=
18596         PUSHJ P,OUTC
18597         MOVE TT,QSFT(E)
18598         JSP B,GDPT      ;AND # FREE TRACKS
18599 UQL3A:  PUSHJ P,OUTCS
18600         AOBJN E,UQL2A
18601         JSP B,MESPCR
18602         MOVE I,UUDPP(A)
18603         MOVEM I,DIRPT(A)
18604         MOVE Q,UDNAMP(I)
18605 UQL4:   CAIL Q,2000
18606          JRST UCL7
18607         HRLI I,440600+Q
18608         HLLM I,DIRPT(A)
18609 \f
18610 UQLP:   ADDI Q,2        ;MOVE PNTR TO 3RD WRD OF FILE DESC
18611         MOVE I,@DIRPT(A)
18612         MOVEI TT,[ASCIZ /* /]   ;DELETED OR BEING WITTEN
18613         TLNN I,UNIGFL
18614          MOVEI TT,[ASCIZ /  /]
18615         JSP B,MESPNT
18616         MOVE I,@DIRPT(A)
18617         TLNE I,UNLINK
18618          JRST UQLL1     ;LINK
18619         LDB TT,[UNPKN+@DIRPT(A)]
18620         JSP B,GDPT      ;PRINT PACK #
18621         LDB TT,[UNPKN+@DIRPT(A)]
18622         CAIG TT,9
18623 UQLL2:   PUSHJ P,OUTCS
18624         PUSHJ P,OUTCS
18625         SUBI Q,2        ;BACK TO FIRST WD
18626         JSP B,SIXTYA    ;SEND FIRST FILE NAME
18627         JSP B,SIXTYB    ;AND SECOND (AOSES Q)
18628         PUSHJ P,OUTCS
18629         AOS Q           ;SET Q TO POINT TO FILE DESC PNTR
18630         LDB E,[UNDSCP+@DIRPT(A)]        ;PICK UP FILE DESC PNTR
18631         IDIVI E,UFDBPW
18632         ADDI E,UDDESC   ;COMPUTE WORD ADDRESS
18633         MOVE I,@DIRPT(A)        ;SAVE STATUS WORD
18634         EXCH E,Q        ;MOVE INTO PNTR
18635         MOVE TT,QBTBLI(TT)
18636         TLO TT,Q
18637         HLLM TT,DIRPT(A)        ;SET UP DIRPT TO POINT TO FILE DESC
18638         TLNE I,UNLINK
18639          JRST QLL1      ;LINK
18640         MOVEI TT,0
18641 UQL5:   JSP B,UQL5R     ;CHECK IF ABOUT TO INCREMENT OFF WORD
18642         ILDB I,DIRPT(A)
18643         JUMPE I,UQL5A   ;STOP
18644         CAILE I,UDTKMX
18645          JRST UQL5B
18646         ADD TT,I
18647         JRST UQL5
18648
18649 UQLL1:  MOVEI I,"L
18650         PUSHJ P,OUTC
18651         JRST UQLL2
18652 \f
18653 QLL1:   CLEARM ENDT(A)  ;CNTS TO 3 FOR USER NAME AND 2 FILE NAMES
18654 QLL3:   CLEARM NUM(A)   ;CHR CNTR
18655 QLLIST: JSP B,UQL5R
18656         ILDB I,DIRPT(A)
18657         JUMPE I,QLL4
18658         CAIN I,';
18659          JRST QLL2
18660         CAIN I,':
18661          JRST QLL5
18662 QLL5A:  ADDI I,40
18663         PUSHJ P,OUTC
18664         AOS I,NUM(A)
18665         CAIGE I,6
18666          JRST QLLIST
18667 QLL2:   PUSHJ P,OUTCS
18668         AOS I,ENDT(A)
18669         CAIGE I,3
18670          JRST QLL3
18671 QLL4:   JSP B,MESPCR
18672         MOVEI Q,3(E)    ;ADVANCE Q
18673         JRST UQL4
18674
18675 QLL5:   JSP B,UQL5R
18676         ILDB I,DIRPT(A)
18677         JRST QLL5A
18678
18679 UQL5R:  MOVE I,DIRPT(A) ;CHECK IF ABOUT TO ILDB OFF WORD
18680         TLNE I,770000
18681          JRST (B)       ;NO
18682         MOVEI I,440600+Q        ;YES INCREMENT Q INSTEAD
18683         HRLM I,DIRPT(A)
18684         AOJA Q,(B)
18685
18686 UQL5B:  CAIGE I,UDWPH   ;PLACE HOLDER
18687          AOJA TT,UQL5   ;SKIP AND TAKE
18688         CAIN I,UDWPH
18689          JRST UQL5      ;NULL
18690         REPEAT NXLBYT,[JSP B,UQL5R
18691         IBP DIRPT(A)
18692 ]
18693         AOJA TT,UQL5    ;SPACE OVER 2ND HALF OF LOAD ADDRESS
18694 \f
18695 UQL5A:  JSP B,GDPT      ;TYPE OUT # BLOCKS
18696         PUSHJ P,OUTCS
18697         MOVE Q,E        ;FILE POINTER
18698         MOVEI I,"!
18699         SKIPGE B,@DIRPT(A)      ;SKIP ON NOT DUMPED
18700          MOVEI I,40
18701         PUSHJ P,OUTC    ;HAS NOT BEEN BACKED UP
18702         MOVEI I,"$
18703         TLNN B,UNREAP   ;SKIP ON DON'T-REAP
18704          MOVEI I,40
18705         PUSHJ P,OUTC
18706         MOVEI Q,1(E)
18707         LDB E,[1200,,DIRPT(A)]
18708         JUMPN E,[JRST 4,.]
18709         MOVE TT,@DIRPT(A)
18710         AOJE TT,UQL5C   ;DATE NOT KNOWN
18711         LDB TT,[UNMON+@DIRPT(A)]
18712         JSP B,GDPT      ;TYPE MONTH
18713         MOVEI I,"/
18714         PUSHJ P,OUTC
18715         LDB TT,[UNDAY+@DIRPT(A)]
18716         JSP B,GDPT      ;TYPE DAY
18717         MOVEI I,"/
18718         PUSHJ P,OUTC
18719         LDB TT,[UNYRB+@DIRPT(A)]
18720         JSP B,GDPT      ;TYPE YEAR
18721         PUSHJ P,OUTCS
18722         HRRZ TT,@DIRPT(A)
18723         IDIVI TT,60.*60.*2
18724         MOVE E,I
18725         JSP B,G2DPT
18726         MOVEI I,":
18727         PUSHJ P,OUTC
18728         MOVE TT,E
18729         IDIVI TT,60.*2
18730         MOVE E,I
18731         JSP B,G2DPT
18732         MOVEI I,":
18733         PUSHJ P,OUTC
18734         MOVE TT,E
18735         LSH TT,-1
18736         JSP B,G2DPT
18737 UQL5D:  JSP B,MESPCR
18738         ADDI Q,2        ;ADVANCE Q
18739         JRST UQL4
18740
18741 UQL5C:  MOVEI I,"-
18742         PUSHJ P,OUTC
18743         JRST UQL5D
18744
18745 ;GENERATE MFD LISTING
18746 QMLS1:  CONO PI,CLKOFF
18747         MOVE Q,QMDRO
18748         HRLI Q,440600+Q
18749         MOVEM Q,DIRPT(A)
18750         MOVE Q,MDNAMP(Q)
18751         CONO PI,CLKON
18752 QMLS2:  CAIL Q,1777
18753          JRST UCL7
18754         SKIPN @DIRPT(A)
18755          JRST QMLS3
18756         JSP B,SIXTYA
18757         JSP B,MESPCR
18758 QMLS3:  ADDI Q,LMNBLK
18759         JRST QMLS2
18760 \f
18761 ;DIRECTORY LISTING ROUTINES FOR UTAPE
18762
18763 IFN NUNITS,[
18764 LISTF:  MOVEI Q,220600+Q
18765         HRLM Q,DIRPT(A)
18766         MOVEI Q,177
18767         MOVE TT,@DIRPT(A)
18768         AOJE TT,LISTF1
18769         JSP B,SIXTYP
18770 LISTF1: MOVEI TT,[ASCIZ /
18771 FREE FILES /]
18772         JSP B,MESPNT
18773         MOVSI Q,-23.
18774         MOVEI TT,0
18775 LISTF4: SKIPE @DIRPT(A)
18776         AOJA Q,LISTF8
18777         AOS Q
18778         SKIPN @DIRPT(A)
18779         AOS TT
18780 LISTF8: AOBJN Q,LISTF4
18781         JSP B,GDPT
18782         MOVEI TT,[ASCIZ /       FREE BLOCKS /]
18783         JSP B,MESPNT
18784         SETZB J,TT
18785         JSP B,BLKPNT
18786 LISTD2: JSP B,MESPCR
18787         MOVSI Q,-23.
18788 LISTF2: MOVEI I,440600+Q
18789         HRLM I,DIRPT(A)
18790         MOVE I,@DIRPT(A)
18791         JUMPE I,LISTF5
18792 LISTF6: PUSHJ P,OUTCS
18793         JSP B,SIXTYA
18794         JSP B,SIXTYB
18795         PUSHJ P,OUTCS
18796         MOVEI J,1(Q)
18797         JSP B,BLKPNN
18798 LISTD4: JSP B,MESPCR
18799 LISTF3: AOBJN Q,LISTF2
18800 ];END IFN NUNITS
18801
18802 UCL7:   MOVEI I,14      ;END DIR WITH FORMFEED AND EOF CHARS
18803         PUSHJ P,OUTC
18804         HRROI I,EOFCH
18805         JRST .-2
18806
18807 IFN NUNITS, LISTF5:     AOJA Q,LISTF3
18808 \f
18809 ; DIRECTORY LISTING ROUTINES FOR MISC. DEVICES + CORE LINK
18810
18811 NDLF:   MOVEI TT,[ASCIZ /
18812 NON-DIRECTORY DEVICE/]
18813         JSP B,MESPNT
18814         JRST UCL7
18815
18816 ;DIRECTORY OF CORE LINK DEVICE
18817 UCL1:   MOVSI Q,-NCLCH
18818 UCL6:   SKIPN CLSYN(Q)
18819         JRST UCL5A
18820         MOVEI J,CLSYN(Q)
18821         JSP B,SIXTYC
18822         MOVEI J,CLN1(Q)
18823         JSP B,SIXTYC
18824         MOVEI J,CLN2(Q)
18825         JSP B,SIXTYC
18826         HLRE B,CLUSR(Q)
18827         AOJE B,UCL2
18828         MOVEI J,UNAME-1(B)
18829         MOVEM B,NUM(A)
18830         JSP B,SIXTYC
18831         MOVE B,NUM(A)
18832         MOVEI J,JNAME-1(B)
18833         JSP B,SIXTYC
18834 UCL3:   MOVEI TT,[ASCIZ /->/]
18835         JSP B,MESPNT
18836         HRRE B,CLUSR(Q)
18837         AOJE B,UCL4
18838         MOVEI J,UNAME-1(B)
18839         MOVEM B,NUM(A)
18840         JSP B,SIXTYC
18841         MOVE B,NUM(A)
18842         MOVEI J,JNAME-1(B)
18843         JSP B,SIXTYC
18844 UCL5:   JSP B,MESPCR
18845 UCL5A:  AOBJN Q,UCL6
18846         JRST UCL7
18847
18848 UCL4:   MOVEI B,UCL5
18849         JRST .+2
18850 UCL2:   MOVEI B,UCL3
18851         MOVEI J,[SIXBIT /CLOSED/]
18852 SIXTYC: HRLI J,440600
18853         MOVEM J,DIRPT(A)
18854         PUSHJ P,OUTCS
18855         JRST SIXTYP
18856 \f
18857 ; DIRECTORY LISTING ROUTINES FOR TTY
18858
18859 TTYFLD: MOVEI TT,[ASCIZ /
18860 TTY UNAME  JNAME  CORE  TOTAL IDX
18861 /]
18862         JSP B,MESPNT
18863         MOVSI Q,-NCT
18864 TTYF1:  HRRE E,TTYSTS(Q)
18865         AOJE E,TTYF5    ;JUMP IF NOT IN USE
18866         MOVE E,TTYSTS(Q)
18867         MOVEI I,"T      ;TTY
18868         TLNN E,%TSCNS
18869          MOVEI I,"D     ;"DEVICE"
18870         PUSHJ P,OUTC
18871         HRRZ TT,Q
18872         JSP B,G2OPT
18873         HRRZS E
18874 TTYF11: MOVEI J,UNAME(E)
18875         JSP B,SIXTYC
18876         MOVEI J,JNAME(E)
18877         JSP B,SIXTYC
18878         PUSHJ P,OUTCS
18879         MOVE TT,NMPGS(E)
18880         JSP B,G4SDPT
18881         PUSHJ P,OUTCS
18882         PUSHJ P,OUTCS
18883         MOVEM E,DIRPT(A)
18884         MOVE E,UTMPTR(E)
18885         SETZB B,TT
18886 TTYF3:  SKIPE UNAME(B)
18887          CAME E,UTMPTR(B)
18888           JRST TTYF4
18889         ADD TT,NMPGS(B)
18890 TTYF4:  ADDI B,LUBLK
18891         CAMGE B,USRHI
18892          JRST TTYF3
18893         JSP B,G4SDPT
18894         PUSHJ P,OUTCS
18895         PUSHJ P,OUTCS
18896         HRRZ TT,DIRPT(A)
18897         SKIPL SUPPRO(TT)
18898          JRST [ HRRZ TT,SUPPRO(TT) ? JRST .-1 ]
18899         IDIVI TT,LUBLK
18900         JSP B,GOPT
18901         JSP B,MESPCR
18902 TTYF5:  AOBJN Q,TTYF1
18903 TTYF99: MOVEI TT,[ASCIZ /FREE CORE  /]
18904         JSP B,MESPNT
18905         MOVE TT,MEMFR
18906         SUB TT,NCBCOM
18907         JSP B,GDPT
18908         MOVEI TT,[ASCIZ / OUT /]
18909         JSP B,MESPNT
18910         MOVE TT,NPGSWO
18911         JSP B,GDPT
18912         JSP B,MESPCR
18913         JRST UCL7
18914 \f
18915 SIXTYB: AOS Q
18916 SIXTYA: PUSHJ P,OUTCS
18917         MOVEI I,440600+Q
18918         HRLM I,DIRPT(A)
18919
18920 SIXTYP: ILDB I,DIRPT(A)
18921         ADDI I,40
18922         PUSHJ P,OUTC
18923         MOVE I,DIRPT(A)
18924         TLNE I,770000
18925         JRST SIXTYP
18926         JRST (B)
18927
18928 MESP3S: SKIPA TT,[[ASCIZ /   /]]
18929 MESPCR: MOVEI TT,[ASCIZ /
18930 /]
18931 MESPNT: HRLI TT,440700
18932         MOVEM TT,NUM(A)
18933         ILDB I,NUM(A)
18934         JUMPE I,(B)
18935         PUSHJ P,OUTC
18936         JRST .-3
18937
18938 OUTCS:  MOVEI I,40
18939 OUTC:   SKIPL TT,SRN3(U) ;IF WANT 1 CHAR, RETURN WITH IT, SAVING ACS.
18940          JRST OUTC1     ;IF WANT WHOLE WORD, SEE IF WORD IS FULL.
18941 OUTC2:  MOVEM E,SAVE(A)
18942         MOVEM Q,SAVQ(A)
18943         MOVEM B,SAVB(A)
18944         POP P,DIRPC(A)
18945         POPJ P,
18946
18947 OUTC1:  LSH TT,6
18948         ADDI TT,(I)     ;MERGE THIS CHAR (IN I) INTO WORD BEING ACCUMULATED.
18949         LSH TT,1
18950         MOVEM TT,SRN3(U)
18951         TLNE TT,774000  ;IF THE WORD IS FULL, RETURN TO DIRB.
18952          JRST OUTC2
18953         POPJ P,         ;ELSE POPJ FROM OUTC, TO GET MORE CHARS.
18954 \f
18955 ;NUMERIC PRINTOUT ROUTINES FOR FILE DIRECTORIES.
18956 ;ALL CALLED WITH JSP B,.  ALL TAKE ARG IN TT.
18957
18958 ;PRINT NUMBER IN TT IN DECIMAL, RIGHT-ADJUSTED IN FOUR COLUMNS.
18959 G4SDPT: CAIL TT,1000.
18960          JRST GDPT              ;IF IT NEEDS 4 DIGITS, JUST PRINT IT.
18961         MOVEM TT,NUM(A)
18962         CAIL TT,100.            ;ELSE FIGURE OUT HOW MANY LEADING SPACES ARE NEEDED
18963          JRST G4SDP1
18964         CAIL TT,10.
18965          JRST G4SDP2
18966         PUSHJ P,OUTCS           ;AND PRINT THAT MANY.
18967 G4SDP2: PUSHJ P,OUTCS
18968 G4SDP1: PUSHJ P,OUTCS
18969         MOVE TT,NUM(A)
18970         JRST GDPT
18971
18972 ;PRINT CONTENTS OF TT AS TWO OCTAL DIGITS.
18973 G2OPT:  IDIVI TT,8
18974         JRST G2DPT2
18975
18976 ;PRINT CONTENTS OF TT AS THREE DECIMAL DIGITS.
18977 G3DPT:  IDIVI TT,100.
18978         MOVEM I,NUM(A)
18979         MOVEI I,"0(TT)
18980         PUSHJ P,OUTC
18981         MOVE TT,NUM(A)
18982 G2DPT:  IDIVI TT,10.
18983 G2DPT2: MOVEM I,NUM(A)
18984         MOVEI I,"0(TT)
18985         PUSHJ P,OUTC
18986         MOVE I,NUM(A)
18987         ADDI I,"0
18988         PUSHJ P,OUTC
18989         JRST (B)
18990
18991 ;PRINT ARG IN TT IN DECIMAL USING AS MANY DIGITS AS IT NEEDS.
18992 GDPT:   HRLI B,10.
18993         JRST GDPT0
18994
18995 ;PRINT ARG IN TT IN OCTAL USING AS MANY DIGITS AS NECESSARY.
18996 GOPT:   HRLI B,8
18997 GDPT0:  MOVSS B
18998         SETZM ENDT(A)
18999         MOVEM TT,NUM(A)
19000 GDPT1:  PUSH P,Q
19001          MOVE Q,TT
19002          IDIVI TT,(B)
19003          CAME TT,ENDT(A)
19004           JRST .-3
19005         MOVEM Q,ENDT(A)
19006         POP P,Q
19007         ADDI I,"0
19008         PUSHJ P,OUTC
19009         MOVE TT,NUM(A)
19010         CAME TT,ENDT(A)
19011          JRST GDPT1
19012         MOVSS B
19013         JRST (B)
19014 \f
19015 ;ROUTINE TO CALL A DIRECTORY COROUTINE
19016 DIRCHR: MOVE E,SAVE(A)
19017         MOVE B,SAVB(A)
19018         MOVE Q,SAVQ(A)
19019         JRST @DIRPC(A)
19020
19021 IFN NUNITS,[
19022 BLKPNA: MOVEI J,1(I)
19023         LSH J,-1
19024         JRST BLKPNT+1
19025
19026 BLKPNN: LSH J,-1
19027 BLKPNT: MOVEI TT,0
19028         MOVEI I,56
19029 BLKPN2: MOVEI E,440500+I
19030         HRLM E,DIRPT(A)
19031 BLKPN1: ILDB E,DIRPT(A)
19032         CAIN E,37
19033         JRST BLKPN3
19034         CAMN E,J
19035         AOS TT
19036         HLRZ E,DIRPT(A)
19037         TRNE E,760000
19038         JRST BLKPN1
19039         AOJA I,BLKPN2
19040 BLKPN3: JUMPE J,GDPT
19041         MOVSI I,-23.
19042 BLKPN4: MOVE E,@DIRPT(A)
19043         AOS I
19044         CAMN J,@DIRPT(A)
19045         JUMPE E,BLKPNA
19046         AOBJN I,BLKPN4
19047         JRST GDPT
19048 ];NUNITS
19049 EBLK
19050
19051 UDUSR:  REPEAT NUDCH,-1 ;-1 => FREE, ELSE UTAPE # IF UTAPE DIR, ELSE 0.
19052 UDUIND: BLOCK NUDCH     ;IF DIR CHANNEL IN USE, HOLDS JOB # OF JOB USING IT.
19053
19054 IRPS X,,DIRPC:DIRPT:NUM:ENDT:SAVB:SAVQ:UDSYSN:UUDPP:SAVE:
19055 X:      REPEAT NUDCH,-1
19056         TERMIN
19057 UDCSW:  -1
19058         0
19059
19060 DSKLST: BLOCK NUDCH     ;0 LISTING UTAPE 1 NON-DIR DEVICE
19061                                 ;2 CORE LINK 3 2311
19062 ;NO BBLK SINCE VARIABLES ON NEXT PAGE
19063 \f
19064 SUBTTL UTC LEVEL INTERRUPT
19065
19066 ;NO EBLK SINCE VARIABLES ON PREVIOUS PAGE
19067
19068 UTCPDP: -LUTCP,,UTCP-1  ;UTC-LEVEL PDL
19069 UTCP:   BLOCK LUTCP
19070 UTACS:  BLOCK 20        ;UTC-LEVEL AC SAVE
19071
19072 IFE KS10P,[     ; On the KS10 we can take advantage of the Unibus interrupt
19073                 ; vectoring scheme to dispatch quicker, so this code was
19074                 ; reorganized somewhat.
19075 UTCBRK: 0
19076 BBLK
19077 IFN KL10P,[
19078         CONSO PI,1_<7-UTCCHN>
19079          JRST 4,.       ;HARDWARE BUG ALLEGEDLY FIXED
19080 ]
19081         MOVEM U,UTACS+U
19082         MOVEI U,UTACS
19083         BLT U,UTACS+U-1
19084         MOVE P,UTCPDP
19085 IFN NUNITS,[
19086 IFE NEWDTP,[
19087         CONSZ DC,6
19088          JRST PIPOS     ;HAS CHNL >1
19089 PIPX:
19090 ]
19091 IFN NEWDTP,[
19092         SKIPGE CUINT
19093          JRST UTCB0
19094 ]
19095 ];IFN NUNITS
19096 IFN IMPP,[      ; See if it's an IMP interface interrupt
19097 IFN KAIMP,[
19098         CONI IMP,TT
19099         LDB A,[000300,,TT]
19100         CAIE A,NETCHN
19101          JRST UTCB2
19102         TRNE TT,IMPLW+IMPHER+IMPERR+IMPOD+IMPID
19103 ]
19104 IFN DMIMP,[
19105         CONI FI,TT
19106         TRNN TT,70      ;CHECK PIA
19107          JRST UTCB2     ;DO NOT PROCESS IF NO PIA
19108         TRNE TT,FILW+FIDOWN+FIWASD+FIOD+FIID
19109 ]
19110          JRST IMPINT
19111 UTCB2:] ;IFN IMPP
19112
19113 IFN DC10P,[
19114         CONI DC0,TT
19115         TRNE TT,DPIRQC
19116          JRST QINT
19117 ]
19118 IFE KA10P, CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS
19119 IFN T300P,[
19120         SKIPE DSCDON
19121          JRST T3INT
19122 ];T300P
19123 IFN RP10P,[
19124         CONI DPC,TT
19125         TRNE TT,7
19126          TRNN TT,10     ;IF BIT IS ON IT IS INTERRUPTING - LET QINT HAVE IT
19127           SKIPGE QGTBZY
19128            JRST QINT
19129 ]
19130 IFN RH10P,[
19131         CONI DSK,TT
19132         TRNN TT,%HIDON+%HIATN   ;INTERRUPTING HARDWARILY
19133          SKIPGE QGTBZY          ;INTERRUPTING SOFTWARILY
19134           JRST QINT
19135 ]
19136 IFN TM10P,[
19137         CONI MTC,A
19138         CONI MTS,C
19139         LDB TT,[030300,,A]
19140         CAIE TT,MTCCHN
19141          JRST UTCBK2
19142         TRNN C,100      ;IF NOT JOB DONE
19143          TRZ C,30000    ; THEN DON'T BELIEVE PAR ERR OF EOF
19144         TRNN A,400      ;IF NEXT UNIT NOT ENABLED
19145          TRZ C,2        ;THEN TURN OFF NEXT UNIT FLAG
19146         TRNE C,440302   ; UNIT HUNG, ILLEGAL, BAD TAPE (UGH), LOAD NEXT UNIT, JOB DONE
19147          JRST MGHBRK
19148 UTCBK2: SKIPN MGTBZY    ; SOFT WARE CALL
19149          JRST MGSBRK
19150 ]
19151 IFN NUNITS,     JRST UTCB0
19152
19153 POPRET:
19154 IFN NUNITS,[
19155         MOVE A,TIME
19156         MOVEM A,LUTOTM
19157 ]
19158 DSKEX:
19159 IMPEX:
19160 MGEX:   MOVSI U,UTACS
19161         BLT U,U
19162         JRST 12,@UTCBRK
19163
19164 ] ;IFE KS10P
19165
19166 IFN KS10P,[
19167
19168 UTCBRK: 0                       ; Still EBLK'ed from previous page...
19169 BBLK
19170         MOVEM U,UTACS+U
19171         MOVEI U,UTACS
19172         BLT U,UTACS+U-1
19173         MOVE P,UTCPDP
19174         CONO PI,020000+200_<-UTCCHN>    ;BAG-BITING DEC LOSERS
19175 IFN KSIMP,[
19176         AOSN IMPBZY             ;-1 if IMP wants a jump-start
19177          PUSHJ P,IMPINT
19178 ]
19179 IFN RH11P,[
19180         SKIPGE QGTBZY
19181          JRST QINT
19182 ] ;RH11P
19183 IFN TM03S,[
19184         SKIPN MGTBZY
19185          JRST MGSBRK
19186 ]
19187 IMPEX:
19188 MGEX:
19189 DSKEX:  MOVSI U,UTACS
19190         BLT U,U
19191         JRST 12,@UTCBRK
19192
19193 ;;; Interrupt routines that are directly dispatched to by the KS10/Unibus
19194 ;;; interrupt kludge should do JSR UTCSAV as their very first instruction.
19195 ;;; The word before the JSR is expected to contain the interrupted PC.
19196 ;;; They should then exit through DSKEX just like everybody else.
19197
19198 EBLK
19199 UTCSAV: 0
19200 BBLK
19201         MOVEM U,UTACS+U
19202         MOVEI U,UTACS
19203         BLT U,UTACS+U-1
19204         MOVE P,UTCPDP
19205         MOVE U,UTCSAV
19206         MOVE TT,-2(U)
19207         MOVEM TT,UTCBRK
19208         JRST (U)
19209
19210 ] ;KS10P
19211 \f
19212 $INSRT SYSJOB           ;SYSTEM JOB AND RELATED STUFF
19213
19214
19215 SUBTTL DCHNTB AND DCHNTC
19216
19217 EBLK
19218 CHSPUR: BLOCK 8         ;NUM OF SPURIOUS INTS PER CH (ZERO = DCHK)
19219 BBLK
19220
19221 IFE KS10P,[     ; KS10 doesn't even pretend to have devices.
19222
19223 ;***** DCHNTB *****
19224 ;4.9 = KNOWN DEVICE
19225 ;4.8 = HAS PIA 2
19226 ;4.7-4.4 PIA 2 SHIFT
19227 ;4.3-4.1 PIA 2 ACTIVE VALUE
19228 ;3.9 = PIA 2 MAY BE ZERO
19229 ;3.8 = HAS PIA 1
19230 ;3.7-3.4 PIA 1 SHIFT
19231 ;3.3-3.1 PIA 1 ACTIVE VALUE
19232 ;2.9 = PIA 1 MAY BE ZERO
19233 ;2.8 = ALLOW USER DATAI, BLKI
19234 ;2.7 DATAO, BLKO
19235 ;2.6 CONI, CONSO, CONSZ
19236 ;2.5 CONO
19237 ;2.4 SPECIAL KL10 DEVICE, BLKI/BLKO ARE DATAI/DATAO TO A SECOND DEVICE REGISTER
19238 ;1.6-1.1=N, IF NON ZERO: IGNORE DEV UNLESS CONI BIT N-1 IS ON
19239                 ;(IF DSDEV PRESENT)
19240
19241 ;***** DCHNTC *****
19242 ;4.9 = SUSPICIOUS DEVICE
19243 ;4.8 = FOUND CLOBBERED
19244 ;4.7 = SUSPECTED OF CAUSING SPURIOUS INTS
19245 ;4.6-4.4 = CHANNEL CAUSING INTS ON
19246 ;3.9-3.1 = SUSPICION COUNT
19247 ;2.9-1.1 = CONI
19248
19249 DCHNTB:
19250 IFE KL10P,[
19251         400200+APRCHN,,240000   ;0 APR
19252         SETZ                    ;4 PI
19253 ]
19254 IFN KL10P,[
19255         400200+APRCHN,,250000   ;0 APR (ALLOW DATAI, "BLKI", CONI)
19256         SETZ 010000             ;4 PI (ALLOW NOTHING)
19257 ]
19258
19259 DEFINE DCHENT D,W
19260 LOC DCHNTB+D_-2
19261         W
19262         TERMIN
19263
19264 IFN KL10P,[
19265         DCHENT PAG,SETZ 240000          ;ALLOW DATAI, CONI, BUT NOT "BLKI"
19266         DCHENT CCA,SETZ                 ;ALLOW NOTHING
19267 ;XCTR of some of the instructions for these devices fails to relocate
19268 ;the address to user space, due to bugs in the hardware.  Flush 'em.
19269 ;       DCHENT TIM,SETZ 250000          ;ALLOW DATAI, "BLKI", CONI
19270 ;       DCHENT MTR,[400201,,250000]     ;INTERVAL TIMER PIA=1.  ALLOW DI,BI,CI
19271         DCHENT TIM,SETZ                 ;20 ALLOW NOTHING
19272         DCHENT MTR,SETZ                 ;24 ALLOW NOTHING
19273         DCHENT 30,SETZ                  ;30 RESERVED
19274 ]
19275 IFN DSDP,       DCHENT DSDEV,[REPEAT 2,400200+DSDCHN,,440000]   ;20,24
19276 IFN DL10P,[     DCHENT DLB,SETZ 240000                  ;60 DL10
19277                 DCHENT DLC,[400200+TTYCHN,,240000]      ;64 DL10
19278 ]
19279 IFN STKP,       DCHENT STK,[400200+LPTCHN,,440000]      ;70 STK
19280 IFN PTRP,       DCHENT PTP,[400200+PCHCHN,,440000]      ;100 PTP
19281 IFN PTRP,       DCHENT PTR,[400200+PTRCHN,,440000]      ;104 PTR
19282 IFN NOTYS,      DCHENT TTY,[400200+TTYCHN,,40000]       ;120 TTY
19283 IFN OLPTP,      DCHENT OLPT,[400200+LPTCHN,,440000]     ;124 OLPT
19284 IFN 340P,       DCHENT DIS,[630600+DISCHN+SDCHN_9,,440001]      ;130 DIS
19285 IFN E.SP,       DCHENT DIS,[400200+DISCHN,,440000]              ;130 E&S
19286 IFN KL10P,      DCHENT DTE,[400200+IFE PDCLKP,[APRCHN].ELSE [TTYCHN],,240000] ;200 DTE20
19287 IFN RP10P,      DCHENT DPC,[400200+DSKCHN,,440000]      ;250 DPC
19288 IFN RH10P,      DCHENT DSK,[400200+DSKCHN,,040000]      ;270 RH10
19289 IFN NUNITS,[
19290 IFE NEWDTP,[
19291                 DCHENT DC,[400000,,440000]      ;200 DC
19292                 DCHENT UTC,[400200+UTCCHN,,440000]      ;210 UTC
19293                 DCHENT UTS,[SETZ 40000]         ;214 UTS
19294 ]
19295 IFN NEWDTP,[
19296                 DCHENT DTC,[630600+UTCCHN+DCCHN_9.,,440000]     ;320
19297                 DCHENT DTS,[SETZ 40000] ;324
19298 ]
19299 ]               ;END OF IFN NUNITS
19300 IFN TM10P,[
19301                 DCHENT MTC,[400230+MTCCHN,,440001]      ;340 MTC
19302                 DCHENT MTS,[SETZ 40001]                 ;344 MTS
19303 ]
19304 IFN MTYP,       DCHENT MTY,[400200+TTYCHN,,40000]       ;400 MORTON BOX
19305                                                         ;420 SPACEWAR CONSOLES
19306 IFN DMIMP,      DCHENT FI,[400230+NETCHN,,400000]       ;424 DM IMP HARDWARE
19307 IFN NDAP,       DCHENT 454,[400200,,760000]             ;454 D/A
19308 IFN KAIMP,      DCHENT IMP,[400000,,400001]     ;460 AI-KA/ML-KA/MC-KL IMP
19309                                                 ; HARDWARE THIS SAYS IMP
19310                                                 ; HAS NO PIA BECAUSE IT
19311                                                 ; CHANGES
19312 IFN NLPTP,      DCHENT NLPT,[400200+LPTCHN,,440000]     ;464 NEW LPT
19313 IFN CH10P,      DCHENT CHX,[400200+CHXCHN,,040000]      ;470 CHAOSNET
19314 IFE KL10P,      DCHENT 500,[400000,,240000]             ;500 ML-KA, DM CALENDAR; AI-KA R CLK
19315 IFN KL10P&PDCLKP,DCHENT 500,[400200+APRCHN,,240000]     ;500 MC-KL F CLK
19316 IFN ARMP,       DCHENT TIPDEV,[400200+TIPBCH,,440000]   ;504 ARM TIP BREAK
19317 IFE MCOND AIKA, DCHENT 510,[400000,,360000]             ;510 ANOTHER D/A??
19318                         ;DOES ANYONE KNOW WHAT DEVICE 510 IS??
19319 IFN RBTCP,      DCHENT RBTCON,[400200+TABCHN,,440001]   ;514 ROBOT CONSOLE
19320 IFN ARMP,       DCHENT 564,[400200,,440000]             ;564 ARM TACTILE SENSE
19321 IFN OMXP,       DCHENT OMPX,[400200+OMPCHN,,440001]     ;570 OMX
19322 IFN IMXP,       DCHENT MPX,[SETZ 40001]                 ;574 IMX
19323 ;Comment this out since the AI-KA one is no longer on the bus
19324 ;IFN TK10P,     DCHENT NTY,[400200+TTYCHN,,40000]       ;600 NTY
19325 IFN NTYP,       DCHENT NTY,[400200+NTYCHN,,40000]       ;    NTY FOR 11 KLUDGE
19326 IFN DPKPP,      DCHENT DPK,[400200+TTYCHN,,40000]       ;604 DATAPOINT KLUDGE
19327 IFN DC10P,[
19328                 DCHENT DC0,[400200+DSKCHN,,40000]       ;610 DC0
19329                 DCHENT DC1,[400000,,]                   ;614 DC1
19330 ]
19331 IFN VIDP,       DCHENT NVDX,[REPEAT 4,400200+NVDCHN,,440001]    ;620-634 BAT
19332 IFN PLTP,       DCHENT PLT,[400200+PLTCHN,,440000]      ;654 PLT
19333                 DCHENT 704,[400000,,440000]             ;704 ???
19334 IFN HCLKP,[
19335                 DCHENT CLK1,[400200,,240000]            ;710 CLK1
19336                 DCHENT CLK2,[SETZ 40000]                ;714 CLK2
19337 ]
19338 LOC DCHNTB+127.
19339 EBLK
19340 DCHNTC: BLOCK 128.
19341 DCACS:  BLOCK 20        ;SAVE ACS
19342 CCSDEV: 0               ;+ => SOME SUSPICIOUS DEVICES
19343 BBLK
19344 \f
19345 DCHK:   0       ;TO CALL FROM DDT
19346         MOVEM 17,DCACS+17
19347         MOVEI 17,DCACS
19348         BLT 17,DCACS+16
19349         MOVEI J,0
19350         JSP E,SPUR
19351         SKIPN W
19352          AOS DCHK
19353         MOVEI 17,DCACS
19354         BLT 17,17
19355         JRST @DCHK
19356
19357 ;CHECK FOR CLOBBERED DEVS, CALL WITH JSP E,
19358 CHECK:  JSP H,DCSTUP
19359 CHECK1: SKIPL TT,DCHNTB(I)
19360          JRST CHECK4    ;UNKNOWN DEVICE
19361 IFN DSDP,[
19362         TRNN TT,77
19363          JRST CHECK2
19364         ANDI TT,77
19365         JSP H,DCCONI
19366         LSH B,-1(TT)
19367         JUMPGE B,CHECK4
19368         MOVE TT,DCHNTB(I)
19369 ]
19370 CHECK2: JSP H,DCCONI
19371         TLNN TT,200     ;SKIP IF PI TO TEST
19372          JRST CHECK4
19373         LDB T,[250400,,TT]      ;GET SKIP
19374         MOVEI Q,7
19375         LSH Q,(T)
19376         AND B,Q
19377         LDB Q,[220300,,TT]      ;GET CHANNEL
19378         LSH Q,(T)
19379         CAME B,Q
19380          JRST CHECK5
19381 CHECK3: LSH TT,-9       ;SHIFT TO PIA2
19382         JRST CHECK2
19383
19384 CHECK5: JUMPN B,CHECKL  ;JUMP IF NONZERO AND WRONG
19385         TRNE TT,400000  ;SKIP IF CAN NOT BE ZERO
19386          JRST CHECK3    ;ZERO OK
19387         JRST CHECKL
19388
19389 CHECK4: ADD A,[400,,]   ;INCREMENT DEVICE CODE
19390         AOBJN I,CHECK1
19391 SPURCX: SKIPE C
19392          BUG PAUSE,[BITS ],OCT,C,[MAY BE STUCK ON IN I/O BUS]
19393         MOVSI T,SCLCK5
19394         SKIPE W         ;SKIP IF NO TROUBLE DETECTED
19395          IORM T,SUPCOR
19396         JRST (E)
19397
19398 DCSTUP: MOVE A,[CONI B] ;SET UP
19399         MOVEI W,0
19400         MOVNI C,1
19401         MOVSI I,-128.
19402         JRST (H)
19403 \f
19404 DCCONI: XCT A
19405         AND C,B
19406         SKIPL DCHNTC(I) ;SKIP IF DEVICE ALREADY SUSPICIOUS,SAVES FIRST SUSPICIOUS
19407         HRRM B,DCHNTC(I)        ;STORE AWAY CONI
19408         JRST (H)
19409
19410 CHECKL: JSP H,DCSAOS
19411         MOVSI T,600000  ;CLOB
19412         IORM T,DCHNTC(I)
19413         JRST CHECK3
19414
19415 DCSAOS: MOVE D,A        ;MAKE A CONO
19416         TDZ D,[40,,-1]
19417         SKIPL T,DCHNTB(I)       ;SKIP IF KNOWN DEV
19418         JRST DCSAS2     ;JUST RESET UNKNOWN TO ZERO
19419         TLNE T,200000   ;SKIP IF NO PIA2
19420         TLNE T,400      ;SKIP IF PIA2 CAN NOT BE ZERO
19421         JRST DCSAS1
19422         LDB TT,[330300,,T]      ;GET PIA2
19423         LDB T,[360400,,T]       ;GET PIA2 SHIFT
19424         LSH TT,(T)
19425         IOR D,TT                ;ADD CORRECT CANNEL TO CONO
19426         MOVE T,DCHNTB(I)        ;SKIP IF NO PIA1
19427 DCSAS1: TLNE T,200      ;SKIP IF PIA1 CANNOT BE ZERO
19428         TRNE T,400000
19429         JRST DCSAS2
19430         LDB TT,[220300,,T]      ;GET P1A 1
19431         LDB T,[250400,,T]       ;GET PIA 1 SHIFT
19432         LSH TT,(T)              ;OR IN PIA 1
19433         IOR D,TT                ;ZAP
19434 DCSAS2: XCT D
19435         HLRZ T,DCHNTC(I)
19436         TLNN T,300000
19437          AOS W  ;THIS MAY BE THE CAUSE OF OUR TROUBLES
19438         ANDI T,777
19439         AOS T
19440         AOS CCSDEV
19441         CAILE T,777
19442          SOJA T,[JRST 4,.+1]    ;LOSEY LOSEY
19443         DPB T,[221100,,DCHNTC(I)]
19444         JRST (H)
19445
19446 ;CHANNEL IN J SPURIOUS INTERRUPT ON, CALL WITH JSP E,
19447 SPUR:   SKIPL J
19448          CAIL J,10
19449           JRST 4,SPUR1
19450         AOS U,CHSPUR(J)
19451 SPUR1:  MOVE U,E
19452         JSP E,CHECK
19453         MOVE E,U
19454         JSP H,DCSTUP
19455 SPUR2:  SKIPGE TT,DCHNTB(I)
19456          JRST SPUR4
19457         JSP H,DCCONI
19458         JUMPGE B,SPUR4
19459         JSP H,DCSAOS
19460         MOVSI T,500000
19461         IORM T,DCHNTC(I)
19462         DPB J,[360300,,DCHNTC(I)]
19463 SPUR4:  ADD A,[400,,]
19464         AOBJN I,SPUR2
19465         JRST SPURCX
19466
19467 ] ;IFE KS10P
19468 \f
19469 IFN KS10P,[
19470
19471 SUBTTL KS10 UNIBUS
19472
19473 DEFINE UBINT VEC,-REST
19474 .VEC.==<VEC>
19475 IFN .VEC.&3, .ERR Bogus interrupt vector: VEC
19476 .VEC.==.VEC./4
19477 IFL .VEC.-.MIN., .MIN.==.VEC.
19478 IFG .VEC.-.MAX., .MAX.==.VEC.
19479 IF2,[
19480 LOC .BAS.+.VEC.
19481         REST
19482 ];IF2
19483 TERMIN
19484
19485 NUBIDV==0
19486
19487 DEFINE UBIDV VEC
19488 .VEC.==<VEC>
19489 CONC [UB]\NUBIDV,NM==:<.UBA.,,.VEC.>
19490 CONC [UBINT .VEC., JSR UB]\NUBIDV,BK
19491 NUBIDV==NUBIDV+1
19492 TERMIN
19493
19494 ;;;
19495 ;;; Interrupt table for Unibus Q.
19496 ;;;
19497 UBAQIT:
19498 .UBA.==UBAQ
19499 .MIN.==777777
19500 .MAX.==0
19501 IF2, .BAS.==UBAQIB
19502
19503 UBINT PHVEC, JSR DSKBRK         ; RH11 FOR DISK
19504
19505 UBAQIB==:UBAQIT-.MIN.
19506 LOC UBAQIB+.MAX.+1
19507
19508 ;;;
19509 ;;; Interrupt table for Unibus I.
19510 ;;;
19511 UBAIIT:
19512 .UBA.==UBAI
19513 .MIN.==777777
19514 .MAX.==0
19515 IF2, .BAS.==UBAIIB
19516
19517 IFE TM03S, UBIDV 224            ; Tape
19518 UBIDV 300                       ; NI1010 In
19519 UBIDV 304                       ; NI1010 Out
19520 IFL DZ11NB-4,[
19521 REPEAT 4-DZ11NB,[
19522 UBIDV 340+<10*<DZ11NB+.RPCNT>>  ; DZ In
19523 UBIDV 344+<10*<DZ11NB+.RPCNT>>  ; DZ Out
19524 ]]
19525
19526 IFN TM03S,[
19527 UBINT %TMVEC, JSR MGHBRK        ;RH11 FOR TAPE
19528 ]
19529
19530 REPEAT DZ11NB,[
19531 UBINT 340+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,RB   ; DZ receive
19532 UBINT 344+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,XB   ; DZ transmit
19533 ];REPEAT DZ11NB
19534
19535 IFN KSIMP,[
19536 UBINT %LHVEC, JSR IMPIBK        ;IMP Input side break
19537 UBINT %LHVEC+4, JSR IMPOBK      ;IMP output side break
19538 ]
19539
19540 IFN CH11P,[
19541 UBINT 270, JSR CHXBKH           ; Usual Chaosnet vector
19542 UBINT 230, JSR CHXBKH           ; Except some interrupt here instead
19543 ];CH11P
19544
19545 UBAIIB==:UBAIIT-.MIN.
19546 LOC UBAIIB+.MAX.+1
19547
19548 ;;; Assignment of pages in Unibus pager for DMA devices.
19549 ;;; All of the Q UBA is statically assigned. The lower half of the I
19550 ;;; UBA is statically assigned, while slots in the upper half of the I UBA
19551 ;;; are assigned dynamically by the UBAASL routine and freed by the
19552 ;;; UBAFSL routine below.
19553 ;;;
19554 ;;; Note that static pages are 2000 PDP-10 words long (ITS sized) rather
19555 ;;; than 1000 (DEC sized).  Each page here thus occupies -two- locations in
19556 ;;; the Unibus pager.  There are 32. such pages on the Q Unibus and 16.
19557 ;;; such pages on the I unibus.
19558 ;;;
19559 ;;; Slots handed out by UBAASL are good for mapping 1000 PDP-10 words
19560 ;;; (one DEC page, and coincidentally the size of a network buffer).
19561 ;;; The number obtained from UBAASL is a direct index into the UBA
19562 ;;; paging RAM, and will range from 32. to 63.
19563 ;;;
19564 ;;; This two different page size thing is all a mess and I should fix it
19565 ;;; sometime.
19566 ;;;
19567 ;;; Unibus Q:
19568 QUBPG==:5                       ; Chosen at random.
19569
19570 ;;; Unibus I:
19571
19572 ;;; Static pages
19573 IFN TM03S,[
19574 IUTPG==:5                       ;Magtape IO page. well, 5 worked last time
19575 ]
19576
19577 IFN KSIMP,[
19578 IUIMPG==:6                      ;IMP Data transfer page
19579 ]
19580
19581 ;;; Dynamic pages
19582
19583 EBLK
19584 UBAIFS: 777777777760            ;Slot map, bit on if free
19585 BBLK
19586
19587 ; Allocate a UBA I slot
19588 ; Return +1, A/ slot index
19589
19590 UBAASL: PUSH P,B
19591         CONO PI,PIOFF
19592         MOVE A,UBAIFS
19593         JFFO A,UBASL1
19594         CONO PI,PION
19595         POP P,B                 ;Clean up for no good reason
19596         BUG HALT,[Out of UBA slots]
19597
19598 UBASL1: MOVNS B
19599         MOVSI A,400000
19600         LSH A,B                 ;A/ bit to snarf
19601         ANDCAM A,UBAIFS
19602         CONO PI,PION
19603         MOVN A,B        
19604         ADDI A,32.              ;First dynamic slot
19605         POP P,B
19606         POPJ P,
19607
19608 ; Deallocate the UBA slot in A
19609 ; A/ UBA index to free. Bashes A,TT
19610 UBAFSL: CAIL A,32.
19611          CAIL A,64.
19612           BUG HALT,[Bad UBA index],OCT,A        ;Paranoid for now
19613         MOVEI A,-32.(A)
19614         MOVNS A
19615         MOVSI TT,400000
19616         LSH TT,A
19617         IORM TT,UBAIFS
19618         POPJ P,
19619 \f
19620 SUBTTL UBI DEVICE
19621
19622 UBIDVS::
19623 REPEAT NUBIDV,[
19624 EBLK
19625         0                       ; Bit in -7(I)
19626         -1                      ; User or -1 in -6(I)
19627         0                       ; Count in -5(I)
19628         0                       ; Saved I in -4(I)
19629 CONC UB,\.RPCNT,BK:
19630         0
19631 BBLK
19632         MOVEM I,.-2
19633         JSP I,UBIBRK
19634 CONC UB,\.RPCNT,DV:
19635         JRST 12,@<CONC UB,\.RPCNT,BK>
19636         CONC UB,\.RPCNT,NM      ; Name in 1(I)
19637 IFE .RPCNT, LUBIDV==:.-UBIDVS
19638 ];REPEAT NUBIDV
19639
19640 UBINAM==:1
19641 UBISVI==:-4
19642 UBICNT==:-5
19643 UBIUSR==:-6
19644 UBIBIT==:-7
19645
19646 UBIBRK: AOS UBICNT(I)
19647         EXCH U,UBIUSR(I)
19648         JUMPL U,UBIBK9
19649         EXCH T,UBIBIT(I)
19650         TDNE T,MSKST2(U)
19651          IORM T,IFPIR(U)
19652         EXCH T,UBIBIT(I)
19653 UBIBK9: EXCH U,UBIUSR(I)        
19654         HRLI I,UBISVI(I)
19655         JRA I,(I)
19656
19657 EBLK
19658 UBISW:  -1 ? 0
19659 BBLK
19660
19661 ; .OPEN
19662 UBIO:   MOVEI T,NUBIDV
19663         SKIPA I,[UB0DV]
19664 UBIO1:   MOVEI I,LUBIDV(I)
19665         CAME A,UBINAM(I)
19666          SOJG T,UBIO1
19667         JUMPLE T,OPNL4          ; FILE NOT FOUND
19668         PUSHJ P,SWTL
19669             UBISW
19670         SKIPL UBIUSR(I)
19671          JRST OPNL23            ; FILE LOCKED
19672         MOVEI T,(R)
19673         SUBI T,IOCHNM(U)
19674         MOVE T,CHNBIT(T)
19675         MOVEM T,UBIBIT(I)
19676         HRRZM U,UBIUSR(I)
19677         HRLZI T,(I)
19678         HRRI T,DNUBI
19679         MOVEM T,(R)
19680         JRST LSWPJ1
19681
19682 ; .IOPUSH/.IOPOP
19683 UBIIOP: HLRZ A,(R)
19684         JUMPE I,UBIOP7
19685         SUBI R,IOCHNM(U)
19686         SKIPA R,CHNBIT(R)
19687 UBIOP7:  SETZI R,
19688         MOVEM R,UBIBIT(A)
19689         POPJ P,
19690
19691 ; .CALL WHYINT
19692 UBIWHY: MOVE B,UBICNT(A)
19693         MOVEI A,%WYUBI
19694         JRST POPJ1
19695
19696 ; .CALL RFNAME
19697 UBIRCH: MOVE B,UBINAM(A)
19698         POPJ P,
19699
19700 ; .CLOSE
19701 UBICL:  SETOM UBIUSR(A)
19702         POPJ P,
19703
19704 ] ;KS10P
19705 \f
19706 SUBTTL OVERHEAD METERING ROUTINE
19707
19708 IFN KL10P,[
19709
19710 EBLK
19711 ;TABLE OF OVERHEAD REGIONS.  ENTRY IS SIXBITNAME,,PC ? COUNT
19712         0       ;COUNTS STUFF BEFORE FIRST OVHMTR MACRO
19713 OVHTBL: OVHTAB
19714         'USR,,-1
19715         0       ;COUNTS USER-MODE PC'S
19716 LOVHTB==.-OVHTBL
19717
19718 ;COME HERE ON PI CHANNEL 1 EVERY 39 MILLISECONDS
19719 OVHSVA: 0
19720 OVHSVB: 0
19721 OVHBRK: 0
19722 BBLK
19723         CONO TIM,060000+3900.   ;CLEAR DONE
19724         EXCH T,OVHBRK           ;GET PC INTERRUPTED OUT OF
19725         TLNE T,%PSUSR           ;ONLY METER IF EXEC MODE
19726          JRST OVHBRX
19727         MOVEM A,OVHSVA
19728         MOVEM B,OVHSVB
19729         MOVSI A,-LOVHTB
19730 OVHBR1: HRRZ B,OVHTBL(A)
19731         AOBJN A,.+1             ;2-WORD ENTRIES
19732         CAIG B,(T)              ;SKIP IF PC LIES IN PREVIOUS REGION
19733          AOBJN A,OVHBR1
19734         SKIPGE A                ;IN CASE T = 777777
19735          AOS OVHTBL-2(A)        ;AOS PREVIOUS REGION'S COUNT
19736         MOVE B,OVHSVB
19737         SKIPA A,OVHSVA
19738 OVHBRX:  AOS OVHTBL+LOVHTB-1    ;AOS COUNT OF USER-MODE PC's
19739         EXCH T,OVHBRK
19740         JRST 12,@OVHBRK
19741 ];KL10P
19742 \f
19743 IFN KS10P,[
19744 RDPCST=DATAI 14,                ;INSTRUCTIONS FOR PC SAMPLING TABLE
19745 WRPCST=DATAO 14,
19746
19747 ;TABLE OF OVERHEAD REGIONS.  ENTRY IS PC,,SIXBITNAME
19748 OVHTB1: 0,,'LOW                 ;LOWER FENCE
19749         OVHTAB
19750         377777,,'USR            ;UPPER FENCE
19751 LOVHTB==.-OVHTB1
19752 REPEAT <1_<36.-<.LZ <LOVHTB-1>>>>-LOVHTB, 377777,,-1  ;PAD TO POWER OF TWO SIZE
19753
19754 EBLK
19755
19756 OVHTB2: BLOCK LOVHTB            ;CORRESPONDING COUNTS (LAST IS FOR USER MODE)
19757
19758 OVHCNT: 28.                     ;COUNTER TO SLOW THINGS DOWN TO CUT OVERHEAD
19759
19760 LOVHPC==100                     ;64 SAMPLES SHOULD BE ENOUGH
19761 OVHPCS: BLOCK LOVHPC
19762
19763 BBLK
19764
19765 ;CALCULATE OVERHEAD USING PC SAMPLE TABLE
19766 ;CLOBBERS A,B,C
19767 OVHCLK: SOSL OVHCNT             ;TIME TO DO IT YET?
19768          JRST OVHCL9            ;NO, IGNORE THESE SAMPLES
19769         MOVEI A,28.             ;SEE ONLY ONE SAMPLE OUT OF EVERY 29 ON AVERAGE
19770         MOVEM A,OVHCNT          ;SO TIME SPENT IN THIS ROUTINE IS NOT EXCESSIVE
19771         RDPCST C                ;SEE HOW FULL THE PC SAMPLING TABLE IS
19772         HRLOI C,-OVHPCS-1(C)
19773         EQVI C,OVHPCS           ;AOBJN POINTER TO SAMPLES ACTUALLY TAKEN
19774         JUMPGE C,OVHCL9         ;NONE
19775         CAMGE C,[-LOVHPC,,OVHPCS]
19776          JRST OVHCL9            ;BOGUS AOBJN POINTER, MAYBE PCST NOT TURNED ON
19777 OVHCL1: MOVE A,(C)              ;NEXT SAMPLED PC
19778         TLNE A,%PSUSR           ;ONLY SEARCH TABLE IF EXEC MODE
19779          JRST OVHCL8            ;ALL USER MODE PC'S ARE COUNTED IN LAST BUCKET
19780         HRLO A,A                ;-1 IN RH IS GREATER THAN ANY SIXBIT
19781         MOVEI B,1_<35.-<.LZ <LOVHTB-1>>>        ;HALF THE SIZE OF THE TABLE
19782 REPEAT <36.-<.LZ <LOVHTB-1>>>,[ ;LOG SEARCH
19783         CAMG A,OVHTB1(B)        ;NOT CAMGE BECAUSE OF PADDING AT END
19784          SUBI B,1_<35.-.RPCNT-<.LZ <LOVHTB-1>>>
19785         ADDI B,1_<34.-.RPCNT-<.LZ <LOVHTB-1>>>
19786 ]
19787         LOC .-1                 ;OPTIMIZE OUT ADDI B,0
19788         AOSA OVHTB2(B)
19789 OVHCL8:  AOS OVHTB2+LOVHTB-1
19790         AOBJN C,OVHCL1
19791 OVHCL9: WRPCST [-LOVHPC,,OVHPCS]        ;TURN ON / RESTART PC SAMPLING
19792         POPJ P,
19793 ];KS10P
19794
19795 ;HERE IS A TABLE OF REGISTERED 3-LETTER OVERHEAD REGION CODES
19796
19797 ;ALC - ALLOCATE CORE PAGE FRAME
19798 ;CHx - CHAOSNET STUFF (VARIOUS VALUES OF x)
19799 ;FLT - MISCELLANEOUS FAULTS
19800 ;IMP - ARPANET INTERRUPT (NOT STYNET)
19801 ;LOW - LOW CORE, BEFORE FIRST OVHMTR MACRO & PCS IN UPPER HALF OF EXEC SPACE
19802 ;NET - ALL NETWORKS, ALL PI LEVELS, NOT OTHERWISE ACCOUNTED FOR
19803 ;PGF - PAGE FAULT
19804 ;PPI - PPIUM
19805 ;QIN - DISK INTERRUPT LOW LEVEL
19806 ;QSC - DISK INTERRUPT HIGH LEVEL, DISK SCHEDULER
19807 ;SC1 - SCHEDULER 1 - ENTRY
19808 ;SC2 - SCHEDULER 2 - SEARCH
19809 ;SC3 - SCHEDULER 3 - EXIT
19810 ;SC4 - SCHEDULER 4 - UNSWAPBLOCK
19811 ;SLW - SLOW CLOCK
19812 ;SWF - SWAP FIND NEW USER (SWAPOUT SCHEDULER)
19813 ;SWP - SWAP PAGE
19814 ;SWS - SWAP SCHEDULER
19815 ;SWU - SWAP USER
19816 ;TTI - TTY INPUT INTERRUPT LEVEL
19817 ;TTO - TTY OUTPUT INTERRUPT LEVEL
19818 ;TTY - MISC TTY CODE
19819 ;USR - USER MODE
19820 ;UUO - UUO LEVEL, MISCELLANEOUS ROUTINES, AND TOTAL MISCELLANY
19821 ;WS - WORKING SET & SWAP-BLOCK ENTRY CODE
19822 \f
19823 SUBTTL PC LSR TEST FEATURE
19824
19825 ;CALLED BY PCLT MACRO
19826 ;WHICH ASSEMBLES
19827 ;SKIPE PCLDBM
19828 ;PUSHJ P,PCLTST
19829
19830 PCLTST: PUSH P,U
19831         MOVE U,PCLIDX
19832         MOVEM U,PCLHT
19833         MOVE U,USER
19834         CAME U,PCLUSR
19835         JRST POPUJ
19836 PCLX:   CAIA    ;PATCH IN OTHER CHECKS (SHOULD JRST POPUJ TO IGNORE)
19837         MOVE U,USER     ;PATCH ROUTINE MAY CLOBBER U
19838         AOSN PCLNXT
19839         JRST PCLT1      ;FOUND PLACE, CAUSE PCLSR
19840         HRRZ U,-1(P)
19841         CAME U,PCLL
19842         JRST POPUJ      ;NOT MARK (NOT AT RIGHT LOCN)
19843         HRRO U,USER     ;4.9 U FLAG 
19844 PCLT1:  PUSH P,A        ;COMPUTE HASH ADR OF RETURNS ON PDL
19845         PUSH P,B
19846         PUSH P,C
19847         HRREI A,-USRSTG(P)
19848         JUMPL A,PCLT1A  ;SYS JOB'S PDL?
19849         IDIVI A,LUBLK
19850         IMULI A,LUBLK
19851         MOVEI A,USRPDL(A)       ;GET START OF USERS PDL IN A
19852 PCLT3:  HRRZ B,(A)
19853         JUMPE B,PCLT2
19854         CAIL B,HSYSCD
19855         JRST PCLT2
19856         HLRZ C,-1(B)
19857         TRZ C,37
19858         CAIE C,(PUSHJ P,)
19859         JRST PCLT2
19860         XOR B,PCLHT
19861         ROT B,1
19862         MOVEM B,PCLHT
19863 PCLT2:  CAIGE A,-2-3(P)
19864         AOJA A,PCLT3
19865         MOVE A,PCLHT    ;COMPUTED HASH
19866         JUMPGE U,PCLT4  ;GOING TO PCLSR HERE, STORE HASH AS MARK FOR NEXT TIME
19867         CAME A,PCLHSH
19868         JRST PCLT5
19869         SKIPGE PCLDBM
19870         JRST PCLT6      ;IN HOLD MODE, PCLSR HERE
19871         SETOM PCLNXT    ;FOUND MARK, PCLSR NEXT TIME
19872 PCLT5:  POP P,C
19873         POP P,B
19874         POP P,A
19875         JRST POPUJ
19876
19877 PCLT4:  MOVEM A,PCLHSH  ;STORE HASH FOR NEXT TIME
19878         HRRZ A,-3-1(P)
19879         MOVEM A,PCLL
19880 PCLT6:  CONO PI,CLKOFF
19881         MOVE B,PCLDBM
19882         MOVEI A,%PIC.Z
19883         CAIN B,1        ;DON'T ^Z.
19884         IORM A,PIRQC(U)
19885         POP P,C
19886         POP P,B
19887         POP P,A
19888         POP P,U
19889         JRST PCLME
19890
19891         PUSHJ P,PCLME1
19892 PCLME:  PUSHJ P,UFLS
19893         JRST 4,.
19894
19895 PCLME1: PUSHJ P,PCLSR
19896         JFCL
19897         JRST POPJ1
19898
19899 PCLT1A: TRNE U,-1
19900          JRST 4,.
19901         JRST 4,.        ;TEMP MODIFY END CHECK IF WANT TO WIN FOR SYS JOB
19902 \f
19903 SUBTTL ILLUO NON-RELEVANT SYSTEM CALLS
19904 IFE E.SP,[
19905         ADSTEP==URET
19906         ADCONT==URET
19907         ADWORD==URET
19908 ]
19909 IFE 340P\E.SP,[
19910         ADSTAR==URET
19911         ADCLOS==URET
19912         ADSTOP==URET
19913         ADSTL==URET
19914 ]
19915 IFE 340P,[
19916         ALTPEN==URET
19917         ANDIS==URET
19918 ]
19919 IFE VIDP,[
19920         AVSCAN==ILUUO
19921         AVSTST==ILUUO
19922 ]
19923 IFE IMXP,[
19924         APOTSET==ILUUO
19925 ]
19926 IFE PDP6P,[
19927         AIPDP==ILUUO
19928 ]
19929 IFE NMTCS,[
19930         AMTAPE==ILUUO
19931 ]
19932
19933 IFE ARMP,[
19934         AARMOV==ILUUO
19935         AARMRS==ILUUO
19936         AARMOF==ILUUO
19937 ]
19938 IFE PTRP,[
19939         AFEED==CPOPJ
19940 ]
19941 IFE RBTCP,[
19942         ARBTC==ILUUO
19943 ]
19944 IFE NETP,[
19945         ANETIM==OPNL1   ;NO SUCH DEVICE ERROR FOR SYMBOLIC SYSTEM CALLS.
19946         ANETBL==OPNL1
19947         ANETHS==OPNL1
19948 ];NETP
19949 IFE NCPP,[
19950         ANETAC==CPOPJ   ;MAKE OLD UUOS FAIL
19951         ANETIN==CPOPJ
19952 ];NCPP
19953
19954 IFE NUNITS,[
19955         AUBLAT==URET
19956         AUTNAM==URET
19957         AUINIT==URET
19958         AUDISM==URET
19959         AASSIGN==URET
19960         ADESIGN==URET
19961 ]
19962
19963 ;Here generate the table for the BUG macro.  Note that entries for
19964 ;bugs in the initialization code will appear here also!  That's
19965 ;why we have the kludgey add 10
19966 BUGTAB: BLOCK LBUGTB+10
19967 LBUGT2==.-BUGTAB
19968         0               ;Marks end of table
19969
19970 CONSTANTS
19971 HSYSCD::        ;HIGHEST SYSTEM CODE
19972 \f
19973 SUBTTL RANDOM STORAGE
19974 EBLK
19975
19976 SCHHP:  SCHHB           ;PNTR TO SCHED HIST BUFFER
19977 SCHHB:  BLOCK SSCHDB    ;SCHED HIST BUFFER
19978                         ;4.9 =1 EXEC
19979                         ;4.8 =1 QUANT TERMINATED BY PG FAULT
19980                         ;4.7-3.8  LENGTH OF RUN TIME IN 512 USEC UNITS
19981                         ;    MUST ACCOMODATE 150 MILLISECOND QUANTA
19982                         ;3.7-3.1 USER ("NUMERIC INDEX)
19983                         ;RH PC QUANT STARTED AT
19984 SWPHTP: SWPHTB
19985 SWPHTL==200
19986 SWPHTB: BLOCK SWPHTL    ;SWAPPING HISTORY TABLE
19987                         ;4.9-4.8 EVENT: 0=START LOADING, 1=FINISH LOADING, 
19988                         ;               2=SWAP OUT, 3=SWAP BLOCK
19989                         ;4.7-3.9 WORKING SET SIZE MINUS ONE (0=0)
19990                         ;3.8-3.1 USER NUMBER
19991                         ;2.9-1.1 RH(TIME)
19992         BLOCK SWPHTL    ;CORRESPONDING UTRNTM
19993
19994 PGIHTP: PGIHTB
19995 PGIHTL==200
19996 PGIHTB: BLOCK PGIHTL    ;PAGE-IN HISTORY TABLE
19997                         ;4.9 1 IF JOB WAS LOADING
19998                         ;4.7-3.9 USER VIRTUAL PAGE NUMBER
19999                         ;3.8-3.1 USER NUMBER
20000                         ;2.9-1.1 RH(TIME)
20001         BLOCK PGIHTL    ;CORRESPONDING UTRNTM
20002
20003 IFN SCHBLN,[
20004 SCHMNY: 0               ;0 DO FULL SCHEDULE, -1 NEXT "SCHEDULE" SHOULD LOOK IN SCHBTB
20005 SCHBNJ: 0               ;NUMBER OF VALID ENTRIES IN SCHBTB
20006 SCHBTB: BLOCK SCHBLN    ;RUNNABLE JOB BUFFER
20007 SCHBPR: BLOCK SCHBLN    ;PRIORITIES OF THOSE
20008 NSCHOV: 0               ;COUNT OF BUFFER OVERFLOWS
20009 ]
20010 ;TRANSLATION ENTRY _ T
20011 ;TRANLK(T) IS  MODE,,NEXT ENTRY
20012 ;MODE IS 0 IF ENTRY ON FREE LIST, ELSE NOT 0, AND
20013  ;BITS 3.1 => INPUT, 3.2 => OUTPUT, 4.9 => ATOMIC TRANSLATION (DON'T RETRANSLATE)
20014 ;NEXT-ENTRY IS -1 FOR NIL, ELSE IDX REL TRAN!X
20015 ;TRANID(T) THRU TRANIS(T) - FROM-NAMES
20016 ;TRANOD(T) THRU TRANOS(T) - TO-NAMES
20017
20018 TRANLK: REPEAT SIOMT,,,.RPCNT-1 ;GENERATE 1ST WDS, LINKED TOGETHER.
20019 TRANID: BLOCK SIOMT
20020 TRANI1: BLOCK SIOMT
20021 TRANI2: BLOCK SIOMT
20022 TRANIS: BLOCK SIOMT
20023 TRANOD: BLOCK SIOMT
20024 TRANO1: BLOCK SIOMT
20025 TRANO2: BLOCK SIOMT
20026 TRANOS: BLOCK SIOMT
20027
20028 TRANFL: SIOMT-1         ;TRANSL ENTRY FREE LIST.
20029 TRNCNT: 0               ;NUM ENTRIES IN USE.
20030 TRNREF: 0               ;NUM. READ-ONLY ACCESSES TO TRANSL LISTS.
20031 TRANSW: -1              ;SWITCH FOR WRITE REF.
20032         0
20033
20034 IFE SCHBLN,     U0P:    0       ;PRIORITY OF BEST USER SO FAR
20035
20036 USER:   -1      ;USER # OF CURRENT LOSER
20037 SYSL:   SYSB*2000
20038 LITM:   0       ;LAST TIME SYS INCREASED CORE
20039
20040 SLGIV:  BLOCK 3 ;LOGIN
20041
20042 SETSLC: 0       ;SETLOC VARIABLES
20043 SETSLQ: 0
20044 SETSU:  -1
20045
20046 SWUNAM: 0       ;SYS WRITE VARIABLES
20047 SWJNAM: 0
20048 SWFN1:  0
20049 SWFN2:  0
20050 SWFN3:  0
20051 SWMOD:  0
20052 \f
20053 DMON:   SIXBIT /DRAGON/
20054         -1      ;USER INDEX OF DEMON JOB
20055
20056 NQMFWR: 0       ;COUNT OF FILES WRITTEN ON .MAIL. - FOR MAILER DEMON TO HANG ON.
20057 IFN XGP,[
20058 NXGPFW: 0       ;COUNT OF FILES WRITTEN ON .XGPR. - FOR XGPSPL
20059 ]
20060
20061 ;DEAMON VARIABLES
20062 ;VARIABLES FOR DEAMON CODE HACK
20063 IFN DEMON,[
20064
20065 IFN TTLPTP,TPLFLG: 1    ;FLAG FOR TPL
20066
20067 DMTLL==4        ;LEGNTH OF DEAMON TABLE SLOT
20068 NODEAM==20.     ;NUMBER OF SLOTS
20069 DMLNG==NODEAM*DMTLL
20070
20071 DEMSW:  0
20072         0       ;MAIN PROG SWITCH FOR DEMON
20073 REQCNT: 1       ;COUNT OF REQUEST'S FOR SYS JOB
20074 DMTPTR: 0       ;POINTER FOR DEMSIG TO DEM TBL, AN INDEX INTO IT, TAKEN MODULO DMLNG
20075 DMLSEX: -DMLNG,,0       ;POINTER TO DEAMON TABLE AOBJN
20076 DEMCNT: <NODEAM.-1>     ;AMOUNT OF SLOTS REMAINING IN THE TABLE
20077
20078 DMBLK:  0
20079         0       ;SLOT FOR NON DEAMON LOAD VIA NUJBST
20080
20081 DMOBLK: SIXBIT /   SYS/
20082         SIXBIT /ATSIGN/
20083         0       ;BLOCK USED BY SYSTEM JOB TO CHECK OPEN
20084
20085 ;DEAMON TABLE--CONSISTS OF SLOTS OF FOUR WORDS FOR EACH DEMON
20086 ;WORD 1 CONTAINS ITS SIXIT NAME
20087 ;WORD 2 CONTAINS THE USER INDEX,-1 IF LOADING, 0 IF DOWN
20088 ;WORD 3 2 QUANTITIES IN 18 BIT 2'S COMPLEMENT--
20089 ;LH ALWAYS > = 0, IF 0 ONLY TAKES EXPLICIT REQUESTS IN > 0 A REQUEST
20090 ;RH CONTAINS THE NUMBER OF REQUESTS PENDING FOR THE DEAMON
20091 ;FOR THE DEAMON WILL BE GENERATED EVERY 2 MINUTES
20092 ;WORD 4 CONTAINS THE TIME TILL THE NEXT IMPLICIT REQUEST WILL BE GENERATED.
20093
20094
20095 DMTTBL:  SIXBIT /DEMSTR/
20096         0
20097         1       ;STARTUP DEAMON
20098         0
20099         
20100 BLOCK <NODEAM-1>*DMTLL  
20101 ]
20102 TIMOFF: -1      ;TIME SINCE MIDNIGHT IN HALF SECONDS ("TIME IN DSK FORMAT").
20103 QDATE:  -1      ;DISK FORMAT DATE: -1 => SYSTEM DOESN'T KNOW DATE, ELSE
20104                 ;BITS 3.1-3.5 HAVE DAY OF MONTH, 3.6-3.9 HAVE MONTH OF YEAR,
20105                 ;4.1-4.7 HAVE YEAR MOD 100. .
20106 QDATEI: -1      ;-1 => SYSTEM DOESN'T KNOW DATE, ELSE
20107                 ;DATE AND TIME THE DATE AND TIME WERE FIRST DETERMINED, IN DSK FORMAT.
20108 PDYTIM: -1      ;TIME SINCE BEGINNING OF YEAR IN HALF-SECONDS (BACKUP TO PDCLK)
20109 FYEAR:  0       ;YEAR (E.G. 1969.)
20110 PDTIME: 0       ;NON-ZERO => OFFSET FOR PDCLK
20111                 ;WHEN SUBTRACTED FROM PDCLK DATAI GIVES # PD-UNITS SINCE
20112                 ; BEGINNING OF YEAR
20113                 ;ONE SECOND = 60. PD-UNITS
20114                 ; Also contains similar offset for KS-10 clock in 60ths.
20115 LPDTIM: -1      ;LAST PD CLK TIME, -1 IF PD CLK NOT RUNNING OR JUST PDSET'ED
20116
20117 SUPCOR: 0       ;CONTROLS SYS JOB, SEE SYSDTB, SCOR, ETC
20118                 ;EACH BIT REQUESTS ONE FUNCTION IF SET.
20119 SUPCOP: SCLDAT+IFN DEMON,[SCLDMN],,SCRCKS
20120                 ;THIS WORD OR'D INTO SUPCOR EVERY SECOND.
20121 SCKPHS: 0       ;USED FOR COUNTING EVERY SECOND 1/2 SECOND CLOCK
20122                 ;TO SET SUPCOP BITS EVERY SECOND
20123 SYSITM: 0       ;TIME SYS JOB LAST STARTED WAITING ON SUPCOR
20124 LNETIM: 0       ;TIME AT WHICH NETWORK WAS LAST BROUGHT UP
20125 RSWTIM: 1       ;Time (in DSK format) when last checked system resources.
20126 \f
20127 MXPARS==10.     ;MAX # PAR ERRS TO PRINT OUT
20128 PARPG:  BLOCK 8 ;STORAGE OF PAGE MAP WHILE HACKING PARITY ERROR CHECK
20129 PARCNT: 0       ;# OF PAR ERROR ENTRIES IN TABLE
20130 PARCON: BLOCK MXPARS    ;CONTENTS OF BAD PARITY LOCATIONS
20131 PARADR: BLOCK MXPARS    ;ADDRESSES OF BAD PARITY LOCATIONS
20132 PARAND: -1              ;QND OF ALL BAD WORDS
20133 PARIOR: 0               ;IOR OF ALL BAD WORDS
20134 PARAAN: -1              ;AND F ALL BAD ADDRS
20135 PARAOR: 0               ;IOR OF ALL BAD ADDRS
20136 IFE KA10P,[
20137 PARPFW: 0               ;PAGE FAIL WORD
20138 PARERA: 0               ;ADDRESS OF PAR ERR
20139 PARWRD: 0               ;BAD DATA
20140 ] ;IFE KA10P
20141 IFN KL10P,[
20142 PARRSN: 0               ;0 => PAR ERR PAGE FAULT IN PROG
20143                         ;-1 => PAR ERR INTERRUPT; NEEDN'T STOP
20144                         ;THE RUNNING JOB.
20145 ] ;KL10P
20146 PARDIE: 0       ;-1 => FATAL PARITY ERROR
20147 TPLSWP: 0       ;-1 => USE OLP FOR TPL
20148 IFN PDP6P,[
20149 PDP6UP: 0       ;0 => PDP6 IS DOWN. (AS USUAL)
20150 ]
20151 IFN ECCMEM,[
20152 IFE MCOND AIKA,[
20153 ECCADR: 1,,777760       ;ECC HISTORY STARTS HERE
20154 ECCLEN==16.             ;16 LOCATIONS OF ECC HISTORY
20155 ECCIDX: 0               ;LAST LOCATION ACCESSED
20156 ]]
20157 IFN TEN11P,[
20158 TEN11F: 0       ;0 -> NORMAL
20159                 ;-1 -> COMPLETELY IGNORE 10-11 INTERFACE
20160                 ; 1 -> RESET 10-11 INTERFACE, OTHERWISE IGNORE
20161 T11ERC: 0       ;COUNT OF CONTROL PAGE RAM ERRORS
20162 T11CCN: 0       ;CORRECT CONTENTS
20163 T11WCN: 0       ;WRONG CONTENTS
20164 T11PG:  0       ;PAGE # INVOLVED
20165 ]
20166 IFN N11TYS,[
20167 TVBLAD: 17742   ;VIDEO BUFFER TO FLASH WHEN JOB RUNNING (PDP10 VIDEO BUFFER ADDR)
20168 ]
20169 IFN DL10P,[
20170 DL10F:  -1      ;-1 NORMAL, 0 => 11 DOWN
20171 DL10HC: 0       .SEE TTDLBRK ;NUMBER OF LOOPS WHEN HUNG UP WAITING FOR 11 TO GOBBLE BUFFER
20172 ]
20173 \f
20174 DLSRCH: 0       ;-1 => DON'T RUN ANY USER BUT THE ONE ALREADY RUNNING
20175                 ;(UNLESS WE TAKE A PAGE FAULT).
20176 CPDLP:  -CPDLL,,LCPDL-1 ;CLOCK PDL POINTER
20177 LCPDL:  BLOCK CPDLL     ;CLOCK INT LEVEL PDL
20178
20179 CLKBSW: 0               ;READ SWITCHES INTO HERE TO DECIDE WHETHER TO GO TO DDT.
20180
20181 CLROOT: SSLCKB          ;CLOCK QUEUE ROOT
20182
20183 SSLCKB: SCLKI           ;SLOW CLOCK RQ BLOCK
20184         .+2             .SEE CHA5CK ;OR 15SCLB
20185         JRST SSLCK
20186
20187 IFN CHAOSP,[
20188 CHA5CK: 5*60.-SCLKI     ;5-SECOND CLOCK FOR CHAOS NET
20189         15SCLB          ;NOTE INITIAL TRIGGERING OF CLOCKS BELOW DELAYED AN EXTRA 5 SECONDS
20190         JRST CHA5CL
20191 ];CHAOSP
20192
20193 15SCLB: 15.*60.-SCLKI
20194         .+2             .SEE PRVCLB ;OR VSLCKB
20195         JRST 15SCLK
20196
20197 IFE SWPWSP,[
20198 PRVCLB: NPVSEC*60.-15.*60.-SCLKI        ;PRIVILEDGED USER VARIABLE CHECK
20199         VSLCKB
20200         JRST PRVCLK
20201 ];SWPWSP
20202
20203 VSLCKB: 0       ;VERY SLOW CLOCK BLOCK
20204         CLINFB                  ;CAUSE SLOW CLOCK TICK SOON AFTER SYS COMES UP
20205         JRST VSSLCK
20206
20207 CLINFB: 377777,,-1      ;ABOUT 15 YEARS
20208         0
20209         BUG             ;?
20210
20211 IFN CCLKP,[
20212 CCLKB:  0       ;FOR CHESS CLOCK HACK
20213         -1
20214         JRST RCCLK
20215 CCLK1:  0
20216 CCLK2:  0
20217 ]
20218
20219 IINTIC==60.     ;# TWO-MINUTE TICKS PER VERY VERY SLOW CLOCK TICK (2 HOURS)
20220 IINCNT: 0       ;# TWO-MINUTE TICKS REMAINING UNTIL NEXT VERY VERY SLOW CLOCK TICK
20221 .SEE VSCLK
20222
20223 IFN N11TYS,[
20224 WHOCLB: 0       ;WHO LINE TIMER
20225         -1
20226         JRST WHOSET
20227 ]
20228
20229 UTTYS:  BLOCK MXCZS     ;RING BUFFER FOR JOBS TO BE STARTED
20230 UTTYI:  UTTYS
20231 UTTYO:  UTTYS
20232 UTTYCT: 0
20233
20234 PCLDBM: 0       ;.NE. 0 ACTIVATE PC LSR DEBUG MODE
20235                         ;1 => ADVANCE PLACE WHERE PCLSR
20236                         ;2 => ADVANCE BUT DON'T ^Z.
20237                         ;- HOLD
20238 PCLUSR: -1      ;USER PCLSR MODE ACTIVE FOR
20239 PCLL:   0       ;PLACE WHERE LAST PCLSR TESTED
20240 PCLHSH: 0       ;HASH OF RETURNS ON PDL AT LAST PLACE TRAPPED OUT OF
20241 PCLNXT: -1      ;-1 => FROB NEXT TIME IN ADVANCE MODE
20242 PCLHT:  0       ;TEMP
20243 PCLIDX: 0       ;INITIALIZE PCLT TO THIS (SET TO LOOP COUNT IF NECESSARY)
20244 \f
20245 CORRNR: 0       ;LAST USER TO RUN CORE
20246 SJSPG:  0       ;-1 => LAST FREE PG RESERVED FOR SYS JOB; DON'T GIVE IT TO ANYONE ELSE.
20247 UTBFLF: 0       ;-1 SIGNAL TO TRY TO FLUSH I/O BLOCKS
20248 UFDFLF: 0       ;-1 SIGNAL TO TRY TO FLUSH 2311 UFDS
20249 CORCNT: 0
20250 UFLSF:  0       ;FLAG FROM UFLS TO CLKBRK
20251 CLKFL1: 0       ;FLAG COUNTER TO CONTROL CLOCK LEVEL 
20252 SCHFLG: 0       ;SCHEDULE TIMER (DIVIDES 60 CPS)
20253 27FCLK: 0       ;-1 IF FAST CLOCK SHOULD CALL TYP27S
20254 SCITM:  0       ;SEE SYSEX, SYSDEC
20255 LCLK1:  0
20256 SYSCKP: -LTSTB,,TSTB    ;SYSTEM CHECKSUMS CHECKER POINTER
20257 SYSPDP: -LSYSP,,SYSPDL-1        ;PDL POINTER FOR SYSTEM JOB
20258 SYSPDL: BLOCK LSYSP     ;PDL FOR SYS JOB
20259 IFN TPLP,TPLBUF:        BLOCK TPLBSZ    ;PSEUDO LPT BUFFER - MUST BE ABOVE SUACS
20260 IFN TPLP\DEMON,TPLFNO:  SIXBIT /!/      ;UNIQUE TPL FIRST FILE NAME
20261 SJCFF:  0       ;-1 WHEN SYS JOB IN PROCESS OF FLUSHING CORE
20262                         ;AVOIDS TIMING ERROR DUE TO HUSRAD NOT REALLY REFLECTING WHAT ITS GOING TO BE
20263 SLSWPR: 0       ;STORE SYS JOB'S LSWPR WHILE HACKING UUOS
20264
20265 BBLK
20266
20267 IFN TPLP,       TPLFN:  2,,(SIXBIT /TPL/)
20268 IFN KL10P,[
20269 KLEBCC: 0 ? <1_23.>/<4*25./2>   ;EBOX COUNTER CONVERSION TO 4 USEC CONSTANT (FOR 25 MHZ)
20270                 ;RESULT IS IN AC+2 AFTER DMUL AC,KLEBCC
20271 KLMBCC:; 1 ? 110000,,           ;FOR CONVERTING AN MBOX COUNT TO THE TIME (IN EBOX UNITS)
20272                                 ;IT SUPPOSEDLY AMOUNTS TO.
20273                                 ;WE ASSUME 102.5 NANOSEC OD WAITING TIME PER MBOX CYCLE
20274                                 ;THIS NUMBER IS 102.5/80.
20275                                 ;DMUL AC,KLMBCC PUTS ANSWER IN AC+1, AC+2
20276                                 ;WITH BINARY POINT BETWEEN THE WORDS.
20277         0 ? 0           ;M8538 MODIFIED SO EBOX COUNTER CONTINUES TO COUNT
20278                         ;DURING MBOX WAIT TIME, SO SET KLMBCC = ZERO.
20279 EBLK
20280
20281 MTRUSR: -1              ;USER TO WHOM PERF CTR IS ASSIGNED
20282 MTRJOB: -2              ;USER BEING MEASURED BY PERF CTR,
20283                         ;OR -1 => NULL JOB, OR -2 => ALL JOBS.
20284
20285 PAEON:  0               ;SELECTED PERF CTR ENABLE WORD
20286 PAEOFF: 0               ;DISABLE THE PERF CTR (WHEN WRONG JOB IS RUNNING)
20287 STPERF: 0 ? 0           ;VALUE OF PERF COUNTER AT START OF QUANTUM
20288 STEBOX: 0 ? 0           ;VALUE OF EBOX COUNTER AT START OF QUANTUM
20289 STMBOX: 0 ? 0           ;VALUE OF MBOX COUNTER AT START OF QUANTUM
20290 ] ;KL10P
20291 IFE KL10P, EBLK
20292 IFN TPLP,[
20293 TPLFN1: 0
20294 TPLFN2: 0
20295 TPLFN3: 0
20296 ]
20297 IFN NLPTP, NTNLPL: 0    ;NUMBER OF TIMES NLPT LOST PIA
20298 VARIABLES
20299
20300
20301 TSTB:   REPEAT CKNUM,CONC CK,\.RPCNT,
20302 LTSTB==.-TSTB
20303
20304 CKSUMS: BLOCK CKNUM
20305 CKXORS: BLOCK 36.       ;XOR OF ALL ADRS IN PURE AREAS IN SYS WITH CORRESP
20306                 ;BIT SET (RH)
20307 TCKXOR: BLOCK 36.       ;TEST XORS
20308
20309 SSYSCL==SSYS
20310 SYSCLB==SSYSCL_-10.+IFN 1777&SSYSCL,1
20311
20312 IFE KA10P,[
20313 AC1PTR: UUOACS  ;-> WHERE AC BLOCK 1 IS CURRENTLY LOADED FROM
20314 ] ;IFE KA10P
20315
20316 USRHI:  0       ;HIGHEST LOC USED FOR USER STORAGE
20317 \f
20318 SUBTTL LOCATIONS TO PATCH WHEN DEBUGGING
20319
20320 SYSDBG: 0       ;0 NORMAL TIMESHARING
20321                 ;+ GIVE "ITS BEING DEBUGGED" MESSAGE
20322                 ;-N ALSO ALLOW ONLY CONSOLE #N AND T00 TO CTRL/Z.
20323                 ;-512.*N => ALLOW ONLY HOST N TO TELNET IN.
20324                 ;-512.*N+M => ALLOW HOST N AND TTY M.
20325 DMLLDF: -1      ;-1 => START DAEMONS AUTOMATICALLY, 0 DON'T.
20326 IFN DEMON,DMNFLG: 1  ;1 => START DM-STYLE DAEMONS, 0 DON'T.
20327
20328 IFN NETP,NETUSW: 0 ;-1 => DON'T START UP A JOB IN ANSWER TO A CONNECT REQUEST
20329                 ;FROM A HOST OTHER THAN OURSELVES
20330
20331 SYSCN:  SYSCON  ;NUMBER OF TTY TO RECEIVE SYSTEM CONSOLE OUTPUT.
20332                 ;-1 TO THROW IT AWAY.  YOU CAN CHANGE THIS ANY TIME.
20333
20334 SUPPLG: 0       ;-1 => SUPPRESS LOGIN/LOGOUT MESSAGES ON SYSTEM CONSOLE.
20335
20336 IFE KS10P,[     ; KS has no lights.
20337 MIPGDS: 0       ;-1 => DON'T LIGHT LIGHTS (KA HAS HARDWARE SWITCH, KL NEEDS
20338                 ; THIS)
20339 ] ;IFE KS10P
20340
20341 IFN RH10P+RH11P,[
20342 USFHLT: 0       ;-1 => HALT ON DISK UNSAFES AND OTHER BAD ERRORS
20343                 ;0 => RETRY.  NOTE SET POSITIVE FOR 1/2 SECOND AFTER
20344                 ; A RETRY TO AVOID LOOPING, DETECT SOLID ERRORS.
20345 ] ;RH10P+RH11P
20346
20347 .SEE USEHM      ;NONZERO => USE HIGH MOBY, ELSE ONLY 256K
20348
20349 .SEE USEMDM     ;NONZERO => USE MEDIUM MEMORY AS ADDITIONAL "LOW HALF" PAGES
20350
20351 IFN N11TYS,[
20352 TT11P:  1       ;0 => PDP11-TTYS ARE NOT IN USE
20353                 ;1 => SYSTEM SHOULD INITIALIZE THEM
20354                 ;-1 => INITIALIZED AND IN USE
20355                 ;TO BRING THE TV'S DOWN, ZEROING TT11P ISN'T ENOUGH
20356                 ;EITHER DO WHAT TT11LS DOES, OR JUST SET SCR11D IN SUPCOR
20357                 ;(THE LATTER MAY NOT TAKE EFFECT INSTANTLY, HOWEVER)
20358                 ;TO BRING THE TV'S UP, JUST SET TT11P TO 1 AND WAIT 2 SECONDS
20359 ]
20360
20361 .SEE IMPUP      ;0 UP, -1 DOWN, 1 DOWN AND DON'T TRY TO BRING BACK UP
20362
20363 .SEE TEN11F     ;0 UP, -1 TOTALLY DOWN, 1 RESET PLEASE
20364
20365 .SEE DL10F      ;0 PDP11 DOWN, -1 UP
20366
20367 .SEE PDP6UP     ;0 PDP6 DOWN, -1 UP
20368
20369 .SEE LASTGC     ;NAME OF LAST DISK DIRECTORY GARBAGE COLLECTED
20370
20371
20372 SUBTTL SWAPPING ALGORITHM CONTROL SWITCHES
20373
20374 IFE SWPWSP,[    ;THESE AREN'T LOOKED AT IN SWPWSP SYSTEM
20375 ENSWSC: SWBLK   ;ENABLE CALLING OF SWSCD FROM 15 SEC CLOCK
20376 ENUPC:  1-SWBLK ;ENABLE USER-PC PAGE OF RUNNING USER NOT BE SWAPPED OUT
20377 ENPZRO: SWBLK   ;ENABLE PAGE-ZERO OF RUNNING USER NOT BE SWAPPED OUT
20378 ENSWBK: SWBLK   ;ENABLE SWPNX1 TO SWAP BLOCK A USER
20379 ENPVCL: 1-SWBLK ;ENABLE PRVCLK ROUTINE
20380 ENPREE: 1-SWBLK ;ENABLE PREEMPTION ON PAGE SWAP IN (SEE QSWI1)
20381 ENAGE:  1-SWBLK ;ENABLE AGE BITS TO ABORT SWAP OUT IF PAGE IS USED
20382 ];SWPWSP
20383 AGERTE: 8       ;NUMBER OF PAGES TO AGE EACH 1/2 SECOND.
20384                 ;IN A 512K SYSTEM, LAP TIME IS ABOUT 200/AGERTE SECONDS.
20385 \f
20386 SUBTTL SYSTEM LOCKS
20387
20388 CIRPSW: -1      ;CIRCULAR POINTER SWITCH
20389         0
20390
20391 MEMFRZ: -1      ;MEMORY FROZE
20392         0
20393
20394 CASW:   -1      ;CORE ALLOCATE INTERLOCK SWITCH (REQUESTS TO CORE JOB)
20395         0
20396
20397 SHUTLK: -1      ;LOCK VAR FOR SHUTDN
20398         0       ;USED TO TELL WHO CAUSED SYS DOWN
20399
20400 TREESW: -1      ;LOCK MANIPULATION OF JOB TREE STRUCTURE
20401         0       ;ATTACH, DETACH, DISOWN, REOWN ALL LOCK.
20402
20403 CUSER:  -1      ;CORE ALLOCATOR USER
20404         0       ;DUMMY CORE ALOC USE VAR
20405
20406 ARDFSW: -1      ;LOCK VAR FOR .REDEF
20407         0
20408
20409 IFN 340P\E.SP,[
20410 DISUSR: -1      ;340 USER
20411         0       ;DUMMY 340 USE VAR
20412 ]
20413
20414 IFN CODP,[
20415 CODUSR: -1      ;CODE SENDER
20416 CODUSE: -1
20417 ]
20418
20419 IFN PLTP,[
20420 PLTUSR: -1      ;PLOTTER USER
20421 PLTUSE: -1
20422 ]
20423
20424 IFN LPTP\TTLPTP,[
20425 LPTUSR: -1      ;LINE PRINTER USER
20426 LPTUSE: -1
20427 ]
20428 IFG LPTP-1,[
20429 OLPUSR: -1
20430 OLPUSE: -1
20431 ]
20432 IFN LPTP,[
20433   IFE LPTP-1,[
20434     IFN NLPTP,[
20435         NLUSR==LPTUSR
20436         NLUSE==LPTUSE
20437     ]
20438     IFN OLPTP,[
20439         OLUSR==LPTUSR
20440         OLUSE==LPTUSE
20441     ]
20442   ]
20443   IFG LPTP-1,[
20444     OLUSR==OLPUSR
20445     OLUSE==OLPUSE
20446     NLUSR==LPTUSR
20447     NLUSE==LPTUSE
20448   ]
20449 ]
20450
20451 IFN PTRP,[
20452 PTPUSR: -1
20453 PTPUSE: -1
20454
20455 PTRUSR: -1
20456 PTRUSE: -1
20457 ]
20458
20459 IFN VIDP,[
20460 NVDUSR: -1
20461 NVDUSE: -1
20462 ]
20463
20464 IFN PDP6P,[
20465 PDPUSR: -1      ;PDP-6 USER
20466 PDPUSE: -1
20467 PDPISR: -1      ;PDP6 AS INFERIOR (INTS ON IO CHANNEL)
20468 PDPISE: -1      ;PDP6 USE VAR
20469 ]
20470
20471 IFN TABP,[
20472 TABUSR: -1      ;TABLET USER
20473 TABUSE: -1
20474 ]
20475
20476 IFN STKP,[
20477         STKUSR: -1
20478         STKUSE: -1
20479 ]
20480 \f
20481 TIME:   0       ;TIME SINCE SYSTEM START IN 1/30'THS
20482 SUSRS:  0       ;NUMBER USERS ON SYS
20483 RVVTIM: 0       ;VALUE OF TIME WHEN SYSTEM WAS LAST REVIVED FROM A CRASH
20484 USRRCE: BLOCK NCT+1     ;USER RESOURCE +1 FOR DISOWNED JOBS
20485 SYSRCE: 0       ;SYS JOB RESOURCE
20486 SLOADU: 0       ;100. * <EFFECTIVE # OF COMPETING USERS>, IN FIXED POINT.
20487 RNABLU: 0       ;RUNNABLE USERS
20488 NPGWTU: 0       ;NUMBER OF JOBS CURRENTLY WAITING FOR A PAGE
20489 LOUTIM: 0       ;TOTAL TIME USED BY LOGGED OUT USERS
20490 UMASTER:        -1      ;INDEX OF MASTER USER
20491 SWRCE:  BLOCK NCT+2     ;SWAP SCHED RESOURCE
20492 SWIPRQ: 0       ;TOTAL # SWAP IN REQUESTS
20493 SHUTDN: 0       ;"TIME" SYS WILL DIE, 0 IF NOT DYING, -1 IF DEAD
20494 DEDTIM: 0       ;TIME TILL DEATH AFTER NEXT CLK QUEUE INT
20495                 ; < 0 => SYSTEM ACTUALLY DOWN (CHECKED BY ^Z, NUJBST, %OPLIV JOBS)
20496 DTHTIM: 0       ;TIME SYSTEM DIED
20497 DEDBLK: 0
20498         -1
20499         JRST DEATHZ
20500
20501 ATRNJN: 0       ;JNAME OF LAST JOB TO DO A .TRANAD OR .TRANDL
20502                 ;(SO I CAN SEE IF THEY'RE USED AT ALL).
20503
20504 IFN DZ11P,[
20505 DZXSPR: 0       ;Count of spurious DZ-11 transmitter interrupts.
20506 DZRSPR: 0       ;Count of spurious DZ-11 receiver interrupts.
20507 ];DZ11P
20508
20509 NCORRQ: 0       ;NUMBER CORE RQS HERE SO TRANSFERRED TO PEEK
20510 NCBCOM: 0       ;NUMBER CORE BLOCKS COMMITTED TO CORGP
20511
20512 NQDE:   BLOCK NQS       ;NUMBER OF 2314 DATA ERRORS
20513 NQHE:   BLOCK NQS       ;NUMBER OF 2314 HARDWARE ERRORS
20514         BLOCK 1         ;NQSE-1 COUNTS SPUR INTS WHILE NO XFER (QSDU -1)
20515 NQSE:   BLOCK NQS       ;NUMBER OF SPURIOUS 2314 ERROR INTERRUPTS
20516 NQCMPE: BLOCK NQS       ;NUMBER OF 2314 READ/COMPARE ERRORS
20517 NQWDE:  BLOCK NQS       ;# DATA ERRS ON WRITE
20518 NQRDE:  BLOCK NQS       ;# DATA ERRS ON READS
20519 NIRSWE: 0       ;# IRRCV ERRS ON SWAPPING XFERS
20520 QIRRCV: 0       ;IRRECOVERABLE DISK ERRORS
20521 QIRCBK: 0       ;BLOCK # W/ IRRCV ERROR
20522 QIRUNT: 0       ;UNIT OF ABOVE
20523 NQWRE:  0       ;# WRITE ERRS RCC OK
20524 NQWIRE: 0       ;# WRITE ERRS RCC LOST
20525 NWXFR:  0       ;NUMBER WRITE TRANSFERS (FILE, DIR, ETC.)
20526 NRXFR:  0       ;NUMBER READ
20527 NSWXFR: 0       ;NUMBER WRITE SWAPS
20528 NSRXFR: 0       ;NUMBER READ SWAPS
20529
20530 ;DON'T CHANGE ORDER .SEE MEMTYP
20531 PARERR: 0                       ;COUNT OF CORE PARITY ERRORS
20532 NXMERR: 0                       ;COUNT OF NXMS
20533 IFE KA10P,      BPFERR: 0       ;COUNT OF BAD PAGE FAILS
20534 PARPC:  0                       ;PC ON CORE PARITY INTERRUPT
20535 NXMPC:  0                       ;PC ON NXM
20536 IFE KA10P,      BPFPC:  0       ;PC ON BAD PAGE FAIL
20537 PARUSR: -1                      ;USER ON PAR ERR
20538 NXMUSR: -1                      ;USER ON NXM
20539 IFE KA10P,      BPFUSR: -1      ;USER ON BAD PAGE FAIL
20540 IFE KA10P,      BPFPFW: 0       ;PFW ON BAD PAGE FAIL
20541
20542 IFN KS10P,[
20543 ECCERR: 0       ;COUNT OF ECC CORRECTED ERRORS LOGGED
20544 ECCERA: 0       ;MEMORY STATUS AND ADDRESS OF MOST RECENT
20545 ECCAND: -1      ;AND OF ALL ERRORS
20546 ECCIOR: 0       ;IOR OF ALL ERRORS
20547 ] ;IFN KS10P
20548
20549 IFN DPKPP,      NDPKPE: 0       ;# PARITY ERRS FROM DATAPOINT KLUDGE
20550
20551 SNMPGS: 0       ;SYSTEM, NUMBER OF VIRTUAL USER PAGES
20552 SNSWPG: 0       ;SYS, NUM OF SWAPPED OUT VIR. PGS
20553
20554 USRTM1: 0       ;4USEC TICKS USED BY USERS SINCE LAST (1/2 SEC) UPDATE TO USRTIM
20555 USRTIM: 0       ;TIME USED BY ALL USERS 1 SEC UNITS
20556 NULTM1: 0       ;4USEC TICKS USED BY NULJOB SINCE LAST (1/2 SEC) UPDATE TO NULTM3
20557 NULTM3: 0       ;NUMBER OF SECONDS USED BY NULJOB
20558 NULTIM: 0       ;TIME USED BY NULL JOB (60'THS) - OBSOLETE BUT STILL MAINTAINED
20559 IFN KL10P,[
20560 NULEBC: 0 ? 0   ;EBOX COUNT WHEN NULL JOB ENTERED
20561 NULMBC: 0 ? 0   ;MBOX COUNT WHEN NULL JOB ENTERED
20562 NULPRF: 0 ? 0   ;PERF COUNT WHEN NULL JOB ENTERED
20563 ] ;KL10P
20564 IFE KA10P,[
20565 PFAILF: 0       ; KL: -1 => ENTRY TO CLOCK LEVEL WAS VIA PFAIL
20566                 ;     -2 => VIA INTPFL
20567                 ; KS: -1 => BOTH CASES
20568 ] ;IFE KA10P
20569 LOSTM1: 0       ;4USEC TICKS LOST SINCE LAST (1/2 SEC) UPDATE TO LOSTIM
20570 LOSTIM: 0       ;SECONDS OF LOST TIME (ALL OTHERWISE RUNNABLE JOBS WAITING FOR PAGES)
20571 IDLTM1: 0       ;4 USEC TICKS IDLE SINCE LAST (1/2 SEC) UPDATE TO IDLTIM
20572 IDLTIM: 0       ;SECONDS OF IDLE TIME (NO JOBS WANT TO RUN)
20573 LOSRCE: 0       ;USRRCE WORD FOR LOST TIME
20574 IDLRCE: 0       ;USRRCE WORD FOR IDLE TIME
20575
20576 UREALT: -1      ;RH=INDEX OF THE REAL TIME USER
20577                 ;LH=0=> THIS USER HAS HIGHEST PRIORITY
20578                 ;LH>0=> USER NOT IN HIGH PRIORITY PHASE
20579                 ;LH<0=> FACILITY IDLE
20580 INFORM [HIGHEST USED]\<.-1>
20581 \fSUBTTL USER VARIABLES
20582
20583 ;ONE COPY FOR EACH PROCEDURE
20584 ;FOR KL AND KS, THIS IS THE UPT
20585
20586 IFN KL10P,[
20587 DEFINE KLUPT N,NAME/            ;CHECKS "HARD-WIRED" UPT LOCATIONS
20588 IFN .-USRSTG-<N>,[
20589 .ERR "NAME" LOST IN UPT
20590 LOC USRSTG+<N>
20591 ]
20592 TERMIN
20593 ] ;KL10P
20594
20595 IFE KL10P,[
20596 DEFINE KLUPT N,NAME/
20597 TERMIN
20598 ] ;IFE KL10P
20599
20600 IFN KL10P, LOC <.+777>&-1000    ;KL UPT MUST START AT HARDWARE PAGE BOUNDARY
20601
20602 IFN KS10P, LOC <.+7>&-10        ; KS UPT must be 0 mod 8 (see UUOPCW)
20603
20604 USRSTG:: KLUPT 0,;USER PAGE MAP
20605
20606 UPGMP:  BLOCK NUVPG/2   ;PAGE MAP STORAGE (PROGRAMS UP TO NUVPG LONG)
20607 ;               2.9-2.8 ACCESS RIGHTS
20608 ;                       00      NO ACCESS (BY SOFTWARE CONVENTION, 1.2-1.1
20609 ;                               HAVE THE "REAL" ACCESS BITS, WHICH MAY BE 00,
20610 ;                               BUT MAY NOT, E.G. FOR A SWAPPED OUT PAGE).
20611 ;                       01      READ ONLY
20612 ;                       10      READ/WRITE/FIRST
20613 ;                       11      READ/WRITE
20614 .SEE PMCSHM     ;CACHE BIT
20615 .SEE PMAGEM     ;AGE BITS
20616 .SEE PMRCM      ;LOW N BITS ARE PHYSICAL CORE PAGE NUMBER (IN 1K PAGES)
20617 UPGCP:  BLOCK NUVPG/2   ;CIRCULAR POINTERS (CORRESPONDS 1-1 WITH UPGMP)
20618 ;               IF -1, ABSOLUTE PAGE, NOT LINKED.  OTHERWISE:
20619 ;               2.9     IF 0:
20620 ;                       2.8-1.9 USER INDEX
20621 ;                       1.8-1.1 PAGE NUMBER IN THAT USER'S UPGCP
20622 ;                       IF 1:
20623 ;                       2.8     IF 0:
20624 ;                               2.7-1.1 LINK TO MMP TABLE
20625 ;                               IF 1:
20626 ;                               2.7-1.1 LINK TO MEM PNT TABLE
20627 UMAPS:  0       ;USER MAP STATUS
20628         .SEE %UM
20629 UDBR1A==UPGMP   ;ADDRESS TO PUT IN DBR1
20630 UDBR2A==UPGMP+<NUVPG/4> ;ADDR FOR DBR2
20631 UPGCPH==UPGCP+<NUVPG/4> ;ADDR OF HIGH HALF OF CIRC PNTRS
20632
20633 TTYTBL: 0       ;TTY ASSIGNED THIS USER OR INDICATION THAT THERE IS NONE
20634 %TBNOT==400000  ;4.9 DOES NOT HAVE TTY NOW
20635 %TBNVR==200000  ;4.8 IF JOB DOESN'T HAVE TTY, OPENS SHOULD FAIL.
20636 %TBINT==100000  ;4.7 IF JOB DOESN'T HAVE TTY, ATTEMPT TO USE TTY SHOULD INTERRUPT.
20637                 ;JOB CAN SET BITS 4.8 AND 4.7.
20638 %TBWAT==40000   ;4.6 IF 1, %TBINT AND %TBNVR ARE OVERRIDDEN AND TTY USE ATTEMPTS
20639                 ;    ALWAYS HANG. SET BY DDT FOR $P, CLEARED BY ^P. ONLY SUPERIOR CAN SET.
20640 %TBDTY==010000  ;4.4 TTY TAKEN FROM --ME--.  WHEN GIVEN BACK,
20641                  ;DON'T PASS IT ON TO MY INFERIOR.
20642 %TBOUT==004000  ;4.3 ALLOW THIS JOB TO OUTPUT WHETHER OWNS TTY OR NOT
20643 %TBINF==002000  ;4.2 ALLOW MY INFERIORS TO OUTPUT IF THEY HAVE %TBOUT.
20644 %TBOIG==001000  ;4.1 IGNORE MY OUTPUT
20645 %TBIIN==000400  ;3.9 INTERRUPT IF I TRY TO DO INPUT
20646 $TBECL==220600  ;3-6-3.1 # ECHO LINES IF I DONT HAVE DISPLAY
20647                 ;RH USER NUM GAVE TTY AWAY TO OR TTY NUM IF HAS IT
20648 %TBCLR==410077  ;CLEAR THESE BITS IN TTYTBL OF A JOB RECEIVING THE TTY
20649
20650 TTSTSV: BLOCK 3 ;JOB'S SAVED TTYST1,TTYST2,TTYSTS, WHEN JOB DOESN'T HAVE THE TTY.
20651
20652 NMPGS:  0       ;NUMBER OF NON-ABSOLUTE PAGES (INCLUDES PURE)
20653 NSWPGS: 0       ;NUMBER SWAPPED OUT PAGES (AOSED FOR EACH USER OF SHARED PAGE SWAPPED OUT)
20654 HUSRAD: 0       ;MEM ADR OF PAGE ABOVE HIGHEST THAT EXISTS (MAX 1,,0)
20655 UPC:    0       ;USER PC STORAGE
20656 LUBTM:  0       ;TIME LAST UNBLOCKED (FOR IDENTIFYING INACTIVE JOBS)
20657 JBI:    -1      ;JOB DEVICE INDEX. IF NOT -1, THIS JOB IS A JOB-DEVICE,
20658                 ;AND JBI HAS INDEX INTO JOB DEVICE TABLES.
20659 \f
20660 UPGML:          ;USER PAGE MAP LOAD (EIGHT WORDS FOR LPM AND SPM INSTRUCTIONS)
20661 IFE KS10P,[     ; KS10 version given below.
20662                 UPJPC:  0       ;JPC.  KA HAS FAULT ADDRESS IN LH.
20663 IFE KL10P,      UPOPC:  0       ;OLD PC FLAGS,,OPC (UNUSED ON KL-10)
20664                 UPMAR:  0,,0    ;MAR ADDRESS AND CONDITION
20665                                 ;FOR KA-10:
20666                                 ;       3.3     0=EXEC, 1=USER
20667                                 ;       3.2-3.1 MAR CONDITION:
20668                                 ;               0       NEVER
20669                                 ;               1       INSTR FETCH
20670                                 ;               2       WRITE
20671                                 ;               3       ALWAYS
20672                                 ;       2.9-1.1 VIRTUAL ADDRESS
20673                                 ;FOR KL-10:
20674                                 ;       3.9-3.7 ADDRESS BREAK CONDITIONS:
20675                                 ;               3.9     FETCH
20676                                 ;               3.8     READ
20677                                 ;               3.7     WRITE
20678                                 ;       3.6     0=EXEC, 1=USER
20679                                 ;       3.5-1.1 VIRTUAL ADDRESS
20680 IFE KL10P,      UPQUAN: EXPGNG+1,,0             ;F.S. QUAN AND FAULT BITS
20681 IFN KL10P,      UPFW:   0                       ;PAGE FAIL WORD
20682 IFE KL10P,DBL==100_1
20683 IFN KL10P,DBL==0
20684                 UPDBR1: DBL,,UPGMP              ;DBR1
20685                 UPDBR2: DBL,,UPGMP+100          ;DBR2
20686 IFE KL10P,      UPDBR3: DBL,,EXEUMP             ;DBR3
20687 IFE KL10P,      UPACP:  1040,,UUOACS            ;B KEY,C KEY,,AC POINTER
20688 ] ;IFE KS10P
20689
20690 IFN KS10P,[
20691 UPDBR1: UPGMP           ; DBR1
20692 UPDBR2: UPGMP+100       ; DBR2
20693 UPQUAN: 0               ; Runtime counter
20694 UPJPC:  0               ; User mode JPC if microcode supports
20695 UPEJPC: 0               ; Exec mode JPC if microcode supports
20696 ] ;KS10P
20697
20698 UPGMLE::                                ;END OF PAGE MAP (+1)
20699
20700 IFN KL10P,[
20701         KLUPT 420,      ;RESERVED UPT 420
20702 UPT420: 0
20703         KLUPT 421,      ;TRAP 1 INSN    ;ARITHMETIC OVERFLOW
20704 TR1INS: JSR ILLTRP       ;FOR ITS-STYLE INTERRUPT, CONTAINS 0,,%PIARO
20705         KLUPT 422,      ;TRAP 2 INSN    ;PDL OVERFLOW
20706 TR2INS: JSR ILLTRP       ;SYS JOB SHOULDN'T OVERFLOW    ;FOR ITS-STYLE, 0,,%PIPDL
20707         KLUPT 423,      ;TRAP 3 INSN    ;USED FOR ONE-PROCEED
20708 TR3INS: JSR ILLTRP       ;SYS JOB SHOULDN'T ONE-PROCEED ;FOR ITS-STYLE, 0,,%PI1PR
20709         KLUPT 424,      ;MUUO DEPOSIT LOCATION
20710 SV40::
20711 MUUODP: 0       .SEE FORTY
20712         KLUPT 425,      ;MUUO OLD PC STORAGE
20713 SUUOH::
20714 XUUOH:  0
20715         KLUPT 426,      ;MUUO PAGING AND CONTEXT WORD
20716 MUUOCX: 0
20717         KLUPT 427,      ;RESERVED UPT 427
20718 UPT427: 0
20719         KLUPT 430,      ;MUUO NEW PC WORDS
20720 MUUOKN: %PSPCU,,UUOH0           ;FOR OTHER JOBS, MUUOEX (A JRST 4,).
20721 MUUOKT: %PSPCU,,MUUOEX          ;NO JOB SHOULD EVER TRAP IN EXEC MODE.
20722 MUUOSN: %PSPCU,,MUUOEX          ;NO JOB SHOULD EVER RUN IN SUPERV. STATE.
20723 MUUOST: %PSPCU,,MUUOEX          ;..
20724 MUUOCN: %PSPCU,,UUOH0           ;NORMAL UUOS
20725 MUUOCT: %PSPCU,,MUUOTR          ;UUOS AS TRAP INSN
20726 MUUOPN: %PSPCU,,UUOH0           ;PUBLIC MODE IDENTICAL TO CONCEALED MODE,
20727 MUUOPT: %PSPCU,,MUUOTR          ; ALTHOUGH IT'S A SCREW FOR A LOSER TO BECOME PUBLIC
20728 ]               ;END OF IFN KL10P
20729 \f
20730 IFN KS10P,[
20731 DEFINE KSUPT UPTNAM
20732 IFN .-USRSTG-<UPTNAM>,[
20733 .ERR UPTNAM lost in UPT
20734 LOC USRSTG+<UPTNAM>
20735 ]
20736 TERMIN
20737
20738 UPFW:   0       ; Saved page fail word from last fault.  Copied from EPTPFW
20739                 ; at time of fault usually.
20740
20741 KSUPT UPTTR1
20742 TR1INS: JSR ILLTRP
20743
20744 KSUPT UPTTR2
20745 TR2INS: JSR ILLTRP
20746
20747 KSUPT UPTTR3
20748 TR3INS: JSR ILLTRP
20749
20750 KSUPT UPTUUO
20751 SV40::
20752 MUUODP: 0
20753
20754 KSUPT UPTUPC
20755 SUUOH::
20756 XUUOH:  0
20757
20758 KSUPT UPTUCX
20759 MUUOCX: 0
20760
20761 KSUPT 427
20762 UPT427: 0
20763
20764 KSUPT UPTUEN
20765 MUUOKN: %PSPCU,,UUOH0   ;UUO in Exec mode new PC
20766                         ;For other jobs: %PSPCU,,MUUOEX
20767 KSUPT UPTUET
20768 MUUOKT: %PSPCU,,MUUOEX  ;UUO as trap instruction in Exec mode new PC
20769
20770 KSUPT UPT1PO            ;PC saved here after one-proceed
20771 1PROPC: 0
20772
20773 KSUPT UPT1PN            ;One-proceed sets PC to this
20774 1PRNPC: %PSPCU,,ONEPRO
20775
20776 KSUPT UPTUUN
20777 MUUOCN: %PSPCU,,UUOH0   ;Normal UUO new PC
20778
20779 KSUPT UPTUUT
20780 MUUOCT: %PSPCU,,MUUOTR  ;UUO as trap instruction new PC
20781
20782 EXPUNGE KSUPT
20783
20784 ] ;KS10P
20785 \f
20786 UUOACS: BLOCK 20
20787 AC0S:   BLOCK 15        ;SWAP OUT AC S
20788 AC15S:  0
20789 AC16S:  0
20790 AC17S:  0
20791
20792 IFN KL10P,[
20793 ;KLUPT 500,     ;PAGE FAIL WORD STORAGE         ;MICROCODE MOD PUTS
20794 ;KLUPT 501,     ;PAGE FAIL OLD PC STORAGE       ; THESE LOCATIONS IN
20795 ;KLUPT 502,     ;PAGE FAIL NEW PC               ; THE EPT FOR ITS
20796 ]               ;END OF IFN KL10P
20797
20798 UUO::   ;THE FOLLOWING LOCATIONS (UP TO SUEXND) ARE SWAPPED IN & OUT OF
20799         ;UEXIT ETC. WITH THE USER 
20800 SUEXIT: JRST 2,@XUUOH   ;USER UUO EXIT INS
20801 SCLUSV: MOVEM U,AC17S   ;CLOCK U SAVE
20802
20803 IFN KA10P,[
20804 SUUOH:  0       ;C(@41) (ABSOLUTE)
20805 SUEXND::
20806
20807 SV40:   0       ;C(40) WHEN USER OUT (SEE SWITCH)
20808 ] ;KA10P
20809
20810 IFE KA10P,[
20811 SCLCXS: DATAI PAG,CLCX  ;CLOCK SAVE OF CONTEXT
20812 SUEXND::
20813 ] ;IFE KA10P
20814
20815 IFN <SUEXND-UUO>-<UEXND-UEXIT>, .ERR SUEXIT BLOCK LOST
20816
20817 IFE KA10P,[
20818 CLCX:   0       ;SAVED CONTEXT (DATAI PAG,) AT CLKBRK AND PFAIL
20819 ] ;IFE KA10P
20820
20821 IFN KL10P,[
20822 KLUPT 504,      ;EBOX COUNT
20823 EBOXCT: 0 ? 0   ;NUMBER OF EBOX TICKS (25 MHZ) OVER 2 LEFT 12. THAT EBOX
20824                 ;RAN FOR THIS USER
20825 KLUPT 506,      ;CACHE COUNT
20826 MBOXCT: 0 ? 0   ;NUMBER OF MBOX CYCLES REQUESTED BY EBOX FOR THIS USER LEFT 12.
20827
20828 EXPUNGE KLUPT
20829 ] ;KL10P
20830
20831 UTIME:  0       ;RH=CLOCK INTERVAL IN 60'THS, LH=COUNT OF TICKS SINCE READ
20832 UTRNTM: 0       ;TOTAL RUN TIME IN 4 MICROSEC UNITS
20833 USIPRQ: 0       ;# SWAPIN REQUESTS
20834 \f
20835 USWST:  0       ;SWAPPING STATUS BITS.
20836 %SW==525252(1)  ;IN THE LEFT HALF
20837 %SWDSO==400000  ;4.9 => DESIRED TO BE SWAPPED OUT (MUST BE SIGN BIT).
20838 %SWPGW==200000  ;4.8 => FLSINS IS WAITING FOR A PAGE
20839 %SWBEM==100000  ;4.7 => BEST EFFORT MADE TO SWAP OUT, DON'T LOOK AT JOB AGAIN
20840 %SWRUN==040000  ;4.6 => SWAPPED OUT WHILE RUNNABLE, SO CONSIDER MEM STATUS BEFORE REACTIVATION
20841                 ; THIS BIT IS NEVER LOOKED AT.
20842 %SWPCL==020000  ;4.5 => PAGE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
20843                 ; SO WHEN FLSINS SKIPS DON'T CLEAR IT BUT PCLSR INSTEAD.
20844 %SWINT==010000  ;4.4 => IF WAITING FOR PAGE, NEED IT TO INTERRUPT
20845 %SWPRV==004000  ;4.3 => "PRIVELEGED USER"
20846 IFN SWPWSP,[
20847 EXPUNGE %SWPRV
20848 %SWOUT==000400  ;3.9 => JOB IS SWAPPED OUT OR SWAP BLOCKED
20849 %SWSB== 000200  ;3.8 => JOB IS SWAP BLOCKED
20850 %SWLOD==000100  ;3.7 => JOB IS LOADING
20851  ;VALID STATES OF ABOVE 3 BITS: 0=SWAPPED IN, 1=LOADING, 4=SWAPPED OUT, 6=SWAP BLOCKED
20852
20853 UWRKST: 0       ;WORKING SET.  2**18 TIMES SUM(ALL THIS JOB'S PAGES) 1 OVER # SHARERS
20854                 ;INCREMENTALLY MAINTAINED WHILE JOB IS LOADING OR SWAPPED IN.
20855                 ;NOTE # SHARERS IS IN RH(MMSWP)
20856 USVWRK: 0       ;SAVES UWRKST AS OF LAST TIME SWAPPED IN
20857 USWTIM: 0       ;TIME ENTERED LOADING, SWAPPED OUT, OR SWAP BLOCKED STATE.
20858                 ;WHILE SWAPPED IN, HAS THE TIME AT WHICH IT CEASES TO BE PROTECTED
20859                 ;AGAINST MEMORY PREEMPTION.
20860 ];SWPWSP
20861 USWPRI: 0       ;JOB SWAP PRIORITY.  LOWER NUMBER MEANS MORE LIKELY TO STAY IN
20862                 ; AND MORE LIKELY TO COME IN.  SEE ALSO SWRCE, WHICH IS SIMILAR.
20863 IFE SWPWSP,     ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE PRODUCT
20864                 ;OF THE WORKING SET TIMES THE FRACTION OF CPU USED
20865                 ;WHICH IS A MEASURE OF MEMORY USE WITH INTERACTIVE JOBS GIVEN AN ADVANTAGE.
20866 IFN SWPWSP,     ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE "ADJUSTED
20867                 ;MEMORY USAGE", WHICH IS THE (LOGARITHM OF THE WORKING SET SIZE)
20868                 ;MULTIPLIED BY THE SUM OF CPU TIME AND I/O WAIT TIME.  ALSO, WHEN
20869                 ;A DISOWNED JOB IS SWAPPED OUT, USWPRI IS MULTIPLIED BY 4 TO PREVENT
20870                 ;IT FROM COMING BACK IN FOR A WHILE UNLESS THERE IS REALLY NO 
20871                 ;COMPETITION FOR MEMORY.  ALSO, WHEN A SWAPPED-OUT JOB WAKES UP FROM
20872                 ;AN I/O WAIT, USWPRI IS DIVIDED BY 2 TO GIVE INTERACTIVE JOBS AN
20873                 ;ADVANTAGE.  THE SWPWSP SYSTEM DOES NOT CURRENTLY LOOK AT SWRCE.
20874 IFE SWPWSP,[
20875 USWSCD: 0       ;SWAP SCHEDULING WORD 4.9=1 SWAPIN INHIBITED THIS JOB (SWAP BLOCKED)
20876 LTRNTM: 0       ;SAVED RUN TIME FOR PRIV USR
20877 LSIPRQ: 0       ;SAVED SWAP IN REQ FOR PRIV USER
20878 UPGSEC: 0       ;NUMBER OF PAGE FAULTS PER <NPVSEC> RUN TIME SECONDS
20879 LPRVTM: 0       ;LAST TIME PRIV USER
20880 ];SWPWSP
20881 PAGRAN: 0       ;.PAGRANGE.  1ST PG #,,LAST PG # INCLUSIVE RANGE OF PAGES TO BE PAGED AHEAD.
20882 PAGAHD: 0       ;.PAGAHEAD.  0, OR PAGE-AHEAD-DISTANCE,,PAGE-BEHIND-DISTANCE
20883
20884 TRUNTM: 0       ;IF NOT TOP LEVEL, MINUS RUNTIME (4.069 US) ALREADY SENT TO SUPERIOR
20885                 ;IF TOP LEVEL, RUNTIME USED BY SUBTREE MINUS TIME SENT TO DEMON ALREADY
20886 TSIPRQ: 0       ;DITTO FOR SWAPIN REQUESTS
20887 UTMPTR: SYSRCE  ;POINTER TO RESOURCE WORD FOR THIS LOSER (JTMU FOR TREE)
20888 JTMU:   0       ;REDUCED BY 1/16 EVERY 1/2 SEC
20889                         ;INCREMENTED BY TIME RUN IN 4 USEC
20890                         ;MAX EQV VAL 1000000/8-1/16X=0
20891                         ;EQV VAL=2X10^6
20892                         ;AMONG JOBS WITH EQUAL RESOURSE
20893                         ;LOWEST JTMU HAS HIGHEST PRIORITY
20894
20895 IOCHNM: REPEAT NIOCHN,0 ;IO CHANNEL ASSIGNMENT
20896                         ;RH INDEX INTO IOTTB AND CLSTB
20897                         ;LH DEV CHNL AND/OR OTHER
20898 SIOCHN: BLOCK LUIOP     ;MUST FOLLOW IOCHNM
20899                         ;I/O CHANNEL PDL
20900 SIOCP:  SIOCHN-1        ;POINTER INTO I/O CHANNEL PDL
20901 IOCHST: BLOCK NIOCHN    ;I/O CHANNEL STATUS FOR CH'S AT IOCHNM
20902                         ;3.1-4.9 IO STATUS
20903                         ;1.1-2.9 .ACCESS POINTER
20904 \f
20905 CORRQ:  -1      ;RQ TO CORE JOB
20906                 ;4.9=1=>NO REQUEST
20907                 ;4.8=0 OLD TYPE RQ,1.1-1.9 # BLKS,3.1-3.8=USR NUMBER RQ'ED FOR
20908                 ;4.8=1 NEW TYPE
20909                 ;4.3 ADD FRESH BLOCK (IGNORE 4.2,4.1)
20910                 ;4.1=1=> ADDING ABSOLUTE BLOCK
20911                 ;3.9=1=>REQUEST WRITE ABILITY
20912                 ;2.9=1 INSERT, =0 DELETE ONLY IGNORE 4.1-4.3
20913                 ;2.1-2.8 VIRTUAL PAGE AFFECTED
20914                 ;1.1-1.9 USER RQ IS FOR
20915
20916 APRC:   APRCHN  ;R.H. CONO TO APR WHEN USER STARTS (HAS AR OV ENABLE, ETC.)
20917                 ;4.9=1=> PROCEDURE IS IN A DISOWNED TREE
20918 BUMRTL==100000  ;4.7 => GUN TREE IF HASN'T RUN FOR AN HOUR
20919                 ;(MEANINGFUL ONLY IN TOP LEVEL JOB).
20920                 ;CLEARED BY REOWNING OR ATTACHING.
20921 BUSRCR==40000   ;4.6 CORE RQ PENDING ON THIS JOB
20922 BULGO==20000    .SEE SYSGUN ;USER IS DISABLED, WAITING TO BE FLUSHED BY SYS JOB.
20923 BCHPTR==330400,,APRC(U) ;4.1-4.4 LAST CH ON WHICH AN ERR OCCURED (SEE ERR DEV)
20924 BULGOS==400     ;AN ATTEMPT IS BEING MADE TO DELETE OR LOG OUT THIS JOB
20925                 ;SO NO-ONE ELSE SHOULD START TO. THIS BIT ALSO LOCKS OUT
20926                 ;MOST WAYS OF HACKING THE JOB (INCL. THOSE THAT SET DIELOK).
20927                 ;3.1-3.5 MUST BE ZERO
20928
20929 DIELOK: 0       ;NUMBER OF JOBS LOOKING AT OR HACKING THIS JOB.
20930                 ;BEFORE KILLING A JOB, WAIT FOR ITS DIELOK TO BECOME 0.
20931
20932 USTP:   0       ;0 RUNNABLE, (IS SET NON ZERO FOR IDLE SETS OF VARS TO SPEED SEARCH)
20933 %UST==1,,537777
20934 %USTCM==400000  ;CORE BEING SHUFFLED (SHOULD ACTUALLY BE OBSOLETE).
20935 %USTCJ==200000  ;CORE BEING GIVEN BY CORE JOB.
20936 %USTSP==100000  ;STOPPED BY SUPERIOR
20937 %USTCG==40000   ;STOPPED BY SUPERIOR TO GIVE IT CORE (CORBLK, OR .USET OF .MEMT).
20938
20939 BCSTOP==400000  ;BIT IN USTP FOR CORE MOVAGE
20940 BUCSTP==200000  ;CORE STOPPING LOSER TO GIVE MORE CORE RQSTED BY ANOTHER LOSER
20941 BUSRC==100000   ;USER CONTROL BIT, SET & CLEARED BY SUPERIOR PROCEDURE
20942 BSSTP==40000    ;SET BY SUPERIOR WHEN HACKING MEM BOUND AT URMEMT OR UMEMEX
20943 ;1.1-2.9        ;USED BY UBO AND FRIENDS INHIBITS RELOCATION BY CORE ALLOCATOR
20944                 ;MUST BE MODIFIED WITH CLKOFF  MUST NOT BE SET IF CSTOP IS SET
20945                 ;IS A COUNTER OF TRANSIENT REASONS FOR PROCEDURE BEING STOPPED
20946
20947 PIRQC:  0       ;INT REQ AWAITING SERVICE (SOFTWARE INTS EFFECTED BY SEARCH)
20948 MSKST:  0       ;INT MASK REGISTER FOR BITS IN PIRQC
20949 IFPIR:  0       ;SECOND WORD OF INTERRUPT REQUESTS
20950                 ;3.8-3.1 INF PROC INT
20951                 ;2.7-1.1 IO CHANNEL INT
20952                 ;1.1= CHANNEL 0
20953 MSKST2: 0       ;INT MASK FOR IFPIR
20954 IDF1:   0       ;DEFER BITS FOR 1ST WD INTERRUPTS.
20955 IDF2:   0       ;FOR 2ND WORD INTERRUPTS.
20956                 ;IF AN INTERRUPT IS DEFERRED, IT IS TREATED AS
20957                 ;IF THE JOB'S PICLR VAR HELD 0.
20958 PICLR:  0       ;INT IN PROGRESS FLAG, -1=>ENABLED, 0=>IN PROGRESS
20959
20960 SUPPRO: 0       ;-1 => TOP LEVEL PROCEDURE
20961                 ;OTHERWISE: INT BIT,,PNTR TO SUPERIOR PROCEDURE
20962
20963 FLSINS: 0       ;USER BLOCKING INSTRUCTION;  STATE:
20964                 ; 0 => RUNABLE (UNLESS USTP .NE. 0) 
20965                 ; OTHERWISE HUNG,  IF NO SKIP SAFE TO RESTART AT UUO (UNLESS UFINAL .NE. 0)
20966 RPCL:   0       ;0,,N  RPCLSR'ING N
20967                 ;-1,,N  BEING RPCLSR'ED BY N
20968 \f
20969 UNAME:  0       ;USER NAME
20970                 ;THIS WORD FOR EACH PROCEDURE IS COPIED FROM THE UNAME OF THE PROCEDURE
20971                 ;THAT CREATES IT (SEE USR DEV).  FOR AN INITIAL TOP LEVEL PROCEDURE IT
20972                 ;IS INITIALLY -1 BUT IS MODIFIED BY ALOGIN.  IT IS THE SAME FOR ALL
20973                 ;PROCEDURES IN A TREE.
20974 JNAME:  0       ;JOB NAME
20975                 ;EACH LOGGED IN PROCEDURE HAS A UNIQUE UNAME, JNAME PAIR.  THE JNAME
20976                 ;OF AN INITIAL TOP LEVEL JOB IS "HACTRN".  FOR OTHER JOBS IT IS THE SECOND
20977                 ;FILE NAME SPECIFIED IN THE .OPEN ON THE USR DEVICE THAT CREATES THEM.
20978 USYSNM: 0       ;USER SYSTEM NAME
20979                 ;THIS VARIABLE IS INITIALLY SET TO THE SAME VALUE AS UNAME FOR
20980                 ;A PROCEDURE.  IT CAN BE READ OR WRITTEN BY THE PROCEDURE (ASUSET)
20981                 ;OR BY ITS SUPERIOR (AUSET).  ITS ONLY USE IS AS THE DEFAULT THIRD FILE NAME ON
20982                 ;USER SHARED DEVICES (2311'S (SEE QSKO),  AND CORE
20983                 ;LINK (SEE CLOO)).
20984 USYSN1: 0       ;3RD NAME FOR QSKO, CLOO (AFTER DEFAULTING AND TRANSLATION)
20985 HSNAME: 0       ;HOME SNAME
20986
20987 IOTLSR: 0       ;4.9 IOT USER MOD (=1 ENABLES USER TO DO DIRECT I/O
20988                 ; INSTRUCTIONS) 
20989                 ;RH VIRTUAL PAGE # OF LAST MPV, WIRO OR NXI (SHIFTED TO
20990                 ; ADDRESS SIZE) 
20991 UMARPC: 0       ;PC AT MAR INTERRUPT
20992 LSWPR:  0       ;LOCKED SWITCH POINTER
20993 UCLBLK: 0       ;CLOCK QUEUE BLOCK
20994         -1
20995         JRST UREALB
20996 URTIME: 0       ;LH=0=>LOW PRIORITY PHASE 1=> LOW PRIORITY WITH BLOCKING
20997                 ;LH=-1=>HIGH PRIORITY PHASE 2=> HIGH PRIORITY WITH BLOCKING
20998                 ;RH=LENGTH OF HIGH PRIOITY IN 60'THS
20999 RTIMER: -1      ;POSITIVE => MICROSEC RUNTIME TILL RUNTIME INT
21000
21001 LSPCL:  0       ;UPC AT LAST PCLSR,,DIFFERENT UPC AT PREVIOUS PCLSR
21002 LEXFDR: 0       ;DEBUGGING INFO FOR PAGE FAULTS WHICH SIGNAL AN INTERRUPT
21003                 ; TO THE LOSER
21004                 ;LH FAULT BITS OF LAST SUCH FAULT
21005                 ;RH PC OF LAST SUCH FAULT THAT WAS FROM EXEC MODE (WENT TO
21006                 ; IOADCR)
21007                 ;PAGE FAULTS WHICH JUST SWAP IN A PAGE DON'T SET THIS.
21008 LSUUO:  0       ;LAST SYS UUO (FOR DEBUGGING PURPOSE)
21009 LSCALL: 0       ;SIXBIT NAME OF LAST .CALL 0, (FOR PEEK)
21010 CTLBTS: 0       ;CTL BITS TO .CALL 0, XORED TOGETHER IN HERE (RIGHT HALF)
21011 SYSCVL: 0       ;CONTROLS OUTPUT ARGS FROM SYSTEM .CALL
21012  %SCV==1,,525252
21013  %SCVOT==400000 ;4.9 CALL HAS OUTPUT ARGS FLAG (TO SAVE TIME)
21014  %SCVER==200000 ;4.8 CALL HAS ERROR CODE ARG FLAG
21015                 ;3.6-4.7 UNUSED 3.1-3.5 MUST BE ZERO
21016                 ;1.1-2.9 ADDRESS OF ERROR CODE ARG
21017 IOTBTS: 0       ;DEVICE-INDEPENDENT IOT CONTROL BITS GO HERE, IN IOT AND SIOT
21018 USTYN:  0       ;TTY NO OF THE STY WHICH THIS JOB KNOWS AS "STY:" (WITHOUT
21019                 ; NUMBER). 
21020 UUAC:   0       ;AC FLD OF LAST UUO OR DESIRED CHANNEL IN CASE OF NOPEN ETC
21021                 ;SELECTS CHNL FOR ALL IOTS, OPENS ETC
21022                 ;LH -1 IF STORED BY CHNDCD, ELSE ZERO (SEE WHO LINE ROUTINES)
21023 TRMNAM: 0       ;TERMINAL IDENTIFICATION
21024 TRNLST: 0       ;TRANSL LIST FOR THIS JOB. -1 => NIL, OR IDX INTO TRAN!X
21025 TRNLS1: 0       ;TRANSL LIST FOR THIS JOB & INFERS.
21026 UTRAPM::        ;SIGN BIT OF OPTIONS IS UUO-TRAP-TO-SUPERIOR MODE
21027 OPTION: 0       ;OPTIONS WORD, SETTABLE BY USER
21028                 ;EACH BIT CONTROLS SOME SYSTEM ACTION FOR THIS JOB
21029         .SEE %OP
21030 XUNAME: 0       ;"WHO I REALLY AM" AS OPPOSED TO "WHO I AM LOGGED IN AS"
21031 XJNAME: 0       ;JOB NAME USER SPEC'ED AS OPPOSED TO UNIQUIZED VERSION
21032 \f
21033 40ADDR: 20,,40  ;RH=ADDRESS OF USER'S 6-WORD BLOCK FOR UUO'S, INTS, SWITCHES, LOCKING.
21034                 ;LH=ADDRESS OF USER'S 20-WORD BLOCK FOR SUPERIOR'S USE.  0=20.
21035 IFN N11TYS,[
21036 TVCREG: -1      ;TV CONSOLE REG FOR THIS USER OF -1 NONE
21037 TVVBN:  -1      ;-1 OR CONSOLE REG FOR RUN BLINKING
21038 NVDBA:  0       ;# VIDEO BUFFERS ASSIGNED (WITH NVDBA SYSTEM CALL).
21039 ];N11TYS
21040 UWHO1:  0       ;WHOLINE FLAGS
21041 UWHO2:  0       ;TWO HALFWORDS, PRINTING CONTROLLED BY UWHO1 4.9-3.3
21042 UWHO3:  0       ;TWO MORE HALF WORDS, CONTROLLED BY UWHO1 3.2-1.5
21043 IFN KL10P,[
21044 ULSPBR: 0       ;STBR,,GCSTBR FOR SPECIAL LISP INSTRUCTIONS
21045 ]
21046 SERVER: -1      ;User index of server job who is allowed write access to
21047                 ; this job to implement some oddball protocol.  -1 if none.
21048 ;INSERT NEW USER VARIABLES HERE^
21049
21050 USRPDL: -LUPDL,,UPDL-1  ;USER PDL
21051 UPDL:   BLOCK LUPDL-1
21052 EPDL2:  0       ;SAVES C(T) FOR FLSINS
21053 QLD:    0       ;LINK DEPTH
21054 VALUE::         ;PROCEDURE "VALUE" RETURN
21055 SRN3:   0       ;SAVED N3, N4 FOR RENAMES AT AOPEN ALSO USER INDEX AT NLOAD
21056                 ;SRN3, SRN4 USED BY CORBLK .CALL
21057 .SEE IODCS2     ;SRN3 contains saved user mode PC for unlocking own locks.
21058 .SEE ALOGO4     ;NO CLOSE ROUTINE MAY USE SRN4 OR SRN5
21059 SRN4:   0       ;ALSO DEVICE CHNL IOCHNM POINTER AT NLOAD
21060 SRN5:   0       ;SAVED N5 FOR LINK ALSO VIRTUAL PAGE NUMBER AT NLOAD
21061 EPDL3:  0       ;USED BY 2311 ROUTINES (QFNG) ALSO QSMDN ADDR AT NLOAD ALSO BY TYOW2
21062 .SEE ALOGO4     ;NO CLOSE ROUTINE MAY USE EPDL
21063                 ;FOR BP-STYLE RENAME, RENMWO AND MLINK,
21064                 ;HOLDS BP (OR BP BLK PTR) TO NAMES TO RENAME OR LINK TO.
21065 EPDL:   0       ;USED BY 2311 ROUTINES.
21066                 ;FOR SOPEN AND BP-STYLE RENAME, DELETE, HOLDS BP OR BP BLOCK PTR.
21067 EPDLT1: 0       ;FN1 BEFORE LAST TRANSLATION, USED BY NLOAD
21068 EPDLT2: 0       ;FN2   "     "      "       , USED BY NLOAD
21069 EPDLT3: 0       ;SYS NAME "  "      "
21070 EPDLT4: 0       ;LEFT ADJ DEVICE NAME " " "
21071
21072 STTYOP: 0       ;IN THE TOP OF A DETACHED TREE, THIS CONTAINS THE SAVED USER TTY
21073                 ; OPTIONS.  2.9=1 IF IT IS VALID, 2.7-2.8 ARE QUERY AND REFUSE MODE,
21074                 ; THE REST ARE TTYOPT BITS.
21075
21076 IFN 0,[ ;FAKE OUT @
21077 LSWB0:
21078 ]
21079 REPEAT NULBLK,[
21080 CONC LSWB,\.RPCNT,:     BLOCK 2
21081 ]               ;SWITCH BLOCK FORMAT
21082                 ;WD1 ASSOCIATED ADDRESS OR QUANTITY
21083                 ;3.6-3.1 USER NUMBER OF SWITCH HOLDER
21084                 ;2.9-1.1 PNTR TO NEXT SWITCH ON LIST OR 0 IF NONE
21085                 ;FOR REMAINDER OF FORMAT SEE LSWDIS
21086
21087 IFN KL10P,[
21088 IFGE USRSTG+1000-., INFORM SPACE LEFT IN UPT,\1000-<.-USRSTG>
21089 IFL USRSTG+1000-., .ERR USER VARS TOO BIG FOR UPT!
21090 .ELSE LOC USRSTG+1000
21091 ] ;IFN KL10P
21092
21093 IFN KS10P, LOC <.+7>&-10        ; KS UPT must be 0 mod 8 (see UUOPCW)
21094
21095 LUBLK==.-USRSTG
21096 L==LUBLK
21097 INFORM [STORAGE PER LOSER]\LUBLK
21098         BLOCK LUBLK     ;USER VARIABLES FOR CORE JOB
21099 SYSB==<1777+.>_-10.
21100 MXC==SYSUSB-SYSB        ;AVAIL BLOCKS AFTER SYS+DDT
21101
21102 \fSUBTTL TSS INITIALIZATION
21103 ;NEXT LINE COMMENTED OUT BECAUSE IT CAUSES MORE TROUBLE THAN IT SAVES
21104 ;.HKALL==1      ;(THE FOLLOWING CODE IS WIPED OUT AT ICLR)
21105 EXEUMP=UPGMP+100        ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S PAGE TABLE
21106                         ;SYMBOL IS DEFINED HERE SINCE UPGMP WAS JUST DEFINED 6 PGS AGO
21107
21108 BEG:    SKIPN SALV      ;SEE IF LOSER FORGOT TO LOAD SALV WHEN BUILDING SYSTEM,
21109                         ;OR SALV MEM IS NXM.  EVIL!  EVIL!
21110          BUG AWFUL,[HEY!  WHERE'S THE SALVAGER?]
21111         JSR SALV+1      ;CALL NO-QUESTIONS-ASKED SALVAGER
21112 GO:     JFCL 17,.+1
21113         JRST .+1
21114         JFCL 1,[JRST 4,.]       ;SYSTEM WONT RUN ON 6
21115 IFN KL10P,[
21116         CONSO PAG,600000
21117          SWPIA                  ;IF CACHE OFF, FLUSH CRUFT THAT MAY BE IN IT
21118         CONSZ PAG,600000
21119          SWPUA                  ;IF CACHE ON, UPDATE CORE SO DDT IS GOOD
21120         CONSZ 200000
21121          JRST .-1
21122         SPCCTX 0,1,USRSTG,DISABLE       ;SET UP UPT ADDR, BUT NO ACCTING TILL
21123         MOVEI T,0                       ;MORE INIT IS DONE.
21124         XCTR XBW,[BLT T,17]             ;CLEAR BLK 1 TO AVOID RANDOM PARITY
21125                                         ; ERRORS
21126 ] ;KL10P
21127 IFN KS10P,[
21128         CONO 20700+APRCHN       ; Clear memory related APR flags
21129                                 ; (ECC, Bad, NXM)
21130         MOVSI TT,%KEHLD+%KEREF+%KEPWR
21131         IOWR TT,[KSECCS]        ; Reset memory status register.
21132         MOVEI TT,%UBTIM+%UBBAD+%UBPAR+%UBNXD+%UBINI
21133         IOWRQ TT,UBASTA         ; Reset both Unibus's and both adaptors.
21134         IOWRI TT,UBASTA
21135         MOVEI TT,DSKCHN_3       ; Set PI level for RH11.  (No, you can't do
21136         IOWRQ TT,UBASTA         ; this at the same time you reset the Unibus.)
21137         MOVEI TT,MTCCHN_3+TTYCHN        ; PI for Tape, for Chaos and TTYs.
21138         IOWRI TT,UBASTA
21139         WRHSB [HSB]             ; Set halt status block location.
21140         CLRCSH                  ; Reset cache once for good measure.
21141         SPCCTX 0,1,USRSTG       ; Set up UPT and AC blocks.
21142 ] ;KS10P
21143 IFN TEN11P,[
21144         MOVEI TT,600000+<T11CPA_-10.>
21145         SKIPGE TEN11F
21146          MOVEI TT,0
21147         DPB TT,[.T11CP+EXEUMP]
21148         SETOM T11MP+<T11CPA&777777>_-10.        ;DONT USE MAP PAGE AS 10-11 PAGE
21149 ;IFN PDP6P,[            ;THESE ARE IN SEPARATE MOBIES NOW
21150 ;       MOVE TT,[-LPDP6M,,<PDP6BM&777777>_-10.]
21151 ;       SETOM T11MP(TT) ;CONFLICTS WITH PDP-6 MEM
21152 ;       AOBJN TT,.-1
21153 ;]
21154 ;IFG TSYSM-256.,[
21155 ;       MOVSI TT,-TSYSM+256.
21156 ;       SETOM T11MP(TT) ;CONFLICT PAGES
21157 ;       AOBJN TT,.-1
21158 ;]
21159 ]
21160         MOVE P,SYSPDP
21161
21162 ;INIT THE EXEC PAGE MAP'S DDT PAGES.
21163         HRRZ A,DDT-2    ;LOWEST ADDR IN SYMBOL TABLE
21164         SUBI A,100      ;LEAVE ROOM FOR EXTRA SYMS, 340 ROUTINES' LOSSAGE, ETC.
21165         LSH A,-10.      ;GET PAGE SYMTAB STARTS IN
21166         MOVEM A,FDDTPG
21167         MOVEI Q,NQS-1   ;PUT THE TUTS JUST BELOW THE DDT PAGES
21168 BEGTT1: SKIPE QACT(Q)
21169          JRST BEGTT3    ;UNIT NOT IN USE
21170         MOVE T,NTBL(Q)  ;NUMBER OF PAGES IN THIS TUT
21171 BEGTT2: SUBI A,1
21172         MOVE B,[MU23TT_<.TZ .BM <MUR>>]
21173         MOVEM B,MEMBLT(A)
21174         DPB Q,[MNUMB,,MEMBLT(A)]
21175         SOJG T,BEGTT2
21176         MOVE B,A
21177         LSH B,10.
21178         HRLI B,640000
21179         MOVEM B,QTUTO(Q)
21180 BEGTT3: SOJGE Q,BEGTT1
21181         MOVEM A,FTUTPG
21182         ;NOW MAKE SURE ALL THOSE PAGES ARE MAPPED
21183         MOVEI B,-200(A)         ;ASSUMING TSYSM AT LEAST 128K
21184         LSH B,-1                ;GET A B.P. TO IDPB MAP HWD OF 1ST DDT PAGE
21185         ADD B,[442200,,EXEUMP]
21186         TRNE A,1
21187          IBP B
21188         MOVEI C,600000+PMCSHM(A) ;COMPUTE CONTENTS OF THAT MAP WORD.
21189         MOVE D,[MUDDT_<.TZ .BM <MUR>>]
21190 BEG3:   CAML A,FDDTPG
21191          MOVEM D,MEMBLT(A)
21192 IFG TSYSM-128., IDPB C,B
21193         AOS C
21194 IFG TSYSM-400,  CAIE A,400
21195 .ELSE           CAIE A,TSYSM    ;STORE THAT MAP WORD AND ALL REST THERE ARE.
21196          AOJA A,BEG3
21197
21198 ;INITIALIZE REST OF EXEC PAGE MAP
21199 IFN DIRMAP,[
21200         MOVE Q,[222200,,EXEUMP]
21201         SETZB A,B
21202         SKIPE USEMDM            ;MAKE MEDIUM MEM NXM IF DIRMAP NOT TURNED ON
21203          MOVEI B,600200+PMCSHM  ;THIS MAY BE USEFUL FOR DEBUGGING
21204         MOVE T,FTUTPG
21205         SUBI T,201              ;STOP AT 1ST TUT PAGE.
21206 BEG2:   CAIL A,NEXPGS
21207          DPB B,Q
21208         IBP Q
21209         ADDI B,1
21210         CAMGE A,T
21211          AOJA A,BEG2
21212 ];END IFN DIRMAP
21213 ;DROPS THROUGH
21214 \f;DROPS IN
21215
21216 ;SET UP EXEC LOWER MAP (EVEN ON KA, WILL BE LOOKED AT BY .CALL CORBLK)
21217         MOVE A,[600000,,600001+PMCSHM]  ;PAGE 0 IS NOT CACHED   
21218         MOVSI B,-100
21219          MOVEM A,EXELMP(B)
21220          TLO A,PMCSHM
21221          ADD A,[2,,2]
21222          AOBJN B,.-3
21223
21224 ;SET UP SYS JOB'S CIRCULAR POINTERS SO ALL THE PAGES IT HAS ARE ABSOLUTE
21225
21226         MOVE A,[442200,,UPGMP]
21227         MOVE B,[442200,,UPGCP]
21228         MOVEI D,0
21229 BEG6:   ILDB T,A
21230         MOVEI E,-1
21231         JUMPN T,BEG7
21232         CAIL D,200+MMP0 ;ALLOW USERS TO COPY MMP EXEC PGS
21233          CAILE D,200+NEXPGS
21234           MOVEI E,0     ;PG IT DOESN'T HAVE, AND NOT COPYABLE EXEC PG
21235 BEG7:   IDPB E,B
21236         CAIGE D,377
21237          AOJA D,BEG6
21238
21239 ;EXEC MAP PREPARED, NOW TURN ON PAGING
21240
21241 IFN KA10P,[
21242         LPMR UPGML
21243         CONO 633550
21244 ] ;KA10P
21245 IFN KS10P,[
21246         CONO 67760      ; Disable and Clear all flags
21247         CONO 127660     ; Enable and Clear all flags except memory ECC
21248         APRID A
21249         TLNN A,%UCITS
21250          BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21251         LDBR3 EXEUMP            ; Load exec DBRs.
21252         LDBR4 EXELMP
21253         LPMR UPGML
21254         SPCCTX 1,1,USRSTG       ; Select AC blocks and set UBR.
21255         WREBR 020000+<EPT/1000> ; Paging on and set EBR.
21256 ] ;KS10P
21257 IFN KL10P,[
21258         CONO 327740     ;ENABLE AND CLEAR ALL FLAGS EXCEPT SWEEP DONE
21259         APRID A
21260         TLNN A,%UCITS
21261          BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21262         SPCCTX 6,6      ;LOAD MICROCODE CONSTANTS NEEDED BY PAGEING INTO
21263                         ; BLOCK 6.
21264         MOVEI 3,EXEUMP  ;DBR3
21265         MOVEI 4,EXELMP  ;DBR4
21266         MOVSI 5,PMAGEM  ;LH.AGE
21267         MOVEI 6,PMAGEM  ;RH.AGE
21268         MOVEI 7,1000    ;CN1000
21269         MOVEI 10,100    ;CN100
21270         CONO PAG,660000+<EPT/1000>      ;CACHE ON, ITS PAGER, TRAP ENB, EPT ADDR
21271         SPCCTX 1,1,USRSTG,DISABLE
21272         LPMR UPGML
21273 ]               ;END IFN KL10P
21274         MOVE P,SYSPDP
21275
21276 ;INITIALIZE FREE LISTS IN MEMBLT
21277
21278         MOVEI A,1       ;A PG NO - NOTE: DON'T DO PAGE ZERO
21279 BEGF0:  CAML A,FTUTPG   ;IF THIS ISN'T A DDT OR TUT PAGE, THEN
21280         CAIL A,400
21281          PUSHJ P,CIMEMR ;PUT THIS PAGE ON THE RIGHT FREE LIST
21282         CAIGE A,TSYSM-1
21283          AOJA A,BEGF0
21284 IFN TEN11P,[
21285         SKIPGE TEN11F
21286          JRST BEG4
21287         MOVSI A,-256.   ;CLEAR THE INTERFACE'S "VALID" BITS.
21288         SETZM 400000+T11CP*2000(A)
21289         AOBJN A,.-1
21290 BEG4:]
21291 IFN XGP,[
21292         SKIPE TEN11F
21293          JRST BEGX1
21294         MOVE A,[600000+<XGP11_8>,,1777]
21295         PUSHJ P,T11AD
21296          BUG            ;NO 10-11 PAGES AVAILABLE?
21297         MOVEI TT,600000+<<T11CPA_-18.>_8>(B)    ;GET CORRESP EXEC MAP PG SETUP
21298         DPB TT,[.XGPC+EXEUMP]
21299         MOVEI TT,600000+<<T11CPA_-18.>_8>+XGPTP
21300         DPB TT,[.XGPB+EXEUMP]   ;SETUP PAGE FOR PDP-11 BUFFER
21301 BEGX1:]
21302 \f
21303 ;CHECK AVAIL MEM FOR EXISTANCE
21304
21305 IFN ECCMEM,[
21306         LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21307         IORI TT,200000          ;GRANT READ ACCESS
21308         DPB TT,[.ECCPG+EXEUMP]
21309         LPMR UPGML
21310         MOVE A,400000+ECCPG*2000+1760   ;GET CURRENT HISTORY POINTER
21311         LSH A,-32.
21312         MOVEM A,ECCIDX
21313 ];ECCMEM
21314         MOVEI A,TSYSM-1
21315 CKML:   MOVEI TT,600000(A)
21316         DPB TT,[.PAREP+EXEUMP]
21317         LPMR UPGML
21318 IFN ECCMEM,[
21319         LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21320         CAMN A,TT               ;THIS PAGE?
21321          JRST CKML1A            ;YES, TREAT AS IF OFFLINE, THOUGH WILL ACCESS IT
21322                                 ; DIRECTLY FROM TIME TO TIME
21323 ]
21324         MOVE TT,A
21325         LSH TT,10.
21326         MOVSI T,-8
21327         CAML TT,MEMLZL(T)
21328          CAML TT,MEMLZH(T)
21329           AOBJN T,.-2
21330         JUMPL T,CKML1A          ;THIS BLOCK KNOWN TO BE LOSING
21331         SKIPL USEHM
21332          CAIGE A,256.
21333           JRST .+2
21334            JRST CKML1A          ;HIGH MOBY NOT TO BE USED
21335 IFN KL10P,[
21336         MOVEI TT,CKML1          ;KL10 CAN GET PARITY FAULT ON REFERENCE TO NXM
21337         MOVEM TT,PFNPC
21338         HRRM TT,MUUOKN          ;IT CAN ALSO GET A UUO
21339 ] ;KL10P
21340 IFN KS10P,[
21341         MOVEI TT,CKML1
21342         MOVEM TT,EPTPFN
21343 ] ;KS10P
21344         CAIL A,256.             ;IF NOT IN BOTTOM 256K, DON'T ASSUME GOOD DATA
21345          SETZM 400000+PAREP*2000+20     ;STORE ZERO SO DON'T GET PARITY ERROR
21346         MOVE 0,400000+PAREP*2000+20     ;IF THIS NXMS, MEM THE SYS THINKS
21347                                         ; IT HAS IS NON EXISTANT
21348 IFN KA10P,[
21349         CONSZ 10000
21350          JRST CKML1             ;THAT MEM NXM
21351 ] ;KA10P
21352 IFN KL10P,[
21353         MOVEI TT,PFAIL
21354         MOVEM TT,PFNPC
21355         MOVEI TT,UUOH0
21356         HRRM TT,MUUOKN
21357         CONSZ 2000
21358          JRST CKML1             ;THAT MEM NXM
21359 ] ;KL10P
21360 IFN KS10P,[
21361         MOVEI TT,PFAIL
21362         MOVEM TT,EPTPFN
21363         CONSZ 400
21364          JRST 4,.       ; This can't happen, right?  (If we got a NXM, we
21365                         ; would have trapped to CKML1 already.)
21366 ] ;KS10P
21367         SKIPL CKMBLK    ;WINS
21368          JRST CKML6     ;THUS ENDING BLOCK OF LOSERS
21369 CKML2:  SOJGE A,CKML
21370         AOSN CKMFLG     ;ANY MEM OFF UNEXPECTEDLY?
21371          JRST CKML5     ;NO
21372         MOVEI TT,[ASCIZ/
21373 IS THIS OK? /]          ;YES, MAKE SURE SOMEBODY KNOWS ABOUT IT.  MAY BE SERIOUS SCREW.
21374         PUSHJ P,T00ASZ
21375         PUSHJ P,T00TYI
21376         ANDI A,137
21377         CAIE A,"Y
21378          JRST DDT
21379         MOVEI TT,[ASCIZ/
21380 /]
21381         PUSHJ P,T00ASZ  ;CRLF
21382 CKML5:
21383 IFN KL10P,[
21384         CONO 26400      ;CLEAR ANY NXM AND PARITY INTERRUPTS
21385         CONI MTS,TT
21386         TLNN TT,400
21387          BUG PAUSE,[TAPE DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21388         CONI DSK,TT
21389         TLNN TT,4000
21390          BUG PAUSE,[DISK DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21391 ] ;KL10P
21392 IFN KS10P, CONO 20400           ; Clear NXM flag
21393 ;DROPS THROUGH
21394 \f;DROPS IN
21395
21396 IFN RP10P,[
21397         DATAI DPC,A
21398         TLNN A,NOWRIH           ;CHECK FOR FORMAT SWITCH ON RP10
21399          BUG PAUSE,[RP-10 WRITE HEADERS ENABLED, PLEASE FLIP THE SWITCH]
21400 ];RP10P
21401
21402 IFE <MCOND MLKA,>&<MCOND DM,>,[ ;CHECK FOR LOSING SWITCHES ON MEMORY ON ML-KA AND DM
21403
21404         MOVSI D,(DWRITC)        ;MAKE COMMAND FOR VERY LAST BLOCK ON DISK
21405         MOVEI A,NCYLS+XCYLS-1
21406         DATAO DPC,[DNOOPC]      ;DETERMINE TYPE OF DRIVE 0
21407         DATAI DPC,B
21408         TRNE B,RP03BT
21409          MOVEI A,MCYLS+XCYLS-1  ;RP03
21410         DPB A,[DCYL D]
21411         LSH A,-8
21412         DPB A,[DCYLXB D]
21413         MOVEI A,NHEDS-1
21414         DPB A,[DSURF D]
21415         ADDI D,QICWA
21416         MOVEM D,CKMSWC
21417         SUB D,[DWRITC-DREADC]
21418         MOVEM D,CKMSRC
21419         SUB D,[DREADC-DSEEKC]
21420         MOVEM D,CKMSSC
21421         MOVEI A,0
21422 CKMS1:  LDB TT,[MUR,,MEMBLT(A)] ;MEM EXIST?
21423         CAIE TT,MUFR            ;AND NOT DDT?
21424          JRST CKMS2
21425         MOVEI B,600000(A)
21426         DPB B,[.PAREP+EXEUMP]
21427         LPMR UPGML
21428         CAIGE A,CKMSZZ          ;MEM LOADED?
21429          JRST CKMS3             ;YES
21430         MOVSI B,'FOO            ;NO, LOAD IT
21431         MOVEM B,CKMSBF
21432         MOVE B,[CKMSBF,,CKMSBF+1]
21433         BLT B,CKMSBF+177
21434         MOVEI B,'BAR
21435         HRRM B,CKMSBF+69.
21436         HRRM A,CKMSBF+6         ;MAKE DIFF FROM OTHER SUCH PAGES
21437         MOVEI C,1
21438         MOVE B,A
21439         LSH B,-4                ;16K BLOCK # IN B
21440         LSH C,(B)               ;GET UNIQUE BIT SO PARITY ERR IF TWO AT SAME ADDR
21441         MOVEM C,CKMSBF+35
21442         MOVE B,[CKMSBF,,400000+PAREP*2000]
21443         BLT B,400000+PAREP*2000+177
21444 CKMS3:  MOVE B,A                ;MAKE IOWD
21445         LSH B,10.
21446         SOS B
21447         HRLI B,-200
21448         LDB C,[100300,,A]       ;MA 15-17
21449         TRC C,7
21450         DPB C,[410300,,B]
21451         MOVEM B,QICWA
21452         SETZM QICWA+1
21453         CONO DPC,175700
21454         DATAO DPC,CKMSSC        ;POSITION HEADS
21455         CONSO DPC,10
21456          JRST .-1
21457         DATAO DPC,CKMSWC        ;WRITE OUT SECTOR
21458         CONSZ DPC,20
21459          JRST .-1
21460         CONI DPC,B
21461         TLNE B,17
21462          JRST CKMS4             ;CHANNEL ERROR MEM LOSING
21463         TRNE B,177700
21464          JRST CKMS2             ;FOO, DISK LOSING
21465         MOVE B,[-200,,CKMSBF-1] ;READ IT BACK   
21466         MOVEM B,QICWA
21467         SETZM QICWA+1
21468         SETZM CKMSBF+69.
21469         CONO DPC,175700
21470         DATAO DPC,CKMSRC
21471         CONSZ DPC,20
21472          JRST .-1
21473         CONI DPC,B
21474         TLNE B,17
21475          JRST CKMS2             ;MEM LOSS IN CKMSBF?
21476         TRNE B,177700
21477          JRST CKMS2             ;FOO, DISK LOSING
21478         MOVSI B,-200            ;COMPARE
21479         MOVE C,CKMSBF(B)
21480         CAME C,400000+PAREP*2000(B)
21481          JRST CKMS4             ;NOT SAME SWITCHES LOSING
21482         AOBJN B,.-3
21483 CKMS2:
21484 IFE MCOND DM,   ADDI A,16.      ;MA10'S !!
21485 IFE MCOND MLKA, ADDI A,32.      ;ML-KA MEM IS IN 32K MODULES
21486         CAIGE A,TSYSM
21487          JRST CKMS1
21488         CONO DPC,175700         ;RESET THE DISK CONTROL
21489         DATAO DPC,[DEASEC+776]  ;AT EASE!
21490         CONO PI,20000           ;TURN OFF IOB PI REQ LIGHT
21491         JRST CKMSX              ;DONE WITH THIS, CONTINUE INITIALIZATION
21492
21493 CKMSBF: BLOCK 200
21494
21495 CKMS4:  MOVEI TT,[ASCIZ/MEM ADDR SWITCHES DISAGREE CPU VS DSK AT LOC /]
21496         PUSHJ P,T00ASZ
21497         PUSHJ P,T00BKO
21498         MOVEI TT,[ASCIZ/0000/]
21499         PUSHJ P,T00ASZ
21500         JRST DDT
21501
21502 CKMSZZ==./2000+2                ;ABOVE HIGHEST CODE
21503
21504 CKMSX:
21505 ]               ;END IFE MCOND MLKA & DM
21506 \f;DROPS IN
21507         MOVEI TT,0
21508         DPB TT,[.PAREP+EXEUMP]
21509         LPMR UPGML
21510 IFN KA10P,      CONO PI,240000+11577+IFN C1MXP,20000
21511 IFE KA10P,      CONO PI,11577
21512 IFN NOTYS,      CONO TTY,TTYCHN
21513 IFN NETYS,[
21514                 SETOM DTEODN            ;CAN GET SET ON WHILE LOADING, BUT INTR GETS LOST
21515 IFE PDCLKP,     CONO DTE,1170+APRCHN    ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21516 IFN PDCLKP,     CONO DTE,1170+TTYCHN    ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21517 ]               ;END OF IFN NETYS
21518 IFN E.SP,[
21519         CONO DIS,515330 ;RESET E&S
21520         MOVEI TT,E.SPM
21521         MOVEM TT,34     ;SET PAGER LOC (USED BY DSKDUMP)
21522 ]
21523 IFN TM10B,[
21524         MOVEI TT,MIOWD
21525         MOVEM TT,MICWA  ;SETUP LOC FOR MEM CHAN TAPE
21526 ]
21527 IFN RP10P+RH10P,[
21528         MOVEI TT,QIOWD
21529         MOVEM TT,QICWA  ;SETUP FOR DEC DISK CHANNEL
21530 ]
21531 IFN ARMP,       DATAO 760,[0]   ;RESET LITE ON ARM
21532 IFN DSDP,       CONO DSDEV,10   ;RESET INT RQ FROM PDP10
21533 IFN RBTCP,      CONO RBTCON,0   ;RESET TABLET
21534
21535         MOVE A,DDT-2    ;PUT GLOBAL BLOCK HEADER AT BEGINNING
21536         MOVE B,[SQUOZE 0,GLOBAL]
21537         CAME B,(A)      ;SEARCH FOR GLOBAL BLOCKS
21538         AOBJN A,[       AOBJN A,.-1
21539                         JRST BEGS1]
21540         MOVE C,DDT-2
21541         MOVEI D,(C)
21542         SUBI D,(A)      ;GET ,,-#WDS  BEFORE GLOBAL BLOCK
21543         MOVSI D,(D)
21544         ADDM D,1(A)     ;GLOBAL BLOCK NOW LARGER
21545         EXCH B,(C)      ;EXCHANGE IT WITH FIRST SYM
21546         MOVEM B,(A)
21547         MOVE B,1(A)
21548         EXCH B,1(C)
21549         MOVEM B,1(A)
21550 BEGS1:  PUSHJ P,SBUBL
21551         JUMPL J,BEGS1   ;KEEP SORTING UNTIL SYMS IN ORDER
21552         MOVSI A,400000
21553         IORM A,DDT-1
21554
21555 ; SORT THE UUO/SUSET/BIT SYMBOL TABLE BY VALUE
21556
21557         MOVE E,[SYSYMB-SYSYME-1,,SYSYMB]
21558         PUSHJ P,SBUBL0
21559         JUMPL J,.-2
21560
21561         MOVE A,[-LTSTB,,TSTB]
21562 BEG1:   MOVE B,(A)
21563         MOVEI C,(B)
21564         EQV C,(B)
21565         AOBJN B,.-1
21566         MOVEM C,CKSUMS-TSTB(A)
21567         MOVE B,(A)
21568 CKXC2:  MOVE C,(B)
21569 REPEAT 36.,[
21570         IFL .RPCNT-18., TLNE C,400000_<-.RPCNT>
21571         .ELSE           TRNE C,400000_<18.-.RPCNT>
21572         XORM B,CKXORS+.RPCNT
21573 ]
21574         AOBJN B,CKXC2
21575         AOBJN A,BEG1
21576         HRRZS 37                ;MAKE SURE SYS DOESNT IMMEDIATELY COME DOWN
21577 ;DROPS THROUGH
21578 \f;DROPS IN
21579         MOVEI A,0
21580         CLEARM QACTB
21581 QSETUP: MOVE B,DCHBT(A)
21582         SKIPN QACT(A)
21583         IORM B,QACTB
21584         CAIGE A,NQS-1
21585         AOJA A,QSETUP
21586 IFN DC10P,      CONO DC0,DCCSET+DCDENB+DSKCHN   ;RESET 2314 AND SET DATA ERROR ENABL
21587 IFN 340P,       CONO DIS,100
21588 IFN TK10P,      CONO NTY,TTYCHN
21589 IFN MTYP,       CONO MTY,TTYCHN
21590         CLEARM USRHI
21591         CLEARB U,USER
21592         MOVE P,SYSPDP
21593 IFN DPKPP,[
21594         CONO DPK,400070+TTYCHN  ;INITIALIZE DP KLUDGE
21595         DATAO DPK,[4,,DPKBAS]
21596         MOVE T,[-NDPTYS,,NFDPTY]
21597         MOVEI B,0       ;LINE #
21598 DPIL:   LDB A,[$TTOSP,,TTYTYP(T)]       ;OUTPUT SPEED
21599         MOVE A,DPSP(A)          ;MAP TO DPK SPEED CODE
21600         DPB B,[140400,,A]       ;LINE #
21601         CONO DPK,500+TTYCHN(A)  ;LOAD OUT SPEED
21602         LDB A,[$TTISP,,TTYTYP(T)]       ;INPUT SPEED
21603         MOVE A,DPSP(A)          ;MAP TO DPK SPEED CODE
21604         DPB B,[140400,,A]
21605         CONO DPK,700+TTYCHN(A)  ;LOAD IN SPEED
21606         AOS B
21607         AOBJN T,DPIL
21608 ]
21609 IFN DZ11P,[
21610         PUSHJ P,DZINIT
21611 ];DZ11P
21612 IFN N11TYS,[
21613         SKIPE TEN11F
21614          JRST BEG5
21615         MOVSI R,-NTTPG-NTVBP+1
21616         MOVE T,[.TTPG0+EXEUMP]
21617 BEG9:   MOVEI A,(R)     ;SET UP 1 MORE TEN-11 MAP ENTRY
21618         LSH A,20.
21619         IORI A,1777     ;A FULL PAGE
21620         TLO A,600000+TT11NM*400
21621         PUSHJ P,T11AD
21622          BUG
21623         ADDI B,600000+<<T11CPA_-18.>_8>         ;READ-WRITE, IN HIGH MOBY.
21624         DPB B,T
21625         IBP T
21626         AOBJN R,BEG9
21627         MOVE A,[(600000+TT11NM*400)TT11CR_8]    ;POINTER TO CONSOLE REG
21628         PUSHJ P,T11AD
21629          BUG
21630         ADDI B,600000+<<T11CPA_-18.>_8>
21631         DPB B,T
21632         LPMR UPGML
21633         SKIPE TT11P     ;IF WE'RE SUPPOSED TO USE THE TV 11,
21634          SETZM TT11UP   ;REQUEST IT TO RE-INIT.
21635                 ;IF TT11UP BECOMES NONZERO, THE 11 IS UP.
21636 BEG5:   ];END IFN N11TYS
21637 IFN CH11P,[
21638         XCTRI [IORDI A,CAIMYN]
21639          CAIA
21640           BUG HALT,[CHAOSNET INTERFACE NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS)]
21641 ] ;CH11P
21642 IFN CHAOSP,[ IFN T11CHP,[
21643         SKIPE TEN11F    ;SET UP TEN-11 CHAOS NET INTERFACE PAGE
21644          JRST BEG8
21645         MOVE A,[(600000+CH11NM*400)1004_8+1777]
21646         PUSHJ P,T11AD
21647          BUG
21648         ADDI B,600000+<<T11CPA_-18.>_8>
21649         DPB B,[.CHSPG+EXEUMP]
21650 BEG8:   ]] ;CHAOSP, T11CHP
21651 IFN DL10P,[             ;INITIALIZE DL10
21652         CONO DLC,400000 ;MR CLR
21653         CONO DLB,1      ;TURN OFF EXCESS LIGHTS
21654         CONO DLB,2      ;..
21655         CONO DLB,3      ;..
21656         CONO DLB,DL10AR ;64 WORDS FOR PDP11 #0 AT DL10AR
21657         DATAO DLC,[200001,,]    ;KA INTERRUPT MODE
21658         SKIPE DL10F
21659          CONO DLC,100020+TTYCHN ;ENB PDP11 PORT #0 AND ENB INTR
21660         MOVSI T,1
21661         SKIPN DL10UP
21662          SOJG T,.-1
21663         SKIPGE T        ;IF THE 11 DIDN'T SAY IT WAS UP,
21664          SETZM DL10F    ;MARK IT NON-FUNCTIONAL.
21665 ]
21666 IFN KL10P,[
21667         CONO TIM,460000+3900.   ;SET INTERVAL TIMER TO 39 MILLISECONDS FOR OVHMTR
21668         CONO MTR,433001 ;TIME BASE ON, ACCOUNT FOR USER + EXEC NO PI, INTERVAL PIA=1
21669         PUSHJ P,PRFOFF  ;INIT PERFORMANCE COUNTER
21670 ] ;KL10P
21671 \f
21672 ;DROPS IN
21673         MOVSI T,%TBNOT+%TBDTY+%TBNVR    ;SYS JOB HAS NO CONSOLE ALL TO ITSELF
21674         MOVEI U,LUBLK
21675         PUSHJ P,USSINI  ;INITIALIZE SYS JOB VARIABLES BLOCK
21676          JRST .-1
21677         AOS NMPGS
21678 IFE KA10P,[
21679         MOVEI T,UUOH0   ;CLOBBERED BY USSINI
21680         HRRM T,MUUOKN
21681 ] ;IFE KA10P
21682         MOVSI T,600000
21683         HLLM T,UPGMP    ;GIVE PG 0 TO SYS JOB
21684         MOVSI T,-1
21685         HLLM T,UPGCP
21686         MOVEI T,2000
21687         MOVEM T,HUSRAD
21688         MOVEI T,SYSRCE  ;SET SYS JOB RESOURCE POINTER
21689         MOVEM T,UTMPTR
21690         MOVSI A,(SIXBIT /SYS/)  ;""" NAMES
21691         MOVEM A,USYSNM(U)
21692         MOVEM A,UNAME(U)
21693         MOVEM A,XUNAME(U)
21694         MOVEM A,JNAME(U)
21695         MOVEM A,XJNAME(U)
21696         SETZM USTP(U)
21697         MOVSI T,%TBNOT+%TBDTY+%TBNVR    ;CORE JOB HAS NO CONSOLE
21698         MOVEI U,2*LUBLK
21699         PUSHJ P,USSINI  ;SET UP CORE JOB VARIABLES BLOCK
21700          JRST .-1
21701         MOVE A,[SIXBIT /CORE/]
21702         MOVEM A,USYSNM(U)
21703         MOVEM A,UNAME(U)
21704         MOVEM A,XUNAME(U)
21705         MOVSI A,(SIXBIT /JOB/)
21706         MOVEM A,JNAME(U)
21707         MOVEM A,XJNAME(U)
21708         MOVEI T,SYSRCE
21709         MOVEM T,UTMPTR+LUBLK
21710         SETZM USTP(U)
21711         MOVEI A,CORJI
21712 IFE KA10P, HRLI A,%PSPCU        ;DOES CORE JOB XCTR?
21713         MOVEM A,UPC(U)
21714 IFE KA10P,[
21715         MOVE T,[JSR ILLTRP]     ;SYS AND CORE JOBS SHOULDN'T TRAP
21716         MOVEM T,TR1INS          ;THESE WON'T BE USED ANYWAY UNLESS
21717         MOVEM T,TR2INS          ;SOMEDAY THEY SHOULD RUN IN USED MODE
21718         MOVEM T,TR3INS
21719         MOVEM T,TR1INS+L
21720         MOVEM T,TR2INS+L
21721         MOVEM T,TR3INS+L
21722 ] ;IFE KA10P
21723         MOVEI A,SYSB+2          ;GIVE SYSTEM CORE TO SYS JOB, WITH A COUPLE
21724         MOVEM A,CORRQ           ; SPARE JOB SLOTS
21725         AOS NCORRQ
21726         SOS A
21727         ADDM A,NCBCOM
21728 ;       DATAI CLK1,LCLK1
21729         CONO PI,100+UTCON-1     ;ALL EXCEPT 7
21730 IFN KA10P, CONO 3000+APRCHN
21731 IFN KL10P,[
21732 IFN PDCLKP, CONO CLK,APRCHN
21733 .ELSE [ MOVEI A,%DTCLN  ;TURN ON 60-CYCLE CLOCK
21734         MOVEM A,DTECMD
21735         SETZM DTEFLG
21736         CONO DTE,%DBL11
21737         SKIPN DTEFLG
21738          JRST .-1
21739 ]
21740         CONO APRCHN     ;ENABLE APR FAULT INTERRUPTS
21741         SWPUA           ;UPDATE MEMORY AGAIN TO MAKE SURE DDT + SYMBOL
21742                         ; TABLE OUT OF CACHE
21743         CONSZ 200000
21744          JRST .-1
21745 ] ;KL10P
21746 IFN KS10P,[
21747         WRINT [KSFREQ]          ; 60 cycle clock.
21748         CONO APRCHN             ; Enable APR faults and clock ints.
21749         CLRCSH                  ; Is this necessary?  What the heck...
21750 ] ;KS10P
21751 IFN CH10P,[
21752         CONI CHX,T              ;CHECK CHAOS ADDRESS SWITCHES
21753         LDB T,[$CHXAD,,T]
21754         CAIE T,MYCHAD
21755          JRST [ MOVEI TT,[ASCIZ/CHAOSNET ADDRESS SWITCHES ARE SET WRONG/]
21756                 PUSHJ P,T00ASZ
21757                 JRST DDT ]
21758         CONO CHX,@CHXCNO        ;ENABLE INTERRUPTS
21759 ];CH10P
21760         JRST ICLR
21761 \f
21762 CKML1:                  ;MEM NON-EXISTANT PATCH OUT
21763 IFN KA10P, CONO 10000   ;TURN OFF NXM FLAG
21764 IFN KL10P,[
21765         CONO 22000
21766         MOVEI TT,PFAIL
21767         MOVEM TT,PFNPC
21768         MOVEI TT,UUOH0
21769         HRRM TT,MUUOKN
21770 ] ;KL10P
21771 IFN KS10P,[
21772         CONO 20400
21773         MOVEI TT,PFAIL
21774         MOVEM TT,EPTPFN
21775 ] ;KS10P
21776         SKIPGE CKMBLK
21777          MOVEM A,CKMBLK ;HIGHEST IN BLOCK OF LOSERS
21778 CKML1A: LDB TT,[MUR,,MEMBLT(A)]
21779         CAIE TT,MUFR
21780          BUG            ;?
21781         CAIG A,SYSB+1
21782          JRST 4,.       ;SYS MEM NON EX? (BUG PROBABLY WON'T WORK)
21783         PUSHJ P,MPOUT2  ;FLUSH THAT BLOCK
21784         MOVEI TT,MUHOLE
21785         DPB TT,[MUR,,MEMBLT(A)]
21786         CAIL A,400      ;IF NXM IN LOW MOBY
21787          JRST CKML2
21788         MOVEI U,0
21789         PUSHJ P,UPLC
21790         LDB TT,T
21791         ANDI TT,PMRCM
21792         CAIE TT,(A)
21793          JRST CKML2
21794         DPB U,T         ;PATCH THIS BLOCK OUT OF EXEC MAP
21795         DPB U,Q
21796         JRST CKML2
21797
21798 ; REPORT A BLOCK OF LOSING MEMORY
21799
21800 CKML6:  PUSH P,A
21801         MOVEI TT,[ASCIZ/MEM OFF /]
21802         AOSN CKMFLG
21803          PUSHJ P,T00ASZ
21804         ADDI A,1        ;LOWEST LOSER = HIGHEST WINNER + 1 PAGE
21805         PUSHJ P,T00BKO
21806         MOVEI A,"-
21807         PUSHJ P,T00TYO
21808         MOVE A,CKMBLK
21809         PUSHJ P,T00BKO
21810         MOVEI A,40
21811         PUSHJ P,T00TYO
21812         SETOM CKMBLK
21813         POP P,A
21814         JRST CKML2
21815
21816 USEHM:  -1      ;-1 => USE MEM IN HIGH MOBY (IF PRESET)
21817
21818 CKMBLK: -1      ;IF + HIGHEST LOSING BLOCK IN CONTIG RANGE
21819 CKMFLG: -1      ;IF + PRINTED MESSAGE ALREADY
21820 CKMSWC: 0       ;WRITE CMD
21821 CKMSRC: 0       ;READ CMD.
21822 CKMSSC: 0       ;SEEK CMD.
21823 ;UP TO 8 RANGES OF ADDRESSES THAT SHOULD NOT BE USED BECAUSE THEY
21824 ;DON'T WORK BUT AREN'T NXM.
21825 MEMLZL: BLOCK 8 ;LOWEST LOC
21826 MEMLZH: BLOCK 8 ;HIGHEST LOC+1
21827 FTUTPG: 0       ;FIRST PAGE USED FOR TUTS
21828 \f
21829 ;INPUT CHAR FROM CONSOLE TTY AND ECHO
21830
21831 T00TYI:
21832 IFN KA10P,[
21833         CONSO TTY,40
21834          JRST .-1
21835         DATAI TTY,A
21836         ANDI A,177
21837 ] ;KA10P
21838 IFN KL10P,[
21839         SETZM DTEFLG
21840         MOVEI A,%DTTYI
21841         MOVEM A,DTECMD
21842         CONO DTE,%DBL11
21843         SKIPN DTEFLG
21844          JRST .-1
21845         SKIPN A,DTEF11
21846          JRST T00TYI
21847 ] ;KL10P
21848 IFN KS10P,[
21849         SKIPN A,8CTYIN
21850          JRST .-1
21851         ANDI A,177
21852 ] ;KS10P
21853
21854 ; TYPE CHAR IN A ON CONSOLE TTY
21855
21856 T00TYO:
21857 IFN KA10P,[
21858         CONSZ TTY,20
21859          JRST .-1
21860         DATAO TTY,A
21861 ] ;KA10P
21862 IFN KL10P,[
21863         SETZM DTEFLG
21864         MOVEM A,DTECMD
21865         CONO DTE,%DBL11
21866         SKIPN DTEFLG
21867          JRST .-1
21868 ] ;KL10P
21869 IFN KS10P,[
21870         PUSH P,A
21871         ANDI A,177
21872         IORI A,400
21873         MOVEM A,8CTYOT
21874         CONI A
21875         IORI A,80INT
21876         CONO (A)
21877         SKIPE 8CTYOT
21878          JRST .-1
21879         POP P,A
21880 ] ;KS10P
21881         POPJ P,
21882
21883 ; TYPE BLOCK NO IN A AS HIGH 3 OCTAL DIGITS OF ADDR
21884 ; (ALL MEMORIES MULTIPLE OF 4K.  MAX MEMORY 2M WORDS.)
21885
21886 T00BKO: PUSH P,A
21887         PUSH P,B
21888         LSHC A,-8
21889 REPEAT 3,[
21890         ADDI A,"0
21891         PUSHJ P,T00TYO
21892         MOVEI A,0
21893         LSHC A,3
21894 ]
21895         JRST POPBAJ
21896
21897 ; TYPE ASCIZ IN TT ON T00
21898
21899 T00ASZ: PUSH P,A
21900         HRLI TT,440700
21901 T00AZ1: ILDB A,TT
21902         JUMPE A,POPAJ
21903         PUSHJ P,T00TYO
21904         JRST T00AZ1
21905 \f
21906 IFN DPKPP,[     ;MAP SYSTEM SPEED CODES TO DATAPOINT KLUDGE CODES
21907 DPSP:   0_9     ;134
21908         1_9     ;600
21909         2_9     ;110
21910         3_9     ;150
21911         4_9     ;300
21912         5_9     ;1200
21913         5_9     ;1800 *
21914         6_9     ;2400
21915         7_9     ;4800
21916 REPEAT 20-<.-DPSP>, 7_9 ;FAST *
21917 ];DPKPP
21918
21919 CONSTANTS
21920 VARIABLES
21921
21922 IEND:
21923 .HKALL==0
21924
21925 ; Define location known as start of SALV disk salvager.  If system overruns
21926 ; this address, must either reduce system size or increase the SALV start
21927 ; address.  If SALV is changed, the SALV program must also be changed to
21928 ; start at the right place.  There is a limit to how high it can go,
21929 ; however.
21930 IFN KL10P, SALV==:105*2000      ; MC-KL is getting huge
21931 .ELSE SALV==:100*2000
21932 IFG IEND-SALV,.FATAL System overruns SALV start addr!
21933
21934 IFGE TSYSM-256.,DDT=774000
21935 .ELSE DDT=TSYSM*2000-4000
21936 DSKDMP==DDT+3700
21937
21938 IFG LBUGTB-LBUGT2,[
21939 .ERR MAKE THE BUGTAB BIGGER
21940 INFORM LBUGTB-LBUGT2,\LBUGTB-LBUGT2
21941 .FATAL FATAL ERROR, RUNNING THIS WOULD CAUSE TOTALLY WEIRD BUGS
21942 ]
21943
21944 IF2 EXPUNGE FOO,ZZZQ,FNM,ZCHR,ZZ,ZZZ,BUGB,BUGF,BUGN,BUGNN
21945
21946 END BEG         ;START AT BEG TO SALVAGE AND RUN ITS, START AT GO TO JUST ITS