Consolidate license copies
[its.git] / system / its.1632
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 SNUTC==41
1128 SN2311==43
1129 SNFUSR==60
1130 SNUSR==61
1131 SNCLK==62       ;CLO, CLU, & CLI
1132 SNDIR==63
1133 SNPDP==64       ;PDP6
1134 SNDIRH==65      ;DIRHNG "DEVICE"
1135 SNLCK==66       ;LOCK "DEVICE"
1136 \f
1137 SUBTTL SYSTEM VERSION NUMBER & MISC MACROS
1138
1139 ITSMCH==:<MNAME SIXBIT/,/>      ; Define SIXBIT machine name symbol
1140 ITSVRS==:.FNAM2 ; Preserve SIXBIT symbol value of ITS version #
1141 FNM==ITSVRS     ;SRI GETS VERSION NUMBER
1142                 ;WORKS FOR DECIMAL IGNORES LOW ORDER NON-NUMERIC CHRS
1143 DEFINE VNAM
1144 .TAG FOO
1145         ZZZQ==FNM&77
1146         IFGE ZZZQ-'0,IFLE ZZZQ-'9,.GO BAR
1147         FNM==FNM_-6
1148         .GO FOO
1149 .TAG BAR
1150         ZZZQ==1
1151         SRI==0
1152 .TAG MUM
1153         IFE FNM,.GO END
1154         ZCHR==FNM&77-'0
1155         IFL ZCHR,.GO END
1156         IFG ZCHR-9,.GO END
1157         SRI==SRI+ZZZQ*ZCHR
1158         ZZZQ==ZZZQ*10.
1159         FNM==FNM_-6
1160         .GO MUM
1161 .TAG END
1162         TERMIN
1163
1164 IF1 VNAM
1165
1166 DEFINE SRITYP A
1167 ZZZ==10 ;SAVE OLD RADIX
1168 RADIX 10.
1169         MOVEI I,[MNAME [.ASCII ?
1170 ] ITS !SRI A?]
1171 RADIX ZZZ
1172         TERMIN
1173
1174                 ;"MONTHS OF THE YEAR" MACRO
1175
1176 DEFINE MNIRP A
1177 IRPS M,,[JAN:FEB:MAR:APR:
1178 MAY:JUN:JUL:AUG:
1179 SEP:OCT:NOV:DEC:]L,,[31. 29. 31. 30.
1180 31. 30. 31. 31.
1181 30. 31. 30. 31.]
1182 A
1183 TERMIN
1184 TERMIN
1185
1186 FOO==-1 ;ACCUMULATED VALUE FOR FOLLOWING DEFINITION:
1187
1188 MNIRP [M==FOO
1189 FOO==FOO+L]     ;JAN=-1, FEB=30., MAR=59., ETC.
1190 \f
1191 DEFINE INFORM A,B
1192 IF1,[PRINTX \A = B
1193 \]TERMIN
1194
1195 ZZZ==10
1196 RADIX 10.
1197 INFORM VERSION,\SRI
1198 RADIX ZZZ
1199
1200 SSYS==0 ;LENGTH OF SYS CODE
1201
1202 DEFINE EBLK
1203 IFN CKPAR,.ERR LOSS AT EBLK
1204 CKPAR==1
1205 IFE .-CKZZ,.STOP                ;NO WORDS BETWEEN BBLK AND EBLK
1206 CONC CK,\CKNUM,==CKZZ-.,,CKZZ
1207 CKNUM==CKNUM+1
1208 SSYS==SSYS+.-CKZZ
1209 TERMIN
1210
1211 DEFINE BBLK
1212 CKZZ==.
1213 IFE CKPAR,.ERR LOSS AT BBLK
1214 CKPAR==0
1215 TERMIN
1216
1217 CKPAR==1
1218 CKNUM==0
1219
1220
1221 ;INSERT CALL TO THIS MACRO AT ANY PLACE IT IS POSSIBLE TO PCLSR
1222 ;(IF IT IS DESIRED FOR PCLSR TEST FEATURE TO TEST THAT SECTION)
1223
1224 DEFINE PCLT
1225 IFN PCLSW,[
1226         SKIPE PCLDBM
1227         PUSHJ P,PCLTST
1228 ]
1229 TERMIN
1230
1231 DEFINE  PCLTH A
1232 IFN PCLSW,[
1233         SKIPN PCLDBM
1234         JRST .+3
1235         PUSHJ P,PCLTSH
1236         A
1237 ]
1238 TERMIN
1239
1240 DEFINE  PI2SAF
1241         CONSO PI,20000
1242          CONSO PI,40
1243           CAIA
1244            JRST 4,.     ;PI 2 NOT OFF AND NOT IN PROGRESS
1245 TERMIN
1246 \f
1247 SUBTTL DEFINE EXEC PAGES
1248
1249 EXPGN==0
1250
1251 DEFINE EXECPG X
1252 X==EXPGN
1253 EXPGN==EXPGN+1
1254 ZZQ==<X+1>&1
1255 ZZQQ==X_-1
1256 .!X==220000*ZZQ+2200,,ZZQQ
1257 TERMIN
1258
1259 ;EXEC MAP ASSIGNMENTS
1260 IFN 340P,[
1261 EXECPG 340P1,   ;USED TO FETCH + TRACE 340 PNTRS
1262 EXECPG 340P2,
1263 REPEAT N340PB,CONC [EXECPG DPG]\.RPCNT,;        ;DATA AREA PNTRS FOR 340 DATA
1264 ]
1265 EXECPG CORJF,   ;CORE JOB FROM PAGE
1266 EXECPG CORJT,   ;CORE JOB TO PAGE
1267 IFN VIDP,[
1268 EXECPG VSB1,    ;.VSCAN B1
1269 EXECPG VSB2,    ;.VSCAN B2
1270 ]
1271 IFN TEN11P,[
1272 EXECPG T11CP,   ;TEN11 CONTROL PAGE
1273 ]
1274 EXECPG PAREP,   ;USED BY SYSTEM IN ITS DILIGENT EFFORTS TO FIX PARITY ERRORS
1275
1276 IFN ECCMEM, EXECPG ECCPG,       ;PAGE USED TO ACCESS ECC HISTORY
1277
1278 IFN XGP,[
1279 EXECPG XGPC,    ;LOW 2K OF XGP PDP-11   (USED TO TRACE BUFF POINTERS)
1280 EXECPG XGPB,    ;2K BUFFER IN PDP-11 (CHANGES LOCATION)
1281 EXECPG XGPUB,   ;XGP USER CORE EXEC PG SETUP TO POINT TO USER CORE DURING XGPIM SYSTEM CALL
1282 ]
1283 IFN N11TYS,[
1284 REPEAT NTTPG,[CONC [EXECPG TTPG]\.RPCNT,
1285 ]
1286 REPEAT NTVBP,[CONC [EXECPG TTR]\.RPCNT,
1287 ]]
1288 IFN CHAOSP,[ IFN T11CHP,[
1289 EXECPG CHSPG    ;CHAOS NET 10-11 COMMUNICATION PAGE
1290 T11CHS=400000+CHSPG*2000
1291 ]] ;CHAOSP, T11CHP
1292 ;^ INSERT NEW EXEC PAGES HERE
1293 ;EXEC PAGES BELOW THIS POINT WILL BE COPYABLE BY USERS
1294 REPEAT NMMP,CONC [EXECPG MMP]\.RPCNT,;  ;MMP TABLE
1295  MMP=MMP0*2000+400000   ;VIRTUAL ADDRESS OF MMP
1296 EXPUNGE EXECPG
1297 NEXPGS==EXPGN   ;# EXEC PGS USED
1298 \f
1299 SUBTTL LOW CORE
1300
1301 .YSTGWD         ;STORAGE WORDS OKAY NOW
1302
1303 IFN KL10P, LOC EPT+1000         ;KL needs a full DEC page for EPT
1304 IFN KS10P,[
1305  IFE KSIMP, LOC EPT+1000        ;KS needs a full DEC page, too,
1306  IFN KSIMP, LOC EPT+2000        ; unless you are losing even worse.
1307 ]
1308
1309 PATB=.
1310 LOC 20
1311         BBLK
1312
1313 IFN KS10P,[
1314 LOC 30                          ; 8080 communications area
1315         EBLK
1316 ] ;IFN KS10P
1317
1318 IFN TM10B,[
1319         LOC 30
1320         EBLK
1321 MICWA:  MIOWD
1322         0
1323 IFE RP10P+RH10P,BBLK
1324 ]
1325 IFN RP10P+RH10P,[
1326         LOC 32
1327 IFE TM10B,EBLK
1328 QICWA:  QIOWD
1329         0
1330 IFN QRDCMP,[
1331 RCICWA: 0
1332         0
1333 ];QRDCMP
1334         BBLK
1335 ]
1336 IFN E.SP,[
1337         LOC 34
1338         E.SPM   ;POINTER , NEVER CHANGES
1339 ]
1340
1341 IFE KS10P,[
1342 LOC 37
1343         EBLK
1344 ] ;IFE KS10P
1345
1346 LOC 41
1347 IFN KA10P, JSR UUOH     ;UUO TRAP
1348 IFE KA10P, JSR LUUOEX   ;USER UUO IN EXEC MODE (ERROR)
1349
1350 LOC PI0LOC+2
1351         REPEAT 2,       JSR RINT1
1352         REPEAT 6*2,     JSR RINT        ;INITIALIZE ANY UNUSED PI LOCNS
1353
1354 LOC 61
1355 IFN KA10P, JSR 60H              ;60 TRAP
1356 IFN C1MXP, REPEAT 2*7., JSR RINT1       ;INITIALIZE C1MPX LOCNS
1357
1358 LOC PI0LOC+2*APRCHN
1359         JSR CLKBRK      ;PROCESSOR OR CLOCK INTERRUPT
1360         JRST 4,.
1361
1362 LOC PI0LOC+2*LPTCHN
1363         JSR LPTBRK      ;LPT,DISPLAY,PTP,PTR,OTHER PROCESSOR
1364 IFN 340P,       JSR DRECYC      ;HACK HACK
1365
1366 LOC PI0LOC+2*TTYCHN
1367         JSR TTYBRK      ;TTY,DATAPOINT KLUDGE
1368         JRST 4,.
1369
1370 LOC PI0LOC+2*UTCCHN
1371         JSR UTCBRK      ;MICRO TAPE OR DISK (S)
1372         JRST 4,.
1373
1374 IFN E.SP,[
1375 LOC PI0LOC+2*DISCHN
1376         JSR ESBRK
1377         JRST 4,.
1378 ]
1379 IFN 340P,[
1380 LOC PI0LOC+2*DISCHN
1381         JSR DIGNOR      ;340 DISPLAY BLKO GETS PATCHED IN HERE
1382         CONO PI,4000+200_<-SDCHN>       ;HACK HACK
1383 ]
1384 IFN CH10P+CH11P,[
1385 LOC PI0LOC+2*CHXCHN
1386         JSR CHXBRK
1387         JRST 4,.
1388 ];CH10P
1389
1390 IFN VIDP,[
1391 LOC PI0LOC+2*OMPCHN
1392         JSR OMPXBK      ;OUTPUT MPXR, NVID, ETC.
1393         JRST 4,.
1394 ]
1395 IFN KAIMP,[
1396 LOC PI0LOC+2*IMPCHN
1397         JSR IMPBRK
1398 LOC IMPILC
1399         JSR IMPIBK
1400         0
1401 LOC IMPOLC
1402         JSR IMPOBK
1403         0
1404 ] ; IFN KAIMP
1405
1406 IFN KL10P,[
1407 LOC PFOPC
1408 PFOPC:  0               ;PAGE FAIL OLD PC STORED HERE
1409 PFNPC:  PFAIL           ;WHERE TO GO FOR PAGE FAIL
1410
1411 LOC EPTDIA
1412 EPTDIA: JRST SALV       ;STD COMMAND START ADDRESS ("DIAGNOSTIC")
1413 EPTDDT: JRST DDT        ;DDT COMMAND START ADDRESS
1414 EPTSTL: JRST DSKDMP     ;STL COMMAND START ADDRESS ("LOADER")
1415 EPTITS: JRST BEG        ;STM COMMAND START ADDRESS ("MONITOR")
1416                         ;SALV THEN GO
1417 LOC EPTTR1
1418 EPTTR1: CAI             ;ARITH OVERFLOW EXEC MODE IGNORED
1419 EPTTR2: JSR ILLTRP      ;PDL OVERFLOW EXEC MODE IS AN ERROR
1420 EPTTR3: JSR ILLTRP      ;ONE PROC CODE?
1421
1422 LOC DTEBPO
1423 DTEBPO: 0               ;BYTE TRANSFER NOT USED
1424 DTEBPI: 0               ;BYTE TRANSFER NOT USED
1425 DTELOC:                 ;INTERRUPT FROM CONSOLE 11
1426 IFE PDCLKP,     JSR DTEBRK      ;IF USING 11 FOR CLOCK, FIRST CHECK FOR CLOCK INTR
1427 .ELSE           JSR TTYBRK      ;OTHERWISE JUST USING 11 FOR TTYS.
1428         0               ;UNUSED WORD
1429 DTEPRO: 0               ;NO PROTECTED EXAMINES
1430 DTERLO: 0               ;..
1431 DTEPRI: 0               ;NOR PROTECTED DEPOSITS
1432 DTERLI: 0               ;..
1433
1434 LOC EPT+430
1435 REPEAT 8,MUUOEX         ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1436
1437 LOC EPTEBC
1438 EPTEBC: 0 ? 0           ;EBOX COUNT FOR PROC BRK ROUTINES AND NULL JOB
1439 EPTMBC: 0 ? 0           ;MBOX DITTO
1440
1441 LOC TIMLOC
1442         JSR OVHBRK      ;INTERVAL TIMER INTERRUPT, EVERY 39 MILLISEC ON CHANNEL 1
1443
1444 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1445 ;ON KL10 OVHBRK CHECKS WHERE THE PC IS IF IT IS IN EXEC MODE.
1446
1447 DEFINE OVHMTR NAME      ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1448 OVHMT1 NAME,\.          ;EVALUATE "." AT THIS POINT IN TIME
1449 TERMIN
1450
1451 ;KLUDGE MACRO
1452 DEFINE OVHMT1 NAME,POINT
1453 OVHTAB [DEFINE OVHTAB FOO
1454 FOO]    <(SIXBIT/NAME/)>,,POINT ? 0
1455 TERMIN
1456 TERMIN
1457
1458 ;THIS IS THE CORRESPONDING REMOTE MACRO
1459 DEFINE OVHTAB FOO
1460 FOO
1461 TERMIN
1462 ]               ;END OF IFN KL10P
1463 \f
1464 IFN KS10P,[
1465
1466 LOC EPTUIT+UBAQ
1467         UBAQIB          ; Pointer to interrupt table for Unibus Q (dsk)
1468
1469 LOC EPTUIT+UBAI
1470         UBAIIB          ; Pointer to interrupt table for Unibus I (other)
1471
1472 LOC EPTPFW
1473 EPTPFW: 0               ; Page fail word
1474 EPTPFO: 0               ; Page fail old PC
1475 EPTPFN: PFAIL           ; Page fail new PC
1476
1477 IRP I,,[1,2,3,4,5,6,7]
1478 LOC EPTP!I!W
1479 EPTP!I!W:       0               ; Page fail word
1480 EPTP!I!O:       0               ; Page fail old PC
1481 EPTP!I!N:       PF!I!AIL        ; Page fail new PC at PI level I
1482 TERMIN
1483
1484 LOC EPTTR1
1485 EPTTR1: CAI             ;ARITH OVERFLOW EXEC MODE IGNORED
1486 EPTTR2: JSR ILLTRP      ;PDL OVERFLOW EXEC MODE IS AN ERROR
1487 EPTTR3: JSR ILLTRP      ;TRAP 3 SHOULD NOT HAPPEN
1488
1489 LOC EPT1PO
1490 EPT1PO: 0               ;ONE-PROCEED OLD-PC
1491 EPT1PN: MUUOEX          ;ONE-PROCEED SHOULD NOT HAPPEN IN UPT=EPT MODE
1492
1493 LOC EPTUEN
1494 EPTUEN: MUUOEX          ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1495 EPTUET: MUUOEX
1496 LOC EPTUUN
1497 EPTUUN: MUUOEX
1498 EPTUUT: MUUOEX
1499
1500 IFN KSIMP,[
1501 ;Here because with EPT at 0, this is the second half of physical
1502 ; page 0, which is uncached, which we want, and otherwise unused.
1503 ;
1504 LOC EPT+1000                    ; IMP data reformatting buffers
1505 IMPIBF: BLOCK 400
1506 IMPBFS==.-IMPIBF
1507 IMPOBF: BLOCK 400
1508 ]
1509
1510 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1511 ;ON KS10 PC SAMPLING FACILITY IS USED, 60-CYCLE CLOCK COLLECTS THAT DATA
1512 ;NOTE THAT THE TABLE FORMAT IS NOT THE SAME AS ON KL10, FOR SPEED REASONS
1513
1514 DEFINE OVHMTR NAME      ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1515 OVHMT1 NAME,\.          ;EVALUATE "." AT THIS POINT IN TIME
1516 TERMIN
1517
1518 ;KLUDGE MACRO
1519 DEFINE OVHMT1 NAME,POINT
1520 OVHTAB [DEFINE OVHTAB FOO
1521 FOO]    POINT,,<(SIXBIT/NAME/)>
1522 TERMIN
1523 TERMIN
1524
1525 ;THIS IS THE CORRESPONDING REMOTE MACRO
1526 DEFINE OVHTAB FOO
1527 FOO
1528 TERMIN
1529 ]               ;END OF IFN KS10P
1530 \f
1531 IFN DL10P,[     ;DL10 COMMUNICATIONS AREA IN NON-ENCACHED LOW CORE
1532 IFN KL10P, LOC 500      ;500-777 RESERVED FOR DL10 AREA AND BUFFERS
1533 IFN KA10P, LOC 100      ;IF KA10, PUT DL10 AREA JUST BELOW START OF SYSTEM
1534 IFN KS10P, .ERR DL10 on KS10 system?
1535
1536 DL10AR: JSR TTYBRK      ;INTERRUPT INSTRUCTION (NOT ACTUALLY USED)
1537
1538 ;FOLLOWING LOCATIONS MUST AGREE WITH IOELEVEN PROGRAM
1539
1540 DL10VR: NDLTYS_8+NFDLTY ;"I/O VERSION NUMBER"
1541 DL10UP: 0               ;INCREMENTED BY -11 EVERY 1/60 SECOND.
1542                         ;SETOM'ED BY 10 EVERY 1/2 SECOND.  DETECTS UP/DOWNNESS.
1543
1544 DL10SO: 0               ;LINE # TO SET OUTPUT DONE FOR, SET BY -10, CLEARED BY -11.
1545
1546 DL10IL: 0               ;LINE # WITH INPUT AVAILABLE.  CLEARED BY -10 AFTER CHAR READ.
1547 DL10IC: 0               ;CHARACTER RECEIVED FROM THAT LINE.
1548
1549 DL10OD: 0               ;LINE # WITH OUTPUT DONE.  CLEARED BY -10 WHEN PROCESSED.
1550 DL10BS: 0               ;BUFFER SIZE FOR THAT LINE.
1551
1552 DL10BP: 0               ;WIERD DL10 BYTE POINTER TO TTY OUTPUT BUFFER.
1553 DL10CC: 0               ;NUMBER OF CHARACTERS BEING OUTPUT TO TTY.
1554 DL10LN: 0               ;LINE # OUTPUT BEING SENT TO.  CLEARED BY -11 WHEN GOBBLED.
1555
1556 DL10CL: 0               ;DIALUP LINE CONNECT OR DISCONNECT INFO. SET BY 11, 0'D BY 10.
1557                         ;0000NN => LINE # NN DISCONNECTED.
1558                         ;01RTNN => LINE # NN CONNECTED, %TTISP=R, %TTOSP=T.
1559
1560 DL10PL: 0               ;LINE # TO SET PARAMETERS OF.  CLEARED BY -11 WHEN PROCESSED.
1561 DL10PR: 0               ;VALUE OF DH11 LPR REGISTER.
1562 DL10PS: 0               ;NUMBER OF BYTES OF OUTPUT BUFFERING DESIRED.
1563
1564 DL10XD: 0               ;1=EXAMINE -11 CORE, 2=DEPOSIT.  CLEARED BY -11 WHEN DONE.
1565 DL10XA: 0               ;EXAMINE/DEPOSIT ADDRESS
1566 DL10XW: 0               ;EXAMINE/DEPOSIT WORD
1567
1568 GLPTBP: 0               ;BYTE POINTER TO BUFFER FOR GOULD LPT
1569 GLPTBC: 0               ;BYTE COUNT " " - IF NONZERO BUFFER IS ACTIVE BY PDP11.
1570 GLPTER: 0               ;NONZERO => PDP11 CLAIMS PRINTER IS BROKEN.
1571 GLPGRF: 0               ;NONZERO => GRAPHICS MODE (SET BY 10).
1572
1573 ;CHAOS NET SHARED VARIABLES
1574 DLCINI: 1               ;THE COMMENTS ARE IN THE CHAOS FILE
1575 DLCSP1: 0
1576 DLCSP2: 0
1577 DLCSS1: 0
1578 DLCSS2: 0
1579 DLCRP1: 0
1580 DLCRP2: 0
1581 DLCRS1: 0
1582 DLCRS2: 0
1583
1584 ;^ ADD MORE HERE
1585
1586 DLXEND:: ;END OF ASSIGNED DL10 AREA
1587
1588 IFG .-DL10AR-100, .ERR DL-10 AREA TOO BIG, CHANGE CONO IN TSS INITIALIZATION
1589 LOC DL10AR+100 ;SKIP OVER 11-ACCESSIBLE AREA
1590         
1591 DL10BF: BLOCK <261.+3>/4        ;OUTPUT BUFFER, 8-BIT BYTES.  HAS TO BE NON-ENCACHED.
1592
1593 IFN GLPTP,[
1594 GLPBSZ==255.    ;BUFFER SIZE IN WORDS.  MAXIMUM POSSIBLE WITHOUT MODIFYING (ELIMINATING)
1595                 ;"WORD COUNT" HARDWARE IN DL-10.
1596 GLPMPP: 0       ;MAIN PROGRAM POINTER - IF NONZERO BUFFER IS ACTIVE BY M.P. LEVEL (PDP10)
1597 GLPMPC: 0       ;MAIN PROGRAM COUNTER
1598 GLPTBF: BLOCK GLPBSZ    ;ONE BUFFER FOR NOW
1599 ]       ;END IFN GLPTP
1600
1601 IFN KL10P, IFG .-1000,.ERR DL10 STORAGE TOO BIG, DOESN'T FIT IN UNENCACHED PAGE
1602 IFN KA10P, PATB=.       ;MOVE ORIGIN OF SYSTEM UP
1603 ]       ;END IFN DL10P
1604 \f
1605 IFN NETYS,[     ;ASSEMBLE DTE20 CONTROL AREA
1606 IFE KL10P, .ERR DTE20 WITHOUT KL10?
1607 LOC 400
1608
1609 DTEVER: NETYS_8+NFETY   ;400 I/O VERSION NUMBER, SET BY 10, CHECKED BY 11
1610
1611 DTECHK: 0               ;401 INCREMENTED BY 11 60 TIMES PER SECOND
1612                         ;SETOMED BY 10 EVERY HALF SECOND.
1613                         ;USED TO TELL 11 THAT 10 IS UP.
1614
1615 DTEINP: -1              ;402 -1 IF IDLE, ELSE INPUT REQUEST FROM 10 TO 11
1616                         ;SETUP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING THIS.
1617                         ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES HERE
1618 DTEOUT: -1              ;403 -1 IF IDLE, ELSE OUTPUT REQUEST FROM 10 TO 11
1619                         ;SETUP DTEBPO IN EPT BEFORE SETTING THIS.
1620                 ;CONTENTS OF DTEINP AND DTEOUT ARE DESCRIBED BELOW.
1621                 ;THESE ARE SET BY THE 10, SETOMED BY 11 WHEN TRANSFER STARTS.
1622                 ;RH # BYTES EXPECTED.  LH COMMAND+LINE#.  COMMANDS ARE:
1623  %DCTYO==1000           ;TELETYPE OUTPUT                (NOTE 4.1=0 INPUT, =1 OUTPUT)
1624  %DCETI==2000           ;ETHERNET INPUT (N.Y.I.)
1625  %DCETO==3000           ;ETHERNET OUTPUT (N.Y.I.)
1626
1627 DTELSP: -1              ;404 LINE # WHOSE SPEED IS TO BE SET, SET BY 10, SETOMED BY 11
1628 DTELPR: -1              ;405 CORRESPONDING DH11 LINE PARAMETER REGISTER,,BUFFER SIZE
1629
1630 DTEOST: -1              ;406 LINE# TO START OUTPUT ON (SET OUTPUT DONE).
1631                         ;SET BY 10, SETOMED BY 11
1632
1633         BLOCK 1         ;407 NOT USED
1634
1635 DTETYI: -1              ;410 TELETYPE INPUT.  SET BY 11, SETOMED BY 10.
1636                         ;LH LINE#,,RH CHAR RCVED.
1637
1638 DTEODN: -1              ;411 TELETYPE OUTPUT DONE.  SET BY 11, SETOMED BY 10.
1639                         ;LH LINE#,,RH BUFFER SIZE.
1640
1641 DTEHNG: -1              ;412 HANGUP/DIALIN WORD.  SET BY 11, SETOMED BY 10.
1642                         ;0000NN LINE # NN HUNG UP.
1643                         ;01RTNN LINE # NN HAS SPEED RCV=R, XMT=T (CODES AS IN TTYTYP)
1644
1645 ;^ ADD MORE LOCATIONS HERE, NOT TO EXCEED 437
1646
1647 ;LOCATIONS 440-457 ARE KNOWN ABOUT BY BOTH IOELEV AND KLDCP,
1648 ;USED MOSTLY FOR NON-TIMESHARING PROGRAMS.
1649 ];NETYS
1650 \f
1651 LOC PATB
1652
1653         ;FOR VARIABLES (MONITORABLE WITH KEYS)
1654 NSKED:  0       ;# TIMES NON-NULL JOB IS RUN
1655 NNSKED: 0       ;# TIMES NULL JOB IS RUN
1656 NRSKED: 0       ;# OF FULL SCHEDULES (MUST SCAN ALL JOBS)
1657 NSSKED: 0       ;# OF SCHEDULES SAVED BY SCHBLN FEATURE.
1658 NRESKED:0       ;# TIMES A JOB SCHEDULED JUST AFTER IT RAN.
1659 NSCHDU: 0       ;TOTAL NUMBER OF JOBS FOUND RUNNABLE IN FULL SCHEDULES
1660 NNULBK: 0       ;# OF CONSECUTIVE BLOCKS OF NULLTIME.
1661 NUINT:  0       ;# TIMES USER GIVEN INTERRUPT
1662 NAUINT: 0       ;# ATTEMPTED USER INT (POSSIBLY UNSUCCESSFUL DUE TO PG FAULT)
1663 NPCLSR: 0       ;# ATT TO PCLSR
1664 NEPCLS: 0       ;# PCLSRS WHERE JOB WAS IN EXEC MODE
1665 NFPCLS: 0       ;# OF PCLSRS THAT FAILED (JOB WAS IN EXEC MODE AND NOT BLOCKED)
1666 NSOUSR: 0       ;# ATT TO SWAP OUT USR
1667 NSOPGS: 0       ;# TIMES THRU LOOP LOOKING FOR PG TO SWAP OUT
1668 NPGSO:  0       ;# TIMES AT SWOPG
1669 NAGEAB: 0       ;# TIMES SWAP OUT ABORTED BY AGE BITS
1670 NSHRAB: 0       ;# TIMES SWAP OUT ABORTED BY SHARING
1671 NPGFLT: 0       ;# PAGE FAULT (ALL CAUSES)
1672 NCLKI:  0       ;# CHNL 7 INTS (ALL CAUSES)
1673 NPGLD:  0       ;# TIMES AT PGLDU
1674 NUFLS:  0       ;# TIMES AT UFLS
1675 NTUSB:  0       ;# TIMES USER SWAP BLOCKED
1676 NTSBUP: 0       ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND LET IN
1677 NTSBUB: 0       ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND BLOCKED
1678 NTSBUU: 0       ;# TIMES SWAP BLOCKED USER UNBLOCKED BEFORE TIME (MEM APPARENTLY AVAIL)
1679 NAGES:  0       ;# TIMES AROUND PAGE-AGEING LOOP
1680
1681 ;THE FOLLOWING FOUR MUST BE CONSECUTIVE
1682 NRPI:   0       ;# REFS TO PAGE IN (BUT MAP WAS NOT SET UP, ETC)
1683 NRPCI:  0       ;# PAGE FAULTS REFS TO PAGE COMMING IN
1684 NRPO:   0       ;# REFS TO PAGE OUT
1685 NRPGO:  0       ;# TO PAGES GOING OUT
1686 CLKBRS: 0       ;CLKBRK COPIED INTO HERE (SINCE CLKBRK GETS CHANGED)
1687
1688 PAT:    IFG .-PATB-40,.ERR PAT TOO HIGH
1689
1690 LOC PATB+40
1691
1692 BBLK
1693
1694 PATCH:  BLOCK 140       ;PATCH SPACE CODE AND CONSTANTS
1695
1696 EBLK
1697
1698 VPATCH:
1699 VPAT:
1700 BLOCK 40        ;PATCH SPACE VARIABLES
1701 \f
1702 SUBTTL PROCESSOR BREAK ROUTINES
1703
1704 DEFINE CLKSAV BRK=CLKBRK
1705 IFE KA10P,      XCT CLCXSV      ;DATAI PAG,CLCX(U)
1706         XCT CLUSAV              ;STORE U IN AC17S FOR CURRENT USER (UNLESS NULL JOB)
1707         MOVE U,BRK              ;SAVE AWAY BRK
1708         MOVEM U,CLKBRS
1709 IFSN BRK,CLKBRK, MOVEM U,CLKBRK ;SAVE IN CLKBRK IF NOT CLKBRK
1710 TERMIN
1711
1712 IFE KA10P,[
1713 DEFINE CLKLEV                   ;ENTER CLOCK-LEVEL CONTEXT
1714         SPCCTX 0,1,EPT          ;UPT = EPT; CLOCK LEVEL CONTEXT.
1715         MOVE U,USER
1716         JRST 2,@.+1             ;MAKE XCTR WORK RIGHT
1717           %PSPCU,,.+1
1718         MOVE P,CPDLP
1719 TERMIN
1720 ] ;IFE KA10P
1721 IFN KA10P,[
1722 DEFINE CLKLEV
1723         MOVE U,USER
1724         MOVE P,CPDLP
1725 TERMIN
1726 ] ;IFN KA10P
1727
1728 IFN KL10P,[     ;CODE USED IF GETTING 60-CYCLE CLOCK FROM PDP11 (IN CASE MAIN CLOCK DOWN)
1729
1730 ;HACKING THE DTE:
1731
1732 ;THE TTY CODE ASSUMES, SINCE THE DTE20 IS USED BY ITS SOLELY AS
1733 ;THE INTERFACE TO THE CONSOLE TTY AND THE LINE-FREQUENCY CLOCK,
1734 ;THAT IT MAY FREELY GIVE THE "MONITOR TTY OUTPUT" COMMAND WHEN
1735 ;THE "MONITOR TTY OUTPUT DONE" INTERRUPT IS RECEIVED.  ANY CODE
1736 ;WHICH HACKS THE DTE OTHER THAN AT PI LEVEL OR IN ITS INITIALIZATION
1737 ;MUST THEREFORE OBSERVE THE FOLLOWING PROTOCOL:
1738 ;       CONO PI,DTEOFF
1739 ;       SKIPN DTEFLG            ;WAIT FOR MONITOR TTY OUTPUT TO GO THROUGH
1740 ;        JRST .-1
1741 ;       SETZM DTEFLG
1742 ;        ;HERE SET DTECMD
1743 ;       CONO DTE,%DBL11
1744 ;       SKIPN DTEFLG            ;WAIT FOR THIS COMMAND TO GO THROUGH
1745 ;        JRST .-1
1746 ;       CONO PI,DTEON
1747 ;
1748
1749 DTEBRK: 0
1750 BBLK
1751         CONSO PI,1_<7-APRCHN>   ;TEMPORARY (I HOPE) HARDWARE BUG IN KL10 PI HARDWARE
1752          JRST 4,.               ;ALLEGEDLY FIXED
1753         CONO PI,TTYRQ           ;REALLY WANTED TO INTERRUPT ON TTY CHANNEL,
1754         JFCL                    ; BUT HAVE TO DO IT THIS WAY DUE TO 
1755         JFCL                    ; MISFEATURES IN THE PI HARDWARE
1756         SKIPN DTECLK            ;DON'T TAKE OUT THE JFCLS!!
1757          JRST 12,@DTEBRK
1758         CLKSAV DTEBRK           ;TAKE CLOCK INTERRUPT
1759         JRST CLKB2A
1760 EBLK
1761 ];KL10P
1762 \f
1763 CLKBRK: 0               ;PC SAVED HERE BY JSR FOR CLOCK INT.
1764
1765 BBLK
1766 IFN KL10P,[
1767         CONSO PI,1_<7-APRCHN>   ;HARDWARE BUG IN KL10 PI SYSTEM
1768          JRST 4,.               ;ALLEGEDLY FIXED
1769 ]
1770 IFE KA10P, CONO PI,020000+200_<-APRCHN> ;BAG-BITING DEC LOSERS CHANGED
1771                                         ;FUNCTIONAL SPECIFICATION OF
1772                                         ;PROGRAMMED REQUESTS
1773 CLKBR2: CLKSAV          ;SAVE AC BLK STATUS AND U.
1774 CLKB2A: AOS NCLKI
1775         SKIPGE U,USER   ;PICK UP INDEX OF CURRENT USER, SKIP UNLESS NULL JOB
1776          JRST [ SPM UPGML       ;JUMP IF NULL JOB WAS RUNNING
1777                 JRST CLKBKR ]
1778         SPM UPGML(U)    ;STORE PAGE MAP AWAY
1779         AOSN UFLSF      ;SKIP UNLESS GOT HERE FROM UFL6
1780          JRST CLUFLS
1781         MOVEM T,AC16S(U)        ;STORE AWAY T
1782         MOVEI T,AC0S(U)
1783         BLT T,AC15S(U)  ;STORE REST OF ACS
1784 CLKBKR: CLKLEV          ;SET UP CROCK-LEVEL CONTEXT HARDWARE
1785
1786 ;;; CHECK FOR THINGS OTHER THAN CLOCK TICKS (PAR ERR, PG FAULT, NXM, PDLOV,
1787 ;;; AROV AND ARFOV ARE POSSIBLE ON ONE MACHINE OR THE OTHER).
1788
1789 IFN KA10P,[
1790         CONSZ 270220    ;CHECK PDL OV, MEM PROTECT, NXM, FOV, AR OV
1791          JRST CLKB1     ;JUMP ON LOSSAGE
1792 CLKB1D: CONSZ PI,200000
1793          JRST CLKB1E    ;PARITY
1794 ] ;KA10P
1795
1796 IFN KL10P,[
1797         AOSG PFAILF
1798          JRST PFA6      ;PAGE FAULT
1799         CONSZ 7740      ;This is all but the cache sweep done bit (=20).
1800          JRST CLKB2     ;APR ERROR INTERRUPT
1801 ] ;KL10P
1802
1803 IFN KS10P,[
1804         AOSG PFAILF
1805          JRST PFLU2
1806         CONSZ 7620      ;This is all but the interval timer's bit (=40).
1807          JRST CLKBKS    ; (Memory ECC (=100) doesn't interrupt)
1808         CONSO 40
1809          JRST CLK1F
1810 ] ;KS10P
1811
1812 IFN PDCLKP\KA10P,[      ;IF 60 HZ CLOCK IS IN HARDWARE
1813         CONSO CLK,CLKINT
1814          JRST CLK1F     ;INTERRUPT NOT FROM CLOCK, MUST BE SPURIOUS (OR
1815                         ;PREEMPT) 
1816 ] ;PDCLKP\KA10P
1817
1818 ;DROP THROUGH FOR PLAIN CLOCK-TICK.
1819 \f;
1820 ; 60-CYCLE CLOCK INTERRUPT
1821 ;
1822 CLKTIC:
1823 ;IFN 340P,      DATAI CLK1,LQTIM
1824         SOSG @CLROOT    ;COUNT DOWN, SKIP IF NOT YET TO NEXT REQUEST
1825          JRST CLQBRK    ;SERVICE CLOCK QUEUE REQUEST
1826 CLQBRT:
1827 IFN KS10P,              CONO 020040+APRCHN      ;Clear interval flag
1828 IFN PDCLKP\KA10P,       CONO CLK,CLKINT+APRCHN  ;Clear hardware clock flag
1829 IFE PDCLKP\KA10P\KS10P, SETZM DTECLK            ;Clear software clock flag
1830 IFN KA10P,[
1831         DATAI CLKBSW
1832         SKIPGE CLKBSW
1833 ] ;KA10P
1834 IFN KL10P, SKIPGE DTESWR
1835 IFN KS10P, SKIPE 8SWIT0
1836          BUG DDT,[SWITCH 0 IS UP]
1837 IFN KS10P, SETZM 8SWIT0         ; Allow hacker to <alt>P
1838 IFN CHAOSP, IFN T11CHP, PUSHJ P,T11WAK  ;RUN TEN-11 CHAOS NET INTERFACE
1839 IFN XGP,[
1840         SKIPL XGPUSR
1841          PUSHJ P,XGPCLK
1842 ]
1843 IFN 340P,[
1844         AOSGE T,DTIME
1845          JRST DSTPD     ;WAIT IF DTIME CLOBERED DUE TO RATE EXCEEDED
1846         CAILE T,2
1847          MOVEI T,2
1848         MOVEM T,DTIME
1849         SKIPL CDISOF
1850          SKIPGE DISOFF
1851           JRST DSTPD
1852         AOSG DISON
1853          CONO DIS,1100\SDCHN_3\DISCHN   ;RESTART DISPLAY
1854 DSTPD:
1855 ]
1856 IFN E.SP,[
1857         SKIPN T,E.SPGW  ; E&S WAITING FOR PAGE
1858          JRST E.SOK
1859         HRRZM T,DISSPG  ; SAVE FOR SWPPIN
1860         SKIPL T,DISUSR  ; -1 IMPLIES NO USER
1861          MOVEM T,DISSWI ; USER INDEX FOR SWPPIN
1862 E.SOK:
1863 ]
1864 IFN N11TYS,[
1865         SKIPE @TT11HD   ;ANY INPUT FROM PDP11?
1866          PUSHJ P,TT11IN ;YES, DO INPUT INT LVL STUFF FOR IT,.
1867 ]
1868 IFN DZ11P,[
1869         PUSHJ P,DZSCAN  ;SCAN DZ'S FOR INPUT
1870 ]
1871         MOVS T,TTERQS
1872         CAIE T,(MOVE)
1873          PUSHJ P,TTECH  ;CHARACTERS TO BE ECHO ED
1874 IFN NETP,[
1875         SKIPE STYNTA    ;IF THERE ARE STY'S CONNECTED TO NETWORK I/O,
1876          PUSHJ P,STYNTC ;XFER BETWEEN THEM.
1877 ]
1878 IFN KS10P, PUSHJ P,OVHCLK
1879         SETCMM CLKFL1
1880         SKIPL CLKFL1
1881          AOS TIME       ;GET HERE EVERY THIRTIETH OF A SECOND
1882 IFN PAGPRE,[
1883         SKIPE PREEMP    ;CHECK FOR PRE-EMPTION INTERRUPT
1884          JRST PRESCD
1885 ];PAGPRE
1886         AOSG SCHFLG
1887          JRST CLKB5     ;TIME NOT UP
1888         AOS NLPCLK
1889         JRST SCHED      ;SCHEDULE
1890
1891 CLK1F:
1892 IFN PAGPRE,[
1893         SKIPE PREEMP    ;CHECK FOR PRE-EMPTION INTERRUPT.  THIS IS HERE
1894          JRST PRESCD    ; BECAUSE OF SCREW CASE WHEREBY DLSRCH PREVENTS
1895                         ; PREEMP FROM DOING ANYTHING, AND PREEMP WOULD
1896                         ; PREVENT CLOCK FLAG FROM GETTING CLEARED IF IT WAS
1897                         ; TESTED BEFORE CLOCK.
1898 ];PAGPRE
1899 ;       MOVEI J,APRCHN  ;DO NOT TAKE THESE OUT WITHOUT SEEING RG!!!!
1900 ;       JSP E,SPUR
1901 ;       JRST SCHED
1902         AOS CHSPUR+APRCHN       ;COUNT SPURIOUS INT
1903         JRST SCHED              ;(MIGHT HAVE BEEN RUNNING NULL JOB)
1904
1905 IFN PAGPRE,[
1906 PRESCD: AOS NLPPRE
1907         JRST SCHED
1908 ];PAGPRE
1909
1910 IFN KL10P,[
1911 CLKB2:  CONSZ 2000              ;NXM
1912          PUSHJ P,MEMHNG
1913         CONSZ 1040              ;POWER FAIL OR I/O PAGE FAIL
1914          BUG HALT,[KL: POWER FAIL OR I/O PAGE FAIL]
1915         CONSZ 300               ;CACHE DIR OR PT DIR PAR ERR.
1916          BUG HALT,[KL: CACHE OR MAP DIR PAR ERR]
1917         CONSO 4400              ;SBUS ERR OR MB PAR ERR
1918          JRST SCHED             ;CALLED MEMHNG, AND NOTHING ELSE => SCHEDULE.
1919         SETOM PARRSN            ;TEL PAR ERR SCANNER THIS IS AN INTERRUPT, NOT A PG FAIL.
1920         RDERA PARERA            ;STORE ADDR OF PAR ERR.
1921         JRST CLKB1E
1922 ] ;IFN KL10P
1923
1924 IFN KS10P,[
1925 CLKBKS: CONSZ 7600      ; Any bad guys? (8080 -> KS is 20, Interval is 40,
1926          JRST CLKKS1    ; Memory ECC is 100.)
1927         CONO 020020+APRCHN      ; 8080 wants service.  Clear the bit.
1928         MOVEI I,NFKSTY          ; TTY # (fancy name for 0)
1929         CONO PI,TTYOFF          ; Pretend this is TTY interrupt level.
1930         SKIPN A,8CTYIN          ; Any input from 8080?
1931          JRST CLKKS2
1932         SETZM 8CTYIN            ; Yes:  Make room for more.
1933         PUSHJ P,NTYI1           ; Stuff it into the tty.
1934         MOVEI I,NFKSTY          ; Just in case...
1935 CLKKS2: SKIPN 8CTYOT            ; Room for output yet?
1936          PUSHJ P,TYPSC          ; Yes:  Get some now.
1937         CONO PI,TTYON           ; No:  8080 will wake us up later.
1938         JRST SCHED              ; Null job might have been running.
1939
1940 CLKKS1: CONSZ 1000              ;Power failure
1941          BUG HALT,[KS: POWER FAIL]
1942         CONSZ 6000              ;KS -> 8080 or Flag 24
1943          BUG HALT,[KS: KS->8080 FLAG OR FLAG 24 SET]
1944         CONSZ 400               ;NXM
1945          PUSHJ P,MEMHNG
1946         CONSO 200               ;Bad memory data
1947          JRST SCHED
1948         IORD B,[KSECCS]
1949         MOVEM B,PARERA
1950         JRST CLKB1E
1951
1952 ] ;IFN KS10P
1953 \f
1954 CLUFLS: CONO PI,CLKON   ;FROM UFLS
1955         CLKLEV
1956         MOVE T,UPC(U)
1957         MOVEM T,CLKBRK
1958         AOS NUFLS
1959         AOS NLPUFL
1960         JRST SCHED2
1961
1962         ;CLOCK QUEUE SERVICE
1963 CLQBRK: SKIPG U,CLROOT  ;GET POINTER TO CURRENT BLOCK
1964          BUG            ;CLK QUEUE SCREWED
1965         SKIPG T,1(U)    ;GET POINTER TO NEXT BLOCK
1966          BUG            ;CLK QUEUE SCREWED
1967         MOVEM T,CLROOT  ;SET UP POINTER FOR NEXT BLOCK
1968         SETOM 1(U)      ;INDICATE CURRENT BLOCK IDLE
1969         XCT 2(U)        ;EXECUTE REQUEST (PROBABLY A JRST)
1970                 ;FALL THROUGH IF SINGLE INST RQ
1971 CLQRET:         ;RETURN FROM REQUEST
1972         SKIPN @CLROOT   ;SKIP IF TIME TILL NEXT RQ NONZERO
1973         JRST CLQBRK     ;ZERO TIME DELTA, DO NEXT RQ
1974         JRST CLQBRT     ;RETURN TO CLOCK ROUTINE
1975
1976 CLQTTR: JUMPE TT,CLQRET ;COMMON RETURN FOR TT IDLE FLAG
1977 CLQREE: MOVEI E,CLQRET  ;RE ENTER RQ
1978
1979 ;CLOCK OFF OR IN PROGRESS LEVEL ADD TO CLOCK QUEUE, CALL BY JSP E,
1980         ; T HAS TIME TILL RQ IN 60'THS
1981         ; C POINTS TO THREE WORD BLOCK, RQ'ED INST IS IN THIRD
1982 CLQPUT: MOVEI B,CLROOT-1
1983 CLQPU2: MOVE A,B        ;REPLACE POINTER TO PREV BLOCK WITH CURRENT
1984         SKIPG B,1(B)    ;GET LINK TO NEXT BLOCK
1985          BUG            ;CLK QUEUE SCREWED
1986         SUB T,(B)       ;SUBTRACT TIME DELTA FOR NEXT BLOCK
1987         JUMPG T,CLQPU2  ;JUMP IF RQ LATER THAN CURRENT BLOCK
1988         JUMPE T,CLQPU6  ;JUMP IF RQ SAME AS " " (COULD USE PU2 BUT THIS FASTER)
1989         ADD T,(B)       ;RQ EARLIER, ADD BACK
1990         MOVEM T,(C)     ;SET DELTA OF BLOCK BEING ADDED
1991         SUB T,(B)       ;COMPUTE NEG OF DELTA FOR NEXT BLOCK
1992         MOVNM T,(B)     ;SET TIME DELTA FOR NEXT BLOCK
1993         MOVEM B,1(C)    ;SET LINK OF NEW BLOCK TO NEXT
1994         MOVEM C,1(A)    ;SET LINK OF PREV BLOCK TO NEW
1995         JRST (E)
1996
1997 CLQPU6: SETZM (C)       ;SET TIME DELTA OF NEW BLOCK TO ZERO
1998         MOVE A,1(B)     ;GET POINTER TO NEXT BLOCK
1999         MOVEM A,1(C)    ;SET POINTER OF NEW TO NEXT BLOCK
2000         MOVEM C,1(B)    ;SET POINT OF CURRENT TO NEW BLOCK
2001         JRST (E)
2002 \f
2003 ;MAIN PROG LEVEL ADD TO CLOCK QUEUE
2004 ;CALL BY PUSHJ P,CLQADD
2005 ;WITH POINTER TO BLOCK IN NEXT WORD AND TIME TILL RQ IN T IN 60'THS
2006 ;POINTER TO BLOCK SHOULD NOT BE INDEXED BY C
2007
2008 CLQAD1: MOVEI T,1       ;RQ IN ONE TICK
2009 CLQADD: PUSH P,C
2010         MOVE C,@-1(P)   ;GET BLOCK POINTER
2011         MOVEI C,@C
2012         SKIPL 1(C)      ;SKIP IF IDLE
2013         JRST POPCJ1     ;IGNORE THIS RQ, BLOCK ALREADY ACTIVE
2014         PUSH P,A
2015         PUSH P,B
2016         PUSH P,E
2017         SKIPN (C)       ;DELTA WORD OF IDLE BLOCK SHOULD BE ZERO
2018         SKIPG T         ;TIME SHOULD BE NON-ZERO
2019          BUG            ;CLK QUEUE SCREWED
2020         CONO PI,CLKOFF
2021         JSP E,CLQPUT    ;ADD RQ
2022 CLQDE4: CONO PI,CLKON
2023         POP P,E
2024         POP P,B
2025         POP P,A
2026         JRST POPCJ1
2027
2028 ;DELETE CLOCK QUEUE ENTRY
2029 ;CALL BY PUSHJ P,CLQDEL WITH POINTER TO BLOCK IN NEXT WORD
2030 CLQDEL: PUSH P,C
2031         MOVE C,@-1(P)   ;GET BLOCK POINTER
2032         MOVEI C,@C
2033         CONO PI,CLKOFF
2034         SKIPGE 1(C)     ;IGNORE RQ TO DELETE  IF IDLE
2035         JRST CKOCJ1
2036         PUSH P,A
2037         PUSH P,B
2038         PUSH P,E
2039         JSP E,CLQCLR
2040         JRST CLQDE4
2041
2042 CLQCLR: MOVEI B,CLROOT-1        ;CLOCK OFF OR IN PROGRESS VERSION
2043 CLQDE2: MOVE A,B
2044         SKIPG B,1(B)    ;GET POINTER TO NEXT BLOCK
2045          BUG            ;CLK QUEUE SCREWED
2046         CAME B,C        ;SKIP IF FOUND BLOCK TO DELETE
2047          JRST CLQDE2
2048         SKIPG B,1(B)    ;GET POINTER TO BLOCK AFTER ONE TO DELETE
2049          BUG            ;CLK QUEUE SCREWED
2050         MOVEM B,1(A)    ;PATCH AROUND DELETED BLOCK
2051         MOVE A,(C)
2052         ADDM A,(B)      ;ADD DELTA OF DELETED BLOCK TO NEXT
2053         SETZM (C)       ;CLEAR DEL
2054         SETOM 1(C)      ;MARK IDLE
2055         JRST (E)
2056 \f
2057 OVHMTR PGF      ;PAGE FAULT
2058
2059 IFN KL10P,[
2060 EBLK
2061 PFAILU: 0       ;SAVED U AS OF A PAGE FAILURE
2062 PFINST: 0       ;PF INSTRUCTION IF XCT
2063 PFOPC1: 0       ;SAVE PFOPC WHILE SWITCHING TO CLK LEVEL (PROTECT AGAINST XCTRI)
2064 BBLK
2065
2066 ;PAGE FAULTS COME HERE, WITH PC IN PFOPC, AND PI SYSTEM TURNED OFF.
2067
2068 PFAIL:  MOVEM U,PFAILU
2069         HLRZ U,EPTPFW
2070         ANDI U,%PFCOD   ;GET THE PFAIL CODE FROM THE PFW
2071         CAIE U,%PFPAR
2072          CAIN U,%PFPRX
2073           JRST PFA2     ;IT'S A PAR ERR; BYPASS XCTR HACKS
2074         MOVE U,PFOPC
2075         TLNE U,%PCUSR
2076          JRST PFA2
2077         LDB U,[331100,,(U)]     ;GET OPCODE OF LOSING INSTRUCTION.
2078                                 ;ASSUME THAT IN EXEC MODE VIRTUAL
2079                                 ; AND PHYSICAL ADDRESSES ARE IDENTICAL
2080                                 ; FOR INSTRUCTION FETCHES.  ALSO ASSUME
2081                                 ; THAT NOBODY DOES XCT OF XCT OF XCTR.
2082 PFA4:   CAIE U,XCTRI_-33        ;SKIP IF "XCTR WITH INHIBIT"
2083          JRST PFA1
2084 REPEAT 2, AOS PFOPC             ;ONCE COMPENSATING FOR INSTR ABORT, AND ONCE TO SKIP
2085         MOVE U,PFAILU
2086         JRST 17,@PFOPC          ;KL-10 CROCK: JRST 17, TURNS ON PI SYSTEM
2087
2088 PFA1:   CAIE U,XCTR_-33         ;SKIP IF "XCTR WITH NO INHIBIT"
2089          JRST PFA3
2090 PFA2:   CONSO PI,77400          ;PI IN PROGRESS?
2091          CONSO PI,1             ;CHANNEL 7 ENABLED?
2092           BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS OR CLKOFF]
2093         SKIPGE USER
2094          BUG AWFUL,[PAGE FAULT IN NULL JOB]
2095         MOVE U,PFOPC
2096         MOVEM U,PFOPC1
2097         MOVE U,PFAILU           ;RESTORE U SO CLKSAV CAN RE-SAVE IT
2098 TPFLT1: SETOM PFAILF
2099         CONO PI,CLKRQ           ;CAUSE CLK BREAK AND PI SYSTEM ON
2100         JRST .                  ;TAKES A WHILE TO GO OFF
2101
2102 ;COME BACK HERE PI IN PROGRESS ON CLK CHANNEL
2103 PFA6:   MOVE T,PFOPC1
2104         MOVEM T,CLKBRK          ;SAVE PC AS OF PAGE FAULT AS PLACE INTERRUPTED FROM
2105         AOSN PFAILF             ;IF INTERRUPTED FROM INTPFL,
2106          JRST PFA9              ; PC DOESN'T POINT TO FAULTING INSTRUCTION
2107         TLNE T,%PSUSR           ;MAYBE SPURIOUS MPV ON IOT IN USER MODE?
2108          TLNE T,%PSUIO
2109           JRST PFA9             ;CAN'T BE, I/O IS LEGAL
2110         HLRZ TT,UPFW(U)         
2111         ANDI TT,%PFCOD
2112         CAIE TT,%PFPNA          ;CAN'T BE IF PAGE FAULT IS REALLY SOME OTHER RANDOM BREAK
2113          CAIN TT,%PFILW         ;SUCH AS A PARITY ERROR
2114           JRST PFA11
2115 PFA9:
2116 ;       MOVE T,PFOPC
2117 ;       MOVEM T,UPOPC(U)        ;SOLELY FOR THE .OPC USER VARIABLE
2118         LDB E,[$PFPNO,,UPFW(U)] ;FAILING PAGE NO
2119         HLRZ D,UPFW(U)
2120         ANDI D,%PFCOD           ;GET THE PAGE-FAULT CODE.
2121         MOVEI A,0               ;INIT USER INT BITS
2122         CAIE D,%PFPNA
2123         CAIN D,%PFILW
2124          JRST PFA5              ;REAL PAGE FAULT OR RWF
2125         CAIN D,%PFMAR
2126          JRST PFA7A
2127         CAIN D,%PFPRO
2128          JRST PFA7              ;OTHER RANDOM BREAKS
2129         CAIE D,%PFPAR
2130         CAIN D,%PFPRX
2131          JRST PFA14             ;PARITY ERROR
2132         MOVSI D,SCLBPF          ;UNKNOWN PFW, GET SYSTEM JOB TO BARF ABOUT IT
2133         TDNE D,SUPCOR
2134          BUG PAUSE,[BAD PAGE FAIL WORD ],OCT,BPFPFW     ;LOSING IN REAL TIME
2135         IORM D,SUPCOR
2136         AOS BPFERR
2137         MOVEM U,BPFUSR
2138         MOVE D,UPFW(U)
2139         MOVEM D,BPFPFW
2140         MOVE D,CLKBRK
2141         MOVEM D,BPFPC
2142         JRST SCHED              ;IGNORE THE FAULT (BUT DO A FULL SCHEDULE SO SYS JOB WAKES)
2143
2144 PFA14:  SETZM PARRSN            ;SAY THIS IS PAR ERR TRAP, NOT PAR ERR INTERRUPT.
2145         MOVE D,UPFW(U)
2146         MOVEM D,PARPFW          ;SAVE PFW OF PAR ERR FOR ERROR MESSAGE
2147         AC7CTX                  ;SELECT AC BLOCK 7, USED BY UCODE.
2148         UMOVE D,0               ;SAVE THE AC THAT HOLDS THE BAD WORD
2149         MOVEM D,PARWRD
2150         SYSCTX                  ;AND RESET THE DATAO PAG TO NORMAL VALUE
2151         JRST CLKB1E             ;GO SCAN FOR THE ERROR.
2152
2153 PFA3:   CAIE U,XCT_-33
2154          BUG HALT,[PAGE FAULT IN SYSTEM AT ],OCT,PFOPC  ;BARF!
2155         MOVE U,@PFOPC           ;QUUX! LET ONE LEVEL OF XCT WIN
2156         MOVEM U,PFINST
2157         MOVE U,PFAILU
2158         LDB U,[331100,,@PFINST]
2159         JRST PFA4
2160
2161 PFA11:  XCTRI XR,[MOVE T,(T)]   ;GET INSTRUCTION IN WHICH PAGE FAIL OCCURRED
2162          TLCA T,700000          ;AND CHECK HIGH THREE BITS OF OPCODE
2163           JRST PFA9             ;JUMP IF FAULT WAS ON INSTRUCTION FETCH
2164         TLCE T,700000
2165          JRST PFA12             ;JUMP IF INSTRUCTION NOT AN IOT
2166 PFA13:  MOVSI TT,(HRRI T,)
2167         DPB T,[2700,,TT]
2168         XCTRI XEA,TT            ;COMPUTE ITS EFFECTIVE ADDRESS
2169          TLZA T,37              ;CLEAR @+XR, BUT LEAVE OPCODE AND AC
2170           JRST PFA9             ;JUMP IF FAULT ON INDIRECT WORD
2171         MOVEM T,MUUODP(U)       ;IT WAS A SPURIOUS MPV, SO
2172         MOVE T,CLKBRK           ; SIMULATE TRAPPING AS A UUO
2173         HRRI T,1(T)
2174         MOVEM T,XUUOH(U)        ;STORE OLD PC
2175         MOVE T,CLCX(U)
2176         MOVEM T,MUUOCX(U)       ;AND OLD CONTEXT
2177         MOVE T,MUUOCN(U)
2178         MOVEM T,CLKBRK          ;GET NEW PC
2179         JRST CLKB5              ;AND RESTART USER AT UUOH0
2180
2181 PFA12:  TLNN T,700000           ;MAYBE AN INSTRUCTION OVERLAYED ON AN MUUO, E.G. LPMR
2182          TLNN T,040000          ;OPCODES 040-077 QUALIFY.
2183           TLCA T,(XCT)
2184            JRST PFA13           ;YUP.
2185         TLNE T,777000           ;SKIP IF OPCODE WAS XCT
2186          JRST PFA9
2187 ;       TLZ T,777740
2188 ;       TLO T,(MOVEI T,)
2189 ;Following instruction is suspected of not working (sometimes using wrong AC block)
2190 ;       XCTRI XEA,T             ;COMP EFFECTIVE ADDRESS OF XCT IN USER CONTEXT
2191 ;;       JRST PFA11             ;AND GO PROCESS INSTRUCTION AT THAT ADDRESS
2192 ;        JRST [ MOVEM T,TRMNAM(U)       ;TEMPORARY FOR DEBUGGING
2193 ;               JRST PFA11 ]
2194 ;       JRST PFA9               ;HERE IF FAULT WAS IN INDIRECT CYCLE
2195 ;Replacement code:
2196 PFA15:  DATAI PAG,TT            ;HMM, SEE IF WRONG AC BLOCK SELECTED
2197         TLNN TT,100
2198          BUG
2199         LDB TT,[220400,,T]      ;CHECK FOR NEED TO SIMULATE INDEXING
2200         JUMPE TT,PFA16
2201         UMOVE TT,(TT)
2202         ADD TT,T
2203         HRR T,TT
2204 PFA16:  TLNN T,(@)              ;CHECK FOR NEED TO SIMULATE INDIRECT
2205          JRST PFA11
2206         XCTRI XR,[MOVE T,(T)]
2207          JRST PFA15             ;PROCESS INDIRECT WORD
2208         JRST PFA9               ;TAKE FAULT ON INDIRECT WORD
2209 ;End replacement code.
2210 ];KL10P
2211 \f
2212 IFN KS10P,[
2213
2214 EBLK
2215
2216 IRP I,,[1,2,3,4,5,6,7]
2217 PF!I!SVU:       0       ;Saved U at PI level I page fail
2218 PF!I!SVT:       0       ;Saved T at PI level I page fail
2219 PF!I!INS:       0       ;Instruction at PI level I page fail
2220 TERMIN
2221 IFN .-PF1SVU-21., .ERR Wrong length PFXSVU block.
2222
2223 BBLK
2224
2225 IRP I,,[1,2,3,4,5,6,7]
2226 PF!I!AIL:       ;;PI level I page fail comes here.
2227         MOVEM T,PF!I!SVT        ;Save T
2228         MOVEM U,PF!I!SVU        ;Save U
2229         JSP U,PIFAIL            ;Set up U and join common code
2230 TERMIN
2231 IFN .-PF1AIL-21., .ERR Wrong length PFXAIL block.
2232 PFXSVT==:0,,<PF7SVT-<PF7AIL+3>>
2233 PFXINS==:0,,<PF7INS-<PF7AIL+3>>
2234 PFXWRD==:0,,<EPTP7W-<PF7AIL+3>>
2235 PFXOPC==:0,,<EPTP7O-<PF7AIL+3>>
2236
2237 PIFAIL: MOVE T,PFXWRD(U)        ;Check page fail word
2238         TLNE T,%PFNXI
2239          BUG AWFUL,[NON-EX IO REG WITH PI IN PROGRESS ],OCT,PFXWRD(U),[PC=],OCT,PFXOPC(U)
2240         TLNE T,%PFNXM\%PFPAR
2241          BUG AWFUL,[NXM OR PARITY ERROR WITH PI IN PROGRESS]
2242         MOVE T,PFXOPC(U)        ;Check for user mode.
2243         TLNE T,%PSUSR
2244          BUG AWFUL,[PAGE FAULT IN USER MODE WITH PI IN PROGRESS]
2245         SKIPA T,(T)             ;We assume that it wasn't the instruction
2246                                 ;fetch itself that caused the fault.
2247 PIFL2:   MOVEI U,PF7AIL-PF7XCT(U)       ;Correct U on return from PFXXCT
2248         MOVEM T,PFXINS(U)       ;Save instruction that caused fault
2249         LSH T,-33               ;Look at opcode
2250         CAIE T,XCTRI_-33        ;XCTRI gets special treatment:
2251          JRST PIFL1
2252 REPEAT 2, AOS PFXOPC(U)         ;Arrange for it to skip.
2253         JRST PFXRET(U)          ;And return.
2254
2255 IRP I,,[1,2,3,4,5,6,7]
2256 PF!I!RET:
2257         MOVE T,PF!I!SVT         ;Restore T
2258         MOVE U,PF!I!SVU         ;Restore U
2259         JRST 2,@EPTP!I!O        ;Return
2260 TERMIN
2261 IFN .-PF1RET-21., .ERR Wrong length PFXRET block.
2262 PFXRET==:0,,<PF7RET-<PF7AIL+3>>
2263
2264 ;;;Let XCT chains that end in XCTRI win.  We assume that none of the
2265 ;;;fetches along the way to the XCTRI itself caused the fault.
2266 PIFL1:  CAIE T,XCT_-33
2267          BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS]
2268         MOVE T,PFXSVT(U)        ;Restore T
2269         JRST PFXXCT(U)          ;Go pick up word XCT'ed
2270
2271 IRP I,,[1,2,3,4,5,6,7]
2272 PF!I!XCT:
2273         MOVE U,PF!I!SVU         ;Restore U
2274         MOVE T,@PF!I!INS        ;Pick up XCTed instruction
2275         JSP U,PIFL2             ;Set up U again and rejoin common code
2276 TERMIN
2277 IFN .-PF1XCT-21., .ERR Wrong length PFXXCT block.
2278 PFXXCT==:0,,<PF7XCT-<PF7AIL+3>>
2279 \f
2280 EBLK
2281
2282 PFLCLK: 0       ; Did page fault happen with CLKOFF?
2283 PFLSVU: 0       ; Saved U during page fail
2284 PFLSVT: 0       ; Saved T during page fail
2285 PFLINS: 0       ; Faulting instruction
2286
2287 BBLK
2288
2289 ;;; Note!
2290 ;;; If we are swapped out while running with Exec mode PC between PFAIL and
2291 ;;; PFAILE inclusive, EPTPFO is saved as our PC.  (There are actually only
2292 ;;; a few PC's for which this is possible given that we mostly run CLKOFF.)
2293
2294 PFAIL:  SETZM PFLCLK
2295         CONSO PI,1
2296          SETOM PFLCLK
2297         CONO PI,CLKOFF          ; Don't bother me
2298         MOVEM U,PFLSVU          ; Save U
2299         MOVEM T,PFLSVT          ; Save T
2300         SKIPGE U,USER
2301          BUG AWFUL,[PAGE FAULT IN NULL JOB]
2302         MOVE T,EPTPFW           ; Get the explanation
2303         MOVEM T,UPFW(U)         ; Save it for others
2304         MOVE U,PFLSVU           ; Restore U, only needed it for a moment.
2305         TLNE T,%PFNXM\%PFPAR    ; Bad stuff should interrupt us, right?
2306          BUG AWFUL,[NXM OR PARITY ERROR DIDN'T INTERRUPT]
2307         MOVE T,EPTPFO
2308         TLNE T,%PSUSR           ; In Exec mode?
2309          JRST PFLUSR
2310         MOVE T,(T)              ; We assume that it wasn't the instruction
2311                                 ; fetch itself that caused the fault.
2312 PFLOOP: MOVEM T,PFLINS          ; Save instruction that caused fault.
2313         LSH T,-33               ; Check opcode for XCTRI
2314         CAIN T,XCTRI_-33        ; Should we skip?
2315          JRST PFLSKP
2316         CAIN T,XCTR_-33         ; Touching user address?
2317          JRST PFLUSR
2318         CAIE T,UMOVE_-33        ; These guys are just like XCTR
2319          CAIN T,UMOVEM_-33
2320           JRST PFLUSR
2321         ;; Let XCT chains win.  We assume that none of the fetches along
2322         ;; the way caused the fault.
2323         CAIE T,XCT_-33
2324          BUG HALT,[PAGE FAULT IN SYSTEM AT],OCT,EPTPFO
2325         MOVE T,PFLSVT           ; Restore T for a moment
2326         MOVE T,@PFLINS          ; Pick up XCTed instruction
2327         JRST PFLOOP
2328
2329 ;;; Come here to cause faulting instruction to skip.
2330 PFLSKP: MOVE T,PFLSVT           ; Restore T
2331 REPEAT 2, AOS EPTPFO
2332         SKIPL PFLCLK            ; Unless clock was already off
2333          CONO PI,CLKON          ; turn it back on
2334 PFAILE: JRST 2,@EPTPFO
2335
2336 ;;; Come here on NXI error.
2337 PFLNXI:
2338
2339 ;;; We come here when the page fault is "soft" and it happened in user mode
2340 ;;; or while using XCTR, UMOVE, or UMOVEM.
2341 PFLUSR: MOVE T,EPTPFW
2342         TLNN T,%PFNXI           ; Non-existent IO Register?
2343          JRST PFLU1             ; Nope
2344         MOVE T,EPTPFO
2345         TLNE T,%PSUSR           ; NXI in User IOT mode is not fatal.
2346          TLNN T,%PSUIO
2347           BUG AWFUL,[NON-EX IO REG ],OCT,EPTPFW,[PC=],OCT,EPTPFO
2348 PFLU1:  MOVE T,PFLSVT           ; Restore T
2349         SKIPGE PFLCLK           ; Check for lossage
2350          BUG AWFUL,[PAGE FAULT WITH CLKOFF AT],OCT,EPTPFO
2351 TPFLT1: SETOM PFAILF            ; Cause CLK level to go to PFLU2
2352 CCLKRQ: CONO PI,CLKRQ
2353         JRST .                  ; Takes a while to go off...
2354
2355 ;;;CLKBRK comes back here at CLK level.
2356 PFLU2:  MOVE T,EPTPFO
2357         MOVEM T,CLKBRK          ;Save PC of page fault as place interrupted
2358                                 ;from.
2359         LDB E,[$PFPNO,,UPFW(U)] ;E: Virtual page number
2360         HLRZ D,UPFW(U)
2361         ANDI D,%PFNXI\%PFWRT\%PF2.9\%PF2.8      ;D: Page fault code
2362         MOVEI A,0               ;A: User interrupt bits
2363         TRNE D,%PFNXI           ;NXI in User IOT mode.
2364          JRST PFA7A
2365
2366 ;Drops through into PFA5
2367
2368 ] ;KS10P
2369 \f
2370 IFN KA10P,[
2371 CLKB1:  MOVE T,CLKBRK
2372         CONSZ 200
2373          JRST CLKFO1    ;FLOATING OVERFLOW ENABLED
2374 CLKFO2: CONSZ 20        ;SKIP IF AR OV INT NOT ENABLED
2375          CONSO 10       ;OV ENABLED, SKIP IF OV
2376           CONSZ 270000  ;NOT OV, CHECK PDL OV, MEM PROTECT, NXM
2377            JRST CLKB1C  ;PDL OV, NXM, ETC
2378         JRST CLKB1D     ;ONLY CLOCK BREAK, AR OV JUST ENABLED
2379
2380 CLKFO1: CONSO 100       ;SKIP ON FLOATING OVERFLOW
2381          JRST CLKFO2    ;NOT REALLY FLOATING OVERFLOW
2382 CLKB1C: JUMPL U,CNLJL   ;NULL JOB LOST
2383         MOVEI A,0       ;SET UP INTERRUPT BITS FOR USER
2384         CONSZ 20        ;SKIP IF OV NOT ENABLED
2385          CONSO 10       ;OV ENABLED, SKIP ON OV
2386           JRST CLB1A    ;NOT AROV
2387         PUSHJ P,AROV
2388 CLB1A:  CONSZ 200       ;SKIP IF FL OV NOT ENABLED
2389          CONSO 100      ;FL OV ENABLED, SKIP ON FL OV
2390           JRST CLB1B    ;NOT FLOATING OVERFLOW
2391         PUSHJ P,ARFOV
2392 CLB1B:  CONSO 270000    ;SKIP IF PDL OV, NXM, OR MEM PROTECT
2393          JRST CLB1X
2394         CONSZ 10000     ;NON EX MEM
2395          PUSHJ P,MEMHNG
2396         CONSO 200000
2397          JRST CLKB1H
2398         TRO A,%PIPDL    ;PDL OVFLO
2399         TLNN T,%PCUSR   ;SKIP IF IN USER MODE
2400          BUG HALT,[PDL OVERFLOW IN EXEC MODE]
2401 CLKB1H: CONSO 20000     ;MEM PROTECT
2402          JRST CLKB1G
2403         HLLZ D,UPQUAN(U)        ;PICK UP FAULT BITS
2404         TLNE D,1000
2405          TLNN D,770     ;ALL CONDITIONS WHICH ABORT INSTRUCTION
2406           JRST CLKB1J   ;(PLUS PAGE NXM FOR RANDOMNESS)
2407         TRZ A,%PIPDL    ;INSTRUCTION ABORTED, DON'T SET PDL OV
2408         HLLZ T,UPOPC(U)
2409         LSH T,5
2410         HRR T,UPOPC(U)  ;FIX UP OPC
2411         MOVEM T,CLKBRK  ;RESET PC FROM OPC
2412         AOS NPGFLT
2413         HLRZ E,UPJPC(U) ;GET VIRTUAL PAGE # (LH OF JPC)
2414         TRNN E,400
2415          JRST CFHFPF
2416         ANDI E,377      ;FLUSH AGE ETC
2417 ] ;KA10P
2418         ;DROP THROUGH INTO PFA5
2419 \f
2420 IFE KA10P,[
2421 PFA5:   AOS NPGFLT
2422 ] ;IFE KA10P
2423         MOVE TT,LUMPS
2424         HRRZ W,USER
2425 IFN KA10P,[
2426         TLNE D,320      ;SKIP IF REALLY PAGE FAULT
2427          JRST CFH4      ;OTHERWISE WRITE IN READ ONLY OR EXECUTING IMPURE PAGE
2428 ] ;KA10P
2429
2430 ;COME HERE WITH
2431 ;  A    BITS FOR USER'S PIRQC
2432 ;  D    PAGE FAULT BITS OR CODE
2433 ;  E    VIRTUAL PAGE NUMBER OF PAGE FAILURE
2434 ;  TT   THE UMAPS SETTING
2435 ;THE MYSTERIES OF W:
2436 ;  RH IS A USER INDEX
2437 ;  LH 0 => NORMAL PAGE FAULT
2438 ;     NON0 => SWAP IN REQUEST FOR OTHER REASON.  D,TT SHOULD BE 0.
2439 ;     SPECIFICALLY,
2440 ;     4.9 => DMA DEVICE SWAP-IN, SEE SWIRQB, SWPPIN
2441 ;     4.8 => FROM SCHEDULER, TO GIVE INTERRUPT (?)  THIS IS NO LONGER USED,
2442 ;            PROBABLY. 
2443 ;     4.7 => FROM CFHAHD, TO PAGE AHEAD.  THIS IS ONE LEVEL OF RECURSIVE
2444 ;            USE OF CFHSW1. 
2445 ;  FOR A NORMAL PAGE FAULT, THE USER PC IS IN CLKBRK.
2446
2447 CFHSW1:         HRRZM E,CFHUVP  ;USER'S VIRTUAL PAGE NUMBER
2448                 TRZN E,200
2449                  JRST CFH1
2450                 MOVEI C,UPGCPH(W)       ;VIRTUAL ADDRESS IN USER'S HIGH SEG
2451                 TLNN TT,%UMMPU  ;IS MY UPPER NORMAL?
2452                  JRST CFH2      ;YES, USE MY UPPER CPB
2453                 MOVEI C,UPGCPH(TT) ;NO, TRY HIS UPPER.
2454                 TLNE TT,%UMUTL  ;IS MY UPPER GOING TO HIS LOWER?
2455                  MOVEI C,UPGCP(TT) ;YES, TRY HIS LOWER.
2456                 JRST CFH2
2457
2458 CFH1:           MOVEI C,UPGCP(W)        ;VIRT ADDRESS IN USER'S LOW SEG
2459                 TLNN TT,%UMMPL
2460                  JRST CFH2      ;MY LOWER DBR NOT HACKED
2461                 MOVEI C,UPGCP(TT)
2462                 TLNE TT,%UMLTU  ;WAS MY LOWER HACKED TO POINT TO UPPER?
2463                  MOVEI C,UPGCPH(TT) ;YES.
2464 CFH2:           ROT E,-1
2465                 ADD C,E
2466                 HRLI C,222200
2467                 SKIPGE E
2468                  HRLI C,2200
2469                 MOVE T,C        ;CALCULATE MAP ENTRY B.P. FROM CIRC PTR B.P.
2470                 ADD T,[(200000-2000)UPGMP-UPGCP]
2471                 LDB E,C         ;CIRC MEM USE POINTER FOR PAGE FAULT
2472                 JUMPE E,CFH4    ;ADDRESS IS IN REAL ILM
2473                 CAIN E,-1
2474                  JRST CFH4      ;ON REFERENCE TO ABS PAGE ALSO ILM
2475 IFN KL10P,[     CAIE D,%PFILW
2476                  JRST CFHW1
2477                 LDB I,T
2478                 JRST .+1(I)
2479                   BUG           ;?
2480                   JRST CFH4     ;WRITE IN READ ONLY?
2481                   JRST CFHRWF   ;READ WRITE FIRST
2482                   BUG           ;?
2483 ] ;KL10P
2484 IFN KS10P,[     CAIN D,%PFWRT\%PF2.8    ;WRITE IN READ ONLY
2485                  JRST CFH4
2486                 CAIN D,%PFWRT\%PF2.9    ;READ WRITE FIRST
2487                  JRST CFHRWF
2488                 TRNE D,%PF2.8\%PF2.9    ;PAGE NOT IN MAP
2489                  BUG HALT,[BOGUS PAGE FAIL CODE]
2490 ] ;KS10P
2491 IFN KA10P,[
2492                 TLNE D,40
2493                  JRST CFHRWF
2494 ] ;KA10P
2495 ;REFERENCE TO PAGE WITH NO ACCESS IN MAP.
2496 CFHW1:          SKIPGE RPCL(W)
2497                  JUMPGE W,CFF1  ;BEING RPCLSRED?
2498                 MOVEM A,CFHAS
2499                 AOSE CIRPSW
2500                  JRST CFH5      ;CIRPSW NOT AVAILABLE
2501                 TRZE E,400000
2502                  TRNE E,200000
2503                   JRST CFHSW3
2504                 CAML E,MMPMX
2505                  BUG            ;MMP OUT OF RANGE
2506                 MOVE C,E        ;CIRC PNTR ALREADY POINTS TO MMP
2507                 ADD C,MMPEAD
2508                 JRST CFHSW4
2509
2510 CFHSW3:         PUSHJ P,UCPRL   ;FIND MMP
2511                   200000,,.+2
2512                  BUG            ;NONE?
2513                 SUB P,[4,,4]
2514 CFHSW4:         LDB D,[410200,,(C)]     ;TWO BITS OF MMP ENTRY GIVES DISPOSITION OF PAGE
2515                 AOS NRPI(D)
2516                 JRST @CFHDT(D)
2517
2518 CFHDT:  CFHPI   ;IN
2519         CFHPCI  ;COMING IN
2520         CFHPO   ;OUT
2521         CFHPGO  ;GOING OUT
2522 \f
2523 ;PAGE FAULT IN JOB BEING PCLSR'D.
2524 CFF1:   MOVE C,CLKBRK
2525         TLNE C,%PCUSR
2526          BUG            ;BEING RPCLSRED IN USER MODE
2527 IFN KA10P,[
2528         MOVSI D,1770
2529         ANDCAM D,UPQUAN(W)      ;CLR PG FLT
2530         LPMR UPGML(W)
2531         CONO 470000+APRCHN      ;CLR PDL OV + QT OV + MPV + NXM
2532 ] ;KA10P
2533         MOVE T,[BADBTS]
2534         IOR T,MSKST(W)
2535         AND T,A
2536         IORM T,PIRQC(W)
2537 IFE KA10P,[
2538         MOVE T,CLCX(W)          ;RESTORE UPT BUT NOT ACS
2539         HRLI T,300000
2540         DATAO PAG,T
2541 ] ;IFE KA10P
2542         CONO PI,CLKOFF          ;GO ALLOW SELF TO GET RPCLSRED
2543         JRST 10,UFL1            ;GO INTO UFLS WITH CLK OFF RATHER THAN
2544                                 ;IN PROGRESS
2545
2546 CFHRWF:                 ;HANDLE "WRITE IN READ-WRITE-FIRST PAGE" PAGE FAULT.
2547 IFN KA10P,[
2548         TLNE D,10
2549          JRST CFHW1     ;SOMETIMES NO ACCESS SEEMS TO BE ON TOO
2550         LDB I,T
2551         CAIE I,2
2552          BUG            ;GOT "WRITE IN R-W-F PAGE" BUT PAGE ISN'T R-W-F.
2553 ] ;KA10P
2554         MOVEI I,3
2555         DPB I,T
2556         MOVEM A,CFHAS
2557         JRST CFHX1
2558
2559 ;; EXIT FROM PAGE FAULT HANDLING FOR NON-ERROR FAULT.
2560 ;; C SHOULD CONTAIN 0 IF CAN CONTINUE NOW, OR A FLSINS TO WAIT WITH.
2561 ;; A SHOULD CONTAIN -1 IF FAULT HANDLED SUCCESFULLY (PAGE IN OR ON ITS WAY), ELSE 0.
2562 CFHX:   SETOM CIRPSW
2563         TLNN W,200000
2564          JUMPL W,CPOPJ
2565 CFH5A:  JUMPE C,CFHX1   ;IF NOT GOING TO WAIT, SKIP NPGWTU CODE
2566         MOVSI D,%SWPGW
2567         IORM D,USWST(W) ;WAITING FOR PAGE
2568         AOS NPGWTU      ;KEEP COUNT OF USERS WAITING FOR A PAGE
2569         SKIPN FLSINS(W)
2570          MOVEM C,FLSINS(W)
2571         SKIPE FLSINS(W)
2572          CLEARM DLSRCH
2573 CFHX1:  MOVE A,CFHAS
2574 IFN KA10P, MOVSI D,1770         ;CLEAR FAULT STATUS BITS
2575         MOVE U,USER
2576         JRST CFH6
2577
2578 ;; WAIT FOR CIRPSW TO BE AVAILABLE.
2579 CFH5:   SETZ A,
2580         JUMPL W,CPOPJ
2581         MOVE C,[SKIPL CIRPSW]
2582         AOS NLPPGC
2583         JRST CFH5A
2584 \f
2585 ;PAGE FAULT ON PAGE THAT'S REALLY IN CORE.
2586 CFHPI:  PUSHJ P,CFHAHC  ;SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2587         MOVSI D,MMPPGA
2588         TDNE D,(C)
2589          AOS NPGAHR     ;COUNT NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2590         ANDCAB D,(C)
2591         MOVSI D,MMPPGB
2592         TDNE D,(C)
2593          AOS NPGBHR     ;COUNT NUMBER OF PAGES AGED BY PAGE-BEHIND WHICH WERE USED AGAIN.
2594         ANDCAB D,(C)
2595         HRLI C,2200
2596         PUSH P,C        ;SAVE MMP ENTRY ADDRESS FOR PPIUM.
2597         PUSHJ P,UCPRL
2598             100000,,.+2 ;RETURN ON MEMPNT
2599          BUG            ;NO MEMORY LINKED IN?
2600         SUB P,[4,,4]    ;FIND MEMBLT INDEX
2601         POP P,C
2602         TLNE D,MMPBAD   ;WAS THIS PAGE RECENTLY A PAR ERR VICTIM?
2603          JRST CFHPB     ;YES; READ IT BACK OFF THE DISK IF POSSIBLE.
2604 IFN E.SP,[
2605         JUMPGE W,E.SBAR ;IF NOT CALLED FROM SWPPIN
2606         HRRZ H,DISUSR   ;CHECK TO SEE IF SERVICING E&S
2607         CAIN H,(W)      ;NOT DISPLAY, THEN SKIP
2608          PUSHJ P,E.SPGI ;ELSE TIE DOWN PAGE
2609 E.SBAR:
2610 ]
2611         MOVE A,T
2612         HLLZS MMSWP(A)  ;CLEAR LENGTH OF CIRC LIST (BUT NOT EXEC PGS COUNT)
2613         MOVE D,C
2614         HRLI D,(TDNE T,)
2615         PUSHJ P,PPIUM   ;PUT PAGE INTO USERS' MAPS
2616 IFN E.SP,SETZM  E.SPGH  ; CLEAR QSWI1 FLAG
2617         MOVEI C,0
2618         MOVNI A,1
2619         JRST CFHX
2620
2621 ;COME HERE FOR PAGE WHICH SEEMS TO BE IN CORE, BUT HAD A PAR ERR RECENTLY.
2622 ;"SWAP IT OUT", SO IF IT'S PURE IT WILL JUST BE READ BACK FROM DISK.
2623 CFHPB:  PUSH P,W
2624         MOVE A,T
2625         SETOM CIRPSW    ;UNLOCK, SO SWPOPG CAN RE-LOCK.
2626         MOVE C,USER     ;TELL SWPOPG WHICH JOB SHOULDN'T BE PCLSR'ED.
2627         PUSHJ P,SWPOPL  ;"SWAP OUT" THE PAGE (EVEN IF LOCKED DOWN)
2628          JRST [ POP P,W ;FAILED TO GO OUT.  COULD BE EXEC PAGE POINTING TO IT,
2629                 SETZ A, ;OR A JOB THAT CAN'T BE PCLSRED RIGHT NOW.
2630                 MOVSI C,(CAIA)  ;WAIT A LITTLE AND TRY AGAIN (HOPE FOR THE BEST)
2631                 JRST CFHX ]
2632         POP P,W
2633         AOSE CIRPSW     ;SWPOPG UNLOCKS; RE-LOCK.
2634          JRST CFH5      ;OR ELSE GO INTO PAGE-WAIT TILL CIRPSW FREE.
2635         MOVE C,SWOMMP
2636         JRST CFHSW4     ;TRY AGAIN TO REFERENCE PAGE, SWAPPING IT BACK IN.
2637 \f
2638 ;ON A RANDOM PAGE FAULT, SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2639 ;ASSUMES W SET UP AS FOR CFHSW1, AND TT
2640 CFHAHC: MOVE D,CFHUVP   ;GET USER'S VIRTUAL PAGE NUMBER.
2641         TLNN W,-1       ;PAGE AHEAD ONLY FOR NORMAL PAGE FAULT (SO PC IS IN CLKBRK).
2642          SKIPN PAGAHD(W)        ;IS PAGE-AHEAD WANTED FOR THIS JOB?
2643           POPJ P,
2644         MOVSI T,%UMMPU
2645         TRNN D,200
2646          MOVSI T,%UMMPL
2647         TDNE TT,T       ;NO PAGE-AHEAD ON PAGE NOT MAPPED NORMALLY.
2648          POPJ P,
2649         HLRZ H,PAGRAN(W)
2650         HRRZ T,PAGRAN(W)
2651         CAML D,H        ;IS PAGE IN RANGE FOR AUTOMATIC PAGE-AHEAD?
2652          CAML D,T       ;IF SO, GO DO IT.
2653           POPJ P,
2654         PUSH P,C
2655         PUSHJ P,CFHAHD
2656         POP P,C
2657         POPJ P,
2658
2659 ;AUTOMATIC PAGE-AHEAD AND PAGE-BEHIND.
2660 ;WHEN PAGE N IS PUT INTO THE MAP, PAGE N+1 IS SWAPPED IN
2661 ;AND PAGE N-1 IS SWAPPED OUT.
2662 ;(ACTUALLY, 1 IS A PARAMETER, IN THE PAGAHD VARIABLE)
2663 CFHAHD: PUSH P,CFHUVP
2664 ;LOOP, REQUESTING SWAP-IN FOR THE NEXT N PAGES.  E HAS PAGE NUMBER TO SWAP IN.
2665 CFHAH1: MOVE E,CFHUVP
2666         HLRE A,PAGAHD(W)
2667         MOVE T,A
2668         ADD A,(P)
2669         CAMN A,E                ;DETECT END OF LOOP.
2670          JRST CFHAH2
2671         SKIPL T                 ;ELSE INCREMENT OR DECREMENT PAGE NUMBER.
2672          AOSA E
2673           SOS E
2674         PUSHJ P,CFHRNG          ;IS PAGE NUMBER IN RANGE FOR PAGE-AHEAD?
2675          JRST CFHAH2
2676         PUSH P,W
2677         HRLI W,500000           ;PAGE AHEAD THE PAGE.  100000 MEANS PAGE-AHEAD.
2678         SETZB D,TT
2679         SETOM CIRPSW            ;ALLOW CFHSW1 TO LOCK CIRPSW.
2680         PUSH P,CFHAS
2681         PUSHJ P,CFHSW1
2682         POP P,CFHAS
2683         SETZM CIRPSW            ;BUT REALLY IT'S ALREADY LOCKED SO KEEP IT SO.
2684         POP P,W
2685         SKIPN A
2686          AOS NPGAH1             ;COUNT NUMBER OF TIMES AN ATTEMPT FAILS.
2687         JRST CFHAH1
2688
2689 ;NOW IT'S TIME FOR PAGE-BEHIND.  E HAS PAGE NUMBER TO SWAP OUT.
2690 CFHAH2: MOVE E,(P)
2691 ;???? IS THERE ANY NEED TO PRESERVE U, EVER, INSIDE CFHSW1?
2692         PUSH P,U
2693         HRRE A,PAGAHD(W)        ;GET PAGE-BEHIND DISTANCE.
2694         JUMPE A,CFHAH4
2695         ADDB A,E                ;COMPUTE WHICH PAGE TO PAGE OUT.
2696         PUSHJ P,CFHRNG          ;SKIP IF PAGE IS IN RANGE FOR PAGE-BEHIND.
2697          JRST CFHAH4
2698         MOVE U,W
2699         PUSHJ P,UPLC            ;LOOK UP THE PAGE IN THE MAP.
2700         LDB D,Q                 ;D GETS CIRC PNTR
2701         JUMPE D,CFHAH4          ;NO PAGE THERE
2702         CAIN D,-1
2703          JRST CFHAH4            ;ABSOLUTE PAGE, DO NOTHING.
2704         LDB D,T
2705         TRO D,PMAGEM            ;AGE THE PAGE, IF THE PAGE IS REALLY IN THE MAP,
2706         TRNE D,600000
2707          DPB D,T
2708         AOS NPGBHA              ;COUNT PAGES AHED FOR PAGE-BEHIND.
2709         MOVE D,T                ;SAVE B.P. TO PAGE MAP HALFWORD, FOR CFHAH6.
2710         MOVE C,Q                ;STARTING FROM CIRC PTR, FIND MMP
2711         PUSHJ P,UCPRL
2712             200000,,.+2
2713          BUG                    ;IF NONE FOUND
2714         SUB P,[4,,4]            ;FOUND MMP, C POINTS TO IT
2715         MOVE E,C                ;SAVE ADDRESS OF MMP ENTRY
2716         MOVSI T,MMPTMP\MMPOUT   ;IF PAGE IS IN TRANSIT OR OUT, DO NOTHING TO IT.
2717         TDNE T,(C)
2718          JRST CFHAH6
2719         MOVE T,CLKBRK
2720         TLNN T,%PCUSR           ;IF JOB IN EXEC MODE, CAN'T SWAP OUT PAGE, SO JUST LEAVE AGED.
2721          JRST CFHAH6
2722         MOVE T,MEMFR
2723         SUB T,NCBCOM            ;IF LOTS OF FREE MEM, DON'T SWAP OUT.
2724         SUB T,SILNG
2725         CAML T,CFHAHS
2726          JRST CFHAH6
2727         PUSHJ P,UCPRL           ;GET CORE PAGE NUMBER IN T.
2728             100000,,.+2
2729          BUG
2730         SUB P,[4,,4]
2731         HLRZ A,MMSWP(T)
2732         JUMPN A,CFHAH6          ;POINTED TO BY AN EXEC PAGE, E.G. 340, CAN'T SWAP OUT.
2733         PUSH P,E
2734         PUSH P,D
2735         PUSH P,W
2736         MOVE A,T                ;PHYSICAL PAGE # TO SWAP OUT
2737         HRRZ C,W                ;DON'T PCLSR ME
2738         SETOM CIRPSW            ;SWPOPG WILL WANT TO RE-LOCK CIRPSW.
2739         PUSHJ P,SWPOPG          ;SWAP OUT
2740          JRST CFHAH5            ;CAN'T SWAP OUT => LEAVE JUST AGED.
2741         AOS NPGBHD              ;COUNT PAGES SWAPPED OUT BY PAGE-BEHIND.
2742 CFHAH5: POP P,W
2743         POP P,D
2744         POP P,E
2745         POP P,U
2746         POP P,CFHUVP
2747         AOS CIRPSW              ;SWPOPG UNLOCKS; RE-LOCK.
2748         POPJ P,                 ;CAN'T GET LOCKED BY SOMEONE ELSE, WE ARE AT CLOCK LEVEL
2749
2750 ;HERE FOR PAGE-BEHIND PAGE WHICH WE CAN'T OR DON'T WANT TO SWAP OUT.
2751 CFHAH6: MOVSI T,MMPPGB          ;IT HAS ALREADY BEEN AGED.  MARK IT FOR METERING PURPOSES.
2752         IORM T,(E)              ;E POINTS TO MMP ENTRY.
2753 CFHAH4: POP P,U
2754         POP P,CFHUVP
2755         POPJ P,
2756
2757 ;SKIP IF PAGE NUMBER IN E IS IN RANGE FOR PAGE-AHEAD OR PAGE-BEHIND.
2758 ;ASSUMES USER INDEX IN W.  CLOBBERS T.
2759 CFHRNG: CAIL E,400
2760          POPJ P,
2761         HLRZ T,PAGRAN(W)
2762         CAIGE E,(T)
2763          POPJ P,
2764         HRRZ T,PAGRAN(W)
2765         CAIL E,(T)
2766          POPJ P,
2767         JRST POPJ1
2768
2769 EBLK
2770
2771 CFHAHS: 20              ;IF LESS THAN THIS MUCH FREE MEM, PAGE-BEHIND SHOULD SWAP OUT.
2772
2773 NPGAHD: 0               ;NUMBER OF PAGES WE ACTUALLY SWAPPED IN FOR PAGE-AHEAD.
2774 NPGAH1: 0               ;NUMBER OF TIMES WE WERE UNABLE TO PAGE AHEAD.
2775 NPGBHD: 0               ;NUMBER OF PAGES WE ACTUALLY SWAPPED OUT FOR PAGE-BEHIND.
2776 NPGBHA: 0               ;NUMBER OF PAGES WE DID PAGE-BEHIND.
2777 NPGAHR: 0               ;NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2778 NPGBHR: 0               ;NUMBER OF PAGES AGED FOR PAGE BEHIND AND USED AGAIN.
2779
2780 BBLK
2781 \f
2782 ;REFERENCE TO SWAPPED OUT PAGE, MMP ADDRESS IN C.  SWAP IN THE PAGE.
2783 ;W HAS THE USER INDEX AND FLAGS.
2784 CFHPO:  PUSHJ P,CFHPOA
2785          JRST [ SETZ A, ;FAILED.  RETURN CODE FOR FAILURE, IF THIS IS FOR DEVICE (W<0).
2786                 JRST CFHX]
2787         TLNN W,100000           ;IF THIS IS A PAGE-AHEAD REQUEST,
2788          JRST CFHPOB
2789         MOVSI A,MMPPGA          ;MARK THE MMP ENTRY SO,
2790         IORM A,(C)
2791         AOS NPGAHD              ;AND COUNT IT AS A SUCCESSFUL ATTEMPT TO PAGE AHEAD.
2792 CFHPOB: TLNN W,200000
2793          JUMPL W,CFHPO2
2794         PUSHJ P,CFHAHC          ;ORDINARY PG FAULT => MAYBE PAGE AHEAD.
2795         MOVSI D,%SWBEM
2796 IFN SWPWSP,[            ;SWAPPING IN A PAGE FOR THIS GUY 
2797          ANDCAM D,USWST(W)      ;SO CLEAR BEST EFFORT MADE TO SWAP OUT BIT
2798 ];SWPWSP
2799 IFE SWPWSP,[
2800         TDNN D,USWST(W)         ;IF JOB IS BRINGING IN FIRST PAGE
2801          JRST CFHPO2            ; SINCE BEING SWAPPED OUT,
2802         ANDCAM D,USWST(W)       ;CLEAR BEST EFFOR MADE TO SWAP OUT BIT
2803         EXCH U,W                ;AND MAKE SWAP HISTORY TABLE ENTRY
2804         MOVSI T,0               ;FOR "BEGIN LOADING"
2805         PUSHJ P,SWPKHT
2806         EXCH U,W
2807 ];SWPWSP
2808 CFHPCI:
2809 CFHPGO:
2810 CFHPO2: MOVNI A,1       ;SIGNAL "SUCCESS"
2811         TLNN W,200000
2812          JUMPL W,CFHX
2813         MOVSI D,MMPTMP          ;BIT ON IF PAGE "IN TRANSIT"
2814         SKIPN FLSINS(W)
2815          MOVEM D,EPDL2(W)       ;HANG USER UNTIL PAGE GETS WHERE IT'S GOING
2816         HRLI C,(TDNE T,)        ;COMBINE WITH ADDRESS OF MMP
2817         AOS NLPPAG
2818         JRST CFHX
2819 \f
2820 ;SWAP IN PAGE.  W HAS USER INDEX AND FLAGS.  C HAS MMP ADDRESS.
2821 ;SKIPS IF SUCCESSFUL.  OTHERWISE RETURNS FLSINS IN C.
2822 ;SIGN BIT IN W IS SET FOR SWAP IN FOR DEVICE OR FOR PAGE-AHEAD
2823 ;(THAT IS, NOT ONE WHICH A JOB MUST WAIT FOR)
2824 ;SO DON'T INCREMENT SOME COUNTERS AND DON'T BOTHER WITH FLSINS IN C.
2825 CFHPOA:
2826 IFE SWPWSP,[
2827         SKIPGE USWSCD(W)        ;IF SWAP BLOCKED, EITHER UNBLOCK OR GIVE UP.
2828          JRST CFBO1
2829 CFBO2:
2830 ];SWPWSP
2831 IFN SWPWSP,[
2832         MOVE E,USWST(W) ;IF SWAPPED OUT, WE ARE EITHER GOING TO ENTER
2833         TLNE E,%SWOUT   ;THE LOADING STATE OR THE SWAP BLOCKED STATE
2834          JRST CFSB
2835 CFSB1:
2836 ];SWPWSP
2837         MOVSI E,MMPISW
2838         AND E,(C)
2839         CONO PI,UTCOFF-1
2840         JUMPN E,CFHPO5  ;INITIAL SWAPIN; GIVE UP AND WAIT NOW IF TUT IS LOCKED.
2841 CFHPO7: PUSHJ P,HMRQC   ;GET PHYS MEM BLOCK, NUMBER IN A.
2842          JRST CFHPO1    ;MEM NOT AVAILABLE
2843         MOVEI B,1
2844         DPB B,[410200,,(C)]     ;INDICATE COMING IN
2845         HRRZ B,(C)              ;OLD CP OF MMP
2846         MOVEM B,MEMPNT(A)       ;BECOMES LINK OUT OF CORE BLOCK
2847         HLRZ B,1(C)             ;B := DISK ADDRESS
2848         LDB I,[$MMPUN,,(C)]     ;I := DISK NUMBER
2849         CAIL I,NQS
2850          BUG
2851         HRLM B,MEMPNT(A)        ;SET DISK ADDRESS CORE BLOCK COMING FROM
2852 IFN SWPWSP,[
2853         MOVE D,USWST(W)
2854         TLNN D,%SWLOD
2855          AOSA NPLBNL
2856           AOS NPLBLJ
2857 ];SWPWSP
2858         SKIPE E         ;IF INITIAL SWAP IN PAGE, SOS THE TUT NOW
2859          PUSHJ P,CFHPO8 ;SINCE WE ARE DISSOCIATING THE PAGE FROM THE DISK BLOCK.
2860         CAIGE A,TSYSM
2861          CAIGE A,SYSB
2862           BUG           ;SHOULDN'T HAVE TO SWAP IN THE SYSTEM
2863         CONO PI,UTCON-1 ;LEAVE CLKCHN OFF.
2864         SOS NPGSWO
2865         AOS SWIPRQ      ;TOTAL SWAP IN REQUESTS
2866 ;; MARK THE PHYSICAL MEMORY BLOCK AS BEING SWAPPED INTO BY THIS PAGE.
2867         MOVEI B,MUSWPG
2868         DPB B,[MUR,,MEMBLT(A)]
2869         MOVEI B,600000(A)
2870         HRRM B,(C)      ;MAKE CP OF MMP POINT TO MEMPNT
2871         MOVE TT,C
2872         SUB TT,MMPEAD
2873         DPB TT,[MMMPX,,MEMBLT(A)]       ;STORE MMP INDEX IN MEMBLT
2874         MOVEI TT,.BM MLO
2875         ANDCAM TT,MEMBLT(A)     ;SET END OF LIST IN THIS BLOCK
2876 ;; PUT THE TRANSFER ON THE SWAP IN LIST.
2877         CONO PI,UTCOFF-1
2878         HLRZ TT,SINLST(I)       ;GET PREV BLOCK
2879         SKIPE TT
2880          DPB A,[MLO,,MEMBLT(TT)]        ;CHAIN TO PREV BLOCK
2881         SKIPN TT
2882          MOVEM A,SINLST(I)      ;OR TO HEADER IF FIRST
2883         HRLM A,SINLST(I)        ;AND SET NEW LAST BLOCK
2884         AOS SILNG               ;AOS NUMBER OF PENDING SWAP IN RQS.
2885         PUSHJ P,QSTRT1          ;WAKE UP DISK INTERRUPT LEVEL.
2886         CONO PI,UTCON-1
2887 ;; UPDATE SWAP HISTORY TABLE.
2888         HRLZ TT,W
2889         IDIVI TT,LUBLK          ;TT 3.1-3.8 GETS USER NUMBER, BASHES I
2890 IFN SWPWSP,[
2891         MOVSI T,%SWLOD
2892         TDNE T,USWST(W)
2893          TLO TT,(SETZ)
2894 ];SWPWSP
2895         MOVE T,CFHUVP
2896         DPB T,[321000,,TT]
2897         HRR TT,TIME
2898         MOVEM TT,@PGIHTP
2899         AOS T,PGIHTP
2900         MOVE TT,UTRNTM(W)
2901         MOVEM TT,PGIHTL-1(T)
2902         MOVEI TT,PGIHTB
2903         CAIL T,PGIHTB+PGIHTL
2904          MOVEM TT,PGIHTP
2905         TLNN W,200000
2906          JUMPL W,POPJ1
2907         AOS USIPRQ(W)
2908         JRST POPJ1      ;HANG USER UNTIL PAGE IN
2909 \f
2910 ;IF SWAPPNG IN "INITIAL SWAP IN" PAGE, CHECK TO SEE WHETHER TUT IS AVAILABLE.
2911 ;WE CAN'T SWAP THE PAGE IN IF NOT.
2912 CFHPO5: LDB I,[$MMPUN,,(C)]     ;GET DSK #
2913         CAIL I,NQS
2914          BUG
2915         SKIPL QTUTO(I)
2916          JRST CFHPO7    ;DISK TUT AVAIL
2917         CONO PI,UTCON-1
2918         TLNN W,200000
2919          JUMPL W,CPOPJ  ;NO COUNTER AOS IF SWAPIN FOR DEVICE OR PAGE AHEAD.
2920         MOVE C,[SKIPGE QTUTO]   ;ALSO MUSTN'T SMASH C
2921         ADD C,I
2922         AOS NLPPGT
2923         POPJ P,
2924
2925 ;LATER ON, COME HERE TO SOS THE TUT, AFTER GETTING THE MEM, WHEN WE CAN NO LONGER BLOCK.
2926 CFHPO8: ANDCAM E,(C)    ;CLEAR INITIAL SWAPIN BIT
2927         MOVE D,B        ;GET TRK #
2928         PUSHJ P,TUTPNT
2929         CAIGE B,TUTMNY
2930          SOJL B,[JRST 4,.]
2931         DPB B,D
2932         HRRZS 1(C)      ;CLEAR ASSIGNED TRACK NUMBER SO NEW SPACE ASSIGNED ON SWAPOUT
2933         POPJ P,
2934
2935 ;HERE IF NO MEMORY TO SWAP PAGE INTO.
2936 CFHPO1: CONO PI,UTCON-1
2937         TLNN W,200000
2938          JUMPL W,CPOPJ
2939         SKIPGE MEMFRZ           ;IF BECAUSE MEMFRZ LOCKED, MAKE JOB WAIT FOR MEMFRZ.
2940          JRST CFHPO4
2941         MOVE C,[SKIPL MEMFRZ]
2942         AOS NLPPGM
2943         POPJ P,
2944
2945 CFHPO4: MOVE C,[PUSHJ P,CFHPO3]
2946         MOVN D,SOLNG
2947         SUB D,SWPOPR    ;- # PGS GOING OUT
2948         ADDI D,10.      ;MAKE SURE AT LEAST 10. GOING OUT
2949         JUMPLE D,.+2
2950          ADDM D,SWPOPR
2951         MOVEI D,1
2952         SKIPN FLSINS(W)
2953          MOVEM D,EPDL2(W)
2954         AOS NLPPG3
2955         POPJ P,
2956
2957 CFHPO3: PUSH P,A        ;FLSINS ROUTINE (NEEDED MEM)
2958         MOVE A,MEMFR
2959         SUB A,NCBCOM
2960         CAIL A,5(T)
2961          JRST POPAJ1    ;NEEDED MEM AVAILABLE
2962         ADD A,SOLNG
2963         ADD A,SWPOPR
2964         SUBI A,10.(T)
2965         JUMPGE A,POPAJ  ;WILL EVENTUALLY WIN
2966         MOVNS A
2967         ADDM A,SWPOPR   ;LOSING - SWAP SOME MORE STUFF OUT
2968         JRST POPAJ
2969
2970 IFE SWPWSP,[
2971 ;HERE IF TRYING TO SWAP IN A PAGE BUT SWAP BLOCKED
2972 CFBO1:  MOVE E,MEMFR    ;GUY SWAPPED BLOCKED
2973         SUB E,NCBCOM
2974         SUB E,AUSOPG
2975         SUB E,SILNG
2976         ADD E,SOLNG
2977         JUMPGE E,CFBO3  ;SEEMS TO BE ROOM SO LET IT COME IN
2978         TLNN W,200000
2979          JUMPL W,CPOPJ  ;HANG GUY UNTIL SWAP BLOCK GOES AWAY
2980         MOVE C,[SKIPGE USWSCD]
2981         ADDI C,(W)
2982         AOS NTSBUB
2983         AOS NLPPGB
2984         POPJ P,
2985
2986 CFBO3:  AOS NTSBUP
2987         JRST CFBO2
2988 ];SWPWSP
2989 \f
2990 OVHMTR WS       ;WORKING-SET COMPUTATIONS
2991
2992 IFN SWPWSP,[
2993 ;HERE WHEN A SWAPPED OUT OR SWAP BLOCKED JOB TRIES TO SWAP IN A PAGE.
2994 ;JOB IN W, C -> MMP, USWST(W) IN E.  RETURN TO CFSB1.
2995 ;WE DECIDE WHETHER ENOUGH CORE CAN BE GARNERED TO LET HIM IN, AND PUT
2996 ;HIM INTO THE LOADING STATE, OR ELSE PUT HIM INTO THE SWAP BLOCKED STATE.
2997
2998 CFSB:   PUSH P,C
2999         TLNN E,%SWSB            ;ALREADY SWAP BLOCKED?
3000          PUSHJ P,WSRCM          ;NO, RECOMPUTE WORKING SET
3001         POP P,C
3002         MOVE B,USWPRI(W)        ;FIND SUM OF WS'S OF SWAPPED IN GUY'S WITH BIGGER USWPRI
3003         PUSHJ P,WSAVL
3004         MOVE D,USVWRK(W)        ;COMPUTE AMT OF WS NOT ALREADY IN CORE
3005         SUB D,UWRKST(W)
3006 IFL TSYSM-356.,[
3007         CAML D,[TSYSM-100.,,]
3008          JRST .+3               ;WS > PHYSICAL MEM, ALLOW IN ANYWAY, FOO!
3009 ];TSYSM
3010         CAMGE A,D               ;WILL IT FIT IN AVAILABLE MEM?
3011          JRST CFSB2             ;NO, SWAP BLOCK
3012         PUSHJ P,CFELD           ;YES, ENTER 'LOADING' STATE
3013         JRST CFSB1              ;AND GO AHEAD AND BRING IN THE PAGE
3014
3015 CFSB2:  TLNN W,200000           ;IF PAGE-AHEAD, JUST RETURN.
3016          JUMPL W,CPOPJ
3017         MOVE T,TIME
3018         MOVSI A,%SWSB           ;ALREADY SWAP BLOCKED?
3019         TDNE A,USWST(W)
3020          JRST CFSB3
3021         IORM A,USWST(W)         ;NO, ENTER SWAP BLOCKED STATE
3022         AOS NUSWB
3023         MOVEM T,USWTIM(W)
3024 CFSB3:  MOVE U,W
3025         MOVSI T,3_16.           ;MAKE SWAP HISTORY TABLE ENTRY FOR SWP BLK
3026         PUSHJ P,SWPKHT
3027         MOVE T,TIME
3028         SUB T,USWTIM(W)         ;HOW LONG SWAP BLOCKED
3029         CAIGE T,20.*30.         ;IF LESS THAN 20 SECONDS,
3030          SKIPA T,[15.]          ; SLEEP FOR 1/2 SECOND,
3031           MOVEI T,5*30.         ; OTHERWISE SLEEP FOR 5 SECONDS
3032         ADD T,TIME
3033         SKIPN FLSINS(W)
3034          MOVEM T,EPDL2(W)
3035         MOVEI A,0               ;WILL THEN TAKE FAULT AGAIN AND
3036         MOVE C,[CAMLE T,TIME]   ;CHECK AVAILABLE MEMORY AGAIN
3037         AOS NLPPGB
3038         POPJ P,
3039
3040 ;ROUTINE TO FIND MEMORY AVAILABLE TO A JOB WHOSE USWPRI IS IN B
3041 ;RETURNS IN LH(A) SUITABLE FOR COMPARING TO UWRKST.  SMASHES T,TT,J
3042
3043 WSAVL:  MOVEI J,2*LUBLK         ;DON'T LOOK AT SYS NOR CORE JOB
3044         MOVSI T,%SWOUT+%SWLOD   ;IF THESE BITS CLEAR, JOB IS SWAPPED IN
3045         MOVE A,MEMFR            ;FREE CORE 
3046         SUB A,NCBCOM            ;FUDGE FOR THINGS IN PROCESS
3047         SUB A,SILNG             ;..
3048         ADD A,SOLNG             ;..
3049         ADD A,NLOOSP            ;LOOSE PAGES ARE EVICTABLE
3050         SUB A,SWPOPR            ;DON'T COUNT PAGES ALREADY COMMITTED TO EVICT
3051         HRLZI A,-4(A)           ;ALIGN AS UWRKST AND ALLOW 4 PAGES OF SLOP
3052         SKIPA TT,TIME           ;TO SEE IF PROTECTED AGAINST MEMORY PREEMPTION
3053 WSAVL1:  ADDI J,LUBLK
3054         CAML J,USRHI
3055          POPJ P,
3056         SKIPE UNAME(J)
3057          TDNE T,USWST(J)
3058           JRST WSAVL1           ;DOESN'T EXIST, OR NOT SWAPPED IN, OR LOADING
3059         CAMGE B,USWPRI(J)
3060          CAMGE TT,USWTIM(J)
3061           JRST WSAVL1           ;HIGHER PRIORITY OR PROTECTED
3062         ADD A,UWRKST(J)         ;THIS GUY'S WORKING SET IS PREEMPTABLE
3063         JRST WSAVL1     
3064 \f
3065 ;Routine to re-compute working set, also re sets up map
3066 ;to point to any pages which are swapped in but not mapped in.
3067 ;This is necessary in order to get the proper estimate of
3068 ;how much core is going to have to be swapped out to make
3069 ;this job fit.  Called when a job leaves the swapped-out state,
3070 ;to enter either Loading or Swap-blocked.
3071 ;Job is in W, smashes A,B,C,D,E,T,TT,H,I,U.
3072 ;Call with CIRPSW locked and clk in progress.
3073 WSRCM:  SETZM UWRKST(W)
3074         MOVEI E,UPGMP(W)        ;SET UP SCAN OF USER'S MAP
3075         HRLI E,442200
3076         MOVEI C,UPGCP(W)        ;AND OF CIRCULAR POINTERS
3077         HRLI C,442200
3078         LDB D,[121100,,HUSRAD(W)]       ;# OF USER PAGES
3079 WSRCM1: ILDB A,E                ;GET PAGE MAP ENTRY
3080         ILDB B,C                ;AND CIRCULAR POINTER
3081         JUMPE A,WSRCM2          ;JUMP IF PAGE DOESN'T EXIST
3082         CAIN B,-1
3083          JRST WSRCM2            ;ABS PAGE, DON'T COUNT
3084         TRNN A,600000           ;ALREADY SWAPPED IN?
3085          JRST WSRCM3            ;NO, GO PONDER
3086         ANDI A,PMRCM            ;GET PAGE MAPPED TO
3087         HRRZ B,MMSWP(A)         ;GET # SHARERS
3088         MOVSI A,1               ;COMPUTE WS ADJUSTMENT
3089         IDIV A,B
3090         ADDM A,UWRKST(W)
3091 WSRCM2: SOJG D,WSRCM1           ;LOOP
3092         POPJ P,
3093
3094 WSRCM3: PUSH P,C                ;PAGE NOT MAPPED, SEE IF IT'S IN
3095         PUSHJ P,UCPRL
3096             100000,,WSRCM4      ;RETURN WITH 4 PUSHES IF MEMORY IN LOOP
3097         POP P,C                 ;NO MEMORY, LEAVE ALONE
3098         SOJG D,WSRCM1
3099         POPJ P,
3100
3101 WSRCM4: SUB P,[4,,4]            ;FOUND MEMORY, IN T
3102         TRNE A,2
3103          MOVEI A,2              ;USE READ/WRITE/FIRST RATHER THAN READ/WRITE
3104         LSH A,20
3105         IORI A,PMCSHM(T)        ;SET UP MAP
3106         DPB A,E
3107         AOS C,MMSWP(T)          ;ONE MORE USER POINTING TO PAGE
3108         MOVSI A,1
3109         MOVEI B,-1(C)
3110         IDIVM A,B               ;ADJUST WS AS IF WAS ALREADY POINTING TO PAGE
3111         ADDM B,UWRKST(W)        ;ADDM DOES NOTHING IF THERE WAS DIVIDE BY ZERO
3112         IMULI C,-1(C)           ;COMPUTE WS DECREASE DUE TO ADDITIONAL SHARING
3113         MOVNI C,(C)
3114         IDIV A,C                ;IF DIVIDE BY ZERO, A GETS RIGHT THING!
3115         MOVE C,(P)              ;ADJUST ALL SHARER'S WS'S
3116         PUSHJ P,UCPRL
3117             SETZ WSRCM5
3118         POP P,C
3119         SOJG D,WSRCM1
3120         POPJ P,
3121
3122 WSRCM5: ADDM A,UWRKST(U)
3123         POPJ P,
3124 \f
3125 ;LEAVE LOADING STATE IF IN IT.  JOB IN U, SMASH C,TT,T,I
3126 LVLOAD: MOVE C,USWST(U)
3127         TLZN C,%SWLOD
3128          POPJ P,                ;NOT IN LOADING STATE
3129 LVLOA0: MOVEM C,USWST(U)        ;TURN OFF LOADING STATE
3130         MOVE T,TIME
3131         SUB T,USWTIM(U)         ;TIME IT TOOK TO LOAD
3132         IMUL T,LODFCT           ;COMPUTE PROTECT TIME
3133         HLRZS T
3134         ADD T,TIME
3135         MOVEM T,USWTIM(U)
3136         MOVSI T,1_16.           ;MAKE SWAP HISTORY TABLE ENTRY
3137         JRST SWPKHT
3138
3139 ;PUT JOB IN W INTO THE 'LOADING' STATE.  CALL WITH D CONTAINING USVWRK-UWRKST.
3140 ;WSRCM MUST HAVE BEEN CALLED ALREADY ON THIS JOB.  SMASHES A,D,T,TT,I
3141
3142 CFELD:  MOVE T,USWST(W)
3143         TLNE T,%SWSB
3144          SOS NUSWB              ;CEASES TO BE SWAP-BLOCKED
3145         TLZ T,%SWOUT+%SWSB+%SWDSO+%SWBEM
3146         TLO T,%SWLOD
3147         MOVEM T,USWST(W)
3148         MOVE T,TIME             ;SAVE TIME STARTED TO LOAD
3149         MOVEM T,USWTIM(W)
3150         MOVE U,W
3151         MOVSI T,0               ;MAKE SWAP HISTORY TABLE ENTRY
3152         PUSHJ P,SWPKHT
3153         JUMPLE D,CPOPJ
3154         HLRZ D,D                ;NUMBER OF PAGES GOING TO NEED, PROBABLY
3155         MOVE A,MEMFR            ;FREE CORE 
3156         SUB A,NCBCOM            ;FUDGE FOR THINGS IN PROCESS
3157         SUB A,SILNG             ;..
3158         ADD A,SOLNG
3159         SUB D,A                 ;NUMBER OF PAGES GOING TO HAVE TO SWAP OUT
3160         SKIPLE D
3161          ADDM D,SWPOPR          ;START THEM GOING OUT NOW
3162         POPJ P,
3163 ];SWPWSP
3164 \f
3165 OVHMTR FLT      ;MISC FAULTS
3166
3167 CFH4:   TLNE W,100000           ;PAGE-AHEAD OF NON-EX PAGE: DO NOTHING.
3168          POPJ P,
3169         JUMPL W,SWIILM          ;IF FROM DMA DEVICE, GIVE ERROR
3170 ;HERE FOR FAULTS WHICH ABORT THE INSTRUCTION.
3171 PFA7:   MOVE T,OPTION(U)        ;IF USER WANTS IT,
3172         TLNN T,%OPOPC           ;GIVE HIM THE OPC RATHER THAN
3173          AOSA T,CLKBRK          ;THE INCREMENTD PC.
3174 PFA7A:    MOVE T,CLKBRK         ;HERE FOR KL10 MAR BREAK AND KS10 NXI
3175                                 ;ERROR, ALWAYS GIVE ORIGINAL PC, INST
3176                                 ;ABORTED
3177         TLNE T,%PCUSR
3178          JRST CLKB1J
3179         MOVEI C,IOADCR          ;FROM EXEC MODE SO RESET PC TO IOADCR
3180         EXCH C,CLKBRK
3181         HRRM C,LEXFDR(U)        ;AND SAVE FAULT EXEC ADR FOR DEBUGGING
3182         CLEARM DLSRCH           ;IN CASE IT WAS SET
3183         CLEARM UMAPS(U)         ;RESTORE NORMAL MAP IN CASE RANDOM ONE WAS
3184                                 ;IN USE
3185
3186 CLKB1J: HRLM D,LEXFDR(U)        ;SAVE PF BITS FOR DEBUGGING PURPOSES
3187
3188 IFN KS10P,[     TRNE D,%PFNXI   ;Non-existent IO register in KS10 Unibus.
3189                  TLO A,(%PINXI)
3190 ] ;KS10P
3191
3192 IFN KS10P,      TRNN D,%PFNXI\%PF2.9\%PF2.8
3193 IFN KA10P,      TLZE D,210      ;NO ACCESS OR DBL
3194 IFN KL10P,      CAIN D,%PFPNA
3195                  TRO A,%PIMPV   ;ILM
3196
3197 IFE KS10P,[
3198 IFN KA10P,      TLZE D,20       ;PURE
3199 IFN KL10P,      CAIN D,%PFPRO
3200                  TLO A,(%PIFET)
3201 ] ;IFE KS10P
3202
3203 IFN KS10P,      CAIN D,%PFWRT\%PF2.8
3204 IFN KA10P,      TLZE D,100      ;W IN RD ONLY
3205 IFN KL10P,      CAIN D,%PFILW
3206                  TLO A,(%PIWRO)
3207
3208                 TDNE A,[%PIMPV\%PIWRO\%PINXI]
3209                  PUSHJ P,MPVMAS         ;SAVE FAULT PAGE # FOR DEBUGGING
3210
3211 ;;; NO ABORT-TYPE FAULTS, CHECK OTHERS:
3212
3213 IFE KS10P,[
3214 IFN KL10P,      CAIN D,%PFMAR
3215 IFN KA10P,      TLZE D,2
3216                  PUSHJ P,PCMARB
3217 ] ;IFE KS10P
3218
3219 IFN KA10P,[     TLZE D,2000
3220                  PUSHJ P,CPROC1 ;ONE PROCEED
3221                 ANDCA D,UPQUAN(U)       ;GET BITS FLUSHED BY TLZE'S
3222 ] ;KA10P
3223
3224 CFH6:
3225 IFN KA10P,[
3226         ANDCMI D,-1     ;DON'T CLOBBER USER'S RUNTIME.
3227         TLZ D,4         ;DON'T CLOBBER EXEC PAGING FLAG.
3228         TLO D,1         ;IGNORE QUANTUM-TIMEOUT INT.
3229         ANDCAM D,UPQUAN(U)
3230 ] ;KA10P
3231 CLKB1K: LPMR UPGML(U)
3232 CLKB1G: IFN KA10P, CONO 470000+APRCHN   ;RESET
3233 CLB1X:  MOVE T,CLKBRK   ;PUT USER'S PC WHERE IT BELONGS
3234         MOVEM T,UPC(U)
3235         MOVE B,[BADBTS]
3236         IOR B,MSKST(U)  ;GET OR OF ENABLED AND BAD BITS
3237         AND B,A         ;GET AND WITH BITS ACTUALLY ON
3238         JUMPE B,CLB1XA  ;NOT BAD OR ENABLED, FORGET ABOUT IT
3239         IORM B,PIRQC(U) ;GIVE INTERRUPT
3240         CAIN T,IOADCR   ;READY TO BE INTERRUPTED?
3241          JRST CLKB5     ;NOT QUITE, RUN MOMENTARILY AND WILL UFLS
3242 IFN SCHBLN,SETZM SCHMNY ;DO FULL SCHEDULE TO DELIVER THE INTERRUPT
3243         JRST SCHED2
3244
3245 CLB1XA: MOVSI T,%SWINT  .SEE INTPFL     ;IF PAGE FAULT DUE TO USER TRYING TO
3246         TDNN T,USWST(U)                 ;INTERRUPT, BETTER SCHED SO HE GETS THE INT.
3247          SKIPE FLSINS(U)        ;ELSE PROCEED THE USER IF HE HAS GOT WHAT HE WANTED.
3248           JRST SCHED2           ;OR IF HE'S WAITING, GO SCHEDULE.
3249         JRST CLKB5
3250
3251 IFN KA10P,[     ;NULL JOB LOST
3252 CNLJL:  CONSZ 230220    ;SKIP ON JUST "ADDR BREAK" (QUANTUM OVERFLOW)
3253          BUG PAUSE,[KA: APR ERROR IN NULL JOB]
3254         CONO 470000+APRCHN
3255         JRST SCHED
3256
3257 CFHFPF: BUG PAUSE,[PAGE FAULT IN SYSTEM, PC=],OCT,CLKBRK,[PAGE=],OCT,E
3258         MOVSI D,1770    ;FALSE PAGE FAULT
3259         MOVEI A,0
3260         JRST CFH6
3261 ] ;KA10P
3262 \f
3263 EBLK
3264 RINT:   0
3265 BBLK
3266         CONI RINTAP     ;SAVE STATUS IN CASE SOMEONE DUMPS IT
3267         CONI PI,RINTPI
3268         BUG AWFUL,[RANDOM INTERRUPT, APR ],OCT,RINTAP,[PI ],OCT,RINTPI
3269         JRST 12,@RINT           ;YOU CAN TRY PROCEEDING
3270
3271 EBLK
3272 RINTAP: 0       ;APR STATUS AT RINT
3273 RINTPI: 0       ;PI STATUS AT RINT
3274
3275 IFN KS10P,[     ; On KS, all random interrupts are created equal.
3276 BBLK
3277 RINT1==:RINT
3278 ] ;IFN KS10P
3279
3280 IFE KS10P,[
3281 R1NTAC: BLOCK 20
3282 RINT1:  0
3283 BBLK
3284         MOVEM 17,R1NTAC+17
3285         MOVEI 17,R1NTAC
3286         BLT 17,R1NTAC+16
3287         MOVEI J,1
3288         JSP E,SPUR
3289         MOVSI 17,R1NTAC
3290         BLT 17,17
3291         JRST 12,@RINT1
3292 ] ;IFE KS10P
3293 \f
3294 IFE KS10P,[     ;KS10 HAS NO MAR
3295
3296 PCMARB:
3297 IFN KA10P,[
3298         HLLZ B,UPOPC(U) ;FLAGS
3299         LSH B,5
3300         HRR B,UPOPC(U)  ;PC
3301         MOVE T,B
3302         XOR T,CLKBRK    ;DID PC CHANGE FROM START OF INST TO PLACE TRAPPED?
3303         TDNE T,[#<%PCFPD,,>]
3304          TLO B,(@)      ;YES, INSTRUCTION COMPLETED, FLAG FOR USER
3305 ] ;KA10P                ;LOSES FOR JSR .-1 WITH MAR AT .-1, BUT OTHERWISE OK
3306 IFN KL10P,[
3307         MOVE B,CLKBRK   ;PC OF FAULTING INST IF USER, OR IOADCR IF EXEC
3308 ;       MOVEM B,UPOPC(U)        ;SOLELY FOR .OPC USER VAR
3309 ;NOTE- ON KL10 THE INSTRUCTION IS NEVER COMPLETED, DON'T SET 3.5
3310 ] ;KL10P
3311         TLNE B,%PCUSR
3312          JRST PCMAR1            ;USR MODE, USE PC FROM PAGER
3313         MOVE B,UUOH             ;EXEC MODE, USE USER PC (UUO)
3314         HRRI B,-1(B)
3315 IFN KL10P,[     ;ON KL10 AVOID DOING AOS UUOH AT IOADCR
3316         MOVEM U,AC0S+U(U)
3317         MOVEI T,UUOER2
3318         MOVEM T,CLKBRK
3319 ];KL10P
3320 PCMAR1: MOVEM B,UMARPC(U)
3321         TRO A,%PIMAR
3322         MOVEI B,0
3323 IFN KA10P,      DPB B,[220300,,UPMAR(U)]        ;DISABLE MAR
3324 IFN KL10P,      DPB B,[270400,,UPMAR(U)]        ;DISABLE MAR
3325         POPJ P,
3326
3327 ] ;IFE KS10P
3328
3329 IFN KA10P,[
3330 CPROC1: MOVE T,CLKBRK
3331         TLNN T,%PCUSR   ;SKIP IF FROM USER MODE
3332          JRST CPRUUO
3333         TRO A,%PI1PR    ;GIVE USER INTERRUPT
3334         POPJ P,
3335
3336 CPRUUO: MOVE T,[JRST ONEPROC]   ;ONE PROCEED INT. FROM EXEC. MODE
3337         MOVEM T,UEXIT   ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
3338         POPJ P,
3339
3340 AROV:   TLZE T,400000
3341          TLNN T,%PCUSR
3342           JRST AROV2    ;NOT REALLY SET OR SET BY SYS
3343         MOVEM T,CLKBRK
3344         SKIPE PICLR(U)  ;SKIP IF INTERRUPTS TO USER NOT ENABLED
3345          TRO A,%PIARO   ;GIVE USER INTERRUPT
3346         POPJ P,
3347
3348 AROV2:  MOVEM T,CLKBRK
3349         POPJ P,
3350
3351 ARFOV:  TLZE T,40000
3352         TLNN T,%PCUSR
3353         JRST AROV2
3354         MOVEM T,CLKBRK
3355         SKIPE PICLR(U)
3356         TLO A,(%PIFOV)
3357         POPJ P,
3358 ] ;KA10P
3359 \f
3360 ;;; HANDLE PARITY ERRORS.
3361
3362 CLKB1E: SETZM PARDIE    ;AT FIRST ASSUME THE PAR ERR ISN'T FATAL.
3363         CONO PI,PIOFF   ;TURN OFF WORLD
3364 IFN KA10P, CONO PI,240000       ;RESET
3365 IFN KL10P,[             ;CLEAR THE CACHE
3366         SWPUA
3367         CONSZ 200000
3368          JRST .-1
3369 ] ;KL10P
3370 IFN KS10P,[
3371         CLRCSH                  ;Clear the cache
3372 ] ;KS10P
3373         MOVSI B,SCLPAR
3374         TDNE B,SUPCOR   ;IF PREV ERROR NOT PRINTED, PRINT IT NOW AND PAUSE
3375          BUG PAUSE,[TOO MANY PARITY ERRORS.  PREV STATUS=],DEC,PARCNT,OCT,PARAAN,OCT,PARAOR,OCT,PARAND,OCT,PARIOR
3376         IORM B,SUPCOR   ;TELL SYS JOB TO PRINT OUR DATA WHEN WE FINISH.
3377         AOS PARERR      ;COUNT # OF PAR ERRS SINCE SYSTEM STARTED.
3378         SETOM PARAND    ;INIT LOGAND AND LOGOR OF ALL BAD DATA WORDS
3379         SETZM PARIOR
3380         SETOM PARAAN    ;AND SIMILAR FOR ADDRESSES OF PAR ERRS.
3381         SETZM PARAOR
3382         MOVE T,CLKBRK
3383         MOVEM T,PARPC
3384         MOVE T,USER
3385         MOVEM T,PARUSR  ;REMEMBER WHICH JOB GOT THE PAR ERR.
3386         JUMPL T,PARSCJ  ;PAR ERR IN NULL JOB? OR WHAT?
3387 IFN KL10P,[
3388         SKIPE PARRSN            ;PAR ERR IN WORD NOT REFERENCED
3389          JRST PARSCJ            ; SHOULDN'T SCREW THE RUNNING JOB
3390 ] ;KL10P
3391         CAIG T,LUBLK
3392          SETOM PARDIE           ;PAR ERR IN A SUPERVISOR-MODE JOB IS HOPELESS.
3393         MOVSI TT,(%PIPAR)
3394         IORM TT,PIRQC(T)        ;GIVE RUNNING USER A PARITY ERROR (CLASS 1 INT)
3395 PARSCJ: SPM PARPG
3396 IFN KL10P,[
3397         PUSH P,PFNPC    ;MAKE SURE THE PAR ERRS WE DETECT WHILE SCANNING DON'T
3398         MOVEI D,PARFX4  ;CALL US RECURSIVELY (ON KA, THAT'S DONE BY HAVING
3399         MOVEM D,PFNPC   ;CLKCHN OFF) 
3400 ] ;KL10P
3401 IFN KS10P,[
3402         PUSH P,EPTP7N           ;Same hack for the KS except page fails trap
3403         MOVEI D,PARFX4          ;as a function of current PI level.
3404         MOVEM D,EPTP7N
3405 ] ;KS10P
3406         MOVEI D,0       ;POINTER TO ERROR BUFFER
3407         MOVSI TT,-TSYSM
3408         PUSHJ P,PARSCN  ;SCAN MAIN MEM BLOCKS
3409 IFN PDP6P,[
3410         MOVE TT,[-LPDP6M,,PDP6BM_-10.]  ;SCAN PDP6 MEM FOR PARITY ERRORS
3411         SKIPGE PDP6UP                   ;BUT NOT IF PDP6 IS DOWN.
3412          PUSHJ P,PARSCN
3413 ]
3414 IFN KL10P,[
3415         POP P,PFNPC
3416         CONO 024400+APRCHN      ;CLEAR PAR ERR FLAGS.
3417 ] ;KL10P
3418 IFN KS10P,[
3419         POP P,EPTP7N
3420         CONO 020200+APRCHN      ;CLEAR FLAG
3421         MOVSI A,%KEHLD+%KEREF   ;CLEAR STATUS AND ERROR ADDR
3422         IOWR A,[KSECCS]
3423 ] ;KS10P
3424         MOVEI A,0
3425         DPB A,[.PAREP+EXEUMP]
3426         LPMR PARPG      ;SET UP MAP WITH PARPG SET TO MPV.
3427         MOVEM D,PARCNT  ;SAVE AWAY COUNT OF ERRORS IN BUFFER
3428         SKIPE PARDIE
3429          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
3430                         ;FATAL ERROR (DONT ALLOW CONTINUE SINCE ERR IS
3431                         ;KNOWN TO BE A LOSER)
3432         CONO PI,PION    ;TURN WORLD BACK ON
3433         JRST SCHED
3434 \f
3435 PARSCN:
3436 PARFX3: HRRZ T,TT       ;SCAN AOBJN POINTER IN TT
3437         CAIL T,TSYSM
3438         JRST PARFX7
3439         LDB T,[MUR,,MEMBLT(TT)]
3440         CAIN T,MUHOLE
3441         JRST PARFX8     ;HOLE THERE
3442 PARFX7: MOVEI T,600000(TT)      ;NOTE THAT WE ARE NOT ENABLING THE CACHE.
3443         DPB T,[.PAREP+EXEUMP]   ;ON KL10 THIS WILL CAUSE A 1-WORD READ.
3444         LPMR PARPG      ;SET UP TO CHECK PAGE # IN TT
3445         MOVEI B,0       ;ADDRESS WITHIN PAGE
3446 PARFX1:
3447 IFN KA10P, CONO PI,200000       ;CLEAR PAR ERR
3448 PARFX5: MOVE C,400000+PAREP*2000(B)     ;REFERENCE EVERY MEMORY LOCATION
3449 IFN KA10P,[
3450         ;;ON KA, MUST CHECK EXPLICITLY.
3451         ;;ON KL AND KS, PAR ERR WILL TRAP RIGHT TO PARFX4.
3452         CONSZ PI,200000 ;PARITY ERR? 
3453          JRST PARFX4    ;YES. 
3454 ] ;KA10P
3455         CAIGE B,1777    ;SKIP ON FINISHED WITH BLOCK
3456          AOJA B,PARFX5
3457 PARFX8: AOBJN TT,PARFX3 ;CHECK NEXT PAGE
3458         POPJ P,         ;DONE
3459 \f
3460 PARFX4:         ;HERE WHEN THE SCAN FINDS A WORD WITH BAD PARITY
3461 IFN KL10P, HRRZ T,PFOPC
3462 IFN KS10P, HRRZ T,EPTP7O
3463 IFE KA10P,[
3464         ;;DID THIS TRAP COME FROM SCAN LOOP WHERE WE EXPECT THEM?
3465         CAIE T,PARFX5
3466          JRST 4,.
3467         AC7CTX
3468         UMOVE C,0       ;GET CONTENTS OF LOCATION WITH BAD PARITY
3469         SYSCTX
3470 ] ;IFE KA10P
3471         SETO T,         ;MAKE SURE T ISN'T ACCIDENTALLY 0 AT PARFX6.
3472         HRRZ E,TT
3473         LSH E,10.
3474         IOR E,B ;MAKE MEM ADR
3475         CAIGE E,20      ;PAR ERR IN SHADOW ACS ISN'T SERIOUS.
3476          JRST PARFX6
3477         ANDM E,PARAAN   ;UPDATE ANDS AND ORS OF DATA AND ADRS
3478         IORM E,PARAOR
3479         ANDM C,PARAND
3480         IORM C,PARIOR
3481         MOVE A,USRHI
3482         CAIGE E,USRSTG(A)
3483          SETOM PARDIE   ;PARITY ERROR IN EXEC CORE
3484         HRRZ T,TT
3485         CAIL T,TSYSM
3486          JRST PARFX6
3487         LDB T,[MUR,,MEMBLT(TT)]
3488         CAIE T,MUFR
3489          CAIN T,MUINP
3490           JRST PARFX6
3491         CAIE T,MUDISB
3492          CAIN T,MUFRT
3493           JRST PARFX6
3494         CAIN T,MUDDT
3495          JRST PARFX6
3496         SOJE T,PARFX6   ;USER
3497         SETOM PARDIE    ;ERR IN CRITICAL MEMORY (DISK DIR, ETC)
3498 PARFX6: MOVEM C,400000+PAREP*2000(B)    ;FIX UP MEMORY AS BEST WE CAN
3499         MOVEM C,PARCON(D)       ;SAVE LOSING CONTENTS
3500         MOVEM E,PARADR(D)       ;SAVE LOSING ADDRESS
3501         CAIL D,MXPARS-1 ;OVERFLOWING BUFFER?
3502          SOS D          ;JUST DON'T CLOBBER STUFF. AT LEAST PARAND, ETC. WILL BE VALID.
3503         JUMPN T,PARFX9
3504         PUSH P,D        ;PAR. ERR IN USER MEMORY,
3505         HRRZ D,TT
3506         CAIL D,TSYSM
3507          JRST PARFXA
3508         PUSHJ P,UCPRL4  ;HAS ANY JOB WRITTEN IN THIS PAGE?
3509          400000,,PARFU1
3510         JUMPL D,PARFXB  ;SOMEONE HAS; JUST GIVE EVERYONE AN INTERRUPT.
3511         PUSHJ P,UCPRL4  ;DOES MMP SAY PAGE WAS WRITTEN? IF SO, SET SIGN(D);
3512          200000,,PARFU2 ;OTHERWISE, SET MMPBAD, CAUSING PAGE TO BE RELOADED FROM DISK.
3513         JUMPGE D,PARFXA
3514 PARFXB: PUSHJ P,UCPRL4  ;PAGE HAS BEEN WRITTEN SINCE LAST ON DISK, SO WE CAN'T ESCAPE
3515          400000,,PARFU3 ;GIVING EVERY JOB AN INTERRUPT.
3516 PARFXA: POP P,D
3517 PARFX9: AOS B                   ;INCREMENT B HERE SO YOU DON'T HACK THE SAME
3518                                 ; WORD AGAIN.  IF THAT WORD WAS SOLIDLY BAD,
3519                                 ; THIS CODE WOULD LOOP
3520         CAIG B,1777             ;MIGHT BE DONE WITH PAGE
3521          AOJA D,PARFX1
3522         AOJA D,PARFX8
3523
3524 PARFU1: CAIG U,LUBLK
3525          SETOM PARDIE   ;SYS JOB OR CORE JOB HAS PAGE
3526         PUSH P,Q
3527         MOVE A,I        ;FIND PAGE-MAP HALFWORD FOR THIS PAGE
3528         PUSHJ P,UPLC
3529         POP P,Q
3530         LDB A,T
3531         LSH A,-20
3532         CAIE A,1        ;MAP SET UP TO A PAGE, AND IN READ-ONLY MODE?
3533          JRST PARFU5
3534         DPB A,T         ;YES, UNMAP IT SO THAT NEXT ACCESS WILL TRAP AND GO TO CFHPB
3535         SOS MMSWP(D)    ; IN CASE WE WILL SET MMPBAD.
3536                 ;NOTE, THIS MAY CRASH THE SYSTEM IF THE JOB WAS RUNNING IN A UUO,
3537                 ;HAD CHECKED ACCESS TO THE PAGE, AND WAS ASSUMING IT COULD ACCESS
3538                 ;IT AGAIN SAFELY.  USUALLY THIS ONLY HAPPENS WHEN WRITING, HOWEVER.
3539 IFN SWPWSP,             ;DON'T BOTHER ADJUSTING WORKING SET.  WILL BE FIXED ON NEXT SWAPIN.
3540 PARFU5: CAIL A,3
3541 PARFU4:  TLO D,400000   ;IF THIS JOB HAS WRITTEN THE PAGE, SET SIGN (D)
3542         POPJ P,         ;TO SIGNAL THAT SETTING MMPBAD IS NO USE.
3543
3544 PARFU2: MOVE T,(C)      ;C HAS ADDR OF MMP ENTRY; HAS PAGE BEEN WRITTEN BY A JOB
3545         TLNN T,MMPWRT   ;THAT NO LONGER HAS IT IN MAP?
3546          TLNN T,MMPWOD  ;OR HAS IT NEVER BEEN ON DISK?
3547           JRST PARFU4   ;IF SO, AVOID SETTING MMPBAD, AND INTERRUPT EVERYONE.
3548         HLRZ T,1(C)
3549         JUMPE T,PARFU4  ;DITTO IF THERE IS NO DISK SPACE ASSIGNED.
3550         MOVSI T,MMPBAD
3551         IORM T,(C)
3552         POPJ P,
3553
3554 PARFU3: MOVSI T,(%PIPAR)
3555         IORM T,PIRQC(U)
3556         POPJ P,
3557 \f
3558 MEMHNG:
3559 IFN PDP6P,[
3560         LDB B,[221100,,UPJPC(U)]        ;FAULT ADDR
3561         TRZN B,400              ;SKIP IF REFERENCE WAS VIA USER MAP
3562          JRST MEMHN1
3563         MOVEI C,UPGMP(U)
3564         ROT B,-1
3565         ADDI C,(B)
3566         HRLI C,PMLCAD           ;POINTER TO CORE ADR FIELD OF LH PAGE IN MAP WD
3567         SKIPGE B
3568          HRLI C,PMRCAD          ;RH MAP WD
3569         LDB C,B                 ;C GETS PAGE #
3570         CAIGE C,<PDP6BM_-10.>+LPDP6M
3571         CAIGE C,PDP6BM_-10.
3572          JRST MEMHN1
3573         MOVE B,CLKBRK
3574         TLNE B,%PCUSR
3575          JRST MEMHN3            ;USER MODE PDP6 NXM
3576         MOVEI B,IOCER3          ;PDP6 MEM
3577         HRRM B,CLKBRK
3578         JRST MEMHN2
3579 ]
3580
3581 MEMHN1:                 ;NXM
3582         ; JRST 4,.+1    ;COMMENTED OUT SINCE NXM STOP SHOULD ALWAYS BE SET.
3583 MEMHN2:
3584 IFN KA10P,CONO 10000+APRCHN     ;CLEAR NON EX MEM AFTER HALT TO RESET MEMORY
3585 IFN KL10P,CONO 22000+APRCHN
3586 IFN KS10P,[
3587         CONO 20400+APRCHN       ;Clear APR flag
3588         MOVSI B,%KEHLD+%KEREF   ;Clear saved error address
3589         IOWR B,[KSECCS]
3590 ] ;KS10P
3591         MOVSI B,SCLNXM
3592         TDNE B,SUPCOR           ;Haven't printed previous error?
3593          BUG PAUSE,[TOO MANY NXM ERRORS.]
3594         IORM B,SUPCOR
3595         MOVE T,CLKBRK
3596         MOVEM T,NXMPC
3597         MOVE T,USER
3598         MOVEM T,NXMUSR
3599         AOS NXMERR
3600         POPJ P,
3601
3602 IFN PDP6P,[
3603 MEMHN3: MOVSI B,%PIMPV  ;PDP6 NXM GIVE MPV INTERRUPT
3604         IORM B,PIRQC(U)
3605         JRST MEMHN2
3606 ]
3607 \fSUBTTL SLOW CLOCK SERVICE ROUTINE
3608
3609 OVHMTR SLW      ;SLOW CLOCK
3610
3611 SSLCK:  SKIPGE SHUTDN   ;SYSTEM "DEAD" =>
3612          PUSHJ P,COFFIN ;GO TO DDT AFTER RIGOR MORTIS SETS IN.
3613         SETCMB A,SCKPHS ;CHECK SYSTEM CHECKSUMS EVERY OTHER SLOW CLOCK TICK
3614         MOVE T,SUPCOP   ;WHICH IS ONCE PER SECOND.
3615         SKIPE A
3616          IORM T,SUPCOR
3617 IFN KS10P,[
3618         CONSO 100               ; Check for memory ECC corrected errors
3619          JRST SSLCK0
3620         IORD A,[KSECCS]         ; A: status and error addr
3621         MOVEM A,ECCERA          ; Remember most recent one
3622         AOS ECCERR              ; Also count 'em
3623         CONO 20100+APRCHN       ; Clear memory ECC APR flag 
3624         MOVSI T,%KEHLD+%KEREF   ; Clear status and error addr
3625         IOWR T,[KSECCS]
3626         MOVE T,A
3627         AND A,ECCAND            ; A: AND of previous errors
3628         IOR T,ECCIOR            ; T: IOR of previous errors
3629         CAMN A,ECCAND           ; If either changes, this is news.
3630          CAME T,ECCIOR
3631           BUG INFO,[MEMORY: ECC CORRECTED ERROR],OCT,ECCERA
3632         MOVEM A,ECCAND
3633         MOVEM T,ECCIOR
3634 SSLCK0: ] ;IFN KS10P
3635 IFN NETP,PUSHJ P,NETCLK ; Run 1/2 sec clock routines for various net stuff
3636 IFN NETYS, SETOM DTECHK         ;TELL 11 WE'RE ALIVE
3637 IFN DPKPP,[
3638         CONSO DPK,7
3639          CONO DPK,TTYCHN        ;CROCK - IF DPK LOSES ITS PIA, GIVE IT BACK.
3640 ]
3641         MOVE A,UTTBF
3642         CAIGE A,30
3643          JRST SSLCK2
3644         SETOM UTBFLF    ;SIGNAL CORE JOB TO FLUSH UTAPE BUFFERS
3645         AOS NCORRQ
3646 SSLCK2: SKIPE UTTYCT    ;SKIP IF NO NEW USERS
3647          SKIPL TREESW   ;SKIP UNLESS SOMEBODY'S MUNGING THE TREE STRUCTURE.
3648           CAIA
3649            PUSHJ P,USTART ;NEW USER TO START
3650 IFN 340P,[
3651         SKIPL T,DWDS
3652          MOVEI T,0
3653         ADDI T,MDISWD
3654         MOVEM T,DWDS    ;RESET DISPLAY RATE COUNTER
3655 ]
3656         CONO PI,UTCOFF  ;UTC OFF WHILE HACKING UTAPE, MTAPE, DISK, ETC.
3657 IFN RH10P+RH11P,[
3658         SKIPLE USFHLT
3659          SOS USFHLT
3660 ];RH10P+RH11P
3661 IFN NUNITS,[
3662 IFE NEWDTP,[
3663         MOVE T,TIME
3664         AOSN UIDLE      ;SKIP IF DEC TAPE NOT IDLE
3665          JRST [MOVEM T,LUTOTM ? JRST SSLCK1]    ;DEC TAPE IDLE
3666         SUB T,LUTOTM    ;SUBTRACT LAST UTC OPERATION TIME
3667         CONSO UTC,4000
3668          CAIGE T,MXOPT*SCLKI    ;SKIP IF DEC TAPE HUNG TOO LONG ON ONE OPERATION
3669           JRST SSLCK3   ;OK
3670         SETOM UTHERR    ;SET UTC HUNG ERR FLAG
3671 SSLCK1: CONO UTC,CUINT  ;CAUSE DEC TAPE INTERRUPT ROUTINE TO RUN
3672 SSLCK3:
3673 ]
3674 IFN NEWDTP,[
3675         MOVE T,TIME
3676         AOSN UIDLE
3677          JRST [MOVEM T,LUTOTM ? JRST SSLCK1]
3678         SUB T,LUTOTM
3679         CAIGE T,MXOPT*SCLKI
3680          JRST SSLCK3
3681         SETOM UTHERR
3682 SSLCK1: SETOM CUINT
3683         CONO PI,UTCRQ
3684 SSLCK3:
3685 ]]      ;END IFN NUNITS
3686         SKIPL QSDU              ;IF DISK TRANSFER IN PROGRESS
3687          JRST [ MOVE T,LQTM     ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3688                 ADDI T,5*30.
3689                 CAMGE T,TIME
3690                  PUSHJ P,QHUNG  ;YES, UNHANG THE DISK
3691                 JRST .+1 ]
3692 IFN T300P,[
3693         SKIPL QSDU1             ;IF TRANSFER IN PROGRESS ON OTHER CONTROLLER
3694          JRST [ MOVE T,LQTM1    ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3695                 ADDI T,5*30.
3696                 CAMGE T,TIME
3697                  PUSHJ P,QHUNG1 ;YES, UNHANG THE DISK
3698                 JRST .+1 ]
3699 ];T300P
3700 IFN DC10P, PUSHJ P,QRCTMO       ;RECALIBRATE TIMEOUT
3701         CONO PI,UTCON
3702         PUSHJ P,QSTRTR          ;WAKE UP DISK ROUTINES
3703 IFN NMTCS, PUSHJ P,MSTRTR       ;WAKE UP MAG TAPE ROUTINES (MUST BE SEPARATE INTR)
3704 ;DROPS THROUGH
3705 \f
3706 ;DROPS IN
3707 IFG NMTYS,[                     ;TRY TO UNHANG MORTON TTY CARDS
3708         MOVE I,[-NMTYS,,NFMTY]
3709         MOVE T,TIME
3710         SUBI T,60.      ;IF HAVEN'T TYPED FOR 2 SECONDS
3711 SSLCM1: SKIPL TTYOAC(I) ;YET SUPPOSED TO BE TYPING
3712          CAMGE T,TTLTM(I)
3713           JRST SSLCM2
3714         CONO PI,TTYOFF-1
3715         CONO MTY,@TTYLT(I)      ;SELECT THE LINE
3716         DATAO MTY,[0]           ;AND BANG ON IT
3717         CONO PI,TTYON-1         ;MAYBE IF WE'RE LUCKY ITS DONE FLAG WILL COME ON 
3718 SSLCM2: AOBJN I,SSLCM1
3719 ]               ;END IFG NMTYS
3720 IFN IMPP,[
3721 IFN KAIMP, CONI IMP,IMPCNI      ;KEEPS HOST READY ON
3722 IFE KSIMP,[
3723         ;KS doesn't drop interrupts, I hope
3724         PUSHJ P,IMPOST          ;START UP OUTPUT
3725 ]
3726 IFN NCPP,[
3727         SKIPLE IMNCS
3728          PUSHJ P,IMPCCL         ;CLOSE NETWORK CHANNELS
3729         SKIPLE IMNAS
3730          PUSHJ P,IMPAAA         ;WAKE UP STYS THAT NEED IT
3731 ];NCPP
3732         SKIPGE IMPTCU           ;IF IMP IS TRYING TO COME UP
3733          AOSE IMPUCT            ;AND UP-COMING TIMEOUT EXHAUSTED
3734           JRST SSLCK8
3735         BUG INFO,[NET: TIMED OUT TRYING TO COME UP]
3736         MOVEI A,1               ;THEN MAKE IT STAY DOWN
3737         MOVEM A,IMPUP           ;IF THIS IS ML-KA THE IMP CABLE PROBABLY BROKE AGAIN
3738 SSLCK8:
3739 ];IMPP
3740 IFN PDP6P,[
3741         SKIPL PDPISR
3742          CONO DSDEV,DSDCHN      ;ENABLE INTERRUPTS FROM 6
3743 ];PDP6P
3744 IFN NETYS,[
3745         SKIPE DTEBBY
3746          SOSL DTEBBT
3747           JRST .+3
3748            BUG CHECK,[TTY: TIMEOUT ON OUTPUT XFER TO DTE, DTEBBY],OCT,DTEBBY
3749            SETZM DTEBBY
3750 ];NETYS
3751 IFN N11TYS,[
3752 ;SEE IF THE TV PDP11 WANTS TO GO DOWN.
3753         SKIPN TEN11F    ;PROVIDED THE PDP11 IS THERE,
3754          SKIPN TT11P    ;AND WE'RE TRYING TO USE IT,
3755           JRST SSLCK5
3756         LDB A,[061600,,TT11HA]  ;DOES 11 WANT WHO LINES UPDATED?
3757         CAIL A,2000*NTTPG       ;RANGE CHECK SO CLOBBERED 11 MEMORY DOESN'T CAUSE ILL MEM REF
3758          BUG HALT,[GARBAGE POINTER IN TV-11 MEMORY]
3759         SKIPGE 1+400000+TTPG0*2000(A)
3760          JRST [ MOVEI T,SCRWHO  ;YES
3761                 IORM T,SUPCOR
3762                 CLEARM 1+400000+TTPG0*2000(A)
3763                 JRST .+1]
3764         SKIPE TT11DN    ;IF IT IS REQUESTING TO GO DOWN,
3765          JRST SSLCK5
3766         SETZM TT11P     ;DON'T USE IT & WAIT FOR IT TO RE-INIT,
3767         MOVSI T,1
3768         MOVEM T,TT11DN  ;GIVE IT OUR PERMISSION TO GO DOWN.
3769         MOVEI T,SCR11D  ;CAUSE "11 DOWN" MESSAGE
3770         IORM T,SUPCOR
3771 SSLCK5: SKIPN TEN11F
3772          SKIPG TT11P    ;WAITING FOR 11 TO BE UP?
3773           JRST SSLCK6
3774         SKIPN TT11UP    ;SKIP ON 11 UP
3775          JRST SSLCK6
3776         MOVEI T,SCR11U
3777         IORM T,SUPCOR   ;INIT THE TTYS
3778 SSLCK6:
3779 ]
3780         SKIPLE T,AGERTE ;IF IT'S ENABLED, AGE SOME PAGES
3781          PUSHJ P,AGE
3782 ;DROPS THROUGH
3783 \f
3784 ;DROPS IN
3785 IFN DL10P,[
3786         SKIPN DL10F
3787          JRST SSLCKA
3788         SETOM DL10UP    ;COULD ALSO CHECK WHETHER PDP11 IS INCREMENTING THIS.
3789         DATAI DLC,A
3790         TRNE A,20       ;SEE IF PDP11 HALTED.
3791          JRST SSLCKA
3792         BUG INFO,[I/O PDP11 WENT DOWN]
3793         SETZM DL10F
3794         MOVEI T,%TYDL
3795         MOVSI A,-NCT
3796         TDNE T,TTYTYP(A)
3797          SETOM TTYOAC(A)
3798         AOBJN A,.-2
3799 SSLCKA: ]
3800         AOS QACTTM              ;Bump this for benefit of QSK dir writers.
3801         SKIPN SWPOPR            ;If there is a request to swap out pages
3802          SKIPE SOLNG            ; or if there are pages now going out
3803           JRST SSKQ2            ; do not bother with LMEMFR, warnings.
3804         MOVN A,LMEMFR           ;See how many free low-memory pages.
3805         ADD A,MINCOR
3806         JUMPLE A,SSRCK          ;Okay
3807         AOS NCORRQ              ;Wake up core job to do some shuffling
3808         SUB A,MEMFR
3809         ADD A,LMEMFR            ;Core wanted minus high free
3810         SKIPLE A
3811          ADDM A,SWPOPR          ;Swap out to make room.
3812 ;Check to see if we are running out of various resources.
3813 ;RSWTIM is a timestamp of last warning, initialized by DATIM6 and PDDCHK.
3814 SSRCK:  MOVE A,RSWTIM           ;Get time we last checked.
3815         ADDI A,2*30.
3816         CAML A,TIMOFF           ;If we checked less then 30 secs ago
3817          JRST SSKQ2             ; don't deluge the console.
3818         MOVE A,TIMOFF           ;Else remember that we are cheking now.
3819         MOVEM A,RSWTIM
3820         MOVEI A,5               ;There should be at least 5 free low pages.
3821         CAMLE A,LMEMFR          ;If there are not, print warning.
3822          BUG INFO,[Warning: Just ],DEC,LMEMFR,[ free pages in low core.]
3823         SKIPN QFCHN             ;Check disk channels.
3824          BUG INFO,[Warning: No free qsk channels.]
3825         MOVN A,USRHI            ;Check job slots.
3826         IDIVI A,LUBLK
3827         ADDI A,MAXJ
3828         SKIPN A
3829          BUG INFO,[Warning: System full - no job slots.]
3830 SSKQ2:
3831 IFN 340P,[
3832         SKIPL DISUSR
3833          PUSHJ P,DISCHK ;CHECK FOR 340 DEATH
3834 ]
3835         PUSHJ P,PDCCHK  ;CHECK ON REAL-TIME HACKS
3836 IFN PTRP,[
3837         PUSHJ P,PTRCHK  ;CHECK ON PAPER TAPE READER
3838         PUSHJ P,PTPCHK  ;CHECK ON PAPER TAPE PUNCH
3839 ] ;PTRP
3840 IFE KS10P,[     ; Silly KS10 doesn't have devices...
3841         SKIPN CCSDEV
3842          JRST SCDCK3
3843         SETZM CCSDEV
3844         MOVSI I,-128.
3845 SCDCK1: SKIPGE A,DCHNTC(I)
3846          TLNE A,300000
3847           JRST SCDCK2
3848         AOS CCSDEV
3849         SUB A,[1,,]
3850         TLNN A,777
3851          TLZ A,400000
3852         MOVEM A,DCHNTC(I)
3853 SCDCK2: AOBJN I,SCDCK1
3854 SCDCK3:;        JSP E,CHECK     ;CHECK FOR CLOBBERED DEVICES
3855 ] ;IFE KS10P
3856 IFN NLPTP,[
3857         CONO PI,LPTOFF
3858         MOVE A,NLPTBR           ;IF LPT OUTPUT BUFFER NOT EMPTY
3859         CAIN A,LPTBSZ
3860          JRST [ CONSZ NLPT,100  ;AND LPT IS READY
3861                  CONSZ NLPT,7   ;BUT HAS NO PIA
3862                   JRST .+1
3863                 CONO NLPT,LPTCHN ;THEN IT LOST AGAIN
3864                 AOS NTNLPL      ;COUNT NUMBER OF TIMES NEW LPT LOST
3865                 JRST .+1 ]
3866         CONO PI,LPTON
3867 ]
3868 IFN ECCMEM,[
3869 ;THIS ASSUMES THAT THE PDP-10/XBUS ADDRESS OFFSET IS ZERO
3870 ECCLOG: MOVE B,400000+ECCPG*2000+1760
3871         LSH B,-32.
3872         CAMN B,ECCIDX           ;DID ECC HISTORY POINTER ADVANCE?
3873          JRST ECCLG9
3874         AOS A,ECCIDX            ;YES, GET NEXT WORD FROM ECC HISTORY
3875         MOVE B,400000+ECCPG*2000+1760-1(A)
3876         ANDI A,17               ;ADVANCE OUR COPY OF POINTER
3877         MOVEM A,ECCIDX
3878         LDB A,[240700,,B]       ;SYNDROME BITS
3879         TLZ B,777774            ;REDUCE B TO ADDRESS BITS
3880         BUG INFO,[MEM: ECC ERROR, ADDRESS ],OCT,B,[SYNDROME],OCT,A
3881         JRST ECCLOG             ;LOOK FOR MORE HISTORY
3882
3883 ECCLG9:
3884 ];ECCMEM
3885         PUSHJ P,GPDTIM          ;WHAT CALENDAR TIME IS IT?
3886          SETOB A,LPDTIM
3887         EXCH A,LPDTIM           ;REMEMBER IT FOR NEXT CLOCK TICK.
3888         JUMPL A,ALCR0           ;TIME NOT KNOWN THIS AND/OR LAST TICK => DO NOTHING
3889         SUB A,LPDTIM            ;ELSE HOW LONG HAS IT BEEN SINCE PREVIOUS TICK?
3890         CAML A,[-5*PDUPS]       ;MORE THAN 5 SECONDS? SHOULD ONLY BE 1/60
3891          JRST ALCR0             ;ONLY EXPLANATION IS ITS WAS STOPPED AND CONTINUED.
3892         SKIPL SYSDBG            ;SO UNLESS THAT'S NORMALLY EXPECTED
3893          PUSHJ P,DEATHM         ;TELL THE WORLD "ITS REVIVED"
3894         MOVE T,TIME             ;REMEMBER WHEN THIS LAST HAPPENED
3895         MOVEM T,RVVTIM
3896
3897 ;DROPS THROUGH
3898 \f
3899 ;DROPS IN
3900 ;DECAY VARIOUS EXPONENTIAL AVERAGES.  ON KA10, RUN IN ACS SINCE IT'S FASTER.
3901 ;ON KL10, DON'T, SINCE IT'S SLOWER.  ON KS10, DON'T, BECAUSE IT IS
3902 ;JUST AS FAST TO RUN IN THE ACS BUT IT WASTES TIME TO MOVE THE CODE
3903 ;INTO THEM.
3904 ALCR0:  MOVSI U,-NCT
3905         SETZM SLOADU
3906 IFN KA10P,[
3907         MOVE I,[ALCR1,,A]
3908         BLT I,I
3909         JRST A
3910 ] ;KA10P
3911
3912 ALCR1:  MOVN T,USRRCE(U)        ;A      ;DECAY USRRCE AVERAGES
3913         ASH T,-4                ;B
3914         ADDB T,USRRCE(U)        ;C
3915         CAMLE T,SLOADU          ;D      ;AND SET SLOADU TO HIGHEST USRRCE
3916          MOVEM T,SLOADU         ;E
3917 IFN KA10P,[
3918         AOBJN U,A               ;TT
3919         JRST .+1                ;I
3920 ] ;KA10P
3921 IFE KA10P, AOBJN U,ALCR1
3922
3923         MOVN T,USRRCE+NCT
3924         ASH T,-4-2              ;DISOWNED JOBS (DECAY SLOWER)
3925         ADDB T,USRRCE+NCT
3926         IMULI T,1999.           ;MAKE COMMENSURATE WITH REGULAR USRRCE'S
3927         ASH T,-13.              ; (You might think that you could just
3928                                 ; divide by 4, but in fact the ratio
3929                                 ; between the two decay rates is
3930                                 ; ln(64/63)/ln(16/15) = .24401474)
3931         ADDM T,SLOADU           ;DISOWNED TIME COULD HAVE BEEN USED BY REAL
3932                                 ; USERS
3933         MOVN T,USRRCE+NCT+1
3934         ASH T,-4+1              ;SYS, CORE, AND SOME DAEMON JOBS (DECAY FASTER)
3935         ADDM T,USRRCE+NCT+1
3936         IRPS RCE,,LOSRCE IDLRCE
3937          MOVN T,RCE             ;LOST TIME AND IDLE TIME
3938          ASH T,-4
3939          ADDB T,RCE
3940          TERMIN
3941         ADDM T,SLOADU           ;IDLE TIME COULD HAVE BEEN USED BY USERS
3942
3943 IFE KS10P, MOVE A,[193682794.]  ; = 100. * 250000. * .5 / ln(16/15)
3944                                 ; (100% of 250000. four usec ticks per second,
3945                                 ; decaying by 16/15 every .5 second.)
3946 IFN KS10P, MOVE A,[198524864.]  ; = 100. * 256250. * .5 / ln(16/15)
3947                                 ; (256250. 3.9 usec ticks per second.)
3948 ; Used to be:
3949 ;       MOVE A,[100.*15.*125000.] ;100% DIVIDED BY MAXIMUM SINGLE TREE %
3950         ADD A,LOSRCE            ;WITH FUDGE FACTOR FOR LOST TIME
3951         IDIVM A,SLOADU          ;GIVES EFFECTIVE # OF COMPETITORS FOR MACHINE.
3952 ; It is possible for SLOADU to drop below 100. (giving a fair share greater
3953 ; than 100%).  This happens because the decay rate for disowned jobs is
3954 ; less than the decay rate for consoles.  If the load switches abruptly
3955 ; from the disowned jobs to some console, the resource word for the console
3956 ; fills up quicker than the disowned resource word decays, causing their
3957 ; sum to briefly exceed the maximum.  This would be hard to fix without
3958 ; introducing additional resource words just for better maintaining SLOADU.
3959 ;
3960 ; An additional odd effect:  If only disowned jobs are running, and a
3961 ; network server starts up, the fair share drops almost to zero.  This is
3962 ; because when such jobs are created, their resource word is zeroed to
3963 ; given them an initial priority boost.
3964
3965         MOVEI T,0
3966 IFN KA10P,[
3967         MOVE W,[ALCR4,,A]
3968         BLT W,W
3969         JRST A
3970 ] ;KA10P
3971
3972 ALCR4:  MOVN H,JTMU(T)  ;A
3973         ASH H,-4
3974         ADDM H,JTMU(T)
3975         MOVE H,MSKST(T)
3976         ANDI H,%PICLK   ;E
3977         SKIPE UNAME(T)  ;TT
3978          IORM H,PIRQC(T);I
3979         ADDI T,LUBLK    ;Q
3980         CAMGE T,USRHI   ;J
3981 IFN KA10P,[
3982          JRST A         ;R
3983         JRST .+1        ;W
3984 ] ;KA10P
3985 IFE KA10P, JRST ALCR4
3986 ;DROPS THROUGH
3987 \f;DROPS IN
3988 IFN SWPWSP,[
3989         MOVE U,USRHI
3990         SUBI U,LUBLK            ;ACCOUNT FOR I/O WAIT TIME IN USWPRI
3991         MOVSI T,%SWOUT+%SWPGW
3992 IFN KA10P,[
3993         MOVE J,[ALCR5,,A]
3994         BLT J,J
3995         JRST A
3996 ] ;KA10P
3997 ALCR5:  SKIPE UNAME(U)          ;A      ;IGNORE JOBS WHICH DON'T EXIST OR
3998          TDNE T,USWST(U)        ;B      ;ARE SWAPPED-OUT OR IN PAGE-WAIT
3999 IFN KA10P, JRST I               ;C
4000 IFE KA10P, JRST ALCR6
4001         SKIPN USTP(U)           ;D      ;CHARGE JOBS WHICH ARE STOPPED 
4002          SKIPE FLSINS(U)        ;E      ;OR BLOCKED
4003           JRST ALCR7            ;TT
4004 ALCR6:  SUBI U,LUBLK            ;I      ;NEXT JOB
4005 IFN KA10P,[
4006         JUMPG U,A               ;Q
4007         JRST .+1                ;J
4008 ] ;KA10P
4009 IFE KA10P, JUMPG U,ALCR5
4010 ];SWPWSP
4011         SKIPGE 37       ;CHECK FOR PLANNED SYSTEM DEATH
4012          PUSHJ P,DEATH  ;ABOUT TO START DYING
4013           JFCL
4014         IRPS 4US,,[IDLTM1 LOSTM1 USRTM1 NULTM1]SEC,,[IDLTIM LOSTIM USRTIM NULTM3]
4015          MOVE A,4US     ;KEEP SYSTEM WIDE USAGES AS TWO WORDS
4016          IDIVI A,250000. ;ONE IN 4.069 USEC UNITS
4017          ADDM A,SEC     ;AND ONE IN SECONDS
4018          MOVEM B,4US    ;SO NO OVERFLOW
4019          TERMIN
4020         IMULI A,60.     ;CONVERT TO 60THS
4021         ADDM A,NULTIM   ;ADD TO 60THS USED (OBSOLETE)
4022         MOVEI T,SCLKI
4023         MOVEI C,SSLCKB
4024         JRST CLQREE     ;RE-ENTER RQ FOR SLOW CLOCK BREAK
4025
4026 IFN SWPWSP,[            ;JOB IN U NEEDS TO BE CHARGED FOR MEMORY USED WHILE BLOCKED OR STOPPED
4027 ALCR7:  HLLO W,UWRKST(U)
4028         JFFO W,.+1      ;H GETS 19 - LOG(WORKING SET SIZE + 1/2)
4029         SUBI H,19.
4030         IMUL H,[-125000.] ;CHARGE FOR 1/2 SECOND OF MEMORY USAGE
4031         ADDM H,USWPRI(U)
4032 IFN KA10P, JRST I
4033 IFE KA10P, JRST ALCR6
4034 ];SWPWSP
4035 \f
4036 ;SYSTEM IN FINAL THROES OF COMING DOWN, SEE IF IT'S OVER YET
4037
4038 COFFIN: MOVE T,NLOOSP           ;MUST SWAP OUT ALL LOOSE PAGES
4039         ADDB T,SWPOPR
4040         JUMPN T,CPOPJ           ;SWAPPAGE OUT STILL GOING ON
4041         MOVEI T,NQCHN+1+NQS-1
4042         SKIPGE QSGL(T)
4043          SOJG T,.-1
4044         SKIPL QSGL(T)           ;NOT OVER IF ANY DISK CHANNELS ARE ACTIVE
4045          POPJ P,
4046         MOVSI T,040000
4047         MOVE TT,QACTB   ;SEE IF DISK STUFF NOT OUT YET
4048         TDNE TT,QMDRO
4049          POPJ P,        ;MFD NOT OUT
4050         MOVSI A,-NQS
4051 COFFI8: TDNE T,QTUTO(A)
4052          JRST COFFI9    ;TUT NEVER CAME IN
4053         TDNE TT,QTUTO(A)
4054          POPJ P,        ;TUT NOT OUT
4055 COFFI9: AOBJN A,COFFI8
4056         MOVSI A,-QNUD
4057 COFFI1: SKIPN QSNUD(A)
4058          JRST COFFI2
4059         TDNE TT,QSNLCN(A)
4060          POPJ P,        ;UFD NOT WRITTEN
4061 COFFI2: AOBJN A,COFFI1
4062
4063 IFN NUNITS,[
4064         MOVSI A,-NUNITS
4065         SKIPGE UFLAPF(A)
4066          POPJ P,        ;TAPE STILL FLAPPING
4067         AOBJN A,.-2
4068 ]
4069         MOVE A,DTHTIM
4070         ADDI A,15.*30.  ;DON'T WAIT FOR CONSOLES MORE THAN 15 SECONDS
4071         CAMGE A,TIME    ;BECAUSE %TCHNG ISN'T NECESSARILY SET
4072          JRST COFFI3
4073         MOVEI A,NFSTTY-1        ;CHECK FOR REAL CONSOLES STILL TYPING OUT
4074         MOVSI T,%TCHNG  ;AND NOT HUNG (NEVER GOING TO FINISH TYPING OUT)
4075         TDNN T,TTYCOM(A)
4076          SKIPGE TTYOAC(A)
4077           SOJGE A,.-2
4078         JUMPGE A,CPOPJ  ;A CONSOLE IS STILL TYPING, DON'T GO DOWN YET
4079 COFFI3: SKIPL A,SYSCN
4080          SKIPGE TTYOAC(A)
4081           CAIA
4082            POPJ P,      ;SYSTEM CONSOLE HAS A LOT OF TYPING TO DO
4083         MOVEI A,2*LUBLK
4084 COFFI7: CAML A,USRHI
4085          JRST COFFI4
4086         SKIPE UNAME(A)
4087          POPJ P,        ;JOBS STILL EXIST
4088         ADDI A,LUBLK
4089         JRST COFFI7
4090
4091 ;SYSTEM FULLY DOWN; GO TO DDT.
4092 COFFI4: BUG DDT,[SHUTDOWN COMPLETE]
4093         SETZM SHUTDN            ;IF USER PROCEEDS, BRING SYSTEM BACK UP
4094         SETZM DEDTIM            ;ARRANGE TO RELOAD ATSIGN DRAGON
4095         SETZM FLSINS            ;BY RESTARTING SYS JOB WHERE IT DOES THAT
4096         MOVEI A,ISYS
4097         MOVEM A,UPC
4098         POPJ P,
4099 \f
4100 ;ROUTINE TO AGE SOME PAGES.  THIS ROUTINE SLOWLY CIRCULATES THROUGH
4101 ;CORE.  IF IT TOUCHES A PAGE TWICE, AND NO USER HAS TOUCHED IT,
4102 ;THE PAGE GETS SWAPPED OUT.  ALSO FLUSHES PAGES NOT IN ANY USER'S MAP.
4103 ;ENTER WITH VALUE OF AGERTE IN T.
4104
4105 AGE:    MOVE TT,MEMFR
4106         CAIL TT,100
4107          POPJ P,        ;NO MEMORY COMPETITION, DON'T BOTHER
4108         ADD T,AGEREQ    ;INCREASE NUMBER OF PAGES NEEDING TO BE AGED
4109         CAIGE T,100     ; BUT DON'T LET IT GET INFINITELY HUGE
4110          MOVEM T,AGEREQ ; IF CIRPSW IS LOCKED FOR A LONG TIME
4111         SKIPN DLSRCH    ;IF MUSTN'T PCLSR ANYONE, OR
4112          SKIPL CIRPSW   ; IF CIRPSW LOCKED, HAVE TO WAIT UNTIL NEXT SLOW CLOCK
4113           POPJ P,
4114         LDB W,[121000,,HUSRAD]  ;DON'T AGE SYSTEM JOB (CIRC PNTRS NOT CONNECTED)
4115         MOVE A,AGEPOS   ;CONTINUE AGEING FROM WHERE LEFT OFF LAST TIME
4116         SKIPGE U,USER   ;CHECK FOR NULJOB
4117          JRST AGE0
4118         MOVE T,CLKBRK   ;PC FOR USER WHO MAY GET PCLSR'D
4119         MOVEM T,UPC(U)  .SEE SWOP2
4120         LPMR UPGML(U)   ;DON'T LEAVE SWAPPED OUT PAGES IN ASSOC MEM
4121 AGE0:   CAIGE A,TSYSM
4122          CAMGE A,W
4123           MOVE A,W
4124         SOSGE AGEREQ
4125          JRST [ MOVEM A,AGEPOS ? SETZM AGEREQ ? POPJ P, ]
4126         AOS NAGES
4127         LDB T,[MUR,,MEMBLT(A)]
4128         CAIE T,MURUSR
4129          AOJA A,AGE0
4130         MOVE D,A
4131         PUSHJ P,UCPRL4
4132             SETZ AGE1
4133         MOVNI C,1       ;NO USERS ACTIVELY USING THIS PAGE, SWAP IT OUT
4134         PUSHJ P,SWPOPG
4135          JFCL
4136         AOJA A,AGE0
4137
4138 AGE1:   MOVEI C,UPGMP(U)
4139         MOVE T,I        ;DON'T CLOBBER I
4140         ROT T,-1
4141         ADD C,T
4142         HRLI C,222200
4143         SKIPGE T
4144          HRLI C,2200
4145         LDB T,C         ;GET PAGE MAP WORD
4146         TRNN T,600000
4147          POPJ P,        ;USER NOT CONNECTED TO THIS PAGE
4148         TROE T,PMAGEM
4149          POPJ P,        ;HASN'T TOUCHED THIS PAGE SINCE AGE BITS LAST SET
4150         DPB T,C         ;HAS TOUCHED PAGE, TURN AGE BITS BACK ON
4151         SUB P,[4,,4]    ;AND BACK OUT OF UCPRL
4152         AOJA A,AGE0
4153 \f
4154 IFN 340P,[
4155
4156 DISCHK: SKIPGE DISOFF
4157         POPJ P,
4158         AOSLE DISDIE
4159         SKIPGE CDISOFF
4160         POPJ P,
4161         MOVEI T,1
4162         MOVEM T,DTIME
4163 DISZAP: MOVE T,[JSR DBLKPB]
4164         MOVEM T,40+2*DISCHN
4165         MOVEI T,DIS300-1        ;CAUSE 340 TO STOP AND INTERRUPT SOON
4166         MOVEM T,DBLKOP
4167         CLEARM DISOFF
4168         CONO DIS,5100+SDCHN_3+DISCHN
4169         POPJ P,
4170 ]
4171
4172 DEATH:  SKIPL SHUTLK
4173         POPJ P,
4174         SETZM 37        ;CLEAR START DYING FLAG
4175         MOVEI T,60.*5.*60.      ;5 MIN
4176         MOVEM T,DEDTIM
4177         LSH T,-1
4178         ADD T,TIME
4179         MOVEM T,SHUTDN
4180         PUSHJ P,CLQDEL
4181          DEDBLK
4182 DEATHX: SKIPN T,DEDTIM
4183          POPJ P,
4184         AOS (P)
4185         MOVEI TT,0
4186         CAIGE T,40.*60.
4187          JRST DEATHY
4188         MOVE TT,T
4189         LSH TT,-2
4190 DEATHY: MOVEM TT,DEDTIM
4191         SUB T,TT
4192         PUSHJ P,CLQADD
4193          DEDBLK
4194 DEATHM: MOVEI A,%PIDWN
4195         PUSHJ P,INTALL  ;TELL THE WORLD
4196         MOVSI T,SCLSHD  ;CAUSE TYPE OUT ON UNLOGGED-IN CONSOLES
4197 SUPSET: IORM T,SUPCOR
4198         POPJ P,
4199
4200 VSSLCK: MOVSI T,SCLVSK
4201         IORM T,SUPCOR   ;CAUSE VERY SLOW CLOCK TO RUN
4202         MOVEI T,VSCLKI
4203         MOVEI C,VSLCKB
4204         JRST CLQREE
4205
4206 IFN CCLKP,[
4207 RCCLK:  DATAI 374,T     ;HACK CHESS CLOCK
4208         TRNE T,4000
4209          AOSA CCLK1
4210           AOS CCLK2
4211         MOVEI T,6
4212         MOVEI C,CCLKB
4213         JRST CLQREE
4214 ]
4215
4216 IFN N11TYS,[
4217 WHOSET: MOVEI T,SCRWHO  ;CAUSE SYS TO UPDATE WHO LINES
4218         IORM T,SUPCOR
4219         MOVEI T,5.*60.-5  ;5 SECONDS MINUS A LITTLE SO DOESN'T SYNC WITH OTHER CLOCKS
4220         MOVEI C,WHOCLB
4221         JRST CLQREE
4222 ]
4223 \f
4224 SUBTTL SWAP SCHEDULER
4225
4226 OVHMTR SWS      ;SWAP SCHEDULER
4227
4228 ;15 SECOND CLOCK
4229 15SCLK:
4230 IFN IMPP,       PUSHJ P,IMRSTO  ;RESET CONTROL LINK RFNM WAIT FOR LOSING IMP.
4231
4232 ;RECOMPUTE SWAP BLOCK DATA.
4233 ;DECAY SWAP PRIORITIES (USWPRI AND SWRCE)
4234 ;RESET BEST-EFFORT-HAS-BEEN-MADE TO SWAP OUT BITS
4235
4236         MOVSI B,%SWBEM  ;SET UP TO CLEAR "BEST EFFORT TO SWAP OUT BIT"
4237         SETOM SBEFLG    ;NOT YET DESPERATE ENOUGH TO TRY USERS WHOSE BEST EFFORT BITS ARE SET
4238 IFE SWPWSP,[
4239         CLEARB T,NUSWB  ;# USERS LOCKED OUT
4240         SETOM BUSR      ;SMALLEST SWAPPED BLOCKED USER
4241         MOVE D,[37777,,777777]
4242         MOVEM D,BUSIZ   ;SIZE OF SMALLEST SWAP-BLOCKED USER.
4243         CLEARM ASBUM    ;REAL MEM OCC BY ACTIVE SWAPPED BLOCKED LOSERS
4244         MOVSI D,400000  ;TO CLEAR SWAPPED BLOCKED BIT
4245 ];SWPWSP
4246 .ELSE   MOVEI T,LUBLK*2
4247 15S1:   CAML T,USRHI
4248          JRST 15S2
4249         SKIPN UNAME(T)
4250          JRST 15S3
4251         MOVN C,USWPRI(T)
4252         ASH C,-2
4253         ADDM C,USWPRI(T)        ;DECAY JOB SWAP PRI'S
4254         MOVE C,NMPGS(T)
4255 IFE SWPWSP,[
4256         SKIPE ENPZRO
4257          SUBI C,1       ;COMPENSATE FOR PAGE ZERO ALWAYS IN
4258 ];SWPWSP
4259         CAMLE C,NSWPGS(T)       ;SKIP ON NOT COMPLETELY OUT
4260          ANDCAM B,USWST(T) .SEE %SWBEM
4261 IFE SWPWSP,[
4262         SKIPGE USWSCD(T)
4263          JRST 15S4      ;CLEAR SWAPPED BLOCK BIT AND MAYBE ADD TO AUSOPG AND TRUMM (IF HE WAS HUNG ON IT)
4264 ];SWPWSP
4265 15S3:   ADDI T,LUBLK
4266         JRST 15S1
4267
4268 15S2:
4269 IFE SWPWSP,[
4270         SKIPE ENSWSC
4271          PUSHJ P,SWSCD  ;SWAP BLOCK LOSERS IF NECESSARY
4272 ];SWPWSP
4273         MOVSI T,-NCT-2
4274 15S5:   MOVN C,SWRCE(T) ;DECAY TREE SWAP PRI'S
4275         ASH C,-2
4276         ADDM C,SWRCE(T)
4277         AOBJN T,15S5
4278         MOVEI T,15.*60.
4279         MOVEI C,15SCLB
4280         JRST CLQREE
4281
4282 IFE SWPWSP,[
4283 15S4:   ANDCAM D,USWSCD(T)      ;CLEAR SWAP BLOCK BIT
4284         SKIPN TT,FLSINS(T)      ;WAS HE HUNG TESTING IT
4285          JRST 15S3
4286         SUBI TT,(T)
4287         CAME TT,[SKIPGE USWSCD]
4288          JRST 15S3              ;HE WASN'T HUNG ON THIS
4289         CLEARM FLSINS(T)        ;HE WAS SO NOW HES ACTIVE
4290         MOVE TT,USWST(T)
4291         TLZE TT,%SWPGW
4292          SOS NPGWTU             ;FLSINS WAS SET BY PAGE FAULT, SO CONSIDERED
4293         TLZ TT,%SWBEM           ;TO BE WAITING FOR A PAGE
4294         MOVEM TT,USWST(T)
4295         MOVE TT,NMPGS(T)
4296         ADDM TT,TRUMM           ;GUY IS NOW RUNNABLE
4297         SUB TT,NSWPGS(T)        ;ANY PAGES HE MAY HAVE IN MEM NO LONGER BELONG TO A BLOCKED USER
4298         MOVNS TT
4299         ADDB TT,BUMPGS
4300         SKIPGE TT
4301          CLEARB TT,BUMPGS
4302         MOVE TT,NSWPGS(T)       ;ANY SWAPPED OUT PAGES BELONG TO AN ACTIVE USER
4303         ADDM TT,AUSOPG
4304         JRST 15S3
4305 ];SWPWSP
4306 \f
4307 IFE SWPWSP,[
4308
4309 PRVCLK: SKIPN ENPVCL
4310          JRST PRVCK4
4311         MOVSI B,%SWPRV
4312         SKIPL U,PRVUSR
4313          ANDCAM B,USWST(U)
4314         SETOM PRVUSR    ;TURN OFF CURRENT PRIVILEDGED USER
4315         MOVEI J,2*LUBLK
4316 PRVCK1: CAML J,USRHI
4317          JRST PRVCK2
4318         SKIPN UNAME(J)
4319          JRST PRVCK3
4320         MOVE B,UTRNTM(J)        ;GET USER RUN TIME
4321         SUB B,LTRNTM(J)
4322         MOVE A,USIPRQ(J)
4323         SUB A,LSIPRQ(J)
4324         IMUL A,[NPVSEC*125000.] ;1/2 NUMBER OF 4 MICROSECOND INTERVALS IN THE PRIV INTERVAL
4325         SKIPE B
4326          IDIV A,B
4327         MOVE B,UPGSEC(J)
4328         LSH B,-1                ;DIVIDE LAST VALUE BY TWO
4329         ADD A,B
4330         MOVEM A,UPGSEC(J)       ; LAST/2 + CURRENT
4331         MOVE A,UTRNTM(J)
4332         MOVEM A,LTRNTM(J)
4333         MOVE A,USIPRQ(J)
4334         MOVEM A,LSIPRQ(J)       ;SAVE OLD VARIABLES
4335 PRVCK3: ADDI J,LUBLK
4336         JRST PRVCK1
4337
4338 PRVCK2: PUSHJ P,NPRVUS  ;GET NEXT PRIV USR
4339 PRVCK4: MOVEI T,NPVSEC*60.
4340         MOVEI C,PRVCLB
4341         JRST CLQREE
4342
4343 NPRVUS: MOVEI J,2*LUBLK
4344         SETOM U
4345         MOVNI T,30.*2   ;DON'T LET A BLOCKED OR STOPPED PERSON BE PRIVILEDGED
4346         ADD T,TIME
4347         MOVE B,PRVCUT
4348         HRLOI E,377777
4349 NPVUS1: CAML J,USRHI
4350          JRST NPVUS2
4351         CAMGE T,LUBTM(J)        ;BLOCKED TOO LONG?
4352          SKIPN UNAME(J)
4353           JRST NPVUS3
4354         CAMG B,UPGSEC(J)
4355          CAMG E,LPRVTM(J)
4356           JRST NPVUS3
4357         MOVE U,J
4358         MOVE E,LPRVTM(J)
4359 NPVUS3: ADDI J,LUBLK
4360         JRST NPVUS1
4361
4362 NPVUS2: MOVEM U,PRVUSR
4363         SKIPG U
4364          POPJ P,
4365         MOVSI B,%SWPRV
4366         IORM B,USWST(U)
4367         MOVE T,TIME
4368         MOVEM T,LPRVTM(U)
4369         POPJ P,
4370 ];SWPWSP
4371 \f
4372 IFE SWPWSP,[
4373 IFNDEF MEMSYS,MEMSYS==50        ;GUESS AT AMOUNT OF MEM SYSTEM NEEDS
4374 IFNDEF MEMSY1,MEMSY1==50        ;AMOUNT OF MEM ANY ONE USER MUST LEAVE TO "FIT".
4375
4376 SWSCD:  MOVE E,TRUMM    ;SEE IF NECESSARY TO SWAP BLOCK SOMEONE
4377         CAIGE E,TSYSM-SYSB-MEMSYS
4378         POPJ P, ;NO SHOULD FIT
4379         MOVE E,MEMFR
4380         SUB E,NCBCOM
4381         ADD E,SOLNG
4382         SUB E,SILNG
4383         SUB E,AUSOPG
4384         ADD E,BUMPGS    ;WILL SWAP OUT BLOCKED USERS FIRST
4385         ADD E,ASBUM
4386         SUBI E,20       ;SLOP
4387         JUMPGE E,CPOPJ  ;SHOULD HAVE ROOM FOR EVERYBODY
4388         MOVMM E,SWSCT1  ;SAVE # PGS REQ
4389         MOVNI E,1       ;NEED TO GRONK USER (MAYBE)
4390         CLEARB T,TT     ;TT SWP PRI OF PROCESS
4391         MOVEI R,0       ;R SWP PRI OF TREE
4392 SWSCP1: CAML T,USRHI
4393         JRST SWSCP2
4394         SKIPE UNAME(T)
4395         SKIPE USTP(T)
4396         JRST SWSCP7
4397         SKIPGE USWSCD(T)
4398         JRST SWSCP7     ;GUY ALREADY LOCKED OUT
4399         SKIPE FLSINS(T)
4400         JRST SWSCP4     ;SEE IF REALLY BLOCKED OR JUST PAGE WAIT
4401 SWSCP5: MOVE B,UTMPTR(T)
4402         CAML R,SWRCE-USRRCE(B)
4403         CAMG TT,USWPRI(T)
4404         JRST SWSCP6     ;THIS GUY A BIGGER LOSER THAT PREV BIGGEST
4405 SWSCP7: ADDI T,LUBLK
4406         JRST SWSCP1
4407
4408 SWSCP6: MOVE E,T
4409         MOVE R,SWRCE-USRRCE(B)
4410         MOVE TT,USWPRI(T)
4411         JRST SWSCP7     ;GUY REALLY BLOCKED
4412
4413 SWSCP4: MOVE B,USWST(T)
4414         TLNE B,%SWPGW
4415          JRST SWSCP5
4416         JRST SWSCP7
4417
4418
4419 SWSCP2: JUMPL E,CPOPJ   ;NO VICTIM
4420         MOVE B,NMPGS(E)
4421         CAIGE B,TSYSM-SYSB-MEMSY1
4422         JRST SWSCP9     ;"SMALL LOSER"
4423         SUB B,NSWPGS(E)
4424         CAMLE B,SWSCT1  ;SKIP ON WILL STILL NEED TO BLOCK MORE LOSERS
4425         POPJ P,
4426 SWSCP9: MOVSI B,400000
4427         IORM B,USWSCD(E)        ;SWAP BLOCK LOSER
4428         AOS NUSWB
4429         AOS NTUSB
4430         MOVE TT,NMPGS(E)
4431         CAMLE TT,BUSIZ
4432         JRST SWSCP8
4433         MOVEM TT,BUSIZ
4434         MOVEM E,BUSR
4435 SWSCP8: SUB TT,NSWPGS(E)
4436         SOSGE TT
4437         MOVEI TT,0
4438         ADDM TT,ASBUM   ;THIS GUY SWAPPED BLOCKED
4439         MOVN TT,NMPGS(E)
4440         ADDM TT,TRUMM   ;DOESNT COUNT ANY MORE
4441         SKIPGE TRUMM
4442         CLEARM TRUMM
4443         MOVN TT,NSWPGS(E)
4444         ADDM TT,AUSOPG  ;NOT REALLY ACTIVE ANY MORE
4445         JRST SWSCD      ;SEE IF THATS ENUF
4446 ];SWPWSP
4447 \f
4448 OVHMTR PPI      ;PPIUM
4449
4450 ;PUT PAGE INTO USERS' MAPS (OF ALL USERS THAT ARE CONNECTED VIA CIRCULAR POINTERS)
4451 ;ALSO UPDATES THE WORKING SETS.
4452 ;CALL WITH PAGE NUMBER IN A, STARTING BYTE POINTER IN C, AND TDNE T,MMP IN D.
4453 ;SMASHES T,H,I,U,E,TT,C
4454 PPIUM:  AOS NPPIUM
4455 IFN SWPWSP,[
4456         MOVEI E,0       ;COUNT USERS OF THE PAGE
4457         PUSHJ P,UCPRL
4458             400000,,[AOJA E,CPOPJ]
4459         HRRM E,MMSWP(A) ;ALL THESE SHARERS WILL BE CONNECTED TO THE PAGE
4460         MOVSI T,1       ;COMPUTE WORKING SET ADJUSTMENT
4461         IDIVM T,E       ;I.E. 1 OVER NUMBER OF SHARERS
4462 ];SWPWSP
4463         PUSHJ P,UCPRL   ;GIVE PAGE TO ALL USERS WAITING FOR IT
4464             400000,,PPIUM1
4465         POPJ P,
4466
4467 ;SET UP MAP TO MEMBLT INDEX IN A
4468 PPIUM1: AOS NPPIU1
4469         CAIG U,LUBLK
4470          BUG            ;SYS JOB OR CORE JOB
4471         PUSH P,I
4472         MOVEI C,UPGMP(U)
4473         ROT I,-1
4474         ADDI C,(I)
4475         HRLI C,222200
4476         SKIPGE I
4477          HRLI C,2200
4478         LDB I,C
4479         JUMPE I,[JRST 4,.]      ;DOESN'T REALLY EXIST?
4480         MOVSI T,MMPPGA          ;DON'T REALLY PUT IN MAP IF PAGE-AHEAD PAGE.
4481         TDNE T,(D)              ;JUST PRE-EMPT.
4482          JRST QSWI2A
4483         TRNE I,600000           ;DO NOTHING IF ALREADY IN MAP.
4484 IFE E.SP,[
4485          JRST QSWI2     ;ALREADY IN MAP, POSSIBLE AS A RESULT OF RIDICULOUS TIMING ERROR
4486 ]
4487 IFN E.SP,[
4488          JRST E.SPGJ    ; CHECK E&S WANTS READ/WRITE FIRST FIX
4489 ]
4490         SOS NSWPGS(U)   ; NUMBER OF SWAPPED-OUT PAGES
4491         SOS SNSWPG      ;DECR CNT OF SWAPPED OUT FOR SYS
4492         SKIPN (P)       ;DON'T SET UP PG 0 AS R-W-F.
4493          JRST QSWI3
4494         TRNE I,2
4495          MOVEI I,2      ;SET READ/WRITE TO READ/WRITE/FIRST
4496 QSWI3:  LSH I,16.
4497         IORI I,PMCSHM(A);BRING IN ADDRESS AND CACHE BITS
4498         DPB I,C
4499 QSWI2:
4500 IFE SWPWSP,[
4501         AOS MMSWP(A)    ;INCREMENT COUNT OF USERS IN RING
4502 ];SWPWSP
4503 IFN SWPWSP,[
4504         ADDM E,UWRKST(U)        ;ADJUST WORKING SET
4505 ];SWPWSP
4506 QSWI2A:
4507 IFN PAGPRE,[
4508 ;IF THIS USER IS WAITING FOR THIS PAGE, MAKE HIM RUNNABLE BY PUTTING
4509 ;HIM ON THE SCHMNY LIST, AND PRE-EMPT THE CURRENTLY-RUNNING USER.
4510 ;THE IDEAS ARE TO START THIS USER'S NEXT PAGE READ AS SOON AS POSSIBLE,
4511 ;AND TO ELIMINATE THE SCHEDULING THAT WOULD OTHERWISE BE NECESSARY TO RUN THIS GUY.
4512         AOS NPREE1
4513         CONSZ PI,200_-APRCHN    ;CAN'T PREEMPT IF CLKOFF
4514          CONSZ PI,100000_-APRCHN        ;OR IN PROGRESS, BECAUSE
4515           JRST POPIJ            ;MIGHT ZERO FLSINS WHILE SCHEDULER
4516                                 ;IS EXECUTING IT & SIMILAR NASTIES
4517         AOS NPREE2
4518         CAME D,FLSINS(U)        ;IF JOB THAT JUST GOT PAGE IS WAITING FOR IT
4519          JRST POPIJ
4520         AOS NPREE3
4521         SETZM FLSINS(U)         ;THEN THAT JOB PREEMPTS CURRENT ONE
4522         MOVSI T,%SWPGW
4523         TDNE T,USWST(U)
4524          SOS NPGWTU             ;FLSINS WAS DUE TO PAGE FAULT (MIGHT BE IN .CALL CORBLK)
4525         ANDCAM T,USWST(U)
4526         HRRZ I,U
4527         PUSHJ P,SCHSB
4528         SETOM PREEMP
4529         CONO PI,CLKRQ           ;REQUEST INT TO SCHEDULER
4530 ];PAGPRE
4531 IFE PAGPRE,[
4532         SKIPE ENPREE
4533          CAME D,FLSINS(U)
4534           JRST POPIJ
4535         MOVE TT,PRVCUT
4536         CAME U,PRVUSR
4537          CAMLE TT,UPGSEC(U)
4538           SETZM SCHFLG
4539 ];PAGPRE
4540 POPIJ:  POP P,I
4541         POPJ P,
4542
4543 IFN E.SP,[
4544 E.SPGJ: SKIPE E.SPGH    ; FLAG FROM E.SPGI
4545          CAME U,DISUSR
4546           JRST QSWI2    ; LEAVE AS IS
4547         TRNN I,400000
4548          JRST QSWI2
4549         MOVEI I,3
4550         JRST QSWI3      ; GO MAKE READ/WRITE
4551         ; DON'T SOS NSWPGS, SINCE PAGE IS ALREADY HERE
4552 ];E.SP
4553 \f
4554 SUBTTL USER SCHEDULER
4555
4556 OVHMTR SC1      ;SCHEDULER 1 - ENTRY
4557
4558 IFN KL10P, IFNDEF SCCOST, SCCOST==250.  ;CHARGE 1 MILLISEC FOR SCHEDULING
4559 IFN KA10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4560 IFN KS10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4561
4562 SCHED:  SKIPGE U,USER
4563          JRST SCHED9
4564         MOVE T,CLKBRK
4565 IFN KS10P,[
4566         ;; If user is swapped out while running in the page fail code, then
4567         ;; EPTPFO is used as the PC.  Either he is on his way in, in which
4568         ;; case he will come back when restarted, or he is on his way out,
4569         ;; in which case this just pushes him on his way.
4570         TLNE T,%PSUSR
4571          JRST SCHED0
4572         HRRZ T,T
4573         CAIL T,PFAIL            ; First instruction inclusive
4574          CAILE T,PFAILE         ; Last instruction inclusive
4575           SKIPA T,CLKBRK
4576            MOVE T,EPTPFO
4577 SCHED0: ] ;IFN KS10P
4578         MOVEM T,UPC(U)
4579 IFN SCHBLN,SETZM SCHMNY ;ENTERED FROM QUANTUM RUNOUT, TIME TO CHECK ALL USERS
4580 SCHED2: ;ENTERED FROM UFLS OR PAGE FAULT, CHECK FOR AUXIL PERSON TO RUN
4581         ;IF SCHMNY IS STILL -1
4582         AOS NSKED
4583         MOVSI T,UEXIT   ;GET HERE FROM CLUFLS
4584         HRRI T,UUO(U)
4585         BLT T,SUEXND-1(U)
4586 IFN KL10P,[
4587         AC7CTX
4588         XCTR XR,[HRRZ A,13]     ;GCSTBR
4589         XCTR XR,[HRL A,14]      ;STBR
4590         SYSCTX
4591         MOVEM A,ULSPBR(U)
4592         SKIPL MTRUSR    ;SKIP IF PERF COUNTER AVAILABLE
4593          JRST [ DMOVE A,MBOXCT(U)       ;COMPUTE EQV CPU TIME FROM MBOX+EBOX ACCT
4594                 DSUB A,STMBOX           ;AS INCREMENTAL RUNTIME
4595                 DMUL A,KLMBCC
4596                 DADD B,EBOXCT(U)
4597                 DSUB B,STEBOX
4598                 DMUL B,KLEBCC
4599                 MOVE A,D
4600                 JRST SCHD2A ]
4601         RPERFC A
4602         DSUB A,STPERF   ;USER RUN TIME IN 80 NS UNITS LEFT 12
4603         DIVI A,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS IN A
4604 SCHD2A:
4605 ] ;KL10P
4606 IFN KS10P, LDB A,[044000,,UPQUAN(U)]    ;GET TIME USED IN 3.9 USEC UNITS
4607 IFN KA10P, LDB A,[022100,,UPQUAN(U)]    ;GET TIME USED IN 4.069 USEC UNITS
4608         ADDM A,USRTM1           ;SYSTEM TOTAL USER RUN TIME
4609         ADDM A,UTRNTM(U)        ;INCREASE RUN TIME
4610         ADDM A,JTMU(U)          ;DECREASE PROCEDURE PRIORITY
4611         MOVEI B,SCCOST(A)       ;ACCOUNT FOR OVERHEAD IN STARTING UP
4612         ADDM B,@UTMPTR(U)       ;DECREASE PROCEDURE TREE PRIORITY
4613 IFE SWPWSP,[
4614         MOVE T,NMPGS(U)         ;USWPRI IS PAGES IN CORE X CPU TIME
4615         SUB T,NSWPGS(U)
4616 ];SWPWSP
4617 IFN SWPWSP,[
4618         HLLO B,UWRKST(U)        ;USWPRI IS LOG(WORKING SET SIZE) X (CPU TIME + IO WAIT TIME)
4619         JFFO B,.+1              ;C GETS 19 - LOG(WORKING SET SIZE + 1/2)
4620         MOVEI T,19.
4621         SUB T,C
4622 ];SWPWSP
4623         IMUL T,A
4624         MOVE Q,UTMPTR(U)
4625         ADDM T,USWPRI(U)        ;CHARGE AGAINST SWAPPINNG PRI
4626         ADDM T,SWRCE-USRRCE(Q)  ;AND FOR TREE
4627         MOVE B,A
4628         LSH B,-7                ;GET RUNTIME IN 512 USEC UNITS
4629         CAILE B,777
4630          MOVEI B,777            ;TO FIT IN SCHEDULER HISTORY TBL
4631         MOVE C,USWST(U)
4632         SKIPE FLSINS(U)
4633          TLNN C,%SWPGW
4634           JRST SCHED8
4635         TRO B,1000              ;BLOCKAGE DUE TO PAGE FAULT
4636 IFN SWPWSP,[
4637         CAML A,LODQNT           ;CHECK FOR LEAVING LOADING STATE
4638 SCHED8:  TLZN C,%SWLOD          ;DUE TO RUNNING FOR MORE THAN LODQNT BETWEEN PAGE FAULTS
4639           JRST .+2              ;OR DUE TO BLOCKAGE FOR REASON OTHER THAN A PAGE FAULT
4640            PUSHJ P,LVLOA0       ;LEAVE LOADING STATE
4641 ];SWPWSP
4642 .ELSE SCHED8:
4643         DPB B,[311200,,@SCHHP]  ;COMPLETE SCHEDULER HISTORY TBL ENTRY
4644         SKIPL Q,RTIMER(U)       ;SKIP UNLESS RUNTIME INT ACTIVE
4645          JRST SEARRT
4646 SCHED3: SKIPGE DLSRCH
4647          JRST SEAREP    ;DELETE SEARCH, EXIT
4648 IFN PAGPRE,[
4649         SKIPE PREEMP            ;PRE-EMPT?
4650          JRST SCHEDP            ;YES, AVOID DOING FULL SCHEDULE
4651 ];PAGPRE
4652 IFN SCHBLN,[
4653         SKIPN SCHMNY    ;IF NOT YET TIME TO DO A FULL SCHEDULE,
4654          JRST SEARL0
4655 SCHED4: HLRZ U,UREALT   ;THEN CHECK LIST OF JOBS SCHEDULED BEFORE
4656         JUMPE U,SEARL0  ;ALWAYS SCHEDULE IF HIGH PRIORITY REAL TIME USER ACTIVE
4657         PUSHJ P,SCHGB   ;POP NEXT JOB OFF LIST
4658         JUMPL U,SEARL0  ;EMPTY
4659         PUSHJ P,SCHACK
4660          JRST SCHED4    ;JOB CEASED TO BE RUNNABLE
4661         AOS NSSKED      ;OK, RUN THIS ONE
4662         JRST SCHED6
4663 ];SCHBLN
4664
4665 SEARRT: SUB Q,A
4666         MOVEM Q,RTIMER(U)
4667         JUMPGE Q,SCHED3
4668         MOVSI T,(%PIRUN)        ;GIVE RUNTIME INTERRUPT
4669         IORM T,PIRQC(U)
4670         JRST SCHED3
4671 \f;
4672 ; HERE TO DO A FULL SCHEDULE (LOOK AT ALL JOBS)
4673 ;
4674
4675 OVHMTR SC2      ;SCHEDULER 2 - SEARCH
4676
4677 SEARL0: AOS NRSKED      ;1 MORE REAL SCHED (ACTUALLY SEARCHES JOBS)
4678         CLEARM TRUMM    ;TOTAL RUNNABLE USER MEM
4679         CLEARM AUSOPG   ;ACTIVE USER SWAPPED OUT PAGES
4680         CLEARM BUMPGS   ;PAGES IN REAL CORE BELONGING TO BLOCKED USERS
4681 IFE SWPWSP,     CLEARM ASBUM    ;PGS IN REAL MEM OCC BY SWAPPED BLOCKED LOSERS
4682         SKIPN SWPOPB
4683          SKIPE SWPOPR
4684           PUSHJ P,SWPON ;SWAP OUT STUFF
4685 IFN NSWPV,[
4686         SKIPGE CIRPSW
4687          PUSHJ P,SWPPIN ;SERVICE SWAPPING REQUESTS FROM OTHER PROCESSORS (DISPLAY)
4688 ]
4689         SETZB U,J       ;JOB BEING SCHEDULED
4690         SETZM RNABLU    ;NUM RUNABLE USERS
4691 IFN SCHBLN,[
4692         SETZM SCHBNJ    ;GOT NO RUNNABLE JOBS YET
4693         SETOM SCHMNY    ;ALLOW ALL THE RUNNABLES WE FIND TO RUN
4694 ];SCHBLN
4695 .ELSE   SETOM I         ;BEST USER SO FAR
4696         MOVNI T,7
4697         MOVEM T,SCHFLG  ;DONT SCHED AGAIN FOR 1/7.5 SEC
4698         JRST SEARL1
4699
4700 ;HERE IF NULL JOB HAD BEEN RUNNING
4701
4702 SCHED9: AOS NNSKED      ;1 MORE TIME NULL JOB WAS RUN
4703 IFN KA10P, LDB C,[022100,,UPQUAN] ;GET TIME NULL JOB RAN IN 4.069 USEC UNITS
4704 IFN KS10P, LDB C,[044000,,UPQUAN] ;GET TIME NULL JOB RAN IN 3.9 USEC UNITS
4705 IFN KL10P,[
4706         CAMN U,MTRJOB   ;IF METERING ONLY NULL JOB, STOP METERS NOW
4707          WRPAE PAEOFF
4708         CAMN U,MTRJOB
4709          CONO MTR,4001  ;TIME-BASE OFF, INTERVAL PIA=1
4710         REBOXC A        ;COMPUTE NULL JOB'S EQUIVALENT RUNTIME IN 4 USEC UNITS
4711         DSUB A,NULEBC
4712         RMBOXC C
4713         DSUB C,NULMBC
4714         DMUL C,KLMBCC   ;CONVERT MBOX COUNT TO EBOX COUNTER UNITS,
4715         DADD A,D        ;ADD TO EBOX COUNT
4716         DMUL A,KLEBCC   ;CONVERT TO 4 USEC UNITS.
4717         SKIPGE MTRUSR
4718          JRST [ RPERFC C        ;PERFORMANCE METER AVAILABLE, USE IT INSTEAD
4719                 DSUB C,NULPRF 
4720                 DIVI C,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS
4721                 JRST .+1 ]
4722 ];KL10P
4723         ADDM C,NULTM1   ;ACCUMULATE TOTAL NULL TIME IN 4 USEC UNITS
4724         SKIPE NPGWTU    ;IF SOMEONE WOULD HAVE BEEN RUNNING IF THEY
4725          ADDM C,LOSTM1  ; WEREN'T WAITING FOR A PAGE, THIS WAS LOST TIME
4726         SKIPN NPGWTU    ;BUT OTHERWISE
4727          ADDM C,IDLTM1  ;IT WAS COMPLETE IDLE TIME
4728         SKIPE NPGWTU    ;NOW COMPUTE % TIME IDLE AND LOST
4729          ADDM C,LOSRCE
4730         SKIPN NPGWTU
4731          ADDM C,IDLRCE
4732 IFN PAGPRE,SKIPN PREEMP ;CHECK FOR PRE-EMPT
4733          JRST SEARL0    ;NOW GO DO A FULL SCHEDULE
4734 IFN PAGPRE,[
4735 SCHEDP: SETZM PREEMP
4736         AOS NPREEL
4737         PUSHJ P,SCHGB   ;U GETS USER TO PRE-EMPT THIS ONE (LAST INTO SCHMNY LIST)
4738         JUMPL U,SCHDP1  ;NO ONE TO PRE-EMPT, RUN SAME USER AGAIN
4739         PUSHJ P,SCHACK  ;MAKE SURE PRE-EMPTING JOB IS RUNNABLE
4740          JRST SCHEDP    ;AFRAID NOT
4741         AOS NPREEM      ;OK, RUN THIS ONE
4742         SKIPL I,USER
4743          PUSHJ P,SCHSB  ;PRE-EMPTED JOB IS STILL A CANDIDATE FOR RUNNING
4744         JRST SCHED6
4745
4746 SCHDP1: SKIPGE U,USER   ;TRY TO RUN SAME USER AGAIN
4747          JRST SCHED1    ;RUN NULL JOB AGAIN
4748         PUSHJ P,SCHACK  ;MAKE SURE THIS JOB IS STILL RUNNABLE (COULD HAVE UFLSED)
4749          JRST SEARL0    ;FOO, BETTER DO A FULL SCHEDULE
4750         JRST SCHED6     ;OK, RUN THIS GUY
4751 ];PAGPRE
4752 \f
4753 ;MAIN SEARCH LOOP, RETURN HERE TO EXAMINE NEXT PROCEDURE
4754 SEARL:  MOVEI U,LUBLK   ;LENGTH OF USER VAR BLOCK
4755         ADDB U,J        ;STEP TO NEXT USER
4756         CAML U,USRHI    ;SKIP IF EXISTS
4757          JRST SEAREN    ;ALL PROCEDURES HAVE BEEN EXAMINED
4758 SEARL1: SKIPE T,USTP(U)
4759          JRST SEARS1    ;EMPTY OR STOPPED JOB SLOT
4760         SKIPE A,PIRQC(U)
4761          JRST SEAR2A    ;FIRST WORD INTERRUPT PENDING
4762 SEARL2: SKIPE B,IFPIR(U)
4763          JRST INTWD2    ;SECOND WORD INTERRUPT PENDING
4764 SEARL3: SKIPN FLSINS(U)
4765          JRST SEARC     ;NOT BLOCKED
4766 SEARL4: MOVE T,EPDL2(U)
4767         XCT FLSINS(U)   ;TEST BLOCKING CONDITION (MAY SKIP ONCE OR TWICE)
4768          JRST SEARLB    ;UNRUNABLE
4769          JRST SEARC     ;LOW PRIORITY UNBLOCK
4770          SKIPA Q,[-1]   ;HIGH PRIORITY UNBLOCK
4771           MOVEI Q,3     ;EXTRA LOW PRIORITY
4772         JRST SEARC2
4773
4774 SEARC:  SETZM Q         ;SET TO NORMAL PRIORITY
4775         PUSHJ P,UPRIVL  ;COMPUTE PRIVELEGE LEVEL (MAY SKIP ONCE OR TWICE)
4776          SOJA Q,SEARC2  ;HIGH-PRIORITY
4777          JRST SEARC2
4778         SKIPGE APRC(U)
4779          ADDI Q,2       ;DISOWNED JOB IN USER MODE
4780 SEARC2: AOS RNABLU      ;ANOTHER RUNABLE USER
4781         MOVE T,TIME
4782         MOVEM T,LUBTM(U)        ;RECORD LAST TIME UNBLOCKED
4783 IFE SWPWSP,[
4784         SKIPGE USWSCD(U)
4785          JRST SEARC7    ;HE'S SWAPPED BLOCKED SO HE DOESNT COUNT
4786 ];SWPWSP
4787         JUMPE U,SEARC4  ;DON'T FIGURE SYSTEM JOB.
4788         MOVSI T,%SWDSO
4789         ANDCAM T,USWST(U)       ;RUNNABLE SO NOT DESIRED OUT
4790         MOVE T,NMPGS(U)
4791         ADDM T,TRUMM    ;TOTAL RUNNABLE USER MEM
4792         MOVE T,NSWPGS(U)
4793         ADDM T,AUSOPG   ;TOTAL PAGES OF RUNNABLE USERS SWAPPED OUT
4794 SEARC4: CAMN U,UREALT           ;IF THIS IS REAL TIME USER IN HIGH PRIORITY
4795          JRST [ MOVEI A,0       ; PHASE, SCHEDULE WITH INFINITE PRIORITY
4796                 JRST SEARP2 ]
4797         SKIPLE T,URTIME(U)      ;NON SKIP IF POSSIBLE REAL TIME BLOCK
4798          TLNN T,1       ;SKIP IF REAL TIME BLOCK UNLESS PI IN PROGRESS
4799           JRST SEARC6
4800         SKIPGE PICLR(U) ;SKIP IF PI IN PROGRESS
4801          JRST SEARL     ;REAL TIME BLOCKED
4802 SEARC6: MOVE A,@UTMPTR(U)       ;GET AMOUNT OF MACHINE TIME USED RECENTLY BY TREE PROCEDURE IS IN
4803         LSH A,3         ;COMBINE WITH TIME FOR JUST THIS PROCEDURE
4804         ADD A,JTMU(U)   ;TO GET PRIORITY FIGURE (SMALLER NUMBER IS HIGHER PRI)
4805         LSH A,(Q)       ;ADJUST PRIORITY BY MULTIPLICATIVE FACTOR IN Q
4806 ;THE EFFECT OF THIS PRIORITY COMPUTATION IS THAT JOBS IN THE SAME TREE
4807 ;ARE COMPARED BY JTMU, WHILE JOBS IN DIFFERENT TREES ARE COMPARED MAINLY
4808 ;BY USRRCE, ALTHOUGH A MUCH SMALLER JTMU CAN OVERRIDE A SOMEWHAT LARGER
4809 ;USRRCE.  THIS IS SOMEWHAT DIFFERENT THAN THE COMPUTATION THAT WAS HERE
4810 ;BEFORE MAY 1980, BUT THAT COMPUTATION'S RESULTS EVEN DEPENDED ON THE
4811 ;ORDER THAT JOBS HAPPENED TO BE INSPECTED, AND ALLOWED A TREE WITH
4812 ;A LARGE NUMBER OF RUNNING JOBS TO GET AN UNFAIR SHARE OF THE MACHINE.
4813 SEARP2:
4814 IFN SCHBLN, PUSHJ P,SCHSJB      ;INSERT JOB INTO PRIORITY-SORTED LIST
4815 .ELSE [ JUMPL I,SEARP5
4816         CAML A,U0P      ;SKIP IF IS BETTER THAN BEST SO FAR
4817          JRST SEARL
4818 SEARP5: MOVEM U,I       ;I GETS NEW BEST USER SO FAR
4819         MOVEM A,U0P     ;U0P GETS PRIORITY OF THAT USER
4820 ];SCHBLN
4821         JRST SEARL      ;TRY NEXT
4822
4823 IFE SWPWSP,[
4824 SEARC7: MOVE T,NMPGS(U) ;RUNNABLE AND SWAPPED BLOCKED
4825         SUB T,NSWPGS(U)
4826         SOSL T
4827          ADDM T,ASBUM
4828         JRST SEARC4
4829 ];SWPWSP
4830
4831 ;JOB IS NOT RUNNABLE
4832 SEARLB: JUMPE U,SEARL   ;DON'T FIGURE SYSTEM JOB
4833         MOVE T,USWST(U)
4834 IFE SWPWSP,     SKIPL USWSCD(U) ;IF LOCKED OUT, DONT COUNT
4835 IFN SWPWSP,     TLNN T,%SWSB
4836          TLNN T,%SWPGW
4837           JRST SEARB1   ;NOT WAITING FOR PAGE
4838         MOVE T,NMPGS(U) ;USER IS WAITING FOR PAGE SO COUNT FOR ACTIVE
4839         ADDM T,TRUMM
4840         MOVE T,NSWPGS(U)
4841         ADDM T,AUSOPG
4842         JRST SEARL
4843
4844 SEARB1: TLNE T,%SWBEM
4845          JRST SEARL     ;HAVE MADE BEST SWAPOUT EFFORT
4846         MOVE T,NMPGS(U)
4847         SUB T,NSWPGS(U)
4848         SOSL T
4849          ADDM T,BUMPGS  ;REAL MEM PGS BELONGING TO BLOCKED USERS
4850         JRST SEARL
4851
4852 SEARS1: SKIPN UNAME(U)
4853          JRST SEARL
4854         MOVE T,USWST(U) ;GUY STOPPED, DOES HE HAVE PAGES IN REAL MEM?
4855         TLNE T,%SWBEM
4856          JRST SEARL     ;HAVE TRIED BEST EFFORT TO SWAP OUT
4857         MOVE T,NMPGS(U)
4858         SUB T,NSWPGS(U)
4859         ADDM T,BUMPGS
4860         JRST SEARL
4861
4862 IFN SCHBLN,[
4863 ;TEST ALL THINGS THAT MAKE A PERSON UNRUNNABLE, OR AT LEAST
4864 ;REQUIRE THE ATTENTION OF THE SCHEDULER
4865 ;SKIP-RETURN IF JOB IS RUNNABLE, BASHES T, A
4866 SCHACK: CAMGE U,USRHI           ;NON-EXISTENT
4867          SKIPE USTP(U)          ;STOPPED
4868           POPJ P,
4869         SKIPE T,PIRQC(U)
4870          JRST [ TDNE T,[BADBTS]
4871                  JRST SCHACI    ;NON-DEFERRABLE
4872                 SKIPN PICLR(U)
4873                  JRST .+3       ;ALL INTERRUPTS DEFERRED
4874                 ANDCM T,IDF1(U)
4875                 TDNE T,MSKST(U)
4876                  JRST SCHACI
4877                 JRST .+1 ]
4878         SKIPE T,IFPIR(U)
4879          JRST [ SKIPN PICLR(U)
4880                  JRST .+1       ;ALL INTERRUPTS DEFERRED
4881                 ANDCM T,IDF2(U)
4882                 TDNE T,MSKST2(U)
4883                  JRST SCHACI
4884                 JRST .+1 ]
4885         SKIPE FLSINS(U)         ;FLUSH INSTRUCTION NOT SATISFIED
4886          JRST [ MOVE T,EPDL2(U)
4887                 XCT FLSINS(U)   ;IT MAY BE SATISFIED BUT NOT CLEARED YET
4888                  POPJ P,        ;STILL BLOCKED
4889                 JRST .+1        ;CAN SKIP VARIOUS RANDOM NUMBERS OF TIMES
4890                 JRST .+1
4891                 JRST .+1 ]
4892 SCHAC1: SKIPLE T,URTIME(U)      ;REAL-TIME BLOCKED
4893          TLNN T,1
4894           SKIPA
4895            SKIPLE PICLR(U)
4896             AOS (P)
4897         POPJ P,
4898
4899 SCHACI: MOVE T,UPC(U)           ;TRYING TO INTERRUPT, NEEDS SCHEDULER
4900         TLNN T,%PCUSR           ;ATTENTION UNLESS RUNNING IN EXEC MODE
4901          SKIPE FLSINS(U)        ;IN WHICH CASE NEED TO LET IT FINISH
4902           POPJ P,               ;SO IT CAN BE PCLSRED
4903         JRST SCHAC1
4904
4905 ;PUT JOB IN U, PRIORITY IN A, INTO STACK IN PRIORITY ORDER.  BASH T,TT,B.
4906 SCHSJB: SKIPG T,SCHBNJ  ;FIRST SEARCH FOR SLOT IN WHICH TO INSERT
4907          JRST SCHSJ1    ;BUFFER NOW EMPTY, SKIP SEARCH
4908         MOVE TT,T
4909         CAML A,SCHBPR-1(T)
4910          SOJG T,.-1     ;LOOP TERMINATES WITH T SLOT WHERE IT BELONGS
4911         CAIL TT,SCHBLN
4912          SOJA T,SCHSJ3  ;BUFFER FULL, WORK DIFFERENTLY
4913 SCHSJ0: MOVE B,SCHBTB-1(TT)     ;MOVE STUFF UP TO ADD ANOTHER ENTRY
4914         MOVEM B,SCHBTB(TT)
4915         MOVE B,SCHBPR-1(TT)
4916         MOVEM B,SCHBPR(TT)
4917         CAILE TT,1(T)
4918          SOJA TT,SCHSJ0
4919 SCHSJ1: AOS SCHBNJ
4920 SCHSJ5: MOVEM U,SCHBTB(T)
4921         MOVEM A,SCHBPR(T)
4922         POPJ P,
4923
4924 SCHSJ3: AOS NSCHOV      ;BUFFER NOT BIG ENOUGH FOR ALL RUNNABLE JOBS
4925         JUMPL T,CPOPJ   ;THIS JOB IS LOWEST PRIORITY, FORGET IT
4926         JUMPE T,SCHSJ5  ;THIS JOB IS SECOND-LOWEST PRIORITY, FORGET LOWEST
4927         MOVE TT,[SCHBTB+1,,SCHBTB]
4928         BLT TT,SCHBTB-1(T)      ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4929         MOVE TT,[SCHBPR+1,,SCHBPR]
4930         BLT TT,SCHBPR-1(T)
4931         JRST SCHSJ5
4932
4933 ;PUSH JOB IN I ONTO STACK OF RUNNABLE JOBS
4934 SCHSB:  AOS T,SCHBNJ
4935         CAILE T,SCHBLN
4936          JRST [ SOS SCHBNJ      ;BUFFER OVERFLOW
4937                 AOS NSCHOV      ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4938                 MOVE T,[SCHBTB+1,,SCHBTB]
4939                 BLT T,SCHBTB+SCHBLN-2
4940                 MOVEM I,SCHBTB+SCHBLN-1
4941                 POPJ P, ]
4942         MOVEM I,SCHBTB-1(T)
4943         POPJ P,
4944
4945 ;POP STACK OF RUNNABLE JOBS INTO U (RETURNS -1 IF STACK EMPTY)
4946 SCHGB:  SOSL U,SCHBNJ
4947          SKIPA U,SCHBTB(U)
4948           SETZM SCHBNJ  ;BUFFER EMPTY, U HAS -1
4949         POPJ P,
4950 ];SCHBLN
4951 \f
4952 .ALSKF==0
4953 DEFINE ALTSKP A
4954 IFE .ALSKF,[
4955         DEFINE .ALSKS
4956 A TERMIN
4957 ]
4958 IFN .ALSKF,[
4959         CAME U,.ALSKS
4960          CAMN U,A
4961           POPJ P,
4962 ]
4963 .ALSKF==.ALSKF#1
4964 TERMIN
4965
4966 ;DETERMINES USER PRIVILEGE LEVEL FOR SCHEDULING AND SWAPPING
4967 UPRIVL: SKIPN RPCL(U)   ;BEING RPCLSR'ED?
4968          CAMN U,UMASTER ;MASTER?
4969           POPJ P,       ;HIGHLY PRIVILEGED
4970         AOS (P)         ;SKIP AT LEAST ONCE
4971 IFN 340P\E.SP,  ALTSKP DISUSR
4972 IFN VIDP,       ALTSKP NVDUSR
4973 IFN TABP,       ALTSKP TABUSR
4974 IFN ARMP,       ALTSKP ARMUSR
4975 IFN LPTP,       ALTSKP LPTUSR
4976 IFG LPTP-1,     ALTSKP OLPUSR
4977 IFN PLTP,       ALTSKP PLTUSR
4978 IFN .ALSKF,[
4979         CAMN U,.ALSKS
4980          POPJ P,        ;DON'T FIGURE DISOWNED IF USING ABOVE DEVICES
4981 ]
4982         MOVE T,UPC(U)
4983         TLNE T,%PCUSR
4984          AOS (P)        ;SKIP TWICE
4985         POPJ P,
4986 \f
4987 OVHMTR SC3      ;SCHEDULER 3 - EXIT
4988
4989 ;SEARCH END (EXIT)
4990 SEAREN:
4991 IFE SWPWSP,[
4992         SKIPE NUSWB
4993          PUSHJ P,SSWC1  ;SEE IF ENUF CORE TO UNBLOCK A SWAPPED BLOCKED LOSER
4994 ];SWPWSP
4995 IFE SCHBLN,[
4996         SKIPGE U,I      ;SKIP IF NON-NULL JOB BEST
4997          JRST SCHED1
4998         AOS NSCHDU
4999 ];SCHBLN
5000 IFN SCHBLN,[
5001         MOVE T,SCHBNJ
5002         ADDM T,NSCHDU
5003         PUSHJ P,SCHGB   ;GET HIGHEST-PRIORITY JOB
5004         JUMPL U,SCHED1  ;NONE, RUN NULL JOB
5005 ];SCHBLN
5006 SCHED6: SKIPE FLSINS(U)
5007          JRST SCHED5
5008 SCHED1: EXCH U,USER
5009         JUMPL U,SCHDN   ;JUMP IF SWITCHING FROM NULL JOB
5010         CAMN U,USER     ;SKIP UNLESS RUNNING SAME JOB AGAIN
5011          JRST SEAREP    ;JUMP ON SAME JOB
5012 IFN KL10P,[
5013         CAMN U,MTRJOB           ;IF LEAVING JOB BEING METERED, STOP METER AND
5014          WRPAE PAEOFF
5015         CAMN U,MTRJOB
5016          CONO MTR,4001          ;TIME-BASE OFF, INTERVAL PIA=1
5017 ]
5018 ;SWAP OUT THE OLD JOB'S CONSOLE REGISTER, AND CLEAR ITS BLINKER.
5019 IFN N11TYS,[
5020         SKIPGE TT11P
5021          SKIPE TEN11F
5022           JRST SSTVR1           ;DONT HACK 11
5023         SKIPL TVCREG(U)         ;DO WE WANT TO SAVE TV CONSOLE REG FOR THIS GUY?
5024          SKIPN T,400000+TTR10*2000 ;0 IS NOT A (VERY) LEGITIMATE CONSOLE REG FCN
5025           JRST SSTVR2           ;SO ASSUME 11 STOPPED, DONT CLOBBER PREV THING
5026         MOVEM T,TVCREG(U)
5027 SSTVR2: SKIPGE T,TVVBN(U)       ;DID WE SET RUNNING BLINKER FOR THIS GUY?
5028          JRST SSTVR1            ;NO
5029         MOVEM T,400000+TTR10*2000       ;SET TO VIDEO BUFFER WE SET IT IN
5030         MOVE A,TVBLAD           ;ADDR IN VIDEO BUFFER WE FLASHED
5031         CLEARM 400000+TTR0*2000(A)      ;CLEAR IT
5032 SSTVR1:]
5033 IFN KA10P,[
5034         MOVE T,40
5035         MOVEM T,SV40(U) ;SAVE LAST UUO EXECUTED FOR THIS USER
5036         MOVE T,UPC(U)   ;IF USER HAS JUST TRAPPED TO 60,
5037         TLNE T,%PCUSR
5038          JRST SCHDN
5039         ANDI T,-1
5040         CAIL T,60H0
5041          CAILE T,60HE
5042           JRST SCHDN
5043         MOVNI T,60H0-UUOH0
5044         ADDM T,UPC(U)   ;THEN MOVE HIM INTO UUOH INSTEAD
5045         MOVE T,60       ;AND MOVE 60H'S VARIABLES INTO UUOH'S VARS
5046         MOVEM T,SV40(U) ;(THAT'S ALL 60H DOES ANYWAY).
5047         MOVE T,60H
5048         MOVEM T,SUUOH(U)
5049 ] ;KA10P
5050 ;DROPS THROUGH.
5051 \f;DROPS IN
5052 ;COME HERE TO SET UP A JOB THAT WASN'T ALREADY RUNNING.
5053
5054 SCHDN:  MOVE A,U
5055         SKIPGE U,USER
5056          JRST SCHDN2    ;JUMP IF SWITCHING TO NULL JOB
5057 IFN KA10P,[
5058         MOVE T,SV40(U)  ;LOAD NEW KRUFT
5059         MOVEM T,40
5060 ] ;KA10P
5061 IFN N11TYS,[
5062         SKIPGE TT11P    ;DONT HACK 11 IF ITS DOWN (MOSTLY IN CASE ITS BEING HACKED
5063                         ;HARDWARILY
5064          SKIPE TEN11F
5065           JRST SLTVR1   ;DONT HACK 11
5066         SKIPGE T,TVVBN(U)       ;BLINK RUNNING FROB?
5067          JRST SLTVR2
5068         MOVEM T,400000+TTR10*2000
5069         MOVE A,TVBLAD
5070         MOVNI T,20
5071         MOVEM T,400000+TTR0*2000(A)
5072         SKIPA T,TVVBN(U)
5073 SLTVR2:  MOVSI T,12_<8+4+16.-18.>       ;ALU NOP
5074         SKIPL TVCREG(U)
5075          MOVE T,TVCREG(U)
5076         MOVEM T,400000+TTR10*2000
5077 SLTVR1:]        
5078 IFN KL10P,[
5079         CAMN U,MTRJOB   ;IF THIS JOB'S BEING METERED, TURN ON METER AND TIME BASE.
5080          WRPAE PAEON
5081         CAMN U,MTRJOB
5082          CONO MTR,2001  ;TIME-BASE ON, INTERVAL PIA=1
5083 ];KL10P
5084         SOS NRESKED     ;COMPENSATE FOR EXTRA AOS ON NEXT PAGE
5085
5086 ;DROPS THROUGH
5087 \f;DROPS IN
5088 ;COME HERE TO START UP A JOB EVEN IF IT WAS ALREADY RUNNING BEFORE THIS SCHEDULE.
5089
5090 SEAREP: AOS NRESKED
5091 IFN KA10P,[
5092         HRLOI T,1
5093         ANDCAM T,UPQUAN(U)      ;RESET QUANTUM TIMER
5094 ] ;KA10P
5095 IFN KL10P,[
5096         RPERFC STPERF           ;SAVE PERF METERS FOR LATER USE
5097         DMOVE A,EBOXCT(U)       ;COMPUTING RUN TIME EFFECTIVELY RESETS
5098         DMOVEM A,STEBOX         ;QUANTUM TIMER 
5099         DMOVE A,MBOXCT(U)
5100         DMOVEM A,STMBOX
5101 ] ;KL10P
5102 IFN KS10P, SETZM UPQUAN(U)      ;RESET QUANTUM TIMER
5103         PUSHJ P,PGLDU
5104         MOVN A,U
5105         IDIVI A,LUBLK
5106         SKIPE B
5107          BUG
5108 IFE KS10P,[     ; KS has no lights.
5109         MOVSI B,400000
5110         LSH B,(A)
5111         SKIPN MIPGDS
5112          DATAO LIGHTS,B ;LIGHTS HAVE ONE BIT, SHOWING WHICH JOB IS RUNNING.
5113 ] ;IFE KS10P
5114         MOVN B,A        ;GET JOB'S NUMBER IN B
5115         MOVE T,UPC(U)   ;USER'S PC WORD
5116         MOVEM T,CLKBRK
5117         AOS A,SCHHP     ;SET UP SCHEDULER HISTORY TBL
5118         CAIL A,SCHHB+SSCHDB
5119          MOVEI A,SCHHB
5120         MOVEM A,SCHHP
5121         HRRM T,(A)      ;STORE PC
5122         TLNN T,%PCUSR
5123          TRO B,400000
5124         HRLM B,(A)      ;STORE USER INDEX AND USER BIT
5125         MOVSI T,UUO(U)
5126         HRRI T,UEXIT
5127         BLT T,UEXND-1   ;BLT IN UEXIT BLOCK
5128 IFN KL10P,[
5129         MOVE T,ULSPBR(U)
5130         AC7CTX
5131         XCTR XW,[HRRZM T,13]    ;GCSTBR
5132         XCTR XW,[HLRZM T,14]    ;STBR
5133 ] ;KL10P                ;CONTEXT WILL BE RESTORED AT CLKB5 BELOW
5134 IFN KA10P, CONO @APRC(U)
5135
5136 ;
5137 ; THIS IS THE ONE PLACE WHERE CLOCK LEVEL RETURNS TO THE USER JOB
5138 ;
5139 CLKB5:
5140 IFE KA10P, DATAO PAG,@CLCXSV    ;RESTORE CONTEXT
5141         MOVE U,USER
5142         MOVSI U,AC0S(U)         ;RESTORE AC BLOCK 0
5143         BLT U,U
5144         JRST 12,@CLKBRK         ;RESTORE PC, FLAGS, AND PI
5145 \f
5146 ;HERE WHEN STARTING A USER WHO HAD BEEN FLSING
5147
5148 SCHED5: MOVE T,USWST(U)
5149 IFN SWPWSP,[
5150         TLNN T,%SWPGW   ;PAGE WAITS DON'T COUNT AS BLOCKING
5151          TLNN T,%SWOUT  ;IF SWAPPED-OUT, UNBLOCKING BUMPS SWAP-IN PRIORITY
5152           JRST SCHD5A
5153         MOVE TT,USWPRI(U)       ; (A SOMEWHAT QUESTIONABLE FEATURE)
5154         LSH TT,-1
5155         MOVEM TT,USWPRI(U)
5156 SCHD5A:
5157 ];SWPWSP
5158         TLNE T,%SWPCL
5159          JRST SCHED7            ;JUMP IF PAGES SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5160         TLNE T,%SWPGW
5161          SOS NPGWTU             ;NOT WAITING FOR A PAGE ANY MORE
5162         MOVSI T,%SWPGW+%SWRUN+%SWINT    ;NOT WAITING FOR PAGE,NOT UNBLOCKED SWAPOUT,
5163         ANDCAM T,USWST(U)       ;NOT WAITING FOR INTERRUPT PAGE
5164         SETZM FLSINS(U)         ;NOT WAITING FOR ANYTHING
5165         JRST SCHED1
5166
5167 SCHED7: PUSHJ P,PCLSR           ;PAGES WERE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5168          BUG                    ;SO PCLSR JOB SINCE IT MIGHT BE COUNTING ON THOSE PAGES
5169         JRST SCHED1             ;PCLSR MUST SUCCEED.  JOB WAS BLOCKED WITH EMPTY LSWPR.
5170
5171
5172 ;COME HERE TO RUN THE NULL JOB.
5173
5174 SCHDN2: SKIPL A         ;WERE RUNNING IT ALREADY?
5175          AOS NNULBK     ;NO, INCREMENT # CONSECUTIVE BLOCKS OF NULLTIME.
5176         MOVSI T,(JFCL)
5177         MOVEM T,CLUSAV  ;AVOID LOSSAGE AT CLKBRK+1 NEXT CLOCK INT
5178 IFE KA10P, MOVEM T,CLCXSV
5179 IFE KS10P,[     ; KS has no lights.
5180         SKIPN MIPGDS
5181          DATAO LIGHTS,[0] ;LOAD LIGHTS WITH JOB RUNNING (NONE)
5182 ] ;IFE KS10P
5183 IFN KA10P,[
5184         HRLOI T,1
5185         ANDCAM T,UPQUAN
5186 ] ;KA10P
5187 IFN KL10P,[
5188         CAMN U,MTRJOB
5189          WRPAE PAEON
5190         CAMN U,MTRJOB
5191          CONO MTR,2001  ;TIME-BASE ON, INTERVAL PIA=1
5192         REBOXC NULEBC
5193         RMBOXC NULMBC
5194         RPERFC NULPRF
5195 ] ;KL10P
5196 IFN KS10P, SETZM UPQUAN
5197         CLEARM SCHFLG   ;RESCHEDULE ON NEXT CLK INT
5198         LPMR UPGML
5199         JRST 12,@[%PSPCU,,NULJOB]       ;DISMISS INT AND GO TO NULL JOB
5200
5201 NULJOB: MOVSI (JRST 4,)
5202         MOVEI 17,1              ;SET ACS 0 TO 16 TO JRST 4,0
5203         BLT 17,16               ;TO CATCH SPURIOUS TRANFERS TO ACS
5204         MOVE 17,[AOJA 17]       ;RUNS IN ACS TO FREE MEMORY FOR OTHER PROCESSORS
5205         JRST 2,@[%PCUSR,,17]    ;RUNS IN USER MODE FOR SAKE OF RANDOMNESS
5206 \f
5207 IFE SWPWSP,[
5208 OVHMTR SC4      ;SCHEDULER 4 - UNSWAPBLOCKER
5209
5210 ;SEE IF THERE IS ENOUGH CORE TO UNBLOCK A SWAP-BLOCKED JOB.
5211 SSWC1:  SKIPGE U,BUSR
5212          POPJ P,
5213         MOVN T,NSWPGS(U)
5214         ADD T,MEMFR
5215         SUB T,NCBCOM
5216         ADD T,SOLNG
5217         SUB T,SILNG
5218         SUB T,AUSOPG
5219         ADD T,ASBUM
5220         ADD T,BUMPGS
5221         CAIGE T,20
5222          POPJ P,                ;THERE ISN'T ENOUGH ROOM.
5223         MOVSI T,400000
5224         ANDCAM T,USWSCD(U)      ;CLEAR SWAP BLOCKED
5225         SETOM BUSR
5226         MOVE T,[-1_-1]
5227         MOVEM D,BUSIZ   ;SIZE OF SMALLEST SWAP-BLOCKED USER.
5228         AOS NTSBUU
5229         SOSN NUSWB
5230          JRST SSWSC3
5231         MOVEI U,0
5232         MOVNI R,1
5233         MOVSI T,200000
5234 SSWSC4: CAML U,USRHI
5235          JRST SSWSC6
5236         SKIPGE USWSCD(U)
5237          SKIPN UNAME(U)
5238           JRST SSWSC5
5239         CAMGE T,NMPGS(U)
5240          JRST SSWSC5
5241         MOVE R,U
5242         MOVE T,NMPGS(U)
5243 SSWSC5: ADDI U,LUBLK
5244         JRST SSWSC4
5245
5246 SSWSC6: MOVEM R,BUSR    ;STORE NEW SMALLEST SWAPPED BLOCKED LOSER
5247         SKIPGE R
5248          MOVEI T,0
5249         MOVEM T,BUSIZ
5250 SSWSC3: JUMPL I,SEARL0  ;MAYBE CAN RUN THIS GUY NOW
5251         POPJ P,
5252 ];SWPWSP
5253 \f
5254 OVHMTR SWU      ;SWAP USER
5255
5256 ;SWAP OUT N PAGES (N IS IN SWPOPR)
5257 SWPON:  MOVE C,SOLNG
5258         SKIPGE CIRPSW           ;CAN'T DO ANYTHING WITHOUT CIRPSW
5259          CAILE C,2*NQS
5260           POPJ P,               ;ALREADY STUFF ON WAY OUT
5261         SKIPL U,PSWOUS          ;SEE IF CONTINUING TO SWAP OUT A USER
5262          CAML U,USRHI
5263           JRST SWPON1
5264         MOVE C,PSWCLS
5265         SKIPE LSWPR(U)          ;PREFER NOT TO SWAP OUT
5266          JRST SWPON1            ;USER WHO HAS SWITCHES LOCKED
5267         SKIPE UNAME(U)          ;SKIP ON USER KILLED
5268          SKIPL USWST(U) .SEE %SWDSO     ;OR NOT DESIRED OUT ANY MORE
5269 SWPON1:   PUSHJ P,SWPON2        ;FIND NEW USER TO FLUSH
5270         JUMPL U,SWUP8
5271 SWPON6: MOVSI A,%SWDSO          ;THIS USER NOW DESIRED OUT
5272         IORM A,USWST(U)
5273         MOVEM C,PSWCLS
5274         MOVEM U,PSWOUS
5275         MOVE T,UPC(U)
5276         TLNE T,%PCUSR
5277          JRST SWPU1             ;OK TO SWAP USER
5278         SKIPN LSWPR(U)          ;PCLSR IF HAS LOCKS, OR AT JBFLS,
5279          SKIPN FLSINS(U)        ;OR IF NOT BLOCKED
5280           JRST SWPON8
5281         MOVSI T,%SWPCL          ;OTHERWISE, DON'T PCLSR NOW, BUT
5282         IORM T,USWST(U)         ;WHEN IT UNBLOCKS
5283         JRST SWPU1              ;AND START SWAPPING OUT ITS PAGES
5284
5285 SWPON8: PUSHJ P,PCLSR           ;GET OUT OF SYS BEFORE SWAPPING OUT
5286          POPJ P,
5287         JRST SWPU1
5288
5289 ;FOUND NO USER TO SWAP OUT
5290 SWUP8:  SKIPE NLOOSP
5291          JRST SWOL1     ;SWAP OUT SOME LOOSE PAGES
5292         AOSE SBEFLG     ;HAVE WE COME HERE TWICE?
5293          JRST SWUP6     ;YES, GIVE UP
5294         MOVSI B,%SWBEM  ;NO, TURN OFF EVERYONE'S BEST EFFORT BIT
5295         MOVEI J,2*LUBLK ;AND LOOK AT EVERYONE AGAIN SINCE WE'RE DESPERATE
5296 SWUP9:  CAML J,USRHI    ;TO FIND A PAGE TO SWAP OUT
5297          JRST SWUP7
5298         ANDCAM B,USWST(J)
5299         ADDI J,LUBLK
5300         JRST SWUP9
5301
5302 SWUP7:  PUSHJ P,SWPON2          ;HAVING TURNED OFF %SWBEM, FIND A USER TO SWAP OUT
5303         JUMPG U,SWPON6          ;GO SOMEONE, GO DO
5304 SWUP6:  SETZM SWPOPR            ;CAN'T FIND ANYONE TO SWAP OUT, GIVE UP
5305         SETOM PSWOUS
5306         POPJ P,
5307
5308 SWOL1:  SKIPN A,FLOOSP          ;SWAP OUT SOME LOOSE PAGES
5309          BUG                    ;NLOOSP WAS TOO HIGH?
5310         MOVNI C,1
5311         PUSHJ P,SWPOPG
5312          BUG                    ;CIRPSW, EXEC PAGE COUNT ALREADY CHECKED
5313         SETOM SBEFLG            ;WE FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5314         MOVE C,SOLNG
5315         SOSLE SWPOPR            ;ENOUGH
5316          CAIL C,20.             ;ENOUGH FOR NOW
5317           POPJ P,
5318         SKIPE NLOOSP            ;SWAP OUT MORE PAGES
5319          JRST SWOL1
5320         JRST SWPON
5321 \f;START SWAPPING OUT THIS USER'S PAGES
5322 SWPU1:  AOS NSOUSR
5323         MOVSI A,%SWRUN
5324         CAILE C,1               ;CLASS
5325          IORM A,USWST(U)        ;INDICATE USER WAS RUNNABLE AT TIME OF SWAP OUT
5326 IFE SWPWSP,[
5327         SETZM SWUPC
5328         SKIPN ENUPC
5329          JRST SWPU1B
5330         MOVE T,UPC(U)           ;CALCULATE WHAT PAGE HIS PC IS ON
5331         LDB C,[121000,,UPC(U)]
5332         ROT C,-1
5333         ADDI C,UPGMP(U)
5334         MOVE A,[222200,,(C)]
5335         SKIPGE C
5336          IBP A
5337         LDB A,A
5338         TRNN A,600000
5339          SETZM A
5340         ANDI A,PMRCM            ;MASK TO REAL CORE ADR BITS
5341         SKIPN USTP(U)           ;ONLY IF RUNNING
5342          TLNN T,%PCUSR          ;AND IN USR MODE
5343           CAIA
5344            MOVEM A,SWUPC        ;THEN DON'T ALLOW UPC PAGE TO BE SWAPPED OUT
5345 SWPU1B:
5346 ];SWPWSP
5347         MOVE B,PSWLC
5348         AOSE PSWSFL
5349          JRST SWPU3A            ;PICK UP FROM WHERE LEFT OFF
5350 IFE SWPWSP,[
5351         SKIPE ENPZRO
5352          SETOM SWPP0F
5353 ];SWPWSP
5354         MOVEI C,UPGMP(U)        ;ADDRESS OF PAGE MAP (START FROM PG 0)
5355         MOVEI J,UPGCP(U)
5356         HRLI C,442200           ;CNVRT TO BYTE PNTR TO MAP
5357         HRLI J,442200
5358         MOVEM C,SWPMBP
5359         MOVEM J,SWPCBP
5360         LDB B,[121100,,HUSRAD(U)]       ;DO ALL PAGES THAT MIGHT EXIST
5361 SWPU2:  ILDB D,SWPCBP           ;CIRC PNTR ENTRY
5362         ILDB A,SWPMBP           ;PAGE MAP ENTRY
5363         AOS NSOPGS
5364         JUMPE D,SWPU3A          ;DOESN'T HAVE PAGE
5365 IFE SWPWSP,[
5366         AOSN SWPP0F
5367          SKIPE USTP(U)          ;DON'T SWAP OUT PAGE 0 IF NOT STOPPED
5368           CAIN D,-1             ;PAGE IS ABSOLUTE
5369            JRST SWPU3A
5370         TRNN A,600000           ;NO ACCESS
5371          JRST SWPU3A
5372         SKIPN ENAGE
5373          JRST SWPU2A
5374         TRON A,PMAGEM           ;HAS PAGE BEEN REFERENCED? (AGE MASK)
5375          JRST [ DPB A,SWPMBP
5376                 AOS NAGEAB
5377                 JRST SWPU3A ]
5378 SWPU2A: ANDI A,PMRCM            ;MASK TO REAL CORE PAGE #
5379         CAMN A,SWUPC            ;DON'T SWAP OUT PAGE WHERE PC IS IF RUNNING
5380          JRST SWPU3A
5381 ];SWPWSP
5382 IFN SWPWSP,[                    ;I DOUBT THAT MOST OF THAT NONSENSE DOES ANYTHING
5383         TRNE A,600000           ;NO ACCESS
5384          CAIN D,-1              ;OR PAGE IS ABSOLUTE
5385           JRST SWPU3A           ;MEANS DON'T SWAP OUT
5386         ANDI A,PMRCM            ;MASK TO REAL CORE PAGE #
5387 ];SWPWSP
5388         HRRZ D,MMSWP(A)         ;NUMBER OF USERS WHO HAVE THIS PAGE MAPPED
5389         SOJN D,SWPU4            ;PAGE IS SHARED
5390 SWPU6:  MOVEM B,PSWLC           ;SAVE HOW FAR SWAP-OUT SCAN GOT
5391         MOVE C,PSWOUS
5392         PUSHJ P,SWPOPG          ;SWAP OUT THIS PAGE
5393          JRST SWPU3
5394         SETOM SBEFLG            ;FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5395         MOVE C,SOLNG
5396         SOSLE SWPOPR            ;ENOUGH
5397          CAIL C,20.             ;ENOUGH FOR NOW
5398           POPJ P,
5399 SWPU3:  MOVE B,PSWLC
5400         MOVE U,PSWOUS
5401 SWPU3A: SOJG B,SWPU2
5402         SETOM PSWOUS
5403         MOVSI B,%SWBEM
5404         IORM B,USWST(U)         ;SET BEST EFFORT BIT
5405 IFN SWPWSP,[
5406         SKIPL APRC(U)           ;IF DISOWNED,
5407          JRST SWPON
5408         MOVE B,USWPRI(U)        ;DECREASE PRIORITY TO COME BACK IN
5409         LSH B,2
5410         MOVEM B,USWPRI(U)
5411 ];SWPWSP
5412         JRST SWPON
5413 \f;TRYING TO SWAP OUT A SHARED PAGE
5414 SWPU4:  MOVEM B,PSWLC           ;SAVE HOW FAR SWAP-OUT SCAN GOT
5415         AOSE CIRPSW
5416          BUG            ;CIRPSW LOCKED IN SWAP OUT CODE
5417         MOVE C,[2200,,MEMPNT(A)]
5418         MOVEM A,SWOBK
5419         PUSHJ P,UCPRL
5420             400000,,SWPU5       ;CONSULT THE OTHER USERS OF THE PAGE
5421         SETOM CIRPSW
5422         MOVE A,SWOBK
5423         JRST SWPU6      ;OK TO SWAP IT OUT
5424
5425 SWPU5:  SKIPGE TT,USWST(U) .SEE %SWDSO
5426          POPJ P,        ;USER DESIRED OUT, CAN'T HOLD PAGE IN
5427 IFN SWPWSP,     TLNN TT,%SWLOD  ;IF USER IS LOADING, HOLDS PAGE IN
5428          SKIPN AGERTE
5429           JRST SWPU5A
5430         MOVE TT,I
5431         LSH TT,-1
5432         ADDI TT,UPGMP(U)
5433         HRLI TT,2200
5434         TRNN I,1
5435          HRLI TT,222200
5436         LDB TT,TT
5437         TRNE TT,600000  ;SKIP IF NO ACCESS, IGNORE AGE
5438          TRNE TT,PMAGEM ;HAS SHE USED THIS PAGE?
5439           POPJ P,       ;NO, CAN'T HOLD PAGE IN
5440 SWPU5A: SUB P,[4,,4]
5441         SETOM CIRPSW    ;SHARED W/USER WHO IS WANTED IN CORE
5442         AOS NSHRAB      ;SO DON'T SWAP IT OUT
5443         JRST SWPU3
5444
5445 ;COME HERE WITH BEST USER TO SWAP OUT IN U, CLASS IN C
5446 SWPONX: JUMPL U,CPOPJ   ;NO SWAP OUTTABLE LOSER
5447 IFN SWPWSP,[
5448         CAILE C,1
5449          SKIPN NLOOSP
5450           JRST SWPNX2
5451         SETO U,         ;WOULD RATHER SWAP OUT LOOSE PAGES
5452         POPJ P,
5453
5454 SWPNX2: MOVSI T,%SWOUT  ;MAKE USER SWAPPED OUT
5455         TDNE T,USWST(U)
5456          JRST SWPNX3    ;ALREADY IS?
5457         IORM T,USWST(U)
5458         MOVE T,UWRKST(U)
5459         MOVEM T,USVWRK(U)
5460         MOVE T,TIME
5461         MOVEM T,USWTIM(U)       ;DROPS INTO SWPNX3
5462 ];SWPWSP
5463 IFE SWPWSP,[
5464         CAILE C,1
5465          SKIPN NLOOSP
5466           SKIPA B,USWST(U)
5467            JRST [ SETO U, ? POPJ P, ]   ;WOULD RATHER SWAP OUT LOOSE PAGES
5468         SKIPGE USWSCD(U)
5469          JRST SWPNX3    ;HE'S ALREADY SWAP BLOCKED
5470         TLNN B,%SWPGW   ;IS HE RUNNABLE?
5471          SKIPN FLSINS(U)
5472           SKIPE USTP(U)
5473            JRST SWPNX3
5474         MOVE B,NMPGS(U) ;HE'S RUNNABLE
5475         CAIGE B,TSYSM-SYSB-MEMSY1
5476          JRST SWPNX1    ;SMALL, NO THRASH
5477         SUB B,NSWPGS(U)
5478         ADD B,MEMFR
5479         SUB B,NCBCOM
5480         ADD B,SOLNG
5481         SUB B,SILNG
5482         SUB B,AUSOPG
5483         JUMPG B,SWPNX3  ;LET THIS GUY THRASH
5484 SWPNX1: SKIPN ENSWBK
5485          JRST SWPNX3
5486         MOVSI B,(SETZ)  ;SWAP BLOCK THIS LOSER
5487         IORM B,USWSCD(U)
5488         AOS NTUSB
5489         AOS NUSWB
5490         MOVE B,NMPGS(U) ;SMALLEST SWAP BLOCKED LOSER?
5491         CAML B,BUSIZ
5492          JRST SWPNX3
5493         MOVEM U,BUSR    ;YES
5494         MOVEM B,BUSIZ           ;DROP INTO SWPNX3
5495 ];SWPWSP
5496 ;HAVING DECIDED TO SWAP OUT JOB IN U, MAKE SWAP HISTORY TABLE ENTRY
5497 SWPNX3: MOVSI T,2_16.
5498 ;GENERAL SWAP HISTORY TABLE KEEPER.  ENTER WITH JOB IN U, EVENT IN T, BASHES TT,I,T
5499 SWPKHT: HRLZ TT,U
5500         IDIVI TT,LUBLK          ;TT 3.1-3.8 GETS JOB NUMBER, BASHES I
5501         IOR TT,T
5502         HRR TT,TIME
5503 IFN SWPWSP, HLRZ T,UWRKST(U)
5504 IFE SWPWSP,[
5505         MOVE T,NMPGS(U)
5506         SUB T,NSWPGS(U)
5507 ];SWPWSP
5508         SOSL T
5509          DPB T,[321000,,TT]
5510         MOVEM TT,@SWPHTP
5511         AOS T,SWPHTP
5512         MOVE TT,UTRNTM(U)
5513         MOVEM TT,SWPHTL-1(T)
5514         MOVEI TT,SWPHTB
5515         CAIL T,SWPHTB+SWPHTL
5516          MOVEM TT,SWPHTP
5517         POPJ P,
5518 \f
5519 OVHMTR SWF      ;SWAP FIND USER
5520
5521 ;FIND A USER TO SWAP OUT, RETURN IN U, -1 IF NONE
5522 SWPON2: SETOM PSWSFL    ;START FROM BEG OF USER
5523 IFE SWPWSP,[
5524         SKIPL U,PRVUSR
5525          PUSHJ P,CKPRUS ;MAKE SURE PRIV USER EXISTS AND HAS NOT BEEN BLOCKED FOR A LONG TIME
5526 ];SWPWSP
5527         MOVNI T,30.*60.
5528         ADD T,TIME      ;A MINUTE AGO
5529         MOVNI U,1
5530         MOVEI J,2*LUBLK
5531         MOVEI C,NSSCDC  ;# SWAP OUT CLASSES
5532 SWPON4: CAML J,USRHI    ;C HAS INDEX OF MAX CLASS INTERESTED IN
5533          JRST SWPONX    ;LOOKED AT ALL USERS, GO PONDER RESULTS
5534         SKIPE UNAME(J)  ;SEE IF FOR REAL
5535          SKIPN NMPGS(J) ;DON'T BOTHER IF HAS NO MEMORY
5536           JRST SWPON3
5537 IFN SWPWSP,[
5538         MOVE B,USWST(J)
5539         TLNE B,%SWBEM+%SWLOD    ;DON'T SWAP OUT IF BEST EFFORT ALREADY MADE, 
5540          JRST SWPON3    ; OR STILL LOADING IN
5541         MOVEI I,7
5542         MOVE TT,USWTIM(J)
5543         CAMLE TT,TIME   ;IF PROTECT TIME HASN'T ELAPSED YET, GETS HIGHER PRIORITY
5544          JRST SWPTK     ;TO PREVENT THRASHING
5545 ];SWPWSP
5546 IFE SWPWSP,[
5547         MOVE B,USWST(J)
5548         TLNE B,%SWBEM
5549          JRST SWPON3    ;BEST EFFORT ALREADY MADE
5550 ];SWPWSP
5551         SKIPE LSWPR(J)
5552          JRST SWPON7    ;PREFER NOT TO SWAP OUT LOSER WITH SWITCHES LOCKED
5553         MOVEI I,1
5554         TLNE B,%SWPGW
5555          JRST SWPON5    ;FLSINS IS WAITING FOR A PAGE (NOT REALLY BLOCKED)
5556         CAML T,LUBTM(J)
5557          SOJA I,SWPTK   ;BLOCKED FOR A LONG TIME (CLASS 0)
5558         SKIPN FLSINS(J)
5559 SWPON5:  SKIPE USTP(J)
5560           JRST SWPTK    ;CLASS 1 (BLOCKED)
5561 IFE SWPWSP,[
5562         TLNE B,%SWPRV
5563          JRST [ MOVEI I,7       ;CLASS 7 (PRIV USER)
5564                 JRST SWPTK ]
5565 ];SWPWSP
5566         JUMPL B,[AOJA I,SWPTK] .SEE %SWDSO      ;DESIRED OUT (CLASS 2)
5567         MOVEI I,4
5568         SKIPGE APRC(J)
5569          SOJA I,SWPTK   ;DISOWNED (CLASS 3)
5570 IFE SWPWSP,[
5571         SKIPGE USWSCD(J)
5572          JRST SWPTK     ;SWAP BLOCKED (CLASS 4)
5573 ];SWPWSP
5574         SKIPGE TTYTBL(J)
5575          AOJA I,SWPTK   ;DOESNT HAVE TTY (CLASS 5)
5576 SWPON7: MOVEI I,6       ;OTHERWISE....
5577
5578 SWPTK:  CAMGE C,I
5579          JRST SWPON3    ;THIS GUY IN MORE WINNING CLASS
5580 IFE SWPWSP,[
5581         MOVE A,NMPGS(J)
5582         SUB A,NSWPGS(J)
5583 ];SWPWSP
5584 .ELSE   MOVE A,UWRKST(J)
5585         CAME C,I
5586          JRST SWPTK2
5587         XCT SWPTT(C)    ;IN SAME CLASS, COMPARE CLASS-DEPENDENT PRIORITY MEASURES
5588          JRST SWPON3
5589 SWPTK2: MOVE E,@SWPTT(I)        ;MAKE THIS GUY BEST VICTIM
5590         MOVE C,I
5591         MOVE U,J
5592 SWPON3: ADDI J,LUBLK
5593         JRST SWPON4
5594 \f
5595 ;SKIP IF THIS GUY (J) IS BETTER LOSER TO FLUSH THAN PREV BEST (IN E)
5596 SWPTT:  CAMG E,LUBTM(J) ;BLOCKED FOR A LONG TIME (0) - LATER LUBTM WINS
5597         CAMG E,LUBTM(J) ;BLOCKED (1)                 - LATER LUBTM WINS
5598         CAML E,A        ;DESIRED OUT (2)             - SMALLER WORKING SET WINS
5599         CAML E,A        ;DISOWNED (3)                - SMALLER WORKING SET WINS
5600         CAML E,A        ;RUNNABLE, SWAP BLOCK SET (4) - SMALLER WORKING SET WINS
5601         CAML E,USWPRI(J)        ;RUNNABLE, W/O TTY (5) - GO BY PRIORITY
5602         CAML E,USWPRI(J)        ;OTHERWISE (6)       - GO BY PRIORITY
5603 IFE SWPWSP,     BUG             ;PRIVELEGED USER (7) - SHOULD ONLY BE ONE
5604 IFN SWPWSP,     CAMG E,USWTIM(J);PROTECTED (7)       - LATER UNPROTECT TIME WINS
5605 NSSCDC==.-SWPTT
5606
5607 IFE SWPWSP,[
5608 CKPRUS: MOVSI B,%SWPRV
5609         CAMGE U,USRHI
5610          ANDCAM B,USWST(U)      ;TURN OFF PRIV USER BIT
5611         MOVNI TT,30.*2
5612         ADD TT,TIME     ;TWO SECONDS AGO
5613         SKIPE UNAME(U)
5614          CAML TT,LUBTM(U)
5615           PUSHJ P,NPRVUSR
5616         SKIPG U,PRVUSR
5617          POPJ P,
5618         MOVSI B,%SWPRV
5619         IORM B,USWST(U)
5620         POPJ P,
5621 ];SWPWSP
5622 \f
5623 OVHMTR UUO      ;RANDOM UUOS
5624
5625 ;AC: A.9 =>1  SWAP OUT USER
5626 ;4.8 => 1 ALL PAGES
5627 ;4.7=1 => LOOP FOR A WHILE
5628 ;3.9-3.1 USER # SELF IF 0
5629 ;RH => USER VIRTUAL PG # 
5630 ;OR 4.9=0, 4.8=0, 4.7=0 SWAP OUT RH # OF PAGES
5631 ;IF 4.9=0, 4.8=1 AND 4.7=0, HACK PCLSR TEST FEATURE ON CURRENT USER
5632 ;RH =0 LEAVE PCLSR TEST MODE =1 ENTER IN ADVANCE MODE =-1 ENTER IN HOLD MODE
5633 ;   =2 ENTER IN ADVANCE BUT DON'T ^Z
5634
5635 ASWAP:  SKIPN SYSDBG
5636          JRST ILUUO
5637         UMOVE A,(J)
5638         TLNE A,100000
5639          JRST ASWAP3
5640         JUMPL A,ASWAP1
5641         TLNE A,200000
5642          JRST ASWPCL    ;PC LSR TEST MODE.
5643         HRRZM A,SWPOPR  ;CLOBBER CLOBBER
5644         POPJ P,
5645
5646 ASWAP1: HLRZ B,A
5647         ANDI B,777      .SEE MAXJ ;FIELD SHOULD BE BIG ENOUGH
5648         IMULI B,LUBLK
5649         SKIPE B
5650          MOVE U,B
5651         TLNN A,200000
5652          JRST ASWAP2
5653         MOVE D,NMPGS(U)
5654         SUB D,NSWPGS(U)
5655         JUMPL D,[JRST 4,.]
5656         JUMPE D,CPOPJ
5657         CONO PI,CLKOFF
5658         MOVEM U,PSWOUS
5659         SETOM PSWSFL
5660         ADDM D,SWPOPR
5661         MOVSI D,%SWDSO
5662         IORM D,USWST(U)
5663         CONO PI,CLKON
5664         POPJ P,
5665
5666 ASWAP2: PUSHJ P,CWAIT   ;RETURNS WITH CLKOFF AND CIRPSW AVAILABLE
5667             SKIPL CIRPSW
5668         HRRZS A         ;A HAS VIRTUAL PAGE #
5669         PUSHJ P,UPLC    ;RETURN POINTERS IN T AND Q
5670         LDB A,T         ;GET MAP ENTRY
5671         LDB C,Q         ;GET CIRC PNTR
5672         CAIE C,-1       ;DON'T SWAP OUT ABS PAGE
5673          TRNN A,600000
5674           POPJ P,       ;ALREADY OUT OR DOESN'T HAVE PAGE
5675         ANDI A,PMRCM    ;MASK TO REAL CORE PAGE #
5676         MOVNI C,1
5677         PUSHJ P,SWPOPG
5678          JFCL
5679         JRST CLKONJ
5680
5681 ASWAP3: MOVE B,[1250000.]
5682         SOJG B,.
5683         UMOVE A,2000
5684         JRST ASWAP3
5685
5686 ASWPCL: MOVEM U,PCLUSR
5687         CLEARM PCLL
5688         CLEARM PCLHSH
5689         SETOM PCLNXT
5690         HRRES A
5691         MOVEM A,PCLDBM
5692         POPJ P,
5693 \f
5694 ;.CALL PGWRIT
5695 ; ARG 1 - A <JOB>
5696 ; ARG 2 - PAGE NUMBER IN <JOB>'S ADDRESS SPACE
5697 ;IF ONLY ONE ARGUMENT IS GIVEN, IT IS ARG 2, AND ARG 1 DEFAULTS TO CURRENT USER
5698
5699 ;THE PAGE IS SWAPPED OUT.  THE CALL DOESN'T RETURN UNTIL THE SWAP IS COMPLETED.
5700 ; THIS ALLOWS USER TO BE SURE THAT THE COPY ON DISK IS UP TO DATE.
5701 ;CONTROL BIT 1.1 => RETURN IMMEDIATELY, NO WAITING.  TO WAIT LATER, JUST DO
5702 ; ANOTHER PGWRIT WITHOUT SETTING 1.1.
5703 ;CONTROL BIT 1.2 => UNLOCK PAGE.  IF YOU CALL THIS ON A LOCKED PAGE,
5704 ; WITHOUT SETTING BIT 1.2, THE PAGE WILL BE SWAPPED OUT, BUT THE NEXT
5705 ; TIME IT IS SWAPPED IN IT WILL BE LOCKED AGAIN.  THIS IS USEFUL FOR
5706 ; CONTROLLING EXACTLY WHEN A DATA BASE PAGE GETS WRITTEN TO DISK.
5707
5708 NPGWRT: CAIGE W,2
5709          JRST [ MOVE J,U ? JRST NPGWR1 ]
5710         MOVE J,A
5711         JSP T,NCORUI    ;DECODE THE JOB SPEC
5712          JRST NPGWR0
5713         JSP T,NCORWR    ;WHICH MUST BE WRITABLE
5714          JRST OPNL31
5715 NPGWR0:
5716 IFN PDP6P,[
5717         CAIN J,-1       
5718          JRST OPNL34    ;CAN'T HACK PDP6
5719 ];PDP6P
5720         MOVE A,B        ;NOTE: SWPOPG TAKES CARE OF THE PCLSR'ING
5721         PUSHJ P,NPGWR1  ;CALL MAIN ROUTINE
5722          POPJ P,        ;LOST, OPNL CLEARED LSWPR
5723         JRST LSWPJ1     ;WON, UNLOCK DIELOK
5724
5725 ;USER INDEX IN J, PAGE NUMBER IN A
5726 NPGWR1: TDNE A,[-1,,-400]
5727          JRST OPNL32    ;PAGE NUMBER NOT VALID
5728         PUSHJ P,CWAIT   ;DON'T ALLOW PAGE MAPS TO CHANGE, AND TURN CLK OFF
5729            SKIPL CIRPSW ;DON'T NEED UTCOFF BECAUSE UTC LEVEL CAN ONLY PUT PAGES INTO MAPS
5730         EXCH U,J
5731         PUSHJ P,UPLC
5732         EXCH U,J
5733         LDB D,Q         ;D GETS CIRC PNTR
5734         JUMPE D,OPNL32  ;NO PAGE THERE
5735         CAIN D,-1
5736          JRST OPNL12    ;ABSOLUTE PAGE
5737         PUSH P,U
5738         MOVE C,Q        ;STARTING FROM UPGCP, FIND MMP
5739         PUSHJ P,UCPRL
5740             200000,,.+2
5741          BUG            ;IF NONE FOUND
5742         SUB P,[4,,4]    ;FOUND MMP, C POINTS TO IT
5743         MOVSI T,MMPTMP  ;IF PAGE IS IN TRANSIT
5744         TDNE T,(C)
5745          JRST [ POP P,U
5746                 TDNE T,(C)      ;AWAIT COMPLETION
5747                  PUSHJ P,UFLS
5748                 JRST NPGWR1 ]   ;THEN TRY AGAIN
5749         MOVE E,C        ;SAVE ADDRESS OF MMP ENTRY
5750         PUSHJ P,UCPRL   ;SEE IF PAGE IS IN MEMORY
5751             100000,,NPGWR3
5752         POP P,U         ;NOT SWAPPED IN, BYPASS SWAP-OUT CODE
5753         JRST NPGWR2
5754
5755 NPGWR3: SUB P,[4,,4]    ;IT'S SWAPPED-IN TO CORE PAGE IN T
5756         POP P,U
5757         HLRZ D,MMSWP(T)
5758         JUMPN D,OPNL12  ;POINTED TO BY AN EXEC PAGE, E.G. 340, SHOULDN'T MESS.
5759         PUSH P,A        ;SAVE USER'S VIRTUAL PAGE #
5760         PUSH P,J        ;SAVE WHAT JOB THAT IS
5761         PUSH P,E        ;SAVE ADDRESS OF MMP ENTRY
5762         MOVE A,T        ;PHYSICAL PAGE # TO SWAP OUT
5763         MOVE C,USER     ;DON'T PCLSR ME
5764         PUSHJ P,SWPOPL  ;SWAP OUT, EVEN IF LOCKED
5765          JRST NPGWR4    ;NO DISK SPACE, OR SOME JOB NOT PCLSRABLE
5766         POP P,E
5767         POP P,J
5768         POP P,A
5769 NPGWR2: MOVE T,CTLBTS(U)
5770         MOVSI D,MMPLOK
5771         TRNE T,2        ;CONTROL BIT 1.2 UNLOCKS
5772          ANDCAM D,(E)
5773         TRNE T,1        ;CONTROL BIT 1.1 INHIBITS WAITING FOR SWAP TO FINISH.
5774          JRST CLKOJ1
5775         MOVSI T,MMPTMP  ;PAGE IN TRANSIT BIT
5776         TDNE T,(E)      ;WAIT FOR BIT TO TURN OFF
5777          PUSHJ P,UFLS
5778         JRST CLKOJ1
5779
5780 ;COULDN'T SWAP OUT, WAIT A WHILE AND TRY AGAIN
5781 NPGWR4: PUSHJ P,UDELAY  ;UDELAY TURNS CLKON
5782         POP P,E
5783         POP P,J
5784         POP P,A
5785         JRST NPGWR1
5786 \f
5787 EBLK
5788
5789 ;SWAP IN RQ BLOCKS
5790 SWIRQB:
5791 IFN 340P\E.SP,  DISSWI: -1      ;USER
5792 IFN VIDP,       VIDSWI: -1
5793 IFN IMXP,       POTSWI: -1
5794 IFN NSWPV-.+SWIRQB,.ERR NSWPV ERR
5795
5796 SWIVPN:
5797 IFN 340P\E.SP,  DISSPG: 0       ;VIRTUAL PAGE NUMBER
5798 IFN VIDP,       VIDSPG: 0
5799 IFN IMXP,       POTSPG: 0
5800
5801 SWPNTB:         ;SIGNAL BITS IN LH OF W TO CFHSW1
5802 IFN 340P\E.SP,  400000  ;DISPLAY
5803 IFN VIDP,       400000  ;VID
5804 IFN IMXP,       400000  ;POTS
5805
5806 SWILMT:         ;PIRQC BIT TO SET ON ILM
5807 IFN 340P\E.SP,  %PIDIS
5808 IFN VIDP,       %PIMPV
5809 IFN IMXP,       %PIMPV
5810
5811 PSWOUS: -1      ;INDEX OF PARTIALLY SWAPPED OUT USER
5812 PSWCLS: 0       ;CLASS OF PARTIALLY SWAPPED OUT USER
5813 PSWSFL: 0       ;-1 START FROM BEG OF USER, ELSE PICK UP WHERE LEFT OFF
5814 SWPMBP: 0       ;PNTR TO MAP
5815 SWPCBP: 0       ;PNTR TO CIRC DESC SPACE
5816 PSWLC:  0       ;LOOP COUNT
5817 SBEFLG: -1      ;0 => ALREADY ONCE WANTED TO CLEAR ALL "BEST EFFORT" BITS.
5818 SWPOPR: 0       ;NUMBER OF PAGES DESIRED TO BE SWAPPED OUT
5819 SWPOPB: 0       ;SWAP OUT REQUEST BUT ONLY SWAP OUT NON-RUNNING USERS TO MEET (UNUSED?)
5820 SILNG:  0       ;TOTAL LENGTH OF SWAP IN LISTS
5821 SOLNG:  0       ;TOTAL LENGTH OF SWAP OUT LISTS
5822                 ;SINLST AND SOUTLS ARE IN DISK CODE.  VARIATION ON QBFP.
5823 SWODSK: NQS-1   ;UNIT TO SWAP OUT ON NEXT
5824 SWOBK:  0       ;MEMBLT BEING SWAPPED OUT
5825 SWOMMP: 0       ;MMP ADDRESS (NOT INDEX)
5826 SPGNMF: 0       ;-1 => PAGE NOT MODIFIED
5827 CFHAS:  0       ;TEMP FOR A AT CFH
5828 SWPIQS: 0       ;SAVE Q AT SWPPIN
5829 CFHUVP: 0       ;USER'S VIRTUAL PAGE NUMBER TOOK FAULT ON
5830 LUMPS:  0       ;UMAPS USED FOR CURRENT USER, MAY DIFFER FROM
5831                 ;UMAPS(U) IF TOOK FAULT TRYING TO CAUSE INTERRUPT
5832 TRUMM:  0       ;TOTAL USER MEM ACTIVE USERS
5833 NPGSWO: 0       ;NUMBER OF CURRENTLY SWAPPED OUT PAGES
5834 AUSOPG: 0       ;ACTIVE USER SWAPPED OUT PAGES
5835 BUMPGS: 0       ;REAL CORE PAGES OCC BY BLOCKED + STOPPED LOSERS
5836 NUSWB:  0       ;# LOSERS SWAP BLOCKED
5837 SWPOPU: 0       ;USER PG "BELONGS" TO (IE NOT NECC TO PCLSR THIS GUY,
5838                         ;BUT PCLSR ANYONE ELSE LINKED TO PG.)
5839 AGEREQ: 0       ;NUMBER OF PAGES BEING AGED AT SLOW CLOCK
5840 AGEPOS: 0       ;LAST PAGE # AGED
5841
5842 IFE SWPWSP,[
5843 PRVUSR: -1      ;PRIV USR
5844 PRVCUT: 1500    ;CUT OFF FOR PRIV USR
5845 SWUPC:  0       ;ABSOLUTE PAGE NUMBER OF USER MODE PC DURNING SWAP OUT
5846 SWPP0F: -1      ;-1 IF CONSIDERING PAGE 0
5847 ASBUM:  0       ;REAL MEM OCC BY ACTIVE "SWAPPED BLOCKED" LOSERS
5848 SWSCT1: 0       ;TEM AT SWSCD
5849 BUSR:   0       ;INDEX OF SMALLEST SWAP BLOCKED LOSER
5850 BUSIZ:  0       ;SIZE OF BUSR
5851 ];SWPWSP
5852
5853 IFN PAGPRE,[
5854 PREEMP: 0       ;IF NON-ZERO, A PRE-EMPT IS IN PROGRESS (WHEN WE NEXT GET TO CLK LVL)
5855 NPREEL: 0       ;NUMBER OF LOOPS AT SCHEDP (ATTEMPTED PREEMPTS)
5856 NPREEM: 0       ;NUMBER OF SUCCESSFULL PREEMPTS
5857 NPREE1: 0       ;NUMBER OF TIMES A PAGE CAME IN AND WE STARTED TO THINK ABOUT PREEMPTION
5858 NPREE2: 0       ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE OF CLKOFF OR IN PROGRESS
5859 NPREE3: 0       ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE FLSINS WAS WRONG
5860 ];PAGPRE
5861
5862 ;COUNTS OF REASONS FOR ENTRY TO SCHED
5863 ;THESE METERS MAY BE TEMPORARY - SOME OF THEM ARE REDUNDANT
5864 ;REASONS NOT COUNTED - VARIOUS PARITY, NXM, AND OTHER ERROR CASES
5865 NLPPRE: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PREEMPT
5866 NLPCLK: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO CLOCK
5867 NLPUFL: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO UFLS
5868 NLPPAG: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE-IN
5869 NLPPGT: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND TUT LOCKED
5870 NLPPGC: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CIRPSW LOCKED
5871 NLPPGM: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND MEMFRZ LOCKED
5872 NLPPG3: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CALLED CFHPO3 (NO MEM)
5873 NLPPGB: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND SWAP-BLOCKED
5874 NPPIUM: 0       ;NUMBER OF TIMES PAGE PUT INTO BUNCHA USERS' MAPS
5875 NPPIU1: 0       ;NUMBER OF USERS PAGES PUT INTO MAPS OF  (RATIO OF THESE 2 IS SHARING)
5876
5877 IFN SWPWSP,[
5878 LODQNT:         ;RUN TIME IN 4-USEC UNITS BETWEEN PG FAULTS TO LEAVE
5879                 ;LOADING STATE 
5880  IFN KL10P, 3000.  ;12 MS
5881  IFN KA10P, 9000.  ;36 MS
5882  IFN KS10P, 3000.       .ERR Guessed LODQNT on KS10?
5883 LODFCT: 3,,0    ;MULTIPLY LOADING TIME BY THIS TO GET PROTECT TIME (INT,,FRAC)
5884 NUPTAW: 0 .SEE SWOP6 ;NUMBER OF USERS PAGE TAKEN AWAY FROM
5885
5886 ;METERS
5887
5888 NPLBLJ: 0       ;NUMBER OF PAGE LOADS BY LOADING JOBS
5889 NPLBNL: 0       ;NUMBER OF PAGE LOADS BY NON-LOADING JOBS
5890
5891 ;Still to be done
5892 ;       1-, 5-, 15- minute average population of each state,
5893 ;               also avg of NPGWTU and RNABLU (for load avg)
5894 ;       avg of core occupied by jobs in each state,
5895 ;               i.e. UWRKST for load, pro, sw in.
5896 ;       Relationship of sum of UWRKST's of loading and swapped in
5897 ;               versus total core occupied by user pages.
5898 ;       Average time spent in each state before moving on,
5899 ;               versus size of job.  Maybe cpu time as well as
5900 ;               real time?
5901
5902 ];SWPWSP
5903 BBLK
5904
5905 \f
5906 OVHMTR SWP      ;SWAP PAGE
5907
5908 ;SWAP OUT PAGE WHOSE MEMBLT INDEX IS IN A
5909 ;SKIP IF SUCCESSFUL
5910 ;C IS USER WHO DOESN'T NEED TO BE PCLSRED BEFORE HIS PAGES CAN BE SWAPPED.
5911 SWPOPL: TDZA B,B        ;THIS ENTRY IGNORES LOCK BIT
5912 SWPOPG:  MOVSI B,MMPLOK ;THIS ENTRY RESPECTS LOCK BIT
5913         MOVEM C,SWPOPU
5914         MOVEM A,SWOBK
5915         CAIGE A,TSYSM
5916          CAIGE A,SYSB
5917           BUG           ;DON'T SWAP OUT PART OF SYSTEM
5918         AOSE CIRPSW
5919          POPJ P,
5920         LDB C,[MMMPX,,MEMBLT(A)]
5921         ADDI C,MMP
5922         HRRZM C,SWOMMP  ;STORE ADDRESS OF FIRST WORD OF MMP ENTRY
5923         TDNE B,(C) .SEE MMPLOK  ;LOCKED IN CORE?
5924          JRST [ CAIGE A,256.    ;IF SO, DON'T SWAP OUT UNLESS IN "LOW" MEMORY
5925                  CAIGE A,LIOBLK ;IN WHICH CASE MUST GO OUT TO AVOID SYSTEM DEADLOCK
5926                   JRST SCRPSJ   ;SEE CODE AT CIMEMR
5927                 CAIGE A,128.
5928                  JRST .+1
5929                 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES
5930                  SKIPN USEMDM
5931                   JRST SCRPSJ
5932                 JRST .+1 ]
5933         SOS CIRPSW      ;RELEASE SWITCH
5934         HLRZ B,1(C)
5935         JUMPN B,SWOP1   ;JUMP IF DISK SPACE ALREADY ASSIGNED
5936 SWODF3: MOVSI B,-NQS
5937 SWODF6: AOS I,SWODSK
5938         CAIL I,NQS
5939          SUBI I,NQS     ;WRAP AROUND
5940         MOVEM I,SWODSK  ;CURRENT SWAPPING DSK
5941         CONO PI,UTCOFF-1        ;DON'T CHANGE STATE OF CLOCK CHNL.
5942         SKIPGE QTUTO(I) ;TUT LOCKED
5943          JRST SWODF7
5944         SKIPL QACT(I)
5945         SKIPG QSFTS(I)  ;DSK FULL IN SWAPPING AREA
5946          JRST SWODF7
5947         MOVSI A,(SETZ)
5948         IORM A,QTUTO(I)
5949         CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL.
5950         MOVEI A,NQCHN+1(I)      ;QMFTP(A) CONTAINS TRACK TO START FROM
5951         PUSHJ P,QGTK4   ; RETURNS TRACK IN D
5952         SOS QSFTS(I)
5953 SWODF5: MOVSI A,(SETZ)
5954         ANDCAM A,QTUTO(I)
5955         MOVE A,SWOMMP
5956         HRLM D,1(A)             ;STORE DISK ADDRESS IN MMP ENTRY        
5957         DPB I,[$MMPUN,,(A)]
5958         JRST SWOP1
5959
5960 SWODF7: AOBJN B,SWODF6  ;TRY NEXT DSK FOR SWAPPING AREA
5961         CONO PI,UTCON-1 ;NON FOUND FIND FILE SPACE
5962         MOVNI D,1
5963         MOVNI I,1
5964         MOVSI E,-NQS
5965 SWODF2: SKIPL QTUTO(E)  ;FIND WHICH DISK HAS MOST FREE SPACE
5966         SKIPGE QACT(E)
5967          JRST SWODF4
5968         CAMGE D,QSFT(E)
5969          HRRZ I,E
5970         CAMGE D,QSFT(E)
5971          MOVE D,QSFT(E)
5972 SWODF4: AOBJN E,SWODF2
5973         JUMPL I,CPOPJ   ;NO DSK SPACE AVAIL
5974         HRRZM I,SWODSK  ;LAST DSK HACKED
5975         JUMPLE D,CPOPJ  ; NO ROOM ANYWHERE
5976         CONO PI,UTCOFF-1
5977         SKIPGE QTUTO(I)
5978          JRST UTCNJ     ;TUT LOCKED
5979         MOVSI A,(SETZ)
5980         IORM A,QTUTO(I)
5981         CONO PI,UTCON-1
5982         MOVEI D,NBLKS/2 ;STARTING POINT
5983         MOVEI A,NQCHN+1(I) ;DISK CHANNEL
5984         MOVEM D,QMFTP(A)
5985         PUSHJ P,QGTK4   ;RETURNS TRACK IN D
5986         MOVEI E,NUDSL
5987         MOVEM E,QMFTP(A);DON'T LEAVE SWAPPING CHNL POINTING INTO FILE SPACE
5988         SOS QSFT(I)
5989         JRST SWODF5
5990
5991 SCRPSJ: SETOM CIRPSW
5992         POPJ P,
5993 \f
5994 SWOP1:  AOSE CIRPSW
5995          POPJ P,
5996         AOS NPGSO
5997
5998 ;COME HERE FROM SWPOPG AND MMPRTN TO SWAP OUT A PAGE.
5999 ;CLOCK OFF OR IN PROGRESS AND ARGUMENTS IN SWOBK AND SWOMMP.
6000 ;PUTS BLOCK ON SWAPOUT LIST IF DISK COPY NEEDS TO BE UPDATED, ELSE
6001 ;JUST DELETES MEMORY.  IF NO USERS ARE USING THE PAGE,
6002 ;RETURNS THE MMP ENTRY OR ARRANGES FOR THE DISK ROUTINES TO.
6003
6004 SWOP1A: CONO PI,UTCOFF-1        ;DON'T CHANGE STATE OF CLOCK CHNL.
6005         MOVE A,SWOBK            ;CORE BLOCK # CONTAINING PAGE TO BE SWAPPED OUT
6006         HLRZ C,MMSWP(A)         ;NUMBER OF EXEC PAGES POINTING TO THIS PAGE
6007         JUMPN C,SWOP5           ;POINTED TO BY EXEC PAGE, CAN'T SWAP OUT
6008 IFN 340P,[
6009         MOVSI C,-N340PB-2
6010 SWOPT2: LDB I,DPEP(C)
6011         TRZN I,600000
6012          JRST SWOPT1
6013         ANDI I,PMRCM    ;MASK TO REAL CORE PAGE #
6014         CAIN I,(A)
6015          BUG            ;DISPLAY STILL SET UP TO PAGE BEING SWAPPED OUT
6016 SWOPT1: AOBJN C,SWOPT2
6017 ]
6018         MOVSI C,MMPPGA
6019         ANDCAM C,@SWOMMP
6020         MOVSI C,(SETZ)
6021         IORM C,MEMBLT(A)        ;PREVENT NEW EXEC PAGES FROM BEING SET UP POINTING HERE
6022         CONO PI,UTCON-1
6023         MOVE C,[2200,,MEMPNT]
6024         ADD C,SWOBK
6025         SETOB B,SPGNMF  ;INITIALIZE PAGE NOT MODIFIED FLAG, AND COUNT USERS IN B
6026 IFN SWPWSP,[
6027         LDB I,C
6028         PUSH P,I
6029         SETZM NUPTAW
6030         MOVSI D,-1      ;COMPUTE WORKING SET CONTRIBUTION TO BE TAKEN AWAY
6031         IDIV D,MMSWP(A) ;LH(MMSWP) KNOWN TO BE ZERO!
6032         PUSHJ P,UCPRL   ;CHECK ALL USERS, TAKE PAGE AWAY FROM SOME
6033             400000,,SWOP6       ;ALSO COUNTS USERS IN B
6034         POP P,I
6035         AOJE B,SWOP7    ;JUMP IF NO USERS USING PAGE, RETURN MMP ENTRY
6036         CAMN B,NUPTAW   ;ANY USERS STILL MAPPED TO PAGE?
6037          JRST SWOP8     ;NO, GO SWAP IT OUT
6038         MOVSI D,1       ;YES, COMPUTE WORKING SET ADJUSTMENT
6039         IDIV D,MMSWP(A) ;TO BE ADDED BACK IN TO THEM
6040         PUSHJ P,UCPRL   ;GO BACK AND FIX WORKING SETS
6041             400000,,SWOP6B
6042         JRST SWOP6E     ;ABORT SWAP OUT
6043 ];SWPWSP
6044 IFE SWPWSP,[
6045         LDB I,C
6046         PUSH P,I        ;NOTE: CAN BACK OUT OF THIS PUSH AT SWOP2B
6047         PUSHJ P,UCPRL
6048             400000,,SWOP2       ;RETURN ON USERS (CAN BACK OUT AT SWOP2B)
6049         POP P,I
6050         JUMPGE B,SWOP8
6051 ];SWPWSP
6052 SWOP7:  MOVSI B,MMPGON  ;NO USERS USING PAGE, SO MMP ENTRY WILL BE RETURNED
6053         IORM B,@SWOMMP  ;FLAG THAT MMP ENTRY WILL SOON GO AWAY
6054         MOVEI A,0       ;REMOVE FROM LOOSE PAGE LIST
6055         MOVE T,FLOOSP
6056 SWOP7A: MOVE B,A        ;B PREDECESSOR
6057         SKIPN A,T       ;T SUCCESSOR
6058          BUG            ;NOT IN LIST?
6059         LDB T,[MLO,,MEMBLT(A)]
6060         CAME A,SWOBK
6061          JRST SWOP7A
6062         SKIPE B         ;FOUND, PATCH OUT OF LIST
6063          DPB T,[MLO,,MEMBLT(B)]
6064         SKIPN B
6065          MOVEM T,FLOOSP
6066         SKIPN T
6067          MOVEM B,LLOOSP
6068         SOSL NLOOSP
6069          JRST SWOP8
6070         BUG             ;NLOOSP TOO LOW.
6071 \f
6072 IFN SWPWSP,[
6073
6074 ;THIS UCPRL ROUTINE SCANS ALL USERS, COUNTS THEM IN B,
6075 ;USES D TO ADJUST WORKING SETS OF USERS WHICH ARE MAPPED TO
6076 ;THE PAGE, AND TAKES THE PAGE AWAY FROM ANY USERS IT CAN,
6077 ;COUNTING THEM IN NUPTAW.
6078 SWOP6:  AOS B           ;COUNT USERS OF THIS PAGE
6079         CAIG U,LUBLK
6080          BUG            ;SYS JOB OR CORE JOB?
6081         PUSH P,I
6082         MOVEI C,UPGMP(U)        ;MAKE C POINT TO UPGMP ENTRY (PTW)
6083         ROT I,-1
6084         ADDI C,(I)
6085         HRLI C,222200
6086         SKIPGE I
6087          HRLI C,2200
6088         LDB I,C
6089         SKIPN I
6090          BUG            ;NO ACCESS?
6091         TRNE I,600000
6092          ADDM D,UWRKST(U)       ;IS MAPPED TO PAGE, ADJUST WORKING SET
6093         CAMN U,SWPOPU
6094          JRST SWOP6A    ;DON'T CONSIDER PCLSRING SWPOPU
6095         MOVE T,UPC(U)
6096         TLNE T,%PCUSR
6097          JRST SWOP6A
6098         SKIPN LSWPR(U)  ;PCLSR IF HAS SWITCHES LOCKED
6099          SKIPN FLSINS(U)
6100           JRST SWOP6D
6101         MOVSI T,%SWPCL  ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6102         IORM T,USWST(U)
6103         JRST SWOP6A
6104
6105 SWOP6D: PUSH P,D
6106         PUSH P,C
6107         PUSH P,I
6108         PUSHJ P,PCLSR   ;BETTER NOT CLOBBER U OR H OR A
6109          JRST [ SUB P,[2,,2]
6110                 POP P,D
6111                 JRST SWOP6C ]
6112         POP P,I
6113         POP P,C
6114         POP P,D
6115 ;WHEN WE GET HERE, THIS JOB CAN'T HOLD THIS PAGE IN
6116 SWOP6A: TRNN I,600000
6117          JRST SWOP6C    ;NOT SET UP SINCE PREV SWAPPED OUT
6118         AOS NUPTAW      ;TAKE IT AWAY
6119         LSH I,-16.      ;SAVE ACCESS MODE IN LOW ADR BITS
6120         CAILE I,2       ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6121          CLEARM SPGNMF  ;PAGE HAS BEEN MODIFIED
6122         CAIN I,2        ;FLUSH R.W.F.
6123          MOVEI I,3
6124         DPB I,C         ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6125         AOS NSWPGS(U)   ;INCR COUNT OF SWAPPED OUT PGS OF USER
6126         AOS SNSWPG      ;INCR CNT OF SWAPPED OUT FOR SYS
6127         SOS MMSWP(A)    ;DECR COUNT OF PAGE SHARERS
6128 IFN E.SP,[
6129         CAMN U,DISUSR   ;IF USER OF E&S
6130          PUSHJ P,E.SLPM ;LOAD ITS MAP
6131 ]
6132 SWOP6C: POP P,I
6133         POPJ P,
6134
6135 SWOP6F: CAMN U,-4(P)            ;DON'T LOOK AT USER TAKING PAGE AWAY FROM
6136          POPJ P,                ;ELSE DROP INTO SWOP6B
6137 ;THIS UCPRL ROUTINE ADJUSTS WORKING SETS OF JOBS THAT
6138 ;ARE MAPPED TO THE PAGE USING D.
6139 SWOP6B: PUSH P,I
6140         MOVEI C,UPGMP(U)        ;MAKE C POINT TO UPGMP ENTRY (PTW)
6141         ROT I,-1
6142         ADDI C,(I)
6143         HRLI C,222200
6144         SKIPGE I
6145          HRLI C,2200
6146         LDB I,C
6147         SKIPN I
6148          BUG                    ;NO ACCESS?
6149         TRNE I,600000
6150          ADDM D,UWRKST(U)       ;IS MAPPED TO PAGE, ADJUST WORKING SET
6151         POP P,I
6152         POPJ P,
6153 ];SWPWSP
6154 \f
6155 IFE SWPWSP,[
6156 ;COME HERE VIA UCPRL FOR ALL USERS OF PAGE BEING SWAPPED OUT
6157
6158 SWOP2:  AOS B   ;COUNT USERS OF THIS PAGE
6159         CAIG U,LUBLK
6160          BUG            ;SYS JOB OR CORE JOB?
6161         PUSH P,I
6162         CAMN U,SWPOPU
6163          JRST SWOP2A
6164         MOVE T,UPC(U)
6165         TLNE T,%PCUSR
6166          JRST SWOP2A
6167         SKIPN LSWPR(U)  ;PCLSR IF HAS SWITCHES LOCKED
6168          SKIPN FLSINS(U)
6169           JRST SWOP2D
6170         MOVSI T,%SWPCL  ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6171         IORM T,USWST(U)
6172         JRST SWOP2A
6173
6174 SWOP2D: PUSHJ P,PCLSR
6175          JRST SWOP2B
6176 SWOP2A: MOVEI C,UPGMP(U)
6177         ROT I,-1
6178         ADDI C,(I)
6179         HRLI C,222200
6180         SKIPGE I
6181          HRLI C,2200
6182         LDB I,C
6183         SKIPN I
6184          BUG            ;NO ACCESS?
6185         TRNN I,600000
6186          JRST SWOP2C    ;NOT SET UP SINCE PREV SWAPPED OUT
6187         LSH I,-16.      ;SAVE ACCESS MODE IN LOW ADR BITS
6188         CAILE I,2       ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6189          CLEARM SPGNMF  ;PAGE HAS BEEN MODIFIED
6190         CAIN I,2        ;FLUSH R.W.F.
6191          MOVEI I,3
6192         DPB I,C         ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6193         AOS NSWPGS(U)   ;INCR COUNT OF SWAPPED OUT PGS OF USER
6194         AOS SNSWPG      ;INCR CNT OF SWAPPED OUT FOR SYS
6195         MOVE I,SWOBK
6196         SOS MMSWP(I)    ;KEEP ACCURATE COUNT OF UPGMP'S POINTING AT THIS PAGE
6197 IFN E.SP,[
6198         CAMN U,DISUSR   ;IF USER OF E&S
6199          PUSHJ P,E.SLPM ;LOAD ITS MAP
6200 ]
6201 SWOP2C: POP P,I
6202         POPJ P,
6203
6204 SWOP2B: SUB P,[6,,6]    ;2 PUSHES OF I AND 4 FOR UCPRL
6205 ];SWPWSP
6206 SWOP6E: MOVE A,SWOBK    ;ABORT SWAP-OUT
6207         MOVSI I,(SETZ)
6208         ANDCAM I,MEMBLT(A)
6209         SOS CIRPSW
6210         POPJ P,
6211
6212 SWOP8:  DPB I,C         ;DELINK MEMPNT
6213         MOVEI I,3 .SEE MMPOUT .SEE MMPTMP
6214         DPB I,[410200,,@SWOMMP] ;INDICATE ON THE WAY OUT
6215         MOVSI I,MMPBAD
6216         ANDCAM I,@SWOMMP
6217         MOVE A,SWOBK
6218         MOVSI B,(SETZ)
6219         CONO PI,UTCOFF-1
6220         ANDCAM B,MEMBLT(A)
6221         MOVE C,@SWOMMP
6222         TLNN C,MMPGON   ;UNLESS PAGE WILL BE FORGOTTEN AFTER SWAP OUT,
6223          AOS NPGSWO     ; KEEP COUNT OF PAGES CURRENTLY SWAPPED OUT
6224         TLNE C,MMPWRT   ;IF WAS WRITTEN BY USER WHO LATER DELETED IT,
6225          JRST SWOP3
6226         SKIPGE SPGNMF   ;OR IF PAGE MODIFIED,
6227          TLNN C,MMPWOD
6228           JRST SWOP3    ;OR IF HASN'T BEEN WRITTEN TO DISK, MUST WRITE OUT.
6229         MOVEI I,2       ;NO NEED TO WRITE OUT.  INDICATE OUT.
6230         DPB I,[410200,,@SWOMMP]
6231         PUSHJ P,IMEMR   ;RETURN THE MEMORY
6232         MOVE A,SWOMMP
6233         TLNE C,MMPGON
6234          PUSHJ P,RETMMP ;ALSO RETURN THE MMP ENTRY IF NECESSARY
6235         JRST SWOP4
6236 \f
6237 SWOP5:  SOS CIRPSW
6238 UTCNJ:  CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL
6239         POPJ P,
6240
6241 SWOP3:  CAIGE A,TSYSM           ;HAVE TO WRITE THIS PAGE OUT
6242         CAIGE A,SYSB
6243          BUG
6244         HRRZ B,SWOMMP
6245         LDB I,[$MMPUN,,(B)]
6246         CAIL I,NQS
6247          BUG                    ;DISK NUMBER NOT LEGITIMATE
6248         MOVEI C,.BM MLO
6249         ANDCAM C,MEMBLT(A)      ;SET END OF LIST IN THIS BLOCK
6250         HLRZ C,SOUTLS(I)        ;GET PREV BLOCK
6251         SKIPE C
6252          DPB A,[MLO,,MEMBLT(C)] ;CHAIN TO PREV BLOCK
6253         SKIPN C
6254          MOVEM A,SOUTLS(I)      ;OR TO HEADER IF FIRST
6255         HRLM A,SOUTLS(I)        ;AND SET NEW LAST BLOCK
6256         AOS SOLNG
6257         HLRZ C,1(B)
6258         HRLM C,MEMPNT(A)        ;STORE DISK ADDRESS
6259         MOVEI B,MUSWPG
6260         DPB B,[MUR,,MEMBLT(A)]
6261         PUSHJ P,QSTRT1
6262 SWOP4:  SOS CIRPSW
6263 UTCNJ1: CONO PI,UTCON-1
6264         JRST POPJ1
6265
6266 IFN NSWPV,[
6267 SWPPIN: MOVSI Q,-NSWPV          ;# OF DEVICES THAT CAN SWAP IN PAGES
6268 SWPPI4: SKIPGE W,SWIRQB(Q)      ;USER INDEX
6269          JRST SWPPI6
6270         MOVE E,SWIVPN(Q)        ;VIRTUAL PAGE NUMBER
6271         HRL W,SWPNTB(Q)
6272         CLEARB TT,D
6273         MOVEM Q,SWPIQS
6274         PUSHJ P,CFHSW1
6275         MOVE Q,SWPIQS
6276         SETOM SWIRQB(Q)
6277 SWPPI6: AOBJN Q,SWPPI4
6278         POPJ P,
6279 ]
6280
6281 SWIILM:
6282 IFN E.SP,[
6283         TRNN Q,-1       ; IS DEVICE DIS? (E&S IS INDEX 0 IN SWIRQB)
6284          SETZM E.SPGW   ; IF SO, CLEAR PAGE WAIT.
6285 ]
6286         SKIPGE E,SWILMT(Q)
6287          BUG
6288         IORM E,PIRQC(W)
6289         MOVEI A,0
6290         POPJ P,
6291 \f
6292 SUBTTL LOAD USER PAGE MAP
6293
6294 OVHMTR UUO      ;RANDOM UUOS (WELL, SOME MINOR SCHED STUFF, TOO)
6295
6296 ;SET PAGE MAP AT M.P. LEVEL, ASSUMING UMAPS HAS BEEN ALTERED.
6297 ;UMAPS EXISTS SO SCHEDULER CAN RESTORE THE MAP AFTER OTHER JOBS RUN.
6298 ;FORMAT OF A MAP SPECIFICATION IS:
6299 %UM==1,,525252
6300 %UMMPL==200000  ;1 => MAP LOWER HALF TO SPEC'D JOB'S; 0 => USE LOWER OF JOB IN U.
6301 %UMMPU==100000  ;1 => MAP UPPER HALF TO SPEC'D JOB'S; 0 => USE UPPER OF JOB IN U. 
6302 %UMALL==300000  ;SET => SELECT WHOLE MAP OF SPEC'D JOB.
6303 %UMUTL==40000   ;IGNORED IF %UMMPU=0. IF %UMMPU=1, MEANS USE SPEC'D JOB'S LOWER
6304                 ;INSTEAD OF ITS UPPER, AS OUR UPPER HALF. READ "%UM UPPER-TO-LOWER".
6305 %UMLTU==20000   ;"%UM-LOWER-TO-UPPER". WITH %UMMPL, MAKES LOWER -> SPEC'D JOB'S UPPER.
6306 %UMSOA==4000    ;1 => USE AC0S AS THE USER'S ACS, INSTEAD OF UUOACS.
6307                 ;NOTE IF %UMLTU=1, OR IF LOWER -> PDP6, THE GARBAGS ACS ARE USED.
6308                 ;ELSE, THE ACS COME FROM THE JOB WHICH OUR LOWER HALF COMES FROM.
6309 ;RH             ;JOB INDEX OF THE "SPECIFIED JOB". -1 => PDP6.
6310                 ;NOT NEEDED IF %UMMPL=%UMMPU=0.
6311
6312 PGLDU:  MOVE R,UMAPS(U)
6313 ;SET PAGE MAP AT INT. LEVEL, NOT CLOBBERING JOB'S UMAPS. ARG IN R.
6314 PGLD:   MOVEM R,LUMPS   ;LAST UMAPS ACTUALLY USED
6315         AOS NPGLD       ;COUNT # CALLS TO PGLD
6316         PUSH P,A        ;R HAS UMAPS CODE
6317         PUSH P,B
6318         PUSH P,C
6319         HRRZ C,U
6320 IFN KA10P, MOVSI B,NUVPG/2      ;SET UP NORMAL DBL, MIGHT BE CHANGED IF PDP6
6321 IFE KA10P, MOVSI B,0            ;ONLY KA10 HAS DBL
6322         TLNN R,%UMMPL
6323          JRST PGLD3A    ;USE NORMAL LOW SEG
6324 IFN PDP6P,[
6325         TRNE R,400000
6326          JRST PGLD3B    ;USE PNTR TO PDP6
6327 ]
6328         HRRZ C,R
6329         TLNE R,%UMLTU   ;SKIP ON USE HIS LOWER
6330          JRST PGLD3D    ;USE HIS UPPER
6331 PGLD3A: HRRI B,UDBR1A(C)
6332         TLNE R,%UMSOA
6333          JRST PGLD3G    ;MAKE AC'S POINT AT SWAP OUT AC'S
6334         MOVEI A,UUOACS(C)
6335 PGLD3F: MOVEM B,UPDBR1(U)
6336 IFN KA10P, DPB A,[2300,,UPACP(U)]       ;STORE AC PNTR
6337 IFE KA10P,[
6338         CAMN A,AC1PTR   ;IF CHANGING AC BLOCK 1
6339          JRST PGLD3H
6340         EXCH A,AC1PTR   ;STORE OLD BLOCK 1
6341         MOVE B,A
6342         XCTR XBR,[BLT B,17(A)]
6343         MOVS A,AC1PTR   ;AND LOAD NEW BLOCK 1
6344         XCTR XBW,[BLT A,17]
6345 PGLD3H: ] ;IFE KA10P
6346 IFN KA10P, MOVSI B,NUVPG/2      ;SET UP DBL FOR DBR2
6347 IFE KA10P, MOVSI B,0
6348         HRRI B,UDBR2A(U)
6349         TLNN R,%UMMPU
6350          JRST PGLD6     ;USE NORMAL UPPER SEG
6351         HRRI B,UDBR2A(R)
6352         TLNE R,%UMUTL
6353          HRRI B,UDBR1A(R)
6354 IFN PDP6P,[
6355         TRNE R,400000
6356          MOVE B,PDP6MP
6357 ]
6358 PGLD6:  MOVEM B,UPDBR2(U)
6359 PGLDR1: LPMR UPGML(U)
6360         POP P,C
6361         POP P,B
6362         POP P,A
6363         POPJ P,
6364
6365 IFN PDP6P,      PGLD3B: SKIPA B,PDP6MP
6366 PGLD3D: HRRI B,UDBR2A(R)
6367         MOVEI A,GACS
6368         JRST PGLD3F
6369
6370 PGLD3G: MOVEI A,AC0S(C)
6371         JRST PGLD3F
6372
6373 GACS:   BLOCK 20        ;GARBAGE AC'S POINTED TO BY ACPNTR WHEN ITS REALLY POINTING
6374                 ;AT UPPER PAGES OR PDP6  SHOULD HOPEFULLY NEVER GET REFERENCED
6375
6376 ;MAIN PROGRAM MAP-SETTING ROUTINES.
6377 IFN PDP6P,[
6378 MP6LD:  SKIPA J,[%UMMPU,,-1]    ;LOAD UPPER DBR TO PNT TO 6
6379 ];PDP6P
6380 MPLDZ:   MOVEI J,0              ;SET NORMAL MAP - OUR OWN CORE.
6381 MPLD1:  CAMN J,UMAPS(U)         ;SET UMAPS AS SPEC'D
6382          JRST CLKONJ
6383         MOVEM J,UMAPS(U)
6384 MPLD:   CONO PI,CLKOFF
6385         PUSHJ P,PLD
6386         JRST CLKONJ
6387
6388 ;SET MAP TO JOB # IN J; MIGHT OR MIGHT NOT BE THE CURRENT JOB. SAVES RH(J)
6389 MPLDJ:  CAME J,USER
6390          TLOA J,%UMSOA+%UMALL   ;OTHER JOB'S ACS ARE IN ITS AC0S.
6391           TLO J,%UMALL          ;THIS JOB => WANT UUOACS.
6392         JRST MPLD1
6393
6394 ;SIMILAR ROUTINES, BUT FOR USE WHEN CLKCHN IS OFF AND SHOULD STAY OFF.
6395 IFN PDP6P,[
6396 PLD6:   SKIPA J,[%UMMPU,,-1]    ;MAKE UPPER DBR POINT TO PDP6.
6397 ];PDP6P
6398 PLDZ:    MOVEI J,0              ;NORMAL MAP
6399 PLD1:   MOVEM J,UMAPS(U)
6400 PLD:    SPM UPGML(U)    ;IF ANY INHIBITED FAULT PRESENT, CAUSE IT TO GET STORED AWAY
6401         PUSH P,R
6402         PUSHJ P,PGLDU   ;CAUSE ACTUAL PG LOAD TO HAPPEN
6403         POP P,R
6404         POPJ P,
6405 \f
6406 SUBTTL GIVING THE USER INTERRUPTS
6407
6408 SEAR2E: MOVE A,PIRQC(U)
6409
6410 ;ROUTINE TO HANDLE FIRST WORD (PIRQC) INTS
6411 SEAR2A: JUMPL A,SEAR2B  ;REQUEST TO PCLSR
6412         SKIPN PICLR(U)
6413          JRST SEAR2C    ;PI IN PROG, ONLY LOOK FOR FATAL INTS.
6414         SETCM Q,IDF1(U)
6415         AND Q,MSKST(U)  ;ENABLED UNDEFERRED INTS.
6416         TDNN A,Q        ;ANY OF THOSE PENDING,
6417          TDNE A,[BADBTS]        ;OR ANY CLASS 1 OR 2 => INTERRUPT.
6418           CAIA
6419            JRST SEARL2
6420         ANDCA Q,A       ;GET DISABLED OR DEFERRED PENDING INTS.
6421         TDNN Q,[BADBTS] ;ANY CLASS 1 OR 2 DISABLED OR DEFERRED
6422          JRST INTWD1     ;NO, INT. THIS JOB.
6423         JRST SEAR2D     ;YES, INT. SUPERIOR.
6424
6425 SEAR2C: TDNN A,[BADBTS] ;PI IN PROG: ANY CLASS 1 OR 2 ?
6426          JRST SEARL2     ;NO, NOTHING TO DO.
6427 SEAR2D: PUSHJ P,PCLSR   ;INT. THE SUPERIOR: PCLSR FIRST.
6428          JRST SEARC     ;CAN'T STOP THIS JOB IN EXEC MODE.
6429         SETZ B,         ;OK, HANDLE FATAL 1ST WORD INTS IN A, AND NO 2ND WORD INTS.
6430
6431 ;HANDLE A FATAL INTERRUPT BY INTERRUPTING THE SUPERIOR.
6432 ;FATAL 1ST WORD INTERRUPTS IN A,  FATAL 2ND WORD INTS IN B.
6433 INTSUP: MOVEM A,SRN4(U) ;.FTL1
6434         MOVEM B,SRN5(U) ;.FTL2 ;PUT THE FATAL INTERRUPTS WHERE SUPERIOR CAN READ THEM.
6435         MOVSI T,BUSRC
6436         IORM T,USTP(U)  ;STOP INFERIOR
6437 IFN SWPWSP, PUSHJ P,LVLOAD
6438         MOVSI T,BULGOS  ;IF LOST TRYING TO LOG OUT, ABORT LOGOUT
6439         ANDCAM T,APRC(U)
6440         MOVE Q,U        ;SAVE USER INTERRUPTING
6441         SKIPGE U,SUPPRO(U)      ;SKIP UNLESS TOP LEVEL
6442          JRST INTTOP    ;REALLY TOP LEVEL
6443         HLLZ T,U        ;GET INT BIT
6444         IORM T,IFPIR(U) ;TURN ON INTERRUPT BIT IN SUPERIOR
6445         HRRZS U         ;CLEAR LEFT HALF OF U
6446         CAIL J,(U)      ;SKIP IF SUPERIOR HAS NOT YET BEEN SCHEDULED
6447          JRST SEARL1    ;RESCHEDULE SUPERIOR
6448         JRST SEARL      ;HAVEN'T GOT TO HIM YET SO CONTINUE
6449
6450 INTTOP: MOVEI T,SCRDET
6451         SKIPL APRC(Q)   ;IF JOB ISN'T ALREADY DISOWNED
6452          IORM T,SUPCOR  ;SAY SOMEONE WANTS TO BE DETACHED.
6453         JRST SEARL      ;LEAVE STOPPED, SYS JOB WILL DETACH SOMEDAY.
6454
6455 SEAR2B: PUSHJ P,PCLSR   ;PCLSR THE JOB, E.G. SO IT CAN GET AN IOC ERROR
6456          JRST SEARC     ;RUNNING IN EXEC MODE, GO RUN IT
6457         MOVSI A,(SETZ)  ;CLEAR REQUEST
6458         ANDCAM A,PIRQC(U)
6459         JRST SEARL1     ;INSPECT THIS JOB AGAIN
6460 \f
6461 ;IFPIR IS NONZERO BUT PIRQC IS ZERO.
6462 INTWD2: SKIPN PICLR(U)
6463          JRST SEARL3    ;IGNORE 2ND WD INTS IF PI IN PROG.
6464         AND B,MSKST2(U)
6465         ANDCM B,IDF2(U) ;GET ENABLED UNDEFERRED INTS.
6466         JUMPE B,SEARL3  ;ALL DISABLED OR DEFERRED.
6467         JSP T,INTPAG    ;MAKE SURE NOT WAITING FOR PAGE NEEDED FOR INT.
6468         PUSHJ P,PCLSR   ;DON'T INT. EXCEPT IN USER MODE.
6469          JRST SEARC
6470         SETZ A,         ;1ST WD INTS TO GIVE = 0.
6471         JRST INTSRC     ;2ND WD INTS TO GIVE ALREADY IN B.
6472
6473 ;PIRQC WAS NONZERO BUT NO FATAL INTS.
6474 INTWD1: JSP T,INTPAG    ;IF TRIED BEFORE & WENT TO INTPFL, WAIT FOR PAGE.
6475         PUSHJ P,PCLSR   ;CAN INT. ONLY IN USER MODE.
6476          JRST SEARC
6477         MOVE B,IFPIR(U)
6478         AND B,MSKST2(U) ;GET PENDING ENABLED UNDEFERRED 2ND WD INTS IN B.
6479         ANDCM B,IDF2(U)
6480         AND A,MSKST(U)
6481         ANDCM A,IDF1(U) ;PENDING ENABLED UNDEFERRED 1ST WD INTS IN A.
6482 INTSRC: AOS NAUINT      ;ELSE 1 MORE ATTEMPT TO INTERRUPT.
6483         MOVSI R,%UMSOA  ;LOAD ORDINARY MAP FOR THIS USER.
6484         PUSHJ P,PGLD    ;BUT ACS -> SWAP OUT ACS.
6485         HRRZ T,40ADDR(U) ;GET ADDR OF USER'S LOCATION "40"
6486         XCTRI XR,[MOVE T,2(T)] ;TRY TO GET CONTENTS OF "42" (..I SO STOP ON EXEC PG FAULT DOESNT)
6487          SKIPA R,T
6488           JRST INTPFL   ;PAGE FAULT IN XCTR, GIVE UP & WAIT FOR PAGE.
6489         ANDI R,-1
6490         JUMPE R,INTBAD  ;42 POINTS TO 0 => BADPI ERROR.
6491         MOVE TT,OPTION(U)
6492         TLNN TT,%OPINT  ;NEW STYLE INTERRUPTS?
6493          JRST INTOLD     ;NO, OLD STYLE.
6494         XCTRI XR,[MOVE R,(R)] ;GET ADDR OF HIS INT PDL PTR.
6495          CAIA
6496           JRST INTPFL
6497         JUMPGE T,INTBAD
6498         CAMGE T,[-72.*5-1,,]
6499          JRST INTBAD
6500         XCTRI XR,[MOVE H,(R)] ;GET CONTENTS OF INT PDL PTR.
6501         JRST INTSR2     ;ADVANCE T PAST INT PDL PTR ADDR.
6502          JRST INTPFL
6503
6504 INTSR0: XCTRI XR,[MOVE C,(T)] ;GET THE INTS NEXT INT TABLE ENTRY
6505          SKIPA D,B
6506           JRST INTPFL   ;APPLIES TO.
6507         XCTRI XR,[AND D,1(T)]
6508          CAIA
6509           JRST INTPFL
6510         AND C,A         ;WHICH OF THEM ARE WE TRYING TO GIVE?
6511         JUMPN C,.+2
6512          JUMPE D,INTSR1 ;NOT GIVING ANY OF THEM, TRY NEXT ENTRY.
6513         MOVE Q,IDF1(U)  ;GET CURRENT SETTINGS OF DEFER WORDS.
6514         XCTRI XW,[MOVEM Q,3(H)]
6515          SKIPA Q,IDF2(U)        ;AND PUT INTO NEXT INT PDL FRAME.
6516           JRST INTPFL
6517         XCTRI XW,[MOVEM Q,4(H)]
6518          SKIPA Q,UPC(U) ;ALSO PUT CURRENT PC IN FRAME.
6519           JRST INTPFL
6520         XCTRI XW,[MOVEM Q,5(H)]
6521          CAIA
6522           JRST INTPFL
6523         XCTRI XR,[MOVE E,2(T)] ;NOW SEE WHICH DEFER BITS TO TURN ON NOW.
6524          CAIA
6525           JRST INTPFL
6526         XCTRI XR,[MOVE TT,3(T)]
6527          CAIA
6528           JRST INTPFL
6529         XCTRI XR,[MOVE Q,4(T)] ;AND THE NEW PC.
6530          TLOA Q,%PCUSR
6531           JRST INTPFL
6532         TLZ Q,BADPC
6533         SKIPGE IOTLSR(U)
6534          TLO Q,%PCUIO   ;DON'T CHANGE HIS IOTLSR STATUS.
6535         XCTRI XW,[MOVEM C,1(H)]
6536          CAIA           ;PUT INTS BEING GIVEN IN
6537           JRST INTPFL   ;INT. PDL FRAME.
6538         XCTRI XW,[MOVEM D,2(H)]
6539          TDZA B,D
6540           JRST INTPFL
6541         MOVE W,H        ;REMEMBER PDL PTR BEFORE INCREMENT, FOR PDL OV TESTING
6542         ADD H,[5,,5]
6543         LDB J,[220500,,R]       ;HOW MANY ACS SHOULD WE SAVE?
6544         JUMPE J,INTSR5          ;NONE?
6545         HRLS J
6546         ADD H,J                 ;ADVANCE THE PDL PTR OVER WHERE THEY'LL GO.
6547         SUBM H,J                ;GET BACK THE OLD UN-ADVANCED PDL PTR IN J.
6548         ROT R,14
6549         HRLI J,(R)              ;PUT 3.7-4.1 OF R INTO LH(J) CIRCUITOUSLY
6550         TLZ J,777760
6551         ROT R,-14
6552         AOS J                   ;MAKE J POINT AT 1ST UNUSED PDL WORD.
6553         XCTRI XBRW,[BLT J,(H)]
6554          CAIA
6555           JRST INTPFL
6556 INTSR5: JUMPGE R,INTSR4 ;SAVE DEBUGGING INFO ON INT PDL IF USER WISHES
6557         HRRZ J,UPJPC(U)
6558         XCTRI XW,[MOVEM J,1(H)]
6559          SKIPA J,SUUOH(U)
6560           JRST INTPFL
6561         XCTRI XW,[MOVEM J,2(H)]
6562          SKIPA J,LSPCL(U)
6563           JRST INTPFL
6564         XCTRI XW,[MOVEM J,3(H)]
6565          CAIA
6566           JRST INTPFL
6567         ADD H,[3,,3]
6568 INTSR4: MOVE J,U        ;MAYBE? SCHED LOOP WANTS USER IDX IN J?
6569         XCTRI XW,[MOVEM H,(R)]  ;STORE BACK THE PDL POINTER, THUS FINALIZING ALL
6570          TDZA A,C       ;INTS HAVE BEEN GIVEN; NOW WE CAN CHANGE THE USER VARS.
6571           JRST INTPFL
6572         ANDCAM C,PIRQC(U)
6573         ANDCAM D,IFPIR(U)
6574         IORM E,IDF1(U)  ;SET THE DEFER BITS SPEC'D IN TABLE ENTRY.
6575         IORM TT,IDF2(U)
6576         MOVEM Q,UPC(U)  ;START USER AT INT HANDLER.
6577         JUMPL H,INTSR3  ;NOW CHECK FOR INT PDL OVFLO.
6578         JUMPGE W,INTSR3
6579         MOVEI TT,%PIPDL ;THERE WAS OVFLO, SET PDL OV INT
6580         TDNN TT,MSKST(U) ;IF ENABLED.
6581          JRST INTSR3
6582         IORM TT,PIRQC(U)
6583         JRST SEAR2E     ;RE-TRY THE INTERRUPT.
6584
6585 INTSR3: JUMPN A,SEAR2E  ;MORE INTS TO GIVE => RETRY.
6586         JUMPN B,SEAR2E
6587 INTSRX: AOS NUINT       ;1 MORE INT GIVEN SUCESSFULLY.
6588         SPM UPGML(U)
6589         JRST SEARC      ;SCHEDULE.
6590
6591 INTSR1: ADD T,[4,,4]    ;NO INTS GIVEN, TRY NEXT ENTRY.
6592 INTSR2: AOBJN T,INTSR0
6593         JRST INTSUP     ;ENABLED INTS BUT NO ENTRIES FOR THEM.
6594
6595 ;GIVE INTS THE OLD WAY.
6596 INTOLD: SKIPN C,A       ;GIVE INTS OF 1 WD AT A TIME.
6597          SKIPA C,B       ;(NO 1ST WD, GIVE ALL 2ND WD)
6598         TDZA B,B        ;(SOME 1ST WD INTS, GIVE NO 2ND WD INTS)
6599          TLO C,4^5       ;(GIVING 2ND WD, SET SIGN TO SAY SO)
6600         XCTRI XW,[MOVEM C,(T)]
6601          SKIPA Q,UPC(U) ;STORE INTS BEING GIVEN,
6602           JRST INTPFL
6603         MOVEI T,2(T)    ;ADVANCE -> PLACE TO START USER.
6604         XCTRI XW,[MOVEM Q,-1(T)]
6605          TLOA T,%PCUSR  ;OLD PC STORED, SET UP NEW.
6606           JRST INTPFL
6607         ANDCAM A,PIRQC(U) ;SAY THESE INTS NOW GIVEN.
6608         ANDCAM B,IFPIR(U)
6609         SKIPGE IOTLSR(U)
6610          TLO T,%PCUIO
6611         MOVEM T,UPC(U)  ;SET HIS PC -> TSINT+2
6612         SETZM PICLR(U)
6613         JRST INTSRX
6614 \f       
6615 ;IF WE ARE WAITING FOR A PAGE NEEDED FOR TAKING AN INTERRUPT,
6616 ;GIVE UP ON TRYING TO TAKE TE INT. UNLESS PAGE HAS COME IN SINCE LAST TRY.
6617 INTPAG: MOVSI E,%SWPGW
6618         SKIPE FLSINS(U)
6619          TDNN E,USWST(U)
6620           JRST (T)      ;JOB NOT WAITING FOR PAGE
6621         MOVSI E,%SWINT
6622         TDNN E,USWST(U)
6623          JRST (T)       ;NOT WAITING FOR INTERRUPT PAGE
6624         MOVE E,T
6625         MOVE T,EPDL2(U)
6626         XCT FLSINS(U)
6627          JRST SEARL     ;PAGE NOT IN
6628         MOVSI T,%SWPGW+%SWINT   ;PAGE IN
6629         ANDCAM T,USWST(U)
6630         SETZM FLSINS(U)
6631         SOS NPGWTU
6632         JRST (E)
6633
6634 ;COME HERE WHEN AN XCTRI TAKES FAULT WHILE TRYING TO STORE AN INTERRUPT.
6635 INTPFL: MOVE J,U        ;MAYBE? SCHED MAIN LOOP WANTS USR IDX IN J.
6636         SPM UPGML(U)    ;STORE MAP IN INTERRUPTING STATE
6637 IFN KA10P, LDB T,[221000,,UPJPC(U)]     ;FAULT ADDRESS
6638 IFN KL10P, LDB T,[$PFPNO,,UPFW(U)]
6639 IFN KS10P, LDB T,[$PFPNO,,EPTP7W]       ; Fault happened at PI level 7.
6640         ROT T,-1
6641         ADDI T,UPGCP(U)
6642         SKIPL T
6643          TLOA T,222200
6644           HRLI T,2200
6645         LDB E,T
6646         JUMPE E,INTBAD  ;DON'T HAVE PAGE
6647 IFN KA10P,[
6648         HLLZ T,UPQUAN(U)
6649         TLNE T,100
6650          JRST INTBAB    ;WRITE IN RD ONLY
6651 INTBAC: HLLZ T,UPC(U)   ;SIMULATE SETUP OF OPC
6652         LSH T,-5
6653         HRR T,UPC(U)
6654         MOVEM T,UPOPC(U)        ;FAULT STATUS
6655         MOVSI T,1000
6656         IORM T,UPQUAN(U)        ;BIT NOT SET BY XCTRI
6657         MOVSI T,%SWINT
6658         IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATT
6659         LPMRI UPGML(U)  ;SET MPV FLAG, WILL CAUSE INT. LATER LPMR'S WON'T
6660                         ; CLEAR IT.
6661         JRST SCHED6     ;"RUN" USER, TAKING PAGE FAULT IMMEDIATELY
6662
6663 INTBAB: TLNE T,50       ;NO ACCESS OR W IN RWF
6664          JRST INTBAC    ;PAGING BOX BUG? IGNORE RD ONLY
6665         JRST INTBAD     ;REALLY IS READ-ONLY.
6666 ] ;KA10P
6667 IFN KL10P,[
6668         SUBI T,UPGCP-UPGMP
6669         LDB E,T
6670         TRNE E,600000
6671          LSH E,-20
6672         CAIN E,2        ;RWF
6673          JRST INTBAB
6674         MOVS T,UPFW(U)
6675         ANDI T,%PFCOD
6676         CAIE T,%PFPNA
6677          JRST INTBAD    ;REAL VIOLATION
6678 ;DROPS THROUGH
6679 \f;DROPS IN
6680 ;KL10P  ;PF OR RWF, TAKE THE FAULT, READ IN THE PAGE, THEN TRY TO INTERRUPT AGAIN
6681
6682 INTBAB: MOVSI T,%SWINT
6683         IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATTEMPT
6684         SETOM DLSRCH    ;DON'T INTERRUPT AT INTBA1, SCHEDULE, TRY TO PCLSR
6685                         ; WITH WRONG PC
6686         MOVEI T,INTBA1
6687         EXCH T,UPC(U)   ;HACK USER'S PC
6688         MOVEM T,EPDL3(U)
6689         JRST SCHED6     ;RUN USER, RETURNING IMMEDIATELY TO INTBA1
6690
6691 INTBA1: CONO PI,PIOFF
6692         SETZM DLSRCH
6693         MOVEM U,PFAILU  ;SIMULATE A PAGE FAULT ON THE INTERRUPT WORD
6694         MOVE U,USER
6695         MOVE U,EPDL3(U)
6696         MOVEM U,PFOPC1  ;RESTORE USER'S PC
6697         MOVNI U,2
6698         MOVEM U,PFAILF  ;FLAG FAULT FROM INTPFL
6699         MOVE U,PFAILU   ;RESTORE U SO CLKSAV CAN RE-SAVE IT
6700         CONO PI,CLKRQ   ;TURN PI SYSTEM ON AND CAUSE CLOCK BREAK
6701         JRST .          ;TAKES A WHILE TO GO OFF
6702 ] ;KL10P
6703 IFN KS10P,[
6704         MOVE T,EPTP7W
6705         TLNE T,%PF2.8           ; Write in read only?
6706          JRST INTBAD            ; Yes:  %PIB42
6707         MOVEM T,UPFW(U)         ; No:  Set up for a simulated fault
6708         MOVSI T,%SWINT
6709         IORM T,USWST(U)         ; Signal fault as result of interrupt attempt
6710         SETOM PFAILF            ; Cause CLK level to go to PFLU2 at
6711                                 ; first opportunity.
6712         MOVEI T,CCLKRQ          ; Make sure that happens real fast
6713         EXCH T,UPC(U)           ; by setting his PC thusly.
6714         MOVEM T,EPTPFO          ; Save old PC as location of fault.
6715         JRST SCHED6             ; Go run this user.
6716 ] ;KS10P
6717
6718 INTBAD: MOVEI A,%PIB42  ;TURN ON BAD PI LOC INT BIT
6719         IORB A,PIRQC(U) ;GIVE USER INTERRUPT(MUST IORM TO AVOID TIMING ERR)
6720         JRST SEAR2A     ;RE-PERFORM ACTIONS FOR NON-ZERO PIRQC
6721                 ;WILL CAUSE AN INTERRUPT TO SUPERIOR
6722
6723 ;INTERRUPT ALL USERS THAT WANT IT
6724 ;  C(A) IS BIT IN PIRQC TO TURN ON
6725 DBGINT: MOVSI A,(%PIDBG)        ;"SYS BEING DEBUGGED" INT
6726 INTALL: MOVEI U,0       ;ENTRY INITIALIZE
6727 INTA2:  ADDI U,LUBLK    ;ADVANCE TO NEXT BLOCK OF USER VARIABLES
6728         CAML U,USRHI    ;SKIP UNLESS AT END
6729         POPJ P,         ;THROUGH, RETURN
6730         SKIPN UNAME(U)  ;SKIP IF BLOCK IN USE
6731         JRST INTA2      ;IDLE, IGNORE
6732         LDB T,[410100,,USTP(U)] ;GET BUCSTP OF USERS STOP WORD
6733         JUMPN T,INTA2   ;IF USER CONTROL STOPPED, JUMP TO IGNORE
6734         MOVE B,MSKST(U) ;PICK UP INTERRUPT MASK
6735         AND B,A         ;MASK C(B) TO APPROPRIATE BIT
6736         IORM B,PIRQC(U) ;GIVE INT TO USER
6737         JRST INTA2      ;LOOP
6738 \f
6739 SUBTTL PCLSR ROUTINES
6740
6741 ; PUT PC OF USER WHOSE INDEX IS IN U IN USER MODE
6742 ;  (CALL ONLY WITH CLOCK OFF OR CLOCK BREAK IN PROGRESS)
6743 ;SKIPS IF SUCCESSFUL, FAILS IF USER RUNNING IN EXEC CODE OR HAS TO BE FINALIZED
6744 ;
6745 PCLSR:  AOS NPCLSR
6746         CAIG U,L
6747          BUG                    ;PCLSR'ING NULL, SYS OR CORE JOB?
6748         MOVEI T,L
6749         IDIVM U,T
6750         IMULI T,L
6751         CAMN T,U                ;IS U REALLY A MULTIPLE OF LUBLK?
6752          SKIPN UNAME(U)         ;SHOULD NOT HAPPEN TO NONEXTANT JOB
6753           BUG
6754         SKIPE USTP(U)
6755          JRST POPJ1             ;USER STOPPED (MUST ALREADY BE IN USER MODE)
6756         AOS NEPCLS
6757         SKIPLE T,RPCL(U)
6758          JRST PCLSR2            ;LOSER IS RPCLSR'ING SOMEONE
6759 PCLSR3: MOVE T,SUEXIT(U)
6760 IFE KA10P,SUB T,U
6761         CAME T,[JRST 2,@XUUOH]
6762          JRST PCLSR5            ;EXIT ALREADY CLOBBERED
6763         MOVE T,UPC(U)           ;PICK UP PROGRAM COUNTER (FLAGS IN L.H.)
6764         TLNN T,%PCUSR           ;SKIP IF USER MODE ON
6765          JRST PCLSR8            ;JOB CURRENTLY IN EXEC MODE
6766         SOS NEPCLS              ;WAS WRONGLY AOS'ED
6767         CLEARM FLSINS(U)        ;IN CASE HE WAS WAITING FOR A PAGE OR CIRPSW
6768         MOVE T,USWST(U)
6769         TLNE T,%SWPGW
6770          SOS NPGWTU
6771         MOVSI T,%SWPGW+%SWRUN+%SWINT
6772         ANDCAM T,USWST(U)
6773         AOS (P)
6774         POPJ P,
6775
6776 PCLSR8: SKIPE FLSINS(U)         ;SKIP IF UNBLOCKED
6777          JRST PCLSR1            ;HUNG, TRY TO BACK UP TO UUO
6778 PCLSR4: MOVE T,[JRST ONEFLS]
6779         MOVEM T,SUEXIT(U)       ;MUNG EXIT OF UUO, COME BACK LATER
6780 PCLSRF: AOS NFPCLS
6781         POPJ P,
6782
6783 PCLSR2: SETZM RPCL(U)           ;CLEAR OUT POINTERS IN BOTH DIRECTIONS
6784         SETZM RPCL(T)
6785         JRST PCLSR3
6786
6787 PCLSR5: SKIPN FLSINS(U)
6788          JRST PCLSRF            ;NOT HUNG, LET RUN TO COMPLETION
6789 IFN KA10P,[                     ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6790         CAME T,[JRST ONEPROC]   ;SKIP IF ONE PROCEEDING A SYS CALL
6791          JRST PCLSR6
6792         MOVSI T,%PC1PR
6793         IORM T,SUUOH(U)         ;RESET SINGLE INSTRUCTION PROCEED
6794 PCLSR6:] ;KA10P
6795 IFN KS10P,[                     ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6796         CAME T,[JRST ONEPR4]    ;SKIP IF ONE PROCEEDING A SYS CALL
6797          JRST PCLSR6
6798         MOVSI T,OIPBIT
6799         IORM T,XUUOH(U)         ;RESET SINGLE INSTRUCTION PROCEED
6800 PCLSR6:] ;KS10P
6801         MOVE T,UPC(U)
6802         TLNE T,%PCUSR
6803          BUG
6804 IFN KA10P,      MOVE T,[JRST 2,@UUOH]
6805 IFE KA10P,[
6806         MOVSI T,(JRST 2,@)
6807         HRRI T,UUOH
6808 ] ;IFE KA10P
6809         MOVEM T,SUEXIT(U)       ;UNCLOBBER EXIT
6810 PCLSR1: HLRZ T,LSPCL(U)         ;SAVE LAST TWO DISTINCT LOCS PCLSR'ED FROM
6811         CAIN T,@UPC(U)
6812          JRST PCLSR9
6813         HRL T,UPC(U)
6814         MOVEM T,LSPCL(U)
6815 PCLSR9: SOS T,SUUOH(U)          ;GET USER LOCATION OF HIS CURRENT UUO
6816 UFL5:
6817 IFN KL10P,[
6818         TLC T,%PS1PR-%PSINH
6819         TLCN T,%PS1PR-%PSINH
6820          TLO T,%PSINH           ;ONE PROCEEDING AND INSTR NOT COMPLETE
6821 ] ;KL10P
6822         MOVEM T,UPC(U)          ;SET USERS PROGRAM COUNTER
6823 IFE KA10P,[
6824         MOVSI T,701100          ;RESTORE PAGE-CONTEXT TO USER MODE
6825         HLLM T,CLCX(U)
6826 ] ;IFE KA10P
6827         CLEARM UMAPS(U)         ;RESTORE TO NORMAL MAP
6828         SETZM FLSINS(U)         ;CLEAR OUT ANY BLOCKING CONDITION
6829         MOVE T,USWST(U)
6830         TLNE T,%SWPGW
6831          SOS NPGWTU
6832         MOVSI T,%SWPGW+%SWRUN+%SWPCL+%SWINT     ;NOT BLOCKED ON PAGE, NOT UNBLOCKED SWAPOUT,
6833         ANDCAM T,USWST(U)       ; NOT INTERRUPT PAGE, NOT SWAPPED OUT WHILE BLOCKED
6834         SKIPE T,LSWPR(U)
6835          JRST LSWZAP            ;REQUIRED TO UNLOCK SWITCHES
6836 PCLSR7:
6837 IFE KA10P,[
6838         MOVEI T,UUOACS(U)       ;IF JOB U'S ACS ARE IN HARDWARE AC BLOCK 1,
6839         CAMN T,AC1PTR           ;COPY THEM INTO UUOACS WHERE THEY BELONG.
6840          XCTR XBR,[BLT T,UUOACS+17(U)]
6841 ] ;IFE KA10P
6842         MOVEI T,AC0S(U)
6843         HRLI T,UUOACS(U)
6844         BLT T,AC17S(U)
6845         JRST POPJ1              ;EXIT AFTER BACKING UP TO UUO
6846 \f;
6847 ; AOS USTP OF USER IN A
6848 ;
6849 NJRPCL: CAIE A,-1       ;ENTRY TO IGNORE IF NULL JOB
6850 RPCLSR: CAMN A,USER     ;NORMAL ENTRY
6851         POPJ P,         ;TRYING TO RPCLSR SELF OR NULL JOB
6852         PCLT
6853         PUSH P,U        ;SAVE U
6854         MOVE U,A        ;GET INDEX OF RPCLSRED JOB IN U
6855         MOVE A,USER     ;GET RPCLSRING USER INDEX IN A
6856         CONO PI,CLKOFF  ;TURN OFF CLOCK BREAKS
6857         PUSHJ P,PCLSR   ;PUT USER IN USER MODE
6858         JRST RPCLOS     ;JUMP IF CAN'T DO IT RIGHT NOW
6859         AOS USTP(U)     ;WIN,STOP USER
6860         CONO PI,CLKON   ;RE-ENABLE CLOCK BREAKS
6861 RPCLS1: MOVE A,U        ;RESTORE A
6862         POP P,U         ;RESTORE U
6863         POPJ P,
6864 ;
6865 RPCLOS: SKIPE RPCL(U)   ;SKIP IF ZERO RPCL FOR USER BEING RPCLSRED
6866         JRST RPCLS2     ;SOMEONE GOT THERE FIRST
6867         SKIPE RPCL(A)   ;SKIP IF ZERO RPCL FOR RPCSRING USER
6868         JRST UDELAY     ;YOU ARE BEING RPCLSR'ED, SURRENDER
6869         HRROM A,RPCL(U) ;SET UP RPCL IN VARS OF RPCLSRED USER
6870         HRRM U,RPCL(A)  ;" OF RPCLSRING USER
6871         PCLT
6872         SKIPE RPCL(A)   ;WILL NOT SKIP AT FIRST
6873         PUSHJ P,UFLS    ;WAIT FOR PERSON BEING RPCLSRED TO GET TO ONEFL2
6874         JRST RPCLS1
6875 ;
6876 RPCLS2: MOVE A,U        ;RESTORE A AND U
6877         POP P,U
6878         PCLT
6879         SKIPE RPCL(A)   ;WAIT FOR OTHER GUY TO WIN
6880         PUSHJ P,UFLS
6881         JRST RPCLSR     ;THEN TRY AGAIN
6882
6883 ;
6884 ; UNDO AN RPCLSR
6885 ;
6886 NJUPCL: CAIE A,-1       ;ENTRY TO IGNORE IF NULL JOB
6887 UPCLSR: CAMN A,USER     ;REGULAR ENTRY
6888         POPJ P,         ;TRYING TO UPCLSR SELF OR NULL JOB
6889         SOSGE USTP(A)
6890          BUG
6891         POPJ P,
6892
6893 IFN KA10P,[
6894 ;
6895 ; RETURN FROM SYSTEM CALL IN ONE PROCEED MODE
6896 ;
6897 ONEPROC:CONO PI,CLKOFF  ;TURN OFF CLOCK BREAKS
6898         MOVE U,USER     ;BE SURE U HAS RUNNING USER INDEX IN IT
6899         MOVEI T,%PI1PR
6900         IORM T,PIRQC(U) ;GIVE USER INTERRUPT
6901         JRST ONEPR2
6902 ]
6903 \f
6904 SUBTTL KS-10 ONE-PROCEED
6905
6906 IFN KS10P,[
6907 ONEPRO: SYSCTX                  ;SWITCH TO SYSTEM AC BLOCK
6908         SKIPGE U,USER
6909          BUG AWFUL,[ONE-PROCEED IN NULL JOB]
6910         MOVE T,1PROPC(U)        ;PC OF NEXT INSTRUCTION TO EXECUTE
6911         TLNE T,%PSUSR           ;NORMALLY USER MODE IS EXPECTED
6912          JRST ONEPR3
6913         HRRZ T,T                ;SEE IF IT'S FIRST INSTRUCTION OF EXEC ENTRY
6914         CAIE T,UUOH0
6915          CAIN T,MUUOTR
6916           SKIPA TT,[JRST ONEPR4]
6917            BUG AWFUL,[ONE-PROCEED IN EXEC MODE],OCT,1PROPC(U)
6918         MOVEM TT,UEXIT          ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
6919         CAIE T,UUOH0            ;AND RESUME PROCESSING UUO
6920          JRST [ USRCTX
6921                 JRST MUUOTR ]
6922         USRCTX
6923         JRST UUOH0
6924
6925 ONEPR3: MOVEM T,UUOH            ;PUT USER PC WHERE ONEFLS WANTS IT
6926 ONEPR4: SYSCTX                  ;COME HERE WHEN ONE-PROC'D UUO FINISHES
6927         MOVE U,USER             ;BE SURE U HAS RUNNING USER INDEX IN IT 
6928         MOVEI T,%PI1PR
6929         IORM T,PIRQC(U)         ;GIVE USER INTERRUPT
6930         JRST ONEFLS
6931 ];KS10P
6932 \f
6933 SUBTTL USER START ROUTINES
6934 ;
6935 ; CALLED EVERY SLOW CLOCK TICK WHEN TTY WANTING TOP PROCEDURE LOADED
6936 ;
6937 USTART: PUSH P,U
6938 USTRT1: SKIPL T,@UTTYO  ;GET TTY TO BE STARTED
6939          JRST [ MOVE U,MMPFR    ;WHEN STARTING A HACTRN, MAKE SURE CORE IS AVAILABLE
6940                 CAIGE U,100
6941                  JRST USTRTL    ;IT'S NOT, SAY SYSTEM FULL
6942                 JRST .+2 ]      ;T HAS INITIAL TTYTBL
6943          MOVSI T,%TBNOT+%TBDTY+%TBNVR   ;NOT A REAL TTY, INITIALIZE TTYTBL TO NO TTY
6944         PUSHJ P,USTRA   ;CREATE NEW USER SLOT ENTRY
6945          JRST USTSC1    ;LOSE, HAVE TO WAIT
6946         SKIPGE T,@UTTYO ;SKIP IF REALLY A TTY
6947          JRST USTRTS    ;DONT LOAD A HACTRN
6948         MOVE T,[SIXBIT /HACTRN/]        ;LOAD HACKTRN
6949 USTRT2: MOVEM T,JNAME(U)        ;SET JOB NAME
6950         MOVEM T,XJNAME(U)
6951         HRLZI T,%PCUSR
6952         HRRI T,1
6953         MOVEM T,UPC(U)
6954         MOVEI T,AC0S(U)
6955         HRLI T,NUSTCD
6956         BLT T,AC17S(U)
6957         MOVE T,JNAME(U)
6958         MOVEM T,AC0S+11(U)
6959         SETZM @UTMPTR(U)        ;GIVE TEMPORARY HIGH PRIORITY
6960         SETZM USTP(U)   ;START UP
6961 USTSC2: AOS T,UTTYO     ;AOS RING BUFF
6962         CAIL T,UTTYS+MXCZS
6963          MOVEI T,UTTYS
6964         MOVEM T,UTTYO
6965         SOSE UTTYCT
6966          JRST USTRT1    ;MORE JOBS TO SET UP
6967         JRST POPUJ
6968
6969 USTRTS: MOVEM U,1(T)    ;STORE USER'S INDEX IN SECOND WORD
6970         MOVE T,(T)      ;GET JNAME FROM FIRST WORD (POINTED TO BY RH OF @UTTYO)
6971 IFN DEMON,[
6972         CAME T,[SIXBIT /LDRDEM/]
6973          CAMN T,[SIXBIT /UNSPOO/]
6974           AOS UTMPTR(U)         ;LOADER, UNSPOOLER -> SYSTEM TREE
6975 ]
6976         JRST USTRT2
6977
6978 USTSC1: MOVE U,USRHI    ;IF A USER IS ^Z'ING AND THERE IS NO POSSIBILITY
6979         SKIPL T,@UTTYO  ;OF GETTING MORE JOB SLOTS,
6980          CAIGE U,LUBLK*MAXJ
6981           JRST POPUJ
6982 USTRTL: MOVSI U,%TANJS  ;THEN MARK THE TTY AS IN NEED OF A "SYSTEM FULL" MESSAGE
6983         IORM U,TTYSTA(T)
6984         MOVEI U,SCRCFM  ;AND WAKE UP THE SYS JOB.
6985         IORM U,SUPCOR
6986         JRST USTSC2     ;REMOVE THIS TTY FROM LIST OF THOSE NEEDING A ^Z.
6987 \f
6988 ;GOBBLE NEW USER SLOT, RESET VARIABLES (SKIPS IF IT WINS)
6989 ;RETURNS INDEX IN U.  IF FAILS, CLOBBERS U!
6990 USTRA:  MOVEI U,0
6991 USTR3:  CAML U,USRHI
6992          JRST USTR1     ;ASSIGN MORE CORE TO USER STORAGE
6993         SKIPN UNAME(U)
6994          JRST USTR2     ;HAVE FOUND FREE USER SLOT (IN U)
6995         ADDI U,LUBLK
6996         JRST USTR3
6997
6998 USTR1:  SKIPGE SJCFF
6999          POPJ P,        ;SYSTEM JOB FLUSHING CORE, WAIT UNTIL IT STABILIZES
7000         MOVEI U,LUBLK   ;MOVE UP USRHI IF SYS HAS ENOUGH CORE
7001         ADD U,USRHI
7002         PUSH P,T
7003         MOVE T,HUSRAD   ;LENGTH OF SYS
7004         CAIGE T,USRSTG(U)
7005          JRST MORCOR    ;SYS NEEDS MORE CORE FOR USER VARIABLES
7006         POP P,T
7007 USSINI: SETOM USTP-LUBLK(U)     ;SYS INITIALIZATION ENTRY
7008         EXCH U,USRHI
7009 USTR2:  PUSHJ P,USTR4   ;RESET USER VARIABLES
7010         MOVEI T,SIOCHN-1(U)
7011         MOVEM T,SIOCP(U)
7012         CLEARM IOCHNM(U)
7013         HRLI T,IOCHNM(U)
7014         HRRI T,IOCHNM+1(U)
7015         BLT T,IOCHNM+17(U)      ;CLEAR ALL I/O CHANNELS
7016 USRST4: HRLI T,AC0S(U)
7017         HRRI T,AC0S+1(U)
7018         SETZM AC0S(U)
7019         BLT T,AC17S(U)  ;CLEAR AC'S & RETURN HAPPY
7020         JRST POPJ1
7021
7022 MORCOR: SUB P,[1,,1]
7023         MOVSI T,SCLDEC
7024         ANDCAM T,SUPCOR ;CLEAR ANY SYS CORE DECREASE REQ
7025         MOVSI T,SCLEX
7026         JRST SUPSET     ;REQUEST MORE CORE FROM SYS JOB
7027 \f;
7028 ; INITIALIZE A SET OF USER VARIABLES
7029 ;  T HAS INITIAL TTYTBL, POSITIVE IT IS TTY # ELSE NO TTY
7030 USTR4:  MOVEM T,TTYTBL(U)
7031         JUMPL T,USTR4B
7032         PUSH P,U
7033         HRRM U,TTYSTS(T) ;TELL TTY IT NOW BELONGS TO NEW JOB,
7034         MOVSI U,%TSCNS  ;AND IS NOW A CONSOLE.
7035         IORM U,TTYSTS(T)
7036         MOVSI U,%TSFRE
7037         ANDCAM U,TTYSTS(T)      ;AND IS NO LONGER FREE
7038         MOVSI U,%TACFM+%TACTZ
7039         ANDCAM U,TTYSTA(T)      ;AND WILL NEED CONSOLE FREE MESSAGE
7040         POP P,U
7041         ADDI T,USRRCE
7042 USTR4A: MOVEM T,UTMPTR(U)
7043         HRROI T,'000
7044         MOVEM T,UNAME(U)
7045         PUSH P,U
7046         MOVE T,U
7047         IDIVI T,LUBLK
7048         POP P,U
7049         DPB T,[000300,,UNAME(U)]
7050         LSH T,-3
7051         DPB T,[060300,,UNAME(U)]
7052         LSH T,-3
7053         DPB T,[140300,,UNAME(U)]
7054         MOVE T,UNAME(U)
7055         MOVEM T,XUNAME(U)
7056         MOVEM T,HSNAME(U)
7057         MOVE T,JNAME(U)
7058         MOVEM T,XJNAME(U)
7059         MOVEI T,(U)
7060         HRLI T,%TSCNS
7061         MOVEM T,TTSTSV+2(U)
7062         SETZM USWST(U)
7063 IFN SWPWSP,[    
7064         SETZM UWRKST(U)
7065         SETZM USVWRK(U)
7066         MOVE T,TIME
7067         ADDI T,2*30.    ;PROTECT FROM SWAPOUT FOR 2 SECONDS (RANDOMLY)
7068         MOVEM T,USWTIM(U)
7069 ];SWPWSP
7070         SETZM NSWPGS(U)
7071         SETZM NMPGS(U)
7072         SETOM JBI(U)            ;NOT JOB DEVICE HANDLER (NOT YET, ANYWAY)
7073         SETZM OPTION(U)
7074         SETZM STTYOP(U)
7075         SETOM TRNLST(U)         ;INIT TRANSL LISTS TO NIL
7076         SETOM TRNLS1(U)
7077         SETZM HUSRAD(U)
7078         JUMPE U,.+5             ;SYSTEM JOB DOESN'T HAVE A MAP
7079                 CLEARM UPGMP(U)
7080                 MOVSI T,UPGMP(U)
7081                 HRRI T,UPGMP+1(U)
7082                 BLT T,UPGCP+NUVPG/2-1(U)
7083         MOVSI T,(MOVEM U,)
7084         HRRI T,AC17S(U)
7085         MOVEM T,SCLUSV(U)
7086 IFE KA10P,[
7087         MOVSI T,(DATAI PAG,)
7088         HRRI T,CLCX(U)
7089         MOVEM T,SCLCXS(U)
7090         MOVEI T,USRSTG(U)
7091 IFN KL10P, LSH T,-9
7092         HRLI T,701100
7093         MOVEM T,CLCX(U)
7094         MOVSI T,(JRST 2,@)
7095         HRRI T,XUUOH(U)
7096         MOVEM T,SUEXIT(U)
7097         MOVSI T,(CAI)           ;INITIALLY IGNORE TRAPS 1 AND 2
7098         MOVEM T,TR1INS(U)
7099         MOVEM T,TR2INS(U)
7100 IFE KS10P,MOVEI T,%PI1PR        ;TRAP 3 IS IGNORED TOO ON KS
7101         MOVEM T,TR3INS(U)       ;TRAP 3 GIVES ONE-PROCEED INTERRUPT ON KL
7102 ] ;IFE KA10P
7103 IFN KL10P,[
7104         SETZM ULSPBR(U)
7105         MOVSI T,MUUOKN          ;UUO NEW PC'S ARE SAME AS SYS JOB'S,
7106         HRRI T,MUUOKN(U)        ; EXCEPT THAT UUO IN EXEC MODE IS AN ERROR
7107         BLT T,MUUOPT(U)
7108         MOVEI T,MUUOEX
7109         HRRM T,MUUOKN(U)
7110 ] ;KL10P
7111 IFN KS10P,[
7112         MOVE T,[%PSPCU,,MUUOEX]
7113         MOVEM T,MUUOKN(U)       ; UUO in Exec mode is an error
7114         MOVEM T,MUUOKT(U)       ; (either case)
7115         HRRI T,UUOH0
7116         MOVEM T,MUUOCN(U)       ; Normal UUO
7117         HRRI T,MUUOTR
7118         MOVEM T,MUUOCT(U)       ; UUO as trap instruction
7119         HRRI T,ONEPRO
7120         MOVEM T,1PRNPC(U)       ; One-proceed jumps to ONEPRO
7121 ] ;KS10P
7122 IFN KA10P,[
7123         MOVE T,[JRST 2,@UUOH]
7124         MOVEM T,SUEXIT(U)
7125 ] ;KA10P
7126         MOVSI T,BUSRC
7127         MOVEM T,USTP(U)
7128         SETOM SUPPRO(U)
7129         SETZM UCLBLK(U)
7130         SETOM UCLBLK+1(U)
7131         MOVE T,[JRST UREALB]
7132         MOVEM T,UCLBLK+2(U)
7133         CLEARM UPGML(U)         ;CLEAR USER PG MAP VARIABS
7134         MOVEI T,UPGML+1(U)
7135         HRLI T,-1(T)
7136         BLT T,UPGMLE(U)
7137 IFN KA10P,[
7138         MOVSI T,1+EXPGNG        ;DONT ENABLE QUAN COUNTER FOR NOW (BUT SET
7139                                 ; EXEC PAGING)
7140         MOVEM T,UPQUAN(U)
7141         MOVE T,EXECMP
7142         MOVEM T,UPDBR3(U)       ;SET UP EXEC DBR
7143         MOVSI T,IFN MCOND DM,[1040] .ELSE [0] ;ON DM, B+C MEMORIES DON'T WORK
7144         MOVEM T,UPACP(U)        ;SET UP B+C MEMORY PTRS
7145 ] ;KA10P
7146 IFN KS10P, SETZM UPQUAN(U)      ; Clear quantum counter.
7147
7148 ;DROPS THROUGH
7149 \f
7150 ;DROPS THROUGH, AND .RESET OF USR DEVICE COMES HERE.
7151 USRST2: MOVE T,UNAME(U)
7152         MOVEM T,USYSNM(U)       ;CLOCK MUST BE OFF OR PI IN PROG ON 7
7153         MOVE T,TIME             ;DON'T SWAP JOB OUT RIGHT AWAY
7154         MOVEM T,LUBTM(U)
7155         PUSH P,A
7156         PUSH P,B
7157         PUSH P,C
7158         PUSH P,E
7159         MOVEI C,UCLBLK(U)
7160         SKIPL 1(C)
7161          JSP E,CLQCLR
7162         SETOM SERVER(U)
7163         SETZM PAGAHD(U)
7164         SETZM PAGRAN(U)
7165         SETZM UWHO1(U)
7166         SETZM UWHO2(U)
7167         SETZM UWHO3(U)
7168 IFN N11TYS,[
7169         SETZM NVDBA(U)  ;0 VIDEO BUFFERS ASSIGNED BY JOB.
7170         SETOM TVCREG(U)
7171         SKIPL T,TTYTBL(U)
7172          PUSHJ P,USTTV0
7173           SETOM TVVBN(U)
7174 USTTV1: ];N11TYS
7175         POP P,E
7176         POP P,C
7177         POP P,B
7178         POP P,A
7179         SETZM URTIME(U)
7180         SETZM UTIME(U)
7181         SETOM RTIMER(U)
7182         MOVSI T,%PCUSR
7183         MOVEM T,UPC(U)
7184         HRLI T,-LUPDL
7185         HRRI T,UPDL-1(U)
7186         MOVEM T,USRPDL(U)
7187         SETZM MSKST(U)
7188         SETZM MSKST2(U)
7189         MOVE T,[20,,40]
7190         MOVEM T,40ADDR(U)
7191         MOVEI T,APRCHN+440
7192         MOVEM T,APRC(U)
7193         SETZM USTYN(U)
7194         SETZM PIRQC(U)
7195         SETZM IFPIR(U)
7196         SETZM IDF1(U)
7197         SETZM IDF2(U)
7198         SETOM PICLR(U)
7199         SETZM FLSINS(U)
7200         SETZM UTRNTM(U)
7201 IFN KL10P,[
7202         SETZM EBOXCT(U)
7203         SETZM EBOXCT+1(U)
7204         SETZM MBOXCT(U)
7205         SETZM MBOXCT+1(U)
7206 ]
7207         SETZM USIPRQ(U)
7208         SETZM TRUNTM(U)
7209         SETZM TSIPRQ(U)
7210 IFE SWPWSP,[
7211         SETZM LTRNTM(U)
7212         SETZM LSIPRQ(U)
7213         SETZM UPGSEC(U)
7214 ];SWPWSP
7215         SETZM IOTLSR(U)
7216         MOVSI T,%OPOJB          ;USR RESET DOESN'T CLEAR OJB OPTION BIT
7217         ANDM T,OPTION(U)
7218         SETOM CORRQ(U)
7219         POPJ P,
7220
7221 USTR4B: MOVEI T,USRRCE+NCT
7222         JRST USTR4A
7223
7224 IFN N11TYS,[
7225 ;SET UP THE BLINKER FOR THE JOB IN U.
7226 USTTV0: SKIPN TEN11F
7227          SKIPL TT11P
7228           POPJ P,
7229         HRL T,TTYTYP(T)
7230         TLNN T,%TY11T
7231          POPJ P,        ;NOT A TV
7232         MOVE A,TT11HD   ;11 HEADER ADR
7233         ADDI A,-NF11TY(T)
7234         LDB B,[141000,,1(A)]    ;VIDEO BUFFER #
7235         TRO B,17_8      ;CSET ALU FCTN
7236         LSH B,4+16.     ;INTO POSITION FOR MOVEMING INTO CONSOLE REG
7237         MOVEM B,TVVBN(U)
7238         JRST POPJ1
7239 ] ;END IFN N11TYS
7240 \f
7241 ;       USER START CODE
7242
7243 NUSTCD: JFCL            ;0
7244         .OPEN 1,7
7245          .LOGOUT        ;2
7246         .CALL 12
7247          .LOGOUT
7248         .IOT 1,2
7249         JRST (2)
7250         .UII,,(SIXBIT/SYS/)     ;7
7251         SIXBIT /ATSIGN/
7252         SIXBIT /HACTRN/
7253         SETZ            ;12
7254         SIXBIT /LOAD/
7255         16
7256         SETZ 17
7257         -1              ;16
7258         1               ;17
7259
7260 USTCDR: SYSCTX          ;GOT HERE FROM ULEAVE WHICH SELECTED THE USER ACS,
7261         MOVE U,USER     ; SELECT SYSTEM ACS INSTEAD.
7262         MOVEI A,USTCDR+1        ;COME BACK HERE IN CASE OF PCLSR
7263         MOVEM A,UUOH
7264         MOVE P,USRPDL(U)
7265         PUSHJ P,UBLAM
7266         MOVE U,USER
7267         MOVSI T,NUSTCD
7268         XCTR XBW,[BLT T,17]
7269         MOVE T,JNAME(U)
7270         UMOVEM T,11
7271         MOVE T,[%PCUSR,,1]
7272         MOVEM T,UUOH
7273         JRST URET
7274 \f
7275 SUBTTL USER KILL ROUTINES
7276
7277 ;
7278 ; CLOSE ALL DEVICES AND INFERIOR PROCEDURES OF A JOB (INDEX IN U)
7279 ;
7280 IODCL:  MOVNI I,1       ;SET TO STOP
7281         PUSHJ P,IODCL3  ;STOP ALL INFERIOR JOBS (RECURSIVE)
7282         MOVEI I,0       ;THEN KILL.
7283 IODCLA: PUSH P,I
7284         MOVE A,OPTION(U)
7285         TLNE A,%OPLOK   ;IF USER HAS ENABLED THE SWITCH-UNLOCK FEATURE,
7286          PUSHJ P,IODCSW ;UNLOCK HIS LOCKED SWITCHES.
7287 IFN 340P\E.SP,  PUSHJ P,ADCLOSE ;FLUSH DISPLAY
7288 IFN IMXP,       PUSHJ P,POTCLS  ;DISCONNECT HIS POTS
7289 IFN VIDP,[
7290         CAMN U,SCNUSR
7291          PUSHJ P,SCNSTP ;KILL SCANNER IF HIS
7292 ]
7293 IFN ARMP,       PUSHJ P,AARMOFF ;FLUSH ARM
7294 IFN DEMON,      PUSHJ P,DEMOUT  ;FLUSH EXISTANCE (CURRENT OR FORMER) AS DAEMON.
7295 IFN N11TYS,[
7296         SKIPE NVDBA(U)
7297          PUSHJ P,VBDFLS ;DEASSIGN ALL VIDEO BUFFERS.
7298 ]
7299 IFN KL10P,[
7300         CAMN U,MTRUSR   ;DEASSIGN THE PERFORMANCE COUNTER
7301          PUSHJ P,PRFOFF
7302 ];KL10P
7303         PUSHJ P,CLQDEL  ;RELEASE AND STOP CLOCK QUEUE BLOCK
7304          UCLBLK(U)
7305         HRRZ A,UREALT
7306         CAMN A,U
7307          SETOM UREALT   ;UN REAL TIME
7308         CAMN U,UMASTER  ;UNMASTER
7309          SETOM UMASTER
7310         PUSHJ P,AIOPDL  ;POP UP ALL OF IO PDL (CLOSING CHNLS POPPED INTO)
7311         MOVEI R,IOCHNM(U)
7312 IODCL1: PUSHJ P,CCLOSE  ;CLOSE ALL CHANNELS
7313         CAIGE R,IOCHNM+NIOCHN-1(U)
7314          AOJA R,IODCL1
7315         PUSH P,U
7316         SKIPGE T,JBI(U) ;IF THIS JOB IS A JOB-DEVICE,
7317          JRST IODCL2
7318         HRROS JBCJUI(T) ;TELL THE JOB CHANNEL THAT THE HANDLER IS GONE.
7319         CONO PI,CLKOFF
7320         SKIPGE JBCG(T)  ;IF OUR CREATOR STILL HAS A JOB CHANNEL,
7321          JRST IODCL6
7322         MOVE A,JBCUI(T) ;FLUSH THE CREATOR'S JOB CHANNELS,
7323         CONO PI,CLKON
7324         PUSHJ P,RPCLSR  ;STOPPING THE CREATOR IN CASE HE'S USING THEM NOW.
7325         MOVE T,JBI(U)   ;RPCLSR CLOBBERS T.
7326         MOVSI C,%CLSJ
7327         PUSHJ P,CHSCAA
7328             PUSHJ P,[HRRZ B,(R)
7329                      TDNN C,CLSTB(B)
7330                       POPJ P,
7331                      HLRZ B,(R)
7332                      CAMN B,T
7333                       SETZM (R)
7334                      POPJ P,]
7335         PUSHJ P,UPCLSR  ;ALLOW THE CREATOR TO CONTINUE AND GET IOC ERROR OR RETRY OPEN
7336 IODCL6: CONO PI,CLKON
7337         SETOM JBCUI(T)  ;FLUSH THE JOB-DEVICE SLOT.
7338         SETOM JBI(U)    ;SAY THIS JOB NO LONGER A JOB-DEVICE.
7339         JRST IODCL2
7340
7341 IODCL3:  PUSH P,I       ;I=0 KILL I=-1 STOP I=1 JUST CLOSE CHANNELS.
7342         PUSH P,U
7343 IODCL2: MOVEI A,0
7344 IODCL4: HRRZ E,SUPPRO(A)
7345         SKIPE UNAME(A)  ;SKIP IF VARIABLES BLOCK IDLE
7346         CAIE E,(U)      ;SKIP ONLY IF IT IS A DIRECT INF.
7347         JRST IODCL5     ;TRY NEXT SET OF VARS
7348         PUSH P,A
7349         MOVE U,A
7350         PUSHJ P,1USTOP  ;STOP (WITH BUSRC BIT)
7351         MOVE R,P
7352         MOVE P,USRPDL(U)
7353         PUSH P,R
7354         SKIPGE I,-2(R)
7355         JRST IODCL8     ;STOP
7356         PUSHJ P,IODCLA  ;KILL OR CLOSE CHNLS, RECURSE
7357 IODCL9: MOVE P,(P)
7358         SKIPE -2(P)     ;KILLING?
7359         JRST IODCL7     ;JUST CLOSING CHNLS.
7360         MOVE A,U        ;KILLING; WAIT TILL NO OTHER JOB
7361         PUSHJ P,AUCL3   ;IS LOOKING AT THE ONE THAT WE'RE KILLING.
7362         PUSHJ P,UBLST2  ;FLUSH CORE
7363         SETZ R,
7364         PUSHJ P,ZUSLOG  ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
7365         CONO PI,CLKON
7366 IODCL7: POP P,A
7367         HRRZ U,(P)
7368 IODCL5: ADDI A,LUBLK
7369         CAMGE A,USRHI
7370         JRST IODCL4     ;LOOP FOR ALL SETS OF USER VARIABLES
7371         POP P,U
7372         SUB P,[1,,1]
7373         POPJ P,
7374
7375 IODCL8: PUSHJ P,IODCL3
7376         JRST IODCL9
7377 \f
7378 ;SYSTEM CALL UNLOCK.  1 ARG, A JOB SPEC.
7379 ;THAT JOB'S LOCKS ARE ALL UNLOCKED.
7380 NUNLOCK:
7381         MOVE J,A
7382         JSP T,NCORUI    ;DECODE THE JOB SPEC.
7383          JRST NUNLO1     ;WE'RE CERTAINLY ALLOWED TO WRITE THIS JOB.
7384         JUMPE U,NUNLO1  ;SYSTEM JOB CAN DO IT TO ANYBODY
7385         JSP T,NCORWR    ;NOT SURE, SO CHECK.
7386          JRST OPNL31     ;NO, NOT ALLOWED.
7387 NUNLO1:
7388 IFN PDP6P,[
7389         CAIN J,-1
7390          JRST OPNL34
7391 ];PDP6P
7392         ;THE CALL IS ALLOWED, SO UNLOCK THAT JOB'S LOCKS
7393         CAMN J,USER
7394          JRST NUNLO2
7395         MOVE A,J                ; If not self,
7396         PUSHJ P,RPCLSR          ; assure a User mode PC
7397         PUSHJ P,SOSSET
7398          USTP(A)
7399         JRST NUNLO3
7400
7401 NUNLO2: MOVE A,UUOH             ; If we are asked to unlock
7402         SUBI A,1                ; our own locks, put our PC in
7403         MOVEM A,SRN3(U)         ; SRN3 where IODCSW will look for it
7404 NUNLO3: MOVE U,J
7405         MOVE A,OPTION(U)
7406         TLNE A,%OPLOK           ; Provided it is using locks at all...
7407          PUSHJ P,IODCSW
7408         CAME U,USER
7409          PUSHJ P,LSWPOP         ; USTP
7410         JRST LSWPJ1             ; DIELOK
7411         ; Returns with U clobbered, which seems to be OK for .CALL's?
7412
7413
7414 ;CALL HERE TO UNLOCK THE SWITCHES A JOB HAS LOCKED (USER IDX IN U).
7415 ;LOCATION 43 (ACTUALLY, 3+C(40ADDR)) HAS THE LIST POINTER. 0 IS NIL.
7416 ;ANYTHING ELSE POINTS TO 2-WORD BLOCK; THE 1ST WORD IS THE SWITCH OR THE
7417 ;ADDRESS OF THE SWITCH. THE RH OF THE SECOND IS THE CDR OF THE LIST.
7418 ;THE LH OF THE SECOND IS THE UNLOCK INTRUCTION. THE INDEX FIELD IS IGNORED,
7419 ;ONE LEVEL OF INDIRECTION IS PERMITTED, AND THE INSN MUST BE EITHER
7420 ;AOS OR SOS WITH 0 IN AC FLD, A LOGICAL INSTRUCTION (TOP 3 BITS = 4),
7421 ;A HALFWORD INSTRUCTION, OR A MOVE,MOVN,MOVS,MOVN,ADD OR SUB SERIES INSN,
7422 ;OR 0 WHICH MEANS SETOM. ONLY INSNS THAT MODIFY MEMORY ARE USEFUL.
7423 ;44 IS AN AOBJN POINTER TO THE CRITICAL RTNS TABLE, OF 2-WORDS ENTRIES.
7424 ;THE 1ST WORD EACH IS <BEGINNING OF RANGE>,,<END OF RANGE>+1.
7425 ;THE SECOND IS THE UNLOCK INSTRUCTION, WITH THE ADDRESS OF THE SWITCH
7426 ;IN THE RH (AGAIN, 1 LEVEL OF INDIRECTION IS PERMITTED).
7427 ;IF THE PC IS IN THAT RANGE, THE UNLOCK INSN IS EXECUTED.
7428 ;43 AND 44 ARE UPDATED DURING PROCESSING TO PREVENT PCLSR LOSSAGE.
7429 ;SEE .INFO.;ITS LOCKS
7430
7431
7432 ;MACRO TO DO XCTR, OR POPJ IF THAT WOULD CAUSE INTERRUPT.
7433 DEFINE XCTRIJ
7434         JSP TT,IODCXC
7435         XCTR!TERMIN
7436
7437 ; IODCSW: Unlock locks for user in U
7438 ; User should be stopped so that he is in user mode.
7439 ; The only exception is if we are unlocking the locks of the running job,
7440 ; in which case the contents of SRN3 will be used as our PC.
7441 ; Clobbers just about everything except U.
7442 IODCSW: PUSH P,U
7443         PUSHJ P,IODCS0          ; Do actual work, if any...
7444         MOVE U,USER             ; But be sure to always
7445         PUSHJ P,MPLDZ           ; restore normal page map of running user.
7446         JRST POPUJ              ; And U
7447
7448 IODCS0: HRRZ J,U
7449         MOVE U,USER     ;SET UP MAP TO USER BEING HACKED (IDX IN J).
7450         PUSHJ P,MPLDJ   ;LH(J) CLOBBERED, RH SAVED.
7451         HRRZ U,J        ;U HAS WHAT IT HAD AT CALL (USR BEING HACKED).
7452         MOVEI C,1000    ;COUNT LENGTH OF LIST SO CIRCULAR LISTS DON'T HANG US UP.
7453         HRRZ E,40ADDR(U)
7454         XCTRIJ XRW,[MOVES B,3(E)] ;GET HIS "43" (AND MAKE SURE IT'S WRITABLE)
7455 IODCS1: JUMPE B,IODCS2          ;REACHED END OF LOCKED SWITCH LIST, MAYBE?
7456         XCTRIJ XR,[HLL B,1(B)]  ;MERGE LOCK INSN WITH ADDR OF SWITCH.
7457         PUSHJ P,IODCDO          ;EXECUTE THE UNLOCK INSN
7458          POPJ P,                 ;IODCDO DETECTED MPV OR PUR INTERRUPT.
7459         XCTR XR,[HRRZ B,1(B)]   ;REPLACE LIST BY ITS CDR.
7460         UMOVEM B,3(E)
7461         SOJG C,IODCS1
7462
7463 IODCS2: XCTRIJ XRW,[MOVES E,4(E)]       ;GET JOB'S "44", AND MAKE SURE IT'S WRITEABLE.
7464         HRRZ C,UPC(U)           ;GET ITS PC, FOR COMPARISON.
7465         CAMN U,USER             ; Except if this is us,
7466          HRRZ C,SRN3(U)         ; then unlock PC is in SRN3
7467         JUMPGE E,CPOPJ          ;THERE ARE NO PROTECTED RANGES => DONE.
7468 IODCS3: XCTRIJ XR,[MOVS B,(E)]  ;GET BOUNDS OF NEXT PROTECTED RANGE.
7469         CAIGE C,(B)             ;IS PC ABOVE LOWER BOUND?
7470          JRST IODCS4
7471         MOVSS B
7472         CAIL C,(B)              ;IS IT BELOW UPPER?
7473          JRST IODCS4
7474         XCTRIJ XR,[MOVE B,1(E)] ;PC IS IN THIS RANGE; GET UNLOCK INSN
7475         PUSHJ P,IODCDO          ;EXECUTE IT
7476          POPJ P,                ;NO SKIP => MPV OR PUR INTERRUPT DETECTED.
7477 IODCS4: ADD E,[2,,2]            ;CHECK ALL ENTRIES IN CRITICAL RTN TABLE, 1 BY 1.
7478         HRRZ B,40ADDR(U)        ;UPDATE 44 SO ENTRIES ALREADY PROCESSED ARE
7479         UMOVEM E,4(B)           ;ACTUALLY IN THE TABLE. THIS IS IN CASE PCLSR.
7480         JUMPL E,IODCS3
7481         POPJ P,
7482 \f
7483 ;PRECEDE AN XCTR WITH JSP TT,IODCXC TO POPJ IF THE XCTR WOULD
7484 ;CAUSE AN INTERRUPT (MPV OR PUR). CLOBBERS A,T,Q.
7485 IODCXC: MOVEI A,@(TT)   ;GET EFFECTIVE ADDR OF XCTR.
7486         MOVEI A,@(A)    ;GET EFFECTIVE ADDR OF XCTR'ED INSN.
7487         LSH A,-10.      ;GET PAGE # BEING REFERENCED.
7488         PUSHJ P,UPLC    ;SET T = B.P. TO PAGE MAP HALFWORD. CLOBBERS Q.
7489         LDB T,T
7490         TRNE T,600000   ;IF PAGE IS SWAPPED IN, PUT ACCESS BITS IN
7491          LSH T,-20      ;SAME PLACE THEY ARE WHEN SWAPPED OUT (LOW 2 BITS).
7492 ;FOLLOWING CODE COMMENTED OUT BECAUSE IT DOESN'T WORK ON THE KL10 XCTR
7493 ;       TRNE T,2        ;CHANGE CODE 2 (READ-WRITE, NOT WRITTEN) TO 3 (READ-WRITE).
7494 ;        IORI T,1
7495 ;       LSH T,27        ;PUT ACCESS CODE IN AC FIELD, AND TEST
7496 ;       ANDCA T,(TT)    ;AGAINST WHAT THE XCTR WILL TRY TO DO.
7497 ;       TLNN T,(0 3,)   ;ALL DESIRED ACCESS AVAILABLE =>
7498 ;        JRST (TT)      ;WE WIN.
7499 ;       POPJ P,         ;ELSE QUIT OUT OF CALLING ROUTINE.
7500 ;
7501 ;FOLLOWING CODE INSERTED INSTEAD.  THIS RELIES ON THE FACT
7502 ;THAT ONLY THE FOLLOWING INSTRUCTIONS ARE XCTRIJ'ED:
7503 ; BOOLE,HWT,MOVXX,ADDX,SUBX,AOSX,SOSX
7504         MOVE A,@(TT)    ;GET INSTRUCTION XCTR'ED
7505         TLC A,300000
7506         TLCE A,300000   ;SKIP IF AOS OR SOS
7507          TLNE A,002000  ;SKIP IF DOESN'T WRITE IN MEMORY
7508           TRNE T,2      ;INSTRUCTION WRITES, SKIP IF RW OR RWF ACCESS NOT PRESENT
7509            TRNN T,3     ;INSTRUCTION READS, SKIP IF ANY ACCESS PRESENT
7510             POPJ P,     ;INSUFFICIENT ACCESS, QUIT OUT OF CALLING ROUTINE
7511         JRST (TT)       ;WINNING, GO DO THE XCTR
7512
7513 ;PUSHJ P,IODCDO WITH INSN IN B TO XCTRIJ IT, CHECKING FOR LEGALITY
7514 ;AND PERFORMING ONE LEVEL OF INDIRECTION IF THE @ BIT IS SET.
7515 ;(WE CAN'T AFFORD AN INFINITE LOOP WHILE KILLING A JOB EVEN IF IT IS
7516 ;INTERRUPTABLE)
7517 ;INDEX FIELD IS IGNORED. IF THE OPCODE IS 0, SETOM IS USED INSTEAD.
7518 ;SKIPS IF INSN IS LEGAL AND DOESN'T CAUSE MPV OR PUR INTERRUPT.
7519 ;CLOBBERS A,D,J,T,TT,Q
7520 IODCDO: MOVE J,B        ;B IS NOT CLOBBERED.
7521         TLZN J,(@)
7522          JRST IODCD1
7523         XCTRIJ XR,[HRR J,(J)]   ;INDIRECTION IS WANTED; DO IT.
7524 IODCD1: TLNN J,-1       ;IF LH IS 0, REPLACE BY (SETOM)
7525          HRLI J,(SETOM)
7526         LDB A,[271500,,J]
7527         CAIE A,AOS_-27  ;AOS AND SOS ARE LEGAL WITH 0 IN AC FIELD.
7528          CAIN A,SOS_-27
7529           JRST IODCD2
7530         LDB A,[410300,,J]
7531         CAIE A,4        ;ALL INSNS WITH 4 IN TOP 3 BITS (LOGICAL INSNS) ARE OK.
7532          CAIN A,5       ;HALFWORD INSTRUCTIONS ALSO OK.
7533           JRST IODCD3
7534         LDB A,[360600,,J]
7535         CAIE A,MOVE_-36 ;ALL FORMS OF MOVE, MOVS, MOVN AND MOVM OK
7536          CAIN A,MOVN_-36
7537           JRST IODCD3
7538         CAIE A,ADD_-36  ;ADD & SUB OK.      (OF COURSE, ONLY TO-MEMORY INSNS MAKE SENSE)
7539          POPJ P,
7540 IODCD3: LDB A,[270400,,J] ;AC FIELD NEED NOT BE 0, SO GET CONTENTS OF SPEC'D AC,
7541         UMOVE D,(A)
7542         MOVEI A,D
7543         DPB A,[270400,,J] ;AND MAKE THE INSN USE AC D, WHERE THE VALUE IS.
7544 IODCD2: TLZ J,17
7545         XCTRIJ XRW,J    ;EXECUTE INSN, CHECKING FOR INTERRUPTS.
7546         AOS (P)
7547         POPJ P,
7548 \f
7549 ; FLUSH LAST VESTIGES OF USER
7550 ;  ELIMINATES ALL POINTERS TO USER & FREES USER VARIABLES (CLOBBERS U TO "USER")
7551 ;  R, IF NON-ZERO, IS ADDRESS OF CHANNEL NOT TO BE CLOSED UNTIL LAST MINUTE
7552 ;       (IN CASE PCLSR OUT OF .UCLOSE)
7553
7554 ZUSER:  MOVEI A,(U)     ;CLEAR BOTH TRANSLATION LISTS
7555         HRLI A,300000   ;FOR THIS JOB.
7556         PUSHJ P,NTRNC
7557          JFCL
7558         MOVEI A,0       ;AND GET RID OF EXISTING FOREIGN-USER CHANNELS.
7559 ZUSER2: SKIPE UNAME(A)
7560          PUSHJ P,ZUSES  ;SEE IF THIS USER HAS ANY POINTERS TO BE FLUSHED
7561         CAMN U,SERVER(A)        ; If we were a server for this guy,
7562          SETOM SERVER(A)        ; clear it out.
7563         ADDI A,LUBLK
7564         CAMGE A,USRHI
7565          JRST ZUSER2    ;LOOP FOR ALL SETS OF USER VARIABLES
7566         SKIPE R
7567          SETZM (R)
7568         CONO PI,CLKOFF
7569         SKIPE NMPGS(U)  ;USER SHOULD HAVE NO MEMORY BY NOW
7570          BUG
7571         SETZM UNAME(U)  ;ONLY PLACE THAT UNAME IS ZEROED
7572         SETOM USTP(U)   ;SET USTP TO SPEED SEARCH
7573         MOVE A,U        ;USER FLUSHED
7574         MOVE U,USER
7575         MOVSI T,SCLDEC
7576         IORM T,SUPCOR   ;CAUSE USER VARIABLE BLOCKS DECREASE PROGRAM TO RUN
7577         POPJ P,         ;RETURN WITH CLOCK OFF
7578
7579
7580 ;CALLED BY ADISOWN, NATTACH, NDETACH, ETC.
7581 ZUSES:  MOVEI D,%CLSU\%CLSFU\%CLSJI\%CLSJO      ;CLSTB BITS FOR CHANNELS TO CLOSE
7582 ZUSES1: PUSH P,B
7583         PUSH P,R
7584         PUSH P,C
7585         MOVE C,R
7586         SETZM B         ;CLEAR STOPPED PROC FLAG
7587         PUSHJ P,CHSCAA  ;EXECUTE FOLLOWING INST FOR EACH CHANNEL AND I/O PDL SLOT
7588             PUSHJ P,ZACHEK
7589         POP P,C
7590         POP P,R
7591         SKIPE B         ;SKIP UNLESSS YOU STOPPED THE PROC
7592          PUSHJ P,UPCLSR ;RESTART USER
7593         JRST POPBJ
7594
7595 ZACHEK: HLRZ T,(R)      ;CHECK FOR CHANNEL TO ZAP
7596         CAME T,U
7597          POPJ P,
7598 ZACHK4: HRRZ T,(R)
7599         HLRZ T,CLSTB(T)
7600         TRNN T,(D)
7601          POPJ P,        ;IS IT EITHER TYPE OF USER CHANNEL? OR JOB CHNL?
7602         TRON B,-1       ;SET FLAG
7603          PUSHJ P,RPCLSR ;STOP USER
7604         HRRZ T,(R)
7605         HLRZ T,CLSTB(T)
7606         TRNN T,%CLSFU   ;IS IT A FOREIGN USR CHNL?
7607          JRST ZACHK2    ;NO, SUPERIOR OR JOB CHNL.
7608         JUMPG R,ZACHK1  ;IOPDL CHANNEL
7609         MOVEI T,LUBLK   ;SEE IF A HAS BEEN CLOBBERED
7610         IDIVM A,T       ;(AT LEAST MAKE SURE IT'S A VALID USER INDEX)
7611         IMULI T,LUBLK
7612         CAMN T,A
7613          CAML A,USRHI
7614           BUG
7615         HRRZ T,R        ;NORMAL CHANNEL, INTERRUPT ON IT.
7616         SUBI T,IOCHNM(A)
7617         MOVE T,CHNBIT(T)
7618         AND T,MSKST2(A)
7619         IORM T,IFPIR(A)
7620 ZACHK2: CAIE C,(R)      ;UNLESS THE ONE NOT TO BE CLOSED UNTIL LAST MINUTE,
7621          SETZM (R)      ;FOR ANY KIND OF CHANNEL, CLEAR IT OUT.
7622         POPJ P,
7623
7624 ZACHK1: MOVEI T,IIOPOP  ;FOREIGN USR IN IOPDL SLOT: INTERRUPT WHEN IOPOPPED.
7625         MOVEM T,(R)
7626         POPJ P,
7627 \f
7628 ZUSLOG: PUSH P,[ZUSER]          ;DO LOGUSE THEN ZUSER
7629
7630 ;LOG RUNTIME AND SWAPIN REQUESTS USED BY JOB IN U
7631 ;JOB CALLED FOR SHOULD NOT BE CURRENT OR ABLE TO RUN DURING CALL
7632 ;JOB SHOULD NOT BE TOP LEVEL EXCEPT WHEN DMNPLO CALLS
7633 ; HERE JUST BEFORE SENDING THE USAGE TO THE DEMON
7634 ;CLOBBERS T,TT,I
7635
7636 LOGUSE: MOVN TT,UTRNTM(U)
7637         MOVN T,USIPRQ(U)
7638         EXCH TT,TRUNTM(U)       ;AVOID CHARGING FOR THIS USAGE TWICE
7639         EXCH T,TSIPRQ(U)
7640         SUB TT,TRUNTM(U)        ;COMPUTE TOTAL USAGE NOT YET CHARGED
7641         SUB T,TSIPRQ(U)
7642         SKIPGE I,SUPPRO(U)      ;FIND HIGHEST JOB IN TREE
7643          POPJ P,                ;BUT IF TOP LEVEL RETURN WITH USAGE IN TT, T
7644 ;THIS IS TO FIND A BUG.  -- CStacy, 4/30/82
7645         CAME I,U                ;IS THIS JOB ITS OWN SUPERIOR?
7646          JRST LOGUS1
7647         BUG PAUSE,[SOME JOB IS ITS OWN SUPERIOR, U AND I=],OCT,U
7648 LOGUS1: SKIPL SUPPRO(I)
7649          JRST [ MOVE I,SUPPRO(I) ? JRST .-1 ]
7650         ADDM TT,TRUNTM(I)       ;ADD CHARGES TO TREE'S ACCOUNT
7651         ADDM T,TSIPRQ(I)
7652         POPJ P,
7653
7654 ;DO LOGOUT FOR TREE HEADED BY JOB IN U
7655 ;CALLER SHOULD THEN PUSHJ P,DMNPLI TO LOG JOB BACK IN
7656 ;THIS IS USED TO KEEP ACCOUNTING STRAIGHT WHEN DETACH, CHUNAME, RELOAD (SIGH)
7657 ;IF JOB IS CURRENTLY RUNNING, TIME USED IN CURRENT QUANTUM
7658 ;WON'T GET CHARGED THIS TIME AROUND.  TOO BAD.
7659 ;CLOBBERS T,TT,I,J,D. CALL WITH CLKOFF OR IN PROGRESS.
7660
7661 LOGUPD: PUSH P,U
7662         MOVE J,UTMPTR(U)
7663         MOVEI U,LUBLK
7664 LOGUP1: ADDI U,LUBLK
7665         CAML U,USRHI
7666          JRST LOGUP2
7667         CAMN J,UTMPTR(U)        ;SKIP JOBS IN OTHER TREES (FOR SPEED)
7668          SKIPGE SUPPRO(U)       ;AND SKIP TOP LEVEL JOBS
7669           JRST LOGUP1
7670         SKIPE UNAME(U)          ;DON'T GET CONFUSED BY EMPTY SLOTS
7671          PUSHJ P,LOGUSE         ;PROBABLY AN INFERIOR IN TREE LOGGING OUT, UPDATE ACCT
7672         JRST LOGUP1
7673
7674 LOGUP2: POP P,U
7675         JRST DMNPLO             ;TELL DEMON ABOUT TREE'S USAGE
7676 \f
7677 SUBTTL USER UUO WAIT (HANG UP) ROUTINE
7678 ;  DOES NOT WORK FOR XCT T OR FOR X (T)
7679 ;  THE INSTRUCTION BEFORE THE PUSHJ P,UFLS GETS EXECUTED WITH AN
7680 ;  ARGUMENT PASSED IN T AND ITS USER INDEX IN U.  I BELIEVE IT
7681 ;  IS ONLY ALLOWED TO BASH T AND A.
7682 ;
7683 UFLS:   CONSZ PI,77400
7684          BUG HALT,[UFLS WITH PI IN PROGRESS]
7685         CONO PI,CLKOFF  ;DOES NOT ALLOW CLOCK INTS
7686         XCT CLUSAV
7687         SKIPGE U,USER   ;GET INDEX OF USER BEING BLOCKED
7688          JRST 4,.       ;NULL JOB SHOULD NOT GET BLOCKED
7689         MOVEM T,EPDL2(U)        ;SAVE C(T) FOR FLSINS AT PCLSR
7690         MOVEM T,AC16S(U)        ;SAVE IN SWAP OUT AC ALSO
7691         POP P,UPC(U)            ;WORK FOR INST INDEX OF P
7692         MOVEI T,AC0S(U)
7693         BLT T,AC15S(U)  ;STORE REST OF ACS
7694         MOVE T,UPC(U)   ;GET PC AT CALL (=CALL+1 ; =SKIP +2)
7695         SKIPA T,-2(T)   ;GET POINTER TO SKIP
7696 UFL3:    MOVE T,(T)     ;GET CONTENTS OF E (WAS AN XCT)
7697         MOVE U,AC17S(U) ;WIN FOR INSNS INDEX OF U.
7698         HRRI T,@T       ;CALCULATE E
7699         TLZ T,37        ;CLEAR OUT @ AND INDEX BITS
7700         MOVE U,USER
7701         MOVEM T,FLSINS(U)       ;STORE AS BLOCKING CONDITION
7702         TLC T,(XCT)
7703         TLNN T,777740
7704          JRST UFL3      ;JUMP IF INSTRUCTION WAS XCT
7705         CONO PI,UTCON-1 ;TURN ON ALL PIS EXCEPT CLOCK
7706         MOVSI T,%SWPGW+%SWINT
7707         ANDCAM T,USWST(U) ;CLEAR WAITING FOR PAGE TYPE FLSINS
7708         SKIPGE RPCL(U)  ;SKIP IF NOT BEING RPCLSRED
7709          JRST UFL1      ;LOSER IS BEING RPCLSRED
7710 UFL6:   MOVE U,AC17S(U) ;FOR CLUSAV TO STORE
7711         SETOM UFLSF
7712         CONO PI,CLKRQ   ;CAUSE INTERRUPT TRANSFERING TO CLOCK ROUTINE PI IN
7713                         ; PROGRESS
7714 IFE KA10P, JRST .       ;ON KL AND KS SEEMS TO TAKE A WHILE TO GO OFF ("I
7715                         ; CAN WAIT FOREVER, YOU KNOW")
7716 IFN KA10P, JRST 4,.     ;ON KA SHOULD GO OFF RIGHT AWAY
7717
7718 UFL1:   MOVE P,CPDLP    ;MUST NOT USE USR PDL SINCE THAT CAN
7719                         ;GET CLOBBERED BY LSWDIS VIA UFL5
7720                         ;CLOCK IS OFF, SO CPDLP IS OK
7721 IFN KA10P,[
7722         MOVE T,UEXIT    ;PICK UP EXIT INSTR
7723         CAME T,[JRST ONEPROC]   ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7724                                 ; THAT HUNG
7725          JRST UFL1A     ;NOT ONE PROCEEDING
7726         MOVSI T,%PC1PR  ;GET ONE PROCEED BIT
7727         IORM T,UUOH     ;TURN IT ON IN PC
7728 UFL1A:] ;KA10P
7729 IFN KS10P,[
7730         MOVE T,UEXIT    ;PICK UP EXIT INSTR
7731         CAME T,[JRST ONEPR4]    ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7732                                 ; THAT HUNG
7733          JRST UFL1A     ;NOT ONE PROCEEDING
7734         MOVSI T,OIPBIT  ;GET ONE PROCEED BIT
7735         IORM T,UUOH     ;TURN IT ON IN PC
7736 UFL1A:] ;KS10P
7737         SOS T,UUOH      ;UUOH HAS REAL PC IF UFL5 SKIPS. WILL GET SET BY ONEPR1
7738         PUSHJ P,UFL5    ;BACK UP TO UUO
7739          JRST UFL6      ;FINALIZATION REQUIRED
7740         MOVE T,RPCL(U)
7741         JRST ONEFL2     ;WIN
7742 \f
7743 SUBTTL VARIOUS WAIT & LOCK-SWITCH ROUTINES
7744 ;
7745 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH UTCCHN OFF
7746 ;
7747 LWAIT1: CONO PI,UTCON   ;TURN INTERRUPTS ON
7748 LWAIT:  PCLT
7749         XCT @(P)        ;ENTRY, EXECUTE INSTRUCTION
7750          PUSHJ P,UFLS   ;HANG TILL INSTRUCTION SKIPS
7751         CONO PI,UTCOFF  ;TURN INTERRUPTS OFF
7752         XCT @(P)        ;TRY AGAIN
7753          JRST LWAIT1    ;LOSE
7754         JRST POPJ1      ;WIN, RETURN SKIPPING OVER ARG
7755 ;
7756 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE -1 AND SEIZE IT
7757 ;
7758 SWTL:   PCLT
7759         MOVEI T,(@)     ;ENTRY
7760         HRLM T,(P)      ;MAKE PC STORED ON PDL INDIRECT
7761         SKIPGE @(P)     ;SKIP IF ALREADY LOCKED
7762          JRST SWTL1     ;NOT LOCKED SO TRY TO GRAB IT
7763         MOVEI T,@(P)    ;ADDRESS OF SWITCH
7764         HLRZ T,1(T)     ;USER THAT HAS SWITCH
7765         ANDI T,777
7766         IMULI T,LUBLK
7767         CAMN T,USER     ;SKIP IF THIS USER DOESN'T HAVE IT
7768          BUG            ;THIS USER ALREADY HAS THAT SWITCH
7769 SWTL1:  SKIPL @(P)      ;(DO NOT CHANGE TO AOSE)
7770          PUSHJ P,UFLS   ;HANG TILL NEGATIVE
7771         CONO PI,CLKOFF
7772         AOSE @(P)
7773          JRST SWTL1
7774 SWTL2:  MOVEI T,@(P)
7775 SWTL3:  PUSH P,U
7776         PUSH P,T
7777         MOVE T,USER
7778         IDIVI T,LUBLK
7779         ADDI T,600000
7780         MOVE U,USER
7781         HRL T,LSWPR(U)
7782         POP P,U
7783         MOVSM T,1(U)
7784         MOVE T,USER
7785         HRRZM U,LSWPR(T)
7786         POP P,U
7787         JRST CLKOJ1
7788 ;
7789 ;IF LOCK ALREADY SEIZED, JUST SET UP POINTERS
7790 SWTLZ:  MOVEI T,(@)
7791         HRLM T,(P)
7792         JRST SWTL2
7793
7794 SWTAD:  PCLT            ;TRY TO LOCK SWITCH (@NEXT LOCN). IF SUCEED, SKIP EXTRA TIME.
7795         MOVE T,@(P)     ;IF FAIL, DO N LSWPOPS (AS SPEC IN 4.6-4.1 OF NEXT WORD)
7796         SKIPGE (T)      ;AND WAIT FOR SWITCH TO SEEM TO BE AVAILABLE.
7797          JRST SWTAD1    ;THEN RETURN (NOTE: NOT LOCKING IT).
7798 SWTAD2: TLNN T,77000
7799          JRST SWTAD3
7800         PUSH P,T
7801         PUSHJ P,LSWPOP
7802         POP P,T
7803         SUB T,[1000,,]
7804         JRST SWTAD2
7805
7806 SWTAD3: SKIPL (T)
7807          PUSHJ P,UFLS
7808         JRST POPJ1
7809
7810 SWTAD1: CONO PI,CLKOFF
7811         AOSE (T)
7812          JRST [ CONO PI,CLKON
7813                 JRST SWTAD2 ]
7814         AOS (P) ;SKIP OVER FAILURE RETURN
7815         JRST SWTL3
7816 \f
7817 ;
7818 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH CLKCHN OFF
7819 CWAIT1: CONO PI,CLKON   ;TURN CLOCK ON
7820 CWAIT:  PCLT
7821         XCT @(P)        ;ENTRY, EXECUTE INSTRUCTION
7822          PUSHJ P,UFLS   ;HANG TILL INSTRUCTION SKIPS
7823         CONO PI,CLKOFF  ;TURN CLOCK OFF
7824         XCT @(P)        ;TRY AGAIN
7825          JRST CWAIT1    ;LOSE
7826         JRST POPJ1      ;WIN, RETURN SKIPPING OVER ARG
7827
7828 ;
7829 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE NON-NEGATIVE AND SEIZE IT
7830 LSWTL:  PCLT
7831         MOVEI T,(@)     ;IF 4.9 OF NEXT LOCN =1, RETURN WITH UTCOFF
7832         HRLM T,(P)
7833         MOVSI T,400000
7834         PUSHJ P,LWAIT
7835             SKIPGE @-1(P)
7836         IORM T,@(P)
7837         MOVE T,(P)
7838         SKIPL (T)
7839          CONO PI,UTCON
7840         MOVEI T,@(P)
7841 LSWTL2: PUSH P,TT
7842         MOVEI TT,601000
7843         PUSHJ P,LSWSET
7844         POP P,TT
7845         JRST POPJ1
7846 \f
7847 ;SWITCH LIST LOCK, DOES NOT WORK FOR SWITCHES POINTED TO INDEX OF A, B, OR D
7848 ;FOLLOW BY LIST OF SWITCHES
7849 ;4.9-4.4=0 4.3-4.1 0 AOSE SWITCH 1 SIGN SWITCH
7850 SLUGH:  PCLT
7851         PUSH P,A
7852         PUSH P,B
7853         PUSH P,D
7854         MOVEI T,AC0S(U)
7855         BLT T,AC0S+17(U)        ;FOR SLWAIT FIRST TIME
7856 SLUGH1: HRRZ T,-3(P)    ;POINTER TO SWITCH LIST
7857         PUSHJ P,SLWAIT
7858          PUSHJ P,UFLS
7859         HRRZ T,-3(P)
7860 SLUGH2: MOVE A,(T)      ;TRY TO LOCK LIST
7861         TLNE A,770000
7862          JRST SLUWIN    ;REACHED END OF LIST
7863         LDB B,[220400,,A]       ;INDEX
7864         LDB D,[330300,,A]
7865         SKIPE B
7866          ADD A,(B)
7867         HRRZS A
7868         CAIL D,2
7869          BUG
7870         XCT SLLOCK(D)
7871          JRST SLULOS
7872         AOBJP T,SLUGH2  ;LH COUNTS SWITCHES SUCCESSFULLY SEIZED
7873                         ;SHOULD NVERE FALL THROUGH
7874 SLWAIT: MOVE A,(T)
7875         TLNE A,770000
7876          JRST POPJ1             ;WIN
7877         LDB B,[220400,,A]       ;INDEX
7878         LDB D,[330300,,A]       ;TYPE CODE
7879         JUMPE B,SLWT1
7880         ADD B,U
7881         ADD A,AC0S(B)
7882 SLWT1:  CAIL D,2
7883          BUG
7884         XCT SLWATT(D)
7885          POPJ P,        ;LOSE
7886         AOJA T,SLWAIT   ;THAT SWITCH OK, TRY OTHERS
7887
7888 SLWATT: SKIPL (A)       ;WAIT FOR NEG (AOSE SW)
7889         SKIPGE (A)      ;WAIT FOR POS (SIGN SW)
7890
7891 SLUWIN: POP P,D
7892         POP P,B
7893         POP P,A
7894         SUB P,[1,,1]    ;"RETURN" BUT NOT INCREMENTED
7895         JRST (T)
7896
7897 SLLOCK: PUSHJ P,SWTLX
7898         PUSHJ P,LSWTLX
7899
7900 SLULOS: HLRZ A,T
7901 SLULO2: JUMPE A,SLUGH1  ;NONE SEIZED TRY AGAIN
7902         PUSHJ P,LSWPOP  ;RELEASE THOSE SEIZED
7903         SOJA A,SLULO2
7904
7905 SWTLX:  CONO PI,CLKOFF  ;DON'T GO OFF HALF-LOCKED
7906         AOSE (A)
7907          JRST CLKONJ
7908         EXCH A,T
7909         PUSHJ P,SWTL3
7910          BUG
7911 SWTLX1: EXCH A,T
7912         JRST POPJ1
7913
7914 LSWTLX: CONO PI,UTCOFF
7915         SKIPGE (A)
7916          JRST UTCONJ
7917         MOVSI B,400000
7918         IORM B,(A)
7919         CONO PI,UTCON
7920         EXCH A,T
7921         PUSH P,TT
7922         MOVEI TT,601000
7923         PUSHJ P,LSWSET
7924         POP P,TT
7925         JRST SWTLX1
7926 \f
7927 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING SWITCH
7928 STMSET: PUSH P,TT
7929         MOVEI TT,606000
7930         JRST COMSET
7931
7932 IFN 0,[
7933 ;SET UP ROUTINE TO BE CALLED ON PCLSR'ING OUT
7934 FINSET: MOVE T,@(P)
7935         HRLI T,-1(P)
7936         PUSH P,TT
7937         MOVEI TT,402000
7938         PUSHJ P,LSWSET
7939         POP P,TT
7940         JRST POPJ1
7941 ]
7942
7943 ;SET UP ROUTINE TO AOS VARIABLE UPON UNLOCKING SWITCH
7944 AOSSET: PUSH P,TT
7945         MOVEI TT,605000
7946         JRST COMSET
7947
7948 ;SET UP ROUTINE TO SOS VARIABLE UPON UNLOCKING SWITCH
7949 SOSSET: PUSH P,TT
7950         MOVEI TT,603000
7951         JRST COMSET
7952
7953 ;SET UP ROUTINE TO SOS LH UPON UNLOCKING SWITCH
7954 ;HALT IF SWITCH'S LH EVER BECOMES NEGATIVE
7955 SOLSET: PUSH P,TT
7956         MOVEI TT,607000
7957         JRST COMSET
7958
7959 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING SWITCH
7960 ;THAT ROUTINE MAY ONLY CLOBBER A AND T!!  IT GETS CALLED
7961 ;WITH USER IN U, AND THE JOB'S ACS IN AC0S(U)-AC17S(U)
7962 LOSSET: MOVE T,@(P)
7963         HRLI T,-1(P)
7964         PUSH P,TT
7965         MOVEI TT,602000
7966         PUSHJ P,LSWSET
7967         POP P,TT
7968         JRST POPJ1
7969
7970 ;SET UP ROUTINE TO CLEAR SIGN BIT OF VARIABLE UPON UNLOCKING SWITCH
7971 SGNSET: PUSH P,TT
7972         MOVEI TT,601000
7973         JRST COMSET
7974
7975 ;SET UP ROUTINE TO DO NOTHING UPON UNLOCKING SWITCH
7976 NULSET: PUSH P,TT
7977         MOVEI TT,0
7978         PUSHJ P,LSWSET
7979         POP P,TT
7980         POPJ P,
7981 \f
7982 ;ROUTINE TO ADD THIS PROCEDURE TO A LIST POINTED TO
7983 ;BY THE WORD AFTER THE CALL.  UNLOCKING REMOVES IT FROM THE LIST
7984 LSTSET: PUSH P,TT       ;LEAVES CLKON
7985         MOVEI TT,604000
7986         PUSHJ P,LSTST3
7987         POP P,TT
7988         JRST POPJ1
7989
7990 LSTST3: PUSH P,U
7991         PUSH P,Q
7992         MOVEI Q,LSWB0(U)
7993 REPEAT NULBLK,[
7994 IFN .RPCNT,ADDI Q,2
7995         SKIPN 1(Q)
7996         JRST LSTST2
7997 ]
7998         BUG             ;NOT ENOUGH BLOCKS
7999 LSTST2: MOVE T,@-4(P)   ;ADDRESS OF HEAD OF LIST
8000         CONO PI,CLKOFF
8001         PUSH P,(T)      ;PUSH HEAD OF LIST
8002         POP P,(Q)       ;POP INTO LSWB BLOCK
8003         MOVEM Q,(T)
8004         HRLM T,(Q)
8005         MOVE T,(Q)
8006         TRNE T,-1
8007         HRLM Q,(T)
8008         CONO PI,CLKON
8009         JRST LSWSE3
8010
8011 IFN 0,[
8012 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING OF SWITCH
8013 ;BY OTHER THAN PCLSRING OUT
8014 STMNPS: PUSH P,TT
8015         MOVEI TT,206000
8016         JRST COMSET
8017
8018 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING OF SWITCH
8019 ;BY OTHER THAN PCLSRING OUT
8020 LNPSET: PUSH P,TT
8021         MOVEI TT,202000
8022         JRST COMSET
8023 ];END IFN 0
8024
8025 COMSET: EXCH TT,(P)
8026         MOVE T,@-1(P)
8027         MOVEI T,@T
8028         EXCH TT,(P)
8029         PUSHJ P,LSWSET
8030         POP P,TT
8031         JRST POPJ1
8032 \f
8033 ;SET USER LOCK SWITCH BLOCK,  WD1 IN T,  MODE IN TT
8034 LSWSET: PUSH P,U
8035         MOVE U,USER
8036         PUSH P,Q
8037         MOVEI Q,LSWB0(U)
8038 REPEAT NULBLK,[IFN .RPCNT,ADDI Q,2
8039         SKIPN 1(Q)
8040         JRST LSWSE2
8041 ]
8042         BUG             ;NOT ENOUGH BLOCKS
8043
8044 LSWSE2: MOVEM T,(Q)
8045 LSWSE3: MOVE T,U
8046         IDIVI T,LUBLK
8047         MOVE U,USER
8048         HRL T,LSWPR(U)
8049         IOR T,TT        ;GET TYPE
8050         MOVSM T,1(Q)
8051         HRRZM Q,LSWPR(U)
8052         JRST POPQUJ
8053
8054 LSWCJ1: AOS (P)         ;EXIT TO DO LSWCLR AND SKIP-RETURN.
8055
8056 ;UNLOCK ALL SWITCHES, CALLED BY OPENL, ADISOWN, IOADCR
8057 LSWCLR: PUSH P,T
8058 LSWCL1:
8059 ;TEMPORARY CODE ADDED 1/22/80 TO SEE IF THERE ARE ANY MORE OF
8060 ;THIS CLASS OF BUGS
8061         CAME U,USER
8062          BUG
8063 ;END TEMPORARY CODE
8064         SKIPN T,LSWPR(U)        ;MUST HAVE USER IN U
8065         JRST POPTJ
8066         PUSHJ P,LSWPOP
8067         JRST LSWCL1
8068
8069 LSWPJ1: AOS (P)
8070 LSWPOP: PUSH P,U
8071         MOVE U,USER
8072         TLO U,400000    ;SIGNAL NOT PCLSR
8073         SKIPN T,LSWPR(U)
8074          BUG
8075         PUSHJ P,LSWPPP
8076         JRST POPUJ
8077
8078 LSWPPP: PUSH P,A
8079         PUSH P,T
8080         MOVE A,1(T)
8081         HRRZM A,LSWPR(U)
8082         CAIL T,USRSTG
8083          SETZM 1(T)
8084         PUSHJ P,LSWDIS
8085         POP P,T
8086         POP P,A
8087         POPJ P,
8088
8089 LSWZAP: PUSH P,U        ;FROM PCLSR
8090         PUSH P,A
8091 LSWZP1: PUSH P,T
8092         MOVE A,1(T)
8093         HRRZM A,LSWPR(U)
8094         CAIL T,USRSTG
8095          SETZM 1(T)
8096         PUSHJ P,LSWDIS
8097         POP P,T
8098         HRR U,-1(P)
8099         SKIPE T,LSWPR(U)
8100          JRST LSWZP1
8101         POP P,A
8102         SUB P,[1,,1]
8103         TLZN U,200000   ;HAS PC BEEN CLOBBERED?         ;THIS IS ONLY FOR FINSET R.I.P.
8104          JRST PCLSR7    ;NO
8105         SKIPLE PCLDBM
8106          SETZM LSUUO(U) ;INDICATE OCCURRENCE OF FINSET (WILL MEAN WE HAVEN'T MISSED MARK)
8107         JRST PCLSR4     ;REQUIRED TO START UP ROUTINE
8108 \f
8109 ;-1(P) HAS POINTER TO SWITCH BLOCK TO UNDO.
8110 ;A HAS SECOND WORD OF THAT BLOCK.
8111 ; 4.9=1 => PERFORM FUNCTION ON PCLSR
8112 ; 4.8=1 => PERFORM FUNCTION ON ANY LSWPOP OTHER THAN PCLSR
8113 ; 4.1-4.3 => FUNCTION
8114 ; 3.1-3.9 USER # LAST LOCKED BY
8115 ; 1.1-2.9 LSWPR THREAD
8116
8117 LSWDIS: LDB T,[330300,,A]       ;FUNCTION
8118         TLNE A,400000   ;SKIP IF NOT FOR PCLSR
8119          JUMPGE U,LSWDS1        ;PCLSRED AND 4.9=1
8120         TLNN A,200000   ;NOT FOR PCLSR OR FOR PCLSR BUT NOT PCLSRED
8121          POPJ P,        ;NOT FOR EITHER LSWPOP
8122         JUMPGE U,CPOPJ  ;FOR OTHER LSWPOP BUT PCLSRED
8123 LSWDS1: JRST LSWTAB(T)
8124
8125 LSWTAB: JRST UNSWTL     ;0 (AOSE) ALSO USED FOR QUSR
8126         JRST UNLSWT     ;1 (SIGN)
8127         JRST ULROUT     ;2 (GO TO ROUTINE)
8128         JRST ULAOS      ;3 (AOS, SOS)
8129         JRST UNLST      ;4 (UNLOCK FROM LIST)
8130         JRST ULSOS      ;5 (SOS, AOS)
8131         JRST ULSTM      ;6  (SETOM)
8132         JRST ULAOSL     ;7 (AOS,SOS LEFT HALF)
8133
8134 UNSWTL: MOVE T,-1(P)
8135         SETOM (T)
8136         POPJ P,
8137
8138 ULSTM:  MOVE T,@-1(P)
8139         SETOM (T)
8140         POPJ P,
8141
8142 UNLSWT: MOVE T,@-1(P)
8143         MOVSI A,400000
8144         ANDCAM A,(T)
8145         POPJ P,
8146
8147 ULAOSL: MOVE T,@-1(P)
8148         MOVSI A,-1
8149         ADDB A,(T)
8150         JUMPGE A,CPOPJ
8151         BUG                     ;OVER-SOS'ED
8152
8153 ULAOS:  MOVE T,@-1(P)
8154         SOS (T)
8155         POPJ P,
8156
8157 UNLST:  SETOM DLSRCH
8158         MOVS T,@-1(P)
8159         HLRM T,(T)
8160         MOVSS T
8161         TRNE T,-1
8162         HLLM T,(T)
8163         SETZM DLSRCH
8164         POPJ P,
8165
8166 ULSOS:  MOVE T,@-1(P)
8167         AOS (T)
8168         POPJ P,
8169
8170 ULROUT: MOVE T,@-1(P)
8171         TLNE A,200000
8172          JRST ULROU1    ;A LOSSET - MAY CLOBBER A OR T; USR INDEX IN U
8173         HRRZM T,UPC(U)  ;IT'S A FINSET, EXPECTS THE OLD METHOD OF CALL.
8174         TLNE T,-1
8175          HLRM T,AC15S(U)
8176 IFE KA10P,[
8177         MOVSI T,%PSPCU  ;IT MIGHT TRY AN XCTR
8178         HLLM T,UPC(U)
8179 ] ;IFE KA10P
8180         TLOE U,200000   ;SIGNAL PC CLOBBERED
8181          BUG            ;PC TRIED TO BE CLOBBERED TWICE
8182         POPJ P,
8183
8184 ULROU1: JUMPGE U,(T)    ;IF LOSSET, AND LSWPOPPING,
8185         MOVE A,[B,,AC0S+B]
8186         ADDI A,(U)      ;PUT THE ACS IN THE AC0S, SINCE
8187         BLT A,AC0S+H(U) ;THAT'S WHERE THEY'LL BE IF CALL LOSSET ROUTINE WHILE PCLSRING.
8188         JRST (T)
8189 \f
8190 ;FIND SWITCH POINTED TO BY WORD AFTER
8191 ;PUSHJ P,LSWREM AND UNLOCK IT
8192 LSWREM: PUSH P,T
8193         PUSH P,U
8194         PUSH P,Q
8195         MOVE U,USER
8196         SKIPN U,LSWPR(U)
8197          BUG
8198         HRRZ Q,@-3(P)
8199         MOVEI T,1
8200 LSWRM1: CAMN U,Q
8201          JRST LSWRM2
8202         HRRZ U,1(U)
8203         SKIPN U
8204          BUG
8205         AOJA T,LSWRM1
8206 LSWRM2: POP P,Q
8207         POP P,U
8208         PUSHJ P,LSWPON
8209         AOS -1(P)
8210         JRST POPTJ
8211
8212 LSWDEL: PUSH P,U        ;REMOVE SWITCH FROM HEAD OF LIST
8213         MOVE U,USER     ;DO NOT ATTEMPT TO UNLOCK IT
8214         PUSH P,T
8215         SKIPN T,LSWPR(U)
8216          BUG
8217         PUSHJ P,LSWDDD
8218         JRST POPTUJ
8219
8220 LSWDDD: PUSH P,Q
8221         HRRZ Q,1(T)
8222         HRRZM Q,LSWPR(U)
8223         CAILE T,USRSTG
8224          SETZM 1(T)
8225         POP P,Q
8226         POPJ P,
8227
8228 ;POP C(T)'TH FROB BACK
8229 LSWPON: PUSHJ P,LSWBAK
8230         PUSHJ P,LSWPPP
8231         POPJ P,
8232
8233 ;DELETE C(T)'TH FROB BACK
8234 LSWDLN: PUSHJ P,LSWBAK
8235         PUSHJ P,LSWDDD
8236         POPJ P,
8237
8238 LSWBAK: PUSH P,U
8239         MOVE U,USER
8240         TLO U,400000    ;SIGNAL NOT PCLSR IN CASE OF LSWPPP
8241         PUSH P,Q
8242         MOVE Q,T
8243         MOVEI T,LSWPR-1(U)
8244         SOJE Q,LSWBA3   ;UNLOCKING FIRST FROB
8245         MOVE T,1(T)
8246         SOJG Q,.-1
8247 LSWBA2: MOVE Q,T
8248         HRRZ T,1(T)
8249         PUSH P,LSWPR(U) ;DON'T WORRY, YOU CAN'T GET PCLSR'ED JUST BELOW
8250         XCT @-3(P)
8251         HRRZ T,LSWPR(U)
8252         HRRM T,1(Q)
8253         POP P,LSWPR(U)
8254         JRST POPQU1
8255
8256 LSWBA3: MOVE T,LSWPR(U)
8257         XCT @-2(P)
8258         JRST POPQU1
8259 \f
8260 SUBTTL VARIOUS RETURNS
8261
8262 PPBAJ1: POP P,B
8263 POPAJ1: AOSA -1(P)
8264 POPBAJ: POP P,B
8265 POPAJ:  POP P,A
8266 CPOPJ:  POPJ P,
8267
8268 POPQJ:  POP P,Q
8269         POPJ P,
8270
8271 POPBJ1: AOSA -1(P)
8272 POPCBJ: POP P,C
8273 POPBJ:  POP P,B
8274         POPJ P,
8275
8276 POPJ3:  AOS (P)
8277 POPJ2:  AOSA (P)
8278 POPCJ1: POP P,C
8279 POPJ1:  AOSA (P)
8280 POPCJ:  POP P,C
8281         POPJ P,
8282
8283 POPJJ1: AOS -1(P)
8284 POPJJ:  POP P,J
8285         POPJ P,
8286
8287 POPUJ1: AOSA -1(P)
8288 POPTUJ: POP P,T
8289 POPUJ:  POP P,U
8290         POPJ P,
8291
8292 POPTJ:  POP P,T
8293         POPJ P,
8294
8295 POPTTJ: POP P,TT
8296         POPJ P,
8297
8298 POPWJ2: AOS -1(P)
8299 POPWJ1: AOS -1(P)
8300 POPWJ:  POP P,W
8301         POPJ P,
8302
8303 PIONJ:  CONO PI,PION
8304         POPJ P,
8305
8306 CKOCJ1: CONO PI,CLKON
8307         JRST POPCJ1
8308
8309 CLKOJ1: AOS (P)
8310 CLKONJ: CONO PI,CLKON
8311         POPJ P,
8312
8313 CKOPJ1: AOS (P)
8314 CLKOPJ: CONO PI,CLKON
8315         JRST LSWPOP
8316
8317 IFN OMXP,[
8318 OMXONJ: CONO PI,OMXON
8319         POPJ P,
8320 ]
8321
8322 TTYOJ1: AOS (P)
8323 TTYONJ: CONO PI,TTYON
8324         POPJ P,
8325
8326 IFN PTRP, PTRONJ:: PTPONJ::
8327 LPTONJ: CONO PI,LPTON
8328         POPJ P,
8329
8330 IFN NETP,NETOJ1:
8331 UTCOJ1: AOSA (P)
8332 UTCOAJ:  POP P,A
8333 IFN NETP,NETONJ:
8334 UTCONJ: CONO PI,UTCON
8335         POPJ P,
8336
8337 POPQU1: AOS -2(P)
8338 POPQUJ: POP P,Q
8339         POP P,U
8340         POPJ P,
8341
8342 POP1J1: AOS -1(P)
8343 POP1J:  SUB P,[1,,1]
8344         POPJ P,
8345
8346 POP2J:  SUB P,[2,,2]
8347         POPJ P,
8348
8349 POP3J1: AOS -3(P)
8350 POP3J:  SUB P,[3,,3]
8351         POPJ P,
8352
8353 POP4J:  SUB P,[4,,4]
8354         POPJ P,
8355
8356 POP7J:  SUB P,[2,,2]
8357 POP5J:  SUB P,[5,,5]
8358         POPJ P,
8359 \f
8360 SUBTTL UUO PROCESSOR
8361
8362 .IOT=UUOMIN
8363 .OPEN=UUOMIN+1_27.
8364 .OPER=UUOMIN+2_27.
8365 .CALL=UUOMIN+3_27.
8366 .USET=UUOMIN+4_27.
8367 .BREAK=UUOMIN+5_27.
8368 .STATUS=UUOMIN+6_27.
8369 .ACCESS=UUOMIN+7_27.
8370
8371 DEFINE GLOSYM X
8372         IRP Y,,[X]
8373         SQUOZE 4,.!Y
8374         .!Y
8375         TERMIN
8376         TERMIN
8377
8378 ;REPEAT OVER USET NAMES FROM 0 TO 77.
8379         DEFINE USTIRP A
8380         IRPS X,,[UPC VAL TTY FLS UNAME JNAME MASK USTP
8381 PIRQC INTB MEMT SV40 IPIRQ APIRQ SNAME PICLR
8382 MARA MARPC UUOH UIND RUNT MSK2 IFPIR APRC
8383 CNSL UTRP IIFPI AIFPI IMASK AMASK IMSK2 AMSK2
8384 JPC OPC RTMR HSNAME BCHN MPVA IDF1 ADF1
8385 IDF2 ADF2 DF1 DF2 OPTION 40ADDR TVCREG
8386 TTST TTS1 TTS2 WHO1 WHO2 WHO3 SUPPRO TR1INS
8387 TR2INS MBOX MBO1 EBOX EBO1 XUNAME XJNAME FTL1 FTL2]
8388 A
8389 TERMIN
8390 TERMIN
8391
8392 ;REPEAT OVER USET NAMES 600 AND UP.
8393         DEFINE USTIR1 A
8394         IRPS X,,[PAGRAN PAGAHD SERVER]
8395            A
8396         TERMIN TERMIN
8397
8398 ;NOTE:  OPER'S BELOW ARE 8 PER LINE
8399 ;    USE UP ILUUO'S BEFORE ADDING TO END
8400 ; THE FOLLOWING SHOULD GO AWAY EVENTUALLY
8401 ;       ITYI (=ITYIC)
8402 ;       SETMSK (=SUSET)
8403 ;       WSNAME (=SUSET)
8404 ;       UPISET (=SUSET)
8405 ;       RDSW (=DATAI)
8406 ;       EOFC (OBSOLETE)
8407 DEFINE OPRIRP A
8408         IRPS X,,[ITYI LISTEN SLEEP SETMSK SETM2 DEMON CLOSE
8409 UCLOSE ATTY DTTY IOPUSH IOPOP DCLOSE DSTOP RDTIME
8410 RDSW GUN UDISMT GETSYS IPDP GETLOC SETLOC DISOWN
8411 DWORD DSTEP GENSYM LOGOUT REALT WSNAME UPISET RESET
8412 ARMOVE DCONTIN CBLK ASSIGN DESIGN RTIME RDATE HANG
8413 EOFC IOTLSR RSYSI SUPSET PDTIME ARMRS UBLAT IOPDL
8414 ITYIC MASTER VSTST NETAC NETS REVIVE DIETIM SHUTDN
8415 ARMOFF NDIS FEED EVAL REDEF IFSET UTNAM UINIT
8416 RYEAR RLPDTM RDATIM RCHST RBTC DMPCH SWAP MTAPE
8417 GENNUM NETINT]
8418         A
8419 TERMIN
8420 TERMIN
8421
8422 DEFINE CALIRP A
8423 IRPS X,,[DISMIS LOSE TRANAD VALUE UTRAN CORE TRAND
8424 DSTART FDELE DSTRTL SUSET LTPEN VSCAN POTSET]
8425 A TERMIN TERMIN
8426 \f
8427 ;THESE ARE THE SYMBOLS USED BY MIDAS AND DDT. THEY ALSO
8428 ;EXIST IN SYS:ITS DEFS.
8429 ;SYMBOLS SHOULD BE LEFT IN CURRENT ORDER OR DDT WILL LOSE
8430 SYSYMB: USTIRP [SQUOZE 44,.R!X
8431         .IRPCNT]
8432         SQUOZE 44,.RIOC
8433         100
8434         SQUOZE 44,.RIOS
8435         120
8436         SQUOZE 44,.RIOP
8437         140
8438         SQUOZE 44,.RPMAP
8439         200
8440         USTIR1 [SQUOZE 44,.R!X
8441         600+.IRPCNT]
8442         USTIRP [SQUOZE 44,.S!X
8443         400000+.IRPCNT]
8444         USTIR1 [SQUOZE 44,.S!X
8445         400600+.IRPCNT]
8446
8447         GLOSYM [IOT,OPEN,OPER]
8448
8449 DEFINE DEFSYM X/
8450 IRPS Z,,[X]
8451 SQUOZE 44,Z
8452 Z
8453 .ISTOP
8454 TERMIN TERMIN
8455
8456 .INSRT BITS >
8457
8458 EXPUNG DEFSYM
8459
8460         ZZ=1
8461         OPRIRP [IFSN X,ILUUO,[.!X=.OPER ZZ
8462         SQUOZE 4,.!X
8463         .!X]
8464         ZZ==ZZ+1]
8465
8466 MXOPR==ZZ
8467
8468         SQUOZE 4,.CALL
8469         .CALL
8470
8471 CALIRP [
8472 IFSN X,UNUSD,[
8473         .!X=.CALL .IRPCNT+1,
8474         SQUOZE 4,.!X
8475         .!X
8476 ]]
8477
8478         GLOSYM [USET,BREAK,STATUS,ACCESS]
8479 SYSYME==.-1
8480 \f
8481 ;THESE SYMBOLS ARE USED BY DDT, SO THE USER CAN OPEN .PIRQC, ETC.
8482                 ;BEGINNING FOR .GETSYS (USYMS)
8483 SYSUSB:
8484 USTIRP [
8485         SQUOZE 4,.!X
8486         .IRPCNT
8487 ]
8488         SQUOZE 4,.IOC
8489         100
8490         SQUOZE 4,.IOS
8491         120
8492         SQUOZE 4,.IOP
8493         140
8494         SQUOZE 4,.PMAP
8495         200
8496 USTIR1 [
8497         SQUOZE 4,.!X
8498         600+.IRPCNT
8499 ]
8500 SYSUSE==.-1     ;END FOR .GETSYS (USYMS)
8501
8502 ;SIXBIT NAME TABLES FOR WHO LINE GENERATION.
8503 ;ALSO USED BY PEEK FOR PRINTING OUT JOBS' STATUS.
8504
8505 OPRSXB: SIXBIT/OPER/
8506 OPRIRP [
8507 .1STWD  SIXBIT/X/
8508 ]
8509
8510 CALSXB: SIXBIT/CALL/
8511 CALIRP [
8512 .1STWD  SIXBIT/X/
8513 ]
8514         SIXBIT/UNUSD/
8515
8516 UUOSXB:
8517 IRPS X,,IOT OPEN OPER CALL USET BREAK STATUS ACCESS
8518 .1STWD  SIXBIT/X/
8519 TERMIN
8520 NUUOSX==.-UUOSXB
8521 \f
8522 ;MACRO TO SAVE ACS AS APPROPRIATE FOR OUR CPU, LOAD UP U,
8523 ;CHECK VARIOUS ERROR CONDITIONS.
8524
8525 DEFINE UUOSAV
8526         CONSZ PI,77400
8527          BUG AWFUL,[UUO WITH PI IN PROGRESS]
8528 IFN KA10P,[
8529         UMOVEM U,17             ;SAVE 17
8530         SKIPGE U,USER           ;LOAD CURRENT USERS INDEX,
8531          BUG AWFUL,[UUO IN NULL JOB]
8532         UMOVEM T,16             ;SAVE LOC 16 FOR USER
8533         MOVEI T,0               ;HA HA
8534         XCTR XBW,[BLT T,15]     ;SAVE REST OF ACS IN USERS SHADOW 0-15
8535 ] ;KA10P
8536 IFE KA10P,[
8537         SYSCTX
8538         SKIPGE U,USER
8539          BUG AWFUL,[UUO IN NULL JOB]
8540         LDB T,[330300,,MUUOCX(U)]
8541         CAIE T,1
8542          BUG AWFUL,[UUO WHILE IN AC BLK ],DEC,T
8543 ] ;IFE KA10P
8544 TERMIN
8545
8546 ; UUO AND ILLOP TRAP HANDLER
8547 ;
8548 ;EITHER DISPATCHES TO APPROPRIATE UUO ROUTINE,
8549 ;   RETURNS CONTROL TO USERS UUO ROUTINE, GOES TO ILLOP, USRTRP, OR USRIOT.
8550 ;CODE ON THIS PAGE IS INTERRUPTABLE AT ANY POINT
8551
8552 ;COME HERE TO RETURN A UUO TO THE USER. RESTORES USER ACS W THROUGH U ONLY.
8553 USRUUO: CAIG U,LUBLK
8554          BUG AWFUL,[RETURNABLE UUO FROM SYS OR CORE JOB,PC=],OCT,UUOH
8555         MOVE W,UUOH
8556         TLNN W,%PCUSR
8557          BUG AWFUL,[RETURNABLE UUO FROM EXEC MODE,PC=],OCT,UUOH
8558         HRRZ W,40ADDR(U)
8559         MOVE P,USRPDL(U) ;IN CASE AN XCTR FAULTS.
8560         XCTR XR,[HLRZ H,1(W)]
8561         CAIE H,(JSR)    ;ELSE OK ONLY IF OPCODE IN 41 IS 0 OR JSR.
8562          JUMPN H,ILUUO  ;THIS IS IN CASE USER IS HANDLING USER-UUO'S WITH PUSHJ
8563                         ;AND HIS UUOH ISN'T ABLE TO BE JSR'D TO.
8564         XCTR XR,[HRRZ H,1(W)]
8565         JUMPE H,ILUUO           ;0 ISN'T ACCEPTABLE AS UUOH ADDRESS.
8566         MOVE T,FORTY
8567         UMOVEM T,(W)    ;ALL IS LEGAL; PLANT UUO INTO USERS "40".
8568         MOVE T,UUOH     ;SIMULATE A JSR AT USER'S "41"
8569         UMOVEM T,(H)
8570         AOS H
8571         HRRM H,UUOH     ;SET TO RETURN TO USER AT FIRST INSTRUCTION OF UUO HANDLER
8572 IFN KA10P,[
8573         MOVE U,[W,,W]
8574         XCTR XBR,[BLT U,U]
8575 ] ;KA10P
8576 ULEAVE: USRCTX          ;SELECT USER MODE AC BLOCK IF NEC.
8577
8578 EBLK
8579
8580 ;THE FOLLOWING BLOCK OF LOCATIONS IS SWITCHED WITH SOME USER VARS
8581
8582 UEXIT:  JRST 2,@XUUOH   ;EXIT FROM UUO (FOR KL-10, POINTS TO APPROPRIATE
8583                         ;UPT LOC) 
8584
8585 CLUSAV: MOVEM U,AC17S   ;CLOCK SAVE OF U
8586
8587 IFE KA10P,[
8588 CLCXSV: DATAI PAG,CLCX  ;CLOCK LEVEL CONTEXT SAVE
8589 ] ;IFE KA10P
8590
8591 IFN KA10P,[
8592 XUUOH:  0               ;UUO AND ILLOP TRAP GETS HERE - UUOH0 MUST BE . + 1.
8593 ] ;KA10P
8594
8595 UEXND:: ;END OF SWAPPED UEXIT BLOCK.
8596
8597 BBLK
8598
8599 UUOH0:  UUOSAV
8600 MUUOT1: SKIPGE UTRAPM(U) ;IF SUPERIOR WANTS TO CATCH UUOS, THIS IS FATAL INT.
8601          JRST USRTRP
8602         SKIPGE T,FORTY  ;PICK UP THE UUO OR ILLOP
8603          JRST USRIOT
8604         CAML T,[UUOMIN]
8605          CAML T,[UUOMAX]
8606           JRST USRUUO   ;NOT A SYSTEM CALL, GIVE TO USER
8607 ;DROPS THROUGH
8608 \f;DROPS IN
8609 ;HERE WITH UUO TO BE HANDLED BY SYSTEM IN T
8610 ILLOP1: JUMPN U,UUOH1
8611         MOVEI Q,0       ;SAVE SYS JOB EXEC MODE LSWPR PNTR
8612         EXCH Q,LSWPR
8613         MOVEM Q,SLSWPR
8614 UUOH1:  SKIPE LSWPR(U)
8615          JRST 4,.
8616         MOVEM T,LSUUO(U)        ;SAVE UUO FOR DEBUGGING PURPOSES
8617         LSH T,-27.              ;RIGHT JUSTIFY OP CODE
8618         SKIPL UUODSP-UUOMIN_-27.(T)
8619          JRST UUOTR3
8620         MOVE H,OPTION(U)
8621         TLNE H,%OPDEC
8622          JRST USRUUO
8623 UUOTR3: SETZM SYSCVL(U)         ;DIDN'T GET INTO SYSTEM VIA .CALL
8624         MOVE P,USRPDL(U)        ;SET UP USER PDL
8625         HRRZ C,FORTY            ;PICK UP EFFECTIVE ADDRESS OF UUO
8626         LDB R,[270400,,FORTY]   ;PICK UP AC FIELD OF UUO
8627         MOVEM R,UUAC(U)         ;SAVE AC FLD
8628         PUSHJ P,@UUODSP-UUOMIN_-27.(T)  ;DISPATCH ON UUO TYPE
8629          JRST URET      ;NORMAL RETURN (NON SKIP)
8630 URETJ1:
8631 IFE KA10P, MOVE U,USER  ;(SINCE UUOH IS IN THE USER VARIABLES)
8632         AOS UUOH        ;UUO ROUTINE SKIPPED, AOS USER RETURN POINT
8633 URET:   MOVE U,USER
8634         MOVE A,PIRQC(U) ;CHECK FOR RETURNING TO USER WITH PCLSR'ING FATAL
8635                         ; INT SET.
8636         TDNE A,[BADBTS&#<%PIC.Z\%PIDIS>] ;A FEW BITS ARE FATAL BUT SET
8637                                          ; ASYNCHRONOUSLY.
8638          JRST [ HRRZ A,UEXIT            ;INT SET, MAKE SURE UEXIT IS CLOBBERED
8639             IFN KA10P, CAIE A,ONEPRO    ;TO A LOCATION WHICH WILL CHECK PIRQC.
8640             IFN KS10P, CAIE A,ONEPR4
8641                 CAIE A,ONEFLS
8642                  BUG
8643                 JRST .+1]
8644         SKIPE UMAPS(U)
8645          PUSHJ P,MPLDZ
8646         CAMN U,PCLUSR
8647          SKIPG PCLDBM
8648           JRST URET2
8649         SKIPL PCLNXT
8650          JRST URPCL1
8651 URET2:  SKIPE LSWPR(U)
8652          BUG
8653         JUMPN U,URETC
8654         MOVEI T,0       ;RESTORE SYS JOB EXEC LSWPR
8655         EXCH T,SLSWPR
8656         MOVEM T,LSWPR
8657 URET1:  CONSO PI,1
8658          BUG            ;RETURNING TO USER MODE WITH CLOCK OFF
8659 IFN KA10P,[
8660         MOVEI U,0
8661         XCTR XBR,[BLT U,U]      ;RESTORE USERS ACS FROM USERS SHADOW 0-17
8662 ] ;KA10P
8663         JRST ULEAVE
8664
8665 URETC:  REPEAT NULBLK/2,[
8666         SKIPN CONC LSWB,\<2*.RPCNT>,+1(U)
8667         SKIPE CONC LSWB,\<2*.RPCNT+1>,+1(U)
8668         BUG
8669 ]
8670         REPEAT NULBLK&1,[
8671         SKIPE CONC LSWB,\<NULBLK-1>,+1(U)
8672         BUG
8673 ]
8674         JRST URET1
8675
8676 URPCL1: SKIPN LSUUO(U)
8677         JRST URET2      ;DIDN'T REALLY MISS MARK (DUE TO FINSET)
8678         SETOM PCLNXT    ;MISSED MARK, REINITIALIZE
8679         SETZM PCLL
8680         SETZM PCLHSH
8681         JRST URET2
8682
8683 UUOTRO: MOVE T,FORTY
8684         JRST UUOH1
8685
8686 USRIOT: MOVSI T,(UIOT)  ;I/O INST TURNS INTO PSEUDO UUO TO DISPATCH ON
8687         JRST ILLOP1
8688 \f
8689 IFE KA10P,[
8690
8691 ;HANDLE UUOS EXECUTED FOR TRAPS (PDL OV, ARITH OV, ONE PROCEED).
8692 ;MOST ARE AS USUAL, BUT OPCODE 0 IORM'S ADDRESS INTO PIRQC.
8693 ;NOTE: LOSER IS NOT PERMITTED TO USE OPCODE 0 - SEE USTR1I, ETC.
8694
8695 MUUOTR: UUOSAV
8696         MOVE T,FORTY
8697         TLNE T,-1
8698          JRST MUUOT1    ;IF OPCODE ISN'T 0, TREAT UUO NORMALLY (STARTING A
8699                         ; ONE PROCEED)
8700         MOVSI A,%PSTR1+%PSTR2
8701         ANDCAB A,UUOH   ;TURN OFF TRAP FLAGS, GET PC
8702         TRNN T,%PIARO
8703          JRST MUUOT2
8704         TLNE A,%PCFOV   ;DISTINGUISH FIXED AND FLOATING OVERFLOW.
8705          TLO T,(%PIFOV)
8706 MUUOT2: MOVE A,MSKST(U)
8707         IOR A,[BADBTS]
8708         AND T,A         ;INTS SETTING WHICH AREN'T DISABLED
8709         IORM T,PIRQC(U)
8710         SKIPN PICLR(U)
8711          TDZA A,A
8712           SETCM A,IDF1(U)
8713         IOR A,[BADBTS]  ;MASK FOR INTS WHICH AREN'T DEFERRED
8714         TDNE T,A
8715          JRST ONEPR1    ;TAKE INT
8716         JRST URET       ;IGNORE INT
8717
8718 MUUOEX: BUG AWFUL,[MUUO IN EXEC MODE, PC=],OCT,EPT+425
8719                         ;UUO IN EXEC MODE NOT IN SYS JOB
8720
8721 LUUOEX: 0
8722         BUG AWFUL,[LUUO IN EXEC MODE,PC=],OCT,LUUOEX
8723
8724 ILLTRP: 0
8725         BUG AWFUL,[TRAP IN EXEC MODE,PC=],OCT,ILLTRP
8726 ] ;IFE KA10P
8727
8728 IFN KA10P,[
8729 EBLK
8730 60H:    0               ;TRAPS FROM 60
8731 BBLK
8732 60H0:   UUOSAV          ;IF WE LOSE PROCESSOR HERE, 60 GETS COPIED INTO 40,
8733                         ; 60H IS COPIED INTO UUOH, AND UPC GETS MOVED INTO
8734                         ; UUOH0.
8735 60HE:   CONO PI,CLKOFF
8736         MOVE T,60H
8737         MOVEM T,UUOH
8738         MOVE T,60
8739         MOVEM T,FORTY
8740         CONO PI,CLKON
8741         JRST MUUOT1
8742 ] ;KA10P
8743 \f
8744 ;COME HERE FROM UEXIT WHEN USER IS BEING PCLSR'ED
8745 ; KA10 - ALL USER ACS ARE IN MACHINE ACS AND IN UUOACS
8746 ; KL10 & KS10 - ALL USERS ACS ARE IN AC BLOCK 1
8747
8748 ONEFLS: CONO PI,CLKOFF          ;TURN OFF CLOCK BREAKS
8749         SYSCTX
8750         MOVE U,USER             ;GET INDEX OF CURRENT USER
8751 ONEPR2: SKIPE T,RPCL(U)         ;SKIP IF NO RPCLSRING OCCURING
8752          JRST ONEFL2            ;RPCLSRING GOING ON
8753 ONEPR1: MOVE U,USER             ;GET INDEX OF CURRENT USER
8754         CONO PI,CLKOFF          ;TURN OFF CLOCK BREAKS
8755         SKIPE LSWPR(U)
8756          JRST 4,.
8757         MOVEI T,AC0S(U)         ;PUT USER ACS INTO SWAP OUT ACS
8758         XCTR XBR,[BLT T,AC17S(U)]
8759         MOVE T,UUOH
8760         MOVEM T,UPC(U)          ;SIMULATE JRST 2,@UUOH
8761 IFN KA10P, MOVE T,[JRST 2,@UUOH]
8762 IFE KA10P,[
8763         MOVSI T,(JRST 2,@)
8764         HRRI T,UUOH
8765 ] ;IFE KA10P
8766         MOVEM T,UEXIT           ;RESTORE UEXIT
8767         USRCTX
8768         MOVE U,USER             ;AS IF HAD RETURNED TO USER THEN CLKBRK
8769                                 ;EXCEPT THAT AC'S ARE ALREADY STORED IN AC0S
8770         JRST UFL6               ;RESCHEDULE, ETC
8771
8772 ONEFL2: JUMPG T,[JRST 4,.]      ;LOSEY LOSEY (SHOULD NOT TRY TO EXIT WHILE TRYING TO RPCLSR SOMEONE)
8773         MOVE A,FLSINS(T)        ;GET FLSINS OF USER SUPPOSEDLY RPCLSRING YOU
8774         SUBI A,RPCL(T)          ;HIS FLSINS SHOULD BE A SKIPE OF HIS RPCL
8775         CAME A,[SKIPE]          ;SKIP IF HE HAS THE RIGHT FLSINS
8776          JRST 4,.               ;LOSEY LOSEY
8777         CLEARM FLSINS(T)        ;ASSURE NO INTERRUPT
8778         SETZM RPCL(U)           ;ACS IN UUO ACS CLOCK OFF
8779         AOS USTP(U)             ;STOP SELF
8780         SETZM RPCL(T)           ;UNHANG LOSER RPCLSR'ING YOU
8781         JRST ONEPR1
8782 \f
8783 ;ROUTINES TO GIVE THE RUNNING JOB AN INTERRUPT AND ABORT THE CURRENT INSTRUCTION
8784
8785 TTYLOS: SKIPA T,[%PITTY] ;JOB WHOSE %TBINT IS SET TRIED TO USE ITS TTY WHEN DIDN'T OWN IT
8786 IOADC:   MOVEI T,%PIMPV ;I/O UUO MEMORY PROTECT VIOLATION
8787         JRST UUOERR
8788
8789 ABREAK: MOVEI T,%PIBRK  ;.BREAK - INTERRUPT TO SUPERIOR
8790 ILLOP4: IORM T,PIRQC(U)
8791         JRST ONEPR1
8792
8793         RADIX 10.
8794 IOCERF: ;ADDRESS OF FIRST IO CHANNEL ERROR
8795 ZZ==NIOTER
8796 IFG ZZ-9,ZZ==9
8797 REPEAT ZZ,CONC IOCER,\.RPCNT+MIOTER,:   JSP T,IOCERX
8798 IFG NIOTER-9,[REPEAT NIOTER-9,CONC IOCR,\.RPCNT+MIOTER+9,:      JSP T,IOCERX
8799 ]
8800 IFN 0, IOCER1: IOCER2: IOCER3: IOCER4: IOCER5: IOCER6: IOCER7:  ;FOR @
8801 .ALSO  IOCER8: IOCER9: IOCR10: IOCR11: IOCR12: IOCR13: IOCR14:
8802
8803         RADIX 8
8804 IOCERX: CONSZ PI,77400
8805          JRST 4,.       ;ERR WITH PI IN PROGRESS
8806         SUBI T,IOCER9-9+1
8807         MOVE U,USER
8808         HRRZ TT,UUAC(U)
8809         DPB TT,[BCHPTR] ;STORE LAST CHNL IN ERROR
8810         ADD TT,U
8811         DPB T,[330600,,IOCHST(TT)]
8812 IOCERR: MOVEI T,%PIIOC
8813         JRST UUOERR
8814
8815 AILUUO::
8816 ILUUO:  SKIPA T,[%PIILO]        ;ILLEGAL SYSTEM UUO
8817 TRPDEV:                         ;ATTEMPTED USE OF TRAP DEVICE
8818 USRTRP:  MOVSI T,(%PITRP)       ;SYSTEM UUO IN TRAP MODE
8819
8820 UUOERR: MOVE U,USER
8821         IORM T,PIRQC(U) ;GIVE USER INT BIT
8822 IOADCR: MOVE U,USER
8823         MOVE T,OPTION(U);PC CLOBBERED TO HERE IF MPV IN EXEC MODE - INTR OUT OF UUO
8824         TLNN T,%OPOPC   ;UNLESS USER HAS SAID NOT TO,
8825          AOS UUOH       ;UNDO SOS THAT PCLSR'ING WILL DO; PC SHOULD END UP -> AFTER UUO.
8826 UUOER2: CONO PI,CLKON   ;THERE HAD BETTER BE A CLASS 1 OR 2 INT. PENDING.
8827         MOVE P,USRPDL(U)
8828         SETZM SCHMNY    ;CAUSE FULL SCHEDULE SO INTERRUPT WILL BE SEEN
8829         JFCL            ; (IT'S A CROCK TO HAVE TO DO THIS, BUT HARD TO FIX)
8830         PUSHJ P,UFLS    ;LET THE INTERRUPT PCLSR US.
8831         JRST 4,.
8832
8833 UUOER1: MOVE U,USER     ;UUOERR ASSUMING %OPOPC
8834         IORM T,PIRQC(U)
8835         JRST UUOER2
8836
8837 IFN KA10P,[
8838 ILEXPF: CONO PI,CLKOFF  ;GET HERE AFTER EXEC PAGE FAULT TAKEN ON XCTRI
8839         SPM UPGML(U)
8840         MOVSI A,1770    ;CLEAR FAULT REASON BITS
8841         ANDCAM A,UPQUAN(U)
8842         LPMR UPGML(U)
8843         JRST ILUUO
8844 ] ;KA10P
8845 IFE KA10P, ILEXPF==ILUUO        ;NO CLEANUP NECESSARY
8846 \f
8847 ;UUO DISPATCH
8848
8849 ;AT DISPATCH TIME, P HAS UPDL, C HAS RH OF 40
8850 ;R HAS AC FIELD OF UUO, U HAS USER INDEX
8851
8852 UUODSP: SETZ AIOT       ;SETZ FLAGS UUO'S TO REFLECT TO USER WHEN %OPDEC OPTIONS
8853         SETZ AOPEN      ;IN EFFECT. THEY ARE THE UUOS WHICH OVERLAP DEC
8854         AOPER
8855         ACALL
8856         AUSET
8857         ABREAK
8858         ASTATUS 
8859         SETZ AACCESS
8860         SETZ AUIOT
8861 IF2,IFN <UIOT-UUOMIN>_-27.+UUODSP-.+1,.ERR LOSE AT UUODSP
8862
8863 ;.CALL IOT
8864 NIOT:   CAIL W,3        ;SET IOTBTS TO USER'S 3RD ARG, OR TO 0.
8865          SETZ C,
8866         MOVEM C,IOTBTS(U)
8867         HRRZ C,B        ;ADDRESS OF 2ND ARG
8868         SKIPGE SYSCVL(U)
8869          SKIPA C,[SETZ] ;USING OUTPUT ARG INSTEAD OF INPUT, FOR UNIT INPUT MODE
8870           CAIL W,2
8871            AOSA (P)     ;GOING TO SUCCEED NOW
8872             JRST OPNL30 ;NOT ENOUGH ARGS
8873         JRST AIOT1
8874
8875 ;.IOT
8876 AIOT:   SETZM CTLBTS(U)
8877         SETZM IOTBTS(U)
8878         ADDI R,IOCHNM(U) ;GET IOCHNM WD ADDR IN R.
8879 AIOT1:  MOVE A,U
8880         IDIVI A,LUBLK
8881         SKIPE B
8882          BUG
8883         HLRZ A,(R)      ;PICK UP LEFT HALF (DEVICE DEPENDENT)
8884         HRRZ B,(R)      ;PICK UP RIGHT HALF (INDEX INTO IOTTB, ETC.)
8885         MOVE D,IOTTB(B) ;GO TO ROUTINE FOR PARTICULAR DEV AND MODE
8886         TLNE D,%IOTOT+%IOTBK+%IOTSP     ;BUT FOR "NORMAL" UNIT MODE INPUT, SPECIAL:
8887          JRST (D)
8888         XCTR XRW,[MOVES (C)] ;MAKE SURE XCTR XW, BELOW WON'T PCLSR.
8889         PUSH P,C
8890         PUSHJ P,(D)     ;CALL IOT ROUTINE, EXPECTING VALUE IN W.
8891 AIOT3:   JRST AIOT2     ;NOTE AIOT3 MAY BE CHECKED FOR ON PDL.
8892           JRST AIOT2
8893
8894 AIOT2:  POP P,C
8895         SKIPGE C
8896          SKIPA A,W      ;RETURNING IN NEW SYSTEM-CALL STYLE
8897           UMOVEM W,(C)
8898         POPJ P,
8899
8900 ;RANDOM ACCESS
8901
8902 AACCES: HRRZ A,UUAC(U)
8903         UMOVE B,(C)
8904         MOVE T,['ACCESS]
8905         MOVEM T,LSCALL(U)       ;IN CASE PASSED TO JOB DEVICE
8906         MOVEI W,2
8907         PUSHJ P,NACCES
8908          JRST IOCER8    ;FOR .ACCESS, SIGNAL FAILURE WITH IOC ERROR.
8909         POPJ P,         ;ONLY POSSIBLE FAILURE IS CHANNEL NOT OPEN.
8910
8911 NACCES: MOVEI T,AIOCAL  ;GET <CLSTB BITS>,,<IOCHNM WD ADDR> IN R
8912         MOVSI J,NACCE1
8913         JRST CHNDCD
8914
8915 NACCE1: TLNN R,%CLSQ\%CLSU\%CLSFU
8916          JRST OPNL34
8917         HRRM B,IOCHST-IOCHNM(R) ;STORE USR .ACCESS POINTER
8918         TLNN R,%CLSQ
8919          JRST POPJ1             ;NOT DISK
8920         HLRZ I,(R)
8921         MOVEM B,QRADAD(I)       ;STORE ACCESS POINTER FOR DSK
8922         MOVSI D,%QAACC
8923         IORM D,QSRAC(I) ;SET ADR HAS BEEN HACKED FLAG
8924         JRST POPJ1
8925 \f
8926 ;SIOT SYMBOLIC SYSTEM CALL - IOT A STRING.
8927 ; 1ST ARG CHANNEL NUMBER.
8928 ; 2ND ARG BYTE POINTER
8929 ; 3RD ARG STRING LENGTH
8930 ; 4TH (OPTIONAL) ARG DEVICE-INDEPENDENT CONTROL BITS
8931 ; CTLBTS  DEVICE DEPENDENT CONTROL BITS
8932
8933 NSIOT:  TLNN B,1000     ;OBJECT IF B.P. OR COUNT IS IMMEDIATE.
8934          TLNE C,1000
8935           JRST OPNL33
8936         CAIGE W,4
8937          SETZ D,
8938         MOVEM D,IOTBTS(U)
8939         MOVE D,IOTTB(H)
8940         TLNE D,%IOTBK+%IOTSP    ;SIOT ALLOWED ONLY ON UNIT MODE CHANNELS.
8941          JRST OPNL12            ;"MODE NOT AVAILABLE".
8942         XCTR XRW,[MOVES A,(B)]  ;ENSURE BYTE POINTER WRITABLE
8943         TLNE A,(@)              ;CAN'T HACK BYTE POINTER WITH INDIRECT ADDRESSING
8944          JRST OPNL33            ;MEANINGLESS ARGS
8945         TLNE A,17
8946          PUSHJ P,NSIOT9         ;HACK INDEXING
8947         XCTR XRW,[MOVES A,(C)]  ;ENSURE BYTE COUNT WRITABLE
8948         JUMPLE A,POPAJ1         ;0 BYTES TO BE XFERED => SUCCEED IMMEDIATELY.
8949         HLRZ A,(R)
8950         MOVE TT,B               ;IN CASE SPECIAL ROUTINE WANTS TO CALL SIOKT
8951         TLNE D,%IOTBP           ;IF THERE'S A SPECIAL DEVICE ROUTINE FOR SIOT,
8952          JRST -1(D)             ;GO TO IT.
8953 ;THIS CALL IS LEGAL AND ORDINARY. LOOP, CALLING THE UNIT MODE ROUTINE.
8954 NSIOT1: PUSH P,A
8955         PUSH P,B
8956         PUSH P,C
8957         PUSH P,D                ;PUT ALL IMPORTANT INFO ON STACK FOR MAIN LOOP
8958         HRRZS (P)               ;TO LOOK AT.
8959         PUSH P,R
8960         TLNN D,%IOTOT
8961          JRST NSIOIL            ;INPUT AND OUTPUT PART HERE
8962 NSIOOL: UMOVE A,@-3(P)
8963         IBP A                   ;THIS HAIR IS TO AVOID INCREMENTING THE USER'S COPY
8964         UMOVE D,(A)             ;OF THE BYTE POINTER BEFORE THE BYTE HAS BEEN
8965         HRRI A,D                ;FINALLY TAKEN WITH NO POSSIBILITY OF PCLSR'ING OUT.
8966         LDB D,A                 ;CAN'T USE XCTR XR,[LDB D,A] BECAUSE ON THE KA10
8967         MOVE C,[SETZ D]         ;THAT WOULD USE THE LOSER'S AC A.
8968         MOVE R,(P)
8969         MOVE A,-4(P)    ;SET UP ARGS FOR IOT ROUTINE; C HAS ADDR OF VALUE.
8970         PUSHJ P,@-1(P)  ;CALL THE IOT ROUTINE.
8971         XCTR XRW,[IBP @-3(P)]   ;NOW STEP THE B.P. AND COUNT.
8972         XCTR XRW,[SOS A,@-2(P)]
8973         JUMPG A,NSIOOL
8974         JRST NSIOTX
8975
8976 NSIOIL: UMOVE A,@-3(P)
8977         IBP A           ;MAKE SURE NO FAULT IDPB'ING THE BYTE
8978         XCTR XRW,[MOVES (A)]
8979         MOVE R,(P)      ;NOW GET THE ARGS FOR THE IOT ROUTINE,
8980         MOVE A,-4(P)
8981         PUSHJ P,@-1(P)  ;AND CALL IT, WITH VALUE COMING IN W.
8982          JRST NSIOI3    ;NO SKIP => WE WIN.
8983           JRST NSIOTX   ;1 SKIP => THERE'S NO INPUT; RETURN WITHOUT STEPPING B.P.
8984                         ;2 SKIPS => THIS BYTE IS THE LAST ONE AVAILABLE.
8985         XCTR XBYTE,[IDPB W,@-3(P)]
8986         XCTR XRW,[SOS @-2(P)]
8987         JRST NSIOTX
8988
8989 NSIOI3: XCTR XBYTE,[IDPB W,@-3(P)]
8990         XCTR XRW,[SOS A,@-2(P)]
8991         JUMPG A,NSIOIL
8992 NSIOTX: SUB P,[5,,5]
8993         JRST POPJ1
8994
8995 NSIOT9: EXCH A,R        ;INDEXED BYTE POINTER, EVAL INDEX ONCE AND WRITE BACK
8996         PUSHJ P,ASCIND
8997         EXCH A,R
8998         UMOVEM A,(B)
8999         POPJ P,
9000 \f;
9001 ; ROUTINES TO SIMULATE SOME I/O INSTRUCTIONS WHEN EXECUTED BY USER
9002
9003 IFE KS10P,[     ; KS10 will never have any devices so we might as well punt
9004                 ; this sham right from the start.
9005
9006 AUIOT:  MOVE I,FORTY    ;GET I/O INST
9007         ANDI R,7        ;GET IOT TYPE FIELD
9008         LDB J,[320700,,FORTY]
9009         LDB D,[420200,,IOTTYP(R)]
9010         JRST @IOTTYP(R) ;DISPATCH ON TYPE
9011
9012 IOTTYP: 000000,,IOTTY3          ;BLKI
9013         000000,,IOTTY2          ;DATAI
9014         200000,,IOTTY3          ;BLKO
9015         200000,,IOTTY2          ;DATAO
9016         600000,,IOTTY2          ;CONO
9017         400000,,IOTTY2          ;CONI
9018         400000,,IOTTY1          ;CONSZ
9019         400000,,IOTTY1          ;CONSO
9020
9021 IOTTY1: CAIN J,177      ;IF EQ INST WAS 7777XX,,XXXXXX
9022         JRST ILUUO      ;USER HAS EXECUTED A SMALL NEGATIVE NUMBER
9023         JRST IOTTY2
9024
9025 IOTTY3:
9026 IFN KL10P,[
9027         MOVE C,DCHNTB(J)
9028         TRNE C,10000
9029          JRST IOTTY2    ;SPECIAL BLKI THAT IS TREATED LIKE DATAI
9030 ]
9031         TLO I,40        ;BLOCK TYPE, TURN ON BIT TO CONVERT TO UNIT
9032         UMOVE C,(I)     ;GET BLOCK POINTER
9033         ADD C,[1,,1]    ;ADVANCE
9034         TLNE C,-1       ;SKIP IF OVERFLOW
9035         AOS (P)         ;CAUSE RETURN TO SKIP
9036         UMOVEM C,(I)    ;STORE BACK
9037         HRR I,C         ;MODIFY INST ADR TO RH OF BLOCK POINTER
9038 IOTTY2: SKIPL C,DCHNTB(J)
9039         JRST IOTTYA
9040         LSH C,19.(D)
9041         SKIPL C
9042         JRST ILUUO
9043 IOTTYB: XCTR XRW,I      ;DO IOT
9044         POPJ P,         ;NORMAL RETURN
9045         JRST POPJ1      ;IOT SKIPPED RETURN
9046
9047 IOTTYA: SKIPGE DCHNTC(J)
9048         JRST ILUUO      ;SUSPICIOUS DEVICE
9049         JRST IOTTYB
9050
9051 ] ;IFE KS10P
9052
9053 IFN KS10P, AUIOT==:ILUUO        ; For now.
9054
9055 IFN 0,[         ; Simple IO instruction simulating for the KS should look
9056                 ; like this.  Unfortunately XCTR XRW,[APRID 100] clobbers
9057                 ; exec location 100.  Further investigation is needed
9058                 ; before figuring out how to deal with this.
9059
9060 AUIOT:  LDB R,[271500,,FORTY]   ; Get opcode and AC.
9061         CAIE R,APRID_-27        ; For now this is the only instruction we
9062                                 ; simulate on the KS
9063          JRST ILUUO
9064         XCTR XRW,FORTY          ; Do it
9065          POPJ P,                ; Return normally
9066         JRST POPJ1              ; It skipped (well APRID can't, but perhaps
9067                                 ; someday something else will)
9068 ] ;IFN 0
9069 \f
9070 SUBTTL .SUSET, .USET, .CALL USRVAR
9071
9072 ;COMMON CODE FOR USRVAR, TTYVAR, ETC. SYMBOLIC SYSTEM CALLS
9073 ;PUSHJ P,VARCAL WITH FIRST ARG DECODED INTO H,I,J,R; B,C,W,U SET UP AS IN .CALL
9074 ;NOTE B IS A POINTER TO THE SECOND ARG (IN BLOCK MODE IS WRITTEN BACK)
9075 ;POPJS (OR PUSHJS IN THE CASE OF BLOCK MODE) BACK WITH E CONTAINING
9076 ;VARIABLE SPEC, D INPUT DATA, W INSTRUCTION TO HACK IT (0 TO READ INTO A,
9077 ;OTHERWISE OP D, WITH RH CLEAR WHERE OP IS MOVEM, ANDCAM, ADDM, ETC.)
9078
9079 VARCAL: HRRZ E,B        ;USE 2ND ARG AND NUM OF ARGS TO DETERMINE TYPE OF OPERATION
9080         TLNE B,1000
9081          JRST VARCA1    ;IMMEDIATE 2ND ARG
9082         UMOVE E,(B)     ;GET VALUE OF 2ND ARG
9083         TLC E,777000
9084         TLCN E,777000
9085          JRST VARCBL    ;BLOCK MODE (2ND ARG LOOKS LIKE AOBJN POINTER)
9086 VARCA1: EXCH D,C        ;D GETS 3RD ARG, INPUT DATA
9087         CAIL W,4
9088          JRST VARCA2    ;JUMP IF IMMEDIATE INSTRUCTION MODE
9089         CAIGE W,3       ;SKIP IF WRITING
9090          TDZA W,W       ;W 0 FOR READING
9091           MOVSI W,(MOVEM D,) ;SIMPLE CASE OF WRITING (SEE VARCBL FOR HAIR)
9092         POPJ P,         ;CALLER WILL DO OPERATION AND POPJ1 OR OPEN-LOSS
9093
9094 VARCA2: ADD P,[2,,2]    ;IMMEDIATE INSTRUCTION MODE.  MAKE STACK SAME AS AT VARCAL.
9095         TLNN C,-1       ;E HAS VARIABLE SPEC
9096          MOVSS C        ;C GETS INSTRUCTION
9097         PUSHJ P,VARCA3  ;PERFORM THE INSTRUCTION
9098         JRST POP3J1     ;TAKE GOOD RETURN FROM THE CALL
9099
9100 VARCBL: PUSH P,J        ;BLOCK MODE.  SAVE J WHICH SOME SUSETS CLOBBER
9101         PUSH P,B        ;SAVE POINTER TO AOBJN POINTER TO SPEC,INSN PAIR LIST
9102         XCTR XRW,[MOVES B,@(P)] ;GET AOBJN POINTER, TEST WRITEABILITY
9103 VARCB1: UMOVE E,(B)     ;GET VARIABLE SPEC
9104         UMOVE C,1(B)    ;GET "INSTRUCTION"
9105         MOVE J,-1(P)    ;GET DECODED FIRST ARG OR WHATEVER (SOME USRVAR ROUTINES CLOBBER J)
9106         PUSHJ P,VARCA3  ;PERFORM THE INSTRUCTION
9107         MOVE B,[2,,2]
9108         XCTR XRW,[ADDB B,@(P)]  ;ADVANCE AOBJN POINTER
9109         JUMPL B,VARCB1          ;MORE STUFF TO DO
9110         JRST POP3J1             ;POINTER COUNTED OUT, POP B, J, PUSHJ TO VARCAL
9111
9112 VARCA3: EXCH C,R        ;HERE TO PERFORM INSTRUCTION IN C
9113         TLNE R,37
9114          PUSHJ P,ASCIND         ;EVALUATE INSTRUCTION'S EFFECTIVE ADDRESS
9115         EXCH C,R
9116         LDB B,[410300,,C]       ;GET MAJOR PDP10 OPCODE CLASS
9117         JRST @.+1(B)
9118          VARCBE         ;0 UUO ILLEGAL
9119          VARCBE         ;1 FP/BYTE ILLEGAL
9120          VARCB2         ;2 MOVE/ADD/SUB
9121          VARCBE         ;3 CAM ETC. RESERVED FOR .HANGING IN THE FUTURE
9122          VARCB4         ;4 BOOLE
9123          VARCBE         ;5 HWT ILLEGAL
9124          VARCB6         ;6 TEST
9125          VARCBE         ;7 IOT ILLEGAL
9126
9127 VARCBE: SUB P,[4,,4]    ;POP PUSHJ TO VARCA3, B, J, PUSHJ TO VARCAL
9128         JRST OPNL33     ;BAD ARG
9129
9130 VARCB6: TLNE C,006000   ;TEST INSTRUCTION - SKIP IF NO SKIP
9131          JRST VARCBE    ;SKIPPING TESTS RESERVED FOR FUTURE .HANGS
9132         TLNE C,010000   ;SKIP IF IMMEDIATE
9133          XCTR XR,[SKIPA D,(C)]
9134           HRRZ D,C
9135         TLNE C,001000   ;SKIP IF TDX OR TRX
9136          MOVSS D        ;TSX OR TLX
9137         LDB C,[370200,,C] ;GET MODIFICATION TYPE
9138         XCT (C)[JRST VARCBE     ;NO MODIFICATION OBVIOUSLY AN ERROR
9139                 MOVSI W,(ANDCAM D,) ;TXZ
9140                 MOVSI W,(XORM D,)   ;TXC
9141                 MOVSI W,(IORM D,)]  ;TXO
9142         JRST VARCBA
9143 \f
9144 VARCB4: TLNE C,002000   ;BOOLEAN INSTRUCTION - OK IF RESULT TO AC
9145          JRST VARCBE
9146         TLNN C,001000   ;SKIP IF IMMEDIATE
9147          XCTR XR,[SKIPA D,(C)]
9148           HRRZ D,C
9149         HLLZ W,C        ;SET UP OPCODE TO HAVE A+M EXCHANGED
9150         TLZ W,003777    ;AND RESULT TO BE SENT TO MEMORY
9151         TLCE W,030000
9152          TLCE W,030000
9153           TLC W,030000
9154         TLO W,(<002000,,> D,)
9155         JRST VARCBA
9156
9157 VARCB2: SETZB W,D               ;MOVE/ADD/SUB GROUP
9158         HLRZ B,C
9159         CAIN B,(MOVEM)
9160          JRST VARCBB            ;SIMPLY READING
9161         TLNE C,002000
9162          JRST VARCBE            ;RESULT MUST BE TO AC
9163         TLZ C,(0 17,)           ;CHANGE AC FIELD TO D
9164         TLO C,(0 D,)
9165         TLNE C,060000           ;SKIP IF MOVE GROUP
9166          JRST VARCB5
9167         XCTR XR,C               ;FETCH OPERAND, DO MODIFICATION IF CALLED FOR (MOVN)
9168         MOVSI W,(MOVEM D,)      ;OPERATION WILL BE SIMPLE STORE
9169         JRST VARCBA
9170
9171 VARCB5: TLC C,070000
9172         TLCE C,070000
9173          JRST VARCBE            ;NOT ADD/SUB
9174         XCTR XR,C               ;ADD TO/SUBTRACT FROM ZERO IN D
9175         MOVSI W,(ADDM D,)       ;DROP INTO VARCBA
9176
9177 ;HERE WITH E, W, D ALL SET UP FOR WRITING.
9178 VARCBA: PUSHJ P,@-3(P)          ;CALL BACK TO CALLER OF VARCAL
9179          JRST POP4J             ;LOST, POP PUSHJ TO VARCA3, B, J, VARCAL, TAKE ERR RETURN
9180         POPJ P,                 ;WON, RETURN FROM VARCA3
9181         
9182 ;HERE WITH E AND W SET UP FOR READING.
9183 VARCBB: PUSH P,C                ;SAVE ADDRESS TO BE READ INTO
9184         XCTR XRW,[MOVES (C)]    ;NO FAULT.  INSURANCE OF WRITEABILITY.
9185         PUSHJ P,@-4(P)          ;GET VALUE OF VARIABLE INTO A
9186          JRST POP5J             ;LOST POP C, VARCA3, B, J, VARCAL, TAKE ERR RETURN TO USER
9187         POP P,C                 ;WON, STORE RESULT INTO USER
9188         UMOVEM A,(C)
9189         POPJ P,                 ;AND RETURN FROM VARCA3
9190 \f
9191 USETBT: 420200,,USETL(E)        ;BYTE POINTER TO UENTRY FIELD A
9192         400200,,USETL(E)        ; " B
9193         200200,,USETL(E)        ; " C
9194         160200,,USETL(E)        ; " D
9195
9196 USETRL: 221600,,USETL(E)        ;BYTE POINTER TO UENTRY FIELD E
9197         001600,,USETL(E)        ; " F
9198
9199 ;IN EACH UENTRY ENTRY:  A IS THE METHOD FOR USET READ
9200 ;                       B IS THE METHOD FOR SUSET READ
9201 ;                       C IS THE METHOD FOR USET SET
9202 ;                       D IS THE METHOD FOR SUSET SET
9203 ;                       E & F ARE USED BY THE METHODS AS LISTED BELOW
9204 ;METHOD 0 = ILLEGAL MODE
9205 ;METHOD 1 = USE F AS RELATIVE LOC OF VAR
9206 ;METHOD 2 = USE E AS ROUTINE TO TRANSFER TO
9207 ;METHOD 3 = USE F AS ROUTINE TO TRANSFER TO
9208
9209 DEFINE UENTRY A,B,C,D,E,F
9210         ZZ==.SUCCESS
9211         A_20+B_16+E,,C_20+D_16+F
9212         IF2 [
9213         IFN 777774&<A\B\C\D>,[PRINTX /UENTRY A,B,C,D TOO BIG
9214 /]      IFN 740000&<E\F>,[PRINTX /UENTRY E,F TOO BIG
9215 /]      IFSE [E!F],[PRINTX /UENTRY E,F NULL
9216 /]      ]
9217         .SUCCESS==ZZ
9218         TERMIN
9219
9220 USETL:  UENTRY 1,1,2,0,UPCSET,UPC-USRSTG        ;.UPC
9221         UENTRY 1,1,1,1,,VALUE-USRSTG            ;.VAL
9222         UENTRY 3,3,2,2,USTTY,URTTY              ;.TTY
9223         UENTRY 1,1,0,0,,FLSINS-USRSTG           ;.FLS
9224         UENTRY 1,1,0,2,UUNAME,UNAME-USRSTG      ;.UNAME
9225         UENTRY 1,1,2,2,UJNAME,JNAME-USRSTG      ;.JNAME
9226         UENTRY 1,1,2,2,USMASK,MSKST-USRSTG      ;.MASK
9227         UENTRY 1,1,2,0,USTOP,USTP-USRSTG        ;.USTP
9228
9229         UENTRY 1,1,2,2,USPIRQ,PIRQC-USRSTG      ;.PIRQC
9230         UENTRY 2,2,0,0,UGSUPR,                  ;.INTB
9231         UENTRY 1,1,2,2,USMEMT,HUSRAD-USRSTG     ;.MEMT
9232         UENTRY 1,1,0,0,,SV40-USRSTG             ;.SV40
9233 REPEAT 2,UENTRY 1,1,2,2,IAPIRQ,PIRQC-USRSTG     ;.IPIRQ/.APIRQ
9234         UENTRY 1,1,2,2,USYNST,USYSNM-USRSTG     ;.SNAME
9235         UENTRY 1,1,2,2,UPISET,PICLR-USRSTG      ;.PICLR
9236
9237         UENTRY 2,2,3,3,URMAR,USMAR              ;.MARA
9238         UENTRY 1,1,1,1,,UMARPC-USRSTG           ;.MARPC
9239         UENTRY 1,1,0,0,,SUUOH-USRSTG            ;.UUOH
9240         UENTRY 2,2,0,0,UINDEX,                  ;.UIND
9241         UENTRY 1,2,0,0,UTRNTR,UTRNTM-USRSTG     ;.RUNT
9242         UENTRY 1,1,2,2,USMSK2,MSKST2-USRSTG     ;.MSK2
9243         UENTRY 1,1,2,2,USIFPI,IFPIR-USRSTG      ;.IFPIR
9244         UENTRY 1,1,0,0,,APRC-USRSTG             ;.APRC
9245
9246         UENTRY 3,3,0,0,,URCNSL                  ;.CNSL
9247         UENTRY 2,0,3,0,RUTRAP,SUTRAP            ;.UTRP
9248 REPEAT 2,UENTRY 1,1,2,2,IAIFPI,IFPIR-USRSTG     ;.IIFPI/.AIFPI
9249 REPEAT 2,UENTRY 1,1,2,2,IAMASK,MSKST-USRSTG     ;.IMASK/.AMASK
9250 REPEAT 2,UENTRY 1,1,2,2,IAMSK2,MSKST2-USRSTG    ;.IMSK2/.AMSK2
9251
9252         UENTRY 3,3,2,2,UJPCS,UJPCR,             ;.JPC
9253         UENTRY 2,2,0,0,UROPC,                   ;.OPC
9254         UENTRY 1,1,1,1,,RTIMER-USRSTG           ;.RTMR
9255         UENTRY 1,1,1,1,,HSNAME-USRSTG           ;.HSNAME
9256 ;IFN KL10P,UENTRY 1,1,1,1,,ULSPBR-USRSTG        ;.LSPBR
9257 ;.ELSE  UENTRY 1,1,1,1,,SRN3-USRSTG
9258         UENTRY 2,2,3,3,RUBCHN,SUBCHN,           ;.BCHN
9259         UENTRY 2,2,0,0,MPVARD                   ;.MPVA
9260 REPEAT 2,UENTRY 1,1,2,2,IADF1,IDF1-USRSTG       ;.IDF1, .ADF1
9261
9262 REPEAT 2,UENTRY 1,1,2,2,IADF2,IDF2-USRSTG       ;.IDF2, .ADF2
9263         UENTRY 1,1,2,2,USDF1,IDF1-USRSTG        ;.DF1
9264         UENTRY 1,1,2,2,USDF2,IDF2-USRSTG        ;.DF2
9265         UENTRY 1,1,1,1,,OPTION-USRSTG           ;.OPTION
9266         UENTRY 1,1,1,1,,40ADDR-USRSTG           ;.40ADDR
9267 IFE N11TYS,     UENTRY 1,1,1,1,,SRN3-USRSTG     ;.TVCREG - JOB'S CONSOLE REGISTER CONTENTS
9268 IFN N11TYS,     UENTRY 1,1,1,2,STVCRG,TVCREG-USRSTG
9269         UENTRY 1,1,1,1,,TTSTSV+2-USRSTG         ;.TTST
9270
9271         UENTRY 1,1,1,1,,TTSTSV-USRSTG           ;.TTS1
9272         UENTRY 1,1,1,1,,TTSTSV+1-USRSTG         ;.TTS2
9273         UENTRY 1,1,1,1,,UWHO1-USRSTG            ;.WHO1
9274         UENTRY 1,1,1,1,,UWHO2-USRSTG            ;.WHO2
9275         UENTRY 1,1,1,1,,UWHO3-USRSTG            ;.WHO3
9276         UENTRY 3,3,0,0,,RUSUPP                  ;.SUPPRO
9277 IFN KA10P, UENTRY 2,2,0,0,URTR1I                ;.TR1INS
9278 IFE KA10P, UENTRY 1,1,1,1,,TR1INS-USRSTG
9279 IFN KA10P, UENTRY 2,2,0,0,URTR2I                ;.TR2INS
9280 IFE KA10P, UENTRY 1,1,1,1,,TR2INS-USRSTG
9281
9282 IFE KL10P,[
9283 REPEAT 4,UENTRY 1,1,0,0,,SRN3-USRSTG
9284 ] ;IFE KL10P
9285 IFN KL10P,[
9286         UENTRY 1,0,0,0,,MBOXCT-USRSTG           ;.MBOX
9287         UENTRY 1,0,0,0,,MBOXCT+1-USRSTG         ;.MBO1
9288         UENTRY 1,0,0,0,,EBOXCT-USRSTG           ;.EBOX
9289         UENTRY 1,0,0,0,,EBOXCT+1-USRSTG         ;.EBO1
9290 ] ;KL10P
9291         UENTRY 1,1,1,1,,XUNAME-USRSTG           ;.XUNAME (USER'S REAL NAME)
9292         UENTRY 1,1,1,1,,XJNAME-USRSTG           ;.XJNAME
9293         UENTRY 1,1,1,1,,SRN4-USRSTG             ;.FTL1
9294         UENTRY 1,1,1,1,,SRN5-USRSTG             ;.FTL2
9295         UENTRY 1,1,1,1,,PAGRAN-USRSTG           ;.PAGRANGE
9296         UENTRY 1,1,1,1,,PAGAHD-USRSTG           ;.PAGAHEAD
9297         UENTRY 2,2,3,3,URSERV,USSERV            ;.SERVER
9298 MXVAL==.-USETL
9299 EXPUNGE UENTRY  ;NO MORE UENTRY'S
9300 \f
9301 MXVAL2==.RADIX 2,CONC [.LENGTH/]\MXVAL-1,/      ;BASE 2 LOG OF TABLE SIZE
9302
9303 ;SIXBIT TABLE OF USER VARIABLE NAMES.  MUST BE IN CORRECT ORDER,
9304 ;SAME AS SYSCTB.
9305
9306 USETTB: SIXBIT/ADF1/
9307         SIXBIT/ADF2/
9308         SIXBIT/AIFPIR/
9309         SIXBIT/AMASK/
9310         SIXBIT/AMSK2/
9311         SIXBIT/APIRQC/
9312         SIXBIT/APRC/
9313         SIXBIT/BCHN/
9314         SIXBIT/CNSL/
9315         SIXBIT/DF1/
9316         SIXBIT/DF2/
9317         SIXBIT/EBO1/
9318         SIXBIT/EBOX/
9319         SIXBIT/FLS/
9320         SIXBIT/FTL1/
9321         SIXBIT/FTL2/
9322         SIXBIT/HSNAME/
9323         SIXBIT/IDF1/
9324         SIXBIT/IDF2/
9325         SIXBIT/IFPIR/
9326         SIXBIT/IIFPIR/
9327         SIXBIT/IMASK/
9328         SIXBIT/IMSK2/
9329         SIXBIT/INTB/
9330         SIXBIT/IPIRQC/
9331         SIXBIT/JNAME/
9332         SIXBIT/JPC/
9333         SIXBIT/MARA/
9334         SIXBIT/MARPC/
9335         SIXBIT/MASK/
9336         SIXBIT/MBO1/
9337         SIXBIT/MBOX/
9338         SIXBIT/MEMT/
9339         SIXBIT/MPVA/
9340         SIXBIT/MSK2/
9341         SIXBIT/OPC/
9342         SIXBIT/OPTION/
9343         SIXBIT/PAGAHE/
9344         SIXBIT/PAGRAN/
9345         SIXBIT/PICLR/
9346         SIXBIT/PIRQC/
9347         SIXBIT/RTMR/
9348         SIXBIT/RUNT/
9349         SIXBIT/SERVER/
9350         SIXBIT/SNAME/
9351         SIXBIT/SUPPRO/
9352         SIXBIT/SV40/
9353         SIXBIT/TR1INS/
9354         SIXBIT/TR2INS/
9355         SIXBIT/TTS1/
9356         SIXBIT/TTS2/
9357         SIXBIT/TTST/
9358         SIXBIT/TTY/
9359         SIXBIT/TVCREG/
9360         SIXBIT/UIND/
9361         SIXBIT/UNAME/
9362         SIXBIT/UPC/
9363         SIXBIT/USTP/
9364         SIXBIT/UTRP/
9365         SIXBIT/UUOH/
9366         SIXBIT/VAL/
9367         SIXBIT/WHO1/
9368         SIXBIT/WHO2/
9369         SIXBIT/WHO3/
9370         SIXBIT/XJNAME/
9371         SIXBIT/XUNAME/
9372         SIXBIT/40ADDR/
9373 IFN .-USETTB-MXVAL, .ERR USETTB INCONSISTENT WITH USETL
9374 REPEAT 1_<MXVAL2>-<MXVAL-1>-1, <SETZ>-1 ;PAD TO POWER OF 2 WITH PLUS INFINITY
9375 \f
9376 ;THE FOLLOWING TABLE IS PARALLEL TO USETTB AND GIVES THE NUMERIC USET CODE
9377 ;WHICH SHOULD BE IN THE RANGE 0 - 77 OR 600 AND UP.
9378 USETBN: 47      ;.ADF1
9379         51      ;.ADF2
9380         33      ;.AIFPI
9381         35      ;.AMASK
9382         37      ;.AMSK2
9383         15      ;.APIRQ
9384         27      ;.APRC
9385         44      ;.BCHN
9386         30      ;.CNSL
9387         52      ;.DF1
9388         53      ;.DF2
9389         73      ;.EBO1
9390         72      ;.EBOX
9391         3       ;.FLS
9392         76      ;.FTL1
9393         77      ;.FTL2
9394         43      ;.HSNAME
9395         46      ;.IDF1
9396         50      ;.IDF2
9397         26      ;.IFPIR
9398         32      ;.IIFPI
9399         34      ;.IMASK
9400         36      ;.IMSK2
9401         11      ;.INTB
9402         14      ;.IPIRQ
9403         5       ;.JNAME
9404         40      ;.JPC
9405         20      ;.MARA
9406         21      ;.MARPC
9407         6       ;.MASK
9408         71      ;.MBO1
9409         70      ;.MBOX
9410         12      ;.MEMT
9411         45      ;.MPVA
9412         25      ;.MSK2
9413         41      ;.OPC
9414         54      ;.OPTION
9415         601     ;.PAGAHE
9416         600     ;.PAGRAN
9417         17      ;.PICLR
9418         10      ;.PIRQC
9419         42      ;.RTMR
9420         24      ;.RUNT
9421         602     ;.SERVER
9422         16      ;.SNAME
9423         65      ;.SUPPRO
9424         13      ;.SV40
9425         66      ;.TR1INS
9426         67      ;.TR2INS
9427         60      ;.TTS1
9428         61      ;.TTS2
9429         57      ;.TTST
9430         2       ;.TTY
9431         56      ;.TVCREG
9432         23      ;.UIND
9433         4       ;.UNAME
9434         0       ;.UPC
9435         7       ;.USTP
9436         31      ;.UTRP
9437         22      ;.UUOH
9438         1       ;.VAL
9439         62      ;.WHO1
9440         63      ;.WHO2
9441         64      ;.WHO3
9442         75      ;.XJNAME
9443         74      ;.XUNAME
9444         55      ;.40ADDR
9445 IFN .-USETBN-MXVAL, .ERR USETBN INCONSISTENT WITH USETL
9446 \f
9447 ;.CALL USRVAR HACK USER VARIABLES.
9448 ;ARG 1 - <JOB> SPEC
9449 ;ARG 2 - AOBJN PNTR FOR BLOCK MODE OR 0,,USER-VAR-NUMBER OR SIXBIT/USER-VAR-NAME/
9450 ;ARG 3 - DATA IF WRITING AND NOT IN BLOCK MODE. (OPTIONAL)
9451 ;ARG 4 - IMMEDIATE INSTRUCTION, OVERRIDES ARG 3. (OPTIONAL)
9452 ;VAL 1 - DATA IF READING AND NOT IN BLOCK MODE
9453
9454 NUSRVA: MOVE J,A                ;DECODE FIRST ARG
9455         JSP T,NCORUI            ;GET JOB AND LOCK ITS DIELOK
9456          JRST NUSRV0            ;DEFINITELY WRITEABLE
9457         JSP T,NCORWR            ;NOT SURE, CHECK FURTHER
9458          TLO J,(SETZ)           ;SET WRITE PROTECT BIT
9459 NUSRV0:
9460 IFN PDP6P,[
9461         TRNE J,400000
9462          PUSHJ P,NULSET
9463 ]
9464         PUSHJ P,NUSRV5          ;DO IT
9465          POPJ P,                ;LOST
9466         JRST LSWPJ1             ;WON, UNLOCK DIELOK AND TAKE SUCCESS RETURN
9467
9468 NUSRV5: PUSHJ P,VARCAL          ;DECODE ARGS, HACK BLOCK MODE, SET E, W, D.
9469 NUSRV3: SETZB B,I               ;ENTER HERE FROM .USET AND .SUSET
9470         TLNN E,-1               ;NOW DECODE USER VARIABLE SPEC
9471          JRST NUSRV1            ;JUMP IF OLD STYLE NUMERIC SPEC
9472 REPEAT MXVAL2,[                 ;SIXBIT SPEC LOOK UP IN TABLE
9473         CAML E,USETTB+1_<MXVAL2-.RPCNT-1>(B)
9474          ADDI B,1_<MXVAL2-.RPCNT-1>
9475 ]
9476         CAMN E,USETTB(B)
9477          CAIL B,MXVAL
9478           JRST OPNL11           ;ILLEGAL USER VARIABLE NAME
9479         MOVE E,USETBN(B)        ;TRANSLATE TO NUMERIC SPEC
9480 NUSRV1: JUMPE W,NUSRV2          ;READING
9481         JUMPL J,OPNL31          ;WRITING AND WRITE PROTECTED
9482         MOVEI I,2               ;MAGIC INDEX 1.2=R/W 1.1=OTHER/SELF
9483 NUSRV2: CAIN U,(J)
9484          IORI I,1
9485 IFN PDP6P,[
9486         HRRE B,J
9487         AOJE B,PDPPMT           ;USER IS PDP6
9488 ]
9489         CAIL E,600
9490          JRST [ SUBI E,500
9491                 JRST NUSRV4]
9492         CAIL E,100
9493          JRST AUSET2            ;100 TO 577 ARE .IOC, .IOS, .IOP, .PMAP VARS.
9494 NUSRV4: CAIL E,MXVAL            ;DETECT USET CODE BEYOND 6XX MAXIMUM.
9495          JRST OPNL11
9496         LDB B,USETBT(I)         ;GET METHOD BITS
9497         SOJL B,OPNL12           ;VARIABLE NOT AVAILABLE THIS MODE (WRITE PROTECT?)
9498         SOJL B,AUSVAR           ;SIMPLE VARIABLE
9499         LDB B,USETRL(B)         ;GET ADDRESS OF ROUTINE TO CALL
9500         HRRZ A,J                ;SOME ROUTINES WANT USER INDEX IN A
9501         JUMPE W,(B)
9502         CAMN W,[MOVEM D,]
9503          JRST (B)
9504         PUSH P,D                ;READ/ALTER/REWRITE
9505         PUSH P,E
9506         PUSH P,I
9507         PUSH P,W
9508         PUSH P,J
9509         TRZ I,2                 ;FIRST READ IT
9510         MOVEI W,0
9511         PUSHJ P,NUSRV4
9512          JRST POP5J             ;READ LOST
9513         POP P,J
9514         POP P,W
9515         POP P,I
9516         POP P,E
9517         POP P,D
9518         HRRI W,A
9519         XCT W                   ;MODIFY THE VALUE IN A
9520         MOVE D,A
9521         MOVSI W,(MOVEM D,)
9522         JRST NUSRV4             ;THEN WRITE IT BACK
9523 \f
9524 ;
9525 ;       .SUSET [N,,LOC] ;SAME AS .USET (SEE BELOW) BUT REFERS TO SELF
9526 ;
9527 ASUSET: HRRZ J,U        ;JOB TO BE HACKED IS SELF
9528         SETZM UUAC(U)   ;IF ERROR, RETURN LOSS IN .IOS+0
9529         JRST AUSET0
9530
9531 ;                               ;IF N&200000=1, BLOCK MODE
9532 ;       .USET CH,[N,,LOC]       ;IF N&400000=0, READS USER VAR SPECIFIED BY REST OF N
9533                                 ;       FOR INFERIOR OR FOREIGN USER OPEN ON CHANNEL CH
9534                                 ;       INTO USER LOCATION LOC
9535                                 ;IF N&400000.NE.0, SETS USER VAR SPECIFIED BY REST OF N
9536                                 ;       FOR DIRECTLY INFERIOR USER OPEN ON CHANNEL CH
9537                                 ;       FROM USER LOCATION LOC
9538 AUSET:  MOVE J,R        ;DECODE AC FIELD AS CHANNEL NUMBER
9539         PUSHJ P,AUSETJ
9540          JRST IOCER7    ;USR OP CHNL DOES NOT HAVE USR OPEN
9541 AUSET0: XCTR XR,[HRRZ B,(C)]    ;GET ADDRESS READING INTO OR WRITING FROM
9542         XCTR XR,[HLRZ E,(C)]    ;GET VARIABLE AND DIRECTION
9543         TRNE E,200000
9544          JRST ABUSET    ;BLOCK MODE
9545         TRZN E,400000
9546          JRST AUSET1    ;JUMP IF READING
9547         JUMPL J,IOCER7  ;WRITE PROTECT VIOLATION
9548         MOVSI W,(MOVEM D,)      ;FLAG WRITING
9549         UMOVE D,(B)     ;GET DATA TO WRITE
9550         PUSHJ P,NUSRV3  ;DO THE WRITE
9551          JRST ILUUO     ;LOST
9552         POPJ P,
9553
9554 ;BLOCK-MODE .USET
9555 ABUSET: TRNE E,400000
9556          TLOE J,(MOVE)  ;SET BLOCK BIT
9557           JRST ILUUO    ;BLOCK IN BLOCK LOSES
9558         UMOVE Q,(C)     ;GET AOBJN PTR AGAIN
9559 ABUST2: UMOVEM Q,(C)    ;STORE AWAY UPDATED POINTER
9560         PUSH P,C
9561         PUSH P,J
9562         MOVE C,Q
9563         PUSHJ P,AUSET0
9564         POP P,J
9565         POP P,C
9566         UMOVE Q,(C)
9567         AOBJN Q,ABUST2
9568         POPJ P,
9569
9570 AUSET1: MOVEI W,0       ;FLAG READING
9571         XCTR XRW,[MOVES (B)]    ;ENSURE WRITEABILITY
9572         PUSH P,B
9573         PUSHJ P,NUSRV3  ;GET VALUE OF VARIABLE INTO A
9574          JRST ILUUO     ;LOST
9575         POP P,J
9576 APTUAJ: UMOVEM A,(J)
9577         POPJ P,
9578
9579 ;DECODE ARG FOR USET
9580 AUSETJ: JSP T,NCRUI2
9581          JRST POPJ1
9582         JSP T,NCORWR
9583          TLO J,(SETZ)
9584         JRST POPJ1
9585
9586 AUSVAR: LDB C,USETRL+1  ;GET ADDRESS OF VARIABLE
9587         ADDI C,USRSTG(J)
9588         JUMPE W,[MOVE A,(C)
9589                  JRST POPJ1]
9590         HRR W,C
9591         XCT W
9592         JRST POPJ1
9593
9594 IFN PDP6P,[
9595 PDPPMT: MOVEI A,%JSSIX#%JSNUM   ;PDP6 HAS ONLY A FEW VARIABLES, WHICH ARE READ-ONLY
9596         CAIN E,.RUIND
9597          JRST POPJ1
9598         MOVEI A,LPDP6M*2000     ;FIXED MEM BOUND FOR PDP-6
9599         CAIN E,.RMEMT
9600          JRST POPJ1
9601         JRST POPJ1              ;IGNORE OTHER VARIABLES
9602 ]
9603 \f
9604 ;VARIABLES 100 - 577 (.IOC, .IOS, .IOP, .PMAP)
9605 AUSET2: JUMPN W,OPNL31  ;JUMP IF TRYING TO WRITE
9606         SUBI E,100
9607         CAIL E,40
9608          JRST AUSET4    ;>140=>.RIOP+M
9609         TRZE E,20
9610          JRST AUSET3    ;117<E<140=>.RIOS+M
9611         ADDI E,IOCHNM(J)        ;77<E<120=>.RIOC+M
9612 AUSETX: MOVE A,(E)      ;GET VAR
9613         JRST POPJ1
9614
9615 AUSET3: MOVE R,J        ;INFERIOR USER INDEX
9616         ADDI R,IOCHNM(E)        ;GET CHANNEL POINTER
9617         MOVE H,(R)
9618         JRST NSTATUS    ;DO A .CALL STATUS
9619
9620 AUSET4: CAIL E,40+LUIOP ;COMPARE AGAINST LAST IO PDL LOC
9621          JRST AUSET5    ;READ MAP ENTRY
9622         ADDI E,SIOCHN-40(J)     ;MAKE UP POINTER TO VAR
9623         JRST AUSETX
9624
9625 ;USET VARIABLE 200+N  --  READ MAP VARIABLE FOR PAGE N.
9626 ; (0 <= N < 400)  E CONTAINS N+100.
9627
9628 ;VALUE OF MAP WORD READ:
9629
9630 ;4.9  -  PAGE WRITEABLE.
9631 ;4.8  -  PAGE EXISTS (IF THIS OFF, WHOLE WORD IS 0)
9632 ;4.7  -  PAGE IS IN CORE.
9633 ;4.6  -  PAGE IS PUBLIC (ANYONE CAN WRITE IT)
9634
9635 ;3.1 - 3.9  -  # TIMES PAGE SHARED (LIKE CORTYP'S 4TH VALUE'S RH)
9636 ;2.1 - 2.9  -  ABS PAGE # OR PAGE # IN NEXT SHARER
9637 ;               (LIKE CORTYP'S 3RD VALUE)
9638 ;1.1 - 1.9  -  0 => ABS PAGE  (OR NO PAGE, OF COURSE)
9639 ;               -1 => UNSHARED PAGE,
9640 ;               ELSE USR NUM. OF NEXT SHARER.
9641
9642 AUSET5: CAIGE E,100
9643          JRST OPNL11
9644         PUSHJ P,SWTL
9645             CIRPSW      ;DON'T LET PAGE TABLES CHANGE.
9646         MOVEI A,-100(E) ;PAGE NUMBER IN JOB.
9647         PUSH P,J
9648         PUSHJ P,NCORT0  ;PUT CORTYP'S VALUES IN A THRU D.
9649         POP P,J
9650         PUSHJ P,LSWPOP  ;FREE CIRPSW.
9651         ANDI B,777      ;CORTYP'S 2ND VALUE IN 1.1 - 1.9
9652         DPB C,[111100,,B]       ;3RD VALUE IN 2.1 - 2.9
9653         TLO B,(D)       ;4TH VALUE RH INTO 3.1-3.9
9654         LSH D,-20.
9655         TLO B,(D)       ;4TH VAL BITS 4.8-4.9 INTO 4.6-4.7
9656         IOR A,B         ;TOGETHER WITH 1ST VALUE'S 4.8, 4.9.
9657         JRST POPJ1
9658 \f
9659 USTOP:  AOS (P)         ;GOING TO WIN
9660         JUMPN D,1USTOP  ;NONZERO VALUE => STOP THE JOB.
9661         MOVE B,APRC(A)  ;ZERO => START.
9662         TLNE B,BULGOS   ;BUT DON'T EVER START A JOB THAT'S BEING KILLED.
9663          POPJ P,
9664         JRST 1USTRT
9665
9666 1USTOP: MOVNI D,1       ;SET TO STOP
9667 1USTRT: PUSHJ P,RPCLSR  ;STOP USER IN A
9668         DPB D,[.BP BUSRC_22,USTP(A)]    ;BUSRC
9669 IFN SWPWSP,[
9670         EXCH U,A
9671         PUSHJ P,LVLOAD
9672         EXCH U,A
9673 ];SWPWSP
9674         JRST UPCLSR
9675
9676 ;SET INFERIOR'S PC
9677 UPCSET: PUSHJ P,RPCLSR  ;STOP USER IN USER MODE
9678         TLO D,%PCUSR    ;BE SURE USER MODE IS ON IN NEW PC
9679         TLZ D,BADPC     ;BE SURE PRIVILEGED BITS ARE OFF
9680         SKIPGE IOTLSR(A) ;SKIP UNLESS USER IS SUPPOSED TO BE IN IOT-USER MODE
9681          TLO D,%PCUIO   ;TURN ON IOT-USER MODE
9682         MOVEM D,UPC(A)  ;SET PC
9683         PUSHJ P,UPCLSR  ;RESTART
9684         JRST POPJ1
9685
9686 UJPCS:  CAIN U,(A)      ;SET .JPC, WITH CARE IF SETTING OWN
9687          SPM UPGML(U)
9688         HRRM D,UPJPC(A)
9689         CAIN U,(A)
9690          LPMR UPGML(U)
9691         JRST POPJ1
9692
9693 UJPCR:  CAIN U,(A)      ;READ .JPC:
9694          SPM UPGML(U)   ;IF READING ONE'S OWN, MAKE SURE IT'S UP TO DATE.
9695         HRRZ A,UPJPC(A)
9696         JRST POPJ1
9697
9698 IFN KA10P,[
9699 UROPC:  HLLZ A,UPOPC(J)
9700         LSH A,5
9701         HRR A,UPOPC(J)
9702         JRST POPJ1
9703 ] ;KA10P
9704 IFE KA10P, UROPC: JRST OPNL12   ;.OPC NOT SUPPORTED ON KL AND KS  ((CAN'T
9705                                 ; USE == DUE TO FWD REF))
9706
9707 IFN N11TYS,[                    ;SET OWN TV CONSOLE REGISTER
9708 STVCRG: MOVEM D,TVCREG(U)       ;ENABLE TVCREG TO BE SWAPPED IN AND OUT OF HARDWARE
9709         JUMPL D,POPJ1           ;IF TURNING ON; OR, IF TURNING OFF, ALL DONE
9710         SKIPGE TT11P            ;ALLOWED TO TOUCH HARDWARE?
9711          SKIPE TEN11F
9712           CAIA
9713            MOVEM D,400000+TTR10*2000 ;UPDATE REG IN HARDWARE
9714         MOVEM D,TVCREG(U)       ;AND UPDATE AGAIN IN SOFTWARE IN CASE CLOBBERED AT SSTVR2
9715         JRST POPJ1
9716 ]
9717 \f
9718 IFE KS10P,[     ; KS10 doesn't have a MAR and it never will...
9719
9720 ;READ MAR
9721 URMAR:  MOVE A,UPMAR(J)
9722 IFN KA10P,      TLZ A,777770
9723 IFN KL10P,      LDB B,[270400,,A]
9724 IFN KL10P,      HRL A,MARPTB(B)
9725         JRST POPJ1
9726
9727 ;SET MAR
9728 USMAR:  CONO PI,CLKOFF  ;TURN OFF CLOCK INTERRUPTS
9729         CAMN J,USER
9730          SPM UPGML(J)   ;STORE PG VARIABLES IF HACKING CURRENT USER
9731 IFN KA10P,[
9732         TLZ D,777770
9733         TLO D,4         ;SET USER MODE
9734 ] ;KA10P
9735 IFN KL10P,[
9736         LDB B,[220400,,D]
9737         HLL D,MARPTB(B)
9738 ] ;KL10P
9739         MOVEM D,UPMAR(J)
9740         CAMN J,USER
9741          LPMR UPGML(J)  ;USE LPMR BECAUSE KL10 DOESN'T HAVE VANILLA LPM
9742         JRST CLKOJ1
9743
9744 IFN KL10P,[     ;MAR PERMUTATION TABLE.  MAYBE CAN DO BETTER????   *****
9745
9746 MARPTB: 0  1,  0        ;OFF            ;NONE (EXEC)
9747         0 11,  0        ;FETCH          ;NONE (USER)
9748         0  3,  2        ;WRITE          ;WRITE(EXEC)
9749         0 17,  6        ;ANY            ;WRITE (USER)
9750         0  1, 10        ;OFF            ;READ (EXEC)
9751         0 11, 14        ;FETCH          ;READ (USER)
9752         0  3, 12        ;WRITE          ;NOT FETCH (EXEC)
9753         0 17, 16        ;ANY            ;NOT FETCH (USER)
9754         0  5,  1        ;READ           ;FETCH (EXEC)
9755         0 15,  5        ;READ+FETCH     ;FETCH (USER)
9756         0  7, 13        ;NOT FETCH      ;NOT READ (EXEC)
9757         0 13, 17        ;NOT READ       ;NOT READ (USER)
9758         0  5, 11        ;READ           ;READ+FETCH (EXEC)
9759         0 15, 15        ;READ+FETCH     ;READ+FETCH (USER)
9760         0  7,  3        ;NOT FETCH      ;ANY (EXEC)
9761         0 13,  7        ;NOT READ       ;ANY (USER)
9762 ] ;KL10P
9763 ] ;IFE KS10P
9764
9765 IFN KS10P,[
9766 URMAR:
9767 USMAR:  JRST OPNL12
9768 ] ;KS10P
9769 \f
9770 RUSUPP: HRRE A,SUPPRO(J) ;READ SUPERIOR'S USER INDEX
9771         JUMPL A,POPJ1   ;-1 => TOP LEVEL
9772 UINDEX: IDIVI A,LUBLK   ;GET INDEX NUMBER
9773         JRST POPJ1      ;GIVE TO USER
9774
9775 ;READ OWN RUN TIME
9776 UTRNTR: CONO PI,CLKOFF
9777 IFN KA10P,[
9778         SPM UPGML(U)
9779         LDB A,[2300,,UPQUAN(U)]
9780         LSH A,-2        ;SIMULATE 4.069 USEC CLOCK
9781 ] ;KA10P
9782 IFN KL10P,[
9783         SKIPL MTRUSR    ;SKIP IF PERFORMANCE METER AVAILABLE
9784          JRST [ RMBOXC A        ;REQUIRES AC ORDER - A,B,C,D,E
9785                 DSUB A,STMBOX
9786                 DMUL A,KLMBCC   ;BECAUSE DMUL PRODUCES FOUR WORD RESULT
9787                 REBOXC D
9788                 DSUB D,STEBOX
9789                 DADD B,D
9790                 DMUL B,KLEBCC
9791                 MOVE A,D
9792                 JRST UTRNT1 ]
9793         RPERFC A
9794         DSUB A,STPERF
9795         DIVI A,50.*4096.
9796 UTRNT1:
9797 ] ;KL10P
9798 IFN KS10P,[
9799         SPM UPGML(U)
9800         LDB A,[400400,,UPQUAN(U)]       ; 3.9 USEC CLOCK
9801 ] ;KS10P
9802         ADD A,UTRNTM(U)
9803         JRST CLKOJ1
9804
9805 ;SET JOB'S TTYTBL (.TTY VARIABLE).
9806 USTTY:  CONO PI,CLKOFF          ;PREVENT TIMING ERROR.
9807         HLLZ E,TTYTBL(J)        ;GET CURRENT VALUE
9808         XOR E,D                 ;GET WHICH BITS USER WANTS TO CHANGE
9809         AND E,[%TBNVR+%TBINT+%TBWAT+%TBOUT+%TBINF+%TBIIN+%TBOIG,,]      ;GET BITS USER IS ALLOWED TO CHANGE
9810         TRNE I,1
9811          TLZ E,%TBWAT           ;THESE BITS CAN BE ALTERED ONLY BY THE SUPERIOR
9812         XORM E,TTYTBL(J)        ;ALTER THE USER-CONTROLLED BITS WITHOUT WRITING THE OTHERS.
9813         JRST CLKOJ1
9814
9815 ;READ JOB'S TTYTBL (.TTY) VARIABLE
9816 URTTY:  CONO PI,CLKOFF
9817         HRRZ A,TTYTBL(J)
9818         SKIPGE TTYTBL(J)
9819          IDIVI A,LUBLK
9820         HLL A,TTYTBL(J)
9821         JRST CLKOJ1
9822
9823 ;READ JOB'S .CNSL VARIABLE - TTY# OF TREE'S CONSOLE
9824 URCNSL: MOVE A,UTMPTR(J)
9825         SUBI A,USRRCE
9826         CAIL A,NCT
9827          SUBI A,NCT+2           ;DISOWNED -1 SYS -2
9828         JRST POPJ1
9829 \f
9830 UJNAME: JUMPE D,OPNL33  ;SET INFERIOR'S JNAME
9831         CAME D,[SIXBIT/PDP6/]
9832          CAMN D,[SIXBIT/PDP10/]
9833           JRST OPNL33   ;CHANGING TO ILLEGAL NAME
9834         CAIN I,3        ;.SUSET?
9835          JRST UJNAMS    ;YES...
9836         PUSHJ P,RPCLSR
9837         PUSHJ P,UJNAMU  ;IS NEW JNAME UNIQUE?
9838          JRST UJNAMG    ;NO
9839         MOVEM D,JNAME(A)        ;YES
9840         CONO PI,CLKON
9841         PUSHJ P,UPCLSR
9842         JRST POPJ1
9843
9844 UJNAMU: MOVE B,UNAME(A)
9845         MOVEI E,0
9846         CONO PI,CLKOFF
9847 UJNAM1: CAME B,UNAME(E)
9848          JRST UJNAMF
9849         CAMN D,JNAME(E)
9850          POPJ P,
9851 UJNAMF: ADDI E,LUBLK
9852         CAMGE E,USRHI
9853          JRST UJNAM1
9854         JRST POPJ1
9855
9856 UJNAMG: PUSHJ P,UPCLSR
9857         CAME A,E
9858          JRST OPNL13            ;DUPLICATE NAME
9859         JRST CLKOJ1             ;WASN'T REALLY CHANGING THE NAME
9860
9861 UUNAME: HLRE I,D                ;SET OWN UNAME
9862         AOJE I,OPNL33           ;CHECK FOR ILLEGAL ___nnn UNAME
9863         SKIPA I,U
9864 UJNAMS:  SETO I,                ;SET OWN JNAME
9865         JUMPE D,OPNL33          ;CHECK FOR EVIL NAMES
9866         CAME A,U                ;SELF?
9867          BUG                    ;SOMETHING SCREWED
9868         SKIPL SUPPRO(U)
9869          JRST OPNL40            ;MUST BE TOP LEVEL
9870         CONO PI,CLKOFF          ;TURN CLOCK OFF NOW SO WE DON'T GET REOWNED OR SOMETHING
9871         SKIPL I
9872          SKIPA C,JNAME(U)       ;CHANGING UNAME, KEEPING JNAME
9873           SKIPA C,UNAME(U)      ;VICE VERSA
9874            EXCH D,C             ;NOW C=UNAME, D=JNAME
9875         MOVEI E,0               ;CHECK FOR DUPLICATE NAMES
9876 UUNAM0: SKIPE UNAME(E)
9877          CAMN E,U               ;ALLOW SETTING TO SAME NAME AS BEFORE
9878           JRST UUNAM1
9879         HRRZ A,SUPPRO(E)
9880         CAMN C,UNAME(E)
9881         CAME D,JNAME(E)
9882          CAMN A,I               ;JOB CAN'T HAVE INFERIORS IF SETTING UNAME
9883           JRST OPNL13           ;OR DUPLICATE U-JNAME IF SETTING EITHER
9884 UUNAM1: ADDI E,LUBLK
9885         CAMGE E,USRHI
9886          JRST UUNAM0
9887         CAMN C,UNAME(U)
9888          CAME D,JNAME(U)
9889           SKIPA A,D             ;D GETS CLOBBERED
9890            JRST CLKOJ1          ;THE NAMES WEREN'T ACTUALLY CHANGED! (SYNCOM DOES IT).
9891         CAME C,UNAME(U)         ;IF NOT LOGGED IN, AND CHANGING UNAME,
9892          SKIPGE TTYTBL(U)       ; AND CONSOLE-CONTROLLED,
9893            JRST UUNAM3
9894         HLLO J,UNAME(U)
9895         AOJN J,UUNAM2
9896           AOS SUSRS             ;DISGUST! SHOULD BE USING LOGIN
9897 UUNAM2: HRRZ T,TTYTBL(U)
9898         HRLI T,[ASCIZ / CHUNAM /]
9899         PUSHJ P,SGWAIT          ;REQUEST SYSTEM JOB TO PRINT OUR MSG
9900         MOVEM C,SLGIV+2         ;INCLUDE NEW UNAME AS SECOND NAME
9901 UUNAM3: PUSHJ P,LOGUPD          ;CHARGE OLD NAME FOR USAGE SO FAR
9902         MOVEM C,UNAME(U)        ;THEN SWITCH NAMES
9903         MOVEM A,JNAME(U)
9904         PUSHJ P,DMNPLI          ;LOG BACK IN UNDER NEW NAMES
9905         JRST CLKOJ1
9906
9907 ;WAIT FOR SLGIV VARIABLES TO BECOME FREE, AND REQUEST THE
9908 ;SYSTEM JOB TO PROCESS THEM.  TAKES STRING,,TTY IN T, AND
9909 ;PLACES UNAME(U) IN SLGIV, AND T INTO SLGIV+1.  THE CALLER
9910 ;IS RESPONSIBLE FOR FILLING IN SLGIV+2
9911
9912 SGWAIT: PUSH P,T
9913         MOVSI T,SCLLGI          ;SOMEBODY ELSE IS USING THOSE VARIABLES
9914         PUSHJ P,CWAIT           ;WAIT FOR THE SYSTEM JOB TO FINISH WITH
9915           TDNE T,SUPCOR         ;THEM.
9916         IORM T,SUPCOR           ;REQUEST THE SYSTEM JOB TO PRINT OUR MSG
9917         POP P,SLGIV+1           ;STRING,,TTY #
9918         MOVE T,UNAME(U)         ;STORE AWAY THE UNAME
9919         MOVEM T,SLGIV
9920         POPJ P,
9921
9922 RUTRAP: LDB A,[430100,,UTRAPM(J)]       ;GET SPECIAL TRAP MODE INDICATOR
9923         JRST POPJ1
9924
9925 SUTRAP: DPB D,[430100,,UTRAPM(J)]       ;SET    "     "    "       "
9926         JRST POPJ1
9927
9928 IFN KA10P,[
9929 URTR1I: SKIPA A,[0,,%PIARO]     ;READ "TRAP 1 INSTRUCTION" FOR KA-10
9930 URTR2I:  MOVEI A,%PIPDL         ;TRAP 2
9931         JRST POPJ1
9932 ] ;KA10P
9933 \f
9934 ;SET MEMORY BOUND
9935 USMEMT: CAMN U,A
9936          JRST USMEM2
9937         PUSHJ P,RPCLSR
9938         MOVSI B,BSSTP
9939         IORM B,USTP(A)
9940         PUSHJ P,UPCLSR
9941 USMEM2: ADDI D,1777
9942         LSH D,-10.
9943         MOVE B,D
9944         MOVEM A,SRN5(U) ;ARGUMENT TO NCORFS
9945         PUSHJ P,LOSSET
9946             NCORFS      ;CLEARS BSSTP IN USTP(A).
9947         EXCH U,A
9948         PUSHJ P,ACORE
9949          JRST OPNL33    ;LOST
9950         EXCH U,A
9951         JRST LSWPJ1
9952
9953 ;SET SYSTEM NAME (ZERO IGNORED)
9954 USYNST: SKIPE D
9955          MOVEM D,USYSNM(J)
9956         JRST POPJ1
9957
9958 ;SET INFERIOR'S INTERRUPT MASK
9959 USMASK: SKIPA E,[2]     ;MOVEM
9960 IAMASK:  ANDI E,1       ;ANDCAM OR IORM
9961         ANDCM D,[VBDBTS] ;BITS FOR CLASS 1 INTS CAN'T BE CHANGED.
9962         XCT (E)[ IORB D,MSKST(A)
9963                  ANDCAB D,MSKST(A)
9964                  MOVEM D,MSKST(A)]
9965 IFN KA10P,[
9966         MOVEI B,440+APRCHN ;NOW UPDATE JOB'S APRC VARIABLE.
9967         TRNE D,%PIARO
9968          TRC B,60
9969         TLNE D,(%PIFOV)
9970          TRC B,600
9971         HRRM B,APRC(A)
9972         TRNE I,1
9973          CONO @APRC(A)
9974 ] ;KA10P
9975 IFE KA10P, PUSHJ P,TRINST
9976         JRST UPISE1
9977
9978 IFE KA10P,[
9979 ;SET THE AROV AND PDLOV TRAP INSNS ACCORDING TO WHETHER THE
9980 ;INTERRUPTS ARE ENABLED; BUT DON'T OVERRIDE AN EXPLICIT SPECIFICATION
9981 ;BY THE USER, WHICH IS ANYTHING OTHER THAN 0 OR (CAI) IN THE LH.
9982
9983 TRINST: MOVE D,MSKST(A)
9984         MOVSI B,(CAI)           ;CAI IS FASTER THAN JFCL - NO AC DECODE
9985         TDNE D,[%PIFOV+%PIARO]  ;AND OVERFLOW GOES OFF A LOT
9986          MOVEI B,%PIARO
9987         HLRZ C,TR1INS(A)
9988         SKIPE C
9989          CAIN C,(CAI)
9990            MOVEM B,TR1INS(A)
9991 ;       MOVSI B,(CAI)           ;THESE LINES COMMENTED OUT TO MAKE 
9992 ;       TRNE D,%PIPDL           ; PDL OVERFLOW CLASS 2 INSTEAD OF CLASS 3
9993          MOVEI B,%PIPDL
9994         HLRZ C,TR2INS(A)
9995         SKIPE C
9996          CAIN C,(CAI)
9997           MOVEM B,TR2INS(A)
9998         POPJ P,
9999 ] ;IFE KA10P
10000 \f
10001 ;SET INFERIOR'S PI IN PROGRESS FLAG
10002 UPISET: ASH D,-35.      ;SHIFT SIGN BIT TO BOTTOM BIT
10003         MOVEM D,PICLR(A)        ;SET VARIABLE
10004 ;COME HERE WHEN ANY INTERRUPT VARIABLE'S VALUE IS CHANGED
10005 ;BY A .USET OR .SUSET; TAKE ANY INTS THAT ARE NOW PENDING.
10006 UPISE1: HRRZ A,J        ;IAMASK, ETC. MODIFY A. RESTORE IT.
10007         AOS (P)         ;GOING TO WIN
10008         TRNN I,1        ;SKIP IF A SUSET
10009          JRST APISE6
10010         JRST APISE1     ;SEE IF SHOULD REINTERRUPT
10011
10012 IAMSK2: ADDI A,MSKST2-IDF1
10013 IADF1:  ADDI A,IDF1-IDF2
10014 IADF2:  ADDI A,IDF2-PIRQC       ;IORM OR ANDCAM INTO IDF2.
10015 IAPIRQ: ADDI A,PIRQC-IFPIR
10016 IAIFPI: ANDI E,1        ;GET USET PARITY (0=IORM, 1=ANDCAM)
10017         XCT IAINS(E)    ;DO APPRO OP
10018         JRST UPISE1
10019
10020 IAINS:  IORB D,IFPIR(A) ;SET BITS
10021         ANDCAB D,IFPIR(A)       ;FLUSH BITS
10022
10023 USMSK2: ADDI A,MSKST2-IDF1      ;SET .MSK2, ETC.
10024 USDF1:  ADDI A,IDF1-IDF2
10025 USDF2:  ADDI A,IDF2-PIRQC
10026 USPIRQ: ADDI A,PIRQC-IFPIR
10027 USIFPI: MOVEM D,IFPIR(A)
10028         JRST UPISE1
10029
10030 ;.RBCHN, .SBCHN  READ/SET NUMBER OF LAST CHANNEL ON WHICH ERROR OCCURRED
10031 RUBCHN: LDB A,[BCHPTR#(A#U)]
10032         JRST POPJ1
10033
10034 SUBCHN: DPB D,[BCHPTR#(A#U)]
10035         JRST POPJ1
10036
10037 ;GET INT BIT
10038 UGSUPR: HLLZ A,SUPPRO(J)
10039         JRST POPJ1
10040
10041 ;SAVE AWAY MA (HIGH BITS) ON LAST MPV OR WIRO
10042 ;CALLED FROM CLKBRK, DONT CLOBBER A OR D
10043
10044 MPVMAS:
10045 IFN KA10P,[
10046         HLRZ T,UPJPC(U)
10047         LSH T,10.               ;HIGH BITS ONLY ON KA
10048 ] ;KA10P
10049 IFE KA10P, HRRZ T,UPFW(U)
10050         HRRM T,IOTLSR(U)
10051         POPJ P,
10052
10053 ;.RMPVA READ VIRTURAL PAGE # (8 BITS) OF LAST MPV OR WIRO
10054
10055 MPVARD: HRRZ A,IOTLSR(J)
10056         JRST POPJ1
10057
10058 ;.RSERVER  Read server user number, or -1 if none.
10059 URSERV: SKIPL A,SERVER(J)
10060          IDIVI A,LUBLK
10061         JRST POPJ1
10062
10063 ;.SSERVER  Set server user number, or clear if negative.
10064 ; (To prevent timing screws, you should really use the SSERVE call to set
10065 ; this variable, but for debugging convenience...)
10066 USSERV: IMULI D,LUBLK
10067         SKIPGE D
10068          SETOI D,
10069         MOVEM D,SERVER(J)
10070         JRST POPJ1
10071 \f
10072 SUBTTL USER INSTRUCTION HANG ROUTINE (.HANG)
10073
10074 ; .HANG was rewritten by Alan Feb 87:
10075
10076 ; The general theory is that .HANG should behave -exactly- like JRST .-1 as
10077 ; much as possible.  Thus, it is considered to make sense to put any
10078 ; skipping or jumping instruction before a .HANG.  We are always careful to
10079 ; return from the .HANG by jumping to the previous instruction, so any side
10080 ; effects (such as clearing bits or incrementing accumulators or memory) are
10081 ; always performed, and jumps will be correctly taken.
10082 ;
10083 ; There are two ways to leave a .HANG, either the job can get PCLSR'ed, or
10084 ; the awaited condition can become true.  We arrange for -both- cases to
10085 ; return the job to the previous instruction by SOSing UUOH -once- before
10086 ; calling UFLS, and once more if UFLS returns.
10087
10088 ; As an additional feature, .HANG with a non-zero accumulator behaves like
10089 ; the disjunction of ordinary .HANG and .SLEEP, allowing the user to do a
10090 ; timeout.  The accumulator should initially contain an argument, as for
10091 ; .SLEEP, that indicates when .HANG should timeout.  In that case only,
10092 ; .HANG returns to the following instruction and the designated accumulator
10093 ; will contain zero.  If such a .HANG is interrupted, or if it returns
10094 ; because the awaited condition is now true, that accumulator will contain
10095 ; the correct negative number indicating the absolute time it would have
10096 ; timed out.
10097 ;
10098 ; Accepted instructions are:
10099 ; Any CAI, CAM, JUMP, SKIP, AOJ, AOS, SOJ, or SOS class instruction.
10100 ; Any test instruction.
10101 ; JFFO.
10102 ; JFCL with 0 in the AC field.
10103 ; Or an XCT that eventually fetches one of the above.
10104
10105 ; As special cases SKIPA 0, and CAIA 0, are taken to request a schedule,
10106 ; and JFCL 0, and SKIP 0, set %SWDSO.
10107
10108 ; As before, it is a limitation that changes to memory referenced by .HANG
10109 ; when computing effective addresses and fetching XCT'ed instructions will
10110 ; not cause the job to wake up.  But how could it be otherwise?  Changes to
10111 ; the accumulators will of course cause the job to be PCLSR'ed.
10112
10113 AHANG:  MOVE R,UUOH
10114         UMOVE R,-2(R)           ; Get user's flush instruction
10115         HRLOI A,377777          ; A: most positive fixnum
10116         JUMPE J,AHANG2          ; No AC => timeout when hell freezes over
10117         XCTR XR,[MOVN A,(J)]    ; A: argument as for .SLEEP
10118         JUMPG A,AHANG2          ; 'twas already neg., so wait 'til then
10119         SUB A,TIME              ; else compute time
10120         UMOVEM A,(J)            ; store back negative for PCLSRing
10121         MOVN A,A                ; A: time to wait for
10122 AHANG2: PUSHJ P,ASCIND          ; Compute E for instruction
10123         HLRZ C,R                ; C: Opcode and AC
10124         CAIE C,(JFCL)
10125          CAIN C,(SKIP)
10126           JRST AHANGI           ; User might be waiting for a while
10127         CAIE C,(SKIPA)
10128          CAIN C,(CAIA)
10129           JRST AHANGF           ; User is just trying to cause a schedule
10130         LSH C,-9                ; C: 9-bit opcode
10131         CAIN C,XCT_-33
10132          JRST AHANG1            ; XCT - Go loop
10133         CAIN C,JFFO_-33
10134          JRST AHANGO            ; JFFO is like JUMPN
10135         LSH C,-6                ; C: First 3 bits of opcode
10136         CAIN C,CAI_-41
10137          JRST AHANGC            ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS
10138         CAIN C,TRN_-41
10139          JRST AHANGT            ; Txxx
10140 IFN KS10P, JRST ILUUO
10141 IFE KS10P,[
10142 ;CODE TO ALLOW CONSO, CONSZ AS .HANG INSTRUCTIONS
10143         HLRZ C,R                ;CHECK FOR CONSO, CONSZ
10144         TRZ C,077477
10145         LDB B,[320700,,R]       ;GET DEVICE CODE/4
10146         SKIPGE T,DCHNTB(B)
10147          TRNE T,40000
10148           CAIE C,(CONSZ\CONSO)
10149            JRST ILUUO           ;UNRECOGNIZED INSTRUCTION, OR USER CONI NOT
10150                                 ; ALLOWED
10151         MOVEM R,EPDL(U)
10152         MOVE T,A
10153         SOS UUOH
10154         PUSHJ P,AHANG9
10155          PUSHJ P,UFLS
10156         JRST AHANGX
10157
10158 AHANG9: XCT EPDL(U)
10159          CAMGE T,TIME
10160           AOS (P)
10161            POPJ P,
10162
10163 ] ;IFE KS10P
10164
10165 ; XCT ? .HANG
10166 AHANG1: PUSHJ P,OPBRK           ; Don't let "XCT ." hang you up
10167         UMOVE R,(R)             ; Get new instruction
10168         JRST AHANG2             ; And start over
10169
10170 ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS ? .HANG
10171 AHANGC: TLNN R,040000
10172          JRST AHANG3            ; CAI, CAM, JUMP, SKIP
10173         TLNN R,010000
10174          JRST AHANGJ            ; AOJ, SOJ
10175         TLNN R,020000
10176          SKIPA T,[-1]           ; AOS: Compare with -1
10177           MOVEI T,1             ; SOS: Compare with 1
10178         TLZ R,770777            ; Clear all but last 3 bits of opcode
10179         TLO R,(CAM T,)          ; Build a CAM instruction
10180         TLNE R,001000           ; With the opposite sense
10181          TLC R,006000
10182         JRST AHANGM
10183
10184 AHANG3: TLNN R,020000
10185          JRST AHANG4            ; CAI, CAM
10186         TLNN R,010000
10187          JRST AHANGJ            ; JUMP
10188         TLZ R,(0 17,)           ; SKIP
10189         JRST AHANGM
10190
10191 ; JFFO ? .HANG
10192 AHANGO: TLC R,(JFFO#JUMPN)
10193 AHANGJ: HRRI R,AHANGX
10194         JRST AHANGA
10195
10196 ; SKIPA ? .HANG -- just flush once (ignores timeout)
10197 AHANGF: SOSA UUOH
10198          SKIPA
10199           PUSHJ P,UFLS
10200         JRST AHANGX
10201
10202 ; JFCL ? .HANG -- hang infinitely (or until timeout)
10203 AHANGI: MOVE B,TIME
10204         ADDI B,60.*30.          ; If sleeping for more than a minute
10205         MOVSI C,%SWDSO          ; Desire swap out
10206         CAML A,B                ; (just like .SLEEP)
10207          IORM C,USWST(U)
10208         SOS UUOH
10209 AHANG5: MOVE T,A
10210         CAML T,TIME
10211          PUSHJ P,UFLS
10212         JRST AHANGX
10213
10214 ; Txxx ? .HANG
10215 AHANGT: TLZ R,060000            ; Make opcode be TRN or TDN series
10216         TLNE R,010000           ; If TRN, only AC matters
10217          JRST AHANGB            ; TDN: Both AC and memory matter
10218 ; Wait for something that only references the user's accumulators.
10219 ; (Instruction in R might be some kind of jump to AHANGX.)
10220 AHANGA: PUSHJ P,AHANGG          ; Get contents of user's AC into T
10221         SOS UUOH
10222         XCT R                   ; Must try it once to prevent timing screw
10223          JRST AHANG5            ; OK, wait forever for PCLSR
10224         JRST AHANGX
10225
10226 AHANG4: TLNN R,010000           ; If CAM, both AC and memory matter
10227          JRST AHANGA            ; CAI: Only AC matters
10228 ; Wait for something that references memory.
10229 ; (Instruction in R better not be a jump!)
10230 AHANGB: PUSHJ P,AHANGG          ; Get contents of user's AC into T
10231 AHANGM: MOVEM R,EPDL(U)
10232         SOS UUOH
10233         TRNE R,-20              ; Memory reference really only AC?
10234          JRST AHANG6            ; No, real memory, go wait
10235         XCTR XRW,R              ; Must try it once to prevent timing screw
10236          JRST AHANG5            ; OK, wait forever for PCLSR
10237         JRST AHANGX
10238
10239         PUSHJ P,UHANG
10240 AHANG6:  PUSHJ P,UFLS
10241 AHANGX: ;; Everyone exits here after SOSing UUOH once (before hanging).
10242         ;; Thus we always exit to the previous instruction (just like being
10243         ;; PCLSRed), unless we timeout instead.
10244         CAMGE A,TIME            ; Timeout?
10245          JRST AHANGY            ; Yes
10246         SOS UUOH
10247         POPJ P,
10248
10249 AHANGY: XCTR XW,[SETZM (J)]     ; Let user know we timed out
10250         AOS UUOH                ; And fall through instead of backing out
10251         POPJ P,
10252
10253 ;.HANG flush instruction routine, called with PUSHJ only on clock level
10254 UHANG:
10255 IFE KS10P,[
10256         MOVEI TT,0              ; Save MAR word
10257         EXCH TT,UPMAR(U)        ; so will not MAR
10258         LPMR UPGML(U)
10259         MOVEM TT,UPMAR(U)       ; Restore MAR
10260 ] ;IFE KS10P
10261 IFN KS10P, LPMR UPGML(U)
10262         MOVE TT,AC0S+A(U)
10263         XCTRI XRW,EPDL(U)
10264          CAMGE TT,TIME
10265           AOS (P)               ; Might be because location swapped out or
10266            POPJ P,              ; missing, but that's OK because we always
10267                                 ; exit to the previous instruction!
10268
10269 ; Kind of like ASCIND for the accumulators...
10270 AHANGG: LDB T,[270400,,R]
10271         UMOVE T,(T)             ; Get contents of AC from user
10272         TLZ R,(0 17,)           ; Clear out AC field in instruction
10273         TLO R,(0 T,)            ; Replace AC field with T
10274         POPJ P,
10275
10276 ; Allow interrupt if being PCLSRed
10277 OPBRK:  PUSH P,T
10278         MOVE T,UEXIT
10279         CAMN T,[JRST ONEFLS]
10280          PUSHJ P,UDELAY
10281         POP P,T
10282         POPJ P,
10283 \f
10284 SUBTTL .OPEN AND FRIENDS
10285
10286 ;
10287 ;.FDELE FILBLK  ;DELETE OR RENAME FILE SPECIFIED AT FILBLK
10288 ;
10289 AFDELE: SETZM UUAC(U)
10290         UMOVE A,(C)             ;GET DEVICE
10291         MOVEI W,4
10292         DPB W,[OPNCOM,,A]       ;SET OP TO SPECIFY AN .FDELE
10293         JRST AFDEL1
10294 ;
10295 ;OPEN SET UP AND DISPATCH
10296 ;3.1=0 => INPUT  =1 OUTPUT
10297 ;3.2=0  => UNITS   =1  BLOCK
10298 ;3.3=0  => ASCII   =1 IMAGE
10299 ;4.9-4.7 OPERATION FIELD
10300 ;   0=> NORMAL READ OR WRITE
10301 ;   1=> WRITE OVER MODE
10302 ;   2=> MAKE LINK
10303 ;   4=> DELETE OR RENAME (INTERNAL)
10304 ;
10305 ;.OPEN CH,FILBLK        ;OPEN FILE SPECIFIED AT FILBLK ON LOGICAL CHANNEL CH
10306 ;
10307 AOPEN:          ;C HAS EFF ADR OF UUO AND R ITS AC FIELD
10308         ADDI R,IOCHNM(U)        ;MAKE R POINT TO SPECIFIED I/O CHANNEL WORD
10309         PUSH P,C
10310         PUSHJ P,ACLOSE  ;CLOSE PREV
10311         POP P,C
10312         UMOVE A,(C)     ;GET DEV AND MODE BITS
10313         LDB W,[OPNCOM,,A]
10314         CAIN W,4
10315          JRST OPNL23    ;BARF IF TRY TO DELETE WITH .OPEN
10316 AFDEL1: MOVEI TT,SRN3(U)        ;MOVE 4TH-6HT ARGS
10317         HRLI TT,3(C)            ;TO SRN3 THRU SRN5
10318         MOVEI Q,3(TT)
10319         XCTR XBR,[BLT TT,-1(Q)]
10320         UMOVE B,1(C)    ;GET 2ND, 3RG ARGS (FILENAMES)
10321         UMOVE C,2(C)
10322         MOVE D,USYSNM(U)        ;USE DEFAULT SNAME.
10323         HLRZ E,A                ;GET MODE BITS.
10324         HRLZI A,(A)     ;LEFT-JUSTIFY DEVICE NAME.
10325         SETZM EPDL(U)
10326         SETZM EPDL3(U)
10327 NOPNE:  CAIN W,4        ;SKIP ON NOT .FDELE (ENTRY FOR NCALL TYPE OPEN, ETC COMMANDS)
10328          SKIPN SRN3(U)  ;SKIP ON RENAME
10329           JRST AOPEN3   ;JUMP IF A .OPEN OR DELETING .FDELE
10330         JUMPN B,AOPEN3  ;JUMP UNLESS RENAME WHILE OPEN.
10331         MOVE TT,C       ;GET CH ON WHICH FILE IS SUPPOSIDLY OPEN
10332         TDNE TT,[-NIOCHN]       ;SKIP IF CH LOGICALLY LESS THAN 20
10333          JRST OPNL14    ;BAD CHANNEL NUM
10334         ADDI TT,IOCHNM(U)       ;RELOCATE TO POINT TO CH WORD FOR USER
10335         MOVE Q,(TT)     ;GET CH WORD
10336         JUMPE Q,OPNL44  ;CHNL NOT OPEN
10337         HLRZ Q,CLSTB(Q) ;GET LEFT HALF OF CLOSE TABLE ENTRY FOR INDEX IN I/O CH WORD
10338         TRNE Q,%CLSJI\%CLSJO
10339          JRST JFDEL4            ;JOB DEVICE CHNL
10340         TRNN Q,%CLSDO\%CLSQ     ;SKIP IF A DIRECTORY DEVICE
10341          JRST POPJ1     ;JUMP IF NOT DIRECTORY DEVICE
10342         HLRZ J,(TT)     ;PICK UP DEV CHNL NO
10343         EXCH A,B        ;PUT FN1, FN2 IN A, B.
10344         EXCH B,C
10345 IFN NUNITS,[
10346         TRNN Q,%CLSDO   ;SKIP IF DEC TAPE
10347          JRST NOPNE1
10348         MOVSI C,'UT0    ;GET DUMMY UT DEV NAME.
10349         HRRZ I,UTTNO(J) ;GET POSSIBLE (?) TAPE NUM
10350         TLO C,(I)       ;STORE IN DEV NAME
10351         MOVE TT,DVAUT   ;WILL EXIT TO UTAPE OPEN RTN.
10352         JRST OPEN2B
10353 NOPNE1:
10354 ]
10355         MOVSI C,'DSK    ;NOT UT, MUST BE DSK.
10356         MOVE TT,DVAQSK  ;NOBODY ELSE HANDLES RENAME WHILE OPEN.
10357         JRST OPEN2B
10358 \f
10359 AOPEN3: PUSHJ P,TRAN    ;PERFORM I/O TRANSLATIONS
10360          JRST OPNL3     ;TOO MANY TRANSLATIONS.
10361         MOVEM D,USYSN1(U);SAVE TRAN'D SNAME FOR OPEN RTN.
10362         PUSH P,A        ;PUT NAMES ON STACK.
10363         PUSH P,B
10364         PUSH P,C
10365         MOVSI B,-NDEVS  ;LOAD LENGTH OF FIRST DEV NAME TABLE
10366         CAME A,DEVTAB(B);SEARCH FIRST DEV NAME TABLE
10367          AOBJN B,.-1    ;LOOP TILL FOUND OR COUNTED OUT
10368         JUMPG B,OPEN1   ;JUMP IF NOT FOUND
10369 OPEN2:  MOVE TT,DEVADR(B) ;LOAD BITS,,OPEN-ROUTINE-ADDRESS
10370 OPEN21: POP P,B         ;UNSAVE SECOND FILE NAME
10371         POP P,A         ;UNSAVE FIRST FILE NAME
10372         POP P,C         ;UNSAVE DEVICE NAME
10373         CAIN W,4
10374          JRST [ TLNN TT,%DVDEL
10375                  JRST OPNL34    ;DEVICE DOES NOT ALLOW DELETE
10376                 JRST OPEN2B ]
10377         CAIN W,2
10378          JRST [ TLNN TT,%DVLNK
10379                  JRST OPNL34    ;DEVICE DOES NOT ALLOW LINK
10380                 JRST OPEN2B ]
10381 OPEN2B: HRRZ D,E        ;MODE BITS
10382         EXCH E,C        ;SAVE DEVICE IN E
10383         HLL C,E         ;SET UP OLD-STYLE C: MODE,,DEV
10384         MOVSS C
10385 ;
10386 ;AT THIS POINT: A & B HAVE FILE NAMES, C HAS MAPPED DEV AND MODE BITS, D HAS MODE BITS,
10387 ;W HAS OPEN COMMAND, E HAS DEVICE NAME, TT HAS DEVADR WORD (BITS,,ROUTINE)
10388 ;
10389         ROT D,-1        ;ROTATE IN/OUT BIT TO SIGN
10390         CAIN W,4        ;SKIP IF NOT A .FDELE
10391          TDZ D,[400000,,7]      ;A .FDELE, MAKE LOOK LIKE OPEN FOR READ
10392         PUSHJ P,FLDRCK
10393          JRST OPEN2D    ;NORMAL OPEN
10394         JUMPL D,OPNL2   ;WRITING DIRECTORY?
10395         JUMPN W,OPNL12  ;DELETING, RENAMING, LINKING, WRITING OVER DIRECTORY?
10396         TLNE TT,%DVDIR
10397          JRST (TT)      ;OPEN DEVICE FOR DIRECTORY
10398 ;ASKING FOR DIR OF DEVICE SYSTEM DOESN'T HAVE DIR ROUTINE FOR.
10399 ;PASS IT OFF TO THE UNKNOWN-DEVICE HANDLER.
10400         PUSH P,E        ;PUSH DEVICE NAME
10401         PUSH P,A        ;PUSH FN1
10402         PUSH P,B        ;PUSH FN2
10403         HLRZ E,C        ;GET MODE BITS
10404         JRST OPEN22     ;PASS TO UNKNOWN DEVICE JOB
10405
10406 OPEN2D: TLNE TT,%DVIN
10407          JUMPGE D,(TT)  ;OPENING FOR INPUT AND DEVICE CAN DO INPUT
10408         TLNE TT,%DVOUT
10409          JUMPL D,(TT)   ;OPENING FOR OUTPUT AND DEVICE CAN DO OUTPUT
10410         JRST OPNL2      ;DEVICE DOESN'T GO THAT DIRECTION
10411 \f
10412 ;CHECK FOR NUMBERED DEV
10413 OPEN1:  MOVE B,[-NDV1,,DVT1-DEVTAB]     ;LOAD AOBJN POINTER WITH COUNT FOR 2ND DEV TABLE
10414 OPEN1A: MOVEI I,0               ;INITIALIZE NUMBERED DEV NUM TO ZERO
10415         MOVE D,[440600,,-2(P)]  ;GET BYTE POINTER INTO DEV REQUESTED
10416         MOVE C,[440600,,DEVTAB(B)]      ;GET BYTE POINTER INTO CURRENT TABLE ENTRY
10417 OPENA1: ILDB A,C        ;GET CHAR FROM TABLE
10418         ILDB J,D        ;GET CHAR FROM DEV
10419         JUMPE A,OPEN1B  ;JUMP ON SPACE IN TABLE, "MATCHES" DIGIT IN DEV
10420         CAIN A,(J)      ;SKIP IF CHAR DIFFER
10421          JRST OPEN1C    ;SAME, TRY FOR NEXT CHAR
10422 OPENZ1: AOBJN B,OPEN1A  ;LOOP TO NEXT TABLE ENTRY OR COUNT OUT
10423 ;CHECK FOR NAMED SECONDARY PACK
10424 ;FIND THE ONE WITH THIS NAME AND THE BIGGEST QSFT.
10425 ;ASSUME THAT BY THE TIME WE GET HERE TUTS HAVE BEEN READ IN AND SO FORTH
10426         SKIPE A,-2(P)   ;GET DEVICE NAME AGAIN
10427          CAMN A,[-1]    ;0 OR -1 ARE NOT LEGAL PACK NAMES
10428           JRST OPEN22
10429         MOVEI C,NQS-1   ;SEARCH NAMES OF SECONDARY PACKS
10430         SETOB TT,I      ;I BEST DRIVE SO FAR, TT BEST QSFT SO FAR
10431 OPENZ2: CAMN A,QRESRV(C)
10432          JRST [ CAML TT,QSFT(C)
10433                  JRST .+1
10434                 MOVE TT,QSFT(C)
10435                 MOVE I,C
10436                 JRST .+1 ]
10437         SOJGE C,OPENZ2
10438         MOVE TT,[%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,,QSKOB]
10439         JUMPGE I,OPEN21
10440 ;
10441 ;"UNKNOWN DEVICE" HANDLER.  FOO DEVICE IS LOADED BY
10442 ;SYS;ATSIGN DEVICE FROM FILE DEVICE;JOBDEV FOO
10443 ;
10444 OPEN22: POP P,EPDLT2(U) ;WHEN WE USE SYS:ATSIGN DEVICE AS A JOB DEVICE,
10445         POP P,EPDLT1(U) ;SET UP THE "NAMES BEFORE LAST TRANSLATION" TO BE
10446         POP P,EPDLT4(U) ;THE NAMES BEING USED, INCLUDING "FOO" AS THE DEVICE.
10447         MOVE A,USYSN1(U)
10448         MOVEM A,EPDLT3(U)
10449         MOVSI C,'JOB
10450         MOVE TT,DVAJOB  ;DEVADR ENTRY FOR JOB:
10451         MOVSI A,'SYS
10452         MOVEM A,USYSN1(U)
10453         MOVE A,['ATSIGN]        
10454         MOVE B,['DEVICE]
10455         JRST OPEN2B
10456
10457 OPEN1B: JUMPE J,OPEN1C  ;JUMP IF DEV ARG EXHAUSTED
10458         SUBI J,'0       ;CONVERT SIXBIT DIGIT TO NUMBER
10459         JUMPL J,OPENZ1  ;JUMP IF TOO SMALL, NOT A DIGIT
10460         CAILE J,9       ;SKIP IF LESS THAN 10.
10461          JRST OPENZ1    ;LOSE, TRY NEXT
10462         ASH I,3         ;MULTIPLY NUM SO FAR BY 8
10463         ADD I,J         ;ADD NEW DIGIT
10464 OPEN1C: TLNE C,770000   ;SKIP IF ALL SIX CHAR POSITIONS COMPARED
10465          JRST OPENA1    ;GO TO NEXT POSITION
10466         JRST OPEN2
10467 \f
10468 NSOPEN: HRRZ R,A        ;Args: 1 mode (LH) chnl (RH), 2 BP or aobjn -> block of BPs.
10469         CAIL R,NIOCHN
10470          JRST OPNL14
10471         ADDI R,IOCHNM(U)
10472         PUSH P,A        ;Save channel number.
10473         PUSH P,B        ;Save BP or BP block ptr.
10474         PUSHJ P,CCLOSE
10475         POP P,R         ;Get back the BP or aobjn pointer.
10476         MOVEM R,EPDL(U) ;Save where job device can get it.
10477         PUSHJ P,FNPRS   ;Parse into DEV, FN1, FN2, SNM in A, B, C, D.
10478         MOVEM D,SRN3(U) ;Make symbolic open of network win using 5th arg as foreign host.
10479         POP P,R         ;Pop back channel number argument.
10480         MOVE E,CTLBTS(U)
10481         TSC E,E
10482         TRZ E,-1
10483         XOR R,E
10484         LDB E,[OPNCOM,,R]
10485         CAIE E,2
10486          CAIN E,4
10487           JRST OPNL12   ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10488         HLRZ E,R
10489         JRST NDEL1
10490
10491 ;Given in R a BP into user memory, or an aobjn -> of BPs block in user memory,
10492 ;parse filenames into A, B, C, D.  Clobbers Q, T, R, H, I.
10493 FNPRS:  SETZ Q,         ;Guess that it is a BP, not a block of them.
10494         SETZ A,         ;Clear out the old-fashioned filename words.
10495         SETZ B,
10496         SETZ C,
10497         SETZ D,
10498         SETCM T,R       ;Is our "BP" realy an aobjn pointer to fewer than 64 things?
10499         TLNE R,-1       ;If LH is 0, treat as BP and replace with 440700 later.
10500         TLNE T,777700
10501          JRST FNPRS8
10502         MOVE Q,R        ;Put the aobjn pointer in Q and get the first BP in R.
10503         UMOVE R,(Q)
10504 FNPRS8: PUSHJ P,ASCIND
10505 FNPRS7: PUSHJ P,FNPRS4          ; Read a sixbit word
10506         JUMPL I,FNPRS9          ; Nothing there at all!
10507         CAIN H,";               ; Directory?
10508          JRST FNPRS0            ;  Go do special hack
10509         MOVEI I,B               ; assume FN1
10510         SKIPE B                 ; unless we already have a FN1
10511          MOVEI I,C              ; in which case assume FN2
10512         CAIN H,":
10513          MOVEI I,A              ; unless it was a device
10514         SKIPN (I)       ;Put it there, unless already something there.
10515          MOVEM T,(I)
10516         JUMPN H,FNPRS7  ;H=0 means end of last arg string.
10517 FNPRS9: ;; Supply default values for all components except FN1.
10518         SKIPN A
10519          MOVSI A,(SIXBIT /DSK/)
10520         SKIPN D
10521          MOVE D,USYSNM(U)
10522         SKIPN C
10523          MOVSI C,(SIXBIT />/)
10524         POPJ P,
10525
10526 FNPRS0: SKIPN I,D
10527          JRST FNPRS2
10528         LSH T,-6
10529         TLO T,(SIXBIT /./)
10530 FNPRS1: LSH T,-6
10531         LSH I,6
10532         JUMPN I,FNPRS1
10533 FNPRS2: IOR D,T
10534         JRST FNPRS7
10535
10536 ;;; Extract in T the next SIXBIT word from user memory off bp in R,
10537 ;;; clobbering I (test 4.9 to see if there was no word read at all).
10538 ;;; Terminating character returned in H (0 means we got to the end of the
10539 ;;; string).  Q should be an aobjn pointer to a block in user memory of
10540 ;;; additional BPs.
10541 FNPRS4: SETZ T,
10542         MOVE I,[440600,,T]
10543 FNPRS6: PUSHJ P,FNPRS3
10544         JUMPE H,CPOPJ           ; that was the end of the string
10545         CAIE H,":
10546          CAIN H,";
10547           JRST FNPRS5           ; done?
10548         CAIN H,40
10549          JRST FNPRS5            ; done?
10550         CAIN H,^Q
10551          PUSHJ P,FNPRS3
10552         CAIL H,140
10553          SUBI H,40
10554         SUBI H,40
10555         TLNE I,770000
10556          IDPB H,I
10557         JRST FNPRS6
10558
10559 FNPRS5: JUMPL I,FNPRS6          ; keep looking if we haven't seen anything yet.
10560         POPJ P,
10561
10562 ;Extract in H the next character from user memory off the byte pointer in R.
10563 ;Q should be an aobjn pointer to a block of further BPs
10564 ;(in user memory) to use after this one is exhausted.
10565 FNPRS3: TLNN R,-1
10566          HRLI R,440700
10567         IBP R
10568         UMOVE H,(R)             ;Fetch the word the BP points to.
10569         PUSH P,R
10570         HRRI R,H                ;Change the BP to point to H.
10571         LDB H,R                 ;Extract the desired byte.
10572         POP P,R
10573         JUMPN H,CPOPJ
10574         AOBJP Q,CPOPJ           ;When one BP is exhausted, go to the next (if any).
10575         UMOVE R,(Q)
10576         PUSHJ P,ASCIND
10577         JRST FNPRS3
10578 \f
10579 NOPEN:  HRRZ R,A        ;ARGS 1 MODE (LH) CHNL (RH) 2-5 LIKE NOPEN1 1-4
10580         CAIL R,NIOCHN
10581          JRST OPNL14
10582         ADDI R,IOCHNM(U)
10583         PUSH P,A
10584         PUSH P,B
10585         PUSH P,C
10586         PUSH P,D
10587         PUSH P,E
10588         PUSH P,W
10589         PUSHJ P,CCLOSE
10590         POP P,W
10591         SOS W           ;STRIP OF FIRST ARG
10592         POP P,D         ;B-E POPPED INTO A-D
10593         POP P,C
10594         POP P,B
10595         POP P,A
10596         POP P,R         ;A POPPED INTO R
10597         TLC R,@CTLBTS(U)
10598         LDB E,[OPNCOM,,R]
10599         CAIE E,2
10600          CAIN E,4
10601           JRST OPNL12   ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10602         JSP T,NOPEN1
10603         MOVEM D,SRN3(U) ;MAKE SYMBOLIC OPEN OF NETWORK WIN USING 5TH ARG AS FOREIGN HOST.
10604 NDEL1:  CLEARM SRN4(U)
10605 NRN2:   CLEARM SRN5(U)
10606 NOPENX: TRNE R,-NIOCHN
10607          BUG            ;BAD CHANNEL #
10608         HRRZM R,UUAC(U) ;CHNL # (MAYBE ONLY FOR ERRS) IN R
10609         ADDI R,IOCHNM(U)
10610         LDB W,[OPNCOM,,R]
10611         JRST NOPNE
10612
10613 ;DEFAULT THE ARGS FOR .CALL OPEN, ETC,; PUT MODE IN E.
10614 NOPEN1: SETZM EPDL(U)
10615         SETZM EPDL3(U)
10616         CAIGE W,2
10617          MOVSI B,(SIXBIT /@/)
10618         CAIGE W,3
10619          MOVSI C,(SIXBIT /@/)
10620         CAIGE W,4
10621          MOVE D,USYSNM(U)       ;SYSTEM NAME
10622         HLRZ E,R        ;GET MODE BITS FOR TRAN.
10623         JRST (T)
10624
10625 ;MAKE LINK 1-4 AS NOPEN1, 5 SNAME 2 6,7 FN1,2(2)
10626 NMLINK: MOVSI R,200000
10627         CAIN W,2        ;Only 2 args are BPs.
10628          JRST [ PUSHJ P,2FNPRS
10629                 JRST NOPENX]
10630         CAIGE W,7       ;Otherwise, must be seven word of sixbit.
10631          JRST OPNL33
10632         MOVEM E,SRN3(U)
10633         MOVEM TT,SRN4(U)
10634         MOVEM I,SRN5(U)
10635         JSP T,NOPEN1
10636         JRST NOPENX
10637
10638 NDEL:   SETZM SRN3(U)
10639         CAIN W,2
10640          JRST OPNL33
10641         CAIN W,1        ;If it's just a BP (or block of them),
10642          JRST [ MOVE R,A        ;Parse it into filenames in A-D.
10643                 MOVEM R,EPDL(U)
10644                 PUSHJ P,FNPRS
10645                 JRST .+2]
10646          JSP T,NOPEN1
10647         MOVSI R,400000  ;DELETE, ARGS AS NOPEN1
10648         SETZ E,
10649         JRST NDEL1
10650
10651 NRNAM:  MOVSI R,400000
10652         CAIN W,2        ;Only 2 args are BPs.
10653          JRST [ PUSHJ P,2FNPRS
10654                 JRST NRN2]
10655         CAIGE W,6       ;Otherwise, must be six word of sixbit.
10656          JRST OPNL33
10657         MOVEM E,SRN3(U)
10658         MOVEM TT,SRN4(U)
10659         MOVSI R,400000  ;RENAME 1-4 AS NOPEN1 5,6 NEW FN1,2
10660         JSP T,NOPEN1
10661         JRST NRN2
10662
10663 ;Parse two BPs (or aobjn pointers to blocks of BPs) into user memory
10664 ;into filenames.  The second bunch go in SRN3 - SRN5; the first in A - D.
10665 ;The two args are saved in EPDL and EPDL3.  Clears E, preserves R.
10666 2FNPRS: PUSH P,R
10667         MOVEM A,EPDL(U)         ;Save two BPs for job device.
10668         MOVEM B,EPDL3(U)
10669         PUSH P,A                ;Decode the second BP first, to get the new names.
10670         MOVE R,B
10671         PUSHJ P,FNPRS
10672         MOVEM B,SRN3(U)         ;Stick them where RENAME looks.
10673         MOVEM C,SRN4(U)
10674         MOVEM D,SRN5(U)
10675         POP P,R                 ;Parse the first BP, to get the old file filenames.
10676         PUSHJ P,FNPRS
10677         SETZ E,
10678         POP P,R
10679         POPJ P,
10680
10681 ;Takes either channel, FN1 (sixbit) and FN2 (sixbit)
10682 ;or channel and BP (or aobjn -> block of BPs).
10683 NRNWO:  SETZM EPDL(U)
10684         SETZM EPDL3(U)
10685         PUSH P,A
10686         CAIN W,2
10687          PUSHJ P,[MOVE R,B      ;If channel and BP, parse the BP into filenames.
10688                   MOVEM R,EPDL3(U)      ;But also save it for job device.
10689                   JRST FNPRS]
10690         MOVEM B,SRN3(U) ;PUT AWAY NEW NAMES.
10691         MOVEM C,SRN4(U)
10692         POP P,C
10693         ANDI C,-1       ;We call "RENAME" with old fn2 = channel number.
10694         SETZB A,B
10695         MOVEI D,0
10696         MOVSI R,400000  ;OPNCOM IS .FDELE .
10697         MOVEI E,400000
10698         JRST NRN2
10699 \f
10700 SUBTTL HACKS FOR OPENS THAT LOSE
10701
10702
10703 IFN 0,[         ;THESE "DEFNS" EXIST ONLY SO @ WILL CREF THEM
10704         OPNL1:  OPNL2:  OPNL3:  OPNL4:  OPNL5:  OPNL6:  OPNL7:
10705 OPNL10: OPNL11: OPNL12: OPNL13: OPNL14: OPNL15: OPNL16: OPNL17:
10706 OPNL20: OPNL21: OPNL22: OPNL23: OPNL24: OPNL25: OPNL26: OPNL27:
10707 OPNL30: OPNL31: OPNL32: OPNL33: OPNL34: OPNL35: OPNL36: OPNL37:
10708 OPNL40: OPNL41: OPNL42: OPNL43: OPNL44: OPNL45: OPNL46: OPNL47:
10709 OPNL50: OPNL51: OPNL52: OPNL53: OPNL54: OPNL55: OPNL56: OPNL57:
10710 OPNL60: OPNL61: OPNL62: OPNL63: OPNL64: OPNL65: OPNL66: OPNL67:
10711 OPNL70: OPNL71: OPNL72: OPNL73: OPNL74: OPNL75: OPNL76: OPNL77: 
10712 ]               ;END OF IFN 0
10713
10714 ;HERE ARE THE REAL DEFNS
10715 REPEAT NOPNLS,CONC OPNL,\.RPCNT+1,:     JSP D,OPENL
10716 ;
10717 OPENL:  CONSZ PI,77400
10718          BUG            ;ERROR WITH PI IN PROGRESS
10719         MOVE U,USER     ;BE SURE U=CURRENT USER'S INDEX
10720         MOVEI D,-OPNL1(D)       ;GET LOSSAGE NUMBER
10721         MOVE R,SYSCVL(U);POSSIBLY RETURN IN ERROR-CODE ARG TO .CALL
10722         TLNE R,%SCVER
10723          UMOVEM D,(R)
10724         HRRZ R,UUAC(U)  ;GET CH NUM
10725         CAILE R,NIOCHN-1
10726          BUG            ;UUAC BAD
10727         PUSHJ P,LSWCLR  ;UNLOCK SWITCHES
10728         DPB R,[BCHPTR]  ;SAVE AS MOST RECENT CHANNEL IN ERR
10729         ADD R,U         ;RELOCATE TO POINT TO USER VARS
10730         DPB D,[220600,,IOCHST(R)]       ;STORE IN STATUS WORD
10731         JRST CLKONJ
10732 \f
10733 SUBTTL RCHST, STATUS, RFNAME, RFPNTR, WHYINT CALLS
10734
10735 ;.CALL RFNAME
10736 ;1ST ARG IS A <JOB>, WHOSE CHANNEL IS TO BE LOOKED AT.
10737 ;2ND ARG IS A CHANNEL NUMBER.
10738 ;3RD ARG IS BP TO STORE ASCIZ FILENAME STRING THROUGH.
10739 ;4TH ARG IS MAXIMUM NUMBER OF CHARACTERS TO STORE (DEFAULTS TO 1,,0).
10740 ;ONLY 1 ARG => IT IS CHANNEL #, AND JOB IS "SELF".
10741 ;FIRST 4 VALUES ARE THE DEVICE, FN1, FN2 AND SNAME
10742 ;  AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10743 ;FIFTH VALUE IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN
10744
10745 NRFNAM: MOVE J,A        ;FIRST ARG IS JOB SPEC
10746         CAIL W,2
10747          SKIPA A,B      ;GET CHANNEL # INTO A IN EITHER CASE
10748           MOVEI J,%JSELF ;IF ONLY ONE ARG, JOB SPEC IS SELF
10749         MOVE Q,C        ;SAVE BP FOR STORING ASCIZ FILENAME STRING - IF ANY.
10750         CAIGE W,3
10751          SETZ Q,
10752         CAIGE W,4
10753          MOVSI D,1
10754         JSP T,NCORUI    ;DECODE JOB SPEC
10755          JFCL
10756 IFN PDP6P,[
10757         CAIN J,-1
10758          JRST OPNL34    ;PDP6 DOESN'T HAVE CHANNELS
10759 ]
10760         PUSH P,D
10761         PUSH P,Q
10762         MOVE W,D
10763         MOVE U,J        ;LOOK IN THAT JOB'S CHANNELS
10764         PUSHJ P,NRFNM1  ;GET THE CRUFT
10765          JRST POP2J
10766         PUSHJ P,LSWPOP  ;UNSOS DIELOK.
10767         MOVE T,Q
10768         POP P,Q
10769         POP P,I         ;I GETS 4TH ARG: MAX NUMBER OF CHARS TO STORE IN STRING.
10770         JUMPE T,POPJ1   ;IF DEVICE ROUTINE HAS CLEARED Q, IT HAS STORED THE STRING.
10771                 ;NOTE NETRCH PUTS AN EXTRA VALUE FOR .RCHST (GARBAGE, TO US) IN Q!
10772         JUMPE Q,POPJ1   ;IF BP ARG WAS 0, CALLER DOESN'T WANT A STRING.
10773         MOVE R,Q
10774         PUSHJ P,ASCIND
10775         MOVE Q,R
10776         MOVE J,A        ;IF SO, STORE ALL 4 FILENAMES DOWN IT, ONE BY ONE.
10777         MOVEI T,":
10778         PUSHJ P,NRFNS1
10779         MOVE J,D
10780         MOVEI T,";
10781         PUSHJ P,NRFNS1
10782         MOVE J,B
10783         MOVEI T,40
10784         PUSHJ P,NRFNS1
10785         MOVE J,C
10786         MOVEI T,0
10787         PUSHJ P,NRFNS1
10788         JRST POPJ1
10789
10790 ;STORE THE SIXBIT WORD IN J FOLLOWED BY THE ASCII CHAR IN T
10791 ;INTO USER ADDRESS SPACE DOWN THE BP IN Q.
10792 NRFNS1: JUMPE J,CPOPJ           ;OUTPUT NOTHING AT ALL IF THE SIXBIT WORD IS EMPTY.
10793         CAIGE I,4               ;GIVE UP NOW IF TOO CLOSE TO END OF ALLOCATED SPACE.
10794          POPJ P,
10795         SETZ R,
10796         ROTC J,6                ;ELSE GET NEXT CHAR IN R, AND CONVERT TO ASCII AND STORE.
10797         ADDI R,40
10798         SETZ TT,
10799         CAIE R,":               ;PRECEDE ANY SPECIAL CHARACTERS WITH ^Q.
10800          CAIN R,";
10801           MOVEI TT,^Q
10802         CAIN R,40
10803          MOVEI TT,^Q
10804         JUMPE TT,NRFNS2
10805         SOS I
10806         PUSHJ P,NRFNSB
10807 NRFNS2: SOS I
10808         MOVE TT,R
10809         PUSHJ P,NRFNSB
10810         JUMPN J,NRFNS1
10811         SOS I
10812         MOVE TT,T
10813         PUSHJ P,NRFNSB          ;IF NAME FINISHED BUT NOT EMPTY, FOLLOW BY TERMINATOR.
10814         JUMPE T,CPOPJ
10815         CAIN T,40
10816          POPJ P,
10817         MOVEI TT,40
10818         PUSHJ P,NRFNSB          ;IF TERMINATOR IS : OR ;, FOLLOW IT WITH A SPACE.
10819         SOJA I,CPOPJ
10820
10821 ;STORE A BYTE IN TT DOWN BP IN Q TO USER SPACE, INCREMENTING FIRST.
10822 ;XCTR XBYTE LOSES BECUSE IT GETS THE BP FROM USER SPACE.
10823 NRFNSB: IBP Q
10824         PUSH P,T
10825         PUSH P,Q
10826         UMOVE T,(Q)
10827         HRRI Q,T
10828         DPB TT,Q
10829         POP P,Q
10830         UMOVEM T,(Q)
10831         POP P,T
10832         POPJ P,
10833
10834 ;GET THE FILENAMES FOR THE CHANNEL IN A OF JOB IN U INTO A THRU D.
10835 ;IF Q IS NONZERO, IT IS A BP TO STORE AN ASCIZ STRING, AND W IS THE
10836 ;MAX NUMBER OF CHARACTERS TO STORE.
10837 ;THE DEVICE DEPENDENT ROUTINE CAN STORE THE STRING ITSELF
10838 ;AND SET Q TO ZERO SO THAT IT WILL NOT BE STORED THE STANDARD WAY.
10839 NRFNM1: MOVE T,[4,,NRFNM2]
10840         JRST CHNDCD     ;R GETS ADDR OF IOCHNM WD, H GETS CONTENTS.
10841 NRFNM2: HLRZ A,H        ;PUT LH(IOCHNM WD) WHERE DEVICE RTN LOOKS
10842         HLLZ J,DCHSTB(H)
10843         JUMPG J,[       ;IF 6-LETTER DEVICE NAME, LH IS POSITIVE ADDRESS
10844                 HLRZS J ;OF FULL NAME.  NOTE THERE BETTER BE NO
10845                 MOVE J,(J)      ;3-CHAR DEVICES WHOSE NAME DOES NOT START
10846                 JRST .+1 ]      ;WITH A LETTER.
10847         PUSH P,J        ;SAVE THE PROBABLE VALUE OF DEVICE NAME
10848         LDB J,[1400,,DCHSTB(H)]
10849         HLRZ J,DRFNTB(J) ;GET RFNAME ROUTINE POINTER
10850         SETZB B,C       ;FN1, FN2 ARE 0 FOR NON-DIR-DEV
10851         SETZ D,         ;SNAME IS 0 FOR NON-MULTI-DIR-DEV
10852         LDB E,[.BP (%IOTOM),IOTTB(H)]   ;PROBABLE VALUE OF MODE
10853         PUSHJ P,(J)     ;CALL DEVICE-SPECIFIC ROUTINE
10854          SKIPA A,(P)    ;NO SKIP => USE DEVICE NAME FROM DCHSTB
10855           MOVE A,J      ;SKIP => USE DEVICE NAME RETURNED IN J
10856         JRST POP1J1
10857
10858 ;.CALL RFPNTR
10859 ;ARG 1 - CHANNEL NUMBER
10860 ;VAL 1 - ACCESS POINTER OF CHANNEL
10861 ;VAL 2 - BYTE SIZE OF CHANNEL.
10862 ;FAILS IF NOT A RANDOM-ACCESS DEVICE
10863
10864 NRFPNT: HLRZ A,H        ;CHANNEL ALREADY DECODED, SET UP LH(IOCHNM) FOR DEV RTN
10865         LDB J,[1400,,DCHSTB(H)]
10866         HRRZ J,DRFNTB(J) ;GET RFPNTR ROUTINE POINTER
10867         JRST (J)        ;IT SHOULD PUT POINTER IN A AND POPJ1, OR OPNL34
10868
10869 ;SYMBOLIC CALL "RCHST"
10870 ;1ST ARG IS A CHANNEL NUMBER.
10871 ;6 OR MORE VALUES. THE FIRST 4 ARE THE DEVICE, FN1, FN2 AND SNAME
10872 ;  AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10873 ;THE 5TH IS THE ACCESS POINTER, OR -1 IF NOT RANDOM ACCESS.
10874 ;THE 6TH IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN.
10875 ;MORE VALUES ARE RETURNED ONLY FOR NET:, AT THE MOMENT.
10876 ;THE DEV SUBROUTINE MAY PUT EXTRA RESULTS IN TT, I, AND Q, AND PUT # RESULTS INTO W
10877
10878 NRCHST: SETO I,                 ;DEFAULT POSSIBLE EXTRA RESULTS
10879         SETO TT,                ;DEFAULT ACCESS POINTER TO -1
10880         MOVEI W,6               ;NORMAL NUMBER OF RESULTS IS 6
10881         SETZ Q,
10882         PUSHJ P,NRFNM1          ;GET RESULTS 1 THROUGH 4 AND 6, AND SET UP R AND H
10883          POPJ P,                ;CHANNEL NUMBER MUST HAVE BEEN BAD
10884         PUSH P,A
10885         PUSH P,B                ;SAVE THE AC THAT RFPNTR CLOBBERS.
10886         HLRZ A,H                ;GET ROUTINE TO GET ACCESS POINTER
10887         LDB J,[1400,,DCHSTB(H)]
10888         HRRZ J,DRFNTB(J)        ;ROUTINE BETTER PRESERVE B,C,D,E,TT,I,Q
10889         CAIL J,OPENL            ;KLUDGILY SKIP IF WOULD OPEN-LOSS
10890          PUSHJ P,(J)            ;GET ACCESS POINTER IN A, ALWAYS SKIPS
10891           MOVE A,TT             ;NOT RANDOM ACESS, USE DEFAULT VALUE
10892         MOVE TT,E               ;OPEN MODE IS 6TH RESULT
10893         MOVE E,A                ;ACCESS POINTER IS 5TH RESULT
10894         JRST PPBAJ1
10895 \f
10896 ;.RCHST AC,  WITH  AC/ CH,,ADDR
10897 ;RETURNS, IN THE 5 OR MORE WORDS STARTING AT ADDR,
10898 ;THE RESULTS OF A SYMBOLIC RCHST ON CHANNEL CH.
10899 ;EXCEPTION - THE DEVICE NAME IS RETURNED IN THE RH
10900 ;OF THE FIRST WORD , SO IT IS TRUNCATED TO 18 BITS.
10901 ;EXCEPTION - THE OPEN MODE VALUE IS NOT RETURNED. LATER VALUES
10902 ;ARE SHIFTED DOWN ONE WORD.
10903 ;NEVER SKIPS.
10904
10905 ARCHST: UMOVE J,(J)     ;GET CONTENTS OF AC
10906         HLRZ A,J
10907         CAIL A,NIOCHN
10908          JRST ILUUO     ;BAD CHANNEL NUMBER
10909         PUSH P,J
10910         PUSHJ P,NRCHST  ;DO THE REAL WORK.
10911          BUG            ;ONLY ERROR RETURN SHOULD BE BAD CHANNEL NUMBER
10912         HLRZS A         ;PUT DEV NAME IN RH FOR HISTORY'S SAKE
10913         POP P,J         ;RH(J) HAS PLACE TO STORE DATA
10914         MOVE TT,I
10915         MOVE I,Q        ;SHIFT DOWN LAST 2 VALS OVER THE OPEN MODE.
10916         HRLI J,A
10917         ADDI W,-2(J)    ;W HAD 1+ # VALS, NOW HAS PLACE TO PUT LAST ONE
10918         XCTR XBW,[BLT J,(W)]
10919         POPJ P,
10920
10921 ;.STATUS CH,LOC ;STORE IN LOC THE STATUS OF CHANNEL CH
10922                 ;AND OF THE DEV OPEN ON IT IF ANY
10923 ;1.1-1.6 SYS PERIPHERAL DEVICE CODE
10924 ;1.7-2.9 DEVICE DEPENDENT
10925 ;3.1-4.9 LH(IOCHST)
10926
10927 ASTATUS:ADDI R,IOCHNM(U)        ;SET UP AC'S LIKE CHNDCD
10928 ASTAT1: MOVE H,(R)              ;ENTER HERE FROM .USET [.RIOS,,]
10929         HLL R,CLSTB(H)
10930         PUSHJ P,NSTATUS         ;CALL NEW SYSTEM CALL VERSION
10931          BUG
10932         UMOVEM A,(C)    ;GIVE TO USER
10933         POPJ P,
10934
10935 ;.CALL STATUS
10936 ;ARG 1 - CHANNEL NUMBER
10937 ;VAL 1 - SAME AS .STATUS
10938
10939 NSTATUS:HLRZ A,H                ;SET UP LH(IOCHNM)
10940         LDB D,[140600,,DCHSTB(H)] ;GET SYS PERIPHERAL DEVICE CODE
10941         LDB J,[340300,,IOTTB(H)]        ;GET I/O CHANNEL MODE FROM 4.5-4.2
10942         DPB J,[060300,,D]       ;RETURN IN BITS 1.9-1.7
10943         LDB J,[1400,,DCHSTB(H)]
10944         HLRZ J,DSTSTB(J)        ;GET STATUS ROUTINE POINTER
10945         PUSHJ P,(J)             ;ROUTINE FILLS OUT STATUS WORD IN D
10946         HLL D,IOCHST-IOCHNM(R)  ;FILL IN LEFT HALF FROM IOCHST
10947         TLZ D,740000            ;CLEAR BITS USED FOR CHANNEL NUM ON IO PDL
10948         MOVE A,D                ;RETURN VALUE IN A
10949         JRST POPJ1              ;THIS CALL ALWAYS SUCCEEDS
10950
10951 ;.CALL WHYINT
10952 ;ARG 1 - CHANNEL NUMBER
10953 ;VAL 1 - %WY CODE FOR TYPE OF DEVICE
10954 ;ADDITIONAL VALUES DEVICE-DEPENDENT
10955 ;THIS IS THE USUAL CALL TO GIVE IN RESPONSE TO A SECOND WORD INTERRUPT
10956
10957 NWHYINT:HLRZ A,H                ;SET UP LH(IOCHNM)
10958         LDB J,[1400,,DCHSTB(H)]
10959         HRRZ J,DSTSTB(J)        ;GET WHYINT ROUTINE POINTER
10960         JRST (J)
10961 \f
10962 ;DEVICE-SPECIFIC RFNAME/RCHST ROUTINES
10963 ;CALLED WITH STANDARD CHNDCD STUFF IN H AND R, LH(IOCHNM) IN A
10964 ;MUST PRESERVE H AND R; CAN CLOBBER W TO INDICATE EXTRA STUFF FOR RCHST
10965
10966 RCHUSR: MOVE B,UNAME(A)         ;GET UNAME
10967         MOVE C,JNAME(A)         ;GET JNAME
10968         POPJ P,
10969
10970 IFN NUNITS,[            ;UTAPE .RCHST
10971 RCHUTP: HRRZ C,UTTNO(A)
10972         MOVSI J,'UT0(C) ;GET REAL DEV NAME "UTN" IN J
10973         AOS (P)         ;SKIP TO RETURN CHANGED DEV NAME
10974         MOVE D,UTASS(C) ;THE "SNAME" IS THE USER TAPE IS ASSIGNED TO.
10975         CAIGE A,NUTIC
10976          JRST RCHUTI    ;INPUT
10977         MOVE B,UTN1(A)  ;OUTPUT, GET FN1
10978         MOVE C,UTN2(A)  ;NOW FN2
10979         POPJ P,
10980
10981         ;UTAPE INPUT .RCHST
10982 RCHUTI: LDB T,[220500,,UTDBC(A)]        ;GET FILE NUMBER
10983         SUBI T,1
10984         LSH T,1                 ;TURN INTO INDEX INTO DIRECTORY
10985         CONO PI,CLKOFF
10986         ADD T,UDIRO(C)          ;GET POINTER TO FILE NAMES
10987         MOVE B,(T)              ;GET FN1
10988         MOVE C,(T)              ;GET FN2
10989         JRST CLKONJ
10990 ]
10991
10992 ;RCHST ROUTINE FOR TTY
10993 RCHTTY: MOVE J,A
10994         ANDI J,#%TICNS#(.BM $TIIDX)
10995         IOR E,J         ;MERGE TTY OPEN MODE BITS WITH THE GENERAL ONES.
10996         TRNE A,%TICNS
10997          POPJ P,
10998         ANDI A,7
10999         MOVEI J,'T00(A)
11000         HLRZ A,(R)
11001 RCHST1: ANDI A,70
11002         LSH A,3
11003         ADD J,A
11004         HRLZS J         ;J NOW HAS SIXBIT/TNM/, NM = TTY #.
11005         JRST POPJ1      ;SKIP TO SAY DEV NAME IS IN J.
11006
11007 ;RCHST ROUTINE FOR STY
11008 RCHSTY: MOVE J,TTYOPT(A)
11009         TLNE J,%TOHDX
11010          IORI E,4       ;STY BIT 1.3 => TTY IS HALF-DUPLEX.
11011         MOVE J,STYSTS-NFSTTY(A)
11012         TLNE J,%SSORS
11013          IORI E,20      ;BIT 1.5 => WANT TO RECEIVE %TDORS ON .RESET OF TYOC,
11014         TRNN E,1        ;FIND THE DON'T-HANG-BIT FOR THIS DIRECTION.
11015          TLZA J,#%SSOHG ;AND FLUSH THE ONE FOR THE OTHER DIRECTION.
11016           TLZ J,#%SSHNG
11017         TLNE J,-1       ;THEN TESTING BOTH TESTS ONLY THE RELEVANT ONE.
11018          IORI E,10
11019         SUBI A,NFSTTY
11020         ANDI A,7
11021         MOVEI J,'S00(A)
11022         HLRZ A,(R)
11023         SUBI A,NFSTTY
11024         JRST RCHST1
11025
11026 RCHDRH: HRRZ A,IOCHST-IOCHNM(R) ;TRACK NUMBER
11027         IMULI A,LMNBLK          ;DIRHNG DEVICE RFNAME
11028         ADDI A,2000-LMNBLK*NUDSL
11029         ADD A,QMDRO
11030         MOVE D,MNUNAM(A)
11031         POPJ P,
11032 \f
11033 ;RCHST ROUTINE FOR DIRECTORY CHANNELS AND THE ERR DEVICE.
11034 RCHDIR: MOVE T,DSKLST(A)        ;GET THE TYPE OF DIRECTORY CODE.
11035         SKIPE J,UDUSR(A)        ;IF DEVICE # IS NONZERO, ADD IT TO DEV NAME
11036          HRLZS J                ;(ONLY HAPPENS FOR UTAPE)
11037         ADD J,RCHDRD-1(T)       ;DETERMINE DEV NAME FROM DIRECTORY TYPE
11038         MOVE B,RCHDR1-1(T)      ;SAME FOR FN1
11039         SKIPN C,RCHDR2-1(T)     ;AND FN2, EXCEPT 0 FOR ERR DEVICES
11040          MOVE C,UUDPP(A)        ; SO WE WILL GET THE STATUS WORD BEING DECODED.
11041         CAIN T,3
11042          MOVE D,UDSYSN(A)       ;FOR DISK UFD'S, GET THE SNAME
11043         JRST POPJ1              ;RETURN, SAYING WE HAVE SPEC'D THE DEVICE NAME.
11044
11045 .SEE UDT        ;THESE TABLES ARE IN PARALLEL WITH UDT
11046 RCHDRD: 'UT0,, ? 'CLU,, ? 'DSK,, ? 'DSK,,
11047         'ERR,, ? 'TTY,, ? 'COR,,
11048 IF2 IFN .-UDTLN-RCHDRD,.ERR RCHDRD WRONG LENGTH
11049
11050 RCHDR1: '.FILE. ? '.FILE. ? '.FILE. ? 'M.F.D.
11051         3 ? '.FILE. ? '.FILE.
11052 IF2 IFN .-UDTLN-RCHDR1,.ERR RCHDR1 WRONG LENGTH
11053
11054 RCHDR2: SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(FILE)/
11055         0 ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/
11056 IF2 IFN .-UDTLN-RCHDR2,.ERR RCHDR2 WRONG LENGTH
11057
11058
11059
11060 ;CORE LINK .RCHST ROUTINE
11061
11062 RCHCLO: CONO PI,CLKOFF
11063         MOVE B,CLN1(A)  ;GET FN1
11064         MOVE C,CLN2(A)  ;GET FN2
11065         MOVE D,CLSYN(A) ;GET SYSTEM NAME
11066         JRST CLKONJ
11067
11068 ;RFNAME ROUTINE FOR DSK
11069
11070 RCHQSK: MOVE H,QUDPR(A) ;FILE STATUS FOR DISK PICKUP USER DIR POINTER
11071         PUSHJ P,QUDLK   ;LOCK DIRECTORY
11072         MOVE C,QSNLCN(H)        ;LOCATION OF DIRECTORY
11073         MOVE D,UDNAME(C)
11074         ADD C,QUDFPR(A) ;ADD LOCN OF FILE WITHIN DIRECTORY
11075         MOVE B,(C)      ;GET FIRST FILE NAME
11076         MOVE C,1(C)     ;GET SECOND FILE NAME
11077         PUSHJ P,QUDULK
11078         MOVE H,QSRAC(A)
11079         TLNE H,%QALNK
11080          TRO E,20       ;LINK MODE
11081         MOVE H,(R)      ;PRESERVE H
11082         POPJ P,
11083
11084 ;RFNAME ROUTINE FOR BOJ:
11085
11086 RCHBOJ: CONO PI,CLKOFF  ;BOJ DEVICE .RCHST ROUTINE
11087         MOVE T,JBCUI(A) ;RETURNS CREATOR'S NAME
11088         MOVE B,UNAME(T)
11089         MOVE C,JNAME(T)
11090         SKIPGE JBCG(A)
11091          SETZB B,C      ;CREATOR GONE, RETURN BLANK NAMES
11092         JRST CLKONJ
11093 \f
11094 ;RFNAME ROUTINE FOR JOB:
11095
11096 RFNJOB: SKIPE Q
11097          PUSHJ P,RFNJ1
11098         CONO PI,CLKOFF
11099         MOVE B,JBFN1(A)
11100         MOVE C,JBFN2(A)
11101         MOVE D,JBSYS(A)
11102         MOVE E,JBOPNM(A)
11103         MOVE J,JBDEV(A)
11104         JRST CLKOJ1
11105
11106 ;COPY THE BOJ JOB'S ASCIZ FILENAME STRING INTO OUR CALLER'S STRING.
11107 ;THE CALLER'S BP IS IN Q, AND HIS MAX CHARS TO STORE IS IN W.
11108 RFNJ1:  SKIPN B,JBFNP(A)
11109          POPJ P,
11110         PUSH P,TT
11111         PUSH P,T
11112         MOVE J,JBCJUI(A)
11113         AOS DIELOK(J)   ;PREVENT THE JOB FROM DIEING.
11114         PUSHJ P,SOSSET
11115          DIELOK(J)
11116         TLZ B,37
11117         MOVE D,B
11118         PUSHJ P,RFNJ3
11119         MOVEI TT,1
11120 ;D HAS BP TO FETCH WITH, POINTING INTO C, WHICH CONTAINS WORD FETCHED FROM BOJ JOB.
11121 ;RH(B) HAS ADDR OF NEXT WORD TO FETCH FROM THE BOJ JOB.
11122 ;TT CONTAINS THE PREVIOUS CHARACTER TRANSFERRED, OR 1
11123 ;IF THE PREVIOUS CHARACTER WAS QUOTED WITH A ^Q.
11124 RFNJ2:  ILDB E,D
11125         TRNN D,#C               ;IF THE BP IN D ADVANCES PAST C,
11126          JRST RFNJ4
11127         PUSHJ P,RFNJ3           ;FETCH ANOTHER WORD INTO C, MAKE D POINT THERE AGAIN,
11128         LDB E,D                 ;AND FETCH THE SAME BYTE OVER AGAIN.
11129 RFNJ4:  SOJL W,RFNJ5
11130         EXCH TT,E
11131         PUSHJ P,NRFNSB          ;STORE BYTE INTO CALLER, UNLESS HIS STRING IS FULL.
11132         EXCH TT,E
11133         CAIN TT,^Q              ;A QUOTED CHAR DOES NOT TERMINATE AND DOES NOT QUOTE.
11134          MOVEI E,1
11135         MOVE TT,E
11136         JUMPN E,RFNJ2           ;STOP STORING AFTER A NULL WHICH ISN'T QUOTED.
11137 RFNJ5:  SETZ Q,
11138         POP P,T
11139         POP P,TT
11140         JRST LSWPOP
11141
11142 ;READ THE NEXT WORD (ADDR IN B) FROM THE BOJ JOB.
11143 RFNJ3:  SETZ C,
11144         PUSH P,U
11145         PUSH P,A
11146         PUSH P,Q
11147         MOVE U,JBCJUI(A)
11148         LDB A,[121000,,B]
11149         PUSHJ P,UPLC            ;LOOK UP THE BOJ JOB'S PAGE.
11150         POP P,Q
11151         POP P,A
11152         POP P,U
11153         LDB J,T                 ;IF IT DOESN'T EXIST, LOAD A ZERO,
11154         JUMPE J,RFNJ6           ;AVOID GETTING MPV.
11155         MOVE J,JBCJUI(A)
11156         PUSHJ P,MPLDJ
11157         UMOVE C,(B)
11158 RFNJ6:  HRRI D,C
11159         AOJA B,MPLDZ
11160 \f
11161 ;RFPNTR FOR USR:
11162
11163 RFPUSR: HRRZ A,IOCHST-IOCHNM(R) ;GET THE ACCESS PTR
11164         MOVEI B,36.             ;BYTE SIZE IS ALWAYS FULL WORD.
11165         JRST POPJ1
11166
11167 ;RFPNTR FOR DISK
11168
11169 RFPQSK: LDB B,[QSBSIZ(A)]       ;GET FILE BYTE SIZE
11170         MOVSI T,%QAACC
11171         TDNN T,QSRAC(A)         ;IF .ACCESS WAS DONE AND NOT HANDLED,
11172          JRST RFPQS1
11173         MOVE A,QRADAD(A)        ;GET WHAT THE .ACCESS SPECIFIED.
11174         JRST POPJ1
11175
11176 RFPQS1: MOVE J,QFBLNO(A)        ;GET BYTE # OF STRAT OF CURRENT BLOCK.
11177         SKIPGE QSMDN(A)         ;SKIP ON A BUFFER ACTIVE
11178          JRST RFPQS2            ;NONE ACTIVE => QFBLNO POINTS TO NEXT BLOCK TO BE READ.
11179         ADD J,QMPBSZ(A)         ;ELSE CORRECT FOR THE NUMBER OF BYTES WE'VE PROCESSED
11180         SUB J,QSMPRC(A)         ;IN THE ACTIVE BLOCK (QFBLNO -> 1ST WD OF BLOCK).
11181 RFPQS2: MOVE A,J
11182         JRST POPJ1
11183 \f
11184 SUBTTL RESET,IOPUSH,IOPOP,IOPDL,FORCE,FLUSH .CALLS
11185
11186 ;.RESET CH,     ;RESET BUFFERED INFO ON CHANNEL CH
11187                 ;NOT IMPLEMENTED FOR MANY DEVICES
11188                 ;HAS SPECIAL EFFECTS ON "USR" DEVICE
11189 ;.CALL RESET
11190 ;ARG 1 - CHANNEL NUMBER
11191
11192 NRESET: HRRZ A,H
11193         AOSA (P)
11194 ARESET:  HRRZ A,(R)     ;PICK UP INDEX FROM I/O CH WORD
11195         SKIPA T,[HRRZ T,RSTB1(A)]       ;.RESET USES RH OF TABLE
11196 AIOPP1:  MOVE T,[HLRZ T,RSTB1(A)]       ;.IOPUSH, .IOPOP USE LH OF TABLE
11197         IDIVI A,7       ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11198         ADD A,[440500,,RSTB]
11199         IBP A
11200         SOJGE B,.-1
11201         LDB A,A         ;GET BYTE FROM TABLE
11202         XCT T           ;GET REAL TABLE ENTRY IN T
11203         JRST (T)        ;DISPATCH
11204
11205 ;IO CHANNEL PUSH DOWN LIST ROUTINES
11206 ;C(I) =0 AT DSP => IOPUSH =1 => IOPOP
11207
11208 NIOPUS: AOS (P)
11209 AIOPUSH:MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11210         CAML T,[LUIOP-1,,0]     ;LUIOP-2,,<ptr> is OK, leaves room for 1 more.
11211          JRST IOCER6    ;OVER PUSH ERROR
11212         PUSH T,(R)      ;PUSH CURRENT IOCHNM
11213         PUSH T,IOCHST-IOCHNM(R) ;&IOCHST
11214         HRRZ A,(R)
11215         HRRZ J,UUAC(U)
11216         DPB J,[400400,,(T)]     ;STORE CHANNEL NUM FOR POSSIBLE USE BY AIOPDL
11217         MOVEM T,SIOCP(U)        ;STORE BACK PDL POINTER
11218         MOVEI I,0       ;INDICATE IOPUSH
11219         PUSH P,R
11220         PUSHJ P,AIOPP1  ;CALL DEVICE'S IOPDL HANDLER.  SHOULD NOT HANG
11221         POP P,R
11222         SETZM (R)       ;CLEAR OUT IOCHNM
11223         SETZM IOCHST-IOCHNM(R)  ;&IOCHST
11224         POPJ P,
11225
11226 NIOPOP: AOS (P)
11227 AIOPOP: PUSHJ P,ACLOSE  ;CLOSE WHATEVER MAY BE OPEN ON CHANNEL POPPING INTO
11228         MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11229         TLNN T,-1
11230          JRST IOCER5    ;OVER POP ERROR
11231         POP T,IOCHST-IOCHNM(R)  ;POP BACK IOCHST
11232         POP T,(R)               ;&IOCHNM
11233         HRRZ A,(R)
11234         SETZM 1(T)      ;CLEAR OUT PDL WORD TO AVOID CONFUSION IN
11235                         ;ROUTINES THAT GROVEL OVER I/O PDL
11236         MOVEM T,SIOCP(U)        ;STORE BACK PDL POINTER
11237         MOVEI I,1       ;INDICATE IOPOP
11238         JRST AIOPP1     ;CALL DEVICE'S IOPDL HANDLER
11239
11240 AIOPDL: MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11241         TLNN T,-1       ;SKIP UNLESS IO PDL EMPTY
11242         POPJ P,
11243         LDB R,[400400,,(T)]     ;FIND OUT WHAT CHNL TOP ENTRY WAS PUSHED FROM
11244         ADDI R,IOCHNM(U)
11245         PUSHJ P,AIOPOP  ;POP BACK INTO CHNL PUSHED FROM
11246         JRST AIOPDL
11247
11248 IIOPPR: JUMPE I,[JRST 4,CPOPJ]  ;IOPUSH
11249         SETZM (R)       ;CLOSE CHANNEL
11250         SUBI R,IOCHNM(U)        ;GET CHANNEL NUMBER
11251         MOVE R,CHNBIT(R)        ;SECOND WORD INTERRUPT BIT
11252         IORM R,IFPIR(U) ;GIVE TO USER
11253         POPJ P,
11254 \f
11255 ;.CALL FORCE
11256 ;ARG 1 - CHANNEL NUMBER
11257 ;IF ANY OUTPUT IS BUFFERED UP, CAUSES IT TO BE SENT TO THE DEVICE
11258 ;(IF FORCE WAS NOT DONE, IT MIGHT NOT BE SENT UNTIL A COMPLETE
11259 ;BUFFERFULL HAD BEEN OUTPUT BY THE USER.)
11260
11261 NFORCE: SKIPA T,[HLRZ T,DFRCTB(D)]      ;FORCE USES LH OF TABLE
11262 NFINI1:  MOVE T,[HRRZ T,DFRCTB(D)]      ;FINISH USES RH OF TABLE
11263         HLRZ A,(R)      ;PASS LH(IOCHNM) TO DEVICE ROUTINES
11264         HRRZ D,(R)      ;USE RH(IOCHNM) AS BYTE INDEX INTO RSTB
11265         IDIVI D,7       ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11266         ADD D,[440500,,RSTB]
11267         IBP D
11268         SOJGE E,.-1
11269         LDB D,D         ;GET BYTE FROM TABLE
11270         XCT T           ;GET REAL TABLE ENTRY IN T
11271         JRST (T)        ;DISPATCH
11272
11273 ;.CALL FINISH
11274 ;ARG 1 - CHANNEL NUMBER
11275 ;FIRST DOES A FORCE, THEN WAITS FOR ALL OUTPUT TO GET TO THE DEVICE
11276
11277 NFINIS: PUSHJ P,NFORCE  ;CALL DEV ROUTINE FOR FORCING
11278          POPJ P,
11279         JRST NFINI1     ;THEN CALL DEV ROUTINE FOR WAITING
11280
11281 ;.NETS CH, - UUO VERSION OF .CALL FORCE.
11282 ANETS:  PUSHJ P,NFORCE
11283          JRST IOCER1    ;ILLEGAL HARDWARE OPERATION
11284         POPJ P,
11285 \f
11286 SUBTTL I/O DEVICE DISPATCH TABLES
11287
11288 COMMENT |
11289         This page tries to document the ITS I/O device dispatch tables and
11290 dispatch environment.  It is not completed yet.
11291
11292 The tables use several different indices, which are:
11293         opnidx - result of device name lookup in DEVTAB
11294         ioidx  - result of OPEN; has symbolic values.  This is the index
11295                 stored in RH of IOCHNM (per-job channel table)
11296         sidx  - secondary index from DCHSTB(ioidx)
11297         ridx  - secondary index from RSTB(ioidx)
11298
11299 The following system calls are dispatched through these tables.
11300 There are 11 dispatch routines that each device must specify.
11301 The format is "CALL [table name(index-used) -> device-routine]"
11302
11303 OPEN [DEVADR(opnidx) -> devO]
11304         "opnidx" is looked up from DEVTAB which holds the device names.
11305         The device's OPEN routine is in the RH of DEVADR.
11306         It must set up the user's IOCHNM word for the channel,
11307         by setting the RH to the right "ioidx" and the LH to whatever
11308         the device wants.
11309
11310         Context:
11311
11312 CLOSE [CLSTB(ioidx) -> devCLS]
11313         The device's CLOSE routine is in the RH of CLSTB.
11314         It must zero the user's IOCHNM word for the channel.
11315
11316         Context:
11317
11318 IOT, SIOT [IOTTB(ioidx) -> devVarious]
11319         These routines do I/O transfers.  The main reason "ioidx"
11320         has so many possible values (causing IOTTB to be large) is
11321         because lots of devices specify different ioidx's for different
11322         modes - input/output, block/unit, image/ascii, etc - in order
11323         to speed up actual I/O transfers, which are probably the most
11324         common device-related system calls.
11325
11326         Context:
11327
11328 STATUS  [LH(DTSTB(sidx)) -> devSTA]
11329         
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 CHAOSP,CHAIDN::     REPEAT 2,               CHACLS  ;CHAOS NET
11385 IFN NUNITS,[
11386 DNUACII::               REPEAT 3,[
11387                                         %CLSDI,,UTICL   ;UTAPE.
11388                                         %CLSDO,,UTOCL
11389 ]]
11390 IFN OLPTP,LPTDN::       REPEAT 2,               LPTCLS  ;LPT
11391 IFN NLPTP,[
11392 NLPTDN::                                        NLPDCL
11393                                                 NLPTCL
11394 ]
11395 IFN GLPTP,GLPTDN::      REPEAT 2,               GLPCLS
11396 DIRCHN::                REPEAT 4,               UTDCLS  ;DIRECTORY DEVICE
11397 IFN VIDP,NVIDOP::       REPEAT 2,               NVDCLS  ;NVIDI
11398 IFN PLTP,PLTDN::        REPEAT 2,       %CLSNR,,PLTUSR  ;PLOTTER
11399 IFN PTRP,[
11400 PTPI::                  REPEAT 5,       %CLSNR,,PTPUSR  ;PAPER  TAPE PUNCH
11401 ]
11402 IFN IMXP,IMPXDN::       REPEAT 4,               IMPXCL  ;IMX
11403 IFN OMXP,OMPXDN::       REPEAT 4,               OMPXCL  ;OMX
11404 DCLUAI::                                %CLSCL,,CLCLRA  ;CORE LINK
11405                                         %CLSCL,,CLCLWU
11406                         REPEAT 2,[
11407                                         %CLSCL,,CLCLRB
11408                                         %CLSCL,,CLCLWB
11409                         ]
11410 IFN PTRP,[
11411 REDUAI::                REPEAT 5,               PTRCLS  ;PAPER TAPE READER
11412 ]
11413 IFN 340P,[
11414 DN340B::                REPEAT 4,               ADCL1   ;340
11415 ;                                               ADCL1   ;IDS
11416 ]
11417 IFN CODP,[
11418 CODDN::                 REPEAT 2,               CODCLS  ;CODE DEV
11419 ]
11420 DQUAI::                                 %CLSQ ,,QICL    ;DISK
11421                                         %CL1QO,,QOCLR
11422                                         %CLSQ ,,QICL
11423                                         %CL1QO,,QOCL
11424                                         %CLSQ ,,QICL
11425                                         %CL1QO,,QOCL
11426 IFN VIDP,DNVDIU::       REPEAT 4,               TVCCLS  ;TVC
11427 IFN PDP6P,PDPUIO::      REPEAT 4,       %CLS6 ,,PDPCLS  ;USR IN PDP10 MODE
11428 IFN TABP,DTABUI::       REPEAT 2,       %CLSNR,,TABUSR  ;TABLET
11429 IFN NMTCS,[
11430 MTUAIX::                REPEAT 3,               MTICL   ;MAG TAPE
11431                         REPEAT 3,               MTOCL
11432         ]
11433 JDUAI::         REPEAT 3,[
11434                                         %CLSJI,,JOBCLS  ;JOB DEVICE
11435                                         %CLSJO,,JOBCLS
11436                         ]
11437 BDUAI::                 REPEAT 6,       %CLSBJ,,CPOPJ   ;BOJ
11438 IIOPOP::                                [JRST 4,CPOPJ]  ;INTERRUPT ON IOPOP DEVICE
11439 ISPY::                                          CPOPJ   ;SPY
11440 STYDUI::        REPEAT 2,[                              ;PSEUDO TTY
11441                                         %CLSST,,STYICL
11442                                         %CLSST,,STYOCL
11443                         ]
11444 IFN NCPP,NETDUI::       REPEAT 4,               NETCLS  ; Arpanet NCP
11445 IFN TCPP,TCPDUI::       REPEAT 4,               TCPCLS  ; Internet TCP
11446 IFN INETP,IPQDN::                               IPQCLS  ; Internet Queue
11447 IFN MSPP,MSPIO::                                MSCLOS  ;MESS SWITCHER (DM)
11448 IFN STKP,STKDP::                                STKCLS  ;STANFORD KEYBOARD
11449 IFN NTYP,NTYIT::        REPEAT 4,               NTYCLS  ;A KLUDGE ON THE NTY
11450         OFFSET 0
11451 IF2,IFN .-CLSTB-LIOTTB,.ERR BARF AT CLSTB
11452 \f
11453 ;DISPATCH TABLE FOR .IOT UUO
11454 ;TRANSFERED THROUGH USING RIGHT HALF OF I/O CHANNEL WORD AS AN INDEX
11455 %IOT==1,,525252
11456 %IOTBK==400000  ;4.9 = 1 => BLOCK  = 0 => UNIT
11457 %IOTOT==200000  ;4.8 = 1 => OUTPUT  = 0 => INPUT     "
11458 %IOTBP==100000  ;4.7 = 1 => THERE IS A SPECIAL ROUTINE FOR SIOT,
11459                  ;AND ITS ADDRESS IS -1 + RH(IOTTB WORD).
11460 %IOTSP==40000   ;4.6 => THIS DEVICE IS FUNNY. SIOT ISN'T ALLOWED,
11461                  ;AND IOT LETS THE DEVICE RTN DO ALL THE WORK.
11462                 ;PRESENT ONLY FOR UNIT INPUT MODES.
11463 %IOT10==20000   ;4.5 => THIS CHANNEL WAS OPENED WITH BIT 1.4 SET IN MODE
11464 %IOTIM==10000   ;4.4 => THIS CHANNEL WAS OPENED WITH BIT 1.3 (IMAGE MODE) SET IN MODE
11465 ;       4000    ;4.3 COPIES %IOTBK.   THUS, BITS 4.5-4.2 REFLECT THE BOTTOM 4 BITS
11466 ;       2000    ;4.2 COPIES %IOTOT.    OF THE OPEN-MODE.
11467 %IOTOM==36000   ;BITS 4.5 - 4.2
11468
11469 %IOTBO==606000  ;BLOCK OUTPUT.
11470 %IOTBI==404000  ;BLOCK INPUT.
11471 %IOTUO==202000  ;UNIT OUTPUT.
11472 %IOTUI==000000  ;UNIT INPUT.
11473
11474 IOTTB:          IOCER8
11475         OFFSET -IOTTB
11476 TYIDN::         %IOTUI,,TYI     ;TTY ENTRIES MUST BE COMPACT
11477 TYIBN::         %IOTBI,,TTYBI
11478 TYODN::         %IOTUO,,TYO (%IOTBP)
11479 TYOBN::         %IOTBO,,TTYBO   ;LAST TTY DEVICE
11480 NLIDN::         %IOTUI,,NULI
11481 NLBIDN::        %IOTBI,,NULBI
11482 NLODN::         %IOTUO,,CPOPJ
11483 NLBDN::         %IOTBO,,NULBOD
11484 UWIDN::         %IOTUI,,UWI (%IOTIM)
11485 UBIDN::         %IOTBI,,UBI
11486 UWODN::         %IOTUO,,UWO (%IOTIM)
11487 UBODN::         %IOTBO,,UBO
11488 FUWIDN::        %IOTUI,,UWI (%IOT10)
11489 FUBIDN::        %IOTBI,,UBI (%IOT10)
11490 DNDIRH::        %IOTUI,,IOCR10
11491 DNTRAP::        TRPDEV
11492 DNLCK::         %IOTUO,,IOCR10
11493 IFN CHAOSP,[
11494 CHAIDN::        %IOTUI+%IOTBP,,CHAUI
11495 CHAODN::        %IOTUO+%IOTBP,,CHAUO
11496 ];CHAOSP
11497 IFN NUNITS,[
11498 DNUACII::       %IOTUI,,UASCII
11499 DNUACCO::       %IOTUO,,UASCCO
11500 DNUBKI::        %IOTBI,,UBLKI
11501 DNUBKO::        %IOTBO,,UBLKO
11502 DNUDTI::        %IOTUI,,UDATAI (%IOTIM)
11503 DNUDTO::        %IOTUO,,UDATAO (%IOTIM)
11504 ]
11505 IFN OLPTP,[
11506 LPTDN::         %IOTUO,,PILPT1
11507 LPTBN::         %IOTBO,,BLPTO
11508 ]
11509 IFN NLPTP,[
11510 NLPTDN::        %IOTUO,,NLPT1
11511 NLPTBN::        %IOTBO,,BNLPTO
11512 ]
11513 IFN GLPTP,[
11514 GLPTDN::        %IOTUO,,GLPTDO (%IOTBP)
11515 GLPTBN::        %IOTBO,,GLPTBO
11516 ]
11517 DIRCHN::        %IOTUI,,DIRCH
11518 DIRBN::         %IOTBI,,DIRB
11519 NDATAI::        %IOTUI,,DDATAI (%IOTIM+%IOTBP)
11520 NBLKI::         %IOTBI,,DBLKI (%IOTIM)
11521 IFN VIDP,[
11522 NVIDOP::        %IOTUI,,NVIDIT (%IOTSP)
11523 BNVIDO::        %IOTBI,,BNVIDI
11524 ]
11525 IFN PLTP,[
11526 PLTDN::         %IOTUO,,PLOT
11527 PLTBN::         %IOTBO,,BPLOT
11528 ]
11529 IFN PTRP,[
11530 PTPI::          %IOTUO,,PIPUN (%IOT10)
11531 PTPA::          %IOTUO,,APIPUN
11532 PTPB::          %IOTBO,,BPIPUN
11533 PTPWA::         %IOTUO,,WAPIPN (%IOTIM)
11534 PTPWB::         %IOTBO,,WBPIPN (%IOTIM)
11535 ]
11536 IFN IMXP,[
11537 IMPXDN::        %IOTUI,,IMPXS (%IOTSP)
11538 IMXDN::         %IOTUI,,IMPXS1 (%IOTSP)
11539 BIMXDN::        %IOTBI,,BIMXS1 (%IOTSP)
11540 BIMPXD::        %IOTBI,,BIMPXS (%IOTSP)
11541 ]
11542 IFN OMXP,[
11543 OMPXDN::        %IOTUO,,OMPXS (%IOTSP)
11544 OMXDN::         %IOTUO,,OMXDS (%IOTSP)
11545 BOMXDN::        %IOTBO,,BOMXDS (%IOTSP)
11546 BOMPXD::        %IOTBO,,BOMPXS (%IOTSP)
11547 ]
11548 DCLUAI::        %IOTUI,,CLUAI
11549 DCLUAO::        %IOTUO,,CLUAO
11550 DCLBI::         %IOTBI,,CLBI
11551 DCLBO::         %IOTBO,,CLBO
11552 DCLUBI::        %IOTUI,,CLUBI (%IOTIM)
11553 DCLUBO::        %IOTUO,,CLUBO (%IOTIM)
11554 IFN PTRP,[
11555 REDUAI::        %IOTUI,,PTRUAI
11556 REDBAI::        %IOTBI,,PTRBAI
11557 REDUII::        %IOTUI,,PTRUII (%IOTIM)
11558 REDBII::        %IOTBI,,PTRBII (%IOTIM)
11559 REDUTI::        %IOTUI,,PTRUTI (%IOT10)
11560 ]
11561 IFN 340P,[
11562 DN340B::        %IOTBO,,340B    ;340 ENTRIES MUST BE COMPACT; BLOCK FIRST, THEN UNIT
11563 DN340W::        %IOTUO,,340W (%IOTSP)
11564 DN340C::        %IOTUO,,340C (%IOTSP)
11565 DN340H::        %IOTUO,,340H (%IOTSP)
11566 ;DN340I::       %IOTUO,,340I (%IOTSP)
11567 DN340L::        ;LAST 340 DEVICE ENTRY
11568 ]
11569 IFN CODP,[
11570 CODDN::         %IOTUO,,SEND
11571 CODBN::         %IOTBO,,BSEND
11572 ]
11573 DQUAI::         %IOTUI,,QUAI (%IOTBP)
11574 DQUAO::         %IOTUO,,QUAO (%IOTBP)
11575 DQBI::          %IOTBI,,QBI
11576 DQBO::          %IOTBO,,QBO
11577 DQUII::         %IOTUI,,QUII (%IOTIM %IOTBP)
11578 DQUIO::         %IOTUO,,QUIO (%IOTIM %IOTBP)
11579 IFN VIDP,[
11580 DNVDIU::        %IOTUI,,RNVDIU (%IOTSP)
11581 DNVDIB::        %IOTBI,,RNVDIB (%IOTSP)
11582 DNVDOU::        %IOTUO,,RNVDOU (%IOTSP)
11583 DNVDOB::        %IOTBO,,RNVDOB (%IOTSP)
11584 ]
11585 IFN PDP6P,[
11586 PDPUIO::        %IOTUO,,UWO     ;BUT JOB WILL BE -1 TO INDICATE PDP6
11587 PDPBIO::        %IOTBO,,UBO
11588 PDPUII::        %IOTUI,,UWI
11589 PDPBII::        %IOTBI,,UBI
11590 ]
11591 IFN TABP,[
11592 DTABUI::        %IOTUI,,UTABI
11593 DTABBI::        %IOTBI,,BTABI
11594 ]
11595 IFN NMTCS,[
11596 MTUAIX::        %IOTUI,,MTUAI (%IOTBP)  ;MAGTAPE
11597 MTUIIX::        %IOTUI,,MTUII (%IOTIM %IOTBP)
11598 MTBIX::         %IOTBI,,MTBI
11599 MTUAOX::        %IOTUO,,MTUAO (%IOTBP)
11600 MTUIOX::        %IOTUO,,MTUIO (%IOTIM %IOTBP)
11601 MTBOX::         %IOTBO,,MTBO
11602 ]
11603 JDUAI::         %IOTUI,,JBUI(%IOTBP)
11604 JDUAO::         %IOTUO,,JBUI(%IOTBP)
11605 JDBI::          %IOTBI,,JBBI
11606 JDBO::          %IOTBO,,JBBI
11607 JDUII::         %IOTUI,,JBUI (%IOTBP %IOTIM)
11608 JDUIO::         %IOTUO,,JBUI (%IOTBP %IOTIM)
11609 BDUAI::         %IOTUI,,BJUI
11610 BDUAO::         %IOTUO,,BJUO
11611 BDBI::          %IOTBI,,BJBI
11612 BDBO::          %IOTBO,,BJBO
11613 BDUII::         %IOTUI,,BJUI (%IOTIM)
11614 BDUIO::         %IOTUO,,BJUO (%IOTIM)
11615 IIOPOP::                [JRST 4,CPOPJ]  ;INTERRUPT ON IOPOP DEVICE
11616 ISPY::          %IOTUI,,SPYI
11617 STYDUI::        %IOTUI,,STTYI   ;PSEUDO TTY
11618 STYDUO::        %IOTUO,,STTYW
11619 STYDBI::        %IOTBI,,STTBI
11620 STYDBO::        %IOTBO,,STTBO
11621 IFN NCPP,[
11622 NETDUI::        %IOTUI,,NETI
11623 NETDUO::        %IOTUO,,NETW (%IOTBP)
11624 NETDBI::        %IOTBI,,NETBI
11625 NETDBO::        %IOTBO,,NETBO
11626 ]
11627 IFN TCPP,[
11628 TCPDUI::        %IOTUI,,TCPI (%IOTBP)
11629 TCPDUO::        %IOTUO,,TCPW (%IOTBP)
11630 TCPDBI::        %IOTBI,,TCPBI
11631 TCPDBO::        %IOTBO,,TCPBO
11632 ]
11633 IFN INETP,[
11634 IPQDN::         IPQIO           ; No I/O calls used on this dev!
11635 ]
11636 IFN MSPP,[
11637 MSPIO::         IOCR10
11638 ]
11639 IFN STKP,[
11640 STKDP::         STKI
11641 ]
11642 IFN NTYP,[
11643 NTYIT::         %IOTUI,,NTYTI   ;KLUDGE FOR FAST, LARGE BUFFER ON NTY
11644 NTYOT::         %IOTUO,,NTYTO
11645 NTYBIT::        %IOTBI,,NTYBI
11646 NTYBOT::        %IOTBO,,NTYBO
11647 ]
11648         OFFSET 0
11649 LIOTTB==.-IOTTB
11650 \f
11651 ;TABLES FOR VARIOUS CHANNEL STATUS CALLS
11652
11653 ;DCHSTB - INDEXED BY IOTTB INDEX (RH OF IOCHNM)
11654 ;LH SIXBIT MAIN DEVICE NAME
11655 ;1.1-2.3 INDEX INTO THE NEXT TWO TABLES
11656 ;2.4-2.9 SYSTEM PERIPHERAL DEVICE CODE (FOR .STATUS)
11657 .SEE DCHSTB     ;ASSEMBLED SECOND TO GET VALUES OF THE TEMPORARY %%dev SYMBOLS.
11658
11659 ;DSTSTB - INDEX FROM DCHSTB
11660 ;LH STATUS ROUTINE, RH WHYINT ROUTINE (OPNL34 IF DEVICE DOESN'T GIVE 2ND WD INTS)
11661
11662 DSTSTB:         CPOPJ,,OPNL44   ;0 CHANNEL NOT OPEN
11663                 STDSTA,,OPNL34  ;1 RANDOM DEVICE
11664                 CPOPJ,,OPNL34   ;2 OTHER KIND OF RANDOM DEVICE
11665                 STATYI,,TYIWHY  ;3 TTY INPUT
11666                 STATYO,,TYOWHY  ;4 TTY OUTPUT
11667                 CPOPJ,,OPNL34   ;5 USR DEVICE
11668                 CPOPJ,,OPNL34   ;6 DIR "DEVICE"
11669                 CLISTA,,OPNL34  ;7 CORE LINK INPUT
11670                 STDSTA,,OPNL34  ;10 CORE LINK OUTPUT
11671                 CPOPJ,,OPNL34   ;11 DISK
11672                 JBSTAT,,OPNL22  ;12 JOB DEVICES (WHYINT SHOULDN'T GET HERE)
11673                 CPOPJ,,OPNL34   ;13 BOJ DEVICE
11674                 STASTI,,STIWHY  ;14 STY INPUT
11675                 STASTO,,STOWHY  ;15 STY OUTPUT
11676                 CPOPJ,,TRPDEV   ;16 TRAP DEVICE
11677                 CPOPJ,,OPNL34   ;17 DIRHNG DEVICE
11678                 CPOPJ,,OPNL34   ;20 SPY DEVICE
11679                 CPOPJ,,OPNL34   ;21 LOCK DEVICE
11680 OFFSET -DSTSTB          ;BEGIN OPTIONAL DEVICES
11681 IFN NMTCS, %%MT::  STAMTC,,OPNL34
11682 IFN NUNITS,%%UTP:: CPOPJ,,OPNL34
11683 IFN OLPTP, %%OLP:: STALPT,,OPNL34
11684 IFN NCPP,  %%NET:: STANET,,NETWHY
11685 IFN TCPP,  %%TCP:: TCPSTA,,TCPWHY
11686 IFN INETP, %%IPQ:: IPQSTA,,IPQWHY
11687 IFN CHAOSP,%%CHA:: CPOPJ,,CHAWHY
11688 OFFSET 0
11689
11690 ;DRFNTB - INDEX FROM DCHSTB
11691 ;LH RFNAME ROUTINE, RH RFPNTR ROUTINE OR OPNL34 IF NOT RANDOM ACCESS
11692
11693 DRFNTB:         CPOPJ,,OPNL44   ;0 CHNL NOT OPEN
11694                 CPOPJ,,OPNL34   ;1 RANDOM DEVICE
11695                 CPOPJ,,OPNL34   ;2 OTHER KIND OF RANDOM DEVICE
11696                 RCHTTY,,OPNL34  ;3 TTY INPUT
11697                 RCHTTY,,OPNL34  ;4 TTY OUTPUT
11698                 RCHUSR,,RFPUSR  ;5 USR DEVICE
11699                 RCHDIR,,OPNL34  ;6 DIR "DEVICE"
11700                 RCHCLO,,OPNL34  ;7 CORE LINK INPUT
11701                 RCHCLO,,OPNL34  ;10 CORE LINK OUTPUT
11702                 RCHQSK,,RFPQSK  ;11 DISK
11703                 RFNJOB,,RFPJOB  ;12 JOB DEVICES
11704                 RCHBOJ,,OPNL34  ;13 BOJ DEVICE
11705                 RCHSTY,,OPNL34  ;14 STY INPUT
11706                 RCHSTY,,OPNL34  ;15 STY OUTPUT
11707                 CPOPJ,,CPOPJ    ;16 TRAP DEVICE
11708                 RCHDRH,,OPNL34  ;17 DIRHNG DEVICE
11709                 SPYRCH,,OPNL34  ;20 SPY DEVICE
11710                 LCKRCH,,OPNL34  ;21 LOCK DEVICE
11711 OFFSET -DRFNTB          ;BEGIN OPTIONAL DEVICES
11712 IFN NMTCS, %%MT::  RCHMGT,,OPNL34
11713 IFN NUNITS,%%UTP:: RCHUTP,,OPNL34
11714 IFN OLPTP, %%OLP:: CPOPJ,,OPNL34
11715 IFN NCPP,  %%NET:: NETRCH,,OPNL34
11716 IFN TCPP,  %%TCP:: TCPRCH,,TCPRFP
11717 IFN INETP, %%IPQ:: IPQRCH,,IPQRFP
11718 IFN CHAOSP,%%CHA:: CHARCH,,OPNL34
11719 OFFSET 0
11720 IFN <.-DRFNTB>-<DRFNTB-DSTSTB>, .ERR DRFNTB & DSTSTB NOT SAME LENGTH
11721 \f
11722 DEFINE XX NTIMES,DEVNAM,DN,SNXXX,IDX
11723 IFNB DN, DN==:.-DCHSTB  ;CHECK THAT DCHSTB IS IN SAME ORDER AS IOTTB
11724 IFG SIXBIT/DEVNAM/, ZZ==[SIXBIT/DEVNAM/]  ;DECIDE WHETHER FITS IN LH
11725 .ELSE [
11726 IFE SIXBIT/DEVNAM/&777777, ZZ==(SIXBIT/DEVNAM/)
11727 .ELSE ZZ==[SIXBIT/DEVNAM/]
11728 ]
11729 REPEAT NTIMES, ZZ,,SNXXX_14+IDX
11730 TERMIN
11731
11732 DCHSTB: XX 1,,,,0                       ;CHNL NOT OPEN
11733         XX 2,TTY,TYIDN,,3               ;TTY INPUT
11734         XX 2,TTY,TYODN,,4               ;TTY OUTPUT
11735         XX 4,NUL,NLIDN,SNNUL,1          ;NUL DEVICE
11736         XX 4,USR,UWIDN,SNUSR,5          ;USR DEVICE
11737         XX 2,USR,FUWIDN,SNFUSR,5        ;FOREIGN USR
11738         XX 1,DIRHNG,DNDIRH,SNDIRH,17    ;DIRHNG
11739         XX 1,TRAP,DNTRAP,SNTRAP,16      ;TRAP
11740         XX 1,LOCK,DNLCK,SNLCK,21        ;LOCK
11741 IFN CHAOSP, XX 2,CHAOS,CHAIDN,SNCHA,%%CHA       ;CHAOS NET
11742 IFN NUNITS, XX 6,UT,DNUACII,SNUTC,%%UTP ;MICRO TAPE
11743 IFG LPTP-1, XX 2,OLP,LPTDN,SNLPD,%%OLP  ;DATA PRODUCTS LPT IN 2-LPT SYSTEM
11744 .ELSE IFN OLPTP, XX 2,LPT,LPTDN,SNLPD,%%OLP     ;DATA PRODUCTS LPT
11745 IFN NLPTP,  XX 2,LPT,NLPTDN,SNLPV,1     ;"VOGUE" LPT (ACTUALLY ODEC)
11746 IFN GLPTP,  XX 2,LPT,GLPTDN,SNLPV,1     ;GOULD LPT
11747         XX 4,DIR,DIRCHN,SNDIR,6         ;DIR "DEVICE"
11748 IFN VIDP,   XX 2,NVD,NVIDOP,SNBAT,2     ;VIDISSECTOR
11749 IFN PLTP,   XX 2,PLT,PLTDN,SNPLT,1      ;PLOTTER
11750 IFN PTRP,   XX 5,PTP,PTPI,SNPTP,1       ;PAPER TAPE PUNCH
11751 IFN IMXP,   XX 4,IMX,IMPXDN,SNIMPX,1    ;INPUT A/D MULTIPLEXOR
11752 IFN OMXP,   XX 4,OMX,OMPXDN,SNOMPX,1    ;OUTPUT A/D MULTIPLEXOR
11753         XX 3,CLO,DCLUAI,SNCLK,7         ;CORE LINK INPUT
11754         XX 3,CLO,DCLBO,SNCLK,10         ;CORE LINK OUTPUT
11755 IFN PTRP,   XX 5,PTR,REDUAI,SNPTR,1     ;PAPER TAPE READER
11756 IFN 340P,   XX 4,DIS,DN340B,SN340,2     ;340 DISPLAY
11757 ;IFN 340P,  XX 1,IDS,DN340I,SN340I,2    ;340 INTERPRETIVE DISPLAY
11758 IFN CODP,   XX 2,COD,CODDN,SNCOD,1      ;CODE
11759         XX 6,DSK,DQUAI,SN2311,11        ;DISK
11760 IFN VIDP,   XX 4,TVC,DNVDIU,SNBAT,2     ;TV CAMERA
11761 IFN PDP6P,  XX 4,PDP,PDPUIO,SNPDP,5     ;PDP-6 DEVICE
11762 IFN TABP,   XX 2,TAB,DTABUI,SNTAB,2     ;TABLET
11763 IFN NMTCS,  XX 6,MT0,MTUAIX,SNMTC,%%MT  ;MAGTAPE
11764         XX 6,JOB,JDUAI,SNJOB,12         ;JOB DEVICES
11765         XX 6,BOJ,BDUAI,SNBOJ,13         ;BOJ DEVICE
11766         XX 1,IIP,IIOPOP,0,2             ;INTERRUPT-ON-IOPOP DEVICE
11767         XX 1,SPY,ISPY,SNSPY,20          ;SPY
11768 REPEAT 2,[
11769         XX 1,STY,,SNSTY,14              ;STY INPUT
11770         XX 1,STY,,SNSTY,15              ;STY OUTPUT
11771 ]
11772 IFN NCPP,  XX 4,NET,NETDUI,SNNET,%%NET  ; Arpanet NCP
11773 IFN TCPP,  XX 4,TCP,TCPDUI,SNTCP,%%TCP  ; Internet TCP
11774 IFN INETP, XX 1,IPQ,IPQDN,SNIPQ,%%IPQ   ; Internet Queue
11775 IFN MSPP,  XX 1,MSP,MSPIO,SNMSP,2       ;MS SWITCH HACK
11776 IFN STKP,  XX 1,STK,STKDP,SNSTK,2       ;STANFORD KEYBOARD
11777 IFN NTYP,  XX 4,NTY,NTYIT,SNNUL,2       ;NTY 11 KLUDGE
11778
11779 IFN .-DCHSTB-LIOTTB,.ERR BARF AT DCHSTB
11780 EXPUNGE XX,%%MT,%%UTP,%%OLP,%%NET,%%TCP,%%CHA,%%IPQ
11781
11782 DCHSTE==.-1     ;END FOR GETSYS (CHDEVS)
11783 \f
11784 ;RSTB - INDEXED BY IOTTB INDEX FROM RH(IOCHNM)
11785 ;THIS TABLE IS IN 5-BIT BYTES; THE VALUES ARE THE INDICES
11786 ;INTO THE RSTB1 AND DFRCTB TABLES.
11787 .SEE RSTB       ;ASSEMBLED SECOND TO GET VALUES OF TEMPORARY %%dev SYMBOLS.
11788
11789 ;RSTB1 - INDEX FROM RSTB (BELOW)
11790 ;LH IOPUSH/POP ROUTINE, RH RESET ROUTINE
11791 RSTB1:  CPOPJ,,CPOPJ    ;0 RANDOM DEVICE
11792         TYIIOP,,TYIRS   ;1 TTY INPUT
11793         TYOIOP,,TYORS   ;2 TTY OUTPUT
11794         CPOPJ,,USRST    ;3 USR DEVICE
11795         CPOPJ,,JBIRS    ;4 JOB INPUT
11796         CPOPJ,,JBORS    ;5 JOB OUTPUT
11797         IIOPPR,,[JRST 4,CPOPJ]  ;6 INTERRUPT ON IOPOP DEVICE
11798         STYIIP,,STYIRS  ;7 STY INPUT
11799         STYOIP,,STYORS  ;10 STY OUTPUT
11800         CPOPJ,,CPOPJ    ;11 DISK OUTPUT
11801         DIRHIP,,CPOPJ   ;12 DIRHNG
11802         CPOPJ,,TRPDEV   ;13 TRAP
11803         OFFSET -RSTB1   ;OPTIONAL DEVICES BEGIN HERE
11804 IFN OLPTP, %%LPT:: CPOPJ,,LPTRS
11805 IFN NLPTP, %%NLP:: CPOPJ,,NLPTRS
11806 IFN PLTP,  %%PLT:: CPOPJ,,PLTRS
11807 IFN PTRP,  %%PTR:: CPOPJ,,PTRRS
11808 IFN PTRP,  %%PTP:: CPOPJ,,PUNCLR
11809 IFN IMXP,  %%IMX:: CPOPJ,,IMPXRS
11810 IFN 340P,  %%340:: CPOPJ,,DSIZAP
11811 IFN CODP,  %%COD:: CODIOP,,CODRS
11812 IFN PDP6P, %%PDP:: PDPIOP,,PDPRST
11813 IFN TABP,  %%TAB:: CPOPJ,,TABCLR
11814 IFN NCPP,  %%NET:: NETIOP,,NETRS
11815 IFN TCPP,  %%TCP:: TCPIOP,,TCPRST
11816 IFN INETP, %%IPQ:: IPQIOP,,IPQRST
11817 IFN STKP,  %%STK:: CPOPJ,,STKRS
11818 IFN CHAOSP,%%CHA:: CHAIOP,,CPOPJ
11819         OFFSET 0
11820
11821 ;DFRCTB - INDEX FROM RSTB (BELOW)
11822 ;LH FORCE ROUTINE, RH FINISH ROUTINE
11823 DFRCTB: OPNL34,,OPNL34  ;0 RANDOM DEVICE
11824         OPNL2,,OPNL2    ;1 TTY INPUT (ILLEGAL)
11825         POPJ1,,TTYFIN   ;2 TTY OUTPUT
11826         OPNL34,,OPNL34  ;3 USR
11827         OPNL2,,OPNL2    ;4 JOB (SHOULDN'T GET HERE?)
11828         OPNL22,,OPNL22  ;5 JOB (SHOULDN'T GET HERE?)
11829         OPNL22,,OPNL22  ;6 IIP (SHOULDN'T GET HERE)
11830         OPNL2,,OPNL2    ;7 STY INPUT (ILLEGAL)
11831         POPJ1,,STYFIN   ;10 STY OUTPUT
11832         QSKFRC,,QSKFIN  ;11 DISK OUTPUT
11833         OPNL34,,OPNL34  ;12 DIRHNG
11834         TRPDEV,,TRPDEV  ;13 TRAP
11835         OFFSET -DFRCTB  ;OPTIONAL DEVICES BEGIN HERE
11836 IFN OLPTP, %%LPT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11837 IFN NLPTP, %%NLP:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11838 IFN PLTP,  %%PLT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11839 IFN PTRP,  %%PTR:: OPNL34,,OPNL34
11840 IFN PTRP,  %%PTP:: POPJ1,,PUNFIN
11841 IFN IMXP,  %%IMX:: OPNL34,,OPNL34
11842 IFN 340P,  %%340:: OPNL34,,OPNL34
11843 IFN CODP,  %%COD:: POPJ1,,CODFIN
11844 IFN PDP6P, %%PDP:: OPNL34,,OPNL34
11845 IFN TABP,  %%TAB:: OPNL34,,OPNL34
11846 IFN NCPP,  %%NET:: NETFRC,,NETFIN
11847 IFN TCPP,  %%TCP:: TCPFRC,,TCPFIN
11848 IFN INETP, %%IPQ:: IPQFRC,,IPQFIN
11849 IFN STKP,  %%STK:: OPNL34,,OPNL34
11850 IFN CHAOSP,%%CHA:: CHAFRC,,CHAFIN
11851         OFFSET 0
11852 \f
11853 ;TABLE OF INDICES INTO THE RSTB1, DFRCTB TABLES ON THE PRECEDING PAGE
11854 ;THESE INDICES ARE UNRELATED TO THE INDICES IN DCHSTB A COUPLE PAGES BACK.
11855 ;NOTE THAT THE %% SYMBOLS ARE PURELY TEMPORARY AND EXPUNGED AT THE BOTTOM OF THIS PAGE.
11856
11857 RSTB:   .BYTE 5
11858
11859                         0       ;CHNL NOT OPEN
11860                 REPEAT 2,1      ;TTY INPUT
11861                 REPEAT 2,2      ;TTY OUTPUT
11862                 REPEAT 4,0      ;NUL DEVICE
11863                 REPEAT 4,3      ;USR DEVICE
11864                 REPEAT 2,0      ;FOREIGN USR
11865                         12      ;DIRHNG
11866                         13      ;TRAP
11867                         0       ;LOCK
11868 IFN CHAOSP,     REPEAT 2,%%CHA
11869 IFN NUNITS,     REPEAT 6,0      ;DEC TAPE
11870 IFN OLPTP,      REPEAT 2,%%LPT
11871 IFN NLPTP,      REPEAT 2,%%NLP
11872 IFN GLPTP,      REPEAT 2,0
11873                 REPEAT 4,0      ;DIR "DEVICE"
11874 IFN VIDP,       REPEAT 2,0
11875 IFN PLTP,       REPEAT 2,%%PLT
11876 IFN PTRP,       REPEAT 5,%%PTP
11877 IFN IMXP,       REPEAT 4,%%IMX
11878 IFN OMXP,       REPEAT 4,0
11879                 REPEAT 6,0      ;CORE LINK.
11880 IFN PTRP,       REPEAT 5,%%PTR
11881 IFN 340P,       REPEAT 4,%%340
11882 ;IFN 340P,              0
11883 IFN CODP,       REPEAT 2,%%COD  ;CODE
11884                 REPEAT 3, 0 ? 11 ;DISK IN, DISK OUT
11885 IFN VIDP,       REPEAT 4,0
11886 IFN PDP6P,      REPEAT 4,%%PDP  ;PDP-6 DEVICE
11887 IFN TABP,       REPEAT 2,%%TAB
11888 IFN NMTCS,      REPEAT 6,0      ;MAGTAPE
11889                 REPEAT 3,[4
11890                           5
11891                 ]               ;JOB
11892                 REPEAT 3,[0     ;BOJ INPUT
11893                           0     ;BOJ OUTPUT
11894                 ]               ;BOJ
11895                         6       ;INTERRUPT ON IOPOP DEVICE
11896                         0       ;SPY
11897                 7 ? 10 ? 7 ? 10 ;PSEUDO-TTY
11898 IFN NCPP,       REPEAT 4,%%NET  ;NET RESET INR/INS
11899 IFN TCPP,       REPEAT 4,%%TCP  ; TCP RESET
11900 IFN INETP,      %%IPQ           ; Internet Queue
11901 IFN MSPP,               0       ;MS SWITCH HACK
11902 IFN STKP,               %%STK   ;STANFORD KEYBOARD
11903 IFN NTYP,       REPEAT 4,0      ;NTY 11 KLUDGE
11904
11905 IFN LIOTTB-.BYTC,.ERR BARF AT RSTB
11906         .BYTE
11907 EXPUNGE %%LPT,%%NLP,%%PLT,%%PTR,%%PTP,%%IMX,%%340,%%COD,%%PDP,%%TAB,%%NET,%%TCP,%%STK,%%CHA,%%IPQ
11908 \f
11909 DEFINE DVHR X,Y
11910 X!Y!TERMIN
11911
11912 DEFINE DV NAME,OPNRTE,BITS,TAG
11913         SIXBIT/NAME/
11914 DVHR [DEFINE DVHR X,Y
11915 X!][TAG BITS,,OPNRTE
11916 Y!TERMIN]
11917 TERMIN
11918
11919 ;DEVICE TABLES FOR AOPEN
11920 ;
11921 ;DEVTAB  SIXBIT NAME
11922 ;DEVADR
11923  %DVIN==400000  ;4.9 DEVICE CAN DO INPUT
11924  %DVOUT==200000 ;4.8 DEVICE CAN DO OUTPUT
11925  %DVDIR==100000 ;4.7 DEVICE CAN GIVE DIRECTORY
11926  %DVDEL==40000  ;4.6 ALLOW DELETE/RENAME
11927  %DVLNK==20000  ;4.5 ALLOW MLINK
11928                 ;RIGHT HALF, OPEN ROUTINE ADDRESS
11929 %DV==1,,520000  ;BIT TYPEOUT MASK
11930
11931 DEVTAB:
11932 IFN NLPTP,      DV LPT,NLPTO,%DVOUT
11933 IFG OLPTP-NLPTP,DV LPT,LPTO,%DVOUT
11934 IFG LPTP-1,     DV OLP,LPTO,%DVOUT
11935 IFN GLPTP,      DV LPT,GLPTO,%DVOUT
11936 IFN TTLPTP,     DV LPT,LPTO,%DVOUT
11937
11938                 DV DSK,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAQSK:
11939                 DV COM,COMO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11940         MNAME [ DV ],QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK     ;"AI:" ON
11941                                                                 ; AI, ETC.
11942 IFE MCOND MC,[  ; When MC and MX swap names, these names will stay
11943 IFN KL10P,      DV KL,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11944 IFN KS10P,      DV KS,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11945 ] ;MC
11946 IFE MCOND MX,[
11947 IFN KL10P,      DV KL,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11948 IFN KS10P,      DV KS,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11949 ] ;MX
11950                 DV SYS,SYSO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11951                 DV DNRF,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11952                 DV DNR,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11953                 DV DIRHNG,DIRHO,%DVIN
11954                 DV TRAP,TRPDEV,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11955                 DV LOCK,LCKO,%DVOUT
11956                 DV TTY,TTYO1,%DVIN+%DVOUT+%DVDIR
11957                 DV NUL,NULO,%DVIN+%DVOUT
11958                 DV USR,USRO,%DVIN+%DVOUT
11959 IFN VIDP,       DV NVD,NVIDI,%DVIN+%DVOUT
11960 IFN CHAOSP,     DV CHAOS,CHASO,%DVIN+%DVOUT
11961 IFN NCPP,       DV NET,NETO,%DVIN+%DVOUT
11962 IFN TCPP,       DV TCP,TCPO,%DVIN+%DVOUT
11963 IFN INETP,      DV IPQ,IPQO,%DVIN+%DVOUT
11964 IFN MSPP,       DV IPC,IPCO,%DVIN+%DVOUT
11965                 DV STY,STTYO,%DVIN+%DVOUT
11966                 DV JOB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAJOB:
11967                 DV BOJ,BOJO,%DVIN+%DVOUT
11968                 DV OJB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11969 IFN STKP,       DV STK,STKO,%DVIN
11970 IFN PLTP,       DV PLT,PLOTO,%DVOUT
11971 IFN PLTP,       DV IPL,IPLO,%DVOUT              ;INTERPRETED PLOTTER
11972 IFN XGP,        DV XPL,XPLO,%DVOUT
11973 IFN IMXP,       DV IMX,IMPXO,%DVIN
11974 IFN OMXP,       DV OMX,OMPXO,%DVOUT
11975 IFN PTRP,       DV PTR,PTRO,%DVIN
11976 IFN PTPP,       DV PTP,PTPO,%DVOUT
11977 IFN 340P,       DV DIS,DISO,%DVOUT              ;340 AS OUTPUT DEVICE
11978 ;IFN 340P,      DV IDS,IDISO,%DVOUT             ;340 AS INTERPRETED DISPLAY
11979                 DV CLU,CLUO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11980                 DV CLO,CLOO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11981                 DV CLI,CLIO,%DVOUT+%DVDIR+%DVDEL
11982                 DV CLA,CLAO,%DVIN+%DVDIR+%DVDEL
11983 IFN CODP,       DV COD,CODO,%DVOUT
11984 IFN VIDP,       DV TVC,TVCO,%DVIN+%DVOUT
11985                 DV ERR,ERRO,%DVIN
11986 IFN TPLP+TTLPTP&DEMON, DV TPL,TPLO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11987 IFN TABP,       DV TAB,TABO,%DVIN
11988                 DV SPY,SPYO,%DVIN
11989                 DV COR,CORO,%DVDIR              ;DIR=LAST LINE OF TTY^F
11990 IFN NTYP,       DV NTY,NTYOPN,%DVIN+%DVOUT      ;NTY 11 KLUDGE
11991
11992 NDEVS==.-DEVTAB
11993
11994 DVT1:           DV TTY,TTYO,%DVIN+%DVOUT+%DVDIR
11995                 DV TY,TTYO,%DVIN+%DVOUT+%DVDIR
11996                 DV T,TTYO,%DVIN+%DVOUT+%DVDIR
11997 IFN NUNITS,     DV UT,UTO,%DVIN+%DVOUT+%DVDIR+%DVDEL,DVAUT:
11998                 DV STY,STTYOA,%DVIN+%DVOUT
11999                 DV ST,STTYOA,%DVIN+%DVOUT
12000                 DV S,STTYOA,%DVIN+%DVOUT
12001                 DV DSK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK  ;PARTICULAR UNIT
12002                 DV DK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK   ;PARTICULAR UNIT
12003                 DV PK,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK   ;PARTICULAR PACK
12004                 DV P,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK    ;PARTICULAR PACK
12005 IFN NMTCS,      DV MT,MAGTO,%DVIN+%DVOUT        ;MAGTAPE
12006
12007 NDV1==.-DVT1
12008 EDEVS==.-1      ;END FOR GETSYS (DEVS)
12009
12010 DEVADR: DVHR
12011 IFN .-DEVADR-NDEVS-NDV1,.ERR DVHR LOST
12012 \f
12013 SUBTTL .OPER, .CALL DISPATCH
12014
12015 AOPER:  MOVE J,R        ;AC FIELD OF UUO
12016         ADDI R,IOCHNM(U)        ;SET UP IO CHANNEL REFERENCE POINTER
12017         CAIL C,MXOPR    ;SKIP IF UUO E FIELD IS LESS THAN MAX OPR
12018         JRST ILUUO      ;ILLEGAL OPER
12019         JRST @OPRDSP(C) ;LEGAL OPER-- DISPATCH ON E FIELD OF UUO
12020
12021 OPRDSP: ILUUO
12022         OPRIRP A!X      ;AITYI,ALISTEN,ASLEEP,ETC.
12023
12024 ;
12025 ;CALL DISPATCH
12026 ;
12027 ACALL:  MOVE B,C        ;SET UP COPY OF ERR ADR NOT TO BE RELOCATED
12028         JRST @CALDIS(R) ;DISPATCH INDEX OF UUO'S AC FIELD
12029
12030 CALDIS: ASYSC
12031         ADISMIS
12032         ALOSE
12033         ATRANAD
12034         AVALRET ;4
12035         AUTRAN
12036         UACORE
12037         ATRNDL
12038         ADSTART ;10
12039         AFDELE
12040         ADSTL
12041         ASUSET
12042         ALTPEN  ;14
12043         AVSCAN
12044         APOTSET
12045 REPEAT 20-.+CALDIS,ILUUO
12046 \f
12047 SUBTTL MISCELLANEOUS UUO'S
12048
12049 ;SHUT DOWN SYSTEM
12050
12051 ASHUTD: UMOVE C,(J)             ;Arg is time to down in thirtieths.
12052         JUMPL C,AREVIV          ;Negative time means REVIVE.
12053         CAMG C,[43200.*30.*60.] ;If time is longer than thirty days
12054          CAIGE C,5*60.*30.      ; or less than five minutes
12055           POPJ P,               ;   Fail (prevent clock delta-T from losing).
12056         ADD C,TIME              ;Interval+now is when we will die.
12057         PUSHJ P,SWTL            ;Seize shutdown lock.
12058             SHUTLK
12059         SKIPGE SHUTDN           ;Already down?
12060          JRST LSWPOP            ; Yes.
12061         PUSHJ P,CLQDEL          ;Flush obsolete clock queue entry, if any.
12062             DEDBLK
12063         MOVEM C,SHUTDN          ;Remember time we will die.
12064         SUB C,TIME              ;Interval until death.
12065         LSH C,1                 ;Time till death after next clock-queue int.
12066         MOVEM C,DEDTIM          ;Remember time until death.
12067         PUSHJ P,DEATHX          ;Make DEATH entry on clock queue.
12068          BUG                    ; DEDTIM says time to die already?
12069         JRST LSWPJ1             ;Unlock shutdowns.
12070
12071 ;READ TIME TILL SYSTEM DOWN
12072
12073 ADIETI: XCTR XW,[SETOM (J)]     ;READ -1 IF NOT GOING DOWN
12074         SKIPG A,SHUTDN
12075          POPJ P,                ;NOT DYING
12076         SUB A,TIME
12077         JRST APTUAJ             ;GIVE TO USER
12078
12079 ;REVIVE SYS
12080
12081 AREVIV: PUSHJ P,SWTL
12082             SHUTLK
12083         SKIPN SHUTDN
12084          JRST LSWPOP            ;NOT DYING
12085         PUSHJ P,CLQDEL
12086             DEDBLK
12087         SETZM SHUTDN
12088         SETZM DEDTIM
12089         PUSHJ P,DEATHM
12090         JRST LSWPOP
12091
12092 ;FROM CLOCK QUEUE BLOCK
12093
12094 DEATHZ: PUSHJ P,DEATHX
12095          SKIPA
12096           JRST CLQRET
12097         MOVSI T,SCLOUT
12098         PUSHJ P,SUPSET  ;DIE
12099         SETOM DEDTIM
12100         JRST CLQRET
12101
12102 ;GET VARIOUS SYS STATUS
12103
12104 ASSTAT: CONO PI,CLKOFF
12105         SKIPLE A,SHUTDN
12106          SUB A,TIME
12107         SKIPG SHUTDN
12108          SUBI A,1       ;TIME TILL DOWN IF > 0,  -1 IF UP,  -2 IF DOWN
12109         CONO PI,CLKON
12110         MOVE B,SYSDBG
12111         MOVE C,SUSRS
12112         MOVE D,PARERR
12113         ADD D,NXMERR
12114         MOVE E,TIME
12115         MOVE TT,[ITSMCH]        ;SIXBIT NAME OF THIS MACHINE.
12116         MOVE I,[ITSVRS]
12117         MOVN Q,USRHI            ;Q GETS NUMBER OF FREE JOB SLOTS
12118         IDIVI Q,LUBLK
12119         ADDI Q,MAXJ
12120         MOVE J,USRHI
12121 ASSTT1: SUBI J,LUBLK
12122         SKIPN UNAME(J)
12123          ADDI Q,1
12124         JUMPG J,ASSTT1
12125         JRST POPJ1
12126 \f
12127 SUBTTL SYMBOLIC SYSTEM CALL HANDLER
12128
12129 ;IN ORDER @A...Z[\]^_ !".../0...9:;,=.? (THAT IS IN NUMERICAL ORDER)
12130
12131 SYSCTB: SIXBIT /ACCESS/ ;IOCHNL, ADR
12132         SIXBIT /ATTACH/
12133         SIXBIT /ATTY/
12134         SIXBIT /CALL/   ;SIXBIT /<NEXT CALL>/
12135 IFN CHAOSP,[
12136         SIXBIT /CHAOSO/
12137         SIXBIT /CHAOSQ/
12138 ];CHAOSP
12139         SIXBIT /CLOSE/  ;IOCHNL
12140         SIXBIT /CNSGET/ ;GET SEMIPERMANENT TTY INFO
12141         SIXBIT /CNSSET/ ;SET SEMIPERMANENT INFO (TCMXH, TCTYP, TTYOPT, TTYCOM, ETC)
12142         SIXBIT /CORBLK/ ;HACK PAGE MAP
12143         SIXBIT /CORTYP/ ;READ STATUS OF PAGE.
12144         SIXBIT /DELETE/ ;FILE DELETE
12145         SIXBIT /DELEWO/ ;DELETE FILE OPEN ON SPEC'D CHANNEL
12146 IFN DEMON,SIXBIT /DEMSIG/       ;SIGNAL DAEMON
12147         SIXBIT /DETACH/ ;DISOWN ENTIRE TREE
12148         SIXBIT /DIRSIZ/
12149         SIXBIT /DISMIS/
12150         SIXBIT /DISOWN/ ;DISOWN AN INFERIOR JOB
12151 IFN DL10P, SIXBIT /DL10MP/
12152         SIXBIT /DSKUPD/ ;SIMULATE REFERENCE OF FILE
12153         SIXBIT /ECHOIN/ ;ECHO-NEGOTIATE
12154         SIXBIT /FILBLK/ ; READ NAME AREA OF FILE
12155         SIXBIT /FILLEN/ ;READ FILE LENGTH
12156         SIXBIT /FINISH/
12157         SIXBIT /FLAP/   ;TAPE #
12158         SIXBIT /FLUSH/  ;OLD NAME FOR FINISH, EVENTUALLY "
12159         SIXBIT /FORCE/
12160         SIXBIT /IOPOP/
12161         SIXBIT /IOPUSH/
12162         SIXBIT /IOT/    ;IOCHNL, QUAN OR BLK POINTER
12163 IFN INETP,SIXBIT /IPKIOT/
12164         SIXBIT /ITYIC/
12165         SIXBIT /JOBCAL/ ;GENERAL JOBGET
12166         SIXBIT /JOBGET/ ;JOB CHNL
12167         SIXBIT /JOBINT/ ;JOB CHNL
12168         SIXBIT /JOBIOC/
12169         SIXBIT /JOBRET/ ;JOB CHNL
12170         SIXBIT /JOBREU/
12171         SIXBIT /JOBSTS/ ;SET JOB CHNL STATUS
12172 IFN KL10P,SIXBIT /KLPERF/ ;ACTIVATE & CONTROL PERFORMANCE METER
12173         SIXBIT /LISTEN/ ;IOCHNL, ADR
12174         SIXBIT /LNKEDP/ ;DISK CH.  RETURNS NONZERO IF LINKS WERE TRACED TO OPEN IT.
12175         SIXBIT /LOAD/   ;USER CH, I/O CH, VARBLK
12176         SIXBIT /LOGIN/  ;SIXBIT /<NAME>/
12177         SIXBIT /LOGOUT/ ;. . .
12178         SIXBIT /LOSE/
12179         SIXBIT /MLINK/  ;MAKE LINK
12180 IFN NCPP,       SIXBIT /NETAC/
12181         SIXBIT /NETBLK/ ;HANG ON NCP STATE
12182 IFN IMPP,[
12183         SIXBIT /NETHST/ ;GETS STATUS OF HOST
12184         SIXBIT /NETIMP/ ;GETS STATUS OF IMP
12185 ];IMPP
12186 IFN NCPP,       SIXBIT /NETINT/
12187 IFN INETP,[     ; A temporary cond, should become permanent.
12188         SIXBIT /NETRFC/ ; Get pending request for connection
12189 ]
12190         SIXBIT /OPEN/   ;FILE OPEN
12191         SIXBIT /PDUMP/  ;USER CH, I/O CH, VARBLK
12192         SIXBIT /PGDUMP/ ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12193         SIXBIT /PGWRIT/ ;DUMP PAGE OUT OF CORE
12194 IFN CHAOSP,     SIXBIT /PKTIOT/
12195 IFN QAUTHP,     SIXBIT /RAUTH/  ;READ AUTHOR OF FILE
12196         SIXBIT /RCHST/  ;READ OPENED FILENAMES & ACCESS POINTER
12197         SIXBIT /RCPOS/  ;READ CURSOR POS
12198 IFN DEMON,SIXBIT /RDDMST/       ;READ DEAMON STATUS
12199         SIXBIT /RDMPBT/ ;READ FILE DUMPED BIT IOCHN, ADR
12200         SIXBIT /RELOAD/
12201         SIXBIT /RENAME/ ;FILE RENAME
12202         SIXBIT /RENMWO/ ;RENAME WHILE OPEN
12203         SIXBIT /REOWN/
12204         SIXBIT /RESET/
12205         SIXBIT /RESRDT/ ;RESTORE REFERENCE DATE
12206         SIXBIT /RFDATE/ ;READ TIME OF CREATION OF FILE IOCHN, ADR
12207         SIXBIT /RFNAME/ ;READ FILE NAME AND MODE CHANNEL OPEN TO
12208         SIXBIT /RFPNTR/ ;READ ACCESS POINTER
12209         SIXBIT /RQDATE/ ;READ DSK DATE
12210         SIXBIT /RSSIZE/ ;READ SCREEN SIZE
12211 IFN QAUTHP,     SIXBIT /SAUTH/  ;SET AUTHOR OF FILE
12212         SIXBIT /SCML/   ;SET # COMMAND LINES
12213         SIXBIT /SCPOS/  ;SET TTY CURSOR POSITION
12214         SIXBIT /SDMPBT/ ;SET FILE DUMPED BIT IOCHN, ADR
12215         SIXBIT /SETIOC/ ;CAUSE IO CHANNEL ERROR IN JOB/BOJ CHANNEL
12216         SIXBIT /SFDATE/ ;SET TIME OF CREATION OF FILE IOCHN, ADR
12217         SIXBIT /SIOT/   ;IOT A STRING GIVEN B.P. AND LENGTH
12218         SIXBIT /SOPEN/  ;OPEN, TAKING MODE,,CHNL AND BP.
12219         SIXBIT /SRDATE/ ;SET REFERENCE DATE
12220         SIXBIT /SREAPB/ ;SET THE DO NOT REAP BIT
12221         SIXBIT /SSERVE/ ;Set .SERVER without timing errors
12222         SIXBIT /SSTATU/ ;READS VARIOUS SYSTEM STATUS
12223         SIXBIT /STATUS/
12224 IFN DEMON,SIXBIT /STDMST/       ;SET DEAMON STATUS
12225         SIXBIT /STLGET/ ;GET INFO ON SERVER TELNET CONTROLLING A STY
12226         SIXBIT /STYGET/ ;GET INFO ABOUT SPECIFIED STY
12227 IFN NETP,SIXBIT /STYNET/        ;CONNECT STY TO NETWORK SOCKETS, FOR TELNET SERVERS.
12228         SIXBIT /T11MP/  ;TEMP ? TEN11 HACKER
12229 IFN TCPP,SIXBIT /TCPOPN/        ; Open TCP Internet connection
12230         SIXBIT /TRANAD/ ;CREATE TRANSLATION ENTRY
12231         SIXBIT /TRANCL/ ;CLEAR TRANSL. LIST(S) FOR A JOB.
12232         SIXBIT /TRANDL/ ;DELETE A TRANSL. ENTRY.
12233         SIXBIT /TRANEX/ ;READ A JOB'S TRANSL. LIST.
12234         SIXBIT /TRANS/  ;TRANSLATE A FILENAME.
12235         SIXBIT /TRPOPN/ ;OPEN TRAP DEVICE FOR AN INFERIOR
12236         SIXBIT /TTYESC/ ;SIMULATE TYPING OF ^_
12237         SIXBIT /TTYFLS/ ;FLUSH ITYIC'ED INPUT
12238         SIXBIT /TTYGET/ ;SUPPLY TTY CH, RETURNS THREE WORDS OF TTY STATUS
12239         SIXBIT /TTYSET/ ;SUPPLY TTY CH AND THREE WORDS OF TTY STATUS
12240         SIXBIT /TTYVAR/ ;HACK TTY VARIABLES
12241         SIXBIT /TVWHER/
12242         SIXBIT /UNLOCK/ ;UNLOCK A SPEC'D JOBS LOCKS.
12243         SIXBIT /USRMEM/ ;READ OR WRITE A JOB'S MEMORY.
12244         SIXBIT /USRVAR/ ;HACK USER VARIABLES
12245         SIXBIT /VIDBUF/ ;ASSIGN/DEASSIGN VIDEO BUFFER.
12246         SIXBIT /VIDSW/  ;SET VIDEO SWITCH.
12247         SIXBIT /WHOLIN/ ;GET OR SET WHO-LINE MODE AND JOB.
12248         SIXBIT /WHYINT/ ;FIND OUT WHY AN I/O CHANNEL INTERRUPTED
12249         SIXBIT /XGPIM/  ;OUTPUT TO XGP IN IMAGE MODE
12250 LSYSCT==:.-SYSCTB
12251
12252 ZZ==.-SYSCTB-1
12253 RADIX 2
12254 ZZ2==CONC [.LENGTH /]\ZZ,/
12255 RADIX 8
12256 REPEAT 1_<ZZ2>-ZZ-1,377777,,-1
12257 ;4.X BIT IMPLIES SUPPLY ROUTINE WITH POINTER TO X'TH ARG, NOT ARG ITSELF
12258 ;3.9-3.7 = MINIMUM NUMBER OF ARGS
12259 ;3.1 => DECODE 1ST ARG AS IO CHNL, LEAVING IOCHNM WD ADDR IN RH(R),
12260 ; IOCHNM WD CONTENTS IN H, CLSTB ENTRY'S LH IN LH(R).
12261 ;3.2 => NEVER PASS TO SPECIAL CHECKER FOR JOB CHNL
12262 ;3.3 => DON'T BARF IF CHNL NOT OPEN, CALLED ROUTINE WILL HANDLE IT
12263
12264 ;# ARGS ACTUALLY SUPPLIED IN W WHEN DISPATCHING THRU SYSCTD, ARGS IN A...J
12265 SYSCTD: 200,,NACCES
12266         100,,NATTAC
12267         100,,NATTY
12268         100,,NCALL
12269 IFN CHAOSP,[
12270         200,,CHAOSO
12271         100,,CHAOSQ
12272 ];CHAOSP
12273         100,,NCLOSE(7)
12274         100,,NCNSGET
12275         100,,NCNSSET
12276         24300,,NCORBL
12277         100,,NCORTY
12278         100,,NDEL
12279         100,,DELEWO(1)
12280 IFN DEMON,100,,ADEMSIG
12281         NDETAC
12282         100,,NDIRSIZ(1)
12283         1100,,NDISMIS
12284         100,,NDISOWN
12285 IFN DL10P, 100,,DL10MP
12286         100,,ADSKUP(1)
12287         6500,,NECHOIN(1)
12288         100,,NFILBLK(1)
12289         100,,NFILLEN(1)
12290         100,,NFINIS(1)
12291 IFN NUNITS,     100,,NFLAP
12292 IFE NUNITS,     100,,OPNL1
12293         100,,NFINIS(1)  ;OLD NAME FOR FINISH, EVENTUALLY FLUSH
12294         100,,NFORCE(1)
12295         100,,NIOPOP(7)
12296         100,,NIOPUS(7)
12297         2100,,NIOT(7)   ;(7) FOR CHNL NOT OPEN TO BE IOC ERROR, (3) TO BE OPEN LOSS
12298 IFN INETP, 100,,IPKIOT(1)       ; Requires at least 1 arg
12299         100,,NITYIC
12300         100,,NJBCL(1)
12301         100,,NJBGT(1)
12302         100,,NJBINT(1)
12303         100,,NSTIOC(1)
12304         100,,NJBRT(1)
12305         20500,,NJBREU
12306         100,,NJBSTS(1)
12307 IFN KL10P,KLPERF
12308         100,,NLISTE
12309         100,,NLNKEDP(1)
12310         200,,NLOAD
12311         200,,NLOGIN
12312         ALOGOU
12313         100,,NLOSE
12314         200,,NMLINK
12315 IFN NCPP,       100,,ANETAC(1)
12316 IFE INETP,[
12317 IFE CHAOSP,     4200,,ANETBLK(1)
12318 IFN CHAOSP,     4200,,CHANBK(1)
12319 ]
12320 IFN INETP,      4200,,NETBLK(1) ; Block (.hang) on net I/O channel
12321 IFN IMPP,[
12322         100,,ANETHST
12323         ANETIMP
12324 ];IMPP
12325 IFN NCPP,       100,,NNETINT(1)
12326 IFN INETP,      100,,NETRFC
12327         200,,NOPEN
12328         4300,,PDUMP
12329         100,,NPGWRT     ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12330         100,,NPGWRT
12331 IFN CHAOSP,     200,,PKTIOT(1)
12332 IFN QAUTHP,     100,,ARAUTH(1)
12333         100,,NRCHST
12334         100,,ARCPOS
12335 IFN DEMON,100,,ARDDMST
12336         100,,NRDMPBT(1)
12337         000,,NRELOAD
12338         200,,NRNAM
12339         200,,NRNWO
12340         100,,NREOWN(3)
12341         100,,NRESET(7)
12342         100,,NRESRDT(1)
12343         100,,NRFDATE(1)
12344         100,,NRFNAM
12345         100,,NRFPNT(3)
12346         ARQDAT
12347         100,,ARSSIZ
12348 IFN QAUTHP,     200,,ASAUTH(1)
12349         200,,ASCML
12350         100,,NSCPOS
12351         200,,NSDMPBT(1)
12352         200,,NSTIOC(1)
12353         200,,NSFDATE(1)
12354         6300,,NSIOT(7)  ;(7) FOR IOC ERROR IF CHNL NOT OPEN, (3) FOR OPEN LOSS
12355         200,,NSOPEN
12356         200,,NSRDATE(1)
12357         100,,ASREAP(1)
12358         100,,NSSERV
12359         ASSTAT
12360         100,,NSTATUS(7)
12361 IFN DEMON,100,,ASTDMST
12362         100,,NSTLGT
12363         100,,NSTYGT
12364 IFN NETP,200,,NSTYNT(3)
12365         200,,NT11M
12366 IFN TCPP,500,,TCPOPN
12367         300,,NTRNAD
12368         100,,NTRNCL
12369         200,,NTRNDL
12370         200,,NTRNEX
12371         100,,NTRNS
12372         200,,TRPOPN
12373         100,,NTTYESC
12374         100,,NTTYFLS
12375         100,,ATTYGT
12376         300,,ATTYST
12377         2200,,NTTYVA
12378         100,,NTVWHERE
12379         100,,NUNLOCK
12380         2200,,NUSRME
12381         2200,,NUSRVA
12382         100,,NVDBF
12383         200,,NVIDSW
12384         100,,NWHOLI
12385         100,,NWHYINT(1)
12386         1100,,NXGPIM
12387
12388 IFN .-SYSCTD-1-ZZ,.ERR NEW SYS CALL DISPATCH LOSES!!!
12389
12390 REPEAT 1_<ZZ2>-ZZ-1,ILUUO
12391 \f
12392 ;.CALL ADR1  SKIPS UNLESS SOMETHING WRONG
12393 ;ADR1:  SETZ
12394 ;       SIXBIT /<CALL NAME>/
12395 ;       REPEAT #ARGS,BITS,, <ADDRESS OF ARGUMENT>
12396 ;       BITS=   4.9 => LAST ARG
12397 ;               4.3 - 4.1 0 = NORMAL ARG
12398 ;                         1 = IMMEDIATE
12399 ;                         2 = OUTPUT ARG
12400 ;                         3 = RETURN THE FAILURE CODE IF FAIL
12401 ;                         4 = WORD OF CONTROL BITS
12402 ;                         5 = IMMEDIATE CONTROL BITS
12403
12404 ASYSC:  PUSHJ P,ASCGRG  ;B HAS E OF UUO
12405          JRST OPNL43    ;CALL NAME UNKNOWN.
12406          JRST OPNL15    ;MORE THAN 8 ARGS
12407          JRST OPNL30    ;TOO FEW ARGS
12408         PUSHJ P,ASYSC1  ;DISPATCH TO ROUTINE.
12409          POPJ P,        ;NO SKIP - OPENL HAS ALREADY BEEN CALLED.
12410         AOS (P)         ;SKIP - PROPAGATE THE SKIP UP THE PDL
12411         MOVE U,USER     ;!!
12412         MOVE R,SYSCVL(U);SUCCESS RETURN, ZERO ERROR CODE ARG IF ANY
12413         TLNE R,%SCVER
12414          XCTR XW,[SETZM (R)]
12415         JUMPGE R,CPOPJ  ;JUMP IF NO OUTPUT VALUES WANTED
12416 SYSCPT: HRRZ W,FORTY    ;VALUES WANTED, PUT INTO USER MEMORY FROM ACS
12417         ADDI W,2
12418         MOVSI T,-8
12419 SYSCP2: UMOVE R,(W)
12420         TLNN R,1000
12421         TLNN R,2000
12422          JRST SYSCP3
12423         PUSHJ P,ASCIND
12424         MOVE J,1(T)
12425         UMOVEM J,(R)
12426         AOBJP T,CPOPJ
12427 SYSCP3: JUMPL R,CPOPJ
12428         AOJA W,SYSCP2
12429
12430 ASYSC1: MOVE T,SYSCTD(H)
12431         TLNN T,1        ;DECODE 1ST ARG AS IO CHNL?
12432          JRST (T)       ;NO, DISPATCH TO CALL.
12433         TLNE T,2        ;OK TO GIVE TO JOB CHNL CHECKER?
12434         JRST CHNDCD     ;NO - GO DECODE CHANNEL
12435         HRL J,T         ;SAVE DISPATCH ADDR
12436         HRRI T,AIOCAL   ;MAKE DECODER RETURN TO CHECK FOR JOB DEVICE
12437         JRST CHNDCD
12438
12439 NCALL:  MOVE T,A
12440         MOVE R,[B,,A]
12441         BLT R,A+6
12442         SETZM A+7       ;MAX 8 ARGS, 1 USED FOR NAME
12443         SOS W
12444         PUSHJ P,ASCRCH
12445          JRST OPNL43
12446         MOVEI J,ASYSC+2 ;LOOK LIKE PUSHJ'ED FROM ASYSC
12447         MOVEM J,(P)
12448         LDB J,[331000,,SYSCTD(H)]
12449         JUMPE J,NCALL2
12450         AOS B,FORTY
12451         JRST NCALL3     ;HE WANTS POINTERS, WE HAVE JUST VALUES.
12452                 ;MUST GET ARGS AGAIN
12453
12454 ASCRCH: MOVEI H,0
12455         REPEAT ZZ2,[CAML T,SYSCTB+1_<ZZ2-.RPCNT-1>(H)
12456         ADDI H,1_<ZZ2-.RPCNT-1>
12457         ]
12458         CAMN T,SYSCTB(H)
12459         AOS (P)
12460         POPJ P,
12461 \f
12462 ;JSP T,HERE TO DECODE IO CHNL IN A, MODIFIERS IN 3.1-3.3 OF T.
12463 ;IF RH(T) = AIOCAL, LH(J) IS REAL RETURN ADDRESS.
12464 ;RETURNS IOCHNM ADDR IN RH(R), IOCHNM WD CONTENTS IN H, CLSTB BITS IN LH(R)
12465 ;CAN POPJ OUT FOR INVALID CHANNEL.
12466
12467 CHNDCD: TRNE A,-NIOCHN  ;IS 1ST ARG A LEGAL CHNL NUM?
12468          JRST OPNL14
12469         CAMN U,USER
12470          HRROM A,UUAC(U);REMEMBER CHNL # FOR IOC ERRORS, ETC.
12471         MOVEI R,(A)
12472         ADDI R,IOCHNM(U) ;YES, COMPUTE IOCHNM WD ADDR
12473         MOVE H,(R)      ;RETURN CONTENTS IN H.
12474         HLL R,CLSTB(H)  ;RETURN CLSTB BITS IN LH(R).
12475         TLNE R,%CLST
12476          JRST [ CAME U,USER     ;TRAP DEVICE
12477                  JRST .+1       ;IF CHANNEL BELONGS TO THIS USER, TRAP
12478                 JRST TRPDEV ]   ;OTHERWISE, IS PROBABLY RFNAME, LET IT THROUGH
12479         TRNN H,-1       ;IF CHNL NOT OPEN
12480          TLNE T,4       ;AND NOT SPECIALLY OK FOR THIS SYSTEM CALL
12481           JRST (T)
12482         JRST OPNL44     ;THEN BARF
12483
12484 ;JOB DEVICE CHECKER - PUT AIOCAL IN RH(T), JRST CHNDCD
12485
12486 AIOCAL: HLRZ T,J                ;GET DISPATCH ADR BACK
12487         TLNN R,%CLSJ            ;IS CHANNEL JOB DEVICE?
12488          JRST (T)               ;NO - DISPATCH
12489         HLRZS H                 ;ISOLATE JOB DEVICE INDEX
12490         DPB W,[230400,,JBSTS(H)]        ;SAVE ARG COUNT
12491         MOVNS W
12492         HRLZS W
12493         HRRI W,1                ;NOW HAVE AOBJN PNTR TO DATA
12494         MOVE T,(W)              ;COPY ARGS TO JOB AC TABLES
12495         MOVEM T,@JBACTB-1(W)
12496         AOBJN W,.-2
12497         MOVEI W,10              ;SET NON-STANDARD OP-CODE
12498         HRRM W,JBSTS(H)
12499         MOVE E,H                ;PUT JOB INDEX IN E FOR JBWT
12500         CONO PI,CLKOFF
12501 AIOCA1: PUSHJ P,JBWT            ;WAIT FOR JOB TO ANSWER
12502         MOVE H,E                ;GET JOB INDEX BACK IN H (FOR JBACTB)
12503         MOVE W,[-8,,1]          ;LOAD ANSWERS INTO ACS
12504         MOVE T,@JBACTB-1(W)
12505         MOVEM T,(W)
12506         AOBJN W,.-2
12507         LDB T,[350400,,JBSTS(H)]        ;GET SKIP COUNT
12508         JUMPN T,POPJ1                   ;SKIP COUNT NOT ZERO - SKIP
12509         LDB C,[270600,,JBSTS(H)]        ;GET OPEN LOSS CODE
12510         SKIPE C                         ;MAKE SURE IN BOUNDS
12511         CAILE C,NOPNLS
12512         MOVEI C,22
12513         JRST OPNL1-1(C) ;GO REPORT LOSSAGE AND DON'T SKIP
12514 \f
12515 ;SYSTEM CALL GET ARGS
12516 ASCGRG: UMOVE T,(B)
12517         CAME T,[SETZ]
12518          JRST ILUUO
12519         UMOVE T,1(B)
12520         MOVEM T,LSCALL(U)
12521         PUSHJ P,ASCRCH
12522          POPJ P,        ;CALL NAME UNRECOGNIZED.
12523         AOS (P)
12524         LDB J,[331000,,SYSCTD(H)]       ;GET BITS CORRESP TO ARGS WHICH SAY SUPPLY PNTR TO NTH ONE
12525 NCALL3: MOVEI W,2(B)
12526         MOVE T,[-9,,A]
12527         SETZM CTLBTS(U)
12528 ASYSC2: UMOVE R,(W)
12529         TLNE R,37
12530          PUSHJ P,ASCIND ;CALC EFFECTIVE ADDRESS
12531         TLNE R,2000
12532          JRST ASYSC3    ;OUTPUT OR ERRORCODE ARG
12533         TLNE R,4000
12534          JRST ASYSC5    ;CONTROL BITS
12535         AOBJP T,CPOPJ
12536         ROT J,-1
12537         JUMPL J,ASYSC7  ;J IF WANT ADDRESS, NOT VALUE
12538         TLNE R,1000
12539          TLZA R,-1      ;IMMEDIATE, GET 0,,ADR
12540           UMOVE R,(R)   ;ELSE GET WORD POINTED TO
12541 ASYSC7: MOVEM R,-1(T)   ;PUT INTO AC
12542         JRST ASYSC4
12543
12544 ASYSC5: TLNE R,1000     ;CTL BITS
12545          TLZA R,-1      ;IMMEDIATE, GET 0,,ADR
12546           XCTR XR,[HRRZ R,(R)]  ;ELSE WORD ADDRESS
12547         XORM R,CTLBTS(U)        ;XOR ALL THESE ARGS TOGETHER
12548 ASYSC4: XCTR XR,[SKIPL (W)]     ;SKIP IF TERMINATE BIT ON
12549          AOJA W,ASYSC2
12550         HLRE W,T
12551         ADDI W,9        ;COMPUTE NUMBER OF ARGUMENTS SUPPLIED
12552 NCALL2: LDB T,[300300,,SYSCTD(H)]
12553         SUB T,W
12554         JUMPG T,POPJ1   ;NOT ENOUGH ARGS
12555         JRST POPJ2      ;OK
12556
12557 ASYSC3: TLNE R,1000
12558          JRST ASYSC8    ;ERROR CODE ARG
12559         XCTR XRW,[MOVES (R)] ;OUTPUT ARG, JUST MAKE SURE IT'S THERE
12560         MOVSI R,%SCVOT  ;AND FLAG PRESENCE
12561 ASYSC9: IORM R,SYSCVL(U)
12562         JRST ASYSC4
12563
12564 ASYSC8: HRLI R,%SCVER   ;ERROR-CODE ARG
12565         TDNE R,SYSCVL(U);CAN'T HAVE MORE THAN ONE ERRORCODE ARG
12566          JRST CPOPJ     ;SAY "TOO MANY ARGS"
12567         XCTR XRW,[MOVES (R)] ;MAKE SURE IT'S THERE; MUSTN'T PCLSR OUT OF OPENL
12568         JRST ASYSC9
12569 \f
12570 ;PERFORM INDEXING AND INDIRECTION ON ADDRESS WORD IN R.
12571 ;DON'T CLOBBER BITS 3.6 - 4.9.  SET BITS 3.1 - 3.5 TO ZERO
12572 ;PUT ADDR IN RH.
12573 ASCIND: TLNN R,37
12574         POPJ P,
12575 ASCIN1: PUSH P,R
12576         LDB R,[220400,,R]
12577         CAIE R,0
12578         XCTR XR,[HRRZ R,(R)]
12579         ADD R,(P)
12580         HLL R,(P)       ;GET ORIG @, MAY HAVE BEEN CARRIED INTO BY -1(17)
12581         TLZ R,17
12582         TLZE R,(@)
12583         UMOVE R,(R)
12584         DPB R,[2700,,(P)]
12585         POP P,R
12586         TLNN R,37
12587         POPJ P,
12588         PUSHJ P,OPBRK   ;ALLOW PCLSR
12589         JRST ASCIN1
12590
12591 TPFLT:  CONO PI,CLKOFF          ;PREVENT INTERRUPT AFTER IORM SPM ING BACK
12592                                 ; ON TOP OF 1000 BIT
12593 IFN KA10P,[
12594         SPM UPGML(U)
12595         PUSH P,B
12596         MOVSI B,1000
12597         IORM B,UPQUAN(U)
12598         POP P,B
12599         LPMRI UPGML(U)  ;TAKE TRAP, MAYBE DONT COME BACK
12600         JRST CLKONJ
12601 ] ;KA10P
12602 IFN KL10P,[
12603         POP P,PFOPC1    ;IF RESTART FAULT, RETURN FROM TPFLT
12604         JRST TPFLT1     ;JOIN REGULAR PAGE FAIL CODE
12605 ] ;KL10P
12606 IFN KS10P,[
12607         POP P,EPTPFO            ; If fault returns, just return from TPFLT
12608         JRST TPFLT1
12609 ] ;KS10P
12610 \f
12611 SUBTTL PURE DUMP
12612
12613 ;`PDUMP' SYMBOLIC SYSTEM CALL
12614 ; ARG 1 - JOB SPEC FOR JOB TO BE DUMPED
12615 ; ARG 2 - DISK CHANNEL TO DUMP ONTO
12616 ; ARG 3 - STATE WORD (MODIFIED) INITIALLY 0, THEN 4.9 + PAGE # ABOUT TO DUMP
12617
12618 PDUMP:  MOVE J,A
12619         JSP T,NCRUI2    ;DECODE JOB SPEC (1ST ARG)
12620          JFCL
12621         MOVE A,J
12622         JUMPL J,OPNL31  ;CAN'T PDUMP THE PDP6.
12623         MOVE D,B
12624         JSP T,PDUMDC    ;DECODE 2ND ARG, B-> IOCHNM WORD.
12625         TLNN J,%CLSQO
12626          JRST OPNL34    ;NOT DISK WRITE CHANNEL.
12627         HRRZM D,UUAC(U) ;SO SET IN CASE OF ERROR
12628         HLRZ D,(B)
12629         MOVEM D,SRN3(U) ;REMEMBER DISK CHANNEL NUMBER FOR LATER.
12630         PCLT
12631         XCTR XRW,[MOVES D,(C)]
12632         MOVEM C,SRN4(U) ;REMEMBER STATE WORD ADDRESS FOR LATER
12633         MOVEM A,EPDL(U) ;USER INDEX
12634 PDUMA:  CAIN A,(U)      ;IF PDUMP'ING SELF, MUSTN'T PCLSR,
12635          PUSHJ P,NULSET ;SO DO A NULSET INSTEAD OF THE SOSSET
12636         CAIN A,(U)
12637          JRST PDUMP9    ;SO THAT A LSWPOP CAN BE DEON AT THE END IN EITHER CASE.
12638         PUSHJ P,RPCLSR  ;HACKING ANOTHER JOB: STOP IT.
12639         PUSHJ P,SOSSET
12640           USTP(A)
12641 PDUMP9: MOVE A,SRN3(U)  ;GET DISK CHANNEL NUMBER
12642         MOVE C,SRN4(U)
12643         UMOVE D,(C)     ;PICK UP STATE WORD
12644         JUMPN D,PDUMP5  ;JUMP IF ALREADY WROTE MAP PAGE
12645         PUSHJ P,PDBWG   ;GET BUFFER AND COMMIT DISK TRACK FOR MAP PAGE
12646         SETZM (E)       ;CLEAR FIRST WORD OF MAP
12647                         ;AND DROP INTO PDUMP4
12648 ;HANDLE THE NEXT PAGE.
12649 PDUMP4: PUSHJ P,PUPLC   ;GET BYTE POINTERS
12650         LDB W,Q         ;CIRC POINTER ENTRY
12651         LDB R,T         ;PAGE MAP ENTRY
12652         ANDCMI R,PMAGEM ;CLEAR AGE BITS
12653         CAIN W,-1
12654          TLO R,(SETZ)   ;ABS PAGE
12655         SKIPN W
12656          MOVEI R,0      ;PAGE NON-EXISTANT
12657         TRNN R,600000
12658          LSH R,16.      ;SWAPPED OUT
12659         MOVE W,D        ;VIRTUAL PAGE NUMBER
12660         ADDI W,1(E)     ;ADDRESS OF ENTRY IN BLOCK
12661         MOVEM R,(W)     ;STORE ENTRY
12662         CAIGE D,377
12663          AOJA D,PDUMP4
12664         HRLI W,1(W)
12665         SETZM 1(W)
12666         HRRI W,2(W)
12667         BLT W,1777(E)
12668         MOVE D,EPDL(U)
12669         MOVEI W,1000(E) ;1000-1017 ACS
12670         CAMN D,U
12671          JRST [ XCTR XBR,.+2
12672                 JRST .+3]
12673         HRLI W,AC0S(D)
12674         BLT W,1017(E)
12675         PUSHJ P,QSBWW
12676         SETZM QSMPRC(A) ;SO NEXT IOT GETS A NEW BUFFER
12677         MOVSI D,(SETZ)  ;SET STATE WORD TO `DUMPING PAGE 0'
12678 ;DROPS THROUGH
12679 \f;DROPS IN
12680 ;DUMP NEXT PAGE
12681 PDUMP5: MOVE C,SRN4(U)  ;STORE BACK STATE WORD
12682         UMOVEM D,(C)
12683 PDUMP8: PUSHJ P,PUPLC
12684         LDB W,Q
12685         CAIE W,-1
12686         SKIPN W
12687          AOJA D,PDUMP6  ;PAGE ABSOLUTE OR NONEXISTANT
12688 PDUMP3: PUSHJ P,PDBWG   ;GET BUFFER AND COMMIT DISK TRACK TO DUMP THIS PAGE INTO
12689         MOVE J,EPDL(U)  ;SET UP MAP TO POINT TO USER BEING DUMPED
12690         PUSHJ P,MPLDJ
12691         HRLZ J,D        ;GET VIRTUAL ADDRESS OF PAGE BEING DUMPED
12692         LSH J,10.
12693         HRR J,E         ;BLT POINTER TO COPY THE PAGE
12694         XCTR XBR,[BLT J,1777(E)]        ;COPY PAGE INTO DISK BUFFER
12695         PUSHJ P,MPLDZ   ;RESTORE TO NORMAL MAP
12696         PUSH P,D
12697         PUSHJ P,QSBWW   ;WRITE OUT THE COPIED PAGE
12698         SETZM QSMPRC(A) ;SO NEXT IOT GETS NEW BUFFER
12699         POP P,D
12700         AOS D           ;DONE WITH THIS PAGE
12701 PDUMP6: TRNN D,400      ;SKIP IF FINISHED WHOLE ADDRESS SPACE
12702          JRST PDUMP5
12703         JRST LSWPJ1     ;UNSTOP USER AND POPJ1
12704
12705 ;ROUTINE TO GET DISK BUFFER AND COMMIT TRACK (FOR PDUMP)
12706 ;RETURNS BUFFER ADDRESS IN E.  PRESERVES D.
12707
12708 PDBWG:  SKIPL E,QSMDN(A)        ;GET CORE BLOCK # OF DISK BUFFER
12709          JRST [ LSH E,10.       ;CONVERT TO ADDRESS
12710                 POPJ P, ]
12711         MOVE E,[444400,,1]      ;NO BUFFER, GET ONE
12712         MOVEI B,QBOV
12713         PUSHJ P,QSBWG
12714          PUSHJ P,UDELAY         ;CAN'T GET MEMORY, WAIT A WHILE
12715         JRST PDBWG
12716
12717 ;ROUTINE TO LOOK UP PAGE (FOR PDUMP AND PURE LOAD)
12718 ;PAGE# IN RH(D), USER# IN EPDL(U).  RESULTS FROM UPLC IN Q AND T.
12719
12720 PUPLC:  PUSH P,A
12721         PUSH P,U
12722         MOVE U,EPDL(U)
12723         MOVE A,D
12724         ANDI A,377
12725         PUSHJ P,UPLC
12726         POP P,U
12727         JRST POPAJ
12728
12729 ;DECODE 2ND ARG TO PDUMP & LOAD.
12730 ;B GETS IOCHNM WORD ADDR, LH OF J GETS LH OF CLSTB ENTRY, RH GETS LH(IOCHNM).
12731
12732 PDUMDC: TRNE B,-NIOCHN
12733          JRST OPNL14
12734         ADDI B,IOCHNM(U)
12735         HRRZ J,(B)
12736         HLLZ J,CLSTB(J)
12737         HLR J,(B)
12738         JRST (T)
12739 \f
12740 SUBTTL PURE AND SBLK LOAD
12741
12742 ;`LOAD' SYMBOLIC SYSTEM CALL
12743 ; ARG 1 - JOB SPEC FOR JOB TO BE LOADED
12744 ; ARG 2 - DISK CHANNEL TO LOAD FROM
12745 ; ARG 3 - (OPTIONAL) FIRST ADDR,,LAST ADDR TO BE LOADED
12746 ;         OR ZERO => LOAD ONLY PURE PAGES
12747 ;         WHEN LOADING A PDUMPED FILE, FIRST,,LAST ROUNDED OFF TO PAGES
12748 ; DEFAULT 3RD ARG IS 0,,-1 NORMALLY, 20,,-1 LOADING SELF, 20,,37777 LOADING PDP6
12749
12750 ;PAGE WORD
12751 ;4.9=1 ABSOLUTE, 1.1-2.9 = PTW
12752 ;4.8=1 SHARED WITH OTHER PAGES AT LEAST ONE OF WHICH IS WRITE
12753 ;4.7=1 LINK WITH VIRT PG IN RH 1.8-1.1
12754 ;2.9-2.8 0 NXM, 1 RD ONLY, 2 OR 3 READ/WRITE
12755 ;2.7=1 WORD ALREADY PROCESSED
12756
12757 NLOAD:  MOVE J,A
12758         JSP T,NCORUI    ;DECODE THE JOB SPEC.
12759          JRST NLOAD6     ;JOB GUARANTEED WRITEABLE.
12760         JSP T,NCORWR    ;ELSE CHECK IF WRITEABLE.
12761          CAIN J,-1      ;BUT CAN WRITE PDP6.
12762           CAIA
12763            JRST OPNL31  ;NOT WRITEABLE.
12764 NLOAD6: HRREI A,(J)     ;MAKE SURE EXTEND SIGN IF PDP6.
12765         JSP T,PDUMDC    ;DECODE 2ND ARG.
12766         TLNN J,%CLSQO
12767          TLNN J,%CLSQ
12768           JRST OPNL34   ;NOT DISK READ CHANNEL.
12769         LDB J,[QSBSIZ(J)]
12770         CAIE J,36.
12771          JRST OPNL12    ;"MODE NOT AVAILABLE" IF CHANNEL NOT 36-BIT BYTES.
12772         MOVE R,B        ;IOCHNM ADDRESS IN CASE WE GET TO QICL
12773         JUMPL A,NLOADE  ;DONT STOP THE 6
12774         CAMN A,U
12775          JRST NLOADA    ;DONT STOP IF LOADING INTO SELF
12776         PUSHJ P,RPCLSR
12777         PUSHJ P,LSWPOP  ;SOS JOB'S DIELOK - IT CAN'T DIE WHILE STOPPED.
12778         MOVSI T,BSSTP   ;STOPPING WITH BSSTP INSTEAD OF RH OF USTP
12779         IORM T,USTP(A)  ;AVOIDS DEADLY EMBRACE WITH CORE JOB (SEE CUSTOP)
12780         SOS USTP(A)
12781         PUSHJ P,LOSSET  ;ARRANGE TO CLEAR BSSTP ON PCLSR.
12782             NLUPCL
12783         CAIGE W,3
12784          HRLOI C,0      ;DEFAULT 3RD ARG
12785         JRST NLOADE
12786
12787 NLOADA: PUSHJ P,LSWPOP  ;DIELOK
12788         CAIGE W,3
12789          HRLOI C,20     ;DEFAULT 3RD ARG
12790 NLOADE: MOVEM A,SRN3(U) ;SAVE USER INDEX (-1 => PDP6)
12791 IFN PDP6P,[
12792         JUMPL A,[HLRZ A,C       ;PDP6, ENSURE LIMITS SMALL ENOUGH
12793                 CAIGE A,20
12794                  HRLI C,20      ;ACS NOT ACCESSIBLE
12795                 MOVEI A,LPDP6M*2000-1
12796                 CAIGE A,(C)
12797                  HRR C,A        ;HAS ONLY 16K MEMORY
12798                 JRST .+1]
12799 ]
12800         HLRZ A,(B)
12801         MOVEM A,SRN4(U) ;SAVE # OF DISK CHANNEL
12802         SETZM SRN5(U)   ;START LOADING AT VIR PG #0
12803         MOVEM C,EPDLT1(U) ;SAVE LOAD LIMITS
12804         HLRZ D,C
12805         CAILE D,(C)
12806          JRST OPNL33    ;FIRST > LAST
12807         HLRZ C,QPCLSR(A)
12808         JUMPE C,NLOADD
12809         HRRZ Q,SRN3(U)
12810         CAIN C,(Q)
12811          JRST NLDSBB    ;(COMING BACK AFTER PCLSR)
12812         SETZM QPCLSR(A)
12813 ;DROPS THROUGH
12814 \f;DROPS IN
12815 ;GET FIRST BLOCK OF FILE BEING LOADED
12816 NLOADD: CAMN U,PCLUSR
12817         SETZM PCLIDX
12818         SKIPL TT,QSMDN(A)
12819          JRST NLOADB
12820         PCLT
12821         SKIPG QSBFS(A)
12822          PUSHJ P,UFLS   ;HANG UNTIL A BLOCK IS READ IN
12823         MOVE Q,QSRAC(A)
12824         TLNE Q,%QAACC+%QAMPU+%QAPAR
12825          JRST OPNL7     ;LOST ONE WAY OR ANOTHER
12826         MOVE E,[444400,,1]
12827         MOVEI B,QBIV
12828         PUSHJ P,QSBGB   ;SET UP CHNL AREA. TT ADDR OF FIRST WORD OF BLOCK
12829          BUG
12830          JRST NLOADC    ;QSBGB SKIPS FOR NORMAL RETURN
12831          JRST OPNL46    ;SKIPPED TWICE => EOF
12832
12833 NLOADB: MOVE J,QMPBSZ(A)
12834         LSH TT,10.
12835 NLOADC: SKIPE (TT)      ;SKIP IF PURE DUMPED FILE
12836          JRST NLDSB     ;SBLK
12837         SKIPGE SRN3(U)
12838          JRST OPNL34    ;TRYING TO PURE LOAD PDP6
12839         MOVSI Q,%QAACC  ;WILL GO RANDOM ACCESSING THROUGH FILE
12840         IORM Q,QSRAC(A) ;THIS ALSO INHIBITS ACTIVATION AT PI LEVEL
12841         HLRZ H,EPDLT1(U);LOW LOAD BOUNDARY
12842         SKIPE EPDLT1(U)
12843          CAIL H,20
12844           JRST NLOADH   ;ACS NOT BE LOADED
12845         MOVSI Q,1000(TT);ADDRESS OF DUMPED ACS
12846         HRLS H
12847         ADD Q,H
12848         HRRZ H,EPDLT1(U);HIGH LOAD BOUNDARY
12849         CAILE H,17
12850          MOVEI H,17
12851         HRRZ J,SRN3(U)  ;JOB TO BE LOADED
12852         PUSHJ P,MPLDJ
12853         XCTR XBW,[BLT Q,(H)] ;LOAD UP HIS ACS
12854         PUSHJ P,MPLDZ
12855 NLOADH: MOVEI R,1(TT)   ;ADDRESS OF FIRST WORD OF DUMPED MAP
12856         MOVEM R,EPDL3(U)        ;SAVE
12857         MOVEI Q,2000
12858         PUSHJ P,QFNTR   ;FIND DISK ADDRESS OF SECOND BLOCK
12859          JRST OPNL46    ;OFF END OF FILE
12860         SOS QSBI(A)     ;UNDO QFNTR HACK
12861         AOS QSLGL(A)
12862         PUSHJ P,QUDULK  ;UNLOCK USER DIRECTORY
12863         PUSHJ P,SWTL    ;LOCK CIRPSW
12864             CIRPSW
12865 ;DROPS THROUGH
12866 \f;DROPS IN
12867 ;HERE TO DO NEXT PAGE (WHEN LOADING PDUMPED FILE)
12868 NLOAD0: PUSHJ P,OPBRK
12869         MOVE A,@EPDL3(U)
12870         TRNE A,600000   ;SKIP IF NO ACCESS (IGNORE)
12871          TRNE A,100000
12872           JRST NLD14    ;THIS PAGE ALREADY DONE OR NO ACCESS
12873         MOVE Q,EPDLT1(U)
12874         TRNE A,400000   ;SKIP IF READ ONLY
12875          JUMPE Q,NLD14  ;IMPURE NOT BE LOADED
12876         MOVE A,SRN5(U)  ;VIRTUAL PAGE NUMBER
12877         JUMPE Q,NLD16
12878         AND Q,[-2000,,-2000]
12879         LSH Q,-10.      ;FIRST PAGE,,LAST PAGE
12880         HLRZ T,Q
12881         CAIL A,(T)
12882          CAILE A,(Q)
12883           JRST NLD14    ;PAGE OUTSIDE OF RANGE TO BE LOADED
12884 NLD16:  MOVE U,SRN3(U)  ;USER INDEX
12885         PUSHJ P,UPLC
12886         LDB R,Q         ;LOOK IN CIRCULAR POINTER ENTRY FOR THIS PAGE
12887         JUMPE R,NLOAD1  ;DOESN'T ALREADY HAVE THIS VIRTUAL PAGE
12888         PUSH P,T        ;SAVE BYTE POINTER TO PAGE MAP FOR THIS VIRTUAL PAGE
12889         PUSH P,Q        ;SAVE BYTE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12890         PUSHJ P,PAGERT  ;FLUSH THE ALREADY EXISTING VIRTUAL PAGE
12891         POP P,Q
12892         POP P,T
12893 NLOAD1: MOVE U,USER
12894         MOVE R,@EPDL3(U)        ;PICK UP DUMPED PAGE MAP WORD
12895         ANDCMI R,PMAGEM ;CLEAR AGE BITS (WOULD LOSE AT NLOAD4+4)
12896         JUMPGE R,NLOAD3 ;NOT ABSOLUTE PAGE
12897         ANDI R,PMRCM    ;ABS PG #
12898         CAIL R,TSYSM
12899 IFE PDP6P,      JRST OPNL32
12900 .ELSE [
12901         JRST [  CAIGE R,<PDP6BM_-10.+LPDP6M>
12902                  CAIGE R,<PDP6BM_-10.>
12903                   JRST OPNL32
12904                 HRRZ R,@EPDL3(U)        ;ALLOW USER TO LOAD WRITABLE PDP6 PAGES.
12905                 ANDCMI R,PMAGEM\PMUNSD  ;GIVE HIM WHATEVER ACCESS HE RQ'S.
12906                 JRST NLOAD5]]
12907 ;IFN TEN11P,[           ;NOT NECESSARY SINCE 10-11 PAGES ABOVE TSYSM NOW
12908 ;       TRNN R,400
12909 ;       JRST .+3
12910 ;       MOVE E,T11MP-400(R)
12911 ;       AOJN E,NLOAD2   ;DONT ALLOW PAGE TO POINT TO TEN11
12912 ;]
12913
12914         LDB E,[MUR,,MEMBLT(R)]
12915         CAIN E,MUHOLE
12916          TDZA R,R       ;IF PAGE NXM TODAY, DON'T ACTUALLY GIVE ACCESS
12917
12918 NLOAD5:   TRO R,200000  ;RD ONLY
12919         DPB R,T         ;STORE ENTRY IN PAGE MAP
12920         MOVEI R,-1
12921         DPB R,Q         ;STORE -1 IN CIRCULAR POINTER
12922 NLOAD2: MOVE E,SRN5(U)  ;VIRTUAL PAGE NUMBER
12923         MOVE U,SRN3(U)  ;USER INDEX LOADING INTO
12924         PUSHJ P,GHUSRA  ;RECOMPUTE HUSRAD
12925 NLD14:  MOVE U,USER
12926         MOVEI R,100000
12927         IORB R,@EPDL3(U)        ;MARK DUMPED PAGE WORD AS ALREADY DONE
12928         MOVE A,SRN4(U)  ;DISK CHANNEL
12929         TLNN R,500000   ;SKIP IF NO CORRESPONDING BLOCK IN FILE
12930         TRNN R,600000   ;SKIP IF MUST ADVANCE ONE BLOCK
12931          JRST .+3       ;DON'T ADVANCE FILE POINTER
12932           PUSHJ P,QFNTN ;ADVANCE TO NEXT DISK ADDRESS
12933            JRST OPNL46  ;PREMATURE EOF
12934         AOS R,SRN5(U)   ;NEXT VIRTUAL PAGE
12935         CAMN U,PCLUSR
12936          MOVEM R,PCLIDX
12937         AOS EPDL3(U)    ;NEXT MAP WORD
12938         CAIGE R,400
12939          JRST NLOAD0    ;LOOP
12940         PUSHJ P,LSWPOP  ;RELEASE CIRPSW
12941         MOVE B,SRN3(U)  ;USER INDEX LOADING INTO
12942         CAME B,U        ;SKIP IF LOADING INTO SELF
12943          PUSHJ P,LSWPOP ;UNSTOP USER
12944         MOVE B,QFBLNO(A)
12945         SETZM QFBLNO(A)
12946         MOVEM B,QRADAD(A)
12947         JRST POPJ1
12948 \f
12949 NLOAD3: TLNN R,100000   ;SKIP IF LINK WITH PAGE IN RH OF R
12950          JRST NLOAD4
12951         PUSH P,T        ;SAVE BYTE POINTER TO MAP ENTRY FOR THIS VIRTUAL PAGE
12952         PUSH P,Q        ;SAVE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12953         LDB A,[1700,,R] ;VIRTUAL PAGE NUMBER BEING LINKED TO
12954         CAIL A,400
12955          JRST NLOAD8    ;BAD VIRT PAGE #
12956         MOVE E,SRN5(U)  ;VIRTUAL PAGE NUMBER OF PAGE BEING LINKED
12957         MOVE U,SRN3(U)  ;USER INDEX LOADING INTO
12958         PUSHJ P,UPLC
12959         LDB W,Q         ;CIRCULAR POINTER OF OTHER ENTRY
12960         JUMPE W,NLOAD8  ;DIDN'T EXIST
12961         CAIN W,-1
12962          JRST NLOAD8    ;POINTS TO AN ABSOLUTE PAGE
12963         MOVE C,U
12964         IDIVI C,LUBLK
12965         SKIPE D
12966          BUG            ;L DOESN'T DIVIDE U
12967         LSH C,10        ;USER NUMBER _ 8
12968         TRZE C,400000
12969          BUG            ;USER INDEX WAS TOO LARGE
12970         IOR C,E         ;NEW CIRCULAR POINTER
12971         POP P,D         ;NEW CIRCULAR POINTER BYTE POINTER
12972         DPB W,D         ;STORE OTHER ENTRY AS NEW CIRCULAR POINTER ENTRY
12973         DPB C,Q         ;MAKE OTHER CIRCULAR POINTER ENTRY POINT TO NEW ONE
12974         LDB E,T         ;OTHER MAP ENTRY
12975         POP P,T         ;POINTER TO NEW MAP ENTRY
12976         ANDI R,600000   ;PROTECTION BITS
12977         TRZN E,600000
12978          JRST NLD11
12979         IOR E,R
12980         JRST NLD10
12981 NLD11:  LSH R,-20
12982         DPB R,T
12983 NLOAD9: AOS SNSWPG      ;INCR CNT OF SWAPPED OUT FOR SYS
12984         AOSA NSWPGS(U)  ;USER LOADING INTO HAS ONE MORE SWAPPED OUT PAGE
12985 NLD10:   DPB E,T
12986 NLD13:  AOS NMPGS(U)    ;USER HAS ONE MORE PAGE
12987         AOS SNMPGS      ;SYSTEM HAS 1 MORE PAGE
12988 NLD15:  MOVE U,USER
12989         JRST NLOAD2     ;RECOMPUTE HUSRAD AND LOOP
12990
12991 NLOAD4: MOVE A,SRN4(U)  ;DISK CHANNEL
12992         MOVEI TT,(R)    ;PUT DESIRED ACCESS IN RH(TT),
12993         ANDI TT,600000
12994         TDNE R,[200000,,400000]
12995          IORI TT,%CBCPY ;ALONG WITH INITIAL-SWAPIN BIT IF NEC.
12996         PUSHJ P,NCORQ7  ;FIND OR CREATE MMP ENTRY.
12997          JRST OPNL37    ;MMP FULL
12998         MOVE E,SRN5(U)  ;GET PAGE # IN JOB BEING LOADED
12999         MOVE U,SRN3(U)  ;TARGET USER.
13000         PUSHJ P,NCORR1  ;INSERT THE PAGE.
13001         JRST NLD15
13002
13003 NLOAD8: SUB P,[2,,2]
13004         JRST OPNL46
13005
13006 NLOADZ: PUSHJ P,LSWPOP  ;FREE CIRPSW
13007         MOVEI T,3
13008         CAMLE T,LMEMFR
13009          PUSHJ P,UFLS
13010         PUSHJ P,SWTL
13011             CIRPSW
13012 POPSM2: SOS (P)         ;RETURN TO LOCN BEFORE PUSHJ
13013         SOS (P)
13014         POPJ P,
13015
13016 ;QTAOS: PUSHJ P,QTLOCK  ;LOCK TUT
13017 QTAOS1: MOVE D,QSLGL(A) ;DISK TRACK
13018         PUSHJ P,TUTPNT
13019         SKIPG B
13020          BUG            ;NOT PART OF ANY FILE
13021         CAIGE B,TUTMNY
13022          AOS B
13023         DPB B,D         ;ADD ONE TO TUT ENTRY FOR THIS TRACK
13024         JRST QTULK
13025 \f
13026 NLUPCL: MOVSI T,BSSTP   ;THIS IS THE LOSSET ROUTINE TO CLEAR BSSTP.
13027         SKIPGE A,SRN3(U)
13028          BUG
13029         ANDCAM T,USTP(A)
13030         POPJ P,
13031
13032 NLDSBB: HRRZ J,SRN3(U)  ; (COMING BACK AFTER PCLSRING OUT) A HAS DSK CHNL #)
13033         PUSHJ P,MPLDJ   ;LOAD MAP (ALSO CLOBBER UMAPS)
13034         SKIPL C,SRN3(U)
13035          CAIN U,(C)
13036           JRST NLDSBH
13037         PUSHJ P,LSWPOP
13038         PUSHJ P,LOSSET
13039             NLUPCL
13040         MOVSI B,BSSTP
13041         IORM B,USTP(C)
13042 NLDSBH: HRRZ B,QPCLSR(A)
13043         JRST (B)
13044
13045 NLDSB:  SKIPN EPDLT1(U)
13046          JRST OPNL12    ;LOAD ONLY PURE FROM SBLK FILE LOSES
13047         HRLZ B,SRN3(U)
13048         HRRI B,NLDSBD
13049         MOVEM B,QPCLSR(A)       ;RESTART POINT IN CASE OF PCLSR
13050         MOVEM J,QSMPRC(A)
13051         MOVEM TT,QSMPRP(A)
13052         HRRZ J,SRN3(U)
13053         PUSHJ P,MPLDJ   ;LOAD MAP (ALSO CLOBBER UMAPS)
13054
13055 ;DROPS THROUGH
13056 \f
13057 ;DROPS IN
13058 NLDSB1: HRROI I,EPDL3(U)
13059         MOVEM I,SRN4(U) ;SET UP AOBJN PTR TO READ INTO EPDL3
13060 NLDSBD: MOVEI C,SRN4(U) ;SET C UP TO POINT TO AOBJN PTR
13061         HRLI C,(TRN)    ;INDICATE EXEC MODE ADR
13062         PUSHJ P,QBI
13063         SKIPGE SRN4(U)
13064          JRST NLDSB9    ;PREMATURE EOF
13065         MOVE I,EPDL3(U)
13066         CAME I,[JRST 1]
13067          JRST NLDSB1    ;IGNORE INITIAL STUFF UNTIL JRST 1
13068 NLDSBK: MOVEI B,NLDSBE
13069         HRRM B,QPCLSR(A)
13070 NLDSBE: HRROI I,QLDPTR(A)
13071         MOVEM I,SRN4(U)
13072         MOVEI C,SRN4(U)
13073         HRLI C,(TRN)
13074         PUSHJ P,QBI     ;GET AN AOBJN POINTER
13075         SKIPGE SRN4(U)
13076          JRST NLDSB9    ;PREMATURE EOF
13077         SKIPL B,QLDPTR(A)
13078          JRST NLDSB6    ;NOT AN AOBJN POINTER
13079         HLRZ C,EPDLT1(U);FIRST ADDRESS TO BE LOADED
13080         SUBI C,(B)
13081         JUMPLE C,NLDSB3
13082         HLROS B         ;SKIP # WDS IN C
13083         ADD B,C         ;-# WDS REMAINING IN BLOCK
13084         SKIPLE B
13085          SUB C,B        ;FLUSH WHOLE BLOCK
13086         LDB D,[1200,,QSMPRP(A)]
13087         SKIPGE QSMDN(A)
13088          MOVEI D,0
13089         ADD D,QFBLNO(A)
13090         ADD D,C         ;ADVANCE ACC PTR TO SKIP PART OR ALL OF BLOCK
13091         MOVEM D,QRADAD(A)
13092         MOVSI D,%QAACC
13093         IORM D,QSRAC(A)
13094         JUMPGE B,[AOS QRADAD(A) ;SKIPPING WHOLE BLOCK, ALSO SKIP CHECKSUM
13095                   JRST NLDSBK]  ;AND GO READ NEXT BLOCK
13096         HRLS C
13097         ADDM C,QLDPTR(A) ;UPDATE AOBJN POINTER
13098 NLDSB3: MOVEI B,NLDSBF  ;MAYBE FLUSH EXISTING MEMORY AND GET NEW
13099         HRRM B,QPCLSR(A)
13100 NLDSBF: HRRZ E,QLDPTR(A) ;START ADR OF BLOCK
13101         HLRE C,QLDPTR(A) ;-LENGTH OF BLOCK
13102         SUB E,C         ;DON'T COMBINE THIS INSN WITH NEXT, MIGHT BE MOBY BLOCK
13103         SUBI E,1        ;GET END ADR OF BLOCK
13104         HRRZ T,EPDLT1(U);HIGH LOAD LIMIT
13105         SUBM E,T        ;NUMBER OF WORDS OF EXCESS IN BLOCK
13106         MOVEM T,EPDLT2(U) ;SAVE FOR LATER USE
13107         JUMPLE T,NLDSB7 ;JUMP IF BLOCK HAS NO EXCESS
13108         SUB E,T         ;ADJUST END ADDRESS
13109         HRLZS T
13110         ADDM T,QLDPTR(A);DECREASE COUNT IN AOBJN POINTER
13111 NLDSB7: LSH E,-10.      ;LAST PAGE NEEDED
13112         PUSH P,A
13113         PUSH P,R        ;R HAS IOCHNM WD, NEEDED IF REACH QICL VIA QBI.
13114         PUSH P,E        ;PAGE NO. OF LAST PAGE NEEDED
13115 NLDSB4: MOVE E,(P)
13116         CAMGE E,SRN5(U)
13117          JRST NLDSB5    ;ALREADY HAVE NEEDED PAGES
13118         MOVE A,SRN5(U)
13119         PUSH P,U
13120         MOVE U,SRN3(U)  ;LOOK UP THIS PAGE IN MAP OF USER WE'RE HACKING.
13121         PUSHJ P,UPLC    ;IF THERES A WRITABLE PAGE
13122         POP P,U
13123         LDB A,T         ;IN THE SLOT ALREADY, KEEP IT.
13124         TRNN A,600000
13125          TRNN A,2
13126           TRNE A,400000
13127            JRST NLDSBM
13128         CAME U,SRN3(U)  ;IF NOT HACKING SELF, NCORLL WILL LSWPOP
13129          PUSHJ P,NULSET ;WHAT IT THINKS IS A LOSSET LIKE NLUPCL
13130         PUSHJ P,SWTL
13131           CIRPSW
13132         MOVEI R,%JSNEW  ;GET FRESH PAGE
13133         MOVE TT,SRN3(U) ;INTO THE JOB WE'RE HACKING.
13134         MOVE C,SRN5(U)  ;PAGE # TO GIVE IT.
13135         MOVSI A,%CBRED+%CBWRT+%CBNDW    ;WANT WRITE ACCESS.
13136         PUSHJ P,NCORL   ;UNDOES NULSET AND SWTL.
13137          JRST NLSBPL    ;COULDNT GET PAGE (CALLED LSWCLR)
13138 NLDSBM: AOS SRN5(U)
13139         JRST NLDSB4     ;CHECK WHETHER WE NEED MORE PAGES.
13140 \f
13141 NLDSB5: SUB P,[1,,1]    ;NOW WE HAVE ALL PAGES NEEDED TO LOAD THIS BLOCK.
13142         POP P,R
13143         POP P,A
13144 NLDSBQ: MOVEI B,NLDSBC
13145         HRRM B,QPCLSR(A)
13146 NLDSBC: HRRZI C,QLDPTR(A)
13147         HRLI C,(SETZ)
13148         PUSHJ P,QBI     ;DO A BLOCK IOT, USING THAT AOBJN POINTER.
13149         AOSG B,EPDLT2(U);SKIP RESIDUE OF BLOCK AND CHECKSUM
13150          MOVEI B,1      ;NO RESIDUE, JUST SKIP CHECKSUM
13151         LDB D,[1200,,QSMPRP(A)]
13152         SKIPGE QSMDN(A)
13153          MOVEI D,0
13154         ADD D,QFBLNO(A)
13155         ADD D,B
13156         MOVEM D,QRADAD(A)
13157         MOVSI D,%QAACC
13158         IORM D,QSRAC(A)
13159         JRST NLDSBK
13160
13161 NLDSB6: LDB D,[1200,,QSMPRP(A)]
13162         SKIPGE QSMDN(A)
13163          MOVEI D,0
13164         ADD D,QFBLNO(A)
13165         SUBI D,1
13166         MOVEM D,QRADAD(A)
13167         MOVSI D,%QAACC
13168         IORM D,QSRAC(A)
13169 NLDSB8: CAME U,SRN3(U)  ;UNLESS HACKING SELF OR PDP6, WE HAVE A SOSSET OF USTP TO POP.
13170          SKIPGE SRN3(U)
13171           CAIA
13172            PUSHJ P,LSWPOP
13173         AOSA (P)
13174 NLDSB9:  PUSHJ P,OPNL46 ;LOAD FILE NOT IN VALID SBLK FORMAT
13175 NLSBP1: PUSHJ P,MPLDZ
13176         SETZM QPCLSR(A)
13177         POPJ P,
13178
13179 NLSBPL: SUB P,[2,,2]    ;FLUSH PUSHES OF E AND R.
13180         POP P,A
13181         JRST NLSBP1
13182 \f
13183 SUBTTL .GUN, .LOGOUT
13184
13185 ;DESTROY PROCEDURE TREE WHOSE TOP INDEX SUPPLIED BY USER
13186 AGUN:   XCTR XR,[SKIPG A,(J)]
13187          POPJ P,        ;LOSE, NEG OR SYSTEM JOB
13188         IMULI A,LUBLK
13189         CONO PI,CLKOFF
13190         CAMGE A,USRHI   ;USER INDEX UNREASONABLE => LOSE.
13191         CAIG A,LUBLK
13192          JRST CLKONJ
13193         JRST ALOGO6
13194
13195 ALOGOU: SKIPL SUPPRO(U)
13196          JUMPN J,ABREAK ;.LOGOUT N, TURNS INTO .BREAK N,33 IF NOT TOP LEVEL
13197         MOVE A,U        ;.LOGOUT, AND STY CLOSE.
13198         CONO PI,CLKOFF
13199 ;A HAS JOB BEING LOGGED OUT; U HAS JOB THAT'S DOING IT.
13200 ;.GUN AND .LOGOUT ACT BY PUTTING THE JOB IN SUCH A STATE THAT
13201 ;IT CAN DO NOTHING BUT TRY TO DISAPPEAR. IF THE JOB IS ALREADY
13202 ;IN THAT STATE, THIS ROUTINE DOES NOTHING. THAT PREVENTS
13203 ;RECURSION LOOPS WHEN KILLING CYCLIC STRUCTURES INVOLVING STY'S.
13204 ;EXCEPTION: IF THE JOB TO BE LOGGED OUT IS THE RUNNING JOB,
13205 ;WE DO THE REAL WORK BY GOING TO ALOGO1.
13206 ALOGO6: SKIPE UNAME(A)  ;JOB TO BE LOGGED OUT IS GONE.
13207         SKIPL SUPPRO(A) ;CAN'T LOG OUT UNLESS TOP LEVEL.
13208          JRST CLKONJ
13209         CAME A,U
13210          AOS (P)        ;IF .GUN GETS THIS FAR, IT HAS "SUCCEEDED".
13211         MOVSI T,BULGOS+BULGO
13212         TDNE T,APRC(A)  ;IF JOB IS ALREADY LOGGING OUT,
13213          JRST ALOGO7    ; SEE IF IT IS THE RUNNING JOB
13214         MOVSI B,%PCUSR
13215         CAMN A,USER
13216          AOJA B,ALOGO5
13217         PUSH P,U
13218         MOVE U,USER
13219         MOVEM A,SRN3(U) ;AUCL4 FINDS USR IDX TO HACK HERE.
13220         PUSHJ P,LOSSET
13221             AUCL4       ;CLEAR BULGOS IF AUCL3 PCLSR'S
13222         PUSHJ P,AUCL3   ;SET BULGOS AND WAIT FOR DIELOK TO CLEAR.
13223         POP P,U
13224         CONO PI,CLKOFF
13225         PUSHJ P,LSWDEL
13226         EXCH B,UPC(A)   ;SET HIM UP TO LOG OUT.
13227 ALOGO4: MOVEM B,SRN3(A)         ; Remember old PC for unlocking locks.
13228         MOVE B,[.LOGOUT]        ;PUT THE FOLLOWING ROUTINE IN JOB'S AC'S:
13229         MOVEM B,AC0S(A)         ;       0/      .LOGOUT
13230         CAMN A,USER             ;       1/      .VALUE
13231          UMOVEM B,0             ;       2/      JRST 0
13232         MOVSI B,(.VALUE)
13233         MOVEM B,AC0S+1(A)
13234         CAMN A,USER
13235          UMOVEM B,1
13236         MOVSI B,(JRST)
13237         MOVEM B,AC0S+2(A)
13238         CAMN A,USER
13239          UMOVEM B,2
13240         MOVSI B,BULGOS
13241         IORM B,APRC(A)  ;SAY HE'S DIEING SO NO-ONE WILL HACK HIM.
13242         MOVEM U,EPDL(A) ;RECORD WHO IS KILLING HIM.
13243         MOVE B,UNAME(U)
13244         MOVEM B,SRN4(A)
13245         MOVE B,JNAME(U)
13246         MOVEM B,SRN5(A)
13247         SETZM PICLR(A)  ;PREVENT INTERRUPTS.
13248         SETZM MSKST(A)
13249         SETZM PIRQC(A)
13250         MOVSI B,BUSRC
13251         ANDCAM B,USTP(A) ;MAKE SURE HE CAN RUN - ELSE HE WOULDN'T LOG OUT.
13252 ALOGO7: CONO PI,CLKON
13253         CAME A,USER
13254          POPJ P,
13255         JRST ALOGO1     ;IF JOB IS RUNNING JOB, MUST HACK AROUND
13256
13257 ALOGO5: EXCH B,UUOH     ;LOGGING OUT SELF - MAKE OUR PC LOOK
13258         SOJA B,ALOGO4   ; AS IF WE HAD EXECUTED THE .LOGOUT IN AC 0
13259 \f
13260 ;COME HERE IF LOGGING OUT ONESELF (A=USER).
13261 ALOGO1: MOVE U,A
13262         PUSHJ P,AUCL3   ;WAIT TILL NO-ONE IS LOOKING AT ME,
13263         PUSHJ P,UBLAM   ;CLOSE MY CHANNELS AND KILL MY INFERIORS AND CORE.
13264         MOVE A,USER
13265         CONO PI,CLKOFF  ;DON'T SCHEDULE WHILE GOING AWAY
13266         MOVSI T,BULGO
13267         IORM T,APRC(A)  ;SYS JOB KILLS ANY TREES WITH BULGO SET.
13268         MOVSI T,SCLGUN
13269         IORM T,SUPCOR   ;TELL SYS JOB TO LOOK AROUND FOR TREES TO KILL.
13270         MOVSI T,BUSRC   ;SUICIDE: MAKE SURE WE DON'T RUN ANY MORE.
13271         IORM T,USTP(A)
13272         JRST UDELAY     ;CAUSE A SCHEDULE
13273
13274 ;COME WITH JOB INDEX IN A. INDICATE THAT JOB IS ABOUT TO DIE,
13275 ;THEN WAIT TILL IT'S SAFE TO KILL IT.
13276 ;TURNS CLOCK ON.
13277 AUCL3:  MOVSI T,BULGOS
13278         IORM T,APRC(A)  ;SAY THIS JOB STARTING TO GO AWAY.
13279         CONO PI,CLKON   ;NOONE CAN START HACKING US NOW; SAFE.
13280         CAME A,USER     ;IF NOT LOGGING OUT RUNNING USER,
13281          PUSHJ P,1USTOP ;STOP THE JOB BEING KILLED.
13282         SKIPE DIELOK(A) ;WAIT TILL NO-ONE IS LOOKING AT THAT JOB.
13283          PUSHJ P,UFLS
13284         HRLOI T,#BUSRC  ;AND NO-ONE ELSE HAS HIM PCLSR'ED.
13285         TDNE T,USTP(A)
13286          PUSHJ P,UFLS
13287         POPJ P,         ;WE SUCCEEDED, BUT CALLER HAS WORK TO DO.
13288 \f
13289 SUBTTL REAL TIME USER FEATURE
13290 ;
13291 ;.REALT AC,     SKIPS ONLY IF REAL TIME FACILITY REQUESTED AND SEIZED
13292 ;AC=    4.9=>TURN OFF OLD CLOCK RATE, FLUSHING REAL TIME FACILITY AND
13293 ;                REMAINDER OF CURRENT TICK AND ZEROING TICK COUNT
13294 ;       4.8=>TURN ON NEW CLOCK RATE
13295 ;       4.7=>TRY TO SEIZE REAL TIME USER FACILITY
13296 ;       4.6=>DON'T SETTLE FOR PSEUDO-REAL TIME STATUS
13297 ;       4.5 =>ONLY WANT PSEUDO
13298 ;       4.4=>PROGRAM TO BE BLOCKED EXCEPT FOR HIGH PRIORITY PHASE OR INT. LEVEL
13299 ;       4.3=>READ INTO WD3+4 AS DESCRIBED BELOW (BEFORE ANY OTHER BITS INTERPRETED)
13300 ;       3.1-4.2=RESERVED FOR EXPANSION, SHOULD BE ZERO
13301 ;       1.1-2.9=RH=POINTER TO 4 WORD BLOCK
13302 ;       WD1=FRAME TIME IN 60'THS (MUST BE <2**18.)
13303 ;       WD2=PRIORITY TIME IN 60'THS (MUST BE <7 AND <WD1/2)
13304 ;       WD3= IF 4.3 ON, SET RH TO FRAME TIME, LH TO TICKS SINCE EXAMINED
13305 ;       WD4= IF 4.3 ON, SET RH TO HIGH PRIORITY TIME, LH TO 0 IF CURRENTLY LOW
13306                 ;PRIORITY OR -1 IF CURRENTLY HIGH PRIORITY
13307 ;
13308 AREALT: UMOVE A,(J)
13309         TLNN A,4000
13310         JRST AREAL1
13311         CONO PI,CLKOFF
13312         MOVE T,UTIME(U)
13313         MOVE Q,URTIME(U)
13314         CONO PI,CLKON
13315         UMOVEM T,2(A)
13316         UMOVEM Q,3(A)
13317 AREAL1: TLNN A,700000
13318         POPJ P,
13319         HRRZ T,UREALT
13320         CAMN T,U
13321         SETOM UREALT
13322         SETZM URTIME(U)
13323         TLNN A,400000
13324         JRST AREAL2
13325         PUSHJ P,CLQDEL  ;TURN OFF OLD INTS
13326         UCLBLK(U)
13327         SETZM UTIME(U)  ;ZERO TICK COUNT
13328 AREAL2: TLNN A,200000
13329         JRST AREAL4
13330         XCTR XR,[SKIPG T,(A)]
13331         JRST ILUUO
13332         HRRM T,UTIME(U)
13333 AREAL4: TLNN A,100000
13334         JRST AREAL6
13335         XCTR XR,[SKIPLE T,1(A)]
13336         CAIL T,13.
13337         JRST ILUUO
13338         HRRZ B,UTIME(U)
13339         LSH B,-1
13340         CAMLE T,B
13341         JRST ILUUO
13342         HRROS T
13343         TLNE A,10000
13344         TLZ T,1
13345         MOVEM T,URTIME(U)
13346         TLNE A,20000
13347         JRST AREAL6
13348         CONO PI,CLKOFF
13349         SKIPGE UREALT
13350         JRST AREAL7
13351         TLNE A,40000
13352         SETZM URTIME(U)
13353         JRST AREAL5
13354 AREAL7: MOVEM U,UREALT
13355         AOS (P)
13356 AREAL5: CONO PI,CLKON
13357 AREAL6: SKIPN T,UTIME(U)
13358         POPJ P,
13359         SKIPE B,URTIME(U)
13360         MOVE T,B
13361         HRRZS T
13362         PUSHJ P,CLQADD
13363         UCLBLK(U)
13364         POPJ P,
13365
13366
13367 ;CLOCK LEVEL ROUTINE
13368 UREALB: SUBI U,UCLBLK   ;SET INDEX TO QUEUE BLOCK
13369         SKIPE B,URTIME(U)
13370         JRST URLTB2
13371 URLTB1: MOVSI T,(%PIRLT)
13372         IORM T,PIRQC(U)
13373         MOVSI T,1
13374         ADDM T,UTIME(U)
13375         HRRZ T,UTIME(U)
13376         SKIPGE B
13377         HRRZ T,B
13378 URLTBX: SETZM SCHFLG    ;CAUSE SCHEDULE THIS CLOCK BREAK
13379         MOVEI C,UCLBLK(U)
13380         JRST CLQREE
13381
13382 URLTB2: TLC B,-1
13383         MOVEM B,URTIME(U)
13384         MOVSI T,1
13385         HRRZ C,UREALT
13386         JUMPGE B,URLTB4
13387         CAMN C,U
13388         HRRZS UREALT
13389         JRST URLTB1
13390
13391 URLTB4: CAMN C,U
13392         IORM T,UREALT
13393         HRRZ T,UTIME(U)
13394         HRRZS B
13395         SUB T,B
13396         JUMPG T,URLTBX
13397         BUG
13398 \f
13399 SUBTTL MISCELLANEOUS SYSTEM CALLS
13400
13401 $INSRT TIME             ;ROUTINES HAVING TO DO WITH CLOCKS AND THINGS
13402
13403 ;
13404 ;.CLOSE CH,     ;CLOSE ANY I/O TRANSACTION OPEN ON CHANNEL CH
13405 ;
13406 CCLOSE: HRREI C,-IOCHNM(R)      ;CLOSE CALLED INTERNALLY
13407         SUB C,U
13408         TRNE C,-NIOCHN
13409          BUG            ;R WAS NOT AN IOCHNM WORD ADDRESS.
13410         HRRZM C,UUAC(U) ;SOME CLOSE ROUTINES LOOK AT UUAC
13411         JRST ACLOSE
13412
13413 NCLOSE: AOS (P)
13414 ACLOSE: HLRZ A,(R)      ;SET UP A WITH L.H. OF I/O CH WORD
13415         HRRZ B,(R)      ;SET UP B WITH R.H. "
13416         MOVE C,CLSTB(B) ;GET CLOSE TABLE ENTRY
13417         TLNE C,%CLSNRM  ;SKIP IF NOT STANDARD CLOSE
13418          JRST STDCLS    ;JUMP TO STANDARD CLOSE
13419         PUSH P,R        ;SAVE R
13420         PUSHJ P,(C)     ;CALL CLOSE ROUTINE
13421         POP P,R         ;RESTORE R
13422 STDCLX: SETZM (R)       ;CLEAR I/O CHANNEL WORD
13423         SETZM IOCHST-IOCHNM(R)  ;CLEAR I/O CHNL STATUS WORD
13424         POPJ P,
13425
13426 STDCLS: CONO PI,CLKOFF  ;INHIBIT CLOCK BREAKS
13427         SOSGE 1(C)      ;DECREMENT USE COUNTER, SKIP IF STILL IN USE AT LEAST ONCE
13428          SETOM (C)      ;NO LONGER IN USER, FREE BY SETOM'ING "XXXUSR" VARIABLE
13429         CONO PI,CLKON   ;ENABLE CLOCK BREAKS
13430         JRST STDCLX
13431
13432 AVALRET:UMOVE A,(B)     ;CALL 4,
13433         MOVEM A,VALUE(U)
13434         MOVEI T,%PIVAL
13435         JRST ILLOP4
13436
13437 AUTRAN: UMOVE C,(B)
13438         HRR C,U
13439         CONO PI,CLKOFF          ;Don't let USRHI change or anything like that
13440         MOVE A,USRHI
13441 UTRNL:  SUBI A,LUBLK
13442         JUMPL A,CLKONJ
13443         SKIPE D,UNAME(A)
13444          CAME C,SUPPRO(A)
13445           JRST UTRNL
13446         MOVE E,JNAME(A)
13447         CONO PI,CLKON
13448         UMOVEM D,1(B)
13449         UMOVEM E,2(B)
13450         JRST POPJ1
13451
13452 ;RETURN WITH LOSER IN A IN LOSER MODE AND CLOCK OFF
13453 ;
13454 RPCCK:  PUSHJ P,RPCLSR  ;STOP USER (ALSO PUTS HIM IN USER MODE)
13455         CONO PI,CLKOFF  ;TURN OFF CLOCK
13456         JRST UPCLSR     ;"RESTART USER" (HE CAN'T RUN TILL CLOCK BACK ON)
13457 \f
13458 ;.LOSE X <=> .CALL [SETZ ? SIXBIT/LOSE/ ? 401000,,X ]
13459
13460 ;.CALL LOSE
13461 ;       USED TO REPORT LOSSAGE TO SUPERIOR PROCEDURE
13462 ;ARG 1 - LOSING INSTRUCTION ADDR,,LOSSAGE CODE (CODES DEFINED BY DDT)
13463 ;ARG 2 - NEW PC (DEFAULT = PC-2 SO CAN USE AS A NON-SKIP-RETURN HANDLER)
13464 ;CTL 1.1 - DEFAULT ARG 2 TO PC INSTEAD OF PC-2
13465 ;CTL 1.2 - SETZM @.40ADDR
13466 ;CTL 1.3 - DON'T USE THE NEW PC AS THE LOSING INSTRUCTION ADDR
13467
13468 ALOSE:  HRRZ A,FORTY            ;ARG 1 = EFF ADDR OF UUO
13469         MOVEI W,1
13470         TDZA T,T
13471 NLOSE:   MOVE T,CTLBTS(U)
13472         MOVE D,40ADDR(U)
13473         TRNE T,2
13474          XCTR XRW,[MOVES (D)]
13475         TLZ B,BADPC             ;COMPUTE NEW PC FROM ARG 2 OR UUOH
13476         SKIPGE IOTLSR(U)
13477          TLO B,%PCUIO
13478         TLO B,%PCUSR
13479         MOVE C,UUOH
13480         TRNN T,1
13481          HRRI C,-2(C)
13482         CAIGE W,2
13483          MOVE B,C
13484         TRNN T,4
13485          HRL A,B
13486         HRRI B,1(B)             ;PCLSR'ING WILL SOS
13487         MOVEM A,VALUE(U)        ;PASS TO SUPERIOR
13488         MOVEM B,UUOH
13489         TRNE T,2
13490          XCTR XW,[SETZM (D)]
13491         MOVSI T,%PJLOS
13492         JRST UUOERR
13493 \f
13494 AUCLOSE:
13495 IFN PDP6P,[
13496         MOVE A,(R)      ;OPER 10
13497         MOVE A,CLSTB(A)
13498         TLNE A,%CLS6
13499          JRST PDPUCL
13500 ]
13501         PUSHJ P,AUCL2
13502          POPJ P,
13503         PUSHJ P,1USTOP
13504         MOVEM A,SRN3(U)
13505         PUSHJ P,LOSSET
13506            AUCL4
13507         PUSHJ P,AUCL3   ;STOP JOB, AND WAIT TILL SAFE TO KILL IT
13508                         ;(TURNS CLOCK ON)
13509         EXCH U,A
13510         PUSH P,A
13511         HLLZ T,SUPPRO(U)
13512         PUSH P,T
13513         PUSH P,R
13514         PUSHJ P,UBLAST
13515         POP P,R
13516         PUSHJ P,ZUSLOG  ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
13517         CONO PI,CLKON
13518         POP P,T
13519         POP P,U
13520         ANDCAM T,IFPIR(U)
13521         JRST LSWDEL
13522
13523 AUCL4:  HRRZ A,SRN3(U)
13524         MOVSI T,BULGOS
13525         ANDCAM T,APRC(A)
13526         POPJ P,
13527
13528 AUCL2:  HLRZ A,(R)      ;GUY BEING CLOSED
13529         HRRZ B,(R)
13530         LDB TT,[.BP (%CLSFU),CLSTB(B)]
13531         JUMPN TT,OPNL31 ;FOREIGN JOB => .UCLOSE ISCAN'T MODIFY JOB
13532         SKIPL CLSTB(B)  .SEE %CLSU
13533          JRST OPNL34    ;NOT A JOB AT ALL?
13534         CONO PI,CLKOFF
13535         MOVE TT,TTYTBL(U)
13536         JUMPGE TT,AUCL1 ;HAVE TTY NOW
13537         TLNN TT,%TBDTY  ;NOT GIVING IT AWAY.
13538          CAIE A,(TT)    ;SKIP IF GAVE IT TO GUY WE'RE KILLING
13539           JRST AUCL1
13540         PUSHJ P,SDTTY   ;TAKE IT BACK FROM HIM.
13541          JFCL
13542 AUCL1:  HLRZ A,(R)
13543         JRST POPJ1
13544 \f
13545 ;DISMIS SYSTEM CALL. 1ST ARG INT PDL PTR (WILL BE DECREMENTED
13546 ;IF NOT AN IMMEDIATE ARG)
13547 ;2ND ARG OPTIONAL PC TO DISMIS TO (OVERRIDES THAT IN INT PDL)
13548 ;3RD ARG OPTIONAL NEW .DF1 VALUE       "       "    "     "
13549 ;4TH ARG OPTIONAL NEW .DF2 VALUE ...
13550 ;5TH ARG OPTIONAL ERROR CODE AS IN LOSE.  IF PRESENT WILL LOSE RIGHT AFTER DISMISSING.
13551 ;IF 4 ARGS GIVEN, 1ST IGNORED EXCEPT FOR POSSIBLY DECREMENTING, OR POPPING OF ACS.
13552 ;CTL BITS (SAME FORMAT AS LH OF 1ST WORD OF INTERRUPT DISPATCH TABLE)
13553 ;SPECIFY POPPING OF SAME EXTRA INFO THAT INTERRUPTS CAN PUSH.
13554
13555 NDISMIS:CAIL W,5
13556          MOVEM E,VALUE(U)
13557         MOVE E,A        ;GET IN E THE INT PDL PTR.
13558         TLNN E,1000     ;IF 1ST ARG IMMEDIATE, IT IS PTR,
13559          UMOVE E,(A) ;ELSE IT PTS TO PTR.
13560         MOVE H,E        ;SAVE UNPOPPED PDL POINTER FOR PDL OV CHECKING.
13561         TLNE A,1000     ;IF PDL PTR ISN'T IMMEDIATE, POP IT ACC. TO CTL BITS.
13562          JRST NDISM2
13563         MOVE T,CTLBTS(U)
13564         TRNE T,400000
13565          SUB E,[3,,3]   ;POP OFF DEBUGGING INFO IF IT WAS PUSHED.
13566         LDB TT,[000500,,T]
13567         JUMPE TT,NDISM2 ;IF ACS WERE PUSHED, POP THEM TOO.
13568         HRLS TT
13569         SUB E,TT        ;DECREMENT THE PDL POINTER ENOUGH
13570         LDB I,[060500,,T]
13571         HRLI I,1(E)     ;AND COPY FROM THE PDL TO THE ACS.
13572         ADDI TT,-1(I)
13573         XCTR XBRW,[BLT I,(TT)]
13574 NDISM2: CAIGE W,2       ;IF NO 2ND ARG, GET PC FROM INT PDL
13575          UMOVE B,(E)
13576         CAIGE W,3       ;IF NO 3RD ARG, GET .DF1 FROM INT PDL
13577          UMOVE C,-2(E)
13578         CAIGE W,4       ;IF NO 4TH ARG GET .DF2 FROM INT PDL
13579          UMOVE D,-1(E)
13580         TLNE A,1000     ;IF 1ST ARG NOT IMMED, DECREMENT IT
13581          JRST NDISM3
13582         SUB E,[5,,5]
13583         UMOVEM E,(A)
13584         JUMPGE E,NDISM3 ;AND CHECK FOR PDL OVFLO.
13585         SKIPL H
13586          PUSHJ P,NDISMP ;PDL OVFLO, SET INT BIT IF INT ENABLED.
13587 NDISM3: MOVEM C,IDF1(U) ;RESTORE THE PC, .DF1, .DF2
13588         MOVEM D,IDF2(U)
13589         MOVSI T,%PJLOS
13590         CAIL W,5
13591          IORM T,PIRQC(U)
13592         JRST NDISM1
13593
13594 NDISMP: MOVEI TT,%PIPDL ;PDL OV INT BIT.
13595         TDNE TT,MSKST(U)
13596          IORM TT,PIRQC(U)
13597         POPJ P,
13598 \f
13599 ;OLD-STYLE DISMISS JOINS HERE
13600 ADISMIS:UMOVE B,(B)     ;CALL 1,
13601 NDISM1: TLO B,%PCUSR
13602         TLZ B,BADPC
13603         SKIPGE IOTLSR(U)
13604          TLO B,%PCUIO
13605 IFN KL10P,[
13606         SETCM A,UUOH            ;IF ONE-PROCEEDING THE .DISMISS
13607         TLNN A,%PS1PR-%PSINH
13608          TLO B,%PS1PR-%PSINH    ;TRAP IMMEDIATELY AT THE NEW PC
13609 ]
13610         MOVEM B,UUOH
13611         SETOM PICLR(U)
13612
13613 ;CHECK FOR PENDING INTERRUPTS AND TAKE THEM RIGHT AWAY
13614 APISE1:
13615 IFN PDP6P,[
13616         CAMN U,PDPISR
13617          CONO DSDEV,DSDCHN      ;ENABLE INTERRUPT FROM 6
13618 ]
13619         MOVE A,U
13620         PUSHJ P,APISE6  ;SEE IF ANY DEVICES WANT TO RE-INTERRUPT.
13621         MOVEI C,%PIARO
13622         ANDCAB C,PIRQC(U)
13623         SETCM D,MSKST(U)
13624         IOR D,IDF1(U)   ;FIND ALL DISABLED OR DEFERRED
13625         SKIPN PICLR(U)  ;(ALL ARE DEFERRED WHEN PI IS OFF).
13626          SETO D,
13627         AND D,[BADBTS]  ;BAD
13628         TDNE C,D        ;PENDING INTERRUPTS
13629          JRST ADISM7    ;IF THERE ARE ANY, LET THEM HAPPEN.
13630         AND C,MSKST(U)
13631         ANDCM C,IDF1(U)
13632         JUMPN C,ADISM7  ;1ST WD INT. PENDING.
13633         MOVE C,IFPIR(U)
13634         AND C,MSKST2(U)
13635         ANDCM C,IDF2(U)
13636         JUMPE C,CPOPJ   ;JUMP IF NO 2ND WORD INT PENDING.
13637 ADISM7: MOVE C,[JRST ONEFLS]
13638         MOVEM C,UEXIT
13639         POPJ P,
13640 \f
13641 APISE6: MOVE D,MSKST(A) ;IF INTERRUPT FROM CONSOLE ENDBLED,
13642         TRNN D,%PITYI
13643          JRST APISE7
13644         SKIPL T,TTYTBL(A) ;IF THIS JOB HAS ITS CONSOLE
13645         SKIPN TINTC(T)  ;AND THE CONSOLE HAS INT. CHARS,
13646          JRST APISE7
13647         MOVEI D,%PITYI  ;GENERATE AN INTERRUPT.
13648         IORM D,PIRQC(A)
13649 APISE7: MOVE D,MSKST2(A) ;LOOK AT HIS ENABLED IO CHANNELS.
13650         ANDI D,177777
13651 APISE0: JFFO D,APISE9   ;CHECK EACH ONE.
13652         JRST APISE8     ;ALL CHECKED.
13653
13654 APISE9: MOVNS E         ;CHECK ONE IO CHNL THAT'S ENABLED TO INT.
13655         ANDCM D,CHNBIT+35.(E) ;MARK THIS CHNL AS HANDLED.
13656         ADDI E,35.+IOCHNM(A)  ;GET ADDR OF IOCHNM WD FOR CHANNEL.
13657         HRRZ T,(E)      ;IS IT A TTY INPUT CHANNEL?
13658         CAIL T,TYIDN
13659         CAILE T,TYIBN
13660          JRST APISE2
13661         LDB T,[$TIIDX,,(E)] ;YES, GET THE TTY NUMBER.
13662         HRRZ C,TTYSTS(T)
13663         CAIE T,%TINON   ;IF IT ISN'T A DISOWNED TY CHANNEL,
13664         CAIE C,(A)      ;AND THE TTY BELONGS TO THIS JOB,
13665          JRST APISE0
13666         SKIPN TINTC(T)  ;AND IT HAS AN INT. CHAR WAITING,
13667          JRST APISE0
13668         MOVE C,TYIMSK(T)
13669 APISE4: AND C,MSKST2(A) ;GIVE AN INT. ON ONE OF THE CHANNELS IT'S OPEN ON.
13670         MOVN T,C
13671         AND C,T
13672         IORM C,IFPIR(A)
13673         JRST APISE0
13674
13675 APISE2: CAIN T,STYDUI   ;NOT A TTY CHNL. IS IT A STY CHNL?
13676          JRST APISE3
13677         CAIE T,STYDBI
13678          JRST APISE0
13679 APISE3: LDB T,[$TIIDX,,(E)]     ;YES, GET TTY #.
13680         SKIPL C,STYSTS-NFSTTY(T) ;STY IN USE BY THIS JOB?
13681         CAIE C,(A)
13682          JRST APISE0
13683         SKIPGE TTYOAC(T)        ;TTY OUTPUT PENDING?
13684          JRST APISE0
13685         MOVE C,STYMSK-NFSTTY(T) ;YES, INT. ON ONE CHANNEL.
13686         JRST APISE4
13687
13688 APISE8:
13689 IFN STKP,[
13690         SKIPL C,STKUSR
13691         CAIE C,(A)
13692          POPJ P,
13693         HRRZ C,STKMSK
13694         AND C,MSKST2(A)
13695         SKIPLE STKBC
13696         IORM C,IFPIR(A)
13697 ]
13698         POPJ P,
13699 \f
13700 ;.SLEEP AC,     ;IF C(AC) + OR ZERO:    ;BECOME DORMANT FOR C(AC) 1/30'THS OF A SEC
13701                 ;IF C(AC) -:    ;BECOME DORMANT TILL MAGNITUDE OF C(AC) > C(TIME)
13702 ASLEEP: XCTR XR,[MOVN T,(J)]    ;PICK UP NEGATIVE OF C(AC)
13703         JUMPGE T,ASLP1  ;JUMP IF C(AC) WAS NEG
13704         SUB T,TIME      ;COMPUTE NEG OF TIME SLEEP SHOULD RUN OUT
13705         UMOVEM T,(J)    ;STORE BACK SO YOU WILL WIN IF PCLSR'ED OUT
13706 ASLP1:  MOVMS A,T               ;MAKE POSITIVE
13707         SUBI A,60.*30.          ;IF SLEEPING FOR MORE THAN A MINUTE
13708         MOVSI B,%SWDSO
13709         CAMLE A,TIME
13710         IORM B,USWST(U)         ;PUT RIP VAN WINKLE ON ICE
13711         PCLT
13712         JRST ASLP2              ;ALWAYS GO TO UFLS AT LEAST ONCE
13713
13714         CAMLE T,TIME    ;HANG TILL C(T) LESS THAN C(TIME)
13715 ASLP2:  PUSHJ P,UFLS
13716         XCTR XW,[SETZM (J)]     ;CLEAR OUT ARG (FOR COMPATIBILITY WITH WHEN AC WAS COUNTED OUT)
13717         JRST CLKONJ     ;MAKE SURE CLKCHN ON IN CASE SLEEP WAS 0 & SKIPPED UFLS ENTIRELY
13718
13719 ;RELOAD CALL - IGNORE ARGS
13720 ;MUST BE FROM TOP LEVEL NON-DISOWNED JOB
13721 ;RELOADS AND STARTS SYS: ATSIGN WHATEVER
13722
13723 NRELOAD:SKIPGE SUPPRO(U)
13724         SKIPGE APRC(U)
13725          JRST OPNL40            ;NOT TOP LEVEL
13726         CONO PI,CLKOFF
13727         PUSHJ P,LOGUPD          ;LOG OUT
13728         PUSHJ P,DMNPLI          ;AND IN AGAIN
13729         PUSHJ P,USRST2          ;RESET USER VARS
13730         CONO PI,CLKON
13731         SETZM @UTMPTR(U)        ;TEMPORARY HIGH PRIORITY
13732         JRST USTCDR             ;LOAD FILE AND START IT
13733
13734 AMASTER:UMOVE J,(J)
13735         CONO PI,CLKOFF  ;OPER 61
13736         SKIPL A,UMASTER
13737          JRST AMAST2
13738         SKIPGE J
13739 AMAST1:  HRRZM U,UMASTER
13740         JRST CLKOJ1
13741
13742 AMAST2: CAME U,A
13743          JRST AMAST3
13744         SKIPL J
13745          SETOM UMASTER
13746         JRST CLKOJ1
13747
13748 AMAST3: JUMPGE J,CLKOJ1
13749         SKIPGE TTYTBL(U)
13750          JRST CLKONJ    ;LOSEY
13751         PUSHJ P,RPCCK
13752         CAME A,UMASTER
13753          JRST AMASTER
13754         JRST AMAST1
13755 \f
13756 ;.CALL SSERVE - Set .SERVER variable without timing screw.
13757 ; ARG1: <job>, the client whose .SERVER variable is to be munged
13758 ; ARG2: <job>, the server to be stored in the variable
13759 ; If one arg is given, it is the server and the client defaults to %JSELF
13760 NSSERVER:
13761         MOVE J,A
13762         CAIL W,2
13763          SKIPA A,B
13764           MOVEI J,%JSELF
13765         JSP T,NCORUI            ; Decode client and AOS his DIELOK
13766          JRST NSSRV1            ; OK to write
13767         JSP T,NCORWR            ; Check further
13768          JRST OPNL31            ; CAN'T MODIFY JOB
13769 NSSRV1:
13770 IFN PDP6P,[
13771         CAIN J,-1               ; PDP6?
13772          JRST OPNL34            ; WRONG TYPE DEVICE
13773 ];PDP6P
13774         EXCH J,A                ; A: client  J: server
13775         JSP T,NCORUI            ; Decode server and AOS his DIELOK
13776          JFCL                   ; Don't give a damn about writability
13777 IFN PDP6P,[
13778         CAIN J,-1               ; PDP6?
13779          JRST OPNL34            ; WRONG TYPE DEVICE
13780 ];PDP6P
13781         MOVEM J,SERVER(A)       ; Safe to set it now
13782         PUSHJ P,LSWPOP          ; Server's DIELOK
13783         JRST LSWPJ1             ; Client's DIELOK
13784
13785 \f
13786         SUBTTL LOGIN/ATTACH/DETACH/DISOWN CODE
13787
13788 ;SYMBOLIC CALL LOGIN:  LOG A TREE IN.  MUST BE GIVEN BY TOP-LEVEL NON-LOGGED-IN JOB
13789 ;WITH NO INFERIORS.
13790 ;ARG 1 - DESIRED UNAME
13791 ;ARG 2 - "TERMINAL NAME", PUT IN TRMNAM USER VARIABLE AND PRINTED AS SIXBIT ON SYSCON.
13792 ;ARG 3 - DESIRED XUNAME, FOR DEMON TO KNOW WHO TO ACCOUNT.
13793
13794 NLOGIN: HLRE T,UNAME(U) 
13795         AOJN T,OPNL31   ;JUMP ON ALREADY LOGGED IN
13796         SKIPL SUPPRO(U)
13797          JRST OPNL40    ;CAN'T LOG IN IF NOT TOP LEVEL
13798         JUMPE A,OPNL11
13799         HLRE T,A
13800         AOJE T,OPNL11           ;BAD NAME
13801         CAIGE W,3
13802          MOVE C,A       ;IF XUNAME (ARG 3) MISSING, DEFAULT TO UNAME.
13803         MOVEI D,0
13804         CONO PI,CLKOFF
13805 ALOG2:  SKIPN UNAME(D)
13806          JRST ALOG4
13807         MOVE T,JNAME(D)
13808         CAMN T,JNAME(U)
13809          CAME A,UNAME(D)
13810           JRST ALOG3
13811         JRST OPNL13     ;CONSOLE CONTROLLED TREE ALREADY LOGGED IN THAT NAME
13812
13813 ALOG3:  HRRZ T,SUPPRO(D)
13814         CAMN T,U        ;CAN'T LOGIN IF HAVE INFERIOR.  RESTRICTION IMPOSED HERE
13815          JRST OPNL12    ;SINCE WE NO CODE HERE TO SET INFERIOR'S UNAME.
13816 ALOG4:  ADDI D,LUBLK
13817         CAMGE D,USRHI
13818          JRST ALOG2     ;LOOP FOR ALL SETS OF PROCEDURE VARIABLES
13819         HRRZ T,TTYTBL(U)
13820         HRLI T,[ASCIZ / LOGIN  /]
13821         PUSHJ P,SGWAIT          ;ASK THE SYSTEM JOB TO PRINT OUT THE RELEVANT INFO
13822         SKIPL TTYTBL(U)         ;SKIP IF NOT CONSOLE CONTROLLED
13823          AOS SUSRS              ;INCREMENT COUNT OF LOGGED IN CONSOLE CONTROLLED TREES
13824         MOVEM A,UNAME(U)        ;SET UNAME TO WHAT LOGGED IN AS
13825         MOVEM A,SLGIV
13826         MOVEM A,USYSNM(U)       ;SET SNAME "
13827         MOVEM A,HSNAME(U)       ;SET HOME SNAME "
13828         MOVEM C,XUNAME(U)       ;SET XUNAME " " (USER MAY MUNG LATER)
13829         MOVEM B,TRMNAM(U)
13830         MOVEM B,SLGIV+2         ;INCLUDE TRMNAM AS SECOND NAME PRINTED
13831         PUSHJ P,DMNPLI          ;GIVE INFO TO DEMON
13832         JRST CLKOJ1             ;TURN CLK ON AND SKIP RETURN
13833
13834 ASETM2: UMOVE A,1(J)    ;.OPER 5
13835         MOVEM A,MSKST2(U)
13836 ASETMSK:        UMOVE D,(J)     ;OPER 4
13837         MOVE A,U
13838         MOVEI I,1
13839         SOS (P)         ;WILL SKIP RETURN
13840         JRST USMASK     ;ACT LIKE .SUSET.
13841
13842 ARSYSI: SKIPA A,[ITSVRS]        ;OPER 52
13843 ARDTIME:MOVE A,TIME             ;OPER 17
13844         JRST APTUAJ
13845
13846 IFE KS10P,[     ; On the KS10 they made DATAI 0, a UUO!
13847 ARDSW:  DATAI A                 ;OPER 20
13848         JRST APTUAJ
13849 ] ;IFE KS10P
13850 IFN KS10P, ARDSW==:ILUUO
13851
13852 ASUPSET:MOVEI C,003777  ;OPER 53
13853         XCTR XR,[AND C,(J)]
13854         MOVE D,SUPCOR   ;SAVE OLD CONTENTS
13855         XORB C,SUPCOR
13856         UMOVEM C,(J)
13857         HRROI A,SUPCOR
13858         JRST ASPST2
13859 \f
13860 ;       .CALL DET
13861 ;       ERROR RETURN
13862 ;       NORMAL RETURN
13863
13864 ;DET:   SETZ
13865 ;       SIXBIT /DETACH/
13866 ;       SETZ [<JOB SPEC>]       ;SEE NCORUI
13867
13868 ;DISOWN JOB'S ENTIRE TREE AND FREE CONSOLE.  IF TREE HAS NO
13869 ;CONSOLE, JUST MAKES IT DISOWNED.  NO ARG => THIS JOB'S TREE
13870 ;ALWAYS SKIPS IF THE JOB SPEC IS REASONABLE.
13871
13872 ;CTL BIT 1.1 => DON'T SET SIGN OF APRC (DON'T MAKE TREE "DISOWNED").
13873 ;CTL BIT 1.2 => USE SYSTEM TREE'S RESOURCE WORD
13874 ;CTL BIT 1.4 => KILL TREE AN HOUR FROM NOW IF IT ISN'T REOWNED
13875 ;CTL BIT 1.5 => SUPPRESS THE CONSOLE-FREE MESSAGE ON THE TTY
13876
13877 NDETAC: HLRZ B,A        ;XOR LH OF 1ST ARG INTO CTL BITS
13878         XORM B,CTLBTS(U)
13879         PUSHJ P,SWTL    ;MAKE SURE NOBODY ELSE IS REARRANGING TREES.
13880             TREESW
13881         MOVEI J,(U)     ;DEFAULT TO OUR TREE
13882         JUMPE W,NDETA0  ;JUMP IF NO ARGS SUPPLIED
13883         MOVE J,A        ;JOB SPEC
13884         JSP T,NCORUI    ;DECODE ARG, GET USER INDEX IN J
13885          JFCL           ;IGNORE INFO ON WRITEABILITY
13886         CAIG J,LUBLK    ;DONT DETACH SYSJOB OR CORE JOB
13887          JRST OPNL31
13888 NDETA0: SKIPL T,SUPPRO(J)       ;FIND TOP LEVEL JOB OF TREE (IN J)
13889          JRST [ MOVE J,T 
13890                 JRST NDETA0 ]
13891         HRRZ A,J        ;TOP OF TREE
13892         SKIPGE APRC(A)
13893          JRST LSWCJ1    ;TREE IS ALREADY DISOWNED.
13894         MOVEI Q,NDETA8
13895         PUSHJ P,IFPLUP  ;STOP ALL BUT THIS JOB
13896         PUSHJ P,NDETA7  ;DO THE WORK
13897         JRST LSWCJ1     ;UNSTOP THE TREE
13898
13899 NDETA7: PUSH P,U        ;US
13900         PUSH P,A        ;TOP LEVEL
13901         MOVEI U,(A)
13902         CONO PI,CLKOFF
13903         PUSHJ P,LOGUPD  ;FOR ACCOUNTING PURPOSES, THIS IS LIKE A LOGOUT
13904         CONO PI,CLKON
13905 NDETA1: MOVEI U,(A)     ;GET IN U USER INDEX OF OWNER OF TTY
13906         MOVE A,TTYTBL(U)        ;GET IN A TTY NUMBER
13907         TLNE A,%TBDTY   ;TREE HAS NO TTY =>
13908          JRST [ POP P,A ;JUST MAKE IT DISOWNED.
13909                 POP P,U
13910                 JRST NDETA5 ]
13911         JUMPL A,NDETA1  ;GAVE TTY AWAY
13912         MOVE T,(P)              ;TOP-LEVEL JOB OF TREE SAVES USER TTY OPTIONS IN
13913         MOVE B,TTYOPT(A)        ;HIS STTYOP VARIABLE
13914         AND B,[%TOUSR,,%TPUSR]
13915         MOVEM B,STTYOP(T)
13916         LDB B,[.BP (%TCRFS+%TCQRY),TTYCOM(A)]
13917         IORI B,4                ;MAKE STTYOP NON-ZERO TO SHOW IT WAS STORED
13918         DPB B,[170300,,STTYOP(T)]       ;OVERLAPS PADLF FIELD
13919         HRRZS A
13920         PUSH P,TTYSTS(A)        ;SAVE THIS TTY INFO
13921         PUSH P,TTYST1(A)        ;WILL PUT INTO TTY OWNER'S USER VARS
13922         PUSH P,TTYST2(A)        ;AFTER SUCCEED IN FREEING THE TTY
13923         MOVE B,A
13924         IMULI B,TPLEN*2
13925         MOVN B,TPVB+TPLEN(B)
13926         ADD B,TCMXV(A)
13927         PUSH P,B
13928         MOVSI B,%TCDET  ;IF TREE DETACHED DUE TO TOP LVL INT,
13929         SKIPN USER      ;THE CONSOLE FREE MESSAGE SHOULD SAY SO.
13930          IORM B,TTYCOM(A)       .SEE SYSCFM
13931                         ;THIS ALSO HAPPENS IF DIALUP LINE HUNG UP, OS'ERS BEWARE!
13932 ;DROPS THROUGH
13933 \f;DROPS IN
13934 IFN N11TYS,[
13935         CONO PI,CLKOFF
13936         PUSHJ P,TVBNCL  ;CLEAR VIDEO BUFFER #
13937         CONO PI,CLKON
13938 ];N11TYS
13939         MOVE B,-5(P)    ;GET BACK IDX OF RUNNING JOB
13940         MOVE B,CTLBTS(B)
13941         MOVSI T,%TACFM
13942         TRNE B,20       ;CTL BIT 1.5 => MARK THE TTY AS NOT NEEDING CNSL FREE MSG.
13943          IORM T,TTYSTA(A)
13944         PUSHJ P,TTYLO1  ;NOW MAKE CONSOLE FREE.
13945         POP P,B         ;CAN'T PCLSR AFTER THIS POINT
13946         DPB B,[$TBECL,,TTYTBL(U)]
13947         POP P,TTSTSV+1(U)       ;STORE INTO TTY'S OLD OWNER
13948         POP P,TTSTSV(U) ;OLD TTY VARS FROM BEFORE FREEING IT
13949         POP P,B
13950         MOVEM B,TTSTSV+2(U)
13951         SKIPA A,(P)     ;TOP LEVEL JOB
13952 NDETAA:  HRRZ A,T
13953         SKIPGE T,TTYTBL(A)      ;SKIP IF HE HAS IT
13954          JRST NDETAA    ;NOW DO GUY HE GAVE IT TO
13955         CAIE A,(U)
13956          BUG            ;BUT.  BUT.  BUT.
13957         MOVSI B,%TBNOT+%TBDTY   ;TAKEN FROM --ME-- AND DOESN'T HAVE IT
13958         IORM B,TTYTBL(A)
13959         HLLZS TTYTBL(A)
13960         POP P,A         ;TOP LEVEL
13961         POP P,U         ;US
13962         HLRO B,UNAME(A)
13963         AOSE B          ;IF DETACHED TREE WAS LOGGED IN
13964          SOS SUSRS      ;ONE LESS CONSOLE CONTROLLED TREE
13965 NDETA5: MOVSI B,BUMRTL  ;IF REQUESTED, MARK TREE AS DUE TO DIE
13966         MOVE D,CTLBTS(U) ;IN AN HOUR.
13967         ANDCAM B,APRC(A)
13968         TRNE D,10
13969          IORM B,APRC(A)
13970         CONO PI,CLKOFF  ;PERFORM ACCOUNTING FOR THIS USER AS IF HE WERE LOGGING OUT.
13971         EXCH U,A
13972         PUSHJ P,LOGUPD
13973         EXCH U,A
13974         MOVE D,JNAME(A) ;IF TOP LEVEL JOB ...
13975         CAME D,[SIXBIT /HACTRN/]        ;IS A HACTRN,
13976          JRST NDETA3
13977 NDETA2: AOS D           ;AOS ITS NAME LEVEL UNTIL ...
13978         PUSHJ P,UJNAMU  ;IT IS UNIQUE
13979          JRST NDETA2    ;(UJNAMU TURNS OFF CLOCK)
13980         MOVEM D,JNAME(A)
13981 NDETA3: EXCH U,A
13982         PUSHJ P,DMNPLI  ;LOG BACK IN, NAME MAY HAVE CHANGED FROM HACTRN TO HACTRO
13983         EXCH U,A
13984         CONO PI,CLKON
13985         MOVEI Q,NDETA9  ;NOW SAY ALL JOBS IN TREE
13986         JRST IFPLUP     ;ARE DISOWNED
13987
13988 NDETA8: CAIE A,(U)      ;IF JOB ISN'T SELF, STOP IT
13989          JRST IFSTOP
13990         POPJ P,
13991 \f
13992 ;"ATTACH" SYSTEM CALL:
13993 ;1ST ARG - JOB SPEC -> OUR INFERIOR, OR TOP OF A DISOWNED TREE.
13994 ;2ND ARG - TTY SPEC (OF A TTY WHICH MUST BE FREE)
13995  ;2ND ARG ABSENT => USE OUR CONSOLE, AND GUN OUR TREE
13996 ;CONTROL BIT 400000 => CHANGE JOB'S NAME TO HACTRN (IF 2 ARGS)
13997 ;                 4 => START JOB AFTER ATTACHING (JUST LIKE DETACH)
13998
13999 ;CONNECTS THE SPECIFIED JOB TO THE SPECIFIED TTY, AS A CONSOLE CONTROLLED TREE.
14000 ;IF THE TTY IS OUR CONSOLE, WE ARE LOGGED OUT.
14001 ;IF THE JOB IS OUR INFERIOR, IT IS FIRST DISOWNED.
14002
14003 NATTAC: PUSHJ P,SWTL
14004             TREESW
14005         SOJE W,NATTAN
14006         EXCH A,B        ;2ND ARG => IT IS TTY SPEC, SO DECODE IT.
14007         JSP J,ATTYCI
14008         MOVE A,B
14009         MOVE B,I        ;AND PUT IT IN B.
14010         JRST NATTA6
14011
14012 NATTAN: SKIPL B,SUPPRO(U) ;NO 2ND ARG => WE MUST BE TOP LEVEL, SINCE WE'LL HAVE
14013          JRST OPNL40      ;TO LOG OUT. B GETS NEGATIVE.
14014 NATTA6: MOVE J,A
14015         JSP T,NCRUI2    ;DECODE 1ST ARG, GET USR IDX IN J.
14016          JFCL
14017         SKIPGE A,SUPPRO(J)
14018          JRST NATTA5    ;JOB SPEC'D MUST BE EITHER
14019         CAIE U,(A)      ;OUR INFERIOR, OR
14020          JRST OPNL31
14021         JRST NATTA7
14022
14023 NATTA5: SKIPL APRC(J)   ;THE TOP OF A DISOWNED TREE.
14024          JRST OPNL31
14025 ;NOW IF TTY IS OUR CONSOLE, B IS NEGATIVE; OTHERWISE, B HAS TTY #.
14026 NATTA7: PUSH P,CTLBTS(U)
14027         SETZM CTLBTS(U) ;DON'T GET FAKED OUT AT NATTA1, NATTA2, DSWNTY.
14028         PUSH P,J
14029         MOVE A,J
14030         MOVEI Q,NDETA8  ;STOP SPEC'D JOB AND ITS INFERIORS.
14031         PUSHJ P,IFPLUP
14032         JUMPL B,NATTAG
14033 NATTAM: CONO PI,TTYOFF
14034         SKIPL T,TTYSTA(B)       ;SEE IF TTY IS FREE
14035          JRST NATTAL
14036         MOVSI T,(SETZ)  ;IT IS, GRAB IT
14037         ANDCAM T,TTYSTA(B)      .SEE %TACFM
14038         ANDCAM T,TTYSTS(B)      .SEE %TSFRE
14039         CONO PI,TTYON
14040         JRST NATTA8     ;SINCE NO PCLSR POSSIBLE, DON'T BOTHER WITH A LOSSET OF THESE
14041
14042 NATTAL: HRRE Q,TTYSTS(B)
14043         CONO PI,TTYON
14044         SKIPG Q         ;IF TTY IS IN USE
14045         TLNE T,%TACTZ   ;OR BEING ^Z'ED, DEVICE NOT AVAIL
14046          JRST [ SUB P,[2,,2] ? JRST OPNL10 ]
14047         MOVSI T,%TACFM+%TACTZ   ;OTHERWISE JUST WAIT FOR CONSOLE FREE
14048         TDNN T,TTYSTA(B)        ;MESSAGE TO FINISH COMING OUT
14049          PUSHJ P,UFLS
14050         JRST NATTAM
14051 \f
14052 NATTAG: MOVE A,U        ;IF HACKING OUR CONSOLE, MUST STOP OUR WHOLE TREE
14053         MOVEI Q,NDETA8  ;(EXCEPT US, OF COURSE - NDETA8 CHECKS THAT).
14054         PUSHJ P,IFPLUP
14055         MOVEI B,(U)
14056 NATTA4: MOVE B,TTYTBL(B) ;FIND THE TTY'S NUMBER.
14057         TLNE B,%TBDTY
14058          JRST NATTAL    ;THIS TREE HAS NO TTY?
14059         JUMPL B,NATTA4  .SEE %TBNOT
14060         PUSHJ P,SDTTY   ;GET TTY BACK TO TOP OF TREE FOR AGBLT3 LATER.
14061          BUG
14062         HRRO B,TTYTBL(U)
14063 ;I BELIEVE THAT NOTHING CAN PCLSR BEYOND THIS POINT.
14064 ;RH OF B HAS TTY #; SIGN IS SET IF TTY IS OUR CONSOLE.
14065 NATTA8: AOS TTNTO(B)    ;KEEP DSWNTZ FROM HALTING (WILL UNDO THIS LATER)
14066         PUSH P,B        ;PUSH <CONSOLE-FLAG>,,<TTY #>
14067         HRRZ A,-1(P)    ;LEGALITY OF CALL FULLY CHECKED; CAN START ALTERING.
14068         SKIPGE APRC(A)  ;IF SPEC'D JOB IS OUR INFERIOR, DISOWN IT.
14069          JRST NATTA9
14070         MOVE B,TTYTBL(A)
14071         TLNE B,%TBDTY   ;IF THE INFERIOR HAS THE TTY, TAKE IT AWAY.
14072          JRST NATTAF
14073         PUSHJ P,SDTTY
14074          BUG
14075 NATTAF: HRRZ A,-1(P)
14076         MOVEI Q,DSWNTY  ;JUST LIKE .DISOWN, BUT KNOW JOBS ARE ALREADY STOPPED.
14077         PUSHJ P,IFPLUP
14078         PUSHJ P,NATTA1
14079 NATTA9: MOVEI Q,NATTA2
14080         MOVE A,U
14081         SKIPGE (P)      ;IF HACKING OUR CONSOLE, DISOWN OUR TREE SO IT IS FREE.
14082          PUSHJ P,IFPLUP
14083                         ;OUR TTY NOW IN INCONSISTENT STATE SINCE WE ARE DISOWNED
14084                         ;BUT TTY STILL BELONGS TO US. AGBLT3 FIXES THAT.
14085         MOVE B,(P)
14086         SOSGE TTNTO(B)
14087          BUG
14088         MOVE TT,-1(P)   ;NOW "RE-OWN" THE SPEC'D JOB
14089         MOVE A,UNAME(TT);NOT CHANGING ITS UNAME
14090         HRRZ J,B        ;TO THE DESIRED TTY, WITH APPRO. RESOURCE WORD.
14091         MOVEI D,USRRCE(B)
14092         TLO D,400000    ;TELLS UFN2A THE TREE SHOULD BECOME UN-DISOWNED.
14093         SETZ B,         ;NO INTERRUPT BIT NEEDED.
14094         SETOM DLSRCH    ;INHIBIT SCHEDULING (UFN2A UNDOES THIS)
14095         PUSH P,U
14096         PUSHJ P,UFN2A
14097         POP P,U
14098         HRRZ A,-1(P)
14099         SKIPA C,A
14100 NATTAH:  MOVE C,D       ;FIND THE JOB IN THE TREE BEING ATTACHED
14101         MOVE D,TTYTBL(C)
14102         TLNN D,%TBDTY   ;THAT IS SUPPOSED TO GET CONTROL OF THE TTY.
14103          JRST NATTAH
14104         SETOM SUPPRO(A) ;BUT DON'T LEAVE IT THINKING IT IS OUR INFERIOR.
14105         SKIPGE I,(P)
14106          JRST NATTAD
14107         HLRE B,UNAME(A) ;ATTACHING JOB TO FREE TTY:
14108         AOSE B  
14109          AOS SUSRS      ;THIS MAY MEAN 1 MORE LOGGED IN CONSOLE-CTL'ED TREE.
14110         CONO PI,TTYOFF
14111         PUSHJ P,TTYINI  ;INIT TTYOPT, ECHO AREA, TTYCOM, TTYSTA.
14112         MOVSI B,%TSFRE  ;NOW MAKE TTY'S TTYSTS HAPPY
14113         ANDCAM B,TTYSTS(I)
14114         MOVSI B,%TSCNS
14115         IORM B,TTYSTS(I)
14116         HRRM A,TTYSTS(I)
14117         CONO PI,TTYON#1 ;TTYCHN ON, BUT NOT CLKCHN.
14118         PUSH P,U
14119         PUSH P,I        ;IF THE JOB BEING ATTACHED IS LOGGED IN,
14120         MOVE U,-3(P)    ;PERFORM ACCOUNTING FOR IT.
14121         HLRO T,UNAME(U)
14122         AOSE T
14123          PUSHJ P,LOGUPD
14124         POP P,I
14125         POP P,U
14126 ;DROPS THROUGH
14127 \f;DROPS IN
14128         MOVE D,['HACTRN]
14129         PUSHJ P,UJNAMU
14130          JRST NATTAI
14131         MOVE B,-2(P)    ;SAVED CTLBTS(U) AT ENTRY
14132         TRNE B,400000
14133          MOVEM D,JNAME(A)
14134 NATTAI: MOVE B,-2(P)    ;CTLBTS
14135         MOVSI D,%USTSP  ;BUSRC
14136         TRNE B,4
14137          ANDCAM D,USTP(A)       ;START JOB BEING ATTACHED, IF REQUESTED TO
14138         PUSH P,U
14139         HRRZ U,C        ;GET USR IDX GIVING TTY TO IN U,
14140 IFN N11TYS,[
14141         HRRZ T,I        ;TTY # IN T FOR USTTV0
14142         PUSHJ P,USTTV0  ;GIVE THE JOB A BLINKER IF IT DESERVES ONE.
14143          JFCL
14144 ]
14145         POP P,A         ;USR IDX TAKING TTY FROM (BUT NOT REALLY TAKING). I AND U STILL SET.
14146         PUSHJ P,AGBLT4  ;MOVE HIS PER-JOB VARIABLES INTO THE TTY'S VARIABLES, ETC.
14147         JRST NATTAE     ;CLOCK IS NOW BACK ON.
14148
14149 NATTAD: CONO PI,CLKOFF
14150         MOVE J,JNAME(U) ;ATTACHING OUR TTY TO JOB:
14151         MOVEM J,JNAME(A) ;GIVE JOB OUR JNAME ALONG WITH OUR TTY.
14152         MOVE A,U
14153         HRRZ U,C
14154         PUSHJ P,AGBLT6  ;TRANSFER TTY TO HIM, SAVING OUR TTY STATE AND LOADING HIS.
14155 NATTAE: MOVE U,A
14156         POP P,B
14157         EXCH U,(P)      ;U := USER INDEX OF TOP OF TREE BEING ATTACHED
14158         MOVSI T,BUMRTL  ;SINCE TREE HAS BEEN ATTACHED, IT SHOULDN'T
14159         ANDCAM T,APRC(U) ;DIE AN HOUR AFTER IT WAS DETACHED.
14160         SKIPN STTYOP(U) ;RESTORE SAVED TTY OPTIONS, IF ANY
14161          JRST NATTAP
14162         LDB T,[170200,,STTYOP(U)]
14163         DPB T,[.BP (%TCRFS+%TCQRY),TTYCOM(I)]
14164         MOVE T,[%TOUSR,,%TPUSR]
14165         ANDCAM T,TTYOPT(I)
14166         AND T,STTYOP(U)
14167         IORM T,TTYOPT(I)
14168 NATTAP: HLRE T,UNAME(U)
14169         CONO PI,CLKOFF
14170         AOSE T
14171          PUSHJ P,DMNPLI ;LOG HIM IN
14172         CONO PI,CLKON
14173         POP P,U
14174         SUB P,[1,,1]    ;FLUSH SAVED CTLBTS
14175         PUSHJ P,LSWCLR  ;UNSTOP THE JOBS AND FREE TREESW
14176         JUMPGE B,POPJ1  ;RETURN IF WE DIDN'T GIVE AWAY OUR CONSOLE.
14177         SETOM TTYTBL(U) ;DON'T WANT ALOGOU TO TYPE LOGOUT MESSAGE.
14178         JRST ALOGOUT    ;LOG THIS JOB OUT.
14179 \f
14180 ;.CALL DISOWN
14181 ; RH OF ARG IS JOB SPEC, OF OUR INFERIOR.
14182 ; LH OF ARG XOR CONTROL BITS:
14183 ;  1.1 => RETAIN PRIORITY (DON'T SET APRC)
14184 ;  1.2 => USE SYSTEM RESOURCE
14185 ;  1.3 => CLEAR .USTP AFTER DISOWNING (THUS AVOIDING TIMING ERROR)
14186 ;  1.4 => SET BUMRTL SO THAT JOB WILL BE GUNNED IF IT IS STOPPED FOR A WHOLE HOUR
14187 ;          AND NOT REOWNED OR ATTACHED.
14188
14189 NDISOWN:HLRZ J,A
14190         XORM J,CTLBTS(U) ;XOR LH OF 1ST ARG INTO CTL BITS.
14191         HRRZ J,A
14192         JSP T,NCRUI2    ;DECODE JOB SPEC; DON'T SET DIELOK.
14193          JFCL
14194         CAIN J,-1
14195          JRST OPNL31    ;PDP6 NO GOOD.
14196         MOVEI R,IOCHNM(U)
14197         ADD R,A         ; R GETS ADDR OF IOCHNM WORD IF ARG WAS CHANNEL #,
14198         TRNE A,400000   ;GET S0 IF ARG WAS OTHER SORT OF JOB SPEC.
14199          SETZ R,
14200         HRRZ A,J
14201         HRRZ J,SUPPRO(A)
14202         CAME J,U
14203          JRST OPNL31    ;NO GOOD IF NOT OUR INFERIOR.
14204         JRST NDISO1     ;JOIN OLD-STYLE DISOWN
14205
14206 ;.DISOWN CH,    ;MAKES DIRECTLY INFERIOR PROCEDURE OPEN ON CHANNEL CH
14207                 ;THE TOP LEVEL JOB OF A DISOWNED JOB
14208
14209 ADISOWN:HRRZ B,(R)      ;PICK UP CH TYPE INDEX
14210         SKIPL CLSTB(B) .SEE %CLSU       ;SKIP IF AN INF. USER CHANNEL
14211          JRST IOCER7    ;OTHER TYPE, GIVE IOC ERROR
14212         HLRZ A,(R)      ;PICK UP INF.'S INDEX
14213         SETZM CTLBTS(U)
14214 NDISO1: PUSHJ P,SWTL
14215             TREESW
14216         SETZM STTYOP(A)
14217         MOVE B,TTYTBL(A)
14218         TLNE B,%TBDTY   ;SKIP IF TTY TAKEN AWAY
14219          JRST ADISO1
14220         PUSH P,R
14221         PUSH P,A        ;JOB TO BE DISOWNED HAS THE TTY: TAKE IT AWAY.
14222         PUSHJ P,SDTTY
14223          BUG
14224         POP P,A
14225         POP P,R
14226 ADISO1: MOVEI Q,DSWNTY
14227         PUSHJ P,IFPHAK  ;HACK INFERIORS
14228         CAME U,USER
14229          BUG
14230         PUSHJ P,NATTA1  ;FLUSH OUR POINTERS TO INFERIOR, AND SET FLAGS
14231         CAME U,USER
14232          BUG
14233         JRST LSWCJ1     ;UNSTOP HIS TREE AND FREE TREESW
14234
14235 ;FLUSH INFERIOR-JOB CHANNELS FROM JOB IN U TO JOB IN A
14236 ;CANNOT PCLSR BECAUSE JOB IS CURRENT OR STOPPED ALREADY
14237 NATTA1: MOVEI R,0       ;NO PROTECTED CHANNEL
14238         MOVEI D,%CLSU
14239         EXCH U,A
14240         PUSHJ P,ZUSES1  ;FLUSH POINTERS TO INFERIOR
14241         EXCH U,A
14242         SETOM SUPPRO(A) ;MARK AS TOP LEVEL
14243         MOVE W,CTLBTS(U)
14244         MOVSI TT,BUSRC  ;CLEAR .USTP IF REQUESTED
14245         TRNE W,4
14246          ANDCAM TT,USTP(A)
14247         MOVSI TT,BUMRTL
14248         TRNE W,10
14249          IORM TT,APRC(A)
14250         POPJ P,
14251
14252 DSWNTY: SKIPL TTYTBL(A)
14253          BUG            ;CHECKED AT HIGHER LEVEL, DATA INCONSISTENT
14254 NATTA2: TDZA T,T        ;DO SOS TTNTO OF CONSOLE TTY.
14255 NDETA9:  SETO T,        ;DON'T.
14256         PUSHJ P,CHSCAA  ;LOOK AT ALL CNHLS
14257             PUSHJ P,DSWNTZ      ;BLESSING CONSOLE TTY CHNLS
14258         MOVEI TT,SYSRCE ;SET RESOURCE POINTER TO SYSTEM OR DISOWNED
14259         MOVE W,CTLBTS(U);DEPENDING ON CTLBTS
14260         TRNN W,2
14261          MOVEI TT,USRRCE+NCT
14262         MOVEM TT,UTMPTR(A)
14263         MOVSI T,400000
14264         TRNN W,1
14265          IORM T,APRC(A) ;MARK AS DISOWNED
14266         POPJ P,
14267
14268 ;BLESS CONSOLE TTY CHANNELS. IF T NONZERO, DON'T SOS TTNTO.
14269 DSWNTZ: HLRZ B,(R)      ;GET LH OF IOCHNM WORD
14270         HRRZ J,(R)      ;GET DEV TYPE INDEX
14271         CAIL J,TYIDN    ;SKIP IF LESS THAN LEAST TTY INDEX
14272          CAILE J,TYOBN  ;SKIP UNLESS .LTEQ. HIGHEST
14273           POPJ P,       ;NOT A TTY CHANNEL
14274         TRZ B,#%TICNS#(.BM $TIIDX)
14275         TRZE B,%TICNS   ;SKIP IF NOT A CONSOLE TTY
14276          CAIN B,%TINON  ;DO NOTHING TO "DISOWNED" TTY CHNLS
14277           POPJ P,
14278         MOVEI J,%TINON  ;CHANGE OTHER TTY CHNLS TO DISOWNED
14279         DPB J,[$TIIDX,,(R)]     ;CHNLS.
14280         JUMPN T,CPOPJ   ;IN NDETAC, TTNTO ALREADY SETZM'D.
14281         SOSLE TTNTO(B)  ;DECREMENT OPEN COUNT
14282          POPJ P,
14283         BUG             ;SHOULD BE OPEN AT HIGHER LEVELS
14284
14285 ;ROUTINE TO SCAN ALL I/O CHANNEL AND I/O PDL SLOTS OF A PROCEDURE
14286 ;R 4.9=1 => REGULAR CHANNEL  4.9=0 => IOPUSHED CHANNEL
14287 CHSCAA: MOVEI R,IOCHNM(A)
14288 CHSCAN: HRLI R,-20
14289 CHSCA2: XCT @(P)
14290         AOBJN R,CHSCA2
14291         HRLI R,-<LUIOP/2>+400000
14292 CHSCA4: XCT @(P)
14293         ADD R,[1,,2]
14294         JUMPG R,CHSCA4
14295         JRST POPJ1
14296 \f;
14297 ;IFPHAK AND IFPLUP TAKE A USER INDEX IN A AND THE ADDRESS OF A ROUTINE
14298 ;       IN Q.  THEY CALL THE ROUTINE FOR THE PROCEDURE AND ALL OF ITS
14299 ;       INFERIORS BUT IFPHAK ALSO STOPS THE SPECIFIED PROCEDURE AND
14300 ;       ALL ITS INFERIORS STRINGING THEIR USTP'S INTO THE CURRENT USER'S
14301 ;       LSWPR.
14302 ;
14303 IFPHAK: PUSH P,U
14304         PUSH P,Q
14305         MOVE U,USER     ;MADE SURE YOU USE THE RIGHT LSWPR
14306         MOVEI Q,IFSTOP  ;SET UP TO STOP
14307         PUSHJ P,IFPLUP
14308         POP P,Q
14309         POP P,U
14310 IFPLUP: PUSH P,E        ;SAVE E
14311         PUSH P,H        ; " H
14312         SKIPA H,A
14313 IFPLU5: MOVE A,E        ;RECURSE
14314         PUSH P,H
14315         PUSH P,Q
14316         PUSHJ P,(Q)     ;CALL ROUTINE
14317         POP P,Q
14318         POP P,H
14319         MOVEI E,LUBLK*2 ;INITIALIZE TO INDEX OF JOB AFTER CORE JOB
14320 IFPLU2: SKIPN UNAME(E)
14321         JRST IFPLU3
14322         HRRZ T,SUPPRO(E)
14323         CAIN T,(A)
14324         JRST IFPLU5
14325 IFPLU3: ADDI E,LUBLK    ;STEP TO NEXT VAR BLOCK
14326         CAMGE E,USRHI   ;SKIP IF ALL EXAMINED
14327         JRST IFPLU2     ;NOT ALL, CONTINUE
14328         CAME H,A        ;ALL, SKIP IF BACK TO TOP LEVEL
14329         JRST IFPLU4     ;NOT AT TOP LEVEL, POP UP
14330         POP P,H         ;RESTORE H
14331         POP P,E         ; " E
14332         POPJ P,         ;RETURN FROM CALL TO IFPLUP
14333
14334 IFPLU4: MOVE E,A        ;POP
14335         HRRZ A,SUPPRO(A)        ;UP
14336         JRST IFPLU3     ;AND CONTINE
14337
14338 IFSTOP: PUSHJ P,RPCLSR  ;STOP ROUTINE WHOSE INDEX IS IN A
14339         HRRZ T,USTP(A)
14340         SOJE T,IFSTP1
14341         SKIPE LSWB0+1(A)
14342         JRST UPCLSR     ;HAVE ALREADY HACKED THIS GUY
14343 IFSTP1: MOVEI T,USTP(A) ;GET LOC OF USTP (WAS AOSED BY RPCLSR)
14344         MOVEI H,LSWB0(A)        ;GET LOC OF A LOCKED SWITCH BLOCK OF PROC STOPPED
14345         MOVEM T,(H)     ;SET WD1
14346         PUSH P,U
14347         HRRZ T,U
14348         IDIVI T,LUBLK
14349         POP P,U
14350         HRL T,LSWPR(U)
14351         IORI T,603000   ;SOS WHEN UNLOCKED
14352         MOVSM T,1(H)
14353         MOVEM H,LSWPR(U)        ;ADD TO LOCKED SWITCH LIST OF USER
14354         POPJ P,
14355 \f
14356 UBLAM:  SKIPL APRC(U)   ;SKIP IF DISOWNED
14357          PUSHJ P,SDTTY  ;GET TTY UP TO THIS LEVEL
14358           JFCL
14359 UBLAST: PUSHJ P,IODCL   ;CLOSE IO DEVICES ETC
14360 UBLST2: SETZ B,
14361         PUSH P,U        ;DO NOT USE THIS ROUTINE FOR CORING UP.
14362         HRRZ Q,U
14363 IFE SWPWSP,[
14364         CAME Q,BUSR
14365          JRST UBLST4
14366         SETOM BUSR      ;SWAP-BLOCKED NO MORE
14367         SOS NUSWB
14368         MOVSI TT,(SETZ)
14369         ANDCAM TT,USWSCD(U)
14370 ];SWPWSP
14371 UBLST4: MOVE U,USER
14372         PUSHJ P,ACRF1   ;CORE DOWN TO NUM OF BLOCKS IN B
14373          BUG
14374         MOVE U,USER     ;;CHECK FOR ALLEGED BUG SOMEPLACE IN ACRF1
14375         SKIPL CORRQ(U)  ;
14376          BUG            ;;NOT SUPPOSED TO RETURN UNTIL CORE REQUEST SATISFIED
14377         POP P,U
14378         SKIPE NMPGS(U)  ;
14379          BUG            ;;THUS GUY'S CORE SHOULD BE GONE BY NOW
14380         POPJ P,
14381
14382
14383 AEOFC:  UMOVE B,(J)
14384         LDB B,[400,,B]  ;OPER 50
14385         ADDI B,IOCHNM(U)
14386         MOVE A,(B)
14387         MOVE A,CLSTB(A)
14388         HLR A,(B)
14389 IFN NUNITS,     TLNE A,%CLSDI
14390 .ALSO           SKIPA A,UTEOF(A)
14391         MOVEI A,EOFCH
14392         JRST APTUAJ
14393
14394 ;OPER TO REQUEST OR FLUSH RUNNING IN IOT USER MODE
14395 AIOTLS: MOVSI A,400000
14396         MOVSI B,%PCUIO
14397         XCTR XR,[SKIPGE (J)]
14398          JRST AIOTL1    ;JUMP IF WANT TO ENTER IOTLSR MODE
14399         ANDCAM A,IOTLSR(U)
14400         ANDCAM B,UUOH
14401         POPJ P,
14402
14403 AIOTL1: SKIPGE IOTLSR(U)
14404          JRST AIOTL2    ;ALREADY IN IOTLSR, JUST TURN THE BIT ON AGAIN FOR HIM
14405         BUG INFO,SIXBIT,UNAME(U),SIXBIT,JNAME(U),[IOTLSR]
14406         MOVEI T,SCRMSG  ;WAIT FOR IT TO BE PRINTED (HA HA WHAT ABOUT BUFFERING?)
14407         TDNE T,SUPCOR
14408          PUSHJ P,UFLS
14409         IORM A,IOTLSR(U)
14410 AIOTL2: IORM B,UUOH
14411         JRST CLKONJ
14412 \f
14413 SUBTTL FILENAME TRANSLATION
14414
14415 ;ROUTINE TO TRANSLATE A FILENAME.
14416 ;WANTS DEV, FN1, FN2, SNAME IN A, B, C, D RESP. LEFT-JUST.
14417 ;WANTS MODE IN RH OF E.
14418 ;RETURNS TRANSLATED NAMES IN SAME PLACE.
14419 TRAN:   SKIPN D ;MAYBE DEFAULT THE SNAME.
14420 TRAN6:  MOVE D,USYSNM(U)
14421         MOVEM B,EPDLT1(U)
14422         MOVEM C,EPDLT2(U)
14423         MOVEM D,EPDLT3(U)
14424         MOVEM A,EPDLT4(U)
14425         SKIPN TRNCNT    ;IF NO TRANSL. ENTRIES IN USE,
14426         JRST POPJ1      ;SHORT CUT.
14427         PUSHJ P,TRANRF  ;GET READ ACCESS TO TRANSL LISTS.
14428         LDB I,[100,,E]  ;GET INPUT/OUTPUT BIT.
14429         MOVEI H,10      ;MAX. NUM. TRANSLS ALLOWED.
14430 TRAN0:  HRROI Q,(U)     ;1ST TRY THIS JOB'S TRNLST.
14431         MOVE J,TRNLST(U)
14432         JRST TRAN5
14433 TRAN1:  SKIPGE Q,SUPPRO(Q)      ;MOVE UP TREE TO TRNLS1.
14434         SETZ Q,         ;AFTER TOP OF TREE, USE SYS.
14435 TRAN2:  MOVE J,TRNLS1(Q)        ;USE THIS GUY'S TRNLS1.
14436         MOVEI Q,(Q)     ;INDICATE THAT FACT IN SIGN.
14437         JRST TRAN5
14438 TRAN3:  CAME B,TRANI1(J)        ;ENTRY'S FN1 MATCHES
14439         SKIPN TRANI1(J) ;OR IS NULL?
14440         SKIPA TT,TRANI2(J)      ;YES, GET FN2.
14441         JRST TRAN4      ;NO, TRY NEXT ENTRY.
14442         CAME TT,C       ;FN2 MTCHES OR NULL.
14443         JUMPN TT,TRAN4
14444         CAME D,TRANIS(J)        ;SNAME ?
14445         SKIPN TRANIS(J)
14446         SKIPA TT,TRANID(J)      ;YES, GET DEV.
14447         JRST TRAN4
14448         CAME A,TT
14449         JUMPN TT,TRAN4  ;TEST DEV.
14450         HLRZ TT,TRANLK(J)       ;GET ENTRY'S MODE BITS.
14451         TRNN TT,1(I)    ;TRANSLATE OUR MODE?
14452         JRST TRAN4      ;NO.
14453         MOVEM B,EPDLT1(U)
14454         MOVEM C,EPDLT2(U)
14455         MOVEM D,EPDLT3(U)
14456         MOVEM A,EPDLT4(U)
14457 IRPS X,,OD O1 O2 OS
14458         SKIPE TRAN!X(J)
14459         MOVE A+.IRPCN,TRAN!X(J)
14460 TERMIN                  ;REPLACE NAMES FROM ENTRY.
14461         TRNE TT,400000  ;ATOMIC?
14462         JRST TRANX3     ;YES, EXIT.
14463         SOJG H,TRAN0    ;ELSE RETRANSL.
14464         JRST TRANX2     ;IF TOO MANY TRANSL., DON'T SKIP.
14465
14466 TRAN4:  HRRE J,TRANLK(J)        ;CDR DOWN LIST.
14467 TRAN5:  JUMPGE J,TRAN3  ;TRY NEXT UNLESS AT END.
14468         JUMPL Q,TRAN2   ;IF DID TRNLST, DO SAME JOB'S TRNLS1.
14469         JUMPN Q,TRAN1   ;ELSE DO SUPPRO'S TRNLS1.
14470 TRANX3: AOS (P)         ;EXIT IF DID SYS.
14471 TRANX2: SOS TRNREF      ;NO LONGER USING TRANSL. LISTS.
14472         POPJ P,
14473
14474 TRANRF: AOS TRNREF      ;SAY USING TRANSL. LISTS.
14475         SKIPGE TRANSW
14476         POPJ P,         ;OK IF NOT BEING CHANGED.
14477         SOS TRNREF      ;NOT REFERENCING AFTER ALL.
14478         SKIPL TRANSW    ;WAIT TILL FREE.
14479         PUSHJ P,UFLS
14480         JRST TRANRF     ;TRY AGAIN.
14481 \f;TRANS SYSTEM CALL.
14482 NTRNS:  JSP T,DEFARG    ;DEFAULT 5 ARGS TO 0.
14483         5
14484         XOR E,CTLBTS(U) ;XOR CTL BITS WITH ARG S
14485         PUSHJ P,TRAN    ;TRANSLATE NAME.
14486          JRST OPNL3             ;FAIL IF TOO MANY TRANSL.
14487         JRST POPJ1      ;ELSE GIVE BACK TRANSL'D NAMES.
14488
14489
14490 DEFARG: CAML W,(T)      ;IF NOT ALL SPEC'D,
14491         JRST 1(T)
14492         SETZM A(W)      ;DEFAULT ONE AND RETRY.
14493         AOJA W,DEFARG
14494
14495 ;LOCK TRANSW, AND SET UP 1ST ARG FOR NTRNAD, NTRNDL, NTRNCL.
14496 ;RH OF A HAS JOB SPEC; CONTROL BIT ARGS XOR'D INTO LH.
14497 ;THE 4.8 BIT, IF SET, INDICATES TRNLS1 RATHER THAN TRNLST.
14498 ;OTHER LH BITS IGNORED,, NOT CHANGED BY NTRNUI.
14499 ;ON RETURN, A'S LH IS UNCHANGED, RH IS SUCH THAT
14500 ;   TRANLK(A) IS THE ADDR OF THE SPECIFIED TRNLS VAR.
14501 NTRNUI: PUSHJ P,SWTL
14502          TRANSW
14503         TSC A,CTLBTS(U)
14504         MOVEI J,(A)
14505         JSP T,NCRUI2    ;DECODE THE JOB-SPEC.
14506          JRST NTRNU1    ;JOB GUARANTEED WRITEABLE.
14507         JUMPE J,NTRNU1  ;ALLOW JOBS TO MUNG THE SYSTEM TRANSLATION LIST.
14508         JSP T,NCORWR    ;ELSE CHECK.
14509          JRST OPNL31    ;NOT WRITEABLE.
14510 NTRNU1: CAIN J,-1
14511          JRST OPNL34    ;PDP6??
14512         HRRI A,TRNLST-TRANLK(J)
14513         TLNE A,200000   ;4.8 BIT SAYS WHICH TRNLS TO USE.
14514         ADDI A,TRNLS1-TRNLST
14515         JRST (Q)
14516
14517 ;GET UP TO 4 ARGS INTO D ... D+3, FROM AOBJN PTR IN B.
14518 NTRNGA: MOVSI H,-4      ;UP TO 4 ARGS.
14519         JUMPGE B,NTRNG3
14520 NTRNG0: UMOVE J,(B)
14521         JUMPGE W,NTRNG2 ;W IS -1 FOR .TRANA, .TRAND;
14522         TRNN H,-1       ;IN THAT CASE LEFT-JUST. DEV. (1ST ARG)
14523         HRLZI J,(J)
14524 NTRNG2: CAMN J,[SIXBIT/*/]
14525         MOVEI J,0       ;REPLACE * BY BLANK.
14526         MOVEM J,D(H)    ;STORE AWAY.
14527         AOBJP H,CPOPJ   ;DONE AFTER 4TH ARG.
14528         AOBJN B,NTRNG0  ;ELSE GET NEXT.
14529 NTRNG3: SETZM D(H)      ;ZERO REMAINING ARGS.
14530         AOBJN H,NTRNG3
14531         POPJ P,
14532 \f;TRANEX CALL  --  READ IN A JOB'S TRANSL LIST.
14533 ;1ST ARG RH - JOB SPEC. BIT 4.8 - IF SET, TRNLS1 NOT TRNLST.
14534 ;2ND ARG AOBJN -> PLACE TO STORE LIST INTO.
14535 ;UPDATED AOBJN PTR IS OUTPUT ARG.
14536 ;SKIPS IF ENTIRE LIST FIT IN BUFFER.
14537 ;EACH ENTRY TAKES 9 WDS OF SPACE: MODE,, IN 1ST,
14538 ;INPUT DEV, FN1, FN2, SNAME; THEN OUTPUT DEV, FN1, FN2, SNAME.
14539 NTRNEX: PUSHJ P,TRANRF  ;GET READ ACCESS TO TRANSL LISTS.
14540         PUSHJ P,SOSSET  ;RELINQUISH IF BLOCKED.
14541         TRNREF
14542         TSC A,CTLBTS(U)
14543         MOVEI J,(A)
14544         JSP T,NCRUI2    ;DECODE THE JOB SPEC.
14545          JFCL           ;NOT TRYING TO WRITE.
14546         HRRI A,TRNLST-TRANLK(J)
14547         TLNE A,200000   ;MAKE TRANLK(A) BE TRNLS VAR.
14548         ADDI A,TRNLS1-TRNLST
14549         SUB B,[1,,1]    ;SINCE WE AOBJ BEFORE ACTING.
14550 NTRNE1: HRRE T,TRANLK(A)        ;AT END -> RETURN SKIPPING.
14551         JUMPL T,NTRNE8
14552         HLLZ D,TRANLK(T)        ;RETURN LH ONLY OF 1ST WD.
14553         TLOA T,-9
14554 NTRNE2: MOVE D,TRANLK(T)        ;ALL OF OTHER 8 WDS.
14555         AOBJP B,[       PUSHJ P,OPNL37
14556                         JRST NTRNE9]
14557         ;FAIL IF NO ROOM.
14558         UMOVEM D,(B)
14559         ADDI T,SIOMT-1
14560         AOBJN T,NTRNE2  ;STORE ALL 9.
14561         MOVEI A,-9*SIOMT(T)     ;GO TO NEXT.
14562         JRST NTRNE1
14563
14564 NTRNE8: AOS (P)
14565         AOBJP B,.+1     ;COMPENSATE FOR SUB .
14566         PUSHJ P,LSWPOP  ;RELEASE READ ACCESS.
14567 NTRNE9: MOVE A,B
14568         JRST SYSCPT     ;RETURN AOBJN PTR.
14569 \f;TRANDL CALL -- DELETE ENTRY FROM TRANSL LIST.
14570 ;1ST ARG RH JOB SPEC. OF JOB WHICH IS OK TO MODIFY.
14571 ;1ST ARG LH MODE BITS AS FOR .TRANAD, ALSO 4.8 BIT SAYS TRNLS1
14572 ;       (SPEC'D JOB AND INFS, RATHER THAN JUST SPEC'D JOB)
14573 ;2ND ARG AOBJN -> INPUT DEV, FN1, FN2, SNAME. (ONLY DEV NEC.).
14574 ;SKIPS IF SOMETHING WAS DELETED.
14575 NTRNDL: JSP Q,NTRNUI    ;PROCESS 1ST ARG., LOCK TRANSW.
14576 NTRND:  PUSHJ P,NTRNDA  ;ACTUALLY DELETE.
14577         JRST OPNL4      ;NOTHING TO DELETE => FILE NOT FOUND
14578         JRST LSWPJ1     ;SKIP IF NTRNDA DID.
14579
14580 NTRNDA: TLZ A,-1#400003
14581         PUSHJ P,NTRNGA  ;ELSE GET INPUT NAMES.
14582         SKIPGE TRANLK(A)
14583         POPJ P,
14584         HRRZS (P)       ;CLEAR SKIP FLAG.
14585         SKIPA T,A
14586 NTRND2: MOVEI T,(H)     ;CDR DOWN BOTH PTRS.
14587 NTRND0: HRRE H,TRANLK(T)        ;LOOK AT NEXT ENTRY.
14588         JUMPL H,NTRNDX  ;EXIT IF END.
14589         CAMN D,TRANID(H)        ;ALL 4 INPUT NAMES MUST MATCH.
14590         CAME E,TRANI1(H)
14591         JRST NTRND2     ;ELSE NOT TO BE DELETED.
14592         CAMN TT,TRANI2(H)
14593         CAME I,TRANIS(H)
14594         JRST NTRND2
14595         HLLZ R,A        ;GET MODE FROM ARG.
14596         TLZ R,400000    ;DONT CLOBBER ATOM BIT
14597         ANDCA R,TRANLK(H)       ;TURN OFF IN MODE FROM ENTRY.
14598         CAME R,TRANLK(H)        ;IF DELETED ONE, CALL WILL SKIP.
14599         HRROS (P)
14600         MOVEM R,TRANLK(H)
14601         TLNE R,3                ;IF NEITHER DIRECTION LEFT, SPLICE OUT.
14602         JRST NTRND2
14603         SKIPE TRNREF    ;WAIT TILL NOONE READING TRANSL LISTS.
14604         PUSHJ P,UFLS
14605         SOS TRNCNT      ;ONE LESS ENTRY IN USE.
14606         HRRZ R,TRANFL   ;MAKE LINK -> CURRENT FREE LIST.
14607         EXCH R,TRANLK(H)
14608         HRRM R,TRANLK(T)        ;REST OF TRNLS INTO PREDECESSOR'S LINK.
14609         HRRZM H,TRANFL  ;ADD THIS ONE TO FREE LIST.
14610         JRST NTRND0
14611
14612 NTRNDX: HRRES TRANLK(A) ;IN CASE DELETED 1ST ENTRY.
14613         SKIPGE (P)
14614         AOS (P)         ;SKIP IF SET FLAG.
14615         POPJ P,
14616 \f;TRANAD CALL. -- ADD AN ENTRY TO A TRANSL LIST.
14617 ;1ST 2 ARGS AS FOR TRANDL.
14618 ;3RD ARG LIKE 2ND BUT GIVES OUTPUT NAMES.
14619 ;SKIPS UNLESS ALL ENTRIES WERE IN USE.
14620 NTRNAD: JSP Q,NTRNUI
14621 NTRNA:  TLNN A,3        ;IF RELLY NOTHING WOULD BE TRANSL'D,
14622          JRST LSWPJ1    ;DON'T BOTHER ADDING..
14623         PUSHJ P,NTRNDA  ;DELETE ANY EXISTING TRANSL. FOR THESE INPUT NAMES.
14624         JFCL            ;IF WERE NONE.
14625         SKIPGE T,TRANFL
14626         JRST OPNL5      ;NO FREE ENTRIES - DIRECTORY FULL.
14627         AOS TRNCNT      ;1 MORE ENTRY IN USE.
14628 IRPS X,,ID I1 I2 IS
14629         MOVEM D+.IRPCN,TRAN!X(T)
14630 TERMIN                  ;PUT INPUT NAMES INTO ENTRY.
14631         MOVE B,C
14632         PUSHJ P,NTRNGA  ;GET OUTPUT NAMES.
14633 IRPS X,,OD O1 O2 OS
14634         MOVEM D+.IRPCN,TRAN!X(T)
14635 TERMIN                  ;STORE OUTPUT NAMES.
14636         MOVE H,TRANLK(A)        ;PUT CURRENT TRNLS INTO LINK.
14637         EXCH H,TRANLK(T)
14638         HRREM H,TRANFL  ;STORE BACK REST OF FREE LIST.
14639         MOVEM T,TRANLK(A)       ;TRNLS NOW STARTS WITH THSI ONE.
14640         HLLM A,TRANLK(T)        ;STORE MODE BITS.
14641         JRST LSWPJ1
14642 \f;TRANCL CALL -- RESET A ONE OR BOTH TRANSL LISTS FOR A JOB.
14643 ;1ST ARG RH HAS JOB SPEC OF MODIFYABLE JOB.
14644 ; BIT 4.8 CLEAR TRNLS1 VAR. (TRANSL FOR THIS JOB & INFS).
14645 ; BIT 4.7 CLEAR TRNLST VAR. (TRANSL FOR THIS JOB ONLY).
14646 ; ALWAYS SKIPS IF VALID.
14647 NTRNCL: JSP Q,NTRNUI    ;RH(A) -> TRNLST OR TRNLS1 VAR.
14648         TLNE A,200000
14649         SUBI A,TRNLS1-TRNLST    ;MAKE -> TRNLST VAR.
14650         SUBI A,TRNLST-TRANLK
14651         JRST NTRNC4
14652
14653 NTRNCA: SUBI A,TRNLST-TRANLK    ;MAKE HOLD USR IDX.
14654 NTRNC:  PUSHJ P,SWTL    ;GET WRITE ACCESS.
14655         TRANSW
14656 NTRNC4: AOS (P)
14657         SKIPE TRNREF    ;WAIT FOR READ REFS TO FINISH.
14658         PUSHJ P,UFLS
14659         TLNN A,100000   ;IF 4.7, HANDLE TRNLST.
14660         JRST NTRNC0
14661         HRRE T,TRNLST(A)
14662         SETOM TRNLST(A) ;SET LIST TO NIL.
14663         JUMPGE T,NTRNC1 ;IF WASN'T NIL, FREE ENTRIES ON IT.
14664 NTRNC0: TLZN A,200000   ;MAYBE HANDLE TRNLS1.
14665         JRST LSWPOP
14666         HRRE T,TRNLS1(A)
14667         SETOM TRNLS1(A)
14668         JUMPL T,LSWPOP  ;NOTHING TO DO IF ALREADY NIL.
14669 NTRNC1: MOVEI C,(T)     ;SAVE START OF LIST.
14670 NTRNC2: SOS TRNCNT      ;UPDATE NUM ENTRIES IN USE.
14671         HRRES H,TRANLK(T)
14672         JUMPL H,NTRNC3  ;AT END, SPLICE INTO FREELIST.
14673         MOVEI T,(H)     ;ELSE CDR DOWN.
14674         JRST NTRNC2
14675 NTRNC3: EXCH C,TRANFL
14676         HRRZM C,TRANLK(T)
14677         JRST NTRNC0     ;MAYBE CONSIDER THE OTHER LIST.
14678 \f;.TRANA, .TRAND CALLS.
14679 ATRANA: UMOVE E,(B)
14680         JSP T,ATRNDT    ;SET UP ARGS FOR NTRNA .
14681         PUSHJ P,SWTL    ;GET WRITE ACCESS.
14682         TRANSW
14683         JRST NTRNA
14684
14685 ATRNDL:
14686 ATRAND: XCTR XR,[SKIPN E,(B)]
14687         JRST ATRND0     ;ZERO UNAME -> TRANCL .
14688         JSP T,ATRNDT    ;SET UP ARGS.
14689         PUSHJ P,SWTL    ;GET WRITE ACCESS.
14690         TRANSW
14691         JRST NTRND
14692
14693 ATRND0: JSP T,ATRNDT
14694         TLO A,300000    ;SAY CLEAR BOTH LISTS.
14695         CAMN D,[SIXBIT/*/]
14696         SUBI A,TRNLS1-TRNLST    ;NAKE SURE -> TRNLST VAR.
14697         JRST NTRNCA
14698
14699 ATRNDT: MOVE C,JNAME(U)
14700         MOVEM C,ATRNJN  ;WHO THE HELL'S USING THESE?
14701         CAME E,UNAME(U) ;UNAME MUST BE 0 OR THSI JOB'S.
14702         JUMPN E,CPOPJ   ;ELSE MAKE UUO FAIL.
14703         MOVNI W,1       ;SIGNAL TO NTRNGA.
14704         MOVEI C,5(B)    ;SET UP 2 AOBJN PTRS
14705         MOVEI B,2(B)
14706         HRLI C,-3       ;-> INPUT NAMES (B), OUTPUT NAMES (C).
14707         HRLI B,-3
14708         XCTR XR,[HLL A,(B)]     ;GET MODE BITS.
14709         UMOVE D,-1(B)
14710         JUMPE D,CPOPJ   ;JNAME MUSTN'T BE 0.
14711         CAME D,[SIXBIT/*/]      ;IF *, USE THIS JOB'S TRNLS1.
14712         JRST ATRND2
14713         HRRI A,TRNLS1-TRANLK(U)
14714         JRST (T)
14715
14716 ATRND2: MOVEI H,0       ;ELSE FIND JOB WITH THAT JNAME.
14717         MOVE E,UNAME(U) ;THIS JOB'S UNAME.
14718 ATRND1: CAMN E,UNAME(H)
14719         CAME D,JNAME(H)
14720         JRST ATRND3     ;NOT THE ONE WE'RE LOOKING FOR.
14721         HRRE E,SUPPRO(H)
14722         CAIE U,(E)      ;IS THIS OUR INF.
14723         CAIN U,(H)      ;IS IT THE CURRENT JOB?
14724         CAIA
14725         POPJ P,         ;NO, CAN'T SET ITS TRANSL LIST.
14726         HRRI A,TRNLST-TRANLK(H)
14727         JRST (T)        ;OK, SET ITS TRNLST VAR.
14728 ATRND3: ADDI H,LUBLK
14729         CAMGE H,USRHI   ;LOOK AT ALL JOBS.
14730         JRST ATRND1
14731         POPJ P,         ;CAN'D TRANAD NON EX JOB.
14732 \f
14733 SUBTTL JOB, BOJ DEVICE ROUTINES
14734
14735 EBLK
14736 JBMN==10        ;MAXIMUM NUMBER OF JOBS ON JOB DEVICE
14737
14738 JBCUI:  REPEAT JBMN,-1  ;-1 => CHNL FREE, ELSE (IF JBCG POSITIVE) CREATOR'S USR IDX.
14739 JBCG:   BLOCK JBMN      ;-1 IF CREATOR GONE AWAY
14740 JBWST:  REPEAT JBMN,SNJOB       ;CREATED JOB'S WAIT STATUS (CREATED JOB=HANDLER JOB)
14741 %JB==1,,525252
14742 %JBWIN==400000  ;4.9 => CREATED JOB HAS DONE A SUCCESSFUL JOBRET
14743 %JBREU==200000  ;4.8 => JOB CLOSED AND MADE ITSELF AVAILABLE FOR REUSE
14744 %JBVAL==020000  ;4.5 => VALID BIT (CREATOR CAME IN, NO JOBRET YET)
14745 %JBSTR==010000  ;4.4 => STORED BIT (CREATOR CAME IN, NO JOBGET YET)
14746 %JBUNH==004000  ;4.3 => BOJ BLK UNHANG BIT
14747 %JBSIO==001000  ;4.1 => IF DOING AN IOT, THIS BITS SAYS ITS REALLY A SIOT
14748 %JBLOS==000400  ;3.9 => CREATED JOB WAS CLOSED AND KNOWS IT, SO DON'T REUSE
14749         ;1.1-2.9 => LAST STATUS SET BY BOJ
14750
14751 JBDEV:  BLOCK JBMN      ;DEVICE NAME, USER-SETTABLE (MOSTLY FOR PEEK AND WHO LINES)
14752 JBFN1:  BLOCK JBMN      ;FN1
14753 JBFN2:  BLOCK JBMN      ;FN2
14754 JBSYS:  BLOCK JBMN      ;SYSNAME
14755 JBOPNM: BLOCK JBMN      ;OPEN MODE
14756 JBFNP:  BLOCK JBMN      ;BP TO ASCIZ FILENAME STRING IN USER ADDRESS SPACE (OR 0 IF NONE).
14757 JBCJUI: BLOCK JBMN      ;RH = CREATED JOB'S USER INDEX.
14758                         ;LH = -1 IFF CREATED JOB GOING AWAY.  JOB MUST EXIST
14759                         ;SINCE WHEN IT DIES IT FLUSHES THE JOB CHANNEL
14760                         ;AND ITS CREATOR'S CHANNELS.
14761 JBSTS:  BLOCK JBMN      ;STATUS OF JOB-BOJ INTERACTIONS
14762 ;4.9=1 => IMAGE =0 => ASCII
14763 ;4.8=1 => BLOCK =0 => UNIT
14764 ;4.7=1 => WRITE =0 => READ
14765 ;4.6-4.3 => NUMBER OF TIMES TO SKIP
14766 ;4.2-3.6 => OPEN LOSS
14767 ;3.5-3.2 => # OF ARGS ON LAST .CALL
14768 ;1.4 => SYSTEM CALL OTHER THAN THOSE BELOW.
14769 ;1.3-1.1 => SYSTEM CALL
14770         ;0      OPEN
14771         ;1      IOT OR SIOT
14772         ;2      MLINK
14773         ;3      RESET
14774         ;4      RCHST
14775         ;5      ACCESS
14776         ;6      FDELE (DELETE OR RENAME)
14777         ;7      FDELE (RENAME WHILE OPEN)
14778
14779 JBST2:  BLOCK JBMN      ;SECOND WORD OF JOBGET INFO
14780                         ;FOR UNIT IOT, 1
14781                         ;FOR SIOT, THE BYTE COUNT
14782                         ;FOR BLOCK IOT, THE BLOCK POINTER
14783                         ;NEW FN1 FOR RENAME, MLINK.
14784 JBOFN1: BLOCK JBMN      ;FN1 BEFORE LAST TRANS
14785 JBOFN2: BLOCK JBMN      ;FN2 "" ""
14786 JBOSYN: BLOCK JBMN      ;SYSNAM ""
14787 JBODEV: BLOCK JBMN      ;DEV  " "
14788 JBNFN2: BLOCK JBMN      ;NEW FN2 FOR FDELE.
14789 JBAC7:  BLOCK JBMN      ;7TH ARG TO .CALL, NEW SNAME FOR MLINK.
14790 JBAC10: BLOCK JBMN      ;TABLE FOR .CALL ARG 10, FIRST BP ARG TO SOPEN/RENAME/MLINK/DELETE.
14791 JBAC11: BLOCK JBMN      ;TABLE FOR .CALL ARG 11, SECOND BP ARG TO RENAME, MLINK OR RENMWO.
14792
14793 JBACTB: JBST2(H)        ;TABLE OF POINTERS TO .CALL ARG TABLES
14794         JBOFN1(H)
14795         JBOFN2(H)
14796         JBOSYN(H)
14797         JBODEV(H)
14798         JBNFN2(H)
14799         JBAC7(H)
14800         JBAC10(H)
14801         JBAC11(H)
14802
14803 JBIOCJ: BLOCK JBMN      ;IO CHNL ERROR WORD.  4.9 => IOCER ON NEXT JOB IOT
14804                         ;RH = IOCER TYPE
14805
14806 JBSW:   -1              ;LOCK ON ASSIGNMENT OF INDEX IN ABOVE TABLES
14807         0
14808 BBLK
14809 \f
14810 ;OPEN ON BOJ: DEVICE
14811
14812 ;3.5 = 1 => UNHANG ON BLK IOT AFTER EACH XFER OF MAXIMAL SIZE
14813 BOJO:   JUMPN W,OPNL12  ;NO SUCH MODE
14814         SKIPGE E,JBI(U) ;JOB CHANNEL INDEX
14815          JRST [ MOVE E,OPTION(U) ;IF THIS JOB ISN'T A JOB DEVICE,
14816                 TLNN E,%OPOJB   ;IF IT'S EXPECTING TO BE AN OJB DEVICE, OK.
14817                  JRST OPNL10    ;OTHERWISE IT CAN'T WIN.
14818                 SKIPGE JBI(U)   ;IF IT CAN WIN, WAIT TILL IT HAS.
14819                  PUSHJ P,UFLS
14820                 JRST BOJO]      ;THEN TRY AGAIN.
14821         CAIL E,JBMN
14822          BUG            ;JOB CHANNEL INDEX TOO BIG
14823         CAME U,JBCJUI(E)
14824          BUG
14825         HRLZ A,E
14826         HLRZS C
14827         MOVSI TT,%JBUNH
14828         TRNE C,20
14829          IORM TT,JBWST(E)
14830         JSP Q,OPSLC7
14831             BDUAI,,BDUAO
14832             BDBI,,BDBO
14833             BDUII,,BDUIO
14834             BDBI,,BDBO
14835 \f
14836 ;OPEN ON JOB: DEVICE
14837 ;MODE BITS:
14838 ;3.1-3.3 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
14839 ;A,B HAVE FILENAMES, RH(C) HAS DEVICE (JOB OR OJB)
14840 ;RH(D) AND LH(C) BOTH HAVE OPEN-MODE.
14841
14842 JOBO:   PUSHJ P,FLDRCK
14843          JRST JOBO3
14844           JRST OPNL11   ;ILLEGAL FILE NAME
14845 JOBO3:  CAMN A,[SIXBIT /M.F.D./]
14846          CAME B,[SIXBIT /(FILE)/]
14847           JRST JOBO2
14848         JRST OPNL11     ;ILLEGAL FILE NAME
14849 JOBO2:  MOVEI J,0       ;SET J TO JOBGET "COMMAND" NUMBER
14850         CAIN W,2
14851          MOVEI J,2      ;MLINK, MOSTLY JUST LIKE FDELE, BUT SEE JOBOF3
14852         CAIN W,4
14853          MOVEI J,6      ;FDELE
14854         MOVNI E,1
14855         MOVSI Q,-JBMN
14856         PUSHJ P,SWTL    ;LOCK JOB CHNL ASSIGN SWITCH
14857             JBSW
14858 JOBO5:  SKIPGE TT,JBCUI(Q)      ;SKIP IF NOT FREE
14859          JRST JOBO4
14860         MOVE T,UUOH
14861         TLNN T,%PCFPD
14862          JRST JOBORU    ;JUMP IF THIS IS FIRST ATTEMPT TO OPEN
14863         HRRZ H,C
14864         CAIN H,'OJB
14865          JRST JOBO6
14866         SKIPGE JBCG(Q)  ;LOOK FOR CHANNEL ON WHICH THIS USER
14867          CAIE TT,(U)    ;PREVIOUSLY ATTEMPTED TO OPEN, BUT PCLSRED
14868           JRST JOBO6
14869         MOVE T,EPDLT1(U)
14870         MOVE TT,EPDLT2(U)
14871         CAMN T,JBFN1(Q)
14872          CAME TT,JBFN2(Q)
14873           JRST JOBO6            ;NOT OPENING SAME FILE
14874         MOVE TT,EPDLT4(U)
14875         MOVE T,EPDLT3(U)
14876         CAMN TT,JBDEV(Q)
14877          CAME T,JBSYS(Q)
14878           JRST JOBO6            ;NOT FOR SAME FILE
14879         CONO PI,CLKOFF
14880         HLRZ H,C
14881         HRRZ T,JBSTS(Q)
14882         CAIN T,(J)
14883          CAME H,JBOPNM(Q)
14884           JRST JOBO6            ;NOT FOR SAME OPEN TYPE AND MODE
14885         MOVE TT,JBWST(Q)
14886         TLNE TT,%JBLOS+%JBWIN+%JBREU
14887          JRST JOBO6             ;HANDLER JOB NOT IN CORRECT STATE
14888         HRRZ E,Q        ;REUSE SAME HANDLER JOB AS IN PREVIOUS ATTEMPT TO OPEN
14889         SETZM JBCG(E)   ;I'M BACK
14890         PUSHJ P,LSWPOP  ;FREE JBSW
14891         TLO TT,%JBVAL
14892         MOVEM TT,JBWST(E) ;RE-GIVE OPEN COMMAND STILL SITTING IN JBSTS ETC.
14893         HRLI E,400000   ;OPEN-TYPE WAIT
14894         PUSHJ P,JBWT2   ;WAIT FOR HANDLER JOB TO PROCESS IT
14895         JRST JOBO8      ;FINISH OFF THEN OPEN
14896
14897 ;FIRST ATTEMPT TO OPEN, CHECK FOR REUSEABLE HANDLER JOBS BEFORE CREATING NEW
14898 JOBORU: CONO PI,CLKOFF
14899         MOVE TT,JBWST(Q)
14900         SKIPGE JBCG(Q)
14901          TLZN TT,%JBREU
14902           JRST JOBO6    ;IN USE ALREADY OR NOT WILLING TO BE REUSED
14903         MOVE T,EPDLT4(U)
14904         CAMN T,JBODEV(Q)
14905          JRST JOBOR1    ;IF SAME SIMULATED DEVICE, OK TO SIEZE
14906         CAMN A,JBOFN1(Q)
14907          CAME B,JBOFN2(Q)
14908           JRST JOBO6    ;DIFFERENT HANDLER NAME
14909         MOVE T,USYSN1(U)
14910         CAME T,JBOSYN(Q)
14911          JRST JOBO6     ;DIFFERENT HANDLER NAME
14912 JOBOR1: MOVEM TT,JBWST(Q) ;THIS ONE OK, SIEZE IT
14913         HRRZ E,Q
14914         MOVEM U,JBCUI(E)
14915         HLRZM C,JBOPNM(E)
14916         SETZM JBCG(E)
14917         SETZM JBIOCJ(E)
14918         PUSHJ P,LSWPOP  ;FREE JBSW
14919         JRST JOBO7
14920 \f
14921 JOBO4:  HRRZ E,Q        ;REMEMBER FREE JOB CHNL IN CASE NEEDED
14922 JOBO6:  CONO PI,CLKON
14923         AOBJN Q,JOBO5   ;SCAN REST OF JOB CHANNELS
14924         JUMPL E,OPNL6   ;DEVICE FULL
14925         MOVEM U,JBCUI(E);STORE CREATOR'S USER INDEX
14926         PUSHJ P,LSWPOP  ;FREE JOBSW
14927         PUSHJ P,STMSET  ;SETOM JBCUI(E) ON LOSSAGE
14928             JBCUI(E)
14929         SETZM JBDEV(E)
14930         SETZM JBFNP(E)
14931         HLRZM C,JBOPNM(E)
14932         SETZM JBCG(E)
14933         SETZM JBIOCJ(E)
14934         MOVEI T,SNJOB   ;INITIALIZE STATUS
14935         MOVEM T,JBWST(E)
14936         PUSH P,R
14937         PUSH P,U
14938         PUSH P,J
14939         PUSH P,D
14940         PUSH P,E
14941         PUSH P,A
14942         PUSH P,B
14943         ANDI C,-1       ;FOR OJB DEVICE, LOOK FOR EXISTING JOB.
14944         CAIN C,'OJB
14945          JRST JOBO6B
14946         MOVE A,UNAME(U) ;FOR JOB DEVICE, CREATE NEW JOB.
14947         IDIVI E,10.
14948         MOVEI B,'0(E)
14949         LSH B,6
14950         ADDI B,'0(TT)
14951         ADD B,[SIXBIT /JOB./]   ;CREATE JNAME = 'JOB.MN'
14952         MOVE C,[7,,(SIXBIT /USR/)]
14953         MOVE D,[SETZ 3]
14954         PUSHJ P,USROJ   ;GENERATE USER(CAN ONLY PCLSR BEFORE CREATING INFERIOR)
14955          JRST POP7J     ;USER OPEN FAILED, MUST HAVE GONE TO OPNL ALREADY
14956         CONO PI,CLKOFF
14957         POP P,B
14958         POP P,A
14959         POP P,E
14960         SETOM SUPPRO(TT)
14961         MOVE T,[JBSTCD,,AC0S]
14962         ADDI T,(TT)
14963         BLT T,AC17S(TT)
14964         HRLZI T,%PCUSR
14965         MOVEM T,UPC(TT)
14966         MOVEM A,AC0S+10(TT)
14967         MOVEM B,AC0S+11(TT)
14968         MOVE T,USYSN1(U)
14969         MOVEM T,USYSNM(TT)      ;SET CREATED JOB'S SYS NAME TO OURS
14970         SETZM USTP(TT)          ;START JOB AS SOON AS CLK BACK ON
14971         JRST JOBO6C
14972 \f
14973 ;OJB: DEVICE, LOOK FOR JOB WHOSE NAMES ARE THE FILENAMES SPECIFIED IN THE OJB OPEN.
14974 JOBO6B: MOVE C,[7+UBPFJ,,'USR]  ;DON'T EVER CREATE JOB FOR OJB.
14975         MOVE D,[SETZ 3+UBPFJ_<-1>]
14976         PUSHJ P,USROOJ
14977          JRST POP7J
14978         SUB P,[2,,2]
14979         POP P,E
14980 ;TT HAS USER IDX OF JOB TO BE USED; CAN'T PCLSR AFTER THIS POINT.
14981 JOBO6C: PUSHJ P,LSWDEL  ;SETOM JBCUI(E)
14982         POP P,D
14983         POP P,J
14984         POP P,U
14985         POP P,R
14986         HRRZM TT,JBCJUI(E)
14987         MOVEM E,JBI(TT)
14988 JOBO7:  CONO PI,CLKOFF
14989         MOVE TT,EPDLT1(U)
14990         MOVEM TT,JBOFN1(E)
14991         MOVEM TT,JBFN1(E)
14992         MOVE TT,EPDLT2(U)
14993         MOVEM TT,JBOFN2(E)
14994         MOVEM TT,JBFN2(E)
14995         MOVE TT,EPDLT3(U)
14996         MOVEM TT,JBOSYN(E)
14997         MOVEM TT,JBSYS(E)
14998         MOVE TT,EPDLT4(U)
14999         MOVEM TT,JBODEV(E)
15000         MOVEM TT,JBDEV(E)
15001         MOVE TT,EPDL(U)
15002         MOVEM TT,JBAC10(E)
15003         MOVE TT,EPDL3(U)
15004         MOVEM TT,JBAC11(E)
15005         JUMPN J,[PUSHJ P,JFDEL5 ;DELETE/RENAME/MLINK
15006                  JRST JOBO9]
15007         LDB TT,[000300,,JBOPNM(E)]
15008         ROT TT,-3
15009         MOVEM TT,JBSTS(E)
15010         HRRZ C,JBOPNM(E)        ;GET ALL OF OPEN MODE
15011         MOVEM C,JBNFN2(E)       ;GIVE IT
15012 JOBO9:  PUSHJ P,JBWT1           ;STORE STUFF AND HANG
15013 JOBO8:  LDB TT,[350400,,JBSTS(E)]
15014         JUMPE TT,JOBOPL         ;OPEN LOST
15015         LDB C,[000400,,JBSTS(E)]
15016         JUMPN C,[ SETOM JBCG(E) ;DELETE/RENAME/MLINK
15017                   JRST POPJ1 ]
15018         MOVE C,JBOPNM(E)
15019         SETZM IOCHST-IOCHNM(R)
15020         HRLZ A,E
15021         JSP Q,OPSLC7
15022             JDUAI,,JDUAO
15023             JDBI,,JDBO
15024             JDUII,,JDUIO
15025             JDBI,,JDBO
15026
15027 JOBOPL: LDB C,[270600,,JBSTS(E)]
15028         SETOM JBCG(E)
15029         SKIPE C
15030          CAILE C,NOPNLS
15031           MOVEI C,22
15032         JRST OPNL1-1(C)
15033
15034 ;RENAME WHILE OPEN ON JOB CHNL
15035 JFDEL4: HLRZ E,(TT)     ;JOB CHNL INDEX
15036         MOVEI J,7
15037         PUSHJ P,JFDEL5  ;DO "FDELE"
15038         MOVE TT,EPDL3(U) ;PASS ALONG THE BP ARG IF THERE WAS ONE.
15039         MOVEM TT,JBAC11(E)
15040         SETZM JBAC10(E)
15041         JRST AIOCA1     ;GET RESULTS
15042
15043 ;FDELE/RENMWO/MLINK ON JOB CHANNEL
15044 JFDEL5: MOVEM J,JBSTS(E)
15045         MOVE TT,SRN3(U)   ;REMEMBER NAMES TO RENAME AS
15046         MOVEM TT,JBST2(E) ;FOR JOBGET TO RETURN.
15047         MOVE TT,SRN4(U)
15048         MOVEM TT,JBNFN2(E)
15049         MOVE TT,SRN5(U)   ;IN CASE THIS IS MLINK, MAKE SURE THE "TO" SNAME
15050         MOVEM TT,JBAC7(E) ;IS GIVEN TO JOBGET.
15051         CONO PI,CLKOFF
15052         POPJ P,
15053 \f
15054 ;GIVE AN INTERRUPT TO THE JOB DEVICE HANDLER.
15055 ;JOB CHNL INDEX IN E,  CLOBBERS TT,J,Q,H
15056 ;CALL WITH CLKOFF
15057
15058 JBINT:  HRRZ TT,JBCJUI(E)
15059         MOVEI J,IOCHNM(TT)
15060         HRLI J,-20
15061         MOVSI H,%CLSBJ
15062 JBINT1: MOVE Q,(J)
15063         TDNN H,CLSTB(Q) ;SKIP IF BOJ
15064 JBINT2:  AOBJN J,JBINT1
15065         JUMPGE J,CPOPJ
15066         SUBI J,IOCHNM(TT)
15067         MOVE Q,CHNBIT(J)
15068         IORM Q,IFPIR(TT)
15069         ADDI J,IOCHNM(TT)
15070         JRST JBINT2
15071
15072 ;THIS IS THE CODE PUT IN THE ACS TO LOAD IN THE JOB DEVICE HANDLER
15073
15074 JBSTCD: .OPEN 1,7       ;0
15075          .LOGOUT
15076         .CALL 12
15077          .LOGOUT
15078         .IOT 1,2
15079         .CLOSE 1,
15080         JRST (2)
15081         4,,(SIXBIT /DSK/)       ;7
15082         0       ;10 FN1
15083         0       ;11 FN2
15084         SETZ    ;12
15085         SIXBIT /LOAD/
15086         16
15087         SETZ 17
15088         -1      ;16 (LOAD INTO SELF)
15089         1       ;17
15090
15091 ;HAND THE JOB DEVICE HANDLER A SYSTEM CALL AND WAIT FOR IT TO BE HANDLED.
15092 ;CALL WITH CLOCK OFF, JOB CHNL IN E
15093 JBWT1:  TLOA E,400000   ;OPEN/FDELE/MLINK, CLOSE CHANNEL IF PCLSR
15094 JBWT:    TLZ E,400000   ;NORMAL ENTRY POINT, DON'T CLOSE IF PCLSR
15095         TLZA E,200000
15096 JBWTI:   HRLI E,200000  ;ENTER HERE TO INHIBIT SETTING %PCFPD IF PCLSR
15097         MOVSI TT,%JBVAL+%JBSTR
15098         IORM TT,JBWST(E)        ;TURN ON VALID AND STORED
15099 JBWT2:  PUSHJ P,JBINT   ;GIVE INT
15100         PUSHJ P,LOSSET
15101             JBPCL       ;CLEAR VALID AND STORED IF PCLSR
15102         MOVE T,E        ;CAUSES EPDL2 TO HAVE JOB INDEX
15103         PCLT
15104 JBFLS:  SKIP JBFLS
15105         PUSHJ P,UFLS    ;AWAIT RESULTS FROM HANDLER JOB
15106         MOVSI TT,%PCFPD
15107         ANDCAM TT,UUOH  ;NOW WE KNOW WE'LL RETURN TO USER WITHOUT PCLSRING FIRST
15108         JRST LSWDEL
15109
15110 JBPCL:  MOVE A,AC0S+E(U)        ;HERE IF PCLSR OUT
15111         SKIPL JBCJUI(A)         ;UNLESS HANDLER GOING AWAY
15112          TLNE A,200000          ;OR THIS SYSTEM CALL DOESN'T WANT IT,
15113           JRST JBPCL1
15114         MOVSI T,%PCFPD          ;SET FIRST PART DONE FLAG
15115         IORM T,UPC(U)           ;NOTE PCLSR HAS ALREADY MOVED UUOH INTO UPC
15116 JBPCL1: MOVSI T,%JBVAL+%JBSTR   ;NOT VALID, NOT STORED
15117         ANDCAM T,JBWST(A)
15118         JUMPGE A,CPOPJ
15119         SETOM JBCG(A)   ;SAY THE CREATOR HAS CLOSED IT
15120 IRPS X,,E TT J Q H
15121         PUSH P,X
15122 TERMIN
15123         MOVE E,A        ;AND GIVE THE HANDLER AN INTERRUPT
15124         PUSHJ P,JBINT
15125 IRPS X,,H Q J TT E
15126         POP P,X
15127 TERMIN
15128         POPJ P,
15129 \f
15130 ;JOB DEVICE BLOCK MODE IOT EITHER DIRECTION
15131 JBBI:   XCTR XRW,[MOVES D,(C)]  ;REFERENCE POINTER
15132         LDB B,[410300,,D]
15133         CAIGE B,3
15134          POPJ P,
15135         MOVEM D,JBST2(A)
15136         MOVE B,C
15137         HRRZ T,D        ;-> FIRST WORD TO TRANSFER
15138         HLROS D         ;MINUS WORD COUNT
15139         IORI D,700000   ;FLUSH CHAR COUNT
15140         SUBM T,D        ;D -> LAST WORD + 1 TO TRANSFER
15141         JRST JBIPG      ;SWAP IN BUFFER THEN DO IOT
15142
15143 ;JOB DEVICE UNIT MODE IOT EITHER DIRECTION
15144         JRST JBSI       ;SIOT
15145 JBUI:   MOVSI T,%JBSIOT
15146         ANDCAM T,JBWST(A)
15147         MOVEI T,1
15148         MOVEM T,JBST2(A)
15149         UMOVE W,(C)     ;FOR UNIT OUTPUT
15150 JBIOT1: HRRZ TT,JBOPNM(A)
15151         ROT TT,-3       ;MODE
15152         HRRI TT,1       ;IOT CMD
15153         HRRZ E,A        ;JOB CHNL INDEX
15154         MOVEM TT,JBSTS(E)
15155         MOVEM C,SRN3(U) ;MAY BE ADDRESS OF BLOCK IOT POINTER
15156         CONO PI,CLKOFF
15157         SKIPL TT,JBIOCJ(E)
15158          JRST JBWTI     ;GO SIGNAL HANDLER JOB
15159         SETZM JBIOCJ(E) ;TAKE IOC ERROR INSTEAD
15160         JRST IOCERF-MIOTER(TT)
15161
15162 ;JOB DEVICE SIOT EITHER DIRECTION
15163 JBSI:   AOS (P)                 ;SIOT SHOULD SKIP RETURN
15164         MOVSI T,%JBSIOT
15165         IORM T,JBWST(A)
15166         XCTR XRW,[MOVES T,(B)]  ;BYTE PNTR ARG
15167         LDB E,[300600,,T]       ;BYTE SIZE
15168         MOVEI D,36.
15169         IDIVM D,E       ;E := # BYTES PER WORD
15170         XCTR XRW,[MOVES D,(C)]  ;BYTE COUNT ARG
15171         MOVEM D,JBST2(A)
15172         IDIV D,E        ;D := WORD COUNT, E := EXCESS BYTES
15173         IBP T           ;-> FIRST WORD TO TRANSFER
15174         ADD D,T
15175         SOJLE E,JBIPG
15176 JBSI1:  IBP D
15177         SOJG E,JBSI1
15178 JBIPG:  HRRZS D         ;-> LAST WORD TO TRANSFER + 1
15179         ANDI T,-2000    ;-> FIRST PAGE INVOLVED IN TRANSFER
15180         LDB E,[.BP .UII#.UIO,JBOPNM(A)] ;0 INPUT 1 OUTPUT
15181 JBIPG1: SKIPE E         ;SWAP IN THE NECESSARY PAGES
15182          XCTR XR,[SKIPA 20(T)]
15183           XCTR XRW,[MOVES 20(T)]
15184         ADDI T,2000
15185         CAMGE T,D
15186          JRST JBIPG1
15187         JRST JBIOT1
15188 \f
15189 ;FLSINS ROUTINE TO WAIT FOR CREATOR TO BE HUNG AT JBFLS
15190 ;4.9 OF SRN3 = 1 => WAIT FOR WRITE   0 => READ
15191 ;1.1-1.4 => CODE OF UUO TO WAIT FOR
15192
15193 BJWAIT: SKIPE B,FLSINS(T)
15194          CAME B,JBFLS
15195           POPJ P,       ;NOT HUNG AT JBFLS
15196         HRRZ B,EPDL2(T) ;JOB INDEX THAT CREATOR IS HACKING
15197         HLRZ E,T        ;JOB INDEX OF BOJ USER
15198         CAME B,E
15199          POPJ P,        ;CREATOR HACKING JOB DEVICE ON SOME OTHER CHANNEL
15200         MOVE TT,JBSTS(B)
15201         LSH TT,2        ;4.9 => READ/WRITE BIT NOW
15202         EQV TT,SRN3(U)  ;4.9 OF SRN3 => WHAT TO LOOK FOR
15203         JUMPGE TT,CPOPJ ;DOESN'T MATCH
15204         MOVE TT,JBSTS(B) ;INSN CREATOR IS DOING
15205         XOR TT,SRN3(U)  ;INSN LOOKING FOR
15206         TRNN TT,17
15207          AOS (P)        ;THEY MATCH, AWAKEN BOJ JOB
15208         POPJ P,
15209 \f
15210 ;BOJ DEVICE UNIT MODE OUTPUT
15211 BJUO:   SKIPGE C
15212          SKIPA H,(C)
15213           UMOVE H,(C)
15214         MOVEI B,1       ;WAIT FOR INPUT IOT
15215         MOVEM B,SRN3(U)
15216         HRLZ T,A        ;JOB INDEX
15217         HRR T,JBCUI(A)  ;CREATOR'S USER INDEX
15218         PUSHJ P,CWAIT   ;WAIT FOR CREATOR TO BE IN IOT, RETURN WITH CLK OFF
15219             PUSHJ P,BJWAIT
15220         PUSHJ P,BJUO1
15221         JRST CLKONJ
15222
15223 BJUO1:  MOVE TT,JBSTS(A)
15224         TLNE TT,200000
15225          JRST BJUOB     ;BLOCK MODE CREATOR IOT
15226         LDB D,[.BP (%JBSIOT),JBWST(A)]
15227         JUMPN D,BJUOS   ;CREATOR SIOT
15228         MOVEM H,AC0S+W(T)
15229 BJIUNH: MOVSI D,%JBWIN
15230         IORM D,JBWST(A) ;SET SUCCESSFUL JOBRET BIT
15231         MOVSI D,%JBVAL+%JBSTR
15232         ANDCAM D,JBWST(A)
15233         MOVEI D,0
15234         DPB D,[350400,,JBSTS(A)]        ;DON'T SKIP
15235         EXCH D,FLSINS(T)        ;RESTART CREATOR
15236         CONSO PI,1
15237          CAME D,JBFLS
15238           BUG           ;HE WASNT WHERE HE BELONGED
15239         POPJ P,         ;NEED NOT CLKON, CALLER WILL TURN IT ON
15240
15241 ;BOJ UNIT OUTPUT TO JOB SIOT
15242 BJUOS:  PUSHJ P,BJBINI
15243         XCTRI XBYTE,[IDPB H,(B)]
15244          SKIPA C,AC0S+C(T)
15245           BUG
15246         XCTR XRW,[SOSG (C)]
15247          JRST BJIUNP
15248         JRST PLDZ
15249
15250 BJBINI: HRLI T,%UMALL
15251         MOVE J,T
15252         PUSHJ P,PLD1
15253         MOVE B,AC0S+B(T)
15254         XCTRI XRW,[MOVE D,(B)]
15255          POPJ P,
15256         BUG
15257
15258 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT
15259 BJUOB:  PUSHJ P,BJBINI
15260         SKIPL JBSTS(A)
15261          JRST BJUOBA    ;ASCII
15262         XCTRI XW,[MOVEM H,(D)]
15263          CAIA
15264           BUG
15265         ADD D,[1,,1]
15266         XCTRI XW,[MOVEM D,(B)]
15267          CAIA
15268           BUG
15269         JUMPGE D,BJIUNP
15270         JRST PLDZ
15271
15272 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT, ASCII MODE
15273 BJUOBA: LDB E,[410300,,D]       ;CHAR COUNT
15274         CAIGE E,3
15275          JRST BJIUNP
15276         XCTRI XR,[MOVE W,(D)]
15277          SKIPA E,BTOCHT-3(E)
15278           BUG
15279         IDPB H,E
15280         XCTRI XW,[MOVEM W,(D)]
15281          CAIA
15282           BUG
15283         ADD D,[700000,,]
15284         TLNN D,500000
15285          ADD D,[500001,,1]
15286         XCTRI XW,[MOVEM D,(B)]
15287          CAIA
15288           BUG
15289         TLNE D,700000
15290          JRST PLDZ
15291 BJIUNP: PUSHJ P,BJIUNH  ;UNHANG CREATOR
15292         JRST PLDZ
15293 \f
15294 ;BOJ DEVICE BLOCK OUTPUT
15295 BJBO:   SKIPGE JBCG(A)
15296          POPJ P,
15297         XCTR XRW,[MOVES D,(C)]  ;D GETS IOT POINTER
15298         LDB E,[410300,,D]
15299         CAIGE E,3
15300          POPJ P,
15301         HLRO B,D
15302         IORI B,700000   ;FLUSH CHAR CNT
15303         HRRZ T,D
15304         SUB T,B
15305         CAILE T,-1
15306          JRST IOADC             ;DON'T WRAP AROUND (WHY NOT?)
15307         UMOVE H,(D)             ;H GETS FIRST WORD
15308         MOVEI B,1
15309         PUSHJ P,BJBWT           ;WAIT FOR JOB INPUT IOT, COME BACK WITH CLK OFF.
15310          JRST CLKONJ            ;UNHANG
15311         MOVEI I,1               ;FOR BJBB
15312         MOVE TT,JBSTS(A)
15313         TLNE TT,200000
15314          JRST BJBB      ;CREATOR IOT IS IN BLOCK MODE
15315         JUMPGE TT,BJBOA ;CREATOR IOT IS ASCII
15316         ADD D,[1,,1]
15317 BJBO1:  PUSH P,C
15318         PUSH P,D
15319         PUSHJ P,BJUO1
15320         POP P,D
15321         POP P,C
15322         XCTRI XW,[MOVEM D,(C)]
15323          SKIPA T,IOTTB+BDBO
15324           BUG
15325 BJBEX:  TLNN D,700000
15326          JRST CLKONJ    ;BOJ BLOCK POINTER EXHAUSTED
15327         MOVE E,JBWST(A)
15328         CONO PI,CLKON
15329         TLNN E,%JBVAL   ;SKIP IF JOB IOT STILL WAITING FOR MORE
15330          TLNN E,%JBUNH
15331           JRST (T)      ;TRANSFER MORE
15332         POPJ P,         ;UNHANG BOJ IOT PREMATURELY
15333
15334 ;BOJ BLOCK ASCII OUTPUT FETCH CHARACTER
15335 BJBOA:  MOVE E,BTOCHT-3(E)
15336         MOVE W,H
15337         ILDB H,E
15338         ADD D,[700000,,]
15339         TLNN D,500000
15340          ADD D,[500001,,1]
15341         JRST BJBO1
15342
15343 ;BOJ BLOCK IOT WAIT.  AWAITS JOB IOT, UNLESS UNHANGING.
15344 ;TURNS CLKOFF.  SKIPS UNLESS SUPPOSED TO UNHANG.
15345 BJBWT:  MOVEM B,SRN3(U)         ;SAVE WHAT JOB UUO TO WAIT FOR
15346         HRLZ T,A                ;SET UP ARG FOR BJWAIT FLSINS
15347         HRR T,JBCUI(A)
15348         MOVE TT,JBWST(A)        ;CHECK FOR DON'T HANG MODE
15349         TLNE TT,%JBUNH
15350          JRST BJBWT1
15351         PUSHJ P,CWAIT           ;WAIT FOR JOB IOT
15352             PUSHJ P,BJWAIT
15353         JRST POPJ1
15354
15355 BJBWT1: CONO PI,CLKOFF          ;IF NOT ALREADY IN JOB IOT, DON'T WAIT
15356         JRST BJWAIT             ;TEST CREATOR STATUS, POPJ OR POPJ1
15357 \f
15358 ;BOJ DEVICE UNIT MODE INPUT
15359 BJUI:   MOVE B,[SETZ 1] ;WAIT FOR OUTPUT IOT
15360         MOVEM B,SRN3(U)
15361         HRLZ T,A        ;JOB INDEX
15362         HRR T,JBCUI(A)  ;CREATOR'S USER INDEX
15363         PUSHJ P,CWAIT   ;WAIT FOR CREATOR TO IOT, RETURN WITH CLKOFF
15364             PUSHJ P,BJWAIT
15365         PUSHJ P,BJUI1
15366         JRST CLKONJ
15367
15368 BJUI1:  MOVE TT,JBSTS(A)
15369         TLNE TT,200000
15370          JRST BJUIB     ;BLOCK MODE CREATOR IOT
15371         LDB D,[.BP (%JBSIOT),JBWST(A)]
15372         JUMPN D,BJUIS
15373         MOVE W,AC0S+W(T)
15374         JRST BJIUNH     ;SUCCESSFUL
15375
15376 ;BOJ UNIT INPUT FROM JOB SIOT
15377 BJUIS:  PUSHJ P,BJBINI
15378         XCTRI XBYTE,[ILDB W,(B)]
15379          SKIPA C,AC0S+C(T)
15380           BUG
15381         XCTR XRW,[SOSG (C)]
15382          JRST BJIUNP
15383         JRST PLDZ
15384
15385 ;BOJ UNIT INPUT FROM JOB BLOCK IOT
15386 BJUIB:  PUSHJ P,BJBINI
15387         SKIPL JBSTS(A)
15388          JRST BJUIBA
15389         XCTRI XR,[MOVE W,(D)]
15390          CAIA
15391           BUG
15392         ADD D,[1,,1]
15393         XCTRI XW,[MOVEM D,(B)]
15394          CAIA
15395           BUG
15396         JUMPGE D,BJIUNP
15397         JRST PLDZ
15398
15399 ;BOJ UNIT INPUT FROM JOB BLOCK IOT, ASCII MODE
15400 BJUIBA: LDB E,[410300,,D]       ;CHAR COUNT
15401         MOVEI W,0
15402         CAIGE E,3
15403          JRST BJIUNP
15404         XCTRI XR,[MOVE W,(B)]
15405          SKIPA E,BTOCHT-3(E)
15406           BUG
15407         ILDB W,E
15408         ADD D,[700000,,]
15409         TLNN D,500000
15410          ADD D,[500001,,1]
15411         XCTRI XW,[MOVEM D,(B)]
15412          CAIA
15413           BUG
15414         TLNN D,700000
15415          JRST BJIUNP
15416         JRST PLDZ
15417 \f
15418 ;BOJ DEVICE BLOCK MODE INPUT
15419 BJBI:   SKIPGE JBCG(A)
15420          POPJ P,                ;EOF
15421         XCTR XRW,[MOVES D,(C)]  ;D GETS IOT POINTER
15422         LDB B,[410300,,D]
15423         CAIGE B,3
15424          POPJ P,
15425         HLRO E,D
15426         IORI E,700000   ;FLUSH CHAR CNT
15427         HRRZ T,D
15428         SUB T,E
15429         CAILE T,-1
15430          JRST IOADC     ;DON'T WRAP AROUND
15431         MOVE B,[SETZ 1]
15432         PUSHJ P,BJBWT           ;WAIT FOR JOB OUTPUT IOT, COME BACK WITH CLK OFF
15433          JRST CLKONJ            ;UNHANG
15434         MOVEI I,0               ;FOR BJBB
15435         MOVE TT,JBSTS(A)
15436         TLNE TT,200000
15437          JRST BJBB      ;CREATOR IOT IS IN BLOCK MODE
15438         PUSH P,C
15439         PUSH P,D
15440         PUSHJ P,BJUI1   ;GET DATA OUT OF CREATOR UNIT MODE IOT
15441         POP P,D
15442         POP P,C
15443         MOVE H,W
15444         MOVEI T,BJBI
15445         JUMPGE TT,BJBIA ;ASCII
15446         XCTRI XW,[MOVEM H,(D)]
15447          CAIA
15448           BUG
15449         ADD D,[1,,1]
15450         JRST BJBIX
15451
15452 ;BOJ BLOCK ASCII INPUT STORE CHAR
15453 BJBIA:  LDB E,[410300,,D]
15454         CAIGE E,3
15455          JRST CLKONJ
15456         XCTRI XR,[MOVE W,(D)]
15457          SKIPA E,BTOCHT-3(E)
15458           BUG
15459         IDPB H,E
15460         XCTRI XW,[MOVEM W,(D)]
15461          CAIA
15462           BUG
15463         ADD D,[700000,,]
15464         TLNN D,500000
15465          ADD D,[500001,,1]
15466 BJBIX:  MOVEI T,BJBI
15467         XCTRI XW,[MOVEM D,(C)]
15468          JRST BJBEX
15469           BUG
15470 \f
15471 BJOV:   BJBI
15472         BJBO
15473
15474 ;BOJ BLOCK IOT TO/FROM JOB BLOCK IOT
15475 BJBB:   MOVE J,T
15476         HRLI J,%UMALL   ;UMAPS FOR PURELY CREATOR IOT
15477         MOVEM J,SRN4(U)
15478 BJBBL:  MOVE J,SRN4(U)
15479         PUSHJ P,PLD1
15480         MOVE E,SRN3(T)
15481         XCTRI XRW,[MOVES H,(E)]
15482          CAIA           ;H HAS JOB BLOCK IOT POINTER
15483           BUG
15484         PUSHJ P,PLDZ
15485         XCTRI XRW,[MOVES D,(C)]
15486          CAIA           ;D HAS BOJ BLOCK IOT POINTER
15487           BUG
15488         JUMPGE H,[PUSHJ P,BJIUNH
15489                   MOVE T,BJOV(I)
15490                   JRST BJBEX]
15491         JUMPGE D,CLKONJ
15492         HLRE B,H
15493         CAML D,H
15494          HLRE B,D       ;CHOOSE SMALLER OF TWO BLOCK SIZES
15495         MOVNS B         ;COUNT TO BE XFERRED
15496         HRLZ E,H        ;JOB ADDRESS
15497         HRR E,D         ;JOB,,BOJ  (FROM,,TO FOR BOJ INPUT)
15498         HLRZ Q,E        ;JOB ADDRESS
15499         CAIGE Q,20
15500          JRST BJBB1     ;JOB ADDR IS AN AC
15501         HRRZ J,T        ;SET UP UMAPS (JOB USER INDEX IN RH)
15502         TRZE E,400000
15503          TLOA J,%UMMPL  ;TO HI PG, HACK OUR LO PAGE
15504           TLO J,%UMMPU  ;TO LO PG, HACK OUR HI PAGE
15505         TLZE E,400000
15506          TLOA J,%UMLTU  ;TO POINT TO HIS UPPER
15507           TLO J,%UMUTL  ;TO POINT TO HIS LOWER
15508         TLNN J,%UMMPU+%UMUTL    ;MAPPING HIS UPPER FROM OUR LOWER?
15509          JRST BJBB3     ;YES.  MAKE SURE NOT SCREWED BY AC PNTR
15510 BJBB3A: PUSHJ P,PLD1
15511         TRZ Q,400000
15512         MOVNS Q         ;LIMIT SIZE OF XFER TO MIN OF
15513         ADDI Q,400000   ;DIST OF TO ADR FROM SEG BOUNDARY
15514         CAMLE B,Q       ;AND DIST OF FROM ADR FROM SEG BOUNDARY
15515          HRRZ B,Q
15516         MOVNI Q,(E)     ; - BOJ ADDR
15517         ADDI Q,400000
15518         CAMLE B,Q
15519          HRRZ B,Q
15520         TLNN J,%UMMPL   ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
15521          TLOA E,400000  ;SET JOB ADDR TO HI SEG
15522           TRO E,400000  ;SET BOJ ADDR TO HI SEG
15523         SKIPE I
15524          MOVSS E        ;XFER OTHER DIRECTION
15525         MOVE Q,E        ;SAVE COPY OF BLT POINTER
15526         ADDI B,(E)      ;GET LA + 1
15527         XCTRI XBRW,[BLT E,-1(B)]        ;XFER DATA
15528          HRRZS E,B      ;NO FAULT.  SIMULATE STORE BACK OF POINTER (CAN BE 1,,0)
15529         PUSH P,J
15530         PUSHJ P,PLDZ
15531         SUBM E,Q
15532 BJBB2:  HRLS Q          ;NUMBER OF WORDS ACTUALLY XFERRED IN BOTH HALVES
15533         XCTRI XRW,[ADDM Q,(C)]  ;UPDATE BOJ BLK PNTR
15534          JRST .+2
15535           BUG
15536         MOVE J,SRN4(U)
15537         PUSHJ P,PLD1    ;MAP TO CREATOR
15538         POP P,J
15539         MOVE W,SRN3(T)
15540         XCTRI XRW,[ADDM Q,(W)] ;UPDATE JOB BLK PNTR
15541          JRST .+2
15542           BUG
15543         CAIN B,(E)
15544          JRST BJBBL     ;NO FAULT, LOOP BACK
15545         PUSHJ P,PLD1    ;RESTORE TO FROB AT TIME OF FAULT
15546 BJBBF:  PUSHJ P,TPFLT   ;TAKE FAULT (TURNS CLK ON)
15547         PUSHJ P,MPLDZ   ;RESTORE NORMAL MAP
15548         JRST @BJOV(I)   ;RESTART THE IOT
15549 \f
15550 ;JOB ADDR IS AN AC
15551 BJBB1:  ADDI Q,UUOACS(T)
15552         JUMPN I,BJBB1A
15553         MOVE B,(Q)      ;READ JOB WORD
15554 BJBB3C: XCTRI XW,[MOVEM B,(E)]
15555          JRST .+2
15556           JRST BJBBF
15557 BJBB2A: MOVEI Q,1       ;1 WORD XFERRED
15558         HRRZ B,E        ;FAKE OUT FAULT TEST
15559         PUSH P,J
15560         JRST BJBB2
15561
15562 BJBB1A: XCTRI XR,[MOVE B,(E)]
15563          JRST .+2
15564           JRST BJBBF
15565         MOVEM B,(Q)
15566         JRST BJBB2A
15567
15568 BJBB3:  TLNE E,777760   ;SKIP ON XFERRING FROM AC AREA, HI TO HI
15569          JRST BJBB3A    ;NO.  OK TO DO BLT
15570         JUMPN I,BJBB3B
15571         HRLI J,%UMALL   ;HACK OUR HI TO POINT TO HIS HI
15572         PUSHJ P,PLD1
15573         XCTRI XR,[MOVE B,(Q)]
15574          JRST .+2
15575           BUG
15576         PUSHJ P,PLDZ
15577         HRRZ E,D        ;TO ADDRESS
15578         JRST BJBB3C
15579
15580 BJBB3B: XCTRI XR,[MOVE B,(D)]
15581          JRST .+2
15582           JRST BJBBF
15583         HRLI J,%UMALL
15584         PUSHJ P,PLD1    ;HACK OUR HI TO POINT TO HIS HI
15585         XCTRI XW,[MOVEM B,(Q)]
15586          JRST .+2
15587           BUG
15588         PUSHJ P,PLDZ
15589         JRST BJBB2A
15590 \f
15591 ;.CALL JOBGET
15592 ;ARG 1 - BOJ CHNL
15593 ;UP TO SIX WDS RETURNED
15594 ;WD1 BITS:
15595 %JG==1,,525252
15596                 ;4.9-4.7 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
15597                 ;    4.9-4.7 SHOULDN'T BE USED, SINCE THE FULL MODE IS IN WD7 ON AN OPEN
15598 %JGCLS==40000   ;4.6 => CLOSE  (NOTE 4.5 USED TO BE A CLS BIT ALSO)
15599 %JGSIO==1000    ;4.1 => SIOT (ONLY IF OPCODE = 1)
15600 %JGFPD==200     ;3.8 => THIS CALL WAS PCLSRED AND IS RESTARTING
15601 ;1.4-1.1 => TYPE OF OPERATION
15602 %JO==,,-1
15603 %JOOPN==0       ;OPEN
15604 %JOIOT==1       ;IOT/SIOT
15605 %JOLNK==2       ;MLINK
15606 %JORST==3       ;RESET
15607 %JORCH==4       ;RCHST
15608 %JOACC==5       ;ACCESS
15609 %JORNM==6       ;FDELE (DELETE OR RENAME)
15610 %JORWO==7       ;FDELE (RENAME WHILE OPEN)
15611 %JOCAL==10      ;SYMBOLIC .CALL
15612
15613 ;WD2 SET ONLY FOR BLOCK IOT POINTER, ACCESS POINTER, NEW FN1 FOR FDELE
15614 ;WD3    FN1
15615 ;WD4    FN2
15616 ;WD5    SYS NAME
15617 ;WD6    LEFT ADJUSTED DEVICE NAME
15618 ;WD7    NEW FN2 FOR FDELE.
15619 ;IGNORE ALL RETURNED INFO ON AN ERROR RETURN
15620 ;IF 4.5 OR 4.6 IS SET THEN ALL ELSE IS MEANINGLESS
15621
15622 NJBGT:  SETZM T         ;INDICATE JOBGET, NOT JOBCAL
15623 NJBCL0: HLRZ E,H        ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15624         TLNN R,%CLSBJ   ;NOT A BOJ CHANNEL => WRONG TYPE DEVICE
15625          JRST OPNL34
15626         CONO PI,CLKOFF
15627         MOVE C,JBWST(E)
15628         TLNN C,%JBVAL
15629          JRST NJBGTE    ;FAIL IF VALID NOT SET
15630         TLZ C,%JBSTR
15631         MOVEM C,JBWST(E)        ;CLEAR STORED BIT
15632         MOVE B,JBCUI(E)
15633         MOVE B,SUUOH(B)
15634         CONO PI,CLKON
15635         MOVE A,JBSTS(E)
15636         TLZ A,077777    ;FLUSH RANDOM BITS FROM LH
15637         TLNE B,%PCFPD
15638          TLO A,%JGFPD
15639         TLNE C,%JBSIOT
15640          TLO A,%JGSIO
15641         JUMPN T,NJBCL1  ;BRANCH IF JOBCAL
15642 NJBGT0: MOVE B,JBST2(E)
15643         MOVE C,JBOFN1(E)
15644         MOVE D,JBOFN2(E)
15645         MOVE TT,JBODEV(E)
15646         MOVE I,JBNFN2(E)
15647         MOVE E,JBOSYN(E)
15648         CONO PI,CLKON
15649         JRST POPJ1
15650
15651 NJBGTE: SKIPL JBCG(E)   ;HAS CREATOR GONE AWAY?
15652          JRST OPNL36    ;NO, VALID CLEAR
15653         CONO PI,CLKON   ;YES, GIVE CLOSE
15654         MOVSI A,%JBLOS
15655         IORM A,JBWST(E)
15656         MOVSI A,%JGCLS  ;GIVE CLOSE BITS
15657         JRST POPJ1      ;DON'T GIVE ANYTHING ELSE WHETHER JOBGET OR JOBCAL
15658 \f
15659 ;       .CALL ADR
15660 ;       ERROR RETURN
15661 ;       NORMAL RETURN
15662
15663 ;ADR:   SETZ
15664 ;       SIXBIT /JOBCAL/
15665 ;       [BOJCHNL]
15666 ;       [-N,,ADR OF DATA BUFFER]        ;OPTIONAL
15667 ;       SETZM OPCODE
15668 ; OPCODE WILL BE THE SAME AS RETURNED IN WD1 BY JOBGET
15669 ; IF OPCODE<10 THEN WD2-WD7 OF JOBGET WILL BE WRITTEN INTO DATA BUFFER
15670 ;       FOLLOWED BY JOB'S EPDL AND EPDL3 (THE BPS FOR BP-STYLE OPENS, ETC).
15671 ;IF OPCODE=10 THEN JOB'S LAST .CALL WILL BE DESCRIBED:
15672 ;       WORD 1 OF DATA BUFFER => SIXBIT OF OPERATION (I.E. THE NAME
15673 ;               OF THE .CALL)
15674 ;       WORD 2 OF DATA BUFFER => FLAG BITS OF .CALL
15675 ;       WORD 3 OF DATA BUFFER => # OF ARGS TO .CALL
15676 ;       WORDS 4-12 => INPUT ARGS TO .CALL
15677
15678 NJBCL:  CAIL W,2                ;DID CALLER SUPPLY AOBJN POINTER?
15679          SKIPN T,B              ;IF SO AND NON-ZERO USE IT
15680           MOVEI T,1             ;OTHERWISE SET T NONZERO
15681         JRST NJBCL0             ;GO JOIN JOBGET CODE FOR ERROR CHECKING
15682
15683 NJBCL1: JUMPGE T,POPJ1          ;BACK FROM JOBGET - ANY AOBJN PNTR?
15684         MOVEI C,9               ;YES - OPCODE 10?
15685         TRNN A,10
15686          JRST NJBCL2            ;NO - JUST COPY 9 STANDARD ARGS
15687         HLRE D,T                ;GET LENGTH OF USERS DATA BUFFER
15688         MOVE B,JBCUI(E)         ;GET JOB'S USER INDEX
15689         MOVE C,LSCALL(B)        ;GET NAME OF JOB'S LAST CALL
15690         UMOVEM C,(T)            ;PUT INTO CALLERS BUFFER
15691         AOJE D,POPJ1            ;IF NO MORE ROOM - DONE
15692         MOVE C,CTLBTS(B)        ;GET USER'S .CALL FLAG BITS
15693         UMOVEM C,1(T)
15694         AOJE D,POPJ1
15695         LDB C,[230400,,JBSTS(E)]        ;GET # OF ARGS
15696         UMOVEM C,2(T)
15697         JUMPE C,POPJ1           ;ANY ARGS TO PASS?
15698         ADD T,[3,,3]            ;YES - COPY INTO BUFFER
15699 NJBCL2: JUMPGE T,POPJ1          ;ANY ROOM LEFT?
15700         MOVNS C                 ;GET SMALLEST WORD COUNT
15701         HLRE B,T
15702         CAMLE C,B
15703          HRL T,C                ;MAKE AOBJN PNTR AS SMALL AS POSSIBLE
15704         MOVE H,E                ;JOB INDEX IN H FOR USING JBACTB
15705         MOVEI B,JBACTB          ;GET PNTR TO ARG TABLES
15706 NJBCL3: MOVE C,@(B)             ;GET NEXT ARG
15707         UMOVEM C,(T)            ;GIVE TO CALLER
15708         AOS B
15709         AOBJN T,NJBCL3
15710         JRST POPJ1              ;DONE - GO SKIP
15711 \f
15712 ;       .CALL ADR
15713 ;       ERROR RETURN
15714 ;       NORMAL RETURN
15715
15716 ;ADR:   SETZ
15717 ;       SIXBIT /JOBRET/
15718 ;       [BOJCHNL]
15719 ;       [OPEN LOSS #(IF RH = 0),,# TIMES FOR CREATING JOB TO SKIP]
15720 ;       SETZ [-N,,ADR OF DATA BUFFER]
15721
15722 ;RETURN DATA (E.G. RETURN TO RCHST,STATUS OR THE RETURN ARGS TO A .CALL)
15723 ;WILL BE COPIED FROM THE CALLER'S DATA BUFFER
15724
15725 NJBRT:  HLRZ E,H        ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15726         TLNN R,%CLSBJ   ;NOT BOJ CHNL => WRONG TYPE DEVICE.
15727          JRST OPNL34
15728         CAIGE W,3       ;RETURN ARGS PROVIDED?
15729          SETZM C        ;NO - ZERO IT
15730         JUMPGE C,NJBRT1 ;DO NOTHING IF NO RETURNS OR NO AOBJN
15731         HLRE D,C        ;GET LENGTH OF BUFFER
15732         CAMGE D,[-8.]   ;MAKE SURE AREA AT MOST 8 LONG
15733          MOVNI D,8      ;OVER 8 - USE 8
15734         HRL C,D         ;FIX AOBJN PNTR
15735         MOVMS D
15736         ADDI D,-1(C)    ;GET ADDRESS OF LAST WORD NEEDED
15737         XCTR XR,[SKIP (C)]      ;MAKE SURE PAGES ARE IN
15738         XCTR XR,[SKIP (D)]
15739 NJBRT1: CONO PI,CLKOFF  ;NOW OK TO TURN CLOCK OFF
15740         MOVE A,JBWST(E)
15741         TLNE A,%JBVAL
15742          TLNE A,%JBSTR
15743           JRST OPNL36   ;FAIL IF STORED IS SET OR IF VALID IS CLEARED
15744         SKIPGE JBCG(E)
15745          JRST OPNL41
15746         HRRZ TT,JBCUI(E)
15747         MOVE D,FLSINS(TT)
15748         CAME D,JBFLS
15749          BUG
15750         TLO A,%JBWIN
15751         TLZ A,%JBVAL+%JBSTR
15752         MOVEM A,JBWST(E)        ;SET SUCCESSFUL JOBRET BIT, CLEAR VALID AND STORED
15753         DPB B,[350400,,JBSTS(E)]        ;NUMBER OF TIMES TO SKIP
15754         MOVSS B
15755         DPB B,[270600,,JBSTS(E)]        ;OPEN LOSS
15756         MOVSI B,-6              ;DEFAULT # WDS TO RETURN FOR .RCHST IS 6.
15757         MOVEM B,JBAC11(E)
15758         JUMPGE C,NJBRT3         ;ANY RETURN ARGS?
15759         MOVEM C,JBAC11(E)       ;REMEMBER HOW MANY, FOR .RCHST TO RETURN THAT MANY.
15760         MOVE H,E                ;YES - COPY THEM
15761         MOVEI D,JBACTB
15762 NJBRT2: XCTRI XR,[MOVE B,(C)]   ;GET IT
15763          AOSA D
15764           BUG                   ;PAGE IS TIED - NO?
15765         MOVEM B,@-1(D)          ;PUT INTO ARG TABLE
15766         AOBJN C,NJBRT2
15767 NJBRT3: SETZM FLSINS(TT)        ;RESTART CREATOR
15768         JRST CLKOJ1
15769
15770 ;JOB DEVICE CLOSE ROUTINE
15771 JOBCLS: SETOM JBCG(A)
15772         MOVE E,A
15773         CONO PI,CLKOFF
15774         PUSHJ P,JBINT   ;INTERRUPT POOR BOJ GUY
15775         JRST CLKONJ     ;SINCE HE HAS NO CREATOR
15776 \f
15777 ; ROUTINES FOR JOB ACCESS, RFPNTR, RESET, AND STATUS
15778
15779 RFPJOB: MOVEI J,4               ;USE OLD .RCHST OPERATION, OPCODE 4
15780         HRRM J,JBSTS(A)
15781         MOVE E,A
15782         CONO PI,CLKOFF
15783         PUSHJ P,JBWT            ;SIGNAL JOB, WAIT FOR ANSWER
15784         HLRE TT,JBAC11(E)       ;GET # VALUES RETURNED
15785         MOVNS TT
15786         CAIL TT,5
15787          SKIPA A,JBODEV(E)      ;GET ACCESS POINTER RETURNED
15788           SETO A,               ;NO ACCESS POINTER RETURNED, USE -1
15789         CAIL TT,6               ;UP TO TWO MORE EXTRA RCHST RESULTS MIGHT BE RETURNED
15790          MOVE Q,JBNFN2(E)
15791         CAIL TT,7
15792          MOVE I,JBAC7(E)
15793         CAIL TT,5
15794          MOVEI W,1(TT)          ;# RESULTS FOR RCHST
15795         MOVEI B,36.             ;ALWAYS RETURN 36. AS BYTE SIZE UNTIL MORE WINNING
15796         JRST POPJ1              ;CONVENTIONS EXIST.
15797
15798 JBSTAT: HLRZ A,(R)      ;GET JOB INDEX
15799         HRRZ D,JBWST(A) ;GET MOST RECENT STATUS
15800         POPJ P,
15801
15802 JBORS:
15803 JBIRS:  MOVEI D,3       ;RESET IS OPCODE 3
15804         HLRZ A,(R)
15805         HRRM D,JBSTS(A)
15806         CONO PI,CLKOFF
15807         MOVE E,A
15808         PUSHJ P,JBWT    ;WAIT FOR IT TO GET PROCESSED
15809         POPJ P,
15810
15811 JBACCS: MOVEI D,5       ;ACCESS IS OPCODE 5
15812         HLRZ A,(R)
15813         HRRM D,JBSTS(A)
15814         MOVEM B,JBST2(A)
15815         CONO PI,CLKOFF
15816         MOVE E,A
15817         PUSHJ P,JBWT
15818         JRST POPJ1
15819 \f
15820 ;.CALL JOBIOC           (OLD NAME SETIOC STILL WORKS)
15821 ;ARG1:  CHANNEL BOJ DEVICE IS OPEN ON
15822 ;ARG2:  TYPE OF IOCER TO CAUSE
15823
15824 ;THIS CALL CAUSES THE NEXT IOT EXECUTED BY THE
15825 ;PROCEDURE ON THE OTHER END OF THE CHANNEL TO GET
15826 ;THE SPECIFIED IO CHANNEL ERROR
15827
15828 NSTIOC: HLRZ E,H        ;GET JOB CHNL IDX FROM LH OF IOCHNM WD.
15829         CAIL B,MIOTER
15830          CAILE B,NIOTER
15831           JRST OPNL33   ;BAD ARG. (NOT LEGAL IOCER)
15832         TLO B,(SETZ)    ;IN CASE IOCER 0 EVER EXISTS
15833         TLNN R,%CLSBJ
15834          JRST OPNL34    ;NOT BOJ CHANNEL
15835         CONO PI,CLKOFF
15836         MOVE A,JBCUI(E) ;PREPARE TO STOP CREATOR.
15837         SKIPGE JBCG(E)
15838          JRST OPNL41    ;CREATOR WENT AWAY
15839         MOVE H,APRC(A)
15840         TLNE H,BULGOS
15841          JRST OPNL41    ;HE'S BEING KILLED NOW.
15842         PUSHJ P,RPCLSR  ;STOP
15843         MOVEM B,JBIOCJ(E)
15844         AOS (P)
15845         JRST UPCLSR
15846
15847
15848 ;.CALL JOBSTS
15849 ;ARG1 - CHANNEL BOJ IS OPEN ON   - REMAINING ARGS ARE OPTIONAL  -
15850 ;ARG2 - NEW STATUS (RIGHT HALF OF STATUS WORD ONLY - I.E. DEVICE DEPENDENT STUFF)
15851 ;ARG3 - NEW DEVICE NAME FOR PEEK, WHO-LINE STATUS, RFNAME/RCHST
15852 ;ARG4 - NEW FN1 FOR ..
15853 ;ARG5 - NEW FN2 FOR ..
15854 ;ARG6 - NEW SNAME FOR ..
15855 ;ARG7 - NEW OPEN MODE FOR ..
15856 ;ARG8 - BP TO ASCIZ STRING IN USER ADDRESS SPACE CONTAINING FULL FILENAMES.
15857
15858 NJBSTS: TLNN R,%CLSBJ
15859          JRST OPNL34
15860         HLRZ A,(R)      ;GET JOB INDEX
15861         CAIGE W,2       ;DID HE SUPPLY STATUS?
15862          MOVEI B,SNJOB  ;NO - RESET TO INITIAL
15863         HRRM B,JBWST(A) ;REMEMBER WHAT HE SAYS
15864         MOVEI B,8
15865         SUB B,W
15866         JUMPGE B,.+1(B) ;STORE WHATEVER ADDITIONAL ARGS WERE GIVEN
15867           JSP B,NJBST2          ;8
15868           JSP B,NJBST1          ;7
15869           MOVEM TT,JBSYS(A)     ;6
15870           MOVEM E,JBFN2(A)      ;5
15871           MOVEM D,JBFN1(A)      ;4
15872           MOVEM C,JBDEV(A)      ;3
15873           JRST POPJ1            ;2
15874           JRST POPJ1            ;1   (DON'T TAKE THIS INSN OUT)
15875
15876 NJBST1: XOR I,JBOPNM(A)
15877         TRNE I,.BAO#.UAI
15878          JRST OPNL12            ;NOT ALLOWED TO CHANGE BLOCK VS UNIT, IN VS OUT
15879         XORM I,JBOPNM(A)
15880         JRST (B)
15881
15882 NJBST2: MOVE R,Q                ;STORE BP IN Q INTO JBFNP WORD,
15883         PUSHJ P,ASCIND          ;AFTER DOING INDEXING AND INDIRECT.
15884         MOVEM R,JBFNP(A)
15885         JRST (B)
15886 \f
15887 ;       .CALL ADR       ;SKIPS UNLESS JOB END OF CHNL NOT THERE
15888
15889 ;ADR:   SETZ
15890 ;       SIXBIT /JOBINT/
15891 ;       401000,,BOJCH
15892
15893 ;GIVE CREATOR A SECOND WORD INT ON CHANNEL CORRESP TO BOJCH
15894
15895 NJBINT: TLNN R,%CLSBJ   ;ERROR IF NOT BOJ CHNL.
15896          JRST OPNL34
15897         CONO PI,CLKOFF
15898         HLRZ E,H
15899         SKIPGE JBCG(E)
15900          JRST OPNL41
15901         MOVE A,JBCUI(E)
15902         MOVSI D,%CLSJ
15903         SETZ C,
15904         PUSHJ P,CHSCAA
15905             PUSHJ P,[HRRZ B,(R)
15906                      SKIPGE R           ;IOPDL CHNLS DON'T INTERRUPT
15907                       TDNN D,CLSTB(B)
15908                        POPJ P,
15909                      HRRZ B,R
15910                      SUBI B,IOCHNM(A)
15911                      IOR C,CHNBIT(B)
15912                      POPJ P,]
15913         AND C,MSKST2(A)
15914         JUMPE C,OPNL41  ;I CAN'T
15915         MOVN B,C
15916         AND C,B         ;INT ONLY ONCE, ON HIGHEST NUMBERED CHANNEL
15917         IORM C,IFPIR(A)
15918         JRST CLKOJ1
15919
15920
15921 ;.CALL JOBREU
15922 ;ARG 1 - SIMULATED DEVICE NAME
15923 ;ARG 2 - FN1 OF ..
15924 ;ARG 3 - FN2 OF ..
15925 ;ARG 4 - SNAME OF FILE WHICH HANDLER LOADED FROM
15926 ;ARG 5 - AMOUNT OF TIME TO SLEEP WAITING FOR SOMEONE TO OPEN
15927
15928 ;THIS CALL, WHEN EXECUTED BY A JOB DEVICE HANDLER JOB, MAKES
15929 ;THE HANDLER AVAILABLE FOR RE-USE.  TAKES SUCCESS RETURN IF
15930 ;SOMEONE REUSES YOU; YOU SHOULD THEN DO THE "INITIAL JOBGET"
15931
15932 NJBREU: SKIPGE H,JBI(U)
15933          JRST OPNL10    ;NOT A BOJ HANDLER JOB
15934         SKIPL JBCG(H)
15935          PUSHJ P,UFLS   ;WAIT FOR CLOSE TO FINISH HAPPENING
15936         MOVEM A,JBODEV(H)
15937         MOVEM B,JBOFN1(H)
15938         MOVEM C,JBOFN2(H)
15939         MOVEM D,JBOSYN(H)
15940         TLNE E,1000
15941          JRST [ MOVNI E,(E)     ;IMMEDIATE TIME, LOSE ON PCLSR
15942                 SUB E,TIME      ;BUT ACCEPT ANYWAY SINCE NETBLK DOES
15943                 JRST NJBRU1 ]
15944         MOVE TT,E
15945         UMOVE E,(TT)    ;GET TIME ARGUMENT
15946         JUMPL E,NJBRU1
15947         MOVNS E
15948         SUB E,TIME
15949         UMOVEM E,(TT)   ;POS REL TIME GIVEN, MAKE NEG ABS AND WRITE BACK
15950 NJBRU1: MOVSI TT,%JBREU         ;E NOW HAS NEGATIVE TIME TO SLEEP UNTIL
15951         IORM TT,JBWST(H)
15952         PUSHJ P,LOSSET
15953             NJBRUL              ;TURN OFF %JBREU WHEN CALL EXITED FOR WHATEVER REASON
15954         SKIPA T,H
15955          PUSHJ P,NJBRUW
15956           PUSHJ P,UFLS
15957         SKIPGE JBCG(H)
15958          JRST OPNL41    ;TIMED OUT
15959         JRST LSWPJ1
15960
15961 ;FLSINS ROUTINE TO WAIT UNTIL TIMED OUT OR OPENED BY SOMEONE
15962 NJBRUW: MOVN A,AC0S+E(U)
15963         CAML A,TIME
15964          SKIPL JBCG(T)
15965           AOS (P)
15966         POPJ P,
15967
15968 ;LOSSET ROUTINE TO LEAVE AWAITING-REUSE STATE
15969 NJBRUL: MOVSI A,%JBREU
15970         MOVE T,AC0S+H(U)
15971         ANDCAM A,JBWST(T)
15972         POPJ P,
15973 \f
15974 SUBTTL PERIPHERAL DEVICE ROUTINES IN SEPARATE FILES
15975
15976 IFN NMTCS,[
15977  IFN TM10P,[
15978 $INSRT MTAPE
15979  ]
15980  IFN TM03S,[
15981 $INSRT NMTAPE
15982 ]
15983 ]
15984 IFN NUNITS,[
15985 $INSRT UTAPE
15986 ]
15987
15988 $INSRT DISK
15989
15990 IFN NETP,[      ; General ITS network code, includes specific nets
15991 OVHMTR NET
15992 $INSRT NET
15993 ]
15994
15995 IFN E.SP,[
15996 $INSRT ITSDIS
15997 ]
15998
15999 IFN MSPP,[
16000 $INSRT ITSMSP
16001 ]
16002
16003 $INSRT TS3TTY
16004
16005 $INSRT ITSDEV
16006
16007 .BYTE 0         ;RECORD THE SYMS .EVAL'ED BY USER PROGRAMS
16008 $INSRT EVSYMS
16009 .BYTE
16010 \f
16011 SUBTTL DM DAEMON UUO'S
16012
16013 IFE DEMON,ADEMON==ILUUO
16014
16015 IFN DEMON,[
16016 ADEMON: JUMPE J,[AOJA J,.+2]    ;IF J = 0 THEN SUBTRACT ONE
16017         UMOVE J,(J)     ;GET VALUE HERE
16018         PUSHJ P,LSWTL
16019         400000,,DEMSW
16020         PUSHJ P,DEMUSR  ;FIND CURRENT USER IN DEMON TABLE
16021         JRST UTOLKJ     ;FAIL, JUST RETURN, NOT DEMON
16022         HRRE TT,DMTTBL+2(B)
16023         SUB TT,J
16024         HRRM TT,DMTTBL+2(B)     ;PUT NEW COUNT IN DEMON TABLE
16025         SKIPLE TT
16026 UTOLJ1: AOS (P)
16027 UTOLKJ: CONO PI,UTCON
16028         JRST LSWPOP
16029
16030 ADEMSIG:MOVE D,B
16031         CONO PI,CLKOFF  ;DON'T LET SYS JOB LOOK TILL WE'RE READY.
16032         MOVSI T,SCLDMN  ;TELL IT TO LOOK FOR US, AFTER UFLS TURNS CLOCK ON.
16033         IORM T,SUPCOR
16034         SETZB T,SRN3(U) ;SYS JOB WILL SETOM SRN3 TO RESTART US
16035         SKIPN SRN3(U)   ;WITH 0 IN T => FILE EXISTS, OR OPNL CODE.
16036          PUSHJ P,UFLS   ;SYS JOB DETECTS US BY PC=ADEMS1.
16037                         ;DEMON NAME IS EXPECTED TO BE IN A.
16038 ADEMS1: JUMPN T,OPNL1-1(T)
16039         CAIGE W,2       ;NO SECOND ARG, JST SIGNAL
16040          JRST ADEMS3
16041         JUMPL D,NUDMTB  ;IF 2ND ARG < MERELY CALL NUJBST, NO DEMON ENTRY
16042         TDZA TT,TT      ;ZERO OUT TT
16043 ADEMS3:  SETOM TT       ;SET FLAG
16044         PUSHJ P,LSWTL   ;SIEZE SWITCH
16045             DEMSW
16046         PUSHJ P,DEMSIG
16047          JRST LSWPOP    ;SIGNAL FAILED
16048         SKIPN TT        ;FLAG NOT SET
16049          HRLM D,DMTTBL +2(B)    ;SET TIME RQ
16050         JRST CKOPJ1     ;RELEASE SWITCH
16051
16052 NUDMTB: PCLT
16053         PUSHJ P,DMBLK1  ;WAIT TILL DEMON BLOCK IS CLEARED
16054          PUSHJ P,UFLS
16055         HRROI T,DMBLK
16056         MOVEM A,DMBLK   ;SAVE IN BLOCK NOW
16057         PUSHJ P,NUJBST
16058          JRST NUDMTB    ;IF FAILURE AFTER WAIT LOOP BACK
16059         JRST POPJ1      ;SUCCESS
16060
16061 DMBLK1: SKIPGE DMBLK+1  ;FOR DEMON BLOCK TEST
16062          POPJ P,        ;RETURN, NOT FINISHED LOADING
16063         MOVE T,UTTYCT
16064         CAIGE T,MXCZS   ;ROOM IN RING BUFFER
16065          AOS (P)
16066         POPJ P, ;SKIP IF ROOM
16067 \f;UTILITY ROUTINES FOR DEAMONS
16068
16069 DEMSIG: PUSHJ P,DEMNAM  ;LOOK FOR NAME
16070         JRST DEMSG2     ;HAVE TO MAKE NEW ENTRY
16071 DEMSG1: AOS (P)
16072         HLLZ E,DMTTBL+2(B)      ;18 BITS 2'S COMPLEMENT
16073         AOS DMTTBL+2(B)
16074         HLLM E,DMTTBL+2(B)      ;MUST DO THIS WAY TO FIT ABOVE
16075         SKIPE DMTTBL+1(B)       ;DOWN, WANT SYS JOB TO LOOK AT
16076         POPJ P,
16077         MOVSI E,SCLDMN
16078         IORM E,SUPCOR
16079         AOS REQCNT      ;ONLY SIGNAL IF NECESSARY
16080         POPJ P,
16081
16082 DEMSG2: SOSGE DEMCNT    ;IF NO ROOM FLUSH
16083         POPJ P,
16084         PUSH P,A
16085         MOVEI A,DMTLL   ;BUMP POINTER
16086         ADDB A,DMTPTR
16087         IDIVI A,DMLNG   ;TRUNCATE TO LENGNTH OF TABLE
16088         SKIPE DMTTBL(B)
16089         JRST .-4        ;SEARCH FOR NEW ENTRY
16090         POP P,DMTTBL(B) ;SET NAME IN TABLE
16091         JRST DEMSG1
16092
16093 ;ROUTINES TO FIND ENTRY IN TABLE.
16094 ;DEMNAM TAKES NAME IN A, DEMUSR TAKES USER INDEX IN U
16095 ;THEY SKIP RETURN IF SUCCESSFUL, RETURN OTHERWISE
16096 ;IF SUCCESSFUL DEMON TABLE INDEX IS IN B
16097
16098 DEMUSR: JUMPL U,CPOPJ
16099         MOVSI B,-DMLNG
16100         CAMN U,DMTTBL+1(B)
16101         JRST POPJ1
16102         ADD B,[DMTLL,,DMTLL]
16103         JUMPL B,.-3
16104         POPJ P,
16105
16106 DEMNAM: MOVSI B,-DMLNG  ;SEARCH BY NAME
16107         CAMN A,DMTTBL(B)
16108         JRST POPJ1
16109         ADD B,[DMTLL,,DMTLL]
16110         JUMPL B,.-3
16111         POPJ P,
16112
16113 DEMOUT: PUSHJ P,LSWTL   ;CALLED BY KILLING JOB (IN CASE OWNED)
16114         400000,,DEMSW
16115         PUSHJ P,DEMUSR
16116         JRST UTOLKJ
16117         SETZM DMTTBL+1(B)       ;MARK AS DOWN,SYSTEM JOB DECIDES WHAT TO DO
16118         AOS REQCNT
16119         MOVSI B,SCLDMN
16120         IORM B,SUPCOR
16121         JRST UTOLKJ
16122
16123 DEMMRV: SETZM DMTTBL+2(B)       ;CALL WITH UTCOFF (SYS JOB) REMOVES ENTRY FROM TBL
16124         SETZM DMTTBL+3(B)       ;WITH INDEX OF DEMON IN B
16125         SETZM DMTTBL(B)
16126         MOVEI B,1
16127         AOSGE DEMCNT
16128         MOVEM B,DEMCNT
16129         JRST UTCONJ
16130
16131 \f
16132 ;DEAMON READ AND SET STATUS ROUTINES
16133
16134 ARDDMST:        PUSHJ P,LSWTL   ;READ DEAMON STATUS
16135         DEMSW
16136         PUSHJ P,DEMNAM
16137         JRST RDDMS1     ;LOST TRY USER INDEX
16138         MOVE A,DMTTBL+1(B)
16139         MOVEI C,L
16140         IDIVM C,A       ;DIVIDE BY L, DON'T CLOBBER B
16141 RDDMS2: MOVE C,DMTTBL+3(B)
16142         MOVE B,DMTTBL+2(B)
16143         PUSHJ P,LSWPOP
16144         JRST POPJ1
16145
16146 RDDMS1: PUSH P,U
16147         MOVE U,A
16148         PUSHJ P,DEMUSR  ;BAD USER
16149         JRST LKUPOP
16150         POP P,U
16151         MOVE A,DMTTBL(B)
16152         JRST RDDMS2
16153 LKUPOP: POP P,U
16154         JRST LSWPOP
16155
16156 ASTDMST:        PUSHJ P,LSWTL   ;SET DEAMON STATUS
16157         400000,,DEMSW
16158         MOVE D,B
16159         PUSHJ P,DEMNAM
16160         JRST STDMS1
16161 STDMS2: JUMPL D,STDMS4
16162 STDMS3: SOSLE W
16163         MOVEM D,DMTTBL+2(B)
16164         SOSLE W
16165         MOVEM C,DMTTBL+3(B)
16166         JRST UTOLJ1
16167 STDMS1: PUSH P,U
16168         MOVE U,A
16169         PUSHJ P,DEMUSR
16170         JRST UTULKP
16171         POP P,U
16172         JUMPGE D,STDMS2
16173 STDMS4: SKIPGE DMTTBL+1(B)      ;REMOVE FROM TABLE IF POSSIBLE
16174         JRST UTOLKJ     ;CAN'T DELETE, LOADING
16175         SETZM DMTTBL+1(B)       ;DOWN
16176         SETZM DMTTBL+2(B)       ;REMOVE REQUESTS
16177         AOS REQCNT      ;SIGNAL SYS JOB
16178         MOVSI B,SCLDMN
16179         IORM B,SUPCOR
16180         JRST UTOLJ1
16181 UTULKP: POP P,U
16182         JRST UTOLKJ
16183 ]
16184
16185 \f
16186 SUBTTL .GETSYS UUO
16187
16188 ;.GETSYS AC,    ;TRANSFERS SYSTEM AREA SPECIFIED BY C(AC+1)
16189                 ;TO USER AREA STARTING AT R.H. C(AC) OF LENGTH MINUS L.H. C(AC)
16190
16191 AGETSYS:
16192 ; Alan 4/2/86:  Took this out because people don't use .GETSYS this way
16193 ; anymore:
16194 ;       PUSHJ P,UDELAY          ;CAUSE A SCHEDULE TO STOP GETSYSER FROM
16195 ;                               ; MONOPOLIZING SYSTEM
16196         MOVSI A,-LGSNAM         ;NEGATIVE OF TABLE LENGTH
16197         UMOVE B,1(J)            ;LOOK AT USERS AC+1, THE 6BIT NAME
16198         CAME B,GSNAME(A)        ;CYCLE THROUGH TABLE
16199          AOBJN A,.-1            ;OF NAMES, POINTER IN RIGHT HALF OF A
16200         JUMPGE A,AGETSL         ;JUMP IF NOT IN TABLE
16201         UMOVE B,(J)             ;GET POINTER TO USERS RECEPTACLE BLOCK
16202 AGETS1: HLRZ C,GSYS1(A)         ;GET LOW END OF BLOCK
16203         HRRZS A                 ;CLEAR COUNT IN L.H. OF A
16204         CAIGE A,NUTCFN          ;SKIP IF UTC OFF NOT REQUIRD
16205          CONO PI,UTCOFF         ;TURN OFF ALL CHANNELS BUT CH 1
16206         skipn c                 ; If LH contains 0, RH is routine to call.
16207          jrst @gsys1(a)         ; (JUMPE C,@GSYS1(A) generates spurious
16208                                 ; page faults, so don't "fix" this.)
16209         HRRZ D,GSYS1(A)         ;GET HIGH END OF BLOCK
16210 ;AT THIS POINT:         ;B USER'S POINTER (UNRELOCATED)
16211                         ;C BEGINNING OF AREA IN SYS
16212                         ;D END OF AREA
16213 agets2: SUBI D,-1(C)            ;BLOCK LENGTH TO BE SENT
16214         HLRZ E,B                ;GET NEG BLK LENGTH FROM USERS PNTR
16215         ADDI E,-1(D)            ;-1 CAUSES CARRY BIT IF .GT.
16216         TLNE E,-1               ;CARRY INDICATES LOSS
16217          JRST AGETS5            ;MORE THAN USER WANTS
16218         HRLS D                  ;BLOCK LENGTH IN BOTH HALVES
16219         HRRZ E,B                ;FIRST WORD (UNRELOCATED)
16220         HRL E,C                 ;SOURCE ADDRESS FOR BLT
16221         HRRZ C,E                ;DESTINATION INTO C
16222         ADD C,D                 ;FINAL ADDRESS +1
16223 AGETS7: XCTRI XBW,[BLT E,-1(C)] ;BLT IT TO HIM
16224          AOSA (P)               ;INCREMENT RETURN, INDICATE SUCCESS
16225           JRST AGETS6
16226         CONO PI,UTCON
16227         ADD B,D
16228         UMOVEM B,(J)            ;TELL USER HOW MUCH HE GOT
16229 AGETS4: POPJ P,
16230
16231 AGETSL: XCTR XW,[SETZM 1(J)]    ;INDICATE BAD SIXBIT
16232         POPJ P,
16233
16234 AGETS5: MOVNS D                 ;TELL USER HOW MUCH HE NEEDS
16235         CONO PI,UTCON           ;NEGATIVE OF RIGHT BLOCK LENGTH
16236         XCTR XRW,[HRLM D,(J)]   ;SET UP PROPER BLOCK LENGTH IN HIS AC
16237         JRST AGETS4
16238
16239 AGETS6: CONO PI,UTCON           ;ONE PAGE WASN'T THERE
16240         XCTR XRW,[MOVES (E)]    ;SO TOUCH IT (TAKE MPV INTERRUPT IF REAL MPV)
16241         JRST AGETS1             ;AND TRY AGAIN (BLT WILL GET FARTHER THIS TIME)
16242                                 ;HAD TO RETRY FROM BEGINNING SINCE THIS MAY BE
16243                                 ;ONE THAT HAS TO BE TRANSFERRED INTACT WITH UTCOFF
16244 \f
16245 GSNAME: SIXBIT /MEMORY/
16246 IFN NUNITS,SIXBIT /UTAPE/
16247 IFN NCPP,[SIXBIT /NCPSM/
16248         SIXBIT /NCPPQ/
16249         SIXBIT /NCPHT/
16250 ]
16251 NUTCFN==.-GSNAME        ;NUMBER TO GET WITH UTCOFF (same as NETOFF)
16252         SIXBIT /USERS/
16253         SIXBIT /USER/
16254         SIXBIT /GETS/
16255         SIXBIT /DEVS/
16256         SIXBIT /CALLS/
16257 IFN IMXP,       SIXBIT /IMPX/
16258         SIXBIT /CLINK/
16259         SIXBIT /DSYMS/
16260         SIXBIT /USYMS/  ;.UPC, .VAL, .TTY, ETC.
16261         SIXBIT /CHDEVS/
16262         SIXBIT /NCALLS/
16263         SIXBIT /TTYVAR/
16264         SIXBIT /USRVAR/
16265         SIXBIT /ITSNMS/
16266 LGSNAM==:.-GSNAME
16267
16268 ;ENTRIES ARE:   BOTTOM,,TOP  OF AREA TO BE TRANSMITTED OR INST TO EXECUTE
16269 GSYS1:  IOBFTL,,EMEMTL          ;lh zero => jrst to THIS ENTRY
16270 IFN NUNITS, UTCHNT,,UTCHE       ;UTAPE
16271 IFN NCPP,[IMSOKB,,IMSOKE        ;NCP SOCKET MAP
16272         IMPBPQ-1,,IMPEPQ        ;NCP PENDING RFC QUEUE
16273         IMPHTB,,IMPHTB+255.     ;NCP HOST TABLE
16274 ]
16275         0,,USRSV                ;USERS
16276         0,,USR1V                ;USER
16277         GSNAME,,GSNAME+LGSNAM-1 ;GETS
16278         DEVTAB,,EDEVS           ;DEVS
16279         SYSYMB,,SYSYME          ;CALLS
16280 IFN IMXP,       IMXTBB,,IMXTBE  ;IMPX
16281         CLVBEG,,CLVEND          ;CLINK
16282         0,,DSYMS                ;DSYMS
16283         SYSUSB,,SYSUSE          ;USYMS
16284         DCHSTB,,DCHSTE          ;CHDEVS
16285         SYSCTB,,SYSCTB+LSYSCT-1 ;NCALLS
16286         TYVTAB,,TYVTAB+LTYVTA-1 ;TTYVAR
16287         USETTB,,USETTB+MXVAL-1  ;USRVAR
16288         ITSNMS,,ITSNMS+LITSNM-1 ;ITSNMS
16289 IFN LGSNAM-<.-GSYS1>, .ERR GSNAME and GSYS1 don't match.
16290
16291 ITSNMS: ITSIRP [
16292         SIXBIT /ITS/
16293         ]
16294 LITSNM==:.-ITSNMS
16295         0
16296         0                       ; Make it easy to add more.
16297
16298 USRSV:  MOVEI C,USRSTG
16299         MOVE D,USRHI
16300         ADDI D,USRSTG-1
16301         JRST agets2
16302
16303 USR1V:  UMOVE C,2(J)
16304         IMULI C,LUBLK
16305         CAML C,USRHI
16306          JRST USR1VL
16307         ADDI C,USRSTG
16308         MOVE D,C
16309         ADDI D,LUBLK-1
16310         JRST agets2
16311
16312 USR1VL: XCTR XW,[SETOM 2(J)]
16313         JRST AGETS4
16314
16315 DSYMS:  HRRZ C,DDT-2
16316         HLRE D,DDT-2
16317         SETCMM D        ;OFFSET BY ONE
16318         ADD D,C
16319         JRST agets2
16320 \f
16321 SUBTTL .GETLOC, .EVAL, ETC.
16322
16323 ;GET AN ABSOLUTE LOCATION       ;.GETLOC AC,    ;C(A)=FROM(ABS),,TO(RELATIVE)
16324 ;
16325 AGETLOC:UMOVE A,(J)             ;GET TO ADDRESS
16326         HLRZ B,A                ;GET FROM ADDRESS
16327         XCTRI [MOVE C,(B)]
16328          JRST .+2
16329           JRST ILEXPF           ;ILLEGAL EXEC PAGE FAULT
16330         UMOVEM C,(A)            ;GIVE TO USER
16331         POPJ P,
16332
16333 ;SET AN ABSOLUTE LOCATION       ;.SETLOC AC,    ;C(AC)=FROM(RELATIVE),,TO(ABS)
16334 ;
16335 ASETLOC:TDZA D,D        ;CLEAR COND FLAG, SKIP
16336
16337 ;SET AN ABSOLUTE LOCATION ONLY IF C(ABS)=C(TEST) & SKIP IF SUCCESSFUL
16338 ;.IFSET AC,     ;C(AC)=<POINTER TO 2 WORD BLOCK>,,TO ADR(ABS)
16339 ;WORD 1=TEST    ;WORD 2=NEW C(ABS)
16340
16341 AIFSET: MOVNI D,1       ;SET COND FLAG
16342         XCTR XR,[HRRZ A,(J)]    ;GET TO ADDRESS (ABSOLUTE)
16343         XCTR XR,[HLRZ B,(J)]
16344         UMOVE C,(B)             ;GET WORD
16345         XCTRI [MOVES (A)]
16346          JRST .+2
16347           JRST ILEXPF
16348         JUMPE D,ASPST1  ;NORMAL SETLOC
16349         UMOVE D,1(B)    ;GET NEW VALUE
16350         CONO PI,CLKOFF  ;PREVENT INTERRUPTS
16351         CAME C,(A)      ;CHECK WORD AGAINST TEST WORD
16352          JRST CLKONJ    ;NOT EQUAL => IGNORE
16353         MOVE C,D
16354         AOS (P)         ;CAUSE RETURN TO SKIP
16355         CAIG A,SYSB_10. ;CHECK IF IN SYS
16356          JRST ASPST1    ;YES SO DO REG SETLOC
16357         EXCH D,(A)      ;NO SO DO NOW BEFORE SHUFFLE & GET OLD
16358 ASPST2: MOVE C,D
16359         HRROS A         ;LET SYS JOB KNOW ALREADY DONE
16360 ASPST1: CAMN C,(A)      ;SKIP IF DIFFERENT FROM C(TO ADR)
16361          JRST CLKONJ    ;SAME
16362         MOVE D,SYSITM   ;IF SYSTEM JOB HAS BEEN HUNG OR LOOPING FOR 30 SEC,
16363         ADDI D,30.*30.
16364         CAMGE D,TIME
16365          JUMPGE A,ASPST3        ;GO DO THE WORK OURSELVES (BUT DON'T DO IT TWICE).
16366 ASPST4: MOVE D,UNAME(U) ;GET UNAME OF SETLOCER
16367         MOVSI T,SCLSET
16368         PUSHJ P,CWAIT   ;WAIT TILL VARIABLES TO COMMUNICATE WITH SYS JOB ARE FREE
16369             TDNE T,SUPCOR       ;ARG TO CALL IN .-1
16370         MOVEM A,SETSLC  ;REMEMBER ABS LOCATION
16371         MOVEM C,SETSLQ  ; " NEW CONTENTS (OR OLD IF LH(SETSLC)=-1)
16372         MOVEM D,SETSU   ; " USER
16373 CSPST:  IORM T,SUPCOR   ;TELL SYS JOB TO DO IT
16374         JRST CLKONJ
16375
16376 ASPST3: HRRZ D,UPC      ;SYS JOB HAS BEEN HANGING FOR 30 SEC.
16377         CAIN D,SCOR1    ;WHY? JUST SLEEPING?
16378          JRST ASPST4    ;YES => SIGNAL IT TO DO THE WORK
16379         MOVEM C,(A)     ;ELSE GIVE UP ON IT AND DO IT NOW
16380         JRST CLKONJ
16381 \f
16382 ;LOOK UP ITS SYMBOL     ;.EVAL AC,      ;C(AC)=SQUOZE SYMBOL
16383 ;REPLACES SYMBOL BY VALUE & SKIPS IF SUCCESSFUL
16384 ;IF YOU WANT TO .EVAL A SYMBOL IN A PROGRAM HABITUALLY AND IMPLICITLY,
16385 ;AND WANT IT TO CONTINUE TO WORK, YOU HAD BETTER ADD AN ENTRY TO THE FILE
16386 ;AI:SYSTEM;EVSYMS > SAYING WHAT PROGRAM AND WHAT SYMBOL. THEN, ITS HACKERS
16387 ;CAN AVOID SCREWING YOU WITHOUT WARNING.
16388
16389 AEVAL:  PUSHJ P,SWTL
16390         ARDFSW
16391         UMOVE B,(J)     ;GET SYM
16392         PUSHJ P,SYMLK   ;LOOK UP
16393         JRST LSWPOP     ;NOT FOUND
16394         MOVE A,(C)      ;GET VALUE
16395         PUSHJ P,LSWPOP
16396         AOS (P)         ;CAUSE UUO TO SKIP
16397         JRST APTUAJ     ;RETURN VALUE
16398
16399 ;REDEFINE ITS SYMBOL    ;.REDEF AC,     ;C(AC)=POINTER TO 2 WORD BLOCK
16400 ;WORD 1 = SYMBOL        ;WORD 2 = VALUE
16401 ;DELETE SYM IF ALL 4 FLAG BITS SET
16402 ;  OTHERWISE SET SYMBOL FLAGS TO THOSE SPECIFIED, EXCEPT REJECT ANY ATTEMPT TO
16403 ;  ADD A PROGRAM NAME
16404 ;ADD SYM IF NOT FOUND   ;FAIL ONLY IF NOT ENOUGH ROOM
16405 ;SKIPS IF SUCCESSFUL
16406
16407 AREDEF: PUSHJ P,SWTL
16408             ARDFSW
16409         XCTR XR,[HRRZ D,(J)]    ;GET POINTER FROM AC
16410         UMOVE B,(D)     ;GET SYMBOL
16411         PUSHJ P,SYMLK   ;LOOK UP
16412         JRST ARDF2      ;NOT FOUND, CREATE
16413         XCTR XR,[SETCM A,(D)]   ;GET SYM (COMPLEMENTED)
16414         TLNN A,740000   ;SKIP IF ANY FLAGS NOT SET
16415         JRST ARDF3      ;ALL SET => DELETE
16416         SETCA A,
16417         TLNN A,740000
16418         JRST LSWPOP
16419         MOVEM A,-1(C)
16420         UMOVE A,1(D)    ;GET VALUE
16421         MOVEM A,(C)     ;STORE IN SYMTAB
16422         JRST ARDF4      ;SORT AND SKIP-RETURN.
16423
16424 ARDF2:  MOVE C,DDT-2    ;GET POINTER
16425         SUB C,[2,,2]    ;DECREMENT FOR NEW ENTRY
16426         MOVEI A,-1(C)   ;FUDGE FOR BLOCK CALC
16427         LSH A,-10.      ;CONVERT TO # OF BLOCKS UP TO SYMTAB -1
16428         UMOVE B,(D)     ;GET SYM
16429         MOVE T,FDDTPG
16430         LSH T,10.
16431         TLNE B,740000   ;LOSE IF PROG NAME
16432         CAMLE A,T       ;CHECK FOR LOSSAGE
16433          JRST LSWPOP    ;DON'T OVERWRITE ITS
16434         EXCH B,2(C)     ;STORE OVER GLOBAL BLOCK HEADER,
16435         MOVEM B,(C)     ;MOVE THAT HEADER DOWN 2 WDS.
16436         UMOVE A,1(D)    ;GET VALUE
16437         EXCH A,3(C)
16438         ADD A,[-2,,]    ;1 MORE SYM IN GLOBAL BLOCK.
16439         MOVEM A,1(C)    ;STORE
16440         MOVEM C,DDT-2   ;UPDATE POINTER
16441         JRST ARDF4      ;GO SORT AND SKIP-RETURN.
16442
16443 ARDF3:  MOVE B,DDT-2    ;GET POINTER
16444         MOVE A,(B)      ;MOVE THE GLOBAL HEADER
16445         EXCH A,2(B)     ;UP OVER 1ST SYM
16446         MOVEM A,-1(C)   ;WHICH GOES INTO FREE SLOT.
16447         MOVE A,1(B)
16448         ADD A,[2,,]     ;GLOBAL BLOCK 1 SYM SHORTER.
16449         EXCH A,3(B)
16450         MOVEM A,(C)
16451         MOVE A,[2,,2]
16452         ADDM A,DDT-2    ;UPDATE POINTER
16453 ARDF4:  MOVSI E,(SETZ)  ;TELL DDT ITS SYMTAB WAS ALTERED.
16454         IORM E,DDT-1
16455         PUSHJ P,SBUBL   ;DO 1 BUBBLE-SORT UP AND 1 DOWN.
16456         JRST LSWPJ1     ;FREE ARDFSW AND EXIT.
16457 \f
16458 ;DO ONE BUBBLE SORT PASS UP, ONE DOWN; LEAVE J <0 IFF DID AN EXCHANGE.
16459 ;CLOBBER A-E.
16460 SBUBL:  MOVE E,DDT-2
16461         HLL E,1(E)
16462         ADD E,[2,,2]    ;AOBJN -> SYMS IN GLOBAL BLOCK.
16463 SBUBL0: SETZ J,
16464         MOVE B,[2,,2]   ;INCREMENT FOR UPWARD PASS.
16465         MOVE C,[JUMPL A,SBUBL1]
16466         SUBI E,2        ;(WILL INCREMENT BEFORE ACTING)
16467         MOVE A,E
16468         PUSHJ P,SBUBL2
16469         MOVNS B         ;DECREMENT FOR DOWNWARD PASS.
16470         MOVE C,[CAMN A,E]
16471         JRST SBUBL2
16472
16473 SBUBL1: MOVE D,1(A)     ;CHECK NEXT PAIR OF ENTRIES.
16474         CAMG D,3(A)
16475          JRST SBUBL2    ;IN CORRECT ORDER.
16476         EXCH D,3(A)
16477         MOVEM D,1(A)    ;WRONG ORDER, EXCHANGE.
16478         MOVE D,(A)
16479         EXCH D,2(A)
16480         MOVEM D,(A)
16481         SETO J,         ;SAY DID AN EXCHANGE.
16482 SBUBL2: ADD A,B         ;MOVE TO NEXT ENTRY.
16483         XCT C           ;TEST IF FINISHED.
16484          POPJ P,
16485         JRST SBUBL1     ;(NOT FINISHED)
16486
16487 ;LOOK UP SYMBOL IN B IN ITS SYMBOL TABLE (CLOBBERS A,B,C)
16488 ;RETURN WITH POINTER TO VALUE WORD IN C
16489 ;SKIPS IF SUCCESSFUL
16490
16491 SYMLK:  TLZ B,740000    ;FLUSH FLAGS
16492         MOVE C,774000-2 ;PICK UP AOBJN POINTER TO SYMTAB FROM EXEC DDT
16493 SYMLK2: MOVE A,(C)      ;GET SYM
16494         AOBJP C,[JRST 4,.+1]    ;INCREMENT POINTER
16495         TLNE C,376      ;GO THROUGH HAIR EVERY 200 SYMS
16496         JRST SYMLK3     ;NOT THIS TIME
16497         PUSHJ P,OPBRK
16498 SYMLK3: TLNN A,200000   ;SKIP IF DELETE INPUT (FLAG PREVENTS MATCH)
16499         TLZE A,740000   ;FLUSH FLAGS & CAUSE LOSS IF ALL 0 (PROG NAME)
16500         CAME A,B        ;COMPARE
16501         AOBJN C,SYMLK2  ;LOSS, TRY ANOTHER
16502         JUMPL C,POPJ1   ;SKIP RETURN IF FOUND
16503         POPJ P,         ;NOT SO IF LOSS
16504
16505 AWSNAME:XCTR XR,[SKIPE B,(J)]   ;OPER 35
16506          MOVEM B,USYSNM(U)
16507         POPJ P,
16508
16509 AUPISET:UMOVE B,(J)     ;OPER 36
16510         ASH B,-35.
16511         EXCH B,PICLR(U)
16512         UMOVEM B,(J)
16513         SKIPN PICLR(U)
16514          POPJ P,
16515         JRST APISE1
16516 \f
16517 ;GENERATE A UNIQUE SYM  ;.GENSYM AC,    ;LOADS AC WITH SYM
16518 ;
16519 AGENSYM:PUSHJ P,SWTL    ;WAIT TILL INTERLOCK FREE THEN SEIZE IT
16520           GENSSW
16521         MOVEI TT,IGNSYM
16522         PUSHJ P,SIXAOS  ;INCREMENT SYM
16523         MOVE A,IGNSYM   ;GET SYM
16524         PUSHJ P,LSWPOP  ;UNLOCK FOR NEXT USER
16525         JRST APTUAJ     ;GIVE USER GENERATED SYMBOL
16526
16527 ;GENERATE A UNIQUE NUM  ;.GENNUM AC,    ;LOADS AC WITH NUMBER 
16528 ;
16529 AGENNUM:AOS A,IGNNUM    ;INCREMENT NUMBER
16530         JRST APTUAJ     ;AND GIVE IT TO USER
16531
16532 EBLK
16533
16534 GENSSW: -1
16535         0
16536 IGNSYM: SIXBIT /SYS/
16537
16538 IGNNUM: 0
16539
16540 BBLK
16541
16542 SIXAOS: PUSH P,I
16543         PUSH P,J
16544         AOS (TT)        ;INCREMENT SYM
16545         MOVE I,[440600,,(TT)]   ;GET POINTER TO FIRST CHAR
16546 SIXAS2: ILDB J,I        ;GET FIRST (NEXT) CHAR
16547         SKIPN J         ;SKIP IF NOT ZERO
16548         MOVEI J,1       ;REPLACE EMBEDDED SPACE WITH "!"
16549         DPB J,I         ;PUT BACK
16550         CAME I,[60600,,(TT)]    ;SKIP IF FIRST FIVE CHARS HAVE BEEN EXAMINED
16551          JRST SIXAS2    ;GO TO NEXT CHAR
16552         POP P,J
16553         POP P,I
16554         POPJ P,
16555 \f
16556 IFN KL10P,[
16557
16558 SUBTTL KL10 PERFORMANCE COUNTER
16559
16560 ;KLPERF SYMBOLIC SYSTEM CALL
16561 ;ARG 1: <JOB> TO MEASURE PERFORMANCE DURING;
16562         ;-3 => NULL JOB, -4 => ALL JOBS
16563 ;ARG 2: P.A. ENABLES WORD (SEE NON-EXISTENT KL10 SYS REF MAN)
16564         ;0 => FREE THE FACILITY, ELSE TRIES TO GRAB IT
16565 ;NO ARGS => JUST READS THE VALUES WITHOUT CHANGING THE ENABLING CONDITIONS.
16566         ;IN THAT CASE, IT IS OK IF FACILITY IS OWNED BY SOMEONE ELSE
16567 ;VAL 1: PREVIOUS <JOB> SETTING
16568 ;VAL 2: PREVIOUS P.A. ENABLE WORD
16569 ;VAL 3: TIME BASE HIGH WORD
16570 ;VAL 4: TIME BASE LOW WORD
16571 ;VAL 5: PERF CTR HIGH WORD
16572 ;VAL 6: PERF CTR LOW WORD
16573
16574 KLPERF: CONO PI,CLKOFF
16575         JUMPN W,KLPER1
16576 KLPER0: MOVE J,MTRJOB   ;NO ARGS => DONT CHANGE SETTINGS,
16577         MOVE B,PAEON    ;JUST RETURN CURRENT COUNT.
16578         JRST KLPER3
16579
16580 KLPER1: JUMPN B,KLPER2  ;TRYING TO TURN IT ON?
16581         CAME U,MTRUSR
16582          JRST KLPER0    ;FREEING THE FACILITY WHEN DON'T OWN IT?
16583         PUSHJ P,PRFOFF  ;NO, TRYING TO FREE IT - DO SO.
16584         MOVEI J,-2
16585         JRST KLPER3
16586
16587 KLPER2: SKIPGE MTRUSR   ;IF FACILITY IS FREE, SIEZE IT.
16588          MOVEM U,MTRUSR
16589         CAME U,MTRUSR
16590          JRST OPNL10    ;ALREADY BELONGS TO SOME OTHER JOB.
16591         MOVEI J,2(A)
16592         CAIN J,-2       ;ALL JOBS?
16593          JRST KLPER4
16594         CAIN J,-1       ;NULL JOB?
16595          JRST KLPER3
16596         MOVE J,A
16597         JSP T,NCRUI2    ;ELSE DECODE JOB SPEC; OBJECT TO PDP6
16598          JFCL
16599         CAME J,U
16600          JRST KLPER3
16601 ;TRYING TO TURN ON FOR SELF OR ALL JOBS - IT OUGHT TO BE ON RIGHT NOW!
16602 KLPER4: CONO MTR,2001   ;TURN ON TIME BASE, INTERVAL PIA=1
16603         WRPAE B         ;SET ENABLES
16604 KLPER3: EXCH B,PAEON
16605         SKIPGE A,MTRJOB
16606          TRZA A,2       ;UN CONVERT -1 => -3, -2 => -4
16607           LSH A,-9      ;IDIVI A,LUBLK
16608 IF2 IFN LUBLK-1000,.ERR NO DIVIDE
16609         HRREM J,MTRJOB
16610         RCCL C          ;C,D GET TIME BASE
16611         RPERFC E        ;E,TT GET PERFC
16612         JRST CLKOJ1
16613
16614 ;TURN OFF THE PERFORMANCE COUNTER.  PUT BACK IN RUN-TIME MEASURING MODE
16615 PRFOFF: MOVNI A,2       ;NOT ATTACHED TO ANY JOB
16616         MOVEM A,MTRJOB
16617         WRPAE [1576,,1200]      ;MEASURE MAIN-PROGRAM TIME IN 80 NS UNITS (MODEL A)
16618         CONO MTR,4001   ;TIME-BASE OFF, INTERVAL PIA=1
16619         RPERFC STPERF   ;START-OF-QUANTUM TIME IS NOW
16620         RPERFC NULPRF   ;ALSO FOR NULL-JOB
16621         SETOM MTRUSR    ;NO LONGER IN USE
16622         POPJ P,
16623 ] ;END IFN KL10P
16624 \f
16625 $INSRT CORE             ;CORE JOB AND MEMORY MANAGEMENT ROUTINES
16626
16627 SUBTTL NULL DEVICE
16628 ;  IMMEDIATE EOF ON INPUT, HAS NO EFFECT ON OUTPUT
16629 ;
16630 NULO:   HLRS A,C                ;REMEMBER MODE FOR .STATUS
16631         JSP Q,OPSLC3            ;SET UP IOCHNM WORD AND EXIT
16632             NLIDN,,NLODN        ;ARG
16633             NLBIDN,,NLBDN       ;ARG
16634
16635 ;UNIT NULL DEVICE INPUT
16636 NULI:   JRST UNIEOF
16637
16638 ;BLOCK NULL DEVICE INPUT
16639 NULBI:  POPJ P,
16640
16641 ;BLOCK NULL DEVICE OUTPUT ENTRY
16642 ;ADVANCE BLOCK MODE .IOT POINTER
16643 NULBOD: XCTR XR,[HLRE A,(C)]    ;GET NEG LENGTH FROM LEFT HALF
16644         MOVNS A                 ;GET POSITIVE LENGTH
16645         XCTR XR,[ADD A,(C)]     ;ADD STARTING LOC (R.H.)
16646         XCTR XW,[HRRZM A,(C)]   ;STORE BACK "COUNTED OUT" POINTER
16647         POPJ P,
16648
16649 ;STANDARD DEVICE .STATUS ROUTINE
16650 STDSTA: DPB A,[60300,,D]        ;A HAS LH OF IOC WORD
16651         TRO D,1_9               ;SYS BUF CAP FULL
16652         TRNE D,1_6              ;SKIP IF INPUT
16653         TRC D,3_9               ;TURN OFF SYS BUF CAP FULL, SET EMPTY
16654         POPJ P,
16655 \f
16656 SUBTTL USER DEVICE
16657
16658 UBPFJ==10       ;DEMAND FOREIGN JOB (BIT IN LH (DEV) FOR .OPEN (USR))
16659
16660 USROJ:  TDZA J,J        ;ENTRY FROM JOB DEVICE DONT GET CORE.
16661 USRO:   MOVNI J,1       ;INDICATE NOT FROM JOB OPEN
16662         CAIA
16663 USROOJ:  MOVEI J,1      ;OJB DEVICE; EXISTING JOB OK ONLY IF %OPOJB BIT SET.
16664         PCLT
16665         SKIPL CORRQ(U)
16666         PUSHJ P,UFLS    ;PREVENT ATTEMPT TO CORE, PCLSR OUT, AND THINK YOU'VE WON AT SETBF1, ETC
16667         PUSHJ P,SWTL
16668             TREESW
16669         JUMPE B,USRO4   ;JNAME = 0 => UNAME IS JOB SPEC.
16670         SKIPN A         ;IF UNAME=0
16671          MOVE A,UNAME(U)        ;MAKE IT THIS JOB'S UNAME
16672         CAME A,UNAME(U) ;SKIP IF FIRST FILE NAME IS UNAME OF OPENER
16673          JRST USROA
16674         CAME B,[SIXBIT /PDP10/] ;SKIP IF SECOND FILE NAME IS "PDP10"
16675          CAMN B,[SIXBIT /PDP6/] ;OR PDP6
16676 IFN PDP6P,JRST PDPO
16677     .ELSE JRST OPNL1
16678 USROA:  CONO PI,CLKOFF
16679         PUSHJ P,LSWPOP  ;TREESW
16680 USROB:  SETZ TT,
16681 USRO3:  CAME A,UNAME(TT)
16682          JRST AGIN
16683         CAMN B,JNAME(TT)
16684          JRST UFN1      ;FOUND UNAME JNAME PAIR
16685 AGIN:   ADDI TT,LUBLK
16686         CAMGE TT,USRHI
16687          JRST USRO3
16688         TLNE C,UBPFJ    ;JOB MUST EXIST TO WIN IF UBPFJ SET
16689          JRST OPNL4
16690         CAME A,UNAME(U) ;INFERIOR PROCEDURE MUST HAVE SAME UNAME
16691          JRST OPNL20
16692         PUSH P,U
16693 TCORS:  MOVSI T,%TBNOT+%TBDTY   ;DOESN'T HAVE TTY, ISN'T GIVING IT AWAY
16694         PUSHJ P,USTRA
16695          JRST TCORS1    ;USTRA FAILED - SEE WHY, MAYBE RETRY (U CLOBBERED)
16696         MOVEM A,UNAME(U)
16697         MOVEM B,JNAME(U)
16698         MOVEM A,USYSNM(U)
16699         MOVE TT,U
16700         POP P,U
16701         MOVE A,UTMPTR(U)
16702         MOVEM A,UTMPTR(TT)
16703         MOVE A,HSNAME(U)
16704         MOVEM A,HSNAME(TT)
16705         MOVE A,XUNAME(U)
16706         MOVEM A,XUNAME(TT)
16707         MOVEM B,XJNAME(TT)
16708         PUSHJ P,USRST5  ;SET UP TTY STUFF
16709         MOVSI A,400000
16710         SKIPGE APRC(U)
16711          IORM A,APRC(TT)        ;NEW INFERIOR IS DISOWNED IF CREATOR IS.
16712         JUMPE J,CLKOJ1  ;RETURN HERE FOR JOB DEVICE (INDEX IN TT)
16713         PUSHJ P,ULUP1   ;FIND AN INTERRUPT BIT FOR THE JOB.
16714          JRST NOGO1     ;NONE => GO KILL THE JOB AND RETURN FAILURE.
16715         CONO PI,CLKON   ;NOW CAN'T FAIL TO CREATE THE JOB FOR GOOD.
16716         HRLZ B,B
16717         HRR B,U
16718         MOVEM B,SUPPRO(TT)
16719         MOVE U,TT
16720         PUSHJ P,UFOUND  ;SET UP THE OPENER'S CHANNEL.
16721          JFCL
16722         MOVE Q,TT
16723         MOVEI B,1
16724         PUSHJ P,ACORE1  ;MAY PCLSR OUT, BUT CORE JOB WILL DO WORK ANYWAY.
16725          SKIPA R,UUAC(U);NO CORE AVAILABLE, KILL THE JOB
16726           JRST POPJ1    ;SUCCESS
16727         ADDI R,IOCHNM(U)
16728         PUSHJ P,AUCLOSE
16729         JRST OPNL37     ;NO CORE AVAILABLE
16730 \f
16731 ULUP1:  CLEARB A,T
16732 ULUP:   HRRZ E,SUPPRO(T)
16733         SKIPN UNAME(T)  ;SKIP IF VARIABLE BLOCK IN USE
16734         JRST ULUP2
16735         CAIN E,(U)      ;SKIP IF NOT AN INFERIOR
16736         IOR A,SUPPRO(T) ;IOR IN INTERRUPT BIT OF INFERIOR
16737 ULUP2:  ADDI T,LUBLK    ;ADVANCE TO NEXT BLOCK
16738         CAMGE T,USRHI   ;SKIP IF ALL EXAMINED
16739         JRST ULUP       ;LOOP
16740 UFIN:   MOVEI B,1       ;SELECT INT BIT
16741 UFIN2:  TLON A,(B)
16742         JRST POPJ1
16743         LSH B,1
16744         CAIGE B,1_<NINFP>
16745         JRST UFIN2
16746         POPJ P,
16747
16748 NOGO1:  MOVSI T,BULGO+BULGOS
16749         IORM T,APRC(TT) ;TELL THE SYS JOB TO KILL THE JOB WE JUST GOT
16750         MOVSI T,SCLGUN
16751         IORM T,SUPCOR
16752         JRST OPNL5      ;DIREC FULL (TOO MANY LOSERS)
16753
16754 NOGO4:  SUB P,[1,,1]
16755         JRST OPNL6
16756
16757 TCORS1: PCLT            ;COME HERE FROM TCORS IF ATTEMPT TO FIND FREE JOB SLOT FAILED.
16758         SKIPGE SJCFF    ;IF THIS IS NEGATIVE, USTRA DIDN'T EVEN REQUEST MORE
16759          JRST [ SKIPGE SJCFF
16760                  PUSHJ P,UFLS
16761                 JRST TCORS2]
16762         MOVE TT,USRHI
16763         CAIL TT,MAXJ*LUBLK
16764          JRST NOGO4                     ;USER MEM EXPANDED TO MAX
16765         SKIPGE SUPCOR   .SEE SCLEX      ;PRESUMABLY USTRA ASKED SYS JOB FOR MORE JOB SLOTS
16766          PUSHJ P,UFLS                   ;SO WAIT TILL SYS JOB ANSWERS THE REQUEST
16767 TCORS2: CONO PI,CLKOFF                  ;AND SEE IF THERE ARE NOW ENOUGH SLOTS.
16768         JRST TCORS
16769 \f
16770 USRO4:  EXCH J,A        ;USR: OPEN WITH JNAME=0: USE UNAME AS JOB SPEC.
16771         JSP T,NCORUI
16772          JFCL
16773 IFN PDP6P,[
16774         CAIN J,-1       ;SPEC'D JOB IS PDP6 => OK,
16775          JRST PDPO
16776 ]
16777         CONO PI,CLKOFF
16778         PUSHJ P,LSWPOP  ;SOS DIELOK(J)
16779         PUSHJ P,LSWPOP  ;TREESW
16780         MOVE TT,J
16781         MOVE J,A
16782 ;COME HERE WHEN JOB ALREADY EXISTS, WITH CLOCK OFF AND USR IDX IN TT.
16783 ;A, B, C STILL HAVE UNAME, JNAME AND OPEN MODE.
16784 UFN1:   JUMPE J,[ADDI B,10000   ;OPENING JOB-DEVICE AND JOB EXISTS??
16785                  JRST USROB]    ;KEEP CHANGING JNAME UNTIL WE CREATE A JOB.
16786         CAIG TT,LUBLK
16787          JUMPL J,UFNDF          ;SKIP SOME CHECKS ON SYS & CORE
16788         JUMPG J,[MOVSI T,%OPOJB         ;OJB DEVICE OPEN; IF JOB DOESN'T HAVE %OPOJB SET,
16789                 TDNE T,OPTION(TT)       ;THEN IT HASN'T GIVEN PERMISSION TO BE HACKED.
16790                  SKIPL JBI(TT)          ;IF IT'S ALREADY A JOB DEVICE DON'T HACK IT.
16791                   JRST [CONO PI,CLKON   ;IN EITHER CASE, WAIT TILL ALL'S OK,
16792                         SKIPL JBI(TT)
16793                          PUSHJ P,UFLS
16794                         TDNN T,OPTION(TT)
16795                          PUSHJ P,UFLS
16796                         JRST USROOJ]    ;THEN RE-TRY THE OPEN.
16797                 LDB T,[.BP BULGOS_22,APRC(TT)]
16798                 JUMPN T,OPNL42
16799                 JRST CLKOJ1]    ;RETURN SUCCESS TO JOBO6C.
16800         TLNE C,UBPFJ
16801          JRST UFNDF     ;USER WANTS IT AS FOREIGN JOB
16802         HRRZ E,SUPPRO(TT)
16803         CAIN E,(U)
16804          JRST UFN1C     ;OPENING UP INFERIOR
16805         SKIPGE T,APRC(TT)
16806          SKIPL SUPPRO(TT)       ;UNLESS IT'S A TOP-LEVEL DISOWNED JOB,
16807           JRST UFNDF    ;THEN FOREIGN JOB
16808         PUSHJ P,UFN2B   ;REOWN DISOWNED TREE
16809          POPJ P,        ;CAN'T
16810         JRST UFOUND     ;DID
16811
16812 UFN1C:  MOVE U,TT       ;OPENING PROCEDURE IMMEDIATE SUPERIOR OF PROCEDURE BEING OPENED
16813         JRST UFOUND
16814 \f
16815 ;
16816 ; REOWN A DISOWNED PROCEDURE TREE
16817 ;
16818
16819 NREOWN: TLNN R,%CLSFU           ;MUST BE A FOREIGN USER CHANNEL
16820          JRST OPNL34
16821         CONO PI,CLKOFF
16822         HLRZ TT,H
16823         SKIPGE T,APRC(TT)
16824          SKIPL SUPPRO(TT)
16825           JRST OPNL31           ;TO A TOP-LEVEL DISOWNED JOB
16826         HRLM R,(P)
16827         PUSHJ P,UFN2B           ;REOWN THE JOB (TURNS CLOCK ON)
16828          POPJ P,                ;FAILED
16829         HLRZ R,(P)              ;TURN THE CHANNEL INTO AN INFERIOR CHANNEL.
16830         MOVNI T,FUWIDN-UWIDN
16831         ADDM T,(R)
16832         JRST POPJ1
16833
16834 ;REOWN JOB TT POINTS TO, ITS APRC IS IN T.  SKIPS IF SUCCESSFUL.
16835 ;CALL WITH CLKOFF, WILL TURN IT ON.
16836 UFN2B:  TLNE T,BULGOS
16837          JRST OPNL42    ;CAN'T REOWN JOB WHICH IS LOGGING OUT.
16838         SKIPGE APRC(U)  ;IF REOWNING JOB IS DISOWNED, PROHIBIT SO THAT
16839          JRST OPNL31    ;IT DOESN'T REOWN ITSELF AND SCREW THINGS UP
16840         PUSHJ P,ULUP1   ;FIND AN INTERRUPT BIT FOR IT. (IN B)
16841          JRST OPNL5     ;WE HAVE 8 INFERIORS ALREADY.
16842         AOS (P)         ;GOING TO WIN
16843         SETOM DLSRCH    ;INHIBIT SCHEDULING
16844         CONO PI,CLKON   ;TURN CLOCK BACK ON, THIS MAY TAKE A WHILE
16845         MOVSI A,BUMRTL  ;DOOMED DETACHED JOBS ARE RESCUED BY REOWNING.
16846         ANDCAM A,APRC(TT)
16847         MOVE A,UNAME(U) ;PICK UP NEW UNAME
16848         SETCM D,APRC(U)
16849         TLZ D,#400000   ;SIGN OF D SET IFF REOWNER ISN'T DISOWNED.
16850         MOVE J,UTMPTR(U) ;PICK UP NEW USER RESOURCE POINTER
16851         HRR D,J
16852         SUBI J,USRRCE   ;GET NEW CONSOLE #
16853         CAIL J,NCT      ;IF NEW TREE STILL HAS NO TTY,
16854          MOVEI J,%TINON ;"DISOWNED" TTY CHNLS SHOULD REMAIN SUCH
16855 ;HERE, A HAS UNAME, D HAS <SIGN IFF MAKING NON-DISOWNED>,,UTMPTR, J HAS CONSOLE # OR %TINON,
16856 ;U HAS REOWNER, TT HAS JOB BEING REOWNED.
16857 UFN2A:  PUSH P,B        ;SAVE INTERRUPT BIT
16858 UFN3:   MOVEM A,UNAME(TT)       ;SET TO NEW UNAME
16859         HRRZM D,UTMPTR(TT)      ;SET TO NEW USER RESOURCE POINTER
16860         MOVEI R,IOCHNM(TT)
16861         PUSHJ P,CHSCAN
16862         PUSHJ P,UFN3ZZ
16863         HLLZ T,D                ;LH(D) HAS 0 IF REOWNER DISOWNED, ELSE 400000
16864         ANDCAM T,APRC(TT)       ;MARK AS NOT DISOWNED IF REOWNER ISN'T DISOWNED.
16865 UFNL3:  MOVE B,JNAME(TT)        ;PICK UP CURRENT JNAME
16866         MOVEI E,0       ;LOOP ON ALL USERS
16867 UFNL1:  CAMN A,UNAME(E) ;SKIP ON NOT SAME UNAME
16868          CAME B,JNAME(E) ;SKIP ON SAME UNAME-JNAME
16869           JRST UFNL2    ;NOT SAME NAME AND/OR VAR BLK NOT IN USE
16870         JRST UFN7       ;NAME CONFLICT, RESOLVE
16871 UFNL2:  ADDI E,LUBLK
16872         CAMGE E,USRHI
16873          JRST UFNL1
16874         MOVEI E,0       ;INITIALIZE FOR LOOP TO LOOK FOR INFERIORS AND DUPLICATE NAMES
16875 UFN4:   SKIPN UNAME(E)  ;SKIP IF VAR BLOCK IN USE
16876          JRST UFN5      ;TRY NEXT
16877         HRRZ I,SUPPRO(E)        ;PICK UP SUPERIOR POINTER OF BLOCK BEING EXAMINED
16878         CAIN I,(TT)     ;SKIP IF NOT INFERIOR
16879          JRST UFN6      ;INFERIOR, PSEUDO-RECURSE
16880 UFN5:   ADDI E,LUBLK    ;ADVANCE TO NEXT BLOCK
16881         CAMGE E,USRHI   ;SKIP IF ALL EXAMINED
16882          JRST UFN4      ;LOOP
16883         SKIPGE SUPPRO(TT)       ;SKIP IF NOT BACK TO TOP
16884          JRST UFNX      ;BACK TO TOP LEVEL
16885         MOVE E,TT       ;POP BACK UP
16886         HRRZ TT,SUPPRO(E)       ;TO PREVIOUS LEVEL
16887         MOVE B,JNAME(TT)        ;RESTORE B
16888         JRST UFN5       ;PROCEED AT PREVIOUS LEVEL
16889 \f
16890 UFNX:   POP P,B
16891         HRLM B,SUPPRO(TT)
16892         HRRM U,SUPPRO(TT)       ;SET UP SUPERIOR POINTER IN TO LEVEL DISOWNED
16893         SETZM DLSRCH            ;RE-ENABLE SCHEDULING
16894         MOVE U,TT
16895         POPJ P,
16896
16897 UFN6:   MOVE TT,E       ;PSEUDO-RECURSE
16898         JRST UFN3       ;START UP ON LOWER LEVEL
16899
16900 UFN7:   CAMN E,TT       ;SKIP UNLESS FOUND SELF
16901          JRST UFNL2
16902         ADDI TT,JNAME   ;SET UP ARG TO SIXAOS
16903         PUSHJ P,SIXAOS  ;INCREMENT JNAME
16904         SUBI TT,JNAME   ;RESTORE TT
16905         JRST UFNL3      ;RESTART LOOP
16906
16907 ;RESUSCITATE TTY CHNLS
16908 UFN3ZZ: HRRZ Q,(R)
16909         CAIL Q,TYIDN
16910         CAILE Q,TYOBN
16911          POPJ P,        ;NOT A TTY CH
16912         HLRZ Q,(R)
16913         TRNN Q,%TICNS
16914          POPJ P,        ;NOT CONSOLE
16915         CAIE J,%TINON
16916          AOS TTNTO(J)
16917         DPB J,[$TIIDX,,(R)]
16918         POPJ P,
16919
16920 UFOUND: HLRZS C         ;U HAS INF PROC
16921         HRL A,U
16922         MOVE U,USER
16923         HRRZ R,UUAC(U)
16924         ADDI R,IOCHNM(U)        ;CLOBBERED BY CORE
16925         JSP Q,OPSLC3
16926             UWIDN,,UWODN
16927             UBIDN,,UBODN
16928
16929 UFNDF:  TLNE C,1
16930          JRST OPNL12    ;ATTEMPTED OUTPUT
16931         LDB A,[.BP BULGOS_22,APRC(TT)]
16932         JUMPN A,OPNL42  ;USER GOING AWAY
16933         HRL A,TT
16934         JSP Q,OPSLD1
16935             FUWIDN,,FUBIDN
16936 \f
16937 USRST:  PUSHJ P,AUCL2   ;.RESET SIMULATES CLOSING AND REOPENING
16938          POPJ P,
16939         CONO PI,CLKON
16940         PUSHJ P,1USTOP
16941         EXCH U,A        ;BUT WITH LESS OVERHEAD
16942         PUSH P,A
16943         PUSHJ P,IODCL
16944         MOVEI B,BULGOS  ;WE'RE NOT REALLY TRYING TO KILL THE INFERIOR,
16945         ANDCAM B,APRC(U) ;SO DON'T LET OTHERS THINK HE'S BEING KILLED.
16946         MOVE Q,U
16947         SETZ B,
16948         EXCH U,(P)
16949         PUSHJ P,ACRF1   ;FLUSH ALL OF CORE
16950          BUG
16951 USRST1: MOVEI B,1
16952         MOVE Q,(P)
16953         PUSHJ P,ACRF1   ;THEN GET 1 PAGE
16954          JRST [ PUSHJ P,UDELAY
16955                 JRST USRST1]
16956         EXCH U,(P)
16957         MOVSI T,%TBNOT+%TBDTY
16958         MOVEM T,TTYTBL(U)
16959         MOVE J,U
16960         EXCH U,(P)
16961         PUSHJ P,MPLDJ
16962         XCTR XW,[CLEARM 0]
16963         MOVEI T,1
16964         XCTR XBRW,[BLT T,1777]
16965         PUSHJ P,MPLDZ
16966         EXCH U,(P)
16967         PUSHJ P,LOGUSE
16968         CONO PI,CLKOFF
16969         PUSHJ P,USRST2
16970         CONO PI,CLKON
16971         PUSHJ P,USRST4  ;SHOULD SKIP
16972          BUG
16973         POP P,A
16974         EXCH U,A
16975         MOVE TT,A
16976 USRST5: MOVE A,TTSTSV(U)        ;INITIALIZE SAVED TTYSET OF NEW JOB EQUAL TO CREATOR'S.
16977         SKIPL B,TTYTBL(U)       ;NOTE THAT THE WHEREABOUTS OF THE CREATOR'S TTYSET
16978          MOVE A,TTYST1(B)       ;DEPENDS ON WHETHER HE HAS THE TTY NOW.
16979         MOVEM A,TTSTSV(TT)
16980         MOVE A,TTSTSV+1(U)
16981         SKIPL B
16982          MOVE A,TTYST2(B)
16983         MOVEM A,TTSTSV+1(TT)
16984         MOVEI A,(TT)            ;RH OF NEW JOB'S SAVED TTYSTS IS HIS INDEX.
16985         HRLI A,%TSCNS           ;NOW CONSTRUCT THE LH.
16986         MOVE B,UTMPTR(TT)       ;TO DO THAT, FIND THE TREE'S TTY NUMBER
16987         MOVE B,TTYOPT-USRRCE(B) ;TO FIND THE TTY'S TTYOPT WORD,
16988         TLNE B,%TOROL           ;WHICH TELLS HOW TO INIT THE BITS IN THE TTYSTS.
16989          TLO A,%TSROL
16990         TLNN B,%TOMOR
16991          TLO A,%TSMOR
16992         TLNE B,%TOSA1
16993          TLO A,%TSSAI
16994         MOVEM A,TTSTSV+2(TT)
16995         POPJ P,
16996 \f
16997 ;.CALL USRMEM
16998 ; ARG 1   JOB WHOSE MEMORY SHOULD BE READ OR WRITTEN
16999 ; ARG 2   ADDRESS TO READ OR WRITE
17000 ; ARGS 3,4  LIKE USRVAR, TTYVAR
17001 ; VAL 1   PREVIOUS CONTENTS OF LOCATION
17002 ; VAL 2   NEW CONTENTS OF LOCATION (SAME AS PREVIOUS IF NOT WRITING).
17003 ;         (NOT VALID IN BLOCK MODE)
17004
17005 ; BIT 1.1  IF SET, THEN IF PAGE ISN'T READABLE OR WRITEABLE, GIVE AN MPV
17006 ;               OR PURE INTERRUPT TO THE JOB BEING REFERENCED.
17007 ; BIT 2.9  IF SET, ALLOWS US TO WRITE IN ANY JOB.
17008
17009 NUSRMEM:
17010         MOVE J,A
17011         JSP T,NCORUI
17012          JRST NUSRM1            ;WE CAN SURELY WRITE.
17013         MOVE H,CTLBTS(U)
17014         CAIGE W,3               ;ELSE, IF WE WANT TO WRITE,
17015          TRNE H,1               ;OR WANT TO GIVE THE REFERENCED JOB INTERRUPTS,
17016           TRNE H,400000         ;THEN UNLESS WE ARE FORCING IT,
17017            JRST NUSRM1
17018         JSP T,NCORWR            ;SEE IF IT IS A JOB WE ARE ALLOWED TO WRITE IN.
17019          JRST OPNL31
17020 NUSRM1: MOVE H,CTLBTS(U)
17021         CAIE J,-1
17022          CAIG J,LUBLK           ;CAN'T GIVE SYS OR CORE JOBS INTERRUPTS, OR PDP6.
17023           TRNN H,1
17024            CAIA
17025             JRST OPNL31
17026 IFN PDP6P,[
17027         CAIN J,-1
17028          JRST NUSRMS
17029 ];PDP6P
17030         CAILE J,LUBLK
17031          CAMN J,U
17032           JRST NUSRMS
17033         MOVE A,J                ;IF TARGET JOB ISN'T SELF OR PDP6
17034         PUSHJ P,RPCLSR          ; OR SYS OR CORE, STOP IT.
17035         PUSHJ P,SOSSET
17036             USTP(J)
17037 NUSRMS: PUSHJ P,NUSRM2          ;DO THE WORK
17038          POPJ P,                ;LOST, OPNL HAS LSWCLR'ED
17039         JRST LSWCJ1             ;POSSIBLY UNLOCK USTP, DIELOK AND TAKE SUCCESS RETURN
17040
17041 NUSRM2: PUSHJ P,VARCAL          ;E:=ADDR, D:=DATA, W:=INSTRUCTION
17042         HRRZS E
17043         CAIGE E,20
17044          JRST NUSRM6            ;ACS ALWAYS SWAPPED-IN AND ACCESSIBLE
17045         PUSH P,U
17046         MOVE U,J
17047         LDB A,[121000,,E]       ;GET PAGE # IN A AND REF'D JOB IN U.
17048 IFE PDP6P, PUSHJ P,UPLC
17049 IFN PDP6P,[
17050         PUSHJ P,[ CAIE J,-1     ;SKIP IF PDP6
17051                    JRST UPLC    ;DECODE THEM FOR ORDINARY JOB.
17052                   CAIL A,LPDP6M
17053                    TDZA T,T     ;FOR PDP6, MOST PAGES DON'T EXIST,
17054                     MOVE T,[002200,,[600000]]   ;AND THE REST ARE WRITABLE.
17055                   POPJ P,]
17056 ];PDP6P
17057         POP P,U
17058         LDB A,T                 ;GET PAGE ACCESS HALFWORD.
17059         TRNN A,600000           ;IF PAGE SWAPPED OUT, PUT ACCESS BITS IN PLACE THEY WOULD BE
17060          LSH A,16.              ; FOR AN IN-CORE PAGE.
17061         JUMPE A,NUSRM9          ;LOSE IF NO PAGE THERE
17062         TRNN A,400000           ;OR IF WE ARE TRYING TO WRITE THE WORD AND PAGE IS READ-ONLY.
17063          JUMPN W,NUSRM8
17064 NUSRM6: PUSHJ P,MPLDJ           ;NOW LOAD MAP OF JOB IN J
17065         HRLI E,(SKIP)           ;GET ACCESS TO DATA WORD, SWAP IN PAGE
17066         SKIPE W
17067          HRLI E,(MOVES)
17068 NUSRM4: CONO PI,CLKOFF          ;CLK OFF SO ONCE IN CAN'T SWAP OUT AGAIN
17069         XCTRI XRW,E             ;NOT GETTING BENEFIT OF USUAL PCLSR BEFORE
17070          JRST NUSRM5            ;SWAP OUT FEATURE SINCE IT'S ANOTHER JOB
17071         PUSHJ P,TPFLT
17072         JRST NUSRM4
17073
17074 NUSRM5: UMOVE B,(E)             ;NOW THAT PAGE IS IN, GET OLD CONTENTS
17075         MOVE A,B                ;IN A AND B
17076         JUMPE W,NUSRM3
17077         HRRI W,B                ;IF WRITING,
17078         XCT W                   ;EXECUTE USER'S INSN., MODIFYING 2ND VALUE IN B,
17079         TRNN J,-1               ;SYSTEM JOB?
17080          JRST OPNL31            ;******* WRITING SYS, TURN INTO .SETLOC *******
17081         UMOVEM B,(E)            ;AND STORE IT BACK INTO REF'D JOB.
17082 NUSRM3: PUSHJ P,MPLDZ           ;RESTORE NORMAL PAGE MAP, TURN CLKON.
17083         JRST POPJ1              ;SUCCESS
17084
17085 NUSRM8: SKIPA T,[%PIWRO]        ;HERE IF TRYING TO WRITE IN READ ONLY PAGE.
17086 NUSRM9:  MOVEI T,%PIMPV         ;HERE IF ACCESSING NONEXISTENT PAGE.
17087         TRNN H,1                ;SKIP IF TO GIVE INTERRUPT
17088          JRST OPNL32
17089         CAMN J,USER
17090          JRST UUOERR            ;INTERRUPT TO SELF
17091         IORM T,PIRQC(J)         ;INTERRUPT OTHER USER
17092         JRST OPNL32             ;CAN'T GET THAT ACCESS TO PAGE.
17093 \f
17094 ;COMMENTS BELOW APPLY TO UBI IN MANY CASES.  FOR UBO, TRANSFER GOES THE
17095 ;OTHER DIRECTION
17096
17097 UBO:    MOVNI I,1
17098         JRST UBIL
17099
17100 UBI:    MOVEI I,0       ;SIGNAL UBI
17101
17102 UBIL:   JUMPL C,UBIA
17103         XCTR XRW,[MOVES TT,(C)] ;MAKE SURE WRITE CYCLES WILL WIN
17104 UBIB:   TRNE A,200000   ;SKIP UNLESS 6
17105          MOVNI A,1      ;SO CAILE BELOW WILL SKIP OVER SUSTPR AMONG OTHER REASONS
17106         CAILE A,LUBLK   ;SKIP ON SYS JOB, CORE JOB, PDP6 OR JOB ALREADY STOPPED
17107          PUSHJ P,SUSTPR ;RANDOM JOB STOP
17108         JUMPGE TT,UBI4  ;THRU
17109         TLO A,400000    ;INDICATE ALREADY STOPPED SO WONT TRY IT AGAIN
17110         HLRO B,TT
17111         MOVNS B         ;COUNT TO BE XFERRED
17112         HRLZ E,IOCHST-IOCHNM(R) ;EXAMINED USER ADDRESS
17113         HRR E,TT        ;FROM,,TO (INFERIOR ADR,,SUPERIOR ADR)
17114         HLRZ Q,E
17115         TLNE A,200000
17116          JRST UBI5A     ;PDP6
17117 UBI5:   CAIGE Q,20      ;INF ADR IN Q
17118          JRST UBI3      ;READ AC
17119         HRRZ J,A        ;SET UP UMAPS WORD
17120         TRZE E,400000
17121          TLOA J,%UMMPL  ;TO HI PG, HACK OUR LOW PG
17122           TLO J,%UMMPU  ;TO LOW PG, HACK OUR HI PG
17123         TLZE E,400000
17124          TLOA J,%UMLTU  ;TO POINT TO HIS UPPER
17125           TLO J,%UMUTL  ;TO POINT TO HIS LOWER
17126         TLNN J,%UMMPU+%UMUTL    ;MAPPING HIS UPPER WITH OUR LOWER?
17127          JRST UBI3A     ;YES MAKE SURE NOT SCREWED BY AC PNTR
17128 UBI3B:  PUSHJ P,MPLD1
17129         TRZ Q,400000
17130         MOVNS Q         ;LIMIT SIZE OF XFER TO MIN OF DESIRED
17131         ADDI Q,400000   ;DIST OF TO ADR FROM SEG BOUNDARY
17132         CAMLE B,Q
17133          HRRZ B,Q
17134         MOVNI Q,(E)     ;AND DIST OF FROM ADR FROM SEQ BOUNDARY
17135         ADDI Q,400000
17136         CAMLE B,Q
17137          HRRZ B,Q
17138         TLNN J,%UMMPL   ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
17139          TLOA E,400000  ;SET FROM ADR TO HI PG
17140           TRO E,400000  ;SET TO ADR TO HI PG
17141         SKIPE I         ;SKIP ON UBI
17142          MOVSS E                ;UBO, XFERR OTHER DIRECTION
17143         MOVE Q,E        ;SAVE COPY OF BLT PNTR
17144         ADDI B,(E)      ;GET LA +1
17145 UBI3H:  XCTRI XBRW,[BLT E,-1(B)]        ;XFERR DATA
17146 UBI3K:   MOVEI E,(B)    ;NO FAULT, SIMULATE STORE BACK OF BLT PNTR AFTER COMP OF BLT (RH ANYWAY)
17147 UBI3L:  PUSH P,J
17148         PUSHJ P,MPLDZ   ;RETURN TO NORMAL MAP TO STORE BACK USER PNTR
17149         POP P,J         ;SAVE PREV MAP FOR EVENTUAL USE
17150         SUBM E,Q        ;FIGURE OUT HOW MANY WDS ACTUALLY XFERRED
17151         HRRZS Q
17152 UBI3E:  HRLS Q          ;# WDS TRANSFERRED,,SAME
17153         JUMPL C,UBIC    ;UPDATE USER PNTR
17154         XCTRI XRW,[ADDM Q,(C)]
17155          JRST .+2
17156           BUG           ;SHOULD HAVE ALREADY CHECKED THIS
17157 UBID:   ADD Q,IOCHST-IOCHNM(R)  ;UPDATE INFERIOR PNTR
17158         HRRM Q,IOCHST-IOCHNM(R) ;WRAPPING AROUND IF PASS 1,,0
17159         TLZ B,-1
17160         CAIN B,(E)      ;WAS THERE A FAULT?
17161          JRST UBIL      ;NO, LOOP
17162         PUSHJ P,UBI4    ;UNSTOP THE JOB.
17163         PUSHJ P,MPLD1   ;RESTORE TO FROB AT TIME OF FAULT
17164 UBI3C:  PUSHJ P,TPFLT
17165         PUSHJ P,MPLDZ
17166         JRST UBIL
17167 \f
17168 UBI4:   TLNN A,200000   ;SKIP ON REALLY PDP6
17169          TLZ A,400000   ;FLUSH RANDOM BIT SO COMPARE WILL WORK
17170         CAILE A,LUBLK
17171          JRST UPCLSR
17172         POPJ P,
17173
17174 UBMCK1: PUSHJ P,UBI4
17175         JRST IOADC
17176
17177 UBIA:   TRNE C,777760
17178          BUG
17179         MOVE TT,(C)
17180         JRST UBIB
17181
17182 UBIC:   TRNE C,777760
17183          BUG
17184         ADDM Q,(C)
17185         JRST UBID
17186
17187 UBI5A:  CAIL Q,400000
17188          JRST UBMCK1
17189         JRST UBI5
17190
17191 UWO:    SKIPGE C
17192          SKIPA D,(C)
17193           UMOVE D,(C)
17194         TDZA I,I
17195 UWI:     SETO I,        ;0 FOR OUTPUT, -1 FOR INPUT.
17196         TRNE A,200000
17197          MOVNI A,1      ;-1 MEANS PDP6.
17198         CAMN A,USER
17199          HRLI A,-1      ;DON'T STOP SELF
17200         CAIG A,LUBLK
17201          JRST UWI1      ;SYS, CORE, SELF, OR PDP6
17202         PUSHJ P,SUSTPR
17203         PUSHJ P,SOSSET  ;MIGHT TAKE PAGE FAULT AND GET PCLSRED
17204             USTP(A)
17205 UWI1:   HRRZ E,IOCHST-IOCHNM(R)
17206         HRRZ J,A
17207         PUSHJ P,MPLDJ   ;MAP JOB BEING IOT'ED FROM.
17208         XCTR XRW,[      MOVE W,(E)
17209                         MOVEM D,(E)]+1(I)
17210         AOS IOCHST-IOCHNM(R)    ;ADVANCE ACCESS POINTER
17211         CAILE A,LUBLK
17212          PUSHJ P,LSWPOP
17213         JRST MPLDZ
17214 \f
17215 UBI3A:  TLNE E,777760   ;SKIP ON XFERRING FROM AC AREA, HI TO HI
17216          JRST UBI3B     ;NO OK
17217         JUMPN I,UBO3A   ;UBO
17218         PUSHJ P,MPLDJ
17219         XCTRI XR,[MOVE B,(Q)]   ;PICK UP WD
17220          JRST .+2       ;OK
17221           JRST UBI3C    ;TAKE FAULT
17222         PUSHJ P,MPLDZ   ;BACK TO NORMAL MAP
17223         HRRZ E,TT       ;TO ADR
17224         JRST UBI3D
17225
17226 ;USR DEV IOT STOP ROUTINE
17227 USUSTP: SOS USTP(A)
17228 SUSTPR: MOVSI T,BCSTOP+BUCSTP
17229         TDNE T,USTP(A)  ;WAIT TILL NOT BEING SHUFFLED
17230          PUSHJ P,UFLS
17231         PUSHJ P,RPCLSR  ;AOS'ES USTP
17232         MOVSI T,BCSTOP+BUCSTP
17233         TDNE T,USTP(A)
17234          JRST USUSTP
17235         POPJ P,
17236
17237 UBI3:   ADDI Q,AC0S(A)
17238         JUMPN I,UBO3    ;UBO
17239         TLNE A,200000
17240          TDZA B,B       ;READ PDP6 AC
17241           MOVE B,(Q)    ;READ NORMAL AC
17242 UBI3D:  XCTRI XW,[MOVEM B,(E)]
17243          JRST .+2
17244           JRST UBI3C    ;TAKE FAULT
17245 UBI3G:  MOVEI Q,1       ;1 WD XFERRED
17246         HRRZ B,E        ;FAKE OUT FAULT TEST
17247         JRST UBI3E
17248
17249 UBO3:   TLNE A,200000
17250          JRST UBI3G     ;TRYING TO WRITE PDP6 AC IGNORE
17251         XCTRI XR,[MOVE B,(E)]
17252          JRST .+2
17253           JRST UBI3C
17254         MOVEM B,(Q)
17255         JRST UBI3G
17256
17257
17258 UBO3A:  XCTRI XR,[MOVE B,(TT)]
17259          JRST .+2
17260           JRST UBI3C    ;TAKE FAULT
17261         PUSHJ P,MPLDJ   ;MAP HIM.
17262         XCTRI XW,[MOVEM B,(Q)]
17263          JRST .+2
17264           JRST UBI3C
17265         PUSHJ P,MPLDZ   ;BACK TO NORMAL
17266         JRST UBI3G
17267 \f
17268 SUBTTL CORE LINK DEVICE
17269
17270 EBLK
17271 CLVBEG: NCLCH
17272 CLSYN:  BLOCK NCLCH     ;SYSTEM NAME ;0=>VARIABLES FREE
17273 CLN1:   BLOCK NCLCH     ;FN1
17274 CLN2:   BLOCK NCLCH     ;FN2
17275 CLUSR:  REPEAT NCLCH,-1 ;LH=WRITING USER ;RH=READING USER ;-1=>NOT OPEN THAT HALF
17276 CLRAC:  BLOCK NCLCH     ;4.9=LOCKED BY CORE ALLOCATOR
17277                         ;4.8=VERY SLOW CLOCK ROUTINE CONSIDERING FLUSHING THIS BUFFER
17278  %CAFLS==100000         ;4.7=INPUT CLOSED, TURN OUTPUT INTO NUL DEVICE
17279  %CA==1,,500000         ;RH=UT BUFFER NUMBER (IOBFT ADR)
17280
17281 CLOSW:  -1      ;USER LOCK TO STOP MORE THAN ONE PERSON FROM SIMULTANEOUSLY MODIFYING
17282         0       ;THE CORE LINK VARIABLES
17283 CLVEND==.-1
17284 BBLK
17285
17286 ;FORMAT OF CORE LINK 200 WORD BUFFER
17287 ;
17288 CLBVSP==8
17289 CLBCHS==100.
17290 CLBEOF==<CLBCHS+4>/5
17291 IFG CLBVSP+CLBCHS+CLBEOF-128.,.ERR CLBXXX LOSSAGE
17292
17293 ;
17294 ;0:   CHARACTER COUNT
17295 ;1&2: READ AND WRITE CHARACTER OR WORD POINTERS
17296 ;3&4: READ AND WRITE EOF POINTERS
17297 ;CLBVSP TO CLBVSP+CLBCHS-1: CHARACTERS OR WORDS
17298 ;CLBVSP+CLBCHS UP: EOF BITS STORED AS SEVEN FIVE BIT BYTES PER WORD,
17299 ;               EACH BIT CORRESPONDING TO A CHARACTER POSITION.
17300
17301 CLAO:   SKIPA J,[2]     ;CLA .OPEN (TO ANSWER A CLI INTERRUPT)
17302 CLIO:    MOVNI J,1      ;CLI .OPEN (INTERRUPTS USER SPECIFIED BY FILE NAME)
17303         JRST CLI2
17304
17305 CLUO:   TDZA J,J        ;CLU .OPEN
17306 CLOO:    MOVEI J,1      ;CLO .OPEN
17307 CLI2:   JUMPL C,CLFDEL  ;JUMP IF AN .FDELE
17308         PUSHJ P,FLDRCK
17309          JRST CLO1      ;NOT FILE DIRECTORY
17310         MOVEI J,2
17311         JRST LISTF7
17312 \f
17313 CLFDEL: MOVEI J,3
17314 CLO1:   PUSHJ P,SWTL    ;SEIZE SWITCH TO STOP VARIABLES FROM CHANGING UNDER YOU
17315             CLOSW
17316         LDB H,[220100,,C]       ;DIRECTION BIT
17317         JUMPL J,CLOO5
17318 CLOO5B: MOVE Q,USYSN1(U)        ;PICK UP SNAME
17319         MOVSI I,-NCLCH
17320         CAIN J,2        ;SKIP UNLESS CLA
17321          JRST CLO1A     ;JUMP IF CLA .OPEN
17322         CAIGE J,0
17323 CLO1A1:  MOVE Q,[SIXBIT/_CLI_/]
17324 CLOL:   CAMN Q,CLSYN(I) ;LOOK FOR SNAME, FN1, & FN2
17325          CAME A,CLN1(I)
17326           JRST CLOO1
17327         CAME B,CLN2(I)
17328          JRST CLOO1
17329         JUMPL J,OPNL23  ;"FILE LOCKED" IF ALREADY EXISTS, FOR CLI:.
17330         CAIN J,3        ;SKIP UNLESS DELETE
17331          JRST CLO1D     ;FOUND FILE TO DELETE
17332 CLO1A6: LDB TT,CLOOT1(H)
17333         CAIE TT,-1
17334          JRST OPNL23    ;ALREADY OPEN THIS DIRECTION (FILE LOCKED)
17335         HRRZ TT,CLRAC(I)
17336         LDB Q,[IOSA,,IOBFT(TT)]
17337         LSH Q,6
17338 CLOX:   DPB U,CLOOT1(H) ;STORE USER INDEX
17339         MOVSI TT,200000
17340         ANDCAM TT,CLRAC(I)      ;CLEAR VERY SLOW CLOCK BIT
17341         PUSHJ P,LSWPOP  ;RELEASE SWITCH
17342         HRL A,I
17343         LDB C,[220300,,C]
17344         SKIPGE J
17345          PUSHJ P,CLOX1  ;FOR CLI:, PUT OUR UNAME AND JNAME INTO BUFFER.
17346         MOVEI TT,44     ;WORD
17347         TRNN C,6
17348          MOVEI TT,7     ;UNIT ASCII
17349         ADD Q,H         ;OFFSET FOR DIRECTION
17350         DPB TT,[300600,,1(Q)]   ;SET UP ITEM POINTER
17351         MOVEI TT,5      ;WORD
17352         TRNN C,6
17353          MOVEI TT,1     ;UNIT ASCII
17354         DPB TT,[300600,,3(Q)]   ;SETUP EOF POINTER
17355         JSP Q,OPSLC7    ;SET UP IOCHNM OF USER
17356          DCLUAI,,DCLUAO ;UNIT ASCII INPUT ;UNIT ASCII OUTPUT
17357          DCLBI,,DCLBO   ;BLOCK INPUT ;BLOCK OUTPUT
17358          DCLUBI,,DCLUBO ;UNIT BINARY INPUT ;UNIT BINARY OUTPUT
17359          DCLBI,,DCLBO
17360
17361 CLOX1:  MOVEI TT,44     ;CHANGE OUTPUT BYTE SIZE TO 36.
17362         DPB TT,[300600,,2(Q)]
17363         MOVEI TT,5      ;WHICH INVOLVES STORING 5 CHARACTERS OF EOF BITS AT ONCE.
17364         DPB TT,[300600,,4(Q)]
17365         PUSH P,C
17366         HRROI C,TT
17367         MOVE TT,UNAME(U)
17368         PUSHJ P,CLOXO   ;NOW WE CAN IOT WORDS OUT, EVEN IF CHANNEL IS ASCII MODE.
17369         SUBI Q,1
17370         MOVE TT,JNAME(U)
17371         PUSHJ P,CLOXO
17372         SOJA Q,POPCJ    ;NOW RETURN, AND SET UP THE CORRECT BYTE SIZES.
17373 \f
17374 CLOO1:  AOBJN I,CLOL    ;LOOP FOR ALL SETS OF CORE LINK VARIABLES
17375         CAIE J,1
17376          JUMPGE J,OPNL4 ;CLA, CLU DELETE LOSE
17377         MOVSI I,-NCLCH
17378 CLOO3:  SKIPN CLSYN(I)  ;LOOK FOR FREE VARIABLES TO CREATE FILE
17379          JRST CLOO2
17380         AOBJN I,CLOO3
17381         JRST OPNL5      ;GIVE DIREC FULL ERROR
17382
17383 CLOOT1: 2200,,CLUSR(I)  ;READING
17384         222200,,CLUSR(I) ;WRITING
17385
17386 CLOO2:  MOVEM A,CLN1(I) ;SET UP VARIABLES
17387         MOVEM B,CLN2(I)
17388         MOVEI D,SCNCLO(I)       ;SYS CHNL NO
17389         PUSHJ P,TCALL   ;GET 200 WORD BUFFER
17390             JRST IUTCONS
17391          JRST CLOO4     ;NO MEM AVAIL
17392         MOVEM Q,CLSYN(I)        ;DONT SET UP SYS UNTIL MEM AVAIL
17393         HRRM A,CLRAC(I)
17394         LDB Q,[IOSA,,IOBFT(A)]  ;SET UP BUFFER
17395         LSH Q,6
17396         SETZM (Q)       ;CHAR COUNT
17397         MOVE TT,Q
17398         ADDI TT,CLBVSP  ;SET UP BUF POINTERS
17399         MOVEM TT,1(Q)
17400         MOVEM TT,2(Q)
17401         HRLI TT,440000
17402         ADDI TT,CLBCHS  ;SET UP EOF POINTERS
17403         MOVEM TT,3(Q)
17404         MOVEM TT,4(Q)
17405         JRST CLOX
17406
17407 ;NO MEMORY AVAILABLE FOR 200-WD BUFFERS
17408 CLOO4:  AOS SWPOPR      ;MAYBE SWAPPING SOMETHING OUT WILL HELP
17409         PUSHJ P,LSWPOP  ;UNLOCK CLOSW
17410         PUSHJ P,UDELAY  ;WAIT A WHILE
17411         JRST CLO1       ;TRY AGAIN
17412 \f
17413 CLOO5:  CONO PI,CLKOFF  ;TURN OFF CLOCK TO STOP U&J NAMES FROM CHANGING
17414         MOVEI Q,2*LUBLK
17415 CLOO5A: CAMN A,UNAME(Q) ;LOOK FOR USER WHOSE NAMES MATCH THE SPECIFIED FILE NAMES
17416         CAME B,JNAME(Q)
17417          JRST CLOO6
17418         MOVEI T,%PICLI  ;IF GET TO HERE, HAVE FOUND USER WITH RIGHT NAMES
17419         TDNN T,MSKST(Q) ;SKIP IF HE HAS CLI INT DISABLED
17420          JRST OPNL11
17421         IORM T,PIRQC(Q) ;GIVE USER INT
17422         CONO PI,CLKON
17423         JRST CLOO5B
17424
17425 CLOO6:  ADDI Q,LUBLK    ;GO TO NEXT USER SLOT
17426         CAMGE Q,USRHI   ;SKIP IF ALL EXAMINED
17427          JRST CLOO5A
17428         JRST OPNL11
17429
17430 CLO1D:  MOVE T,CLUSR(I)
17431         AOJN T,OPNL23   ;FILE LOCKED
17432         AOS (P)
17433         MOVE A,I
17434         PUSHJ P,CLIOTB  ;NO TIMING ERROR SINCE CORE JOB WILL PCLSR USR ON
17435         SKIPN B,SRN3(U) ;CORE LINK BEFORE MOVING BUFFER
17436          JRST CLO1D2
17437         MOVEM B,CLN1(A)
17438         MOVE B,SRN4(U)
17439         MOVEM B,CLN2(A)
17440         JRST LSWPOP     ;CLOSW
17441
17442 CLO1A:  MOVE A,UNAME(U)
17443         MOVE B,JNAME(U)
17444         JRST CLO1A1
17445 \f
17446 ;CORE LINK .IOT SET UP ROUTINE
17447
17448 CLIOTB: SKIPGE CLRAC(A) ;WAIT IF BUFFER LOCKED BY CORE ALLOCATOR
17449          PUSHJ P,UFLS   ;(DO NOT CHANGE ABOVE TO "SKIPGE TT,CLRAC(A)")
17450         HRRZ TT,CLRAC(A)
17451         LDB Q,[IOSA,,IOBFT(TT)] ;GET POINTER TO BUFFER
17452         LSH Q,6
17453         POPJ P,
17454
17455
17456 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII INPUT
17457
17458 CLUAI:  PUSHJ P,CLIOTB  ;SETUP
17459         MOVSI T,%CAFLS
17460         TDNE T,CLRAC(A)
17461          PUSHJ P,UFLS
17462         SKIPN (Q)       ;WAIT TILL CHAR COUNT NON-ZERO
17463          PUSHJ P,UFLS
17464 CLUAI1: MOVE J,3(Q)
17465         ILDB I,J        ;GET EOF BIT
17466         JUMPN I,UNIEOF
17467 CLUAIE: ILDB W,1(Q)     ;GET CHARACTER
17468         SOS (Q)         ;DECREMENT BUF COUNT
17469 CLFAXP: LDB TT,[700,,1(Q)]      ;FIX UP POINTERS
17470         CAIN TT,CLBVSP+CLBCHS-1
17471          PUSHJ P,CLFAX2 ;MAYBE TIME TO RING BUFFER
17472         HLRZ TT,J       ;GET BYTE POSITION AND SIZE
17473         CAIN TT,010100  ;IF TO END OF 35-BIT WORD, ADVANCE
17474          IBP J          ;TO NEXT WORD (5-BIT BYTES 1 BIT AT A TIME)
17475         MOVEM J,3(Q)
17476         POPJ P,
17477
17478 UNIEOF: HRROI W,EOFCH
17479         JRST POPJ1
17480
17481 CLFAX2: LDB TT,[370500,,1(Q)]   ;PICK UP TOP 5 BITS OF BYTE POSITION
17482         JUMPN TT,CPOPJ  ;NOT QUITE YET
17483 CLFBX2: MOVEI TT,CLBVSP ;J HAS NEW EOF PNTR
17484         DPB TT,[700,,1(Q)]      ;RING CHAR POINTER
17485         MOVEM J,3(Q)
17486         MOVEI J,44
17487         DPB J,[360600,,1(Q)]
17488         MOVEI TT,CLBVSP+CLBCHS
17489         DPB TT,[700,,3(Q)]      ;RING EOF POINTER
17490         DPB J,[360600,,3(Q)]
17491         MOVE J,3(Q)
17492         POPJ P,
17493 \f
17494 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII OUTPUT
17495
17496 CLUAO:  MOVE T,CLRAC(A)
17497         TLNE T,%CAFLS
17498          POPJ P,
17499         PUSHJ P,CLIOTB  ;SETUP
17500         MOVEI T,CLBCHS*5-11.
17501         CAMGE T,(Q)     ;WAIT TILL THERE IS SPACE IN BUF
17502          PUSHJ P,UFLS
17503         MOVE J,4(Q)
17504         SKIPGE C
17505          SKIPA B,(C)    ;GET CHAR FROM EXEC
17506           UMOVE B,(C)   ;GET CHAR FROM USER
17507         MOVEI TT,0
17508         IDPB TT,J       ;INDICATE NOT AN EOF
17509         IDPB B,2(Q)     ;STORE IN BUF
17510         MOVEI TT,1      ;GET MASK FOR LOW ORDER BIT
17511         ANDCAM TT,@2(Q) ;FLUSH IN CURRENT WORD
17512 CLCWU2: AOS (Q)         ;INCREMENT BUF COUNT
17513         MOVEI I,0       ;FAKE OUT EOF TEST
17514         AOJA Q,CLFAXP   ;FAKE OUT CLFAXP AND FIX UP POINTERS
17515
17516
17517 CLBI:   JSP W,WRDBTI    ;BLOCK INPUT.
17518
17519 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY INPUT
17520
17521 CLUBI:  PUSHJ P,CLIOTB  ;SETUP
17522         MOVSI T,%CAFLS
17523         TDNE T,CLRAC(A)
17524          PUSHJ P,UFLS
17525         MOVEI T,5
17526         CAMLE T,(Q)     ;WAIT TILL A WORD IS AVAILABLE
17527          PUSHJ P,UFLS
17528 CLUBI1: MOVE J,3(Q)
17529         ILDB I,J        ;GET EOF BITS
17530         JUMPN I,CLUBIF  ;JUMP ON EOF
17531 CLUBIE: ILDB W,1(Q)     ;GET WORD
17532 CLCRB2: MOVNI T,5
17533         ADDB T,(Q)      ;DECREMENT COUNT
17534         JUMPGE T,CLFBXP
17535         SETZM (Q)       ;CAME FROM CLCLRL WITH PARTIAL WORD IN BUFFER
17536 CLFBXP: JRST CLFAXP
17537
17538 CLUBIF: TROE I,20       ;SKIP IF EOF NOT ON FIRST CHAR OF WORD
17539          JRST POPJ1
17540         DPB I,J         ;SET EOF ON FIRST CHAR
17541         MOVE J,1(Q)
17542         ILDB W,J        ;PICK UP WORD WITH EOF IN MIDDLE
17543         POPJ P,
17544 \f
17545 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY OUTPUT
17546
17547 CLUBO:  MOVE T,CLRAC(A)
17548         TLNE T,%CAFLS
17549          POPJ P,
17550         PUSHJ P,CLIOTB  ;SETUP
17551 ;CLI: OPEN CALLS HERE TO OUTPUT UNAME AND JNAME.
17552 CLOXO:  MOVEI T,CLBCHS*5-11.
17553         CAMGE T,(Q)     ;WAIT TILL THERE IS SPACE FOR A WORD
17554          PUSHJ P,UFLS
17555         MOVE J,4(Q)
17556         SKIPGE C
17557          SKIPA B,(C)    ;GET WORD FROM EXEC
17558           UMOVE B,(C)   ;GET WORD FROM USER
17559         MOVEI TT,0
17560         IDPB TT,J       ;INDICATE NOT AN EOF
17561         IDPB B,2(Q)     ;STORE IN BUF
17562 CLCWB2: MOVEI TT,5
17563         ADDM TT,(Q)     ;INCREMENT COUNT
17564         AOJA Q,CLFAXP   ;FAKE OUT CLFBXP AND FIX UP POINTERS
17565
17566
17567 ;CORE LINK .IOT ROUTINE FOR BLOCK OUTPUT
17568
17569 CLBO:   MOVE I,C        ;SAVE A POINTER TO USERS BLKO POINTER
17570         XCTR XR,[SKIPL H,(I)]   ;PICKUP BLKO POINTER
17571          POPJ P,
17572         SKIPA E,H       ;SECOND COPY, ALSO FLAG TO CLBIN
17573 CLBI2:   UMOVEM E,(I)   ;TO INFORM USER & IN CASE YOU ARE PCLSR'ED
17574         HRRZ C,E
17575         PUSHJ P,CLUBO   ;TRANSFER ONE WORD
17576         AOBJN E,CLBI2   ;TRY FOR NEXT
17577 CLBI3:  UMOVEM E,(I)    ;COUNT EXHAUSTED OR EOF
17578         POPJ P,
17579 \f
17580 ;CORE LINK .CLOSE ROUTINE FOR BINARY OR BLOCK OUTPUT
17581
17582 CLCLWB: PUSHJ P,CLCWC   ;STORE EOF BITS FOR WORD
17583          JRST CLCWU6    ;NO ROOM SO LAST MUST HAVE BEEN EOF HACK SO FLUSH
17584         IBP 2(Q)        ;KEEP WORD POINTER IN STEP
17585         PUSHJ P,CLCWB2  ;FIX UP COUNT AND POINTERS
17586 CLCWU6: MOVNI B,1
17587         DPB B,[222200,,CLUSR(A)]        ;OBLITERATE USER INDEX
17588         MOVSI B,%CAFLS
17589         ANDCAM B,CLRAC(A)
17590         JRST LSWPOP     ;RELEASE SWITCH
17591
17592 ;CORE LINK .CLOSE ROUTINE FOR UNIT ASCII OUTPUT
17593
17594 CLCLWU: PUSHJ P,CLCWC   ;STORE EOF BIT FOR CHAR
17595          JRST CLCWU6
17596         MOVEI TT,EOFCH
17597         IDPB TT,2(Q)    ;STORE AN EOF CHAR
17598         PUSHJ P,CLCWU2  ;FIX UP COUNT AND POINTERS
17599         SOS Q           ;CLCWU2 AOJAS
17600         LDB TT,[360600,,2(Q)]
17601         SOJE TT,CLCWU6  ;JUST FILLED A WHOLE WORD => STOP PADDING.
17602         PUSHJ P,LSWPOP  ;ELSE PAD ONCE MORE.
17603         JRST CLCLWU
17604
17605
17606 ;COMMON SUBROUTINE FOR CORE LINK OUTPUT .CLOSE ROUTINES
17607
17608 CLCWC:  PUSHJ P,SWTL    ;LOCK SWITCH (IF SIGN OF CLRAC IS EVER REALLY USED,
17609             CLOSW       ;THIS MIGHT CAUSE A DEADLY EMBRACE).
17610         PUSHJ P,CLIOTB  ;SETUP
17611         MOVEI T,CLBCHS*5-5.
17612         CAMGE T,(Q)     ;WAIT FOR THERE TO BE ROOM
17613          POPJ P,
17614         MOVE J,4(Q)
17615         MOVNI TT,1
17616         IDPB TT,J       ;SET EOF BIT(S)
17617         JRST POPJ1
17618 \f
17619 ;CORE LINK .CLOSE ROUTINE FOR INPUT
17620
17621 CLO1D2: SETZM CLSYN(A)  ;FREE VARIABLES
17622         HRRZS A,CLRAC(A) ;CORE LINK NO LONGER IN USE
17623         PUSHJ P,BRTN    ;RETURN BUFFER TO FREE STATE
17624         JRST LSWPOP
17625
17626 CLISTA: PUSHJ P,CLIOTB  ;CORE LINK INPUT STATUS
17627         SKIPN J,(Q)     ;COUNT
17628          TRO D,1_10.    ;SYS BUF CAP EMPTY
17629         CAIL J,CLBCHS*5-5
17630          TRO D,1_9      ;SYS BUF CAP EMPTY
17631         POPJ P,
17632
17633 CLCLRA: TDZA C,C        ;UNIT ASCII
17634 CLCLRB:  MOVNI C,1      ;IMAGE OR BLOCK (I.E. WORDS)
17635         PUSHJ P,CLIOTB
17636         PUSHJ P,SWTL
17637             CLOSW
17638 ;FLUSH ALL REAL DATA
17639 CLCLRL: SKIPN (Q)       ;SKIP IF BUFFER CONTAINS DATA, READ IT UNTIL EOF
17640          JRST CLCLR1
17641         PUSHJ P,[JUMPE C,CLUAI1 ? JRST CLUBI1]
17642          JRST CLCLRL
17643 CLCLR2: MOVE J,3(Q)     ;FOUND AN EOF, FLUSH THE EOF WORD
17644         ILDB I,J
17645         PUSHJ P,[JUMPE C,CLUAIE ? JRST CLUBIE]
17646         MOVE T,1(Q)
17647         TLNE T,760000
17648          JRST CLCLR2    ;NOT YET TO WORD BOUNDARY
17649         JRST CLCLR3
17650
17651 CLCLR1: MOVSI B,%CAFLS
17652         IORM B,CLRAC(A)
17653         PUSH P,A
17654         PUSH P,Q
17655         HLRZ A,CLUSR(A)
17656         PUSHJ P,NJRPCL
17657         PUSHJ P,NJUPCL
17658         POP P,Q
17659         POP P,A
17660 CLCLR3: HLLOS B,CLUSR(A)        ;NO LONGER OPEN FOR INPUT
17661         SKIPN (Q)               ;IF NO DATA IN BUFFER
17662          AOJE B,CLO1D2          ;AND NOT OPEN FOR OUTPUT, GO FREE THE BUFFER AND VARS
17663         JRST LSWPOP
17664 \f
17665 SUBTTL LOCK DEVICE
17666
17667 NLCKCH==:8                      ; Should be enough.
17668
17669 EBLK
17670
17671 LCKNAM: REPEAT NLCKCH, 0        ; 0 => free lock channel, else contains
17672                                 ; name of lock held by this channel.
17673 LCKUSR: REPEAT NLCKCH, 0        ; Job that holds the lock.  Nothing looks
17674                                 ; at this currently.
17675 LCKSW:  -1 ? 0                  ; Prevent more than one user from trying to
17676                                 ; lock a lock at the same time.
17677 BBLK
17678
17679 ; LCKO is .OPEN routine for LOCK device.  First filename is name of lock to
17680 ; seize.  0 is illegal.  Only opens for output are permitted (some day we
17681 ; might allow multiple opens for input).
17682 ;
17683 ; Bit 1.4 controls what happens if lock is already held:
17684 ;  0 => error: %ENAFL
17685 ;  1 => Hang until you can seize it
17686 LCKO1:  PUSHJ P,LSWPOP          ; We lose this time
17687         TLNN C,10               ; 1.4 => HANG MODE
17688          JRST OPNL23            ; FILE LOCKED
17689         MOVE T,A
17690         CAMN T,LCKNAM(I)        ; Wait for unlock, then try again
17691          PUSHJ P,UFLS
17692 LCKO:   JUMPE A,OPNL11          ; ILLEGAL FILE NAME
17693         PUSHJ P,SWTL            ; One potential locker at a time
17694             LCKSW
17695         MOVSI I,-NLCKCH         ; Check if it is already locked
17696         CAME A,LCKNAM(I)
17697          AOBJN I,.-1
17698         JUMPL I,LCKO1           ; Already held
17699         MOVSI I,-NLCKCH         ; Search for free lock channel
17700         SKIPE LCKNAM(I)
17701          AOBJN I,.-1
17702         JUMPGE I,OPNL6          ; DEVICE FULL
17703         HRRZM U,LCKUSR(I)
17704         MOVEM A,LCKNAM(I)
17705         HRLZI T,(I)
17706         HRRI T,DNLCK
17707         MOVEM T,(R)             ; Set up channel
17708         JRST LSWPJ1             ; And return
17709
17710 ; .CALL RFNAME returns name of lock:
17711 LCKRCH: MOVE B,LCKNAM(A)
17712         POPJ P,
17713
17714 ; .CLOSE releases the lock:
17715 LCKCL:  SETZM LCKNAM(A)
17716         POPJ P,
17717 \f
17718 SUBTTL COMMON I/O ROUTINES
17719
17720 ;STANDARD DEVICE OPEN
17721
17722 STDOP1: MOVEI R,R       ;ENTRY TO NOT CLOBBER IOCHNM
17723 STDOPN: HLRZ A,(Q)      ;LH MASK ON 4.9-3.2 OF LH OPEN WRD
17724         AND D,A ;RH POINTER TO ..USR,..USE PAIR
17725         ROT D,-1        ;FOLLOWING WORDS CONTAIN LIST FOR ALL MASKED STATES
17726         ADDI D,(Q)      ;LH MSKED STATE =0, RH =1, IOTTB ENTRY NUMBERS
17727         HRRZ A,1(D)
17728         SKIPL D
17729         HLRZ A,1(D)
17730         JUMPE A,OPNL12  ;MODE NOT AVAIL
17731         HRRZ E,(Q)
17732         CONO PI,CLKOFF
17733         CAME U,(E)
17734         SKIPGE 1(E)
17735         AOSA 1(E)
17736         JRST OPNL10     ;DEVICE NOT AVAIL
17737         MOVEM U,(E)
17738         HLL A,C
17739         JRST OPNSLT
17740
17741 OPSLD1: ANDI D,1        ;ENTRY TO USE BOTTOM BIT OF AC D
17742 OPSLD3: ANDI D,3        ;ENTRY TO USE BOTTOM TWO BIT OF AC D
17743         MOVE C,D
17744 OPSLC3: ANDI C,3        ;ENTRY TO USE BOTTOM TWO BITS OF AC C
17745 OPSLC7: ANDI C,7        ;ENTRY TO USE BOTTOM THREE BITS OF AC C
17746         ROT C,-1
17747         ADDI C,(Q)
17748         HRR A,(C)
17749         SKIPL C
17750         HLR A,(C)
17751 OPNSLT: MOVEM A,(R)     ;SET USERS IOCHNM
17752         JRST CLKOJ1
17753 \f
17754 ;BLOCK OUTPUT TO CHARACTER DEVICE 
17755 ;ADR OF CHR ROUTINE IN E
17756 ; THAT ROUTINE MUST NOT CLOBBER C, D, E, OR TT
17757 ;C POINTS TO AOBJN POINTER IN USER SPACE
17758 ;MUSTN'T CLOBBER J (TTY OUTPUT ASSUMES).
17759
17760 NBTOCH: XCTR XRW,[MOVES D,(C)]  ;CHECK WRITEABILITY OF AOBJN PTR
17761         LDB TT,[410300,,D]      ;USE HIGH 3 BITS OF USER PNTR AS CHR CNT
17762         CAIGE TT,3
17763          POPJ P,                ;USER TRYING TO XFER >32K FLUSH
17764         SKIPA TT,BTOCHT-3(TT)   ;PICK UP APPROPRIATE BYTE PTR (WORD IN W)
17765 NBTO1:   UMOVEM D,(C)           ;UPDATE USER'S AOBJN PTR
17766         UMOVE W,(D)             ;FETCH CURRENT WORD FROM USER
17767         ILDB A,TT               ;FETCH CURRENT CHARACTER
17768         PUSHJ P,(E)             ;SEND TO DEVICE
17769         ADD D,[700000,,]        ;UPDATE PTR
17770         TLNE D,500000
17771          JRST NBTO1             ;GO TO NEXT CHR
17772         MOVE TT,BTOCHT+4
17773         ADD D,[500001,,1]       ;INCR TO NEXT WORD
17774         JUMPL D,NBTO1
17775         UMOVEM D,(C)    ;COUNTED OUT, UPDATE FINAL TIME & RETURN
17776         POPJ P,
17777
17778 BTOCHT: REPEAT 5,<44-<4-.RPCNT>*7>_14+700,,W
17779
17780 ;BLOCK INPUT FROM CHARACTER DEVICE
17781 ;E AND C SET UP LIKE NBTOCH
17782 ;INTERNALLY LH OF E USED FOR FLAGS:
17783 ; 4.9 EOF FLAG (SIGN)
17784 ; 4.8 => JUST RETURN WITHOUT ERROR IF AT BEGINNING OF WORD,
17785 ;        OTHERWISE IGNORE BIT.
17786 ; 4.7 => RETURN WITHOUT ERROR EVEN IF NOT AT BEGINNING OF WORD.
17787
17788 INBTCH: HRRZS E         ;CLEAR GARBAGE IN LH
17789         XCTR XRW,[MOVES D,(C)] ;SET UP LIKE NBTOCH
17790         LDB TT,[410300,,D]
17791         CAIGE TT,3
17792          POPJ P,
17793         SKIPA TT,BTOCHT-3(TT)
17794 INBTO1:  UMOVEM D,(C)
17795         XCTR XRW,[MOVES (D)] ;CHECK WRITABILITY OF CURRENT WORD
17796         JUMPL E,INBTO2  ;JUMP IF EOF
17797         PUSH P,C
17798         PUSH P,D
17799         PUSH P,TT
17800         PUSH P,R
17801         HLRZ A,(R)
17802         PUSHJ P,(E)     ;RETN CHR IN W
17803          JRST .+3
17804           TLO E,200000
17805         TLO E,400000
17806         MOVE I,W
17807         POP P,R
17808         POP P,TT
17809         POP P,D
17810         POP P,C
17811         LDB W,[410300,,D]
17812         TLNN E,100000
17813          CAIN W,7       ;SKIP IF NOT AT 1ST CHAR.
17814           TLNN E,300000
17815            JRST INBTO3
17816         POPJ P,
17817
17818 INBTO3: UMOVE W,(D)             ;PICK UP CURRENT WORD
17819         IDPB I,TT               ;INSERT CHARACTER
17820         UMOVEM W,(D)            ;PUT WORD BACK
17821         ADD D,[700000,,]
17822         TLNE D,500000
17823          JRST INBTO1            ;DO ANOTHER CHR THIS WORD
17824         MOVE TT,BTOCHT+4
17825         ADD D,[500001,,1]       ;INCR TO NEXT WD
17826         SKIPL E                 ;SKIP IF EOF
17827          JUMPL D,INBTO1
17828         UMOVEM D,(C)            ;DONE, UPDATE POINTER AND RETURN
17829         POPJ P,
17830
17831 INBTO2: MOVEI I,EOFCH           ;EOF, STORE EOF CHARACTER
17832         JRST INBTO3
17833
17834 ;BLOCK IO TO WORD DEVICE
17835 ;C POINTS TO AOBJN POINTER IN USER SPACE
17836 ;Q POINTS TO WORD HANDLING ROUTINE (POINTER WILL BE IN C)
17837 ;MUST NOT CLOBBER Q OR H (PTR ROUTINES DO POPJ2 SOMETIMES)
17838 ;WRDBRT CHECKED FOR ON PDL BY TVC ROUTINES
17839
17840 WRDBT:  MOVE H,C
17841         UMOVE C,(H)             ;FETCH USER'S AOBJN POINTER
17842         JUMPGE C,CPOPJ
17843         JRST WRDBT3
17844
17845 WRDBT2: PUSHJ P,OPBRK
17846 WRDBT3: ANDI C,-1
17847         PUSHJ P,(Q)
17848 WRDBRT:  JRST WRDBT5            ;NO SKIP - WORD XFERRED
17849          SKIPA C,[1,,1]         ;1 SKIP - LAST WORD XFERRED
17850           POPJ P,               ;2 SKIPS - EOF, NO WORD XFERRED
17851         XCTR XRW,[ADDM C,(H)]
17852         POPJ P,
17853
17854 WRDBT5: MOVE C,[1,,1]
17855         XCTR XRW,[ADDB C,(H)]
17856         JUMPL C,WRDBT2
17857         POPJ P,
17858
17859 ;JSP W,WRDBTI TO DO WRDBT FOR A UNIT MODE INPUT ROUTINE SATISFYING NEW
17860 ;CALLING CONVENTION FOR THOSE.
17861 WRDBTI: JSP Q,WRDBT
17862         XCTR XRW,[MOVES (C)]
17863         PUSH P,W
17864         PUSHJ P,(W)
17865          JRST WRDBT4
17866          JRST POPWJ2
17867         AOS -1(P)
17868 WRDBT4: UMOVEM W,(C)
17869         MOVEI Q,WRDBTI+1
17870         POP P,W
17871         POPJ P,
17872 \f
17873 ;CHANGED CONVENTIONS: 
17874  ;1) EOF IS NO LONGER CHECKED FOR CHARACTER BY CHARACTER.
17875  ;   INSTEAD, THE GET-BUFFER ROUTINE SHOULD SET UP THE BYTE COUNT
17876  ;   TO A SMALLER VALUE THAN USUAL.
17877  ;   AN ATTEMPT TO GET ANOTHER BUFFER AFTER REACHING EOF
17878  ;   SHOULD CAUSE THE GET-BUFFER ROUTINE TO SKIP TWICE.
17879  ;2) THE THE BUFFER POINTER IS NOW A B.P. EVEN IN IMAGE MODE.
17880  ;   ALSO, THE L.H. OF THE B.P. IS NOT INITTED HERE.
17881  ;   IT MUST BE SET UP BY THE OPEN ROUTINE. ALSO, ACCESS ROUTINES
17882  ;   FOR DSK MUST KNOW HOW TO SET IT UP.
17883  ;   ALSO, THE BUFFER GET ROUTINE SHOULD SET IT UP,
17884  ;   INSTEAD OF RETURNING THE BUFFER ADDRESS IN TT.
17885  ;3) THE BYTE SIZE THE FILE IS OPEN ON IS PASSED AS AN ARGUMENT.
17886  ;   THIS ROUTINE WORKS FOR ANY CHANNEL BYTE SIZE WITH ANY
17887  ;   SIOT BYTE SIZE.
17888
17889 ;GENERAL BLOCK I/O
17890 ;RH OF E HAS # BYTES/WORD OF FILE BYTE SIZE.  LH OF E HAS B.P. 44NN00.
17891 ;RH(C) = ADDR OF COUNT, IN USER MEMORY
17892 ;RH(TT) = ADDR OF USER'S B.P.
17893 ; ARGUMENTS B ->
17894 ;0(B)   ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
17895 ;1(B)   ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
17896 ;2(B)   ROUTINE TO GET NEXT BUFFER.  NO SKIP IF NO MEMORY
17897 ;        OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
17898 ;        AND BUFFER BYTE POINTER ALREADY SET UP.
17899 ;         2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
17900 ;       WHEN THIS ROUTINE IS CALLED, E CONTAINS THE
17901 ;       NUMBER OF BYTES/WORD (GOOD FOR DETERMINING CHANNEL MODE).
17902 ;3(B)   ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
17903 ;       MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO,
17904 ;       IN WHICH CASE IT SHOULD CONTAIN THE NEW NUMBER OF BYTES.
17905 ;4(B)   NOT USED
17906 ;5(B)   IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
17907 ;       IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
17908
17909 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
17910 ;SIOKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
17911
17912 SIOKT:  PUSH P,E
17913         PUSH P,TT
17914         PUSH P,C
17915         JRST SIOKT1
17916
17917 ;NEXT BUFFER
17918
17919 SIOKNB: PUSHJ P,@3(B)   ;"DISCARD" BUFFER
17920         SKIPE J,@1(B)   ;CHECK AMOUNT REMAINING ONE MORE TIME
17921          JRST SIOKT1    ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
17922         SKIPG 5(B)      ;NEED TO WAIT FOR DEVICE?
17923          JRST SIOKF1    ;NO.
17924 SIOKN1: SKIPG 5(B)      ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
17925          JRST SIOKW1    ;DEVICE CAN'T WAIT SO UDELAY
17926         XCT 5(B)        ;DEVICE WAIT
17927 SIOKF:  PUSHJ P,UFLS
17928
17929 SIOKF1: PUSHJ P,@2(B)   ;NOW GET NEXT BUFFER
17930          JRST SIOKN1    ;HMM, HAVE TO WAIT
17931           JRST SIOKT1   ;BUFFER HAS BEEN GOT.
17932         JRST POP3J1     ;EOF, TRANSFER IS COMPLETE
17933
17934 SIOKT1: UMOVE TT,@(P)   ;GET COUNT OF BYTES TO TRANSFER
17935         JUMPLE TT,POP3J1        ;COUNT DECREMENTED TO 0; TRANSFER DONE.
17936         SKIPG D,@1(B)   ;CHECK AMOUNT LEFT IN BUFFER
17937          JRST SIOKNB    ;NEW BUFFER NEEDED
17938         CAMLE TT,D      ;AMT OF ROOM LEFT IN CURRENT BUFFER
17939          MOVE TT,D      ;TRANSFER ONLY AMT LEFT IN BUFFER
17940         UMOVE J,@-1(P)
17941         IBP J
17942         LDB D,[301400,,J]
17943         MOVE C,@(B)
17944         IBP C           ;TO TRANSFER WORD-WISE, BOTH B.P.'S MUST
17945         HRL J,C
17946         LDB C,[301400,,C]
17947         CAIE C,(D)      ;HAVE SAME BYTE SIZE,
17948          JRST SIOKS1
17949         LDB D,[060600,,C]
17950         ANDI C,77
17951         ADDI C,(D)
17952 ;DROPS THROUGH
17953 \f;DROPS IN
17954         CAIGE TT,@-2(P) ;THERE MUST BE AT LEAST 1 WORD TO TRANSFER,
17955          JRST SIOKS1
17956         CAIE C,44       ;AND MUST BE ABOUT TO START THE NEXT WORD.
17957          JRST SIOKSL
17958         PUSH P,TT+1
17959         IDIVI TT,@-3(P) ;GET # WDS TO BLT
17960         POP P,TT+1
17961         SKIPGE (B)
17962          MOVSS J        ;WRITING, SWAP BLT POINTER
17963         MOVE D,J
17964         ADDI TT,(D)     ;1+LAST WORD TO BLT INTO
17965         SKIPGE (B)
17966          JRST SIOKN6    ;JUMP IF WRITING
17967         XCTRI XBW,[BLT D,-1(TT)] ;READING
17968 SIOKN7:  MOVEI D,(TT)   ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
17969 SIOKN8: SUBM D,J
17970         HRRZS J         ;# WDS ACTUALLY XFERRED
17971         ADDM J,@(B)     ;INCR BUFFER PNTR
17972         XCTR XRW,[ADDM J,@-1(P)]
17973         IMULI J,@-2(P)
17974         MOVNS J
17975         XCTR XRW,[ADDM J,@(P)]
17976         ADDM J,@1(B)    ;DECREMENT COUNT LEFT IN BUFFER
17977         CAIE D,(TT)     ;SKIP IF TRANSFERRED ALL WE COULD
17978          PUSHJ P,TPFLT  ;TAKE FAULT
17979 SIOKN3: SKIPN @1(B)
17980          PUSHJ P,@3(B)  ;BUFFER EXHAUSTED, DISCARD (MAY COME BACK TO LIFE).
17981         JRST SIOKT1     ;TRY AGAIN TO TRANSFER.
17982
17983 SIOKW1: PUSHJ P,UDELAY
17984         JRST SIOKF1
17985
17986 SIOKN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
17987          JRST SIOKN7
17988         JRST SIOKN8
17989
17990 ;COME HERE FOR SLOW (BYTE AT A TIME) SIOT TO BLOCK MODE DEVICE.
17991 ;TT HAS NUMBER OF BYTES TO TRANSFER - IT IS KNOWN THAT THE DEVICE
17992 ;CAN SUPPLY THAT MANY FROM ITS CURRENT BUFFER.
17993 SIOKSL: SUBM C,D        ;D GETS SIZE; C HAS # BITS REMAINING TO BE HANDLED
17994         IDIV C,D        ;C GETS # BYTES TO XFER TILL REACH WORD BOUNDARY.
17995         MOVE TT,C       ;XFER THAT MANY, THEN TRY AGAIN, SO WILL USE FAST MODE.
17996 SIOKS1: SKIPL (B)
17997          JRST SIOKSI    ;INPUT AND OUTPUT PART HERE
17998         LDB D,[300600,,@(B)]    ;BYTE SIZE IN THE BUFFER
17999         MOVEI C,36.
18000         IDIV C,D        ;D := # EXTRA BITS AT RIGHT END OF WORD
18001         MOVEI J,1
18002         LSH J,(D)
18003         SOS J           ;J := MASK FOR THEM
18004         UMOVE C,@-1(P)  ;GET COPY OF USER'S B.P. FOR SWAPPING IN PAGES.
18005 SIOKS3: IBP C           ;IF NOT FOR THESE 2 INSNS, ILDB MIGHT GET PAGE FAULT
18006         UMOVE (C)       ;WHICH WOULD CAUSE EXTRA INCREMENTING OF B.P.
18007         XCTR XBYTE,[ILDB D,@-1(P)] ;FETCH NEXT BYTE,
18008         IDPB D,@(B)
18009         MOVE D,@(B)
18010         ANDCAM J,(D)    ;TURN OFF EXTRA BITS IN THIS WORD OF BUFFER
18011         SOS @1(B)
18012         XCTR XRW,[SOS @(P)]
18013         SOJG TT,SIOKS3
18014         JRST SIOKN3
18015
18016 SIOKSI: UMOVE C,@-1(P)  ;GET COPY OF USER'S B.P., FOR WRITEABILITY TESTING.
18017 SIOKS2: IBP C
18018         XCTR XRW,[MOVES (C)]    ;MAKE SURE WE CAN WRITE IN NEXT BYTE.
18019         ILDB D,@(B)             ;GET NEXT BYTE FROM DEVICE BUFFER
18020         XCTR XBYTE,[IDPB D,@-1(P)];GIVE IT TO USER.
18021         XCTR XRW,[SOS @(P)]     ;UPDATE USER'S COUNT
18022         SOS @1(B)               ;AND THE SYSTEM'S COUNT.
18023         SOJG TT,SIOKS2
18024         JRST SIOKN3
18025
18026 ;CONVENIENT EXIT ROUTINE FOR BUFFER-GET ROUTINES.
18027 ;ASSUMES ADDR OF START OF BUFFER IN TT,
18028 ;SIZE (IN WORDS) OF DATA AREA IN J.
18029 ;E SHOULD HAVE WHAT IT HAD WHEN SIOKT WAS CALLED.
18030 SIOBGX: IMULI J,(E)
18031 SIOBG1: HLL TT,E
18032 SIOBG2: MOVEM TT,@(B)
18033         MOVEM J,@1(B)
18034         JRST POPJ1
18035 \f
18036 ;BYTE AT A TIME I/O TO BLOCK MODE DEVICE
18037 ;SEE PRECEDING PAGE (SIOKT) FOR COMMENTS ON CALLING SEQUENCE
18038 ;EXCEPT: ON INPUT, VALUE RETURNED IN W, AND C,D HAVE NO SIGNIFICANCE;
18039 ;ON OUTPUT, RH(C) HAS ADDRESS OF ARG, SIGN(C) SET IFF ADDRESS IS EXEC-MODE,
18040 ; AND D HAS NO SIGNIFICANCE.
18041
18042 CHRKT:  SKIPGE (B)
18043          JRST CHRKTO    ;WRITING
18044         JRST CHRKTI     ;READING
18045
18046 CHRKTI: SOSGE @1(B)     ;DECREMENT ACTIVE CHAR COUNT
18047          JRST CHRKT1    ;GET NEW BUFFER
18048         ILDB W,@(B)     ;READ - GET NEXT CHAR
18049         POPJ P,
18050
18051 CHRKTO: SKIPGE C        ;USED WHEN FILLING OUT BLOCK AT CLOSE, AND ELSEWHERE.
18052          SKIPA J,(C)
18053           UMOVE J,(C)   ;GET CHAR. FROM USER
18054         SOSGE @1(B)     ;DECREMENT ACTIVE CHAR COUNT
18055          JRST CHRKT1    ;GET NEW BUFFER
18056         IDPB J,@(B)     ;DEPOSIT IN BUFFER
18057         CAIE E,5        ;SKIP IF ASCII
18058          POPJ P,
18059         MOVEI J,1
18060         MOVE D,@(B)
18061         ANDCAM J,(D)    ;CLEAR EXTRA BIT
18062         POPJ P,
18063
18064 CHRKT1: AOS @1(B)       ;COMPENSATE FOR OVER-SOS
18065         PUSHJ P,@3(B)   ;GET RID OF THIS BUFFER
18066         SKIPLE J,@1(B)  ;CHECK AMOUNT REMAINING ONE MORE TIME
18067          JRST CHRKT     ;SPRUNG BACK TO LIFE (LAST BLOCK OF FILE WRITE OVER)
18068         SKIPG 5(B)      ;NEED TO WAIT FOR DEVICE?
18069          JRST CHRKF1    ;NO.
18070 CHRKN1: SKIPG 5(B)      ;HAVE TO WAIT
18071          JRST [ PUSHJ P,UDELAY
18072                 JRST CHRKF1 ]
18073         XCT 5(B)        ;DEVICE WAIT
18074          PUSHJ P,UFLS
18075
18076 CHRKF1: PUSHJ P,@2(B)   ;GOBBLE NEW BLOCK
18077          JRST CHRKN1    ;NOT READY, WAIT
18078           JRST CHRKT
18079         CAME E,[444400,,1]
18080          JRST UNIEOF    ;READING PAST EOF IN ASCII MODE.
18081         JRST IOCER2     ;READING PAST EOF IN IMAGE MODE.
18082 \f
18083 ;GENERAL BLOCK I/O
18084 ;E HAS BPLH,,# BYTES/WORD OF FILE BYTE SIZE - MUST BE 444400,,1
18085 ;RH(C) = ADDR OF AOBJN POINTER
18086 ; AND 4.9 => AOBJN PTR IS IN EXEC ADDRESS SPACE,
18087 ;     4.8 => BLOCK IT POINTS TO IS IN EXEC ADDRESS SPACE. (INPUT ONLY)
18088 ; ARGUMENTS B ->
18089 ;0(B)   ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
18090 ;1(B)   ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
18091 ;2(B)   ROUTINE TO GET NEXT BUFFER.  NO SKIP IF NO MEMORY
18092 ;        OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
18093 ;        AND BUFFER B.P. IN @(B) ALREADY SET UP.
18094 ;         2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
18095 ;3(B)   ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
18096 ;       MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO.
18097 ;4(B)   NOT USED
18098 ;5(B)   IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
18099 ;       IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
18100
18101 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
18102 ;BLKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
18103
18104 ;CODE IS ON NEXT PAGE
18105 \f
18106 BLKT:   CAME E,[444400,,1]
18107          BUG            ;BLKT CALLED ON UNIT ASCII MODE CHANNEL??
18108         SKIPL C         ;SKIP IF POINTER IN USER SPACE
18109          XCTR XRW,[MOVES (C)] ;USER SPACE, MAKE SURE WRITE CYCLE WILL WIN
18110         JRST BLKT1
18111
18112 ;NEXT BUFFER
18113
18114 BLKTNB: PUSHJ P,@3(B)   ;"DISCARD" BUFFER
18115         SKIPE @1(B)     ;CHECK AMOUNT REMAINING ONE MORE TIME
18116          JRST BLKT1     ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
18117         SKIPG 5(B)      ;NEED TO WAIT FOR DEVICE?
18118          JRST BLKTF1    ;NO.
18119 BLKTN1: SKIPG 5(B)      ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
18120          JRST BLKTW1    ;DEVICE CAN'T WAIT SO UDELAY
18121         XCT 5(B)        ;DEVICE WAIT
18122 BLKTF:  PUSHJ P,UFLS
18123
18124 BLKTF1: PUSHJ P,@2(B)   ;NOW GET NEXT BUFFER
18125          JRST BLKTN1    ;HMM, HAVE TO WAIT
18126           JRST BLKT1
18127         POPJ P,         ;EOF, TRANSFER FINISHED
18128
18129 BLKT1:  SKIPGE C        ;SET UP FOR TRANSFER
18130          SKIPA J,(C)    ;GET EXEC MODE BLOCK .IOT (AOBJN) POINTER
18131           UMOVE J,(C)   ;GET USER MODE AOBJN POINTER
18132         JUMPGE J,CPOPJ  ;POINTER COUNTED OUT, TRANSFER DONE
18133         SKIPG D,@1(B)   ;CHECK AMOUNT LEFT IN BUFFER
18134          JRST BLKTNB    ;NEW BUFFER NEEDED
18135         HLRE TT,J
18136         MOVNS TT        ;DESIRED SIZE OF BLOCK
18137         CAMLE TT,D      ;AMT OF ROOM LEFT IN CURRENT BUFFER
18138          MOVE TT,D      ;TRANSFER ONLY AMT LEFT IN BUFFER
18139         MOVE D,@(B)     ;CANONICALIZE THE BUFFER B.P. SO RH => NEXT WORD TO XFER
18140         IBP D
18141         HRL J,D         ;MERGE WITH USER'S BLOCK ADDR TO GET BLT AC.
18142         SKIPGE (B)
18143          MOVSS J        ;WRITING, SWAP BLT POINTER
18144         MOVE D,J
18145         ADDI TT,(D)     ;1+LAST WORD TO BLT INTO
18146         TLNE C,200000
18147          JRST BLKTN9    ;JUMP IF EXEC AOBJN POINTER
18148         SKIPGE (B)
18149          JRST BLKTN6    ;JUMP IF WRITING
18150         XCTRI XBW,[BLT D,-1(TT)] ;READING
18151 BLKTN7:  MOVEI D,(TT)   ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
18152 BLKTN8: SUBM D,J
18153         HRRZS J         ;# WDS ACTUALLY XFERRED
18154         ADDM J,@(B)     ;INCR BUFFER PNTR
18155         HRLS J          ;PUT # WDS IN BOTH HALVES
18156         JUMPL C,BLKTN3  ;UPDATE AOBJN PTR IN EXEC SPACE
18157         XCTRI XRW,[ADDM J,(C)] ;UPDATE AOBJN PTR IN USER SPACE
18158          JRST .+2
18159           BUG           ;MUMBLE.  THIS WAS SUPPOSED TO BE THERE.
18160
18161 BLKTN4: MOVNI J,(J)
18162         ADDM J,@1(B)    ;DECREMENT COUNT LEFT IN BUFFER
18163         CAIE D,(TT)     ;SKIP IF TRANSFERRED ALL WE COULD
18164          PUSHJ P,TPFLT  ;TAKE FAULT IF ANY
18165         SKIPN @1(B)
18166          PUSHJ P,@3(B)  ;BUFFER EXHAUSTED, "DISCARD"
18167         JRST BLKT1      ;GO TRANSFER ANOTHER CHUNK
18168
18169 BLKTN3: ADDM J,(C)      ;UPDATE EXEC AOBJN POINTER
18170         JRST BLKTN4
18171
18172 BLKTW1: PUSHJ P,UDELAY
18173         JRST BLKTF1
18174
18175 BLKTN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
18176          JRST BLKTN7
18177         JRST BLKTN8
18178
18179 BLKTN9: BLT D,-1(TT)    ;READING INTO EXEC SPACE
18180         JRST BLKTN7
18181 \f
18182 SUBTTL DIRECTORY AND ERR DEVICES
18183
18184 QMLSTF: MOVEI J,4       ;ENTRY TO GET MASTER 2314 DIRECTORY
18185         JRST LISTF7
18186
18187 QLISTF: MOVEI J,3       ;ENTRY FOR 2314 USER DIRECTORY
18188 LISTF7: MOVEI I,0
18189 LISTFE: PUSHJ P,SWTL    ;ENTER HERE FOR ALL KINDS OF DIRECTORIES.
18190         UDCSW
18191         MOVSI TT,-NUDCH
18192 UD1:    SKIPGE UDUSR(TT)
18193          JRST UD2
18194         AOBJN TT,UD1
18195         PUSHJ P,LSWPOP
18196         PUSHJ P,UDELAY  ;DIRECTORY NOT AVAILABLE NOW, WAIT
18197         JRST LISTFE
18198
18199 UD2:    MOVEM J,DSKLST(TT)
18200         MOVEM I,UDUSR(TT)
18201         MOVEM U,UDUIND(TT)
18202         PUSHJ P,LSWPOP
18203         MOVE Q,USYSN1(U)
18204         MOVEM Q,UDSYSN(TT)
18205         JUMPG J,UDIF    ;JUMP IF NOT UTAPE DIR.
18206 IFE NUNITS, BUG         ;HOW DID UTAPE GET HERE?
18207 IFN NUNITS,[
18208         CONO PI,CLKOFF
18209         MOVE Q,UDIRO(I)
18210         MOVEM Q,DIRPT(TT)
18211         CONO PI,CLKON
18212         MOVEI J,200
18213         TRNE D,2
18214         JRST UDBIN      ;IMAGE MODE UTAPE DIR
18215         MOVEI Q,LISTF   ;ASCII MODE UTAPE DIR
18216 ]
18217 UDIF1:  MOVEM Q,DIRPC(TT)
18218         HRL A,TT
18219         JSP Q,OPSLD1
18220         DIRCHN,,DIRBN
18221
18222 UDIF:   HLRZ Q,UDT-1(J) ;INITIAL COROUTINE PC
18223         HRRZ T,UDT-1(J) ;PLACE TO FINISH OPENING - USUALLY UDIF1.
18224         JRST (T)
18225
18226 UQL1:   HRRZM H,UUDPP(TT)       ;2314 MFD (FROM UDIF)
18227         MOVEI J,2000
18228         TRNE D,2
18229         JRST QUDBIN
18230         JRST UDIF1
18231
18232 UQL1A:  PUSHJ P,STMSET  ;DISK UFD (FROM UDIF). WE CAN STILL PCLSR,
18233         UDUSR(TT)       ;ARRANGE TO GIVE BACK THE DIRECTORY CHANNEL.
18234 UQL1B:  PUSH P,TT
18235         PUSHJ P,QUDLK
18236         PUSHJ P,TCALL   ;GET A LOW-HALF PAGE TO COPY UFD INTO.
18237           JRST IOMQ     ;GET LOW HALF PAGE
18238          JRST UQL1W     ;NOT AVAIL NOW
18239         MOVEI T,MU23LS
18240         DPB T,[MUR,,MEMBLT(A)]  ;MARK THE PAGE AS A UFD COPY.
18241         LSH A,10.
18242         MOVEM A,DIRPT(TT)
18243         MOVEM A,UUDPP(TT)
18244         HRL A,QSNLCN(H)
18245         HRRI T,2000(A)
18246         BLT A,-1(T)     ;COPY UFD
18247         PUSHJ P,QUDULK
18248         PUSHJ P,LSWDEL  ;STMSET OF UDUSR.
18249         SKIPG QSNNR(H)
18250          BUG            ;WE ALWAYS GET OUR MAN
18251         PUSHJ P,LSWPOP  ;SOS QSNNR
18252         POP P,TT
18253         MOVEI J,2000
18254         TRNE D,2
18255         JRST UDBIN
18256         JRST UDIF1
18257
18258 UQL1W:  PUSHJ P,QUDULK
18259         POP P,TT
18260         PUSHJ P,UDELAY
18261         JRST UQL1B
18262 \f
18263 ;LH INITIAL PC RH DISP ADR AT OPEN TIME
18264 UDT:    NDLF,,UDIF1     ;NON DIR DEVICE
18265         UCL1,,UDIF1     ;CORE LINK
18266         UQL2,,UQL1A     ;2314 UFD
18267         QMLS1,,UQL1     ;2314 MFD
18268         ERR1,,ERR2      ;ERR DEVICE
18269         TTYFLD,,UDIF1   ;TTY DIR
18270         TTYF99,,UDIF1   ;COR DIR (LAST LINE OF TTY DIR)
18271 UDTLN==.-UDT
18272
18273 QUDBIN: HRRZ T,QMDRO
18274         MOVEM T,DIRPT(TT)
18275 UDBIN:  MOVEM J,NUM(TT) ;DOESN'T USE DIRPC THIS PC
18276         MOVEM J,ENDT(TT)
18277         MOVEI J,444400
18278         HRLM J,DIRPT(TT)
18279         HRL A,TT
18280         JSP Q,OPSLD1
18281         NDATAI,,NBLKI
18282
18283 UTDCLS: MOVE B,DSKLST(A)
18284         CAIN B,3
18285         JRST UTDCL1
18286 UTDCLX: SETOM UDUSR(A)
18287         POPJ P,
18288
18289 UTDCL1: PUSH P,A
18290         MOVE A,UUDPP(A)
18291         LSH A,-10.
18292         PUSHJ P,MEMR
18293         POP P,A
18294         JRST UTDCLX
18295
18296 ;UNIT MODE IOT ON DIR DEVICE COMES HERE (RETURN CHAR IN W)
18297 DIRCH:  SETOM SRN3(U)   ;SAY WE WANT ONLY 1 CHARACTER.
18298         PUSHJ P,DIRCHR
18299         HRRZ W,I
18300         CAIN W,^C
18301          JRST UNIEOF
18302         POPJ P,
18303
18304 ;BLOCK MODE IOT ON DIR DEVICE.
18305 DIRB:   JSP Q,WRDBT     ;PUSHJ'S TO .+1 FOR EACH WORD.
18306 DIRB1:  XCTR XRW,[MOVES (C)]    ;MAKE SURE WE CAN WRITE.
18307         PUSH P,C
18308         PUSH P,H
18309         SETZM SRN3(U)   ;SAY WE WANT A WHOLE WORD OF CHARS.
18310         PUSHJ P,DIRCHR
18311         POP P,H
18312         POP P,C
18313         LDB Q,[350700,,SRN3(U)]
18314         CAIN Q,^C       ;IF THE WORD STARTS WITH ^C,
18315          JRST POPJ2     ;IT IS EOF; DON'T RETURN IT, UNHANG IOT.
18316         MOVE Q,SRN3(U)
18317         UMOVEM Q,(C)
18318         MOVEI Q,DIRB1   ;FASTER THAN PUSHING AND POPPING Q.
18319         POPJ P,         ;RETURN INTO WRDBT
18320
18321         SKIPA T,[SIOKT]
18322 DDATAI:  MOVEI T,CHRKTI ;UNIT IMAGE INPUT FROM DIRECTORY.
18323         CAIA
18324 DBLKI:   MOVEI T,BLKT   ;BLOCK IMAGE INPUT FROM DIRECTORY
18325         MOVE E,[444400,,1]
18326         JSP B,(T)       ;TO BLKT, SIOKT, OR CHRKTI
18327           DIRPT(A)
18328           NUM(A)
18329           POPJ2         ;EOF IF TRY TO GET ANOTHER BUFFER
18330           CPOPJ         ;BUFFER DISCARD ROUTINE
18331           BUG
18332           SKIPA
18333 \f
18334 ;ERR DEVICE AND ERROR MESSAGE TABLES
18335 ; ERR DEVICE WORKS MUCH LIKE DIR DEVICE
18336
18337 ERRO:   MOVEI J,5
18338         JRST LISTF7
18339
18340 ERR2:   SOJE A,ERR21    ;LAST ERRONEOUS CHANNEL
18341         SOJE A,ERR22    ;CHANNEL SPECIFIED IN B
18342         SOJE A,ERR23    ;STATUS WORD IN B
18343         SOJE A,ERR24    ;.CALL ERROR ARG IN B
18344         SETOM UDUSR(TT)
18345         JRST OPNL11
18346
18347 ERR21:  LDB B,[BCHPTR]
18348 ERR22:  ANDI B,17
18349         ADDI B,IOCHST(U)
18350         SKIPA B,(B)
18351 ERR24:   MOVSS B
18352 ERR23:  MOVEM B,UUDPP(TT)
18353         JRST UDIF1
18354
18355 CORO:   PUSHJ P,FLDRCK
18356         JRST OPNL11
18357         MOVEI J,7
18358         JRST LISTF7
18359
18360 ERR1:   SKIPN I,UUDPP(A)
18361         JRST ERR3
18362         LDB B,[220600,,UUDPP(A)]        ;OPEN LOSS FIELD
18363         JUMPE B,ERR1B
18364         CAIL B,NERMES+1
18365          MOVEI B,NERMES+1
18366         MOVE TT,ERMST1-1(B)
18367         JSP B,MESPNT
18368 ERR1B:  LDB B,[300300,,UUDPP(A)]        ;IDS ERROR FIELD
18369         JUMPE B,ERR1C
18370         MOVE TT,ERMST2-1(B)
18371         JSP B,MESPNT
18372 ERR1C:  LDB B,[330400,,UUDPP(A)]        ;IOCERR FIELD
18373         JUMPE B,UCL7
18374         CAIL B,MIOTER
18375         CAIL B,NERM1+MIOTER
18376         MOVEI B,NERM1+MIOTER
18377         MOVE TT,ERMST3-MIOTER(B)
18378         JSP B,MESPNT
18379         JRST UCL7
18380
18381 ERR3:   MOVEI TT,[ASCIZ /ISE0
18382 /]
18383         JSP B,MESPNT
18384         JRST UCL7
18385 \f
18386 ;LISP ASSUMES THAT NO "ERR" DEVICE MESSAGE WILL EVER CONTAIN
18387 ; !, #, ^, OR LOWER CASE LETTERS.  PLEASE MAINTAIN THIS STATE
18388 ;   GLS (GUY STEELE)
18389
18390 ERMST1: [ASCIZ /NO SUCH DEVICE
18391 /]
18392         [ASCIZ /WRONG DIRECTION
18393 /]
18394         [ASCIZ /TOO MANY TRANSLATIONS
18395 /]
18396         [ASCIZ /FILE NOT FOUND
18397 /]
18398         [ASCIZ /DIRECTORY FULL
18399 /]
18400         [ASCIZ /DEVICE FULL
18401 /]
18402         [ASCIZ /DEVICE NOT READY
18403 /]
18404         [ASCIZ /DEVICE NOT AVAILABLE
18405 /]
18406         [ASCIZ /ILLEGAL FILE NAME
18407 /]
18408         [ASCIZ /MODE NOT AVAILABLE
18409 /]
18410         [ASCIZ /FILE ALREADY EXISTS
18411 /]
18412         [ASCIZ /BAD CHANNEL NUMBER
18413 /]
18414         [ASCIZ /TOO MANY ARGUMENTS (CALL)
18415 /]
18416         [ASCIZ /PACK NOT MOUNTED
18417 /]
18418         [ASCIZ /DIRECTORY NOT AVAIL
18419 /]
18420         [ASCIZ /NON-EXISTENT DIRECTORY
18421 /]
18422         [ASCIZ /LOCAL DEVICE ONLY
18423 /]
18424         [ASCIZ /SELF-CONTRADICTORY OPEN
18425 /]
18426         [ASCIZ /FILE LOCKED
18427 /]
18428         [ASCIZ /M.F.D. FULL
18429 /]
18430         [ASCIZ /DEVICE NOT ASSIGNABLE TO THIS PROCESSOR
18431 /]
18432         [ASCIZ /DEVICE WRITE-LOCKED
18433 /]
18434         [ASCIZ /LINK DEPTH EXCEEDED
18435 /]
18436         [ASCIZ /TOO FEW ARGUMENTS (CALL)
18437 /]
18438         [ASCIZ /CAN'T MODIFY JOB
18439 /]
18440         [ASCIZ /CAN'T GET THAT ACCESS TO PAGE
18441 /]
18442         [ASCIZ /MEANINGLESS ARGS
18443 /]
18444         [ASCIZ /WRONG TYPE DEVICE
18445 /]
18446         [ASCIZ /NO SUCH JOB
18447 /]
18448         [ASCIZ /VALID CLEAR OR STORED SET
18449 /]
18450         [ASCIZ /NO CORE AVAILABLE
18451 /]
18452         [ASCIZ /NOT TOP LEVEL
18453 /]
18454         [ASCIZ /OTHER END OF PIPELINE GONE OR NOT OPEN
18455 /]
18456         [ASCIZ /JOB GONE OR GOING AWAY
18457 /]
18458         [ASCIZ /ILLEGAL SYSTEM CALL NAME
18459 /]
18460         [ASCIZ /CHANNEL NOT OPEN
18461 /]
18462         [ASCIZ /INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18463 /]
18464         [ASCIZ /UNRECOGNIZABLE FILE
18465 /]
18466         [ASCIZ /LINK TO NON-EXISTENT FILE
18467 /]
18468 IFN .-ERMST1-NOPNLS,.ERR WRONG TABLE LENGTH
18469 ;ADD NEW MESSAGES HERE
18470
18471 IFN 0,[         A CLASSIFICATION OF OPEN-LOSS MESSAGES
18472
18473 FULL -  NO CORE (MMP FULL)
18474         DIR NOT AVAIL (DIR CHNL TABLE FULL)
18475         DEVICE FULL
18476         DIR FULL
18477         MFD FULL
18478         INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18479
18480 NO SUCH - DEVICE, FILE, JOB, DIRECTORY, PAGE (CAN'T GET ACCESS)
18481           ILLEGAL SYSTEM CALL NAME
18482
18483 ALREADY ONE SUCH - FILE (FILE ALREADY EXISTS - RENAME)
18484
18485 WRITING - CAN'T MODIFY JOB
18486          DEVICE WRITE-LOCKED
18487          WRONG DIRECTION
18488          MODE NOT AVAILABLE
18489          CAN'T GET ACCESS TO PAGE
18490
18491 ARGS (THE PARAMETERS ARE RIDICULOUS) -
18492         SELF-CONTRADICTORY OPEN COMMAND
18493         ILLEGAL FILE NAME
18494         BAD CHANNEL NUMBER
18495         TOO FEW ARGS
18496         TOO MANY ARGS
18497         MEANINGLESS ARGS
18498         CHANNEL NOT OPEN
18499
18500 NOT AVAILABLE (IT EXISTS BUT YOU CAN'T USE IT) -
18501         DEVICE NOT READY
18502         DEVICE NOT AVAILABLE
18503                NOT ASSIGNABLE TO THIS PROCESSOR
18504         LOCAL DEVICE
18505         PACK NOT MOUNTED
18506         FILE LOCKED
18507         OTHER END OF PIPELINE GONE
18508         JOB GONE OR GOING AWAY
18509
18510 DEPTH - LINK DEPTH EXCEEDED
18511         TOO MANY TRANSLATIONS
18512
18513 OTHER - NOT TOP LEVEL
18514         VALID CLEAR OR STORED SET
18515 ]
18516 \f
18517 NERMES==.-ERMST1
18518         [ASCIZ /OPEN TYPE NOT DETERMINED
18519 /]
18520
18521 ERMST2: [ASCIZ /IDS ILLEGAL SCOPE MODE
18522 /]
18523         [ASCIZ /IDS SCOPE HUNG
18524 /]
18525         [ASCIZ /MORE THAN 1K SCOPE BUFFER
18526 /]
18527         [ASCIZ /IDS MEM PROTECT
18528 /]
18529         [ASCIZ /IDS ILLEGAL SCOPE OP
18530 /]
18531         [ASCIZ /IDS MEM PROTECT ON PDL PNTR
18532 /]
18533         [ASCIZ /IDS ILLEGAL PARAMETER SET
18534 /]
18535
18536 ERMST3: [ASCIZ /DEVICE HUNG OR REPORTING NON-DATA ERROR
18537 /]
18538         [ASCIZ /END OF FILE
18539 /]
18540         [ASCIZ /NON-RECOVERABLE DATA ERROR
18541 /]
18542         [ASCIZ /NON-EXISTENT SUB DEVICE
18543 /]
18544         [ASCIZ /OVER IOPOP
18545 /]
18546         [ASCIZ /OVER IOPUSH
18547 /]
18548         [ASCIZ /USR OP CHNL DOES NOT HAVE USR OPEN
18549 /]
18550         [ASCIZ /CHNL NOT OPEN
18551 /]
18552         [ASCIZ /DEVICE FULL
18553 /]
18554         [ASCIZ /CHNL IN ILLEGAL MODE ON IOT
18555 /]
18556         [ASCIZ /ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY
18557 /]
18558         [ASCIZ /DIRECTORY FULL
18559 /]
18560         [ASCIZ /DIRECTORY'S ALLOCATION EXHAUSTED
18561 /]
18562 ;INSERT NEW MESSAGES HERE
18563 NERM1==.-ERMST3
18564         [ASCIZ /IOT OR OPR TYPE NOT DETERMINED
18565 /]
18566 \f
18567 ;DIRECTORY LISTING ROUTINES
18568
18569 UQL3C:  SKIPA I,["*]
18570 UQL3:    MOVEI I,"-
18571         PUSHJ P,OUTC
18572         JRST UQL3A
18573
18574 UQL2:   MOVEI TT,[MNAME ASCIZ /,  /]    ;GENERATE USER DIRECTORY
18575         JSP B,MESPNT
18576         MOVE I,UUDPP(A)
18577         MOVEI J,UDNAME(I)
18578         JSP B,SIXTYC    ;SEND DIRECTORY NAME
18579         MOVEI TT,[ASCIZ /
18580 FREE BLOCKS /]
18581         JSP B,MESPNT
18582         MOVSI E,-NQS
18583 UQL2A:  SKIPGE QACT(E)
18584          JRST UQL3      ;UNIT NOT ENGAGED
18585         MOVE J,QTUTO(E)
18586         TLNE J,40000
18587          JRST UQL3C     ;TUT FOR UNIT NOT IN
18588         MOVEI I,"#
18589         PUSHJ P,OUTC
18590         MOVE TT,QPKID(E)
18591         JSP B,GDPT      ;AND #
18592         MOVEI I,"=
18593         PUSHJ P,OUTC
18594         MOVE TT,QSFT(E)
18595         JSP B,GDPT      ;AND # FREE TRACKS
18596 UQL3A:  PUSHJ P,OUTCS
18597         AOBJN E,UQL2A
18598         JSP B,MESPCR
18599         MOVE I,UUDPP(A)
18600         MOVEM I,DIRPT(A)
18601         MOVE Q,UDNAMP(I)
18602 UQL4:   CAIL Q,2000
18603          JRST UCL7
18604         HRLI I,440600+Q
18605         HLLM I,DIRPT(A)
18606 \f
18607 UQLP:   ADDI Q,2        ;MOVE PNTR TO 3RD WRD OF FILE DESC
18608         MOVE I,@DIRPT(A)
18609         MOVEI TT,[ASCIZ /* /]   ;DELETED OR BEING WITTEN
18610         TLNN I,UNIGFL
18611          MOVEI TT,[ASCIZ /  /]
18612         JSP B,MESPNT
18613         MOVE I,@DIRPT(A)
18614         TLNE I,UNLINK
18615          JRST UQLL1     ;LINK
18616         LDB TT,[UNPKN+@DIRPT(A)]
18617         JSP B,GDPT      ;PRINT PACK #
18618         LDB TT,[UNPKN+@DIRPT(A)]
18619         CAIG TT,9
18620 UQLL2:   PUSHJ P,OUTCS
18621         PUSHJ P,OUTCS
18622         SUBI Q,2        ;BACK TO FIRST WD
18623         JSP B,SIXTYA    ;SEND FIRST FILE NAME
18624         JSP B,SIXTYB    ;AND SECOND (AOSES Q)
18625         PUSHJ P,OUTCS
18626         AOS Q           ;SET Q TO POINT TO FILE DESC PNTR
18627         LDB E,[UNDSCP+@DIRPT(A)]        ;PICK UP FILE DESC PNTR
18628         IDIVI E,UFDBPW
18629         ADDI E,UDDESC   ;COMPUTE WORD ADDRESS
18630         MOVE I,@DIRPT(A)        ;SAVE STATUS WORD
18631         EXCH E,Q        ;MOVE INTO PNTR
18632         MOVE TT,QBTBLI(TT)
18633         TLO TT,Q
18634         HLLM TT,DIRPT(A)        ;SET UP DIRPT TO POINT TO FILE DESC
18635         TLNE I,UNLINK
18636          JRST QLL1      ;LINK
18637         MOVEI TT,0
18638 UQL5:   JSP B,UQL5R     ;CHECK IF ABOUT TO INCREMENT OFF WORD
18639         ILDB I,DIRPT(A)
18640         JUMPE I,UQL5A   ;STOP
18641         CAILE I,UDTKMX
18642          JRST UQL5B
18643         ADD TT,I
18644         JRST UQL5
18645
18646 UQLL1:  MOVEI I,"L
18647         PUSHJ P,OUTC
18648         JRST UQLL2
18649 \f
18650 QLL1:   CLEARM ENDT(A)  ;CNTS TO 3 FOR USER NAME AND 2 FILE NAMES
18651 QLL3:   CLEARM NUM(A)   ;CHR CNTR
18652 QLLIST: JSP B,UQL5R
18653         ILDB I,DIRPT(A)
18654         JUMPE I,QLL4
18655         CAIN I,';
18656          JRST QLL2
18657         CAIN I,':
18658          JRST QLL5
18659 QLL5A:  ADDI I,40
18660         PUSHJ P,OUTC
18661         AOS I,NUM(A)
18662         CAIGE I,6
18663          JRST QLLIST
18664 QLL2:   PUSHJ P,OUTCS
18665         AOS I,ENDT(A)
18666         CAIGE I,3
18667          JRST QLL3
18668 QLL4:   JSP B,MESPCR
18669         MOVEI Q,3(E)    ;ADVANCE Q
18670         JRST UQL4
18671
18672 QLL5:   JSP B,UQL5R
18673         ILDB I,DIRPT(A)
18674         JRST QLL5A
18675
18676 UQL5R:  MOVE I,DIRPT(A) ;CHECK IF ABOUT TO ILDB OFF WORD
18677         TLNE I,770000
18678          JRST (B)       ;NO
18679         MOVEI I,440600+Q        ;YES INCREMENT Q INSTEAD
18680         HRLM I,DIRPT(A)
18681         AOJA Q,(B)
18682
18683 UQL5B:  CAIGE I,UDWPH   ;PLACE HOLDER
18684          AOJA TT,UQL5   ;SKIP AND TAKE
18685         CAIN I,UDWPH
18686          JRST UQL5      ;NULL
18687         REPEAT NXLBYT,[JSP B,UQL5R
18688         IBP DIRPT(A)
18689 ]
18690         AOJA TT,UQL5    ;SPACE OVER 2ND HALF OF LOAD ADDRESS
18691 \f
18692 UQL5A:  JSP B,GDPT      ;TYPE OUT # BLOCKS
18693         PUSHJ P,OUTCS
18694         MOVE Q,E        ;FILE POINTER
18695         MOVEI I,"!
18696         SKIPGE B,@DIRPT(A)      ;SKIP ON NOT DUMPED
18697          MOVEI I,40
18698         PUSHJ P,OUTC    ;HAS NOT BEEN BACKED UP
18699         MOVEI I,"$
18700         TLNN B,UNREAP   ;SKIP ON DON'T-REAP
18701          MOVEI I,40
18702         PUSHJ P,OUTC
18703         MOVEI Q,1(E)
18704         LDB E,[1200,,DIRPT(A)]
18705         JUMPN E,[JRST 4,.]
18706         MOVE TT,@DIRPT(A)
18707         AOJE TT,UQL5C   ;DATE NOT KNOWN
18708         LDB TT,[UNMON+@DIRPT(A)]
18709         JSP B,GDPT      ;TYPE MONTH
18710         MOVEI I,"/
18711         PUSHJ P,OUTC
18712         LDB TT,[UNDAY+@DIRPT(A)]
18713         JSP B,GDPT      ;TYPE DAY
18714         MOVEI I,"/
18715         PUSHJ P,OUTC
18716         LDB TT,[UNYRB+@DIRPT(A)]
18717         JSP B,GDPT      ;TYPE YEAR
18718         PUSHJ P,OUTCS
18719         HRRZ TT,@DIRPT(A)
18720         IDIVI TT,60.*60.*2
18721         MOVE E,I
18722         JSP B,G2DPT
18723         MOVEI I,":
18724         PUSHJ P,OUTC
18725         MOVE TT,E
18726         IDIVI TT,60.*2
18727         MOVE E,I
18728         JSP B,G2DPT
18729         MOVEI I,":
18730         PUSHJ P,OUTC
18731         MOVE TT,E
18732         LSH TT,-1
18733         JSP B,G2DPT
18734 UQL5D:  JSP B,MESPCR
18735         ADDI Q,2        ;ADVANCE Q
18736         JRST UQL4
18737
18738 UQL5C:  MOVEI I,"-
18739         PUSHJ P,OUTC
18740         JRST UQL5D
18741
18742 ;GENERATE MFD LISTING
18743 QMLS1:  CONO PI,CLKOFF
18744         MOVE Q,QMDRO
18745         HRLI Q,440600+Q
18746         MOVEM Q,DIRPT(A)
18747         MOVE Q,MDNAMP(Q)
18748         CONO PI,CLKON
18749 QMLS2:  CAIL Q,1777
18750          JRST UCL7
18751         SKIPN @DIRPT(A)
18752          JRST QMLS3
18753         JSP B,SIXTYA
18754         JSP B,MESPCR
18755 QMLS3:  ADDI Q,LMNBLK
18756         JRST QMLS2
18757 \f
18758 ;DIRECTORY LISTING ROUTINES FOR UTAPE
18759
18760 IFN NUNITS,[
18761 LISTF:  MOVEI Q,220600+Q
18762         HRLM Q,DIRPT(A)
18763         MOVEI Q,177
18764         MOVE TT,@DIRPT(A)
18765         AOJE TT,LISTF1
18766         JSP B,SIXTYP
18767 LISTF1: MOVEI TT,[ASCIZ /
18768 FREE FILES /]
18769         JSP B,MESPNT
18770         MOVSI Q,-23.
18771         MOVEI TT,0
18772 LISTF4: SKIPE @DIRPT(A)
18773         AOJA Q,LISTF8
18774         AOS Q
18775         SKIPN @DIRPT(A)
18776         AOS TT
18777 LISTF8: AOBJN Q,LISTF4
18778         JSP B,GDPT
18779         MOVEI TT,[ASCIZ /       FREE BLOCKS /]
18780         JSP B,MESPNT
18781         SETZB J,TT
18782         JSP B,BLKPNT
18783 LISTD2: JSP B,MESPCR
18784         MOVSI Q,-23.
18785 LISTF2: MOVEI I,440600+Q
18786         HRLM I,DIRPT(A)
18787         MOVE I,@DIRPT(A)
18788         JUMPE I,LISTF5
18789 LISTF6: PUSHJ P,OUTCS
18790         JSP B,SIXTYA
18791         JSP B,SIXTYB
18792         PUSHJ P,OUTCS
18793         MOVEI J,1(Q)
18794         JSP B,BLKPNN
18795 LISTD4: JSP B,MESPCR
18796 LISTF3: AOBJN Q,LISTF2
18797 ];END IFN NUNITS
18798
18799 UCL7:   MOVEI I,14      ;END DIR WITH FORMFEED AND EOF CHARS
18800         PUSHJ P,OUTC
18801         HRROI I,EOFCH
18802         JRST .-2
18803
18804 IFN NUNITS, LISTF5:     AOJA Q,LISTF3
18805 \f
18806 ; DIRECTORY LISTING ROUTINES FOR MISC. DEVICES + CORE LINK
18807
18808 NDLF:   MOVEI TT,[ASCIZ /
18809 NON-DIRECTORY DEVICE/]
18810         JSP B,MESPNT
18811         JRST UCL7
18812
18813 ;DIRECTORY OF CORE LINK DEVICE
18814 UCL1:   MOVSI Q,-NCLCH
18815 UCL6:   SKIPN CLSYN(Q)
18816         JRST UCL5A
18817         MOVEI J,CLSYN(Q)
18818         JSP B,SIXTYC
18819         MOVEI J,CLN1(Q)
18820         JSP B,SIXTYC
18821         MOVEI J,CLN2(Q)
18822         JSP B,SIXTYC
18823         HLRE B,CLUSR(Q)
18824         AOJE B,UCL2
18825         MOVEI J,UNAME-1(B)
18826         MOVEM B,NUM(A)
18827         JSP B,SIXTYC
18828         MOVE B,NUM(A)
18829         MOVEI J,JNAME-1(B)
18830         JSP B,SIXTYC
18831 UCL3:   MOVEI TT,[ASCIZ /->/]
18832         JSP B,MESPNT
18833         HRRE B,CLUSR(Q)
18834         AOJE B,UCL4
18835         MOVEI J,UNAME-1(B)
18836         MOVEM B,NUM(A)
18837         JSP B,SIXTYC
18838         MOVE B,NUM(A)
18839         MOVEI J,JNAME-1(B)
18840         JSP B,SIXTYC
18841 UCL5:   JSP B,MESPCR
18842 UCL5A:  AOBJN Q,UCL6
18843         JRST UCL7
18844
18845 UCL4:   MOVEI B,UCL5
18846         JRST .+2
18847 UCL2:   MOVEI B,UCL3
18848         MOVEI J,[SIXBIT /CLOSED/]
18849 SIXTYC: HRLI J,440600
18850         MOVEM J,DIRPT(A)
18851         PUSHJ P,OUTCS
18852         JRST SIXTYP
18853 \f
18854 ; DIRECTORY LISTING ROUTINES FOR TTY
18855
18856 TTYFLD: MOVEI TT,[ASCIZ /
18857 TTY UNAME  JNAME  CORE  TOTAL IDX
18858 /]
18859         JSP B,MESPNT
18860         MOVSI Q,-NCT
18861 TTYF1:  HRRE E,TTYSTS(Q)
18862         AOJE E,TTYF5    ;JUMP IF NOT IN USE
18863         MOVE E,TTYSTS(Q)
18864         MOVEI I,"T      ;TTY
18865         TLNN E,%TSCNS
18866          MOVEI I,"D     ;"DEVICE"
18867         PUSHJ P,OUTC
18868         HRRZ TT,Q
18869         JSP B,G2OPT
18870         HRRZS E
18871 TTYF11: MOVEI J,UNAME(E)
18872         JSP B,SIXTYC
18873         MOVEI J,JNAME(E)
18874         JSP B,SIXTYC
18875         PUSHJ P,OUTCS
18876         MOVE TT,NMPGS(E)
18877         JSP B,G4SDPT
18878         PUSHJ P,OUTCS
18879         PUSHJ P,OUTCS
18880         MOVEM E,DIRPT(A)
18881         MOVE E,UTMPTR(E)
18882         SETZB B,TT
18883 TTYF3:  SKIPE UNAME(B)
18884          CAME E,UTMPTR(B)
18885           JRST TTYF4
18886         ADD TT,NMPGS(B)
18887 TTYF4:  ADDI B,LUBLK
18888         CAMGE B,USRHI
18889          JRST TTYF3
18890         JSP B,G4SDPT
18891         PUSHJ P,OUTCS
18892         PUSHJ P,OUTCS
18893         HRRZ TT,DIRPT(A)
18894         SKIPL SUPPRO(TT)
18895          JRST [ HRRZ TT,SUPPRO(TT) ? JRST .-1 ]
18896         IDIVI TT,LUBLK
18897         JSP B,GOPT
18898         JSP B,MESPCR
18899 TTYF5:  AOBJN Q,TTYF1
18900 TTYF99: MOVEI TT,[ASCIZ /FREE CORE  /]
18901         JSP B,MESPNT
18902         MOVE TT,MEMFR
18903         SUB TT,NCBCOM
18904         JSP B,GDPT
18905         MOVEI TT,[ASCIZ / OUT /]
18906         JSP B,MESPNT
18907         MOVE TT,NPGSWO
18908         JSP B,GDPT
18909         JSP B,MESPCR
18910         JRST UCL7
18911 \f
18912 SIXTYB: AOS Q
18913 SIXTYA: PUSHJ P,OUTCS
18914         MOVEI I,440600+Q
18915         HRLM I,DIRPT(A)
18916
18917 SIXTYP: ILDB I,DIRPT(A)
18918         ADDI I,40
18919         PUSHJ P,OUTC
18920         MOVE I,DIRPT(A)
18921         TLNE I,770000
18922         JRST SIXTYP
18923         JRST (B)
18924
18925 MESP3S: SKIPA TT,[[ASCIZ /   /]]
18926 MESPCR: MOVEI TT,[ASCIZ /
18927 /]
18928 MESPNT: HRLI TT,440700
18929         MOVEM TT,NUM(A)
18930         ILDB I,NUM(A)
18931         JUMPE I,(B)
18932         PUSHJ P,OUTC
18933         JRST .-3
18934
18935 OUTCS:  MOVEI I,40
18936 OUTC:   SKIPL TT,SRN3(U) ;IF WANT 1 CHAR, RETURN WITH IT, SAVING ACS.
18937          JRST OUTC1     ;IF WANT WHOLE WORD, SEE IF WORD IS FULL.
18938 OUTC2:  MOVEM E,SAVE(A)
18939         MOVEM Q,SAVQ(A)
18940         MOVEM B,SAVB(A)
18941         POP P,DIRPC(A)
18942         POPJ P,
18943
18944 OUTC1:  LSH TT,6
18945         ADDI TT,(I)     ;MERGE THIS CHAR (IN I) INTO WORD BEING ACCUMULATED.
18946         LSH TT,1
18947         MOVEM TT,SRN3(U)
18948         TLNE TT,774000  ;IF THE WORD IS FULL, RETURN TO DIRB.
18949          JRST OUTC2
18950         POPJ P,         ;ELSE POPJ FROM OUTC, TO GET MORE CHARS.
18951 \f
18952 ;NUMERIC PRINTOUT ROUTINES FOR FILE DIRECTORIES.
18953 ;ALL CALLED WITH JSP B,.  ALL TAKE ARG IN TT.
18954
18955 ;PRINT NUMBER IN TT IN DECIMAL, RIGHT-ADJUSTED IN FOUR COLUMNS.
18956 G4SDPT: CAIL TT,1000.
18957          JRST GDPT              ;IF IT NEEDS 4 DIGITS, JUST PRINT IT.
18958         MOVEM TT,NUM(A)
18959         CAIL TT,100.            ;ELSE FIGURE OUT HOW MANY LEADING SPACES ARE NEEDED
18960          JRST G4SDP1
18961         CAIL TT,10.
18962          JRST G4SDP2
18963         PUSHJ P,OUTCS           ;AND PRINT THAT MANY.
18964 G4SDP2: PUSHJ P,OUTCS
18965 G4SDP1: PUSHJ P,OUTCS
18966         MOVE TT,NUM(A)
18967         JRST GDPT
18968
18969 ;PRINT CONTENTS OF TT AS TWO OCTAL DIGITS.
18970 G2OPT:  IDIVI TT,8
18971         JRST G2DPT2
18972
18973 ;PRINT CONTENTS OF TT AS THREE DECIMAL DIGITS.
18974 G3DPT:  IDIVI TT,100.
18975         MOVEM I,NUM(A)
18976         MOVEI I,"0(TT)
18977         PUSHJ P,OUTC
18978         MOVE TT,NUM(A)
18979 G2DPT:  IDIVI TT,10.
18980 G2DPT2: MOVEM I,NUM(A)
18981         MOVEI I,"0(TT)
18982         PUSHJ P,OUTC
18983         MOVE I,NUM(A)
18984         ADDI I,"0
18985         PUSHJ P,OUTC
18986         JRST (B)
18987
18988 ;PRINT ARG IN TT IN DECIMAL USING AS MANY DIGITS AS IT NEEDS.
18989 GDPT:   HRLI B,10.
18990         JRST GDPT0
18991
18992 ;PRINT ARG IN TT IN OCTAL USING AS MANY DIGITS AS NECESSARY.
18993 GOPT:   HRLI B,8
18994 GDPT0:  MOVSS B
18995         SETZM ENDT(A)
18996         MOVEM TT,NUM(A)
18997 GDPT1:  PUSH P,Q
18998          MOVE Q,TT
18999          IDIVI TT,(B)
19000          CAME TT,ENDT(A)
19001           JRST .-3
19002         MOVEM Q,ENDT(A)
19003         POP P,Q
19004         ADDI I,"0
19005         PUSHJ P,OUTC
19006         MOVE TT,NUM(A)
19007         CAME TT,ENDT(A)
19008          JRST GDPT1
19009         MOVSS B
19010         JRST (B)
19011 \f
19012 ;ROUTINE TO CALL A DIRECTORY COROUTINE
19013 DIRCHR: MOVE E,SAVE(A)
19014         MOVE B,SAVB(A)
19015         MOVE Q,SAVQ(A)
19016         JRST @DIRPC(A)
19017
19018 IFN NUNITS,[
19019 BLKPNA: MOVEI J,1(I)
19020         LSH J,-1
19021         JRST BLKPNT+1
19022
19023 BLKPNN: LSH J,-1
19024 BLKPNT: MOVEI TT,0
19025         MOVEI I,56
19026 BLKPN2: MOVEI E,440500+I
19027         HRLM E,DIRPT(A)
19028 BLKPN1: ILDB E,DIRPT(A)
19029         CAIN E,37
19030         JRST BLKPN3
19031         CAMN E,J
19032         AOS TT
19033         HLRZ E,DIRPT(A)
19034         TRNE E,760000
19035         JRST BLKPN1
19036         AOJA I,BLKPN2
19037 BLKPN3: JUMPE J,GDPT
19038         MOVSI I,-23.
19039 BLKPN4: MOVE E,@DIRPT(A)
19040         AOS I
19041         CAMN J,@DIRPT(A)
19042         JUMPE E,BLKPNA
19043         AOBJN I,BLKPN4
19044         JRST GDPT
19045 ];NUNITS
19046 EBLK
19047
19048 UDUSR:  REPEAT NUDCH,-1 ;-1 => FREE, ELSE UTAPE # IF UTAPE DIR, ELSE 0.
19049 UDUIND: BLOCK NUDCH     ;IF DIR CHANNEL IN USE, HOLDS JOB # OF JOB USING IT.
19050
19051 IRPS X,,DIRPC:DIRPT:NUM:ENDT:SAVB:SAVQ:UDSYSN:UUDPP:SAVE:
19052 X:      REPEAT NUDCH,-1
19053         TERMIN
19054 UDCSW:  -1
19055         0
19056
19057 DSKLST: BLOCK NUDCH     ;0 LISTING UTAPE 1 NON-DIR DEVICE
19058                                 ;2 CORE LINK 3 2311
19059 ;NO BBLK SINCE VARIABLES ON NEXT PAGE
19060 \f
19061 SUBTTL UTC LEVEL INTERRUPT
19062
19063 ;NO EBLK SINCE VARIABLES ON PREVIOUS PAGE
19064
19065 UTCPDP: -LUTCP,,UTCP-1  ;UTC-LEVEL PDL
19066 UTCP:   BLOCK LUTCP
19067 UTACS:  BLOCK 20        ;UTC-LEVEL AC SAVE
19068
19069 IFE KS10P,[     ; On the KS10 we can take advantage of the Unibus interrupt
19070                 ; vectoring scheme to dispatch quicker, so this code was
19071                 ; reorganized somewhat.
19072 UTCBRK: 0
19073 BBLK
19074 IFN KL10P,[
19075         CONSO PI,1_<7-UTCCHN>
19076          JRST 4,.       ;HARDWARE BUG ALLEGEDLY FIXED
19077 ]
19078         MOVEM U,UTACS+U
19079         MOVEI U,UTACS
19080         BLT U,UTACS+U-1
19081         MOVE P,UTCPDP
19082 IFN NUNITS,[
19083 IFE NEWDTP,[
19084         CONSZ DC,6
19085          JRST PIPOS     ;HAS CHNL >1
19086 PIPX:
19087 ]
19088 IFN NEWDTP,[
19089         SKIPGE CUINT
19090          JRST UTCB0
19091 ]
19092 ];IFN NUNITS
19093 IFN IMPP,[      ; See if it's an IMP interface interrupt
19094 IFN KAIMP,[
19095         CONI IMP,TT
19096         LDB A,[000300,,TT]
19097         CAIE A,NETCHN
19098          JRST UTCB2
19099         TRNE TT,IMPLW+IMPHER+IMPERR+IMPOD+IMPID
19100 ]
19101 IFN DMIMP,[
19102         CONI FI,TT
19103         TRNN TT,70      ;CHECK PIA
19104          JRST UTCB2     ;DO NOT PROCESS IF NO PIA
19105         TRNE TT,FILW+FIDOWN+FIWASD+FIOD+FIID
19106 ]
19107          JRST IMPINT
19108 UTCB2:] ;IFN IMPP
19109
19110 IFN DC10P,[
19111         CONI DC0,TT
19112         TRNE TT,DPIRQC
19113          JRST QINT
19114 ]
19115 IFE KA10P, CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS
19116 IFN T300P,[
19117         SKIPE DSCDON
19118          JRST T3INT
19119 ];T300P
19120 IFN RP10P,[
19121         CONI DPC,TT
19122         TRNE TT,7
19123          TRNN TT,10     ;IF BIT IS ON IT IS INTERRUPTING - LET QINT HAVE IT
19124           SKIPGE QGTBZY
19125            JRST QINT
19126 ]
19127 IFN RH10P,[
19128         CONI DSK,TT
19129         TRNN TT,%HIDON+%HIATN   ;INTERRUPTING HARDWARILY
19130          SKIPGE QGTBZY          ;INTERRUPTING SOFTWARILY
19131           JRST QINT
19132 ]
19133 IFN TM10P,[
19134         CONI MTC,A
19135         CONI MTS,C
19136         LDB TT,[030300,,A]
19137         CAIE TT,MTCCHN
19138          JRST UTCBK2
19139         TRNN C,100      ;IF NOT JOB DONE
19140          TRZ C,30000    ; THEN DON'T BELIEVE PAR ERR OF EOF
19141         TRNN A,400      ;IF NEXT UNIT NOT ENABLED
19142          TRZ C,2        ;THEN TURN OFF NEXT UNIT FLAG
19143         TRNE C,440302   ; UNIT HUNG, ILLEGAL, BAD TAPE (UGH), LOAD NEXT UNIT, JOB DONE
19144          JRST MGHBRK
19145 UTCBK2: SKIPN MGTBZY    ; SOFT WARE CALL
19146          JRST MGSBRK
19147 ]
19148 IFN NUNITS,     JRST UTCB0
19149
19150 POPRET:
19151 IFN NUNITS,[
19152         MOVE A,TIME
19153         MOVEM A,LUTOTM
19154 ]
19155 DSKEX:
19156 IMPEX:
19157 MGEX:   MOVSI U,UTACS
19158         BLT U,U
19159         JRST 12,@UTCBRK
19160
19161 ] ;IFE KS10P
19162
19163 IFN KS10P,[
19164
19165 UTCBRK: 0                       ; Still EBLK'ed from previous page...
19166 BBLK
19167         MOVEM U,UTACS+U
19168         MOVEI U,UTACS
19169         BLT U,UTACS+U-1
19170         MOVE P,UTCPDP
19171         CONO PI,020000+200_<-UTCCHN>    ;BAG-BITING DEC LOSERS
19172 IFN KSIMP,[
19173         AOSN IMPBZY             ;-1 if IMP wants a jump-start
19174          PUSHJ P,IMPINT
19175 ]
19176 IFN RH11P,[
19177         SKIPGE QGTBZY
19178          JRST QINT
19179 ] ;RH11P
19180 IFN TM03S,[
19181         SKIPN MGTBZY
19182          JRST MGSBRK
19183 ]
19184 IMPEX:
19185 MGEX:
19186 DSKEX:  MOVSI U,UTACS
19187         BLT U,U
19188         JRST 12,@UTCBRK
19189
19190 ;;; Interrupt routines that are directly dispatched to by the KS10/Unibus
19191 ;;; interrupt kludge should do JSR UTCSAV as their very first instruction.
19192 ;;; The word before the JSR is expected to contain the interrupted PC.
19193 ;;; They should then exit through DSKEX just like everybody else.
19194
19195 EBLK
19196 UTCSAV: 0
19197 BBLK
19198         MOVEM U,UTACS+U
19199         MOVEI U,UTACS
19200         BLT U,UTACS+U-1
19201         MOVE P,UTCPDP
19202         MOVE U,UTCSAV
19203         MOVE TT,-2(U)
19204         MOVEM TT,UTCBRK
19205         JRST (U)
19206
19207 ] ;KS10P
19208 \f
19209 $INSRT SYSJOB           ;SYSTEM JOB AND RELATED STUFF
19210
19211
19212 SUBTTL DCHNTB AND DCHNTC
19213
19214 EBLK
19215 CHSPUR: BLOCK 8         ;NUM OF SPURIOUS INTS PER CH (ZERO = DCHK)
19216 BBLK
19217
19218 IFE KS10P,[     ; KS10 doesn't even pretend to have devices.
19219
19220 ;***** DCHNTB *****
19221 ;4.9 = KNOWN DEVICE
19222 ;4.8 = HAS PIA 2
19223 ;4.7-4.4 PIA 2 SHIFT
19224 ;4.3-4.1 PIA 2 ACTIVE VALUE
19225 ;3.9 = PIA 2 MAY BE ZERO
19226 ;3.8 = HAS PIA 1
19227 ;3.7-3.4 PIA 1 SHIFT
19228 ;3.3-3.1 PIA 1 ACTIVE VALUE
19229 ;2.9 = PIA 1 MAY BE ZERO
19230 ;2.8 = ALLOW USER DATAI, BLKI
19231 ;2.7 DATAO, BLKO
19232 ;2.6 CONI, CONSO, CONSZ
19233 ;2.5 CONO
19234 ;2.4 SPECIAL KL10 DEVICE, BLKI/BLKO ARE DATAI/DATAO TO A SECOND DEVICE REGISTER
19235 ;1.6-1.1=N, IF NON ZERO: IGNORE DEV UNLESS CONI BIT N-1 IS ON
19236                 ;(IF DSDEV PRESENT)
19237
19238 ;***** DCHNTC *****
19239 ;4.9 = SUSPICIOUS DEVICE
19240 ;4.8 = FOUND CLOBBERED
19241 ;4.7 = SUSPECTED OF CAUSING SPURIOUS INTS
19242 ;4.6-4.4 = CHANNEL CAUSING INTS ON
19243 ;3.9-3.1 = SUSPICION COUNT
19244 ;2.9-1.1 = CONI
19245
19246 DCHNTB:
19247 IFE KL10P,[
19248         400200+APRCHN,,240000   ;0 APR
19249         SETZ                    ;4 PI
19250 ]
19251 IFN KL10P,[
19252         400200+APRCHN,,250000   ;0 APR (ALLOW DATAI, "BLKI", CONI)
19253         SETZ 010000             ;4 PI (ALLOW NOTHING)
19254 ]
19255
19256 DEFINE DCHENT D,W
19257 LOC DCHNTB+D_-2
19258         W
19259         TERMIN
19260
19261 IFN KL10P,[
19262         DCHENT PAG,SETZ 240000          ;ALLOW DATAI, CONI, BUT NOT "BLKI"
19263         DCHENT CCA,SETZ                 ;ALLOW NOTHING
19264 ;XCTR of some of the instructions for these devices fails to relocate
19265 ;the address to user space, due to bugs in the hardware.  Flush 'em.
19266 ;       DCHENT TIM,SETZ 250000          ;ALLOW DATAI, "BLKI", CONI
19267 ;       DCHENT MTR,[400201,,250000]     ;INTERVAL TIMER PIA=1.  ALLOW DI,BI,CI
19268         DCHENT TIM,SETZ                 ;20 ALLOW NOTHING
19269         DCHENT MTR,SETZ                 ;24 ALLOW NOTHING
19270         DCHENT 30,SETZ                  ;30 RESERVED
19271 ]
19272 IFN DSDP,       DCHENT DSDEV,[REPEAT 2,400200+DSDCHN,,440000]   ;20,24
19273 IFN DL10P,[     DCHENT DLB,SETZ 240000                  ;60 DL10
19274                 DCHENT DLC,[400200+TTYCHN,,240000]      ;64 DL10
19275 ]
19276 IFN STKP,       DCHENT STK,[400200+LPTCHN,,440000]      ;70 STK
19277 IFN PTRP,       DCHENT PTP,[400200+PCHCHN,,440000]      ;100 PTP
19278 IFN PTRP,       DCHENT PTR,[400200+PTRCHN,,440000]      ;104 PTR
19279 IFN NOTYS,      DCHENT TTY,[400200+TTYCHN,,40000]       ;120 TTY
19280 IFN OLPTP,      DCHENT OLPT,[400200+LPTCHN,,440000]     ;124 OLPT
19281 IFN 340P,       DCHENT DIS,[630600+DISCHN+SDCHN_9,,440001]      ;130 DIS
19282 IFN E.SP,       DCHENT DIS,[400200+DISCHN,,440000]              ;130 E&S
19283 IFN KL10P,      DCHENT DTE,[400200+IFE PDCLKP,[APRCHN].ELSE [TTYCHN],,240000] ;200 DTE20
19284 IFN RP10P,      DCHENT DPC,[400200+DSKCHN,,440000]      ;250 DPC
19285 IFN RH10P,      DCHENT DSK,[400200+DSKCHN,,040000]      ;270 RH10
19286 IFN NUNITS,[
19287 IFE NEWDTP,[
19288                 DCHENT DC,[400000,,440000]      ;200 DC
19289                 DCHENT UTC,[400200+UTCCHN,,440000]      ;210 UTC
19290                 DCHENT UTS,[SETZ 40000]         ;214 UTS
19291 ]
19292 IFN NEWDTP,[
19293                 DCHENT DTC,[630600+UTCCHN+DCCHN_9.,,440000]     ;320
19294                 DCHENT DTS,[SETZ 40000] ;324
19295 ]
19296 ]               ;END OF IFN NUNITS
19297 IFN TM10P,[
19298                 DCHENT MTC,[400230+MTCCHN,,440001]      ;340 MTC
19299                 DCHENT MTS,[SETZ 40001]                 ;344 MTS
19300 ]
19301 IFN MTYP,       DCHENT MTY,[400200+TTYCHN,,40000]       ;400 MORTON BOX
19302                                                         ;420 SPACEWAR CONSOLES
19303 IFN DMIMP,      DCHENT FI,[400230+NETCHN,,400000]       ;424 DM IMP HARDWARE
19304 IFN NDAP,       DCHENT 454,[400200,,760000]             ;454 D/A
19305 IFN KAIMP,      DCHENT IMP,[400000,,400001]     ;460 AI-KA/ML-KA/MC-KL IMP
19306                                                 ; HARDWARE THIS SAYS IMP
19307                                                 ; HAS NO PIA BECAUSE IT
19308                                                 ; CHANGES
19309 IFN NLPTP,      DCHENT NLPT,[400200+LPTCHN,,440000]     ;464 NEW LPT
19310 IFN CH10P,      DCHENT CHX,[400200+CHXCHN,,040000]      ;470 CHAOSNET
19311 IFE KL10P,      DCHENT 500,[400000,,240000]             ;500 ML-KA, DM CALENDAR; AI-KA R CLK
19312 IFN KL10P&PDCLKP,DCHENT 500,[400200+APRCHN,,240000]     ;500 MC-KL F CLK
19313 IFN ARMP,       DCHENT TIPDEV,[400200+TIPBCH,,440000]   ;504 ARM TIP BREAK
19314 IFE MCOND AIKA, DCHENT 510,[400000,,360000]             ;510 ANOTHER D/A??
19315                         ;DOES ANYONE KNOW WHAT DEVICE 510 IS??
19316 IFN RBTCP,      DCHENT RBTCON,[400200+TABCHN,,440001]   ;514 ROBOT CONSOLE
19317 IFN ARMP,       DCHENT 564,[400200,,440000]             ;564 ARM TACTILE SENSE
19318 IFN OMXP,       DCHENT OMPX,[400200+OMPCHN,,440001]     ;570 OMX
19319 IFN IMXP,       DCHENT MPX,[SETZ 40001]                 ;574 IMX
19320 ;Comment this out since the AI-KA one is no longer on the bus
19321 ;IFN TK10P,     DCHENT NTY,[400200+TTYCHN,,40000]       ;600 NTY
19322 IFN NTYP,       DCHENT NTY,[400200+NTYCHN,,40000]       ;    NTY FOR 11 KLUDGE
19323 IFN DPKPP,      DCHENT DPK,[400200+TTYCHN,,40000]       ;604 DATAPOINT KLUDGE
19324 IFN DC10P,[
19325                 DCHENT DC0,[400200+DSKCHN,,40000]       ;610 DC0
19326                 DCHENT DC1,[400000,,]                   ;614 DC1
19327 ]
19328 IFN VIDP,       DCHENT NVDX,[REPEAT 4,400200+NVDCHN,,440001]    ;620-634 BAT
19329 IFN PLTP,       DCHENT PLT,[400200+PLTCHN,,440000]      ;654 PLT
19330                 DCHENT 704,[400000,,440000]             ;704 ???
19331 IFN HCLKP,[
19332                 DCHENT CLK1,[400200,,240000]            ;710 CLK1
19333                 DCHENT CLK2,[SETZ 40000]                ;714 CLK2
19334 ]
19335 LOC DCHNTB+127.
19336 EBLK
19337 DCHNTC: BLOCK 128.
19338 DCACS:  BLOCK 20        ;SAVE ACS
19339 CCSDEV: 0               ;+ => SOME SUSPICIOUS DEVICES
19340 BBLK
19341 \f
19342 DCHK:   0       ;TO CALL FROM DDT
19343         MOVEM 17,DCACS+17
19344         MOVEI 17,DCACS
19345         BLT 17,DCACS+16
19346         MOVEI J,0
19347         JSP E,SPUR
19348         SKIPN W
19349          AOS DCHK
19350         MOVEI 17,DCACS
19351         BLT 17,17
19352         JRST @DCHK
19353
19354 ;CHECK FOR CLOBBERED DEVS, CALL WITH JSP E,
19355 CHECK:  JSP H,DCSTUP
19356 CHECK1: SKIPL TT,DCHNTB(I)
19357          JRST CHECK4    ;UNKNOWN DEVICE
19358 IFN DSDP,[
19359         TRNN TT,77
19360          JRST CHECK2
19361         ANDI TT,77
19362         JSP H,DCCONI
19363         LSH B,-1(TT)
19364         JUMPGE B,CHECK4
19365         MOVE TT,DCHNTB(I)
19366 ]
19367 CHECK2: JSP H,DCCONI
19368         TLNN TT,200     ;SKIP IF PI TO TEST
19369          JRST CHECK4
19370         LDB T,[250400,,TT]      ;GET SKIP
19371         MOVEI Q,7
19372         LSH Q,(T)
19373         AND B,Q
19374         LDB Q,[220300,,TT]      ;GET CHANNEL
19375         LSH Q,(T)
19376         CAME B,Q
19377          JRST CHECK5
19378 CHECK3: LSH TT,-9       ;SHIFT TO PIA2
19379         JRST CHECK2
19380
19381 CHECK5: JUMPN B,CHECKL  ;JUMP IF NONZERO AND WRONG
19382         TRNE TT,400000  ;SKIP IF CAN NOT BE ZERO
19383          JRST CHECK3    ;ZERO OK
19384         JRST CHECKL
19385
19386 CHECK4: ADD A,[400,,]   ;INCREMENT DEVICE CODE
19387         AOBJN I,CHECK1
19388 SPURCX: SKIPE C
19389          BUG PAUSE,[BITS ],OCT,C,[MAY BE STUCK ON IN I/O BUS]
19390         MOVSI T,SCLCK5
19391         SKIPE W         ;SKIP IF NO TROUBLE DETECTED
19392          IORM T,SUPCOR
19393         JRST (E)
19394
19395 DCSTUP: MOVE A,[CONI B] ;SET UP
19396         MOVEI W,0
19397         MOVNI C,1
19398         MOVSI I,-128.
19399         JRST (H)
19400 \f
19401 DCCONI: XCT A
19402         AND C,B
19403         SKIPL DCHNTC(I) ;SKIP IF DEVICE ALREADY SUSPICIOUS,SAVES FIRST SUSPICIOUS
19404         HRRM B,DCHNTC(I)        ;STORE AWAY CONI
19405         JRST (H)
19406
19407 CHECKL: JSP H,DCSAOS
19408         MOVSI T,600000  ;CLOB
19409         IORM T,DCHNTC(I)
19410         JRST CHECK3
19411
19412 DCSAOS: MOVE D,A        ;MAKE A CONO
19413         TDZ D,[40,,-1]
19414         SKIPL T,DCHNTB(I)       ;SKIP IF KNOWN DEV
19415         JRST DCSAS2     ;JUST RESET UNKNOWN TO ZERO
19416         TLNE T,200000   ;SKIP IF NO PIA2
19417         TLNE T,400      ;SKIP IF PIA2 CAN NOT BE ZERO
19418         JRST DCSAS1
19419         LDB TT,[330300,,T]      ;GET PIA2
19420         LDB T,[360400,,T]       ;GET PIA2 SHIFT
19421         LSH TT,(T)
19422         IOR D,TT                ;ADD CORRECT CANNEL TO CONO
19423         MOVE T,DCHNTB(I)        ;SKIP IF NO PIA1
19424 DCSAS1: TLNE T,200      ;SKIP IF PIA1 CANNOT BE ZERO
19425         TRNE T,400000
19426         JRST DCSAS2
19427         LDB TT,[220300,,T]      ;GET P1A 1
19428         LDB T,[250400,,T]       ;GET PIA 1 SHIFT
19429         LSH TT,(T)              ;OR IN PIA 1
19430         IOR D,TT                ;ZAP
19431 DCSAS2: XCT D
19432         HLRZ T,DCHNTC(I)
19433         TLNN T,300000
19434          AOS W  ;THIS MAY BE THE CAUSE OF OUR TROUBLES
19435         ANDI T,777
19436         AOS T
19437         AOS CCSDEV
19438         CAILE T,777
19439          SOJA T,[JRST 4,.+1]    ;LOSEY LOSEY
19440         DPB T,[221100,,DCHNTC(I)]
19441         JRST (H)
19442
19443 ;CHANNEL IN J SPURIOUS INTERRUPT ON, CALL WITH JSP E,
19444 SPUR:   SKIPL J
19445          CAIL J,10
19446           JRST 4,SPUR1
19447         AOS U,CHSPUR(J)
19448 SPUR1:  MOVE U,E
19449         JSP E,CHECK
19450         MOVE E,U
19451         JSP H,DCSTUP
19452 SPUR2:  SKIPGE TT,DCHNTB(I)
19453          JRST SPUR4
19454         JSP H,DCCONI
19455         JUMPGE B,SPUR4
19456         JSP H,DCSAOS
19457         MOVSI T,500000
19458         IORM T,DCHNTC(I)
19459         DPB J,[360300,,DCHNTC(I)]
19460 SPUR4:  ADD A,[400,,]
19461         AOBJN I,SPUR2
19462         JRST SPURCX
19463
19464 ] ;IFE KS10P
19465 \f
19466 IFN KS10P,[
19467
19468 SUBTTL KS10 UNIBUS
19469
19470 DEFINE UBINT VEC,-REST
19471 .VEC.==<VEC>
19472 IFN .VEC.&3, .ERR Bogus interrupt vector: VEC
19473 .VEC.==.VEC./4
19474 LOC .BAS.+.VEC.
19475         REST
19476 IFG .VEC.-.MAX., .MAX.==.VEC.
19477 IFL .VEC.-.MIN., .ERR Unibus interrupt table lossage.
19478 TERMIN
19479
19480 ;;;
19481 ;;; Interrupt table for Unibus Q.
19482 ;;;
19483 UBAQIT:
19484 .MIN.==53       ; Guess smallest interrupt vector on Unibus Q
19485 .MAX.==.MIN.-1
19486 .BAS.==.-.MIN.
19487 UBAQIB==:.BAS.
19488
19489 UBINT PHVEC, JSR DSKBRK         ; RH11 FOR DISK
19490
19491 LOC .BAS.+.MAX.+1
19492
19493 ;;;
19494 ;;; Interrupt table for Unibus I.
19495 ;;;
19496 UBAIIT:
19497 .MIN.==45       ; Guess smallest interrupt vector on Unibus I
19498 .MAX.==.MIN.-1
19499 .BAS.==.-.MIN.
19500 UBAIIB==:.BAS.
19501
19502 IFN TM03S,[
19503 UBINT %TMVEC, JSR MGHBRK        ;RH11 FOR TAPE
19504 ]
19505
19506 IFN DZ11P,[
19507 REPEAT DZ11NB,[
19508 UBINT 340+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,RB   ; DZ receive
19509 UBINT 344+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,XB   ; DZ transmit
19510 ]];DZ11P
19511
19512 IFN KSIMP,[
19513 UBINT %LHVEC, JSR IMPIBK        ;IMP Input side break
19514 UBINT %LHVEC+4, JSR IMPOBK      ;IMP output side break
19515 ]
19516
19517 IFN CH11P,[
19518 UBINT 270, JSR CHXBKH           ; Usual Chaosnet vector
19519 UBINT 230, JSR CHXBKH           ; Except some interrupt here instead
19520 ];CH11P
19521
19522 LOC .BAS.+.MAX.+1
19523
19524 ;;; Assignment of pages in Unibus pager for DMA devices.
19525 ;;; Note that these pages are 2000 PDP-10 words long (ITS sized) rather
19526 ;;; than 1000 (DEC sized).  Each page here thus occupies -two- locations in
19527 ;;; the Unibus pager.  There are 32. such pages on each Unibus.
19528 ;;;
19529 ;;; Unibus Q:
19530 QUBPG==:5                       ; Chosen at random.
19531
19532 ;;; Unibus I:
19533 IFN TM03S,[
19534 IUTPG==:5                       ;Magtape IO page. well, 5 worked last time
19535 ]
19536
19537 IFN KSIMP,[
19538 IUIMPG==:6                      ;IMP Data transfer page
19539 ]
19540
19541 ] ;KS10P
19542 \f
19543 SUBTTL OVERHEAD METERING ROUTINE
19544
19545 IFN KL10P,[
19546
19547 EBLK
19548 ;TABLE OF OVERHEAD REGIONS.  ENTRY IS SIXBITNAME,,PC ? COUNT
19549         0       ;COUNTS STUFF BEFORE FIRST OVHMTR MACRO
19550 OVHTBL: OVHTAB
19551         'USR,,-1
19552         0       ;COUNTS USER-MODE PC'S
19553 LOVHTB==.-OVHTBL
19554
19555 ;COME HERE ON PI CHANNEL 1 EVERY 39 MILLISECONDS
19556 OVHSVA: 0
19557 OVHSVB: 0
19558 OVHBRK: 0
19559 BBLK
19560         CONO TIM,060000+3900.   ;CLEAR DONE
19561         EXCH T,OVHBRK           ;GET PC INTERRUPTED OUT OF
19562         TLNE T,%PSUSR           ;ONLY METER IF EXEC MODE
19563          JRST OVHBRX
19564         MOVEM A,OVHSVA
19565         MOVEM B,OVHSVB
19566         MOVSI A,-LOVHTB
19567 OVHBR1: HRRZ B,OVHTBL(A)
19568         AOBJN A,.+1             ;2-WORD ENTRIES
19569         CAIG B,(T)              ;SKIP IF PC LIES IN PREVIOUS REGION
19570          AOBJN A,OVHBR1
19571         SKIPGE A                ;IN CASE T = 777777
19572          AOS OVHTBL-2(A)        ;AOS PREVIOUS REGION'S COUNT
19573         MOVE B,OVHSVB
19574         SKIPA A,OVHSVA
19575 OVHBRX:  AOS OVHTBL+LOVHTB-1    ;AOS COUNT OF USER-MODE PC's
19576         EXCH T,OVHBRK
19577         JRST 12,@OVHBRK
19578 ];KL10P
19579 \f
19580 IFN KS10P,[
19581 RDPCST=DATAI 14,                ;INSTRUCTIONS FOR PC SAMPLING TABLE
19582 WRPCST=DATAO 14,
19583
19584 ;TABLE OF OVERHEAD REGIONS.  ENTRY IS PC,,SIXBITNAME
19585 OVHTB1: 0,,'LOW                 ;LOWER FENCE
19586         OVHTAB
19587         377777,,'USR            ;UPPER FENCE
19588 LOVHTB==.-OVHTB1
19589 REPEAT <1_<36.-<.LZ <LOVHTB-1>>>>-LOVHTB, 377777,,-1  ;PAD TO POWER OF TWO SIZE
19590
19591 EBLK
19592
19593 OVHTB2: BLOCK LOVHTB            ;CORRESPONDING COUNTS (LAST IS FOR USER MODE)
19594
19595 OVHCNT: 28.                     ;COUNTER TO SLOW THINGS DOWN TO CUT OVERHEAD
19596
19597 LOVHPC==100                     ;64 SAMPLES SHOULD BE ENOUGH
19598 OVHPCS: BLOCK LOVHPC
19599
19600 BBLK
19601
19602 ;CALCULATE OVERHEAD USING PC SAMPLE TABLE
19603 ;CLOBBERS A,B,C
19604 OVHCLK: SOSL OVHCNT             ;TIME TO DO IT YET?
19605          JRST OVHCL9            ;NO, IGNORE THESE SAMPLES
19606         MOVEI A,28.             ;SEE ONLY ONE SAMPLE OUT OF EVERY 29 ON AVERAGE
19607         MOVEM A,OVHCNT          ;SO TIME SPENT IN THIS ROUTINE IS NOT EXCESSIVE
19608         RDPCST C                ;SEE HOW FULL THE PC SAMPLING TABLE IS
19609         HRLOI C,-OVHPCS-1(C)
19610         EQVI C,OVHPCS           ;AOBJN POINTER TO SAMPLES ACTUALLY TAKEN
19611         JUMPGE C,OVHCL9         ;NONE
19612         CAMGE C,[-LOVHPC,,OVHPCS]
19613          JRST OVHCL9            ;BOGUS AOBJN POINTER, MAYBE PCST NOT TURNED ON
19614 OVHCL1: MOVE A,(C)              ;NEXT SAMPLED PC
19615         TLNE A,%PSUSR           ;ONLY SEARCH TABLE IF EXEC MODE
19616          JRST OVHCL8            ;ALL USER MODE PC'S ARE COUNTED IN LAST BUCKET
19617         HRLO A,A                ;-1 IN RH IS GREATER THAN ANY SIXBIT
19618         MOVEI B,1_<35.-<.LZ <LOVHTB-1>>>        ;HALF THE SIZE OF THE TABLE
19619 REPEAT <36.-<.LZ <LOVHTB-1>>>,[ ;LOG SEARCH
19620         CAMG A,OVHTB1(B)        ;NOT CAMGE BECAUSE OF PADDING AT END
19621          SUBI B,1_<35.-.RPCNT-<.LZ <LOVHTB-1>>>
19622         ADDI B,1_<34.-.RPCNT-<.LZ <LOVHTB-1>>>
19623 ]
19624         LOC .-1                 ;OPTIMIZE OUT ADDI B,0
19625         AOSA OVHTB2(B)
19626 OVHCL8:  AOS OVHTB2+LOVHTB-1
19627         AOBJN C,OVHCL1
19628 OVHCL9: WRPCST [-LOVHPC,,OVHPCS]        ;TURN ON / RESTART PC SAMPLING
19629         POPJ P,
19630 ];KS10P
19631
19632 ;HERE IS A TABLE OF REGISTERED 3-LETTER OVERHEAD REGION CODES
19633
19634 ;ALC - ALLOCATE CORE PAGE FRAME
19635 ;CHx - CHAOSNET STUFF (VARIOUS VALUES OF x)
19636 ;FLT - MISCELLANEOUS FAULTS
19637 ;IMP - ARPANET INTERRUPT (NOT STYNET)
19638 ;LOW - LOW CORE, BEFORE FIRST OVHMTR MACRO & PCS IN UPPER HALF OF EXEC SPACE
19639 ;NET - ALL NETWORKS, ALL PI LEVELS, NOT OTHERWISE ACCOUNTED FOR
19640 ;PGF - PAGE FAULT
19641 ;PPI - PPIUM
19642 ;QIN - DISK INTERRUPT LOW LEVEL
19643 ;QSC - DISK INTERRUPT HIGH LEVEL, DISK SCHEDULER
19644 ;SC1 - SCHEDULER 1 - ENTRY
19645 ;SC2 - SCHEDULER 2 - SEARCH
19646 ;SC3 - SCHEDULER 3 - EXIT
19647 ;SC4 - SCHEDULER 4 - UNSWAPBLOCK
19648 ;SLW - SLOW CLOCK
19649 ;SWF - SWAP FIND NEW USER (SWAPOUT SCHEDULER)
19650 ;SWP - SWAP PAGE
19651 ;SWS - SWAP SCHEDULER
19652 ;SWU - SWAP USER
19653 ;TTI - TTY INPUT INTERRUPT LEVEL
19654 ;TTO - TTY OUTPUT INTERRUPT LEVEL
19655 ;TTY - MISC TTY CODE
19656 ;USR - USER MODE
19657 ;UUO - UUO LEVEL, MISCELLANEOUS ROUTINES, AND TOTAL MISCELLANY
19658 ;WS - WORKING SET & SWAP-BLOCK ENTRY CODE
19659 \f
19660 SUBTTL PC LSR TEST FEATURE
19661
19662 ;CALLED BY PCLT MACRO
19663 ;WHICH ASSEMBLES
19664 ;SKIPE PCLDBM
19665 ;PUSHJ P,PCLTST
19666
19667 PCLTST: PUSH P,U
19668         MOVE U,PCLIDX
19669         MOVEM U,PCLHT
19670         MOVE U,USER
19671         CAME U,PCLUSR
19672         JRST POPUJ
19673 PCLX:   CAIA    ;PATCH IN OTHER CHECKS (SHOULD JRST POPUJ TO IGNORE)
19674         MOVE U,USER     ;PATCH ROUTINE MAY CLOBBER U
19675         AOSN PCLNXT
19676         JRST PCLT1      ;FOUND PLACE, CAUSE PCLSR
19677         HRRZ U,-1(P)
19678         CAME U,PCLL
19679         JRST POPUJ      ;NOT MARK (NOT AT RIGHT LOCN)
19680         HRRO U,USER     ;4.9 U FLAG 
19681 PCLT1:  PUSH P,A        ;COMPUTE HASH ADR OF RETURNS ON PDL
19682         PUSH P,B
19683         PUSH P,C
19684         HRREI A,-USRSTG(P)
19685         JUMPL A,PCLT1A  ;SYS JOB'S PDL?
19686         IDIVI A,LUBLK
19687         IMULI A,LUBLK
19688         MOVEI A,USRPDL(A)       ;GET START OF USERS PDL IN A
19689 PCLT3:  HRRZ B,(A)
19690         JUMPE B,PCLT2
19691         CAIL B,HSYSCD
19692         JRST PCLT2
19693         HLRZ C,-1(B)
19694         TRZ C,37
19695         CAIE C,(PUSHJ P,)
19696         JRST PCLT2
19697         XOR B,PCLHT
19698         ROT B,1
19699         MOVEM B,PCLHT
19700 PCLT2:  CAIGE A,-2-3(P)
19701         AOJA A,PCLT3
19702         MOVE A,PCLHT    ;COMPUTED HASH
19703         JUMPGE U,PCLT4  ;GOING TO PCLSR HERE, STORE HASH AS MARK FOR NEXT TIME
19704         CAME A,PCLHSH
19705         JRST PCLT5
19706         SKIPGE PCLDBM
19707         JRST PCLT6      ;IN HOLD MODE, PCLSR HERE
19708         SETOM PCLNXT    ;FOUND MARK, PCLSR NEXT TIME
19709 PCLT5:  POP P,C
19710         POP P,B
19711         POP P,A
19712         JRST POPUJ
19713
19714 PCLT4:  MOVEM A,PCLHSH  ;STORE HASH FOR NEXT TIME
19715         HRRZ A,-3-1(P)
19716         MOVEM A,PCLL
19717 PCLT6:  CONO PI,CLKOFF
19718         MOVE B,PCLDBM
19719         MOVEI A,%PIC.Z
19720         CAIN B,1        ;DON'T ^Z.
19721         IORM A,PIRQC(U)
19722         POP P,C
19723         POP P,B
19724         POP P,A
19725         POP P,U
19726         JRST PCLME
19727
19728         PUSHJ P,PCLME1
19729 PCLME:  PUSHJ P,UFLS
19730         JRST 4,.
19731
19732 PCLME1: PUSHJ P,PCLSR
19733         JFCL
19734         JRST POPJ1
19735
19736 PCLT1A: TRNE U,-1
19737          JRST 4,.
19738         JRST 4,.        ;TEMP MODIFY END CHECK IF WANT TO WIN FOR SYS JOB
19739 \f
19740 SUBTTL ILLUO NON-RELEVANT SYSTEM CALLS
19741 IFE E.SP,[
19742         ADSTEP==URET
19743         ADCONT==URET
19744         ADWORD==URET
19745 ]
19746 IFE 340P\E.SP,[
19747         ADSTAR==URET
19748         ADCLOS==URET
19749         ADSTOP==URET
19750         ADSTL==URET
19751 ]
19752 IFE 340P,[
19753         ALTPEN==URET
19754         ANDIS==URET
19755 ]
19756 IFE VIDP,[
19757         AVSCAN==ILUUO
19758         AVSTST==ILUUO
19759 ]
19760 IFE IMXP,[
19761         APOTSET==ILUUO
19762 ]
19763 IFE PDP6P,[
19764         AIPDP==ILUUO
19765 ]
19766 IFE NMTCS,[
19767         AMTAPE==ILUUO
19768 ]
19769
19770 IFE ARMP,[
19771         AARMOV==ILUUO
19772         AARMRS==ILUUO
19773         AARMOF==ILUUO
19774 ]
19775 IFE PTRP,[
19776         AFEED==CPOPJ
19777 ]
19778 IFE RBTCP,[
19779         ARBTC==ILUUO
19780 ]
19781 IFE NETP,[
19782         ANETIM==OPNL1   ;NO SUCH DEVICE ERROR FOR SYMBOLIC SYSTEM CALLS.
19783         ANETBL==OPNL1
19784         ANETHS==OPNL1
19785 ];NETP
19786 IFE NCPP,[
19787         ANETAC==CPOPJ   ;MAKE OLD UUOS FAIL
19788         ANETIN==CPOPJ
19789 ];NCPP
19790
19791 IFE NUNITS,[
19792         AUBLAT==URET
19793         AUTNAM==URET
19794         AUINIT==URET
19795         AUDISM==URET
19796         AASSIGN==URET
19797         ADESIGN==URET
19798 ]
19799
19800 ;Here generate the table for the BUG macro.  Note that entries for
19801 ;bugs in the initialization code will appear here also!  That's
19802 ;why we have the kludgey add 10
19803 BUGTAB: BLOCK LBUGTB+10
19804 LBUGT2==.-BUGTAB
19805         0               ;Marks end of table
19806
19807 CONSTANTS
19808 HSYSCD::        ;HIGHEST SYSTEM CODE
19809 \f
19810 SUBTTL RANDOM STORAGE
19811 EBLK
19812
19813 SCHHP:  SCHHB           ;PNTR TO SCHED HIST BUFFER
19814 SCHHB:  BLOCK SSCHDB    ;SCHED HIST BUFFER
19815                         ;4.9 =1 EXEC
19816                         ;4.8 =1 QUANT TERMINATED BY PG FAULT
19817                         ;4.7-3.8  LENGTH OF RUN TIME IN 512 USEC UNITS
19818                         ;    MUST ACCOMODATE 150 MILLISECOND QUANTA
19819                         ;3.7-3.1 USER ("NUMERIC INDEX)
19820                         ;RH PC QUANT STARTED AT
19821 SWPHTP: SWPHTB
19822 SWPHTL==200
19823 SWPHTB: BLOCK SWPHTL    ;SWAPPING HISTORY TABLE
19824                         ;4.9-4.8 EVENT: 0=START LOADING, 1=FINISH LOADING, 
19825                         ;               2=SWAP OUT, 3=SWAP BLOCK
19826                         ;4.7-3.9 WORKING SET SIZE MINUS ONE (0=0)
19827                         ;3.8-3.1 USER NUMBER
19828                         ;2.9-1.1 RH(TIME)
19829         BLOCK SWPHTL    ;CORRESPONDING UTRNTM
19830
19831 PGIHTP: PGIHTB
19832 PGIHTL==200
19833 PGIHTB: BLOCK PGIHTL    ;PAGE-IN HISTORY TABLE
19834                         ;4.9 1 IF JOB WAS LOADING
19835                         ;4.7-3.9 USER VIRTUAL PAGE NUMBER
19836                         ;3.8-3.1 USER NUMBER
19837                         ;2.9-1.1 RH(TIME)
19838         BLOCK PGIHTL    ;CORRESPONDING UTRNTM
19839
19840 IFN SCHBLN,[
19841 SCHMNY: 0               ;0 DO FULL SCHEDULE, -1 NEXT "SCHEDULE" SHOULD LOOK IN SCHBTB
19842 SCHBNJ: 0               ;NUMBER OF VALID ENTRIES IN SCHBTB
19843 SCHBTB: BLOCK SCHBLN    ;RUNNABLE JOB BUFFER
19844 SCHBPR: BLOCK SCHBLN    ;PRIORITIES OF THOSE
19845 NSCHOV: 0               ;COUNT OF BUFFER OVERFLOWS
19846 ]
19847 ;TRANSLATION ENTRY _ T
19848 ;TRANLK(T) IS  MODE,,NEXT ENTRY
19849 ;MODE IS 0 IF ENTRY ON FREE LIST, ELSE NOT 0, AND
19850  ;BITS 3.1 => INPUT, 3.2 => OUTPUT, 4.9 => ATOMIC TRANSLATION (DON'T RETRANSLATE)
19851 ;NEXT-ENTRY IS -1 FOR NIL, ELSE IDX REL TRAN!X
19852 ;TRANID(T) THRU TRANIS(T) - FROM-NAMES
19853 ;TRANOD(T) THRU TRANOS(T) - TO-NAMES
19854
19855 TRANLK: REPEAT SIOMT,,,.RPCNT-1 ;GENERATE 1ST WDS, LINKED TOGETHER.
19856 TRANID: BLOCK SIOMT
19857 TRANI1: BLOCK SIOMT
19858 TRANI2: BLOCK SIOMT
19859 TRANIS: BLOCK SIOMT
19860 TRANOD: BLOCK SIOMT
19861 TRANO1: BLOCK SIOMT
19862 TRANO2: BLOCK SIOMT
19863 TRANOS: BLOCK SIOMT
19864
19865 TRANFL: SIOMT-1         ;TRANSL ENTRY FREE LIST.
19866 TRNCNT: 0               ;NUM ENTRIES IN USE.
19867 TRNREF: 0               ;NUM. READ-ONLY ACCESSES TO TRANSL LISTS.
19868 TRANSW: -1              ;SWITCH FOR WRITE REF.
19869         0
19870
19871 IFE SCHBLN,     U0P:    0       ;PRIORITY OF BEST USER SO FAR
19872
19873 USER:   -1      ;USER # OF CURRENT LOSER
19874 SYSL:   SYSB*2000
19875 LITM:   0       ;LAST TIME SYS INCREASED CORE
19876
19877 SLGIV:  BLOCK 3 ;LOGIN
19878
19879 SETSLC: 0       ;SETLOC VARIABLES
19880 SETSLQ: 0
19881 SETSU:  -1
19882
19883 SWUNAM: 0       ;SYS WRITE VARIABLES
19884 SWJNAM: 0
19885 SWFN1:  0
19886 SWFN2:  0
19887 SWFN3:  0
19888 SWMOD:  0
19889 \f
19890 DMON:   SIXBIT /DRAGON/
19891         -1      ;USER INDEX OF DEMON JOB
19892
19893 NQMFWR: 0       ;COUNT OF FILES WRITTEN ON .MAIL. - FOR MAILER DEMON TO HANG ON.
19894 IFN XGP,[
19895 NXGPFW: 0       ;COUNT OF FILES WRITTEN ON .XGPR. - FOR XGPSPL
19896 ]
19897
19898 ;DEAMON VARIABLES
19899 ;VARIABLES FOR DEAMON CODE HACK
19900 IFN DEMON,[
19901
19902 IFN TTLPTP,TPLFLG: 1    ;FLAG FOR TPL
19903
19904 DMTLL==4        ;LEGNTH OF DEAMON TABLE SLOT
19905 NODEAM==20.     ;NUMBER OF SLOTS
19906 DMLNG==NODEAM*DMTLL
19907
19908 DEMSW:  0
19909         0       ;MAIN PROG SWITCH FOR DEMON
19910 REQCNT: 1       ;COUNT OF REQUEST'S FOR SYS JOB
19911 DMTPTR: 0       ;POINTER FOR DEMSIG TO DEM TBL, AN INDEX INTO IT, TAKEN MODULO DMLNG
19912 DMLSEX: -DMLNG,,0       ;POINTER TO DEAMON TABLE AOBJN
19913 DEMCNT: <NODEAM.-1>     ;AMOUNT OF SLOTS REMAINING IN THE TABLE
19914
19915 DMBLK:  0
19916         0       ;SLOT FOR NON DEAMON LOAD VIA NUJBST
19917
19918 DMOBLK: SIXBIT /   SYS/
19919         SIXBIT /ATSIGN/
19920         0       ;BLOCK USED BY SYSTEM JOB TO CHECK OPEN
19921
19922 ;DEAMON TABLE--CONSISTS OF SLOTS OF FOUR WORDS FOR EACH DEMON
19923 ;WORD 1 CONTAINS ITS SIXIT NAME
19924 ;WORD 2 CONTAINS THE USER INDEX,-1 IF LOADING, 0 IF DOWN
19925 ;WORD 3 2 QUANTITIES IN 18 BIT 2'S COMPLEMENT--
19926 ;LH ALWAYS > = 0, IF 0 ONLY TAKES EXPLICIT REQUESTS IN > 0 A REQUEST
19927 ;RH CONTAINS THE NUMBER OF REQUESTS PENDING FOR THE DEAMON
19928 ;FOR THE DEAMON WILL BE GENERATED EVERY 2 MINUTES
19929 ;WORD 4 CONTAINS THE TIME TILL THE NEXT IMPLICIT REQUEST WILL BE GENERATED.
19930
19931
19932 DMTTBL:  SIXBIT /DEMSTR/
19933         0
19934         1       ;STARTUP DEAMON
19935         0
19936         
19937 BLOCK <NODEAM-1>*DMTLL  
19938 ]
19939 TIMOFF: -1      ;TIME SINCE MIDNIGHT IN HALF SECONDS ("TIME IN DSK FORMAT").
19940 QDATE:  -1      ;DISK FORMAT DATE: -1 => SYSTEM DOESN'T KNOW DATE, ELSE
19941                 ;BITS 3.1-3.5 HAVE DAY OF MONTH, 3.6-3.9 HAVE MONTH OF YEAR,
19942                 ;4.1-4.7 HAVE YEAR MOD 100. .
19943 QDATEI: -1      ;-1 => SYSTEM DOESN'T KNOW DATE, ELSE
19944                 ;DATE AND TIME THE DATE AND TIME WERE FIRST DETERMINED, IN DSK FORMAT.
19945 PDYTIM: -1      ;TIME SINCE BEGINNING OF YEAR IN HALF-SECONDS (BACKUP TO PDCLK)
19946 FYEAR:  0       ;YEAR (E.G. 1969.)
19947 PDTIME: 0       ;NON-ZERO => OFFSET FOR PDCLK
19948                 ;WHEN SUBTRACTED FROM PDCLK DATAI GIVES # PD-UNITS SINCE
19949                 ; BEGINNING OF YEAR
19950                 ;ONE SECOND = 60. PD-UNITS
19951                 ; Also contains similar offset for KS-10 clock in 60ths.
19952 LPDTIM: -1      ;LAST PD CLK TIME, -1 IF PD CLK NOT RUNNING OR JUST PDSET'ED
19953
19954 SUPCOR: 0       ;CONTROLS SYS JOB, SEE SYSDTB, SCOR, ETC
19955                 ;EACH BIT REQUESTS ONE FUNCTION IF SET.
19956 SUPCOP: SCLDAT+IFN DEMON,[SCLDMN],,SCRCKS
19957                 ;THIS WORD OR'D INTO SUPCOR EVERY SECOND.
19958 SCKPHS: 0       ;USED FOR COUNTING EVERY SECOND 1/2 SECOND CLOCK
19959                 ;TO SET SUPCOP BITS EVERY SECOND
19960 SYSITM: 0       ;TIME SYS JOB LAST STARTED WAITING ON SUPCOR
19961 LNETIM: 0       ;TIME AT WHICH NETWORK WAS LAST BROUGHT UP
19962 RSWTIM: 1       ;Time (in DSK format) when last checked system resources.
19963 \f
19964 MXPARS==10.     ;MAX # PAR ERRS TO PRINT OUT
19965 PARPG:  BLOCK 8 ;STORAGE OF PAGE MAP WHILE HACKING PARITY ERROR CHECK
19966 PARCNT: 0       ;# OF PAR ERROR ENTRIES IN TABLE
19967 PARCON: BLOCK MXPARS    ;CONTENTS OF BAD PARITY LOCATIONS
19968 PARADR: BLOCK MXPARS    ;ADDRESSES OF BAD PARITY LOCATIONS
19969 PARAND: -1              ;QND OF ALL BAD WORDS
19970 PARIOR: 0               ;IOR OF ALL BAD WORDS
19971 PARAAN: -1              ;AND F ALL BAD ADDRS
19972 PARAOR: 0               ;IOR OF ALL BAD ADDRS
19973 IFE KA10P,[
19974 PARPFW: 0               ;PAGE FAIL WORD
19975 PARERA: 0               ;ADDRESS OF PAR ERR
19976 PARWRD: 0               ;BAD DATA
19977 ] ;IFE KA10P
19978 IFN KL10P,[
19979 PARRSN: 0               ;0 => PAR ERR PAGE FAULT IN PROG
19980                         ;-1 => PAR ERR INTERRUPT; NEEDN'T STOP
19981                         ;THE RUNNING JOB.
19982 ] ;KL10P
19983 PARDIE: 0       ;-1 => FATAL PARITY ERROR
19984 TPLSWP: 0       ;-1 => USE OLP FOR TPL
19985 IFN PDP6P,[
19986 PDP6UP: 0       ;0 => PDP6 IS DOWN. (AS USUAL)
19987 ]
19988 IFN ECCMEM,[
19989 IFE MCOND AIKA,[
19990 ECCADR: 1,,777760       ;ECC HISTORY STARTS HERE
19991 ECCLEN==16.             ;16 LOCATIONS OF ECC HISTORY
19992 ECCIDX: 0               ;LAST LOCATION ACCESSED
19993 ]]
19994 IFN TEN11P,[
19995 TEN11F: 0       ;0 -> NORMAL
19996                 ;-1 -> COMPLETELY IGNORE 10-11 INTERFACE
19997                 ; 1 -> RESET 10-11 INTERFACE, OTHERWISE IGNORE
19998 T11ERC: 0       ;COUNT OF CONTROL PAGE RAM ERRORS
19999 T11CCN: 0       ;CORRECT CONTENTS
20000 T11WCN: 0       ;WRONG CONTENTS
20001 T11PG:  0       ;PAGE # INVOLVED
20002 ]
20003 IFN N11TYS,[
20004 TVBLAD: 17742   ;VIDEO BUFFER TO FLASH WHEN JOB RUNNING (PDP10 VIDEO BUFFER ADDR)
20005 ]
20006 IFN DL10P,[
20007 DL10F:  -1      ;-1 NORMAL, 0 => 11 DOWN
20008 DL10HC: 0       .SEE TTDLBRK ;NUMBER OF LOOPS WHEN HUNG UP WAITING FOR 11 TO GOBBLE BUFFER
20009 ]
20010 \f
20011 DLSRCH: 0       ;-1 => DON'T RUN ANY USER BUT THE ONE ALREADY RUNNING
20012                 ;(UNLESS WE TAKE A PAGE FAULT).
20013 CPDLP:  -CPDLL,,LCPDL-1 ;CLOCK PDL POINTER
20014 LCPDL:  BLOCK CPDLL     ;CLOCK INT LEVEL PDL
20015
20016 CLKBSW: 0               ;READ SWITCHES INTO HERE TO DECIDE WHETHER TO GO TO DDT.
20017
20018 CLROOT: SSLCKB          ;CLOCK QUEUE ROOT
20019
20020 SSLCKB: SCLKI           ;SLOW CLOCK RQ BLOCK
20021         .+2             .SEE CHA5CK ;OR 15SCLB
20022         JRST SSLCK
20023
20024 IFN CHAOSP,[
20025 CHA5CK: 5*60.-SCLKI     ;5-SECOND CLOCK FOR CHAOS NET
20026         15SCLB          ;NOTE INITIAL TRIGGERING OF CLOCKS BELOW DELAYED AN EXTRA 5 SECONDS
20027         JRST CHA5CL
20028 ];CHAOSP
20029
20030 15SCLB: 15.*60.-SCLKI
20031         .+2             .SEE PRVCLB ;OR VSLCKB
20032         JRST 15SCLK
20033
20034 IFE SWPWSP,[
20035 PRVCLB: NPVSEC*60.-15.*60.-SCLKI        ;PRIVILEDGED USER VARIABLE CHECK
20036         VSLCKB
20037         JRST PRVCLK
20038 ];SWPWSP
20039
20040 VSLCKB: 0       ;VERY SLOW CLOCK BLOCK
20041         CLINFB                  ;CAUSE SLOW CLOCK TICK SOON AFTER SYS COMES UP
20042         JRST VSSLCK
20043
20044 CLINFB: 377777,,-1      ;ABOUT 15 YEARS
20045         0
20046         BUG             ;?
20047
20048 IFN CCLKP,[
20049 CCLKB:  0       ;FOR CHESS CLOCK HACK
20050         -1
20051         JRST RCCLK
20052 CCLK1:  0
20053 CCLK2:  0
20054 ]
20055
20056 IINTIC==60.     ;# TWO-MINUTE TICKS PER VERY VERY SLOW CLOCK TICK (2 HOURS)
20057 IINCNT: 0       ;# TWO-MINUTE TICKS REMAINING UNTIL NEXT VERY VERY SLOW CLOCK TICK
20058 .SEE VSCLK
20059
20060 IFN N11TYS,[
20061 WHOCLB: 0       ;WHO LINE TIMER
20062         -1
20063         JRST WHOSET
20064 ]
20065
20066 UTTYS:  BLOCK MXCZS     ;RING BUFFER FOR JOBS TO BE STARTED
20067 UTTYI:  UTTYS
20068 UTTYO:  UTTYS
20069 UTTYCT: 0
20070
20071 PCLDBM: 0       ;.NE. 0 ACTIVATE PC LSR DEBUG MODE
20072                         ;1 => ADVANCE PLACE WHERE PCLSR
20073                         ;2 => ADVANCE BUT DON'T ^Z.
20074                         ;- HOLD
20075 PCLUSR: -1      ;USER PCLSR MODE ACTIVE FOR
20076 PCLL:   0       ;PLACE WHERE LAST PCLSR TESTED
20077 PCLHSH: 0       ;HASH OF RETURNS ON PDL AT LAST PLACE TRAPPED OUT OF
20078 PCLNXT: -1      ;-1 => FROB NEXT TIME IN ADVANCE MODE
20079 PCLHT:  0       ;TEMP
20080 PCLIDX: 0       ;INITIALIZE PCLT TO THIS (SET TO LOOP COUNT IF NECESSARY)
20081 \f
20082 CORRNR: 0       ;LAST USER TO RUN CORE
20083 SJSPG:  0       ;-1 => LAST FREE PG RESERVED FOR SYS JOB; DON'T GIVE IT TO ANYONE ELSE.
20084 UTBFLF: 0       ;-1 SIGNAL TO TRY TO FLUSH I/O BLOCKS
20085 UFDFLF: 0       ;-1 SIGNAL TO TRY TO FLUSH 2311 UFDS
20086 CORCNT: 0
20087 UFLSF:  0       ;FLAG FROM UFLS TO CLKBRK
20088 CLKFL1: 0       ;FLAG COUNTER TO CONTROL CLOCK LEVEL 
20089 SCHFLG: 0       ;SCHEDULE TIMER (DIVIDES 60 CPS)
20090 27FCLK: 0       ;-1 IF FAST CLOCK SHOULD CALL TYP27S
20091 SCITM:  0       ;SEE SYSEX, SYSDEC
20092 LCLK1:  0
20093 SYSCKP: -LTSTB,,TSTB    ;SYSTEM CHECKSUMS CHECKER POINTER
20094 SYSPDP: -LSYSP,,SYSPDL-1        ;PDL POINTER FOR SYSTEM JOB
20095 SYSPDL: BLOCK LSYSP     ;PDL FOR SYS JOB
20096 IFN TPLP,TPLBUF:        BLOCK TPLBSZ    ;PSEUDO LPT BUFFER - MUST BE ABOVE SUACS
20097 IFN TPLP\DEMON,TPLFNO:  SIXBIT /!/      ;UNIQUE TPL FIRST FILE NAME
20098 SJCFF:  0       ;-1 WHEN SYS JOB IN PROCESS OF FLUSHING CORE
20099                         ;AVOIDS TIMING ERROR DUE TO HUSRAD NOT REALLY REFLECTING WHAT ITS GOING TO BE
20100 SLSWPR: 0       ;STORE SYS JOB'S LSWPR WHILE HACKING UUOS
20101
20102 BBLK
20103
20104 IFN TPLP,       TPLFN:  2,,(SIXBIT /TPL/)
20105 IFN KL10P,[
20106 KLEBCC: 0 ? <1_23.>/<4*25./2>   ;EBOX COUNTER CONVERSION TO 4 USEC CONSTANT (FOR 25 MHZ)
20107                 ;RESULT IS IN AC+2 AFTER DMUL AC,KLEBCC
20108 KLMBCC:; 1 ? 110000,,           ;FOR CONVERTING AN MBOX COUNT TO THE TIME (IN EBOX UNITS)
20109                                 ;IT SUPPOSEDLY AMOUNTS TO.
20110                                 ;WE ASSUME 102.5 NANOSEC OD WAITING TIME PER MBOX CYCLE
20111                                 ;THIS NUMBER IS 102.5/80.
20112                                 ;DMUL AC,KLMBCC PUTS ANSWER IN AC+1, AC+2
20113                                 ;WITH BINARY POINT BETWEEN THE WORDS.
20114         0 ? 0           ;M8538 MODIFIED SO EBOX COUNTER CONTINUES TO COUNT
20115                         ;DURING MBOX WAIT TIME, SO SET KLMBCC = ZERO.
20116 EBLK
20117
20118 MTRUSR: -1              ;USER TO WHOM PERF CTR IS ASSIGNED
20119 MTRJOB: -2              ;USER BEING MEASURED BY PERF CTR,
20120                         ;OR -1 => NULL JOB, OR -2 => ALL JOBS.
20121
20122 PAEON:  0               ;SELECTED PERF CTR ENABLE WORD
20123 PAEOFF: 0               ;DISABLE THE PERF CTR (WHEN WRONG JOB IS RUNNING)
20124 STPERF: 0 ? 0           ;VALUE OF PERF COUNTER AT START OF QUANTUM
20125 STEBOX: 0 ? 0           ;VALUE OF EBOX COUNTER AT START OF QUANTUM
20126 STMBOX: 0 ? 0           ;VALUE OF MBOX COUNTER AT START OF QUANTUM
20127 ] ;KL10P
20128 IFE KL10P, EBLK
20129 IFN TPLP,[
20130 TPLFN1: 0
20131 TPLFN2: 0
20132 TPLFN3: 0
20133 ]
20134 IFN NLPTP, NTNLPL: 0    ;NUMBER OF TIMES NLPT LOST PIA
20135 VARIABLES
20136
20137
20138 TSTB:   REPEAT CKNUM,CONC CK,\.RPCNT,
20139 LTSTB==.-TSTB
20140
20141 CKSUMS: BLOCK CKNUM
20142 CKXORS: BLOCK 36.       ;XOR OF ALL ADRS IN PURE AREAS IN SYS WITH CORRESP
20143                 ;BIT SET (RH)
20144 TCKXOR: BLOCK 36.       ;TEST XORS
20145
20146 SSYSCL==SSYS
20147 SYSCLB==SSYSCL_-10.+IFN 1777&SSYSCL,1
20148
20149 IFE KA10P,[
20150 AC1PTR: UUOACS  ;-> WHERE AC BLOCK 1 IS CURRENTLY LOADED FROM
20151 ] ;IFE KA10P
20152
20153 USRHI:  0       ;HIGHEST LOC USED FOR USER STORAGE
20154 \f
20155 SUBTTL LOCATIONS TO PATCH WHEN DEBUGGING
20156
20157 SYSDBG: 0       ;0 NORMAL TIMESHARING
20158                 ;+ GIVE "ITS BEING DEBUGGED" MESSAGE
20159                 ;-N ALSO ALLOW ONLY CONSOLE #N AND T00 TO CTRL/Z.
20160                 ;-512.*N => ALLOW ONLY HOST N TO TELNET IN.
20161                 ;-512.*N+M => ALLOW HOST N AND TTY M.
20162 DMLLDF: -1      ;-1 => START DAEMONS AUTOMATICALLY, 0 DON'T.
20163 IFN DEMON,DMNFLG: 1  ;1 => START DM-STYLE DAEMONS, 0 DON'T.
20164
20165 IFN NETP,NETUSW: 0 ;-1 => DON'T START UP A JOB IN ANSWER TO A CONNECT REQUEST
20166                 ;FROM A HOST OTHER THAN OURSELVES
20167
20168 SYSCN:  SYSCON  ;NUMBER OF TTY TO RECEIVE SYSTEM CONSOLE OUTPUT.
20169                 ;-1 TO THROW IT AWAY.  YOU CAN CHANGE THIS ANY TIME.
20170
20171 SUPPLG: 0       ;-1 => SUPPRESS LOGIN/LOGOUT MESSAGES ON SYSTEM CONSOLE.
20172
20173 IFE KS10P,[     ; KS has no lights.
20174 MIPGDS: 0       ;-1 => DON'T LIGHT LIGHTS (KA HAS HARDWARE SWITCH, KL NEEDS
20175                 ; THIS)
20176 ] ;IFE KS10P
20177
20178 IFN RH10P+RH11P,[
20179 USFHLT: 0       ;-1 => HALT ON DISK UNSAFES AND OTHER BAD ERRORS
20180                 ;0 => RETRY.  NOTE SET POSITIVE FOR 1/2 SECOND AFTER
20181                 ; A RETRY TO AVOID LOOPING, DETECT SOLID ERRORS.
20182 ] ;RH10P+RH11P
20183
20184 .SEE USEHM      ;NONZERO => USE HIGH MOBY, ELSE ONLY 256K
20185
20186 .SEE USEMDM     ;NONZERO => USE MEDIUM MEMORY AS ADDITIONAL "LOW HALF" PAGES
20187
20188 IFN N11TYS,[
20189 TT11P:  1       ;0 => PDP11-TTYS ARE NOT IN USE
20190                 ;1 => SYSTEM SHOULD INITIALIZE THEM
20191                 ;-1 => INITIALIZED AND IN USE
20192                 ;TO BRING THE TV'S DOWN, ZEROING TT11P ISN'T ENOUGH
20193                 ;EITHER DO WHAT TT11LS DOES, OR JUST SET SCR11D IN SUPCOR
20194                 ;(THE LATTER MAY NOT TAKE EFFECT INSTANTLY, HOWEVER)
20195                 ;TO BRING THE TV'S UP, JUST SET TT11P TO 1 AND WAIT 2 SECONDS
20196 ]
20197
20198 .SEE IMPUP      ;0 UP, -1 DOWN, 1 DOWN AND DON'T TRY TO BRING BACK UP
20199
20200 .SEE TEN11F     ;0 UP, -1 TOTALLY DOWN, 1 RESET PLEASE
20201
20202 .SEE DL10F      ;0 PDP11 DOWN, -1 UP
20203
20204 .SEE PDP6UP     ;0 PDP6 DOWN, -1 UP
20205
20206 .SEE LASTGC     ;NAME OF LAST DISK DIRECTORY GARBAGE COLLECTED
20207
20208
20209 SUBTTL SWAPPING ALGORITHM CONTROL SWITCHES
20210
20211 IFE SWPWSP,[    ;THESE AREN'T LOOKED AT IN SWPWSP SYSTEM
20212 ENSWSC: SWBLK   ;ENABLE CALLING OF SWSCD FROM 15 SEC CLOCK
20213 ENUPC:  1-SWBLK ;ENABLE USER-PC PAGE OF RUNNING USER NOT BE SWAPPED OUT
20214 ENPZRO: SWBLK   ;ENABLE PAGE-ZERO OF RUNNING USER NOT BE SWAPPED OUT
20215 ENSWBK: SWBLK   ;ENABLE SWPNX1 TO SWAP BLOCK A USER
20216 ENPVCL: 1-SWBLK ;ENABLE PRVCLK ROUTINE
20217 ENPREE: 1-SWBLK ;ENABLE PREEMPTION ON PAGE SWAP IN (SEE QSWI1)
20218 ENAGE:  1-SWBLK ;ENABLE AGE BITS TO ABORT SWAP OUT IF PAGE IS USED
20219 ];SWPWSP
20220 AGERTE: 8       ;NUMBER OF PAGES TO AGE EACH 1/2 SECOND.
20221                 ;IN A 512K SYSTEM, LAP TIME IS ABOUT 200/AGERTE SECONDS.
20222 \f
20223 SUBTTL SYSTEM LOCKS
20224
20225 CIRPSW: -1      ;CIRCULAR POINTER SWITCH
20226         0
20227
20228 MEMFRZ: -1      ;MEMORY FROZE
20229         0
20230
20231 CASW:   -1      ;CORE ALLOCATE INTERLOCK SWITCH (REQUESTS TO CORE JOB)
20232         0
20233
20234 SHUTLK: -1      ;LOCK VAR FOR SHUTDN
20235         0       ;USED TO TELL WHO CAUSED SYS DOWN
20236
20237 TREESW: -1      ;LOCK MANIPULATION OF JOB TREE STRUCTURE
20238         0       ;ATTACH, DETACH, DISOWN, REOWN ALL LOCK.
20239
20240 CUSER:  -1      ;CORE ALLOCATOR USER
20241         0       ;DUMMY CORE ALOC USE VAR
20242
20243 ARDFSW: -1      ;LOCK VAR FOR .REDEF
20244         0
20245
20246 IFN 340P\E.SP,[
20247 DISUSR: -1      ;340 USER
20248         0       ;DUMMY 340 USE VAR
20249 ]
20250
20251 IFN CODP,[
20252 CODUSR: -1      ;CODE SENDER
20253 CODUSE: -1
20254 ]
20255
20256 IFN PLTP,[
20257 PLTUSR: -1      ;PLOTTER USER
20258 PLTUSE: -1
20259 ]
20260
20261 IFN LPTP\TTLPTP,[
20262 LPTUSR: -1      ;LINE PRINTER USER
20263 LPTUSE: -1
20264 ]
20265 IFG LPTP-1,[
20266 OLPUSR: -1
20267 OLPUSE: -1
20268 ]
20269 IFN LPTP,[
20270   IFE LPTP-1,[
20271     IFN NLPTP,[
20272         NLUSR==LPTUSR
20273         NLUSE==LPTUSE
20274     ]
20275     IFN OLPTP,[
20276         OLUSR==LPTUSR
20277         OLUSE==LPTUSE
20278     ]
20279   ]
20280   IFG LPTP-1,[
20281     OLUSR==OLPUSR
20282     OLUSE==OLPUSE
20283     NLUSR==LPTUSR
20284     NLUSE==LPTUSE
20285   ]
20286 ]
20287
20288 IFN PTRP,[
20289 PTPUSR: -1
20290 PTPUSE: -1
20291
20292 PTRUSR: -1
20293 PTRUSE: -1
20294 ]
20295
20296 IFN VIDP,[
20297 NVDUSR: -1
20298 NVDUSE: -1
20299 ]
20300
20301 IFN PDP6P,[
20302 PDPUSR: -1      ;PDP-6 USER
20303 PDPUSE: -1
20304 PDPISR: -1      ;PDP6 AS INFERIOR (INTS ON IO CHANNEL)
20305 PDPISE: -1      ;PDP6 USE VAR
20306 ]
20307
20308 IFN TABP,[
20309 TABUSR: -1      ;TABLET USER
20310 TABUSE: -1
20311 ]
20312
20313 IFN STKP,[
20314         STKUSR: -1
20315         STKUSE: -1
20316 ]
20317 \f
20318 TIME:   0       ;TIME SINCE SYSTEM START IN 1/30'THS
20319 SUSRS:  0       ;NUMBER USERS ON SYS
20320 RVVTIM: 0       ;VALUE OF TIME WHEN SYSTEM WAS LAST REVIVED FROM A CRASH
20321 USRRCE: BLOCK NCT+1     ;USER RESOURCE +1 FOR DISOWNED JOBS
20322 SYSRCE: 0       ;SYS JOB RESOURCE
20323 SLOADU: 0       ;100. * <EFFECTIVE # OF COMPETING USERS>, IN FIXED POINT.
20324 RNABLU: 0       ;RUNNABLE USERS
20325 NPGWTU: 0       ;NUMBER OF JOBS CURRENTLY WAITING FOR A PAGE
20326 LOUTIM: 0       ;TOTAL TIME USED BY LOGGED OUT USERS
20327 UMASTER:        -1      ;INDEX OF MASTER USER
20328 SWRCE:  BLOCK NCT+2     ;SWAP SCHED RESOURCE
20329 SWIPRQ: 0       ;TOTAL # SWAP IN REQUESTS
20330 SHUTDN: 0       ;"TIME" SYS WILL DIE, 0 IF NOT DYING, -1 IF DEAD
20331 DEDTIM: 0       ;TIME TILL DEATH AFTER NEXT CLK QUEUE INT
20332                 ; < 0 => SYSTEM ACTUALLY DOWN (CHECKED BY ^Z, NUJBST, %OPLIV JOBS)
20333 DTHTIM: 0       ;TIME SYSTEM DIED
20334 DEDBLK: 0
20335         -1
20336         JRST DEATHZ
20337
20338 ATRNJN: 0       ;JNAME OF LAST JOB TO DO A .TRANAD OR .TRANDL
20339                 ;(SO I CAN SEE IF THEY'RE USED AT ALL).
20340
20341 IFN DZ11P,[
20342 DZXSPR: 0       ;Count of spurious DZ-11 transmitter interrupts.
20343 DZRSPR: 0       ;Count of spurious DZ-11 receiver interrupts.
20344 ];DZ11P
20345
20346 NCORRQ: 0       ;NUMBER CORE RQS HERE SO TRANSFERRED TO PEEK
20347 NCBCOM: 0       ;NUMBER CORE BLOCKS COMMITTED TO CORGP
20348
20349 NQDE:   BLOCK NQS       ;NUMBER OF 2314 DATA ERRORS
20350 NQHE:   BLOCK NQS       ;NUMBER OF 2314 HARDWARE ERRORS
20351         BLOCK 1         ;NQSE-1 COUNTS SPUR INTS WHILE NO XFER (QSDU -1)
20352 NQSE:   BLOCK NQS       ;NUMBER OF SPURIOUS 2314 ERROR INTERRUPTS
20353 NQCMPE: BLOCK NQS       ;NUMBER OF 2314 READ/COMPARE ERRORS
20354 NQWDE:  BLOCK NQS       ;# DATA ERRS ON WRITE
20355 NQRDE:  BLOCK NQS       ;# DATA ERRS ON READS
20356 NIRSWE: 0       ;# IRRCV ERRS ON SWAPPING XFERS
20357 QIRRCV: 0       ;IRRECOVERABLE DISK ERRORS
20358 QIRCBK: 0       ;BLOCK # W/ IRRCV ERROR
20359 QIRUNT: 0       ;UNIT OF ABOVE
20360 NQWRE:  0       ;# WRITE ERRS RCC OK
20361 NQWIRE: 0       ;# WRITE ERRS RCC LOST
20362 NWXFR:  0       ;NUMBER WRITE TRANSFERS (FILE, DIR, ETC.)
20363 NRXFR:  0       ;NUMBER READ
20364 NSWXFR: 0       ;NUMBER WRITE SWAPS
20365 NSRXFR: 0       ;NUMBER READ SWAPS
20366
20367 ;DON'T CHANGE ORDER .SEE MEMTYP
20368 PARERR: 0                       ;COUNT OF CORE PARITY ERRORS
20369 NXMERR: 0                       ;COUNT OF NXMS
20370 IFE KA10P,      BPFERR: 0       ;COUNT OF BAD PAGE FAILS
20371 PARPC:  0                       ;PC ON CORE PARITY INTERRUPT
20372 NXMPC:  0                       ;PC ON NXM
20373 IFE KA10P,      BPFPC:  0       ;PC ON BAD PAGE FAIL
20374 PARUSR: -1                      ;USER ON PAR ERR
20375 NXMUSR: -1                      ;USER ON NXM
20376 IFE KA10P,      BPFUSR: -1      ;USER ON BAD PAGE FAIL
20377 IFE KA10P,      BPFPFW: 0       ;PFW ON BAD PAGE FAIL
20378
20379 IFN KS10P,[
20380 ECCERR: 0       ;COUNT OF ECC CORRECTED ERRORS LOGGED
20381 ECCERA: 0       ;MEMORY STATUS AND ADDRESS OF MOST RECENT
20382 ECCAND: -1      ;AND OF ALL ERRORS
20383 ECCIOR: 0       ;IOR OF ALL ERRORS
20384 ] ;IFN KS10P
20385
20386 IFN DPKPP,      NDPKPE: 0       ;# PARITY ERRS FROM DATAPOINT KLUDGE
20387
20388 SNMPGS: 0       ;SYSTEM, NUMBER OF VIRTUAL USER PAGES
20389 SNSWPG: 0       ;SYS, NUM OF SWAPPED OUT VIR. PGS
20390
20391 USRTM1: 0       ;4USEC TICKS USED BY USERS SINCE LAST (1/2 SEC) UPDATE TO USRTIM
20392 USRTIM: 0       ;TIME USED BY ALL USERS 1 SEC UNITS
20393 NULTM1: 0       ;4USEC TICKS USED BY NULJOB SINCE LAST (1/2 SEC) UPDATE TO NULTM3
20394 NULTM3: 0       ;NUMBER OF SECONDS USED BY NULJOB
20395 NULTIM: 0       ;TIME USED BY NULL JOB (60'THS) - OBSOLETE BUT STILL MAINTAINED
20396 IFN KL10P,[
20397 NULEBC: 0 ? 0   ;EBOX COUNT WHEN NULL JOB ENTERED
20398 NULMBC: 0 ? 0   ;MBOX COUNT WHEN NULL JOB ENTERED
20399 NULPRF: 0 ? 0   ;PERF COUNT WHEN NULL JOB ENTERED
20400 ] ;KL10P
20401 IFE KA10P,[
20402 PFAILF: 0       ; KL: -1 => ENTRY TO CLOCK LEVEL WAS VIA PFAIL
20403                 ;     -2 => VIA INTPFL
20404                 ; KS: -1 => BOTH CASES
20405 ] ;IFE KA10P
20406 LOSTM1: 0       ;4USEC TICKS LOST SINCE LAST (1/2 SEC) UPDATE TO LOSTIM
20407 LOSTIM: 0       ;SECONDS OF LOST TIME (ALL OTHERWISE RUNNABLE JOBS WAITING FOR PAGES)
20408 IDLTM1: 0       ;4 USEC TICKS IDLE SINCE LAST (1/2 SEC) UPDATE TO IDLTIM
20409 IDLTIM: 0       ;SECONDS OF IDLE TIME (NO JOBS WANT TO RUN)
20410 LOSRCE: 0       ;USRRCE WORD FOR LOST TIME
20411 IDLRCE: 0       ;USRRCE WORD FOR IDLE TIME
20412
20413 UREALT: -1      ;RH=INDEX OF THE REAL TIME USER
20414                 ;LH=0=> THIS USER HAS HIGHEST PRIORITY
20415                 ;LH>0=> USER NOT IN HIGH PRIORITY PHASE
20416                 ;LH<0=> FACILITY IDLE
20417 INFORM [HIGHEST USED]\<.-1>
20418 \fSUBTTL USER VARIABLES
20419
20420 ;ONE COPY FOR EACH PROCEDURE
20421 ;FOR KL AND KS, THIS IS THE UPT
20422
20423 IFN KL10P,[
20424 DEFINE KLUPT N,NAME/            ;CHECKS "HARD-WIRED" UPT LOCATIONS
20425 IFN .-USRSTG-<N>,[
20426 .ERR "NAME" LOST IN UPT
20427 LOC USRSTG+<N>
20428 ]
20429 TERMIN
20430 ] ;KL10P
20431
20432 IFE KL10P,[
20433 DEFINE KLUPT N,NAME/
20434 TERMIN
20435 ] ;IFE KL10P
20436
20437 IFN KL10P, LOC <.+777>&-1000    ;KL UPT MUST START AT HARDWARE PAGE BOUNDARY
20438
20439 IFN KS10P, LOC <.+7>&-10        ; KS UPT must be 0 mod 8 (see UUOPCW)
20440
20441 USRSTG:: KLUPT 0,;USER PAGE MAP
20442
20443 UPGMP:  BLOCK NUVPG/2   ;PAGE MAP STORAGE (PROGRAMS UP TO NUVPG LONG)
20444 ;               2.9-2.8 ACCESS RIGHTS
20445 ;                       00      NO ACCESS (BY SOFTWARE CONVENTION, 1.2-1.1
20446 ;                               HAVE THE "REAL" ACCESS BITS, WHICH MAY BE 00,
20447 ;                               BUT MAY NOT, E.G. FOR A SWAPPED OUT PAGE).
20448 ;                       01      READ ONLY
20449 ;                       10      READ/WRITE/FIRST
20450 ;                       11      READ/WRITE
20451 .SEE PMCSHM     ;CACHE BIT
20452 .SEE PMAGEM     ;AGE BITS
20453 .SEE PMRCM      ;LOW N BITS ARE PHYSICAL CORE PAGE NUMBER (IN 1K PAGES)
20454 UPGCP:  BLOCK NUVPG/2   ;CIRCULAR POINTERS (CORRESPONDS 1-1 WITH UPGMP)
20455 ;               IF -1, ABSOLUTE PAGE, NOT LINKED.  OTHERWISE:
20456 ;               2.9     IF 0:
20457 ;                       2.8-1.9 USER INDEX
20458 ;                       1.8-1.1 PAGE NUMBER IN THAT USER'S UPGCP
20459 ;                       IF 1:
20460 ;                       2.8     IF 0:
20461 ;                               2.7-1.1 LINK TO MMP TABLE
20462 ;                               IF 1:
20463 ;                               2.7-1.1 LINK TO MEM PNT TABLE
20464 UMAPS:  0       ;USER MAP STATUS
20465         .SEE %UM
20466 UDBR1A==UPGMP   ;ADDRESS TO PUT IN DBR1
20467 UDBR2A==UPGMP+<NUVPG/4> ;ADDR FOR DBR2
20468 UPGCPH==UPGCP+<NUVPG/4> ;ADDR OF HIGH HALF OF CIRC PNTRS
20469
20470 TTYTBL: 0       ;TTY ASSIGNED THIS USER OR INDICATION THAT THERE IS NONE
20471 %TBNOT==400000  ;4.9 DOES NOT HAVE TTY NOW
20472 %TBNVR==200000  ;4.8 IF JOB DOESN'T HAVE TTY, OPENS SHOULD FAIL.
20473 %TBINT==100000  ;4.7 IF JOB DOESN'T HAVE TTY, ATTEMPT TO USE TTY SHOULD INTERRUPT.
20474                 ;JOB CAN SET BITS 4.8 AND 4.7.
20475 %TBWAT==40000   ;4.6 IF 1, %TBINT AND %TBNVR ARE OVERRIDDEN AND TTY USE ATTEMPTS
20476                 ;    ALWAYS HANG. SET BY DDT FOR $P, CLEARED BY ^P. ONLY SUPERIOR CAN SET.
20477 %TBDTY==010000  ;4.4 TTY TAKEN FROM --ME--.  WHEN GIVEN BACK,
20478                  ;DON'T PASS IT ON TO MY INFERIOR.
20479 %TBOUT==004000  ;4.3 ALLOW THIS JOB TO OUTPUT WHETHER OWNS TTY OR NOT
20480 %TBINF==002000  ;4.2 ALLOW MY INFERIORS TO OUTPUT IF THEY HAVE %TBOUT.
20481 %TBOIG==001000  ;4.1 IGNORE MY OUTPUT
20482 %TBIIN==000400  ;3.9 INTERRUPT IF I TRY TO DO INPUT
20483 $TBECL==220600  ;3-6-3.1 # ECHO LINES IF I DONT HAVE DISPLAY
20484                 ;RH USER NUM GAVE TTY AWAY TO OR TTY NUM IF HAS IT
20485 %TBCLR==410077  ;CLEAR THESE BITS IN TTYTBL OF A JOB RECEIVING THE TTY
20486
20487 TTSTSV: BLOCK 3 ;JOB'S SAVED TTYST1,TTYST2,TTYSTS, WHEN JOB DOESN'T HAVE THE TTY.
20488
20489 NMPGS:  0       ;NUMBER OF NON-ABSOLUTE PAGES (INCLUDES PURE)
20490 NSWPGS: 0       ;NUMBER SWAPPED OUT PAGES (AOSED FOR EACH USER OF SHARED PAGE SWAPPED OUT)
20491 HUSRAD: 0       ;MEM ADR OF PAGE ABOVE HIGHEST THAT EXISTS (MAX 1,,0)
20492 UPC:    0       ;USER PC STORAGE
20493 LUBTM:  0       ;TIME LAST UNBLOCKED (FOR IDENTIFYING INACTIVE JOBS)
20494 JBI:    -1      ;JOB DEVICE INDEX. IF NOT -1, THIS JOB IS A JOB-DEVICE,
20495                 ;AND JBI HAS INDEX INTO JOB DEVICE TABLES.
20496 \f
20497 UPGML:          ;USER PAGE MAP LOAD (EIGHT WORDS FOR LPM AND SPM INSTRUCTIONS)
20498 IFE KS10P,[     ; KS10 version given below.
20499                 UPJPC:  0       ;JPC.  KA HAS FAULT ADDRESS IN LH.
20500 IFE KL10P,      UPOPC:  0       ;OLD PC FLAGS,,OPC (UNUSED ON KL-10)
20501                 UPMAR:  0,,0    ;MAR ADDRESS AND CONDITION
20502                                 ;FOR KA-10:
20503                                 ;       3.3     0=EXEC, 1=USER
20504                                 ;       3.2-3.1 MAR CONDITION:
20505                                 ;               0       NEVER
20506                                 ;               1       INSTR FETCH
20507                                 ;               2       WRITE
20508                                 ;               3       ALWAYS
20509                                 ;       2.9-1.1 VIRTUAL ADDRESS
20510                                 ;FOR KL-10:
20511                                 ;       3.9-3.7 ADDRESS BREAK CONDITIONS:
20512                                 ;               3.9     FETCH
20513                                 ;               3.8     READ
20514                                 ;               3.7     WRITE
20515                                 ;       3.6     0=EXEC, 1=USER
20516                                 ;       3.5-1.1 VIRTUAL ADDRESS
20517 IFE KL10P,      UPQUAN: EXPGNG+1,,0             ;F.S. QUAN AND FAULT BITS
20518 IFN KL10P,      UPFW:   0                       ;PAGE FAIL WORD
20519 IFE KL10P,DBL==100_1
20520 IFN KL10P,DBL==0
20521                 UPDBR1: DBL,,UPGMP              ;DBR1
20522                 UPDBR2: DBL,,UPGMP+100          ;DBR2
20523 IFE KL10P,      UPDBR3: DBL,,EXEUMP             ;DBR3
20524 IFE KL10P,      UPACP:  1040,,UUOACS            ;B KEY,C KEY,,AC POINTER
20525 ] ;IFE KS10P
20526
20527 IFN KS10P,[
20528 UPDBR1: UPGMP           ; DBR1
20529 UPDBR2: UPGMP+100       ; DBR2
20530 UPQUAN: 0               ; Runtime counter
20531 UPJPC:  0               ; User mode JPC if microcode supports
20532 UPEJPC: 0               ; Exec mode JPC if microcode supports
20533 ] ;KS10P
20534
20535 UPGMLE::                                ;END OF PAGE MAP (+1)
20536
20537 IFN KL10P,[
20538         KLUPT 420,      ;RESERVED UPT 420
20539 UPT420: 0
20540         KLUPT 421,      ;TRAP 1 INSN    ;ARITHMETIC OVERFLOW
20541 TR1INS: JSR ILLTRP       ;FOR ITS-STYLE INTERRUPT, CONTAINS 0,,%PIARO
20542         KLUPT 422,      ;TRAP 2 INSN    ;PDL OVERFLOW
20543 TR2INS: JSR ILLTRP       ;SYS JOB SHOULDN'T OVERFLOW    ;FOR ITS-STYLE, 0,,%PIPDL
20544         KLUPT 423,      ;TRAP 3 INSN    ;USED FOR ONE-PROCEED
20545 TR3INS: JSR ILLTRP       ;SYS JOB SHOULDN'T ONE-PROCEED ;FOR ITS-STYLE, 0,,%PI1PR
20546         KLUPT 424,      ;MUUO DEPOSIT LOCATION
20547 SV40::
20548 MUUODP: 0       .SEE FORTY
20549         KLUPT 425,      ;MUUO OLD PC STORAGE
20550 SUUOH::
20551 XUUOH:  0
20552         KLUPT 426,      ;MUUO PAGING AND CONTEXT WORD
20553 MUUOCX: 0
20554         KLUPT 427,      ;RESERVED UPT 427
20555 UPT427: 0
20556         KLUPT 430,      ;MUUO NEW PC WORDS
20557 MUUOKN: %PSPCU,,UUOH0           ;FOR OTHER JOBS, MUUOEX (A JRST 4,).
20558 MUUOKT: %PSPCU,,MUUOEX          ;NO JOB SHOULD EVER TRAP IN EXEC MODE.
20559 MUUOSN: %PSPCU,,MUUOEX          ;NO JOB SHOULD EVER RUN IN SUPERV. STATE.
20560 MUUOST: %PSPCU,,MUUOEX          ;..
20561 MUUOCN: %PSPCU,,UUOH0           ;NORMAL UUOS
20562 MUUOCT: %PSPCU,,MUUOTR          ;UUOS AS TRAP INSN
20563 MUUOPN: %PSPCU,,UUOH0           ;PUBLIC MODE IDENTICAL TO CONCEALED MODE,
20564 MUUOPT: %PSPCU,,MUUOTR          ; ALTHOUGH IT'S A SCREW FOR A LOSER TO BECOME PUBLIC
20565 ]               ;END OF IFN KL10P
20566 \f
20567 IFN KS10P,[
20568 DEFINE KSUPT UPTNAM
20569 IFN .-USRSTG-<UPTNAM>,[
20570 .ERR UPTNAM lost in UPT
20571 LOC USRSTG+<UPTNAM>
20572 ]
20573 TERMIN
20574
20575 UPFW:   0       ; Saved page fail word from last fault.  Copied from EPTPFW
20576                 ; at time of fault usually.
20577
20578 KSUPT UPTTR1
20579 TR1INS: JSR ILLTRP
20580
20581 KSUPT UPTTR2
20582 TR2INS: JSR ILLTRP
20583
20584 KSUPT UPTTR3
20585 TR3INS: JSR ILLTRP
20586
20587 KSUPT UPTUUO
20588 SV40::
20589 MUUODP: 0
20590
20591 KSUPT UPTUPC
20592 SUUOH::
20593 XUUOH:  0
20594
20595 KSUPT UPTUCX
20596 MUUOCX: 0
20597
20598 KSUPT 427
20599 UPT427: 0
20600
20601 KSUPT UPTUEN
20602 MUUOKN: %PSPCU,,UUOH0   ;UUO in Exec mode new PC
20603                         ;For other jobs: %PSPCU,,MUUOEX
20604 KSUPT UPTUET
20605 MUUOKT: %PSPCU,,MUUOEX  ;UUO as trap instruction in Exec mode new PC
20606
20607 KSUPT UPT1PO            ;PC saved here after one-proceed
20608 1PROPC: 0
20609
20610 KSUPT UPT1PN            ;One-proceed sets PC to this
20611 1PRNPC: %PSPCU,,ONEPRO
20612
20613 KSUPT UPTUUN
20614 MUUOCN: %PSPCU,,UUOH0   ;Normal UUO new PC
20615
20616 KSUPT UPTUUT
20617 MUUOCT: %PSPCU,,MUUOTR  ;UUO as trap instruction new PC
20618
20619 EXPUNGE KSUPT
20620
20621 ] ;KS10P
20622 \f
20623 UUOACS: BLOCK 20
20624 AC0S:   BLOCK 15        ;SWAP OUT AC S
20625 AC15S:  0
20626 AC16S:  0
20627 AC17S:  0
20628
20629 IFN KL10P,[
20630 ;KLUPT 500,     ;PAGE FAIL WORD STORAGE         ;MICROCODE MOD PUTS
20631 ;KLUPT 501,     ;PAGE FAIL OLD PC STORAGE       ; THESE LOCATIONS IN
20632 ;KLUPT 502,     ;PAGE FAIL NEW PC               ; THE EPT FOR ITS
20633 ]               ;END OF IFN KL10P
20634
20635 UUO::   ;THE FOLLOWING LOCATIONS (UP TO SUEXND) ARE SWAPPED IN & OUT OF
20636         ;UEXIT ETC. WITH THE USER 
20637 SUEXIT: JRST 2,@XUUOH   ;USER UUO EXIT INS
20638 SCLUSV: MOVEM U,AC17S   ;CLOCK U SAVE
20639
20640 IFN KA10P,[
20641 SUUOH:  0       ;C(@41) (ABSOLUTE)
20642 SUEXND::
20643
20644 SV40:   0       ;C(40) WHEN USER OUT (SEE SWITCH)
20645 ] ;KA10P
20646
20647 IFE KA10P,[
20648 SCLCXS: DATAI PAG,CLCX  ;CLOCK SAVE OF CONTEXT
20649 SUEXND::
20650 ] ;IFE KA10P
20651
20652 IFN <SUEXND-UUO>-<UEXND-UEXIT>, .ERR SUEXIT BLOCK LOST
20653
20654 IFE KA10P,[
20655 CLCX:   0       ;SAVED CONTEXT (DATAI PAG,) AT CLKBRK AND PFAIL
20656 ] ;IFE KA10P
20657
20658 IFN KL10P,[
20659 KLUPT 504,      ;EBOX COUNT
20660 EBOXCT: 0 ? 0   ;NUMBER OF EBOX TICKS (25 MHZ) OVER 2 LEFT 12. THAT EBOX
20661                 ;RAN FOR THIS USER
20662 KLUPT 506,      ;CACHE COUNT
20663 MBOXCT: 0 ? 0   ;NUMBER OF MBOX CYCLES REQUESTED BY EBOX FOR THIS USER LEFT 12.
20664
20665 EXPUNGE KLUPT
20666 ] ;KL10P
20667
20668 UTIME:  0       ;RH=CLOCK INTERVAL IN 60'THS, LH=COUNT OF TICKS SINCE READ
20669 UTRNTM: 0       ;TOTAL RUN TIME IN 4 MICROSEC UNITS
20670 USIPRQ: 0       ;# SWAPIN REQUESTS
20671 \f
20672 USWST:  0       ;SWAPPING STATUS BITS.
20673 %SW==525252(1)  ;IN THE LEFT HALF
20674 %SWDSO==400000  ;4.9 => DESIRED TO BE SWAPPED OUT (MUST BE SIGN BIT).
20675 %SWPGW==200000  ;4.8 => FLSINS IS WAITING FOR A PAGE
20676 %SWBEM==100000  ;4.7 => BEST EFFORT MADE TO SWAP OUT, DON'T LOOK AT JOB AGAIN
20677 %SWRUN==040000  ;4.6 => SWAPPED OUT WHILE RUNNABLE, SO CONSIDER MEM STATUS BEFORE REACTIVATION
20678                 ; THIS BIT IS NEVER LOOKED AT.
20679 %SWPCL==020000  ;4.5 => PAGE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
20680                 ; SO WHEN FLSINS SKIPS DON'T CLEAR IT BUT PCLSR INSTEAD.
20681 %SWINT==010000  ;4.4 => IF WAITING FOR PAGE, NEED IT TO INTERRUPT
20682 %SWPRV==004000  ;4.3 => "PRIVELEGED USER"
20683 IFN SWPWSP,[
20684 EXPUNGE %SWPRV
20685 %SWOUT==000400  ;3.9 => JOB IS SWAPPED OUT OR SWAP BLOCKED
20686 %SWSB== 000200  ;3.8 => JOB IS SWAP BLOCKED
20687 %SWLOD==000100  ;3.7 => JOB IS LOADING
20688  ;VALID STATES OF ABOVE 3 BITS: 0=SWAPPED IN, 1=LOADING, 4=SWAPPED OUT, 6=SWAP BLOCKED
20689
20690 UWRKST: 0       ;WORKING SET.  2**18 TIMES SUM(ALL THIS JOB'S PAGES) 1 OVER # SHARERS
20691                 ;INCREMENTALLY MAINTAINED WHILE JOB IS LOADING OR SWAPPED IN.
20692                 ;NOTE # SHARERS IS IN RH(MMSWP)
20693 USVWRK: 0       ;SAVES UWRKST AS OF LAST TIME SWAPPED IN
20694 USWTIM: 0       ;TIME ENTERED LOADING, SWAPPED OUT, OR SWAP BLOCKED STATE.
20695                 ;WHILE SWAPPED IN, HAS THE TIME AT WHICH IT CEASES TO BE PROTECTED
20696                 ;AGAINST MEMORY PREEMPTION.
20697 ];SWPWSP
20698 USWPRI: 0       ;JOB SWAP PRIORITY.  LOWER NUMBER MEANS MORE LIKELY TO STAY IN
20699                 ; AND MORE LIKELY TO COME IN.  SEE ALSO SWRCE, WHICH IS SIMILAR.
20700 IFE SWPWSP,     ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE PRODUCT
20701                 ;OF THE WORKING SET TIMES THE FRACTION OF CPU USED
20702                 ;WHICH IS A MEASURE OF MEMORY USE WITH INTERACTIVE JOBS GIVEN AN ADVANTAGE.
20703 IFN SWPWSP,     ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE "ADJUSTED
20704                 ;MEMORY USAGE", WHICH IS THE (LOGARITHM OF THE WORKING SET SIZE)
20705                 ;MULTIPLIED BY THE SUM OF CPU TIME AND I/O WAIT TIME.  ALSO, WHEN
20706                 ;A DISOWNED JOB IS SWAPPED OUT, USWPRI IS MULTIPLIED BY 4 TO PREVENT
20707                 ;IT FROM COMING BACK IN FOR A WHILE UNLESS THERE IS REALLY NO 
20708                 ;COMPETITION FOR MEMORY.  ALSO, WHEN A SWAPPED-OUT JOB WAKES UP FROM
20709                 ;AN I/O WAIT, USWPRI IS DIVIDED BY 2 TO GIVE INTERACTIVE JOBS AN
20710                 ;ADVANTAGE.  THE SWPWSP SYSTEM DOES NOT CURRENTLY LOOK AT SWRCE.
20711 IFE SWPWSP,[
20712 USWSCD: 0       ;SWAP SCHEDULING WORD 4.9=1 SWAPIN INHIBITED THIS JOB (SWAP BLOCKED)
20713 LTRNTM: 0       ;SAVED RUN TIME FOR PRIV USR
20714 LSIPRQ: 0       ;SAVED SWAP IN REQ FOR PRIV USER
20715 UPGSEC: 0       ;NUMBER OF PAGE FAULTS PER <NPVSEC> RUN TIME SECONDS
20716 LPRVTM: 0       ;LAST TIME PRIV USER
20717 ];SWPWSP
20718 PAGRAN: 0       ;.PAGRANGE.  1ST PG #,,LAST PG # INCLUSIVE RANGE OF PAGES TO BE PAGED AHEAD.
20719 PAGAHD: 0       ;.PAGAHEAD.  0, OR PAGE-AHEAD-DISTANCE,,PAGE-BEHIND-DISTANCE
20720
20721 TRUNTM: 0       ;IF NOT TOP LEVEL, MINUS RUNTIME (4.069 US) ALREADY SENT TO SUPERIOR
20722                 ;IF TOP LEVEL, RUNTIME USED BY SUBTREE MINUS TIME SENT TO DEMON ALREADY
20723 TSIPRQ: 0       ;DITTO FOR SWAPIN REQUESTS
20724 UTMPTR: SYSRCE  ;POINTER TO RESOURCE WORD FOR THIS LOSER (JTMU FOR TREE)
20725 JTMU:   0       ;REDUCED BY 1/16 EVERY 1/2 SEC
20726                         ;INCREMENTED BY TIME RUN IN 4 USEC
20727                         ;MAX EQV VAL 1000000/8-1/16X=0
20728                         ;EQV VAL=2X10^6
20729                         ;AMONG JOBS WITH EQUAL RESOURSE
20730                         ;LOWEST JTMU HAS HIGHEST PRIORITY
20731
20732 IOCHNM: REPEAT NIOCHN,0 ;IO CHANNEL ASSIGNMENT
20733                         ;RH INDEX INTO IOTTB AND CLSTB
20734                         ;LH DEV CHNL AND/OR OTHER
20735 SIOCHN: BLOCK LUIOP     ;MUST FOLLOW IOCHNM
20736                         ;I/O CHANNEL PDL
20737 SIOCP:  SIOCHN-1        ;POINTER INTO I/O CHANNEL PDL
20738 IOCHST: BLOCK NIOCHN    ;I/O CHANNEL STATUS FOR CH'S AT IOCHNM
20739                         ;3.1-4.9 IO STATUS
20740                         ;1.1-2.9 .ACCESS POINTER
20741 \f
20742 CORRQ:  -1      ;RQ TO CORE JOB
20743                 ;4.9=1=>NO REQUEST
20744                 ;4.8=0 OLD TYPE RQ,1.1-1.9 # BLKS,3.1-3.8=USR NUMBER RQ'ED FOR
20745                 ;4.8=1 NEW TYPE
20746                 ;4.3 ADD FRESH BLOCK (IGNORE 4.2,4.1)
20747                 ;4.1=1=> ADDING ABSOLUTE BLOCK
20748                 ;3.9=1=>REQUEST WRITE ABILITY
20749                 ;2.9=1 INSERT, =0 DELETE ONLY IGNORE 4.1-4.3
20750                 ;2.1-2.8 VIRTUAL PAGE AFFECTED
20751                 ;1.1-1.9 USER RQ IS FOR
20752
20753 APRC:   APRCHN  ;R.H. CONO TO APR WHEN USER STARTS (HAS AR OV ENABLE, ETC.)
20754                 ;4.9=1=> PROCEDURE IS IN A DISOWNED TREE
20755 BUMRTL==100000  ;4.7 => GUN TREE IF HASN'T RUN FOR AN HOUR
20756                 ;(MEANINGFUL ONLY IN TOP LEVEL JOB).
20757                 ;CLEARED BY REOWNING OR ATTACHING.
20758 BUSRCR==40000   ;4.6 CORE RQ PENDING ON THIS JOB
20759 BULGO==20000    .SEE SYSGUN ;USER IS DISABLED, WAITING TO BE FLUSHED BY SYS JOB.
20760 BCHPTR==330400,,APRC(U) ;4.1-4.4 LAST CH ON WHICH AN ERR OCCURED (SEE ERR DEV)
20761 BULGOS==400     ;AN ATTEMPT IS BEING MADE TO DELETE OR LOG OUT THIS JOB
20762                 ;SO NO-ONE ELSE SHOULD START TO. THIS BIT ALSO LOCKS OUT
20763                 ;MOST WAYS OF HACKING THE JOB (INCL. THOSE THAT SET DIELOK).
20764                 ;3.1-3.5 MUST BE ZERO
20765
20766 DIELOK: 0       ;NUMBER OF JOBS LOOKING AT OR HACKING THIS JOB.
20767                 ;BEFORE KILLING A JOB, WAIT FOR ITS DIELOK TO BECOME 0.
20768
20769 USTP:   0       ;0 RUNNABLE, (IS SET NON ZERO FOR IDLE SETS OF VARS TO SPEED SEARCH)
20770 %UST==1,,537777
20771 %USTCM==400000  ;CORE BEING SHUFFLED (SHOULD ACTUALLY BE OBSOLETE).
20772 %USTCJ==200000  ;CORE BEING GIVEN BY CORE JOB.
20773 %USTSP==100000  ;STOPPED BY SUPERIOR
20774 %USTCG==40000   ;STOPPED BY SUPERIOR TO GIVE IT CORE (CORBLK, OR .USET OF .MEMT).
20775
20776 BCSTOP==400000  ;BIT IN USTP FOR CORE MOVAGE
20777 BUCSTP==200000  ;CORE STOPPING LOSER TO GIVE MORE CORE RQSTED BY ANOTHER LOSER
20778 BUSRC==100000   ;USER CONTROL BIT, SET & CLEARED BY SUPERIOR PROCEDURE
20779 BSSTP==40000    ;SET BY SUPERIOR WHEN HACKING MEM BOUND AT URMEMT OR UMEMEX
20780 ;1.1-2.9        ;USED BY UBO AND FRIENDS INHIBITS RELOCATION BY CORE ALLOCATOR
20781                 ;MUST BE MODIFIED WITH CLKOFF  MUST NOT BE SET IF CSTOP IS SET
20782                 ;IS A COUNTER OF TRANSIENT REASONS FOR PROCEDURE BEING STOPPED
20783
20784 PIRQC:  0       ;INT REQ AWAITING SERVICE (SOFTWARE INTS EFFECTED BY SEARCH)
20785 MSKST:  0       ;INT MASK REGISTER FOR BITS IN PIRQC
20786 IFPIR:  0       ;SECOND WORD OF INTERRUPT REQUESTS
20787                 ;3.8-3.1 INF PROC INT
20788                 ;2.7-1.1 IO CHANNEL INT
20789                 ;1.1= CHANNEL 0
20790 MSKST2: 0       ;INT MASK FOR IFPIR
20791 IDF1:   0       ;DEFER BITS FOR 1ST WD INTERRUPTS.
20792 IDF2:   0       ;FOR 2ND WORD INTERRUPTS.
20793                 ;IF AN INTERRUPT IS DEFERRED, IT IS TREATED AS
20794                 ;IF THE JOB'S PICLR VAR HELD 0.
20795 PICLR:  0       ;INT IN PROGRESS FLAG, -1=>ENABLED, 0=>IN PROGRESS
20796
20797 SUPPRO: 0       ;-1 => TOP LEVEL PROCEDURE
20798                 ;OTHERWISE: INT BIT,,PNTR TO SUPERIOR PROCEDURE
20799
20800 FLSINS: 0       ;USER BLOCKING INSTRUCTION;  STATE:
20801                 ; 0 => RUNABLE (UNLESS USTP .NE. 0) 
20802                 ; OTHERWISE HUNG,  IF NO SKIP SAFE TO RESTART AT UUO (UNLESS UFINAL .NE. 0)
20803 RPCL:   0       ;0,,N  RPCLSR'ING N
20804                 ;-1,,N  BEING RPCLSR'ED BY N
20805 \f
20806 UNAME:  0       ;USER NAME
20807                 ;THIS WORD FOR EACH PROCEDURE IS COPIED FROM THE UNAME OF THE PROCEDURE
20808                 ;THAT CREATES IT (SEE USR DEV).  FOR AN INITIAL TOP LEVEL PROCEDURE IT
20809                 ;IS INITIALLY -1 BUT IS MODIFIED BY ALOGIN.  IT IS THE SAME FOR ALL
20810                 ;PROCEDURES IN A TREE.
20811 JNAME:  0       ;JOB NAME
20812                 ;EACH LOGGED IN PROCEDURE HAS A UNIQUE UNAME, JNAME PAIR.  THE JNAME
20813                 ;OF AN INITIAL TOP LEVEL JOB IS "HACTRN".  FOR OTHER JOBS IT IS THE SECOND
20814                 ;FILE NAME SPECIFIED IN THE .OPEN ON THE USR DEVICE THAT CREATES THEM.
20815 USYSNM: 0       ;USER SYSTEM NAME
20816                 ;THIS VARIABLE IS INITIALLY SET TO THE SAME VALUE AS UNAME FOR
20817                 ;A PROCEDURE.  IT CAN BE READ OR WRITTEN BY THE PROCEDURE (ASUSET)
20818                 ;OR BY ITS SUPERIOR (AUSET).  ITS ONLY USE IS AS THE DEFAULT THIRD FILE NAME ON
20819                 ;USER SHARED DEVICES (2311'S (SEE QSKO),  AND CORE
20820                 ;LINK (SEE CLOO)).
20821 USYSN1: 0       ;3RD NAME FOR QSKO, CLOO (AFTER DEFAULTING AND TRANSLATION)
20822 HSNAME: 0       ;HOME SNAME
20823
20824 IOTLSR: 0       ;4.9 IOT USER MOD (=1 ENABLES USER TO DO DIRECT I/O
20825                 ; INSTRUCTIONS) 
20826                 ;RH VIRTUAL PAGE # OF LAST MPV, WIRO OR NXI (SHIFTED TO
20827                 ; ADDRESS SIZE) 
20828 UMARPC: 0       ;PC AT MAR INTERRUPT
20829 LSWPR:  0       ;LOCKED SWITCH POINTER
20830 UCLBLK: 0       ;CLOCK QUEUE BLOCK
20831         -1
20832         JRST UREALB
20833 URTIME: 0       ;LH=0=>LOW PRIORITY PHASE 1=> LOW PRIORITY WITH BLOCKING
20834                 ;LH=-1=>HIGH PRIORITY PHASE 2=> HIGH PRIORITY WITH BLOCKING
20835                 ;RH=LENGTH OF HIGH PRIOITY IN 60'THS
20836 RTIMER: -1      ;POSITIVE => MICROSEC RUNTIME TILL RUNTIME INT
20837
20838 LSPCL:  0       ;UPC AT LAST PCLSR,,DIFFERENT UPC AT PREVIOUS PCLSR
20839 LEXFDR: 0       ;DEBUGGING INFO FOR PAGE FAULTS WHICH SIGNAL AN INTERRUPT
20840                 ; TO THE LOSER
20841                 ;LH FAULT BITS OF LAST SUCH FAULT
20842                 ;RH PC OF LAST SUCH FAULT THAT WAS FROM EXEC MODE (WENT TO
20843                 ; IOADCR)
20844                 ;PAGE FAULTS WHICH JUST SWAP IN A PAGE DON'T SET THIS.
20845 LSUUO:  0       ;LAST SYS UUO (FOR DEBUGGING PURPOSE)
20846 LSCALL: 0       ;SIXBIT NAME OF LAST .CALL 0, (FOR PEEK)
20847 CTLBTS: 0       ;CTL BITS TO .CALL 0, XORED TOGETHER IN HERE (RIGHT HALF)
20848 SYSCVL: 0       ;CONTROLS OUTPUT ARGS FROM SYSTEM .CALL
20849  %SCV==1,,525252
20850  %SCVOT==400000 ;4.9 CALL HAS OUTPUT ARGS FLAG (TO SAVE TIME)
20851  %SCVER==200000 ;4.8 CALL HAS ERROR CODE ARG FLAG
20852                 ;3.6-4.7 UNUSED 3.1-3.5 MUST BE ZERO
20853                 ;1.1-2.9 ADDRESS OF ERROR CODE ARG
20854 IOTBTS: 0       ;DEVICE-INDEPENDENT IOT CONTROL BITS GO HERE, IN IOT AND SIOT
20855 USTYN:  0       ;TTY NO OF THE STY WHICH THIS JOB KNOWS AS "STY:" (WITHOUT
20856                 ; NUMBER). 
20857 UUAC:   0       ;AC FLD OF LAST UUO OR DESIRED CHANNEL IN CASE OF NOPEN ETC
20858                 ;SELECTS CHNL FOR ALL IOTS, OPENS ETC
20859                 ;LH -1 IF STORED BY CHNDCD, ELSE ZERO (SEE WHO LINE ROUTINES)
20860 TRMNAM: 0       ;TERMINAL IDENTIFICATION
20861 TRNLST: 0       ;TRANSL LIST FOR THIS JOB. -1 => NIL, OR IDX INTO TRAN!X
20862 TRNLS1: 0       ;TRANSL LIST FOR THIS JOB & INFERS.
20863 UTRAPM::        ;SIGN BIT OF OPTIONS IS UUO-TRAP-TO-SUPERIOR MODE
20864 OPTION: 0       ;OPTIONS WORD, SETTABLE BY USER
20865                 ;EACH BIT CONTROLS SOME SYSTEM ACTION FOR THIS JOB
20866         .SEE %OP
20867 XUNAME: 0       ;"WHO I REALLY AM" AS OPPOSED TO "WHO I AM LOGGED IN AS"
20868 XJNAME: 0       ;JOB NAME USER SPEC'ED AS OPPOSED TO UNIQUIZED VERSION
20869 \f
20870 40ADDR: 20,,40  ;RH=ADDRESS OF USER'S 6-WORD BLOCK FOR UUO'S, INTS, SWITCHES, LOCKING.
20871                 ;LH=ADDRESS OF USER'S 20-WORD BLOCK FOR SUPERIOR'S USE.  0=20.
20872 IFN N11TYS,[
20873 TVCREG: -1      ;TV CONSOLE REG FOR THIS USER OF -1 NONE
20874 TVVBN:  -1      ;-1 OR CONSOLE REG FOR RUN BLINKING
20875 NVDBA:  0       ;# VIDEO BUFFERS ASSIGNED (WITH NVDBA SYSTEM CALL).
20876 ];N11TYS
20877 UWHO1:  0       ;WHOLINE FLAGS
20878 UWHO2:  0       ;TWO HALFWORDS, PRINTING CONTROLLED BY UWHO1 4.9-3.3
20879 UWHO3:  0       ;TWO MORE HALF WORDS, CONTROLLED BY UWHO1 3.2-1.5
20880 IFN KL10P,[
20881 ULSPBR: 0       ;STBR,,GCSTBR FOR SPECIAL LISP INSTRUCTIONS
20882 ]
20883 SERVER: -1      ;User index of server job who is allowed write access to
20884                 ; this job to implement some oddball protocol.  -1 if none.
20885 ;INSERT NEW USER VARIABLES HERE^
20886
20887 USRPDL: -LUPDL,,UPDL-1  ;USER PDL
20888 UPDL:   BLOCK LUPDL-1
20889 EPDL2:  0       ;SAVES C(T) FOR FLSINS
20890 QLD:    0       ;LINK DEPTH
20891 VALUE::         ;PROCEDURE "VALUE" RETURN
20892 SRN3:   0       ;SAVED N3, N4 FOR RENAMES AT AOPEN ALSO USER INDEX AT NLOAD
20893                 ;SRN3, SRN4 USED BY CORBLK .CALL
20894 .SEE IODCS2     ;SRN3 contains saved user mode PC for unlocking own locks.
20895 .SEE ALOGO4     ;NO CLOSE ROUTINE MAY USE SRN4 OR SRN5
20896 SRN4:   0       ;ALSO DEVICE CHNL IOCHNM POINTER AT NLOAD
20897 SRN5:   0       ;SAVED N5 FOR LINK ALSO VIRTUAL PAGE NUMBER AT NLOAD
20898 EPDL3:  0       ;USED BY 2311 ROUTINES (QFNG) ALSO QSMDN ADDR AT NLOAD ALSO BY TYOW2
20899 .SEE ALOGO4     ;NO CLOSE ROUTINE MAY USE EPDL
20900                 ;FOR BP-STYLE RENAME, RENMWO AND MLINK,
20901                 ;HOLDS BP (OR BP BLK PTR) TO NAMES TO RENAME OR LINK TO.
20902 EPDL:   0       ;USED BY 2311 ROUTINES.
20903                 ;FOR SOPEN AND BP-STYLE RENAME, DELETE, HOLDS BP OR BP BLOCK PTR.
20904 EPDLT1: 0       ;FN1 BEFORE LAST TRANSLATION, USED BY NLOAD
20905 EPDLT2: 0       ;FN2   "     "      "       , USED BY NLOAD
20906 EPDLT3: 0       ;SYS NAME "  "      "
20907 EPDLT4: 0       ;LEFT ADJ DEVICE NAME " " "
20908
20909 STTYOP: 0       ;IN THE TOP OF A DETACHED TREE, THIS CONTAINS THE SAVED USER TTY
20910                 ; OPTIONS.  2.9=1 IF IT IS VALID, 2.7-2.8 ARE QUERY AND REFUSE MODE,
20911                 ; THE REST ARE TTYOPT BITS.
20912
20913 IFN 0,[ ;FAKE OUT @
20914 LSWB0:
20915 ]
20916 REPEAT NULBLK,[
20917 CONC LSWB,\.RPCNT,:     BLOCK 2
20918 ]               ;SWITCH BLOCK FORMAT
20919                 ;WD1 ASSOCIATED ADDRESS OR QUANTITY
20920                 ;3.6-3.1 USER NUMBER OF SWITCH HOLDER
20921                 ;2.9-1.1 PNTR TO NEXT SWITCH ON LIST OR 0 IF NONE
20922                 ;FOR REMAINDER OF FORMAT SEE LSWDIS
20923
20924 IFN KL10P,[
20925 IFGE USRSTG+1000-., INFORM SPACE LEFT IN UPT,\1000-<.-USRSTG>
20926 IFL USRSTG+1000-., .ERR USER VARS TOO BIG FOR UPT!
20927 .ELSE LOC USRSTG+1000
20928 ] ;IFN KL10P
20929
20930 IFN KS10P, LOC <.+7>&-10        ; KS UPT must be 0 mod 8 (see UUOPCW)
20931
20932 LUBLK==.-USRSTG
20933 L==LUBLK
20934 INFORM [STORAGE PER LOSER]\LUBLK
20935         BLOCK LUBLK     ;USER VARIABLES FOR CORE JOB
20936 SYSB==<1777+.>_-10.
20937 MXC==SYSUSB-SYSB        ;AVAIL BLOCKS AFTER SYS+DDT
20938
20939 \fSUBTTL TSS INITIALIZATION
20940 ;NEXT LINE COMMENTED OUT BECAUSE IT CAUSES MORE TROUBLE THAN IT SAVES
20941 ;.HKALL==1      ;(THE FOLLOWING CODE IS WIPED OUT AT ICLR)
20942 EXEUMP=UPGMP+100        ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S PAGE TABLE
20943                         ;SYMBOL IS DEFINED HERE SINCE UPGMP WAS JUST DEFINED 6 PGS AGO
20944
20945 BEG:    SKIPN SALV      ;SEE IF LOSER FORGOT TO LOAD SALV WHEN BUILDING SYSTEM,
20946                         ;OR SALV MEM IS NXM.  EVIL!  EVIL!
20947          BUG AWFUL,[HEY!  WHERE'S THE SALVAGER?]
20948         JSR SALV+1      ;CALL NO-QUESTIONS-ASKED SALVAGER
20949 GO:     JFCL 17,.+1
20950         JRST .+1
20951         JFCL 1,[JRST 4,.]       ;SYSTEM WONT RUN ON 6
20952 IFN KL10P,[
20953         CONSO PAG,600000
20954          SWPIA                  ;IF CACHE OFF, FLUSH CRUFT THAT MAY BE IN IT
20955         CONSZ PAG,600000
20956          SWPUA                  ;IF CACHE ON, UPDATE CORE SO DDT IS GOOD
20957         CONSZ 200000
20958          JRST .-1
20959         SPCCTX 0,1,USRSTG,DISABLE       ;SET UP UPT ADDR, BUT NO ACCTING TILL
20960         MOVEI T,0                       ;MORE INIT IS DONE.
20961         XCTR XBW,[BLT T,17]             ;CLEAR BLK 1 TO AVOID RANDOM PARITY
20962                                         ; ERRORS
20963 ] ;KL10P
20964 IFN KS10P,[
20965         CONO 20700+APRCHN       ; Clear memory related APR flags
20966                                 ; (ECC, Bad, NXM)
20967         MOVSI TT,%KEHLD+%KEREF+%KEPWR
20968         IOWR TT,[KSECCS]        ; Reset memory status register.
20969         MOVEI TT,%UBTIM+%UBBAD+%UBPAR+%UBNXD+%UBINI
20970         IOWRQ TT,UBASTA         ; Reset both Unibus's and both adaptors.
20971         IOWRI TT,UBASTA
20972         MOVEI TT,DSKCHN_3       ; Set PI level for RH11.  (No, you can't do
20973         IOWRQ TT,UBASTA         ; this at the same time you reset the Unibus.)
20974         MOVEI TT,MTCCHN_3+TTYCHN        ; PI for Tape, for Chaos and TTYs.
20975         IOWRI TT,UBASTA
20976         WRHSB [HSB]             ; Set halt status block location.
20977         CLRCSH                  ; Reset cache once for good measure.
20978         SPCCTX 0,1,USRSTG       ; Set up UPT and AC blocks.
20979 ] ;KS10P
20980 IFN TEN11P,[
20981         MOVEI TT,600000+<T11CPA_-10.>
20982         SKIPGE TEN11F
20983          MOVEI TT,0
20984         DPB TT,[.T11CP+EXEUMP]
20985         SETOM T11MP+<T11CPA&777777>_-10.        ;DONT USE MAP PAGE AS 10-11 PAGE
20986 ;IFN PDP6P,[            ;THESE ARE IN SEPARATE MOBIES NOW
20987 ;       MOVE TT,[-LPDP6M,,<PDP6BM&777777>_-10.]
20988 ;       SETOM T11MP(TT) ;CONFLICTS WITH PDP-6 MEM
20989 ;       AOBJN TT,.-1
20990 ;]
20991 ;IFG TSYSM-256.,[
20992 ;       MOVSI TT,-TSYSM+256.
20993 ;       SETOM T11MP(TT) ;CONFLICT PAGES
20994 ;       AOBJN TT,.-1
20995 ;]
20996 ]
20997         MOVE P,SYSPDP
20998
20999 ;INIT THE EXEC PAGE MAP'S DDT PAGES.
21000         HRRZ A,DDT-2    ;LOWEST ADDR IN SYMBOL TABLE
21001         SUBI A,100      ;LEAVE ROOM FOR EXTRA SYMS, 340 ROUTINES' LOSSAGE, ETC.
21002         LSH A,-10.      ;GET PAGE SYMTAB STARTS IN
21003         MOVEM A,FDDTPG
21004         MOVEI Q,NQS-1   ;PUT THE TUTS JUST BELOW THE DDT PAGES
21005 BEGTT1: SKIPE QACT(Q)
21006          JRST BEGTT3    ;UNIT NOT IN USE
21007         MOVE T,NTBL(Q)  ;NUMBER OF PAGES IN THIS TUT
21008 BEGTT2: SUBI A,1
21009         MOVE B,[MU23TT_<.TZ .BM <MUR>>]
21010         MOVEM B,MEMBLT(A)
21011         DPB Q,[MNUMB,,MEMBLT(A)]
21012         SOJG T,BEGTT2
21013         MOVE B,A
21014         LSH B,10.
21015         HRLI B,640000
21016         MOVEM B,QTUTO(Q)
21017 BEGTT3: SOJGE Q,BEGTT1
21018         MOVEM A,FTUTPG
21019         ;NOW MAKE SURE ALL THOSE PAGES ARE MAPPED
21020         MOVEI B,-200(A)         ;ASSUMING TSYSM AT LEAST 128K
21021         LSH B,-1                ;GET A B.P. TO IDPB MAP HWD OF 1ST DDT PAGE
21022         ADD B,[442200,,EXEUMP]
21023         TRNE A,1
21024          IBP B
21025         MOVEI C,600000+PMCSHM(A) ;COMPUTE CONTENTS OF THAT MAP WORD.
21026         MOVE D,[MUDDT_<.TZ .BM <MUR>>]
21027 BEG3:   CAML A,FDDTPG
21028          MOVEM D,MEMBLT(A)
21029 IFG TSYSM-128., IDPB C,B
21030         AOS C
21031 IFG TSYSM-400,  CAIE A,400
21032 .ELSE           CAIE A,TSYSM    ;STORE THAT MAP WORD AND ALL REST THERE ARE.
21033          AOJA A,BEG3
21034
21035 ;INITIALIZE REST OF EXEC PAGE MAP
21036 IFN DIRMAP,[
21037         MOVE Q,[222200,,EXEUMP]
21038         SETZB A,B
21039         SKIPE USEMDM            ;MAKE MEDIUM MEM NXM IF DIRMAP NOT TURNED ON
21040          MOVEI B,600200+PMCSHM  ;THIS MAY BE USEFUL FOR DEBUGGING
21041         MOVE T,FTUTPG
21042         SUBI T,201              ;STOP AT 1ST TUT PAGE.
21043 BEG2:   CAIL A,NEXPGS
21044          DPB B,Q
21045         IBP Q
21046         ADDI B,1
21047         CAMGE A,T
21048          AOJA A,BEG2
21049 ];END IFN DIRMAP
21050 ;DROPS THROUGH
21051 \f;DROPS IN
21052
21053 ;SET UP EXEC LOWER MAP (EVEN ON KA, WILL BE LOOKED AT BY .CALL CORBLK)
21054         MOVE A,[600000,,600001+PMCSHM]  ;PAGE 0 IS NOT CACHED   
21055         MOVSI B,-100
21056          MOVEM A,EXELMP(B)
21057          TLO A,PMCSHM
21058          ADD A,[2,,2]
21059          AOBJN B,.-3
21060
21061 ;SET UP SYS JOB'S CIRCULAR POINTERS SO ALL THE PAGES IT HAS ARE ABSOLUTE
21062
21063         MOVE A,[442200,,UPGMP]
21064         MOVE B,[442200,,UPGCP]
21065         MOVEI D,0
21066 BEG6:   ILDB T,A
21067         MOVEI E,-1
21068         JUMPN T,BEG7
21069         CAIL D,200+MMP0 ;ALLOW USERS TO COPY MMP EXEC PGS
21070          CAILE D,200+NEXPGS
21071           MOVEI E,0     ;PG IT DOESN'T HAVE, AND NOT COPYABLE EXEC PG
21072 BEG7:   IDPB E,B
21073         CAIGE D,377
21074          AOJA D,BEG6
21075
21076 ;EXEC MAP PREPARED, NOW TURN ON PAGING
21077
21078 IFN KA10P,[
21079         LPMR UPGML
21080         CONO 633550
21081 ] ;KA10P
21082 IFN KS10P,[
21083         CONO 67760      ; Disable and Clear all flags
21084         CONO 127660     ; Enable and Clear all flags except memory ECC
21085         APRID A
21086         TLNN A,%UCITS
21087          BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21088         LDBR3 EXEUMP            ; Load exec DBRs.
21089         LDBR4 EXELMP
21090         LPMR UPGML
21091         SPCCTX 1,1,USRSTG       ; Select AC blocks and set UBR.
21092         WREBR 020000+<EPT/1000> ; Paging on and set EBR.
21093 ] ;KS10P
21094 IFN KL10P,[
21095         CONO 327740     ;ENABLE AND CLEAR ALL FLAGS EXCEPT SWEEP DONE
21096         APRID A
21097         TLNN A,%UCITS
21098          BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21099         SPCCTX 6,6      ;LOAD MICROCODE CONSTANTS NEEDED BY PAGEING INTO
21100                         ; BLOCK 6.
21101         MOVEI 3,EXEUMP  ;DBR3
21102         MOVEI 4,EXELMP  ;DBR4
21103         MOVSI 5,PMAGEM  ;LH.AGE
21104         MOVEI 6,PMAGEM  ;RH.AGE
21105         MOVEI 7,1000    ;CN1000
21106         MOVEI 10,100    ;CN100
21107         CONO PAG,660000+<EPT/1000>      ;CACHE ON, ITS PAGER, TRAP ENB, EPT ADDR
21108         SPCCTX 1,1,USRSTG,DISABLE
21109         LPMR UPGML
21110 ]               ;END IFN KL10P
21111         MOVE P,SYSPDP
21112
21113 ;INITIALIZE FREE LISTS IN MEMBLT
21114
21115         MOVEI A,1       ;A PG NO - NOTE: DON'T DO PAGE ZERO
21116 BEGF0:  CAML A,FTUTPG   ;IF THIS ISN'T A DDT OR TUT PAGE, THEN
21117         CAIL A,400
21118          PUSHJ P,CIMEMR ;PUT THIS PAGE ON THE RIGHT FREE LIST
21119         CAIGE A,TSYSM-1
21120          AOJA A,BEGF0
21121 IFN TEN11P,[
21122         SKIPGE TEN11F
21123          JRST BEG4
21124         MOVSI A,-256.   ;CLEAR THE INTERFACE'S "VALID" BITS.
21125         SETZM 400000+T11CP*2000(A)
21126         AOBJN A,.-1
21127 BEG4:]
21128 IFN XGP,[
21129         SKIPE TEN11F
21130          JRST BEGX1
21131         MOVE A,[600000+<XGP11_8>,,1777]
21132         PUSHJ P,T11AD
21133          BUG            ;NO 10-11 PAGES AVAILABLE?
21134         MOVEI TT,600000+<<T11CPA_-18.>_8>(B)    ;GET CORRESP EXEC MAP PG SETUP
21135         DPB TT,[.XGPC+EXEUMP]
21136         MOVEI TT,600000+<<T11CPA_-18.>_8>+XGPTP
21137         DPB TT,[.XGPB+EXEUMP]   ;SETUP PAGE FOR PDP-11 BUFFER
21138 BEGX1:]
21139 \f
21140 ;CHECK AVAIL MEM FOR EXISTANCE
21141
21142 IFN ECCMEM,[
21143         LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21144         IORI TT,200000          ;GRANT READ ACCESS
21145         DPB TT,[.ECCPG+EXEUMP]
21146         LPMR UPGML
21147         MOVE A,400000+ECCPG*2000+1760   ;GET CURRENT HISTORY POINTER
21148         LSH A,-32.
21149         MOVEM A,ECCIDX
21150 ];ECCMEM
21151         MOVEI A,TSYSM-1
21152 CKML:   MOVEI TT,600000(A)
21153         DPB TT,[.PAREP+EXEUMP]
21154         LPMR UPGML
21155 IFN ECCMEM,[
21156         LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21157         CAMN A,TT               ;THIS PAGE?
21158          JRST CKML1A            ;YES, TREAT AS IF OFFLINE, THOUGH WILL ACCESS IT
21159                                 ; DIRECTLY FROM TIME TO TIME
21160 ]
21161         MOVE TT,A
21162         LSH TT,10.
21163         MOVSI T,-8
21164         CAML TT,MEMLZL(T)
21165          CAML TT,MEMLZH(T)
21166           AOBJN T,.-2
21167         JUMPL T,CKML1A          ;THIS BLOCK KNOWN TO BE LOSING
21168         SKIPL USEHM
21169          CAIGE A,256.
21170           JRST .+2
21171            JRST CKML1A          ;HIGH MOBY NOT TO BE USED
21172 IFN KL10P,[
21173         MOVEI TT,CKML1          ;KL10 CAN GET PARITY FAULT ON REFERENCE TO NXM
21174         MOVEM TT,PFNPC
21175         HRRM TT,MUUOKN          ;IT CAN ALSO GET A UUO
21176 ] ;KL10P
21177 IFN KS10P,[
21178         MOVEI TT,CKML1
21179         MOVEM TT,EPTPFN
21180 ] ;KS10P
21181         CAIL A,256.             ;IF NOT IN BOTTOM 256K, DON'T ASSUME GOOD DATA
21182          SETZM 400000+PAREP*2000+20     ;STORE ZERO SO DON'T GET PARITY ERROR
21183         MOVE 0,400000+PAREP*2000+20     ;IF THIS NXMS, MEM THE SYS THINKS
21184                                         ; IT HAS IS NON EXISTANT
21185 IFN KA10P,[
21186         CONSZ 10000
21187          JRST CKML1             ;THAT MEM NXM
21188 ] ;KA10P
21189 IFN KL10P,[
21190         MOVEI TT,PFAIL
21191         MOVEM TT,PFNPC
21192         MOVEI TT,UUOH0
21193         HRRM TT,MUUOKN
21194         CONSZ 2000
21195          JRST CKML1             ;THAT MEM NXM
21196 ] ;KL10P
21197 IFN KS10P,[
21198         MOVEI TT,PFAIL
21199         MOVEM TT,EPTPFN
21200         CONSZ 400
21201          JRST 4,.       ; This can't happen, right?  (If we got a NXM, we
21202                         ; would have trapped to CKML1 already.)
21203 ] ;KS10P
21204         SKIPL CKMBLK    ;WINS
21205          JRST CKML6     ;THUS ENDING BLOCK OF LOSERS
21206 CKML2:  SOJGE A,CKML
21207         AOSN CKMFLG     ;ANY MEM OFF UNEXPECTEDLY?
21208          JRST CKML5     ;NO
21209         MOVEI TT,[ASCIZ/
21210 IS THIS OK? /]          ;YES, MAKE SURE SOMEBODY KNOWS ABOUT IT.  MAY BE SERIOUS SCREW.
21211         PUSHJ P,T00ASZ
21212         PUSHJ P,T00TYI
21213         ANDI A,137
21214         CAIE A,"Y
21215          JRST DDT
21216         MOVEI TT,[ASCIZ/
21217 /]
21218         PUSHJ P,T00ASZ  ;CRLF
21219 CKML5:
21220 IFN KL10P,[
21221         CONO 26400      ;CLEAR ANY NXM AND PARITY INTERRUPTS
21222         CONI MTS,TT
21223         TLNN TT,400
21224          BUG PAUSE,[TAPE DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21225         CONI DSK,TT
21226         TLNN TT,4000
21227          BUG PAUSE,[DISK DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21228 ] ;KL10P
21229 IFN KS10P, CONO 20400           ; Clear NXM flag
21230 ;DROPS THROUGH
21231 \f;DROPS IN
21232
21233 IFN RP10P,[
21234         DATAI DPC,A
21235         TLNN A,NOWRIH           ;CHECK FOR FORMAT SWITCH ON RP10
21236          BUG PAUSE,[RP-10 WRITE HEADERS ENABLED, PLEASE FLIP THE SWITCH]
21237 ];RP10P
21238
21239 IFE <MCOND MLKA,>&<MCOND DM,>,[ ;CHECK FOR LOSING SWITCHES ON MEMORY ON ML-KA AND DM
21240
21241         MOVSI D,(DWRITC)        ;MAKE COMMAND FOR VERY LAST BLOCK ON DISK
21242         MOVEI A,NCYLS+XCYLS-1
21243         DATAO DPC,[DNOOPC]      ;DETERMINE TYPE OF DRIVE 0
21244         DATAI DPC,B
21245         TRNE B,RP03BT
21246          MOVEI A,MCYLS+XCYLS-1  ;RP03
21247         DPB A,[DCYL D]
21248         LSH A,-8
21249         DPB A,[DCYLXB D]
21250         MOVEI A,NHEDS-1
21251         DPB A,[DSURF D]
21252         ADDI D,QICWA
21253         MOVEM D,CKMSWC
21254         SUB D,[DWRITC-DREADC]
21255         MOVEM D,CKMSRC
21256         SUB D,[DREADC-DSEEKC]
21257         MOVEM D,CKMSSC
21258         MOVEI A,0
21259 CKMS1:  LDB TT,[MUR,,MEMBLT(A)] ;MEM EXIST?
21260         CAIE TT,MUFR            ;AND NOT DDT?
21261          JRST CKMS2
21262         MOVEI B,600000(A)
21263         DPB B,[.PAREP+EXEUMP]
21264         LPMR UPGML
21265         CAIGE A,CKMSZZ          ;MEM LOADED?
21266          JRST CKMS3             ;YES
21267         MOVSI B,'FOO            ;NO, LOAD IT
21268         MOVEM B,CKMSBF
21269         MOVE B,[CKMSBF,,CKMSBF+1]
21270         BLT B,CKMSBF+177
21271         MOVEI B,'BAR
21272         HRRM B,CKMSBF+69.
21273         HRRM A,CKMSBF+6         ;MAKE DIFF FROM OTHER SUCH PAGES
21274         MOVEI C,1
21275         MOVE B,A
21276         LSH B,-4                ;16K BLOCK # IN B
21277         LSH C,(B)               ;GET UNIQUE BIT SO PARITY ERR IF TWO AT SAME ADDR
21278         MOVEM C,CKMSBF+35
21279         MOVE B,[CKMSBF,,400000+PAREP*2000]
21280         BLT B,400000+PAREP*2000+177
21281 CKMS3:  MOVE B,A                ;MAKE IOWD
21282         LSH B,10.
21283         SOS B
21284         HRLI B,-200
21285         LDB C,[100300,,A]       ;MA 15-17
21286         TRC C,7
21287         DPB C,[410300,,B]
21288         MOVEM B,QICWA
21289         SETZM QICWA+1
21290         CONO DPC,175700
21291         DATAO DPC,CKMSSC        ;POSITION HEADS
21292         CONSO DPC,10
21293          JRST .-1
21294         DATAO DPC,CKMSWC        ;WRITE OUT SECTOR
21295         CONSZ DPC,20
21296          JRST .-1
21297         CONI DPC,B
21298         TLNE B,17
21299          JRST CKMS4             ;CHANNEL ERROR MEM LOSING
21300         TRNE B,177700
21301          JRST CKMS2             ;FOO, DISK LOSING
21302         MOVE B,[-200,,CKMSBF-1] ;READ IT BACK   
21303         MOVEM B,QICWA
21304         SETZM QICWA+1
21305         SETZM CKMSBF+69.
21306         CONO DPC,175700
21307         DATAO DPC,CKMSRC
21308         CONSZ DPC,20
21309          JRST .-1
21310         CONI DPC,B
21311         TLNE B,17
21312          JRST CKMS2             ;MEM LOSS IN CKMSBF?
21313         TRNE B,177700
21314          JRST CKMS2             ;FOO, DISK LOSING
21315         MOVSI B,-200            ;COMPARE
21316         MOVE C,CKMSBF(B)
21317         CAME C,400000+PAREP*2000(B)
21318          JRST CKMS4             ;NOT SAME SWITCHES LOSING
21319         AOBJN B,.-3
21320 CKMS2:
21321 IFE MCOND DM,   ADDI A,16.      ;MA10'S !!
21322 IFE MCOND MLKA, ADDI A,32.      ;ML-KA MEM IS IN 32K MODULES
21323         CAIGE A,TSYSM
21324          JRST CKMS1
21325         CONO DPC,175700         ;RESET THE DISK CONTROL
21326         DATAO DPC,[DEASEC+776]  ;AT EASE!
21327         CONO PI,20000           ;TURN OFF IOB PI REQ LIGHT
21328         JRST CKMSX              ;DONE WITH THIS, CONTINUE INITIALIZATION
21329
21330 CKMSBF: BLOCK 200
21331
21332 CKMS4:  MOVEI TT,[ASCIZ/MEM ADDR SWITCHES DISAGREE CPU VS DSK AT LOC /]
21333         PUSHJ P,T00ASZ
21334         PUSHJ P,T00BKO
21335         MOVEI TT,[ASCIZ/0000/]
21336         PUSHJ P,T00ASZ
21337         JRST DDT
21338
21339 CKMSZZ==./2000+2                ;ABOVE HIGHEST CODE
21340
21341 CKMSX:
21342 ]               ;END IFE MCOND MLKA & DM
21343 \f;DROPS IN
21344         MOVEI TT,0
21345         DPB TT,[.PAREP+EXEUMP]
21346         LPMR UPGML
21347 IFN KA10P,      CONO PI,240000+11577+IFN C1MXP,20000
21348 IFE KA10P,      CONO PI,11577
21349 IFN NOTYS,      CONO TTY,TTYCHN
21350 IFN NETYS,[
21351                 SETOM DTEODN            ;CAN GET SET ON WHILE LOADING, BUT INTR GETS LOST
21352 IFE PDCLKP,     CONO DTE,1170+APRCHN    ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21353 IFN PDCLKP,     CONO DTE,1170+TTYCHN    ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21354 ]               ;END OF IFN NETYS
21355 IFN E.SP,[
21356         CONO DIS,515330 ;RESET E&S
21357         MOVEI TT,E.SPM
21358         MOVEM TT,34     ;SET PAGER LOC (USED BY DSKDUMP)
21359 ]
21360 IFN TM10B,[
21361         MOVEI TT,MIOWD
21362         MOVEM TT,MICWA  ;SETUP LOC FOR MEM CHAN TAPE
21363 ]
21364 IFN RP10P+RH10P,[
21365         MOVEI TT,QIOWD
21366         MOVEM TT,QICWA  ;SETUP FOR DEC DISK CHANNEL
21367 ]
21368 IFN ARMP,       DATAO 760,[0]   ;RESET LITE ON ARM
21369 IFN DSDP,       CONO DSDEV,10   ;RESET INT RQ FROM PDP10
21370 IFN RBTCP,      CONO RBTCON,0   ;RESET TABLET
21371
21372         MOVE A,DDT-2    ;PUT GLOBAL BLOCK HEADER AT BEGINNING
21373         MOVE B,[SQUOZE 0,GLOBAL]
21374         CAME B,(A)      ;SEARCH FOR GLOBAL BLOCKS
21375         AOBJN A,[       AOBJN A,.-1
21376                         JRST BEGS1]
21377         MOVE C,DDT-2
21378         MOVEI D,(C)
21379         SUBI D,(A)      ;GET ,,-#WDS  BEFORE GLOBAL BLOCK
21380         MOVSI D,(D)
21381         ADDM D,1(A)     ;GLOBAL BLOCK NOW LARGER
21382         EXCH B,(C)      ;EXCHANGE IT WITH FIRST SYM
21383         MOVEM B,(A)
21384         MOVE B,1(A)
21385         EXCH B,1(C)
21386         MOVEM B,1(A)
21387 BEGS1:  PUSHJ P,SBUBL
21388         JUMPL J,BEGS1   ;KEEP SORTING UNTIL SYMS IN ORDER
21389         MOVSI A,400000
21390         IORM A,DDT-1
21391
21392 ; SORT THE UUO/SUSET/BIT SYMBOL TABLE BY VALUE
21393
21394         MOVE E,[SYSYMB-SYSYME-1,,SYSYMB]
21395         PUSHJ P,SBUBL0
21396         JUMPL J,.-2
21397
21398         MOVE A,[-LTSTB,,TSTB]
21399 BEG1:   MOVE B,(A)
21400         MOVEI C,(B)
21401         EQV C,(B)
21402         AOBJN B,.-1
21403         MOVEM C,CKSUMS-TSTB(A)
21404         MOVE B,(A)
21405 CKXC2:  MOVE C,(B)
21406 REPEAT 36.,[
21407         IFL .RPCNT-18., TLNE C,400000_<-.RPCNT>
21408         .ELSE           TRNE C,400000_<18.-.RPCNT>
21409         XORM B,CKXORS+.RPCNT
21410 ]
21411         AOBJN B,CKXC2
21412         AOBJN A,BEG1
21413         HRRZS 37                ;MAKE SURE SYS DOESNT IMMEDIATELY COME DOWN
21414 ;DROPS THROUGH
21415 \f;DROPS IN
21416         MOVEI A,0
21417         CLEARM QACTB
21418 QSETUP: MOVE B,DCHBT(A)
21419         SKIPN QACT(A)
21420         IORM B,QACTB
21421         CAIGE A,NQS-1
21422         AOJA A,QSETUP
21423 IFN DC10P,      CONO DC0,DCCSET+DCDENB+DSKCHN   ;RESET 2314 AND SET DATA ERROR ENABL
21424 IFN 340P,       CONO DIS,100
21425 IFN TK10P,      CONO NTY,TTYCHN
21426 IFN MTYP,       CONO MTY,TTYCHN
21427         CLEARM USRHI
21428         CLEARB U,USER
21429         MOVE P,SYSPDP
21430 IFN DPKPP,[
21431         CONO DPK,400070+TTYCHN  ;INITIALIZE DP KLUDGE
21432         DATAO DPK,[4,,DPKBAS]
21433         MOVE T,[-NDPTYS,,NFDPTY]
21434         MOVEI B,0       ;LINE #
21435 DPIL:   LDB A,[$TTOSP,,TTYTYP(T)]       ;OUTPUT SPEED
21436         MOVE A,DPSP(A)          ;MAP TO DPK SPEED CODE
21437         DPB B,[140400,,A]       ;LINE #
21438         CONO DPK,500+TTYCHN(A)  ;LOAD OUT SPEED
21439         LDB A,[$TTISP,,TTYTYP(T)]       ;INPUT SPEED
21440         MOVE A,DPSP(A)          ;MAP TO DPK SPEED CODE
21441         DPB B,[140400,,A]
21442         CONO DPK,700+TTYCHN(A)  ;LOAD IN SPEED
21443         AOS B
21444         AOBJN T,DPIL
21445 ]
21446 IFN DZ11P,[
21447         PUSHJ P,DZINIT
21448 ];DZ11P
21449 IFN N11TYS,[
21450         SKIPE TEN11F
21451          JRST BEG5
21452         MOVSI R,-NTTPG-NTVBP+1
21453         MOVE T,[.TTPG0+EXEUMP]
21454 BEG9:   MOVEI A,(R)     ;SET UP 1 MORE TEN-11 MAP ENTRY
21455         LSH A,20.
21456         IORI A,1777     ;A FULL PAGE
21457         TLO A,600000+TT11NM*400
21458         PUSHJ P,T11AD
21459          BUG
21460         ADDI B,600000+<<T11CPA_-18.>_8>         ;READ-WRITE, IN HIGH MOBY.
21461         DPB B,T
21462         IBP T
21463         AOBJN R,BEG9
21464         MOVE A,[(600000+TT11NM*400)TT11CR_8]    ;POINTER TO CONSOLE REG
21465         PUSHJ P,T11AD
21466          BUG
21467         ADDI B,600000+<<T11CPA_-18.>_8>
21468         DPB B,T
21469         LPMR UPGML
21470         SKIPE TT11P     ;IF WE'RE SUPPOSED TO USE THE TV 11,
21471          SETZM TT11UP   ;REQUEST IT TO RE-INIT.
21472                 ;IF TT11UP BECOMES NONZERO, THE 11 IS UP.
21473 BEG5:   ];END IFN N11TYS
21474 IFN CH11P,[
21475         XCTRI [IORDI A,CAIMYN]
21476          CAIA
21477           BUG HALT,[CHAOSNET INTERFACE NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS)]
21478 ] ;CH11P
21479 IFN CHAOSP,[ IFN T11CHP,[
21480         SKIPE TEN11F    ;SET UP TEN-11 CHAOS NET INTERFACE PAGE
21481          JRST BEG8
21482         MOVE A,[(600000+CH11NM*400)1004_8+1777]
21483         PUSHJ P,T11AD
21484          BUG
21485         ADDI B,600000+<<T11CPA_-18.>_8>
21486         DPB B,[.CHSPG+EXEUMP]
21487 BEG8:   ]] ;CHAOSP, T11CHP
21488 IFN DL10P,[             ;INITIALIZE DL10
21489         CONO DLC,400000 ;MR CLR
21490         CONO DLB,1      ;TURN OFF EXCESS LIGHTS
21491         CONO DLB,2      ;..
21492         CONO DLB,3      ;..
21493         CONO DLB,DL10AR ;64 WORDS FOR PDP11 #0 AT DL10AR
21494         DATAO DLC,[200001,,]    ;KA INTERRUPT MODE
21495         SKIPE DL10F
21496          CONO DLC,100020+TTYCHN ;ENB PDP11 PORT #0 AND ENB INTR
21497         MOVSI T,1
21498         SKIPN DL10UP
21499          SOJG T,.-1
21500         SKIPGE T        ;IF THE 11 DIDN'T SAY IT WAS UP,
21501          SETZM DL10F    ;MARK IT NON-FUNCTIONAL.
21502 ]
21503 IFN KL10P,[
21504         CONO TIM,460000+3900.   ;SET INTERVAL TIMER TO 39 MILLISECONDS FOR OVHMTR
21505         CONO MTR,433001 ;TIME BASE ON, ACCOUNT FOR USER + EXEC NO PI, INTERVAL PIA=1
21506         PUSHJ P,PRFOFF  ;INIT PERFORMANCE COUNTER
21507 ] ;KL10P
21508 \f
21509 ;DROPS IN
21510         MOVSI T,%TBNOT+%TBDTY+%TBNVR    ;SYS JOB HAS NO CONSOLE ALL TO ITSELF
21511         MOVEI U,LUBLK
21512         PUSHJ P,USSINI  ;INITIALIZE SYS JOB VARIABLES BLOCK
21513          JRST .-1
21514         AOS NMPGS
21515 IFE KA10P,[
21516         MOVEI T,UUOH0   ;CLOBBERED BY USSINI
21517         HRRM T,MUUOKN
21518 ] ;IFE KA10P
21519         MOVSI T,600000
21520         HLLM T,UPGMP    ;GIVE PG 0 TO SYS JOB
21521         MOVSI T,-1
21522         HLLM T,UPGCP
21523         MOVEI T,2000
21524         MOVEM T,HUSRAD
21525         MOVEI T,SYSRCE  ;SET SYS JOB RESOURCE POINTER
21526         MOVEM T,UTMPTR
21527         MOVSI A,(SIXBIT /SYS/)  ;""" NAMES
21528         MOVEM A,USYSNM(U)
21529         MOVEM A,UNAME(U)
21530         MOVEM A,XUNAME(U)
21531         MOVEM A,JNAME(U)
21532         MOVEM A,XJNAME(U)
21533         SETZM USTP(U)
21534         MOVSI T,%TBNOT+%TBDTY+%TBNVR    ;CORE JOB HAS NO CONSOLE
21535         MOVEI U,2*LUBLK
21536         PUSHJ P,USSINI  ;SET UP CORE JOB VARIABLES BLOCK
21537          JRST .-1
21538         MOVE A,[SIXBIT /CORE/]
21539         MOVEM A,USYSNM(U)
21540         MOVEM A,UNAME(U)
21541         MOVEM A,XUNAME(U)
21542         MOVSI A,(SIXBIT /JOB/)
21543         MOVEM A,JNAME(U)
21544         MOVEM A,XJNAME(U)
21545         MOVEI T,SYSRCE
21546         MOVEM T,UTMPTR+LUBLK
21547         SETZM USTP(U)
21548         MOVEI A,CORJI
21549 IFE KA10P, HRLI A,%PSPCU        ;DOES CORE JOB XCTR?
21550         MOVEM A,UPC(U)
21551 IFE KA10P,[
21552         MOVE T,[JSR ILLTRP]     ;SYS AND CORE JOBS SHOULDN'T TRAP
21553         MOVEM T,TR1INS          ;THESE WON'T BE USED ANYWAY UNLESS
21554         MOVEM T,TR2INS          ;SOMEDAY THEY SHOULD RUN IN USED MODE
21555         MOVEM T,TR3INS
21556         MOVEM T,TR1INS+L
21557         MOVEM T,TR2INS+L
21558         MOVEM T,TR3INS+L
21559 ] ;IFE KA10P
21560         MOVEI A,SYSB+2          ;GIVE SYSTEM CORE TO SYS JOB, WITH A COUPLE
21561         MOVEM A,CORRQ           ; SPARE JOB SLOTS
21562         AOS NCORRQ
21563         SOS A
21564         ADDM A,NCBCOM
21565 ;       DATAI CLK1,LCLK1
21566         CONO PI,100+UTCON-1     ;ALL EXCEPT 7
21567 IFN KA10P, CONO 3000+APRCHN
21568 IFN KL10P,[
21569 IFN PDCLKP, CONO CLK,APRCHN
21570 .ELSE [ MOVEI A,%DTCLN  ;TURN ON 60-CYCLE CLOCK
21571         MOVEM A,DTECMD
21572         SETZM DTEFLG
21573         CONO DTE,%DBL11
21574         SKIPN DTEFLG
21575          JRST .-1
21576 ]
21577         CONO APRCHN     ;ENABLE APR FAULT INTERRUPTS
21578         SWPUA           ;UPDATE MEMORY AGAIN TO MAKE SURE DDT + SYMBOL
21579                         ; TABLE OUT OF CACHE
21580         CONSZ 200000
21581          JRST .-1
21582 ] ;KL10P
21583 IFN KS10P,[
21584         WRINT [KSFREQ]          ; 60 cycle clock.
21585         CONO APRCHN             ; Enable APR faults and clock ints.
21586         CLRCSH                  ; Is this necessary?  What the heck...
21587 ] ;KS10P
21588 IFN CH10P,[
21589         CONI CHX,T              ;CHECK CHAOS ADDRESS SWITCHES
21590         LDB T,[$CHXAD,,T]
21591         CAIE T,MYCHAD
21592          JRST [ MOVEI TT,[ASCIZ/CHAOSNET ADDRESS SWITCHES ARE SET WRONG/]
21593                 PUSHJ P,T00ASZ
21594                 JRST DDT ]
21595         CONO CHX,@CHXCNO        ;ENABLE INTERRUPTS
21596 ];CH10P
21597         JRST ICLR
21598 \f
21599 CKML1:                  ;MEM NON-EXISTANT PATCH OUT
21600 IFN KA10P, CONO 10000   ;TURN OFF NXM FLAG
21601 IFN KL10P,[
21602         CONO 22000
21603         MOVEI TT,PFAIL
21604         MOVEM TT,PFNPC
21605         MOVEI TT,UUOH0
21606         HRRM TT,MUUOKN
21607 ] ;KL10P
21608 IFN KS10P,[
21609         CONO 20400
21610         MOVEI TT,PFAIL
21611         MOVEM TT,EPTPFN
21612 ] ;KS10P
21613         SKIPGE CKMBLK
21614          MOVEM A,CKMBLK ;HIGHEST IN BLOCK OF LOSERS
21615 CKML1A: LDB TT,[MUR,,MEMBLT(A)]
21616         CAIE TT,MUFR
21617          BUG            ;?
21618         CAIG A,SYSB+1
21619          JRST 4,.       ;SYS MEM NON EX? (BUG PROBABLY WON'T WORK)
21620         PUSHJ P,MPOUT2  ;FLUSH THAT BLOCK
21621         MOVEI TT,MUHOLE
21622         DPB TT,[MUR,,MEMBLT(A)]
21623         CAIL A,400      ;IF NXM IN LOW MOBY
21624          JRST CKML2
21625         MOVEI U,0
21626         PUSHJ P,UPLC
21627         LDB TT,T
21628         ANDI TT,PMRCM
21629         CAIE TT,(A)
21630          JRST CKML2
21631         DPB U,T         ;PATCH THIS BLOCK OUT OF EXEC MAP
21632         DPB U,Q
21633         JRST CKML2
21634
21635 ; REPORT A BLOCK OF LOSING MEMORY
21636
21637 CKML6:  PUSH P,A
21638         MOVEI TT,[ASCIZ/MEM OFF /]
21639         AOSN CKMFLG
21640          PUSHJ P,T00ASZ
21641         ADDI A,1        ;LOWEST LOSER = HIGHEST WINNER + 1 PAGE
21642         PUSHJ P,T00BKO
21643         MOVEI A,"-
21644         PUSHJ P,T00TYO
21645         MOVE A,CKMBLK
21646         PUSHJ P,T00BKO
21647         MOVEI A,40
21648         PUSHJ P,T00TYO
21649         SETOM CKMBLK
21650         POP P,A
21651         JRST CKML2
21652
21653 USEHM:  -1      ;-1 => USE MEM IN HIGH MOBY (IF PRESET)
21654
21655 CKMBLK: -1      ;IF + HIGHEST LOSING BLOCK IN CONTIG RANGE
21656 CKMFLG: -1      ;IF + PRINTED MESSAGE ALREADY
21657 CKMSWC: 0       ;WRITE CMD
21658 CKMSRC: 0       ;READ CMD.
21659 CKMSSC: 0       ;SEEK CMD.
21660 ;UP TO 8 RANGES OF ADDRESSES THAT SHOULD NOT BE USED BECAUSE THEY
21661 ;DON'T WORK BUT AREN'T NXM.
21662 MEMLZL: BLOCK 8 ;LOWEST LOC
21663 MEMLZH: BLOCK 8 ;HIGHEST LOC+1
21664 FTUTPG: 0       ;FIRST PAGE USED FOR TUTS
21665 \f
21666 ;INPUT CHAR FROM CONSOLE TTY AND ECHO
21667
21668 T00TYI:
21669 IFN KA10P,[
21670         CONSO TTY,40
21671          JRST .-1
21672         DATAI TTY,A
21673         ANDI A,177
21674 ] ;KA10P
21675 IFN KL10P,[
21676         SETZM DTEFLG
21677         MOVEI A,%DTTYI
21678         MOVEM A,DTECMD
21679         CONO DTE,%DBL11
21680         SKIPN DTEFLG
21681          JRST .-1
21682         SKIPN A,DTEF11
21683          JRST T00TYI
21684 ] ;KL10P
21685 IFN KS10P,[
21686         SKIPN A,8CTYIN
21687          JRST .-1
21688         ANDI A,177
21689 ] ;KS10P
21690
21691 ; TYPE CHAR IN A ON CONSOLE TTY
21692
21693 T00TYO:
21694 IFN KA10P,[
21695         CONSZ TTY,20
21696          JRST .-1
21697         DATAO TTY,A
21698 ] ;KA10P
21699 IFN KL10P,[
21700         SETZM DTEFLG
21701         MOVEM A,DTECMD
21702         CONO DTE,%DBL11
21703         SKIPN DTEFLG
21704          JRST .-1
21705 ] ;KL10P
21706 IFN KS10P,[
21707         PUSH P,A
21708         ANDI A,177
21709         IORI A,400
21710         MOVEM A,8CTYOT
21711         CONI A
21712         IORI A,80INT
21713         CONO (A)
21714         SKIPE 8CTYOT
21715          JRST .-1
21716         POP P,A
21717 ] ;KS10P
21718         POPJ P,
21719
21720 ; TYPE BLOCK NO IN A AS HIGH 3 OCTAL DIGITS OF ADDR
21721 ; (ALL MEMORIES MULTIPLE OF 4K.  MAX MEMORY 2M WORDS.)
21722
21723 T00BKO: PUSH P,A
21724         PUSH P,B
21725         LSHC A,-8
21726 REPEAT 3,[
21727         ADDI A,"0
21728         PUSHJ P,T00TYO
21729         MOVEI A,0
21730         LSHC A,3
21731 ]
21732         JRST POPBAJ
21733
21734 ; TYPE ASCIZ IN TT ON T00
21735
21736 T00ASZ: PUSH P,A
21737         HRLI TT,440700
21738 T00AZ1: ILDB A,TT
21739         JUMPE A,POPAJ
21740         PUSHJ P,T00TYO
21741         JRST T00AZ1
21742 \f
21743 IFN DPKPP,[     ;MAP SYSTEM SPEED CODES TO DATAPOINT KLUDGE CODES
21744 DPSP:   0_9     ;134
21745         1_9     ;600
21746         2_9     ;110
21747         3_9     ;150
21748         4_9     ;300
21749         5_9     ;1200
21750         5_9     ;1800 *
21751         6_9     ;2400
21752         7_9     ;4800
21753 REPEAT 20-<.-DPSP>, 7_9 ;FAST *
21754 ];DPKPP
21755
21756 CONSTANTS
21757 VARIABLES
21758
21759 IEND:
21760 .HKALL==0
21761
21762 ; Define location known as start of SALV disk salvager.  If system overruns
21763 ; this address, must either reduce system size or increase the SALV start
21764 ; address.  If SALV is changed, the SALV program must also be changed to
21765 ; start at the right place.  There is a limit to how high it can go,
21766 ; however.
21767 IFN KL10P, SALV==:105*2000      ; MC-KL is getting huge
21768 .ELSE SALV==:100*2000
21769 IFG IEND-SALV,.FATAL System overruns SALV start addr!
21770
21771 IFGE TSYSM-256.,DDT=774000
21772 .ELSE DDT=TSYSM*2000-4000
21773 DSKDMP==DDT+3700
21774
21775 IFG LBUGTB-LBUGT2,[
21776 .ERR MAKE THE BUGTAB BIGGER
21777 INFORM LBUGTB-LBUGT2,\LBUGTB-LBUGT2
21778 .FATAL FATAL ERROR, RUNNING THIS WOULD CAUSE TOTALLY WEIRD BUGS
21779 ]
21780
21781 IF2 EXPUNGE FOO,ZZZQ,FNM,ZCHR,ZZ,ZZZ,BUGB,BUGF,BUGN,BUGNN
21782
21783 END BEG         ;START AT BEG TO SALVAGE AND RUN ITS, START AT GO TO JUST ITS