Consolidate license copies
[its.git] / system / its.1622
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 ;THE FILE "CONFIG" HAS ASSEMBLY SWITCHES AS A FUNCTION OF MACHINE.
40
41 .TTYMAC A
42 IFN ASCII/A/&ASCII/     /,.FATAL USE UPPER CASE!
43 DEFINE MCOND X          ;0 IFF THIS IS MACHINE X.
44 <IFSN X,A,[1]>,TERMIN
45 DEFINE MNAME X          ;USED TO SUBSTITUTE IN THIS MACHINE'S NAME.
46 X!!A!!TERMIN
47 FOO==.TTYFLG            ;MAKE ERR FILE LOOK NICE
48 .TTYFLG==1
49 PRINTX/A
50 /
51 .TTYFLG==FOO
52 TERMIN  ];IF1
53
54 IFNDEF PCLSW,PCLSW==1           ;1 => ASSEMBLE PCLSR TEST FEATURE
55 IFNDEF TT11BY,TT11BY==8         ;PDP11-TV OUTPUT BUFFER BYTE SIZE.
56 .MLLIT==1                       ;MULTI-LINE LITERAL MODE
57 ASTIME==.OP .OPER+@,0,.RTIME    ;GET ASSEMBLY TIME AND DATE IN SIXBIT.
58 ASDATE==.OP .OPER+@,0,.RDATE    ;RH OF INSN MUST BE 0, SO MIDAS WILL PUT IN PROPER AC FLD.
59
60 ;AC DEFS
61
62 A=1
63 B=2
64 C=3
65 D=4
66 E=5
67 TT=6
68 I=7
69 Q=10
70 J=11
71 R=12
72 W=13
73 H=14
74 P=15    ;DO NOT CHANGE! ;PDL POINTER
75 T=16    ;"
76 U=17    ;"              ;USER INDEX
77
78 .XCREF A,B,C,D,E,TT,I,Q,J,R,W,H,P,T,U
79
80 IF1 EXPUNGE APR,OCT,DEC ;FOR NEW CALENDAR HACK
81
82 NULBLK==4       ;NUMBER OF LOCKED SWITCH BLKS IN USR VARIABLES
83                 ;USES 2 WDS OF USER VAR PER
84
85 NPVSEC==30.     ;NUMBER OF SECONDS A USER IS ALLOWED TO BE IN THE PRIVILEDGED SWAPPING CLASS
86 IF2 LIOBLK==<USRSTG+LUBLK*MAXJ+1777>_-10.  ;LOWEST BLOCK NEVER TO BE SHUFFLED
87                         ;ALSO MAX # OF BLOCKS SYS JOB MAY HAVE
88 IF2 MAXJ==<LIOBLK_10.-USRSTG>/LUBLK     ;ROUND UP TO ACTUAL MAX #JOBS
89
90 DIRMAP==1       ;ENABLE DIRECT MAPPING OF HIGH HALF
91                 ;I DON'T THINK IT WORKS TO TURN THIS OFF.
92 NIOCHN==20      ;NUMBER OF I/O CHANNELS PER USER
93 \f
94 DEFINE $INSRT $%$%$%    ;PRINTX MESSAGE WHEN FILE GETS INSERTED
95         .INSRT $%$%$% >
96         PRINTX \    ==> INSERTED:  \
97         .TYO6 .IFNM1
98         .TYO 40
99         .TYO6 .IFNM2
100 PRINTX \
101 \
102 TERMIN
103
104 ;;; CONFIG uses this macro...
105 DEFINE CONC A,B
106 A!B!TERMIN
107
108 $INSRT CONFIG           ;CONFIGURATION SWITCHES FOR ALL KNOWN MACHINES
109
110 $INSRT BITS             ;DEFINITIONS OF MANY BIT NAMES
111
112 ;IN BADBTS => CLASS 2 OR 1 INTERRUPT   ;IN VBDBTS=> CLASS 1 INTERRUPT
113 VBDBTS==%PIB42\%PIVAL\%PIBRK\%PIC.Z\%PI1PR\%PITRP\%PIDCL
114 BADBTS==VBDBTS\%PIMPV\%PIIOC\%PIILO\%PIMAR\%PIDIS\%PIOOB\%PILOS\%PIFET\%PIWRO\%PIPAR\%PITTY\%PIPDL\%PINXI
115
116 UUOMIN==40000,, ;SMALLEST NUM THAT COULD BE A SYSTEM CALL
117 UUOMAX==50000,, ;ONE GREATER THAN LARGEST NUM "
118 UIOT=UUOMAX     ;USE FOR USER I/O INST TRAP
119
120         ;MAX DYN ALLOC ALLOC IO BUFFERS
121 MXIOB==100      ;MAX POSSIBLE
122
123 SIOMT==50       ;MAX SIZE TRANSLATION TABLE
124
125 LUPDL==50       ;LENGTH USER PDL MUST BE >= 40 FOR 2311 GC
126 LUIOP==20       ;LENGTH OF USER IO PDL
127 CPDLL==40       ;LENGTH CLOCK CHANNEL PDL
128 LUTCP==40       ;LENGTH UTC PDL (NETWORKS AND DISKS)
129 LSYSP==100      ;SYSTEM JOB PDL
130 LTTYP==40       ;LENGTH OF TTY (INTERRUPT LEVEL) PDL
131
132 DMNSZ==20       ;# ENTRIES IN DEMON BUFFER (DMNBF)
133
134 MXCZS==5        ;MAX NUMBER ^Z'S PER CLOCK BREAK
135
136 SCLKI==30.      ;60'THS PER SLOW CLOCK
137 VSCLKI==2*60.*60.       ;60'THS PER VERY SLOW CLOCK TICK
138 MXOPT==8.       ;SLOW CLOCK  MAX UT OP CAN TAKE
139 NINFP==8.       .SEE UFIN       ;MAX # OF DIRECT INFERIORS A PROCEDURE MAY HAVE
140
141 SSCHDB==100     ;LENGTH OF SCHEDULER HISTORY BUFFER
142
143 SPD==60.*60.*24.        ;# SECS IN A DAY (FITS IN A HALFWORD)
144         PDUPS==60.      ;# PDCLK INCREMENTS/SEC
145
146 OPNCOM==410300  ;COMMAND FIELD IN LH OF FIRST OPEN WORD
147
148 IFN 340P,N340PB==10.    ;# EXEC PGS USED FOR 340 DATA MUST BE EVEN
149 IFN N11TYS,[
150         NTTPG==6        ;# EXEC PGS FOR PDP11 TV TTYS.
151         NTVBP==11       ;THESE PAGES ADDRESS THE WHOLE VIDEO BUFFER MEMORY ADDRESS
152                         ;SPACE OF THE TV 11.  THE LAST OF THESE ADDRESSES THE
153                         ;TV CONSOLE REGISTER
154 ]
155 NUVPG==256.             ;NUMBER OF VIRTUAL PAGES PER USER.  SIZE OF PAGE TABLE VARS.
156                         ;DON'T TRY TO CHANGE THIS.
157 ;CIRCULAR PAGE LINK FORM
158 ;2.9=0
159 ;1.1-1.8 PAGE #
160 ;2.8-1.9 USER #
161 ;2.9=1
162 ;2.8=0 2.7-1.1 LINK TO MMP TABLE
163 ;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE
164 ;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED
165 \f
166 SUBTTL GOBBLE TTYTYP FILE
167
168 IFN XGP\N11TYS,[IFE TEN11P,[
169         .ERR XGP OR N11TYS WITHOUT TEN11P
170         N11TYS==0
171         XGP==0
172 ]
173 ]
174 IFNDEF UNSPLP,UNSPLP==<TTLPTP+OLPTP+NLPTP>*DEMON*<1-TPLP>
175         ;1 IF THE "UNSPOO" PROGRAM DOES LPT SPOOLING.
176
177 IFNDEF TSYSM,[
178 MNAME PRINTX \NO PARAMS KNOWN FOR , MACHINE.
179 \
180 .INSRT TTY:
181 ]
182
183 IF2,[
184 ;TTY LINES DEFINITIONS
185
186 ;MACRO WHICH RETURNS THE %TY BIT FOR THE CONTROLLER ACCORDING TO THE LINE NUMBER
187
188 DEFINE CNTRLR <N>
189 IRPS F,,[0      NFKSTY  NFETY   NFNTY   NFNVTY  NFDZTY  NFDPTY  NFMTY   NFDLTY  NFSTTY  NF11TY
190    ]NT,,[NOTYS  NKSTYS  NETYS   NNTYS   NNVTTS  NDZTYS  NDPTYS  NMTYS   NDLTYS  NSTTYS  N11TYS
191    ]FG,,[%TYOTY %TYKST  %TYETY  %TYNTY  %TYNVA  %TYDZT  %TYDPK  %TYMTY  %TYDL   %TYSTY  %TY11T]
192  IFGE <N>-F,[IFL <N>-<F+NT>,[FG]]TERMIN TERMIN
193
194 ;MACRO WHICH RETURNS $TTISP, $TTOSP BITS GIVEN BAUD RATES
195
196 DEFINE SPEEDC <IBAUD,OBAUD>
197 <IFB IBAUD,[SPEED1 OBAUD]IFNB IBAUD,[SPEED1 IBAUD]>*%TTISP+<SPEED1 OBAUD>*%TTOSP!TERMIN
198
199 DEFINE SPEED1 <BAUD>
200 IRPS BD,,[0   600 110 150 300 1200 1800 2400 4800 9600 25K 40K 50K 80K
201     ]CD,,[0   1   2   3   4   5    6    7    10   11   12  13  14  15  ]
202 IFSE BAUD,BD,[CD] TERMIN TERMIN
203
204 ;KEYWORD PARAMETERS TO TTY DEFINITION MACROS
205 ; FOR OVER-RIDING DEFAULTS
206 ;SPEED  NUMBER OF BAUDS OUTPUT
207 ;ISPEED NUMBER OF BAUDS INPUT IF DIFFERENT
208 ;TT     LH(TTTYP)       IN ADDITION TO SPEED CODE
209 ;TY     RH(TTYTYP)      IN ADDITION TO CONTROLLER BIT
210 ;TO     LH(TTYOPT)      IN ADDITION TO USUAL CODES FOR TERMINAL TYPE
211 ;TP     RH(TTYOPT)      IN ADDITION TO PAD CODES
212 ;TCT    TCTYP
213 ;HOR    SCREEN WIDTH
214 ;VER    SCREEN HEIGHT
215 ;ROL    LINES PER GLITCH WHEN SCROLLING
216
217 ;DEFINE TTY AS PRINTING.
218 ;IF SPEED IS 110, ASSUME TTY IS TELETYPE,
219 ;MEANING CAN'T BS, STANDARDIZE ALTMODES.
220 ;IF KA10 CONSOLE TTY OR TK10 TTY, NEED PARITY
221 DEFINE TTDPRT N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNPRT,SMARTS=0
222 T!N!$SMT==SMARTS,,
223 T!N!$HOR==80.-IFE 110-SPEED,8
224 T!N!$VER==MOVE
225 T!N!$OPT==TO+%TOOVR+%TOALT+IFN 110-SPEED,[%TOMVB+%TOLWR-%TOALT],,<1+IFE 300-SPEED,[IFE TY&<%TYDIL\%TYRLM>,[3]]>*%TPPCR+TP
226 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>\<IFE N,[IFN NOTYS,[%TTPAR]]>\<IFGE N-NFNTY,[IFL N-<NFNTY+NNTYS>,[%TTPAR]]>,,TY+<CNTRLR N>
227 T!N!$TCT==TCT
228 T!N!$ROL==1
229 TERMIN
230
231 ;DEFINE TTY AS MEMOREX
232 DEFINE TTDMRX N,+SPEED=600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0
233 T!N!$SMT==SMARTS,,
234 T!N!$HOR==HOR
235 T!N!$VER==MOVE
236 T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,4*%TPPLF+6*%TPPCR+TP
237 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
238 T!N!$TCT==%TNMEM
239 T!N!$ROL==1
240 TERMIN
241
242 ;DEFINE TTY AS TERMINET.
243 DEFINE TTDTRM N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0
244 T!N!$SMT==SMARTS,,
245 T!N!$HOR==HOR
246 T!N!$VER==MOVE
247 T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,5*%TPPLF+TP
248 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
249 T!N!$TCT==%TNTRM
250 T!N!$ROL==1
251 TERMIN
252
253 ;DEFINE TTY AS A LPT.
254 DEFINE TTDLPT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=0,HOR=200.,TCT=%TNPRT,SMARTS=0
255 T!N!$SMT==SMARTS,,
256 T!N!$HOR==HOR
257 T!N!$VER==MOVE
258 T!N!$OPT==TO+%TOMVB+%TOOVR,,TP
259 T!N!$TYP==%TTDDI+TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
260 T!N!$TCT==TCT
261 T!N!$ROL==1
262 TERMIN
263
264 ;DEFINE TTY AS AN LA36 DECWRITER.
265 DEFINE TTDLA36 N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=132.,TCT=%TNPRT,SMARTS=0
266 T!N!$SMT==SMARTS,,
267 T!N!$HOR==HOR
268 T!N!$VER==MOVE
269 T!N!$OPT==TO+%TOMVB+%TOOVR+%TOLWR,,TP
270 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
271 T!N!$TCT==TCT
272 T!N!$ROL==1
273 TERMIN
274
275 ;DEFINE TTY AS IMLAC. (RUNNING SOFTWARE-TTY PROGRAM)
276 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
277 T!N!$SMT==SMARTS,,
278 T!N!$HOR==HOR
279 T!N!$VER==VER
280 T!N!$OPT==TO+%TOOVR+%TOLWR+%TOMVB+%TOMVU+%TOERS+%TOLID+%TOCID,,TP
281 T!N!$TYP==%TTDDI+TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
282 T!N!$TCT==TCT
283 T!N!$ROL==ROL
284 TERMIN
285
286 ;DEFINE TTY AS VT52
287 DEFINE TTDVT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNESC,ROL=1,SMARTS=0
288 T!N!$SMT==SMARTS,,
289 T!N!$HOR==HOR
290 T!N!$VER==VER
291 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS,,TP+%TPPTB*<IFE SPEED-9600,[1] .ELSE [3]>
292                                                 ;DIRECT POSITIONING LOSES AT 9600
293 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
294 T!N!$TCT==TCT
295 T!N!$ROL==ROL
296 TERMIN
297
298 ;DEFINE TTY AS H19
299 DEFINE TTDH19 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNH19,ROL=1,SMARTS=0
300 T!N!$SMT==SMARTS,,
301 T!N!$HOR==HOR
302 T!N!$VER==VER
303 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3
304 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
305 T!N!$TCT==TCT
306 T!N!$ROL==ROL
307 TERMIN
308
309 ;DEFINE TTY AS AAA
310 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
311 T!N!$SMT==SMARTS,,
312 T!N!$HOR==HOR
313 T!N!$VER==VER
314 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*2
315 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
316 T!N!$TCT==TCT
317 T!N!$ROL==ROL
318 TERMIN
319
320 ;DEFINE TTY AS C100
321 DEFINE TTDC100 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=79.,VER=24.,TCT=%TNHDS,ROL=1,SMARTS=0
322 T!N!$SMT==SMARTS,,
323 T!N!$HOR==HOR
324 T!N!$VER==VER
325 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3+<IFG SPEED-1200,%TPPCR>
326 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
327 T!N!$TCT==TCT
328 T!N!$ROL==ROL
329 TERMIN
330
331 ;DEFINE TTY AS TEKTRONIX.
332 DEFINE TTDTEK N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNTEK,HOR=73.,VER=35.,SMARTS=0
333 T!N!$SMT==SMARTS,,
334 T!N!$HOR==HOR
335 T!N!$VER==VER
336 T!N!$OPT==TO+%TOMVU+%TOOVR+%TOMVB+%TOLWR+%TOMOR,,TP
337 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
338 T!N!$TCT==TCT
339 T!N!$ROL==0
340 TERMIN
341
342 ;DEFINE TTY AS A LOSING DATAPOINT
343 DEFINE TTDLSR N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,SMARTS=0
344 T!N!$SMT==SMARTS,,
345 T!N!$TCT==%TNODP
346 T!N!$HOR==71.-IFN MCOND AIKA,1  ;OTHER DATAPOINTS HAVE SHORTER SCREENS.
347 T!N!$VER==25.
348 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP
349 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
350 T!N!$ROL==1
351 TERMIN
352
353 ;DEFINE TTY AS DATAPOINT.
354 DEFINE TTDDPT N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=[72.-IFN MCOND AIKA,[1]],SMARTS=0
355 T!N!$SMT==SMARTS,,
356 T!N!$TCT==%TNDP
357 T!N!$HOR==HOR           ;OTHER DATAPOINTS HAVE SHORTER SCREENS.
358 T!N!$VER==25.
359 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP
360 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
361 T!N!$ROL==1
362 TERMIN
363
364 ;DEFINE TTY AS A TELERAY 1061
365 DEFINE TTDRAY N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,SMARTS=0
366 T!N!$SMT==SMARTS,,
367 T!N!$TCT==%TNRAY
368 T!N!$HOR==HOR
369 T!N!$VER==24.
370 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOERS+%TOLWR+%TOLID+%TOCID,,3*%TPPTB+TP
371 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
372 T!N!$ROL==1
373 TERMIN
374
375 ;DEFINE A TTY THAT IS A GT40.
376 DEFINE TTDGT40 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNDP,HOR=72.,VER=32.,ROL=1,SMARTS=0
377 T!N!$SMT==SMARTS,,
378 T!N!$HOR==HOR
379 T!N!$VER==VER
380 T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOOVR+%TOLWR,,TP
381 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
382 T!N!$TCT==TCT
383 T!N!$ROL==ROL
384 TERMIN
385
386 ;DEFINE A TTY THAT IS A LINE TO A PDP11.
387 DEFINE TTD11 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=0,TCT=%TNPRT,HOR=72.,VER=MOVE,ROL=1,SMARTS=0
388 T!N!$SMT==SMARTS,,
389 T!N!$HOR==HOR
390 T!N!$VER==VER
391 T!N!$OPT==TO+%TOMVB+%TOOVR+%TOALT,,TP
392 T!N!$TYP==TT+%TTDDI+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
393 T!N!$TCT==TCT
394 T!N!$ROL==ROL
395 TERMIN
396
397 ;DEFINE A TTY THAT IS RANDOM.
398 DEFINE TTDRAN N,+SPEED=FOO.,ISPEED=,TT=0,TY=0,TO=FOO.,TP=FOO.,TCT=FOO.,HOR=FOO.,VER=FOO.,ROL=FOO.,SMARTS=0
399 T!N!$SMT==SMARTS,,
400 T!N!$HOR==HOR
401 T!N!$VER==VER
402 T!N!$OPT==TO,,TP
403 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
404 T!N!$TCT==TCT
405 T!N!$ROL==ROL
406 TERMIN
407
408 ;DATAMEDIA
409 DEFINE TTDDTM N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS+3*%TPPCR,HOR=80.,VER=24.
410 T!N!$SMT==0
411 T!N!$HOR==HOR
412 T!N!$VER==VER
413 T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOLWR+%TOLID+%TOCID,,TP
414 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
415 T!N!$TCT==%TNDTM
416 T!N!$ROL==1
417 TERMIN
418
419 ;DEFINE A PDP11 TV COMMUNICATING VIA TEN-11 INTERFACE.  NO OPTIONS.
420 DEFINE TTDTV N
421 T!N!$SMT==%TQGRF+%TQVIR+%TQREC+%TQXOR+<.DPB 14,<.BP %TQHGT>>+<.DPB 6,<.BP %TQWID>>,,%TRSCN
422 T!N!$HOR==96.
423 T!N!$VER==45
424 T!N!$OPT==%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI+%TOLID+%TOCID,,%TP11T+%TPRSC
425 T!N!$TYP==%TTLCL+<SPEEDC 9600,9600>,,%TY11T
426 T!N!$TCT==%TNTV
427 T!N!$ROL==4
428 TERMIN
429
430 ;DEFINE A PDP11 TV COMMUNICATING AS A SOFTWARE TTY.  TYPICALLY A GRINNELL (512x512).
431 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
432 T!N!$SMT==SMARTS,,
433 T!N!$HOR==HOR
434 T!N!$VER==VER
435 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI,,TP
436 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
437 T!N!$TCT==TCT
438 T!N!$ROL==ROL
439 TERMIN
440
441 ;DEFINE AN STY LINE.  NO OPTIONS.
442 DEFINE TTDSTY N
443 T!N!$SMT==0,,
444 T!N!$HOR==81.
445 T!N!$VER==MOVE
446 T!N!$OPT==%TOMVB+%TOOVR+%TOLWR+%TORAW,,%TPORS
447 T!N!$TYP==%TYSTY
448 T!N!$TCT==%TNPRT
449 T!N!$ROL==1
450 TERMIN
451
452 DEFINE MCONDX MCHN
453 IFE MCOND MCHN,TERMIN
454
455 ;;; THE NEXT TWO MACROS CAUSE TTYTYP FILE TO BE INSERTABLE BY BOTH
456 ;;; PDP-10 AND PDP-11 PROGRAMS.
457
458 DEFINE .ENDC
459 TERMIN
460
461 DEFINE .ENDR
462 TERMIN
463
464         .CRFOFF
465 $INSRT TTYTYP
466         .CRFON
467 EXPUNGE TTDPRT,TTDTRM,TTDDPT,TTDMRX,TTDGT40,TTD11,TTDRAN,TTDGRN,TTDVT,TTDTEK
468 EXPUNGE TTDTV,TTD2741,TTDSTY,TTDLPT,TTDIML,TTDLA36,TTDLSR
469 EXPUNGE SPEEDC,SPEED1,CNTRLR,MCONDX,.ENDC,.ENDR
470 ]               ;END OF IF2
471 \f
472 SUBTTL BUG MACROLOGY
473
474 ;Macro for reporting a bug or other interesting condition
475 ;Use this in place of JRST 4, especially when condition is automatically
476 ;recoverable or wants explanation typed out for benefit of loser.
477 ;
478 ;First argument is one of the following symbols:
479 ;       INFO - just print on the system console
480 ;       CHECK - same as INFO unless SYSDBG non-zero or buffer full, then same as PAUSE
481 ;       PAUSE - print message, go to DDT, allow alt-P
482 ;       HALT - print message, go to DDT, do not allow alt-P
483 ;       DDT - PAUSE but not because of a bug (shorter message), allow alt-P
484 ;       AWFUL - same as HALT but usable when there is no pdl in P
485 ;         Should there be a combination of AWFUL and PAUSE?
486 ;         That would require restoring P upon attempt to continue
487 ;Arguments after the first are either strings to be printed
488 ;(enclose in brackets), or format,value pairs.  Value is any
489 ;address; indexing and indirection are allowed, however registers
490 ;P and TT may not be referenced.
491 ;A format is one of the following symbols:
492 ;       OCT - octal number, with ,, if bits on in the left halt
493 ;       DEC - decimal number
494 ;       THOU - decimal number with commas every three digits
495 ;       CR - print a carriage return (unfortunately swallows and ignores an arg)
496 ;       SIXBIT - sixbit word
497 ;       ASCIZ - asciz string
498 ;Undefined formats will be taken as strings to be printed.
499 ;The maximum number of value arguments is 6
500 ;A space is printed after each formatted value.  A space is also
501 ;printed after the last string and before any additional formatted values.
502 ;
503 ;With no arguments, BUG may be used in place of JRST 4,.
504 ;It uses the same amount of storage but has the advantage of going
505 ;straight to DDT.  In this case there won't be a specific message
506 ;about what the bug was, of course.
507 ;
508 ;Note that the BUG macro always generates one word of code, and hence
509 ;may be skipped over.
510 ;All registers are preserved.
511 ;P must point at a valid PDL.
512 ;
513 ;Due to Midas inadequacy, the BUG macro may not be used from inside
514 ;a literal.  You will get an error (label inside brackets) if you try it.
515 ;
516 ;Example:
517 ;       BUG PAUSE,[DSK: DRIVE NUMBER ],OCT,Q,[IS OFF-LINE.]
518 ;
519 DEFINE BUG FLAVOR,ARGS/
520 IFNB [FLAVOR][
521         ;Make sure we are not in a literal, since cannot get value of "."
522 BUGBUG: EXPUNGE BUGBUG
523         ;Generate call to appropriate flavour of subroutine
524   ZZ==0
525   IRPS FLA,,[INFO,CHECK,PAUSE,HALT,DDT]SUB,,[BUGINF,BUGCHK,BUGPSE,BUGHLT,BUGDDT]
526     IFSE [FLAVOR]FLA,[
527         PUSHJ P,SUB
528         ZZ==1 ]
529   TERMIN
530   IFSE [FLAVOR]AWFUL, JSR BUGAWF
531   .ELSE IFE ZZ, .ERR "FLAVOR" UNKNOWN FLAVOUR OF BUG
532
533   BUGB==0                       ;Initialize formatting bits
534
535         ;Initialize remote macros
536 DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003*
537 ZZ001!ZZ002!ZZ003!TERMIN
538
539 DEFINE BUGMC4 ZZ001
540 ZZ001
541 TERMIN
542
543   BUGN==0       ;number of accumulated arguments
544   BUGNN==0      ;total number of arguments
545   BUGF==0       ;next thing not argument
546   IRP ARG,,[ARGS]
547     ;; Processing "ARG"
548     IFN BUGF,[                  ;Address of word to print
549      BUGN==BUGN+1
550      BUGNN==BUGNN+1
551      BUGMC5 [ARG]
552      BUGF==0
553      ]
554    .ELSE [                      ;Name of format in which to print?
555     IRPS FMT,,OCT DEC THOU CR UNUSED5 SIXBIT ASCIZ
556       IFSE [ARG]FMT,[
557         BUGF==1
558         BUGB==BUGB+<<.IRPCNT+1>_<<5-BUGNN>*3>>
559         ]
560     TERMIN
561     IFE BUGF,[                  ;Just a string to be printed
562       IFN BUGN,[        ;Say to output some arguments before this string
563         BUGMC3 BUGN
564         BUGN==0
565         ]
566       BUGMC2 [ARG]
567       ] ]
568    TERMIN
569   IFG BUGNN-6, .ERR MORE THAN 6 WORDS TO BE PRINTED IN BUG MACRO
570         ;Make bug table entry: length,,pc ? bits,,string ? args
571   IF1, BUGMC1 'ZZ==[ASCIZ|',,'|]'
572   IF2,[
573    ZZ==.
574    LOC BUGTAB+LBUGTB
575    BUGNN+2,,ZZ
576    BUGMC1 'BUGB,,[ASCIZ|',,'|]'
577    BUGMC4
578    LOC ZZ
579    ]
580   LBUGTB==LBUGTB+BUGNN+2
581 ];end IFNB
582 .ELSE PUSHJ P,BUGNIL
583 TERMIN
584
585 LBUGTB==0       ;Initialize length of bug table
586
587 ;This support macro appends a string to the middle argument of BUGMC1
588 DEFINE BUGMC2 STRING
589 BUGMC1 //,[DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003*
590 ZZ001!ZZ002!]//,STRING!!ZZ003!TERMIN
591 TERMIN
592
593 ;This support macro appends a character, given by number, to the middle
594 ;argument of BUGMC1
595 ;Only for characters 0 through 7
596 DEFINE BUGMC3 #N
597 IRPC C,,.QUOTE/\0\ 1\ 2\ 3\ 4\ 5\ 6\a/
598  IFE .IRPCNT-N,{
599   BUGMC2 C
600   .ISTOP }
601 TERMIN
602 TERMIN
603
604 ;This one is a simple remote macro
605 DEFINE BUGMC5 STR
606 BUGMC4 [DEFINE BUGMC4 ZZ001
607 ZZ001]STR
608 TERMIN
609 TERMIN
610 \f
611 SUBTTL DEFINE PI CHANNELS
612
613 LPTP==OLPTP+NLPTP+GLPTP ;ANY KIND OF LPT EXCEPT A TTY LPT
614 IFE NMTCS,[             ;IF NO MAG TAPES AT ALL
615 TM10A==0                ; CAN'T HAVE ANY KIND!
616 TM10B==0
617 TM03S==0
618 ] ;IFE NMTCS
619 TM10P==TM10A+TM10B      ;SOME KIND OF A TM10 MAGTAPE PRESENT
620 IFN TABP,TABCLK==0      ;1=>PUT TABLET ON CLOCK CHNL
621
622 ;PRIORITY INTERRUPT CHANNEL ASSIGNMENTS
623                 DCCHN==1        ;DC CHANNEL
624                 DCLOC=40+2*DCCHN ;DC INTERRUPT LOCATION
625 IFN IMPP,       IMPCHN==1       ;IMP STUFF
626 IFN NETP,       NETCHN==2       ;SOFTWARE ACTIVATED...
627                 UTCCHN==2       ;UTC CHANNEL
628                 DSKCHN==UTCCHN  ;2314 CHANNEL
629                 MTCCHN==UTCCHN  ;MAG TAPE CONTROL CHANNEL
630                 LPTCHN==4       ;LINE PRINTER, PAPER TAPE, ETC. CHANNEL
631                 TTYCHN==3       ;TTY CHANNEL
632 IFN PLTP,       PLTCHN==4       ;PLOTTER CHANNEL
633 IFN PTRP,       PCHCHN==4       ;PTP CHANNEL
634 IFN PTRP,       PTRCHN==4       ;PAPER TAPE READER CHANNEL
635 IFN NTYP,       NTYCHN==4       ;NTY 11 KLUDGE
636 IFN 340P,       SDCHN==4        ;DISPLAY SPECIAL CHANNEL
637 IFN DSDP,       DSDCHN==4       ;INTERRUPT FROM OTHER PROCESSOR
638 IFN ARMP,       TIPBCH==5       ;ARM TIP BREAK CHNL
639 IFN OMXP,       OMPCHN==5       ;OUTPUT MULTIPLEXOR
640 IFN VIDP,       NVDCHN==5       ;NEW VIDI
641 IFN TABP,       IFE TABCLK,     TABCHN==5       ;TABLET
642 IFN 340P\E.SP,  DISCHN==6       ;DISPLAY DATA CHNL
643 IFN CH10P,      CHXCHN==5       ;CHAOSNET
644                         ;WOULD BE 6 BUT PI 6 BROKEN IN ML-KA TTLIOB
645 IFN CH11P,      CHXCHN==6       ;UNIBUS CHAOSNET PACKET COPYING
646 IFN TABP,       IFN TABCLK,     TABCHN==7       ;TABLET
647                 APRCHN==7       ;DO NOT CHANGE
648
649                 PIOFF==400      ;TURN OFF PI SYSTEM
650                 PION==200       ;TURN ON PI SYSTEM
651                 PICOFF==1200    ;TURN OFF PI CHANNEL
652                 PICON==2200     ;TURN ON PI CHANNEL
653                 PICIRQ==4200    ;REQUEST INTERRUPT ON PI CHANNEL
654                 CLKON==2201     ;ABSOLUTE
655                 CLKOFF==1201
656 IFN OMXP,       OMXON==CLKON\<400_-OMPCHN-1>
657 IFN OMXP,       OMXOFF==CLKOFF\<400_-OMPCHN-1>
658                 LPTON==CLKON\<400_-LPTCHN-1>
659                 LPTOFF==CLKOFF\<400_-LPTCHN-1>
660 IFN PTRP,       PTPON==CLKON\<400_-PCHCHN-1>
661 IFN PTRP,       PTROFF==CLKOFF\<400_-PCHCHN-1>
662 IFN PTRP,       PTRON==CLKON\<400_-PTRCHN-1>
663 IFN PTRP,       PTROFF==CLKOFF\<400_-PTRCHN-1>
664                 TTYON==CLKON\<400_-TTYCHN-1>
665                 TTYOFF==CLKOFF\<400_-TTYCHN-1>
666                 UTCON==CLKON\<400_-UTCCHN-1>
667                 UTCOFF==CLKOFF\<400_-UTCCHN-1>
668 IFN NETP,       NETON==UTCON
669 IFN NETP,       NETOFF==UTCOFF
670 IFN KL10P,      DTEON==CLKON
671 IFN KL10P,      DTEOFF==CLKOFF
672
673         DSKRQ==PICIRQ\PICON\<200_-DSKCHN> ;RQ INT + TURN ON FOR SAKE OF KL
674         MTCRQ==PICIRQ\PICON\<200_-MTCCHN>
675         UTCRQ==PICIRQ\PICON\<200_-UTCCHN>
676         TTYRQ==PICIRQ\PICON\<200_-TTYCHN>
677         CLKRQ==PICIRQ\PICON\<200_-APRCHN>
678 IFN NETP,NETRQ==PICIRQ\PION\<200_-NETCHN>       
679 IFN CH11P,CHXRQ==PICIRQ\PICON\<200_-CHXCHN>
680
681 IFN TABP,[
682 IFN TABCLK,[
683 TABON==CLKON
684 TABOFF==CLKOFF
685 ]
686 IFE TABCLK,[
687 TABON==CLKON\<400_-TABCHN-1>
688 TABOFF==CLKOFF\<400_-TABCHN-1>
689 ]
690 ]
691
692 IFN NUNITS, IFE NEWDTP, CUINT==5000+UTCCHN      ;CONO TO UTC TO ACTIVATE UTAPE INTERRUPT
693
694 PMLCAD==(.BP <PMRCM,,>) ;BYTE POINTER TO L.H. REAL CORE ADR
695 PMRCAD==(.BP PMRCM)     ;BYTE POINTER TO R.H. REAL CORE ADR
696 \f
697 SUBTTL DEFINE DEVICE CODES, IOBFT CHNL NUMBERS
698
699 IFN STKP,       STK==70         ;STANFORD KEYBOARD
700 IFN OLPTP,      OLPT==124       ;LINE PRINTER
701 IFN NLPTP,      NLPT==464
702 IFN TM10P,      MTC==340        ;MAG TAPE CONTROL
703 IFN TM10P,      MTS==344        ;MAG TAPE STATUS
704 IFN VIDP,       NVDX==620       ;NEW VIDI X
705 IFN VIDP,       NVDY==624       ;NEW VIDI Y
706 IFN VIDP,       NVDT==630       ;NEW VIDI T (DEFLECTION DELAY)
707 IFN PLTP,       PLT==654        ;CAL COMP PLOTTER
708 IFN HCLKP,      CLK1==710       ;HOLLOWAY CLOCK
709 IFN HCLKP,      CLK2==714       ; "
710 IFN IMXP,       MPX==574        ;INPUT MULTIPLEXOR
711 IFN OMXP,       OMPX==570       ;OUTPUT MULTIPLEXOR
712 IFN TK10P\NTYP, NTY==600        ;KNIGHT TTY KLUDGE
713 IFN MTYP,       MTY==400
714 IFN DL10P,      DLB==60         ;DL10 BASE
715 .ALSO           DLC==64         ;DL10 CONTROL
716 IFN PDCLKP,     PDCLK==500      ;DE-CORIOLIS CLOCK (FOR ML-KA AND DM, CALENDAR CLOCK)
717 IFN DSDP,       DSDEV==20       ;DE SELECTION AND INTER COM DEVICE
718 IFN DSDP,       DSDEVN==24      ;DE SELECTION DEV (FOR DEVICES YOU DATAO DEV CODE TO DSDEVN)
719 IFN ARMP,       TIPDEV==504     ;TIP BREAK DEVICE
720 IFN RBTCP,      RBTCON==514     ;ROBOT CONSOLE
721 IFN DPKPP,      DPK==604        ;DATA POINT KLUDGE
722 IFN DC10P,      DC0==610        ;2314 DISK CONTROL
723 IFN DC10P,      DC1==614        ;2314 DISK CONTROL
724 IFN RP10P,      DPC==250        ;RP10 DISK CONTROL
725 IFN RH10P,      DSK==270        ;RH10 DISK CONTROL
726 IFN KAIMP,      IMP==460        ; AI-KA/ML-KA/MC-KL IMP interface
727 IFN DMIMP,      FI==424         ; DM IMP hardware
728 IFN NUNITS,[
729 IFN NEWDTP,[
730         DTC==320
731         DTS==324
732 ]               ;END OF IFN NEWDTP
733 ]               ;END OF IFN NUNITS
734
735
736 ;IOBFT CHANNEL NUMBERS - 77 MEANS "FREE"
737
738 IFN NUNITS,     NUTIC==8        ;NUMBER UT IN CHNLS
739 .ELSE           NUTIC==0
740 IFN NUNITS,     NUTOC==8        ;NUMBER UT OUT CHNLS
741 .ELSE           NUTOC==0
742                 NFCLC==NUTIC+NUTOC+1    ;# OF FIRST CORE LINK CHNL
743                 NCLCH==14       ;NUMBER CORE LINK CHNLS
744                 NFNETC==NFCLC+NCLCH     ;# OF FIRST NCP NET CHNL (if any)
745                                         ;NNETCH DEFINED IN CONFIG
746 IFG NFNETC+NNETCH-77, .ERR TOO MANY IOBFT CHANNELS
747 \f
748 SUBTTL RANDOM DEFINITIONS FOR I/O DEVICES
749
750 IFN DSDP,       IFN VIDP,       DSNVID==200000,,        ;DEASSIGN BIT FOR NVD
751 IFN DSDP,       IFN 340P,       DSNDIS==4000,,  ;DEASSIGN BIT FOR DIS
752 IFN DSDP,       IFN NMTCS,      DSMTC==1,,      ;DEASSIGN BIT FOR MAG TAPE
753
754 IFN RBTCP,      RLTSWC==17      ;ROBOT CONSOLE SELECT FOR LIGHTS AND SWITCHES
755 IFN RBTCP,      IFN TABP,       RTABC==16       ;ROBOT CONSOLE SELECT FOR TABLET
756
757 IFN IMXP,       LCHN==177       ;MULTIPLEXOR LIMIT ON READ IN
758
759                 NUDCH==14       ;NUMBER DIRECTORY CHNLS
760 IFN IMXP,       NPOTCH==20.     ;NUMBER POT CHANNELS
761 IFG NQCHN+1+NQS-77, .ERR MORE THAN 6 BITS OF DISK CHANNEL NUMBER
762
763 IFN CODP,       CODBFL==5       ;CODE BUFFER
764 IFN PTRP,       PUNSIZ==20      ;PTP BUF SIZ
765 IFN PTRP,       REDSIZ==200     ;PTR BUF SIZ
766 IFN PLTP,       LPLBUF==200     ;PLT BUF SIZ
767 IFN LPTP,       LPTBSZ==1000    ;LPT BUF SIZ
768 IFN VIDP,       NVDLNG==340     ;NVD BUF SIZE
769 IFN TPLP,       TPLBSZ==100     ;TPL BUFFER SIZE IN SYS JOB
770 IFN TABP,       LTABBF==100     ;TABLET BUFFER
771 IFN N11TYS,     TT11CR==764044  ;UNIBUS ADR OF TV11 CONSOLE REG
772
773 EOFCH==3        ;SYSTEM END OF FILE CHR
774 EOFWRD=REPEAT 5,[EOFCH_<.RPCNT*7+1>\]0  ;WORD OF EOFCH'S
775
776 IFN 340P,       DVEF==4000      ;DISPLAY VERTICAL EDGE FLAG
777 IFN 340P,       DHEF==1000      ;DISPLAY HOR EDGE FLAG
778
779 IFN 340P,       EWRT==400./12.  ;EQIV "COST" IN DISPLAY WRDS FOR TRIP THRU RECYC
780 IFN 340P,       MDISWD=70000    ;MAX # WDS SENT TO SCOPE IN 1/2 SEC
781
782 NSWPV==E.SP\340P+VIDP+IMXP      ;# OF DEVICES THAT CAN SWAPIN PAGES
783
784 IFN C1MXP,[
785 IFN NMTCS,      MAGLOC==76      ;INTERRUPT LOCS FOR MAGTAPE
786 IFN NUNITS,     DCMLOC==74      ;"      "    FOR DC
787 IFN IMXP,       IMXLC==66       ;"     "   IMX
788 IFN IMPP,[
789                 IMPILC==70      ;INPUT FROM IMP
790                 IMPOLC==72      ;OUTPUT TO IMP
791 ]
792 ]
793
794 IFE C1MXP,[
795 IFN NMTCS,      MAGLOC==42
796 IFN NUNITS,     DCMLOC==42
797 ]
798 IFN PLTP,[
799 ;PLOTTER CONTROL BITS
800 SD==4000
801 PD==10000
802 PUP==200
803 PDN==400
804 SDC==20000
805 PDC==40000
806 SDS==1000
807 PDS==2000
808 ]
809 \fIFN KA10P,[
810
811 SUBTTL STUFF PECULIAR TO KA-10 PROCESSOR
812
813 ;;;PAGING BOX INSTRUCTIONS
814
815 LPM=102000,,    ;LOAD PG MEM STATE VECTOR DONT CLR ASSOC MEM
816 LPMR= LPM 2,    ;CLEAR ASSOC MEM AND LOAD
817 SPM= LPM 1,     ;STORE PG MEM STATE VECTOR
818 LPMRI=LPM 6,    ;LOAD PM, CLEAR ASSOC REG, AND CAUSE INTERRUPT
819 EXPGNG==4       .SEE UPQUAN     ;4 TO TURN ON EXEC PAGING
820 XCTR=103000,,   ;EXECUTE INSTRUCTION WITH MAPPING CONTROLLED BY AC FIELD
821                 ;VIOLATION CAUSES USER MEM PROTECT INTERRUPT UNLESS INHIBITED
822                 ;VIOLATION ALSO SKIPS BUT THIS IS OF NO CONSEQUENCE UNLESS
823                 ;INTERRUPT IS INHIBITED SINCE PC WILL BE RESET FROM OPC
824 XCTRI= XCTR 4,  ;XCTR WITH PAGE FAULT INHIBITED (SKIPS ON FAULT)
825                 ; AC FIELD VALUES FOR XCTR AND XCTRI
826         XR==1   ;MAP READ MAIN OPERAND OF SIMPLE INSTRUCTION (MOVE, SKIPL, HLL)
827         XW==2   ;MAP WRITE MAIN OPERAND OF SIMPLE INSTRUCTION (MOVEM)
828         XRW==3  ;MAP READ/WRITE OPERAND OF SIMPLE INSTRUCTION (E.G. IORM)
829         XBYTE==3;MAP BYTE DATA AND BYTE POINTER (ILDB, IDPB)
830         XBR==1  ;MAP BLT READ
831         XBW==2  ;MAP BLT WRITE
832         XBRW==3 ;MAP BOTH OPERANDS OF BLT
833                 ;KA10 PAGING BOX GOES BY WHETHER IT'S A READ OR WRITE (OR RW) CYCLE
834                 ;KL10 PAGING BOX WORKS DIFFERENTLY (SEE BELOW)
835                 ;DO NOT USE MULTI-OPERAND INSTRUCTIONS (DMOVE, PUSH, ETC.) WITH XCTR
836
837 DEFINE CLRPGM U ;CLEAR PAGER ASSOCIATIVE MEMORY.  ARG IS USUALLY "(U)".
838  SPM UPGML!U    ;STORE SO DON'T LOSE QUANTUM TIMER
839  LPMR UPGML!U
840 TERMIN
841
842 ;;; MISCELLANEOUS BUILTIN I/O DEVICES
843
844 PI==4           ;INTERRUPT SYSTEM
845 LIGHTS==PI      ;DEVICE CODE FOR DATAO THAT SETS CONSOLE LIGHTS.
846 CLK==0          ;DEVICE CODE FOR 60 HZ CLOCK INTERRUPT (APR)
847 CLKINT==1000    ;CONI CLK, BIT FOR INTERRUPT.  ALSO CONO BIT TO CLEAR.
848 PTR==104        ;PAPER TAPE READER
849 PTP==100        ;PAPER TAPE PUNCH
850 TTY==120        ;CONSOLE TTY
851 DTC==320        ;DECTAPE CONTROL
852 IFN 340P, DIS==130      ;340 DISPLAY
853
854 PI0LOC==40      ;INTERRUPT VECTOR BASE
855
856 OIPBIT==%PC1PR  ;PC BITS FOR 1-PROCEED.
857 BADPC==%PCUIO+%PCSPC+37 ;BITS IN PC USER NOT ALLOWED TO TURN ON
858
859 DEFINE UUOH     ;UUO HANDLER LOCATIONMS ARE REFERENCED THROUGH THESE MACROS
860 XUUOH!TERMIN
861
862 DEFINE FORTY
863 40!TERMIN
864
865 DEFINE SYSCTX   ;SET UUO LEVEL AC BLOCKS
866 TERMIN
867
868 DEFINE USRCTX   ;SET USER-MODE AC BLOCKS
869 TERMIN
870
871 DEFINE OVHMTR NAME      ;OVERHEAD METERING DOESN'T WORK ON KA'S
872 TERMIN
873 ]               ;END OF IFN KA10P
874 \fIFN KL10P,[
875
876 SUBTTL STUFF PECULIAR TO KL-10 PROCESSOR
877
878 ;;;PAGING BOX INSTRUCTIONS
879
880 XCTR=074000,,   ;EXECUTE INSTRUCTION WITH MAPPING, PAGE FAILS ENABLED
881 XCTRI=075000,,  ;SAME BUT SKIPS IF THERE IS PAGE FAIL (DONE SNEAKILY BY SOFTWARE)
882 LPMR=076000,,   ;LOAD PAGER MEMORY (JPC, DBRS) AND CLEAR PT DIR
883 SPM=077000,,    ;STORE PAGER MEMORY
884                 ;AC FIELD VALUES FOR XCTR AND XCTRI
885         XR==4   ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING)
886         XW==4   ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR WRITING)
887         XRW==4  ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING AND WRITING)
888         XBYTE==5;MAP BYTE DATA AND BYTE POINTER
889         XBR==1  ;MAP BLT SOURCE
890         XBW==4  ;MAP BLT DESTINATION
891         XBRW==5 ;MAP BOTH BLT OPERANDS
892         XEA==16 ;MAP EFFECTIVE ADDRESS COMPUTATION
893                 ;IN KL10 BITS ARE:  14 INDIRECT WORDS
894                 ;                   10 XR UNDER SOME RANDOM WIERD CONDITIONS (?)
895                 ;                    4 MAIN OPERAND "  "  " ALSO BYTE WRITE
896                 ;                    2 INDEX REGISTER, @ AND XR IN BYTE PTRS
897                 ;                    1 2ND OPND - BLT SOURCE, BYTE READ, STACK DATA
898
899 DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS.  ARG IS USUALLY "(U)".
900  CONO PAG,660000+<EPT/1000>
901 TERMIN
902
903 ;;; INTERNAL "I/O" DEVICES
904
905 PI==4           ;INTERRUPT SYSTEM
906 PAG==10         ;CONO, DATAO PAG SET UP PAGING
907  ..D010==0      ;FOR DDT
908 CCA==14         ;CACHE OPERATIONS
909 TIM==20         ;TIMER DEVICE
910 MTR==24         ;METERS DEVICE
911
912 IFN PDCLKP,[    ;IF THIS KL-10 HAS FREEMAN KL-UDGE BOARD,
913 LIGHTS==500     ;DATAO LIGHTS, SETS CONSOLE LIGHTS.
914 CLK==500        ;60 HZ CLOCK INTERRUPT (ON KL-UDGE BOARD)
915 CLKINT==10      ;CONI CLK, BIT FOR INTERRUPT.  ALSO CONO BIT TO CLEAR.
916                 ;ALSO DATAI 500, IS THE DECORIOLIS CLOCK.
917                 ;AND CONO 500,400000 TURNS CLOCK BACK ON AFTER POWER FAIL.
918 ]
919
920 OIPBIT==%PS1PR  ;1-PROCEED BITS IN THE PC.
921 BADPC==%PSUIO+37        ;%PSPUB IS OK?
922
923 ;;; SPECIAL INSTRUCTIONS
924
925 SWPIA=DATAI CCA,        ;INVALIDATE WHOLE CACHE
926 SWPIO=CONI CCA,         ;INVALIDATE ONE PAGE OF CACHE
927 SWPUO=CONSO CCA,        ;UNLOAD ONE PAGE OF CACHE
928 SWPUA=DATAO CCA,        ;UNLOAD WHOLE CACHE
929 WRPAE=702100,,          ;WRITE PERFORMANCE-COUNTER ENABLES
930 APRID==BLKI             ;READ CPU SERIAL NUMBER AND OPTIONS
931 RDERA=BLKI PI,          ;READ ERROR ADDRESS
932 RCCL=DATAI TIM,         ;READ CALENDAR CLOCK (DOUBLE WORD)
933 RPERFC=BLKI TIM,        ;READ PERFORMANCE COUNTER (DOUBLE WORD)
934 REBOXC=DATAI MTR,       ;READ EBOX CYCLE COUNTER (DOUBLE WORD)
935 RMBOXC=BLKI MTR,        ;READ MBOX CYCLE COUNTER (DOUBLE WORD)
936
937 ;;;EPT LOCATIONS
938
939 $INSRT EPT
940
941 ;;;PAGE FAIL WORD - UPFW(U)
942
943  %PF==1,,405000
944  %PFUSR==400000         ;USER PAGE
945  %PFCOD==370000         ;FAILURE CODE:
946   %PFPRO==210000        ;PROPRIETARY VIOLATION
947   %PFMAR==230000        ;MAR BREAK
948   %PFILW==240000        ;ILLEGAL WRITE IN READ ONLY
949   %PFPNA==330000        ;PAGE NO ACCESS
950   %PFPTP==250000        ;PAGE TABLE PARITY
951   %PFPAR==360000        ;PARITY ERROR, DATA IN AR
952   %PFPRX==370000        ;PARITY ERROR, DATA IN ARX
953  %PFPUB==4000           ;PUBLIC PAGE
954  %PFCCH==2000           ;CACHED
955  %PFPAG==1000           ;PAGED
956  $PFPNO==121000         ;VIRTUAL PAGE NUMBER
957                         ;1.1-3.5 VIRTUAL ADDRESS
958
959 DEFINE UUOH     ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS
960 XUUOH(U)TERMIN
961
962 DEFINE FORTY
963 MUUODP(U)TERMIN
964
965 ;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR) OLDACS,
966 ; UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME FOR UPT.
967 ; DISABLE, IF NONBLANK, CAUSES ACCOUNTING UPDATING NOT TO BE DONE EVEN THOUGH
968 ; UPT IS BEING SET.
969 DEFINE SPCCTX CURACS,OLDACS,UPT,DISABLE
970 DATAO PAG,[IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+2^13+CURACS_33+OLDACS_30+UPT/1000+400000-IFNB UPT,[IFB DISABLE,[400000]]]
971 TERMIN
972
973 SYSCTX=SPCCTX 0,1       ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1.
974 USRCTX=SPCCTX 1,1       ;USERS RUN IN BLOCK 1.
975 IRPC N,,[234567]
976  AC!N!CTX=SPCCTX 0,N    ;CUR AC 0, PREV N.  USE XCTR TO ACCESS SPECIAL ACS
977 TERMIN
978
979 ;AC BLOCK USAGE:
980 ; 0   ACCUMULATORS FOR SYSTEM (AT UUO LEVEL)
981 ; 1   ACCUMULATORS FOR USER
982 ; 2   USED TEMPORARILY BY TTY INPUT INTERRUPTS
983 ; 3-5 NOT USED
984 ;     BLOCKS 2 & 3 ARE USED BY THE UNFINISHED MUSIC MICROCODE
985 ;     BLOCKS 4 & 5 ARE USED BY THE UNFINISHED JPC RING FEATURE
986 ; 6-7 USED BY MICROCODE
987 ]               ;END OF IFN KL10P
988 \fIFN KS10P,[
989
990 SUBTTL STUFF PECULIAR TO THE KS-10 PROCESSOR
991
992 EPT==:0                         ; This MUST agree with the Salvager!
993 HSB==:500
994 $INSRT KSDEFS
995
996 DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS.  ARG IS USUALLY "(U)".
997  WREBR 20000+<EPT/1000>
998 TERMIN
999
1000 OIPBIT==1000            ;BIT 8 (SYMBOLIC NAME %PSINH)
1001 BADPC==%PSUIO+37        ;BITS IN PC THAT USER CANNOT TURN ON
1002
1003 DEFINE UUOH     ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS
1004 XUUOH(U)TERMIN
1005
1006 DEFINE FORTY
1007 MUUODP(U)TERMIN
1008
1009 ;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR)
1010 ; OLDACS, UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME
1011 ; FOR UPT.
1012 DEFINE SPCCTX CURACS,OLDACS,UPT
1013 WRUBR [IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+CURACS_33+OLDACS_30+UPT]
1014 TERMIN
1015
1016 SYSCTX=SPCCTX 0,1       ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1.
1017 USRCTX=SPCCTX 1,1       ;USERS RUN IN BLOCK 1.
1018 IRPC N,,[234567]
1019  AC!N!CTX=SPCCTX 0,N    ;CUR AC 0, PREV N.  USE XCTR TO ACCESS SPECIAL ACS
1020 TERMIN
1021
1022 ;AC BLOCK USAGE:
1023 ; 0   ACCUMULATORS FOR SYSTEM (AT UUO LEVEL)
1024 ; 1   ACCUMULATORS FOR USER
1025 ; 2   USED TEMPORARILY BY TTY INPUT INTERRUPTS
1026 ; 3-6 NOT USED
1027 ; 7   USED BY MICROCODE (AC0 GETS BAD DATA WHEN MEMORY ERROR OCCURS, THIS
1028 ;     COULD BE FIXED IF ANYONE THINKS IT IS WORTH IT...)
1029 ]               ;END OF IFN KS10P
1030
1031 IFE KS10P,[     ; For the benefit of processors without UMOVE and UMOVEM.
1032
1033 DEFINE UMOVE (AC,ADDR)
1034 XCTR XR,[MOVE AC,ADDR]
1035 TERMIN
1036
1037 DEFINE UMOVEM (AC,ADDR)
1038 XCTR XW,[MOVEM AC,ADDR]
1039 TERMIN
1040
1041 ] ;IFE KS10P
1042 \f
1043 SUBTTL SYS IOC STATUS WORD FORMAT
1044
1045 ;RIGHT HALF WORD DEVICE STATUS
1046 ;1.1-1.6 SYS PHYSICAL DEVICE CODE
1047 ;1.7-1.9 OPEN MODE
1048 ;2.1 SYS BUFF CAP FULL
1049 ;2.2 "   "    "  EMPTY
1050 ;2.9-2.3 DEVICE DEPENDANT
1051
1052 ;LEFT HALF WORD CHANNEL STATUS 
1053 ;3.6-3.1 SET BY OPENS THAT DONT SKIP
1054 ;4.5-3.7 SET BY IOC ERRORS (INTERRUPTS) AT IOT OR OPER TIME
1055  ;3.9-3.7 ARE FOR 340 OR E&S ERRORS
1056  ;4.5-4.1 ARE FOR OTHER DEVICES
1057 ;A LIST OF ERROR CODES FOR OPEN FAILURES ARE IN THE FILE  BITS.
1058
1059 NDOPL==7        ;NUM OF DIS OPNL
1060
1061 ;4.5-3.7 SET BY IOC ERRORS AT IOT OR OPER TIME
1062
1063 ;3.9-3.7 SET BY 340 ROUTINES
1064 ;1 ILLEGAL SCOPE MODE
1065 ;2 SCOPE HUNG
1066 ;3 MORE THAN 1K SYS SCOPE BUF
1067 ;4 MEMORY PROTECT
1068 ;5 ILLEGAL SCOPE OP
1069 ;6 MEMORY PROTECT ON PDL POINTER
1070 ;7 ILLEGAL PARAMETER SET
1071
1072 ;4.5-4.1
1073 ;DECIMAL CODE
1074 ;13 DIRECTORY'S ALLOCATION EXHAUSTED
1075 ;12 DIRECTORY FULL
1076 ;11 ILLEGAL CHR AFTER ^P ON TTY DISPLAY
1077 ;10 CHNL IN ILLEGAL MODE WHEN .IOT ATTEMPTED
1078 ;9 DEVICE FULL
1079 ;8 CHANNEL NOT OPEN
1080 ;7 USR OP CHNL DOES NOT HAVE USR OPEN
1081 ;6 ATTEMPT TO OVER IOPUSH
1082 ;5 ATTEMPT TO OVER IOPOP
1083 ;4 NON-EXISTANT SUB DEVICE
1084 ;3 NON-RECOVERABLE DATA ERROR ;NON-EX-MEM ON PDP6 REF
1085 ;2 END OF FILE
1086 ;1 DEVICE HUNG OR REPORTING NON-DATA ERROR
1087
1088 MIOTER==1       ;LOWEST IOCERR CODE USED
1089 NIOTER==13.     ;NUMBER "  "
1090
1091 ;4.9-4.5 ALWAYS ZERO (USED BY IOPUSH FOR CHNL NUM)
1092 \f
1093 ;SYS PERIPHERAL DEVICE CODES
1094
1095 ;1.6 INDICATES DIRECTORY DEVICE
1096 ;1.5 INDICATES NON PHYSICAL DEVICE
1097
1098 SNTTY==1
1099 SNTDS==2        ;TERMINAL DISPLAY
1100 SNLPD==3        ;DATA PRODUCTS LPT
1101 SNVID==4
1102 SNBAT==5
1103 SNPLT==6
1104 SNPTP==7
1105 SNIMPX==10
1106 SNOMPX==11
1107 SNPTR==12
1108 SN340==13       ;340 AS ASCII DEVICE
1109 ;SN340I==14     ;INTERPRETED DISPLAY ON 340
1110 SNMTC==15       ;MAGTAPE
1111 SNCOD==16       ;CODE DEVICE
1112 SNTAB==17
1113 SNNUL==21
1114 SNJOB==22
1115 SNBOJ==23
1116 SNSPY==24
1117 SNSTY==25
1118 SNNET==26       ; Arpanet NCP
1119 SNLPV==27       ;VOGUE LPT
1120 SNSTK==30       ;STANFORD KEYBOARD
1121 SNMSP==31       ;CROCK "IPC" FOR NOW
1122 IFN CHAOSP,SNCHA==32    ;CHAOS NET
1123 IFN TCPP,SNTCP==33      ; Internet TCP/IP network device
1124 SNTRAP==34      ;TRAP "DEVICE"
1125 IFN INETP,SNIPQ==35     ; Internet Queue
1126 SNUTC==41
1127 SN2311==43
1128 SNFUSR==60
1129 SNUSR==61
1130 SNCLK==62       ;CLO, CLU, & CLI
1131 SNDIR==63
1132 SNPDP==64       ;PDP6
1133 SNDIRH==65      ;DIRHNG "DEVICE"
1134 \f
1135 SUBTTL SYSTEM VERSION NUMBER & MISC MACROS
1136
1137 ITSMCH==:<MNAME SIXBIT/,/>      ; Define SIXBIT machine name symbol
1138 ITSVRS==:.FNAM2 ; Preserve SIXBIT symbol value of ITS version #
1139 FNM==ITSVRS     ;SRI GETS VERSION NUMBER
1140                 ;WORKS FOR DECIMAL IGNORES LOW ORDER NON-NUMERIC CHRS
1141 DEFINE VNAM
1142 .TAG FOO
1143         ZZZQ==FNM&77
1144         IFGE ZZZQ-'0,IFLE ZZZQ-'9,.GO BAR
1145         FNM==FNM_-6
1146         .GO FOO
1147 .TAG BAR
1148         ZZZQ==1
1149         SRI==0
1150 .TAG MUM
1151         IFE FNM,.GO END
1152         ZCHR==FNM&77-'0
1153         IFL ZCHR,.GO END
1154         IFG ZCHR-9,.GO END
1155         SRI==SRI+ZZZQ*ZCHR
1156         ZZZQ==ZZZQ*10.
1157         FNM==FNM_-6
1158         .GO MUM
1159 .TAG END
1160         TERMIN
1161
1162 IF1 VNAM
1163
1164 DEFINE SRITYP A
1165 ZZZ==10 ;SAVE OLD RADIX
1166 RADIX 10.
1167         MOVEI I,[MNAME [.ASCII ?
1168 ] ITS !SRI A?]
1169 RADIX ZZZ
1170         TERMIN
1171
1172                 ;"MONTHS OF THE YEAR" MACRO
1173
1174 DEFINE MNIRP A
1175 IRPS M,,[JAN:FEB:MAR:APR:
1176 MAY:JUN:JUL:AUG:
1177 SEP:OCT:NOV:DEC:]L,,[31. 29. 31. 30.
1178 31. 30. 31. 31.
1179 30. 31. 30. 31.]
1180 A
1181 TERMIN
1182 TERMIN
1183
1184 FOO==-1 ;ACCUMULATED VALUE FOR FOLLOWING DEFINITION:
1185
1186 MNIRP [M==FOO
1187 FOO==FOO+L]     ;JAN=-1, FEB=30., MAR=59., ETC.
1188 \f
1189 DEFINE INFORM A,B
1190 IF1,[PRINTX \A = B
1191 \]TERMIN
1192
1193 ZZZ==10
1194 RADIX 10.
1195 INFORM VERSION,\SRI
1196 RADIX ZZZ
1197
1198 SSYS==0 ;LENGTH OF SYS CODE
1199
1200 DEFINE EBLK
1201 IFN CKPAR,.ERR LOSS AT EBLK
1202 CKPAR==1
1203 IFE .-CKZZ,.STOP                ;NO WORDS BETWEEN BBLK AND EBLK
1204 CONC CK,\CKNUM,==CKZZ-.,,CKZZ
1205 CKNUM==CKNUM+1
1206 SSYS==SSYS+.-CKZZ
1207 TERMIN
1208
1209 DEFINE BBLK
1210 CKZZ==.
1211 IFE CKPAR,.ERR LOSS AT BBLK
1212 CKPAR==0
1213 TERMIN
1214
1215 CKPAR==1
1216 CKNUM==0
1217
1218
1219 ;INSERT CALL TO THIS MACRO AT ANY PLACE IT IS POSSIBLE TO PCLSR
1220 ;(IF IT IS DESIRED FOR PCLSR TEST FEATURE TO TEST THAT SECTION)
1221
1222 DEFINE PCLT
1223 IFN PCLSW,[
1224         SKIPE PCLDBM
1225         PUSHJ P,PCLTST
1226 ]
1227 TERMIN
1228
1229 DEFINE  PCLTH A
1230 IFN PCLSW,[
1231         SKIPN PCLDBM
1232         JRST .+3
1233         PUSHJ P,PCLTSH
1234         A
1235 ]
1236 TERMIN
1237
1238 DEFINE  PI2SAF
1239         CONSO PI,20000
1240          CONSO PI,40
1241           CAIA
1242            JRST 4,.     ;PI 2 NOT OFF AND NOT IN PROGRESS
1243 TERMIN
1244 \f
1245 SUBTTL DEFINE EXEC PAGES
1246
1247 EXPGN==0
1248
1249 DEFINE EXECPG X
1250 X==EXPGN
1251 EXPGN==EXPGN+1
1252 ZZQ==<X+1>&1
1253 ZZQQ==X_-1
1254 .!X==220000*ZZQ+2200,,ZZQQ
1255 TERMIN
1256
1257 ;EXEC MAP ASSIGNMENTS
1258 IFN 340P,[
1259 EXECPG 340P1,   ;USED TO FETCH + TRACE 340 PNTRS
1260 EXECPG 340P2,
1261 REPEAT N340PB,CONC [EXECPG DPG]\.RPCNT,;        ;DATA AREA PNTRS FOR 340 DATA
1262 ]
1263 EXECPG CORJF,   ;CORE JOB FROM PAGE
1264 EXECPG CORJT,   ;CORE JOB TO PAGE
1265 IFN VIDP,[
1266 EXECPG VSB1,    ;.VSCAN B1
1267 EXECPG VSB2,    ;.VSCAN B2
1268 ]
1269 IFN TEN11P,[
1270 EXECPG T11CP,   ;TEN11 CONTROL PAGE
1271 ]
1272 EXECPG PAREP,   ;USED BY SYSTEM IN ITS DILIGENT EFFORTS TO FIX PARITY ERRORS
1273
1274 IFN ECCMEM, EXECPG ECCPG,       ;PAGE USED TO ACCESS ECC HISTORY
1275
1276 IFN XGP,[
1277 EXECPG XGPC,    ;LOW 2K OF XGP PDP-11   (USED TO TRACE BUFF POINTERS)
1278 EXECPG XGPB,    ;2K BUFFER IN PDP-11 (CHANGES LOCATION)
1279 EXECPG XGPUB,   ;XGP USER CORE EXEC PG SETUP TO POINT TO USER CORE DURING XGPIM SYSTEM CALL
1280 ]
1281 IFN N11TYS,[
1282 REPEAT NTTPG,[CONC [EXECPG TTPG]\.RPCNT,
1283 ]
1284 REPEAT NTVBP,[CONC [EXECPG TTR]\.RPCNT,
1285 ]]
1286 IFN CHAOSP,[ IFN T11CHP,[
1287 EXECPG CHSPG    ;CHAOS NET 10-11 COMMUNICATION PAGE
1288 T11CHS=400000+CHSPG*2000
1289 ]] ;CHAOSP, T11CHP
1290 ;^ INSERT NEW EXEC PAGES HERE
1291 ;EXEC PAGES BELOW THIS POINT WILL BE COPYABLE BY USERS
1292 REPEAT NMMP,CONC [EXECPG MMP]\.RPCNT,;  ;MMP TABLE
1293  MMP=MMP0*2000+400000   ;VIRTUAL ADDRESS OF MMP
1294 EXPUNGE EXECPG
1295 NEXPGS==EXPGN   ;# EXEC PGS USED
1296 \f
1297 SUBTTL LOW CORE
1298
1299 .YSTGWD         ;STORAGE WORDS OKAY NOW
1300
1301 IFN KL10P, LOC EPT+1000         ;KL needs a full DEC page for EPT
1302 IFN KS10P,[
1303  IFE KSIMP, LOC EPT+1000        ;KS needs a full DEC page, too,
1304  IFN KSIMP, LOC EPT+2000        ; unless you are losing even worse.
1305 ]
1306
1307 PATB=.
1308 LOC 20
1309         BBLK
1310
1311 IFN KS10P,[
1312 LOC 30                          ; 8080 communications area
1313         EBLK
1314 ] ;IFN KS10P
1315
1316 IFN TM10B,[
1317         LOC 30
1318         EBLK
1319 MICWA:  MIOWD
1320         0
1321 IFE RP10P+RH10P,BBLK
1322 ]
1323 IFN RP10P+RH10P,[
1324         LOC 32
1325 IFE TM10B,EBLK
1326 QICWA:  QIOWD
1327         0
1328 IFN QRDCMP,[
1329 RCICWA: 0
1330         0
1331 ];QRDCMP
1332         BBLK
1333 ]
1334 IFN E.SP,[
1335         LOC 34
1336         E.SPM   ;POINTER , NEVER CHANGES
1337 ]
1338
1339 IFE KS10P,[
1340 LOC 37
1341         EBLK
1342 ] ;IFE KS10P
1343
1344 LOC 41
1345 IFN KA10P, JSR UUOH     ;UUO TRAP
1346 IFE KA10P, JSR LUUOEX   ;USER UUO IN EXEC MODE (ERROR)
1347
1348 LOC PI0LOC+2
1349         REPEAT 2,       JSR RINT1
1350         REPEAT 6*2,     JSR RINT        ;INITIALIZE ANY UNUSED PI LOCNS
1351
1352 LOC 61
1353 IFN KA10P, JSR 60H              ;60 TRAP
1354 IFN C1MXP, REPEAT 2*7., JSR RINT1       ;INITIALIZE C1MPX LOCNS
1355
1356 LOC PI0LOC+2*APRCHN
1357         JSR CLKBRK      ;PROCESSOR OR CLOCK INTERRUPT
1358         JRST 4,.
1359
1360 LOC PI0LOC+2*LPTCHN
1361         JSR LPTBRK      ;LPT,DISPLAY,PTP,PTR,OTHER PROCESSOR
1362 IFN 340P,       JSR DRECYC      ;HACK HACK
1363
1364 LOC PI0LOC+2*TTYCHN
1365         JSR TTYBRK      ;TTY,DATAPOINT KLUDGE
1366         JRST 4,.
1367
1368 LOC PI0LOC+2*UTCCHN
1369         JSR UTCBRK      ;MICRO TAPE OR DISK (S)
1370         JRST 4,.
1371
1372 IFN E.SP,[
1373 LOC PI0LOC+2*DISCHN
1374         JSR ESBRK
1375         JRST 4,.
1376 ]
1377 IFN 340P,[
1378 LOC PI0LOC+2*DISCHN
1379         JSR DIGNOR      ;340 DISPLAY BLKO GETS PATCHED IN HERE
1380         CONO PI,4000+200_<-SDCHN>       ;HACK HACK
1381 ]
1382 IFN CH10P+CH11P,[
1383 LOC PI0LOC+2*CHXCHN
1384         JSR CHXBRK
1385         JRST 4,.
1386 ];CH10P
1387
1388 IFN VIDP,[
1389 LOC PI0LOC+2*OMPCHN
1390         JSR OMPXBK      ;OUTPUT MPXR, NVID, ETC.
1391         JRST 4,.
1392 ]
1393 IFN KAIMP,[
1394 LOC PI0LOC+2*IMPCHN
1395         JSR IMPBRK
1396 LOC IMPILC
1397         JSR IMPIBK
1398         0
1399 LOC IMPOLC
1400         JSR IMPOBK
1401         0
1402 ] ; IFN KAIMP
1403
1404 IFN KL10P,[
1405 LOC PFOPC
1406 PFOPC:  0               ;PAGE FAIL OLD PC STORED HERE
1407 PFNPC:  PFAIL           ;WHERE TO GO FOR PAGE FAIL
1408
1409 LOC EPTDIA
1410 EPTDIA: JRST SALV       ;STD COMMAND START ADDRESS ("DIAGNOSTIC")
1411 EPTDDT: JRST DDT        ;DDT COMMAND START ADDRESS
1412 EPTSTL: JRST DSKDMP     ;STL COMMAND START ADDRESS ("LOADER")
1413 EPTITS: JRST BEG        ;STM COMMAND START ADDRESS ("MONITOR")
1414                         ;SALV THEN GO
1415 LOC EPTTR1
1416 EPTTR1: CAI             ;ARITH OVERFLOW EXEC MODE IGNORED
1417 EPTTR2: JSR ILLTRP      ;PDL OVERFLOW EXEC MODE IS AN ERROR
1418 EPTTR3: JSR ILLTRP      ;ONE PROC CODE?
1419
1420 LOC DTEBPO
1421 DTEBPO: 0               ;BYTE TRANSFER NOT USED
1422 DTEBPI: 0               ;BYTE TRANSFER NOT USED
1423 DTELOC:                 ;INTERRUPT FROM CONSOLE 11
1424 IFE PDCLKP,     JSR DTEBRK      ;IF USING 11 FOR CLOCK, FIRST CHECK FOR CLOCK INTR
1425 .ELSE           JSR TTYBRK      ;OTHERWISE JUST USING 11 FOR TTYS.
1426         0               ;UNUSED WORD
1427 DTEPRO: 0               ;NO PROTECTED EXAMINES
1428 DTERLO: 0               ;..
1429 DTEPRI: 0               ;NOR PROTECTED DEPOSITS
1430 DTERLI: 0               ;..
1431
1432 LOC EPT+430
1433 REPEAT 8,MUUOEX         ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1434
1435 LOC EPTEBC
1436 EPTEBC: 0 ? 0           ;EBOX COUNT FOR PROC BRK ROUTINES AND NULL JOB
1437 EPTMBC: 0 ? 0           ;MBOX DITTO
1438
1439 LOC TIMLOC
1440         JSR OVHBRK      ;INTERVAL TIMER INTERRUPT, EVERY 39 MILLISEC ON CHANNEL 1
1441
1442 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1443 ;ON KL10 OVHBRK CHECKS WHERE THE PC IS IF IT IS IN EXEC MODE.
1444
1445 DEFINE OVHMTR NAME      ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1446 OVHMT1 NAME,\.          ;EVALUATE "." AT THIS POINT IN TIME
1447 TERMIN
1448
1449 ;KLUDGE MACRO
1450 DEFINE OVHMT1 NAME,POINT
1451 OVHTAB [DEFINE OVHTAB FOO
1452 FOO]    <(SIXBIT/NAME/)>,,POINT ? 0
1453 TERMIN
1454 TERMIN
1455
1456 ;THIS IS THE CORRESPONDING REMOTE MACRO
1457 DEFINE OVHTAB FOO
1458 FOO
1459 TERMIN
1460 ]               ;END OF IFN KL10P
1461 \f
1462 IFN KS10P,[
1463
1464 LOC EPTUIT+UBAQ
1465         UBAQIB          ; Pointer to interrupt table for Unibus Q (dsk)
1466
1467 LOC EPTUIT+UBAI
1468         UBAIIB          ; Pointer to interrupt table for Unibus I (other)
1469
1470 LOC EPTPFW
1471 EPTPFW: 0               ; Page fail word
1472 EPTPFO: 0               ; Page fail old PC
1473 EPTPFN: PFAIL           ; Page fail new PC
1474
1475 IRP I,,[1,2,3,4,5,6,7]
1476 LOC EPTP!I!W
1477 EPTP!I!W:       0               ; Page fail word
1478 EPTP!I!O:       0               ; Page fail old PC
1479 EPTP!I!N:       PF!I!AIL        ; Page fail new PC at PI level I
1480 TERMIN
1481
1482 LOC EPTTR1
1483 EPTTR1: CAI             ;ARITH OVERFLOW EXEC MODE IGNORED
1484 EPTTR2: JSR ILLTRP      ;PDL OVERFLOW EXEC MODE IS AN ERROR
1485 EPTTR3: JSR ILLTRP      ;TRAP 3 SHOULD NOT HAPPEN
1486
1487 LOC EPT1PO
1488 EPT1PO: 0               ;ONE-PROCEED OLD-PC
1489 EPT1PN: MUUOEX          ;ONE-PROCEED SHOULD NOT HAPPEN IN UPT=EPT MODE
1490
1491 LOC EPTUEN
1492 EPTUEN: MUUOEX          ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1493 EPTUET: MUUOEX
1494 LOC EPTUUN
1495 EPTUUN: MUUOEX
1496 EPTUUT: MUUOEX
1497
1498 IFN KSIMP,[
1499 ;Here because with EPT at 0, this is the second half of physical
1500 ; page 0, which is uncached, which we want, and otherwise unused.
1501 ;
1502 LOC EPT+1000                    ; IMP data reformatting buffers
1503 IMPIBF: BLOCK 400
1504 IMPBFS==.-IMPIBF
1505 IMPOBF: BLOCK 400
1506 ]
1507
1508 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1509 ;ON KS10 PC SAMPLING FACILITY IS USED, 60-CYCLE CLOCK COLLECTS THAT DATA
1510 ;NOTE THAT THE TABLE FORMAT IS NOT THE SAME AS ON KL10, FOR SPEED REASONS
1511
1512 DEFINE OVHMTR NAME      ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1513 OVHMT1 NAME,\.          ;EVALUATE "." AT THIS POINT IN TIME
1514 TERMIN
1515
1516 ;KLUDGE MACRO
1517 DEFINE OVHMT1 NAME,POINT
1518 OVHTAB [DEFINE OVHTAB FOO
1519 FOO]    POINT,,<(SIXBIT/NAME/)>
1520 TERMIN
1521 TERMIN
1522
1523 ;THIS IS THE CORRESPONDING REMOTE MACRO
1524 DEFINE OVHTAB FOO
1525 FOO
1526 TERMIN
1527 ]               ;END OF IFN KS10P
1528 \f
1529 IFN DL10P,[     ;DL10 COMMUNICATIONS AREA IN NON-ENCACHED LOW CORE
1530 IFN KL10P, LOC 500      ;500-777 RESERVED FOR DL10 AREA AND BUFFERS
1531 IFN KA10P, LOC 100      ;IF KA10, PUT DL10 AREA JUST BELOW START OF SYSTEM
1532 IFN KS10P, .ERR DL10 on KS10 system?
1533
1534 DL10AR: JSR TTYBRK      ;INTERRUPT INSTRUCTION (NOT ACTUALLY USED)
1535
1536 ;FOLLOWING LOCATIONS MUST AGREE WITH IOELEVEN PROGRAM
1537
1538 DL10VR: NDLTYS_8+NFDLTY ;"I/O VERSION NUMBER"
1539 DL10UP: 0               ;INCREMENTED BY -11 EVERY 1/60 SECOND.
1540                         ;SETOM'ED BY 10 EVERY 1/2 SECOND.  DETECTS UP/DOWNNESS.
1541
1542 DL10SO: 0               ;LINE # TO SET OUTPUT DONE FOR, SET BY -10, CLEARED BY -11.
1543
1544 DL10IL: 0               ;LINE # WITH INPUT AVAILABLE.  CLEARED BY -10 AFTER CHAR READ.
1545 DL10IC: 0               ;CHARACTER RECEIVED FROM THAT LINE.
1546
1547 DL10OD: 0               ;LINE # WITH OUTPUT DONE.  CLEARED BY -10 WHEN PROCESSED.
1548 DL10BS: 0               ;BUFFER SIZE FOR THAT LINE.
1549
1550 DL10BP: 0               ;WIERD DL10 BYTE POINTER TO TTY OUTPUT BUFFER.
1551 DL10CC: 0               ;NUMBER OF CHARACTERS BEING OUTPUT TO TTY.
1552 DL10LN: 0               ;LINE # OUTPUT BEING SENT TO.  CLEARED BY -11 WHEN GOBBLED.
1553
1554 DL10CL: 0               ;DIALUP LINE CONNECT OR DISCONNECT INFO. SET BY 11, 0'D BY 10.
1555                         ;0000NN => LINE # NN DISCONNECTED.
1556                         ;01RTNN => LINE # NN CONNECTED, %TTISP=R, %TTOSP=T.
1557
1558 DL10PL: 0               ;LINE # TO SET PARAMETERS OF.  CLEARED BY -11 WHEN PROCESSED.
1559 DL10PR: 0               ;VALUE OF DH11 LPR REGISTER.
1560 DL10PS: 0               ;NUMBER OF BYTES OF OUTPUT BUFFERING DESIRED.
1561
1562 DL10XD: 0               ;1=EXAMINE -11 CORE, 2=DEPOSIT.  CLEARED BY -11 WHEN DONE.
1563 DL10XA: 0               ;EXAMINE/DEPOSIT ADDRESS
1564 DL10XW: 0               ;EXAMINE/DEPOSIT WORD
1565
1566 GLPTBP: 0               ;BYTE POINTER TO BUFFER FOR GOULD LPT
1567 GLPTBC: 0               ;BYTE COUNT " " - IF NONZERO BUFFER IS ACTIVE BY PDP11.
1568 GLPTER: 0               ;NONZERO => PDP11 CLAIMS PRINTER IS BROKEN.
1569 GLPGRF: 0               ;NONZERO => GRAPHICS MODE (SET BY 10).
1570
1571 ;CHAOS NET SHARED VARIABLES
1572 DLCINI: 1               ;THE COMMENTS ARE IN THE CHAOS FILE
1573 DLCSP1: 0
1574 DLCSP2: 0
1575 DLCSS1: 0
1576 DLCSS2: 0
1577 DLCRP1: 0
1578 DLCRP2: 0
1579 DLCRS1: 0
1580 DLCRS2: 0
1581
1582 ;^ ADD MORE HERE
1583
1584 DLXEND:: ;END OF ASSIGNED DL10 AREA
1585
1586 IFG .-DL10AR-100, .ERR DL-10 AREA TOO BIG, CHANGE CONO IN TSS INITIALIZATION
1587 LOC DL10AR+100 ;SKIP OVER 11-ACCESSIBLE AREA
1588         
1589 DL10BF: BLOCK <261.+3>/4        ;OUTPUT BUFFER, 8-BIT BYTES.  HAS TO BE NON-ENCACHED.
1590
1591 IFN GLPTP,[
1592 GLPBSZ==255.    ;BUFFER SIZE IN WORDS.  MAXIMUM POSSIBLE WITHOUT MODIFYING (ELIMINATING)
1593                 ;"WORD COUNT" HARDWARE IN DL-10.
1594 GLPMPP: 0       ;MAIN PROGRAM POINTER - IF NONZERO BUFFER IS ACTIVE BY M.P. LEVEL (PDP10)
1595 GLPMPC: 0       ;MAIN PROGRAM COUNTER
1596 GLPTBF: BLOCK GLPBSZ    ;ONE BUFFER FOR NOW
1597 ]       ;END IFN GLPTP
1598
1599 IFN KL10P, IFG .-1000,.ERR DL10 STORAGE TOO BIG, DOESN'T FIT IN UNENCACHED PAGE
1600 IFN KA10P, PATB=.       ;MOVE ORIGIN OF SYSTEM UP
1601 ]       ;END IFN DL10P
1602 \f
1603 IFN NETYS,[     ;ASSEMBLE DTE20 CONTROL AREA
1604 IFE KL10P, .ERR DTE20 WITHOUT KL10?
1605 LOC 400
1606
1607 DTEVER: NETYS_8+NFETY   ;400 I/O VERSION NUMBER, SET BY 10, CHECKED BY 11
1608
1609 DTECHK: 0               ;401 INCREMENTED BY 11 60 TIMES PER SECOND
1610                         ;SETOMED BY 10 EVERY HALF SECOND.
1611                         ;USED TO TELL 11 THAT 10 IS UP.
1612
1613 DTEINP: -1              ;402 -1 IF IDLE, ELSE INPUT REQUEST FROM 10 TO 11
1614                         ;SETUP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING THIS.
1615                         ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES HERE
1616 DTEOUT: -1              ;403 -1 IF IDLE, ELSE OUTPUT REQUEST FROM 10 TO 11
1617                         ;SETUP DTEBPO IN EPT BEFORE SETTING THIS.
1618                 ;CONTENTS OF DTEINP AND DTEOUT ARE DESCRIBED BELOW.
1619                 ;THESE ARE SET BY THE 10, SETOMED BY 11 WHEN TRANSFER STARTS.
1620                 ;RH # BYTES EXPECTED.  LH COMMAND+LINE#.  COMMANDS ARE:
1621  %DCTYO==1000           ;TELETYPE OUTPUT                (NOTE 4.1=0 INPUT, =1 OUTPUT)
1622  %DCETI==2000           ;ETHERNET INPUT (N.Y.I.)
1623  %DCETO==3000           ;ETHERNET OUTPUT (N.Y.I.)
1624
1625 DTELSP: -1              ;404 LINE # WHOSE SPEED IS TO BE SET, SET BY 10, SETOMED BY 11
1626 DTELPR: -1              ;405 CORRESPONDING DH11 LINE PARAMETER REGISTER,,BUFFER SIZE
1627
1628 DTEOST: -1              ;406 LINE# TO START OUTPUT ON (SET OUTPUT DONE).
1629                         ;SET BY 10, SETOMED BY 11
1630
1631         BLOCK 1         ;407 NOT USED
1632
1633 DTETYI: -1              ;410 TELETYPE INPUT.  SET BY 11, SETOMED BY 10.
1634                         ;LH LINE#,,RH CHAR RCVED.
1635
1636 DTEODN: -1              ;411 TELETYPE OUTPUT DONE.  SET BY 11, SETOMED BY 10.
1637                         ;LH LINE#,,RH BUFFER SIZE.
1638
1639 DTEHNG: -1              ;412 HANGUP/DIALIN WORD.  SET BY 11, SETOMED BY 10.
1640                         ;0000NN LINE # NN HUNG UP.
1641                         ;01RTNN LINE # NN HAS SPEED RCV=R, XMT=T (CODES AS IN TTYTYP)
1642
1643 ;^ ADD MORE LOCATIONS HERE, NOT TO EXCEED 437
1644
1645 ;LOCATIONS 440-457 ARE KNOWN ABOUT BY BOTH IOELEV AND KLDCP,
1646 ;USED MOSTLY FOR NON-TIMESHARING PROGRAMS.
1647 ];NETYS
1648 \f
1649 LOC PATB
1650
1651         ;FOR VARIABLES (MONITORABLE WITH KEYS)
1652 NSKED:  0       ;# TIMES NON-NULL JOB IS RUN
1653 NNSKED: 0       ;# TIMES NULL JOB IS RUN
1654 NRSKED: 0       ;# OF FULL SCHEDULES (MUST SCAN ALL JOBS)
1655 NSSKED: 0       ;# OF SCHEDULES SAVED BY SCHBLN FEATURE.
1656 NRESKED:0       ;# TIMES A JOB SCHEDULED JUST AFTER IT RAN.
1657 NSCHDU: 0       ;TOTAL NUMBER OF JOBS FOUND RUNNABLE IN FULL SCHEDULES
1658 NNULBK: 0       ;# OF CONSECUTIVE BLOCKS OF NULLTIME.
1659 NUINT:  0       ;# TIMES USER GIVEN INTERRUPT
1660 NAUINT: 0       ;# ATTEMPTED USER INT (POSSIBLY UNSUCCESSFUL DUE TO PG FAULT)
1661 NPCLSR: 0       ;# ATT TO PCLSR
1662 NEPCLS: 0       ;# PCLSRS WHERE JOB WAS IN EXEC MODE
1663 NFPCLS: 0       ;# OF PCLSRS THAT FAILED (JOB WAS IN EXEC MODE AND NOT BLOCKED)
1664 NSOUSR: 0       ;# ATT TO SWAP OUT USR
1665 NSOPGS: 0       ;# TIMES THRU LOOP LOOKING FOR PG TO SWAP OUT
1666 NPGSO:  0       ;# TIMES AT SWOPG
1667 NAGEAB: 0       ;# TIMES SWAP OUT ABORTED BY AGE BITS
1668 NSHRAB: 0       ;# TIMES SWAP OUT ABORTED BY SHARING
1669 NPGFLT: 0       ;# PAGE FAULT (ALL CAUSES)
1670 NCLKI:  0       ;# CHNL 7 INTS (ALL CAUSES)
1671 NPGLD:  0       ;# TIMES AT PGLDU
1672 NUFLS:  0       ;# TIMES AT UFLS
1673 NTUSB:  0       ;# TIMES USER SWAP BLOCKED
1674 NTSBUP: 0       ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND LET IN
1675 NTSBUB: 0       ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND BLOCKED
1676 NTSBUU: 0       ;# TIMES SWAP BLOCKED USER UNBLOCKED BEFORE TIME (MEM APPARENTLY AVAIL)
1677 NAGES:  0       ;# TIMES AROUND PAGE-AGEING LOOP
1678
1679 ;THE FOLLOWING FOUR MUST BE CONSECUTIVE
1680 NRPI:   0       ;# REFS TO PAGE IN (BUT MAP WAS NOT SET UP, ETC)
1681 NRPCI:  0       ;# PAGE FAULTS REFS TO PAGE COMMING IN
1682 NRPO:   0       ;# REFS TO PAGE OUT
1683 NRPGO:  0       ;# TO PAGES GOING OUT
1684 CLKBRS: 0       ;CLKBRK COPIED INTO HERE (SINCE CLKBRK GETS CHANGED)
1685
1686 PAT:    IFG .-PATB-40,.ERR PAT TOO HIGH
1687
1688 LOC PATB+40
1689
1690 BBLK
1691
1692 PATCH:  BLOCK 140       ;PATCH SPACE CODE AND CONSTANTS
1693
1694 EBLK
1695
1696 VPATCH:
1697 VPAT:
1698 BLOCK 40        ;PATCH SPACE VARIABLES
1699 \f
1700 SUBTTL PROCESSOR BREAK ROUTINES
1701
1702 DEFINE CLKSAV BRK=CLKBRK
1703 IFE KA10P,      XCT CLCXSV      ;DATAI PAG,CLCX(U)
1704         XCT CLUSAV              ;STORE U IN AC17S FOR CURRENT USER (UNLESS NULL JOB)
1705         MOVE U,BRK              ;SAVE AWAY BRK
1706         MOVEM U,CLKBRS
1707 IFSN BRK,CLKBRK, MOVEM U,CLKBRK ;SAVE IN CLKBRK IF NOT CLKBRK
1708 TERMIN
1709
1710 IFE KA10P,[
1711 DEFINE CLKLEV                   ;ENTER CLOCK-LEVEL CONTEXT
1712         SPCCTX 0,1,EPT          ;UPT = EPT; CLOCK LEVEL CONTEXT.
1713         MOVE U,USER
1714         JRST 2,@.+1             ;MAKE XCTR WORK RIGHT
1715           %PSPCU,,.+1
1716         MOVE P,CPDLP
1717 TERMIN
1718 ] ;IFE KA10P
1719 IFN KA10P,[
1720 DEFINE CLKLEV
1721         MOVE U,USER
1722         MOVE P,CPDLP
1723 TERMIN
1724 ] ;IFN KA10P
1725
1726 IFN KL10P,[     ;CODE USED IF GETTING 60-CYCLE CLOCK FROM PDP11 (IN CASE MAIN CLOCK DOWN)
1727
1728 ;HACKING THE DTE:
1729
1730 ;THE TTY CODE ASSUMES, SINCE THE DTE20 IS USED BY ITS SOLELY AS
1731 ;THE INTERFACE TO THE CONSOLE TTY AND THE LINE-FREQUENCY CLOCK,
1732 ;THAT IT MAY FREELY GIVE THE "MONITOR TTY OUTPUT" COMMAND WHEN
1733 ;THE "MONITOR TTY OUTPUT DONE" INTERRUPT IS RECEIVED.  ANY CODE
1734 ;WHICH HACKS THE DTE OTHER THAN AT PI LEVEL OR IN ITS INITIALIZATION
1735 ;MUST THEREFORE OBSERVE THE FOLLOWING PROTOCOL:
1736 ;       CONO PI,DTEOFF
1737 ;       SKIPN DTEFLG            ;WAIT FOR MONITOR TTY OUTPUT TO GO THROUGH
1738 ;        JRST .-1
1739 ;       SETZM DTEFLG
1740 ;        ;HERE SET DTECMD
1741 ;       CONO DTE,%DBL11
1742 ;       SKIPN DTEFLG            ;WAIT FOR THIS COMMAND TO GO THROUGH
1743 ;        JRST .-1
1744 ;       CONO PI,DTEON
1745 ;
1746
1747 DTEBRK: 0
1748 BBLK
1749         CONSO PI,1_<7-APRCHN>   ;TEMPORARY (I HOPE) HARDWARE BUG IN KL10 PI HARDWARE
1750          JRST 4,.               ;ALLEGEDLY FIXED
1751         CONO PI,TTYRQ           ;REALLY WANTED TO INTERRUPT ON TTY CHANNEL,
1752         JFCL                    ; BUT HAVE TO DO IT THIS WAY DUE TO 
1753         JFCL                    ; MISFEATURES IN THE PI HARDWARE
1754         SKIPN DTECLK            ;DON'T TAKE OUT THE JFCLS!!
1755          JRST 12,@DTEBRK
1756         CLKSAV DTEBRK           ;TAKE CLOCK INTERRUPT
1757         JRST CLKB2A
1758 EBLK
1759 ];KL10P
1760 \f
1761 CLKBRK: 0               ;PC SAVED HERE BY JSR FOR CLOCK INT.
1762
1763 BBLK
1764 IFN KL10P,[
1765         CONSO PI,1_<7-APRCHN>   ;HARDWARE BUG IN KL10 PI SYSTEM
1766          JRST 4,.               ;ALLEGEDLY FIXED
1767 ]
1768 IFE KA10P, CONO PI,020000+200_<-APRCHN> ;BAG-BITING DEC LOSERS CHANGED
1769                                         ;FUNCTIONAL SPECIFICATION OF
1770                                         ;PROGRAMMED REQUESTS
1771 CLKBR2: CLKSAV          ;SAVE AC BLK STATUS AND U.
1772 CLKB2A: AOS NCLKI
1773         SKIPGE U,USER   ;PICK UP INDEX OF CURRENT USER, SKIP UNLESS NULL JOB
1774          JRST [ SPM UPGML       ;JUMP IF NULL JOB WAS RUNNING
1775                 JRST CLKBKR ]
1776         SPM UPGML(U)    ;STORE PAGE MAP AWAY
1777         AOSN UFLSF      ;SKIP UNLESS GOT HERE FROM UFL6
1778          JRST CLUFLS
1779         MOVEM T,AC16S(U)        ;STORE AWAY T
1780         MOVEI T,AC0S(U)
1781         BLT T,AC15S(U)  ;STORE REST OF ACS
1782 CLKBKR: CLKLEV          ;SET UP CROCK-LEVEL CONTEXT HARDWARE
1783
1784 ;;; CHECK FOR THINGS OTHER THAN CLOCK TICKS (PAR ERR, PG FAULT, NXM, PDLOV,
1785 ;;; AROV AND ARFOV ARE POSSIBLE ON ONE MACHINE OR THE OTHER).
1786
1787 IFN KA10P,[
1788         CONSZ 270220    ;CHECK PDL OV, MEM PROTECT, NXM, FOV, AR OV
1789          JRST CLKB1     ;JUMP ON LOSSAGE
1790 CLKB1D: CONSZ PI,200000
1791          JRST CLKB1E    ;PARITY
1792 ] ;KA10P
1793
1794 IFN KL10P,[
1795         AOSG PFAILF
1796          JRST PFA6      ;PAGE FAULT
1797         CONSZ 7740      ;This is all but the cache sweep done bit (=20).
1798          JRST CLKB2     ;APR ERROR INTERRUPT
1799 ] ;KL10P
1800
1801 IFN KS10P,[
1802         AOSG PFAILF
1803          JRST PFLU2
1804         CONSZ 7620      ;This is all but the interval timer's bit (=40).
1805          JRST CLKBKS    ; (Memory ECC (=100) doesn't interrupt)
1806         CONSO 40
1807          JRST CLK1F
1808 ] ;KS10P
1809
1810 IFN PDCLKP\KA10P,[      ;IF 60 HZ CLOCK IS IN HARDWARE
1811         CONSO CLK,CLKINT
1812          JRST CLK1F     ;INTERRUPT NOT FROM CLOCK, MUST BE SPURIOUS (OR
1813                         ;PREEMPT) 
1814 ] ;PDCLKP\KA10P
1815
1816 ;DROP THROUGH FOR PLAIN CLOCK-TICK.
1817 \f;
1818 ; 60-CYCLE CLOCK INTERRUPT
1819 ;
1820 CLKTIC:
1821 ;IFN 340P,      DATAI CLK1,LQTIM
1822         SOSG @CLROOT    ;COUNT DOWN, SKIP IF NOT YET TO NEXT REQUEST
1823          JRST CLQBRK    ;SERVICE CLOCK QUEUE REQUEST
1824 CLQBRT:
1825 IFN KS10P,              CONO 020040+APRCHN      ;Clear interval flag
1826 IFN PDCLKP\KA10P,       CONO CLK,CLKINT+APRCHN  ;Clear hardware clock flag
1827 IFE PDCLKP\KA10P\KS10P, SETZM DTECLK            ;Clear software clock flag
1828 IFN KA10P,[
1829         DATAI CLKBSW
1830         SKIPGE CLKBSW
1831 ] ;KA10P
1832 IFN KL10P, SKIPGE DTESWR
1833 IFN KS10P, SKIPE 8SWIT0
1834          BUG DDT,[SWITCH 0 IS UP]
1835 IFN KS10P, SETZM 8SWIT0         ; Allow hacker to <alt>P
1836 IFN CHAOSP, IFN T11CHP, PUSHJ P,T11WAK  ;RUN TEN-11 CHAOS NET INTERFACE
1837 IFN XGP,[
1838         SKIPL XGPUSR
1839          PUSHJ P,XGPCLK
1840 ]
1841 IFN 340P,[
1842         AOSGE T,DTIME
1843          JRST DSTPD     ;WAIT IF DTIME CLOBERED DUE TO RATE EXCEEDED
1844         CAILE T,2
1845          MOVEI T,2
1846         MOVEM T,DTIME
1847         SKIPL CDISOF
1848          SKIPGE DISOFF
1849           JRST DSTPD
1850         AOSG DISON
1851          CONO DIS,1100\SDCHN_3\DISCHN   ;RESTART DISPLAY
1852 DSTPD:
1853 ]
1854 IFN E.SP,[
1855         SKIPN T,E.SPGW  ; E&S WAITING FOR PAGE
1856          JRST E.SOK
1857         HRRZM T,DISSPG  ; SAVE FOR SWPPIN
1858         SKIPL T,DISUSR  ; -1 IMPLIES NO USER
1859          MOVEM T,DISSWI ; USER INDEX FOR SWPPIN
1860 E.SOK:
1861 ]
1862 IFN N11TYS,[
1863         SKIPE @TT11HD   ;ANY INPUT FROM PDP11?
1864          PUSHJ P,TT11IN ;YES, DO INPUT INT LVL STUFF FOR IT,.
1865 ]
1866 IFN DZ11P,[
1867         PUSHJ P,DZSCAN  ;SCAN DZ'S FOR INPUT
1868 ]
1869         MOVS T,TTERQS
1870         CAIE T,(MOVE)
1871          PUSHJ P,TTECH  ;CHARACTERS TO BE ECHO ED
1872 IFN NETP,[
1873         SKIPE STYNTA    ;IF THERE ARE STY'S CONNECTED TO NETWORK I/O,
1874          PUSHJ P,STYNTC ;XFER BETWEEN THEM.
1875 ]
1876 IFN KS10P, PUSHJ P,OVHCLK
1877         SETCMM CLKFL1
1878         SKIPL CLKFL1
1879          AOS TIME       ;GET HERE EVERY THIRTIETH OF A SECOND
1880 IFN PAGPRE,[
1881         SKIPE PREEMP    ;CHECK FOR PRE-EMPTION INTERRUPT
1882          JRST PRESCD
1883 ];PAGPRE
1884         AOSG SCHFLG
1885          JRST CLKB5     ;TIME NOT UP
1886         AOS NLPCLK
1887         JRST SCHED      ;SCHEDULE
1888
1889 CLK1F:
1890 IFN PAGPRE,[
1891         SKIPE PREEMP    ;CHECK FOR PRE-EMPTION INTERRUPT.  THIS IS HERE
1892          JRST PRESCD    ; BECAUSE OF SCREW CASE WHEREBY DLSRCH PREVENTS
1893                         ; PREEMP FROM DOING ANYTHING, AND PREEMP WOULD
1894                         ; PREVENT CLOCK FLAG FROM GETTING CLEARED IF IT WAS
1895                         ; TESTED BEFORE CLOCK.
1896 ];PAGPRE
1897 ;       MOVEI J,APRCHN  ;DO NOT TAKE THESE OUT WITHOUT SEEING RG!!!!
1898 ;       JSP E,SPUR
1899 ;       JRST SCHED
1900         AOS CHSPUR+APRCHN       ;COUNT SPURIOUS INT
1901         JRST SCHED              ;(MIGHT HAVE BEEN RUNNING NULL JOB)
1902
1903 IFN PAGPRE,[
1904 PRESCD: AOS NLPPRE
1905         JRST SCHED
1906 ];PAGPRE
1907
1908 IFN KL10P,[
1909 CLKB2:  CONSZ 2000              ;NXM
1910          PUSHJ P,MEMHNG
1911         CONSZ 1040              ;POWER FAIL OR I/O PAGE FAIL
1912          BUG HALT,[KL: POWER FAIL OR I/O PAGE FAIL]
1913         CONSZ 300               ;CACHE DIR OR PT DIR PAR ERR.
1914          BUG HALT,[KL: CACHE OR MAP DIR PAR ERR]
1915         CONSO 4400              ;SBUS ERR OR MB PAR ERR
1916          JRST SCHED             ;CALLED MEMHNG, AND NOTHING ELSE => SCHEDULE.
1917         SETOM PARRSN            ;TEL PAR ERR SCANNER THIS IS AN INTERRUPT, NOT A PG FAIL.
1918         RDERA PARERA            ;STORE ADDR OF PAR ERR.
1919         JRST CLKB1E
1920 ] ;IFN KL10P
1921
1922 IFN KS10P,[
1923 CLKBKS: CONSZ 7600      ; Any bad guys? (8080 -> KS is 20, Interval is 40,
1924          JRST CLKKS1    ; Memory ECC is 100.)
1925         CONO 020020+APRCHN      ; 8080 wants service.  Clear the bit.
1926         MOVEI I,NFKSTY          ; TTY # (fancy name for 0)
1927         CONO PI,TTYOFF          ; Pretend this is TTY interrupt level.
1928         SKIPN A,8CTYIN          ; Any input from 8080?
1929          JRST CLKKS2
1930         SETZM 8CTYIN            ; Yes:  Make room for more.
1931         PUSHJ P,NTYI1           ; Stuff it into the tty.
1932         MOVEI I,NFKSTY          ; Just in case...
1933 CLKKS2: SKIPN 8CTYOT            ; Room for output yet?
1934          PUSHJ P,TYPSC          ; Yes:  Get some now.
1935         CONO PI,TTYON           ; No:  8080 will wake us up later.
1936         JRST SCHED              ; Null job might have been running.
1937
1938 CLKKS1: CONSZ 1000              ;Power failure
1939          BUG HALT,[KS: POWER FAIL]
1940         CONSZ 6000              ;KS -> 8080 or Flag 24
1941          BUG HALT,[KS: KS->8080 FLAG OR FLAG 24 SET]
1942         CONSZ 400               ;NXM
1943          PUSHJ P,MEMHNG
1944         CONSO 200               ;Bad memory data
1945          JRST SCHED
1946         IORD B,[KSECCS]
1947         MOVEM B,PARERA
1948         JRST CLKB1E
1949
1950 ] ;IFN KS10P
1951 \f
1952 CLUFLS: CONO PI,CLKON   ;FROM UFLS
1953         CLKLEV
1954         MOVE T,UPC(U)
1955         MOVEM T,CLKBRK
1956         AOS NUFLS
1957         AOS NLPUFL
1958         JRST SCHED2
1959
1960         ;CLOCK QUEUE SERVICE
1961 CLQBRK: SKIPG U,CLROOT  ;GET POINTER TO CURRENT BLOCK
1962          BUG            ;CLK QUEUE SCREWED
1963         SKIPG T,1(U)    ;GET POINTER TO NEXT BLOCK
1964          BUG            ;CLK QUEUE SCREWED
1965         MOVEM T,CLROOT  ;SET UP POINTER FOR NEXT BLOCK
1966         SETOM 1(U)      ;INDICATE CURRENT BLOCK IDLE
1967         XCT 2(U)        ;EXECUTE REQUEST (PROBABLY A JRST)
1968                 ;FALL THROUGH IF SINGLE INST RQ
1969 CLQRET:         ;RETURN FROM REQUEST
1970         SKIPN @CLROOT   ;SKIP IF TIME TILL NEXT RQ NONZERO
1971         JRST CLQBRK     ;ZERO TIME DELTA, DO NEXT RQ
1972         JRST CLQBRT     ;RETURN TO CLOCK ROUTINE
1973
1974 CLQTTR: JUMPE TT,CLQRET ;COMMON RETURN FOR TT IDLE FLAG
1975 CLQREE: MOVEI E,CLQRET  ;RE ENTER RQ
1976
1977 ;CLOCK OFF OR IN PROGRESS LEVEL ADD TO CLOCK QUEUE, CALL BY JSP E,
1978         ; T HAS TIME TILL RQ IN 60'THS
1979         ; C POINTS TO THREE WORD BLOCK, RQ'ED INST IS IN THIRD
1980 CLQPUT: MOVEI B,CLROOT-1
1981 CLQPU2: MOVE A,B        ;REPLACE POINTER TO PREV BLOCK WITH CURRENT
1982         SKIPG B,1(B)    ;GET LINK TO NEXT BLOCK
1983          BUG            ;CLK QUEUE SCREWED
1984         SUB T,(B)       ;SUBTRACT TIME DELTA FOR NEXT BLOCK
1985         JUMPG T,CLQPU2  ;JUMP IF RQ LATER THAN CURRENT BLOCK
1986         JUMPE T,CLQPU6  ;JUMP IF RQ SAME AS " " (COULD USE PU2 BUT THIS FASTER)
1987         ADD T,(B)       ;RQ EARLIER, ADD BACK
1988         MOVEM T,(C)     ;SET DELTA OF BLOCK BEING ADDED
1989         SUB T,(B)       ;COMPUTE NEG OF DELTA FOR NEXT BLOCK
1990         MOVNM T,(B)     ;SET TIME DELTA FOR NEXT BLOCK
1991         MOVEM B,1(C)    ;SET LINK OF NEW BLOCK TO NEXT
1992         MOVEM C,1(A)    ;SET LINK OF PREV BLOCK TO NEW
1993         JRST (E)
1994
1995 CLQPU6: SETZM (C)       ;SET TIME DELTA OF NEW BLOCK TO ZERO
1996         MOVE A,1(B)     ;GET POINTER TO NEXT BLOCK
1997         MOVEM A,1(C)    ;SET POINTER OF NEW TO NEXT BLOCK
1998         MOVEM C,1(B)    ;SET POINT OF CURRENT TO NEW BLOCK
1999         JRST (E)
2000 \f
2001 ;MAIN PROG LEVEL ADD TO CLOCK QUEUE
2002 ;CALL BY PUSHJ P,CLQADD
2003 ;WITH POINTER TO BLOCK IN NEXT WORD AND TIME TILL RQ IN T IN 60'THS
2004 ;POINTER TO BLOCK SHOULD NOT BE INDEXED BY C
2005
2006 CLQAD1: MOVEI T,1       ;RQ IN ONE TICK
2007 CLQADD: PUSH P,C
2008         MOVE C,@-1(P)   ;GET BLOCK POINTER
2009         MOVEI C,@C
2010         SKIPL 1(C)      ;SKIP IF IDLE
2011         JRST POPCJ1     ;IGNORE THIS RQ, BLOCK ALREADY ACTIVE
2012         PUSH P,A
2013         PUSH P,B
2014         PUSH P,E
2015         SKIPN (C)       ;DELTA WORD OF IDLE BLOCK SHOULD BE ZERO
2016         SKIPG T         ;TIME SHOULD BE NON-ZERO
2017          BUG            ;CLK QUEUE SCREWED
2018         CONO PI,CLKOFF
2019         JSP E,CLQPUT    ;ADD RQ
2020 CLQDE4: CONO PI,CLKON
2021         POP P,E
2022         POP P,B
2023         POP P,A
2024         JRST POPCJ1
2025
2026 ;DELETE CLOCK QUEUE ENTRY
2027 ;CALL BY PUSHJ P,CLQDEL WITH POINTER TO BLOCK IN NEXT WORD
2028 CLQDEL: PUSH P,C
2029         MOVE C,@-1(P)   ;GET BLOCK POINTER
2030         MOVEI C,@C
2031         CONO PI,CLKOFF
2032         SKIPGE 1(C)     ;IGNORE RQ TO DELETE  IF IDLE
2033         JRST CKOCJ1
2034         PUSH P,A
2035         PUSH P,B
2036         PUSH P,E
2037         JSP E,CLQCLR
2038         JRST CLQDE4
2039
2040 CLQCLR: MOVEI B,CLROOT-1        ;CLOCK OFF OR IN PROGRESS VERSION
2041 CLQDE2: MOVE A,B
2042         SKIPG B,1(B)    ;GET POINTER TO NEXT BLOCK
2043          BUG            ;CLK QUEUE SCREWED
2044         CAME B,C        ;SKIP IF FOUND BLOCK TO DELETE
2045          JRST CLQDE2
2046         SKIPG B,1(B)    ;GET POINTER TO BLOCK AFTER ONE TO DELETE
2047          BUG            ;CLK QUEUE SCREWED
2048         MOVEM B,1(A)    ;PATCH AROUND DELETED BLOCK
2049         MOVE A,(C)
2050         ADDM A,(B)      ;ADD DELTA OF DELETED BLOCK TO NEXT
2051         SETZM (C)       ;CLEAR DEL
2052         SETOM 1(C)      ;MARK IDLE
2053         JRST (E)
2054 \f
2055 OVHMTR PGF      ;PAGE FAULT
2056
2057 IFN KL10P,[
2058 EBLK
2059 PFAILU: 0       ;SAVED U AS OF A PAGE FAILURE
2060 PFINST: 0       ;PF INSTRUCTION IF XCT
2061 PFOPC1: 0       ;SAVE PFOPC WHILE SWITCHING TO CLK LEVEL (PROTECT AGAINST XCTRI)
2062 BBLK
2063
2064 ;PAGE FAULTS COME HERE, WITH PC IN PFOPC, AND PI SYSTEM TURNED OFF.
2065
2066 PFAIL:  MOVEM U,PFAILU
2067         HLRZ U,EPTPFW
2068         ANDI U,%PFCOD   ;GET THE PFAIL CODE FROM THE PFW
2069         CAIE U,%PFPAR
2070          CAIN U,%PFPRX
2071           JRST PFA2     ;IT'S A PAR ERR; BYPASS XCTR HACKS
2072         MOVE U,PFOPC
2073         TLNE U,%PCUSR
2074          JRST PFA2
2075         LDB U,[331100,,(U)]     ;GET OPCODE OF LOSING INSTRUCTION.
2076                                 ;ASSUME THAT IN EXEC MODE VIRTUAL
2077                                 ; AND PHYSICAL ADDRESSES ARE IDENTICAL
2078                                 ; FOR INSTRUCTION FETCHES.  ALSO ASSUME
2079                                 ; THAT NOBODY DOES XCT OF XCT OF XCTR.
2080 PFA4:   CAIE U,XCTRI_-33        ;SKIP IF "XCTR WITH INHIBIT"
2081          JRST PFA1
2082 REPEAT 2, AOS PFOPC             ;ONCE COMPENSATING FOR INSTR ABORT, AND ONCE TO SKIP
2083         MOVE U,PFAILU
2084         JRST 17,@PFOPC          ;KL-10 CROCK: JRST 17, TURNS ON PI SYSTEM
2085
2086 PFA1:   CAIE U,XCTR_-33         ;SKIP IF "XCTR WITH NO INHIBIT"
2087          JRST PFA3
2088 PFA2:   CONSO PI,77400          ;PI IN PROGRESS?
2089          CONSO PI,1             ;CHANNEL 7 ENABLED?
2090           BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS OR CLKOFF]
2091         SKIPGE USER
2092          BUG AWFUL,[PAGE FAULT IN NULL JOB]
2093         MOVE U,PFOPC
2094         MOVEM U,PFOPC1
2095         MOVE U,PFAILU           ;RESTORE U SO CLKSAV CAN RE-SAVE IT
2096 TPFLT1: SETOM PFAILF
2097         CONO PI,CLKRQ           ;CAUSE CLK BREAK AND PI SYSTEM ON
2098         JRST .                  ;TAKES A WHILE TO GO OFF
2099
2100 ;COME BACK HERE PI IN PROGRESS ON CLK CHANNEL
2101 PFA6:   MOVE T,PFOPC1
2102         MOVEM T,CLKBRK          ;SAVE PC AS OF PAGE FAULT AS PLACE INTERRUPTED FROM
2103         AOSN PFAILF             ;IF INTERRUPTED FROM INTPFL,
2104          JRST PFA9              ; PC DOESN'T POINT TO FAULTING INSTRUCTION
2105         TLNE T,%PSUSR           ;MAYBE SPURIOUS MPV ON IOT IN USER MODE?
2106          TLNE T,%PSUIO
2107           JRST PFA9             ;CAN'T BE, I/O IS LEGAL
2108         HLRZ TT,UPFW(U)         
2109         ANDI TT,%PFCOD
2110         CAIE TT,%PFPNA          ;CAN'T BE IF PAGE FAULT IS REALLY SOME OTHER RANDOM BREAK
2111          CAIN TT,%PFILW         ;SUCH AS A PARITY ERROR
2112           JRST PFA11
2113 PFA9:
2114 ;       MOVE T,PFOPC
2115 ;       MOVEM T,UPOPC(U)        ;SOLELY FOR THE .OPC USER VARIABLE
2116         LDB E,[$PFPNO,,UPFW(U)] ;FAILING PAGE NO
2117         HLRZ D,UPFW(U)
2118         ANDI D,%PFCOD           ;GET THE PAGE-FAULT CODE.
2119         MOVEI A,0               ;INIT USER INT BITS
2120         CAIE D,%PFPNA
2121         CAIN D,%PFILW
2122          JRST PFA5              ;REAL PAGE FAULT OR RWF
2123         CAIN D,%PFMAR
2124          JRST PFA7A
2125         CAIN D,%PFPRO
2126          JRST PFA7              ;OTHER RANDOM BREAKS
2127         CAIE D,%PFPAR
2128         CAIN D,%PFPRX
2129          JRST PFA14             ;PARITY ERROR
2130         MOVSI D,SCLBPF          ;UNKNOWN PFW, GET SYSTEM JOB TO BARF ABOUT IT
2131         TDNE D,SUPCOR
2132          BUG PAUSE,[BAD PAGE FAIL WORD ],OCT,BPFPFW     ;LOSING IN REAL TIME
2133         IORM D,SUPCOR
2134         AOS BPFERR
2135         MOVEM U,BPFUSR
2136         MOVE D,UPFW(U)
2137         MOVEM D,BPFPFW
2138         MOVE D,CLKBRK
2139         MOVEM D,BPFPC
2140         JRST SCHED              ;IGNORE THE FAULT (BUT DO A FULL SCHEDULE SO SYS JOB WAKES)
2141
2142 PFA14:  SETZM PARRSN            ;SAY THIS IS PAR ERR TRAP, NOT PAR ERR INTERRUPT.
2143         MOVE D,UPFW(U)
2144         MOVEM D,PARPFW          ;SAVE PFW OF PAR ERR FOR ERROR MESSAGE
2145         AC7CTX                  ;SELECT AC BLOCK 7, USED BY UCODE.
2146         UMOVE D,0               ;SAVE THE AC THAT HOLDS THE BAD WORD
2147         MOVEM D,PARWRD
2148         SYSCTX                  ;AND RESET THE DATAO PAG TO NORMAL VALUE
2149         JRST CLKB1E             ;GO SCAN FOR THE ERROR.
2150
2151 PFA3:   CAIE U,XCT_-33
2152          BUG HALT,[PAGE FAULT IN SYSTEM AT ],OCT,PFOPC  ;BARF!
2153         MOVE U,@PFOPC           ;QUUX! LET ONE LEVEL OF XCT WIN
2154         MOVEM U,PFINST
2155         MOVE U,PFAILU
2156         LDB U,[331100,,@PFINST]
2157         JRST PFA4
2158
2159 PFA11:  XCTRI XR,[MOVE T,(T)]   ;GET INSTRUCTION IN WHICH PAGE FAIL OCCURRED
2160          TLCA T,700000          ;AND CHECK HIGH THREE BITS OF OPCODE
2161           JRST PFA9             ;JUMP IF FAULT WAS ON INSTRUCTION FETCH
2162         TLCE T,700000
2163          JRST PFA12             ;JUMP IF INSTRUCTION NOT AN IOT
2164 PFA13:  MOVSI TT,(HRRI T,)
2165         DPB T,[2700,,TT]
2166         XCTRI XEA,TT            ;COMPUTE ITS EFFECTIVE ADDRESS
2167          TLZA T,37              ;CLEAR @+XR, BUT LEAVE OPCODE AND AC
2168           JRST PFA9             ;JUMP IF FAULT ON INDIRECT WORD
2169         MOVEM T,MUUODP(U)       ;IT WAS A SPURIOUS MPV, SO
2170         MOVE T,CLKBRK           ; SIMULATE TRAPPING AS A UUO
2171         HRRI T,1(T)
2172         MOVEM T,XUUOH(U)        ;STORE OLD PC
2173         MOVE T,CLCX(U)
2174         MOVEM T,MUUOCX(U)       ;AND OLD CONTEXT
2175         MOVE T,MUUOCN(U)
2176         MOVEM T,CLKBRK          ;GET NEW PC
2177         JRST CLKB5              ;AND RESTART USER AT UUOH0
2178
2179 PFA12:  TLNN T,700000           ;MAYBE AN INSTRUCTION OVERLAYED ON AN MUUO, E.G. LPMR
2180          TLNN T,040000          ;OPCODES 040-077 QUALIFY.
2181           TLCA T,(XCT)
2182            JRST PFA13           ;YUP.
2183         TLNE T,777000           ;SKIP IF OPCODE WAS XCT
2184          JRST PFA9
2185 ;       TLZ T,777740
2186 ;       TLO T,(MOVEI T,)
2187 ;Following instruction is suspected of not working (sometimes using wrong AC block)
2188 ;       XCTRI XEA,T             ;COMP EFFECTIVE ADDRESS OF XCT IN USER CONTEXT
2189 ;;       JRST PFA11             ;AND GO PROCESS INSTRUCTION AT THAT ADDRESS
2190 ;        JRST [ MOVEM T,TRMNAM(U)       ;TEMPORARY FOR DEBUGGING
2191 ;               JRST PFA11 ]
2192 ;       JRST PFA9               ;HERE IF FAULT WAS IN INDIRECT CYCLE
2193 ;Replacement code:
2194 PFA15:  DATAI PAG,TT            ;HMM, SEE IF WRONG AC BLOCK SELECTED
2195         TLNN TT,100
2196          BUG
2197         LDB TT,[220400,,T]      ;CHECK FOR NEED TO SIMULATE INDEXING
2198         JUMPE TT,PFA16
2199         UMOVE TT,(TT)
2200         ADD TT,T
2201         HRR T,TT
2202 PFA16:  TLNN T,(@)              ;CHECK FOR NEED TO SIMULATE INDIRECT
2203          JRST PFA11
2204         XCTRI XR,[MOVE T,(T)]
2205          JRST PFA15             ;PROCESS INDIRECT WORD
2206         JRST PFA9               ;TAKE FAULT ON INDIRECT WORD
2207 ;End replacement code.
2208 ];KL10P
2209 \f
2210 IFN KS10P,[
2211
2212 EBLK
2213
2214 IRP I,,[1,2,3,4,5,6,7]
2215 PF!I!SVU:       0       ;Saved U at PI level I page fail
2216 PF!I!SVT:       0       ;Saved T at PI level I page fail
2217 PF!I!INS:       0       ;Instruction at PI level I page fail
2218 TERMIN
2219 IFN .-PF1SVU-21., .ERR Wrong length PFXSVU block.
2220
2221 BBLK
2222
2223 IRP I,,[1,2,3,4,5,6,7]
2224 PF!I!AIL:       ;;PI level I page fail comes here.
2225         MOVEM T,PF!I!SVT        ;Save T
2226         MOVEM U,PF!I!SVU        ;Save U
2227         JSP U,PIFAIL            ;Set up U and join common code
2228 TERMIN
2229 IFN .-PF1AIL-21., .ERR Wrong length PFXAIL block.
2230 PFXSVT==:0,,<PF7SVT-<PF7AIL+3>>
2231 PFXINS==:0,,<PF7INS-<PF7AIL+3>>
2232 PFXWRD==:0,,<EPTP7W-<PF7AIL+3>>
2233 PFXOPC==:0,,<EPTP7O-<PF7AIL+3>>
2234
2235 PIFAIL: MOVE T,PFXWRD(U)        ;Check page fail word
2236         TLNE T,%PFNXI
2237          BUG AWFUL,[NON-EX IO REG WITH PI IN PROGRESS ],OCT,PFXWRD(U),[PC=],OCT,PFXOPC(U)
2238         TLNE T,%PFNXM\%PFPAR
2239          BUG AWFUL,[NXM OR PARITY ERROR WITH PI IN PROGRESS]
2240         MOVE T,PFXOPC(U)        ;Check for user mode.
2241         TLNE T,%PSUSR
2242          BUG AWFUL,[PAGE FAULT IN USER MODE WITH PI IN PROGRESS]
2243         SKIPA T,(T)             ;We assume that it wasn't the instruction
2244                                 ;fetch itself that caused the fault.
2245 PIFL2:   MOVEI U,PF7AIL-PF7XCT(U)       ;Correct U on return from PFXXCT
2246         MOVEM T,PFXINS(U)       ;Save instruction that caused fault
2247         LSH T,-33               ;Look at opcode
2248         CAIE T,XCTRI_-33        ;XCTRI gets special treatment:
2249          JRST PIFL1
2250 REPEAT 2, AOS PFXOPC(U)         ;Arrange for it to skip.
2251         JRST PFXRET(U)          ;And return.
2252
2253 IRP I,,[1,2,3,4,5,6,7]
2254 PF!I!RET:
2255         MOVE T,PF!I!SVT         ;Restore T
2256         MOVE U,PF!I!SVU         ;Restore U
2257         JRST 2,@EPTP!I!O        ;Return
2258 TERMIN
2259 IFN .-PF1RET-21., .ERR Wrong length PFXRET block.
2260 PFXRET==:0,,<PF7RET-<PF7AIL+3>>
2261
2262 ;;;Let XCT chains that end in XCTRI win.  We assume that none of the
2263 ;;;fetches along the way to the XCTRI itself caused the fault.
2264 PIFL1:  CAIE T,XCT_-33
2265          BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS]
2266         MOVE T,PFXSVT(U)        ;Restore T
2267         JRST PFXXCT(U)          ;Go pick up word XCT'ed
2268
2269 IRP I,,[1,2,3,4,5,6,7]
2270 PF!I!XCT:
2271         MOVE U,PF!I!SVU         ;Restore U
2272         MOVE T,@PF!I!INS        ;Pick up XCTed instruction
2273         JSP U,PIFL2             ;Set up U again and rejoin common code
2274 TERMIN
2275 IFN .-PF1XCT-21., .ERR Wrong length PFXXCT block.
2276 PFXXCT==:0,,<PF7XCT-<PF7AIL+3>>
2277 \f
2278 EBLK
2279
2280 PFLCLK: 0       ; Did page fault happen with CLKOFF?
2281 PFLSVU: 0       ; Saved U during page fail
2282 PFLSVT: 0       ; Saved T during page fail
2283 PFLINS: 0       ; Faulting instruction
2284
2285 BBLK
2286
2287 ;;; Note!
2288 ;;; If we are swapped out while running with Exec mode PC between PFAIL and
2289 ;;; PFAILE inclusive, EPTPFO is saved as our PC.  (There are actually only
2290 ;;; a few PC's for which this is possible given that we mostly run CLKOFF.)
2291
2292 PFAIL:  SETZM PFLCLK
2293         CONSO PI,1
2294          SETOM PFLCLK
2295         CONO PI,CLKOFF          ; Don't bother me
2296         MOVEM U,PFLSVU          ; Save U
2297         MOVEM T,PFLSVT          ; Save T
2298         SKIPGE U,USER
2299          BUG AWFUL,[PAGE FAULT IN NULL JOB]
2300         MOVE T,EPTPFW           ; Get the explanation
2301         MOVEM T,UPFW(U)         ; Save it for others
2302         MOVE U,PFLSVU           ; Restore U, only needed it for a moment.
2303         TLNE T,%PFNXM\%PFPAR    ; Bad stuff should interrupt us, right?
2304          BUG AWFUL,[NXM OR PARITY ERROR DIDN'T INTERRUPT]
2305         MOVE T,EPTPFO
2306         TLNE T,%PSUSR           ; In Exec mode?
2307          JRST PFLUSR
2308         MOVE T,(T)              ; We assume that it wasn't the instruction
2309                                 ; fetch itself that caused the fault.
2310 PFLOOP: MOVEM T,PFLINS          ; Save instruction that caused fault.
2311         LSH T,-33               ; Check opcode for XCTRI
2312         CAIN T,XCTRI_-33        ; Should we skip?
2313          JRST PFLSKP
2314         CAIN T,XCTR_-33         ; Touching user address?
2315          JRST PFLUSR
2316         CAIE T,UMOVE_-33        ; These guys are just like XCTR
2317          CAIN T,UMOVEM_-33
2318           JRST PFLUSR
2319         ;; Let XCT chains win.  We assume that none of the fetches along
2320         ;; the way caused the fault.
2321         CAIE T,XCT_-33
2322          BUG HALT,[PAGE FAULT IN SYSTEM AT],OCT,EPTPFO
2323         MOVE T,PFLSVT           ; Restore T for a moment
2324         MOVE T,@PFLINS          ; Pick up XCTed instruction
2325         JRST PFLOOP
2326
2327 ;;; Come here to cause faulting instruction to skip.
2328 PFLSKP: MOVE T,PFLSVT           ; Restore T
2329 REPEAT 2, AOS EPTPFO
2330         SKIPL PFLCLK            ; Unless clock was already off
2331          CONO PI,CLKON          ; turn it back on
2332 PFAILE: JRST 2,@EPTPFO
2333
2334 ;;; Come here on NXI error.
2335 PFLNXI:
2336
2337 ;;; We come here when the page fault is "soft" and it happened in user mode
2338 ;;; or while using XCTR, UMOVE, or UMOVEM.
2339 PFLUSR: MOVE T,EPTPFW
2340         TLNN T,%PFNXI           ; Non-existent IO Register?
2341          JRST PFLU1             ; Nope
2342         MOVE T,EPTPFO
2343         TLNE T,%PSUSR           ; NXI in User IOT mode is not fatal.
2344          TLNN T,%PSUIO
2345           BUG AWFUL,[NON-EX IO REG ],OCT,EPTPFW,[PC=],OCT,EPTPFO
2346 PFLU1:  MOVE T,PFLSVT           ; Restore T
2347         SKIPGE PFLCLK           ; Check for lossage
2348          BUG AWFUL,[PAGE FAULT WITH CLKOFF AT],OCT,EPTPFO
2349 TPFLT1: SETOM PFAILF            ; Cause CLK level to go to PFLU2
2350 CCLKRQ: CONO PI,CLKRQ
2351         JRST .                  ; Takes a while to go off...
2352
2353 ;;;CLKBRK comes back here at CLK level.
2354 PFLU2:  MOVE T,EPTPFO
2355         MOVEM T,CLKBRK          ;Save PC of page fault as place interrupted
2356                                 ;from.
2357         LDB E,[$PFPNO,,UPFW(U)] ;E: Virtual page number
2358         HLRZ D,UPFW(U)
2359         ANDI D,%PFNXI\%PFWRT\%PF2.9\%PF2.8      ;D: Page fault code
2360         MOVEI A,0               ;A: User interrupt bits
2361         TRNE D,%PFNXI           ;NXI in User IOT mode.
2362          JRST PFA7A
2363
2364 ;Drops through into PFA5
2365
2366 ] ;KS10P
2367 \f
2368 IFN KA10P,[
2369 CLKB1:  MOVE T,CLKBRK
2370         CONSZ 200
2371          JRST CLKFO1    ;FLOATING OVERFLOW ENABLED
2372 CLKFO2: CONSZ 20        ;SKIP IF AR OV INT NOT ENABLED
2373          CONSO 10       ;OV ENABLED, SKIP IF OV
2374           CONSZ 270000  ;NOT OV, CHECK PDL OV, MEM PROTECT, NXM
2375            JRST CLKB1C  ;PDL OV, NXM, ETC
2376         JRST CLKB1D     ;ONLY CLOCK BREAK, AR OV JUST ENABLED
2377
2378 CLKFO1: CONSO 100       ;SKIP ON FLOATING OVERFLOW
2379          JRST CLKFO2    ;NOT REALLY FLOATING OVERFLOW
2380 CLKB1C: JUMPL U,CNLJL   ;NULL JOB LOST
2381         MOVEI A,0       ;SET UP INTERRUPT BITS FOR USER
2382         CONSZ 20        ;SKIP IF OV NOT ENABLED
2383          CONSO 10       ;OV ENABLED, SKIP ON OV
2384           JRST CLB1A    ;NOT AROV
2385         PUSHJ P,AROV
2386 CLB1A:  CONSZ 200       ;SKIP IF FL OV NOT ENABLED
2387          CONSO 100      ;FL OV ENABLED, SKIP ON FL OV
2388           JRST CLB1B    ;NOT FLOATING OVERFLOW
2389         PUSHJ P,ARFOV
2390 CLB1B:  CONSO 270000    ;SKIP IF PDL OV, NXM, OR MEM PROTECT
2391          JRST CLB1X
2392         CONSZ 10000     ;NON EX MEM
2393          PUSHJ P,MEMHNG
2394         CONSO 200000
2395          JRST CLKB1H
2396         TRO A,%PIPDL    ;PDL OVFLO
2397         TLNN T,%PCUSR   ;SKIP IF IN USER MODE
2398          BUG HALT,[PDL OVERFLOW IN EXEC MODE]
2399 CLKB1H: CONSO 20000     ;MEM PROTECT
2400          JRST CLKB1G
2401         HLLZ D,UPQUAN(U)        ;PICK UP FAULT BITS
2402         TLNE D,1000
2403          TLNN D,770     ;ALL CONDITIONS WHICH ABORT INSTRUCTION
2404           JRST CLKB1J   ;(PLUS PAGE NXM FOR RANDOMNESS)
2405         TRZ A,%PIPDL    ;INSTRUCTION ABORTED, DON'T SET PDL OV
2406         HLLZ T,UPOPC(U)
2407         LSH T,5
2408         HRR T,UPOPC(U)  ;FIX UP OPC
2409         MOVEM T,CLKBRK  ;RESET PC FROM OPC
2410         AOS NPGFLT
2411         HLRZ E,UPJPC(U) ;GET VIRTUAL PAGE # (LH OF JPC)
2412         TRNN E,400
2413          JRST CFHFPF
2414         ANDI E,377      ;FLUSH AGE ETC
2415 ] ;KA10P
2416         ;DROP THROUGH INTO PFA5
2417 \f
2418 IFE KA10P,[
2419 PFA5:   AOS NPGFLT
2420 ] ;IFE KA10P
2421         MOVE TT,LUMPS
2422         HRRZ W,USER
2423 IFN KA10P,[
2424         TLNE D,320      ;SKIP IF REALLY PAGE FAULT
2425          JRST CFH4      ;OTHERWISE WRITE IN READ ONLY OR EXECUTING IMPURE PAGE
2426 ] ;KA10P
2427
2428 ;COME HERE WITH
2429 ;  A    BITS FOR USER'S PIRQC
2430 ;  D    PAGE FAULT BITS OR CODE
2431 ;  E    VIRTUAL PAGE NUMBER OF PAGE FAILURE
2432 ;  TT   THE UMAPS SETTING
2433 ;THE MYSTERIES OF W:
2434 ;  RH IS A USER INDEX
2435 ;  LH 0 => NORMAL PAGE FAULT
2436 ;     NON0 => SWAP IN REQUEST FOR OTHER REASON.  D,TT SHOULD BE 0.
2437 ;     SPECIFICALLY,
2438 ;     4.9 => DMA DEVICE SWAP-IN, SEE SWIRQB, SWPPIN
2439 ;     4.8 => FROM SCHEDULER, TO GIVE INTERRUPT (?)  THIS IS NO LONGER USED,
2440 ;            PROBABLY. 
2441 ;     4.7 => FROM CFHAHD, TO PAGE AHEAD.  THIS IS ONE LEVEL OF RECURSIVE
2442 ;            USE OF CFHSW1. 
2443 ;  FOR A NORMAL PAGE FAULT, THE USER PC IS IN CLKBRK.
2444
2445 CFHSW1:         HRRZM E,CFHUVP  ;USER'S VIRTUAL PAGE NUMBER
2446                 TRZN E,200
2447                  JRST CFH1
2448                 MOVEI C,UPGCPH(W)       ;VIRTUAL ADDRESS IN USER'S HIGH SEG
2449                 TLNN TT,%UMMPU  ;IS MY UPPER NORMAL?
2450                  JRST CFH2      ;YES, USE MY UPPER CPB
2451                 MOVEI C,UPGCPH(TT) ;NO, TRY HIS UPPER.
2452                 TLNE TT,%UMUTL  ;IS MY UPPER GOING TO HIS LOWER?
2453                  MOVEI C,UPGCP(TT) ;YES, TRY HIS LOWER.
2454                 JRST CFH2
2455
2456 CFH1:           MOVEI C,UPGCP(W)        ;VIRT ADDRESS IN USER'S LOW SEG
2457                 TLNN TT,%UMMPL
2458                  JRST CFH2      ;MY LOWER DBR NOT HACKED
2459                 MOVEI C,UPGCP(TT)
2460                 TLNE TT,%UMLTU  ;WAS MY LOWER HACKED TO POINT TO UPPER?
2461                  MOVEI C,UPGCPH(TT) ;YES.
2462 CFH2:           ROT E,-1
2463                 ADD C,E
2464                 HRLI C,222200
2465                 SKIPGE E
2466                  HRLI C,2200
2467                 MOVE T,C        ;CALCULATE MAP ENTRY B.P. FROM CIRC PTR B.P.
2468                 ADD T,[(200000-2000)UPGMP-UPGCP]
2469                 LDB E,C         ;CIRC MEM USE POINTER FOR PAGE FAULT
2470                 JUMPE E,CFH4    ;ADDRESS IS IN REAL ILM
2471                 CAIN E,-1
2472                  JRST CFH4      ;ON REFERENCE TO ABS PAGE ALSO ILM
2473 IFN KL10P,[     CAIE D,%PFILW
2474                  JRST CFHW1
2475                 LDB I,T
2476                 JRST .+1(I)
2477                   BUG           ;?
2478                   JRST CFH4     ;WRITE IN READ ONLY?
2479                   JRST CFHRWF   ;READ WRITE FIRST
2480                   BUG           ;?
2481 ] ;KL10P
2482 IFN KS10P,[     CAIN D,%PFWRT\%PF2.8    ;WRITE IN READ ONLY
2483                  JRST CFH4
2484                 CAIN D,%PFWRT\%PF2.9    ;READ WRITE FIRST
2485                  JRST CFHRWF
2486                 TRNE D,%PF2.8\%PF2.9    ;PAGE NOT IN MAP
2487                  BUG HALT,[BOGUS PAGE FAIL CODE]
2488 ] ;KS10P
2489 IFN KA10P,[
2490                 TLNE D,40
2491                  JRST CFHRWF
2492 ] ;KA10P
2493 ;REFERENCE TO PAGE WITH NO ACCESS IN MAP.
2494 CFHW1:          SKIPGE RPCL(W)
2495                  JUMPGE W,CFF1  ;BEING RPCLSRED?
2496                 MOVEM A,CFHAS
2497                 AOSE CIRPSW
2498                  JRST CFH5      ;CIRPSW NOT AVAILABLE
2499                 TRZE E,400000
2500                  TRNE E,200000
2501                   JRST CFHSW3
2502                 CAML E,MMPMX
2503                  BUG            ;MMP OUT OF RANGE
2504                 MOVE C,E        ;CIRC PNTR ALREADY POINTS TO MMP
2505                 ADD C,MMPEAD
2506                 JRST CFHSW4
2507
2508 CFHSW3:         PUSHJ P,UCPRL   ;FIND MMP
2509                   200000,,.+2
2510                  BUG            ;NONE?
2511                 SUB P,[4,,4]
2512 CFHSW4:         LDB D,[410200,,(C)]     ;TWO BITS OF MMP ENTRY GIVES DISPOSITION OF PAGE
2513                 AOS NRPI(D)
2514                 JRST @CFHDT(D)
2515
2516 CFHDT:  CFHPI   ;IN
2517         CFHPCI  ;COMING IN
2518         CFHPO   ;OUT
2519         CFHPGO  ;GOING OUT
2520 \f
2521 ;PAGE FAULT IN JOB BEING PCLSR'D.
2522 CFF1:   MOVE C,CLKBRK
2523         TLNE C,%PCUSR
2524          BUG            ;BEING RPCLSRED IN USER MODE
2525 IFN KA10P,[
2526         MOVSI D,1770
2527         ANDCAM D,UPQUAN(W)      ;CLR PG FLT
2528         LPMR UPGML(W)
2529         CONO 470000+APRCHN      ;CLR PDL OV + QT OV + MPV + NXM
2530 ] ;KA10P
2531         MOVE T,[BADBTS]
2532         IOR T,MSKST(W)
2533         AND T,A
2534         IORM T,PIRQC(W)
2535 IFE KA10P,[
2536         MOVE T,CLCX(W)          ;RESTORE UPT BUT NOT ACS
2537         HRLI T,300000
2538         DATAO PAG,T
2539 ] ;IFE KA10P
2540         CONO PI,CLKOFF          ;GO ALLOW SELF TO GET RPCLSRED
2541         JRST 10,UFL1            ;GO INTO UFLS WITH CLK OFF RATHER THAN
2542                                 ;IN PROGRESS
2543
2544 CFHRWF:                 ;HANDLE "WRITE IN READ-WRITE-FIRST PAGE" PAGE FAULT.
2545 IFN KA10P,[
2546         TLNE D,10
2547          JRST CFHW1     ;SOMETIMES NO ACCESS SEEMS TO BE ON TOO
2548         LDB I,T
2549         CAIE I,2
2550          BUG            ;GOT "WRITE IN R-W-F PAGE" BUT PAGE ISN'T R-W-F.
2551 ] ;KA10P
2552         MOVEI I,3
2553         DPB I,T
2554         MOVEM A,CFHAS
2555         JRST CFHX1
2556
2557 ;; EXIT FROM PAGE FAULT HANDLING FOR NON-ERROR FAULT.
2558 ;; C SHOULD CONTAIN 0 IF CAN CONTINUE NOW, OR A FLSINS TO WAIT WITH.
2559 ;; A SHOULD CONTAIN -1 IF FAULT HANDLED SUCCESFULLY (PAGE IN OR ON ITS WAY), ELSE 0.
2560 CFHX:   SETOM CIRPSW
2561         TLNN W,200000
2562          JUMPL W,CPOPJ
2563 CFH5A:  JUMPE C,CFHX1   ;IF NOT GOING TO WAIT, SKIP NPGWTU CODE
2564         MOVSI D,%SWPGW
2565         IORM D,USWST(W) ;WAITING FOR PAGE
2566         AOS NPGWTU      ;KEEP COUNT OF USERS WAITING FOR A PAGE
2567         SKIPN FLSINS(W)
2568          MOVEM C,FLSINS(W)
2569         SKIPE FLSINS(W)
2570          CLEARM DLSRCH
2571 CFHX1:  MOVE A,CFHAS
2572 IFN KA10P, MOVSI D,1770         ;CLEAR FAULT STATUS BITS
2573         MOVE U,USER
2574         JRST CFH6
2575
2576 ;; WAIT FOR CIRPSW TO BE AVAILABLE.
2577 CFH5:   SETZ A,
2578         JUMPL W,CPOPJ
2579         MOVE C,[SKIPL CIRPSW]
2580         AOS NLPPGC
2581         JRST CFH5A
2582 \f
2583 ;PAGE FAULT ON PAGE THAT'S REALLY IN CORE.
2584 CFHPI:  PUSHJ P,CFHAHC  ;SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2585         MOVSI D,MMPPGA
2586         TDNE D,(C)
2587          AOS NPGAHR     ;COUNT NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2588         ANDCAB D,(C)
2589         MOVSI D,MMPPGB
2590         TDNE D,(C)
2591          AOS NPGBHR     ;COUNT NUMBER OF PAGES AGED BY PAGE-BEHIND WHICH WERE USED AGAIN.
2592         ANDCAB D,(C)
2593         HRLI C,2200
2594         PUSH P,C        ;SAVE MMP ENTRY ADDRESS FOR PPIUM.
2595         PUSHJ P,UCPRL
2596             100000,,.+2 ;RETURN ON MEMPNT
2597          BUG            ;NO MEMORY LINKED IN?
2598         SUB P,[4,,4]    ;FIND MEMBLT INDEX
2599         POP P,C
2600         TLNE D,MMPBAD   ;WAS THIS PAGE RECENTLY A PAR ERR VICTIM?
2601          JRST CFHPB     ;YES; READ IT BACK OFF THE DISK IF POSSIBLE.
2602 IFN E.SP,[
2603         JUMPGE W,E.SBAR ;IF NOT CALLED FROM SWPPIN
2604         HRRZ H,DISUSR   ;CHECK TO SEE IF SERVICING E&S
2605         CAIN H,(W)      ;NOT DISPLAY, THEN SKIP
2606          PUSHJ P,E.SPGI ;ELSE TIE DOWN PAGE
2607 E.SBAR:
2608 ]
2609         MOVE A,T
2610         HLLZS MMSWP(A)  ;CLEAR LENGTH OF CIRC LIST (BUT NOT EXEC PGS COUNT)
2611         MOVE D,C
2612         HRLI D,(TDNE T,)
2613         PUSHJ P,PPIUM   ;PUT PAGE INTO USERS' MAPS
2614 IFN E.SP,SETZM  E.SPGH  ; CLEAR QSWI1 FLAG
2615         MOVEI C,0
2616         MOVNI A,1
2617         JRST CFHX
2618
2619 ;COME HERE FOR PAGE WHICH SEEMS TO BE IN CORE, BUT HAD A PAR ERR RECENTLY.
2620 ;"SWAP IT OUT", SO IF IT'S PURE IT WILL JUST BE READ BACK FROM DISK.
2621 CFHPB:  PUSH P,W
2622         MOVE A,T
2623         SETOM CIRPSW    ;UNLOCK, SO SWPOPG CAN RE-LOCK.
2624         MOVE C,USER     ;TELL SWPOPG WHICH JOB SHOULDN'T BE PCLSR'ED.
2625         PUSHJ P,SWPOPL  ;"SWAP OUT" THE PAGE (EVEN IF LOCKED DOWN)
2626          JRST [ POP P,W ;FAILED TO GO OUT.  COULD BE EXEC PAGE POINTING TO IT,
2627                 SETZ A, ;OR A JOB THAT CAN'T BE PCLSRED RIGHT NOW.
2628                 MOVSI C,(CAIA)  ;WAIT A LITTLE AND TRY AGAIN (HOPE FOR THE BEST)
2629                 JRST CFHX ]
2630         POP P,W
2631         AOSE CIRPSW     ;SWPOPG UNLOCKS; RE-LOCK.
2632          JRST CFH5      ;OR ELSE GO INTO PAGE-WAIT TILL CIRPSW FREE.
2633         MOVE C,SWOMMP
2634         JRST CFHSW4     ;TRY AGAIN TO REFERENCE PAGE, SWAPPING IT BACK IN.
2635 \f
2636 ;ON A RANDOM PAGE FAULT, SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2637 ;ASSUMES W SET UP AS FOR CFHSW1, AND TT
2638 CFHAHC: MOVE D,CFHUVP   ;GET USER'S VIRTUAL PAGE NUMBER.
2639         TLNN W,-1       ;PAGE AHEAD ONLY FOR NORMAL PAGE FAULT (SO PC IS IN CLKBRK).
2640          SKIPN PAGAHD(W)        ;IS PAGE-AHEAD WANTED FOR THIS JOB?
2641           POPJ P,
2642         MOVSI T,%UMMPU
2643         TRNN D,200
2644          MOVSI T,%UMMPL
2645         TDNE TT,T       ;NO PAGE-AHEAD ON PAGE NOT MAPPED NORMALLY.
2646          POPJ P,
2647         HLRZ H,PAGRAN(W)
2648         HRRZ T,PAGRAN(W)
2649         CAML D,H        ;IS PAGE IN RANGE FOR AUTOMATIC PAGE-AHEAD?
2650          CAML D,T       ;IF SO, GO DO IT.
2651           POPJ P,
2652         PUSH P,C
2653         PUSHJ P,CFHAHD
2654         POP P,C
2655         POPJ P,
2656
2657 ;AUTOMATIC PAGE-AHEAD AND PAGE-BEHIND.
2658 ;WHEN PAGE N IS PUT INTO THE MAP, PAGE N+1 IS SWAPPED IN
2659 ;AND PAGE N-1 IS SWAPPED OUT.
2660 ;(ACTUALLY, 1 IS A PARAMETER, IN THE PAGAHD VARIABLE)
2661 CFHAHD: PUSH P,CFHUVP
2662 ;LOOP, REQUESTING SWAP-IN FOR THE NEXT N PAGES.  E HAS PAGE NUMBER TO SWAP IN.
2663 CFHAH1: MOVE E,CFHUVP
2664         HLRE A,PAGAHD(W)
2665         MOVE T,A
2666         ADD A,(P)
2667         CAMN A,E                ;DETECT END OF LOOP.
2668          JRST CFHAH2
2669         SKIPL T                 ;ELSE INCREMENT OR DECREMENT PAGE NUMBER.
2670          AOSA E
2671           SOS E
2672         PUSHJ P,CFHRNG          ;IS PAGE NUMBER IN RANGE FOR PAGE-AHEAD?
2673          JRST CFHAH2
2674         PUSH P,W
2675         HRLI W,500000           ;PAGE AHEAD THE PAGE.  100000 MEANS PAGE-AHEAD.
2676         SETZB D,TT
2677         SETOM CIRPSW            ;ALLOW CFHSW1 TO LOCK CIRPSW.
2678         PUSH P,CFHAS
2679         PUSHJ P,CFHSW1
2680         POP P,CFHAS
2681         SETZM CIRPSW            ;BUT REALLY IT'S ALREADY LOCKED SO KEEP IT SO.
2682         POP P,W
2683         SKIPN A
2684          AOS NPGAH1             ;COUNT NUMBER OF TIMES AN ATTEMPT FAILS.
2685         JRST CFHAH1
2686
2687 ;NOW IT'S TIME FOR PAGE-BEHIND.  E HAS PAGE NUMBER TO SWAP OUT.
2688 CFHAH2: MOVE E,(P)
2689 ;???? IS THERE ANY NEED TO PRESERVE U, EVER, INSIDE CFHSW1?
2690         PUSH P,U
2691         HRRE A,PAGAHD(W)        ;GET PAGE-BEHIND DISTANCE.
2692         JUMPE A,CFHAH4
2693         ADDB A,E                ;COMPUTE WHICH PAGE TO PAGE OUT.
2694         PUSHJ P,CFHRNG          ;SKIP IF PAGE IS IN RANGE FOR PAGE-BEHIND.
2695          JRST CFHAH4
2696         MOVE U,W
2697         PUSHJ P,UPLC            ;LOOK UP THE PAGE IN THE MAP.
2698         LDB D,Q                 ;D GETS CIRC PNTR
2699         JUMPE D,CFHAH4          ;NO PAGE THERE
2700         CAIN D,-1
2701          JRST CFHAH4            ;ABSOLUTE PAGE, DO NOTHING.
2702         LDB D,T
2703         TRO D,PMAGEM            ;AGE THE PAGE, IF THE PAGE IS REALLY IN THE MAP,
2704         TRNE D,600000
2705          DPB D,T
2706         AOS NPGBHA              ;COUNT PAGES AHED FOR PAGE-BEHIND.
2707         MOVE D,T                ;SAVE B.P. TO PAGE MAP HALFWORD, FOR CFHAH6.
2708         MOVE C,Q                ;STARTING FROM CIRC PTR, FIND MMP
2709         PUSHJ P,UCPRL
2710             200000,,.+2
2711          BUG                    ;IF NONE FOUND
2712         SUB P,[4,,4]            ;FOUND MMP, C POINTS TO IT
2713         MOVE E,C                ;SAVE ADDRESS OF MMP ENTRY
2714         MOVSI T,MMPTMP\MMPOUT   ;IF PAGE IS IN TRANSIT OR OUT, DO NOTHING TO IT.
2715         TDNE T,(C)
2716          JRST CFHAH6
2717         MOVE T,CLKBRK
2718         TLNN T,%PCUSR           ;IF JOB IN EXEC MODE, CAN'T SWAP OUT PAGE, SO JUST LEAVE AGED.
2719          JRST CFHAH6
2720         MOVE T,MEMFR
2721         SUB T,NCBCOM            ;IF LOTS OF FREE MEM, DON'T SWAP OUT.
2722         SUB T,SILNG
2723         CAML T,CFHAHS
2724          JRST CFHAH6
2725         PUSHJ P,UCPRL           ;GET CORE PAGE NUMBER IN T.
2726             100000,,.+2
2727          BUG
2728         SUB P,[4,,4]
2729         HLRZ A,MMSWP(T)
2730         JUMPN A,CFHAH6          ;POINTED TO BY AN EXEC PAGE, E.G. 340, CAN'T SWAP OUT.
2731         PUSH P,E
2732         PUSH P,D
2733         PUSH P,W
2734         MOVE A,T                ;PHYSICAL PAGE # TO SWAP OUT
2735         HRRZ C,W                ;DON'T PCLSR ME
2736         SETOM CIRPSW            ;SWPOPG WILL WANT TO RE-LOCK CIRPSW.
2737         PUSHJ P,SWPOPG          ;SWAP OUT
2738          JRST CFHAH5            ;CAN'T SWAP OUT => LEAVE JUST AGED.
2739         AOS NPGBHD              ;COUNT PAGES SWAPPED OUT BY PAGE-BEHIND.
2740 CFHAH5: POP P,W
2741         POP P,D
2742         POP P,E
2743         POP P,U
2744         POP P,CFHUVP
2745         AOS CIRPSW              ;SWPOPG UNLOCKS; RE-LOCK.
2746         POPJ P,                 ;CAN'T GET LOCKED BY SOMEONE ELSE, WE ARE AT CLOCK LEVEL
2747
2748 ;HERE FOR PAGE-BEHIND PAGE WHICH WE CAN'T OR DON'T WANT TO SWAP OUT.
2749 CFHAH6: MOVSI T,MMPPGB          ;IT HAS ALREADY BEEN AGED.  MARK IT FOR METERING PURPOSES.
2750         IORM T,(E)              ;E POINTS TO MMP ENTRY.
2751 CFHAH4: POP P,U
2752         POP P,CFHUVP
2753         POPJ P,
2754
2755 ;SKIP IF PAGE NUMBER IN E IS IN RANGE FOR PAGE-AHEAD OR PAGE-BEHIND.
2756 ;ASSUMES USER INDEX IN W.  CLOBBERS T.
2757 CFHRNG: CAIL E,400
2758          POPJ P,
2759         HLRZ T,PAGRAN(W)
2760         CAIGE E,(T)
2761          POPJ P,
2762         HRRZ T,PAGRAN(W)
2763         CAIL E,(T)
2764          POPJ P,
2765         JRST POPJ1
2766
2767 EBLK
2768
2769 CFHAHS: 20              ;IF LESS THAN THIS MUCH FREE MEM, PAGE-BEHIND SHOULD SWAP OUT.
2770
2771 NPGAHD: 0               ;NUMBER OF PAGES WE ACTUALLY SWAPPED IN FOR PAGE-AHEAD.
2772 NPGAH1: 0               ;NUMBER OF TIMES WE WERE UNABLE TO PAGE AHEAD.
2773 NPGBHD: 0               ;NUMBER OF PAGES WE ACTUALLY SWAPPED OUT FOR PAGE-BEHIND.
2774 NPGBHA: 0               ;NUMBER OF PAGES WE DID PAGE-BEHIND.
2775 NPGAHR: 0               ;NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2776 NPGBHR: 0               ;NUMBER OF PAGES AGED FOR PAGE BEHIND AND USED AGAIN.
2777
2778 BBLK
2779 \f
2780 ;REFERENCE TO SWAPPED OUT PAGE, MMP ADDRESS IN C.  SWAP IN THE PAGE.
2781 ;W HAS THE USER INDEX AND FLAGS.
2782 CFHPO:  PUSHJ P,CFHPOA
2783          JRST [ SETZ A, ;FAILED.  RETURN CODE FOR FAILURE, IF THIS IS FOR DEVICE (W<0).
2784                 JRST CFHX]
2785         TLNN W,100000           ;IF THIS IS A PAGE-AHEAD REQUEST,
2786          JRST CFHPOB
2787         MOVSI A,MMPPGA          ;MARK THE MMP ENTRY SO,
2788         IORM A,(C)
2789         AOS NPGAHD              ;AND COUNT IT AS A SUCCESSFUL ATTEMPT TO PAGE AHEAD.
2790 CFHPOB: TLNN W,200000
2791          JUMPL W,CFHPO2
2792         PUSHJ P,CFHAHC          ;ORDINARY PG FAULT => MAYBE PAGE AHEAD.
2793         MOVSI D,%SWBEM
2794 IFN SWPWSP,[            ;SWAPPING IN A PAGE FOR THIS GUY 
2795          ANDCAM D,USWST(W)      ;SO CLEAR BEST EFFORT MADE TO SWAP OUT BIT
2796 ];SWPWSP
2797 IFE SWPWSP,[
2798         TDNN D,USWST(W)         ;IF JOB IS BRINGING IN FIRST PAGE
2799          JRST CFHPO2            ; SINCE BEING SWAPPED OUT,
2800         ANDCAM D,USWST(W)       ;CLEAR BEST EFFOR MADE TO SWAP OUT BIT
2801         EXCH U,W                ;AND MAKE SWAP HISTORY TABLE ENTRY
2802         MOVSI T,0               ;FOR "BEGIN LOADING"
2803         PUSHJ P,SWPKHT
2804         EXCH U,W
2805 ];SWPWSP
2806 CFHPCI:
2807 CFHPGO:
2808 CFHPO2: MOVNI A,1       ;SIGNAL "SUCCESS"
2809         TLNN W,200000
2810          JUMPL W,CFHX
2811         MOVSI D,MMPTMP          ;BIT ON IF PAGE "IN TRANSIT"
2812         SKIPN FLSINS(W)
2813          MOVEM D,EPDL2(W)       ;HANG USER UNTIL PAGE GETS WHERE IT'S GOING
2814         HRLI C,(TDNE T,)        ;COMBINE WITH ADDRESS OF MMP
2815         AOS NLPPAG
2816         JRST CFHX
2817 \f
2818 ;SWAP IN PAGE.  W HAS USER INDEX AND FLAGS.  C HAS MMP ADDRESS.
2819 ;SKIPS IF SUCCESSFUL.  OTHERWISE RETURNS FLSINS IN C.
2820 ;SIGN BIT IN W IS SET FOR SWAP IN FOR DEVICE OR FOR PAGE-AHEAD
2821 ;(THAT IS, NOT ONE WHICH A JOB MUST WAIT FOR)
2822 ;SO DON'T INCREMENT SOME COUNTERS AND DON'T BOTHER WITH FLSINS IN C.
2823 CFHPOA:
2824 IFE SWPWSP,[
2825         SKIPGE USWSCD(W)        ;IF SWAP BLOCKED, EITHER UNBLOCK OR GIVE UP.
2826          JRST CFBO1
2827 CFBO2:
2828 ];SWPWSP
2829 IFN SWPWSP,[
2830         MOVE E,USWST(W) ;IF SWAPPED OUT, WE ARE EITHER GOING TO ENTER
2831         TLNE E,%SWOUT   ;THE LOADING STATE OR THE SWAP BLOCKED STATE
2832          JRST CFSB
2833 CFSB1:
2834 ];SWPWSP
2835         MOVSI E,MMPISW
2836         AND E,(C)
2837         CONO PI,UTCOFF-1
2838         JUMPN E,CFHPO5  ;INITIAL SWAPIN; GIVE UP AND WAIT NOW IF TUT IS LOCKED.
2839 CFHPO7: PUSHJ P,HMRQC   ;GET PHYS MEM BLOCK, NUMBER IN A.
2840          JRST CFHPO1    ;MEM NOT AVAILABLE
2841         MOVEI B,1
2842         DPB B,[410200,,(C)]     ;INDICATE COMING IN
2843         HRRZ B,(C)              ;OLD CP OF MMP
2844         MOVEM B,MEMPNT(A)       ;BECOMES LINK OUT OF CORE BLOCK
2845         HLRZ B,1(C)             ;B := DISK ADDRESS
2846         LDB I,[$MMPUN,,(C)]     ;I := DISK NUMBER
2847         CAIL I,NQS
2848          BUG
2849         HRLM B,MEMPNT(A)        ;SET DISK ADDRESS CORE BLOCK COMING FROM
2850 IFN SWPWSP,[
2851         MOVE D,USWST(W)
2852         TLNN D,%SWLOD
2853          AOSA NPLBNL
2854           AOS NPLBLJ
2855 ];SWPWSP
2856         SKIPE E         ;IF INITIAL SWAP IN PAGE, SOS THE TUT NOW
2857          PUSHJ P,CFHPO8 ;SINCE WE ARE DISSOCIATING THE PAGE FROM THE DISK BLOCK.
2858         CAIGE A,TSYSM
2859          CAIGE A,SYSB
2860           BUG           ;SHOULDN'T HAVE TO SWAP IN THE SYSTEM
2861         CONO PI,UTCON-1 ;LEAVE CLKCHN OFF.
2862         SOS NPGSWO
2863         AOS SWIPRQ      ;TOTAL SWAP IN REQUESTS
2864 ;; MARK THE PHYSICAL MEMORY BLOCK AS BEING SWAPPED INTO BY THIS PAGE.
2865         MOVEI B,MUSWPG
2866         DPB B,[MUR,,MEMBLT(A)]
2867         MOVEI B,600000(A)
2868         HRRM B,(C)      ;MAKE CP OF MMP POINT TO MEMPNT
2869         MOVE TT,C
2870         SUB TT,MMPEAD
2871         DPB TT,[MMMPX,,MEMBLT(A)]       ;STORE MMP INDEX IN MEMBLT
2872         MOVEI TT,.BM MLO
2873         ANDCAM TT,MEMBLT(A)     ;SET END OF LIST IN THIS BLOCK
2874 ;; PUT THE TRANSFER ON THE SWAP IN LIST.
2875         CONO PI,UTCOFF-1
2876         HLRZ TT,SINLST(I)       ;GET PREV BLOCK
2877         SKIPE TT
2878          DPB A,[MLO,,MEMBLT(TT)]        ;CHAIN TO PREV BLOCK
2879         SKIPN TT
2880          MOVEM A,SINLST(I)      ;OR TO HEADER IF FIRST
2881         HRLM A,SINLST(I)        ;AND SET NEW LAST BLOCK
2882         AOS SILNG               ;AOS NUMBER OF PENDING SWAP IN RQS.
2883         PUSHJ P,QSTRT1          ;WAKE UP DISK INTERRUPT LEVEL.
2884         CONO PI,UTCON-1
2885 ;; UPDATE SWAP HISTORY TABLE.
2886         HRLZ TT,W
2887         IDIVI TT,LUBLK          ;TT 3.1-3.8 GETS USER NUMBER, BASHES I
2888 IFN SWPWSP,[
2889         MOVSI T,%SWLOD
2890         TDNE T,USWST(W)
2891          TLO TT,(SETZ)
2892 ];SWPWSP
2893         MOVE T,CFHUVP
2894         DPB T,[321000,,TT]
2895         HRR TT,TIME
2896         MOVEM TT,@PGIHTP
2897         AOS T,PGIHTP
2898         MOVE TT,UTRNTM(W)
2899         MOVEM TT,PGIHTL-1(T)
2900         MOVEI TT,PGIHTB
2901         CAIL T,PGIHTB+PGIHTL
2902          MOVEM TT,PGIHTP
2903         TLNN W,200000
2904          JUMPL W,POPJ1
2905         AOS USIPRQ(W)
2906         JRST POPJ1      ;HANG USER UNTIL PAGE IN
2907 \f
2908 ;IF SWAPPNG IN "INITIAL SWAP IN" PAGE, CHECK TO SEE WHETHER TUT IS AVAILABLE.
2909 ;WE CAN'T SWAP THE PAGE IN IF NOT.
2910 CFHPO5: LDB I,[$MMPUN,,(C)]     ;GET DSK #
2911         CAIL I,NQS
2912          BUG
2913         SKIPL QTUTO(I)
2914          JRST CFHPO7    ;DISK TUT AVAIL
2915         CONO PI,UTCON-1
2916         TLNN W,200000
2917          JUMPL W,CPOPJ  ;NO COUNTER AOS IF SWAPIN FOR DEVICE OR PAGE AHEAD.
2918         MOVE C,[SKIPGE QTUTO]   ;ALSO MUSTN'T SMASH C
2919         ADD C,I
2920         AOS NLPPGT
2921         POPJ P,
2922
2923 ;LATER ON, COME HERE TO SOS THE TUT, AFTER GETTING THE MEM, WHEN WE CAN NO LONGER BLOCK.
2924 CFHPO8: ANDCAM E,(C)    ;CLEAR INITIAL SWAPIN BIT
2925         MOVE D,B        ;GET TRK #
2926         PUSHJ P,TUTPNT
2927         CAIGE B,TUTMNY
2928          SOJL B,[JRST 4,.]
2929         DPB B,D
2930         HRRZS 1(C)      ;CLEAR ASSIGNED TRACK NUMBER SO NEW SPACE ASSIGNED ON SWAPOUT
2931         POPJ P,
2932
2933 ;HERE IF NO MEMORY TO SWAP PAGE INTO.
2934 CFHPO1: CONO PI,UTCON-1
2935         TLNN W,200000
2936          JUMPL W,CPOPJ
2937         SKIPGE MEMFRZ           ;IF BECAUSE MEMFRZ LOCKED, MAKE JOB WAIT FOR MEMFRZ.
2938          JRST CFHPO4
2939         MOVE C,[SKIPL MEMFRZ]
2940         AOS NLPPGM
2941         POPJ P,
2942
2943 CFHPO4: MOVE C,[PUSHJ P,CFHPO3]
2944         MOVN D,SOLNG
2945         SUB D,SWPOPR    ;- # PGS GOING OUT
2946         ADDI D,10.      ;MAKE SURE AT LEAST 10. GOING OUT
2947         JUMPLE D,.+2
2948          ADDM D,SWPOPR
2949         MOVEI D,1
2950         SKIPN FLSINS(W)
2951          MOVEM D,EPDL2(W)
2952         AOS NLPPG3
2953         POPJ P,
2954
2955 CFHPO3: PUSH P,A        ;FLSINS ROUTINE (NEEDED MEM)
2956         MOVE A,MEMFR
2957         SUB A,NCBCOM
2958         CAIL A,5(T)
2959          JRST POPAJ1    ;NEEDED MEM AVAILABLE
2960         ADD A,SOLNG
2961         ADD A,SWPOPR
2962         SUBI A,10.(T)
2963         JUMPGE A,POPAJ  ;WILL EVENTUALLY WIN
2964         MOVNS A
2965         ADDM A,SWPOPR   ;LOSING - SWAP SOME MORE STUFF OUT
2966         JRST POPAJ
2967
2968 IFE SWPWSP,[
2969 ;HERE IF TRYING TO SWAP IN A PAGE BUT SWAP BLOCKED
2970 CFBO1:  MOVE E,MEMFR    ;GUY SWAPPED BLOCKED
2971         SUB E,NCBCOM
2972         SUB E,AUSOPG
2973         SUB E,SILNG
2974         ADD E,SOLNG
2975         JUMPGE E,CFBO3  ;SEEMS TO BE ROOM SO LET IT COME IN
2976         TLNN W,200000
2977          JUMPL W,CPOPJ  ;HANG GUY UNTIL SWAP BLOCK GOES AWAY
2978         MOVE C,[SKIPGE USWSCD]
2979         ADDI C,(W)
2980         AOS NTSBUB
2981         AOS NLPPGB
2982         POPJ P,
2983
2984 CFBO3:  AOS NTSBUP
2985         JRST CFBO2
2986 ];SWPWSP
2987 \f
2988 OVHMTR WS       ;WORKING-SET COMPUTATIONS
2989
2990 IFN SWPWSP,[
2991 ;HERE WHEN A SWAPPED OUT OR SWAP BLOCKED JOB TRIES TO SWAP IN A PAGE.
2992 ;JOB IN W, C -> MMP, USWST(W) IN E.  RETURN TO CFSB1.
2993 ;WE DECIDE WHETHER ENOUGH CORE CAN BE GARNERED TO LET HIM IN, AND PUT
2994 ;HIM INTO THE LOADING STATE, OR ELSE PUT HIM INTO THE SWAP BLOCKED STATE.
2995
2996 CFSB:   PUSH P,C
2997         TLNN E,%SWSB            ;ALREADY SWAP BLOCKED?
2998          PUSHJ P,WSRCM          ;NO, RECOMPUTE WORKING SET
2999         POP P,C
3000         MOVE B,USWPRI(W)        ;FIND SUM OF WS'S OF SWAPPED IN GUY'S WITH BIGGER USWPRI
3001         PUSHJ P,WSAVL
3002         MOVE D,USVWRK(W)        ;COMPUTE AMT OF WS NOT ALREADY IN CORE
3003         SUB D,UWRKST(W)
3004 IFL TSYSM-356.,[
3005         CAML D,[TSYSM-100.,,]
3006          JRST .+3               ;WS > PHYSICAL MEM, ALLOW IN ANYWAY, FOO!
3007 ];TSYSM
3008         CAMGE A,D               ;WILL IT FIT IN AVAILABLE MEM?
3009          JRST CFSB2             ;NO, SWAP BLOCK
3010         PUSHJ P,CFELD           ;YES, ENTER 'LOADING' STATE
3011         JRST CFSB1              ;AND GO AHEAD AND BRING IN THE PAGE
3012
3013 CFSB2:  TLNN W,200000           ;IF PAGE-AHEAD, JUST RETURN.
3014          JUMPL W,CPOPJ
3015         MOVE T,TIME
3016         MOVSI A,%SWSB           ;ALREADY SWAP BLOCKED?
3017         TDNE A,USWST(W)
3018          JRST CFSB3
3019         IORM A,USWST(W)         ;NO, ENTER SWAP BLOCKED STATE
3020         AOS NUSWB
3021         MOVEM T,USWTIM(W)
3022 CFSB3:  MOVE U,W
3023         MOVSI T,3_16.           ;MAKE SWAP HISTORY TABLE ENTRY FOR SWP BLK
3024         PUSHJ P,SWPKHT
3025         MOVE T,TIME
3026         SUB T,USWTIM(W)         ;HOW LONG SWAP BLOCKED
3027         CAIGE T,20.*30.         ;IF LESS THAN 20 SECONDS,
3028          SKIPA T,[15.]          ; SLEEP FOR 1/2 SECOND,
3029           MOVEI T,5*30.         ; OTHERWISE SLEEP FOR 5 SECONDS
3030         ADD T,TIME
3031         SKIPN FLSINS(W)
3032          MOVEM T,EPDL2(W)
3033         MOVEI A,0               ;WILL THEN TAKE FAULT AGAIN AND
3034         MOVE C,[CAMLE T,TIME]   ;CHECK AVAILABLE MEMORY AGAIN
3035         AOS NLPPGB
3036         POPJ P,
3037
3038 ;ROUTINE TO FIND MEMORY AVAILABLE TO A JOB WHOSE USWPRI IS IN B
3039 ;RETURNS IN LH(A) SUITABLE FOR COMPARING TO UWRKST.  SMASHES T,TT,J
3040
3041 WSAVL:  MOVEI J,2*LUBLK         ;DON'T LOOK AT SYS NOR CORE JOB
3042         MOVSI T,%SWOUT+%SWLOD   ;IF THESE BITS CLEAR, JOB IS SWAPPED IN
3043         MOVE A,MEMFR            ;FREE CORE 
3044         SUB A,NCBCOM            ;FUDGE FOR THINGS IN PROCESS
3045         SUB A,SILNG             ;..
3046         ADD A,SOLNG             ;..
3047         ADD A,NLOOSP            ;LOOSE PAGES ARE EVICTABLE
3048         SUB A,SWPOPR            ;DON'T COUNT PAGES ALREADY COMMITTED TO EVICT
3049         HRLZI A,-4(A)           ;ALIGN AS UWRKST AND ALLOW 4 PAGES OF SLOP
3050         SKIPA TT,TIME           ;TO SEE IF PROTECTED AGAINST MEMORY PREEMPTION
3051 WSAVL1:  ADDI J,LUBLK
3052         CAML J,USRHI
3053          POPJ P,
3054         SKIPE UNAME(J)
3055          TDNE T,USWST(J)
3056           JRST WSAVL1           ;DOESN'T EXIST, OR NOT SWAPPED IN, OR LOADING
3057         CAMGE B,USWPRI(J)
3058          CAMGE TT,USWTIM(J)
3059           JRST WSAVL1           ;HIGHER PRIORITY OR PROTECTED
3060         ADD A,UWRKST(J)         ;THIS GUY'S WORKING SET IS PREEMPTABLE
3061         JRST WSAVL1     
3062 \f
3063 ;Routine to re-compute working set, also re sets up map
3064 ;to point to any pages which are swapped in but not mapped in.
3065 ;This is necessary in order to get the proper estimate of
3066 ;how much core is going to have to be swapped out to make
3067 ;this job fit.  Called when a job leaves the swapped-out state,
3068 ;to enter either Loading or Swap-blocked.
3069 ;Job is in W, smashes A,B,C,D,E,T,TT,H,I,U.
3070 ;Call with CIRPSW locked and clk in progress.
3071 WSRCM:  SETZM UWRKST(W)
3072         MOVEI E,UPGMP(W)        ;SET UP SCAN OF USER'S MAP
3073         HRLI E,442200
3074         MOVEI C,UPGCP(W)        ;AND OF CIRCULAR POINTERS
3075         HRLI C,442200
3076         LDB D,[121100,,HUSRAD(W)]       ;# OF USER PAGES
3077 WSRCM1: ILDB A,E                ;GET PAGE MAP ENTRY
3078         ILDB B,C                ;AND CIRCULAR POINTER
3079         JUMPE A,WSRCM2          ;JUMP IF PAGE DOESN'T EXIST
3080         CAIN B,-1
3081          JRST WSRCM2            ;ABS PAGE, DON'T COUNT
3082         TRNN A,600000           ;ALREADY SWAPPED IN?
3083          JRST WSRCM3            ;NO, GO PONDER
3084         ANDI A,PMRCM            ;GET PAGE MAPPED TO
3085         HRRZ B,MMSWP(A)         ;GET # SHARERS
3086         MOVSI A,1               ;COMPUTE WS ADJUSTMENT
3087         IDIV A,B
3088         ADDM A,UWRKST(W)
3089 WSRCM2: SOJG D,WSRCM1           ;LOOP
3090         POPJ P,
3091
3092 WSRCM3: PUSH P,C                ;PAGE NOT MAPPED, SEE IF IT'S IN
3093         PUSHJ P,UCPRL
3094             100000,,WSRCM4      ;RETURN WITH 4 PUSHES IF MEMORY IN LOOP
3095         POP P,C                 ;NO MEMORY, LEAVE ALONE
3096         SOJG D,WSRCM1
3097         POPJ P,
3098
3099 WSRCM4: SUB P,[4,,4]            ;FOUND MEMORY, IN T
3100         TRNE A,2
3101          MOVEI A,2              ;USE READ/WRITE/FIRST RATHER THAN READ/WRITE
3102         LSH A,20
3103         IORI A,PMCSHM(T)        ;SET UP MAP
3104         DPB A,E
3105         AOS C,MMSWP(T)          ;ONE MORE USER POINTING TO PAGE
3106         MOVSI A,1
3107         MOVEI B,-1(C)
3108         IDIVM A,B               ;ADJUST WS AS IF WAS ALREADY POINTING TO PAGE
3109         ADDM B,UWRKST(W)        ;ADDM DOES NOTHING IF THERE WAS DIVIDE BY ZERO
3110         IMULI C,-1(C)           ;COMPUTE WS DECREASE DUE TO ADDITIONAL SHARING
3111         MOVNI C,(C)
3112         IDIV A,C                ;IF DIVIDE BY ZERO, A GETS RIGHT THING!
3113         MOVE C,(P)              ;ADJUST ALL SHARER'S WS'S
3114         PUSHJ P,UCPRL
3115             SETZ WSRCM5
3116         POP P,C
3117         SOJG D,WSRCM1
3118         POPJ P,
3119
3120 WSRCM5: ADDM A,UWRKST(U)
3121         POPJ P,
3122 \f
3123 ;LEAVE LOADING STATE IF IN IT.  JOB IN U, SMASH C,TT,T,I
3124 LVLOAD: MOVE C,USWST(U)
3125         TLZN C,%SWLOD
3126          POPJ P,                ;NOT IN LOADING STATE
3127 LVLOA0: MOVEM C,USWST(U)        ;TURN OFF LOADING STATE
3128         MOVE T,TIME
3129         SUB T,USWTIM(U)         ;TIME IT TOOK TO LOAD
3130         IMUL T,LODFCT           ;COMPUTE PROTECT TIME
3131         HLRZS T
3132         ADD T,TIME
3133         MOVEM T,USWTIM(U)
3134         MOVSI T,1_16.           ;MAKE SWAP HISTORY TABLE ENTRY
3135         JRST SWPKHT
3136
3137 ;PUT JOB IN W INTO THE 'LOADING' STATE.  CALL WITH D CONTAINING USVWRK-UWRKST.
3138 ;WSRCM MUST HAVE BEEN CALLED ALREADY ON THIS JOB.  SMASHES A,D,T,TT,I
3139
3140 CFELD:  MOVE T,USWST(W)
3141         TLNE T,%SWSB
3142          SOS NUSWB              ;CEASES TO BE SWAP-BLOCKED
3143         TLZ T,%SWOUT+%SWSB+%SWDSO+%SWBEM
3144         TLO T,%SWLOD
3145         MOVEM T,USWST(W)
3146         MOVE T,TIME             ;SAVE TIME STARTED TO LOAD
3147         MOVEM T,USWTIM(W)
3148         MOVE U,W
3149         MOVSI T,0               ;MAKE SWAP HISTORY TABLE ENTRY
3150         PUSHJ P,SWPKHT
3151         JUMPLE D,CPOPJ
3152         HLRZ D,D                ;NUMBER OF PAGES GOING TO NEED, PROBABLY
3153         MOVE A,MEMFR            ;FREE CORE 
3154         SUB A,NCBCOM            ;FUDGE FOR THINGS IN PROCESS
3155         SUB A,SILNG             ;..
3156         ADD A,SOLNG
3157         SUB D,A                 ;NUMBER OF PAGES GOING TO HAVE TO SWAP OUT
3158         SKIPLE D
3159          ADDM D,SWPOPR          ;START THEM GOING OUT NOW
3160         POPJ P,
3161 ];SWPWSP
3162 \f
3163 OVHMTR FLT      ;MISC FAULTS
3164
3165 CFH4:   TLNE W,100000           ;PAGE-AHEAD OF NON-EX PAGE: DO NOTHING.
3166          POPJ P,
3167         JUMPL W,SWIILM          ;IF FROM DMA DEVICE, GIVE ERROR
3168 ;HERE FOR FAULTS WHICH ABORT THE INSTRUCTION.
3169 PFA7:   MOVE T,OPTION(U)        ;IF USER WANTS IT,
3170         TLNN T,%OPOPC           ;GIVE HIM THE OPC RATHER THAN
3171          AOSA T,CLKBRK          ;THE INCREMENTD PC.
3172 PFA7A:    MOVE T,CLKBRK         ;HERE FOR KL10 MAR BREAK AND KS10 NXI
3173                                 ;ERROR, ALWAYS GIVE ORIGINAL PC, INST
3174                                 ;ABORTED
3175         TLNE T,%PCUSR
3176          JRST CLKB1J
3177         MOVEI C,IOADCR          ;FROM EXEC MODE SO RESET PC TO IOADCR
3178         EXCH C,CLKBRK
3179         HRRM C,LEXFDR(U)        ;AND SAVE FAULT EXEC ADR FOR DEBUGGING
3180         CLEARM DLSRCH           ;IN CASE IT WAS SET
3181         CLEARM UMAPS(U)         ;RESTORE NORMAL MAP IN CASE RANDOM ONE WAS
3182                                 ;IN USE
3183
3184 CLKB1J: HRLM D,LEXFDR(U)        ;SAVE PF BITS FOR DEBUGGING PURPOSES
3185
3186 IFN KS10P,[     TRNE D,%PFNXI   ;Non-existent IO register in KS10 Unibus.
3187                  TLO A,(%PINXI)
3188 ] ;KS10P
3189
3190 IFN KS10P,      TRNN D,%PFNXI\%PF2.9\%PF2.8
3191 IFN KA10P,      TLZE D,210      ;NO ACCESS OR DBL
3192 IFN KL10P,      CAIN D,%PFPNA
3193                  TRO A,%PIMPV   ;ILM
3194
3195 IFE KS10P,[
3196 IFN KA10P,      TLZE D,20       ;PURE
3197 IFN KL10P,      CAIN D,%PFPRO
3198                  TLO A,(%PIFET)
3199 ] ;IFE KS10P
3200
3201 IFN KS10P,      CAIN D,%PFWRT\%PF2.8
3202 IFN KA10P,      TLZE D,100      ;W IN RD ONLY
3203 IFN KL10P,      CAIN D,%PFILW
3204                  TLO A,(%PIWRO)
3205
3206                 TDNE A,[%PIMPV\%PIWRO\%PINXI]
3207                  PUSHJ P,MPVMAS         ;SAVE FAULT PAGE # FOR DEBUGGING
3208
3209 ;;; NO ABORT-TYPE FAULTS, CHECK OTHERS:
3210
3211 IFE KS10P,[
3212 IFN KL10P,      CAIN D,%PFMAR
3213 IFN KA10P,      TLZE D,2
3214                  PUSHJ P,PCMARB
3215 ] ;IFE KS10P
3216
3217 IFN KA10P,[     TLZE D,2000
3218                  PUSHJ P,CPROC1 ;ONE PROCEED
3219                 ANDCA D,UPQUAN(U)       ;GET BITS FLUSHED BY TLZE'S
3220 ] ;KA10P
3221
3222 CFH6:
3223 IFN KA10P,[
3224         ANDCMI D,-1     ;DON'T CLOBBER USER'S RUNTIME.
3225         TLZ D,4         ;DON'T CLOBBER EXEC PAGING FLAG.
3226         TLO D,1         ;IGNORE QUANTUM-TIMEOUT INT.
3227         ANDCAM D,UPQUAN(U)
3228 ] ;KA10P
3229 CLKB1K: LPMR UPGML(U)
3230 CLKB1G: IFN KA10P, CONO 470000+APRCHN   ;RESET
3231 CLB1X:  MOVE T,CLKBRK   ;PUT USER'S PC WHERE IT BELONGS
3232         MOVEM T,UPC(U)
3233         MOVE B,[BADBTS]
3234         IOR B,MSKST(U)  ;GET OR OF ENABLED AND BAD BITS
3235         AND B,A         ;GET AND WITH BITS ACTUALLY ON
3236         JUMPE B,CLB1XA  ;NOT BAD OR ENABLED, FORGET ABOUT IT
3237         IORM B,PIRQC(U) ;GIVE INTERRUPT
3238         CAIN T,IOADCR   ;READY TO BE INTERRUPTED?
3239          JRST CLKB5     ;NOT QUITE, RUN MOMENTARILY AND WILL UFLS
3240 IFN SCHBLN,SETZM SCHMNY ;DO FULL SCHEDULE TO DELIVER THE INTERRUPT
3241         JRST SCHED2
3242
3243 CLB1XA: MOVSI T,%SWINT  .SEE INTPFL     ;IF PAGE FAULT DUE TO USER TRYING TO
3244         TDNN T,USWST(U)                 ;INTERRUPT, BETTER SCHED SO HE GETS THE INT.
3245          SKIPE FLSINS(U)        ;ELSE PROCEED THE USER IF HE HAS GOT WHAT HE WANTED.
3246           JRST SCHED2           ;OR IF HE'S WAITING, GO SCHEDULE.
3247         JRST CLKB5
3248
3249 IFN KA10P,[     ;NULL JOB LOST
3250 CNLJL:  CONSZ 230220    ;SKIP ON JUST "ADDR BREAK" (QUANTUM OVERFLOW)
3251          BUG PAUSE,[KA: APR ERROR IN NULL JOB]
3252         CONO 470000+APRCHN
3253         JRST SCHED
3254
3255 CFHFPF: BUG PAUSE,[PAGE FAULT IN SYSTEM, PC=],OCT,CLKBRK,[PAGE=],OCT,E
3256         MOVSI D,1770    ;FALSE PAGE FAULT
3257         MOVEI A,0
3258         JRST CFH6
3259 ] ;KA10P
3260 \f
3261 EBLK
3262 RINT:   0
3263 BBLK
3264         CONI RINTAP     ;SAVE STATUS IN CASE SOMEONE DUMPS IT
3265         CONI PI,RINTPI
3266         BUG AWFUL,[RANDOM INTERRUPT, APR ],OCT,RINTAP,[PI ],OCT,RINTPI
3267         JRST 12,@RINT           ;YOU CAN TRY PROCEEDING
3268
3269 EBLK
3270 RINTAP: 0       ;APR STATUS AT RINT
3271 RINTPI: 0       ;PI STATUS AT RINT
3272
3273 IFN KS10P,[     ; On KS, all random interrupts are created equal.
3274 BBLK
3275 RINT1==:RINT
3276 ] ;IFN KS10P
3277
3278 IFE KS10P,[
3279 R1NTAC: BLOCK 20
3280 RINT1:  0
3281 BBLK
3282         MOVEM 17,R1NTAC+17
3283         MOVEI 17,R1NTAC
3284         BLT 17,R1NTAC+16
3285         MOVEI J,1
3286         JSP E,SPUR
3287         MOVSI 17,R1NTAC
3288         BLT 17,17
3289         JRST 12,@RINT1
3290 ] ;IFE KS10P
3291 \f
3292 IFE KS10P,[     ;KS10 HAS NO MAR
3293
3294 PCMARB:
3295 IFN KA10P,[
3296         HLLZ B,UPOPC(U) ;FLAGS
3297         LSH B,5
3298         HRR B,UPOPC(U)  ;PC
3299         MOVE T,B
3300         XOR T,CLKBRK    ;DID PC CHANGE FROM START OF INST TO PLACE TRAPPED?
3301         TDNE T,[#<%PCFPD,,>]
3302          TLO B,(@)      ;YES, INSTRUCTION COMPLETED, FLAG FOR USER
3303 ] ;KA10P                ;LOSES FOR JSR .-1 WITH MAR AT .-1, BUT OTHERWISE OK
3304 IFN KL10P,[
3305         MOVE B,CLKBRK   ;PC OF FAULTING INST IF USER, OR IOADCR IF EXEC
3306 ;       MOVEM B,UPOPC(U)        ;SOLELY FOR .OPC USER VAR
3307 ;NOTE- ON KL10 THE INSTRUCTION IS NEVER COMPLETED, DON'T SET 3.5
3308 ] ;KL10P
3309         TLNE B,%PCUSR
3310          JRST PCMAR1            ;USR MODE, USE PC FROM PAGER
3311         MOVE B,UUOH             ;EXEC MODE, USE USER PC (UUO)
3312         HRRI B,-1(B)
3313 IFN KL10P,[     ;ON KL10 AVOID DOING AOS UUOH AT IOADCR
3314         MOVEM U,AC0S+U(U)
3315         MOVEI T,UUOER2
3316         MOVEM T,CLKBRK
3317 ];KL10P
3318 PCMAR1: MOVEM B,UMARPC(U)
3319         TRO A,%PIMAR
3320         MOVEI B,0
3321 IFN KA10P,      DPB B,[220300,,UPMAR(U)]        ;DISABLE MAR
3322 IFN KL10P,      DPB B,[270400,,UPMAR(U)]        ;DISABLE MAR
3323         POPJ P,
3324
3325 ] ;IFE KS10P
3326
3327 IFN KA10P,[
3328 CPROC1: MOVE T,CLKBRK
3329         TLNN T,%PCUSR   ;SKIP IF FROM USER MODE
3330          JRST CPRUUO
3331         TRO A,%PI1PR    ;GIVE USER INTERRUPT
3332         POPJ P,
3333
3334 CPRUUO: MOVE T,[JRST ONEPROC]   ;ONE PROCEED INT. FROM EXEC. MODE
3335         MOVEM T,UEXIT   ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
3336         POPJ P,
3337
3338 AROV:   TLZE T,400000
3339          TLNN T,%PCUSR
3340           JRST AROV2    ;NOT REALLY SET OR SET BY SYS
3341         MOVEM T,CLKBRK
3342         SKIPE PICLR(U)  ;SKIP IF INTERRUPTS TO USER NOT ENABLED
3343          TRO A,%PIARO   ;GIVE USER INTERRUPT
3344         POPJ P,
3345
3346 AROV2:  MOVEM T,CLKBRK
3347         POPJ P,
3348
3349 ARFOV:  TLZE T,40000
3350         TLNN T,%PCUSR
3351         JRST AROV2
3352         MOVEM T,CLKBRK
3353         SKIPE PICLR(U)
3354         TLO A,(%PIFOV)
3355         POPJ P,
3356 ] ;KA10P
3357 \f
3358 ;;; HANDLE PARITY ERRORS.
3359
3360 CLKB1E: SETZM PARDIE    ;AT FIRST ASSUME THE PAR ERR ISN'T FATAL.
3361         CONO PI,PIOFF   ;TURN OFF WORLD
3362 IFN KA10P, CONO PI,240000       ;RESET
3363 IFN KL10P,[             ;CLEAR THE CACHE
3364         SWPUA
3365         CONSZ 200000
3366          JRST .-1
3367 ] ;KL10P
3368 IFN KS10P,[
3369         CLRCSH                  ;Clear the cache
3370 ] ;KS10P
3371         MOVSI B,SCLPAR
3372         TDNE B,SUPCOR   ;IF PREV ERROR NOT PRINTED, PRINT IT NOW AND PAUSE
3373          BUG PAUSE,[TOO MANY PARITY ERRORS.  PREV STATUS=],DEC,PARCNT,OCT,PARAAN,OCT,PARAOR,OCT,PARAND,OCT,PARIOR
3374         IORM B,SUPCOR   ;TELL SYS JOB TO PRINT OUR DATA WHEN WE FINISH.
3375         AOS PARERR      ;COUNT # OF PAR ERRS SINCE SYSTEM STARTED.
3376         SETOM PARAND    ;INIT LOGAND AND LOGOR OF ALL BAD DATA WORDS
3377         SETZM PARIOR
3378         SETOM PARAAN    ;AND SIMILAR FOR ADDRESSES OF PAR ERRS.
3379         SETZM PARAOR
3380         MOVE T,CLKBRK
3381         MOVEM T,PARPC
3382         MOVE T,USER
3383         MOVEM T,PARUSR  ;REMEMBER WHICH JOB GOT THE PAR ERR.
3384         JUMPL T,PARSCJ  ;PAR ERR IN NULL JOB? OR WHAT?
3385 IFN KL10P,[
3386         SKIPE PARRSN            ;PAR ERR IN WORD NOT REFERENCED
3387          JRST PARSCJ            ; SHOULDN'T SCREW THE RUNNING JOB
3388 ] ;KL10P
3389         CAIG T,LUBLK
3390          SETOM PARDIE           ;PAR ERR IN A SUPERVISOR-MODE JOB IS HOPELESS.
3391         MOVSI TT,(%PIPAR)
3392         IORM TT,PIRQC(T)        ;GIVE RUNNING USER A PARITY ERROR (CLASS 1 INT)
3393 PARSCJ: SPM PARPG
3394 IFN KL10P,[
3395         PUSH P,PFNPC    ;MAKE SURE THE PAR ERRS WE DETECT WHILE SCANNING DON'T
3396         MOVEI D,PARFX4  ;CALL US RECURSIVELY (ON KA, THAT'S DONE BY HAVING
3397         MOVEM D,PFNPC   ;CLKCHN OFF) 
3398 ] ;KL10P
3399 IFN KS10P,[
3400         PUSH P,EPTP7N           ;Same hack for the KS except page fails trap
3401         MOVEI D,PARFX4          ;as a function of current PI level.
3402         MOVEM D,EPTP7N
3403 ] ;KS10P
3404         MOVEI D,0       ;POINTER TO ERROR BUFFER
3405         MOVSI TT,-TSYSM
3406         PUSHJ P,PARSCN  ;SCAN MAIN MEM BLOCKS
3407 IFN PDP6P,[
3408         MOVE TT,[-LPDP6M,,PDP6BM_-10.]  ;SCAN PDP6 MEM FOR PARITY ERRORS
3409         SKIPGE PDP6UP                   ;BUT NOT IF PDP6 IS DOWN.
3410          PUSHJ P,PARSCN
3411 ]
3412 IFN KL10P,[
3413         POP P,PFNPC
3414         CONO 024400+APRCHN      ;CLEAR PAR ERR FLAGS.
3415 ] ;KL10P
3416 IFN KS10P,[
3417         POP P,EPTP7N
3418         CONO 020200+APRCHN      ;CLEAR FLAG
3419         MOVSI A,%KEHLD+%KEREF   ;CLEAR STATUS AND ERROR ADDR
3420         IOWR A,[KSECCS]
3421 ] ;KS10P
3422         MOVEI A,0
3423         DPB A,[.PAREP+EXEUMP]
3424         LPMR PARPG      ;SET UP MAP WITH PARPG SET TO MPV.
3425         MOVEM D,PARCNT  ;SAVE AWAY COUNT OF ERRORS IN BUFFER
3426         SKIPE PARDIE
3427          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
3428                         ;FATAL ERROR (DONT ALLOW CONTINUE SINCE ERR IS
3429                         ;KNOWN TO BE A LOSER)
3430         CONO PI,PION    ;TURN WORLD BACK ON
3431         JRST SCHED
3432 \f
3433 PARSCN:
3434 PARFX3: HRRZ T,TT       ;SCAN AOBJN POINTER IN TT
3435         CAIL T,TSYSM
3436         JRST PARFX7
3437         LDB T,[MUR,,MEMBLT(TT)]
3438         CAIN T,MUHOLE
3439         JRST PARFX8     ;HOLE THERE
3440 PARFX7: MOVEI T,600000(TT)      ;NOTE THAT WE ARE NOT ENABLING THE CACHE.
3441         DPB T,[.PAREP+EXEUMP]   ;ON KL10 THIS WILL CAUSE A 1-WORD READ.
3442         LPMR PARPG      ;SET UP TO CHECK PAGE # IN TT
3443         MOVEI B,0       ;ADDRESS WITHIN PAGE
3444 PARFX1:
3445 IFN KA10P, CONO PI,200000       ;CLEAR PAR ERR
3446 PARFX5: MOVE C,400000+PAREP*2000(B)     ;REFERENCE EVERY MEMORY LOCATION
3447 IFN KA10P,[
3448         ;;ON KA, MUST CHECK EXPLICITLY.
3449         ;;ON KL AND KS, PAR ERR WILL TRAP RIGHT TO PARFX4.
3450         CONSZ PI,200000 ;PARITY ERR? 
3451          JRST PARFX4    ;YES. 
3452 ] ;KA10P
3453         CAIGE B,1777    ;SKIP ON FINISHED WITH BLOCK
3454          AOJA B,PARFX5
3455 PARFX8: AOBJN TT,PARFX3 ;CHECK NEXT PAGE
3456         POPJ P,         ;DONE
3457 \f
3458 PARFX4:         ;HERE WHEN THE SCAN FINDS A WORD WITH BAD PARITY
3459 IFN KL10P, HRRZ T,PFOPC
3460 IFN KS10P, HRRZ T,EPTP7O
3461 IFE KA10P,[
3462         ;;DID THIS TRAP COME FROM SCAN LOOP WHERE WE EXPECT THEM?
3463         CAIE T,PARFX5
3464          JRST 4,.
3465         AC7CTX
3466         UMOVE C,0       ;GET CONTENTS OF LOCATION WITH BAD PARITY
3467         SYSCTX
3468 ] ;IFE KA10P
3469         SETO T,         ;MAKE SURE T ISN'T ACCIDENTALLY 0 AT PARFX6.
3470         HRRZ E,TT
3471         LSH E,10.
3472         IOR E,B ;MAKE MEM ADR
3473         CAIGE E,20      ;PAR ERR IN SHADOW ACS ISN'T SERIOUS.
3474          JRST PARFX6
3475         ANDM E,PARAAN   ;UPDATE ANDS AND ORS OF DATA AND ADRS
3476         IORM E,PARAOR
3477         ANDM C,PARAND
3478         IORM C,PARIOR
3479         MOVE A,USRHI
3480         CAIGE E,USRSTG(A)
3481          SETOM PARDIE   ;PARITY ERROR IN EXEC CORE
3482         HRRZ T,TT
3483         CAIL T,TSYSM
3484          JRST PARFX6
3485         LDB T,[MUR,,MEMBLT(TT)]
3486         CAIE T,MUFR
3487          CAIN T,MUINP
3488           JRST PARFX6
3489         CAIE T,MUDISB
3490          CAIN T,MUFRT
3491           JRST PARFX6
3492         CAIN T,MUDDT
3493          JRST PARFX6
3494         SOJE T,PARFX6   ;USER
3495         SETOM PARDIE    ;ERR IN CRITICAL MEMORY (DISK DIR, ETC)
3496 PARFX6: MOVEM C,400000+PAREP*2000(B)    ;FIX UP MEMORY AS BEST WE CAN
3497         MOVEM C,PARCON(D)       ;SAVE LOSING CONTENTS
3498         MOVEM E,PARADR(D)       ;SAVE LOSING ADDRESS
3499         CAIL D,MXPARS-1 ;OVERFLOWING BUFFER?
3500          SOS D          ;JUST DON'T CLOBBER STUFF. AT LEAST PARAND, ETC. WILL BE VALID.
3501         JUMPN T,PARFX9
3502         PUSH P,D        ;PAR. ERR IN USER MEMORY,
3503         HRRZ D,TT
3504         CAIL D,TSYSM
3505          JRST PARFXA
3506         PUSHJ P,UCPRL4  ;HAS ANY JOB WRITTEN IN THIS PAGE?
3507          400000,,PARFU1
3508         JUMPL D,PARFXB  ;SOMEONE HAS; JUST GIVE EVERYONE AN INTERRUPT.
3509         PUSHJ P,UCPRL4  ;DOES MMP SAY PAGE WAS WRITTEN? IF SO, SET SIGN(D);
3510          200000,,PARFU2 ;OTHERWISE, SET MMPBAD, CAUSING PAGE TO BE RELOADED FROM DISK.
3511         JUMPGE D,PARFXA
3512 PARFXB: PUSHJ P,UCPRL4  ;PAGE HAS BEEN WRITTEN SINCE LAST ON DISK, SO WE CAN'T ESCAPE
3513          400000,,PARFU3 ;GIVING EVERY JOB AN INTERRUPT.
3514 PARFXA: POP P,D
3515 PARFX9: AOS B                   ;INCREMENT B HERE SO YOU DON'T HACK THE SAME
3516                                 ; WORD AGAIN.  IF THAT WORD WAS SOLIDLY BAD,
3517                                 ; THIS CODE WOULD LOOP
3518         CAIG B,1777             ;MIGHT BE DONE WITH PAGE
3519          AOJA D,PARFX1
3520         AOJA D,PARFX8
3521
3522 PARFU1: CAIG U,LUBLK
3523          SETOM PARDIE   ;SYS JOB OR CORE JOB HAS PAGE
3524         PUSH P,Q
3525         MOVE A,I        ;FIND PAGE-MAP HALFWORD FOR THIS PAGE
3526         PUSHJ P,UPLC
3527         POP P,Q
3528         LDB A,T
3529         LSH A,-20
3530         CAIE A,1        ;MAP SET UP TO A PAGE, AND IN READ-ONLY MODE?
3531          JRST PARFU5
3532         DPB A,T         ;YES, UNMAP IT SO THAT NEXT ACCESS WILL TRAP AND GO TO CFHPB
3533         SOS MMSWP(D)    ; IN CASE WE WILL SET MMPBAD.
3534                 ;NOTE, THIS MAY CRASH THE SYSTEM IF THE JOB WAS RUNNING IN A UUO,
3535                 ;HAD CHECKED ACCESS TO THE PAGE, AND WAS ASSUMING IT COULD ACCESS
3536                 ;IT AGAIN SAFELY.  USUALLY THIS ONLY HAPPENS WHEN WRITING, HOWEVER.
3537 IFN SWPWSP,             ;DON'T BOTHER ADJUSTING WORKING SET.  WILL BE FIXED ON NEXT SWAPIN.
3538 PARFU5: CAIL A,3
3539 PARFU4:  TLO D,400000   ;IF THIS JOB HAS WRITTEN THE PAGE, SET SIGN (D)
3540         POPJ P,         ;TO SIGNAL THAT SETTING MMPBAD IS NO USE.
3541
3542 PARFU2: MOVE T,(C)      ;C HAS ADDR OF MMP ENTRY; HAS PAGE BEEN WRITTEN BY A JOB
3543         TLNN T,MMPWRT   ;THAT NO LONGER HAS IT IN MAP?
3544          TLNN T,MMPWOD  ;OR HAS IT NEVER BEEN ON DISK?
3545           JRST PARFU4   ;IF SO, AVOID SETTING MMPBAD, AND INTERRUPT EVERYONE.
3546         HLRZ T,1(C)
3547         JUMPE T,PARFU4  ;DITTO IF THERE IS NO DISK SPACE ASSIGNED.
3548         MOVSI T,MMPBAD
3549         IORM T,(C)
3550         POPJ P,
3551
3552 PARFU3: MOVSI T,(%PIPAR)
3553         IORM T,PIRQC(U)
3554         POPJ P,
3555 \f
3556 MEMHNG:
3557 IFN PDP6P,[
3558         LDB B,[221100,,UPJPC(U)]        ;FAULT ADDR
3559         TRZN B,400              ;SKIP IF REFERENCE WAS VIA USER MAP
3560          JRST MEMHN1
3561         MOVEI C,UPGMP(U)
3562         ROT B,-1
3563         ADDI C,(B)
3564         HRLI C,PMLCAD           ;POINTER TO CORE ADR FIELD OF LH PAGE IN MAP WD
3565         SKIPGE B
3566          HRLI C,PMRCAD          ;RH MAP WD
3567         LDB C,B                 ;C GETS PAGE #
3568         CAIGE C,<PDP6BM_-10.>+LPDP6M
3569         CAIGE C,PDP6BM_-10.
3570          JRST MEMHN1
3571         MOVE B,CLKBRK
3572         TLNE B,%PCUSR
3573          JRST MEMHN3            ;USER MODE PDP6 NXM
3574         MOVEI B,IOCER3          ;PDP6 MEM
3575         HRRM B,CLKBRK
3576         JRST MEMHN2
3577 ]
3578
3579 MEMHN1:                 ;NXM
3580         ; JRST 4,.+1    ;COMMENTED OUT SINCE NXM STOP SHOULD ALWAYS BE SET.
3581 MEMHN2:
3582 IFN KA10P,CONO 10000+APRCHN     ;CLEAR NON EX MEM AFTER HALT TO RESET MEMORY
3583 IFN KL10P,CONO 22000+APRCHN
3584 IFN KS10P,[
3585         CONO 20400+APRCHN       ;Clear APR flag
3586         MOVSI B,%KEHLD+%KEREF   ;Clear saved error address
3587         IOWR B,[KSECCS]
3588 ] ;KS10P
3589         MOVSI B,SCLNXM
3590         TDNE B,SUPCOR           ;Haven't printed previous error?
3591          BUG PAUSE,[TOO MANY NXM ERRORS.]
3592         IORM B,SUPCOR
3593         MOVE T,CLKBRK
3594         MOVEM T,NXMPC
3595         MOVE T,USER
3596         MOVEM T,NXMUSR
3597         AOS NXMERR
3598         POPJ P,
3599
3600 IFN PDP6P,[
3601 MEMHN3: MOVSI B,%PIMPV  ;PDP6 NXM GIVE MPV INTERRUPT
3602         IORM B,PIRQC(U)
3603         JRST MEMHN2
3604 ]
3605 \fSUBTTL SLOW CLOCK SERVICE ROUTINE
3606
3607 OVHMTR SLW      ;SLOW CLOCK
3608
3609 SSLCK:  SKIPGE SHUTDN   ;SYSTEM "DEAD" =>
3610          PUSHJ P,COFFIN ;GO TO DDT AFTER RIGOR MORTIS SETS IN.
3611         SETCMB A,SCKPHS ;CHECK SYSTEM CHECKSUMS EVERY OTHER SLOW CLOCK TICK
3612         MOVE T,SUPCOP   ;WHICH IS ONCE PER SECOND.
3613         SKIPE A
3614          IORM T,SUPCOR
3615 IFN KS10P,[
3616         CONSO 100               ; Check for memory ECC corrected errors
3617          JRST SSLCK0
3618         IORD A,[KSECCS]         ; A: status and error addr
3619         MOVEM A,ECCERA          ; Remember most recent one
3620         AOS ECCERR              ; Also count 'em
3621         CONO 20100+APRCHN       ; Clear memory ECC APR flag 
3622         MOVSI T,%KEHLD+%KEREF   ; Clear status and error addr
3623         IOWR T,[KSECCS]
3624         MOVE T,A
3625         AND A,ECCAND            ; A: AND of previous errors
3626         IOR T,ECCIOR            ; T: IOR of previous errors
3627         CAMN A,ECCAND           ; If either changes, this is news.
3628          CAME T,ECCIOR
3629           BUG INFO,[MEMORY: ECC CORRECTED ERROR],OCT,ECCERA
3630         MOVEM A,ECCAND
3631         MOVEM T,ECCIOR
3632 SSLCK0: ] ;IFN KS10P
3633 IFN NETP,PUSHJ P,NETCLK ; Run 1/2 sec clock routines for various net stuff
3634 IFN NETYS, SETOM DTECHK         ;TELL 11 WE'RE ALIVE
3635 IFN DPKPP,[
3636         CONSO DPK,7
3637          CONO DPK,TTYCHN        ;CROCK - IF DPK LOSES ITS PIA, GIVE IT BACK.
3638 ]
3639         MOVE A,UTTBF
3640         CAIGE A,30
3641          JRST SSLCK2
3642         SETOM UTBFLF    ;SIGNAL CORE JOB TO FLUSH UTAPE BUFFERS
3643         AOS NCORRQ
3644 SSLCK2: SKIPE UTTYCT    ;SKIP IF NO NEW USERS
3645          SKIPL TREESW   ;SKIP UNLESS SOMEBODY'S MUNGING THE TREE STRUCTURE.
3646           CAIA
3647            PUSHJ P,USTART ;NEW USER TO START
3648 IFN 340P,[
3649         SKIPL T,DWDS
3650          MOVEI T,0
3651         ADDI T,MDISWD
3652         MOVEM T,DWDS    ;RESET DISPLAY RATE COUNTER
3653 ]
3654         CONO PI,UTCOFF  ;UTC OFF WHILE HACKING UTAPE, MTAPE, DISK, ETC.
3655 IFN RH10P+RH11P,[
3656         SKIPLE USFHLT
3657          SOS USFHLT
3658 ];RH10P+RH11P
3659 IFN NUNITS,[
3660 IFE NEWDTP,[
3661         MOVE T,TIME
3662         AOSN UIDLE      ;SKIP IF DEC TAPE NOT IDLE
3663          JRST [MOVEM T,LUTOTM ? JRST SSLCK1]    ;DEC TAPE IDLE
3664         SUB T,LUTOTM    ;SUBTRACT LAST UTC OPERATION TIME
3665         CONSO UTC,4000
3666          CAIGE T,MXOPT*SCLKI    ;SKIP IF DEC TAPE HUNG TOO LONG ON ONE OPERATION
3667           JRST SSLCK3   ;OK
3668         SETOM UTHERR    ;SET UTC HUNG ERR FLAG
3669 SSLCK1: CONO UTC,CUINT  ;CAUSE DEC TAPE INTERRUPT ROUTINE TO RUN
3670 SSLCK3:
3671 ]
3672 IFN NEWDTP,[
3673         MOVE T,TIME
3674         AOSN UIDLE
3675          JRST [MOVEM T,LUTOTM ? JRST SSLCK1]
3676         SUB T,LUTOTM
3677         CAIGE T,MXOPT*SCLKI
3678          JRST SSLCK3
3679         SETOM UTHERR
3680 SSLCK1: SETOM CUINT
3681         CONO PI,UTCRQ
3682 SSLCK3:
3683 ]]      ;END IFN NUNITS
3684         SKIPL QSDU              ;IF DISK TRANSFER IN PROGRESS
3685          JRST [ MOVE T,LQTM     ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3686                 ADDI T,5*30.
3687                 CAMGE T,TIME
3688                  PUSHJ P,QHUNG  ;YES, UNHANG THE DISK
3689                 JRST .+1 ]
3690 IFN T300P,[
3691         SKIPL QSDU1             ;IF TRANSFER IN PROGRESS ON OTHER CONTROLLER
3692          JRST [ MOVE T,LQTM1    ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3693                 ADDI T,5*30.
3694                 CAMGE T,TIME
3695                  PUSHJ P,QHUNG1 ;YES, UNHANG THE DISK
3696                 JRST .+1 ]
3697 ];T300P
3698 IFN DC10P, PUSHJ P,QRCTMO       ;RECALIBRATE TIMEOUT
3699         CONO PI,UTCON
3700         PUSHJ P,QSTRTR          ;WAKE UP DISK ROUTINES
3701 IFN NMTCS, PUSHJ P,MSTRTR       ;WAKE UP MAG TAPE ROUTINES (MUST BE SEPARATE INTR)
3702 ;DROPS THROUGH
3703 \f
3704 ;DROPS IN
3705 IFG NMTYS,[                     ;TRY TO UNHANG MORTON TTY CARDS
3706         MOVE I,[-NMTYS,,NFMTY]
3707         MOVE T,TIME
3708         SUBI T,60.      ;IF HAVEN'T TYPED FOR 2 SECONDS
3709 SSLCM1: SKIPL TTYOAC(I) ;YET SUPPOSED TO BE TYPING
3710          CAMGE T,TTLTM(I)
3711           JRST SSLCM2
3712         CONO PI,TTYOFF-1
3713         CONO MTY,@TTYLT(I)      ;SELECT THE LINE
3714         DATAO MTY,[0]           ;AND BANG ON IT
3715         CONO PI,TTYON-1         ;MAYBE IF WE'RE LUCKY ITS DONE FLAG WILL COME ON 
3716 SSLCM2: AOBJN I,SSLCM1
3717 ]               ;END IFG NMTYS
3718 IFN IMPP,[
3719 IFN KAIMP, CONI IMP,IMPCNI      ;KEEPS HOST READY ON
3720 IFE KSIMP,[
3721         ;KS doesn't drop interrupts, I hope
3722         PUSHJ P,IMPOST          ;START UP OUTPUT
3723 ]
3724 IFN NCPP,[
3725         SKIPLE IMNCS
3726          PUSHJ P,IMPCCL         ;CLOSE NETWORK CHANNELS
3727         SKIPLE IMNAS
3728          PUSHJ P,IMPAAA         ;WAKE UP STYS THAT NEED IT
3729 ];NCPP
3730         SKIPGE IMPTCU           ;IF IMP IS TRYING TO COME UP
3731          AOSE IMPUCT            ;AND UP-COMING TIMEOUT EXHAUSTED
3732           JRST SSLCK8
3733         BUG INFO,[NET: TIMED OUT TRYING TO COME UP]
3734         MOVEI A,1               ;THEN MAKE IT STAY DOWN
3735         MOVEM A,IMPUP           ;IF THIS IS ML-KA THE IMP CABLE PROBABLY BROKE AGAIN
3736 SSLCK8:
3737 ];IMPP
3738 IFN PDP6P,[
3739         SKIPL PDPISR
3740          CONO DSDEV,DSDCHN      ;ENABLE INTERRUPTS FROM 6
3741 ];PDP6P
3742 IFN NETYS,[
3743         SKIPE DTEBBY
3744          SOSL DTEBBT
3745           JRST .+3
3746            BUG CHECK,[TTY: TIMEOUT ON OUTPUT XFER TO DTE, DTEBBY],OCT,DTEBBY
3747            SETZM DTEBBY
3748 ];NETYS
3749 IFN N11TYS,[
3750 ;SEE IF THE TV PDP11 WANTS TO GO DOWN.
3751         SKIPN TEN11F    ;PROVIDED THE PDP11 IS THERE,
3752          SKIPN TT11P    ;AND WE'RE TRYING TO USE IT,
3753           JRST SSLCK5
3754         LDB A,[061600,,TT11HA]  ;DOES 11 WANT WHO LINES UPDATED?
3755         CAIL A,2000*NTTPG       ;RANGE CHECK SO CLOBBERED 11 MEMORY DOESN'T CAUSE ILL MEM REF
3756          BUG HALT,[GARBAGE POINTER IN TV-11 MEMORY]
3757         SKIPGE 1+400000+TTPG0*2000(A)
3758          JRST [ MOVEI T,SCRWHO  ;YES
3759                 IORM T,SUPCOR
3760                 CLEARM 1+400000+TTPG0*2000(A)
3761                 JRST .+1]
3762         SKIPE TT11DN    ;IF IT IS REQUESTING TO GO DOWN,
3763          JRST SSLCK5
3764         SETZM TT11P     ;DON'T USE IT & WAIT FOR IT TO RE-INIT,
3765         MOVSI T,1
3766         MOVEM T,TT11DN  ;GIVE IT OUR PERMISSION TO GO DOWN.
3767         MOVEI T,SCR11D  ;CAUSE "11 DOWN" MESSAGE
3768         IORM T,SUPCOR
3769 SSLCK5: SKIPN TEN11F
3770          SKIPG TT11P    ;WAITING FOR 11 TO BE UP?
3771           JRST SSLCK6
3772         SKIPN TT11UP    ;SKIP ON 11 UP
3773          JRST SSLCK6
3774         MOVEI T,SCR11U
3775         IORM T,SUPCOR   ;INIT THE TTYS
3776 SSLCK6:
3777 ]
3778         SKIPLE T,AGERTE ;IF IT'S ENABLED, AGE SOME PAGES
3779          PUSHJ P,AGE
3780 ;DROPS THROUGH
3781 \f
3782 ;DROPS IN
3783 IFN DL10P,[
3784         SKIPN DL10F
3785          JRST SSLCKA
3786         SETOM DL10UP    ;COULD ALSO CHECK WHETHER PDP11 IS INCREMENTING THIS.
3787         DATAI DLC,A
3788         TRNE A,20       ;SEE IF PDP11 HALTED.
3789          JRST SSLCKA
3790         BUG INFO,[I/O PDP11 WENT DOWN]
3791         SETZM DL10F
3792         MOVEI T,%TYDL
3793         MOVSI A,-NCT
3794         TDNE T,TTYTYP(A)
3795          SETOM TTYOAC(A)
3796         AOBJN A,.-2
3797 SSLCKA: ]
3798         AOS QACTTM              ;Bump this for benefit of QSK dir writers.
3799         SKIPN SWPOPR            ;If there is a request to swap out pages
3800          SKIPE SOLNG            ; or if there are pages now going out
3801           JRST SSKQ2            ; do not bother with LMEMFR, warnings.
3802         MOVN A,LMEMFR           ;See how many free low-memory pages.
3803         ADD A,MINCOR
3804         JUMPLE A,SSRCK          ;Okay
3805         AOS NCORRQ              ;Wake up core job to do some shuffling
3806         SUB A,MEMFR
3807         ADD A,LMEMFR            ;Core wanted minus high free
3808         SKIPLE A
3809          ADDM A,SWPOPR          ;Swap out to make room.
3810 ;Check to see if we are running out of various resources.
3811 ;RSWTIM is a timestamp of last warning, initialized by DATIM6 and PDDCHK.
3812 SSRCK:  MOVE A,RSWTIM           ;Get time we last checked.
3813         ADDI A,2*30.
3814         CAML A,TIMOFF           ;If we checked less then 30 secs ago
3815          JRST SSKQ2             ; don't deluge the console.
3816         MOVE A,TIMOFF           ;Else remember that we are cheking now.
3817         MOVEM A,RSWTIM
3818         MOVEI A,5               ;There should be at least 5 free low pages.
3819         CAMLE A,LMEMFR          ;If there are not, print warning.
3820          BUG INFO,[Warning: Just ],DEC,LMEMFR,[ free pages in low core.]
3821         SKIPN QFCHN             ;Check disk channels.
3822          BUG INFO,[Warning: No free qsk channels.]
3823         MOVN A,USRHI            ;Check job slots.
3824         IDIVI A,LUBLK
3825         ADDI A,MAXJ
3826         SKIPN A
3827          BUG INFO,[Warning: System full - no job slots.]
3828 SSKQ2:
3829 IFN 340P,[
3830         SKIPL DISUSR
3831          PUSHJ P,DISCHK ;CHECK FOR 340 DEATH
3832 ]
3833         PUSHJ P,PDCCHK  ;CHECK ON REAL-TIME HACKS
3834 IFN PTRP,[
3835         PUSHJ P,PTRCHK  ;CHECK ON PAPER TAPE READER
3836         PUSHJ P,PTPCHK  ;CHECK ON PAPER TAPE PUNCH
3837 ] ;PTRP
3838 IFE KS10P,[     ; Silly KS10 doesn't have devices...
3839         SKIPN CCSDEV
3840          JRST SCDCK3
3841         SETZM CCSDEV
3842         MOVSI I,-128.
3843 SCDCK1: SKIPGE A,DCHNTC(I)
3844          TLNE A,300000
3845           JRST SCDCK2
3846         AOS CCSDEV
3847         SUB A,[1,,]
3848         TLNN A,777
3849          TLZ A,400000
3850         MOVEM A,DCHNTC(I)
3851 SCDCK2: AOBJN I,SCDCK1
3852 SCDCK3:;        JSP E,CHECK     ;CHECK FOR CLOBBERED DEVICES
3853 ] ;IFE KS10P
3854 IFN NLPTP,[
3855         CONO PI,LPTOFF
3856         MOVE A,NLPTBR           ;IF LPT OUTPUT BUFFER NOT EMPTY
3857         CAIN A,LPTBSZ
3858          JRST [ CONSZ NLPT,100  ;AND LPT IS READY
3859                  CONSZ NLPT,7   ;BUT HAS NO PIA
3860                   JRST .+1
3861                 CONO NLPT,LPTCHN ;THEN IT LOST AGAIN
3862                 AOS NTNLPL      ;COUNT NUMBER OF TIMES NEW LPT LOST
3863                 JRST .+1 ]
3864         CONO PI,LPTON
3865 ]
3866 IFN ECCMEM,[
3867 ;THIS ASSUMES THAT THE PDP-10/XBUS ADDRESS OFFSET IS ZERO
3868 ECCLOG: MOVE B,400000+ECCPG*2000+1760
3869         LSH B,-32.
3870         CAMN B,ECCIDX           ;DID ECC HISTORY POINTER ADVANCE?
3871          JRST ECCLG9
3872         AOS A,ECCIDX            ;YES, GET NEXT WORD FROM ECC HISTORY
3873         MOVE B,400000+ECCPG*2000+1760-1(A)
3874         ANDI A,17               ;ADVANCE OUR COPY OF POINTER
3875         MOVEM A,ECCIDX
3876         LDB A,[240700,,B]       ;SYNDROME BITS
3877         TLZ B,777774            ;REDUCE B TO ADDRESS BITS
3878         BUG INFO,[MEM: ECC ERROR, ADDRESS ],OCT,B,[SYNDROME],OCT,A
3879         JRST ECCLOG             ;LOOK FOR MORE HISTORY
3880
3881 ECCLG9:
3882 ];ECCMEM
3883         PUSHJ P,GPDTIM          ;WHAT CALENDAR TIME IS IT?
3884          SETOB A,LPDTIM
3885         EXCH A,LPDTIM           ;REMEMBER IT FOR NEXT CLOCK TICK.
3886         JUMPL A,ALCR0           ;TIME NOT KNOWN THIS AND/OR LAST TICK => DO NOTHING
3887         SUB A,LPDTIM            ;ELSE HOW LONG HAS IT BEEN SINCE PREVIOUS TICK?
3888         CAML A,[-5*PDUPS]       ;MORE THAN 5 SECONDS? SHOULD ONLY BE 1/60
3889          JRST ALCR0             ;ONLY EXPLANATION IS ITS WAS STOPPED AND CONTINUED.
3890         SKIPL SYSDBG            ;SO UNLESS THAT'S NORMALLY EXPECTED
3891          PUSHJ P,DEATHM         ;TELL THE WORLD "ITS REVIVED"
3892         MOVE T,TIME             ;REMEMBER WHEN THIS LAST HAPPENED
3893         MOVEM T,RVVTIM
3894
3895 ;DROPS THROUGH
3896 \f
3897 ;DROPS IN
3898 ;DECAY VARIOUS EXPONENTIAL AVERAGES.  ON KA10, RUN IN ACS SINCE IT'S FASTER.
3899 ;ON KL10, DON'T, SINCE IT'S SLOWER.  ON KS10, DON'T, BECAUSE IT IS
3900 ;JUST AS FAST TO RUN IN THE ACS BUT IT WASTES TIME TO MOVE THE CODE
3901 ;INTO THEM.
3902 ALCR0:  MOVSI U,-NCT
3903         SETZM SLOADU
3904 IFN KA10P,[
3905         MOVE I,[ALCR1,,A]
3906         BLT I,I
3907         JRST A
3908 ] ;KA10P
3909
3910 ALCR1:  MOVN T,USRRCE(U)        ;A      ;DECAY USRRCE AVERAGES
3911         ASH T,-4                ;B
3912         ADDB T,USRRCE(U)        ;C
3913         CAMLE T,SLOADU          ;D      ;AND SET SLOADU TO HIGHEST USRRCE
3914          MOVEM T,SLOADU         ;E
3915 IFN KA10P,[
3916         AOBJN U,A               ;TT
3917         JRST .+1                ;I
3918 ] ;KA10P
3919 IFE KA10P, AOBJN U,ALCR1
3920
3921         MOVN T,USRRCE+NCT
3922         ASH T,-4-2              ;DISOWNED JOBS (DECAY SLOWER)
3923         ADDB T,USRRCE+NCT
3924         IMULI T,1999.           ;MAKE COMMENSURATE WITH REGULAR USRRCE'S
3925         ASH T,-13.              ; (You might think that you could just
3926                                 ; divide by 4, but in fact the ratio
3927                                 ; between the two decay rates is
3928                                 ; ln(64/63)/ln(16/15) = .24401474)
3929         ADDM T,SLOADU           ;DISOWNED TIME COULD HAVE BEEN USED BY REAL
3930                                 ; USERS
3931         MOVN T,USRRCE+NCT+1
3932         ASH T,-4+1              ;SYS, CORE, AND SOME DAEMON JOBS (DECAY FASTER)
3933         ADDM T,USRRCE+NCT+1
3934         IRPS RCE,,LOSRCE IDLRCE
3935          MOVN T,RCE             ;LOST TIME AND IDLE TIME
3936          ASH T,-4
3937          ADDB T,RCE
3938          TERMIN
3939         ADDM T,SLOADU           ;IDLE TIME COULD HAVE BEEN USED BY USERS
3940
3941 IFE KS10P, MOVE A,[193682794.]  ; = 100. * 250000. * .5 / ln(16/15)
3942                                 ; (100% of 250000. four usec ticks per second,
3943                                 ; decaying by 16/15 every .5 second.)
3944 IFN KS10P, MOVE A,[198524864.]  ; = 100. * 256250. * .5 / ln(16/15)
3945                                 ; (256250. 3.9 usec ticks per second.)
3946 ; Used to be:
3947 ;       MOVE A,[100.*15.*125000.] ;100% DIVIDED BY MAXIMUM SINGLE TREE %
3948         ADD A,LOSRCE            ;WITH FUDGE FACTOR FOR LOST TIME
3949         IDIVM A,SLOADU          ;GIVES EFFECTIVE # OF COMPETITORS FOR MACHINE.
3950 ; It is possible for SLOADU to drop below 100. (giving a fair share greater
3951 ; than 100%).  This happens because the decay rate for disowned jobs is
3952 ; less than the decay rate for consoles.  If the load switches abruptly
3953 ; from the disowned jobs to some console, the resource word for the console
3954 ; fills up quicker than the disowned resource word decays, causing their
3955 ; sum to briefly exceed the maximum.  This would be hard to fix without
3956 ; introducing additional resource words just for better maintaining SLOADU.
3957 ;
3958 ; An additional odd effect:  If only disowned jobs are running, and a
3959 ; network server starts up, the fair share drops almost to zero.  This is
3960 ; because when such jobs are created, their resource word is zeroed to
3961 ; given them an initial priority boost.
3962
3963         MOVEI T,0
3964 IFN KA10P,[
3965         MOVE W,[ALCR4,,A]
3966         BLT W,W
3967         JRST A
3968 ] ;KA10P
3969
3970 ALCR4:  MOVN H,JTMU(T)  ;A
3971         ASH H,-4
3972         ADDM H,JTMU(T)
3973         MOVE H,MSKST(T)
3974         ANDI H,%PICLK   ;E
3975         SKIPE UNAME(T)  ;TT
3976          IORM H,PIRQC(T);I
3977         ADDI T,LUBLK    ;Q
3978         CAMGE T,USRHI   ;J
3979 IFN KA10P,[
3980          JRST A         ;R
3981         JRST .+1        ;W
3982 ] ;KA10P
3983 IFE KA10P, JRST ALCR4
3984 ;DROPS THROUGH
3985 \f;DROPS IN
3986 IFN SWPWSP,[
3987         MOVE U,USRHI
3988         SUBI U,LUBLK            ;ACCOUNT FOR I/O WAIT TIME IN USWPRI
3989         MOVSI T,%SWOUT+%SWPGW
3990 IFN KA10P,[
3991         MOVE J,[ALCR5,,A]
3992         BLT J,J
3993         JRST A
3994 ] ;KA10P
3995 ALCR5:  SKIPE UNAME(U)          ;A      ;IGNORE JOBS WHICH DON'T EXIST OR
3996          TDNE T,USWST(U)        ;B      ;ARE SWAPPED-OUT OR IN PAGE-WAIT
3997 IFN KA10P, JRST I               ;C
3998 IFE KA10P, JRST ALCR6
3999         SKIPN USTP(U)           ;D      ;CHARGE JOBS WHICH ARE STOPPED 
4000          SKIPE FLSINS(U)        ;E      ;OR BLOCKED
4001           JRST ALCR7            ;TT
4002 ALCR6:  SUBI U,LUBLK            ;I      ;NEXT JOB
4003 IFN KA10P,[
4004         JUMPG U,A               ;Q
4005         JRST .+1                ;J
4006 ] ;KA10P
4007 IFE KA10P, JUMPG U,ALCR5
4008 ];SWPWSP
4009         SKIPGE 37       ;CHECK FOR PLANNED SYSTEM DEATH
4010          PUSHJ P,DEATH  ;ABOUT TO START DYING
4011           JFCL
4012         IRPS 4US,,[IDLTM1 LOSTM1 USRTM1 NULTM1]SEC,,[IDLTIM LOSTIM USRTIM NULTM3]
4013          MOVE A,4US     ;KEEP SYSTEM WIDE USAGES AS TWO WORDS
4014          IDIVI A,250000. ;ONE IN 4.069 USEC UNITS
4015          ADDM A,SEC     ;AND ONE IN SECONDS
4016          MOVEM B,4US    ;SO NO OVERFLOW
4017          TERMIN
4018         IMULI A,60.     ;CONVERT TO 60THS
4019         ADDM A,NULTIM   ;ADD TO 60THS USED (OBSOLETE)
4020         MOVEI T,SCLKI
4021         MOVEI C,SSLCKB
4022         JRST CLQREE     ;RE-ENTER RQ FOR SLOW CLOCK BREAK
4023
4024 IFN SWPWSP,[            ;JOB IN U NEEDS TO BE CHARGED FOR MEMORY USED WHILE BLOCKED OR STOPPED
4025 ALCR7:  HLLO W,UWRKST(U)
4026         JFFO W,.+1      ;H GETS 19 - LOG(WORKING SET SIZE + 1/2)
4027         SUBI H,19.
4028         IMUL H,[-125000.] ;CHARGE FOR 1/2 SECOND OF MEMORY USAGE
4029         ADDM H,USWPRI(U)
4030 IFN KA10P, JRST I
4031 IFE KA10P, JRST ALCR6
4032 ];SWPWSP
4033 \f
4034 ;SYSTEM IN FINAL THROES OF COMING DOWN, SEE IF IT'S OVER YET
4035
4036 COFFIN: MOVE T,NLOOSP           ;MUST SWAP OUT ALL LOOSE PAGES
4037         ADDB T,SWPOPR
4038         JUMPN T,CPOPJ           ;SWAPPAGE OUT STILL GOING ON
4039         MOVEI T,NQCHN+1+NQS-1
4040         SKIPGE QSGL(T)
4041          SOJG T,.-1
4042         SKIPL QSGL(T)           ;NOT OVER IF ANY DISK CHANNELS ARE ACTIVE
4043          POPJ P,
4044         MOVSI T,040000
4045         MOVE TT,QACTB   ;SEE IF DISK STUFF NOT OUT YET
4046         TDNE TT,QMDRO
4047          POPJ P,        ;MFD NOT OUT
4048         MOVSI A,-NQS
4049 COFFI8: TDNE T,QTUTO(A)
4050          JRST COFFI9    ;TUT NEVER CAME IN
4051         TDNE TT,QTUTO(A)
4052          POPJ P,        ;TUT NOT OUT
4053 COFFI9: AOBJN A,COFFI8
4054         MOVSI A,-QNUD
4055 COFFI1: SKIPN QSNUD(A)
4056          JRST COFFI2
4057         TDNE TT,QSNLCN(A)
4058          POPJ P,        ;UFD NOT WRITTEN
4059 COFFI2: AOBJN A,COFFI1
4060
4061 IFN NUNITS,[
4062         MOVSI A,-NUNITS
4063         SKIPGE UFLAPF(A)
4064          POPJ P,        ;TAPE STILL FLAPPING
4065         AOBJN A,.-2
4066 ]
4067         MOVE A,DTHTIM
4068         ADDI A,15.*30.  ;DON'T WAIT FOR CONSOLES MORE THAN 15 SECONDS
4069         CAMGE A,TIME    ;BECAUSE %TCHNG ISN'T NECESSARILY SET
4070          JRST COFFI3
4071         MOVEI A,NFSTTY-1        ;CHECK FOR REAL CONSOLES STILL TYPING OUT
4072         MOVSI T,%TCHNG  ;AND NOT HUNG (NEVER GOING TO FINISH TYPING OUT)
4073         TDNN T,TTYCOM(A)
4074          SKIPGE TTYOAC(A)
4075           SOJGE A,.-2
4076         JUMPGE A,CPOPJ  ;A CONSOLE IS STILL TYPING, DON'T GO DOWN YET
4077 COFFI3: SKIPL A,SYSCN
4078          SKIPGE TTYOAC(A)
4079           CAIA
4080            POPJ P,      ;SYSTEM CONSOLE HAS A LOT OF TYPING TO DO
4081         MOVEI A,2*LUBLK
4082 COFFI7: CAML A,USRHI
4083          JRST COFFI4
4084         SKIPE UNAME(A)
4085          POPJ P,        ;JOBS STILL EXIST
4086         ADDI A,LUBLK
4087         JRST COFFI7
4088
4089 ;SYSTEM FULLY DOWN; GO TO DDT.
4090 COFFI4: BUG DDT,[SHUTDOWN COMPLETE]
4091         SETZM SHUTDN            ;IF USER PROCEEDS, BRING SYSTEM BACK UP
4092         SETZM DEDTIM            ;ARRANGE TO RELOAD ATSIGN DRAGON
4093         SETZM FLSINS            ;BY RESTARTING SYS JOB WHERE IT DOES THAT
4094         MOVEI A,ISYS
4095         MOVEM A,UPC
4096         POPJ P,
4097 \f
4098 ;ROUTINE TO AGE SOME PAGES.  THIS ROUTINE SLOWLY CIRCULATES THROUGH
4099 ;CORE.  IF IT TOUCHES A PAGE TWICE, AND NO USER HAS TOUCHED IT,
4100 ;THE PAGE GETS SWAPPED OUT.  ALSO FLUSHES PAGES NOT IN ANY USER'S MAP.
4101 ;ENTER WITH VALUE OF AGERTE IN T.
4102
4103 AGE:    MOVE TT,MEMFR
4104         CAIL TT,100
4105          POPJ P,        ;NO MEMORY COMPETITION, DON'T BOTHER
4106         ADD T,AGEREQ    ;INCREASE NUMBER OF PAGES NEEDING TO BE AGED
4107         CAIGE T,100     ; BUT DON'T LET IT GET INFINITELY HUGE
4108          MOVEM T,AGEREQ ; IF CIRPSW IS LOCKED FOR A LONG TIME
4109         SKIPN DLSRCH    ;IF MUSTN'T PCLSR ANYONE, OR
4110          SKIPL CIRPSW   ; IF CIRPSW LOCKED, HAVE TO WAIT UNTIL NEXT SLOW CLOCK
4111           POPJ P,
4112         LDB W,[121000,,HUSRAD]  ;DON'T AGE SYSTEM JOB (CIRC PNTRS NOT CONNECTED)
4113         MOVE A,AGEPOS   ;CONTINUE AGEING FROM WHERE LEFT OFF LAST TIME
4114         SKIPGE U,USER   ;CHECK FOR NULJOB
4115          JRST AGE0
4116         MOVE T,CLKBRK   ;PC FOR USER WHO MAY GET PCLSR'D
4117         MOVEM T,UPC(U)  .SEE SWOP2
4118         LPMR UPGML(U)   ;DON'T LEAVE SWAPPED OUT PAGES IN ASSOC MEM
4119 AGE0:   CAIGE A,TSYSM
4120          CAMGE A,W
4121           MOVE A,W
4122         SOSGE AGEREQ
4123          JRST [ MOVEM A,AGEPOS ? SETZM AGEREQ ? POPJ P, ]
4124         AOS NAGES
4125         LDB T,[MUR,,MEMBLT(A)]
4126         CAIE T,MURUSR
4127          AOJA A,AGE0
4128         MOVE D,A
4129         PUSHJ P,UCPRL4
4130             SETZ AGE1
4131         MOVNI C,1       ;NO USERS ACTIVELY USING THIS PAGE, SWAP IT OUT
4132         PUSHJ P,SWPOPG
4133          JFCL
4134         AOJA A,AGE0
4135
4136 AGE1:   MOVEI C,UPGMP(U)
4137         MOVE T,I        ;DON'T CLOBBER I
4138         ROT T,-1
4139         ADD C,T
4140         HRLI C,222200
4141         SKIPGE T
4142          HRLI C,2200
4143         LDB T,C         ;GET PAGE MAP WORD
4144         TRNN T,600000
4145          POPJ P,        ;USER NOT CONNECTED TO THIS PAGE
4146         TROE T,PMAGEM
4147          POPJ P,        ;HASN'T TOUCHED THIS PAGE SINCE AGE BITS LAST SET
4148         DPB T,C         ;HAS TOUCHED PAGE, TURN AGE BITS BACK ON
4149         SUB P,[4,,4]    ;AND BACK OUT OF UCPRL
4150         AOJA A,AGE0
4151 \f
4152 IFN 340P,[
4153
4154 DISCHK: SKIPGE DISOFF
4155         POPJ P,
4156         AOSLE DISDIE
4157         SKIPGE CDISOFF
4158         POPJ P,
4159         MOVEI T,1
4160         MOVEM T,DTIME
4161 DISZAP: MOVE T,[JSR DBLKPB]
4162         MOVEM T,40+2*DISCHN
4163         MOVEI T,DIS300-1        ;CAUSE 340 TO STOP AND INTERRUPT SOON
4164         MOVEM T,DBLKOP
4165         CLEARM DISOFF
4166         CONO DIS,5100+SDCHN_3+DISCHN
4167         POPJ P,
4168 ]
4169
4170 DEATH:  SKIPL SHUTLK
4171         POPJ P,
4172         SETZM 37        ;CLEAR START DYING FLAG
4173         MOVEI T,60.*5.*60.      ;5 MIN
4174         MOVEM T,DEDTIM
4175         LSH T,-1
4176         ADD T,TIME
4177         MOVEM T,SHUTDN
4178         PUSHJ P,CLQDEL
4179          DEDBLK
4180 DEATHX: SKIPN T,DEDTIM
4181          POPJ P,
4182         AOS (P)
4183         MOVEI TT,0
4184         CAIGE T,40.*60.
4185          JRST DEATHY
4186         MOVE TT,T
4187         LSH TT,-2
4188 DEATHY: MOVEM TT,DEDTIM
4189         SUB T,TT
4190         PUSHJ P,CLQADD
4191          DEDBLK
4192 DEATHM: MOVEI A,%PIDWN
4193         PUSHJ P,INTALL  ;TELL THE WORLD
4194         MOVSI T,SCLSHD  ;CAUSE TYPE OUT ON UNLOGGED-IN CONSOLES
4195 SUPSET: IORM T,SUPCOR
4196         POPJ P,
4197
4198 VSSLCK: MOVSI T,SCLVSK
4199         IORM T,SUPCOR   ;CAUSE VERY SLOW CLOCK TO RUN
4200         MOVEI T,VSCLKI
4201         MOVEI C,VSLCKB
4202         JRST CLQREE
4203
4204 IFN CCLKP,[
4205 RCCLK:  DATAI 374,T     ;HACK CHESS CLOCK
4206         TRNE T,4000
4207          AOSA CCLK1
4208           AOS CCLK2
4209         MOVEI T,6
4210         MOVEI C,CCLKB
4211         JRST CLQREE
4212 ]
4213
4214 IFN N11TYS,[
4215 WHOSET: MOVEI T,SCRWHO  ;CAUSE SYS TO UPDATE WHO LINES
4216         IORM T,SUPCOR
4217         MOVEI T,5.*60.-5  ;5 SECONDS MINUS A LITTLE SO DOESN'T SYNC WITH OTHER CLOCKS
4218         MOVEI C,WHOCLB
4219         JRST CLQREE
4220 ]
4221 \f
4222 SUBTTL SWAP SCHEDULER
4223
4224 OVHMTR SWS      ;SWAP SCHEDULER
4225
4226 ;15 SECOND CLOCK
4227 15SCLK:
4228 IFN IMPP,       PUSHJ P,IMRSTO  ;RESET CONTROL LINK RFNM WAIT FOR LOSING IMP.
4229
4230 ;RECOMPUTE SWAP BLOCK DATA.
4231 ;DECAY SWAP PRIORITIES (USWPRI AND SWRCE)
4232 ;RESET BEST-EFFORT-HAS-BEEN-MADE TO SWAP OUT BITS
4233
4234         MOVSI B,%SWBEM  ;SET UP TO CLEAR "BEST EFFORT TO SWAP OUT BIT"
4235         SETOM SBEFLG    ;NOT YET DESPERATE ENOUGH TO TRY USERS WHOSE BEST EFFORT BITS ARE SET
4236 IFE SWPWSP,[
4237         CLEARB T,NUSWB  ;# USERS LOCKED OUT
4238         SETOM BUSR      ;SMALLEST SWAPPED BLOCKED USER
4239         MOVE D,[37777,,777777]
4240         MOVEM D,BUSIZ   ;SIZE OF SMALLEST SWAP-BLOCKED USER.
4241         CLEARM ASBUM    ;REAL MEM OCC BY ACTIVE SWAPPED BLOCKED LOSERS
4242         MOVSI D,400000  ;TO CLEAR SWAPPED BLOCKED BIT
4243 ];SWPWSP
4244 .ELSE   MOVEI T,LUBLK*2
4245 15S1:   CAML T,USRHI
4246          JRST 15S2
4247         SKIPN UNAME(T)
4248          JRST 15S3
4249         MOVN C,USWPRI(T)
4250         ASH C,-2
4251         ADDM C,USWPRI(T)        ;DECAY JOB SWAP PRI'S
4252         MOVE C,NMPGS(T)
4253 IFE SWPWSP,[
4254         SKIPE ENPZRO
4255          SUBI C,1       ;COMPENSATE FOR PAGE ZERO ALWAYS IN
4256 ];SWPWSP
4257         CAMLE C,NSWPGS(T)       ;SKIP ON NOT COMPLETELY OUT
4258          ANDCAM B,USWST(T) .SEE %SWBEM
4259 IFE SWPWSP,[
4260         SKIPGE USWSCD(T)
4261          JRST 15S4      ;CLEAR SWAPPED BLOCK BIT AND MAYBE ADD TO AUSOPG AND TRUMM (IF HE WAS HUNG ON IT)
4262 ];SWPWSP
4263 15S3:   ADDI T,LUBLK
4264         JRST 15S1
4265
4266 15S2:
4267 IFE SWPWSP,[
4268         SKIPE ENSWSC
4269          PUSHJ P,SWSCD  ;SWAP BLOCK LOSERS IF NECESSARY
4270 ];SWPWSP
4271         MOVSI T,-NCT-2
4272 15S5:   MOVN C,SWRCE(T) ;DECAY TREE SWAP PRI'S
4273         ASH C,-2
4274         ADDM C,SWRCE(T)
4275         AOBJN T,15S5
4276         MOVEI T,15.*60.
4277         MOVEI C,15SCLB
4278         JRST CLQREE
4279
4280 IFE SWPWSP,[
4281 15S4:   ANDCAM D,USWSCD(T)      ;CLEAR SWAP BLOCK BIT
4282         SKIPN TT,FLSINS(T)      ;WAS HE HUNG TESTING IT
4283          JRST 15S3
4284         SUBI TT,(T)
4285         CAME TT,[SKIPGE USWSCD]
4286          JRST 15S3              ;HE WASN'T HUNG ON THIS
4287         CLEARM FLSINS(T)        ;HE WAS SO NOW HES ACTIVE
4288         MOVE TT,USWST(T)
4289         TLZE TT,%SWPGW
4290          SOS NPGWTU             ;FLSINS WAS SET BY PAGE FAULT, SO CONSIDERED
4291         TLZ TT,%SWBEM           ;TO BE WAITING FOR A PAGE
4292         MOVEM TT,USWST(T)
4293         MOVE TT,NMPGS(T)
4294         ADDM TT,TRUMM           ;GUY IS NOW RUNNABLE
4295         SUB TT,NSWPGS(T)        ;ANY PAGES HE MAY HAVE IN MEM NO LONGER BELONG TO A BLOCKED USER
4296         MOVNS TT
4297         ADDB TT,BUMPGS
4298         SKIPGE TT
4299          CLEARB TT,BUMPGS
4300         MOVE TT,NSWPGS(T)       ;ANY SWAPPED OUT PAGES BELONG TO AN ACTIVE USER
4301         ADDM TT,AUSOPG
4302         JRST 15S3
4303 ];SWPWSP
4304 \f
4305 IFE SWPWSP,[
4306
4307 PRVCLK: SKIPN ENPVCL
4308          JRST PRVCK4
4309         MOVSI B,%SWPRV
4310         SKIPL U,PRVUSR
4311          ANDCAM B,USWST(U)
4312         SETOM PRVUSR    ;TURN OFF CURRENT PRIVILEDGED USER
4313         MOVEI J,2*LUBLK
4314 PRVCK1: CAML J,USRHI
4315          JRST PRVCK2
4316         SKIPN UNAME(J)
4317          JRST PRVCK3
4318         MOVE B,UTRNTM(J)        ;GET USER RUN TIME
4319         SUB B,LTRNTM(J)
4320         MOVE A,USIPRQ(J)
4321         SUB A,LSIPRQ(J)
4322         IMUL A,[NPVSEC*125000.] ;1/2 NUMBER OF 4 MICROSECOND INTERVALS IN THE PRIV INTERVAL
4323         SKIPE B
4324          IDIV A,B
4325         MOVE B,UPGSEC(J)
4326         LSH B,-1                ;DIVIDE LAST VALUE BY TWO
4327         ADD A,B
4328         MOVEM A,UPGSEC(J)       ; LAST/2 + CURRENT
4329         MOVE A,UTRNTM(J)
4330         MOVEM A,LTRNTM(J)
4331         MOVE A,USIPRQ(J)
4332         MOVEM A,LSIPRQ(J)       ;SAVE OLD VARIABLES
4333 PRVCK3: ADDI J,LUBLK
4334         JRST PRVCK1
4335
4336 PRVCK2: PUSHJ P,NPRVUS  ;GET NEXT PRIV USR
4337 PRVCK4: MOVEI T,NPVSEC*60.
4338         MOVEI C,PRVCLB
4339         JRST CLQREE
4340
4341 NPRVUS: MOVEI J,2*LUBLK
4342         SETOM U
4343         MOVNI T,30.*2   ;DON'T LET A BLOCKED OR STOPPED PERSON BE PRIVILEDGED
4344         ADD T,TIME
4345         MOVE B,PRVCUT
4346         HRLOI E,377777
4347 NPVUS1: CAML J,USRHI
4348          JRST NPVUS2
4349         CAMGE T,LUBTM(J)        ;BLOCKED TOO LONG?
4350          SKIPN UNAME(J)
4351           JRST NPVUS3
4352         CAMG B,UPGSEC(J)
4353          CAMG E,LPRVTM(J)
4354           JRST NPVUS3
4355         MOVE U,J
4356         MOVE E,LPRVTM(J)
4357 NPVUS3: ADDI J,LUBLK
4358         JRST NPVUS1
4359
4360 NPVUS2: MOVEM U,PRVUSR
4361         SKIPG U
4362          POPJ P,
4363         MOVSI B,%SWPRV
4364         IORM B,USWST(U)
4365         MOVE T,TIME
4366         MOVEM T,LPRVTM(U)
4367         POPJ P,
4368 ];SWPWSP
4369 \f
4370 IFE SWPWSP,[
4371 IFNDEF MEMSYS,MEMSYS==50        ;GUESS AT AMOUNT OF MEM SYSTEM NEEDS
4372 IFNDEF MEMSY1,MEMSY1==50        ;AMOUNT OF MEM ANY ONE USER MUST LEAVE TO "FIT".
4373
4374 SWSCD:  MOVE E,TRUMM    ;SEE IF NECESSARY TO SWAP BLOCK SOMEONE
4375         CAIGE E,TSYSM-SYSB-MEMSYS
4376         POPJ P, ;NO SHOULD FIT
4377         MOVE E,MEMFR
4378         SUB E,NCBCOM
4379         ADD E,SOLNG
4380         SUB E,SILNG
4381         SUB E,AUSOPG
4382         ADD E,BUMPGS    ;WILL SWAP OUT BLOCKED USERS FIRST
4383         ADD E,ASBUM
4384         SUBI E,20       ;SLOP
4385         JUMPGE E,CPOPJ  ;SHOULD HAVE ROOM FOR EVERYBODY
4386         MOVMM E,SWSCT1  ;SAVE # PGS REQ
4387         MOVNI E,1       ;NEED TO GRONK USER (MAYBE)
4388         CLEARB T,TT     ;TT SWP PRI OF PROCESS
4389         MOVEI R,0       ;R SWP PRI OF TREE
4390 SWSCP1: CAML T,USRHI
4391         JRST SWSCP2
4392         SKIPE UNAME(T)
4393         SKIPE USTP(T)
4394         JRST SWSCP7
4395         SKIPGE USWSCD(T)
4396         JRST SWSCP7     ;GUY ALREADY LOCKED OUT
4397         SKIPE FLSINS(T)
4398         JRST SWSCP4     ;SEE IF REALLY BLOCKED OR JUST PAGE WAIT
4399 SWSCP5: MOVE B,UTMPTR(T)
4400         CAML R,SWRCE-USRRCE(B)
4401         CAMG TT,USWPRI(T)
4402         JRST SWSCP6     ;THIS GUY A BIGGER LOSER THAT PREV BIGGEST
4403 SWSCP7: ADDI T,LUBLK
4404         JRST SWSCP1
4405
4406 SWSCP6: MOVE E,T
4407         MOVE R,SWRCE-USRRCE(B)
4408         MOVE TT,USWPRI(T)
4409         JRST SWSCP7     ;GUY REALLY BLOCKED
4410
4411 SWSCP4: MOVE B,USWST(T)
4412         TLNE B,%SWPGW
4413          JRST SWSCP5
4414         JRST SWSCP7
4415
4416
4417 SWSCP2: JUMPL E,CPOPJ   ;NO VICTIM
4418         MOVE B,NMPGS(E)
4419         CAIGE B,TSYSM-SYSB-MEMSY1
4420         JRST SWSCP9     ;"SMALL LOSER"
4421         SUB B,NSWPGS(E)
4422         CAMLE B,SWSCT1  ;SKIP ON WILL STILL NEED TO BLOCK MORE LOSERS
4423         POPJ P,
4424 SWSCP9: MOVSI B,400000
4425         IORM B,USWSCD(E)        ;SWAP BLOCK LOSER
4426         AOS NUSWB
4427         AOS NTUSB
4428         MOVE TT,NMPGS(E)
4429         CAMLE TT,BUSIZ
4430         JRST SWSCP8
4431         MOVEM TT,BUSIZ
4432         MOVEM E,BUSR
4433 SWSCP8: SUB TT,NSWPGS(E)
4434         SOSGE TT
4435         MOVEI TT,0
4436         ADDM TT,ASBUM   ;THIS GUY SWAPPED BLOCKED
4437         MOVN TT,NMPGS(E)
4438         ADDM TT,TRUMM   ;DOESNT COUNT ANY MORE
4439         SKIPGE TRUMM
4440         CLEARM TRUMM
4441         MOVN TT,NSWPGS(E)
4442         ADDM TT,AUSOPG  ;NOT REALLY ACTIVE ANY MORE
4443         JRST SWSCD      ;SEE IF THATS ENUF
4444 ];SWPWSP
4445 \f
4446 OVHMTR PPI      ;PPIUM
4447
4448 ;PUT PAGE INTO USERS' MAPS (OF ALL USERS THAT ARE CONNECTED VIA CIRCULAR POINTERS)
4449 ;ALSO UPDATES THE WORKING SETS.
4450 ;CALL WITH PAGE NUMBER IN A, STARTING BYTE POINTER IN C, AND TDNE T,MMP IN D.
4451 ;SMASHES T,H,I,U,E,TT,C
4452 PPIUM:  AOS NPPIUM
4453 IFN SWPWSP,[
4454         MOVEI E,0       ;COUNT USERS OF THE PAGE
4455         PUSHJ P,UCPRL
4456             400000,,[AOJA E,CPOPJ]
4457         HRRM E,MMSWP(A) ;ALL THESE SHARERS WILL BE CONNECTED TO THE PAGE
4458         MOVSI T,1       ;COMPUTE WORKING SET ADJUSTMENT
4459         IDIVM T,E       ;I.E. 1 OVER NUMBER OF SHARERS
4460 ];SWPWSP
4461         PUSHJ P,UCPRL   ;GIVE PAGE TO ALL USERS WAITING FOR IT
4462             400000,,PPIUM1
4463         POPJ P,
4464
4465 ;SET UP MAP TO MEMBLT INDEX IN A
4466 PPIUM1: AOS NPPIU1
4467         CAIG U,LUBLK
4468          BUG            ;SYS JOB OR CORE JOB
4469         PUSH P,I
4470         MOVEI C,UPGMP(U)
4471         ROT I,-1
4472         ADDI C,(I)
4473         HRLI C,222200
4474         SKIPGE I
4475          HRLI C,2200
4476         LDB I,C
4477         JUMPE I,[JRST 4,.]      ;DOESN'T REALLY EXIST?
4478         MOVSI T,MMPPGA          ;DON'T REALLY PUT IN MAP IF PAGE-AHEAD PAGE.
4479         TDNE T,(D)              ;JUST PRE-EMPT.
4480          JRST QSWI2A
4481         TRNE I,600000           ;DO NOTHING IF ALREADY IN MAP.
4482 IFE E.SP,[
4483          JRST QSWI2     ;ALREADY IN MAP, POSSIBLE AS A RESULT OF RIDICULOUS TIMING ERROR
4484 ]
4485 IFN E.SP,[
4486          JRST E.SPGJ    ; CHECK E&S WANTS READ/WRITE FIRST FIX
4487 ]
4488         SOS NSWPGS(U)   ; NUMBER OF SWAPPED-OUT PAGES
4489         SOS SNSWPG      ;DECR CNT OF SWAPPED OUT FOR SYS
4490         SKIPN (P)       ;DON'T SET UP PG 0 AS R-W-F.
4491          JRST QSWI3
4492         TRNE I,2
4493          MOVEI I,2      ;SET READ/WRITE TO READ/WRITE/FIRST
4494 QSWI3:  LSH I,16.
4495         IORI I,PMCSHM(A);BRING IN ADDRESS AND CACHE BITS
4496         DPB I,C
4497 QSWI2:
4498 IFE SWPWSP,[
4499         AOS MMSWP(A)    ;INCREMENT COUNT OF USERS IN RING
4500 ];SWPWSP
4501 IFN SWPWSP,[
4502         ADDM E,UWRKST(U)        ;ADJUST WORKING SET
4503 ];SWPWSP
4504 QSWI2A:
4505 IFN PAGPRE,[
4506 ;IF THIS USER IS WAITING FOR THIS PAGE, MAKE HIM RUNNABLE BY PUTTING
4507 ;HIM ON THE SCHMNY LIST, AND PRE-EMPT THE CURRENTLY-RUNNING USER.
4508 ;THE IDEAS ARE TO START THIS USER'S NEXT PAGE READ AS SOON AS POSSIBLE,
4509 ;AND TO ELIMINATE THE SCHEDULING THAT WOULD OTHERWISE BE NECESSARY TO RUN THIS GUY.
4510         AOS NPREE1
4511         CONSZ PI,200_-APRCHN    ;CAN'T PREEMPT IF CLKOFF
4512          CONSZ PI,100000_-APRCHN        ;OR IN PROGRESS, BECAUSE
4513           JRST POPIJ            ;MIGHT ZERO FLSINS WHILE SCHEDULER
4514                                 ;IS EXECUTING IT & SIMILAR NASTIES
4515         AOS NPREE2
4516         CAME D,FLSINS(U)        ;IF JOB THAT JUST GOT PAGE IS WAITING FOR IT
4517          JRST POPIJ
4518         AOS NPREE3
4519         SETZM FLSINS(U)         ;THEN THAT JOB PREEMPTS CURRENT ONE
4520         MOVSI T,%SWPGW
4521         TDNE T,USWST(U)
4522          SOS NPGWTU             ;FLSINS WAS DUE TO PAGE FAULT (MIGHT BE IN .CALL CORBLK)
4523         ANDCAM T,USWST(U)
4524         HRRZ I,U
4525         PUSHJ P,SCHSB
4526         SETOM PREEMP
4527         CONO PI,CLKRQ           ;REQUEST INT TO SCHEDULER
4528 ];PAGPRE
4529 IFE PAGPRE,[
4530         SKIPE ENPREE
4531          CAME D,FLSINS(U)
4532           JRST POPIJ
4533         MOVE TT,PRVCUT
4534         CAME U,PRVUSR
4535          CAMLE TT,UPGSEC(U)
4536           SETZM SCHFLG
4537 ];PAGPRE
4538 POPIJ:  POP P,I
4539         POPJ P,
4540
4541 IFN E.SP,[
4542 E.SPGJ: SKIPE E.SPGH    ; FLAG FROM E.SPGI
4543          CAME U,DISUSR
4544           JRST QSWI2    ; LEAVE AS IS
4545         TRNN I,400000
4546          JRST QSWI2
4547         MOVEI I,3
4548         JRST QSWI3      ; GO MAKE READ/WRITE
4549         ; DON'T SOS NSWPGS, SINCE PAGE IS ALREADY HERE
4550 ];E.SP
4551 \f
4552 SUBTTL USER SCHEDULER
4553
4554 OVHMTR SC1      ;SCHEDULER 1 - ENTRY
4555
4556 IFN KL10P, IFNDEF SCCOST, SCCOST==250.  ;CHARGE 1 MILLISEC FOR SCHEDULING
4557 IFN KA10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4558 IFN KS10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4559
4560 SCHED:  SKIPGE U,USER
4561          JRST SCHED9
4562         MOVE T,CLKBRK
4563 IFN KS10P,[
4564         ;; If user is swapped out while running in the page fail code, then
4565         ;; EPTPFO is used as the PC.  Either he is on his way in, in which
4566         ;; case he will come back when restarted, or he is on his way out,
4567         ;; in which case this just pushes him on his way.
4568         TLNE T,%PSUSR
4569          JRST SCHED0
4570         HRRZ T,T
4571         CAIL T,PFAIL            ; First instruction inclusive
4572          CAILE T,PFAILE         ; Last instruction inclusive
4573           SKIPA T,CLKBRK
4574            MOVE T,EPTPFO
4575 SCHED0: ] ;IFN KS10P
4576         MOVEM T,UPC(U)
4577 IFN SCHBLN,SETZM SCHMNY ;ENTERED FROM QUANTUM RUNOUT, TIME TO CHECK ALL USERS
4578 SCHED2: ;ENTERED FROM UFLS OR PAGE FAULT, CHECK FOR AUXIL PERSON TO RUN
4579         ;IF SCHMNY IS STILL -1
4580         AOS NSKED
4581         MOVSI T,UEXIT   ;GET HERE FROM CLUFLS
4582         HRRI T,UUO(U)
4583         BLT T,SUEXND-1(U)
4584 IFN KL10P,[
4585         AC7CTX
4586         XCTR XR,[HRRZ A,13]     ;GCSTBR
4587         XCTR XR,[HRL A,14]      ;STBR
4588         SYSCTX
4589         MOVEM A,ULSPBR(U)
4590         SKIPL MTRUSR    ;SKIP IF PERF COUNTER AVAILABLE
4591          JRST [ DMOVE A,MBOXCT(U)       ;COMPUTE EQV CPU TIME FROM MBOX+EBOX ACCT
4592                 DSUB A,STMBOX           ;AS INCREMENTAL RUNTIME
4593                 DMUL A,KLMBCC
4594                 DADD B,EBOXCT(U)
4595                 DSUB B,STEBOX
4596                 DMUL B,KLEBCC
4597                 MOVE A,D
4598                 JRST SCHD2A ]
4599         RPERFC A
4600         DSUB A,STPERF   ;USER RUN TIME IN 80 NS UNITS LEFT 12
4601         DIVI A,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS IN A
4602 SCHD2A:
4603 ] ;KL10P
4604 IFN KS10P, LDB A,[044000,,UPQUAN(U)]    ;GET TIME USED IN 3.9 USEC UNITS
4605 IFN KA10P, LDB A,[022100,,UPQUAN(U)]    ;GET TIME USED IN 4.069 USEC UNITS
4606         ADDM A,USRTM1           ;SYSTEM TOTAL USER RUN TIME
4607         ADDM A,UTRNTM(U)        ;INCREASE RUN TIME
4608         ADDM A,JTMU(U)          ;DECREASE PROCEDURE PRIORITY
4609         MOVEI B,SCCOST(A)       ;ACCOUNT FOR OVERHEAD IN STARTING UP
4610         ADDM B,@UTMPTR(U)       ;DECREASE PROCEDURE TREE PRIORITY
4611 IFE SWPWSP,[
4612         MOVE T,NMPGS(U)         ;USWPRI IS PAGES IN CORE X CPU TIME
4613         SUB T,NSWPGS(U)
4614 ];SWPWSP
4615 IFN SWPWSP,[
4616         HLLO B,UWRKST(U)        ;USWPRI IS LOG(WORKING SET SIZE) X (CPU TIME + IO WAIT TIME)
4617         JFFO B,.+1              ;C GETS 19 - LOG(WORKING SET SIZE + 1/2)
4618         MOVEI T,19.
4619         SUB T,C
4620 ];SWPWSP
4621         IMUL T,A
4622         MOVE Q,UTMPTR(U)
4623         ADDM T,USWPRI(U)        ;CHARGE AGAINST SWAPPINNG PRI
4624         ADDM T,SWRCE-USRRCE(Q)  ;AND FOR TREE
4625         MOVE B,A
4626         LSH B,-7                ;GET RUNTIME IN 512 USEC UNITS
4627         CAILE B,777
4628          MOVEI B,777            ;TO FIT IN SCHEDULER HISTORY TBL
4629         MOVE C,USWST(U)
4630         SKIPE FLSINS(U)
4631          TLNN C,%SWPGW
4632           JRST SCHED8
4633         TRO B,1000              ;BLOCKAGE DUE TO PAGE FAULT
4634 IFN SWPWSP,[
4635         CAML A,LODQNT           ;CHECK FOR LEAVING LOADING STATE
4636 SCHED8:  TLZN C,%SWLOD          ;DUE TO RUNNING FOR MORE THAN LODQNT BETWEEN PAGE FAULTS
4637           JRST .+2              ;OR DUE TO BLOCKAGE FOR REASON OTHER THAN A PAGE FAULT
4638            PUSHJ P,LVLOA0       ;LEAVE LOADING STATE
4639 ];SWPWSP
4640 .ELSE SCHED8:
4641         DPB B,[311200,,@SCHHP]  ;COMPLETE SCHEDULER HISTORY TBL ENTRY
4642         SKIPL Q,RTIMER(U)       ;SKIP UNLESS RUNTIME INT ACTIVE
4643          JRST SEARRT
4644 SCHED3: SKIPGE DLSRCH
4645          JRST SEAREP    ;DELETE SEARCH, EXIT
4646 IFN PAGPRE,[
4647         SKIPE PREEMP            ;PRE-EMPT?
4648          JRST SCHEDP            ;YES, AVOID DOING FULL SCHEDULE
4649 ];PAGPRE
4650 IFN SCHBLN,[
4651         SKIPN SCHMNY    ;IF NOT YET TIME TO DO A FULL SCHEDULE,
4652          JRST SEARL0
4653 SCHED4: HLRZ U,UREALT   ;THEN CHECK LIST OF JOBS SCHEDULED BEFORE
4654         JUMPE U,SEARL0  ;ALWAYS SCHEDULE IF HIGH PRIORITY REAL TIME USER ACTIVE
4655         PUSHJ P,SCHGB   ;POP NEXT JOB OFF LIST
4656         JUMPL U,SEARL0  ;EMPTY
4657         PUSHJ P,SCHACK
4658          JRST SCHED4    ;JOB CEASED TO BE RUNNABLE
4659         AOS NSSKED      ;OK, RUN THIS ONE
4660         JRST SCHED6
4661 ];SCHBLN
4662
4663 SEARRT: SUB Q,A
4664         MOVEM Q,RTIMER(U)
4665         JUMPGE Q,SCHED3
4666         MOVSI T,(%PIRUN)        ;GIVE RUNTIME INTERRUPT
4667         IORM T,PIRQC(U)
4668         JRST SCHED3
4669 \f;
4670 ; HERE TO DO A FULL SCHEDULE (LOOK AT ALL JOBS)
4671 ;
4672
4673 OVHMTR SC2      ;SCHEDULER 2 - SEARCH
4674
4675 SEARL0: AOS NRSKED      ;1 MORE REAL SCHED (ACTUALLY SEARCHES JOBS)
4676         CLEARM TRUMM    ;TOTAL RUNNABLE USER MEM
4677         CLEARM AUSOPG   ;ACTIVE USER SWAPPED OUT PAGES
4678         CLEARM BUMPGS   ;PAGES IN REAL CORE BELONGING TO BLOCKED USERS
4679 IFE SWPWSP,     CLEARM ASBUM    ;PGS IN REAL MEM OCC BY SWAPPED BLOCKED LOSERS
4680         SKIPN SWPOPB
4681          SKIPE SWPOPR
4682           PUSHJ P,SWPON ;SWAP OUT STUFF
4683 IFN NSWPV,[
4684         SKIPGE CIRPSW
4685          PUSHJ P,SWPPIN ;SERVICE SWAPPING REQUESTS FROM OTHER PROCESSORS (DISPLAY)
4686 ]
4687         SETZB U,J       ;JOB BEING SCHEDULED
4688         SETZM RNABLU    ;NUM RUNABLE USERS
4689 IFN SCHBLN,[
4690         SETZM SCHBNJ    ;GOT NO RUNNABLE JOBS YET
4691         SETOM SCHMNY    ;ALLOW ALL THE RUNNABLES WE FIND TO RUN
4692 ];SCHBLN
4693 .ELSE   SETOM I         ;BEST USER SO FAR
4694         MOVNI T,7
4695         MOVEM T,SCHFLG  ;DONT SCHED AGAIN FOR 1/7.5 SEC
4696         JRST SEARL1
4697
4698 ;HERE IF NULL JOB HAD BEEN RUNNING
4699
4700 SCHED9: AOS NNSKED      ;1 MORE TIME NULL JOB WAS RUN
4701 IFN KA10P, LDB C,[022100,,UPQUAN] ;GET TIME NULL JOB RAN IN 4.069 USEC UNITS
4702 IFN KS10P, LDB C,[044000,,UPQUAN] ;GET TIME NULL JOB RAN IN 3.9 USEC UNITS
4703 IFN KL10P,[
4704         CAMN U,MTRJOB   ;IF METERING ONLY NULL JOB, STOP METERS NOW
4705          WRPAE PAEOFF
4706         CAMN U,MTRJOB
4707          CONO MTR,4001  ;TIME-BASE OFF, INTERVAL PIA=1
4708         REBOXC A        ;COMPUTE NULL JOB'S EQUIVALENT RUNTIME IN 4 USEC UNITS
4709         DSUB A,NULEBC
4710         RMBOXC C
4711         DSUB C,NULMBC
4712         DMUL C,KLMBCC   ;CONVERT MBOX COUNT TO EBOX COUNTER UNITS,
4713         DADD A,D        ;ADD TO EBOX COUNT
4714         DMUL A,KLEBCC   ;CONVERT TO 4 USEC UNITS.
4715         SKIPGE MTRUSR
4716          JRST [ RPERFC C        ;PERFORMANCE METER AVAILABLE, USE IT INSTEAD
4717                 DSUB C,NULPRF 
4718                 DIVI C,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS
4719                 JRST .+1 ]
4720 ];KL10P
4721         ADDM C,NULTM1   ;ACCUMULATE TOTAL NULL TIME IN 4 USEC UNITS
4722         SKIPE NPGWTU    ;IF SOMEONE WOULD HAVE BEEN RUNNING IF THEY
4723          ADDM C,LOSTM1  ; WEREN'T WAITING FOR A PAGE, THIS WAS LOST TIME
4724         SKIPN NPGWTU    ;BUT OTHERWISE
4725          ADDM C,IDLTM1  ;IT WAS COMPLETE IDLE TIME
4726         SKIPE NPGWTU    ;NOW COMPUTE % TIME IDLE AND LOST
4727          ADDM C,LOSRCE
4728         SKIPN NPGWTU
4729          ADDM C,IDLRCE
4730 IFN PAGPRE,SKIPN PREEMP ;CHECK FOR PRE-EMPT
4731          JRST SEARL0    ;NOW GO DO A FULL SCHEDULE
4732 IFN PAGPRE,[
4733 SCHEDP: SETZM PREEMP
4734         AOS NPREEL
4735         PUSHJ P,SCHGB   ;U GETS USER TO PRE-EMPT THIS ONE (LAST INTO SCHMNY LIST)
4736         JUMPL U,SCHDP1  ;NO ONE TO PRE-EMPT, RUN SAME USER AGAIN
4737         PUSHJ P,SCHACK  ;MAKE SURE PRE-EMPTING JOB IS RUNNABLE
4738          JRST SCHEDP    ;AFRAID NOT
4739         AOS NPREEM      ;OK, RUN THIS ONE
4740         SKIPL I,USER
4741          PUSHJ P,SCHSB  ;PRE-EMPTED JOB IS STILL A CANDIDATE FOR RUNNING
4742         JRST SCHED6
4743
4744 SCHDP1: SKIPGE U,USER   ;TRY TO RUN SAME USER AGAIN
4745          JRST SCHED1    ;RUN NULL JOB AGAIN
4746         PUSHJ P,SCHACK  ;MAKE SURE THIS JOB IS STILL RUNNABLE (COULD HAVE UFLSED)
4747          JRST SEARL0    ;FOO, BETTER DO A FULL SCHEDULE
4748         JRST SCHED6     ;OK, RUN THIS GUY
4749 ];PAGPRE
4750 \f
4751 ;MAIN SEARCH LOOP, RETURN HERE TO EXAMINE NEXT PROCEDURE
4752 SEARL:  MOVEI U,LUBLK   ;LENGTH OF USER VAR BLOCK
4753         ADDB U,J        ;STEP TO NEXT USER
4754         CAML U,USRHI    ;SKIP IF EXISTS
4755          JRST SEAREN    ;ALL PROCEDURES HAVE BEEN EXAMINED
4756 SEARL1: SKIPE T,USTP(U)
4757          JRST SEARS1    ;EMPTY OR STOPPED JOB SLOT
4758         SKIPE A,PIRQC(U)
4759          JRST SEAR2A    ;FIRST WORD INTERRUPT PENDING
4760 SEARL2: SKIPE B,IFPIR(U)
4761          JRST INTWD2    ;SECOND WORD INTERRUPT PENDING
4762 SEARL3: SKIPN FLSINS(U)
4763          JRST SEARC     ;NOT BLOCKED
4764 SEARL4: MOVE T,EPDL2(U)
4765         XCT FLSINS(U)   ;TEST BLOCKING CONDITION (MAY SKIP ONCE OR TWICE)
4766          JRST SEARLB    ;UNRUNABLE
4767          JRST SEARC     ;LOW PRIORITY UNBLOCK
4768          SKIPA Q,[-1]   ;HIGH PRIORITY UNBLOCK
4769           MOVEI Q,3     ;EXTRA LOW PRIORITY
4770         JRST SEARC2
4771
4772 SEARC:  SETZM Q         ;SET TO NORMAL PRIORITY
4773         PUSHJ P,UPRIVL  ;COMPUTE PRIVELEGE LEVEL (MAY SKIP ONCE OR TWICE)
4774          SOJA Q,SEARC2  ;HIGH-PRIORITY
4775          JRST SEARC2
4776         SKIPGE APRC(U)
4777          ADDI Q,2       ;DISOWNED JOB IN USER MODE
4778 SEARC2: AOS RNABLU      ;ANOTHER RUNABLE USER
4779         MOVE T,TIME
4780         MOVEM T,LUBTM(U)        ;RECORD LAST TIME UNBLOCKED
4781 IFE SWPWSP,[
4782         SKIPGE USWSCD(U)
4783          JRST SEARC7    ;HE'S SWAPPED BLOCKED SO HE DOESNT COUNT
4784 ];SWPWSP
4785         JUMPE U,SEARC4  ;DON'T FIGURE SYSTEM JOB.
4786         MOVSI T,%SWDSO
4787         ANDCAM T,USWST(U)       ;RUNNABLE SO NOT DESIRED OUT
4788         MOVE T,NMPGS(U)
4789         ADDM T,TRUMM    ;TOTAL RUNNABLE USER MEM
4790         MOVE T,NSWPGS(U)
4791         ADDM T,AUSOPG   ;TOTAL PAGES OF RUNNABLE USERS SWAPPED OUT
4792 SEARC4: CAMN U,UREALT           ;IF THIS IS REAL TIME USER IN HIGH PRIORITY
4793          JRST [ MOVEI A,0       ; PHASE, SCHEDULE WITH INFINITE PRIORITY
4794                 JRST SEARP2 ]
4795         SKIPLE T,URTIME(U)      ;NON SKIP IF POSSIBLE REAL TIME BLOCK
4796          TLNN T,1       ;SKIP IF REAL TIME BLOCK UNLESS PI IN PROGRESS
4797           JRST SEARC6
4798         SKIPGE PICLR(U) ;SKIP IF PI IN PROGRESS
4799          JRST SEARL     ;REAL TIME BLOCKED
4800 SEARC6: MOVE A,@UTMPTR(U)       ;GET AMOUNT OF MACHINE TIME USED RECENTLY BY TREE PROCEDURE IS IN
4801         LSH A,3         ;COMBINE WITH TIME FOR JUST THIS PROCEDURE
4802         ADD A,JTMU(U)   ;TO GET PRIORITY FIGURE (SMALLER NUMBER IS HIGHER PRI)
4803         LSH A,(Q)       ;ADJUST PRIORITY BY MULTIPLICATIVE FACTOR IN Q
4804 ;THE EFFECT OF THIS PRIORITY COMPUTATION IS THAT JOBS IN THE SAME TREE
4805 ;ARE COMPARED BY JTMU, WHILE JOBS IN DIFFERENT TREES ARE COMPARED MAINLY
4806 ;BY USRRCE, ALTHOUGH A MUCH SMALLER JTMU CAN OVERRIDE A SOMEWHAT LARGER
4807 ;USRRCE.  THIS IS SOMEWHAT DIFFERENT THAN THE COMPUTATION THAT WAS HERE
4808 ;BEFORE MAY 1980, BUT THAT COMPUTATION'S RESULTS EVEN DEPENDED ON THE
4809 ;ORDER THAT JOBS HAPPENED TO BE INSPECTED, AND ALLOWED A TREE WITH
4810 ;A LARGE NUMBER OF RUNNING JOBS TO GET AN UNFAIR SHARE OF THE MACHINE.
4811 SEARP2:
4812 IFN SCHBLN, PUSHJ P,SCHSJB      ;INSERT JOB INTO PRIORITY-SORTED LIST
4813 .ELSE [ JUMPL I,SEARP5
4814         CAML A,U0P      ;SKIP IF IS BETTER THAN BEST SO FAR
4815          JRST SEARL
4816 SEARP5: MOVEM U,I       ;I GETS NEW BEST USER SO FAR
4817         MOVEM A,U0P     ;U0P GETS PRIORITY OF THAT USER
4818 ];SCHBLN
4819         JRST SEARL      ;TRY NEXT
4820
4821 IFE SWPWSP,[
4822 SEARC7: MOVE T,NMPGS(U) ;RUNNABLE AND SWAPPED BLOCKED
4823         SUB T,NSWPGS(U)
4824         SOSL T
4825          ADDM T,ASBUM
4826         JRST SEARC4
4827 ];SWPWSP
4828
4829 ;JOB IS NOT RUNNABLE
4830 SEARLB: JUMPE U,SEARL   ;DON'T FIGURE SYSTEM JOB
4831         MOVE T,USWST(U)
4832 IFE SWPWSP,     SKIPL USWSCD(U) ;IF LOCKED OUT, DONT COUNT
4833 IFN SWPWSP,     TLNN T,%SWSB
4834          TLNN T,%SWPGW
4835           JRST SEARB1   ;NOT WAITING FOR PAGE
4836         MOVE T,NMPGS(U) ;USER IS WAITING FOR PAGE SO COUNT FOR ACTIVE
4837         ADDM T,TRUMM
4838         MOVE T,NSWPGS(U)
4839         ADDM T,AUSOPG
4840         JRST SEARL
4841
4842 SEARB1: TLNE T,%SWBEM
4843          JRST SEARL     ;HAVE MADE BEST SWAPOUT EFFORT
4844         MOVE T,NMPGS(U)
4845         SUB T,NSWPGS(U)
4846         SOSL T
4847          ADDM T,BUMPGS  ;REAL MEM PGS BELONGING TO BLOCKED USERS
4848         JRST SEARL
4849
4850 SEARS1: SKIPN UNAME(U)
4851          JRST SEARL
4852         MOVE T,USWST(U) ;GUY STOPPED, DOES HE HAVE PAGES IN REAL MEM?
4853         TLNE T,%SWBEM
4854          JRST SEARL     ;HAVE TRIED BEST EFFORT TO SWAP OUT
4855         MOVE T,NMPGS(U)
4856         SUB T,NSWPGS(U)
4857         ADDM T,BUMPGS
4858         JRST SEARL
4859
4860 IFN SCHBLN,[
4861 ;TEST ALL THINGS THAT MAKE A PERSON UNRUNNABLE, OR AT LEAST
4862 ;REQUIRE THE ATTENTION OF THE SCHEDULER
4863 ;SKIP-RETURN IF JOB IS RUNNABLE, BASHES T, A
4864 SCHACK: CAMGE U,USRHI           ;NON-EXISTENT
4865          SKIPE USTP(U)          ;STOPPED
4866           POPJ P,
4867         SKIPE T,PIRQC(U)
4868          JRST [ TDNE T,[BADBTS]
4869                  JRST SCHACI    ;NON-DEFERRABLE
4870                 SKIPN PICLR(U)
4871                  JRST .+3       ;ALL INTERRUPTS DEFERRED
4872                 ANDCM T,IDF1(U)
4873                 TDNE T,MSKST(U)
4874                  JRST SCHACI
4875                 JRST .+1 ]
4876         SKIPE T,IFPIR(U)
4877          JRST [ SKIPN PICLR(U)
4878                  JRST .+1       ;ALL INTERRUPTS DEFERRED
4879                 ANDCM T,IDF2(U)
4880                 TDNE T,MSKST2(U)
4881                  JRST SCHACI
4882                 JRST .+1 ]
4883         SKIPE FLSINS(U)         ;FLUSH INSTRUCTION NOT SATISFIED
4884          JRST [ MOVE T,EPDL2(U)
4885                 XCT FLSINS(U)   ;IT MAY BE SATISFIED BUT NOT CLEARED YET
4886                  POPJ P,        ;STILL BLOCKED
4887                 JRST .+1        ;CAN SKIP VARIOUS RANDOM NUMBERS OF TIMES
4888                 JRST .+1
4889                 JRST .+1 ]
4890 SCHAC1: SKIPLE T,URTIME(U)      ;REAL-TIME BLOCKED
4891          TLNN T,1
4892           SKIPA
4893            SKIPLE PICLR(U)
4894             AOS (P)
4895         POPJ P,
4896
4897 SCHACI: MOVE T,UPC(U)           ;TRYING TO INTERRUPT, NEEDS SCHEDULER
4898         TLNN T,%PCUSR           ;ATTENTION UNLESS RUNNING IN EXEC MODE
4899          SKIPE FLSINS(U)        ;IN WHICH CASE NEED TO LET IT FINISH
4900           POPJ P,               ;SO IT CAN BE PCLSRED
4901         JRST SCHAC1
4902
4903 ;PUT JOB IN U, PRIORITY IN A, INTO STACK IN PRIORITY ORDER.  BASH T,TT,B.
4904 SCHSJB: SKIPG T,SCHBNJ  ;FIRST SEARCH FOR SLOT IN WHICH TO INSERT
4905          JRST SCHSJ1    ;BUFFER NOW EMPTY, SKIP SEARCH
4906         MOVE TT,T
4907         CAML A,SCHBPR-1(T)
4908          SOJG T,.-1     ;LOOP TERMINATES WITH T SLOT WHERE IT BELONGS
4909         CAIL TT,SCHBLN
4910          SOJA T,SCHSJ3  ;BUFFER FULL, WORK DIFFERENTLY
4911 SCHSJ0: MOVE B,SCHBTB-1(TT)     ;MOVE STUFF UP TO ADD ANOTHER ENTRY
4912         MOVEM B,SCHBTB(TT)
4913         MOVE B,SCHBPR-1(TT)
4914         MOVEM B,SCHBPR(TT)
4915         CAILE TT,1(T)
4916          SOJA TT,SCHSJ0
4917 SCHSJ1: AOS SCHBNJ
4918 SCHSJ5: MOVEM U,SCHBTB(T)
4919         MOVEM A,SCHBPR(T)
4920         POPJ P,
4921
4922 SCHSJ3: AOS NSCHOV      ;BUFFER NOT BIG ENOUGH FOR ALL RUNNABLE JOBS
4923         JUMPL T,CPOPJ   ;THIS JOB IS LOWEST PRIORITY, FORGET IT
4924         JUMPE T,SCHSJ5  ;THIS JOB IS SECOND-LOWEST PRIORITY, FORGET LOWEST
4925         MOVE TT,[SCHBTB+1,,SCHBTB]
4926         BLT TT,SCHBTB-1(T)      ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4927         MOVE TT,[SCHBPR+1,,SCHBPR]
4928         BLT TT,SCHBPR-1(T)
4929         JRST SCHSJ5
4930
4931 ;PUSH JOB IN I ONTO STACK OF RUNNABLE JOBS
4932 SCHSB:  AOS T,SCHBNJ
4933         CAILE T,SCHBLN
4934          JRST [ SOS SCHBNJ      ;BUFFER OVERFLOW
4935                 AOS NSCHOV      ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4936                 MOVE T,[SCHBTB+1,,SCHBTB]
4937                 BLT T,SCHBTB+SCHBLN-2
4938                 MOVEM I,SCHBTB+SCHBLN-1
4939                 POPJ P, ]
4940         MOVEM I,SCHBTB-1(T)
4941         POPJ P,
4942
4943 ;POP STACK OF RUNNABLE JOBS INTO U (RETURNS -1 IF STACK EMPTY)
4944 SCHGB:  SOSL U,SCHBNJ
4945          SKIPA U,SCHBTB(U)
4946           SETZM SCHBNJ  ;BUFFER EMPTY, U HAS -1
4947         POPJ P,
4948 ];SCHBLN
4949 \f
4950 .ALSKF==0
4951 DEFINE ALTSKP A
4952 IFE .ALSKF,[
4953         DEFINE .ALSKS
4954 A TERMIN
4955 ]
4956 IFN .ALSKF,[
4957         CAME U,.ALSKS
4958          CAMN U,A
4959           POPJ P,
4960 ]
4961 .ALSKF==.ALSKF#1
4962 TERMIN
4963
4964 ;DETERMINES USER PRIVILEGE LEVEL FOR SCHEDULING AND SWAPPING
4965 UPRIVL: SKIPN RPCL(U)   ;BEING RPCLSR'ED?
4966          CAMN U,UMASTER ;MASTER?
4967           POPJ P,       ;HIGHLY PRIVILEGED
4968         AOS (P)         ;SKIP AT LEAST ONCE
4969 IFN 340P\E.SP,  ALTSKP DISUSR
4970 IFN VIDP,       ALTSKP NVDUSR
4971 IFN TABP,       ALTSKP TABUSR
4972 IFN ARMP,       ALTSKP ARMUSR
4973 IFN LPTP,       ALTSKP LPTUSR
4974 IFG LPTP-1,     ALTSKP OLPUSR
4975 IFN PLTP,       ALTSKP PLTUSR
4976 IFN .ALSKF,[
4977         CAMN U,.ALSKS
4978          POPJ P,        ;DON'T FIGURE DISOWNED IF USING ABOVE DEVICES
4979 ]
4980         MOVE T,UPC(U)
4981         TLNE T,%PCUSR
4982          AOS (P)        ;SKIP TWICE
4983         POPJ P,
4984 \f
4985 OVHMTR SC3      ;SCHEDULER 3 - EXIT
4986
4987 ;SEARCH END (EXIT)
4988 SEAREN:
4989 IFE SWPWSP,[
4990         SKIPE NUSWB
4991          PUSHJ P,SSWC1  ;SEE IF ENUF CORE TO UNBLOCK A SWAPPED BLOCKED LOSER
4992 ];SWPWSP
4993 IFE SCHBLN,[
4994         SKIPGE U,I      ;SKIP IF NON-NULL JOB BEST
4995          JRST SCHED1
4996         AOS NSCHDU
4997 ];SCHBLN
4998 IFN SCHBLN,[
4999         MOVE T,SCHBNJ
5000         ADDM T,NSCHDU
5001         PUSHJ P,SCHGB   ;GET HIGHEST-PRIORITY JOB
5002         JUMPL U,SCHED1  ;NONE, RUN NULL JOB
5003 ];SCHBLN
5004 SCHED6: SKIPE FLSINS(U)
5005          JRST SCHED5
5006 SCHED1: EXCH U,USER
5007         JUMPL U,SCHDN   ;JUMP IF SWITCHING FROM NULL JOB
5008         CAMN U,USER     ;SKIP UNLESS RUNNING SAME JOB AGAIN
5009          JRST SEAREP    ;JUMP ON SAME JOB
5010 IFN KL10P,[
5011         CAMN U,MTRJOB           ;IF LEAVING JOB BEING METERED, STOP METER AND
5012          WRPAE PAEOFF
5013         CAMN U,MTRJOB
5014          CONO MTR,4001          ;TIME-BASE OFF, INTERVAL PIA=1
5015 ]
5016 ;SWAP OUT THE OLD JOB'S CONSOLE REGISTER, AND CLEAR ITS BLINKER.
5017 IFN N11TYS,[
5018         SKIPGE TT11P
5019          SKIPE TEN11F
5020           JRST SSTVR1           ;DONT HACK 11
5021         SKIPL TVCREG(U)         ;DO WE WANT TO SAVE TV CONSOLE REG FOR THIS GUY?
5022          SKIPN T,400000+TTR10*2000 ;0 IS NOT A (VERY) LEGITIMATE CONSOLE REG FCN
5023           JRST SSTVR2           ;SO ASSUME 11 STOPPED, DONT CLOBBER PREV THING
5024         MOVEM T,TVCREG(U)
5025 SSTVR2: SKIPGE T,TVVBN(U)       ;DID WE SET RUNNING BLINKER FOR THIS GUY?
5026          JRST SSTVR1            ;NO
5027         MOVEM T,400000+TTR10*2000       ;SET TO VIDEO BUFFER WE SET IT IN
5028         MOVE A,TVBLAD           ;ADDR IN VIDEO BUFFER WE FLASHED
5029         CLEARM 400000+TTR0*2000(A)      ;CLEAR IT
5030 SSTVR1:]
5031 IFN KA10P,[
5032         MOVE T,40
5033         MOVEM T,SV40(U) ;SAVE LAST UUO EXECUTED FOR THIS USER
5034         MOVE T,UPC(U)   ;IF USER HAS JUST TRAPPED TO 60,
5035         TLNE T,%PCUSR
5036          JRST SCHDN
5037         ANDI T,-1
5038         CAIL T,60H0
5039          CAILE T,60HE
5040           JRST SCHDN
5041         MOVNI T,60H0-UUOH0
5042         ADDM T,UPC(U)   ;THEN MOVE HIM INTO UUOH INSTEAD
5043         MOVE T,60       ;AND MOVE 60H'S VARIABLES INTO UUOH'S VARS
5044         MOVEM T,SV40(U) ;(THAT'S ALL 60H DOES ANYWAY).
5045         MOVE T,60H
5046         MOVEM T,SUUOH(U)
5047 ] ;KA10P
5048 ;DROPS THROUGH.
5049 \f;DROPS IN
5050 ;COME HERE TO SET UP A JOB THAT WASN'T ALREADY RUNNING.
5051
5052 SCHDN:  MOVE A,U
5053         SKIPGE U,USER
5054          JRST SCHDN2    ;JUMP IF SWITCHING TO NULL JOB
5055 IFN KA10P,[
5056         MOVE T,SV40(U)  ;LOAD NEW KRUFT
5057         MOVEM T,40
5058 ] ;KA10P
5059 IFN N11TYS,[
5060         SKIPGE TT11P    ;DONT HACK 11 IF ITS DOWN (MOSTLY IN CASE ITS BEING HACKED
5061                         ;HARDWARILY
5062          SKIPE TEN11F
5063           JRST SLTVR1   ;DONT HACK 11
5064         SKIPGE T,TVVBN(U)       ;BLINK RUNNING FROB?
5065          JRST SLTVR2
5066         MOVEM T,400000+TTR10*2000
5067         MOVE A,TVBLAD
5068         MOVNI T,20
5069         MOVEM T,400000+TTR0*2000(A)
5070         SKIPA T,TVVBN(U)
5071 SLTVR2:  MOVSI T,12_<8+4+16.-18.>       ;ALU NOP
5072         SKIPL TVCREG(U)
5073          MOVE T,TVCREG(U)
5074         MOVEM T,400000+TTR10*2000
5075 SLTVR1:]        
5076 IFN KL10P,[
5077         CAMN U,MTRJOB   ;IF THIS JOB'S BEING METERED, TURN ON METER AND TIME BASE.
5078          WRPAE PAEON
5079         CAMN U,MTRJOB
5080          CONO MTR,2001  ;TIME-BASE ON, INTERVAL PIA=1
5081 ];KL10P
5082         SOS NRESKED     ;COMPENSATE FOR EXTRA AOS ON NEXT PAGE
5083
5084 ;DROPS THROUGH
5085 \f;DROPS IN
5086 ;COME HERE TO START UP A JOB EVEN IF IT WAS ALREADY RUNNING BEFORE THIS SCHEDULE.
5087
5088 SEAREP: AOS NRESKED
5089 IFN KA10P,[
5090         HRLOI T,1
5091         ANDCAM T,UPQUAN(U)      ;RESET QUANTUM TIMER
5092 ] ;KA10P
5093 IFN KL10P,[
5094         RPERFC STPERF           ;SAVE PERF METERS FOR LATER USE
5095         DMOVE A,EBOXCT(U)       ;COMPUTING RUN TIME EFFECTIVELY RESETS
5096         DMOVEM A,STEBOX         ;QUANTUM TIMER 
5097         DMOVE A,MBOXCT(U)
5098         DMOVEM A,STMBOX
5099 ] ;KL10P
5100 IFN KS10P, SETZM UPQUAN(U)      ;RESET QUANTUM TIMER
5101         PUSHJ P,PGLDU
5102         MOVN A,U
5103         IDIVI A,LUBLK
5104         SKIPE B
5105          BUG
5106 IFE KS10P,[     ; KS has no lights.
5107         MOVSI B,400000
5108         LSH B,(A)
5109         SKIPN MIPGDS
5110          DATAO LIGHTS,B ;LIGHTS HAVE ONE BIT, SHOWING WHICH JOB IS RUNNING.
5111 ] ;IFE KS10P
5112         MOVN B,A        ;GET JOB'S NUMBER IN B
5113         MOVE T,UPC(U)   ;USER'S PC WORD
5114         MOVEM T,CLKBRK
5115         AOS A,SCHHP     ;SET UP SCHEDULER HISTORY TBL
5116         CAIL A,SCHHB+SSCHDB
5117          MOVEI A,SCHHB
5118         MOVEM A,SCHHP
5119         HRRM T,(A)      ;STORE PC
5120         TLNN T,%PCUSR
5121          TRO B,400000
5122         HRLM B,(A)      ;STORE USER INDEX AND USER BIT
5123         MOVSI T,UUO(U)
5124         HRRI T,UEXIT
5125         BLT T,UEXND-1   ;BLT IN UEXIT BLOCK
5126 IFN KL10P,[
5127         MOVE T,ULSPBR(U)
5128         AC7CTX
5129         XCTR XW,[HRRZM T,13]    ;GCSTBR
5130         XCTR XW,[HLRZM T,14]    ;STBR
5131 ] ;KL10P                ;CONTEXT WILL BE RESTORED AT CLKB5 BELOW
5132 IFN KA10P, CONO @APRC(U)
5133
5134 ;
5135 ; THIS IS THE ONE PLACE WHERE CLOCK LEVEL RETURNS TO THE USER JOB
5136 ;
5137 CLKB5:
5138 IFE KA10P, DATAO PAG,@CLCXSV    ;RESTORE CONTEXT
5139         MOVE U,USER
5140         MOVSI U,AC0S(U)         ;RESTORE AC BLOCK 0
5141         BLT U,U
5142         JRST 12,@CLKBRK         ;RESTORE PC, FLAGS, AND PI
5143 \f
5144 ;HERE WHEN STARTING A USER WHO HAD BEEN FLSING
5145
5146 SCHED5: MOVE T,USWST(U)
5147 IFN SWPWSP,[
5148         TLNN T,%SWPGW   ;PAGE WAITS DON'T COUNT AS BLOCKING
5149          TLNN T,%SWOUT  ;IF SWAPPED-OUT, UNBLOCKING BUMPS SWAP-IN PRIORITY
5150           JRST SCHD5A
5151         MOVE TT,USWPRI(U)       ; (A SOMEWHAT QUESTIONABLE FEATURE)
5152         LSH TT,-1
5153         MOVEM TT,USWPRI(U)
5154 SCHD5A:
5155 ];SWPWSP
5156         TLNE T,%SWPCL
5157          JRST SCHED7            ;JUMP IF PAGES SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5158         TLNE T,%SWPGW
5159          SOS NPGWTU             ;NOT WAITING FOR A PAGE ANY MORE
5160         MOVSI T,%SWPGW+%SWRUN+%SWINT    ;NOT WAITING FOR PAGE,NOT UNBLOCKED SWAPOUT,
5161         ANDCAM T,USWST(U)       ;NOT WAITING FOR INTERRUPT PAGE
5162         SETZM FLSINS(U)         ;NOT WAITING FOR ANYTHING
5163         JRST SCHED1
5164
5165 SCHED7: PUSHJ P,PCLSR           ;PAGES WERE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5166          BUG                    ;SO PCLSR JOB SINCE IT MIGHT BE COUNTING ON THOSE PAGES
5167         JRST SCHED1             ;PCLSR MUST SUCCEED.  JOB WAS BLOCKED WITH EMPTY LSWPR.
5168
5169
5170 ;COME HERE TO RUN THE NULL JOB.
5171
5172 SCHDN2: SKIPL A         ;WERE RUNNING IT ALREADY?
5173          AOS NNULBK     ;NO, INCREMENT # CONSECUTIVE BLOCKS OF NULLTIME.
5174         MOVSI T,(JFCL)
5175         MOVEM T,CLUSAV  ;AVOID LOSSAGE AT CLKBRK+1 NEXT CLOCK INT
5176 IFE KA10P, MOVEM T,CLCXSV
5177 IFE KS10P,[     ; KS has no lights.
5178         SKIPN MIPGDS
5179          DATAO LIGHTS,[0] ;LOAD LIGHTS WITH JOB RUNNING (NONE)
5180 ] ;IFE KS10P
5181 IFN KA10P,[
5182         HRLOI T,1
5183         ANDCAM T,UPQUAN
5184 ] ;KA10P
5185 IFN KL10P,[
5186         CAMN U,MTRJOB
5187          WRPAE PAEON
5188         CAMN U,MTRJOB
5189          CONO MTR,2001  ;TIME-BASE ON, INTERVAL PIA=1
5190         REBOXC NULEBC
5191         RMBOXC NULMBC
5192         RPERFC NULPRF
5193 ] ;KL10P
5194 IFN KS10P, SETZM UPQUAN
5195         CLEARM SCHFLG   ;RESCHEDULE ON NEXT CLK INT
5196         LPMR UPGML
5197         JRST 12,@[%PSPCU,,NULJOB]       ;DISMISS INT AND GO TO NULL JOB
5198
5199 NULJOB: MOVSI (JRST 4,)
5200         MOVEI 17,1              ;SET ACS 0 TO 16 TO JRST 4,0
5201         BLT 17,16               ;TO CATCH SPURIOUS TRANFERS TO ACS
5202         MOVE 17,[AOJA 17]       ;RUNS IN ACS TO FREE MEMORY FOR OTHER PROCESSORS
5203         JRST 2,@[%PCUSR,,17]    ;RUNS IN USER MODE FOR SAKE OF RANDOMNESS
5204 \f
5205 IFE SWPWSP,[
5206 OVHMTR SC4      ;SCHEDULER 4 - UNSWAPBLOCKER
5207
5208 ;SEE IF THERE IS ENOUGH CORE TO UNBLOCK A SWAP-BLOCKED JOB.
5209 SSWC1:  SKIPGE U,BUSR
5210          POPJ P,
5211         MOVN T,NSWPGS(U)
5212         ADD T,MEMFR
5213         SUB T,NCBCOM
5214         ADD T,SOLNG
5215         SUB T,SILNG
5216         SUB T,AUSOPG
5217         ADD T,ASBUM
5218         ADD T,BUMPGS
5219         CAIGE T,20
5220          POPJ P,                ;THERE ISN'T ENOUGH ROOM.
5221         MOVSI T,400000
5222         ANDCAM T,USWSCD(U)      ;CLEAR SWAP BLOCKED
5223         SETOM BUSR
5224         MOVE T,[-1_-1]
5225         MOVEM D,BUSIZ   ;SIZE OF SMALLEST SWAP-BLOCKED USER.
5226         AOS NTSBUU
5227         SOSN NUSWB
5228          JRST SSWSC3
5229         MOVEI U,0
5230         MOVNI R,1
5231         MOVSI T,200000
5232 SSWSC4: CAML U,USRHI
5233          JRST SSWSC6
5234         SKIPGE USWSCD(U)
5235          SKIPN UNAME(U)
5236           JRST SSWSC5
5237         CAMGE T,NMPGS(U)
5238          JRST SSWSC5
5239         MOVE R,U
5240         MOVE T,NMPGS(U)
5241 SSWSC5: ADDI U,LUBLK
5242         JRST SSWSC4
5243
5244 SSWSC6: MOVEM R,BUSR    ;STORE NEW SMALLEST SWAPPED BLOCKED LOSER
5245         SKIPGE R
5246          MOVEI T,0
5247         MOVEM T,BUSIZ
5248 SSWSC3: JUMPL I,SEARL0  ;MAYBE CAN RUN THIS GUY NOW
5249         POPJ P,
5250 ];SWPWSP
5251 \f
5252 OVHMTR SWU      ;SWAP USER
5253
5254 ;SWAP OUT N PAGES (N IS IN SWPOPR)
5255 SWPON:  MOVE C,SOLNG
5256         SKIPGE CIRPSW           ;CAN'T DO ANYTHING WITHOUT CIRPSW
5257          CAILE C,2*NQS
5258           POPJ P,               ;ALREADY STUFF ON WAY OUT
5259         SKIPL U,PSWOUS          ;SEE IF CONTINUING TO SWAP OUT A USER
5260          CAML U,USRHI
5261           JRST SWPON1
5262         MOVE C,PSWCLS
5263         SKIPE LSWPR(U)          ;PREFER NOT TO SWAP OUT
5264          JRST SWPON1            ;USER WHO HAS SWITCHES LOCKED
5265         SKIPE UNAME(U)          ;SKIP ON USER KILLED
5266          SKIPL USWST(U) .SEE %SWDSO     ;OR NOT DESIRED OUT ANY MORE
5267 SWPON1:   PUSHJ P,SWPON2        ;FIND NEW USER TO FLUSH
5268         JUMPL U,SWUP8
5269 SWPON6: MOVSI A,%SWDSO          ;THIS USER NOW DESIRED OUT
5270         IORM A,USWST(U)
5271         MOVEM C,PSWCLS
5272         MOVEM U,PSWOUS
5273         MOVE T,UPC(U)
5274         TLNE T,%PCUSR
5275          JRST SWPU1             ;OK TO SWAP USER
5276         SKIPN LSWPR(U)          ;PCLSR IF HAS LOCKS, OR AT JBFLS,
5277          SKIPN FLSINS(U)        ;OR IF NOT BLOCKED
5278           JRST SWPON8
5279         MOVSI T,%SWPCL          ;OTHERWISE, DON'T PCLSR NOW, BUT
5280         IORM T,USWST(U)         ;WHEN IT UNBLOCKS
5281         JRST SWPU1              ;AND START SWAPPING OUT ITS PAGES
5282
5283 SWPON8: PUSHJ P,PCLSR           ;GET OUT OF SYS BEFORE SWAPPING OUT
5284          POPJ P,
5285         JRST SWPU1
5286
5287 ;FOUND NO USER TO SWAP OUT
5288 SWUP8:  SKIPE NLOOSP
5289          JRST SWOL1     ;SWAP OUT SOME LOOSE PAGES
5290         AOSE SBEFLG     ;HAVE WE COME HERE TWICE?
5291          JRST SWUP6     ;YES, GIVE UP
5292         MOVSI B,%SWBEM  ;NO, TURN OFF EVERYONE'S BEST EFFORT BIT
5293         MOVEI J,2*LUBLK ;AND LOOK AT EVERYONE AGAIN SINCE WE'RE DESPERATE
5294 SWUP9:  CAML J,USRHI    ;TO FIND A PAGE TO SWAP OUT
5295          JRST SWUP7
5296         ANDCAM B,USWST(J)
5297         ADDI J,LUBLK
5298         JRST SWUP9
5299
5300 SWUP7:  PUSHJ P,SWPON2          ;HAVING TURNED OFF %SWBEM, FIND A USER TO SWAP OUT
5301         JUMPG U,SWPON6          ;GO SOMEONE, GO DO
5302 SWUP6:  SETZM SWPOPR            ;CAN'T FIND ANYONE TO SWAP OUT, GIVE UP
5303         SETOM PSWOUS
5304         POPJ P,
5305
5306 SWOL1:  SKIPN A,FLOOSP          ;SWAP OUT SOME LOOSE PAGES
5307          BUG                    ;NLOOSP WAS TOO HIGH?
5308         MOVNI C,1
5309         PUSHJ P,SWPOPG
5310          BUG                    ;CIRPSW, EXEC PAGE COUNT ALREADY CHECKED
5311         SETOM SBEFLG            ;WE FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5312         MOVE C,SOLNG
5313         SOSLE SWPOPR            ;ENOUGH
5314          CAIL C,20.             ;ENOUGH FOR NOW
5315           POPJ P,
5316         SKIPE NLOOSP            ;SWAP OUT MORE PAGES
5317          JRST SWOL1
5318         JRST SWPON
5319 \f;START SWAPPING OUT THIS USER'S PAGES
5320 SWPU1:  AOS NSOUSR
5321         MOVSI A,%SWRUN
5322         CAILE C,1               ;CLASS
5323          IORM A,USWST(U)        ;INDICATE USER WAS RUNNABLE AT TIME OF SWAP OUT
5324 IFE SWPWSP,[
5325         SETZM SWUPC
5326         SKIPN ENUPC
5327          JRST SWPU1B
5328         MOVE T,UPC(U)           ;CALCULATE WHAT PAGE HIS PC IS ON
5329         LDB C,[121000,,UPC(U)]
5330         ROT C,-1
5331         ADDI C,UPGMP(U)
5332         MOVE A,[222200,,(C)]
5333         SKIPGE C
5334          IBP A
5335         LDB A,A
5336         TRNN A,600000
5337          SETZM A
5338         ANDI A,PMRCM            ;MASK TO REAL CORE ADR BITS
5339         SKIPN USTP(U)           ;ONLY IF RUNNING
5340          TLNN T,%PCUSR          ;AND IN USR MODE
5341           CAIA
5342            MOVEM A,SWUPC        ;THEN DON'T ALLOW UPC PAGE TO BE SWAPPED OUT
5343 SWPU1B:
5344 ];SWPWSP
5345         MOVE B,PSWLC
5346         AOSE PSWSFL
5347          JRST SWPU3A            ;PICK UP FROM WHERE LEFT OFF
5348 IFE SWPWSP,[
5349         SKIPE ENPZRO
5350          SETOM SWPP0F
5351 ];SWPWSP
5352         MOVEI C,UPGMP(U)        ;ADDRESS OF PAGE MAP (START FROM PG 0)
5353         MOVEI J,UPGCP(U)
5354         HRLI C,442200           ;CNVRT TO BYTE PNTR TO MAP
5355         HRLI J,442200
5356         MOVEM C,SWPMBP
5357         MOVEM J,SWPCBP
5358         LDB B,[121100,,HUSRAD(U)]       ;DO ALL PAGES THAT MIGHT EXIST
5359 SWPU2:  ILDB D,SWPCBP           ;CIRC PNTR ENTRY
5360         ILDB A,SWPMBP           ;PAGE MAP ENTRY
5361         AOS NSOPGS
5362         JUMPE D,SWPU3A          ;DOESN'T HAVE PAGE
5363 IFE SWPWSP,[
5364         AOSN SWPP0F
5365          SKIPE USTP(U)          ;DON'T SWAP OUT PAGE 0 IF NOT STOPPED
5366           CAIN D,-1             ;PAGE IS ABSOLUTE
5367            JRST SWPU3A
5368         TRNN A,600000           ;NO ACCESS
5369          JRST SWPU3A
5370         SKIPN ENAGE
5371          JRST SWPU2A
5372         TRON A,PMAGEM           ;HAS PAGE BEEN REFERENCED? (AGE MASK)
5373          JRST [ DPB A,SWPMBP
5374                 AOS NAGEAB
5375                 JRST SWPU3A ]
5376 SWPU2A: ANDI A,PMRCM            ;MASK TO REAL CORE PAGE #
5377         CAMN A,SWUPC            ;DON'T SWAP OUT PAGE WHERE PC IS IF RUNNING
5378          JRST SWPU3A
5379 ];SWPWSP
5380 IFN SWPWSP,[                    ;I DOUBT THAT MOST OF THAT NONSENSE DOES ANYTHING
5381         TRNE A,600000           ;NO ACCESS
5382          CAIN D,-1              ;OR PAGE IS ABSOLUTE
5383           JRST SWPU3A           ;MEANS DON'T SWAP OUT
5384         ANDI A,PMRCM            ;MASK TO REAL CORE PAGE #
5385 ];SWPWSP
5386         HRRZ D,MMSWP(A)         ;NUMBER OF USERS WHO HAVE THIS PAGE MAPPED
5387         SOJN D,SWPU4            ;PAGE IS SHARED
5388 SWPU6:  MOVEM B,PSWLC           ;SAVE HOW FAR SWAP-OUT SCAN GOT
5389         MOVE C,PSWOUS
5390         PUSHJ P,SWPOPG          ;SWAP OUT THIS PAGE
5391          JRST SWPU3
5392         SETOM SBEFLG            ;FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5393         MOVE C,SOLNG
5394         SOSLE SWPOPR            ;ENOUGH
5395          CAIL C,20.             ;ENOUGH FOR NOW
5396           POPJ P,
5397 SWPU3:  MOVE B,PSWLC
5398         MOVE U,PSWOUS
5399 SWPU3A: SOJG B,SWPU2
5400         SETOM PSWOUS
5401         MOVSI B,%SWBEM
5402         IORM B,USWST(U)         ;SET BEST EFFORT BIT
5403 IFN SWPWSP,[
5404         SKIPL APRC(U)           ;IF DISOWNED,
5405          JRST SWPON
5406         MOVE B,USWPRI(U)        ;DECREASE PRIORITY TO COME BACK IN
5407         LSH B,2
5408         MOVEM B,USWPRI(U)
5409 ];SWPWSP
5410         JRST SWPON
5411 \f;TRYING TO SWAP OUT A SHARED PAGE
5412 SWPU4:  MOVEM B,PSWLC           ;SAVE HOW FAR SWAP-OUT SCAN GOT
5413         AOSE CIRPSW
5414          BUG            ;CIRPSW LOCKED IN SWAP OUT CODE
5415         MOVE C,[2200,,MEMPNT(A)]
5416         MOVEM A,SWOBK
5417         PUSHJ P,UCPRL
5418             400000,,SWPU5       ;CONSULT THE OTHER USERS OF THE PAGE
5419         SETOM CIRPSW
5420         MOVE A,SWOBK
5421         JRST SWPU6      ;OK TO SWAP IT OUT
5422
5423 SWPU5:  SKIPGE TT,USWST(U) .SEE %SWDSO
5424          POPJ P,        ;USER DESIRED OUT, CAN'T HOLD PAGE IN
5425 IFN SWPWSP,     TLNN TT,%SWLOD  ;IF USER IS LOADING, HOLDS PAGE IN
5426          SKIPN AGERTE
5427           JRST SWPU5A
5428         MOVE TT,I
5429         LSH TT,-1
5430         ADDI TT,UPGMP(U)
5431         HRLI TT,2200
5432         TRNN I,1
5433          HRLI TT,222200
5434         LDB TT,TT
5435         TRNE TT,600000  ;SKIP IF NO ACCESS, IGNORE AGE
5436          TRNE TT,PMAGEM ;HAS SHE USED THIS PAGE?
5437           POPJ P,       ;NO, CAN'T HOLD PAGE IN
5438 SWPU5A: SUB P,[4,,4]
5439         SETOM CIRPSW    ;SHARED W/USER WHO IS WANTED IN CORE
5440         AOS NSHRAB      ;SO DON'T SWAP IT OUT
5441         JRST SWPU3
5442
5443 ;COME HERE WITH BEST USER TO SWAP OUT IN U, CLASS IN C
5444 SWPONX: JUMPL U,CPOPJ   ;NO SWAP OUTTABLE LOSER
5445 IFN SWPWSP,[
5446         CAILE C,1
5447          SKIPN NLOOSP
5448           JRST SWPNX2
5449         SETO U,         ;WOULD RATHER SWAP OUT LOOSE PAGES
5450         POPJ P,
5451
5452 SWPNX2: MOVSI T,%SWOUT  ;MAKE USER SWAPPED OUT
5453         TDNE T,USWST(U)
5454          JRST SWPNX3    ;ALREADY IS?
5455         IORM T,USWST(U)
5456         MOVE T,UWRKST(U)
5457         MOVEM T,USVWRK(U)
5458         MOVE T,TIME
5459         MOVEM T,USWTIM(U)       ;DROPS INTO SWPNX3
5460 ];SWPWSP
5461 IFE SWPWSP,[
5462         CAILE C,1
5463          SKIPN NLOOSP
5464           SKIPA B,USWST(U)
5465            JRST [ SETO U, ? POPJ P, ]   ;WOULD RATHER SWAP OUT LOOSE PAGES
5466         SKIPGE USWSCD(U)
5467          JRST SWPNX3    ;HE'S ALREADY SWAP BLOCKED
5468         TLNN B,%SWPGW   ;IS HE RUNNABLE?
5469          SKIPN FLSINS(U)
5470           SKIPE USTP(U)
5471            JRST SWPNX3
5472         MOVE B,NMPGS(U) ;HE'S RUNNABLE
5473         CAIGE B,TSYSM-SYSB-MEMSY1
5474          JRST SWPNX1    ;SMALL, NO THRASH
5475         SUB B,NSWPGS(U)
5476         ADD B,MEMFR
5477         SUB B,NCBCOM
5478         ADD B,SOLNG
5479         SUB B,SILNG
5480         SUB B,AUSOPG
5481         JUMPG B,SWPNX3  ;LET THIS GUY THRASH
5482 SWPNX1: SKIPN ENSWBK
5483          JRST SWPNX3
5484         MOVSI B,(SETZ)  ;SWAP BLOCK THIS LOSER
5485         IORM B,USWSCD(U)
5486         AOS NTUSB
5487         AOS NUSWB
5488         MOVE B,NMPGS(U) ;SMALLEST SWAP BLOCKED LOSER?
5489         CAML B,BUSIZ
5490          JRST SWPNX3
5491         MOVEM U,BUSR    ;YES
5492         MOVEM B,BUSIZ           ;DROP INTO SWPNX3
5493 ];SWPWSP
5494 ;HAVING DECIDED TO SWAP OUT JOB IN U, MAKE SWAP HISTORY TABLE ENTRY
5495 SWPNX3: MOVSI T,2_16.
5496 ;GENERAL SWAP HISTORY TABLE KEEPER.  ENTER WITH JOB IN U, EVENT IN T, BASHES TT,I,T
5497 SWPKHT: HRLZ TT,U
5498         IDIVI TT,LUBLK          ;TT 3.1-3.8 GETS JOB NUMBER, BASHES I
5499         IOR TT,T
5500         HRR TT,TIME
5501 IFN SWPWSP, HLRZ T,UWRKST(U)
5502 IFE SWPWSP,[
5503         MOVE T,NMPGS(U)
5504         SUB T,NSWPGS(U)
5505 ];SWPWSP
5506         SOSL T
5507          DPB T,[321000,,TT]
5508         MOVEM TT,@SWPHTP
5509         AOS T,SWPHTP
5510         MOVE TT,UTRNTM(U)
5511         MOVEM TT,SWPHTL-1(T)
5512         MOVEI TT,SWPHTB
5513         CAIL T,SWPHTB+SWPHTL
5514          MOVEM TT,SWPHTP
5515         POPJ P,
5516 \f
5517 OVHMTR SWF      ;SWAP FIND USER
5518
5519 ;FIND A USER TO SWAP OUT, RETURN IN U, -1 IF NONE
5520 SWPON2: SETOM PSWSFL    ;START FROM BEG OF USER
5521 IFE SWPWSP,[
5522         SKIPL U,PRVUSR
5523          PUSHJ P,CKPRUS ;MAKE SURE PRIV USER EXISTS AND HAS NOT BEEN BLOCKED FOR A LONG TIME
5524 ];SWPWSP
5525         MOVNI T,30.*60.
5526         ADD T,TIME      ;A MINUTE AGO
5527         MOVNI U,1
5528         MOVEI J,2*LUBLK
5529         MOVEI C,NSSCDC  ;# SWAP OUT CLASSES
5530 SWPON4: CAML J,USRHI    ;C HAS INDEX OF MAX CLASS INTERESTED IN
5531          JRST SWPONX    ;LOOKED AT ALL USERS, GO PONDER RESULTS
5532         SKIPE UNAME(J)  ;SEE IF FOR REAL
5533          SKIPN NMPGS(J) ;DON'T BOTHER IF HAS NO MEMORY
5534           JRST SWPON3
5535 IFN SWPWSP,[
5536         MOVE B,USWST(J)
5537         TLNE B,%SWBEM+%SWLOD    ;DON'T SWAP OUT IF BEST EFFORT ALREADY MADE, 
5538          JRST SWPON3    ; OR STILL LOADING IN
5539         MOVEI I,7
5540         MOVE TT,USWTIM(J)
5541         CAMLE TT,TIME   ;IF PROTECT TIME HASN'T ELAPSED YET, GETS HIGHER PRIORITY
5542          JRST SWPTK     ;TO PREVENT THRASHING
5543 ];SWPWSP
5544 IFE SWPWSP,[
5545         MOVE B,USWST(J)
5546         TLNE B,%SWBEM
5547          JRST SWPON3    ;BEST EFFORT ALREADY MADE
5548 ];SWPWSP
5549         SKIPE LSWPR(J)
5550          JRST SWPON7    ;PREFER NOT TO SWAP OUT LOSER WITH SWITCHES LOCKED
5551         MOVEI I,1
5552         TLNE B,%SWPGW
5553          JRST SWPON5    ;FLSINS IS WAITING FOR A PAGE (NOT REALLY BLOCKED)
5554         CAML T,LUBTM(J)
5555          SOJA I,SWPTK   ;BLOCKED FOR A LONG TIME (CLASS 0)
5556         SKIPN FLSINS(J)
5557 SWPON5:  SKIPE USTP(J)
5558           JRST SWPTK    ;CLASS 1 (BLOCKED)
5559 IFE SWPWSP,[
5560         TLNE B,%SWPRV
5561          JRST [ MOVEI I,7       ;CLASS 7 (PRIV USER)
5562                 JRST SWPTK ]
5563 ];SWPWSP
5564         JUMPL B,[AOJA I,SWPTK] .SEE %SWDSO      ;DESIRED OUT (CLASS 2)
5565         MOVEI I,4
5566         SKIPGE APRC(J)
5567          SOJA I,SWPTK   ;DISOWNED (CLASS 3)
5568 IFE SWPWSP,[
5569         SKIPGE USWSCD(J)
5570          JRST SWPTK     ;SWAP BLOCKED (CLASS 4)
5571 ];SWPWSP
5572         SKIPGE TTYTBL(J)
5573          AOJA I,SWPTK   ;DOESNT HAVE TTY (CLASS 5)
5574 SWPON7: MOVEI I,6       ;OTHERWISE....
5575
5576 SWPTK:  CAMGE C,I
5577          JRST SWPON3    ;THIS GUY IN MORE WINNING CLASS
5578 IFE SWPWSP,[
5579         MOVE A,NMPGS(J)
5580         SUB A,NSWPGS(J)
5581 ];SWPWSP
5582 .ELSE   MOVE A,UWRKST(J)
5583         CAME C,I
5584          JRST SWPTK2
5585         XCT SWPTT(C)    ;IN SAME CLASS, COMPARE CLASS-DEPENDENT PRIORITY MEASURES
5586          JRST SWPON3
5587 SWPTK2: MOVE E,@SWPTT(I)        ;MAKE THIS GUY BEST VICTIM
5588         MOVE C,I
5589         MOVE U,J
5590 SWPON3: ADDI J,LUBLK
5591         JRST SWPON4
5592 \f
5593 ;SKIP IF THIS GUY (J) IS BETTER LOSER TO FLUSH THAN PREV BEST (IN E)
5594 SWPTT:  CAMG E,LUBTM(J) ;BLOCKED FOR A LONG TIME (0) - LATER LUBTM WINS
5595         CAMG E,LUBTM(J) ;BLOCKED (1)                 - LATER LUBTM WINS
5596         CAML E,A        ;DESIRED OUT (2)             - SMALLER WORKING SET WINS
5597         CAML E,A        ;DISOWNED (3)                - SMALLER WORKING SET WINS
5598         CAML E,A        ;RUNNABLE, SWAP BLOCK SET (4) - SMALLER WORKING SET WINS
5599         CAML E,USWPRI(J)        ;RUNNABLE, W/O TTY (5) - GO BY PRIORITY
5600         CAML E,USWPRI(J)        ;OTHERWISE (6)       - GO BY PRIORITY
5601 IFE SWPWSP,     BUG             ;PRIVELEGED USER (7) - SHOULD ONLY BE ONE
5602 IFN SWPWSP,     CAMG E,USWTIM(J);PROTECTED (7)       - LATER UNPROTECT TIME WINS
5603 NSSCDC==.-SWPTT
5604
5605 IFE SWPWSP,[
5606 CKPRUS: MOVSI B,%SWPRV
5607         CAMGE U,USRHI
5608          ANDCAM B,USWST(U)      ;TURN OFF PRIV USER BIT
5609         MOVNI TT,30.*2
5610         ADD TT,TIME     ;TWO SECONDS AGO
5611         SKIPE UNAME(U)
5612          CAML TT,LUBTM(U)
5613           PUSHJ P,NPRVUSR
5614         SKIPG U,PRVUSR
5615          POPJ P,
5616         MOVSI B,%SWPRV
5617         IORM B,USWST(U)
5618         POPJ P,
5619 ];SWPWSP
5620 \f
5621 OVHMTR UUO      ;RANDOM UUOS
5622
5623 ;AC: A.9 =>1  SWAP OUT USER
5624 ;4.8 => 1 ALL PAGES
5625 ;4.7=1 => LOOP FOR A WHILE
5626 ;3.9-3.1 USER # SELF IF 0
5627 ;RH => USER VIRTUAL PG # 
5628 ;OR 4.9=0, 4.8=0, 4.7=0 SWAP OUT RH # OF PAGES
5629 ;IF 4.9=0, 4.8=1 AND 4.7=0, HACK PCLSR TEST FEATURE ON CURRENT USER
5630 ;RH =0 LEAVE PCLSR TEST MODE =1 ENTER IN ADVANCE MODE =-1 ENTER IN HOLD MODE
5631 ;   =2 ENTER IN ADVANCE BUT DON'T ^Z
5632
5633 ASWAP:  SKIPN SYSDBG
5634          JRST ILUUO
5635         UMOVE A,(J)
5636         TLNE A,100000
5637          JRST ASWAP3
5638         JUMPL A,ASWAP1
5639         TLNE A,200000
5640          JRST ASWPCL    ;PC LSR TEST MODE.
5641         HRRZM A,SWPOPR  ;CLOBBER CLOBBER
5642         POPJ P,
5643
5644 ASWAP1: HLRZ B,A
5645         ANDI B,777      .SEE MAXJ ;FIELD SHOULD BE BIG ENOUGH
5646         IMULI B,LUBLK
5647         SKIPE B
5648          MOVE U,B
5649         TLNN A,200000
5650          JRST ASWAP2
5651         MOVE D,NMPGS(U)
5652         SUB D,NSWPGS(U)
5653         JUMPL D,[JRST 4,.]
5654         JUMPE D,CPOPJ
5655         CONO PI,CLKOFF
5656         MOVEM U,PSWOUS
5657         SETOM PSWSFL
5658         ADDM D,SWPOPR
5659         MOVSI D,%SWDSO
5660         IORM D,USWST(U)
5661         CONO PI,CLKON
5662         POPJ P,
5663
5664 ASWAP2: PUSHJ P,CWAIT   ;RETURNS WITH CLKOFF AND CIRPSW AVAILABLE
5665             SKIPL CIRPSW
5666         HRRZS A         ;A HAS VIRTUAL PAGE #
5667         PUSHJ P,UPLC    ;RETURN POINTERS IN T AND Q
5668         LDB A,T         ;GET MAP ENTRY
5669         LDB C,Q         ;GET CIRC PNTR
5670         CAIE C,-1       ;DON'T SWAP OUT ABS PAGE
5671          TRNN A,600000
5672           POPJ P,       ;ALREADY OUT OR DOESN'T HAVE PAGE
5673         ANDI A,PMRCM    ;MASK TO REAL CORE PAGE #
5674         MOVNI C,1
5675         PUSHJ P,SWPOPG
5676          JFCL
5677         JRST CLKONJ
5678
5679 ASWAP3: MOVE B,[1250000.]
5680         SOJG B,.
5681         UMOVE A,2000
5682         JRST ASWAP3
5683
5684 ASWPCL: MOVEM U,PCLUSR
5685         CLEARM PCLL
5686         CLEARM PCLHSH
5687         SETOM PCLNXT
5688         HRRES A
5689         MOVEM A,PCLDBM
5690         POPJ P,
5691 \f
5692 ;.CALL PGWRIT
5693 ; ARG 1 - A <JOB>
5694 ; ARG 2 - PAGE NUMBER IN <JOB>'S ADDRESS SPACE
5695 ;IF ONLY ONE ARGUMENT IS GIVEN, IT IS ARG 2, AND ARG 1 DEFAULTS TO CURRENT USER
5696
5697 ;THE PAGE IS SWAPPED OUT.  THE CALL DOESN'T RETURN UNTIL THE SWAP IS COMPLETED.
5698 ; THIS ALLOWS USER TO BE SURE THAT THE COPY ON DISK IS UP TO DATE.
5699 ;CONTROL BIT 1.1 => RETURN IMMEDIATELY, NO WAITING.  TO WAIT LATER, JUST DO
5700 ; ANOTHER PGWRIT WITHOUT SETTING 1.1.
5701 ;CONTROL BIT 1.2 => UNLOCK PAGE.  IF YOU CALL THIS ON A LOCKED PAGE,
5702 ; WITHOUT SETTING BIT 1.2, THE PAGE WILL BE SWAPPED OUT, BUT THE NEXT
5703 ; TIME IT IS SWAPPED IN IT WILL BE LOCKED AGAIN.  THIS IS USEFUL FOR
5704 ; CONTROLLING EXACTLY WHEN A DATA BASE PAGE GETS WRITTEN TO DISK.
5705
5706 NPGWRT: CAIGE W,2
5707          JRST [ MOVE J,U ? JRST NPGWR1 ]
5708         MOVE J,A
5709         JSP T,NCORUI    ;DECODE THE JOB SPEC
5710          JRST NPGWR0
5711         JSP T,NCORWR    ;WHICH MUST BE WRITABLE
5712          JRST OPNL31
5713 NPGWR0:
5714 IFN PDP6P,[
5715         CAIN J,-1       
5716          JRST OPNL34    ;CAN'T HACK PDP6
5717 ];PDP6P
5718         MOVE A,B        ;NOTE: SWPOPG TAKES CARE OF THE PCLSR'ING
5719         PUSHJ P,NPGWR1  ;CALL MAIN ROUTINE
5720          POPJ P,        ;LOST, OPNL CLEARED LSWPR
5721         JRST LSWPJ1     ;WON, UNLOCK DIELOK
5722
5723 ;USER INDEX IN J, PAGE NUMBER IN A
5724 NPGWR1: TDNE A,[-1,,-400]
5725          JRST OPNL32    ;PAGE NUMBER NOT VALID
5726         PUSHJ P,CWAIT   ;DON'T ALLOW PAGE MAPS TO CHANGE, AND TURN CLK OFF
5727            SKIPL CIRPSW ;DON'T NEED UTCOFF BECAUSE UTC LEVEL CAN ONLY PUT PAGES INTO MAPS
5728         EXCH U,J
5729         PUSHJ P,UPLC
5730         EXCH U,J
5731         LDB D,Q         ;D GETS CIRC PNTR
5732         JUMPE D,OPNL32  ;NO PAGE THERE
5733         CAIN D,-1
5734          JRST OPNL12    ;ABSOLUTE PAGE
5735         PUSH P,U
5736         MOVE C,Q        ;STARTING FROM UPGCP, FIND MMP
5737         PUSHJ P,UCPRL
5738             200000,,.+2
5739          BUG            ;IF NONE FOUND
5740         SUB P,[4,,4]    ;FOUND MMP, C POINTS TO IT
5741         MOVSI T,MMPTMP  ;IF PAGE IS IN TRANSIT
5742         TDNE T,(C)
5743          JRST [ POP P,U
5744                 TDNE T,(C)      ;AWAIT COMPLETION
5745                  PUSHJ P,UFLS
5746                 JRST NPGWR1 ]   ;THEN TRY AGAIN
5747         MOVE E,C        ;SAVE ADDRESS OF MMP ENTRY
5748         PUSHJ P,UCPRL   ;SEE IF PAGE IS IN MEMORY
5749             100000,,NPGWR3
5750         POP P,U         ;NOT SWAPPED IN, BYPASS SWAP-OUT CODE
5751         JRST NPGWR2
5752
5753 NPGWR3: SUB P,[4,,4]    ;IT'S SWAPPED-IN TO CORE PAGE IN T
5754         POP P,U
5755         HLRZ D,MMSWP(T)
5756         JUMPN D,OPNL12  ;POINTED TO BY AN EXEC PAGE, E.G. 340, SHOULDN'T MESS.
5757         PUSH P,A        ;SAVE USER'S VIRTUAL PAGE #
5758         PUSH P,J        ;SAVE WHAT JOB THAT IS
5759         PUSH P,E        ;SAVE ADDRESS OF MMP ENTRY
5760         MOVE A,T        ;PHYSICAL PAGE # TO SWAP OUT
5761         MOVE C,USER     ;DON'T PCLSR ME
5762         PUSHJ P,SWPOPL  ;SWAP OUT, EVEN IF LOCKED
5763          JRST NPGWR4    ;NO DISK SPACE, OR SOME JOB NOT PCLSRABLE
5764         POP P,E
5765         POP P,J
5766         POP P,A
5767 NPGWR2: MOVE T,CTLBTS(U)
5768         MOVSI D,MMPLOK
5769         TRNE T,2        ;CONTROL BIT 1.2 UNLOCKS
5770          ANDCAM D,(E)
5771         TRNE T,1        ;CONTROL BIT 1.1 INHIBITS WAITING FOR SWAP TO FINISH.
5772          JRST CLKOJ1
5773         MOVSI T,MMPTMP  ;PAGE IN TRANSIT BIT
5774         TDNE T,(E)      ;WAIT FOR BIT TO TURN OFF
5775          PUSHJ P,UFLS
5776         JRST CLKOJ1
5777
5778 ;COULDN'T SWAP OUT, WAIT A WHILE AND TRY AGAIN
5779 NPGWR4: PUSHJ P,UDELAY  ;UDELAY TURNS CLKON
5780         POP P,E
5781         POP P,J
5782         POP P,A
5783         JRST NPGWR1
5784 \f
5785 EBLK
5786
5787 ;SWAP IN RQ BLOCKS
5788 SWIRQB:
5789 IFN 340P\E.SP,  DISSWI: -1      ;USER
5790 IFN VIDP,       VIDSWI: -1
5791 IFN IMXP,       POTSWI: -1
5792 IFN NSWPV-.+SWIRQB,.ERR NSWPV ERR
5793
5794 SWIVPN:
5795 IFN 340P\E.SP,  DISSPG: 0       ;VIRTUAL PAGE NUMBER
5796 IFN VIDP,       VIDSPG: 0
5797 IFN IMXP,       POTSPG: 0
5798
5799 SWPNTB:         ;SIGNAL BITS IN LH OF W TO CFHSW1
5800 IFN 340P\E.SP,  400000  ;DISPLAY
5801 IFN VIDP,       400000  ;VID
5802 IFN IMXP,       400000  ;POTS
5803
5804 SWILMT:         ;PIRQC BIT TO SET ON ILM
5805 IFN 340P\E.SP,  %PIDIS
5806 IFN VIDP,       %PIMPV
5807 IFN IMXP,       %PIMPV
5808
5809 PSWOUS: -1      ;INDEX OF PARTIALLY SWAPPED OUT USER
5810 PSWCLS: 0       ;CLASS OF PARTIALLY SWAPPED OUT USER
5811 PSWSFL: 0       ;-1 START FROM BEG OF USER, ELSE PICK UP WHERE LEFT OFF
5812 SWPMBP: 0       ;PNTR TO MAP
5813 SWPCBP: 0       ;PNTR TO CIRC DESC SPACE
5814 PSWLC:  0       ;LOOP COUNT
5815 SBEFLG: -1      ;0 => ALREADY ONCE WANTED TO CLEAR ALL "BEST EFFORT" BITS.
5816 SWPOPR: 0       ;NUMBER OF PAGES DESIRED TO BE SWAPPED OUT
5817 SWPOPB: 0       ;SWAP OUT REQUEST BUT ONLY SWAP OUT NON-RUNNING USERS TO MEET (UNUSED?)
5818 SILNG:  0       ;TOTAL LENGTH OF SWAP IN LISTS
5819 SOLNG:  0       ;TOTAL LENGTH OF SWAP OUT LISTS
5820                 ;SINLST AND SOUTLS ARE IN DISK CODE.  VARIATION ON QBFP.
5821 SWODSK: NQS-1   ;UNIT TO SWAP OUT ON NEXT
5822 SWOBK:  0       ;MEMBLT BEING SWAPPED OUT
5823 SWOMMP: 0       ;MMP ADDRESS (NOT INDEX)
5824 SPGNMF: 0       ;-1 => PAGE NOT MODIFIED
5825 CFHAS:  0       ;TEMP FOR A AT CFH
5826 SWPIQS: 0       ;SAVE Q AT SWPPIN
5827 CFHUVP: 0       ;USER'S VIRTUAL PAGE NUMBER TOOK FAULT ON
5828 LUMPS:  0       ;UMAPS USED FOR CURRENT USER, MAY DIFFER FROM
5829                 ;UMAPS(U) IF TOOK FAULT TRYING TO CAUSE INTERRUPT
5830 TRUMM:  0       ;TOTAL USER MEM ACTIVE USERS
5831 NPGSWO: 0       ;NUMBER OF CURRENTLY SWAPPED OUT PAGES
5832 AUSOPG: 0       ;ACTIVE USER SWAPPED OUT PAGES
5833 BUMPGS: 0       ;REAL CORE PAGES OCC BY BLOCKED + STOPPED LOSERS
5834 NUSWB:  0       ;# LOSERS SWAP BLOCKED
5835 SWPOPU: 0       ;USER PG "BELONGS" TO (IE NOT NECC TO PCLSR THIS GUY,
5836                         ;BUT PCLSR ANYONE ELSE LINKED TO PG.)
5837 AGEREQ: 0       ;NUMBER OF PAGES BEING AGED AT SLOW CLOCK
5838 AGEPOS: 0       ;LAST PAGE # AGED
5839
5840 IFE SWPWSP,[
5841 PRVUSR: -1      ;PRIV USR
5842 PRVCUT: 1500    ;CUT OFF FOR PRIV USR
5843 SWUPC:  0       ;ABSOLUTE PAGE NUMBER OF USER MODE PC DURNING SWAP OUT
5844 SWPP0F: -1      ;-1 IF CONSIDERING PAGE 0
5845 ASBUM:  0       ;REAL MEM OCC BY ACTIVE "SWAPPED BLOCKED" LOSERS
5846 SWSCT1: 0       ;TEM AT SWSCD
5847 BUSR:   0       ;INDEX OF SMALLEST SWAP BLOCKED LOSER
5848 BUSIZ:  0       ;SIZE OF BUSR
5849 ];SWPWSP
5850
5851 IFN PAGPRE,[
5852 PREEMP: 0       ;IF NON-ZERO, A PRE-EMPT IS IN PROGRESS (WHEN WE NEXT GET TO CLK LVL)
5853 NPREEL: 0       ;NUMBER OF LOOPS AT SCHEDP (ATTEMPTED PREEMPTS)
5854 NPREEM: 0       ;NUMBER OF SUCCESSFULL PREEMPTS
5855 NPREE1: 0       ;NUMBER OF TIMES A PAGE CAME IN AND WE STARTED TO THINK ABOUT PREEMPTION
5856 NPREE2: 0       ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE OF CLKOFF OR IN PROGRESS
5857 NPREE3: 0       ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE FLSINS WAS WRONG
5858 ];PAGPRE
5859
5860 ;COUNTS OF REASONS FOR ENTRY TO SCHED
5861 ;THESE METERS MAY BE TEMPORARY - SOME OF THEM ARE REDUNDANT
5862 ;REASONS NOT COUNTED - VARIOUS PARITY, NXM, AND OTHER ERROR CASES
5863 NLPPRE: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PREEMPT
5864 NLPCLK: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO CLOCK
5865 NLPUFL: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO UFLS
5866 NLPPAG: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE-IN
5867 NLPPGT: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND TUT LOCKED
5868 NLPPGC: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CIRPSW LOCKED
5869 NLPPGM: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND MEMFRZ LOCKED
5870 NLPPG3: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CALLED CFHPO3 (NO MEM)
5871 NLPPGB: 0       ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND SWAP-BLOCKED
5872 NPPIUM: 0       ;NUMBER OF TIMES PAGE PUT INTO BUNCHA USERS' MAPS
5873 NPPIU1: 0       ;NUMBER OF USERS PAGES PUT INTO MAPS OF  (RATIO OF THESE 2 IS SHARING)
5874
5875 IFN SWPWSP,[
5876 LODQNT:         ;RUN TIME IN 4-USEC UNITS BETWEEN PG FAULTS TO LEAVE
5877                 ;LOADING STATE 
5878  IFN KL10P, 3000.  ;12 MS
5879  IFN KA10P, 9000.  ;36 MS
5880  IFN KS10P, 3000.       .ERR Guessed LODQNT on KS10?
5881 LODFCT: 3,,0    ;MULTIPLY LOADING TIME BY THIS TO GET PROTECT TIME (INT,,FRAC)
5882 NUPTAW: 0 .SEE SWOP6 ;NUMBER OF USERS PAGE TAKEN AWAY FROM
5883
5884 ;METERS
5885
5886 NPLBLJ: 0       ;NUMBER OF PAGE LOADS BY LOADING JOBS
5887 NPLBNL: 0       ;NUMBER OF PAGE LOADS BY NON-LOADING JOBS
5888
5889 ;Still to be done
5890 ;       1-, 5-, 15- minute average population of each state,
5891 ;               also avg of NPGWTU and RNABLU (for load avg)
5892 ;       avg of core occupied by jobs in each state,
5893 ;               i.e. UWRKST for load, pro, sw in.
5894 ;       Relationship of sum of UWRKST's of loading and swapped in
5895 ;               versus total core occupied by user pages.
5896 ;       Average time spent in each state before moving on,
5897 ;               versus size of job.  Maybe cpu time as well as
5898 ;               real time?
5899
5900 ];SWPWSP
5901 BBLK
5902
5903 \f
5904 OVHMTR SWP      ;SWAP PAGE
5905
5906 ;SWAP OUT PAGE WHOSE MEMBLT INDEX IS IN A
5907 ;SKIP IF SUCCESSFUL
5908 ;C IS USER WHO DOESN'T NEED TO BE PCLSRED BEFORE HIS PAGES CAN BE SWAPPED.
5909 SWPOPL: TDZA B,B        ;THIS ENTRY IGNORES LOCK BIT
5910 SWPOPG:  MOVSI B,MMPLOK ;THIS ENTRY RESPECTS LOCK BIT
5911         MOVEM C,SWPOPU
5912         MOVEM A,SWOBK
5913         CAIGE A,TSYSM
5914          CAIGE A,SYSB
5915           BUG           ;DON'T SWAP OUT PART OF SYSTEM
5916         AOSE CIRPSW
5917          POPJ P,
5918         LDB C,[MMMPX,,MEMBLT(A)]
5919         ADDI C,MMP
5920         HRRZM C,SWOMMP  ;STORE ADDRESS OF FIRST WORD OF MMP ENTRY
5921         TDNE B,(C) .SEE MMPLOK  ;LOCKED IN CORE?
5922          JRST [ CAIGE A,256.    ;IF SO, DON'T SWAP OUT UNLESS IN "LOW" MEMORY
5923                  CAIGE A,LIOBLK ;IN WHICH CASE MUST GO OUT TO AVOID SYSTEM DEADLOCK
5924                   JRST SCRPSJ   ;SEE CODE AT CIMEMR
5925                 CAIGE A,128.
5926                  JRST .+1
5927                 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES
5928                  SKIPN USEMDM
5929                   JRST SCRPSJ
5930                 JRST .+1 ]
5931         SOS CIRPSW      ;RELEASE SWITCH
5932         HLRZ B,1(C)
5933         JUMPN B,SWOP1   ;JUMP IF DISK SPACE ALREADY ASSIGNED
5934 SWODF3: MOVSI B,-NQS
5935 SWODF6: AOS I,SWODSK
5936         CAIL I,NQS
5937          SUBI I,NQS     ;WRAP AROUND
5938         MOVEM I,SWODSK  ;CURRENT SWAPPING DSK
5939         CONO PI,UTCOFF-1        ;DON'T CHANGE STATE OF CLOCK CHNL.
5940         SKIPGE QTUTO(I) ;TUT LOCKED
5941          JRST SWODF7
5942         SKIPL QACT(I)
5943         SKIPG QSFTS(I)  ;DSK FULL IN SWAPPING AREA
5944          JRST SWODF7
5945         MOVSI A,(SETZ)
5946         IORM A,QTUTO(I)
5947         CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL.
5948         MOVEI A,NQCHN+1(I)      ;QMFTP(A) CONTAINS TRACK TO START FROM
5949         PUSHJ P,QGTK4   ; RETURNS TRACK IN D
5950         SOS QSFTS(I)
5951 SWODF5: MOVSI A,(SETZ)
5952         ANDCAM A,QTUTO(I)
5953         MOVE A,SWOMMP
5954         HRLM D,1(A)             ;STORE DISK ADDRESS IN MMP ENTRY        
5955         DPB I,[$MMPUN,,(A)]
5956         JRST SWOP1
5957
5958 SWODF7: AOBJN B,SWODF6  ;TRY NEXT DSK FOR SWAPPING AREA
5959         CONO PI,UTCON-1 ;NON FOUND FIND FILE SPACE
5960         MOVNI D,1
5961         MOVNI I,1
5962         MOVSI E,-NQS
5963 SWODF2: SKIPL QTUTO(E)  ;FIND WHICH DISK HAS MOST FREE SPACE
5964         SKIPGE QACT(E)
5965          JRST SWODF4
5966         CAMGE D,QSFT(E)
5967          HRRZ I,E
5968         CAMGE D,QSFT(E)
5969          MOVE D,QSFT(E)
5970 SWODF4: AOBJN E,SWODF2
5971         JUMPL I,CPOPJ   ;NO DSK SPACE AVAIL
5972         HRRZM I,SWODSK  ;LAST DSK HACKED
5973         JUMPLE D,CPOPJ  ; NO ROOM ANYWHERE
5974         CONO PI,UTCOFF-1
5975         SKIPGE QTUTO(I)
5976          JRST UTCNJ     ;TUT LOCKED
5977         MOVSI A,(SETZ)
5978         IORM A,QTUTO(I)
5979         CONO PI,UTCON-1
5980         MOVEI D,NBLKS/2 ;STARTING POINT
5981         MOVEI A,NQCHN+1(I) ;DISK CHANNEL
5982         MOVEM D,QMFTP(A)
5983         PUSHJ P,QGTK4   ;RETURNS TRACK IN D
5984         MOVEI E,NUDSL
5985         MOVEM E,QMFTP(A);DON'T LEAVE SWAPPING CHNL POINTING INTO FILE SPACE
5986         SOS QSFT(I)
5987         JRST SWODF5
5988
5989 SCRPSJ: SETOM CIRPSW
5990         POPJ P,
5991 \f
5992 SWOP1:  AOSE CIRPSW
5993          POPJ P,
5994         AOS NPGSO
5995
5996 ;COME HERE FROM SWPOPG AND MMPRTN TO SWAP OUT A PAGE.
5997 ;CLOCK OFF OR IN PROGRESS AND ARGUMENTS IN SWOBK AND SWOMMP.
5998 ;PUTS BLOCK ON SWAPOUT LIST IF DISK COPY NEEDS TO BE UPDATED, ELSE
5999 ;JUST DELETES MEMORY.  IF NO USERS ARE USING THE PAGE,
6000 ;RETURNS THE MMP ENTRY OR ARRANGES FOR THE DISK ROUTINES TO.
6001
6002 SWOP1A: CONO PI,UTCOFF-1        ;DON'T CHANGE STATE OF CLOCK CHNL.
6003         MOVE A,SWOBK            ;CORE BLOCK # CONTAINING PAGE TO BE SWAPPED OUT
6004         HLRZ C,MMSWP(A)         ;NUMBER OF EXEC PAGES POINTING TO THIS PAGE
6005         JUMPN C,SWOP5           ;POINTED TO BY EXEC PAGE, CAN'T SWAP OUT
6006 IFN 340P,[
6007         MOVSI C,-N340PB-2
6008 SWOPT2: LDB I,DPEP(C)
6009         TRZN I,600000
6010          JRST SWOPT1
6011         ANDI I,PMRCM    ;MASK TO REAL CORE PAGE #
6012         CAIN I,(A)
6013          BUG            ;DISPLAY STILL SET UP TO PAGE BEING SWAPPED OUT
6014 SWOPT1: AOBJN C,SWOPT2
6015 ]
6016         MOVSI C,MMPPGA
6017         ANDCAM C,@SWOMMP
6018         MOVSI C,(SETZ)
6019         IORM C,MEMBLT(A)        ;PREVENT NEW EXEC PAGES FROM BEING SET UP POINTING HERE
6020         CONO PI,UTCON-1
6021         MOVE C,[2200,,MEMPNT]
6022         ADD C,SWOBK
6023         SETOB B,SPGNMF  ;INITIALIZE PAGE NOT MODIFIED FLAG, AND COUNT USERS IN B
6024 IFN SWPWSP,[
6025         LDB I,C
6026         PUSH P,I
6027         SETZM NUPTAW
6028         MOVSI D,-1      ;COMPUTE WORKING SET CONTRIBUTION TO BE TAKEN AWAY
6029         IDIV D,MMSWP(A) ;LH(MMSWP) KNOWN TO BE ZERO!
6030         PUSHJ P,UCPRL   ;CHECK ALL USERS, TAKE PAGE AWAY FROM SOME
6031             400000,,SWOP6       ;ALSO COUNTS USERS IN B
6032         POP P,I
6033         AOJE B,SWOP7    ;JUMP IF NO USERS USING PAGE, RETURN MMP ENTRY
6034         CAMN B,NUPTAW   ;ANY USERS STILL MAPPED TO PAGE?
6035          JRST SWOP8     ;NO, GO SWAP IT OUT
6036         MOVSI D,1       ;YES, COMPUTE WORKING SET ADJUSTMENT
6037         IDIV D,MMSWP(A) ;TO BE ADDED BACK IN TO THEM
6038         PUSHJ P,UCPRL   ;GO BACK AND FIX WORKING SETS
6039             400000,,SWOP6B
6040         JRST SWOP6E     ;ABORT SWAP OUT
6041 ];SWPWSP
6042 IFE SWPWSP,[
6043         LDB I,C
6044         PUSH P,I        ;NOTE: CAN BACK OUT OF THIS PUSH AT SWOP2B
6045         PUSHJ P,UCPRL
6046             400000,,SWOP2       ;RETURN ON USERS (CAN BACK OUT AT SWOP2B)
6047         POP P,I
6048         JUMPGE B,SWOP8
6049 ];SWPWSP
6050 SWOP7:  MOVSI B,MMPGON  ;NO USERS USING PAGE, SO MMP ENTRY WILL BE RETURNED
6051         IORM B,@SWOMMP  ;FLAG THAT MMP ENTRY WILL SOON GO AWAY
6052         MOVEI A,0       ;REMOVE FROM LOOSE PAGE LIST
6053         MOVE T,FLOOSP
6054 SWOP7A: MOVE B,A        ;B PREDECESSOR
6055         SKIPN A,T       ;T SUCCESSOR
6056          BUG            ;NOT IN LIST?
6057         LDB T,[MLO,,MEMBLT(A)]
6058         CAME A,SWOBK
6059          JRST SWOP7A
6060         SKIPE B         ;FOUND, PATCH OUT OF LIST
6061          DPB T,[MLO,,MEMBLT(B)]
6062         SKIPN B
6063          MOVEM T,FLOOSP
6064         SKIPN T
6065          MOVEM B,LLOOSP
6066         SOSL NLOOSP
6067          JRST SWOP8
6068         BUG             ;NLOOSP TOO LOW.
6069 \f
6070 IFN SWPWSP,[
6071
6072 ;THIS UCPRL ROUTINE SCANS ALL USERS, COUNTS THEM IN B,
6073 ;USES D TO ADJUST WORKING SETS OF USERS WHICH ARE MAPPED TO
6074 ;THE PAGE, AND TAKES THE PAGE AWAY FROM ANY USERS IT CAN,
6075 ;COUNTING THEM IN NUPTAW.
6076 SWOP6:  AOS B           ;COUNT USERS OF THIS PAGE
6077         CAIG U,LUBLK
6078          BUG            ;SYS JOB OR CORE JOB?
6079         PUSH P,I
6080         MOVEI C,UPGMP(U)        ;MAKE C POINT TO UPGMP ENTRY (PTW)
6081         ROT I,-1
6082         ADDI C,(I)
6083         HRLI C,222200
6084         SKIPGE I
6085          HRLI C,2200
6086         LDB I,C
6087         SKIPN I
6088          BUG            ;NO ACCESS?
6089         TRNE I,600000
6090          ADDM D,UWRKST(U)       ;IS MAPPED TO PAGE, ADJUST WORKING SET
6091         CAMN U,SWPOPU
6092          JRST SWOP6A    ;DON'T CONSIDER PCLSRING SWPOPU
6093         MOVE T,UPC(U)
6094         TLNE T,%PCUSR
6095          JRST SWOP6A
6096         SKIPN LSWPR(U)  ;PCLSR IF HAS SWITCHES LOCKED
6097          SKIPN FLSINS(U)
6098           JRST SWOP6D
6099         MOVSI T,%SWPCL  ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6100         IORM T,USWST(U)
6101         JRST SWOP6A
6102
6103 SWOP6D: PUSH P,D
6104         PUSH P,C
6105         PUSH P,I
6106         PUSHJ P,PCLSR   ;BETTER NOT CLOBBER U OR H OR A
6107          JRST [ SUB P,[2,,2]
6108                 POP P,D
6109                 JRST SWOP6C ]
6110         POP P,I
6111         POP P,C
6112         POP P,D
6113 ;WHEN WE GET HERE, THIS JOB CAN'T HOLD THIS PAGE IN
6114 SWOP6A: TRNN I,600000
6115          JRST SWOP6C    ;NOT SET UP SINCE PREV SWAPPED OUT
6116         AOS NUPTAW      ;TAKE IT AWAY
6117         LSH I,-16.      ;SAVE ACCESS MODE IN LOW ADR BITS
6118         CAILE I,2       ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6119          CLEARM SPGNMF  ;PAGE HAS BEEN MODIFIED
6120         CAIN I,2        ;FLUSH R.W.F.
6121          MOVEI I,3
6122         DPB I,C         ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6123         AOS NSWPGS(U)   ;INCR COUNT OF SWAPPED OUT PGS OF USER
6124         AOS SNSWPG      ;INCR CNT OF SWAPPED OUT FOR SYS
6125         SOS MMSWP(A)    ;DECR COUNT OF PAGE SHARERS
6126 IFN E.SP,[
6127         CAMN U,DISUSR   ;IF USER OF E&S
6128          PUSHJ P,E.SLPM ;LOAD ITS MAP
6129 ]
6130 SWOP6C: POP P,I
6131         POPJ P,
6132
6133 SWOP6F: CAMN U,-4(P)            ;DON'T LOOK AT USER TAKING PAGE AWAY FROM
6134          POPJ P,                ;ELSE DROP INTO SWOP6B
6135 ;THIS UCPRL ROUTINE ADJUSTS WORKING SETS OF JOBS THAT
6136 ;ARE MAPPED TO THE PAGE USING D.
6137 SWOP6B: PUSH P,I
6138         MOVEI C,UPGMP(U)        ;MAKE C POINT TO UPGMP ENTRY (PTW)
6139         ROT I,-1
6140         ADDI C,(I)
6141         HRLI C,222200
6142         SKIPGE I
6143          HRLI C,2200
6144         LDB I,C
6145         SKIPN I
6146          BUG                    ;NO ACCESS?
6147         TRNE I,600000
6148          ADDM D,UWRKST(U)       ;IS MAPPED TO PAGE, ADJUST WORKING SET
6149         POP P,I
6150         POPJ P,
6151 ];SWPWSP
6152 \f
6153 IFE SWPWSP,[
6154 ;COME HERE VIA UCPRL FOR ALL USERS OF PAGE BEING SWAPPED OUT
6155
6156 SWOP2:  AOS B   ;COUNT USERS OF THIS PAGE
6157         CAIG U,LUBLK
6158          BUG            ;SYS JOB OR CORE JOB?
6159         PUSH P,I
6160         CAMN U,SWPOPU
6161          JRST SWOP2A
6162         MOVE T,UPC(U)
6163         TLNE T,%PCUSR
6164          JRST SWOP2A
6165         SKIPN LSWPR(U)  ;PCLSR IF HAS SWITCHES LOCKED
6166          SKIPN FLSINS(U)
6167           JRST SWOP2D
6168         MOVSI T,%SWPCL  ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6169         IORM T,USWST(U)
6170         JRST SWOP2A
6171
6172 SWOP2D: PUSHJ P,PCLSR
6173          JRST SWOP2B
6174 SWOP2A: MOVEI C,UPGMP(U)
6175         ROT I,-1
6176         ADDI C,(I)
6177         HRLI C,222200
6178         SKIPGE I
6179          HRLI C,2200
6180         LDB I,C
6181         SKIPN I
6182          BUG            ;NO ACCESS?
6183         TRNN I,600000
6184          JRST SWOP2C    ;NOT SET UP SINCE PREV SWAPPED OUT
6185         LSH I,-16.      ;SAVE ACCESS MODE IN LOW ADR BITS
6186         CAILE I,2       ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6187          CLEARM SPGNMF  ;PAGE HAS BEEN MODIFIED
6188         CAIN I,2        ;FLUSH R.W.F.
6189          MOVEI I,3
6190         DPB I,C         ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6191         AOS NSWPGS(U)   ;INCR COUNT OF SWAPPED OUT PGS OF USER
6192         AOS SNSWPG      ;INCR CNT OF SWAPPED OUT FOR SYS
6193         MOVE I,SWOBK
6194         SOS MMSWP(I)    ;KEEP ACCURATE COUNT OF UPGMP'S POINTING AT THIS PAGE
6195 IFN E.SP,[
6196         CAMN U,DISUSR   ;IF USER OF E&S
6197          PUSHJ P,E.SLPM ;LOAD ITS MAP
6198 ]
6199 SWOP2C: POP P,I
6200         POPJ P,
6201
6202 SWOP2B: SUB P,[6,,6]    ;2 PUSHES OF I AND 4 FOR UCPRL
6203 ];SWPWSP
6204 SWOP6E: MOVE A,SWOBK    ;ABORT SWAP-OUT
6205         MOVSI I,(SETZ)
6206         ANDCAM I,MEMBLT(A)
6207         SOS CIRPSW
6208         POPJ P,
6209
6210 SWOP8:  DPB I,C         ;DELINK MEMPNT
6211         MOVEI I,3 .SEE MMPOUT .SEE MMPTMP
6212         DPB I,[410200,,@SWOMMP] ;INDICATE ON THE WAY OUT
6213         MOVSI I,MMPBAD
6214         ANDCAM I,@SWOMMP
6215         MOVE A,SWOBK
6216         MOVSI B,(SETZ)
6217         CONO PI,UTCOFF-1
6218         ANDCAM B,MEMBLT(A)
6219         MOVE C,@SWOMMP
6220         TLNN C,MMPGON   ;UNLESS PAGE WILL BE FORGOTTEN AFTER SWAP OUT,
6221          AOS NPGSWO     ; KEEP COUNT OF PAGES CURRENTLY SWAPPED OUT
6222         TLNE C,MMPWRT   ;IF WAS WRITTEN BY USER WHO LATER DELETED IT,
6223          JRST SWOP3
6224         SKIPGE SPGNMF   ;OR IF PAGE MODIFIED,
6225          TLNN C,MMPWOD
6226           JRST SWOP3    ;OR IF HASN'T BEEN WRITTEN TO DISK, MUST WRITE OUT.
6227         MOVEI I,2       ;NO NEED TO WRITE OUT.  INDICATE OUT.
6228         DPB I,[410200,,@SWOMMP]
6229         PUSHJ P,IMEMR   ;RETURN THE MEMORY
6230         MOVE A,SWOMMP
6231         TLNE C,MMPGON
6232          PUSHJ P,RETMMP ;ALSO RETURN THE MMP ENTRY IF NECESSARY
6233         JRST SWOP4
6234 \f
6235 SWOP5:  SOS CIRPSW
6236 UTCNJ:  CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL
6237         POPJ P,
6238
6239 SWOP3:  CAIGE A,TSYSM           ;HAVE TO WRITE THIS PAGE OUT
6240         CAIGE A,SYSB
6241          BUG
6242         HRRZ B,SWOMMP
6243         LDB I,[$MMPUN,,(B)]
6244         CAIL I,NQS
6245          BUG                    ;DISK NUMBER NOT LEGITIMATE
6246         MOVEI C,.BM MLO
6247         ANDCAM C,MEMBLT(A)      ;SET END OF LIST IN THIS BLOCK
6248         HLRZ C,SOUTLS(I)        ;GET PREV BLOCK
6249         SKIPE C
6250          DPB A,[MLO,,MEMBLT(C)] ;CHAIN TO PREV BLOCK
6251         SKIPN C
6252          MOVEM A,SOUTLS(I)      ;OR TO HEADER IF FIRST
6253         HRLM A,SOUTLS(I)        ;AND SET NEW LAST BLOCK
6254         AOS SOLNG
6255         HLRZ C,1(B)
6256         HRLM C,MEMPNT(A)        ;STORE DISK ADDRESS
6257         MOVEI B,MUSWPG
6258         DPB B,[MUR,,MEMBLT(A)]
6259         PUSHJ P,QSTRT1
6260 SWOP4:  SOS CIRPSW
6261 UTCNJ1: CONO PI,UTCON-1
6262         JRST POPJ1
6263
6264 IFN NSWPV,[
6265 SWPPIN: MOVSI Q,-NSWPV          ;# OF DEVICES THAT CAN SWAP IN PAGES
6266 SWPPI4: SKIPGE W,SWIRQB(Q)      ;USER INDEX
6267          JRST SWPPI6
6268         MOVE E,SWIVPN(Q)        ;VIRTUAL PAGE NUMBER
6269         HRL W,SWPNTB(Q)
6270         CLEARB TT,D
6271         MOVEM Q,SWPIQS
6272         PUSHJ P,CFHSW1
6273         MOVE Q,SWPIQS
6274         SETOM SWIRQB(Q)
6275 SWPPI6: AOBJN Q,SWPPI4
6276         POPJ P,
6277 ]
6278
6279 SWIILM:
6280 IFN E.SP,[
6281         TRNN Q,-1       ; IS DEVICE DIS? (E&S IS INDEX 0 IN SWIRQB)
6282          SETZM E.SPGW   ; IF SO, CLEAR PAGE WAIT.
6283 ]
6284         SKIPGE E,SWILMT(Q)
6285          BUG
6286         IORM E,PIRQC(W)
6287         MOVEI A,0
6288         POPJ P,
6289 \f
6290 SUBTTL LOAD USER PAGE MAP
6291
6292 OVHMTR UUO      ;RANDOM UUOS (WELL, SOME MINOR SCHED STUFF, TOO)
6293
6294 ;SET PAGE MAP AT M.P. LEVEL, ASSUMING UMAPS HAS BEEN ALTERED.
6295 ;UMAPS EXISTS SO SCHEDULER CAN RESTORE THE MAP AFTER OTHER JOBS RUN.
6296 ;FORMAT OF A MAP SPECIFICATION IS:
6297 %UM==1,,525252
6298 %UMMPL==200000  ;1 => MAP LOWER HALF TO SPEC'D JOB'S; 0 => USE LOWER OF JOB IN U.
6299 %UMMPU==100000  ;1 => MAP UPPER HALF TO SPEC'D JOB'S; 0 => USE UPPER OF JOB IN U. 
6300 %UMALL==300000  ;SET => SELECT WHOLE MAP OF SPEC'D JOB.
6301 %UMUTL==40000   ;IGNORED IF %UMMPU=0. IF %UMMPU=1, MEANS USE SPEC'D JOB'S LOWER
6302                 ;INSTEAD OF ITS UPPER, AS OUR UPPER HALF. READ "%UM UPPER-TO-LOWER".
6303 %UMLTU==20000   ;"%UM-LOWER-TO-UPPER". WITH %UMMPL, MAKES LOWER -> SPEC'D JOB'S UPPER.
6304 %UMSOA==4000    ;1 => USE AC0S AS THE USER'S ACS, INSTEAD OF UUOACS.
6305                 ;NOTE IF %UMLTU=1, OR IF LOWER -> PDP6, THE GARBAGS ACS ARE USED.
6306                 ;ELSE, THE ACS COME FROM THE JOB WHICH OUR LOWER HALF COMES FROM.
6307 ;RH             ;JOB INDEX OF THE "SPECIFIED JOB". -1 => PDP6.
6308                 ;NOT NEEDED IF %UMMPL=%UMMPU=0.
6309
6310 PGLDU:  MOVE R,UMAPS(U)
6311 ;SET PAGE MAP AT INT. LEVEL, NOT CLOBBERING JOB'S UMAPS. ARG IN R.
6312 PGLD:   MOVEM R,LUMPS   ;LAST UMAPS ACTUALLY USED
6313         AOS NPGLD       ;COUNT # CALLS TO PGLD
6314         PUSH P,A        ;R HAS UMAPS CODE
6315         PUSH P,B
6316         PUSH P,C
6317         HRRZ C,U
6318 IFN KA10P, MOVSI B,NUVPG/2      ;SET UP NORMAL DBL, MIGHT BE CHANGED IF PDP6
6319 IFE KA10P, MOVSI B,0            ;ONLY KA10 HAS DBL
6320         TLNN R,%UMMPL
6321          JRST PGLD3A    ;USE NORMAL LOW SEG
6322 IFN PDP6P,[
6323         TRNE R,400000
6324          JRST PGLD3B    ;USE PNTR TO PDP6
6325 ]
6326         HRRZ C,R
6327         TLNE R,%UMLTU   ;SKIP ON USE HIS LOWER
6328          JRST PGLD3D    ;USE HIS UPPER
6329 PGLD3A: HRRI B,UDBR1A(C)
6330         TLNE R,%UMSOA
6331          JRST PGLD3G    ;MAKE AC'S POINT AT SWAP OUT AC'S
6332         MOVEI A,UUOACS(C)
6333 PGLD3F: MOVEM B,UPDBR1(U)
6334 IFN KA10P, DPB A,[2300,,UPACP(U)]       ;STORE AC PNTR
6335 IFE KA10P,[
6336         CAMN A,AC1PTR   ;IF CHANGING AC BLOCK 1
6337          JRST PGLD3H
6338         EXCH A,AC1PTR   ;STORE OLD BLOCK 1
6339         MOVE B,A
6340         XCTR XBR,[BLT B,17(A)]
6341         MOVS A,AC1PTR   ;AND LOAD NEW BLOCK 1
6342         XCTR XBW,[BLT A,17]
6343 PGLD3H: ] ;IFE KA10P
6344 IFN KA10P, MOVSI B,NUVPG/2      ;SET UP DBL FOR DBR2
6345 IFE KA10P, MOVSI B,0
6346         HRRI B,UDBR2A(U)
6347         TLNN R,%UMMPU
6348          JRST PGLD6     ;USE NORMAL UPPER SEG
6349         HRRI B,UDBR2A(R)
6350         TLNE R,%UMUTL
6351          HRRI B,UDBR1A(R)
6352 IFN PDP6P,[
6353         TRNE R,400000
6354          MOVE B,PDP6MP
6355 ]
6356 PGLD6:  MOVEM B,UPDBR2(U)
6357 PGLDR1: LPMR UPGML(U)
6358         POP P,C
6359         POP P,B
6360         POP P,A
6361         POPJ P,
6362
6363 IFN PDP6P,      PGLD3B: SKIPA B,PDP6MP
6364 PGLD3D: HRRI B,UDBR2A(R)
6365         MOVEI A,GACS
6366         JRST PGLD3F
6367
6368 PGLD3G: MOVEI A,AC0S(C)
6369         JRST PGLD3F
6370
6371 GACS:   BLOCK 20        ;GARBAGE AC'S POINTED TO BY ACPNTR WHEN ITS REALLY POINTING
6372                 ;AT UPPER PAGES OR PDP6  SHOULD HOPEFULLY NEVER GET REFERENCED
6373
6374 ;MAIN PROGRAM MAP-SETTING ROUTINES.
6375 IFN PDP6P,[
6376 MP6LD:  SKIPA J,[%UMMPU,,-1]    ;LOAD UPPER DBR TO PNT TO 6
6377 ];PDP6P
6378 MPLDZ:   MOVEI J,0              ;SET NORMAL MAP - OUR OWN CORE.
6379 MPLD1:  CAMN J,UMAPS(U)         ;SET UMAPS AS SPEC'D
6380          JRST CLKONJ
6381         MOVEM J,UMAPS(U)
6382 MPLD:   CONO PI,CLKOFF
6383         PUSHJ P,PLD
6384         JRST CLKONJ
6385
6386 ;SET MAP TO JOB # IN J; MIGHT OR MIGHT NOT BE THE CURRENT JOB. SAVES RH(J)
6387 MPLDJ:  CAME J,USER
6388          TLOA J,%UMSOA+%UMALL   ;OTHER JOB'S ACS ARE IN ITS AC0S.
6389           TLO J,%UMALL          ;THIS JOB => WANT UUOACS.
6390         JRST MPLD1
6391
6392 ;SIMILAR ROUTINES, BUT FOR USE WHEN CLKCHN IS OFF AND SHOULD STAY OFF.
6393 IFN PDP6P,[
6394 PLD6:   SKIPA J,[%UMMPU,,-1]    ;MAKE UPPER DBR POINT TO PDP6.
6395 ];PDP6P
6396 PLDZ:    MOVEI J,0              ;NORMAL MAP
6397 PLD1:   MOVEM J,UMAPS(U)
6398 PLD:    SPM UPGML(U)    ;IF ANY INHIBITED FAULT PRESENT, CAUSE IT TO GET STORED AWAY
6399         PUSH P,R
6400         PUSHJ P,PGLDU   ;CAUSE ACTUAL PG LOAD TO HAPPEN
6401         POP P,R
6402         POPJ P,
6403 \f
6404 SUBTTL GIVING THE USER INTERRUPTS
6405
6406 SEAR2E: MOVE A,PIRQC(U)
6407
6408 ;ROUTINE TO HANDLE FIRST WORD (PIRQC) INTS
6409 SEAR2A: JUMPL A,SEAR2B  ;REQUEST TO PCLSR
6410         SKIPN PICLR(U)
6411          JRST SEAR2C    ;PI IN PROG, ONLY LOOK FOR FATAL INTS.
6412         SETCM Q,IDF1(U)
6413         AND Q,MSKST(U)  ;ENABLED UNDEFERRED INTS.
6414         TDNN A,Q        ;ANY OF THOSE PENDING,
6415          TDNE A,[BADBTS]        ;OR ANY CLASS 1 OR 2 => INTERRUPT.
6416           CAIA
6417            JRST SEARL2
6418         ANDCA Q,A       ;GET DISABLED OR DEFERRED PENDING INTS.
6419         TDNN Q,[BADBTS] ;ANY CLASS 1 OR 2 DISABLED OR DEFERRED
6420          JRST INTWD1     ;NO, INT. THIS JOB.
6421         JRST SEAR2D     ;YES, INT. SUPERIOR.
6422
6423 SEAR2C: TDNN A,[BADBTS] ;PI IN PROG: ANY CLASS 1 OR 2 ?
6424          JRST SEARL2     ;NO, NOTHING TO DO.
6425 SEAR2D: PUSHJ P,PCLSR   ;INT. THE SUPERIOR: PCLSR FIRST.
6426          JRST SEARC     ;CAN'T STOP THIS JOB IN EXEC MODE.
6427         SETZ B,         ;OK, HANDLE FATAL 1ST WORD INTS IN A, AND NO 2ND WORD INTS.
6428
6429 ;HANDLE A FATAL INTERRUPT BY INTERRUPTING THE SUPERIOR.
6430 ;FATAL 1ST WORD INTERRUPTS IN A,  FATAL 2ND WORD INTS IN B.
6431 INTSUP: MOVEM A,SRN4(U) ;.FTL1
6432         MOVEM B,SRN5(U) ;.FTL2 ;PUT THE FATAL INTERRUPTS WHERE SUPERIOR CAN READ THEM.
6433         MOVSI T,BUSRC
6434         IORM T,USTP(U)  ;STOP INFERIOR
6435 IFN SWPWSP, PUSHJ P,LVLOAD
6436         MOVSI T,BULGOS  ;IF LOST TRYING TO LOG OUT, ABORT LOGOUT
6437         ANDCAM T,APRC(U)
6438         MOVE Q,U        ;SAVE USER INTERRUPTING
6439         SKIPGE U,SUPPRO(U)      ;SKIP UNLESS TOP LEVEL
6440          JRST INTTOP    ;REALLY TOP LEVEL
6441         HLLZ T,U        ;GET INT BIT
6442         IORM T,IFPIR(U) ;TURN ON INTERRUPT BIT IN SUPERIOR
6443         HRRZS U         ;CLEAR LEFT HALF OF U
6444         CAIL J,(U)      ;SKIP IF SUPERIOR HAS NOT YET BEEN SCHEDULED
6445          JRST SEARL1    ;RESCHEDULE SUPERIOR
6446         JRST SEARL      ;HAVEN'T GOT TO HIM YET SO CONTINUE
6447
6448 INTTOP: MOVEI T,SCRDET
6449         SKIPL APRC(Q)   ;IF JOB ISN'T ALREADY DISOWNED
6450          IORM T,SUPCOR  ;SAY SOMEONE WANTS TO BE DETACHED.
6451         JRST SEARL      ;LEAVE STOPPED, SYS JOB WILL DETACH SOMEDAY.
6452
6453 SEAR2B: PUSHJ P,PCLSR   ;PCLSR THE JOB, E.G. SO IT CAN GET AN IOC ERROR
6454          JRST SEARC     ;RUNNING IN EXEC MODE, GO RUN IT
6455         MOVSI A,(SETZ)  ;CLEAR REQUEST
6456         ANDCAM A,PIRQC(U)
6457         JRST SEARL1     ;INSPECT THIS JOB AGAIN
6458 \f
6459 ;IFPIR IS NONZERO BUT PIRQC IS ZERO.
6460 INTWD2: SKIPN PICLR(U)
6461          JRST SEARL3    ;IGNORE 2ND WD INTS IF PI IN PROG.
6462         AND B,MSKST2(U)
6463         ANDCM B,IDF2(U) ;GET ENABLED UNDEFERRED INTS.
6464         JUMPE B,SEARL3  ;ALL DISABLED OR DEFERRED.
6465         JSP T,INTPAG    ;MAKE SURE NOT WAITING FOR PAGE NEEDED FOR INT.
6466         PUSHJ P,PCLSR   ;DON'T INT. EXCEPT IN USER MODE.
6467          JRST SEARC
6468         SETZ A,         ;1ST WD INTS TO GIVE = 0.
6469         JRST INTSRC     ;2ND WD INTS TO GIVE ALREADY IN B.
6470
6471 ;PIRQC WAS NONZERO BUT NO FATAL INTS.
6472 INTWD1: JSP T,INTPAG    ;IF TRIED BEFORE & WENT TO INTPFL, WAIT FOR PAGE.
6473         PUSHJ P,PCLSR   ;CAN INT. ONLY IN USER MODE.
6474          JRST SEARC
6475         MOVE B,IFPIR(U)
6476         AND B,MSKST2(U) ;GET PENDING ENABLED UNDEFERRED 2ND WD INTS IN B.
6477         ANDCM B,IDF2(U)
6478         AND A,MSKST(U)
6479         ANDCM A,IDF1(U) ;PENDING ENABLED UNDEFERRED 1ST WD INTS IN A.
6480 INTSRC: AOS NAUINT      ;ELSE 1 MORE ATTEMPT TO INTERRUPT.
6481         MOVSI R,%UMSOA  ;LOAD ORDINARY MAP FOR THIS USER.
6482         PUSHJ P,PGLD    ;BUT ACS -> SWAP OUT ACS.
6483         HRRZ T,40ADDR(U) ;GET ADDR OF USER'S LOCATION "40"
6484         XCTRI XR,[MOVE T,2(T)] ;TRY TO GET CONTENTS OF "42" (..I SO STOP ON EXEC PG FAULT DOESNT)
6485          SKIPA R,T
6486           JRST INTPFL   ;PAGE FAULT IN XCTR, GIVE UP & WAIT FOR PAGE.
6487         ANDI R,-1
6488         JUMPE R,INTBAD  ;42 POINTS TO 0 => BADPI ERROR.
6489         MOVE TT,OPTION(U)
6490         TLNN TT,%OPINT  ;NEW STYLE INTERRUPTS?
6491          JRST INTOLD     ;NO, OLD STYLE.
6492         XCTRI XR,[MOVE R,(R)] ;GET ADDR OF HIS INT PDL PTR.
6493          CAIA
6494           JRST INTPFL
6495         JUMPGE T,INTBAD
6496         CAMGE T,[-72.*5-1,,]
6497          JRST INTBAD
6498         XCTRI XR,[MOVE H,(R)] ;GET CONTENTS OF INT PDL PTR.
6499         JRST INTSR2     ;ADVANCE T PAST INT PDL PTR ADDR.
6500          JRST INTPFL
6501
6502 INTSR0: XCTRI XR,[MOVE C,(T)] ;GET THE INTS NEXT INT TABLE ENTRY
6503          SKIPA D,B
6504           JRST INTPFL   ;APPLIES TO.
6505         XCTRI XR,[AND D,1(T)]
6506          CAIA
6507           JRST INTPFL
6508         AND C,A         ;WHICH OF THEM ARE WE TRYING TO GIVE?
6509         JUMPN C,.+2
6510          JUMPE D,INTSR1 ;NOT GIVING ANY OF THEM, TRY NEXT ENTRY.
6511         MOVE Q,IDF1(U)  ;GET CURRENT SETTINGS OF DEFER WORDS.
6512         XCTRI XW,[MOVEM Q,3(H)]
6513          SKIPA Q,IDF2(U)        ;AND PUT INTO NEXT INT PDL FRAME.
6514           JRST INTPFL
6515         XCTRI XW,[MOVEM Q,4(H)]
6516          SKIPA Q,UPC(U) ;ALSO PUT CURRENT PC IN FRAME.
6517           JRST INTPFL
6518         XCTRI XW,[MOVEM Q,5(H)]
6519          CAIA
6520           JRST INTPFL
6521         XCTRI XR,[MOVE E,2(T)] ;NOW SEE WHICH DEFER BITS TO TURN ON NOW.
6522          CAIA
6523           JRST INTPFL
6524         XCTRI XR,[MOVE TT,3(T)]
6525          CAIA
6526           JRST INTPFL
6527         XCTRI XR,[MOVE Q,4(T)] ;AND THE NEW PC.
6528          TLOA Q,%PCUSR
6529           JRST INTPFL
6530         TLZ Q,BADPC
6531         SKIPGE IOTLSR(U)
6532          TLO Q,%PCUIO   ;DON'T CHANGE HIS IOTLSR STATUS.
6533         XCTRI XW,[MOVEM C,1(H)]
6534          CAIA           ;PUT INTS BEING GIVEN IN
6535           JRST INTPFL   ;INT. PDL FRAME.
6536         XCTRI XW,[MOVEM D,2(H)]
6537          TDZA B,D
6538           JRST INTPFL
6539         MOVE W,H        ;REMEMBER PDL PTR BEFORE INCREMENT, FOR PDL OV TESTING
6540         ADD H,[5,,5]
6541         LDB J,[220500,,R]       ;HOW MANY ACS SHOULD WE SAVE?
6542         JUMPE J,INTSR5          ;NONE?
6543         HRLS J
6544         ADD H,J                 ;ADVANCE THE PDL PTR OVER WHERE THEY'LL GO.
6545         SUBM H,J                ;GET BACK THE OLD UN-ADVANCED PDL PTR IN J.
6546         ROT R,14
6547         HRLI J,(R)              ;PUT 3.7-4.1 OF R INTO LH(J) CIRCUITOUSLY
6548         TLZ J,777760
6549         ROT R,-14
6550         AOS J                   ;MAKE J POINT AT 1ST UNUSED PDL WORD.
6551         XCTRI XBRW,[BLT J,(H)]
6552          CAIA
6553           JRST INTPFL
6554 INTSR5: JUMPGE R,INTSR4 ;SAVE DEBUGGING INFO ON INT PDL IF USER WISHES
6555         HRRZ J,UPJPC(U)
6556         XCTRI XW,[MOVEM J,1(H)]
6557          SKIPA J,SUUOH(U)
6558           JRST INTPFL
6559         XCTRI XW,[MOVEM J,2(H)]
6560          SKIPA J,LSPCL(U)
6561           JRST INTPFL
6562         XCTRI XW,[MOVEM J,3(H)]
6563          CAIA
6564           JRST INTPFL
6565         ADD H,[3,,3]
6566 INTSR4: MOVE J,U        ;MAYBE? SCHED LOOP WANTS USER IDX IN J?
6567         XCTRI XW,[MOVEM H,(R)]  ;STORE BACK THE PDL POINTER, THUS FINALIZING ALL
6568          TDZA A,C       ;INTS HAVE BEEN GIVEN; NOW WE CAN CHANGE THE USER VARS.
6569           JRST INTPFL
6570         ANDCAM C,PIRQC(U)
6571         ANDCAM D,IFPIR(U)
6572         IORM E,IDF1(U)  ;SET THE DEFER BITS SPEC'D IN TABLE ENTRY.
6573         IORM TT,IDF2(U)
6574         MOVEM Q,UPC(U)  ;START USER AT INT HANDLER.
6575         JUMPL H,INTSR3  ;NOW CHECK FOR INT PDL OVFLO.
6576         JUMPGE W,INTSR3
6577         MOVEI TT,%PIPDL ;THERE WAS OVFLO, SET PDL OV INT
6578         TDNN TT,MSKST(U) ;IF ENABLED.
6579          JRST INTSR3
6580         IORM TT,PIRQC(U)
6581         JRST SEAR2E     ;RE-TRY THE INTERRUPT.
6582
6583 INTSR3: JUMPN A,SEAR2E  ;MORE INTS TO GIVE => RETRY.
6584         JUMPN B,SEAR2E
6585 INTSRX: AOS NUINT       ;1 MORE INT GIVEN SUCESSFULLY.
6586         SPM UPGML(U)
6587         JRST SEARC      ;SCHEDULE.
6588
6589 INTSR1: ADD T,[4,,4]    ;NO INTS GIVEN, TRY NEXT ENTRY.
6590 INTSR2: AOBJN T,INTSR0
6591         JRST INTSUP     ;ENABLED INTS BUT NO ENTRIES FOR THEM.
6592
6593 ;GIVE INTS THE OLD WAY.
6594 INTOLD: SKIPN C,A       ;GIVE INTS OF 1 WD AT A TIME.
6595          SKIPA C,B       ;(NO 1ST WD, GIVE ALL 2ND WD)
6596         TDZA B,B        ;(SOME 1ST WD INTS, GIVE NO 2ND WD INTS)
6597          TLO C,4^5       ;(GIVING 2ND WD, SET SIGN TO SAY SO)
6598         XCTRI XW,[MOVEM C,(T)]
6599          SKIPA Q,UPC(U) ;STORE INTS BEING GIVEN,
6600           JRST INTPFL
6601         MOVEI T,2(T)    ;ADVANCE -> PLACE TO START USER.
6602         XCTRI XW,[MOVEM Q,-1(T)]
6603          TLOA T,%PCUSR  ;OLD PC STORED, SET UP NEW.
6604           JRST INTPFL
6605         ANDCAM A,PIRQC(U) ;SAY THESE INTS NOW GIVEN.
6606         ANDCAM B,IFPIR(U)
6607         SKIPGE IOTLSR(U)
6608          TLO T,%PCUIO
6609         MOVEM T,UPC(U)  ;SET HIS PC -> TSINT+2
6610         SETZM PICLR(U)
6611         JRST INTSRX
6612 \f       
6613 ;IF WE ARE WAITING FOR A PAGE NEEDED FOR TAKING AN INTERRUPT,
6614 ;GIVE UP ON TRYING TO TAKE TE INT. UNLESS PAGE HAS COME IN SINCE LAST TRY.
6615 INTPAG: MOVSI E,%SWPGW
6616         SKIPE FLSINS(U)
6617          TDNN E,USWST(U)
6618           JRST (T)      ;JOB NOT WAITING FOR PAGE
6619         MOVSI E,%SWINT
6620         TDNN E,USWST(U)
6621          JRST (T)       ;NOT WAITING FOR INTERRUPT PAGE
6622         MOVE E,T
6623         MOVE T,EPDL2(U)
6624         XCT FLSINS(U)
6625          JRST SEARL     ;PAGE NOT IN
6626         MOVSI T,%SWPGW+%SWINT   ;PAGE IN
6627         ANDCAM T,USWST(U)
6628         SETZM FLSINS(U)
6629         SOS NPGWTU
6630         JRST (E)
6631
6632 ;COME HERE WHEN AN XCTRI TAKES FAULT WHILE TRYING TO STORE AN INTERRUPT.
6633 INTPFL: MOVE J,U        ;MAYBE? SCHED MAIN LOOP WANTS USR IDX IN J.
6634         SPM UPGML(U)    ;STORE MAP IN INTERRUPTING STATE
6635 IFN KA10P, LDB T,[221000,,UPJPC(U)]     ;FAULT ADDRESS
6636 IFN KL10P, LDB T,[$PFPNO,,UPFW(U)]
6637 IFN KS10P, LDB T,[$PFPNO,,EPTP7W]       ; Fault happened at PI level 7.
6638         ROT T,-1
6639         ADDI T,UPGCP(U)
6640         SKIPL T
6641          TLOA T,222200
6642           HRLI T,2200
6643         LDB E,T
6644         JUMPE E,INTBAD  ;DON'T HAVE PAGE
6645 IFN KA10P,[
6646         HLLZ T,UPQUAN(U)
6647         TLNE T,100
6648          JRST INTBAB    ;WRITE IN RD ONLY
6649 INTBAC: HLLZ T,UPC(U)   ;SIMULATE SETUP OF OPC
6650         LSH T,-5
6651         HRR T,UPC(U)
6652         MOVEM T,UPOPC(U)        ;FAULT STATUS
6653         MOVSI T,1000
6654         IORM T,UPQUAN(U)        ;BIT NOT SET BY XCTRI
6655         MOVSI T,%SWINT
6656         IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATT
6657         LPMRI UPGML(U)  ;SET MPV FLAG, WILL CAUSE INT. LATER LPMR'S WON'T
6658                         ; CLEAR IT.
6659         JRST SCHED6     ;"RUN" USER, TAKING PAGE FAULT IMMEDIATELY
6660
6661 INTBAB: TLNE T,50       ;NO ACCESS OR W IN RWF
6662          JRST INTBAC    ;PAGING BOX BUG? IGNORE RD ONLY
6663         JRST INTBAD     ;REALLY IS READ-ONLY.
6664 ] ;KA10P
6665 IFN KL10P,[
6666         SUBI T,UPGCP-UPGMP
6667         LDB E,T
6668         TRNE E,600000
6669          LSH E,-20
6670         CAIN E,2        ;RWF
6671          JRST INTBAB
6672         MOVS T,UPFW(U)
6673         ANDI T,%PFCOD
6674         CAIE T,%PFPNA
6675          JRST INTBAD    ;REAL VIOLATION
6676 ;DROPS THROUGH
6677 \f;DROPS IN
6678 ;KL10P  ;PF OR RWF, TAKE THE FAULT, READ IN THE PAGE, THEN TRY TO INTERRUPT AGAIN
6679
6680 INTBAB: MOVSI T,%SWINT
6681         IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATTEMPT
6682         SETOM DLSRCH    ;DON'T INTERRUPT AT INTBA1, SCHEDULE, TRY TO PCLSR
6683                         ; WITH WRONG PC
6684         MOVEI T,INTBA1
6685         EXCH T,UPC(U)   ;HACK USER'S PC
6686         MOVEM T,EPDL3(U)
6687         JRST SCHED6     ;RUN USER, RETURNING IMMEDIATELY TO INTBA1
6688
6689 INTBA1: CONO PI,PIOFF
6690         SETZM DLSRCH
6691         MOVEM U,PFAILU  ;SIMULATE A PAGE FAULT ON THE INTERRUPT WORD
6692         MOVE U,USER
6693         MOVE U,EPDL3(U)
6694         MOVEM U,PFOPC1  ;RESTORE USER'S PC
6695         MOVNI U,2
6696         MOVEM U,PFAILF  ;FLAG FAULT FROM INTPFL
6697         MOVE U,PFAILU   ;RESTORE U SO CLKSAV CAN RE-SAVE IT
6698         CONO PI,CLKRQ   ;TURN PI SYSTEM ON AND CAUSE CLOCK BREAK
6699         JRST .          ;TAKES A WHILE TO GO OFF
6700 ] ;KL10P
6701 IFN KS10P,[
6702         MOVE T,EPTP7W
6703         TLNE T,%PF2.8           ; Write in read only?
6704          JRST INTBAD            ; Yes:  %PIB42
6705         MOVEM T,UPFW(U)         ; No:  Set up for a simulated fault
6706         MOVSI T,%SWINT
6707         IORM T,USWST(U)         ; Signal fault as result of interrupt attempt
6708         SETOM PFAILF            ; Cause CLK level to go to PFLU2 at
6709                                 ; first opportunity.
6710         MOVEI T,CCLKRQ          ; Make sure that happens real fast
6711         EXCH T,UPC(U)           ; by setting his PC thusly.
6712         MOVEM T,EPTPFO          ; Save old PC as location of fault.
6713         JRST SCHED6             ; Go run this user.
6714 ] ;KS10P
6715
6716 INTBAD: MOVEI A,%PIB42  ;TURN ON BAD PI LOC INT BIT
6717         IORB A,PIRQC(U) ;GIVE USER INTERRUPT(MUST IORM TO AVOID TIMING ERR)
6718         JRST SEAR2A     ;RE-PERFORM ACTIONS FOR NON-ZERO PIRQC
6719                 ;WILL CAUSE AN INTERRUPT TO SUPERIOR
6720
6721 ;INTERRUPT ALL USERS THAT WANT IT
6722 ;  C(A) IS BIT IN PIRQC TO TURN ON
6723 DBGINT: MOVSI A,(%PIDBG)        ;"SYS BEING DEBUGGED" INT
6724 INTALL: MOVEI U,0       ;ENTRY INITIALIZE
6725 INTA2:  ADDI U,LUBLK    ;ADVANCE TO NEXT BLOCK OF USER VARIABLES
6726         CAML U,USRHI    ;SKIP UNLESS AT END
6727         POPJ P,         ;THROUGH, RETURN
6728         SKIPN UNAME(U)  ;SKIP IF BLOCK IN USE
6729         JRST INTA2      ;IDLE, IGNORE
6730         LDB T,[410100,,USTP(U)] ;GET BUCSTP OF USERS STOP WORD
6731         JUMPN T,INTA2   ;IF USER CONTROL STOPPED, JUMP TO IGNORE
6732         MOVE B,MSKST(U) ;PICK UP INTERRUPT MASK
6733         AND B,A         ;MASK C(B) TO APPROPRIATE BIT
6734         IORM B,PIRQC(U) ;GIVE INT TO USER
6735         JRST INTA2      ;LOOP
6736 \f
6737 SUBTTL PCLSR ROUTINES
6738
6739 ; PUT PC OF USER WHOSE INDEX IS IN U IN USER MODE
6740 ;  (CALL ONLY WITH CLOCK OFF OR CLOCK BREAK IN PROGRESS)
6741 ;SKIPS IF SUCCESSFUL, FAILS IF USER RUNNING IN EXEC CODE OR HAS TO BE FINALIZED
6742 ;
6743 PCLSR:  AOS NPCLSR
6744         CAIG U,L
6745          BUG                    ;PCLSR'ING NULL, SYS OR CORE JOB?
6746         MOVEI T,L
6747         IDIVM U,T
6748         IMULI T,L
6749         CAMN T,U                ;IS U REALLY A MULTIPLE OF LUBLK?
6750          SKIPN UNAME(U)         ;SHOULD NOT HAPPEN TO NONEXTANT JOB
6751           BUG
6752         SKIPE USTP(U)
6753          JRST POPJ1             ;USER STOPPED (MUST ALREADY BE IN USER MODE)
6754         AOS NEPCLS
6755         SKIPLE T,RPCL(U)
6756          JRST PCLSR2            ;LOSER IS RPCLSR'ING SOMEONE
6757 PCLSR3: MOVE T,SUEXIT(U)
6758 IFE KA10P,SUB T,U
6759         CAME T,[JRST 2,@XUUOH]
6760          JRST PCLSR5            ;EXIT ALREADY CLOBBERED
6761         MOVE T,UPC(U)           ;PICK UP PROGRAM COUNTER (FLAGS IN L.H.)
6762         TLNN T,%PCUSR           ;SKIP IF USER MODE ON
6763          JRST PCLSR8            ;JOB CURRENTLY IN EXEC MODE
6764         SOS NEPCLS              ;WAS WRONGLY AOS'ED
6765         CLEARM FLSINS(U)        ;IN CASE HE WAS WAITING FOR A PAGE OR CIRPSW
6766         MOVE T,USWST(U)
6767         TLNE T,%SWPGW
6768          SOS NPGWTU
6769         MOVSI T,%SWPGW+%SWRUN+%SWINT
6770         ANDCAM T,USWST(U)
6771         AOS (P)
6772         POPJ P,
6773
6774 PCLSR8: SKIPE FLSINS(U)         ;SKIP IF UNBLOCKED
6775          JRST PCLSR1            ;HUNG, TRY TO BACK UP TO UUO
6776 PCLSR4: MOVE T,[JRST ONEFLS]
6777         MOVEM T,SUEXIT(U)       ;MUNG EXIT OF UUO, COME BACK LATER
6778 PCLSRF: AOS NFPCLS
6779         POPJ P,
6780
6781 PCLSR2: SETZM RPCL(U)           ;CLEAR OUT POINTERS IN BOTH DIRECTIONS
6782         SETZM RPCL(T)
6783         JRST PCLSR3
6784
6785 PCLSR5: SKIPN FLSINS(U)
6786          JRST PCLSRF            ;NOT HUNG, LET RUN TO COMPLETION
6787 IFN KA10P,[                     ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6788         CAME T,[JRST ONEPROC]   ;SKIP IF ONE PROCEEDING A SYS CALL
6789          JRST PCLSR6
6790         MOVSI T,%PC1PR
6791         IORM T,SUUOH(U)         ;RESET SINGLE INSTRUCTION PROCEED
6792 PCLSR6:] ;KA10P
6793 IFN KS10P,[                     ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6794         CAME T,[JRST ONEPR4]    ;SKIP IF ONE PROCEEDING A SYS CALL
6795          JRST PCLSR6
6796         MOVSI T,OIPBIT
6797         IORM T,XUUOH(U)         ;RESET SINGLE INSTRUCTION PROCEED
6798 PCLSR6:] ;KS10P
6799         MOVE T,UPC(U)
6800         TLNE T,%PCUSR
6801          BUG
6802 IFN KA10P,      MOVE T,[JRST 2,@UUOH]
6803 IFE KA10P,[
6804         MOVSI T,(JRST 2,@)
6805         HRRI T,UUOH
6806 ] ;IFE KA10P
6807         MOVEM T,SUEXIT(U)       ;UNCLOBBER EXIT
6808 PCLSR1: HLRZ T,LSPCL(U)         ;SAVE LAST TWO DISTINCT LOCS PCLSR'ED FROM
6809         CAIN T,@UPC(U)
6810          JRST PCLSR9
6811         HRL T,UPC(U)
6812         MOVEM T,LSPCL(U)
6813 PCLSR9: SOS T,SUUOH(U)          ;GET USER LOCATION OF HIS CURRENT UUO
6814 UFL5:
6815 IFN KL10P,[
6816         TLC T,%PS1PR-%PSINH
6817         TLCN T,%PS1PR-%PSINH
6818          TLO T,%PSINH           ;ONE PROCEEDING AND INSTR NOT COMPLETE
6819 ] ;KL10P
6820         MOVEM T,UPC(U)          ;SET USERS PROGRAM COUNTER
6821 IFE KA10P,[
6822         MOVSI T,701100          ;RESTORE PAGE-CONTEXT TO USER MODE
6823         HLLM T,CLCX(U)
6824 ] ;IFE KA10P
6825         CLEARM UMAPS(U)         ;RESTORE TO NORMAL MAP
6826         SETZM FLSINS(U)         ;CLEAR OUT ANY BLOCKING CONDITION
6827         MOVE T,USWST(U)
6828         TLNE T,%SWPGW
6829          SOS NPGWTU
6830         MOVSI T,%SWPGW+%SWRUN+%SWPCL+%SWINT     ;NOT BLOCKED ON PAGE, NOT UNBLOCKED SWAPOUT,
6831         ANDCAM T,USWST(U)       ; NOT INTERRUPT PAGE, NOT SWAPPED OUT WHILE BLOCKED
6832         SKIPE T,LSWPR(U)
6833          JRST LSWZAP            ;REQUIRED TO UNLOCK SWITCHES
6834 PCLSR7:
6835 IFE KA10P,[
6836         MOVEI T,UUOACS(U)       ;IF JOB U'S ACS ARE IN HARDWARE AC BLOCK 1,
6837         CAMN T,AC1PTR           ;COPY THEM INTO UUOACS WHERE THEY BELONG.
6838          XCTR XBR,[BLT T,UUOACS+17(U)]
6839 ] ;IFE KA10P
6840         MOVEI T,AC0S(U)
6841         HRLI T,UUOACS(U)
6842         BLT T,AC17S(U)
6843         JRST POPJ1              ;EXIT AFTER BACKING UP TO UUO
6844 \f;
6845 ; AOS USTP OF USER IN A
6846 ;
6847 NJRPCL: CAIE A,-1       ;ENTRY TO IGNORE IF NULL JOB
6848 RPCLSR: CAMN A,USER     ;NORMAL ENTRY
6849         POPJ P,         ;TRYING TO RPCLSR SELF OR NULL JOB
6850         PCLT
6851         PUSH P,U        ;SAVE U
6852         MOVE U,A        ;GET INDEX OF RPCLSRED JOB IN U
6853         MOVE A,USER     ;GET RPCLSRING USER INDEX IN A
6854         CONO PI,CLKOFF  ;TURN OFF CLOCK BREAKS
6855         PUSHJ P,PCLSR   ;PUT USER IN USER MODE
6856         JRST RPCLOS     ;JUMP IF CAN'T DO IT RIGHT NOW
6857         AOS USTP(U)     ;WIN,STOP USER
6858         CONO PI,CLKON   ;RE-ENABLE CLOCK BREAKS
6859 RPCLS1: MOVE A,U        ;RESTORE A
6860         POP P,U         ;RESTORE U
6861         POPJ P,
6862 ;
6863 RPCLOS: SKIPE RPCL(U)   ;SKIP IF ZERO RPCL FOR USER BEING RPCLSRED
6864         JRST RPCLS2     ;SOMEONE GOT THERE FIRST
6865         SKIPE RPCL(A)   ;SKIP IF ZERO RPCL FOR RPCSRING USER
6866         JRST UDELAY     ;YOU ARE BEING RPCLSR'ED, SURRENDER
6867         HRROM A,RPCL(U) ;SET UP RPCL IN VARS OF RPCLSRED USER
6868         HRRM U,RPCL(A)  ;" OF RPCLSRING USER
6869         PCLT
6870         SKIPE RPCL(A)   ;WILL NOT SKIP AT FIRST
6871         PUSHJ P,UFLS    ;WAIT FOR PERSON BEING RPCLSRED TO GET TO ONEFL2
6872         JRST RPCLS1
6873 ;
6874 RPCLS2: MOVE A,U        ;RESTORE A AND U
6875         POP P,U
6876         PCLT
6877         SKIPE RPCL(A)   ;WAIT FOR OTHER GUY TO WIN
6878         PUSHJ P,UFLS
6879         JRST RPCLSR     ;THEN TRY AGAIN
6880
6881 ;
6882 ; UNDO AN RPCLSR
6883 ;
6884 NJUPCL: CAIE A,-1       ;ENTRY TO IGNORE IF NULL JOB
6885 UPCLSR: CAMN A,USER     ;REGULAR ENTRY
6886         POPJ P,         ;TRYING TO UPCLSR SELF OR NULL JOB
6887         SOSGE USTP(A)
6888          BUG
6889         POPJ P,
6890
6891 IFN KA10P,[
6892 ;
6893 ; RETURN FROM SYSTEM CALL IN ONE PROCEED MODE
6894 ;
6895 ONEPROC:CONO PI,CLKOFF  ;TURN OFF CLOCK BREAKS
6896         MOVE U,USER     ;BE SURE U HAS RUNNING USER INDEX IN IT
6897         MOVEI T,%PI1PR
6898         IORM T,PIRQC(U) ;GIVE USER INTERRUPT
6899         JRST ONEPR2
6900 ]
6901 \f
6902 SUBTTL KS-10 ONE-PROCEED
6903
6904 IFN KS10P,[
6905 ONEPRO: SYSCTX                  ;SWITCH TO SYSTEM AC BLOCK
6906         SKIPGE U,USER
6907          BUG AWFUL,[ONE-PROCEED IN NULL JOB]
6908         MOVE T,1PROPC(U)        ;PC OF NEXT INSTRUCTION TO EXECUTE
6909         TLNE T,%PSUSR           ;NORMALLY USER MODE IS EXPECTED
6910          JRST ONEPR3
6911         HRRZ T,T                ;SEE IF IT'S FIRST INSTRUCTION OF EXEC ENTRY
6912         CAIE T,UUOH0
6913          CAIN T,MUUOTR
6914           SKIPA TT,[JRST ONEPR4]
6915            BUG AWFUL,[ONE-PROCEED IN EXEC MODE],OCT,1PROPC(U)
6916         MOVEM TT,UEXIT          ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
6917         CAIE T,UUOH0            ;AND RESUME PROCESSING UUO
6918          JRST [ USRCTX
6919                 JRST MUUOTR ]
6920         USRCTX
6921         JRST UUOH0
6922
6923 ONEPR3: MOVEM T,UUOH            ;PUT USER PC WHERE ONEFLS WANTS IT
6924 ONEPR4: SYSCTX                  ;COME HERE WHEN ONE-PROC'D UUO FINISHES
6925         MOVE U,USER             ;BE SURE U HAS RUNNING USER INDEX IN IT 
6926         MOVEI T,%PI1PR
6927         IORM T,PIRQC(U)         ;GIVE USER INTERRUPT
6928         JRST ONEFLS
6929 ];KS10P
6930 \f
6931 SUBTTL USER START ROUTINES
6932 ;
6933 ; CALLED EVERY SLOW CLOCK TICK WHEN TTY WANTING TOP PROCEDURE LOADED
6934 ;
6935 USTART: PUSH P,U
6936 USTRT1: SKIPL T,@UTTYO  ;GET TTY TO BE STARTED
6937          JRST [ MOVE U,MMPFR    ;WHEN STARTING A HACTRN, MAKE SURE CORE IS AVAILABLE
6938                 CAIGE U,100
6939                  JRST USTRTL    ;IT'S NOT, SAY SYSTEM FULL
6940                 JRST .+2 ]      ;T HAS INITIAL TTYTBL
6941          MOVSI T,%TBNOT+%TBDTY+%TBNVR   ;NOT A REAL TTY, INITIALIZE TTYTBL TO NO TTY
6942         PUSHJ P,USTRA   ;CREATE NEW USER SLOT ENTRY
6943          JRST USTSC1    ;LOSE, HAVE TO WAIT
6944         SKIPGE T,@UTTYO ;SKIP IF REALLY A TTY
6945          JRST USTRTS    ;DONT LOAD A HACTRN
6946         MOVE T,[SIXBIT /HACTRN/]        ;LOAD HACKTRN
6947 USTRT2: MOVEM T,JNAME(U)        ;SET JOB NAME
6948         MOVEM T,XJNAME(U)
6949         HRLZI T,%PCUSR
6950         HRRI T,1
6951         MOVEM T,UPC(U)
6952         MOVEI T,AC0S(U)
6953         HRLI T,NUSTCD
6954         BLT T,AC17S(U)
6955         MOVE T,JNAME(U)
6956         MOVEM T,AC0S+11(U)
6957         SETZM @UTMPTR(U)        ;GIVE TEMPORARY HIGH PRIORITY
6958         SETZM USTP(U)   ;START UP
6959 USTSC2: AOS T,UTTYO     ;AOS RING BUFF
6960         CAIL T,UTTYS+MXCZS
6961          MOVEI T,UTTYS
6962         MOVEM T,UTTYO
6963         SOSE UTTYCT
6964          JRST USTRT1    ;MORE JOBS TO SET UP
6965         JRST POPUJ
6966
6967 USTRTS: MOVEM U,1(T)    ;STORE USER'S INDEX IN SECOND WORD
6968         MOVE T,(T)      ;GET JNAME FROM FIRST WORD (POINTED TO BY RH OF @UTTYO)
6969 IFN DEMON,[
6970         CAME T,[SIXBIT /LDRDEM/]
6971          CAMN T,[SIXBIT /UNSPOO/]
6972           AOS UTMPTR(U)         ;LOADER, UNSPOOLER -> SYSTEM TREE
6973 ]
6974         JRST USTRT2
6975
6976 USTSC1: MOVE U,USRHI    ;IF A USER IS ^Z'ING AND THERE IS NO POSSIBILITY
6977         SKIPL T,@UTTYO  ;OF GETTING MORE JOB SLOTS,
6978          CAIGE U,LUBLK*MAXJ
6979           JRST POPUJ
6980 USTRTL: MOVSI U,%TANJS  ;THEN MARK THE TTY AS IN NEED OF A "SYSTEM FULL" MESSAGE
6981         IORM U,TTYSTA(T)
6982         MOVEI U,SCRCFM  ;AND WAKE UP THE SYS JOB.
6983         IORM U,SUPCOR
6984         JRST USTSC2     ;REMOVE THIS TTY FROM LIST OF THOSE NEEDING A ^Z.
6985 \f
6986 ;GOBBLE NEW USER SLOT, RESET VARIABLES (SKIPS IF IT WINS)
6987 ;RETURNS INDEX IN U.  IF FAILS, CLOBBERS U!
6988 USTRA:  MOVEI U,0
6989 USTR3:  CAML U,USRHI
6990          JRST USTR1     ;ASSIGN MORE CORE TO USER STORAGE
6991         SKIPN UNAME(U)
6992          JRST USTR2     ;HAVE FOUND FREE USER SLOT (IN U)
6993         ADDI U,LUBLK
6994         JRST USTR3
6995
6996 USTR1:  SKIPGE SJCFF
6997          POPJ P,        ;SYSTEM JOB FLUSHING CORE, WAIT UNTIL IT STABILIZES
6998         MOVEI U,LUBLK   ;MOVE UP USRHI IF SYS HAS ENOUGH CORE
6999         ADD U,USRHI
7000         PUSH P,T
7001         MOVE T,HUSRAD   ;LENGTH OF SYS
7002         CAIGE T,USRSTG(U)
7003          JRST MORCOR    ;SYS NEEDS MORE CORE FOR USER VARIABLES
7004         POP P,T
7005 USSINI: SETOM USTP-LUBLK(U)     ;SYS INITIALIZATION ENTRY
7006         EXCH U,USRHI
7007 USTR2:  PUSHJ P,USTR4   ;RESET USER VARIABLES
7008         MOVEI T,SIOCHN-1(U)
7009         MOVEM T,SIOCP(U)
7010         CLEARM IOCHNM(U)
7011         HRLI T,IOCHNM(U)
7012         HRRI T,IOCHNM+1(U)
7013         BLT T,IOCHNM+17(U)      ;CLEAR ALL I/O CHANNELS
7014 USRST4: HRLI T,AC0S(U)
7015         HRRI T,AC0S+1(U)
7016         SETZM AC0S(U)
7017         BLT T,AC17S(U)  ;CLEAR AC'S & RETURN HAPPY
7018         JRST POPJ1
7019
7020 MORCOR: SUB P,[1,,1]
7021         MOVSI T,SCLDEC
7022         ANDCAM T,SUPCOR ;CLEAR ANY SYS CORE DECREASE REQ
7023         MOVSI T,SCLEX
7024         JRST SUPSET     ;REQUEST MORE CORE FROM SYS JOB
7025 \f;
7026 ; INITIALIZE A SET OF USER VARIABLES
7027 ;  T HAS INITIAL TTYTBL, POSITIVE IT IS TTY # ELSE NO TTY
7028 USTR4:  MOVEM T,TTYTBL(U)
7029         JUMPL T,USTR4B
7030         PUSH P,U
7031         HRRM U,TTYSTS(T) ;TELL TTY IT NOW BELONGS TO NEW JOB,
7032         MOVSI U,%TSCNS  ;AND IS NOW A CONSOLE.
7033         IORM U,TTYSTS(T)
7034         MOVSI U,%TSFRE
7035         ANDCAM U,TTYSTS(T)      ;AND IS NO LONGER FREE
7036         MOVSI U,%TACFM+%TACTZ
7037         ANDCAM U,TTYSTA(T)      ;AND WILL NEED CONSOLE FREE MESSAGE
7038         POP P,U
7039         ADDI T,USRRCE
7040 USTR4A: MOVEM T,UTMPTR(U)
7041         HRROI T,'000
7042         MOVEM T,UNAME(U)
7043         PUSH P,U
7044         MOVE T,U
7045         IDIVI T,LUBLK
7046         POP P,U
7047         DPB T,[000300,,UNAME(U)]
7048         LSH T,-3
7049         DPB T,[060300,,UNAME(U)]
7050         LSH T,-3
7051         DPB T,[140300,,UNAME(U)]
7052         MOVE T,UNAME(U)
7053         MOVEM T,XUNAME(U)
7054         MOVEM T,HSNAME(U)
7055         MOVE T,JNAME(U)
7056         MOVEM T,XJNAME(U)
7057         MOVEI T,(U)
7058         HRLI T,%TSCNS
7059         MOVEM T,TTSTSV+2(U)
7060         SETZM USWST(U)
7061 IFN SWPWSP,[    
7062         SETZM UWRKST(U)
7063         SETZM USVWRK(U)
7064         MOVE T,TIME
7065         ADDI T,2*30.    ;PROTECT FROM SWAPOUT FOR 2 SECONDS (RANDOMLY)
7066         MOVEM T,USWTIM(U)
7067 ];SWPWSP
7068         SETZM NSWPGS(U)
7069         SETZM NMPGS(U)
7070         SETOM JBI(U)            ;NOT JOB DEVICE HANDLER (NOT YET, ANYWAY)
7071         SETZM OPTION(U)
7072         SETZM STTYOP(U)
7073         SETOM TRNLST(U)         ;INIT TRANSL LISTS TO NIL
7074         SETOM TRNLS1(U)
7075         SETZM HUSRAD(U)
7076         JUMPE U,.+5             ;SYSTEM JOB DOESN'T HAVE A MAP
7077                 CLEARM UPGMP(U)
7078                 MOVSI T,UPGMP(U)
7079                 HRRI T,UPGMP+1(U)
7080                 BLT T,UPGCP+NUVPG/2-1(U)
7081         MOVSI T,(MOVEM U,)
7082         HRRI T,AC17S(U)
7083         MOVEM T,SCLUSV(U)
7084 IFE KA10P,[
7085         MOVSI T,(DATAI PAG,)
7086         HRRI T,CLCX(U)
7087         MOVEM T,SCLCXS(U)
7088         MOVEI T,USRSTG(U)
7089 IFN KL10P, LSH T,-9
7090         HRLI T,701100
7091         MOVEM T,CLCX(U)
7092         MOVSI T,(JRST 2,@)
7093         HRRI T,XUUOH(U)
7094         MOVEM T,SUEXIT(U)
7095         MOVSI T,(CAI)           ;INITIALLY IGNORE TRAPS 1 AND 2
7096         MOVEM T,TR1INS(U)
7097         MOVEM T,TR2INS(U)
7098 IFE KS10P,MOVEI T,%PI1PR        ;TRAP 3 IS IGNORED TOO ON KS
7099         MOVEM T,TR3INS(U)       ;TRAP 3 GIVES ONE-PROCEED INTERRUPT ON KL
7100 ] ;IFE KA10P
7101 IFN KL10P,[
7102         SETZM ULSPBR(U)
7103         MOVSI T,MUUOKN          ;UUO NEW PC'S ARE SAME AS SYS JOB'S,
7104         HRRI T,MUUOKN(U)        ; EXCEPT THAT UUO IN EXEC MODE IS AN ERROR
7105         BLT T,MUUOPT(U)
7106         MOVEI T,MUUOEX
7107         HRRM T,MUUOKN(U)
7108 ] ;KL10P
7109 IFN KS10P,[
7110         MOVE T,[%PSPCU,,MUUOEX]
7111         MOVEM T,MUUOKN(U)       ; UUO in Exec mode is an error
7112         MOVEM T,MUUOKT(U)       ; (either case)
7113         HRRI T,UUOH0
7114         MOVEM T,MUUOCN(U)       ; Normal UUO
7115         HRRI T,MUUOTR
7116         MOVEM T,MUUOCT(U)       ; UUO as trap instruction
7117         HRRI T,ONEPRO
7118         MOVEM T,1PRNPC(U)       ; One-proceed jumps to ONEPRO
7119 ] ;KS10P
7120 IFN KA10P,[
7121         MOVE T,[JRST 2,@UUOH]
7122         MOVEM T,SUEXIT(U)
7123 ] ;KA10P
7124         MOVSI T,BUSRC
7125         MOVEM T,USTP(U)
7126         SETOM SUPPRO(U)
7127         SETZM UCLBLK(U)
7128         SETOM UCLBLK+1(U)
7129         MOVE T,[JRST UREALB]
7130         MOVEM T,UCLBLK+2(U)
7131         CLEARM UPGML(U)         ;CLEAR USER PG MAP VARIABS
7132         MOVEI T,UPGML+1(U)
7133         HRLI T,-1(T)
7134         BLT T,UPGMLE(U)
7135 IFN KA10P,[
7136         MOVSI T,1+EXPGNG        ;DONT ENABLE QUAN COUNTER FOR NOW (BUT SET
7137                                 ; EXEC PAGING)
7138         MOVEM T,UPQUAN(U)
7139         MOVE T,EXECMP
7140         MOVEM T,UPDBR3(U)       ;SET UP EXEC DBR
7141         MOVSI T,IFN MCOND DM,[1040] .ELSE [0] ;ON DM, B+C MEMORIES DON'T WORK
7142         MOVEM T,UPACP(U)        ;SET UP B+C MEMORY PTRS
7143 ] ;KA10P
7144 IFN KS10P, SETZM UPQUAN(U)      ; Clear quantum counter.
7145
7146 ;DROPS THROUGH
7147 \f
7148 ;DROPS THROUGH, AND .RESET OF USR DEVICE COMES HERE.
7149 USRST2: MOVE T,UNAME(U)
7150         MOVEM T,USYSNM(U)       ;CLOCK MUST BE OFF OR PI IN PROG ON 7
7151         MOVE T,TIME             ;DON'T SWAP JOB OUT RIGHT AWAY
7152         MOVEM T,LUBTM(U)
7153         PUSH P,A
7154         PUSH P,B
7155         PUSH P,C
7156         PUSH P,E
7157         MOVEI C,UCLBLK(U)
7158         SKIPL 1(C)
7159          JSP E,CLQCLR
7160         SETOM SERVER(U)
7161         SETZM PAGAHD(U)
7162         SETZM PAGRAN(U)
7163         SETZM UWHO1(U)
7164         SETZM UWHO2(U)
7165         SETZM UWHO3(U)
7166 IFN N11TYS,[
7167         SETZM NVDBA(U)  ;0 VIDEO BUFFERS ASSIGNED BY JOB.
7168         SETOM TVCREG(U)
7169         SKIPL T,TTYTBL(U)
7170          PUSHJ P,USTTV0
7171           SETOM TVVBN(U)
7172 USTTV1: ];N11TYS
7173         POP P,E
7174         POP P,C
7175         POP P,B
7176         POP P,A
7177         SETZM URTIME(U)
7178         SETZM UTIME(U)
7179         SETOM RTIMER(U)
7180         MOVSI T,%PCUSR
7181         MOVEM T,UPC(U)
7182         HRLI T,-LUPDL
7183         HRRI T,UPDL-1(U)
7184         MOVEM T,USRPDL(U)
7185         SETZM MSKST(U)
7186         SETZM MSKST2(U)
7187         MOVE T,[20,,40]
7188         MOVEM T,40ADDR(U)
7189         MOVEI T,APRCHN+440
7190         MOVEM T,APRC(U)
7191         SETZM USTYN(U)
7192         SETZM PIRQC(U)
7193         SETZM IFPIR(U)
7194         SETZM IDF1(U)
7195         SETZM IDF2(U)
7196         SETOM PICLR(U)
7197         SETZM FLSINS(U)
7198         SETZM UTRNTM(U)
7199 IFN KL10P,[
7200         SETZM EBOXCT(U)
7201         SETZM EBOXCT+1(U)
7202         SETZM MBOXCT(U)
7203         SETZM MBOXCT+1(U)
7204 ]
7205         SETZM USIPRQ(U)
7206         SETZM TRUNTM(U)
7207         SETZM TSIPRQ(U)
7208 IFE SWPWSP,[
7209         SETZM LTRNTM(U)
7210         SETZM LSIPRQ(U)
7211         SETZM UPGSEC(U)
7212 ];SWPWSP
7213         SETZM IOTLSR(U)
7214         MOVSI T,%OPOJB          ;USR RESET DOESN'T CLEAR OJB OPTION BIT
7215         ANDM T,OPTION(U)
7216         SETOM CORRQ(U)
7217         POPJ P,
7218
7219 USTR4B: MOVEI T,USRRCE+NCT
7220         JRST USTR4A
7221
7222 IFN N11TYS,[
7223 ;SET UP THE BLINKER FOR THE JOB IN U.
7224 USTTV0: SKIPN TEN11F
7225          SKIPL TT11P
7226           POPJ P,
7227         HRL T,TTYTYP(T)
7228         TLNN T,%TY11T
7229          POPJ P,        ;NOT A TV
7230         MOVE A,TT11HD   ;11 HEADER ADR
7231         ADDI A,-NF11TY(T)
7232         LDB B,[141000,,1(A)]    ;VIDEO BUFFER #
7233         TRO B,17_8      ;CSET ALU FCTN
7234         LSH B,4+16.     ;INTO POSITION FOR MOVEMING INTO CONSOLE REG
7235         MOVEM B,TVVBN(U)
7236         JRST POPJ1
7237 ] ;END IFN N11TYS
7238 \f
7239 ;       USER START CODE
7240
7241 NUSTCD: JFCL            ;0
7242         .OPEN 1,7
7243          .LOGOUT        ;2
7244         .CALL 12
7245          .LOGOUT
7246         .IOT 1,2
7247         JRST (2)
7248         .UII,,(SIXBIT/SYS/)     ;7
7249         SIXBIT /ATSIGN/
7250         SIXBIT /HACTRN/
7251         SETZ            ;12
7252         SIXBIT /LOAD/
7253         16
7254         SETZ 17
7255         -1              ;16
7256         1               ;17
7257
7258 USTCDR: SYSCTX          ;GOT HERE FROM ULEAVE WHICH SELECTED THE USER ACS,
7259         MOVE U,USER     ; SELECT SYSTEM ACS INSTEAD.
7260         MOVEI A,USTCDR+1        ;COME BACK HERE IN CASE OF PCLSR
7261         MOVEM A,UUOH
7262         MOVE P,USRPDL(U)
7263         PUSHJ P,UBLAM
7264         MOVE U,USER
7265         MOVSI T,NUSTCD
7266         XCTR XBW,[BLT T,17]
7267         MOVE T,JNAME(U)
7268         UMOVEM T,11
7269         MOVE T,[%PCUSR,,1]
7270         MOVEM T,UUOH
7271         JRST URET
7272 \f
7273 SUBTTL USER KILL ROUTINES
7274
7275 ;
7276 ; CLOSE ALL DEVICES AND INFERIOR PROCEDURES OF A JOB (INDEX IN U)
7277 ;
7278 IODCL:  MOVNI I,1       ;SET TO STOP
7279         PUSHJ P,IODCL3  ;STOP ALL INFERIOR JOBS (RECURSIVE)
7280         MOVEI I,0       ;THEN KILL.
7281 IODCLA: PUSH P,I
7282         MOVE A,OPTION(U)
7283         TLNE A,%OPLOK   ;IF USER HAS ENABLED THE SWITCH-UNLOCK FEATURE,
7284          PUSHJ P,IODCSW ;UNLOCK HIS LOCKED SWITCHES.
7285 IFN 340P\E.SP,  PUSHJ P,ADCLOSE ;FLUSH DISPLAY
7286 IFN IMXP,       PUSHJ P,POTCLS  ;DISCONNECT HIS POTS
7287 IFN VIDP,[
7288         CAMN U,SCNUSR
7289          PUSHJ P,SCNSTP ;KILL SCANNER IF HIS
7290 ]
7291 IFN ARMP,       PUSHJ P,AARMOFF ;FLUSH ARM
7292 IFN DEMON,      PUSHJ P,DEMOUT  ;FLUSH EXISTANCE (CURRENT OR FORMER) AS DAEMON.
7293 IFN N11TYS,[
7294         SKIPE NVDBA(U)
7295          PUSHJ P,VBDFLS ;DEASSIGN ALL VIDEO BUFFERS.
7296 ]
7297 IFN KL10P,[
7298         CAMN U,MTRUSR   ;DEASSIGN THE PERFORMANCE COUNTER
7299          PUSHJ P,PRFOFF
7300 ];KL10P
7301         PUSHJ P,CLQDEL  ;RELEASE AND STOP CLOCK QUEUE BLOCK
7302          UCLBLK(U)
7303         HRRZ A,UREALT
7304         CAMN A,U
7305          SETOM UREALT   ;UN REAL TIME
7306         CAMN U,UMASTER  ;UNMASTER
7307          SETOM UMASTER
7308         PUSHJ P,AIOPDL  ;POP UP ALL OF IO PDL (CLOSING CHNLS POPPED INTO)
7309         MOVEI R,IOCHNM(U)
7310 IODCL1: PUSHJ P,CCLOSE  ;CLOSE ALL CHANNELS
7311         CAIGE R,IOCHNM+NIOCHN-1(U)
7312          AOJA R,IODCL1
7313         PUSH P,U
7314         SKIPGE T,JBI(U) ;IF THIS JOB IS A JOB-DEVICE,
7315          JRST IODCL2
7316         HRROS JBCJUI(T) ;TELL THE JOB CHANNEL THAT THE HANDLER IS GONE.
7317         CONO PI,CLKOFF
7318         SKIPGE JBCG(T)  ;IF OUR CREATOR STILL HAS A JOB CHANNEL,
7319          JRST IODCL6
7320         MOVE A,JBCUI(T) ;FLUSH THE CREATOR'S JOB CHANNELS,
7321         CONO PI,CLKON
7322         PUSHJ P,RPCLSR  ;STOPPING THE CREATOR IN CASE HE'S USING THEM NOW.
7323         MOVE T,JBI(U)   ;RPCLSR CLOBBERS T.
7324         MOVSI C,%CLSJ
7325         PUSHJ P,CHSCAA
7326             PUSHJ P,[HRRZ B,(R)
7327                      TDNN C,CLSTB(B)
7328                       POPJ P,
7329                      HLRZ B,(R)
7330                      CAMN B,T
7331                       SETZM (R)
7332                      POPJ P,]
7333         PUSHJ P,UPCLSR  ;ALLOW THE CREATOR TO CONTINUE AND GET IOC ERROR OR RETRY OPEN
7334 IODCL6: CONO PI,CLKON
7335         SETOM JBCUI(T)  ;FLUSH THE JOB-DEVICE SLOT.
7336         SETOM JBI(U)    ;SAY THIS JOB NO LONGER A JOB-DEVICE.
7337         JRST IODCL2
7338
7339 IODCL3:  PUSH P,I       ;I=0 KILL I=-1 STOP I=1 JUST CLOSE CHANNELS.
7340         PUSH P,U
7341 IODCL2: MOVEI A,0
7342 IODCL4: HRRZ E,SUPPRO(A)
7343         SKIPE UNAME(A)  ;SKIP IF VARIABLES BLOCK IDLE
7344         CAIE E,(U)      ;SKIP ONLY IF IT IS A DIRECT INF.
7345         JRST IODCL5     ;TRY NEXT SET OF VARS
7346         PUSH P,A
7347         MOVE U,A
7348         PUSHJ P,1USTOP  ;STOP (WITH BUSRC BIT)
7349         MOVE R,P
7350         MOVE P,USRPDL(U)
7351         PUSH P,R
7352         SKIPGE I,-2(R)
7353         JRST IODCL8     ;STOP
7354         PUSHJ P,IODCLA  ;KILL OR CLOSE CHNLS, RECURSE
7355 IODCL9: MOVE P,(P)
7356         SKIPE -2(P)     ;KILLING?
7357         JRST IODCL7     ;JUST CLOSING CHNLS.
7358         MOVE A,U        ;KILLING; WAIT TILL NO OTHER JOB
7359         PUSHJ P,AUCL3   ;IS LOOKING AT THE ONE THAT WE'RE KILLING.
7360         PUSHJ P,UBLST2  ;FLUSH CORE
7361         SETZ R,
7362         PUSHJ P,ZUSLOG  ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
7363         CONO PI,CLKON
7364 IODCL7: POP P,A
7365         HRRZ U,(P)
7366 IODCL5: ADDI A,LUBLK
7367         CAMGE A,USRHI
7368         JRST IODCL4     ;LOOP FOR ALL SETS OF USER VARIABLES
7369         POP P,U
7370         SUB P,[1,,1]
7371         POPJ P,
7372
7373 IODCL8: PUSHJ P,IODCL3
7374         JRST IODCL9
7375 \f
7376 ;SYSTEM CALL UNLOCK.  1 ARG, A JOB SPEC.
7377 ;THAT JOB'S LOCKS ARE ALL UNLOCKED.
7378 NUNLOCK:
7379         MOVE J,A
7380         JSP T,NCORUI    ;DECODE THE JOB SPEC.
7381          JRST NUNLO1     ;WE'RE CERTAINLY ALLOWED TO WRITE THIS JOB.
7382         JUMPE U,NUNLO1  ;SYSTEM JOB CAN DO IT TO ANYBODY
7383         JSP T,NCORWR    ;NOT SURE, SO CHECK.
7384          JRST OPNL31     ;NO, NOT ALLOWED.
7385 NUNLO1:
7386 IFN PDP6P,[
7387         CAIN J,-1
7388          JRST OPNL34
7389 ];PDP6P
7390         ;THE CALL IS ALLOWED, SO UNLOCK THAT JOB'S LOCKS
7391         CAMN J,USER
7392          JRST NUNLO2
7393         MOVE A,J                ; If not self,
7394         PUSHJ P,RPCLSR          ; assure a User mode PC
7395         PUSHJ P,SOSSET
7396          USTP(A)
7397         JRST NUNLO3
7398
7399 NUNLO2: MOVE A,UUOH             ; If we are asked to unlock
7400         SUBI A,1                ; our own locks, put our PC in
7401         MOVEM A,SRN3(U)         ; SRN3 where IODCSW will look for it
7402 NUNLO3: MOVE U,J
7403         MOVE A,OPTION(U)
7404         TLNE A,%OPLOK           ; Provided it is using locks at all...
7405          PUSHJ P,IODCSW
7406         CAME U,USER
7407          PUSHJ P,LSWPOP         ; USTP
7408         JRST LSWPJ1             ; DIELOK
7409         ; Returns with U clobbered, which seems to be OK for .CALL's?
7410
7411
7412 ;CALL HERE TO UNLOCK THE SWITCHES A JOB HAS LOCKED (USER IDX IN U).
7413 ;LOCATION 43 (ACTUALLY, 3+C(40ADDR)) HAS THE LIST POINTER. 0 IS NIL.
7414 ;ANYTHING ELSE POINTS TO 2-WORD BLOCK; THE 1ST WORD IS THE SWITCH OR THE
7415 ;ADDRESS OF THE SWITCH. THE RH OF THE SECOND IS THE CDR OF THE LIST.
7416 ;THE LH OF THE SECOND IS THE UNLOCK INTRUCTION. THE INDEX FIELD IS IGNORED,
7417 ;ONE LEVEL OF INDIRECTION IS PERMITTED, AND THE INSN MUST BE EITHER
7418 ;AOS OR SOS WITH 0 IN AC FLD, A LOGICAL INSTRUCTION (TOP 3 BITS = 4),
7419 ;A HALFWORD INSTRUCTION, OR A MOVE,MOVN,MOVS,MOVN,ADD OR SUB SERIES INSN,
7420 ;OR 0 WHICH MEANS SETOM. ONLY INSNS THAT MODIFY MEMORY ARE USEFUL.
7421 ;44 IS AN AOBJN POINTER TO THE CRITICAL RTNS TABLE, OF 2-WORDS ENTRIES.
7422 ;THE 1ST WORD EACH IS <BEGINNING OF RANGE>,,<END OF RANGE>+1.
7423 ;THE SECOND IS THE UNLOCK INSTRUCTION, WITH THE ADDRESS OF THE SWITCH
7424 ;IN THE RH (AGAIN, 1 LEVEL OF INDIRECTION IS PERMITTED).
7425 ;IF THE PC IS IN THAT RANGE, THE UNLOCK INSN IS EXECUTED.
7426 ;43 AND 44 ARE UPDATED DURING PROCESSING TO PREVENT PCLSR LOSSAGE.
7427 ;SEE .INFO.;ITS LOCKS
7428
7429
7430 ;MACRO TO DO XCTR, OR POPJ IF THAT WOULD CAUSE INTERRUPT.
7431 DEFINE XCTRIJ
7432         JSP TT,IODCXC
7433         XCTR!TERMIN
7434
7435 ; IODCSW: Unlock locks for user in U
7436 ; User should be stopped so that he is in user mode.
7437 ; The only exception is if we are unlocking the locks of the running job,
7438 ; in which case the contents of SRN3 will be used as our PC.
7439 ; Clobbers just about everything except U.
7440 IODCSW: PUSH P,U
7441         PUSHJ P,IODCS0          ; Do actual work, if any...
7442         MOVE U,USER             ; But be sure to always
7443         PUSHJ P,MPLDZ           ; restore normal page map of running user.
7444         JRST POPUJ              ; And U
7445
7446 IODCS0: HRRZ J,U
7447         MOVE U,USER     ;SET UP MAP TO USER BEING HACKED (IDX IN J).
7448         PUSHJ P,MPLDJ   ;LH(J) CLOBBERED, RH SAVED.
7449         HRRZ U,J        ;U HAS WHAT IT HAD AT CALL (USR BEING HACKED).
7450         MOVEI C,1000    ;COUNT LENGTH OF LIST SO CIRCULAR LISTS DON'T HANG US UP.
7451         HRRZ E,40ADDR(U)
7452         XCTRIJ XRW,[MOVES B,3(E)] ;GET HIS "43" (AND MAKE SURE IT'S WRITABLE)
7453 IODCS1: JUMPE B,IODCS2          ;REACHED END OF LOCKED SWITCH LIST, MAYBE?
7454         XCTRIJ XR,[HLL B,1(B)]  ;MERGE LOCK INSN WITH ADDR OF SWITCH.
7455         PUSHJ P,IODCDO          ;EXECUTE THE UNLOCK INSN
7456          POPJ P,                 ;IODCDO DETECTED MPV OR PUR INTERRUPT.
7457         XCTR XR,[HRRZ B,1(B)]   ;REPLACE LIST BY ITS CDR.
7458         UMOVEM B,3(E)
7459         SOJG C,IODCS1
7460
7461 IODCS2: XCTRIJ XRW,[MOVES E,4(E)]       ;GET JOB'S "44", AND MAKE SURE IT'S WRITEABLE.
7462         HRRZ C,UPC(U)           ;GET ITS PC, FOR COMPARISON.
7463         CAMN U,USER             ; Except if this is us,
7464          HRRZ C,SRN3(U)         ; then unlock PC is in SRN3
7465         JUMPGE E,CPOPJ          ;THERE ARE NO PROTECTED RANGES => DONE.
7466 IODCS3: XCTRIJ XR,[MOVS B,(E)]  ;GET BOUNDS OF NEXT PROTECTED RANGE.
7467         CAIGE C,(B)             ;IS PC ABOVE LOWER BOUND?
7468          JRST IODCS4
7469         MOVSS B
7470         CAIL C,(B)              ;IS IT BELOW UPPER?
7471          JRST IODCS4
7472         XCTRIJ XR,[MOVE B,1(E)] ;PC IS IN THIS RANGE; GET UNLOCK INSN
7473         PUSHJ P,IODCDO          ;EXECUTE IT
7474          POPJ P,                ;NO SKIP => MPV OR PUR INTERRUPT DETECTED.
7475 IODCS4: ADD E,[2,,2]            ;CHECK ALL ENTRIES IN CRITICAL RTN TABLE, 1 BY 1.
7476         HRRZ B,40ADDR(U)        ;UPDATE 44 SO ENTRIES ALREADY PROCESSED ARE
7477         UMOVEM E,4(B)           ;ACTUALLY IN THE TABLE. THIS IS IN CASE PCLSR.
7478         JUMPL E,IODCS3
7479         POPJ P,
7480 \f
7481 ;PRECEDE AN XCTR WITH JSP TT,IODCXC TO POPJ IF THE XCTR WOULD
7482 ;CAUSE AN INTERRUPT (MPV OR PUR). CLOBBERS A,T,Q.
7483 IODCXC: MOVEI A,@(TT)   ;GET EFFECTIVE ADDR OF XCTR.
7484         MOVEI A,@(A)    ;GET EFFECTIVE ADDR OF XCTR'ED INSN.
7485         LSH A,-10.      ;GET PAGE # BEING REFERENCED.
7486         PUSHJ P,UPLC    ;SET T = B.P. TO PAGE MAP HALFWORD. CLOBBERS Q.
7487         LDB T,T
7488         TRNE T,600000   ;IF PAGE IS SWAPPED IN, PUT ACCESS BITS IN
7489          LSH T,-20      ;SAME PLACE THEY ARE WHEN SWAPPED OUT (LOW 2 BITS).
7490 ;FOLLOWING CODE COMMENTED OUT BECAUSE IT DOESN'T WORK ON THE KL10 XCTR
7491 ;       TRNE T,2        ;CHANGE CODE 2 (READ-WRITE, NOT WRITTEN) TO 3 (READ-WRITE).
7492 ;        IORI T,1
7493 ;       LSH T,27        ;PUT ACCESS CODE IN AC FIELD, AND TEST
7494 ;       ANDCA T,(TT)    ;AGAINST WHAT THE XCTR WILL TRY TO DO.
7495 ;       TLNN T,(0 3,)   ;ALL DESIRED ACCESS AVAILABLE =>
7496 ;        JRST (TT)      ;WE WIN.
7497 ;       POPJ P,         ;ELSE QUIT OUT OF CALLING ROUTINE.
7498 ;
7499 ;FOLLOWING CODE INSERTED INSTEAD.  THIS RELIES ON THE FACT
7500 ;THAT ONLY THE FOLLOWING INSTRUCTIONS ARE XCTRIJ'ED:
7501 ; BOOLE,HWT,MOVXX,ADDX,SUBX,AOSX,SOSX
7502         MOVE A,@(TT)    ;GET INSTRUCTION XCTR'ED
7503         TLC A,300000
7504         TLCE A,300000   ;SKIP IF AOS OR SOS
7505          TLNE A,002000  ;SKIP IF DOESN'T WRITE IN MEMORY
7506           TRNE T,2      ;INSTRUCTION WRITES, SKIP IF RW OR RWF ACCESS NOT PRESENT
7507            TRNN T,3     ;INSTRUCTION READS, SKIP IF ANY ACCESS PRESENT
7508             POPJ P,     ;INSUFFICIENT ACCESS, QUIT OUT OF CALLING ROUTINE
7509         JRST (TT)       ;WINNING, GO DO THE XCTR
7510
7511 ;PUSHJ P,IODCDO WITH INSN IN B TO XCTRIJ IT, CHECKING FOR LEGALITY
7512 ;AND PERFORMING ONE LEVEL OF INDIRECTION IF THE @ BIT IS SET.
7513 ;(WE CAN'T AFFORD AN INFINITE LOOP WHILE KILLING A JOB EVEN IF IT IS
7514 ;INTERRUPTABLE)
7515 ;INDEX FIELD IS IGNORED. IF THE OPCODE IS 0, SETOM IS USED INSTEAD.
7516 ;SKIPS IF INSN IS LEGAL AND DOESN'T CAUSE MPV OR PUR INTERRUPT.
7517 ;CLOBBERS A,D,J,T,TT,Q
7518 IODCDO: MOVE J,B        ;B IS NOT CLOBBERED.
7519         TLZN J,(@)
7520          JRST IODCD1
7521         XCTRIJ XR,[HRR J,(J)]   ;INDIRECTION IS WANTED; DO IT.
7522 IODCD1: TLNN J,-1       ;IF LH IS 0, REPLACE BY (SETOM)
7523          HRLI J,(SETOM)
7524         LDB A,[271500,,J]
7525         CAIE A,AOS_-27  ;AOS AND SOS ARE LEGAL WITH 0 IN AC FIELD.
7526          CAIN A,SOS_-27
7527           JRST IODCD2
7528         LDB A,[410300,,J]
7529         CAIE A,4        ;ALL INSNS WITH 4 IN TOP 3 BITS (LOGICAL INSNS) ARE OK.
7530          CAIN A,5       ;HALFWORD INSTRUCTIONS ALSO OK.
7531           JRST IODCD3
7532         LDB A,[360600,,J]
7533         CAIE A,MOVE_-36 ;ALL FORMS OF MOVE, MOVS, MOVN AND MOVM OK
7534          CAIN A,MOVN_-36
7535           JRST IODCD3
7536         CAIE A,ADD_-36  ;ADD & SUB OK.      (OF COURSE, ONLY TO-MEMORY INSNS MAKE SENSE)
7537          POPJ P,
7538 IODCD3: LDB A,[270400,,J] ;AC FIELD NEED NOT BE 0, SO GET CONTENTS OF SPEC'D AC,
7539         UMOVE D,(A)
7540         MOVEI A,D
7541         DPB A,[270400,,J] ;AND MAKE THE INSN USE AC D, WHERE THE VALUE IS.
7542 IODCD2: TLZ J,17
7543         XCTRIJ XRW,J    ;EXECUTE INSN, CHECKING FOR INTERRUPTS.
7544         AOS (P)
7545         POPJ P,
7546 \f
7547 ; FLUSH LAST VESTIGES OF USER
7548 ;  ELIMINATES ALL POINTERS TO USER & FREES USER VARIABLES (CLOBBERS U TO "USER")
7549 ;  R, IF NON-ZERO, IS ADDRESS OF CHANNEL NOT TO BE CLOSED UNTIL LAST MINUTE
7550 ;       (IN CASE PCLSR OUT OF .UCLOSE)
7551
7552 ZUSER:  MOVEI A,(U)     ;CLEAR BOTH TRANSLATION LISTS
7553         HRLI A,300000   ;FOR THIS JOB.
7554         PUSHJ P,NTRNC
7555          JFCL
7556         MOVEI A,0       ;AND GET RID OF EXISTING FOREIGN-USER CHANNELS.
7557 ZUSER2: SKIPE UNAME(A)
7558          PUSHJ P,ZUSES  ;SEE IF THIS USER HAS ANY POINTERS TO BE FLUSHED
7559         CAMN U,SERVER(A)        ; If we were a server for this guy,
7560          SETOM SERVER(A)        ; clear it out.
7561         ADDI A,LUBLK
7562         CAMGE A,USRHI
7563          JRST ZUSER2    ;LOOP FOR ALL SETS OF USER VARIABLES
7564         SKIPE R
7565          SETZM (R)
7566         CONO PI,CLKOFF
7567         SKIPE NMPGS(U)  ;USER SHOULD HAVE NO MEMORY BY NOW
7568          BUG
7569         SETZM UNAME(U)  ;ONLY PLACE THAT UNAME IS ZEROED
7570         SETOM USTP(U)   ;SET USTP TO SPEED SEARCH
7571         MOVE A,U        ;USER FLUSHED
7572         MOVE U,USER
7573         MOVSI T,SCLDEC
7574         IORM T,SUPCOR   ;CAUSE USER VARIABLE BLOCKS DECREASE PROGRAM TO RUN
7575         POPJ P,         ;RETURN WITH CLOCK OFF
7576
7577
7578 ;CALLED BY ADISOWN, NATTACH, NDETACH, ETC.
7579 ZUSES:  MOVEI D,%CLSU\%CLSFU\%CLSJI\%CLSJO      ;CLSTB BITS FOR CHANNELS TO CLOSE
7580 ZUSES1: PUSH P,B
7581         PUSH P,R
7582         PUSH P,C
7583         MOVE C,R
7584         SETZM B         ;CLEAR STOPPED PROC FLAG
7585         PUSHJ P,CHSCAA  ;EXECUTE FOLLOWING INST FOR EACH CHANNEL AND I/O PDL SLOT
7586             PUSHJ P,ZACHEK
7587         POP P,C
7588         POP P,R
7589         SKIPE B         ;SKIP UNLESSS YOU STOPPED THE PROC
7590          PUSHJ P,UPCLSR ;RESTART USER
7591         JRST POPBJ
7592
7593 ZACHEK: HLRZ T,(R)      ;CHECK FOR CHANNEL TO ZAP
7594         CAME T,U
7595          POPJ P,
7596 ZACHK4: HRRZ T,(R)
7597         HLRZ T,CLSTB(T)
7598         TRNN T,(D)
7599          POPJ P,        ;IS IT EITHER TYPE OF USER CHANNEL? OR JOB CHNL?
7600         TRON B,-1       ;SET FLAG
7601          PUSHJ P,RPCLSR ;STOP USER
7602         HRRZ T,(R)
7603         HLRZ T,CLSTB(T)
7604         TRNN T,%CLSFU   ;IS IT A FOREIGN USR CHNL?
7605          JRST ZACHK2    ;NO, SUPERIOR OR JOB CHNL.
7606         JUMPG R,ZACHK1  ;IOPDL CHANNEL
7607         MOVEI T,LUBLK   ;SEE IF A HAS BEEN CLOBBERED
7608         IDIVM A,T       ;(AT LEAST MAKE SURE IT'S A VALID USER INDEX)
7609         IMULI T,LUBLK
7610         CAMN T,A
7611          CAML A,USRHI
7612           BUG
7613         HRRZ T,R        ;NORMAL CHANNEL, INTERRUPT ON IT.
7614         SUBI T,IOCHNM(A)
7615         MOVE T,CHNBIT(T)
7616         AND T,MSKST2(A)
7617         IORM T,IFPIR(A)
7618 ZACHK2: CAIE C,(R)      ;UNLESS THE ONE NOT TO BE CLOSED UNTIL LAST MINUTE,
7619          SETZM (R)      ;FOR ANY KIND OF CHANNEL, CLEAR IT OUT.
7620         POPJ P,
7621
7622 ZACHK1: MOVEI T,IIOPOP  ;FOREIGN USR IN IOPDL SLOT: INTERRUPT WHEN IOPOPPED.
7623         MOVEM T,(R)
7624         POPJ P,
7625 \f
7626 ZUSLOG: PUSH P,[ZUSER]          ;DO LOGUSE THEN ZUSER
7627
7628 ;LOG RUNTIME AND SWAPIN REQUESTS USED BY JOB IN U
7629 ;JOB CALLED FOR SHOULD NOT BE CURRENT OR ABLE TO RUN DURING CALL
7630 ;JOB SHOULD NOT BE TOP LEVEL EXCEPT WHEN DMNPLO CALLS
7631 ; HERE JUST BEFORE SENDING THE USAGE TO THE DEMON
7632 ;CLOBBERS T,TT,I
7633
7634 LOGUSE: MOVN TT,UTRNTM(U)
7635         MOVN T,USIPRQ(U)
7636         EXCH TT,TRUNTM(U)       ;AVOID CHARGING FOR THIS USAGE TWICE
7637         EXCH T,TSIPRQ(U)
7638         SUB TT,TRUNTM(U)        ;COMPUTE TOTAL USAGE NOT YET CHARGED
7639         SUB T,TSIPRQ(U)
7640         SKIPGE I,SUPPRO(U)      ;FIND HIGHEST JOB IN TREE
7641          POPJ P,                ;BUT IF TOP LEVEL RETURN WITH USAGE IN TT, T
7642 ;THIS IS TO FIND A BUG.  -- CStacy, 4/30/82
7643         CAME I,U                ;IS THIS JOB ITS OWN SUPERIOR?
7644          JRST LOGUS1
7645         BUG PAUSE,[SOME JOB IS ITS OWN SUPERIOR, U AND I=],OCT,U
7646 LOGUS1: SKIPL SUPPRO(I)
7647          JRST [ MOVE I,SUPPRO(I) ? JRST .-1 ]
7648         ADDM TT,TRUNTM(I)       ;ADD CHARGES TO TREE'S ACCOUNT
7649         ADDM T,TSIPRQ(I)
7650         POPJ P,
7651
7652 ;DO LOGOUT FOR TREE HEADED BY JOB IN U
7653 ;CALLER SHOULD THEN PUSHJ P,DMNPLI TO LOG JOB BACK IN
7654 ;THIS IS USED TO KEEP ACCOUNTING STRAIGHT WHEN DETACH, CHUNAME, RELOAD (SIGH)
7655 ;IF JOB IS CURRENTLY RUNNING, TIME USED IN CURRENT QUANTUM
7656 ;WON'T GET CHARGED THIS TIME AROUND.  TOO BAD.
7657 ;CLOBBERS T,TT,I,J,D. CALL WITH CLKOFF OR IN PROGRESS.
7658
7659 LOGUPD: PUSH P,U
7660         MOVE J,UTMPTR(U)
7661         MOVEI U,LUBLK
7662 LOGUP1: ADDI U,LUBLK
7663         CAML U,USRHI
7664          JRST LOGUP2
7665         CAMN J,UTMPTR(U)        ;SKIP JOBS IN OTHER TREES (FOR SPEED)
7666          SKIPGE SUPPRO(U)       ;AND SKIP TOP LEVEL JOBS
7667           JRST LOGUP1
7668         SKIPE UNAME(U)          ;DON'T GET CONFUSED BY EMPTY SLOTS
7669          PUSHJ P,LOGUSE         ;PROBABLY AN INFERIOR IN TREE LOGGING OUT, UPDATE ACCT
7670         JRST LOGUP1
7671
7672 LOGUP2: POP P,U
7673         JRST DMNPLO             ;TELL DEMON ABOUT TREE'S USAGE
7674 \f
7675 SUBTTL USER UUO WAIT (HANG UP) ROUTINE
7676 ;  DOES NOT WORK FOR XCT T OR FOR X (T)
7677 ;  THE INSTRUCTION BEFORE THE PUSHJ P,UFLS GETS EXECUTED WITH AN
7678 ;  ARGUMENT PASSED IN T AND ITS USER INDEX IN U.  I BELIEVE IT
7679 ;  IS ONLY ALLOWED TO BASH T AND A.
7680 ;
7681 UFLS:   CONSZ PI,77400
7682          BUG HALT,[UFLS WITH PI IN PROGRESS]
7683         CONO PI,CLKOFF  ;DOES NOT ALLOW CLOCK INTS
7684         XCT CLUSAV
7685         SKIPGE U,USER   ;GET INDEX OF USER BEING BLOCKED
7686          JRST 4,.       ;NULL JOB SHOULD NOT GET BLOCKED
7687         MOVEM T,EPDL2(U)        ;SAVE C(T) FOR FLSINS AT PCLSR
7688         MOVEM T,AC16S(U)        ;SAVE IN SWAP OUT AC ALSO
7689         POP P,UPC(U)            ;WORK FOR INST INDEX OF P
7690         MOVEI T,AC0S(U)
7691         BLT T,AC15S(U)  ;STORE REST OF ACS
7692         MOVE T,UPC(U)   ;GET PC AT CALL (=CALL+1 ; =SKIP +2)
7693         SKIPA T,-2(T)   ;GET POINTER TO SKIP
7694 UFL3:    MOVE T,(T)     ;GET CONTENTS OF E (WAS AN XCT)
7695         MOVE U,AC17S(U) ;WIN FOR INSNS INDEX OF U.
7696         HRRI T,@T       ;CALCULATE E
7697         TLZ T,37        ;CLEAR OUT @ AND INDEX BITS
7698         MOVE U,USER
7699         MOVEM T,FLSINS(U)       ;STORE AS BLOCKING CONDITION
7700         TLC T,(XCT)
7701         TLNN T,777740
7702          JRST UFL3      ;JUMP IF INSTRUCTION WAS XCT
7703         CONO PI,UTCON-1 ;TURN ON ALL PIS EXCEPT CLOCK
7704         MOVSI T,%SWPGW+%SWINT
7705         ANDCAM T,USWST(U) ;CLEAR WAITING FOR PAGE TYPE FLSINS
7706         SKIPGE RPCL(U)  ;SKIP IF NOT BEING RPCLSRED
7707          JRST UFL1      ;LOSER IS BEING RPCLSRED
7708 UFL6:   MOVE U,AC17S(U) ;FOR CLUSAV TO STORE
7709         SETOM UFLSF
7710         CONO PI,CLKRQ   ;CAUSE INTERRUPT TRANSFERING TO CLOCK ROUTINE PI IN
7711                         ; PROGRESS
7712 IFE KA10P, JRST .       ;ON KL AND KS SEEMS TO TAKE A WHILE TO GO OFF ("I
7713                         ; CAN WAIT FOREVER, YOU KNOW")
7714 IFN KA10P, JRST 4,.     ;ON KA SHOULD GO OFF RIGHT AWAY
7715
7716 UFL1:   MOVE P,CPDLP    ;MUST NOT USE USR PDL SINCE THAT CAN
7717                         ;GET CLOBBERED BY LSWDIS VIA UFL5
7718                         ;CLOCK IS OFF, SO CPDLP IS OK
7719 IFN KA10P,[
7720         MOVE T,UEXIT    ;PICK UP EXIT INSTR
7721         CAME T,[JRST ONEPROC]   ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7722                                 ; THAT HUNG
7723          JRST UFL1A     ;NOT ONE PROCEEDING
7724         MOVSI T,%PC1PR  ;GET ONE PROCEED BIT
7725         IORM T,UUOH     ;TURN IT ON IN PC
7726 UFL1A:] ;KA10P
7727 IFN KS10P,[
7728         MOVE T,UEXIT    ;PICK UP EXIT INSTR
7729         CAME T,[JRST ONEPR4]    ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7730                                 ; THAT HUNG
7731          JRST UFL1A     ;NOT ONE PROCEEDING
7732         MOVSI T,OIPBIT  ;GET ONE PROCEED BIT
7733         IORM T,UUOH     ;TURN IT ON IN PC
7734 UFL1A:] ;KS10P
7735         SOS T,UUOH      ;UUOH HAS REAL PC IF UFL5 SKIPS. WILL GET SET BY ONEPR1
7736         PUSHJ P,UFL5    ;BACK UP TO UUO
7737          JRST UFL6      ;FINALIZATION REQUIRED
7738         MOVE T,RPCL(U)
7739         JRST ONEFL2     ;WIN
7740 \f
7741 SUBTTL VARIOUS WAIT & LOCK-SWITCH ROUTINES
7742 ;
7743 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH UTCCHN OFF
7744 ;
7745 LWAIT1: CONO PI,UTCON   ;TURN INTERRUPTS ON
7746 LWAIT:  PCLT
7747         XCT @(P)        ;ENTRY, EXECUTE INSTRUCTION
7748          PUSHJ P,UFLS   ;HANG TILL INSTRUCTION SKIPS
7749         CONO PI,UTCOFF  ;TURN INTERRUPTS OFF
7750         XCT @(P)        ;TRY AGAIN
7751          JRST LWAIT1    ;LOSE
7752         JRST POPJ1      ;WIN, RETURN SKIPPING OVER ARG
7753 ;
7754 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE -1 AND SEIZE IT
7755 ;
7756 SWTL:   PCLT
7757         MOVEI T,(@)     ;ENTRY
7758         HRLM T,(P)      ;MAKE PC STORED ON PDL INDIRECT
7759         SKIPGE @(P)     ;SKIP IF ALREADY LOCKED
7760          JRST SWTL1     ;NOT LOCKED SO TRY TO GRAB IT
7761         MOVEI T,@(P)    ;ADDRESS OF SWITCH
7762         HLRZ T,1(T)     ;USER THAT HAS SWITCH
7763         ANDI T,777
7764         IMULI T,LUBLK
7765         CAMN T,USER     ;SKIP IF THIS USER DOESN'T HAVE IT
7766          BUG            ;THIS USER ALREADY HAS THAT SWITCH
7767 SWTL1:  SKIPL @(P)      ;(DO NOT CHANGE TO AOSE)
7768          PUSHJ P,UFLS   ;HANG TILL NEGATIVE
7769         CONO PI,CLKOFF
7770         AOSE @(P)
7771          JRST SWTL1
7772 SWTL2:  MOVEI T,@(P)
7773 SWTL3:  PUSH P,U
7774         PUSH P,T
7775         MOVE T,USER
7776         IDIVI T,LUBLK
7777         ADDI T,600000
7778         MOVE U,USER
7779         HRL T,LSWPR(U)
7780         POP P,U
7781         MOVSM T,1(U)
7782         MOVE T,USER
7783         HRRZM U,LSWPR(T)
7784         POP P,U
7785         JRST CLKOJ1
7786 ;
7787 ;IF LOCK ALREADY SEIZED, JUST SET UP POINTERS
7788 SWTLZ:  MOVEI T,(@)
7789         HRLM T,(P)
7790         JRST SWTL2
7791
7792 SWTAD:  PCLT            ;TRY TO LOCK SWITCH (@NEXT LOCN). IF SUCEED, SKIP EXTRA TIME.
7793         MOVE T,@(P)     ;IF FAIL, DO N LSWPOPS (AS SPEC IN 4.6-4.1 OF NEXT WORD)
7794         SKIPGE (T)      ;AND WAIT FOR SWITCH TO SEEM TO BE AVAILABLE.
7795          JRST SWTAD1    ;THEN RETURN (NOTE: NOT LOCKING IT).
7796 SWTAD2: TLNN T,77000
7797          JRST SWTAD3
7798         PUSH P,T
7799         PUSHJ P,LSWPOP
7800         POP P,T
7801         SUB T,[1000,,]
7802         JRST SWTAD2
7803
7804 SWTAD3: SKIPL (T)
7805          PUSHJ P,UFLS
7806         JRST POPJ1
7807
7808 SWTAD1: CONO PI,CLKOFF
7809         AOSE (T)
7810          JRST [ CONO PI,CLKON
7811                 JRST SWTAD2 ]
7812         AOS (P) ;SKIP OVER FAILURE RETURN
7813         JRST SWTL3
7814 \f
7815 ;
7816 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH CLKCHN OFF
7817 CWAIT1: CONO PI,CLKON   ;TURN CLOCK ON
7818 CWAIT:  PCLT
7819         XCT @(P)        ;ENTRY, EXECUTE INSTRUCTION
7820          PUSHJ P,UFLS   ;HANG TILL INSTRUCTION SKIPS
7821         CONO PI,CLKOFF  ;TURN CLOCK OFF
7822         XCT @(P)        ;TRY AGAIN
7823          JRST CWAIT1    ;LOSE
7824         JRST POPJ1      ;WIN, RETURN SKIPPING OVER ARG
7825
7826 ;
7827 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE NON-NEGATIVE AND SEIZE IT
7828 LSWTL:  PCLT
7829         MOVEI T,(@)     ;IF 4.9 OF NEXT LOCN =1, RETURN WITH UTCOFF
7830         HRLM T,(P)
7831         MOVSI T,400000
7832         PUSHJ P,LWAIT
7833             SKIPGE @-1(P)
7834         IORM T,@(P)
7835         MOVE T,(P)
7836         SKIPL (T)
7837          CONO PI,UTCON
7838         MOVEI T,@(P)
7839 LSWTL2: PUSH P,TT
7840         MOVEI TT,601000
7841         PUSHJ P,LSWSET
7842         POP P,TT
7843         JRST POPJ1
7844 \f
7845 ;SWITCH LIST LOCK, DOES NOT WORK FOR SWITCHES POINTED TO INDEX OF A, B, OR D
7846 ;FOLLOW BY LIST OF SWITCHES
7847 ;4.9-4.4=0 4.3-4.1 0 AOSE SWITCH 1 SIGN SWITCH
7848 SLUGH:  PCLT
7849         PUSH P,A
7850         PUSH P,B
7851         PUSH P,D
7852         MOVEI T,AC0S(U)
7853         BLT T,AC0S+17(U)        ;FOR SLWAIT FIRST TIME
7854 SLUGH1: HRRZ T,-3(P)    ;POINTER TO SWITCH LIST
7855         PUSHJ P,SLWAIT
7856          PUSHJ P,UFLS
7857         HRRZ T,-3(P)
7858 SLUGH2: MOVE A,(T)      ;TRY TO LOCK LIST
7859         TLNE A,770000
7860          JRST SLUWIN    ;REACHED END OF LIST
7861         LDB B,[220400,,A]       ;INDEX
7862         LDB D,[330300,,A]
7863         SKIPE B
7864          ADD A,(B)
7865         HRRZS A
7866         CAIL D,2
7867          BUG
7868         XCT SLLOCK(D)
7869          JRST SLULOS
7870         AOBJP T,SLUGH2  ;LH COUNTS SWITCHES SUCCESSFULLY SEIZED
7871                         ;SHOULD NVERE FALL THROUGH
7872 SLWAIT: MOVE A,(T)
7873         TLNE A,770000
7874          JRST POPJ1             ;WIN
7875         LDB B,[220400,,A]       ;INDEX
7876         LDB D,[330300,,A]       ;TYPE CODE
7877         JUMPE B,SLWT1
7878         ADD B,U
7879         ADD A,AC0S(B)
7880 SLWT1:  CAIL D,2
7881          BUG
7882         XCT SLWATT(D)
7883          POPJ P,        ;LOSE
7884         AOJA T,SLWAIT   ;THAT SWITCH OK, TRY OTHERS
7885
7886 SLWATT: SKIPL (A)       ;WAIT FOR NEG (AOSE SW)
7887         SKIPGE (A)      ;WAIT FOR POS (SIGN SW)
7888
7889 SLUWIN: POP P,D
7890         POP P,B
7891         POP P,A
7892         SUB P,[1,,1]    ;"RETURN" BUT NOT INCREMENTED
7893         JRST (T)
7894
7895 SLLOCK: PUSHJ P,SWTLX
7896         PUSHJ P,LSWTLX
7897
7898 SLULOS: HLRZ A,T
7899 SLULO2: JUMPE A,SLUGH1  ;NONE SEIZED TRY AGAIN
7900         PUSHJ P,LSWPOP  ;RELEASE THOSE SEIZED
7901         SOJA A,SLULO2
7902
7903 SWTLX:  CONO PI,CLKOFF  ;DON'T GO OFF HALF-LOCKED
7904         AOSE (A)
7905          JRST CLKONJ
7906         EXCH A,T
7907         PUSHJ P,SWTL3
7908          BUG
7909 SWTLX1: EXCH A,T
7910         JRST POPJ1
7911
7912 LSWTLX: CONO PI,UTCOFF
7913         SKIPGE (A)
7914          JRST UTCONJ
7915         MOVSI B,400000
7916         IORM B,(A)
7917         CONO PI,UTCON
7918         EXCH A,T
7919         PUSH P,TT
7920         MOVEI TT,601000
7921         PUSHJ P,LSWSET
7922         POP P,TT
7923         JRST SWTLX1
7924 \f
7925 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING SWITCH
7926 STMSET: PUSH P,TT
7927         MOVEI TT,606000
7928         JRST COMSET
7929
7930 IFN 0,[
7931 ;SET UP ROUTINE TO BE CALLED ON PCLSR'ING OUT
7932 FINSET: MOVE T,@(P)
7933         HRLI T,-1(P)
7934         PUSH P,TT
7935         MOVEI TT,402000
7936         PUSHJ P,LSWSET
7937         POP P,TT
7938         JRST POPJ1
7939 ]
7940
7941 ;SET UP ROUTINE TO AOS VARIABLE UPON UNLOCKING SWITCH
7942 AOSSET: PUSH P,TT
7943         MOVEI TT,605000
7944         JRST COMSET
7945
7946 ;SET UP ROUTINE TO SOS VARIABLE UPON UNLOCKING SWITCH
7947 SOSSET: PUSH P,TT
7948         MOVEI TT,603000
7949         JRST COMSET
7950
7951 ;SET UP ROUTINE TO SOS LH UPON UNLOCKING SWITCH
7952 ;HALT IF SWITCH'S LH EVER BECOMES NEGATIVE
7953 SOLSET: PUSH P,TT
7954         MOVEI TT,607000
7955         JRST COMSET
7956
7957 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING SWITCH
7958 ;THAT ROUTINE MAY ONLY CLOBBER A AND T!!  IT GETS CALLED
7959 ;WITH USER IN U, AND THE JOB'S ACS IN AC0S(U)-AC17S(U)
7960 LOSSET: MOVE T,@(P)
7961         HRLI T,-1(P)
7962         PUSH P,TT
7963         MOVEI TT,602000
7964         PUSHJ P,LSWSET
7965         POP P,TT
7966         JRST POPJ1
7967
7968 ;SET UP ROUTINE TO CLEAR SIGN BIT OF VARIABLE UPON UNLOCKING SWITCH
7969 SGNSET: PUSH P,TT
7970         MOVEI TT,601000
7971         JRST COMSET
7972
7973 ;SET UP ROUTINE TO DO NOTHING UPON UNLOCKING SWITCH
7974 NULSET: PUSH P,TT
7975         MOVEI TT,0
7976         PUSHJ P,LSWSET
7977         POP P,TT
7978         POPJ P,
7979 \f
7980 ;ROUTINE TO ADD THIS PROCEDURE TO A LIST POINTED TO
7981 ;BY THE WORD AFTER THE CALL.  UNLOCKING REMOVES IT FROM THE LIST
7982 LSTSET: PUSH P,TT       ;LEAVES CLKON
7983         MOVEI TT,604000
7984         PUSHJ P,LSTST3
7985         POP P,TT
7986         JRST POPJ1
7987
7988 LSTST3: PUSH P,U
7989         PUSH P,Q
7990         MOVEI Q,LSWB0(U)
7991 REPEAT NULBLK,[
7992 IFN .RPCNT,ADDI Q,2
7993         SKIPN 1(Q)
7994         JRST LSTST2
7995 ]
7996         BUG             ;NOT ENOUGH BLOCKS
7997 LSTST2: MOVE T,@-4(P)   ;ADDRESS OF HEAD OF LIST
7998         CONO PI,CLKOFF
7999         PUSH P,(T)      ;PUSH HEAD OF LIST
8000         POP P,(Q)       ;POP INTO LSWB BLOCK
8001         MOVEM Q,(T)
8002         HRLM T,(Q)
8003         MOVE T,(Q)
8004         TRNE T,-1
8005         HRLM Q,(T)
8006         CONO PI,CLKON
8007         JRST LSWSE3
8008
8009 IFN 0,[
8010 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING OF SWITCH
8011 ;BY OTHER THAN PCLSRING OUT
8012 STMNPS: PUSH P,TT
8013         MOVEI TT,206000
8014         JRST COMSET
8015
8016 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING OF SWITCH
8017 ;BY OTHER THAN PCLSRING OUT
8018 LNPSET: PUSH P,TT
8019         MOVEI TT,202000
8020         JRST COMSET
8021 ];END IFN 0
8022
8023 COMSET: EXCH TT,(P)
8024         MOVE T,@-1(P)
8025         MOVEI T,@T
8026         EXCH TT,(P)
8027         PUSHJ P,LSWSET
8028         POP P,TT
8029         JRST POPJ1
8030 \f
8031 ;SET USER LOCK SWITCH BLOCK,  WD1 IN T,  MODE IN TT
8032 LSWSET: PUSH P,U
8033         MOVE U,USER
8034         PUSH P,Q
8035         MOVEI Q,LSWB0(U)
8036 REPEAT NULBLK,[IFN .RPCNT,ADDI Q,2
8037         SKIPN 1(Q)
8038         JRST LSWSE2
8039 ]
8040         BUG             ;NOT ENOUGH BLOCKS
8041
8042 LSWSE2: MOVEM T,(Q)
8043 LSWSE3: MOVE T,U
8044         IDIVI T,LUBLK
8045         MOVE U,USER
8046         HRL T,LSWPR(U)
8047         IOR T,TT        ;GET TYPE
8048         MOVSM T,1(Q)
8049         HRRZM Q,LSWPR(U)
8050         JRST POPQUJ
8051
8052 LSWCJ1: AOS (P)         ;EXIT TO DO LSWCLR AND SKIP-RETURN.
8053
8054 ;UNLOCK ALL SWITCHES, CALLED BY OPENL, ADISOWN, IOADCR
8055 LSWCLR: PUSH P,T
8056 LSWCL1:
8057 ;TEMPORARY CODE ADDED 1/22/80 TO SEE IF THERE ARE ANY MORE OF
8058 ;THIS CLASS OF BUGS
8059         CAME U,USER
8060          BUG
8061 ;END TEMPORARY CODE
8062         SKIPN T,LSWPR(U)        ;MUST HAVE USER IN U
8063         JRST POPTJ
8064         PUSHJ P,LSWPOP
8065         JRST LSWCL1
8066
8067 LSWPJ1: AOS (P)
8068 LSWPOP: PUSH P,U
8069         MOVE U,USER
8070         TLO U,400000    ;SIGNAL NOT PCLSR
8071         SKIPN T,LSWPR(U)
8072          BUG
8073         PUSHJ P,LSWPPP
8074         JRST POPUJ
8075
8076 LSWPPP: PUSH P,A
8077         PUSH P,T
8078         MOVE A,1(T)
8079         HRRZM A,LSWPR(U)
8080         CAIL T,USRSTG
8081          SETZM 1(T)
8082         PUSHJ P,LSWDIS
8083         POP P,T
8084         POP P,A
8085         POPJ P,
8086
8087 LSWZAP: PUSH P,U        ;FROM PCLSR
8088         PUSH P,A
8089 LSWZP1: PUSH P,T
8090         MOVE A,1(T)
8091         HRRZM A,LSWPR(U)
8092         CAIL T,USRSTG
8093          SETZM 1(T)
8094         PUSHJ P,LSWDIS
8095         POP P,T
8096         HRR U,-1(P)
8097         SKIPE T,LSWPR(U)
8098          JRST LSWZP1
8099         POP P,A
8100         SUB P,[1,,1]
8101         TLZN U,200000   ;HAS PC BEEN CLOBBERED?         ;THIS IS ONLY FOR FINSET R.I.P.
8102          JRST PCLSR7    ;NO
8103         SKIPLE PCLDBM
8104          SETZM LSUUO(U) ;INDICATE OCCURRENCE OF FINSET (WILL MEAN WE HAVEN'T MISSED MARK)
8105         JRST PCLSR4     ;REQUIRED TO START UP ROUTINE
8106 \f
8107 ;-1(P) HAS POINTER TO SWITCH BLOCK TO UNDO.
8108 ;A HAS SECOND WORD OF THAT BLOCK.
8109 ; 4.9=1 => PERFORM FUNCTION ON PCLSR
8110 ; 4.8=1 => PERFORM FUNCTION ON ANY LSWPOP OTHER THAN PCLSR
8111 ; 4.1-4.3 => FUNCTION
8112 ; 3.1-3.9 USER # LAST LOCKED BY
8113 ; 1.1-2.9 LSWPR THREAD
8114
8115 LSWDIS: LDB T,[330300,,A]       ;FUNCTION
8116         TLNE A,400000   ;SKIP IF NOT FOR PCLSR
8117          JUMPGE U,LSWDS1        ;PCLSRED AND 4.9=1
8118         TLNN A,200000   ;NOT FOR PCLSR OR FOR PCLSR BUT NOT PCLSRED
8119          POPJ P,        ;NOT FOR EITHER LSWPOP
8120         JUMPGE U,CPOPJ  ;FOR OTHER LSWPOP BUT PCLSRED
8121 LSWDS1: JRST LSWTAB(T)
8122
8123 LSWTAB: JRST UNSWTL     ;0 (AOSE) ALSO USED FOR QUSR
8124         JRST UNLSWT     ;1 (SIGN)
8125         JRST ULROUT     ;2 (GO TO ROUTINE)
8126         JRST ULAOS      ;3 (AOS, SOS)
8127         JRST UNLST      ;4 (UNLOCK FROM LIST)
8128         JRST ULSOS      ;5 (SOS, AOS)
8129         JRST ULSTM      ;6  (SETOM)
8130         JRST ULAOSL     ;7 (AOS,SOS LEFT HALF)
8131
8132 UNSWTL: MOVE T,-1(P)
8133         SETOM (T)
8134         POPJ P,
8135
8136 ULSTM:  MOVE T,@-1(P)
8137         SETOM (T)
8138         POPJ P,
8139
8140 UNLSWT: MOVE T,@-1(P)
8141         MOVSI A,400000
8142         ANDCAM A,(T)
8143         POPJ P,
8144
8145 ULAOSL: MOVE T,@-1(P)
8146         MOVSI A,-1
8147         ADDB A,(T)
8148         JUMPGE A,CPOPJ
8149         BUG                     ;OVER-SOS'ED
8150
8151 ULAOS:  MOVE T,@-1(P)
8152         SOS (T)
8153         POPJ P,
8154
8155 UNLST:  SETOM DLSRCH
8156         MOVS T,@-1(P)
8157         HLRM T,(T)
8158         MOVSS T
8159         TRNE T,-1
8160         HLLM T,(T)
8161         SETZM DLSRCH
8162         POPJ P,
8163
8164 ULSOS:  MOVE T,@-1(P)
8165         AOS (T)
8166         POPJ P,
8167
8168 ULROUT: MOVE T,@-1(P)
8169         TLNE A,200000
8170          JRST ULROU1    ;A LOSSET - MAY CLOBBER A OR T; USR INDEX IN U
8171         HRRZM T,UPC(U)  ;IT'S A FINSET, EXPECTS THE OLD METHOD OF CALL.
8172         TLNE T,-1
8173          HLRM T,AC15S(U)
8174 IFE KA10P,[
8175         MOVSI T,%PSPCU  ;IT MIGHT TRY AN XCTR
8176         HLLM T,UPC(U)
8177 ] ;IFE KA10P
8178         TLOE U,200000   ;SIGNAL PC CLOBBERED
8179          BUG            ;PC TRIED TO BE CLOBBERED TWICE
8180         POPJ P,
8181
8182 ULROU1: JUMPGE U,(T)    ;IF LOSSET, AND LSWPOPPING,
8183         MOVE A,[B,,AC0S+B]
8184         ADDI A,(U)      ;PUT THE ACS IN THE AC0S, SINCE
8185         BLT A,AC0S+H(U) ;THAT'S WHERE THEY'LL BE IF CALL LOSSET ROUTINE WHILE PCLSRING.
8186         JRST (T)
8187 \f
8188 ;FIND SWITCH POINTED TO BY WORD AFTER
8189 ;PUSHJ P,LSWREM AND UNLOCK IT
8190 LSWREM: PUSH P,T
8191         PUSH P,U
8192         PUSH P,Q
8193         MOVE U,USER
8194         SKIPN U,LSWPR(U)
8195          BUG
8196         HRRZ Q,@-3(P)
8197         MOVEI T,1
8198 LSWRM1: CAMN U,Q
8199          JRST LSWRM2
8200         HRRZ U,1(U)
8201         SKIPN U
8202          BUG
8203         AOJA T,LSWRM1
8204 LSWRM2: POP P,Q
8205         POP P,U
8206         PUSHJ P,LSWPON
8207         AOS -1(P)
8208         JRST POPTJ
8209
8210 LSWDEL: PUSH P,U        ;REMOVE SWITCH FROM HEAD OF LIST
8211         MOVE U,USER     ;DO NOT ATTEMPT TO UNLOCK IT
8212         PUSH P,T
8213         SKIPN T,LSWPR(U)
8214          BUG
8215         PUSHJ P,LSWDDD
8216         JRST POPTUJ
8217
8218 LSWDDD: PUSH P,Q
8219         HRRZ Q,1(T)
8220         HRRZM Q,LSWPR(U)
8221         CAILE T,USRSTG
8222          SETZM 1(T)
8223         POP P,Q
8224         POPJ P,
8225
8226 ;POP C(T)'TH FROB BACK
8227 LSWPON: PUSHJ P,LSWBAK
8228         PUSHJ P,LSWPPP
8229         POPJ P,
8230
8231 ;DELETE C(T)'TH FROB BACK
8232 LSWDLN: PUSHJ P,LSWBAK
8233         PUSHJ P,LSWDDD
8234         POPJ P,
8235
8236 LSWBAK: PUSH P,U
8237         MOVE U,USER
8238         TLO U,400000    ;SIGNAL NOT PCLSR IN CASE OF LSWPPP
8239         PUSH P,Q
8240         MOVE Q,T
8241         MOVEI T,LSWPR-1(U)
8242         SOJE Q,LSWBA3   ;UNLOCKING FIRST FROB
8243         MOVE T,1(T)
8244         SOJG Q,.-1
8245 LSWBA2: MOVE Q,T
8246         HRRZ T,1(T)
8247         PUSH P,LSWPR(U) ;DON'T WORRY, YOU CAN'T GET PCLSR'ED JUST BELOW
8248         XCT @-3(P)
8249         HRRZ T,LSWPR(U)
8250         HRRM T,1(Q)
8251         POP P,LSWPR(U)
8252         JRST POPQU1
8253
8254 LSWBA3: MOVE T,LSWPR(U)
8255         XCT @-2(P)
8256         JRST POPQU1
8257 \f
8258 SUBTTL VARIOUS RETURNS
8259
8260 PPBAJ1: POP P,B
8261 POPAJ1: AOSA -1(P)
8262 POPBAJ: POP P,B
8263 POPAJ:  POP P,A
8264 CPOPJ:  POPJ P,
8265
8266 POPQJ:  POP P,Q
8267         POPJ P,
8268
8269 POPBJ1: AOSA -1(P)
8270 POPCBJ: POP P,C
8271 POPBJ:  POP P,B
8272         POPJ P,
8273
8274 POPJ3:  AOS (P)
8275 POPJ2:  AOSA (P)
8276 POPCJ1: POP P,C
8277 POPJ1:  AOSA (P)
8278 POPCJ:  POP P,C
8279         POPJ P,
8280
8281 POPJJ1: AOS -1(P)
8282 POPJJ:  POP P,J
8283         POPJ P,
8284
8285 POPUJ1: AOSA -1(P)
8286 POPTUJ: POP P,T
8287 POPUJ:  POP P,U
8288         POPJ P,
8289
8290 POPTJ:  POP P,T
8291         POPJ P,
8292
8293 POPTTJ: POP P,TT
8294         POPJ P,
8295
8296 POPWJ2: AOS -1(P)
8297 POPWJ1: AOS -1(P)
8298 POPWJ:  POP P,W
8299         POPJ P,
8300
8301 PIONJ:  CONO PI,PION
8302         POPJ P,
8303
8304 CKOCJ1: CONO PI,CLKON
8305         JRST POPCJ1
8306
8307 CLKOJ1: AOS (P)
8308 CLKONJ: CONO PI,CLKON
8309         POPJ P,
8310
8311 CKOPJ1: AOS (P)
8312 CLKOPJ: CONO PI,CLKON
8313         JRST LSWPOP
8314
8315 IFN OMXP,[
8316 OMXONJ: CONO PI,OMXON
8317         POPJ P,
8318 ]
8319
8320 TTYOJ1: AOS (P)
8321 TTYONJ: CONO PI,TTYON
8322         POPJ P,
8323
8324 IFN PTRP, PTRONJ:: PTPONJ::
8325 LPTONJ: CONO PI,LPTON
8326         POPJ P,
8327
8328 IFN NETP,NETOJ1:
8329 UTCOJ1: AOSA (P)
8330 UTCOAJ:  POP P,A
8331 IFN NETP,NETONJ:
8332 UTCONJ: CONO PI,UTCON
8333         POPJ P,
8334
8335 POPQU1: AOS -2(P)
8336 POPQUJ: POP P,Q
8337         POP P,U
8338         POPJ P,
8339
8340 POP1J1: AOS -1(P)
8341 POP1J:  SUB P,[1,,1]
8342         POPJ P,
8343
8344 POP2J:  SUB P,[2,,2]
8345         POPJ P,
8346
8347 POP3J1: AOS -3(P)
8348 POP3J:  SUB P,[3,,3]
8349         POPJ P,
8350
8351 POP4J:  SUB P,[4,,4]
8352         POPJ P,
8353
8354 POP7J:  SUB P,[2,,2]
8355 POP5J:  SUB P,[5,,5]
8356         POPJ P,
8357 \f
8358 SUBTTL UUO PROCESSOR
8359
8360 .IOT=UUOMIN
8361 .OPEN=UUOMIN+1_27.
8362 .OPER=UUOMIN+2_27.
8363 .CALL=UUOMIN+3_27.
8364 .USET=UUOMIN+4_27.
8365 .BREAK=UUOMIN+5_27.
8366 .STATUS=UUOMIN+6_27.
8367 .ACCESS=UUOMIN+7_27.
8368
8369 DEFINE GLOSYM X
8370         IRP Y,,[X]
8371         SQUOZE 4,.!Y
8372         .!Y
8373         TERMIN
8374         TERMIN
8375
8376 ;REPEAT OVER USET NAMES FROM 0 TO 77.
8377         DEFINE USTIRP A
8378         IRPS X,,[UPC VAL TTY FLS UNAME JNAME MASK USTP
8379 PIRQC INTB MEMT SV40 IPIRQ APIRQ SNAME PICLR
8380 MARA MARPC UUOH UIND RUNT MSK2 IFPIR APRC
8381 CNSL UTRP IIFPI AIFPI IMASK AMASK IMSK2 AMSK2
8382 JPC OPC RTMR HSNAME BCHN MPVA IDF1 ADF1
8383 IDF2 ADF2 DF1 DF2 OPTION 40ADDR TVCREG
8384 TTST TTS1 TTS2 WHO1 WHO2 WHO3 SUPPRO TR1INS
8385 TR2INS MBOX MBO1 EBOX EBO1 XUNAME XJNAME FTL1 FTL2]
8386 A
8387 TERMIN
8388 TERMIN
8389
8390 ;REPEAT OVER USET NAMES 600 AND UP.
8391         DEFINE USTIR1 A
8392         IRPS X,,[PAGRAN PAGAHD SERVER]
8393            A
8394         TERMIN TERMIN
8395
8396 ;NOTE:  OPER'S BELOW ARE 8 PER LINE
8397 ;    USE UP ILUUO'S BEFORE ADDING TO END
8398 ; THE FOLLOWING SHOULD GO AWAY EVENTUALLY
8399 ;       ITYI (=ITYIC)
8400 ;       SETMSK (=SUSET)
8401 ;       WSNAME (=SUSET)
8402 ;       UPISET (=SUSET)
8403 ;       RDSW (=DATAI)
8404 ;       EOFC (OBSOLETE)
8405 DEFINE OPRIRP A
8406         IRPS X,,[ITYI LISTEN SLEEP SETMSK SETM2 DEMON CLOSE
8407 UCLOSE ATTY DTTY IOPUSH IOPOP DCLOSE DSTOP RDTIME
8408 RDSW GUN UDISMT GETSYS IPDP GETLOC SETLOC DISOWN
8409 DWORD DSTEP GENSYM LOGOUT REALT WSNAME UPISET RESET
8410 ARMOVE DCONTIN CBLK ASSIGN DESIGN RTIME RDATE HANG
8411 EOFC IOTLSR RSYSI SUPSET PDTIME ARMRS UBLAT IOPDL
8412 ITYIC MASTER VSTST NETAC NETS REVIVE DIETIM SHUTDN
8413 ARMOFF NDIS FEED EVAL REDEF IFSET UTNAM UINIT
8414 RYEAR RLPDTM RDATIM RCHST RBTC DMPCH SWAP MTAPE
8415 GENNUM NETINT]
8416         A
8417 TERMIN
8418 TERMIN
8419
8420 DEFINE CALIRP A
8421 IRPS X,,[DISMIS LOSE TRANAD VALUE UTRAN CORE TRAND
8422 DSTART FDELE DSTRTL SUSET LTPEN VSCAN POTSET]
8423 A TERMIN TERMIN
8424 \f
8425 ;THESE ARE THE SYMBOLS USED BY MIDAS AND DDT. THEY ALSO
8426 ;EXIST IN SYS:ITS DEFS.
8427 ;SYMBOLS SHOULD BE LEFT IN CURRENT ORDER OR DDT WILL LOSE
8428 SYSYMB: USTIRP [SQUOZE 44,.R!X
8429         .IRPCNT]
8430         SQUOZE 44,.RIOC
8431         100
8432         SQUOZE 44,.RIOS
8433         120
8434         SQUOZE 44,.RIOP
8435         140
8436         SQUOZE 44,.RPMAP
8437         200
8438         USTIR1 [SQUOZE 44,.R!X
8439         600+.IRPCNT]
8440         USTIRP [SQUOZE 44,.S!X
8441         400000+.IRPCNT]
8442         USTIR1 [SQUOZE 44,.S!X
8443         400600+.IRPCNT]
8444
8445         GLOSYM [IOT,OPEN,OPER]
8446
8447 DEFINE DEFSYM X/
8448 IRPS Z,,[X]
8449 SQUOZE 44,Z
8450 Z
8451 .ISTOP
8452 TERMIN TERMIN
8453
8454 .INSRT BITS >
8455
8456 EXPUNG DEFSYM
8457
8458         ZZ=1
8459         OPRIRP [IFSN X,ILUUO,[.!X=.OPER ZZ
8460         SQUOZE 4,.!X
8461         .!X]
8462         ZZ==ZZ+1]
8463
8464 MXOPR==ZZ
8465
8466         SQUOZE 4,.CALL
8467         .CALL
8468
8469 CALIRP [
8470 IFSN X,UNUSD,[
8471         .!X=.CALL .IRPCNT+1,
8472         SQUOZE 4,.!X
8473         .!X
8474 ]]
8475
8476         GLOSYM [USET,BREAK,STATUS,ACCESS]
8477 SYSYME==.-1
8478 \f
8479 ;THESE SYMBOLS ARE USED BY DDT, SO THE USER CAN OPEN .PIRQC, ETC.
8480                 ;BEGINNING FOR .GETSYS (USYMS)
8481 SYSUSB:
8482 USTIRP [
8483         SQUOZE 4,.!X
8484         .IRPCNT
8485 ]
8486         SQUOZE 4,.IOC
8487         100
8488         SQUOZE 4,.IOS
8489         120
8490         SQUOZE 4,.IOP
8491         140
8492         SQUOZE 4,.PMAP
8493         200
8494 USTIR1 [
8495         SQUOZE 4,.!X
8496         600+.IRPCNT
8497 ]
8498 SYSUSE==.-1     ;END FOR .GETSYS (USYMS)
8499
8500 ;SIXBIT NAME TABLES FOR WHO LINE GENERATION.
8501 ;ALSO USED BY PEEK FOR PRINTING OUT JOBS' STATUS.
8502
8503 OPRSXB: SIXBIT/OPER/
8504 OPRIRP [
8505 .1STWD  SIXBIT/X/
8506 ]
8507
8508 CALSXB: SIXBIT/CALL/
8509 CALIRP [
8510 .1STWD  SIXBIT/X/
8511 ]
8512         SIXBIT/UNUSD/
8513
8514 UUOSXB:
8515 IRPS X,,IOT OPEN OPER CALL USET BREAK STATUS ACCESS
8516 .1STWD  SIXBIT/X/
8517 TERMIN
8518 NUUOSX==.-UUOSXB
8519 \f
8520 ;MACRO TO SAVE ACS AS APPROPRIATE FOR OUR CPU, LOAD UP U,
8521 ;CHECK VARIOUS ERROR CONDITIONS.
8522
8523 DEFINE UUOSAV
8524         CONSZ PI,77400
8525          BUG AWFUL,[UUO WITH PI IN PROGRESS]
8526 IFN KA10P,[
8527         UMOVEM U,17             ;SAVE 17
8528         SKIPGE U,USER           ;LOAD CURRENT USERS INDEX,
8529          BUG AWFUL,[UUO IN NULL JOB]
8530         UMOVEM T,16             ;SAVE LOC 16 FOR USER
8531         MOVEI T,0               ;HA HA
8532         XCTR XBW,[BLT T,15]     ;SAVE REST OF ACS IN USERS SHADOW 0-15
8533 ] ;KA10P
8534 IFE KA10P,[
8535         SYSCTX
8536         SKIPGE U,USER
8537          BUG AWFUL,[UUO IN NULL JOB]
8538         LDB T,[330300,,MUUOCX(U)]
8539         CAIE T,1
8540          BUG AWFUL,[UUO WHILE IN AC BLK ],DEC,T
8541 ] ;IFE KA10P
8542 TERMIN
8543
8544 ; UUO AND ILLOP TRAP HANDLER
8545 ;
8546 ;EITHER DISPATCHES TO APPROPRIATE UUO ROUTINE,
8547 ;   RETURNS CONTROL TO USERS UUO ROUTINE, GOES TO ILLOP, USRTRP, OR USRIOT.
8548 ;CODE ON THIS PAGE IS INTERRUPTABLE AT ANY POINT
8549
8550 ;COME HERE TO RETURN A UUO TO THE USER. RESTORES USER ACS W THROUGH U ONLY.
8551 USRUUO: CAIG U,LUBLK
8552          BUG AWFUL,[RETURNABLE UUO FROM SYS OR CORE JOB,PC=],OCT,UUOH
8553         MOVE W,UUOH
8554         TLNN W,%PCUSR
8555          BUG AWFUL,[RETURNABLE UUO FROM EXEC MODE,PC=],OCT,UUOH
8556         HRRZ W,40ADDR(U)
8557         MOVE P,USRPDL(U) ;IN CASE AN XCTR FAULTS.
8558         XCTR XR,[HLRZ H,1(W)]
8559         CAIE H,(JSR)    ;ELSE OK ONLY IF OPCODE IN 41 IS 0 OR JSR.
8560          JUMPN H,ILUUO  ;THIS IS IN CASE USER IS HANDLING USER-UUO'S WITH PUSHJ
8561                         ;AND HIS UUOH ISN'T ABLE TO BE JSR'D TO.
8562         XCTR XR,[HRRZ H,1(W)]
8563         JUMPE H,ILUUO           ;0 ISN'T ACCEPTABLE AS UUOH ADDRESS.
8564         MOVE T,FORTY
8565         UMOVEM T,(W)    ;ALL IS LEGAL; PLANT UUO INTO USERS "40".
8566         MOVE T,UUOH     ;SIMULATE A JSR AT USER'S "41"
8567         UMOVEM T,(H)
8568         AOS H
8569         HRRM H,UUOH     ;SET TO RETURN TO USER AT FIRST INSTRUCTION OF UUO HANDLER
8570 IFN KA10P,[
8571         MOVE U,[W,,W]
8572         XCTR XBR,[BLT U,U]
8573 ] ;KA10P
8574 ULEAVE: USRCTX          ;SELECT USER MODE AC BLOCK IF NEC.
8575
8576 EBLK
8577
8578 ;THE FOLLOWING BLOCK OF LOCATIONS IS SWITCHED WITH SOME USER VARS
8579
8580 UEXIT:  JRST 2,@XUUOH   ;EXIT FROM UUO (FOR KL-10, POINTS TO APPROPRIATE
8581                         ;UPT LOC) 
8582
8583 CLUSAV: MOVEM U,AC17S   ;CLOCK SAVE OF U
8584
8585 IFE KA10P,[
8586 CLCXSV: DATAI PAG,CLCX  ;CLOCK LEVEL CONTEXT SAVE
8587 ] ;IFE KA10P
8588
8589 IFN KA10P,[
8590 XUUOH:  0               ;UUO AND ILLOP TRAP GETS HERE - UUOH0 MUST BE . + 1.
8591 ] ;KA10P
8592
8593 UEXND:: ;END OF SWAPPED UEXIT BLOCK.
8594
8595 BBLK
8596
8597 UUOH0:  UUOSAV
8598 MUUOT1: SKIPGE UTRAPM(U) ;IF SUPERIOR WANTS TO CATCH UUOS, THIS IS FATAL INT.
8599          JRST USRTRP
8600         SKIPGE T,FORTY  ;PICK UP THE UUO OR ILLOP
8601          JRST USRIOT
8602         CAML T,[UUOMIN]
8603          CAML T,[UUOMAX]
8604           JRST USRUUO   ;NOT A SYSTEM CALL, GIVE TO USER
8605 ;DROPS THROUGH
8606 \f;DROPS IN
8607 ;HERE WITH UUO TO BE HANDLED BY SYSTEM IN T
8608 ILLOP1: JUMPN U,UUOH1
8609         MOVEI Q,0       ;SAVE SYS JOB EXEC MODE LSWPR PNTR
8610         EXCH Q,LSWPR
8611         MOVEM Q,SLSWPR
8612 UUOH1:  SKIPE LSWPR(U)
8613          JRST 4,.
8614         MOVEM T,LSUUO(U)        ;SAVE UUO FOR DEBUGGING PURPOSES
8615         LSH T,-27.              ;RIGHT JUSTIFY OP CODE
8616         SKIPL UUODSP-UUOMIN_-27.(T)
8617          JRST UUOTR3
8618         MOVE H,OPTION(U)
8619         TLNE H,%OPDEC
8620          JRST USRUUO
8621 UUOTR3: SETZM SYSCVL(U)         ;DIDN'T GET INTO SYSTEM VIA .CALL
8622         MOVE P,USRPDL(U)        ;SET UP USER PDL
8623         HRRZ C,FORTY            ;PICK UP EFFECTIVE ADDRESS OF UUO
8624         LDB R,[270400,,FORTY]   ;PICK UP AC FIELD OF UUO
8625         MOVEM R,UUAC(U)         ;SAVE AC FLD
8626         PUSHJ P,@UUODSP-UUOMIN_-27.(T)  ;DISPATCH ON UUO TYPE
8627          JRST URET      ;NORMAL RETURN (NON SKIP)
8628 URETJ1:
8629 IFE KA10P, MOVE U,USER  ;(SINCE UUOH IS IN THE USER VARIABLES)
8630         AOS UUOH        ;UUO ROUTINE SKIPPED, AOS USER RETURN POINT
8631 URET:   MOVE U,USER
8632         MOVE A,PIRQC(U) ;CHECK FOR RETURNING TO USER WITH PCLSR'ING FATAL
8633                         ; INT SET.
8634         TDNE A,[BADBTS&#<%PIC.Z\%PIDIS>] ;A FEW BITS ARE FATAL BUT SET
8635                                          ; ASYNCHRONOUSLY.
8636          JRST [ HRRZ A,UEXIT            ;INT SET, MAKE SURE UEXIT IS CLOBBERED
8637             IFN KA10P, CAIE A,ONEPRO    ;TO A LOCATION WHICH WILL CHECK PIRQC.
8638             IFN KS10P, CAIE A,ONEPR4
8639                 CAIE A,ONEFLS
8640                  BUG
8641                 JRST .+1]
8642         SKIPE UMAPS(U)
8643          PUSHJ P,MPLDZ
8644         CAMN U,PCLUSR
8645          SKIPG PCLDBM
8646           JRST URET2
8647         SKIPL PCLNXT
8648          JRST URPCL1
8649 URET2:  SKIPE LSWPR(U)
8650          BUG
8651         JUMPN U,URETC
8652         MOVEI T,0       ;RESTORE SYS JOB EXEC LSWPR
8653         EXCH T,SLSWPR
8654         MOVEM T,LSWPR
8655 URET1:  CONSO PI,1
8656          BUG            ;RETURNING TO USER MODE WITH CLOCK OFF
8657 IFN KA10P,[
8658         MOVEI U,0
8659         XCTR XBR,[BLT U,U]      ;RESTORE USERS ACS FROM USERS SHADOW 0-17
8660 ] ;KA10P
8661         JRST ULEAVE
8662
8663 URETC:  REPEAT NULBLK/2,[
8664         SKIPN CONC LSWB,\<2*.RPCNT>,+1(U)
8665         SKIPE CONC LSWB,\<2*.RPCNT+1>,+1(U)
8666         BUG
8667 ]
8668         REPEAT NULBLK&1,[
8669         SKIPE CONC LSWB,\<NULBLK-1>,+1(U)
8670         BUG
8671 ]
8672         JRST URET1
8673
8674 URPCL1: SKIPN LSUUO(U)
8675         JRST URET2      ;DIDN'T REALLY MISS MARK (DUE TO FINSET)
8676         SETOM PCLNXT    ;MISSED MARK, REINITIALIZE
8677         SETZM PCLL
8678         SETZM PCLHSH
8679         JRST URET2
8680
8681 UUOTRO: MOVE T,FORTY
8682         JRST UUOH1
8683
8684 USRIOT: MOVSI T,(UIOT)  ;I/O INST TURNS INTO PSEUDO UUO TO DISPATCH ON
8685         JRST ILLOP1
8686 \f
8687 IFE KA10P,[
8688
8689 ;HANDLE UUOS EXECUTED FOR TRAPS (PDL OV, ARITH OV, ONE PROCEED).
8690 ;MOST ARE AS USUAL, BUT OPCODE 0 IORM'S ADDRESS INTO PIRQC.
8691 ;NOTE: LOSER IS NOT PERMITTED TO USE OPCODE 0 - SEE USTR1I, ETC.
8692
8693 MUUOTR: UUOSAV
8694         MOVE T,FORTY
8695         TLNE T,-1
8696          JRST MUUOT1    ;IF OPCODE ISN'T 0, TREAT UUO NORMALLY (STARTING A
8697                         ; ONE PROCEED)
8698         MOVSI A,%PSTR1+%PSTR2
8699         ANDCAB A,UUOH   ;TURN OFF TRAP FLAGS, GET PC
8700         TRNN T,%PIARO
8701          JRST MUUOT2
8702         TLNE A,%PCFOV   ;DISTINGUISH FIXED AND FLOATING OVERFLOW.
8703          TLO T,(%PIFOV)
8704 MUUOT2: MOVE A,MSKST(U)
8705         IOR A,[BADBTS]
8706         AND T,A         ;INTS SETTING WHICH AREN'T DISABLED
8707         IORM T,PIRQC(U)
8708         SKIPN PICLR(U)
8709          TDZA A,A
8710           SETCM A,IDF1(U)
8711         IOR A,[BADBTS]  ;MASK FOR INTS WHICH AREN'T DEFERRED
8712         TDNE T,A
8713          JRST ONEPR1    ;TAKE INT
8714         JRST URET       ;IGNORE INT
8715
8716 MUUOEX: BUG AWFUL,[MUUO IN EXEC MODE, PC=],OCT,EPT+425
8717                         ;UUO IN EXEC MODE NOT IN SYS JOB
8718
8719 LUUOEX: 0
8720         BUG AWFUL,[LUUO IN EXEC MODE,PC=],OCT,LUUOEX
8721
8722 ILLTRP: 0
8723         BUG AWFUL,[TRAP IN EXEC MODE,PC=],OCT,ILLTRP
8724 ] ;IFE KA10P
8725
8726 IFN KA10P,[
8727 EBLK
8728 60H:    0               ;TRAPS FROM 60
8729 BBLK
8730 60H0:   UUOSAV          ;IF WE LOSE PROCESSOR HERE, 60 GETS COPIED INTO 40,
8731                         ; 60H IS COPIED INTO UUOH, AND UPC GETS MOVED INTO
8732                         ; UUOH0.
8733 60HE:   CONO PI,CLKOFF
8734         MOVE T,60H
8735         MOVEM T,UUOH
8736         MOVE T,60
8737         MOVEM T,FORTY
8738         CONO PI,CLKON
8739         JRST MUUOT1
8740 ] ;KA10P
8741 \f
8742 ;COME HERE FROM UEXIT WHEN USER IS BEING PCLSR'ED
8743 ; KA10 - ALL USER ACS ARE IN MACHINE ACS AND IN UUOACS
8744 ; KL10 & KS10 - ALL USERS ACS ARE IN AC BLOCK 1
8745
8746 ONEFLS: CONO PI,CLKOFF          ;TURN OFF CLOCK BREAKS
8747         SYSCTX
8748         MOVE U,USER             ;GET INDEX OF CURRENT USER
8749 ONEPR2: SKIPE T,RPCL(U)         ;SKIP IF NO RPCLSRING OCCURING
8750          JRST ONEFL2            ;RPCLSRING GOING ON
8751 ONEPR1: MOVE U,USER             ;GET INDEX OF CURRENT USER
8752         CONO PI,CLKOFF          ;TURN OFF CLOCK BREAKS
8753         SKIPE LSWPR(U)
8754          JRST 4,.
8755         MOVEI T,AC0S(U)         ;PUT USER ACS INTO SWAP OUT ACS
8756         XCTR XBR,[BLT T,AC17S(U)]
8757         MOVE T,UUOH
8758         MOVEM T,UPC(U)          ;SIMULATE JRST 2,@UUOH
8759 IFN KA10P, MOVE T,[JRST 2,@UUOH]
8760 IFE KA10P,[
8761         MOVSI T,(JRST 2,@)
8762         HRRI T,UUOH
8763 ] ;IFE KA10P
8764         MOVEM T,UEXIT           ;RESTORE UEXIT
8765         USRCTX
8766         MOVE U,USER             ;AS IF HAD RETURNED TO USER THEN CLKBRK
8767                                 ;EXCEPT THAT AC'S ARE ALREADY STORED IN AC0S
8768         JRST UFL6               ;RESCHEDULE, ETC
8769
8770 ONEFL2: JUMPG T,[JRST 4,.]      ;LOSEY LOSEY (SHOULD NOT TRY TO EXIT WHILE TRYING TO RPCLSR SOMEONE)
8771         MOVE A,FLSINS(T)        ;GET FLSINS OF USER SUPPOSEDLY RPCLSRING YOU
8772         SUBI A,RPCL(T)          ;HIS FLSINS SHOULD BE A SKIPE OF HIS RPCL
8773         CAME A,[SKIPE]          ;SKIP IF HE HAS THE RIGHT FLSINS
8774          JRST 4,.               ;LOSEY LOSEY
8775         CLEARM FLSINS(T)        ;ASSURE NO INTERRUPT
8776         SETZM RPCL(U)           ;ACS IN UUO ACS CLOCK OFF
8777         AOS USTP(U)             ;STOP SELF
8778         SETZM RPCL(T)           ;UNHANG LOSER RPCLSR'ING YOU
8779         JRST ONEPR1
8780 \f
8781 ;ROUTINES TO GIVE THE RUNNING JOB AN INTERRUPT AND ABORT THE CURRENT INSTRUCTION
8782
8783 TTYLOS: SKIPA T,[%PITTY] ;JOB WHOSE %TBINT IS SET TRIED TO USE ITS TTY WHEN DIDN'T OWN IT
8784 IOADC:   MOVEI T,%PIMPV ;I/O UUO MEMORY PROTECT VIOLATION
8785         JRST UUOERR
8786
8787 ABREAK: MOVEI T,%PIBRK  ;.BREAK - INTERRUPT TO SUPERIOR
8788 ILLOP4: IORM T,PIRQC(U)
8789         JRST ONEPR1
8790
8791         RADIX 10.
8792 IOCERF: ;ADDRESS OF FIRST IO CHANNEL ERROR
8793 ZZ==NIOTER
8794 IFG ZZ-9,ZZ==9
8795 REPEAT ZZ,CONC IOCER,\.RPCNT+MIOTER,:   JSP T,IOCERX
8796 IFG NIOTER-9,[REPEAT NIOTER-9,CONC IOCR,\.RPCNT+MIOTER+9,:      JSP T,IOCERX
8797 ]
8798 IFN 0, IOCER1: IOCER2: IOCER3: IOCER4: IOCER5: IOCER6: IOCER7:  ;FOR @
8799 .ALSO  IOCER8: IOCER9: IOCR10: IOCR11: IOCR12: IOCR13: IOCR14:
8800
8801         RADIX 8
8802 IOCERX: CONSZ PI,77400
8803          JRST 4,.       ;ERR WITH PI IN PROGRESS
8804         SUBI T,IOCER9-9+1
8805         MOVE U,USER
8806         HRRZ TT,UUAC(U)
8807         DPB TT,[BCHPTR] ;STORE LAST CHNL IN ERROR
8808         ADD TT,U
8809         DPB T,[330600,,IOCHST(TT)]
8810 IOCERR: MOVEI T,%PIIOC
8811         JRST UUOERR
8812
8813 AILUUO::
8814 ILUUO:  SKIPA T,[%PIILO]        ;ILLEGAL SYSTEM UUO
8815 TRPDEV:                         ;ATTEMPTED USE OF TRAP DEVICE
8816 USRTRP:  MOVSI T,(%PITRP)       ;SYSTEM UUO IN TRAP MODE
8817
8818 UUOERR: MOVE U,USER
8819         IORM T,PIRQC(U) ;GIVE USER INT BIT
8820 IOADCR: MOVE U,USER
8821         MOVE T,OPTION(U);PC CLOBBERED TO HERE IF MPV IN EXEC MODE - INTR OUT OF UUO
8822         TLNN T,%OPOPC   ;UNLESS USER HAS SAID NOT TO,
8823          AOS UUOH       ;UNDO SOS THAT PCLSR'ING WILL DO; PC SHOULD END UP -> AFTER UUO.
8824 UUOER2: CONO PI,CLKON   ;THERE HAD BETTER BE A CLASS 1 OR 2 INT. PENDING.
8825         MOVE P,USRPDL(U)
8826         SETZM SCHMNY    ;CAUSE FULL SCHEDULE SO INTERRUPT WILL BE SEEN
8827         JFCL            ; (IT'S A CROCK TO HAVE TO DO THIS, BUT HARD TO FIX)
8828         PUSHJ P,UFLS    ;LET THE INTERRUPT PCLSR US.
8829         JRST 4,.
8830
8831 UUOER1: MOVE U,USER     ;UUOERR ASSUMING %OPOPC
8832         IORM T,PIRQC(U)
8833         JRST UUOER2
8834
8835 IFN KA10P,[
8836 ILEXPF: CONO PI,CLKOFF  ;GET HERE AFTER EXEC PAGE FAULT TAKEN ON XCTRI
8837         SPM UPGML(U)
8838         MOVSI A,1770    ;CLEAR FAULT REASON BITS
8839         ANDCAM A,UPQUAN(U)
8840         LPMR UPGML(U)
8841         JRST ILUUO
8842 ] ;KA10P
8843 IFE KA10P, ILEXPF==ILUUO        ;NO CLEANUP NECESSARY
8844 \f
8845 ;UUO DISPATCH
8846
8847 ;AT DISPATCH TIME, P HAS UPDL, C HAS RH OF 40
8848 ;R HAS AC FIELD OF UUO, U HAS USER INDEX
8849
8850 UUODSP: SETZ AIOT       ;SETZ FLAGS UUO'S TO REFLECT TO USER WHEN %OPDEC OPTIONS
8851         SETZ AOPEN      ;IN EFFECT. THEY ARE THE UUOS WHICH OVERLAP DEC
8852         AOPER
8853         ACALL
8854         AUSET
8855         ABREAK
8856         ASTATUS 
8857         SETZ AACCESS
8858         SETZ AUIOT
8859 IF2,IFN <UIOT-UUOMIN>_-27.+UUODSP-.+1,.ERR LOSE AT UUODSP
8860
8861 ;.CALL IOT
8862 NIOT:   CAIL W,3        ;SET IOTBTS TO USER'S 3RD ARG, OR TO 0.
8863          SETZ C,
8864         MOVEM C,IOTBTS(U)
8865         HRRZ C,B        ;ADDRESS OF 2ND ARG
8866         SKIPGE SYSCVL(U)
8867          SKIPA C,[SETZ] ;USING OUTPUT ARG INSTEAD OF INPUT, FOR UNIT INPUT MODE
8868           CAIL W,2
8869            AOSA (P)     ;GOING TO SUCCEED NOW
8870             JRST OPNL30 ;NOT ENOUGH ARGS
8871         JRST AIOT1
8872
8873 ;.IOT
8874 AIOT:   SETZM CTLBTS(U)
8875         SETZM IOTBTS(U)
8876         ADDI R,IOCHNM(U) ;GET IOCHNM WD ADDR IN R.
8877 AIOT1:  MOVE A,U
8878         IDIVI A,LUBLK
8879         SKIPE B
8880          BUG
8881         HLRZ A,(R)      ;PICK UP LEFT HALF (DEVICE DEPENDENT)
8882         HRRZ B,(R)      ;PICK UP RIGHT HALF (INDEX INTO IOTTB, ETC.)
8883         MOVE D,IOTTB(B) ;GO TO ROUTINE FOR PARTICULAR DEV AND MODE
8884         TLNE D,%IOTOT+%IOTBK+%IOTSP     ;BUT FOR "NORMAL" UNIT MODE INPUT, SPECIAL:
8885          JRST (D)
8886         XCTR XRW,[MOVES (C)] ;MAKE SURE XCTR XW, BELOW WON'T PCLSR.
8887         PUSH P,C
8888         PUSHJ P,(D)     ;CALL IOT ROUTINE, EXPECTING VALUE IN W.
8889 AIOT3:   JRST AIOT2     ;NOTE AIOT3 MAY BE CHECKED FOR ON PDL.
8890           JRST AIOT2
8891
8892 AIOT2:  POP P,C
8893         SKIPGE C
8894          SKIPA A,W      ;RETURNING IN NEW SYSTEM-CALL STYLE
8895           UMOVEM W,(C)
8896         POPJ P,
8897
8898 ;RANDOM ACCESS
8899
8900 AACCES: HRRZ A,UUAC(U)
8901         UMOVE B,(C)
8902         MOVE T,['ACCESS]
8903         MOVEM T,LSCALL(U)       ;IN CASE PASSED TO JOB DEVICE
8904         MOVEI W,2
8905         PUSHJ P,NACCES
8906          JRST IOCER8    ;FOR .ACCESS, SIGNAL FAILURE WITH IOC ERROR.
8907         POPJ P,         ;ONLY POSSIBLE FAILURE IS CHANNEL NOT OPEN.
8908
8909 NACCES: MOVEI T,AIOCAL  ;GET <CLSTB BITS>,,<IOCHNM WD ADDR> IN R
8910         MOVSI J,NACCE1
8911         JRST CHNDCD
8912
8913 NACCE1: TLNN R,%CLSQ\%CLSU\%CLSFU
8914          JRST OPNL34
8915         HRRM B,IOCHST-IOCHNM(R) ;STORE USR .ACCESS POINTER
8916         TLNN R,%CLSQ
8917          JRST POPJ1             ;NOT DISK
8918         HLRZ I,(R)
8919         MOVEM B,QRADAD(I)       ;STORE ACCESS POINTER FOR DSK
8920         MOVSI D,%QAACC
8921         IORM D,QSRAC(I) ;SET ADR HAS BEEN HACKED FLAG
8922         JRST POPJ1
8923 \f
8924 ;SIOT SYMBOLIC SYSTEM CALL - IOT A STRING.
8925 ; 1ST ARG CHANNEL NUMBER.
8926 ; 2ND ARG BYTE POINTER
8927 ; 3RD ARG STRING LENGTH
8928 ; 4TH (OPTIONAL) ARG DEVICE-INDEPENDENT CONTROL BITS
8929 ; CTLBTS  DEVICE DEPENDENT CONTROL BITS
8930
8931 NSIOT:  TLNN B,1000     ;OBJECT IF B.P. OR COUNT IS IMMEDIATE.
8932          TLNE C,1000
8933           JRST OPNL33
8934         CAIGE W,4
8935          SETZ D,
8936         MOVEM D,IOTBTS(U)
8937         MOVE D,IOTTB(H)
8938         TLNE D,%IOTBK+%IOTSP    ;SIOT ALLOWED ONLY ON UNIT MODE CHANNELS.
8939          JRST OPNL12            ;"MODE NOT AVAILABLE".
8940         XCTR XRW,[MOVES A,(B)]  ;ENSURE BYTE POINTER WRITABLE
8941         TLNE A,(@)              ;CAN'T HACK BYTE POINTER WITH INDIRECT ADDRESSING
8942          JRST OPNL33            ;MEANINGLESS ARGS
8943         TLNE A,17
8944          PUSHJ P,NSIOT9         ;HACK INDEXING
8945         XCTR XRW,[MOVES A,(C)]  ;ENSURE BYTE COUNT WRITABLE
8946         JUMPLE A,POPAJ1         ;0 BYTES TO BE XFERED => SUCCEED IMMEDIATELY.
8947         HLRZ A,(R)
8948         MOVE TT,B               ;IN CASE SPECIAL ROUTINE WANTS TO CALL SIOKT
8949         TLNE D,%IOTBP           ;IF THERE'S A SPECIAL DEVICE ROUTINE FOR SIOT,
8950          JRST -1(D)             ;GO TO IT.
8951 ;THIS CALL IS LEGAL AND ORDINARY. LOOP, CALLING THE UNIT MODE ROUTINE.
8952 NSIOT1: PUSH P,A
8953         PUSH P,B
8954         PUSH P,C
8955         PUSH P,D                ;PUT ALL IMPORTANT INFO ON STACK FOR MAIN LOOP
8956         HRRZS (P)               ;TO LOOK AT.
8957         PUSH P,R
8958         TLNN D,%IOTOT
8959          JRST NSIOIL            ;INPUT AND OUTPUT PART HERE
8960 NSIOOL: UMOVE A,@-3(P)
8961         IBP A                   ;THIS HAIR IS TO AVOID INCREMENTING THE USER'S COPY
8962         UMOVE D,(A)             ;OF THE BYTE POINTER BEFORE THE BYTE HAS BEEN
8963         HRRI A,D                ;FINALLY TAKEN WITH NO POSSIBILITY OF PCLSR'ING OUT.
8964         LDB D,A                 ;CAN'T USE XCTR XR,[LDB D,A] BECAUSE ON THE KA10
8965         MOVE C,[SETZ D]         ;THAT WOULD USE THE LOSER'S AC A.
8966         MOVE R,(P)
8967         MOVE A,-4(P)    ;SET UP ARGS FOR IOT ROUTINE; C HAS ADDR OF VALUE.
8968         PUSHJ P,@-1(P)  ;CALL THE IOT ROUTINE.
8969         XCTR XRW,[IBP @-3(P)]   ;NOW STEP THE B.P. AND COUNT.
8970         XCTR XRW,[SOS A,@-2(P)]
8971         JUMPG A,NSIOOL
8972         JRST NSIOTX
8973
8974 NSIOIL: UMOVE A,@-3(P)
8975         IBP A           ;MAKE SURE NO FAULT IDPB'ING THE BYTE
8976         XCTR XRW,[MOVES (A)]
8977         MOVE R,(P)      ;NOW GET THE ARGS FOR THE IOT ROUTINE,
8978         MOVE A,-4(P)
8979         PUSHJ P,@-1(P)  ;AND CALL IT, WITH VALUE COMING IN W.
8980          JRST NSIOI3    ;NO SKIP => WE WIN.
8981           JRST NSIOTX   ;1 SKIP => THERE'S NO INPUT; RETURN WITHOUT STEPPING B.P.
8982                         ;2 SKIPS => THIS BYTE IS THE LAST ONE AVAILABLE.
8983         XCTR XBYTE,[IDPB W,@-3(P)]
8984         XCTR XRW,[SOS @-2(P)]
8985         JRST NSIOTX
8986
8987 NSIOI3: XCTR XBYTE,[IDPB W,@-3(P)]
8988         XCTR XRW,[SOS A,@-2(P)]
8989         JUMPG A,NSIOIL
8990 NSIOTX: SUB P,[5,,5]
8991         JRST POPJ1
8992
8993 NSIOT9: EXCH A,R        ;INDEXED BYTE POINTER, EVAL INDEX ONCE AND WRITE BACK
8994         PUSHJ P,ASCIND
8995         EXCH A,R
8996         UMOVEM A,(B)
8997         POPJ P,
8998 \f;
8999 ; ROUTINES TO SIMULATE SOME I/O INSTRUCTIONS WHEN EXECUTED BY USER
9000
9001 IFE KS10P,[     ; KS10 will never have any devices so we might as well punt
9002                 ; this sham right from the start.
9003
9004 AUIOT:  MOVE I,FORTY    ;GET I/O INST
9005         ANDI R,7        ;GET IOT TYPE FIELD
9006         LDB J,[320700,,FORTY]
9007         LDB D,[420200,,IOTTYP(R)]
9008         JRST @IOTTYP(R) ;DISPATCH ON TYPE
9009
9010 IOTTYP: 000000,,IOTTY3          ;BLKI
9011         000000,,IOTTY2          ;DATAI
9012         200000,,IOTTY3          ;BLKO
9013         200000,,IOTTY2          ;DATAO
9014         600000,,IOTTY2          ;CONO
9015         400000,,IOTTY2          ;CONI
9016         400000,,IOTTY1          ;CONSZ
9017         400000,,IOTTY1          ;CONSO
9018
9019 IOTTY1: CAIN J,177      ;IF EQ INST WAS 7777XX,,XXXXXX
9020         JRST ILUUO      ;USER HAS EXECUTED A SMALL NEGATIVE NUMBER
9021         JRST IOTTY2
9022
9023 IOTTY3:
9024 IFN KL10P,[
9025         MOVE C,DCHNTB(J)
9026         TRNE C,10000
9027          JRST IOTTY2    ;SPECIAL BLKI THAT IS TREATED LIKE DATAI
9028 ]
9029         TLO I,40        ;BLOCK TYPE, TURN ON BIT TO CONVERT TO UNIT
9030         UMOVE C,(I)     ;GET BLOCK POINTER
9031         ADD C,[1,,1]    ;ADVANCE
9032         TLNE C,-1       ;SKIP IF OVERFLOW
9033         AOS (P)         ;CAUSE RETURN TO SKIP
9034         UMOVEM C,(I)    ;STORE BACK
9035         HRR I,C         ;MODIFY INST ADR TO RH OF BLOCK POINTER
9036 IOTTY2: SKIPL C,DCHNTB(J)
9037         JRST IOTTYA
9038         LSH C,19.(D)
9039         SKIPL C
9040         JRST ILUUO
9041 IOTTYB: XCTR XRW,I      ;DO IOT
9042         POPJ P,         ;NORMAL RETURN
9043         JRST POPJ1      ;IOT SKIPPED RETURN
9044
9045 IOTTYA: SKIPGE DCHNTC(J)
9046         JRST ILUUO      ;SUSPICIOUS DEVICE
9047         JRST IOTTYB
9048
9049 ] ;IFE KS10P
9050
9051 IFN KS10P, AUIOT==:ILUUO        ; For now.
9052
9053 IFN 0,[         ; Simple IO instruction simulating for the KS should look
9054                 ; like this.  Unfortunately XCTR XRW,[APRID 100] clobbers
9055                 ; exec location 100.  Further investigation is needed
9056                 ; before figuring out how to deal with this.
9057
9058 AUIOT:  LDB R,[271500,,FORTY]   ; Get opcode and AC.
9059         CAIE R,APRID_-27        ; For now this is the only instruction we
9060                                 ; simulate on the KS
9061          JRST ILUUO
9062         XCTR XRW,FORTY          ; Do it
9063          POPJ P,                ; Return normally
9064         JRST POPJ1              ; It skipped (well APRID can't, but perhaps
9065                                 ; someday something else will)
9066 ] ;IFN 0
9067 \f
9068 SUBTTL .SUSET, .USET, .CALL USRVAR
9069
9070 ;COMMON CODE FOR USRVAR, TTYVAR, ETC. SYMBOLIC SYSTEM CALLS
9071 ;PUSHJ P,VARCAL WITH FIRST ARG DECODED INTO H,I,J,R; B,C,W,U SET UP AS IN .CALL
9072 ;NOTE B IS A POINTER TO THE SECOND ARG (IN BLOCK MODE IS WRITTEN BACK)
9073 ;POPJS (OR PUSHJS IN THE CASE OF BLOCK MODE) BACK WITH E CONTAINING
9074 ;VARIABLE SPEC, D INPUT DATA, W INSTRUCTION TO HACK IT (0 TO READ INTO A,
9075 ;OTHERWISE OP D, WITH RH CLEAR WHERE OP IS MOVEM, ANDCAM, ADDM, ETC.)
9076
9077 VARCAL: HRRZ E,B        ;USE 2ND ARG AND NUM OF ARGS TO DETERMINE TYPE OF OPERATION
9078         TLNE B,1000
9079          JRST VARCA1    ;IMMEDIATE 2ND ARG
9080         UMOVE E,(B)     ;GET VALUE OF 2ND ARG
9081         TLC E,777000
9082         TLCN E,777000
9083          JRST VARCBL    ;BLOCK MODE (2ND ARG LOOKS LIKE AOBJN POINTER)
9084 VARCA1: EXCH D,C        ;D GETS 3RD ARG, INPUT DATA
9085         CAIL W,4
9086          JRST VARCA2    ;JUMP IF IMMEDIATE INSTRUCTION MODE
9087         CAIGE W,3       ;SKIP IF WRITING
9088          TDZA W,W       ;W 0 FOR READING
9089           MOVSI W,(MOVEM D,) ;SIMPLE CASE OF WRITING (SEE VARCBL FOR HAIR)
9090         POPJ P,         ;CALLER WILL DO OPERATION AND POPJ1 OR OPEN-LOSS
9091
9092 VARCA2: ADD P,[2,,2]    ;IMMEDIATE INSTRUCTION MODE.  MAKE STACK SAME AS AT VARCAL.
9093         TLNN C,-1       ;E HAS VARIABLE SPEC
9094          MOVSS C        ;C GETS INSTRUCTION
9095         PUSHJ P,VARCA3  ;PERFORM THE INSTRUCTION
9096         JRST POP3J1     ;TAKE GOOD RETURN FROM THE CALL
9097
9098 VARCBL: PUSH P,J        ;BLOCK MODE.  SAVE J WHICH SOME SUSETS CLOBBER
9099         PUSH P,B        ;SAVE POINTER TO AOBJN POINTER TO SPEC,INSN PAIR LIST
9100         XCTR XRW,[MOVES B,@(P)] ;GET AOBJN POINTER, TEST WRITEABILITY
9101 VARCB1: UMOVE E,(B)     ;GET VARIABLE SPEC
9102         UMOVE C,1(B)    ;GET "INSTRUCTION"
9103         MOVE J,-1(P)    ;GET DECODED FIRST ARG OR WHATEVER (SOME USRVAR ROUTINES CLOBBER J)
9104         PUSHJ P,VARCA3  ;PERFORM THE INSTRUCTION
9105         MOVE B,[2,,2]
9106         XCTR XRW,[ADDB B,@(P)]  ;ADVANCE AOBJN POINTER
9107         JUMPL B,VARCB1          ;MORE STUFF TO DO
9108         JRST POP3J1             ;POINTER COUNTED OUT, POP B, J, PUSHJ TO VARCAL
9109
9110 VARCA3: EXCH C,R        ;HERE TO PERFORM INSTRUCTION IN C
9111         TLNE R,37
9112          PUSHJ P,ASCIND         ;EVALUATE INSTRUCTION'S EFFECTIVE ADDRESS
9113         EXCH C,R
9114         LDB B,[410300,,C]       ;GET MAJOR PDP10 OPCODE CLASS
9115         JRST @.+1(B)
9116          VARCBE         ;0 UUO ILLEGAL
9117          VARCBE         ;1 FP/BYTE ILLEGAL
9118          VARCB2         ;2 MOVE/ADD/SUB
9119          VARCBE         ;3 CAM ETC. RESERVED FOR .HANGING IN THE FUTURE
9120          VARCB4         ;4 BOOLE
9121          VARCBE         ;5 HWT ILLEGAL
9122          VARCB6         ;6 TEST
9123          VARCBE         ;7 IOT ILLEGAL
9124
9125 VARCBE: SUB P,[4,,4]    ;POP PUSHJ TO VARCA3, B, J, PUSHJ TO VARCAL
9126         JRST OPNL33     ;BAD ARG
9127
9128 VARCB6: TLNE C,006000   ;TEST INSTRUCTION - SKIP IF NO SKIP
9129          JRST VARCBE    ;SKIPPING TESTS RESERVED FOR FUTURE .HANGS
9130         TLNE C,010000   ;SKIP IF IMMEDIATE
9131          XCTR XR,[SKIPA D,(C)]
9132           HRRZ D,C
9133         TLNE C,001000   ;SKIP IF TDX OR TRX
9134          MOVSS D        ;TSX OR TLX
9135         LDB C,[370200,,C] ;GET MODIFICATION TYPE
9136         XCT (C)[JRST VARCBE     ;NO MODIFICATION OBVIOUSLY AN ERROR
9137                 MOVSI W,(ANDCAM D,) ;TXZ
9138                 MOVSI W,(XORM D,)   ;TXC
9139                 MOVSI W,(IORM D,)]  ;TXO
9140         JRST VARCBA
9141 \f
9142 VARCB4: TLNE C,002000   ;BOOLEAN INSTRUCTION - OK IF RESULT TO AC
9143          JRST VARCBE
9144         TLNN C,001000   ;SKIP IF IMMEDIATE
9145          XCTR XR,[SKIPA D,(C)]
9146           HRRZ D,C
9147         HLLZ W,C        ;SET UP OPCODE TO HAVE A+M EXCHANGED
9148         TLZ W,003777    ;AND RESULT TO BE SENT TO MEMORY
9149         TLCE W,030000
9150          TLCE W,030000
9151           TLC W,030000
9152         TLO W,(<002000,,> D,)
9153         JRST VARCBA
9154
9155 VARCB2: SETZB W,D               ;MOVE/ADD/SUB GROUP
9156         HLRZ B,C
9157         CAIN B,(MOVEM)
9158          JRST VARCBB            ;SIMPLY READING
9159         TLNE C,002000
9160          JRST VARCBE            ;RESULT MUST BE TO AC
9161         TLZ C,(0 17,)           ;CHANGE AC FIELD TO D
9162         TLO C,(0 D,)
9163         TLNE C,060000           ;SKIP IF MOVE GROUP
9164          JRST VARCB5
9165         XCTR XR,C               ;FETCH OPERAND, DO MODIFICATION IF CALLED FOR (MOVN)
9166         MOVSI W,(MOVEM D,)      ;OPERATION WILL BE SIMPLE STORE
9167         JRST VARCBA
9168
9169 VARCB5: TLC C,070000
9170         TLCE C,070000
9171          JRST VARCBE            ;NOT ADD/SUB
9172         XCTR XR,C               ;ADD TO/SUBTRACT FROM ZERO IN D
9173         MOVSI W,(ADDM D,)       ;DROP INTO VARCBA
9174
9175 ;HERE WITH E, W, D ALL SET UP FOR WRITING.
9176 VARCBA: PUSHJ P,@-3(P)          ;CALL BACK TO CALLER OF VARCAL
9177          JRST POP4J             ;LOST, POP PUSHJ TO VARCA3, B, J, VARCAL, TAKE ERR RETURN
9178         POPJ P,                 ;WON, RETURN FROM VARCA3
9179         
9180 ;HERE WITH E AND W SET UP FOR READING.
9181 VARCBB: PUSH P,C                ;SAVE ADDRESS TO BE READ INTO
9182         XCTR XRW,[MOVES (C)]    ;NO FAULT.  INSURANCE OF WRITEABILITY.
9183         PUSHJ P,@-4(P)          ;GET VALUE OF VARIABLE INTO A
9184          JRST POP5J             ;LOST POP C, VARCA3, B, J, VARCAL, TAKE ERR RETURN TO USER
9185         POP P,C                 ;WON, STORE RESULT INTO USER
9186         UMOVEM A,(C)
9187         POPJ P,                 ;AND RETURN FROM VARCA3
9188 \f
9189 USETBT: 420200,,USETL(E)        ;BYTE POINTER TO UENTRY FIELD A
9190         400200,,USETL(E)        ; " B
9191         200200,,USETL(E)        ; " C
9192         160200,,USETL(E)        ; " D
9193
9194 USETRL: 221600,,USETL(E)        ;BYTE POINTER TO UENTRY FIELD E
9195         001600,,USETL(E)        ; " F
9196
9197 ;IN EACH UENTRY ENTRY:  A IS THE METHOD FOR USET READ
9198 ;                       B IS THE METHOD FOR SUSET READ
9199 ;                       C IS THE METHOD FOR USET SET
9200 ;                       D IS THE METHOD FOR SUSET SET
9201 ;                       E & F ARE USED BY THE METHODS AS LISTED BELOW
9202 ;METHOD 0 = ILLEGAL MODE
9203 ;METHOD 1 = USE F AS RELATIVE LOC OF VAR
9204 ;METHOD 2 = USE E AS ROUTINE TO TRANSFER TO
9205 ;METHOD 3 = USE F AS ROUTINE TO TRANSFER TO
9206
9207 DEFINE UENTRY A,B,C,D,E,F
9208         ZZ==.SUCCESS
9209         A_20+B_16+E,,C_20+D_16+F
9210         IF2 [
9211         IFN 777774&<A\B\C\D>,[PRINTX /UENTRY A,B,C,D TOO BIG
9212 /]      IFN 740000&<E\F>,[PRINTX /UENTRY E,F TOO BIG
9213 /]      IFSE [E!F],[PRINTX /UENTRY E,F NULL
9214 /]      ]
9215         .SUCCESS==ZZ
9216         TERMIN
9217
9218 USETL:  UENTRY 1,1,2,0,UPCSET,UPC-USRSTG        ;.UPC
9219         UENTRY 1,1,1,1,,VALUE-USRSTG            ;.VAL
9220         UENTRY 3,3,2,2,USTTY,URTTY              ;.TTY
9221         UENTRY 1,1,0,0,,FLSINS-USRSTG           ;.FLS
9222         UENTRY 1,1,0,2,UUNAME,UNAME-USRSTG      ;.UNAME
9223         UENTRY 1,1,2,2,UJNAME,JNAME-USRSTG      ;.JNAME
9224         UENTRY 1,1,2,2,USMASK,MSKST-USRSTG      ;.MASK
9225         UENTRY 1,1,2,0,USTOP,USTP-USRSTG        ;.USTP
9226
9227         UENTRY 1,1,2,2,USPIRQ,PIRQC-USRSTG      ;.PIRQC
9228         UENTRY 2,2,0,0,UGSUPR,                  ;.INTB
9229         UENTRY 1,1,2,2,USMEMT,HUSRAD-USRSTG     ;.MEMT
9230         UENTRY 1,1,0,0,,SV40-USRSTG             ;.SV40
9231 REPEAT 2,UENTRY 1,1,2,2,IAPIRQ,PIRQC-USRSTG     ;.IPIRQ/.APIRQ
9232         UENTRY 1,1,2,2,USYNST,USYSNM-USRSTG     ;.SNAME
9233         UENTRY 1,1,2,2,UPISET,PICLR-USRSTG      ;.PICLR
9234
9235         UENTRY 2,2,3,3,URMAR,USMAR              ;.MARA
9236         UENTRY 1,1,1,1,,UMARPC-USRSTG           ;.MARPC
9237         UENTRY 1,1,0,0,,SUUOH-USRSTG            ;.UUOH
9238         UENTRY 2,2,0,0,UINDEX,                  ;.UIND
9239         UENTRY 1,2,0,0,UTRNTR,UTRNTM-USRSTG     ;.RUNT
9240         UENTRY 1,1,2,2,USMSK2,MSKST2-USRSTG     ;.MSK2
9241         UENTRY 1,1,2,2,USIFPI,IFPIR-USRSTG      ;.IFPIR
9242         UENTRY 1,1,0,0,,APRC-USRSTG             ;.APRC
9243
9244         UENTRY 3,3,0,0,,URCNSL                  ;.CNSL
9245         UENTRY 2,0,3,0,RUTRAP,SUTRAP            ;.UTRP
9246 REPEAT 2,UENTRY 1,1,2,2,IAIFPI,IFPIR-USRSTG     ;.IIFPI/.AIFPI
9247 REPEAT 2,UENTRY 1,1,2,2,IAMASK,MSKST-USRSTG     ;.IMASK/.AMASK
9248 REPEAT 2,UENTRY 1,1,2,2,IAMSK2,MSKST2-USRSTG    ;.IMSK2/.AMSK2
9249
9250         UENTRY 3,3,2,2,UJPCS,UJPCR,             ;.JPC
9251         UENTRY 2,2,0,0,UROPC,                   ;.OPC
9252         UENTRY 1,1,1,1,,RTIMER-USRSTG           ;.RTMR
9253         UENTRY 1,1,1,1,,HSNAME-USRSTG           ;.HSNAME
9254 ;IFN KL10P,UENTRY 1,1,1,1,,ULSPBR-USRSTG        ;.LSPBR
9255 ;.ELSE  UENTRY 1,1,1,1,,SRN3-USRSTG
9256         UENTRY 2,2,3,3,RUBCHN,SUBCHN,           ;.BCHN
9257         UENTRY 2,2,0,0,MPVARD                   ;.MPVA
9258 REPEAT 2,UENTRY 1,1,2,2,IADF1,IDF1-USRSTG       ;.IDF1, .ADF1
9259
9260 REPEAT 2,UENTRY 1,1,2,2,IADF2,IDF2-USRSTG       ;.IDF2, .ADF2
9261         UENTRY 1,1,2,2,USDF1,IDF1-USRSTG        ;.DF1
9262         UENTRY 1,1,2,2,USDF2,IDF2-USRSTG        ;.DF2
9263         UENTRY 1,1,1,1,,OPTION-USRSTG           ;.OPTION
9264         UENTRY 1,1,1,1,,40ADDR-USRSTG           ;.40ADDR
9265 IFE N11TYS,     UENTRY 1,1,1,1,,SRN3-USRSTG     ;.TVCREG - JOB'S CONSOLE REGISTER CONTENTS
9266 IFN N11TYS,     UENTRY 1,1,1,2,STVCRG,TVCREG-USRSTG
9267         UENTRY 1,1,1,1,,TTSTSV+2-USRSTG         ;.TTST
9268
9269         UENTRY 1,1,1,1,,TTSTSV-USRSTG           ;.TTS1
9270         UENTRY 1,1,1,1,,TTSTSV+1-USRSTG         ;.TTS2
9271         UENTRY 1,1,1,1,,UWHO1-USRSTG            ;.WHO1
9272         UENTRY 1,1,1,1,,UWHO2-USRSTG            ;.WHO2
9273         UENTRY 1,1,1,1,,UWHO3-USRSTG            ;.WHO3
9274         UENTRY 3,3,0,0,,RUSUPP                  ;.SUPPRO
9275 IFN KA10P, UENTRY 2,2,0,0,URTR1I                ;.TR1INS
9276 IFE KA10P, UENTRY 1,1,1,1,,TR1INS-USRSTG
9277 IFN KA10P, UENTRY 2,2,0,0,URTR2I                ;.TR2INS
9278 IFE KA10P, UENTRY 1,1,1,1,,TR2INS-USRSTG
9279
9280 IFE KL10P,[
9281 REPEAT 4,UENTRY 1,1,0,0,,SRN3-USRSTG
9282 ] ;IFE KL10P
9283 IFN KL10P,[
9284         UENTRY 1,0,0,0,,MBOXCT-USRSTG           ;.MBOX
9285         UENTRY 1,0,0,0,,MBOXCT+1-USRSTG         ;.MBO1
9286         UENTRY 1,0,0,0,,EBOXCT-USRSTG           ;.EBOX
9287         UENTRY 1,0,0,0,,EBOXCT+1-USRSTG         ;.EBO1
9288 ] ;KL10P
9289         UENTRY 1,1,1,1,,XUNAME-USRSTG           ;.XUNAME (USER'S REAL NAME)
9290         UENTRY 1,1,1,1,,XJNAME-USRSTG           ;.XJNAME
9291         UENTRY 1,1,1,1,,SRN4-USRSTG             ;.FTL1
9292         UENTRY 1,1,1,1,,SRN5-USRSTG             ;.FTL2
9293         UENTRY 1,1,1,1,,PAGRAN-USRSTG           ;.PAGRANGE
9294         UENTRY 1,1,1,1,,PAGAHD-USRSTG           ;.PAGAHEAD
9295         UENTRY 2,2,3,3,URSERV,USSERV            ;.SERVER
9296 MXVAL==.-USETL
9297 EXPUNGE UENTRY  ;NO MORE UENTRY'S
9298 \f
9299 MXVAL2==.RADIX 2,CONC [.LENGTH/]\MXVAL-1,/      ;BASE 2 LOG OF TABLE SIZE
9300
9301 ;SIXBIT TABLE OF USER VARIABLE NAMES.  MUST BE IN CORRECT ORDER,
9302 ;SAME AS SYSCTB.
9303
9304 USETTB: SIXBIT/ADF1/
9305         SIXBIT/ADF2/
9306         SIXBIT/AIFPIR/
9307         SIXBIT/AMASK/
9308         SIXBIT/AMSK2/
9309         SIXBIT/APIRQC/
9310         SIXBIT/APRC/
9311         SIXBIT/BCHN/
9312         SIXBIT/CNSL/
9313         SIXBIT/DF1/
9314         SIXBIT/DF2/
9315         SIXBIT/EBO1/
9316         SIXBIT/EBOX/
9317         SIXBIT/FLS/
9318         SIXBIT/FTL1/
9319         SIXBIT/FTL2/
9320         SIXBIT/HSNAME/
9321         SIXBIT/IDF1/
9322         SIXBIT/IDF2/
9323         SIXBIT/IFPIR/
9324         SIXBIT/IIFPIR/
9325         SIXBIT/IMASK/
9326         SIXBIT/IMSK2/
9327         SIXBIT/INTB/
9328         SIXBIT/IPIRQC/
9329         SIXBIT/JNAME/
9330         SIXBIT/JPC/
9331         SIXBIT/MARA/
9332         SIXBIT/MARPC/
9333         SIXBIT/MASK/
9334         SIXBIT/MBO1/
9335         SIXBIT/MBOX/
9336         SIXBIT/MEMT/
9337         SIXBIT/MPVA/
9338         SIXBIT/MSK2/
9339         SIXBIT/OPC/
9340         SIXBIT/OPTION/
9341         SIXBIT/PAGAHE/
9342         SIXBIT/PAGRAN/
9343         SIXBIT/PICLR/
9344         SIXBIT/PIRQC/
9345         SIXBIT/RTMR/
9346         SIXBIT/RUNT/
9347         SIXBIT/SERVER/
9348         SIXBIT/SNAME/
9349         SIXBIT/SUPPRO/
9350         SIXBIT/SV40/
9351         SIXBIT/TR1INS/
9352         SIXBIT/TR2INS/
9353         SIXBIT/TTS1/
9354         SIXBIT/TTS2/
9355         SIXBIT/TTST/
9356         SIXBIT/TTY/
9357         SIXBIT/TVCREG/
9358         SIXBIT/UIND/
9359         SIXBIT/UNAME/
9360         SIXBIT/UPC/
9361         SIXBIT/USTP/
9362         SIXBIT/UTRP/
9363         SIXBIT/UUOH/
9364         SIXBIT/VAL/
9365         SIXBIT/WHO1/
9366         SIXBIT/WHO2/
9367         SIXBIT/WHO3/
9368         SIXBIT/XJNAME/
9369         SIXBIT/XUNAME/
9370         SIXBIT/40ADDR/
9371 IFN .-USETTB-MXVAL, .ERR USETTB INCONSISTENT WITH USETL
9372 REPEAT 1_<MXVAL2>-<MXVAL-1>-1, <SETZ>-1 ;PAD TO POWER OF 2 WITH PLUS INFINITY
9373 \f
9374 ;THE FOLLOWING TABLE IS PARALLEL TO USETTB AND GIVES THE NUMERIC USET CODE
9375 ;WHICH SHOULD BE IN THE RANGE 0 - 77 OR 600 AND UP.
9376 USETBN: 47      ;.ADF1
9377         51      ;.ADF2
9378         33      ;.AIFPI
9379         35      ;.AMASK
9380         37      ;.AMSK2
9381         15      ;.APIRQ
9382         27      ;.APRC
9383         44      ;.BCHN
9384         30      ;.CNSL
9385         52      ;.DF1
9386         53      ;.DF2
9387         73      ;.EBO1
9388         72      ;.EBOX
9389         3       ;.FLS
9390         76      ;.FTL1
9391         77      ;.FTL2
9392         43      ;.HSNAME
9393         46      ;.IDF1
9394         50      ;.IDF2
9395         26      ;.IFPIR
9396         32      ;.IIFPI
9397         34      ;.IMASK
9398         36      ;.IMSK2
9399         11      ;.INTB
9400         14      ;.IPIRQ
9401         5       ;.JNAME
9402         40      ;.JPC
9403         20      ;.MARA
9404         21      ;.MARPC
9405         6       ;.MASK
9406         71      ;.MBO1
9407         70      ;.MBOX
9408         12      ;.MEMT
9409         45      ;.MPVA
9410         25      ;.MSK2
9411         41      ;.OPC
9412         54      ;.OPTION
9413         601     ;.PAGAHE
9414         600     ;.PAGRAN
9415         17      ;.PICLR
9416         10      ;.PIRQC
9417         42      ;.RTMR
9418         24      ;.RUNT
9419         602     ;.SERVER
9420         16      ;.SNAME
9421         65      ;.SUPPRO
9422         13      ;.SV40
9423         66      ;.TR1INS
9424         67      ;.TR2INS
9425         60      ;.TTS1
9426         61      ;.TTS2
9427         57      ;.TTST
9428         2       ;.TTY
9429         56      ;.TVCREG
9430         23      ;.UIND
9431         4       ;.UNAME
9432         0       ;.UPC
9433         7       ;.USTP
9434         31      ;.UTRP
9435         22      ;.UUOH
9436         1       ;.VAL
9437         62      ;.WHO1
9438         63      ;.WHO2
9439         64      ;.WHO3
9440         75      ;.XJNAME
9441         74      ;.XUNAME
9442         55      ;.40ADDR
9443 IFN .-USETBN-MXVAL, .ERR USETBN INCONSISTENT WITH USETL
9444 \f
9445 ;.CALL USRVAR HACK USER VARIABLES.
9446 ;ARG 1 - <JOB> SPEC
9447 ;ARG 2 - AOBJN PNTR FOR BLOCK MODE OR 0,,USER-VAR-NUMBER OR SIXBIT/USER-VAR-NAME/
9448 ;ARG 3 - DATA IF WRITING AND NOT IN BLOCK MODE. (OPTIONAL)
9449 ;ARG 4 - IMMEDIATE INSTRUCTION, OVERRIDES ARG 3. (OPTIONAL)
9450 ;VAL 1 - DATA IF READING AND NOT IN BLOCK MODE
9451
9452 NUSRVA: MOVE J,A                ;DECODE FIRST ARG
9453         JSP T,NCORUI            ;GET JOB AND LOCK ITS DIELOK
9454          JRST NUSRV0            ;DEFINITELY WRITEABLE
9455         JSP T,NCORWR            ;NOT SURE, CHECK FURTHER
9456          TLO J,(SETZ)           ;SET WRITE PROTECT BIT
9457 NUSRV0:
9458 IFN PDP6P,[
9459         TRNE J,400000
9460          PUSHJ P,NULSET
9461 ]
9462         PUSHJ P,NUSRV5          ;DO IT
9463          POPJ P,                ;LOST
9464         JRST LSWPJ1             ;WON, UNLOCK DIELOK AND TAKE SUCCESS RETURN
9465
9466 NUSRV5: PUSHJ P,VARCAL          ;DECODE ARGS, HACK BLOCK MODE, SET E, W, D.
9467 NUSRV3: SETZB B,I               ;ENTER HERE FROM .USET AND .SUSET
9468         TLNN E,-1               ;NOW DECODE USER VARIABLE SPEC
9469          JRST NUSRV1            ;JUMP IF OLD STYLE NUMERIC SPEC
9470 REPEAT MXVAL2,[                 ;SIXBIT SPEC LOOK UP IN TABLE
9471         CAML E,USETTB+1_<MXVAL2-.RPCNT-1>(B)
9472          ADDI B,1_<MXVAL2-.RPCNT-1>
9473 ]
9474         CAMN E,USETTB(B)
9475          CAIL B,MXVAL
9476           JRST OPNL11           ;ILLEGAL USER VARIABLE NAME
9477         MOVE E,USETBN(B)        ;TRANSLATE TO NUMERIC SPEC
9478 NUSRV1: JUMPE W,NUSRV2          ;READING
9479         JUMPL J,OPNL31          ;WRITING AND WRITE PROTECTED
9480         MOVEI I,2               ;MAGIC INDEX 1.2=R/W 1.1=OTHER/SELF
9481 NUSRV2: CAIN U,(J)
9482          IORI I,1
9483 IFN PDP6P,[
9484         HRRE B,J
9485         AOJE B,PDPPMT           ;USER IS PDP6
9486 ]
9487         CAIL E,600
9488          JRST [ SUBI E,500
9489                 JRST NUSRV4]
9490         CAIL E,100
9491          JRST AUSET2            ;100 TO 577 ARE .IOC, .IOS, .IOP, .PMAP VARS.
9492 NUSRV4: CAIL E,MXVAL            ;DETECT USET CODE BEYOND 6XX MAXIMUM.
9493          JRST OPNL11
9494         LDB B,USETBT(I)         ;GET METHOD BITS
9495         SOJL B,OPNL12           ;VARIABLE NOT AVAILABLE THIS MODE (WRITE PROTECT?)
9496         SOJL B,AUSVAR           ;SIMPLE VARIABLE
9497         LDB B,USETRL(B)         ;GET ADDRESS OF ROUTINE TO CALL
9498         HRRZ A,J                ;SOME ROUTINES WANT USER INDEX IN A
9499         JUMPE W,(B)
9500         CAMN W,[MOVEM D,]
9501          JRST (B)
9502         PUSH P,D                ;READ/ALTER/REWRITE
9503         PUSH P,E
9504         PUSH P,I
9505         PUSH P,W
9506         PUSH P,J
9507         TRZ I,2                 ;FIRST READ IT
9508         MOVEI W,0
9509         PUSHJ P,NUSRV4
9510          JRST POP5J             ;READ LOST
9511         POP P,J
9512         POP P,W
9513         POP P,I
9514         POP P,E
9515         POP P,D
9516         HRRI W,A
9517         XCT W                   ;MODIFY THE VALUE IN A
9518         MOVE D,A
9519         MOVSI W,(MOVEM D,)
9520         JRST NUSRV4             ;THEN WRITE IT BACK
9521 \f
9522 ;
9523 ;       .SUSET [N,,LOC] ;SAME AS .USET (SEE BELOW) BUT REFERS TO SELF
9524 ;
9525 ASUSET: HRRZ J,U        ;JOB TO BE HACKED IS SELF
9526         SETZM UUAC(U)   ;IF ERROR, RETURN LOSS IN .IOS+0
9527         JRST AUSET0
9528
9529 ;                               ;IF N&200000=1, BLOCK MODE
9530 ;       .USET CH,[N,,LOC]       ;IF N&400000=0, READS USER VAR SPECIFIED BY REST OF N
9531                                 ;       FOR INFERIOR OR FOREIGN USER OPEN ON CHANNEL CH
9532                                 ;       INTO USER LOCATION LOC
9533                                 ;IF N&400000.NE.0, SETS USER VAR SPECIFIED BY REST OF N
9534                                 ;       FOR DIRECTLY INFERIOR USER OPEN ON CHANNEL CH
9535                                 ;       FROM USER LOCATION LOC
9536 AUSET:  MOVE J,R        ;DECODE AC FIELD AS CHANNEL NUMBER
9537         PUSHJ P,AUSETJ
9538          JRST IOCER7    ;USR OP CHNL DOES NOT HAVE USR OPEN
9539 AUSET0: XCTR XR,[HRRZ B,(C)]    ;GET ADDRESS READING INTO OR WRITING FROM
9540         XCTR XR,[HLRZ E,(C)]    ;GET VARIABLE AND DIRECTION
9541         TRNE E,200000
9542          JRST ABUSET    ;BLOCK MODE
9543         TRZN E,400000
9544          JRST AUSET1    ;JUMP IF READING
9545         JUMPL J,IOCER7  ;WRITE PROTECT VIOLATION
9546         MOVSI W,(MOVEM D,)      ;FLAG WRITING
9547         UMOVE D,(B)     ;GET DATA TO WRITE
9548         PUSHJ P,NUSRV3  ;DO THE WRITE
9549          JRST ILUUO     ;LOST
9550         POPJ P,
9551
9552 ;BLOCK-MODE .USET
9553 ABUSET: TRNE E,400000
9554          TLOE J,(MOVE)  ;SET BLOCK BIT
9555           JRST ILUUO    ;BLOCK IN BLOCK LOSES
9556         UMOVE Q,(C)     ;GET AOBJN PTR AGAIN
9557 ABUST2: UMOVEM Q,(C)    ;STORE AWAY UPDATED POINTER
9558         PUSH P,C
9559         PUSH P,J
9560         MOVE C,Q
9561         PUSHJ P,AUSET0
9562         POP P,J
9563         POP P,C
9564         UMOVE Q,(C)
9565         AOBJN Q,ABUST2
9566         POPJ P,
9567
9568 AUSET1: MOVEI W,0       ;FLAG READING
9569         XCTR XRW,[MOVES (B)]    ;ENSURE WRITEABILITY
9570         PUSH P,B
9571         PUSHJ P,NUSRV3  ;GET VALUE OF VARIABLE INTO A
9572          JRST ILUUO     ;LOST
9573         POP P,J
9574 APTUAJ: UMOVEM A,(J)
9575         POPJ P,
9576
9577 ;DECODE ARG FOR USET
9578 AUSETJ: JSP T,NCRUI2
9579          JRST POPJ1
9580         JSP T,NCORWR
9581          TLO J,(SETZ)
9582         JRST POPJ1
9583
9584 AUSVAR: LDB C,USETRL+1  ;GET ADDRESS OF VARIABLE
9585         ADDI C,USRSTG(J)
9586         JUMPE W,[MOVE A,(C)
9587                  JRST POPJ1]
9588         HRR W,C
9589         XCT W
9590         JRST POPJ1
9591
9592 IFN PDP6P,[
9593 PDPPMT: MOVEI A,%JSSIX#%JSNUM   ;PDP6 HAS ONLY A FEW VARIABLES, WHICH ARE READ-ONLY
9594         CAIN E,.RUIND
9595          JRST POPJ1
9596         MOVEI A,LPDP6M*2000     ;FIXED MEM BOUND FOR PDP-6
9597         CAIN E,.RMEMT
9598          JRST POPJ1
9599         JRST POPJ1              ;IGNORE OTHER VARIABLES
9600 ]
9601 \f
9602 ;VARIABLES 100 - 577 (.IOC, .IOS, .IOP, .PMAP)
9603 AUSET2: JUMPN W,OPNL31  ;JUMP IF TRYING TO WRITE
9604         SUBI E,100
9605         CAIL E,40
9606          JRST AUSET4    ;>140=>.RIOP+M
9607         TRZE E,20
9608          JRST AUSET3    ;117<E<140=>.RIOS+M
9609         ADDI E,IOCHNM(J)        ;77<E<120=>.RIOC+M
9610 AUSETX: MOVE A,(E)      ;GET VAR
9611         JRST POPJ1
9612
9613 AUSET3: MOVE R,J        ;INFERIOR USER INDEX
9614         ADDI R,IOCHNM(E)        ;GET CHANNEL POINTER
9615         MOVE H,(R)
9616         JRST NSTATUS    ;DO A .CALL STATUS
9617
9618 AUSET4: CAIL E,40+LUIOP ;COMPARE AGAINST LAST IO PDL LOC
9619          JRST AUSET5    ;READ MAP ENTRY
9620         ADDI E,SIOCHN-40(J)     ;MAKE UP POINTER TO VAR
9621         JRST AUSETX
9622
9623 ;USET VARIABLE 200+N  --  READ MAP VARIABLE FOR PAGE N.
9624 ; (0 <= N < 400)  E CONTAINS N+100.
9625
9626 ;VALUE OF MAP WORD READ:
9627
9628 ;4.9  -  PAGE WRITEABLE.
9629 ;4.8  -  PAGE EXISTS (IF THIS OFF, WHOLE WORD IS 0)
9630 ;4.7  -  PAGE IS IN CORE.
9631 ;4.6  -  PAGE IS PUBLIC (ANYONE CAN WRITE IT)
9632
9633 ;3.1 - 3.9  -  # TIMES PAGE SHARED (LIKE CORTYP'S 4TH VALUE'S RH)
9634 ;2.1 - 2.9  -  ABS PAGE # OR PAGE # IN NEXT SHARER
9635 ;               (LIKE CORTYP'S 3RD VALUE)
9636 ;1.1 - 1.9  -  0 => ABS PAGE  (OR NO PAGE, OF COURSE)
9637 ;               -1 => UNSHARED PAGE,
9638 ;               ELSE USR NUM. OF NEXT SHARER.
9639
9640 AUSET5: CAIGE E,100
9641          JRST OPNL11
9642         PUSHJ P,SWTL
9643             CIRPSW      ;DON'T LET PAGE TABLES CHANGE.
9644         MOVEI A,-100(E) ;PAGE NUMBER IN JOB.
9645         PUSH P,J
9646         PUSHJ P,NCORT0  ;PUT CORTYP'S VALUES IN A THRU D.
9647         POP P,J
9648         PUSHJ P,LSWPOP  ;FREE CIRPSW.
9649         ANDI B,777      ;CORTYP'S 2ND VALUE IN 1.1 - 1.9
9650         DPB C,[111100,,B]       ;3RD VALUE IN 2.1 - 2.9
9651         TLO B,(D)       ;4TH VALUE RH INTO 3.1-3.9
9652         LSH D,-20.
9653         TLO B,(D)       ;4TH VAL BITS 4.8-4.9 INTO 4.6-4.7
9654         IOR A,B         ;TOGETHER WITH 1ST VALUE'S 4.8, 4.9.
9655         JRST POPJ1
9656 \f
9657 USTOP:  AOS (P)         ;GOING TO WIN
9658         JUMPN D,1USTOP  ;NONZERO VALUE => STOP THE JOB.
9659         MOVE B,APRC(A)  ;ZERO => START.
9660         TLNE B,BULGOS   ;BUT DON'T EVER START A JOB THAT'S BEING KILLED.
9661          POPJ P,
9662         JRST 1USTRT
9663
9664 1USTOP: MOVNI D,1       ;SET TO STOP
9665 1USTRT: PUSHJ P,RPCLSR  ;STOP USER IN A
9666         DPB D,[.BP BUSRC_22,USTP(A)]    ;BUSRC
9667 IFN SWPWSP,[
9668         EXCH U,A
9669         PUSHJ P,LVLOAD
9670         EXCH U,A
9671 ];SWPWSP
9672         JRST UPCLSR
9673
9674 ;SET INFERIOR'S PC
9675 UPCSET: PUSHJ P,RPCLSR  ;STOP USER IN USER MODE
9676         TLO D,%PCUSR    ;BE SURE USER MODE IS ON IN NEW PC
9677         TLZ D,BADPC     ;BE SURE PRIVILEGED BITS ARE OFF
9678         SKIPGE IOTLSR(A) ;SKIP UNLESS USER IS SUPPOSED TO BE IN IOT-USER MODE
9679          TLO D,%PCUIO   ;TURN ON IOT-USER MODE
9680         MOVEM D,UPC(A)  ;SET PC
9681         PUSHJ P,UPCLSR  ;RESTART
9682         JRST POPJ1
9683
9684 UJPCS:  CAIN U,(A)      ;SET .JPC, WITH CARE IF SETTING OWN
9685          SPM UPGML(U)
9686         HRRM D,UPJPC(A)
9687         CAIN U,(A)
9688          LPMR UPGML(U)
9689         JRST POPJ1
9690
9691 UJPCR:  CAIN U,(A)      ;READ .JPC:
9692          SPM UPGML(U)   ;IF READING ONE'S OWN, MAKE SURE IT'S UP TO DATE.
9693         HRRZ A,UPJPC(A)
9694         JRST POPJ1
9695
9696 IFN KA10P,[
9697 UROPC:  HLLZ A,UPOPC(J)
9698         LSH A,5
9699         HRR A,UPOPC(J)
9700         JRST POPJ1
9701 ] ;KA10P
9702 IFE KA10P, UROPC: JRST OPNL12   ;.OPC NOT SUPPORTED ON KL AND KS  ((CAN'T
9703                                 ; USE == DUE TO FWD REF))
9704
9705 IFN N11TYS,[                    ;SET OWN TV CONSOLE REGISTER
9706 STVCRG: MOVEM D,TVCREG(U)       ;ENABLE TVCREG TO BE SWAPPED IN AND OUT OF HARDWARE
9707         JUMPL D,POPJ1           ;IF TURNING ON; OR, IF TURNING OFF, ALL DONE
9708         SKIPGE TT11P            ;ALLOWED TO TOUCH HARDWARE?
9709          SKIPE TEN11F
9710           CAIA
9711            MOVEM D,400000+TTR10*2000 ;UPDATE REG IN HARDWARE
9712         MOVEM D,TVCREG(U)       ;AND UPDATE AGAIN IN SOFTWARE IN CASE CLOBBERED AT SSTVR2
9713         JRST POPJ1
9714 ]
9715 \f
9716 IFE KS10P,[     ; KS10 doesn't have a MAR and it never will...
9717
9718 ;READ MAR
9719 URMAR:  MOVE A,UPMAR(J)
9720 IFN KA10P,      TLZ A,777770
9721 IFN KL10P,      LDB B,[270400,,A]
9722 IFN KL10P,      HRL A,MARPTB(B)
9723         JRST POPJ1
9724
9725 ;SET MAR
9726 USMAR:  CONO PI,CLKOFF  ;TURN OFF CLOCK INTERRUPTS
9727         CAMN J,USER
9728          SPM UPGML(J)   ;STORE PG VARIABLES IF HACKING CURRENT USER
9729 IFN KA10P,[
9730         TLZ D,777770
9731         TLO D,4         ;SET USER MODE
9732 ] ;KA10P
9733 IFN KL10P,[
9734         LDB B,[220400,,D]
9735         HLL D,MARPTB(B)
9736 ] ;KL10P
9737         MOVEM D,UPMAR(J)
9738         CAMN J,USER
9739          LPMR UPGML(J)  ;USE LPMR BECAUSE KL10 DOESN'T HAVE VANILLA LPM
9740         JRST CLKOJ1
9741
9742 IFN KL10P,[     ;MAR PERMUTATION TABLE.  MAYBE CAN DO BETTER????   *****
9743
9744 MARPTB: 0  1,  0        ;OFF            ;NONE (EXEC)
9745         0 11,  0        ;FETCH          ;NONE (USER)
9746         0  3,  2        ;WRITE          ;WRITE(EXEC)
9747         0 17,  6        ;ANY            ;WRITE (USER)
9748         0  1, 10        ;OFF            ;READ (EXEC)
9749         0 11, 14        ;FETCH          ;READ (USER)
9750         0  3, 12        ;WRITE          ;NOT FETCH (EXEC)
9751         0 17, 16        ;ANY            ;NOT FETCH (USER)
9752         0  5,  1        ;READ           ;FETCH (EXEC)
9753         0 15,  5        ;READ+FETCH     ;FETCH (USER)
9754         0  7, 13        ;NOT FETCH      ;NOT READ (EXEC)
9755         0 13, 17        ;NOT READ       ;NOT READ (USER)
9756         0  5, 11        ;READ           ;READ+FETCH (EXEC)
9757         0 15, 15        ;READ+FETCH     ;READ+FETCH (USER)
9758         0  7,  3        ;NOT FETCH      ;ANY (EXEC)
9759         0 13,  7        ;NOT READ       ;ANY (USER)
9760 ] ;KL10P
9761 ] ;IFE KS10P
9762
9763 IFN KS10P,[
9764 URMAR:
9765 USMAR:  JRST OPNL12
9766 ] ;KS10P
9767 \f
9768 RUSUPP: HRRE A,SUPPRO(J) ;READ SUPERIOR'S USER INDEX
9769         JUMPL A,POPJ1   ;-1 => TOP LEVEL
9770 UINDEX: IDIVI A,LUBLK   ;GET INDEX NUMBER
9771         JRST POPJ1      ;GIVE TO USER
9772
9773 ;READ OWN RUN TIME
9774 UTRNTR: CONO PI,CLKOFF
9775 IFN KA10P,[
9776         SPM UPGML(U)
9777         LDB A,[2300,,UPQUAN(U)]
9778         LSH A,-2        ;SIMULATE 4.069 USEC CLOCK
9779 ] ;KA10P
9780 IFN KL10P,[
9781         SKIPL MTRUSR    ;SKIP IF PERFORMANCE METER AVAILABLE
9782          JRST [ RMBOXC A        ;REQUIRES AC ORDER - A,B,C,D,E
9783                 DSUB A,STMBOX
9784                 DMUL A,KLMBCC   ;BECAUSE DMUL PRODUCES FOUR WORD RESULT
9785                 REBOXC D
9786                 DSUB D,STEBOX
9787                 DADD B,D
9788                 DMUL B,KLEBCC
9789                 MOVE A,D
9790                 JRST UTRNT1 ]
9791         RPERFC A
9792         DSUB A,STPERF
9793         DIVI A,50.*4096.
9794 UTRNT1:
9795 ] ;KL10P
9796 IFN KS10P,[
9797         SPM UPGML(U)
9798         LDB A,[400400,,UPQUAN(U)]       ; 3.9 USEC CLOCK
9799 ] ;KS10P
9800         ADD A,UTRNTM(U)
9801         JRST CLKOJ1
9802
9803 ;SET JOB'S TTYTBL (.TTY VARIABLE).
9804 USTTY:  CONO PI,CLKOFF          ;PREVENT TIMING ERROR.
9805         HLLZ E,TTYTBL(J)        ;GET CURRENT VALUE
9806         XOR E,D                 ;GET WHICH BITS USER WANTS TO CHANGE
9807         AND E,[%TBNVR+%TBINT+%TBWAT+%TBOUT+%TBINF+%TBIIN+%TBOIG,,]      ;GET BITS USER IS ALLOWED TO CHANGE
9808         TRNE I,1
9809          TLZ E,%TBWAT           ;THESE BITS CAN BE ALTERED ONLY BY THE SUPERIOR
9810         XORM E,TTYTBL(J)        ;ALTER THE USER-CONTROLLED BITS WITHOUT WRITING THE OTHERS.
9811         JRST CLKOJ1
9812
9813 ;READ JOB'S TTYTBL (.TTY) VARIABLE
9814 URTTY:  CONO PI,CLKOFF
9815         HRRZ A,TTYTBL(J)
9816         SKIPGE TTYTBL(J)
9817          IDIVI A,LUBLK
9818         HLL A,TTYTBL(J)
9819         JRST CLKOJ1
9820
9821 ;READ JOB'S .CNSL VARIABLE - TTY# OF TREE'S CONSOLE
9822 URCNSL: MOVE A,UTMPTR(J)
9823         SUBI A,USRRCE
9824         CAIL A,NCT
9825          SUBI A,NCT+2           ;DISOWNED -1 SYS -2
9826         JRST POPJ1
9827 \f
9828 UJNAME: JUMPE D,OPNL33  ;SET INFERIOR'S JNAME
9829         CAME D,[SIXBIT/PDP6/]
9830          CAMN D,[SIXBIT/PDP10/]
9831           JRST OPNL33   ;CHANGING TO ILLEGAL NAME
9832         CAIN I,3        ;.SUSET?
9833          JRST UJNAMS    ;YES...
9834         PUSHJ P,RPCLSR
9835         PUSHJ P,UJNAMU  ;IS NEW JNAME UNIQUE?
9836          JRST UJNAMG    ;NO
9837         MOVEM D,JNAME(A)        ;YES
9838         CONO PI,CLKON
9839         PUSHJ P,UPCLSR
9840         JRST POPJ1
9841
9842 UJNAMU: MOVE B,UNAME(A)
9843         MOVEI E,0
9844         CONO PI,CLKOFF
9845 UJNAM1: CAME B,UNAME(E)
9846          JRST UJNAMF
9847         CAMN D,JNAME(E)
9848          POPJ P,
9849 UJNAMF: ADDI E,LUBLK
9850         CAMGE E,USRHI
9851          JRST UJNAM1
9852         JRST POPJ1
9853
9854 UJNAMG: PUSHJ P,UPCLSR
9855         CAME A,E
9856          JRST OPNL13            ;DUPLICATE NAME
9857         JRST CLKOJ1             ;WASN'T REALLY CHANGING THE NAME
9858
9859 UUNAME: HLRE I,D                ;SET OWN UNAME
9860         AOJE I,OPNL33           ;CHECK FOR ILLEGAL ___nnn UNAME
9861         SKIPA I,U
9862 UJNAMS:  SETO I,                ;SET OWN JNAME
9863         JUMPE D,OPNL33          ;CHECK FOR EVIL NAMES
9864         CAME A,U                ;SELF?
9865          BUG                    ;SOMETHING SCREWED
9866         SKIPL SUPPRO(U)
9867          JRST OPNL40            ;MUST BE TOP LEVEL
9868         CONO PI,CLKOFF          ;TURN CLOCK OFF NOW SO WE DON'T GET REOWNED OR SOMETHING
9869         SKIPL I
9870          SKIPA C,JNAME(U)       ;CHANGING UNAME, KEEPING JNAME
9871           SKIPA C,UNAME(U)      ;VICE VERSA
9872            EXCH D,C             ;NOW C=UNAME, D=JNAME
9873         MOVEI E,0               ;CHECK FOR DUPLICATE NAMES
9874 UUNAM0: SKIPE UNAME(E)
9875          CAMN E,U               ;ALLOW SETTING TO SAME NAME AS BEFORE
9876           JRST UUNAM1
9877         HRRZ A,SUPPRO(E)
9878         CAMN C,UNAME(E)
9879         CAME D,JNAME(E)
9880          CAMN A,I               ;JOB CAN'T HAVE INFERIORS IF SETTING UNAME
9881           JRST OPNL13           ;OR DUPLICATE U-JNAME IF SETTING EITHER
9882 UUNAM1: ADDI E,LUBLK
9883         CAMGE E,USRHI
9884          JRST UUNAM0
9885         CAMN C,UNAME(U)
9886          CAME D,JNAME(U)
9887           SKIPA A,D             ;D GETS CLOBBERED
9888            JRST CLKOJ1          ;THE NAMES WEREN'T ACTUALLY CHANGED! (SYNCOM DOES IT).
9889         CAME C,UNAME(U)         ;IF NOT LOGGED IN, AND CHANGING UNAME,
9890          SKIPGE TTYTBL(U)       ; AND CONSOLE-CONTROLLED,
9891            JRST UUNAM3
9892         HLLO J,UNAME(U)
9893         AOJN J,UUNAM2
9894           AOS SUSRS             ;DISGUST! SHOULD BE USING LOGIN
9895 UUNAM2: HRRZ T,TTYTBL(U)
9896         HRLI T,[ASCIZ / CHUNAM /]
9897         PUSHJ P,SGWAIT          ;REQUEST SYSTEM JOB TO PRINT OUR MSG
9898         MOVEM C,SLGIV+2         ;INCLUDE NEW UNAME AS SECOND NAME
9899 UUNAM3: PUSHJ P,LOGUPD          ;CHARGE OLD NAME FOR USAGE SO FAR
9900         MOVEM C,UNAME(U)        ;THEN SWITCH NAMES
9901         MOVEM A,JNAME(U)
9902         PUSHJ P,DMNPLI          ;LOG BACK IN UNDER NEW NAMES
9903         JRST CLKOJ1
9904
9905 ;WAIT FOR SLGIV VARIABLES TO BECOME FREE, AND REQUEST THE
9906 ;SYSTEM JOB TO PROCESS THEM.  TAKES STRING,,TTY IN T, AND
9907 ;PLACES UNAME(U) IN SLGIV, AND T INTO SLGIV+1.  THE CALLER
9908 ;IS RESPONSIBLE FOR FILLING IN SLGIV+2
9909
9910 SGWAIT: PUSH P,T
9911         MOVSI T,SCLLGI          ;SOMEBODY ELSE IS USING THOSE VARIABLES
9912         PUSHJ P,CWAIT           ;WAIT FOR THE SYSTEM JOB TO FINISH WITH
9913           TDNE T,SUPCOR         ;THEM.
9914         IORM T,SUPCOR           ;REQUEST THE SYSTEM JOB TO PRINT OUR MSG
9915         POP P,SLGIV+1           ;STRING,,TTY #
9916         MOVE T,UNAME(U)         ;STORE AWAY THE UNAME
9917         MOVEM T,SLGIV
9918         POPJ P,
9919
9920 RUTRAP: LDB A,[430100,,UTRAPM(J)]       ;GET SPECIAL TRAP MODE INDICATOR
9921         JRST POPJ1
9922
9923 SUTRAP: DPB D,[430100,,UTRAPM(J)]       ;SET    "     "    "       "
9924         JRST POPJ1
9925
9926 IFN KA10P,[
9927 URTR1I: SKIPA A,[0,,%PIARO]     ;READ "TRAP 1 INSTRUCTION" FOR KA-10
9928 URTR2I:  MOVEI A,%PIPDL         ;TRAP 2
9929         JRST POPJ1
9930 ] ;KA10P
9931 \f
9932 ;SET MEMORY BOUND
9933 USMEMT: CAMN U,A
9934          JRST USMEM2
9935         PUSHJ P,RPCLSR
9936         MOVSI B,BSSTP
9937         IORM B,USTP(A)
9938         PUSHJ P,UPCLSR
9939 USMEM2: ADDI D,1777
9940         LSH D,-10.
9941         MOVE B,D
9942         MOVEM A,SRN5(U) ;ARGUMENT TO NCORFS
9943         PUSHJ P,LOSSET
9944             NCORFS      ;CLEARS BSSTP IN USTP(A).
9945         EXCH U,A
9946         PUSHJ P,ACORE
9947          JRST OPNL33    ;LOST
9948         EXCH U,A
9949         JRST LSWPJ1
9950
9951 ;SET SYSTEM NAME (ZERO IGNORED)
9952 USYNST: SKIPE D
9953          MOVEM D,USYSNM(J)
9954         JRST POPJ1
9955
9956 ;SET INFERIOR'S INTERRUPT MASK
9957 USMASK: SKIPA E,[2]     ;MOVEM
9958 IAMASK:  ANDI E,1       ;ANDCAM OR IORM
9959         ANDCM D,[VBDBTS] ;BITS FOR CLASS 1 INTS CAN'T BE CHANGED.
9960         XCT (E)[ IORB D,MSKST(A)
9961                  ANDCAB D,MSKST(A)
9962                  MOVEM D,MSKST(A)]
9963 IFN KA10P,[
9964         MOVEI B,440+APRCHN ;NOW UPDATE JOB'S APRC VARIABLE.
9965         TRNE D,%PIARO
9966          TRC B,60
9967         TLNE D,(%PIFOV)
9968          TRC B,600
9969         HRRM B,APRC(A)
9970         TRNE I,1
9971          CONO @APRC(A)
9972 ] ;KA10P
9973 IFE KA10P, PUSHJ P,TRINST
9974         JRST UPISE1
9975
9976 IFE KA10P,[
9977 ;SET THE AROV AND PDLOV TRAP INSNS ACCORDING TO WHETHER THE
9978 ;INTERRUPTS ARE ENABLED; BUT DON'T OVERRIDE AN EXPLICIT SPECIFICATION
9979 ;BY THE USER, WHICH IS ANYTHING OTHER THAN 0 OR (CAI) IN THE LH.
9980
9981 TRINST: MOVE D,MSKST(A)
9982         MOVSI B,(CAI)           ;CAI IS FASTER THAN JFCL - NO AC DECODE
9983         TDNE D,[%PIFOV+%PIARO]  ;AND OVERFLOW GOES OFF A LOT
9984          MOVEI B,%PIARO
9985         HLRZ C,TR1INS(A)
9986         SKIPE C
9987          CAIN C,(CAI)
9988            MOVEM B,TR1INS(A)
9989 ;       MOVSI B,(CAI)           ;THESE LINES COMMENTED OUT TO MAKE 
9990 ;       TRNE D,%PIPDL           ; PDL OVERFLOW CLASS 2 INSTEAD OF CLASS 3
9991          MOVEI B,%PIPDL
9992         HLRZ C,TR2INS(A)
9993         SKIPE C
9994          CAIN C,(CAI)
9995           MOVEM B,TR2INS(A)
9996         POPJ P,
9997 ] ;IFE KA10P
9998 \f
9999 ;SET INFERIOR'S PI IN PROGRESS FLAG
10000 UPISET: ASH D,-35.      ;SHIFT SIGN BIT TO BOTTOM BIT
10001         MOVEM D,PICLR(A)        ;SET VARIABLE
10002 ;COME HERE WHEN ANY INTERRUPT VARIABLE'S VALUE IS CHANGED
10003 ;BY A .USET OR .SUSET; TAKE ANY INTS THAT ARE NOW PENDING.
10004 UPISE1: HRRZ A,J        ;IAMASK, ETC. MODIFY A. RESTORE IT.
10005         AOS (P)         ;GOING TO WIN
10006         TRNN I,1        ;SKIP IF A SUSET
10007          JRST APISE6
10008         JRST APISE1     ;SEE IF SHOULD REINTERRUPT
10009
10010 IAMSK2: ADDI A,MSKST2-IDF1
10011 IADF1:  ADDI A,IDF1-IDF2
10012 IADF2:  ADDI A,IDF2-PIRQC       ;IORM OR ANDCAM INTO IDF2.
10013 IAPIRQ: ADDI A,PIRQC-IFPIR
10014 IAIFPI: ANDI E,1        ;GET USET PARITY (0=IORM, 1=ANDCAM)
10015         XCT IAINS(E)    ;DO APPRO OP
10016         JRST UPISE1
10017
10018 IAINS:  IORB D,IFPIR(A) ;SET BITS
10019         ANDCAB D,IFPIR(A)       ;FLUSH BITS
10020
10021 USMSK2: ADDI A,MSKST2-IDF1      ;SET .MSK2, ETC.
10022 USDF1:  ADDI A,IDF1-IDF2
10023 USDF2:  ADDI A,IDF2-PIRQC
10024 USPIRQ: ADDI A,PIRQC-IFPIR
10025 USIFPI: MOVEM D,IFPIR(A)
10026         JRST UPISE1
10027
10028 ;.RBCHN, .SBCHN  READ/SET NUMBER OF LAST CHANNEL ON WHICH ERROR OCCURRED
10029 RUBCHN: LDB A,[BCHPTR#(A#U)]
10030         JRST POPJ1
10031
10032 SUBCHN: DPB D,[BCHPTR#(A#U)]
10033         JRST POPJ1
10034
10035 ;GET INT BIT
10036 UGSUPR: HLLZ A,SUPPRO(J)
10037         JRST POPJ1
10038
10039 ;SAVE AWAY MA (HIGH BITS) ON LAST MPV OR WIRO
10040 ;CALLED FROM CLKBRK, DONT CLOBBER A OR D
10041
10042 MPVMAS:
10043 IFN KA10P,[
10044         HLRZ T,UPJPC(U)
10045         LSH T,10.               ;HIGH BITS ONLY ON KA
10046 ] ;KA10P
10047 IFE KA10P, HRRZ T,UPFW(U)
10048         HRRM T,IOTLSR(U)
10049         POPJ P,
10050
10051 ;.RMPVA READ VIRTURAL PAGE # (8 BITS) OF LAST MPV OR WIRO
10052
10053 MPVARD: HRRZ A,IOTLSR(J)
10054         JRST POPJ1
10055
10056 ;.RSERVER  Read server user number, or -1 if none.
10057 URSERV: SKIPL A,SERVER(J)
10058          IDIVI A,LUBLK
10059         JRST POPJ1
10060
10061 ;.SSERVER  Set server user number, or clear if negative.
10062 ; (To prevent timing screws, you should really use the SSERVE call to set
10063 ; this variable, but for debugging convenience...)
10064 USSERV: IMULI D,LUBLK
10065         SKIPGE D
10066          SETOI D,
10067         MOVEM D,SERVER(J)
10068         JRST POPJ1
10069 \f
10070 SUBTTL USER INSTRUCTION HANG ROUTINE (.HANG)
10071
10072 ; .HANG was rewritten by Alan Feb 87:
10073
10074 ; The general theory is that .HANG should behave -exactly- like JRST .-1 as
10075 ; much as possible.  Thus, it is considered to make sense to put any
10076 ; skipping or jumping instruction before a .HANG.  We are always careful to
10077 ; return from the .HANG by jumping to the previous instruction, so any side
10078 ; effects (such as clearing bits or incrementing accumulators or memory) are
10079 ; always performed, and jumps will be correctly taken.
10080 ;
10081 ; There are two ways to leave a .HANG, either the job can get PCLSR'ed, or
10082 ; the awaited condition can become true.  We arrange for -both- cases to
10083 ; return the job to the previous instruction by SOSing UUOH -once- before
10084 ; calling UFLS, and once more if UFLS returns.
10085
10086 ; As an additional feature, .HANG with a non-zero accumulator behaves like
10087 ; the disjunction of ordinary .HANG and .SLEEP, allowing the user to do a
10088 ; timeout.  The accumulator should initially contain an argument, as for
10089 ; .SLEEP, that indicates when .HANG should timeout.  In that case only,
10090 ; .HANG returns to the following instruction and the designated accumulator
10091 ; will contain zero.  If such a .HANG is interrupted, or if it returns
10092 ; because the awaited condition is now true, that accumulator will contain
10093 ; the correct negative number indicating the absolute time it would have
10094 ; timed out.
10095 ;
10096 ; Accepted instructions are:
10097 ; Any CAI, CAM, JUMP, SKIP, AOJ, AOS, SOJ, or SOS class instruction.
10098 ; Any test instruction.
10099 ; JFFO.
10100 ; JFCL with 0 in the AC field.
10101 ; Or an XCT that eventually fetches one of the above.
10102
10103 ; As special cases SKIPA 0, and CAIA 0, are taken to request a schedule,
10104 ; and JFCL 0, and SKIP 0, set %SWDSO.
10105
10106 ; As before, it is a limitation that changes to memory referenced by .HANG
10107 ; when computing effective addresses and fetching XCT'ed instructions will
10108 ; not cause the job to wake up.  But how could it be otherwise?  Changes to
10109 ; the accumulators will of course cause the job to be PCLSR'ed.
10110
10111 AHANG:  MOVE R,UUOH
10112         UMOVE R,-2(R)           ; Get user's flush instruction
10113         HRLOI A,377777          ; A: most positive fixnum
10114         JUMPE J,AHANG2          ; No AC => timeout when hell freezes over
10115         XCTR XR,[MOVN A,(J)]    ; A: argument as for .SLEEP
10116         JUMPG A,AHANG2          ; 'twas already neg., so wait 'til then
10117         SUB A,TIME              ; else compute time
10118         UMOVEM A,(J)            ; store back negative for PCLSRing
10119         MOVN A,A                ; A: time to wait for
10120 AHANG2: PUSHJ P,ASCIND          ; Compute E for instruction
10121         HLRZ C,R                ; C: Opcode and AC
10122         CAIE C,(JFCL)
10123          CAIN C,(SKIP)
10124           JRST AHANGI           ; User might be waiting for a while
10125         CAIE C,(SKIPA)
10126          CAIN C,(CAIA)
10127           JRST AHANGF           ; User is just trying to cause a schedule
10128         LSH C,-9                ; C: 9-bit opcode
10129         CAIN C,XCT_-33
10130          JRST AHANG1            ; XCT - Go loop
10131         CAIN C,JFFO_-33
10132          JRST AHANGO            ; JFFO is like JUMPN
10133         LSH C,-6                ; C: First 3 bits of opcode
10134         CAIN C,CAI_-41
10135          JRST AHANGC            ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS
10136         CAIN C,TRN_-41
10137          JRST AHANGT            ; Txxx
10138 IFN KS10P, JRST ILUUO
10139 IFE KS10P,[
10140 ;CODE TO ALLOW CONSO, CONSZ AS .HANG INSTRUCTIONS
10141         HLRZ C,R                ;CHECK FOR CONSO, CONSZ
10142         TRZ C,077477
10143         LDB B,[320700,,R]       ;GET DEVICE CODE/4
10144         SKIPGE T,DCHNTB(B)
10145          TRNE T,40000
10146           CAIE C,(CONSZ\CONSO)
10147            JRST ILUUO           ;UNRECOGNIZED INSTRUCTION, OR USER CONI NOT
10148                                 ; ALLOWED
10149         MOVEM R,EPDL(U)
10150         MOVE T,A
10151         SOS UUOH
10152         PUSHJ P,AHANG9
10153          PUSHJ P,UFLS
10154         JRST AHANGX
10155
10156 AHANG9: XCT EPDL(U)
10157          CAMGE T,TIME
10158           AOS (P)
10159            POPJ P,
10160
10161 ] ;IFE KS10P
10162
10163 ; XCT ? .HANG
10164 AHANG1: PUSHJ P,OPBRK           ; Don't let "XCT ." hang you up
10165         UMOVE R,(R)             ; Get new instruction
10166         JRST AHANG2             ; And start over
10167
10168 ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS ? .HANG
10169 AHANGC: TLNN R,040000
10170          JRST AHANG3            ; CAI, CAM, JUMP, SKIP
10171         TLNN R,010000
10172          JRST AHANGJ            ; AOJ, SOJ
10173         TLNN R,020000
10174          SKIPA T,[-1]           ; AOS: Compare with -1
10175           MOVEI T,1             ; SOS: Compare with 1
10176         TLZ R,770777            ; Clear all but last 3 bits of opcode
10177         TLO R,(CAM T,)          ; Build a CAM instruction
10178         TLNE R,001000           ; With the opposite sense
10179          TLC R,006000
10180         JRST AHANGM
10181
10182 AHANG3: TLNN R,020000
10183          JRST AHANG4            ; CAI, CAM
10184         TLNN R,010000
10185          JRST AHANGJ            ; JUMP
10186         TLZ R,(0 17,)           ; SKIP
10187         JRST AHANGM
10188
10189 ; JFFO ? .HANG
10190 AHANGO: TLC R,(JFFO#JUMPN)
10191 AHANGJ: HRRI R,AHANGX
10192         JRST AHANGA
10193
10194 ; SKIPA ? .HANG -- just flush once (ignores timeout)
10195 AHANGF: SOSA UUOH
10196          SKIPA
10197           PUSHJ P,UFLS
10198         JRST AHANGX
10199
10200 ; JFCL ? .HANG -- hang infinitely (or until timeout)
10201 AHANGI: MOVE B,TIME
10202         ADDI B,60.*30.          ; If sleeping for more than a minute
10203         MOVSI C,%SWDSO          ; Desire swap out
10204         CAML A,B                ; (just like .SLEEP)
10205          IORM C,USWST(U)
10206         SOS UUOH
10207 AHANG5: MOVE T,A
10208         CAML T,TIME
10209          PUSHJ P,UFLS
10210         JRST AHANGX
10211
10212 ; Txxx ? .HANG
10213 AHANGT: TLZ R,060000            ; Make opcode be TRN or TDN series
10214         TLNE R,010000           ; If TRN, only AC matters
10215          JRST AHANGB            ; TDN: Both AC and memory matter
10216 ; Wait for something that only references the user's accumulators.
10217 ; (Instruction in R might be some kind of jump to AHANGX.)
10218 AHANGA: PUSHJ P,AHANGG          ; Get contents of user's AC into T
10219         SOS UUOH
10220         XCT R                   ; Must try it once to prevent timing screw
10221          JRST AHANG5            ; OK, wait forever for PCLSR
10222         JRST AHANGX
10223
10224 AHANG4: TLNN R,010000           ; If CAM, both AC and memory matter
10225          JRST AHANGA            ; CAI: Only AC matters
10226 ; Wait for something that references memory.
10227 ; (Instruction in R better not be a jump!)
10228 AHANGB: PUSHJ P,AHANGG          ; Get contents of user's AC into T
10229 AHANGM: MOVEM R,EPDL(U)
10230         SOS UUOH
10231         TRNE R,-20              ; Memory reference really only AC?
10232          JRST AHANG6            ; No, real memory, go wait
10233         XCTR XRW,R              ; Must try it once to prevent timing screw
10234          JRST AHANG5            ; OK, wait forever for PCLSR
10235         JRST AHANGX
10236
10237         PUSHJ P,UHANG
10238 AHANG6:  PUSHJ P,UFLS
10239 AHANGX: ;; Everyone exits here after SOSing UUOH once (before hanging).
10240         ;; Thus we always exit to the previous instruction (just like being
10241         ;; PCLSRed), unless we timeout instead.
10242         CAMGE A,TIME            ; Timeout?
10243          JRST AHANGY            ; Yes
10244         SOS UUOH
10245         POPJ P,
10246
10247 AHANGY: XCTR XW,[SETZM (J)]     ; Let user know we timed out
10248         AOS UUOH                ; And fall through instead of backing out
10249         POPJ P,
10250
10251 ;.HANG flush instruction routine, called with PUSHJ only on clock level
10252 UHANG:
10253 IFE KS10P,[
10254         MOVEI TT,0              ; Save MAR word
10255         EXCH TT,UPMAR(U)        ; so will not MAR
10256         LPMR UPGML(U)
10257         MOVEM TT,UPMAR(U)       ; Restore MAR
10258 ] ;IFE KS10P
10259 IFN KS10P, LPMR UPGML(U)
10260         MOVE TT,AC0S+A(U)
10261         XCTRI XRW,EPDL(U)
10262          CAMGE TT,TIME
10263           AOS (P)               ; Might be because location swapped out or
10264            POPJ P,              ; missing, but that's OK because we always
10265                                 ; exit to the previous instruction!
10266
10267 ; Kind of like ASCIND for the accumulators...
10268 AHANGG: LDB T,[270400,,R]
10269         UMOVE T,(T)             ; Get contents of AC from user
10270         TLZ R,(0 17,)           ; Clear out AC field in instruction
10271         TLO R,(0 T,)            ; Replace AC field with T
10272         POPJ P,
10273
10274 ; Allow interrupt if being PCLSRed
10275 OPBRK:  PUSH P,T
10276         MOVE T,UEXIT
10277         CAMN T,[JRST ONEFLS]
10278          PUSHJ P,UDELAY
10279         POP P,T
10280         POPJ P,
10281 \f
10282 SUBTTL .OPEN AND FRIENDS
10283
10284 ;
10285 ;.FDELE FILBLK  ;DELETE OR RENAME FILE SPECIFIED AT FILBLK
10286 ;
10287 AFDELE: SETZM UUAC(U)
10288         UMOVE A,(C)             ;GET DEVICE
10289         MOVEI W,4
10290         DPB W,[OPNCOM,,A]       ;SET OP TO SPECIFY AN .FDELE
10291         JRST AFDEL1
10292 ;
10293 ;OPEN SET UP AND DISPATCH
10294 ;3.1=0 => INPUT  =1 OUTPUT
10295 ;3.2=0  => UNITS   =1  BLOCK
10296 ;3.3=0  => ASCII   =1 IMAGE
10297 ;4.9-4.7 OPERATION FIELD
10298 ;   0=> NORMAL READ OR WRITE
10299 ;   1=> WRITE OVER MODE
10300 ;   2=> MAKE LINK
10301 ;   4=> DELETE OR RENAME (INTERNAL)
10302 ;
10303 ;.OPEN CH,FILBLK        ;OPEN FILE SPECIFIED AT FILBLK ON LOGICAL CHANNEL CH
10304 ;
10305 AOPEN:          ;C HAS EFF ADR OF UUO AND R ITS AC FIELD
10306         ADDI R,IOCHNM(U)        ;MAKE R POINT TO SPECIFIED I/O CHANNEL WORD
10307         PUSH P,C
10308         PUSHJ P,ACLOSE  ;CLOSE PREV
10309         POP P,C
10310         UMOVE A,(C)     ;GET DEV AND MODE BITS
10311         LDB W,[OPNCOM,,A]
10312         CAIN W,4
10313          JRST OPNL23    ;BARF IF TRY TO DELETE WITH .OPEN
10314 AFDEL1: MOVEI TT,SRN3(U)        ;MOVE 4TH-6HT ARGS
10315         HRLI TT,3(C)            ;TO SRN3 THRU SRN5
10316         MOVEI Q,3(TT)
10317         XCTR XBR,[BLT TT,-1(Q)]
10318         UMOVE B,1(C)    ;GET 2ND, 3RG ARGS (FILENAMES)
10319         UMOVE C,2(C)
10320         MOVE D,USYSNM(U)        ;USE DEFAULT SNAME.
10321         HLRZ E,A                ;GET MODE BITS.
10322         HRLZI A,(A)     ;LEFT-JUSTIFY DEVICE NAME.
10323         SETZM EPDL(U)
10324         SETZM EPDL3(U)
10325 NOPNE:  CAIN W,4        ;SKIP ON NOT .FDELE (ENTRY FOR NCALL TYPE OPEN, ETC COMMANDS)
10326          SKIPN SRN3(U)  ;SKIP ON RENAME
10327           JRST AOPEN3   ;JUMP IF A .OPEN OR DELETING .FDELE
10328         JUMPN B,AOPEN3  ;JUMP UNLESS RENAME WHILE OPEN.
10329         MOVE TT,C       ;GET CH ON WHICH FILE IS SUPPOSIDLY OPEN
10330         TDNE TT,[-NIOCHN]       ;SKIP IF CH LOGICALLY LESS THAN 20
10331          JRST OPNL14    ;BAD CHANNEL NUM
10332         ADDI TT,IOCHNM(U)       ;RELOCATE TO POINT TO CH WORD FOR USER
10333         MOVE Q,(TT)     ;GET CH WORD
10334         JUMPE Q,OPNL44  ;CHNL NOT OPEN
10335         HLRZ Q,CLSTB(Q) ;GET LEFT HALF OF CLOSE TABLE ENTRY FOR INDEX IN I/O CH WORD
10336         TRNE Q,%CLSJI\%CLSJO
10337          JRST JFDEL4            ;JOB DEVICE CHNL
10338         TRNN Q,%CLSDO\%CLSQ     ;SKIP IF A DIRECTORY DEVICE
10339          JRST POPJ1     ;JUMP IF NOT DIRECTORY DEVICE
10340         HLRZ J,(TT)     ;PICK UP DEV CHNL NO
10341         EXCH A,B        ;PUT FN1, FN2 IN A, B.
10342         EXCH B,C
10343 IFN NUNITS,[
10344         TRNN Q,%CLSDO   ;SKIP IF DEC TAPE
10345          JRST NOPNE1
10346         MOVSI C,'UT0    ;GET DUMMY UT DEV NAME.
10347         HRRZ I,UTTNO(J) ;GET POSSIBLE (?) TAPE NUM
10348         TLO C,(I)       ;STORE IN DEV NAME
10349         MOVE TT,DVAUT   ;WILL EXIT TO UTAPE OPEN RTN.
10350         JRST OPEN2B
10351 NOPNE1:
10352 ]
10353         MOVSI C,'DSK    ;NOT UT, MUST BE DSK.
10354         MOVE TT,DVAQSK  ;NOBODY ELSE HANDLES RENAME WHILE OPEN.
10355         JRST OPEN2B
10356 \f
10357 AOPEN3: PUSHJ P,TRAN    ;PERFORM I/O TRANSLATIONS
10358          JRST OPNL3     ;TOO MANY TRANSLATIONS.
10359         MOVEM D,USYSN1(U);SAVE TRAN'D SNAME FOR OPEN RTN.
10360         PUSH P,A        ;PUT NAMES ON STACK.
10361         PUSH P,B
10362         PUSH P,C
10363         MOVSI B,-NDEVS  ;LOAD LENGTH OF FIRST DEV NAME TABLE
10364         CAME A,DEVTAB(B);SEARCH FIRST DEV NAME TABLE
10365          AOBJN B,.-1    ;LOOP TILL FOUND OR COUNTED OUT
10366         JUMPG B,OPEN1   ;JUMP IF NOT FOUND
10367 OPEN2:  MOVE TT,DEVADR(B) ;LOAD BITS,,OPEN-ROUTINE-ADDRESS
10368 OPEN21: POP P,B         ;UNSAVE SECOND FILE NAME
10369         POP P,A         ;UNSAVE FIRST FILE NAME
10370         POP P,C         ;UNSAVE DEVICE NAME
10371         CAIN W,4
10372          JRST [ TLNN TT,%DVDEL
10373                  JRST OPNL34    ;DEVICE DOES NOT ALLOW DELETE
10374                 JRST OPEN2B ]
10375         CAIN W,2
10376          JRST [ TLNN TT,%DVLNK
10377                  JRST OPNL34    ;DEVICE DOES NOT ALLOW LINK
10378                 JRST OPEN2B ]
10379 OPEN2B: HRRZ D,E        ;MODE BITS
10380         EXCH E,C        ;SAVE DEVICE IN E
10381         HLL C,E         ;SET UP OLD-STYLE C: MODE,,DEV
10382         MOVSS C
10383 ;
10384 ;AT THIS POINT: A & B HAVE FILE NAMES, C HAS MAPPED DEV AND MODE BITS, D HAS MODE BITS,
10385 ;W HAS OPEN COMMAND, E HAS DEVICE NAME, TT HAS DEVADR WORD (BITS,,ROUTINE)
10386 ;
10387         ROT D,-1        ;ROTATE IN/OUT BIT TO SIGN
10388         CAIN W,4        ;SKIP IF NOT A .FDELE
10389          TDZ D,[400000,,7]      ;A .FDELE, MAKE LOOK LIKE OPEN FOR READ
10390         PUSHJ P,FLDRCK
10391          JRST OPEN2D    ;NORMAL OPEN
10392         JUMPL D,OPNL2   ;WRITING DIRECTORY?
10393         JUMPN W,OPNL12  ;DELETING, RENAMING, LINKING, WRITING OVER DIRECTORY?
10394         TLNE TT,%DVDIR
10395          JRST (TT)      ;OPEN DEVICE FOR DIRECTORY
10396 ;ASKING FOR DIR OF DEVICE SYSTEM DOESN'T HAVE DIR ROUTINE FOR.
10397 ;PASS IT OFF TO THE UNKNOWN-DEVICE HANDLER.
10398         PUSH P,E        ;PUSH DEVICE NAME
10399         PUSH P,A        ;PUSH FN1
10400         PUSH P,B        ;PUSH FN2
10401         HLRZ E,C        ;GET MODE BITS
10402         JRST OPEN22     ;PASS TO UNKNOWN DEVICE JOB
10403
10404 OPEN2D: TLNE TT,%DVIN
10405          JUMPGE D,(TT)  ;OPENING FOR INPUT AND DEVICE CAN DO INPUT
10406         TLNE TT,%DVOUT
10407          JUMPL D,(TT)   ;OPENING FOR OUTPUT AND DEVICE CAN DO OUTPUT
10408         JRST OPNL2      ;DEVICE DOESN'T GO THAT DIRECTION
10409 \f
10410 ;CHECK FOR NUMBERED DEV
10411 OPEN1:  MOVE B,[-NDV1,,DVT1-DEVTAB]     ;LOAD AOBJN POINTER WITH COUNT FOR 2ND DEV TABLE
10412 OPEN1A: MOVEI I,0               ;INITIALIZE NUMBERED DEV NUM TO ZERO
10413         MOVE D,[440600,,-2(P)]  ;GET BYTE POINTER INTO DEV REQUESTED
10414         MOVE C,[440600,,DEVTAB(B)]      ;GET BYTE POINTER INTO CURRENT TABLE ENTRY
10415 OPENA1: ILDB A,C        ;GET CHAR FROM TABLE
10416         ILDB J,D        ;GET CHAR FROM DEV
10417         JUMPE A,OPEN1B  ;JUMP ON SPACE IN TABLE, "MATCHES" DIGIT IN DEV
10418         CAIN A,(J)      ;SKIP IF CHAR DIFFER
10419          JRST OPEN1C    ;SAME, TRY FOR NEXT CHAR
10420 OPENZ1: AOBJN B,OPEN1A  ;LOOP TO NEXT TABLE ENTRY OR COUNT OUT
10421 ;CHECK FOR NAMED SECONDARY PACK
10422 ;FIND THE ONE WITH THIS NAME AND THE BIGGEST QSFT.
10423 ;ASSUME THAT BY THE TIME WE GET HERE TUTS HAVE BEEN READ IN AND SO FORTH
10424         SKIPE A,-2(P)   ;GET DEVICE NAME AGAIN
10425          CAMN A,[-1]    ;0 OR -1 ARE NOT LEGAL PACK NAMES
10426           JRST OPEN22
10427         MOVEI C,NQS-1   ;SEARCH NAMES OF SECONDARY PACKS
10428         SETOB TT,I      ;I BEST DRIVE SO FAR, TT BEST QSFT SO FAR
10429 OPENZ2: CAMN A,QRESRV(C)
10430          JRST [ CAML TT,QSFT(C)
10431                  JRST .+1
10432                 MOVE TT,QSFT(C)
10433                 MOVE I,C
10434                 JRST .+1 ]
10435         SOJGE C,OPENZ2
10436         MOVE TT,[%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,,QSKOB]
10437         JUMPGE I,OPEN21
10438 ;
10439 ;"UNKNOWN DEVICE" HANDLER.  FOO DEVICE IS LOADED BY
10440 ;SYS;ATSIGN DEVICE FROM FILE DEVICE;JOBDEV FOO
10441 ;
10442 OPEN22: POP P,EPDLT2(U) ;WHEN WE USE SYS:ATSIGN DEVICE AS A JOB DEVICE,
10443         POP P,EPDLT1(U) ;SET UP THE "NAMES BEFORE LAST TRANSLATION" TO BE
10444         POP P,EPDLT4(U) ;THE NAMES BEING USED, INCLUDING "FOO" AS THE DEVICE.
10445         MOVE A,USYSN1(U)
10446         MOVEM A,EPDLT3(U)
10447         MOVSI C,'JOB
10448         MOVE TT,DVAJOB  ;DEVADR ENTRY FOR JOB:
10449         MOVSI A,'SYS
10450         MOVEM A,USYSN1(U)
10451         MOVE A,['ATSIGN]        
10452         MOVE B,['DEVICE]
10453         JRST OPEN2B
10454
10455 OPEN1B: JUMPE J,OPEN1C  ;JUMP IF DEV ARG EXHAUSTED
10456         SUBI J,'0       ;CONVERT SIXBIT DIGIT TO NUMBER
10457         JUMPL J,OPENZ1  ;JUMP IF TOO SMALL, NOT A DIGIT
10458         CAILE J,9       ;SKIP IF LESS THAN 10.
10459          JRST OPENZ1    ;LOSE, TRY NEXT
10460         ASH I,3         ;MULTIPLY NUM SO FAR BY 8
10461         ADD I,J         ;ADD NEW DIGIT
10462 OPEN1C: TLNE C,770000   ;SKIP IF ALL SIX CHAR POSITIONS COMPARED
10463          JRST OPENA1    ;GO TO NEXT POSITION
10464         JRST OPEN2
10465 \f
10466 NSOPEN: HRRZ R,A        ;Args: 1 mode (LH) chnl (RH), 2 BP or aobjn -> block of BPs.
10467         CAIL R,NIOCHN
10468          JRST OPNL14
10469         ADDI R,IOCHNM(U)
10470         PUSH P,A        ;Save channel number.
10471         PUSH P,B        ;Save BP or BP block ptr.
10472         PUSHJ P,CCLOSE
10473         POP P,R         ;Get back the BP or aobjn pointer.
10474         MOVEM R,EPDL(U) ;Save where job device can get it.
10475         PUSHJ P,FNPRS   ;Parse into DEV, FN1, FN2, SNM in A, B, C, D.
10476         MOVEM D,SRN3(U) ;Make symbolic open of network win using 5th arg as foreign host.
10477         POP P,R         ;Pop back channel number argument.
10478         MOVE E,CTLBTS(U)
10479         TSC E,E
10480         TRZ E,-1
10481         XOR R,E
10482         LDB E,[OPNCOM,,R]
10483         CAIE E,2
10484          CAIN E,4
10485           JRST OPNL12   ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10486         HLRZ E,R
10487         JRST NDEL1
10488
10489 ;Given in R a BP into user memory, or an aobjn -> of BPs block in user memory,
10490 ;parse filenames into A, B, C, D.  Clobbers Q, T, R, H, I.
10491 FNPRS:  SETZ Q,         ;Guess that it is a BP, not a block of them.
10492         SETZ A,         ;Clear out the old-fashioned filename words.
10493         SETZ B,
10494         SETZ C,
10495         SETZ D,
10496         SETCM T,R       ;Is our "BP" realy an aobjn pointer to fewer than 64 things?
10497         TLNE R,-1       ;If LH is 0, treat as BP and replace with 440700 later.
10498         TLNE T,777700
10499          JRST FNPRS8
10500         MOVE Q,R        ;Put the aobjn pointer in Q and get the first BP in R.
10501         UMOVE R,(Q)
10502 FNPRS8: PUSHJ P,ASCIND
10503 FNPRS7: PUSHJ P,FNPRS4          ; Read a sixbit word
10504         JUMPL I,FNPRS9          ; Nothing there at all!
10505         CAIN H,";               ; Directory?
10506          JRST FNPRS0            ;  Go do special hack
10507         MOVEI I,B               ; assume FN1
10508         SKIPE B                 ; unless we already have a FN1
10509          MOVEI I,C              ; in which case assume FN2
10510         CAIN H,":
10511          MOVEI I,A              ; unless it was a device
10512         SKIPN (I)       ;Put it there, unless already something there.
10513          MOVEM T,(I)
10514         JUMPN H,FNPRS7  ;H=0 means end of last arg string.
10515 FNPRS9: ;; Supply default values for all components except FN1.
10516         SKIPN A
10517          MOVSI A,(SIXBIT /DSK/)
10518         SKIPN D
10519          MOVE D,USYSNM(U)
10520         SKIPN C
10521          MOVSI C,(SIXBIT />/)
10522         POPJ P,
10523
10524 FNPRS0: SKIPN I,D
10525          JRST FNPRS2
10526         LSH T,-6
10527         TLO T,(SIXBIT /./)
10528 FNPRS1: LSH T,-6
10529         LSH I,6
10530         JUMPN I,FNPRS1
10531 FNPRS2: IOR D,T
10532         JRST FNPRS7
10533
10534 ;;; Extract in T the next SIXBIT word from user memory off bp in R,
10535 ;;; clobbering I (test 4.9 to see if there was no word read at all).
10536 ;;; Terminating character returned in H (0 means we got to the end of the
10537 ;;; string).  Q should be an aobjn pointer to a block in user memory of
10538 ;;; additional BPs.
10539 FNPRS4: SETZ T,
10540         MOVE I,[440600,,T]
10541 FNPRS6: PUSHJ P,FNPRS3
10542         JUMPE H,CPOPJ           ; that was the end of the string
10543         CAIE H,":
10544          CAIN H,";
10545           JRST FNPRS5           ; done?
10546         CAIN H,40
10547          JRST FNPRS5            ; done?
10548         CAIN H,^Q
10549          PUSHJ P,FNPRS3
10550         CAIL H,140
10551          SUBI H,40
10552         SUBI H,40
10553         TLNE I,770000
10554          IDPB H,I
10555         JRST FNPRS6
10556
10557 FNPRS5: JUMPL I,FNPRS6          ; keep looking if we haven't seen anything yet.
10558         POPJ P,
10559
10560 ;Extract in H the next character from user memory off the byte pointer in R.
10561 ;Q should be an aobjn pointer to a block of further BPs
10562 ;(in user memory) to use after this one is exhausted.
10563 FNPRS3: TLNN R,-1
10564          HRLI R,440700
10565         IBP R
10566         UMOVE H,(R)             ;Fetch the word the BP points to.
10567         PUSH P,R
10568         HRRI R,H                ;Change the BP to point to H.
10569         LDB H,R                 ;Extract the desired byte.
10570         POP P,R
10571         JUMPN H,CPOPJ
10572         AOBJP Q,CPOPJ           ;When one BP is exhausted, go to the next (if any).
10573         UMOVE R,(Q)
10574         PUSHJ P,ASCIND
10575         JRST FNPRS3
10576 \f
10577 NOPEN:  HRRZ R,A        ;ARGS 1 MODE (LH) CHNL (RH) 2-5 LIKE NOPEN1 1-4
10578         CAIL R,NIOCHN
10579          JRST OPNL14
10580         ADDI R,IOCHNM(U)
10581         PUSH P,A
10582         PUSH P,B
10583         PUSH P,C
10584         PUSH P,D
10585         PUSH P,E
10586         PUSH P,W
10587         PUSHJ P,CCLOSE
10588         POP P,W
10589         SOS W           ;STRIP OF FIRST ARG
10590         POP P,D         ;B-E POPPED INTO A-D
10591         POP P,C
10592         POP P,B
10593         POP P,A
10594         POP P,R         ;A POPPED INTO R
10595         TLC R,@CTLBTS(U)
10596         LDB E,[OPNCOM,,R]
10597         CAIE E,2
10598          CAIN E,4
10599           JRST OPNL12   ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10600         JSP T,NOPEN1
10601         MOVEM D,SRN3(U) ;MAKE SYMBOLIC OPEN OF NETWORK WIN USING 5TH ARG AS FOREIGN HOST.
10602 NDEL1:  CLEARM SRN4(U)
10603 NRN2:   CLEARM SRN5(U)
10604 NOPENX: TRNE R,-NIOCHN
10605          BUG            ;BAD CHANNEL #
10606         HRRZM R,UUAC(U) ;CHNL # (MAYBE ONLY FOR ERRS) IN R
10607         ADDI R,IOCHNM(U)
10608         LDB W,[OPNCOM,,R]
10609         JRST NOPNE
10610
10611 ;DEFAULT THE ARGS FOR .CALL OPEN, ETC,; PUT MODE IN E.
10612 NOPEN1: SETZM EPDL(U)
10613         SETZM EPDL3(U)
10614         CAIGE W,2
10615          MOVSI B,(SIXBIT /@/)
10616         CAIGE W,3
10617          MOVSI C,(SIXBIT /@/)
10618         CAIGE W,4
10619          MOVE D,USYSNM(U)       ;SYSTEM NAME
10620         HLRZ E,R        ;GET MODE BITS FOR TRAN.
10621         JRST (T)
10622
10623 ;MAKE LINK 1-4 AS NOPEN1, 5 SNAME 2 6,7 FN1,2(2)
10624 NMLINK: MOVSI R,200000
10625         CAIN W,2        ;Only 2 args are BPs.
10626          JRST [ PUSHJ P,2FNPRS
10627                 JRST NOPENX]
10628         CAIGE W,7       ;Otherwise, must be seven word of sixbit.
10629          JRST OPNL33
10630         MOVEM E,SRN3(U)
10631         MOVEM TT,SRN4(U)
10632         MOVEM I,SRN5(U)
10633         JSP T,NOPEN1
10634         JRST NOPENX
10635
10636 NDEL:   SETZM SRN3(U)
10637         CAIN W,2
10638          JRST OPNL33
10639         CAIN W,1        ;If it's just a BP (or block of them),
10640          JRST [ MOVE R,A        ;Parse it into filenames in A-D.
10641                 MOVEM R,EPDL(U)
10642                 PUSHJ P,FNPRS
10643                 JRST .+2]
10644          JSP T,NOPEN1
10645         MOVSI R,400000  ;DELETE, ARGS AS NOPEN1
10646         SETZ E,
10647         JRST NDEL1
10648
10649 NRNAM:  MOVSI R,400000
10650         CAIN W,2        ;Only 2 args are BPs.
10651          JRST [ PUSHJ P,2FNPRS
10652                 JRST NRN2]
10653         CAIGE W,6       ;Otherwise, must be six word of sixbit.
10654          JRST OPNL33
10655         MOVEM E,SRN3(U)
10656         MOVEM TT,SRN4(U)
10657         MOVSI R,400000  ;RENAME 1-4 AS NOPEN1 5,6 NEW FN1,2
10658         JSP T,NOPEN1
10659         JRST NRN2
10660
10661 ;Parse two BPs (or aobjn pointers to blocks of BPs) into user memory
10662 ;into filenames.  The second bunch go in SRN3 - SRN5; the first in A - D.
10663 ;The two args are saved in EPDL and EPDL3.  Clears E, preserves R.
10664 2FNPRS: PUSH P,R
10665         MOVEM A,EPDL(U)         ;Save two BPs for job device.
10666         MOVEM B,EPDL3(U)
10667         PUSH P,A                ;Decode the second BP first, to get the new names.
10668         MOVE R,B
10669         PUSHJ P,FNPRS
10670         MOVEM B,SRN3(U)         ;Stick them where RENAME looks.
10671         MOVEM C,SRN4(U)
10672         MOVEM D,SRN5(U)
10673         POP P,R                 ;Parse the first BP, to get the old file filenames.
10674         PUSHJ P,FNPRS
10675         SETZ E,
10676         POP P,R
10677         POPJ P,
10678
10679 ;Takes either channel, FN1 (sixbit) and FN2 (sixbit)
10680 ;or channel and BP (or aobjn -> block of BPs).
10681 NRNWO:  SETZM EPDL(U)
10682         SETZM EPDL3(U)
10683         PUSH P,A
10684         CAIN W,2
10685          PUSHJ P,[MOVE R,B      ;If channel and BP, parse the BP into filenames.
10686                   MOVEM R,EPDL3(U)      ;But also save it for job device.
10687                   JRST FNPRS]
10688         MOVEM B,SRN3(U) ;PUT AWAY NEW NAMES.
10689         MOVEM C,SRN4(U)
10690         POP P,C
10691         ANDI C,-1       ;We call "RENAME" with old fn2 = channel number.
10692         SETZB A,B
10693         MOVEI D,0
10694         MOVSI R,400000  ;OPNCOM IS .FDELE .
10695         MOVEI E,400000
10696         JRST NRN2
10697 \f
10698 SUBTTL HACKS FOR OPENS THAT LOSE
10699
10700
10701 IFN 0,[         ;THESE "DEFNS" EXIST ONLY SO @ WILL CREF THEM
10702         OPNL1:  OPNL2:  OPNL3:  OPNL4:  OPNL5:  OPNL6:  OPNL7:
10703 OPNL10: OPNL11: OPNL12: OPNL13: OPNL14: OPNL15: OPNL16: OPNL17:
10704 OPNL20: OPNL21: OPNL22: OPNL23: OPNL24: OPNL25: OPNL26: OPNL27:
10705 OPNL30: OPNL31: OPNL32: OPNL33: OPNL34: OPNL35: OPNL36: OPNL37:
10706 OPNL40: OPNL41: OPNL42: OPNL43: OPNL44: OPNL45: OPNL46: OPNL47:
10707 OPNL50: OPNL51: OPNL52: OPNL53: OPNL54: OPNL55: OPNL56: OPNL57:
10708 OPNL60: OPNL61: OPNL62: OPNL63: OPNL64: OPNL65: OPNL66: OPNL67:
10709 OPNL70: OPNL71: OPNL72: OPNL73: OPNL74: OPNL75: OPNL76: OPNL77: 
10710 ]               ;END OF IFN 0
10711
10712 ;HERE ARE THE REAL DEFNS
10713 REPEAT NOPNLS,CONC OPNL,\.RPCNT+1,:     JSP D,OPENL
10714 ;
10715 OPENL:  CONSZ PI,77400
10716          BUG            ;ERROR WITH PI IN PROGRESS
10717         MOVE U,USER     ;BE SURE U=CURRENT USER'S INDEX
10718         MOVEI D,-OPNL1(D)       ;GET LOSSAGE NUMBER
10719         MOVE R,SYSCVL(U);POSSIBLY RETURN IN ERROR-CODE ARG TO .CALL
10720         TLNE R,%SCVER
10721          UMOVEM D,(R)
10722         HRRZ R,UUAC(U)  ;GET CH NUM
10723         CAILE R,NIOCHN-1
10724          BUG            ;UUAC BAD
10725         PUSHJ P,LSWCLR  ;UNLOCK SWITCHES
10726         DPB R,[BCHPTR]  ;SAVE AS MOST RECENT CHANNEL IN ERR
10727         ADD R,U         ;RELOCATE TO POINT TO USER VARS
10728         DPB D,[220600,,IOCHST(R)]       ;STORE IN STATUS WORD
10729         JRST CLKONJ
10730 \f
10731 SUBTTL RCHST, STATUS, RFNAME, RFPNTR, WHYINT CALLS
10732
10733 ;.CALL RFNAME
10734 ;1ST ARG IS A <JOB>, WHOSE CHANNEL IS TO BE LOOKED AT.
10735 ;2ND ARG IS A CHANNEL NUMBER.
10736 ;3RD ARG IS BP TO STORE ASCIZ FILENAME STRING THROUGH.
10737 ;4TH ARG IS MAXIMUM NUMBER OF CHARACTERS TO STORE (DEFAULTS TO 1,,0).
10738 ;ONLY 1 ARG => IT IS CHANNEL #, AND JOB IS "SELF".
10739 ;FIRST 4 VALUES ARE THE DEVICE, FN1, FN2 AND SNAME
10740 ;  AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10741 ;FIFTH VALUE IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN
10742
10743 NRFNAM: MOVE J,A        ;FIRST ARG IS JOB SPEC
10744         CAIL W,2
10745          SKIPA A,B      ;GET CHANNEL # INTO A IN EITHER CASE
10746           MOVEI J,%JSELF ;IF ONLY ONE ARG, JOB SPEC IS SELF
10747         MOVE Q,C        ;SAVE BP FOR STORING ASCIZ FILENAME STRING - IF ANY.
10748         CAIGE W,3
10749          SETZ Q,
10750         CAIGE W,4
10751          MOVSI D,1
10752         JSP T,NCORUI    ;DECODE JOB SPEC
10753          JFCL
10754 IFN PDP6P,[
10755         CAIN J,-1
10756          JRST OPNL34    ;PDP6 DOESN'T HAVE CHANNELS
10757 ]
10758         PUSH P,D
10759         PUSH P,Q
10760         MOVE W,D
10761         MOVE U,J        ;LOOK IN THAT JOB'S CHANNELS
10762         PUSHJ P,NRFNM1  ;GET THE CRUFT
10763          JRST POP2J
10764         PUSHJ P,LSWPOP  ;UNSOS DIELOK.
10765         MOVE T,Q
10766         POP P,Q
10767         POP P,I         ;I GETS 4TH ARG: MAX NUMBER OF CHARS TO STORE IN STRING.
10768         JUMPE T,POPJ1   ;IF DEVICE ROUTINE HAS CLEARED Q, IT HAS STORED THE STRING.
10769                 ;NOTE NETRCH PUTS AN EXTRA VALUE FOR .RCHST (GARBAGE, TO US) IN Q!
10770         JUMPE Q,POPJ1   ;IF BP ARG WAS 0, CALLER DOESN'T WANT A STRING.
10771         MOVE R,Q
10772         PUSHJ P,ASCIND
10773         MOVE Q,R
10774         MOVE J,A        ;IF SO, STORE ALL 4 FILENAMES DOWN IT, ONE BY ONE.
10775         MOVEI T,":
10776         PUSHJ P,NRFNS1
10777         MOVE J,D
10778         MOVEI T,";
10779         PUSHJ P,NRFNS1
10780         MOVE J,B
10781         MOVEI T,40
10782         PUSHJ P,NRFNS1
10783         MOVE J,C
10784         MOVEI T,0
10785         PUSHJ P,NRFNS1
10786         JRST POPJ1
10787
10788 ;STORE THE SIXBIT WORD IN J FOLLOWED BY THE ASCII CHAR IN T
10789 ;INTO USER ADDRESS SPACE DOWN THE BP IN Q.
10790 NRFNS1: JUMPE J,CPOPJ           ;OUTPUT NOTHING AT ALL IF THE SIXBIT WORD IS EMPTY.
10791         CAIGE I,4               ;GIVE UP NOW IF TOO CLOSE TO END OF ALLOCATED SPACE.
10792          POPJ P,
10793         SETZ R,
10794         ROTC J,6                ;ELSE GET NEXT CHAR IN R, AND CONVERT TO ASCII AND STORE.
10795         ADDI R,40
10796         SETZ TT,
10797         CAIE R,":               ;PRECEDE ANY SPECIAL CHARACTERS WITH ^Q.
10798          CAIN R,";
10799           MOVEI TT,^Q
10800         CAIN R,40
10801          MOVEI TT,^Q
10802         JUMPE TT,NRFNS2
10803         SOS I
10804         PUSHJ P,NRFNSB
10805 NRFNS2: SOS I
10806         MOVE TT,R
10807         PUSHJ P,NRFNSB
10808         JUMPN J,NRFNS1
10809         SOS I
10810         MOVE TT,T
10811         PUSHJ P,NRFNSB          ;IF NAME FINISHED BUT NOT EMPTY, FOLLOW BY TERMINATOR.
10812         JUMPE T,CPOPJ
10813         CAIN T,40
10814          POPJ P,
10815         MOVEI TT,40
10816         PUSHJ P,NRFNSB          ;IF TERMINATOR IS : OR ;, FOLLOW IT WITH A SPACE.
10817         SOJA I,CPOPJ
10818
10819 ;STORE A BYTE IN TT DOWN BP IN Q TO USER SPACE, INCREMENTING FIRST.
10820 ;XCTR XBYTE LOSES BECUSE IT GETS THE BP FROM USER SPACE.
10821 NRFNSB: IBP Q
10822         PUSH P,T
10823         PUSH P,Q
10824         UMOVE T,(Q)
10825         HRRI Q,T
10826         DPB TT,Q
10827         POP P,Q
10828         UMOVEM T,(Q)
10829         POP P,T
10830         POPJ P,
10831
10832 ;GET THE FILENAMES FOR THE CHANNEL IN A OF JOB IN U INTO A THRU D.
10833 ;IF Q IS NONZERO, IT IS A BP TO STORE AN ASCIZ STRING, AND W IS THE
10834 ;MAX NUMBER OF CHARACTERS TO STORE.
10835 ;THE DEVICE DEPENDENT ROUTINE CAN STORE THE STRING ITSELF
10836 ;AND SET Q TO ZERO SO THAT IT WILL NOT BE STORED THE STANDARD WAY.
10837 NRFNM1: MOVE T,[4,,NRFNM2]
10838         JRST CHNDCD     ;R GETS ADDR OF IOCHNM WD, H GETS CONTENTS.
10839 NRFNM2: HLRZ A,H        ;PUT LH(IOCHNM WD) WHERE DEVICE RTN LOOKS
10840         HLLZ J,DCHSTB(H)
10841         JUMPG J,[       ;IF 6-LETTER DEVICE NAME, LH IS POSITIVE ADDRESS
10842                 HLRZS J ;OF FULL NAME.  NOTE THERE BETTER BE NO
10843                 MOVE J,(J)      ;3-CHAR DEVICES WHOSE NAME DOES NOT START
10844                 JRST .+1 ]      ;WITH A LETTER.
10845         PUSH P,J        ;SAVE THE PROBABLE VALUE OF DEVICE NAME
10846         LDB J,[1400,,DCHSTB(H)]
10847         HLRZ J,DRFNTB(J) ;GET RFNAME ROUTINE POINTER
10848         SETZB B,C       ;FN1, FN2 ARE 0 FOR NON-DIR-DEV
10849         SETZ D,         ;SNAME IS 0 FOR NON-MULTI-DIR-DEV
10850         LDB E,[.BP (%IOTOM),IOTTB(H)]   ;PROBABLE VALUE OF MODE
10851         PUSHJ P,(J)     ;CALL DEVICE-SPECIFIC ROUTINE
10852          SKIPA A,(P)    ;NO SKIP => USE DEVICE NAME FROM DCHSTB
10853           MOVE A,J      ;SKIP => USE DEVICE NAME RETURNED IN J
10854         JRST POP1J1
10855
10856 ;.CALL RFPNTR
10857 ;ARG 1 - CHANNEL NUMBER
10858 ;VAL 1 - ACCESS POINTER OF CHANNEL
10859 ;VAL 2 - BYTE SIZE OF CHANNEL.
10860 ;FAILS IF NOT A RANDOM-ACCESS DEVICE
10861
10862 NRFPNT: HLRZ A,H        ;CHANNEL ALREADY DECODED, SET UP LH(IOCHNM) FOR DEV RTN
10863         LDB J,[1400,,DCHSTB(H)]
10864         HRRZ J,DRFNTB(J) ;GET RFPNTR ROUTINE POINTER
10865         JRST (J)        ;IT SHOULD PUT POINTER IN A AND POPJ1, OR OPNL34
10866
10867 ;SYMBOLIC CALL "RCHST"
10868 ;1ST ARG IS A CHANNEL NUMBER.
10869 ;6 OR MORE VALUES. THE FIRST 4 ARE THE DEVICE, FN1, FN2 AND SNAME
10870 ;  AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10871 ;THE 5TH IS THE ACCESS POINTER, OR -1 IF NOT RANDOM ACCESS.
10872 ;THE 6TH IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN.
10873 ;MORE VALUES ARE RETURNED ONLY FOR NET:, AT THE MOMENT.
10874 ;THE DEV SUBROUTINE MAY PUT EXTRA RESULTS IN TT, I, AND Q, AND PUT # RESULTS INTO W
10875
10876 NRCHST: SETO I,                 ;DEFAULT POSSIBLE EXTRA RESULTS
10877         SETO TT,                ;DEFAULT ACCESS POINTER TO -1
10878         MOVEI W,6               ;NORMAL NUMBER OF RESULTS IS 6
10879         SETZ Q,
10880         PUSHJ P,NRFNM1          ;GET RESULTS 1 THROUGH 4 AND 6, AND SET UP R AND H
10881          POPJ P,                ;CHANNEL NUMBER MUST HAVE BEEN BAD
10882         PUSH P,A
10883         PUSH P,B                ;SAVE THE AC THAT RFPNTR CLOBBERS.
10884         HLRZ A,H                ;GET ROUTINE TO GET ACCESS POINTER
10885         LDB J,[1400,,DCHSTB(H)]
10886         HRRZ J,DRFNTB(J)        ;ROUTINE BETTER PRESERVE B,C,D,E,TT,I,Q
10887         CAIL J,OPENL            ;KLUDGILY SKIP IF WOULD OPEN-LOSS
10888          PUSHJ P,(J)            ;GET ACCESS POINTER IN A, ALWAYS SKIPS
10889           MOVE A,TT             ;NOT RANDOM ACESS, USE DEFAULT VALUE
10890         MOVE TT,E               ;OPEN MODE IS 6TH RESULT
10891         MOVE E,A                ;ACCESS POINTER IS 5TH RESULT
10892         JRST PPBAJ1
10893 \f
10894 ;.RCHST AC,  WITH  AC/ CH,,ADDR
10895 ;RETURNS, IN THE 5 OR MORE WORDS STARTING AT ADDR,
10896 ;THE RESULTS OF A SYMBOLIC RCHST ON CHANNEL CH.
10897 ;EXCEPTION - THE DEVICE NAME IS RETURNED IN THE RH
10898 ;OF THE FIRST WORD , SO IT IS TRUNCATED TO 18 BITS.
10899 ;EXCEPTION - THE OPEN MODE VALUE IS NOT RETURNED. LATER VALUES
10900 ;ARE SHIFTED DOWN ONE WORD.
10901 ;NEVER SKIPS.
10902
10903 ARCHST: UMOVE J,(J)     ;GET CONTENTS OF AC
10904         HLRZ A,J
10905         CAIL A,NIOCHN
10906          JRST ILUUO     ;BAD CHANNEL NUMBER
10907         PUSH P,J
10908         PUSHJ P,NRCHST  ;DO THE REAL WORK.
10909          BUG            ;ONLY ERROR RETURN SHOULD BE BAD CHANNEL NUMBER
10910         HLRZS A         ;PUT DEV NAME IN RH FOR HISTORY'S SAKE
10911         POP P,J         ;RH(J) HAS PLACE TO STORE DATA
10912         MOVE TT,I
10913         MOVE I,Q        ;SHIFT DOWN LAST 2 VALS OVER THE OPEN MODE.
10914         HRLI J,A
10915         ADDI W,-2(J)    ;W HAD 1+ # VALS, NOW HAS PLACE TO PUT LAST ONE
10916         XCTR XBW,[BLT J,(W)]
10917         POPJ P,
10918
10919 ;.STATUS CH,LOC ;STORE IN LOC THE STATUS OF CHANNEL CH
10920                 ;AND OF THE DEV OPEN ON IT IF ANY
10921 ;1.1-1.6 SYS PERIPHERAL DEVICE CODE
10922 ;1.7-2.9 DEVICE DEPENDENT
10923 ;3.1-4.9 LH(IOCHST)
10924
10925 ASTATUS:ADDI R,IOCHNM(U)        ;SET UP AC'S LIKE CHNDCD
10926 ASTAT1: MOVE H,(R)              ;ENTER HERE FROM .USET [.RIOS,,]
10927         HLL R,CLSTB(H)
10928         PUSHJ P,NSTATUS         ;CALL NEW SYSTEM CALL VERSION
10929          BUG
10930         UMOVEM A,(C)    ;GIVE TO USER
10931         POPJ P,
10932
10933 ;.CALL STATUS
10934 ;ARG 1 - CHANNEL NUMBER
10935 ;VAL 1 - SAME AS .STATUS
10936
10937 NSTATUS:HLRZ A,H                ;SET UP LH(IOCHNM)
10938         LDB D,[140600,,DCHSTB(H)] ;GET SYS PERIPHERAL DEVICE CODE
10939         LDB J,[340300,,IOTTB(H)]        ;GET I/O CHANNEL MODE FROM 4.5-4.2
10940         DPB J,[060300,,D]       ;RETURN IN BITS 1.9-1.7
10941         LDB J,[1400,,DCHSTB(H)]
10942         HLRZ J,DSTSTB(J)        ;GET STATUS ROUTINE POINTER
10943         PUSHJ P,(J)             ;ROUTINE FILLS OUT STATUS WORD IN D
10944         HLL D,IOCHST-IOCHNM(R)  ;FILL IN LEFT HALF FROM IOCHST
10945         TLZ D,740000            ;CLEAR BITS USED FOR CHANNEL NUM ON IO PDL
10946         MOVE A,D                ;RETURN VALUE IN A
10947         JRST POPJ1              ;THIS CALL ALWAYS SUCCEEDS
10948
10949 ;.CALL WHYINT
10950 ;ARG 1 - CHANNEL NUMBER
10951 ;VAL 1 - %WY CODE FOR TYPE OF DEVICE
10952 ;ADDITIONAL VALUES DEVICE-DEPENDENT
10953 ;THIS IS THE USUAL CALL TO GIVE IN RESPONSE TO A SECOND WORD INTERRUPT
10954
10955 NWHYINT:HLRZ A,H                ;SET UP LH(IOCHNM)
10956         LDB J,[1400,,DCHSTB(H)]
10957         HRRZ J,DSTSTB(J)        ;GET WHYINT ROUTINE POINTER
10958         JRST (J)
10959 \f
10960 ;DEVICE-SPECIFIC RFNAME/RCHST ROUTINES
10961 ;CALLED WITH STANDARD CHNDCD STUFF IN H AND R, LH(IOCHNM) IN A
10962 ;MUST PRESERVE H AND R; CAN CLOBBER W TO INDICATE EXTRA STUFF FOR RCHST
10963
10964 RCHUSR: MOVE B,UNAME(A)         ;GET UNAME
10965         MOVE C,JNAME(A)         ;GET JNAME
10966         POPJ P,
10967
10968 IFN NUNITS,[            ;UTAPE .RCHST
10969 RCHUTP: HRRZ C,UTTNO(A)
10970         MOVSI J,'UT0(C) ;GET REAL DEV NAME "UTN" IN J
10971         AOS (P)         ;SKIP TO RETURN CHANGED DEV NAME
10972         MOVE D,UTASS(C) ;THE "SNAME" IS THE USER TAPE IS ASSIGNED TO.
10973         CAIGE A,NUTIC
10974          JRST RCHUTI    ;INPUT
10975         MOVE B,UTN1(A)  ;OUTPUT, GET FN1
10976         MOVE C,UTN2(A)  ;NOW FN2
10977         POPJ P,
10978
10979         ;UTAPE INPUT .RCHST
10980 RCHUTI: LDB T,[220500,,UTDBC(A)]        ;GET FILE NUMBER
10981         SUBI T,1
10982         LSH T,1                 ;TURN INTO INDEX INTO DIRECTORY
10983         CONO PI,CLKOFF
10984         ADD T,UDIRO(C)          ;GET POINTER TO FILE NAMES
10985         MOVE B,(T)              ;GET FN1
10986         MOVE C,(T)              ;GET FN2
10987         JRST CLKONJ
10988 ]
10989
10990 ;RCHST ROUTINE FOR TTY
10991 RCHTTY: MOVE J,A
10992         ANDI J,#%TICNS#(.BM $TIIDX)
10993         IOR E,J         ;MERGE TTY OPEN MODE BITS WITH THE GENERAL ONES.
10994         TRNE A,%TICNS
10995          POPJ P,
10996         ANDI A,7
10997         MOVEI J,'T00(A)
10998         HLRZ A,(R)
10999 RCHST1: ANDI A,70
11000         LSH A,3
11001         ADD J,A
11002         HRLZS J         ;J NOW HAS SIXBIT/TNM/, NM = TTY #.
11003         JRST POPJ1      ;SKIP TO SAY DEV NAME IS IN J.
11004
11005 ;RCHST ROUTINE FOR STY
11006 RCHSTY: MOVE J,TTYOPT(A)
11007         TLNE J,%TOHDX
11008          IORI E,4       ;STY BIT 1.3 => TTY IS HALF-DUPLEX.
11009         MOVE J,STYSTS-NFSTTY(A)
11010         TLNE J,%SSORS
11011          IORI E,20      ;BIT 1.5 => WANT TO RECEIVE %TDORS ON .RESET OF TYOC,
11012         TRNN E,1        ;FIND THE DON'T-HANG-BIT FOR THIS DIRECTION.
11013          TLZA J,#%SSOHG ;AND FLUSH THE ONE FOR THE OTHER DIRECTION.
11014           TLZ J,#%SSHNG
11015         TLNE J,-1       ;THEN TESTING BOTH TESTS ONLY THE RELEVANT ONE.
11016          IORI E,10
11017         SUBI A,NFSTTY
11018         ANDI A,7
11019         MOVEI J,'S00(A)
11020         HLRZ A,(R)
11021         SUBI A,NFSTTY
11022         JRST RCHST1
11023
11024 RCHDRH: HRRZ A,IOCHST-IOCHNM(R) ;TRACK NUMBER
11025         IMULI A,LMNBLK          ;DIRHNG DEVICE RFNAME
11026         ADDI A,2000-LMNBLK*NUDSL
11027         ADD A,QMDRO
11028         MOVE D,MNUNAM(A)
11029         POPJ P,
11030 \f
11031 ;RCHST ROUTINE FOR DIRECTORY CHANNELS AND THE ERR DEVICE.
11032 RCHDIR: MOVE T,DSKLST(A)        ;GET THE TYPE OF DIRECTORY CODE.
11033         SKIPE J,UDUSR(A)        ;IF DEVICE # IS NONZERO, ADD IT TO DEV NAME
11034          HRLZS J                ;(ONLY HAPPENS FOR UTAPE)
11035         ADD J,RCHDRD-1(T)       ;DETERMINE DEV NAME FROM DIRECTORY TYPE
11036         MOVE B,RCHDR1-1(T)      ;SAME FOR FN1
11037         SKIPN C,RCHDR2-1(T)     ;AND FN2, EXCEPT 0 FOR ERR DEVICES
11038          MOVE C,UUDPP(A)        ; SO WE WILL GET THE STATUS WORD BEING DECODED.
11039         CAIN T,3
11040          MOVE D,UDSYSN(A)       ;FOR DISK UFD'S, GET THE SNAME
11041         JRST POPJ1              ;RETURN, SAYING WE HAVE SPEC'D THE DEVICE NAME.
11042
11043 .SEE UDT        ;THESE TABLES ARE IN PARALLEL WITH UDT
11044 RCHDRD: 'UT0,, ? 'CLU,, ? 'DSK,, ? 'DSK,,
11045         'ERR,, ? 'TTY,, ? 'COR,,
11046 IF2 IFN .-UDTLN-RCHDRD,.ERR RCHDRD WRONG LENGTH
11047
11048 RCHDR1: '.FILE. ? '.FILE. ? '.FILE. ? 'M.F.D.
11049         3 ? '.FILE. ? '.FILE.
11050 IF2 IFN .-UDTLN-RCHDR1,.ERR RCHDR1 WRONG LENGTH
11051
11052 RCHDR2: SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(FILE)/
11053         0 ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/
11054 IF2 IFN .-UDTLN-RCHDR2,.ERR RCHDR2 WRONG LENGTH
11055
11056
11057
11058 ;CORE LINK .RCHST ROUTINE
11059
11060 RCHCLO: CONO PI,CLKOFF
11061         MOVE B,CLN1(A)  ;GET FN1
11062         MOVE C,CLN2(A)  ;GET FN2
11063         MOVE D,CLSYN(A) ;GET SYSTEM NAME
11064         JRST CLKONJ
11065
11066 ;RFNAME ROUTINE FOR DSK
11067
11068 RCHQSK: MOVE H,QUDPR(A) ;FILE STATUS FOR DISK PICKUP USER DIR POINTER
11069         PUSHJ P,QUDLK   ;LOCK DIRECTORY
11070         MOVE C,QSNLCN(H)        ;LOCATION OF DIRECTORY
11071         MOVE D,UDNAME(C)
11072         ADD C,QUDFPR(A) ;ADD LOCN OF FILE WITHIN DIRECTORY
11073         MOVE B,(C)      ;GET FIRST FILE NAME
11074         MOVE C,1(C)     ;GET SECOND FILE NAME
11075         PUSHJ P,QUDULK
11076         MOVE H,QSRAC(A)
11077         TLNE H,%QALNK
11078          TRO E,20       ;LINK MODE
11079         MOVE H,(R)      ;PRESERVE H
11080         POPJ P,
11081
11082 ;RFNAME ROUTINE FOR BOJ:
11083
11084 RCHBOJ: CONO PI,CLKOFF  ;BOJ DEVICE .RCHST ROUTINE
11085         MOVE T,JBCUI(A) ;RETURNS CREATOR'S NAME
11086         MOVE B,UNAME(T)
11087         MOVE C,JNAME(T)
11088         SKIPGE JBCG(A)
11089          SETZB B,C      ;CREATOR GONE, RETURN BLANK NAMES
11090         JRST CLKONJ
11091 \f
11092 ;RFNAME ROUTINE FOR JOB:
11093
11094 RFNJOB: SKIPE Q
11095          PUSHJ P,RFNJ1
11096         CONO PI,CLKOFF
11097         MOVE B,JBFN1(A)
11098         MOVE C,JBFN2(A)
11099         MOVE D,JBSYS(A)
11100         MOVE E,JBOPNM(A)
11101         MOVE J,JBDEV(A)
11102         JRST CLKOJ1
11103
11104 ;COPY THE BOJ JOB'S ASCIZ FILENAME STRING INTO OUR CALLER'S STRING.
11105 ;THE CALLER'S BP IS IN Q, AND HIS MAX CHARS TO STORE IS IN W.
11106 RFNJ1:  SKIPN B,JBFNP(A)
11107          POPJ P,
11108         PUSH P,TT
11109         PUSH P,T
11110         MOVE J,JBCJUI(A)
11111         AOS DIELOK(J)   ;PREVENT THE JOB FROM DIEING.
11112         PUSHJ P,SOSSET
11113          DIELOK(J)
11114         TLZ B,37
11115         MOVE D,B
11116         PUSHJ P,RFNJ3
11117         MOVEI TT,1
11118 ;D HAS BP TO FETCH WITH, POINTING INTO C, WHICH CONTAINS WORD FETCHED FROM BOJ JOB.
11119 ;RH(B) HAS ADDR OF NEXT WORD TO FETCH FROM THE BOJ JOB.
11120 ;TT CONTAINS THE PREVIOUS CHARACTER TRANSFERRED, OR 1
11121 ;IF THE PREVIOUS CHARACTER WAS QUOTED WITH A ^Q.
11122 RFNJ2:  ILDB E,D
11123         TRNN D,#C               ;IF THE BP IN D ADVANCES PAST C,
11124          JRST RFNJ4
11125         PUSHJ P,RFNJ3           ;FETCH ANOTHER WORD INTO C, MAKE D POINT THERE AGAIN,
11126         LDB E,D                 ;AND FETCH THE SAME BYTE OVER AGAIN.
11127 RFNJ4:  SOJL W,RFNJ5
11128         EXCH TT,E
11129         PUSHJ P,NRFNSB          ;STORE BYTE INTO CALLER, UNLESS HIS STRING IS FULL.
11130         EXCH TT,E
11131         CAIN TT,^Q              ;A QUOTED CHAR DOES NOT TERMINATE AND DOES NOT QUOTE.
11132          MOVEI E,1
11133         MOVE TT,E
11134         JUMPN E,RFNJ2           ;STOP STORING AFTER A NULL WHICH ISN'T QUOTED.
11135 RFNJ5:  SETZ Q,
11136         POP P,T
11137         POP P,TT
11138         JRST LSWPOP
11139
11140 ;READ THE NEXT WORD (ADDR IN B) FROM THE BOJ JOB.
11141 RFNJ3:  SETZ C,
11142         PUSH P,U
11143         PUSH P,A
11144         PUSH P,Q
11145         MOVE U,JBCJUI(A)
11146         LDB A,[121000,,B]
11147         PUSHJ P,UPLC            ;LOOK UP THE BOJ JOB'S PAGE.
11148         POP P,Q
11149         POP P,A
11150         POP P,U
11151         LDB J,T                 ;IF IT DOESN'T EXIST, LOAD A ZERO,
11152         JUMPE J,RFNJ6           ;AVOID GETTING MPV.
11153         MOVE J,JBCJUI(A)
11154         PUSHJ P,MPLDJ
11155         UMOVE C,(B)
11156 RFNJ6:  HRRI D,C
11157         AOJA B,MPLDZ
11158 \f
11159 ;RFPNTR FOR USR:
11160
11161 RFPUSR: HRRZ A,IOCHST-IOCHNM(R) ;GET THE ACCESS PTR
11162         MOVEI B,36.             ;BYTE SIZE IS ALWAYS FULL WORD.
11163         JRST POPJ1
11164
11165 ;RFPNTR FOR DISK
11166
11167 RFPQSK: LDB B,[QSBSIZ(A)]       ;GET FILE BYTE SIZE
11168         MOVSI T,%QAACC
11169         TDNN T,QSRAC(A)         ;IF .ACCESS WAS DONE AND NOT HANDLED,
11170          JRST RFPQS1
11171         MOVE A,QRADAD(A)        ;GET WHAT THE .ACCESS SPECIFIED.
11172         JRST POPJ1
11173
11174 RFPQS1: MOVE J,QFBLNO(A)        ;GET BYTE # OF STRAT OF CURRENT BLOCK.
11175         SKIPGE QSMDN(A)         ;SKIP ON A BUFFER ACTIVE
11176          JRST RFPQS2            ;NONE ACTIVE => QFBLNO POINTS TO NEXT BLOCK TO BE READ.
11177         ADD J,QMPBSZ(A)         ;ELSE CORRECT FOR THE NUMBER OF BYTES WE'VE PROCESSED
11178         SUB J,QSMPRC(A)         ;IN THE ACTIVE BLOCK (QFBLNO -> 1ST WD OF BLOCK).
11179 RFPQS2: MOVE A,J
11180         JRST POPJ1
11181 \f
11182 SUBTTL RESET,IOPUSH,IOPOP,IOPDL,FORCE,FLUSH .CALLS
11183
11184 ;.RESET CH,     ;RESET BUFFERED INFO ON CHANNEL CH
11185                 ;NOT IMPLEMENTED FOR MANY DEVICES
11186                 ;HAS SPECIAL EFFECTS ON "USR" DEVICE
11187 ;.CALL RESET
11188 ;ARG 1 - CHANNEL NUMBER
11189
11190 NRESET: HRRZ A,H
11191         AOSA (P)
11192 ARESET:  HRRZ A,(R)     ;PICK UP INDEX FROM I/O CH WORD
11193         SKIPA T,[HRRZ T,RSTB1(A)]       ;.RESET USES RH OF TABLE
11194 AIOPP1:  MOVE T,[HLRZ T,RSTB1(A)]       ;.IOPUSH, .IOPOP USE LH OF TABLE
11195         IDIVI A,7       ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11196         ADD A,[440500,,RSTB]
11197         IBP A
11198         SOJGE B,.-1
11199         LDB A,A         ;GET BYTE FROM TABLE
11200         XCT T           ;GET REAL TABLE ENTRY IN T
11201         JRST (T)        ;DISPATCH
11202
11203 ;IO CHANNEL PUSH DOWN LIST ROUTINES
11204 ;C(I) =0 AT DSP => IOPUSH =1 => IOPOP
11205
11206 NIOPUS: AOS (P)
11207 AIOPUSH:MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11208         CAML T,[LUIOP-1,,0]     ;LUIOP-2,,<ptr> is OK, leaves room for 1 more.
11209          JRST IOCER6    ;OVER PUSH ERROR
11210         PUSH T,(R)      ;PUSH CURRENT IOCHNM
11211         PUSH T,IOCHST-IOCHNM(R) ;&IOCHST
11212         HRRZ A,(R)
11213         HRRZ J,UUAC(U)
11214         DPB J,[400400,,(T)]     ;STORE CHANNEL NUM FOR POSSIBLE USE BY AIOPDL
11215         MOVEM T,SIOCP(U)        ;STORE BACK PDL POINTER
11216         MOVEI I,0       ;INDICATE IOPUSH
11217         PUSH P,R
11218         PUSHJ P,AIOPP1  ;CALL DEVICE'S IOPDL HANDLER.  SHOULD NOT HANG
11219         POP P,R
11220         SETZM (R)       ;CLEAR OUT IOCHNM
11221         SETZM IOCHST-IOCHNM(R)  ;&IOCHST
11222         POPJ P,
11223
11224 NIOPOP: AOS (P)
11225 AIOPOP: PUSHJ P,ACLOSE  ;CLOSE WHATEVER MAY BE OPEN ON CHANNEL POPPING INTO
11226         MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11227         TLNN T,-1
11228          JRST IOCER5    ;OVER POP ERROR
11229         POP T,IOCHST-IOCHNM(R)  ;POP BACK IOCHST
11230         POP T,(R)               ;&IOCHNM
11231         HRRZ A,(R)
11232         SETZM 1(T)      ;CLEAR OUT PDL WORD TO AVOID CONFUSION IN
11233                         ;ROUTINES THAT GROVEL OVER I/O PDL
11234         MOVEM T,SIOCP(U)        ;STORE BACK PDL POINTER
11235         MOVEI I,1       ;INDICATE IOPOP
11236         JRST AIOPP1     ;CALL DEVICE'S IOPDL HANDLER
11237
11238 AIOPDL: MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11239         TLNN T,-1       ;SKIP UNLESS IO PDL EMPTY
11240         POPJ P,
11241         LDB R,[400400,,(T)]     ;FIND OUT WHAT CHNL TOP ENTRY WAS PUSHED FROM
11242         ADDI R,IOCHNM(U)
11243         PUSHJ P,AIOPOP  ;POP BACK INTO CHNL PUSHED FROM
11244         JRST AIOPDL
11245
11246 IIOPPR: JUMPE I,[JRST 4,CPOPJ]  ;IOPUSH
11247         SETZM (R)       ;CLOSE CHANNEL
11248         SUBI R,IOCHNM(U)        ;GET CHANNEL NUMBER
11249         MOVE R,CHNBIT(R)        ;SECOND WORD INTERRUPT BIT
11250         IORM R,IFPIR(U) ;GIVE TO USER
11251         POPJ P,
11252 \f
11253 ;.CALL FORCE
11254 ;ARG 1 - CHANNEL NUMBER
11255 ;IF ANY OUTPUT IS BUFFERED UP, CAUSES IT TO BE SENT TO THE DEVICE
11256 ;(IF FORCE WAS NOT DONE, IT MIGHT NOT BE SENT UNTIL A COMPLETE
11257 ;BUFFERFULL HAD BEEN OUTPUT BY THE USER.)
11258
11259 NFORCE: SKIPA T,[HLRZ T,DFRCTB(D)]      ;FORCE USES LH OF TABLE
11260 NFINI1:  MOVE T,[HRRZ T,DFRCTB(D)]      ;FINISH USES RH OF TABLE
11261         HLRZ A,(R)      ;PASS LH(IOCHNM) TO DEVICE ROUTINES
11262         HRRZ D,(R)      ;USE RH(IOCHNM) AS BYTE INDEX INTO RSTB
11263         IDIVI D,7       ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11264         ADD D,[440500,,RSTB]
11265         IBP D
11266         SOJGE E,.-1
11267         LDB D,D         ;GET BYTE FROM TABLE
11268         XCT T           ;GET REAL TABLE ENTRY IN T
11269         JRST (T)        ;DISPATCH
11270
11271 ;.CALL FINISH
11272 ;ARG 1 - CHANNEL NUMBER
11273 ;FIRST DOES A FORCE, THEN WAITS FOR ALL OUTPUT TO GET TO THE DEVICE
11274
11275 NFINIS: PUSHJ P,NFORCE  ;CALL DEV ROUTINE FOR FORCING
11276          POPJ P,
11277         JRST NFINI1     ;THEN CALL DEV ROUTINE FOR WAITING
11278
11279 ;.NETS CH, - UUO VERSION OF .CALL FORCE.
11280 ANETS:  PUSHJ P,NFORCE
11281          JRST IOCER1    ;ILLEGAL HARDWARE OPERATION
11282         POPJ P,
11283 \f
11284 SUBTTL I/O DEVICE DISPATCH TABLES
11285
11286 COMMENT |
11287         This page tries to document the ITS I/O device dispatch tables and
11288 dispatch environment.  It is not completed yet.
11289
11290 The tables use several different indices, which are:
11291         opnidx - result of device name lookup in DEVTAB
11292         ioidx  - result of OPEN; has symbolic values.  This is the index
11293                 stored in RH of IOCHNM (per-job channel table)
11294         sidx  - secondary index from DCHSTB(ioidx)
11295         ridx  - secondary index from RSTB(ioidx)
11296
11297 The following system calls are dispatched through these tables.
11298 There are 11 dispatch routines that each device must specify.
11299 The format is "CALL [table name(index-used) -> device-routine]"
11300
11301 OPEN [DEVADR(opnidx) -> devO]
11302         "opnidx" is looked up from DEVTAB which holds the device names.
11303         The device's OPEN routine is in the RH of DEVADR.
11304         It must set up the user's IOCHNM word for the channel,
11305         by setting the RH to the right "ioidx" and the LH to whatever
11306         the device wants.
11307
11308         Context:
11309
11310 CLOSE [CLSTB(ioidx) -> devCLS]
11311         The device's CLOSE routine is in the RH of CLSTB.
11312         It must zero the user's IOCHNM word for the channel.
11313
11314         Context:
11315
11316 IOT, SIOT [IOTTB(ioidx) -> devVarious]
11317         These routines do I/O transfers.  The main reason "ioidx"
11318         has so many possible values (causing IOTTB to be large) is
11319         because lots of devices specify different ioidx's for different
11320         modes - input/output, block/unit, image/ascii, etc - in order
11321         to speed up actual I/O transfers, which are probably the most
11322         common device-related system calls.
11323
11324         Context:
11325
11326 STATUS  [LH(DTSTB(sidx)) -> devSTA]
11327         
11328
11329 WHYINT  [RH(DTSTB(sidx)) -> devWHY]
11330
11331 RCHST, RFNAME   [LH(DRFNTB(sidx)) -> devRCH]
11332
11333 RFPNTR  [RH(DRFNTB(sidx)) -> devRFP]
11334
11335 IOPUSH, IOPOP   [LH(RSTBI(ridx)) -> devIOP]
11336
11337 RESET   [RH(RSTBI(ridx)) -> devRST]
11338
11339 FORCE   [LH(DFRCTB(ridx)) -> devFRC]
11340
11341 FINISH  [RH(DFRCTB(ridx)) -> devFIN]
11342
11343 |
11344 \f
11345 ;DISPATCH TABLE FOR .CLOSE UUO
11346 ;TRANSFERED THROUGH USING RIGHT HALF OF IOCHNM WORD AS AN INDEX
11347 ;R HAS THE ADDRESS OF THE IOCHNM WORD.
11348 ;
11349 ;VARIOUS ROUTINES USE THE BITS IN THE L.H. TO DECIDE WHETHER
11350 ;A CHANNEL IS ACCEPTABLE FOR SOME OPERATION.
11351 %CLS==1,,525252
11352 %CLSU==400000   ;USR DEVICE (INFERIOR)
11353 %CLSDO==200000  ;DECTAPE OUTPUT
11354 %CLSJI==100000  ;JOB INPUT
11355 %CLSDI==40000   ;DECTAPE INPUT
11356 %CLSTI==20000   ;TTY INPUT
11357 %CLSCL==10000   ;CORE-LINK DEVICE
11358 %CLSBJ==4000    ;BOJ DEVICE
11359 %CLSQO==2000    ;DISK OUTPUT
11360 %CLSFU==1000    ;NON-INFERIOR USR
11361 %CLSNRM==400    ;STANDARD CLOSE ROUTINE USED FOR THIS DEVICE.
11362                 ;RH SHOULD POINT, NOT AT THEROUTINE, BUT AT THE USR-USE PAIR
11363 %CLSQ==200      ;DISK
11364 %CLS6==100      ;PDP6
11365 %CLSJO==40      ;JOB OUTPUT
11366 %CLSST==20      ;STY DEVICE
11367 %CLST==10       ;TRAP DEVICE
11368
11369 %CLSJ==%CLSJI\%CLSJO    ;EITHER DIRECTION OF JOB DEVICE
11370 %CL1QO==%CLSQO\%CLSQ    ;BOTH BITS FOR DISK OUTPUT
11371
11372 CLSTB:                                          CPOPJ
11373         OFFSET -CLSTB
11374 TYIDN::                 REPEAT 2,       %CLSTI,,TYICLS  ;TYI
11375 TYODN::                 REPEAT 2,               TYOCLS  ;TYO
11376 NLIDN::                 REPEAT 4,               CPOPJ   ;NULL
11377 UWIDN::                 REPEAT 4,       %CLSU ,,CPOPJ   ;USER
11378 FUWIDN::                REPEAT 2,       %CLSFU,,CPOPJ   ;FOREIGN USER
11379 DNDIRH::                                        DIRHCL  ;DIRHNG
11380 DNTRAP::                                %CLST,,CPOPJ    ;TRAP
11381 IFN CHAOSP,CHAIDN::     REPEAT 2,               CHACLS  ;CHAOS NET
11382 IFN NUNITS,[
11383 DNUACII::               REPEAT 3,[
11384                                         %CLSDI,,UTICL   ;UTAPE.
11385                                         %CLSDO,,UTOCL
11386 ]]
11387 IFN OLPTP,LPTDN::       REPEAT 2,               LPTCLS  ;LPT
11388 IFN NLPTP,[
11389 NLPTDN::                                        NLPDCL
11390                                                 NLPTCL
11391 ]
11392 IFN GLPTP,GLPTDN::      REPEAT 2,               GLPCLS
11393 DIRCHN::                REPEAT 4,               UTDCLS  ;DIRECTORY DEVICE
11394 IFN VIDP,NVIDOP::       REPEAT 2,               NVDCLS  ;NVIDI
11395 IFN PLTP,PLTDN::        REPEAT 2,       %CLSNR,,PLTUSR  ;PLOTTER
11396 IFN PTRP,[
11397 PTPI::                  REPEAT 5,       %CLSNR,,PTPUSR  ;PAPER  TAPE PUNCH
11398 ]
11399 IFN IMXP,IMPXDN::       REPEAT 4,               IMPXCL  ;IMX
11400 IFN OMXP,OMPXDN::       REPEAT 4,               OMPXCL  ;OMX
11401 DCLUAI::                                %CLSCL,,CLCLRA  ;CORE LINK
11402                                         %CLSCL,,CLCLWU
11403                         REPEAT 2,[
11404                                         %CLSCL,,CLCLRB
11405                                         %CLSCL,,CLCLWB
11406                         ]
11407 IFN PTRP,[
11408 REDUAI::                REPEAT 5,               PTRCLS  ;PAPER TAPE READER
11409 ]
11410 IFN 340P,[
11411 DN340B::                REPEAT 4,               ADCL1   ;340
11412 ;                                               ADCL1   ;IDS
11413 ]
11414 IFN CODP,[
11415 CODDN::                 REPEAT 2,               CODCLS  ;CODE DEV
11416 ]
11417 DQUAI::                                 %CLSQ ,,QICL    ;DISK
11418                                         %CL1QO,,QOCLR
11419                                         %CLSQ ,,QICL
11420                                         %CL1QO,,QOCL
11421                                         %CLSQ ,,QICL
11422                                         %CL1QO,,QOCL
11423 IFN VIDP,DNVDIU::       REPEAT 4,               TVCCLS  ;TVC
11424 IFN PDP6P,PDPUIO::      REPEAT 4,       %CLS6 ,,PDPCLS  ;USR IN PDP10 MODE
11425 IFN TABP,DTABUI::       REPEAT 2,       %CLSNR,,TABUSR  ;TABLET
11426 IFN NMTCS,[
11427 MTUAIX::                REPEAT 3,               MTICL   ;MAG TAPE
11428                         REPEAT 3,               MTOCL
11429         ]
11430 JDUAI::         REPEAT 3,[
11431                                         %CLSJI,,JOBCLS  ;JOB DEVICE
11432                                         %CLSJO,,JOBCLS
11433                         ]
11434 BDUAI::                 REPEAT 6,       %CLSBJ,,CPOPJ   ;BOJ
11435 IIOPOP::                                [JRST 4,CPOPJ]  ;INTERRUPT ON IOPOP DEVICE
11436 ISPY::                                          CPOPJ   ;SPY
11437 STYDUI::        REPEAT 2,[                              ;PSEUDO TTY
11438                                         %CLSST,,STYICL
11439                                         %CLSST,,STYOCL
11440                         ]
11441 IFN NCPP,NETDUI::       REPEAT 4,               NETCLS  ; Arpanet NCP
11442 IFN TCPP,TCPDUI::       REPEAT 4,               TCPCLS  ; Internet TCP
11443 IFN INETP,IPQDN::                               IPQCLS  ; Internet Queue
11444 IFN MSPP,MSPIO::                                MSCLOS  ;MESS SWITCHER (DM)
11445 IFN STKP,STKDP::                                STKCLS  ;STANFORD KEYBOARD
11446 IFN NTYP,NTYIT::        REPEAT 4,               NTYCLS  ;A KLUDGE ON THE NTY
11447         OFFSET 0
11448 IF2,IFN .-CLSTB-LIOTTB,.ERR BARF AT CLSTB
11449 \f
11450 ;DISPATCH TABLE FOR .IOT UUO
11451 ;TRANSFERED THROUGH USING RIGHT HALF OF I/O CHANNEL WORD AS AN INDEX
11452 %IOT==1,,525252
11453 %IOTBK==400000  ;4.9 = 1 => BLOCK  = 0 => UNIT
11454 %IOTOT==200000  ;4.8 = 1 => OUTPUT  = 0 => INPUT     "
11455 %IOTBP==100000  ;4.7 = 1 => THERE IS A SPECIAL ROUTINE FOR SIOT,
11456                  ;AND ITS ADDRESS IS -1 + RH(IOTTB WORD).
11457 %IOTSP==40000   ;4.6 => THIS DEVICE IS FUNNY. SIOT ISN'T ALLOWED,
11458                  ;AND IOT LETS THE DEVICE RTN DO ALL THE WORK.
11459                 ;PRESENT ONLY FOR UNIT INPUT MODES.
11460 %IOT10==20000   ;4.5 => THIS CHANNEL WAS OPENED WITH BIT 1.4 SET IN MODE
11461 %IOTIM==10000   ;4.4 => THIS CHANNEL WAS OPENED WITH BIT 1.3 (IMAGE MODE) SET IN MODE
11462 ;       4000    ;4.3 COPIES %IOTBK.   THUS, BITS 4.5-4.2 REFLECT THE BOTTOM 4 BITS
11463 ;       2000    ;4.2 COPIES %IOTOT.    OF THE OPEN-MODE.
11464 %IOTOM==36000   ;BITS 4.5 - 4.2
11465
11466 %IOTBO==606000  ;BLOCK OUTPUT.
11467 %IOTBI==404000  ;BLOCK INPUT.
11468 %IOTUO==202000  ;UNIT OUTPUT.
11469 %IOTUI==000000  ;UNIT INPUT.
11470
11471 IOTTB:          IOCER8
11472         OFFSET -IOTTB
11473 TYIDN::         %IOTUI,,TYI     ;TTY ENTRIES MUST BE COMPACT
11474 TYIBN::         %IOTBI,,TTYBI
11475 TYODN::         %IOTUO,,TYO (%IOTBP)
11476 TYOBN::         %IOTBO,,TTYBO   ;LAST TTY DEVICE
11477 NLIDN::         %IOTUI,,NULI
11478 NLBIDN::        %IOTBI,,NULBI
11479 NLODN::         %IOTUO,,CPOPJ
11480 NLBDN::         %IOTBO,,NULBOD
11481 UWIDN::         %IOTUI,,UWI (%IOTIM)
11482 UBIDN::         %IOTBI,,UBI
11483 UWODN::         %IOTUO,,UWO (%IOTIM)
11484 UBODN::         %IOTBO,,UBO
11485 FUWIDN::        %IOTUI,,UWI (%IOT10)
11486 FUBIDN::        %IOTBI,,UBI (%IOT10)
11487 DNDIRH::        IOCR10
11488 DNTRAP::        TRPDEV
11489 IFN CHAOSP,[
11490 CHAIDN::        %IOTUI+%IOTBP,,CHAUI
11491 CHAODN::        %IOTUO+%IOTBP,,CHAUO
11492 ];CHAOSP
11493 IFN NUNITS,[
11494 DNUACII::       %IOTUI,,UASCII
11495 DNUACCO::       %IOTUO,,UASCCO
11496 DNUBKI::        %IOTBI,,UBLKI
11497 DNUBKO::        %IOTBO,,UBLKO
11498 DNUDTI::        %IOTUI,,UDATAI (%IOTIM)
11499 DNUDTO::        %IOTUO,,UDATAO (%IOTIM)
11500 ]
11501 IFN OLPTP,[
11502 LPTDN::         %IOTUO,,PILPT1
11503 LPTBN::         %IOTBO,,BLPTO
11504 ]
11505 IFN NLPTP,[
11506 NLPTDN::        %IOTUO,,NLPT1
11507 NLPTBN::        %IOTBO,,BNLPTO
11508 ]
11509 IFN GLPTP,[
11510 GLPTDN::        %IOTUO,,GLPTDO (%IOTBP)
11511 GLPTBN::        %IOTBO,,GLPTBO
11512 ]
11513 DIRCHN::        %IOTUI,,DIRCH
11514 DIRBN::         %IOTBI,,DIRB
11515 NDATAI::        %IOTUI,,DDATAI (%IOTIM+%IOTBP)
11516 NBLKI::         %IOTBI,,DBLKI (%IOTIM)
11517 IFN VIDP,[
11518 NVIDOP::        %IOTUI,,NVIDIT (%IOTSP)
11519 BNVIDO::        %IOTBI,,BNVIDI
11520 ]
11521 IFN PLTP,[
11522 PLTDN::         %IOTUO,,PLOT
11523 PLTBN::         %IOTBO,,BPLOT
11524 ]
11525 IFN PTRP,[
11526 PTPI::          %IOTUO,,PIPUN (%IOT10)
11527 PTPA::          %IOTUO,,APIPUN
11528 PTPB::          %IOTBO,,BPIPUN
11529 PTPWA::         %IOTUO,,WAPIPN (%IOTIM)
11530 PTPWB::         %IOTBO,,WBPIPN (%IOTIM)
11531 ]
11532 IFN IMXP,[
11533 IMPXDN::        %IOTUI,,IMPXS (%IOTSP)
11534 IMXDN::         %IOTUI,,IMPXS1 (%IOTSP)
11535 BIMXDN::        %IOTBI,,BIMXS1 (%IOTSP)
11536 BIMPXD::        %IOTBI,,BIMPXS (%IOTSP)
11537 ]
11538 IFN OMXP,[
11539 OMPXDN::        %IOTUO,,OMPXS (%IOTSP)
11540 OMXDN::         %IOTUO,,OMXDS (%IOTSP)
11541 BOMXDN::        %IOTBO,,BOMXDS (%IOTSP)
11542 BOMPXD::        %IOTBO,,BOMPXS (%IOTSP)
11543 ]
11544 DCLUAI::        %IOTUI,,CLUAI
11545 DCLUAO::        %IOTUO,,CLUAO
11546 DCLBI::         %IOTBI,,CLBI
11547 DCLBO::         %IOTBO,,CLBO
11548 DCLUBI::        %IOTUI,,CLUBI (%IOTIM)
11549 DCLUBO::        %IOTUO,,CLUBO (%IOTIM)
11550 IFN PTRP,[
11551 REDUAI::        %IOTUI,,PTRUAI
11552 REDBAI::        %IOTBI,,PTRBAI
11553 REDUII::        %IOTUI,,PTRUII (%IOTIM)
11554 REDBII::        %IOTBI,,PTRBII (%IOTIM)
11555 REDUTI::        %IOTUI,,PTRUTI (%IOT10)
11556 ]
11557 IFN 340P,[
11558 DN340B::        %IOTBO,,340B    ;340 ENTRIES MUST BE COMPACT; BLOCK FIRST, THEN UNIT
11559 DN340W::        %IOTUO,,340W (%IOTSP)
11560 DN340C::        %IOTUO,,340C (%IOTSP)
11561 DN340H::        %IOTUO,,340H (%IOTSP)
11562 ;DN340I::       %IOTUO,,340I (%IOTSP)
11563 DN340L::        ;LAST 340 DEVICE ENTRY
11564 ]
11565 IFN CODP,[
11566 CODDN::         %IOTUO,,SEND
11567 CODBN::         %IOTBO,,BSEND
11568 ]
11569 DQUAI::         %IOTUI,,QUAI (%IOTBP)
11570 DQUAO::         %IOTUO,,QUAO (%IOTBP)
11571 DQBI::          %IOTBI,,QBI
11572 DQBO::          %IOTBO,,QBO
11573 DQUII::         %IOTUI,,QUII (%IOTIM %IOTBP)
11574 DQUIO::         %IOTUO,,QUIO (%IOTIM %IOTBP)
11575 IFN VIDP,[
11576 DNVDIU::        %IOTUI,,RNVDIU (%IOTSP)
11577 DNVDIB::        %IOTBI,,RNVDIB (%IOTSP)
11578 DNVDOU::        %IOTUO,,RNVDOU (%IOTSP)
11579 DNVDOB::        %IOTBO,,RNVDOB (%IOTSP)
11580 ]
11581 IFN PDP6P,[
11582 PDPUIO::        %IOTUO,,UWO     ;BUT JOB WILL BE -1 TO INDICATE PDP6
11583 PDPBIO::        %IOTBO,,UBO
11584 PDPUII::        %IOTUI,,UWI
11585 PDPBII::        %IOTBI,,UBI
11586 ]
11587 IFN TABP,[
11588 DTABUI::        %IOTUI,,UTABI
11589 DTABBI::        %IOTBI,,BTABI
11590 ]
11591 IFN NMTCS,[
11592 MTUAIX::        %IOTUI,,MTUAI (%IOTBP)  ;MAGTAPE
11593 MTUIIX::        %IOTUI,,MTUII (%IOTIM %IOTBP)
11594 MTBIX::         %IOTBI,,MTBI
11595 MTUAOX::        %IOTUO,,MTUAO (%IOTBP)
11596 MTUIOX::        %IOTUO,,MTUIO (%IOTIM %IOTBP)
11597 MTBOX::         %IOTBO,,MTBO
11598 ]
11599 JDUAI::         %IOTUI,,JBUI(%IOTBP)
11600 JDUAO::         %IOTUO,,JBUI(%IOTBP)
11601 JDBI::          %IOTBI,,JBBI
11602 JDBO::          %IOTBO,,JBBI
11603 JDUII::         %IOTUI,,JBUI (%IOTBP %IOTIM)
11604 JDUIO::         %IOTUO,,JBUI (%IOTBP %IOTIM)
11605 BDUAI::         %IOTUI,,BJUI
11606 BDUAO::         %IOTUO,,BJUO
11607 BDBI::          %IOTBI,,BJBI
11608 BDBO::          %IOTBO,,BJBO
11609 BDUII::         %IOTUI,,BJUI (%IOTIM)
11610 BDUIO::         %IOTUO,,BJUO (%IOTIM)
11611 IIOPOP::                [JRST 4,CPOPJ]  ;INTERRUPT ON IOPOP DEVICE
11612 ISPY::          %IOTUI,,SPYI
11613 STYDUI::        %IOTUI,,STTYI   ;PSEUDO TTY
11614 STYDUO::        %IOTUO,,STTYW
11615 STYDBI::        %IOTBI,,STTBI
11616 STYDBO::        %IOTBO,,STTBO
11617 IFN NCPP,[
11618 NETDUI::        %IOTUI,,NETI
11619 NETDUO::        %IOTUO,,NETW (%IOTBP)
11620 NETDBI::        %IOTBI,,NETBI
11621 NETDBO::        %IOTBO,,NETBO
11622 ]
11623 IFN TCPP,[
11624 TCPDUI::        %IOTUI,,TCPI (%IOTBP)
11625 TCPDUO::        %IOTUO,,TCPW (%IOTBP)
11626 TCPDBI::        %IOTBI,,TCPBI
11627 TCPDBO::        %IOTBO,,TCPBO
11628 ]
11629 IFN INETP,[
11630 IPQDN::         IPQIO           ; No I/O calls used on this dev!
11631 ]
11632 IFN MSPP,[
11633 MSPIO::         IOCR10
11634 ]
11635 IFN STKP,[
11636 STKDP::         STKI
11637 ]
11638 IFN NTYP,[
11639 NTYIT::         %IOTUI,,NTYTI   ;KLUDGE FOR FAST, LARGE BUFFER ON NTY
11640 NTYOT::         %IOTUO,,NTYTO
11641 NTYBIT::        %IOTBI,,NTYBI
11642 NTYBOT::        %IOTBO,,NTYBO
11643 ]
11644         OFFSET 0
11645 LIOTTB==.-IOTTB
11646 \f
11647 ;TABLES FOR VARIOUS CHANNEL STATUS CALLS
11648
11649 ;DCHSTB - INDEXED BY IOTTB INDEX (RH OF IOCHNM)
11650 ;LH SIXBIT MAIN DEVICE NAME
11651 ;1.1-2.3 INDEX INTO THE NEXT TWO TABLES
11652 ;2.4-2.9 SYSTEM PERIPHERAL DEVICE CODE (FOR .STATUS)
11653 .SEE DCHSTB     ;ASSEMBLED SECOND TO GET VALUES OF THE TEMPORARY %%dev SYMBOLS.
11654
11655 ;DSTSTB - INDEX FROM DCHSTB
11656 ;LH STATUS ROUTINE, RH WHYINT ROUTINE (OPNL34 IF DEVICE DOESN'T GIVE 2ND WD INTS)
11657
11658 DSTSTB:         CPOPJ,,OPNL44   ;0 CHANNEL NOT OPEN
11659                 STDSTA,,OPNL34  ;1 RANDOM DEVICE
11660                 CPOPJ,,OPNL34   ;2 OTHER KIND OF RANDOM DEVICE
11661                 STATYI,,TYIWHY  ;3 TTY INPUT
11662                 STATYO,,TYOWHY  ;4 TTY OUTPUT
11663                 CPOPJ,,OPNL34   ;5 USR DEVICE
11664                 CPOPJ,,OPNL34   ;6 DIR "DEVICE"
11665                 CLISTA,,OPNL34  ;7 CORE LINK INPUT
11666                 STDSTA,,OPNL34  ;10 CORE LINK OUTPUT
11667                 CPOPJ,,OPNL34   ;11 DISK
11668                 JBSTAT,,OPNL22  ;12 JOB DEVICES (WHYINT SHOULDN'T GET HERE)
11669                 CPOPJ,,OPNL34   ;13 BOJ DEVICE
11670                 STASTI,,STIWHY  ;14 STY INPUT
11671                 STASTO,,STOWHY  ;15 STY OUTPUT
11672                 CPOPJ,,TRPDEV   ;16 TRAP DEVICE
11673                 CPOPJ,,OPNL34   ;17 DIRHNG DEVICE
11674                 CPOPJ,,OPNL34   ;20 SPY DEVICE
11675 OFFSET -DSTSTB          ;BEGIN OPTIONAL DEVICES
11676 IFN NMTCS, %%MT::  STAMTC,,OPNL34
11677 IFN NUNITS,%%UTP:: CPOPJ,,OPNL34
11678 IFN OLPTP, %%OLP:: STALPT,,OPNL34
11679 IFN NCPP,  %%NET:: STANET,,NETWHY
11680 IFN TCPP,  %%TCP:: TCPSTA,,TCPWHY
11681 IFN INETP, %%IPQ:: IPQSTA,,IPQWHY
11682 IFN CHAOSP,%%CHA:: CPOPJ,,CHAWHY
11683 OFFSET 0
11684
11685 ;DRFNTB - INDEX FROM DCHSTB
11686 ;LH RFNAME ROUTINE, RH RFPNTR ROUTINE OR OPNL34 IF NOT RANDOM ACCESS
11687
11688 DRFNTB:         CPOPJ,,OPNL44   ;0 CHNL NOT OPEN
11689                 CPOPJ,,OPNL34   ;1 RANDOM DEVICE
11690                 CPOPJ,,OPNL34   ;2 OTHER KIND OF RANDOM DEVICE
11691                 RCHTTY,,OPNL34  ;3 TTY INPUT
11692                 RCHTTY,,OPNL34  ;4 TTY OUTPUT
11693                 RCHUSR,,RFPUSR  ;5 USR DEVICE
11694                 RCHDIR,,OPNL34  ;6 DIR "DEVICE"
11695                 RCHCLO,,OPNL34  ;7 CORE LINK INPUT
11696                 RCHCLO,,OPNL34  ;10 CORE LINK OUTPUT
11697                 RCHQSK,,RFPQSK  ;11 DISK
11698                 RFNJOB,,RFPJOB  ;12 JOB DEVICES
11699                 RCHBOJ,,OPNL34  ;13 BOJ DEVICE
11700                 RCHSTY,,OPNL34  ;14 STY INPUT
11701                 RCHSTY,,OPNL34  ;15 STY OUTPUT
11702                 CPOPJ,,CPOPJ    ;16 TRAP DEVICE
11703                 RCHDRH,,OPNL34  ;17 DIRHNG DEVICE
11704                 SPYRCH,,OPNL34  ;20 SPY DEVICE
11705 OFFSET -DRFNTB          ;BEGIN OPTIONAL DEVICES
11706 IFN NMTCS, %%MT::  RCHMGT,,OPNL34
11707 IFN NUNITS,%%UTP:: RCHUTP,,OPNL34
11708 IFN OLPTP, %%OLP:: CPOPJ,,OPNL34
11709 IFN NCPP,  %%NET:: NETRCH,,OPNL34
11710 IFN TCPP,  %%TCP:: TCPRCH,,TCPRFP
11711 IFN INETP, %%IPQ:: IPQRCH,,IPQRFP
11712 IFN CHAOSP,%%CHA:: CHARCH,,OPNL34
11713 OFFSET 0
11714 IFN <.-DRFNTB>-<DRFNTB-DSTSTB>, .ERR DRFNTB & DSTSTB NOT SAME LENGTH
11715 \f
11716 DEFINE XX NTIMES,DEVNAM,DN,SNXXX,IDX
11717 IFNB DN, DN==:.-DCHSTB  ;CHECK THAT DCHSTB IS IN SAME ORDER AS IOTTB
11718 IFG SIXBIT/DEVNAM/, ZZ==[SIXBIT/DEVNAM/]  ;DECIDE WHETHER FITS IN LH
11719 .ELSE [
11720 IFE SIXBIT/DEVNAM/&777777, ZZ==(SIXBIT/DEVNAM/)
11721 .ELSE ZZ==[SIXBIT/DEVNAM/]
11722 ]
11723 REPEAT NTIMES, ZZ,,SNXXX_14+IDX
11724 TERMIN
11725
11726 DCHSTB: XX 1,,,,0                       ;CHNL NOT OPEN
11727         XX 2,TTY,TYIDN,,3               ;TTY INPUT
11728         XX 2,TTY,TYODN,,4               ;TTY OUTPUT
11729         XX 4,NUL,NLIDN,SNNUL,1          ;NUL DEVICE
11730         XX 4,USR,UWIDN,SNUSR,5          ;USR DEVICE
11731         XX 2,USR,FUWIDN,SNFUSR,5        ;FOREIGN USR
11732         XX 1,DIRHNG,DNDIRH,SNDIRH,17    ;DIRHNG
11733         XX 1,TRAP,DNTRAP,SNTRAP,16      ;TRAP
11734 IFN CHAOSP, XX 2,CHAOS,CHAIDN,SNCHA,%%CHA       ;CHAOS NET
11735 IFN NUNITS, XX 6,UT,DNUACII,SNUTC,%%UTP ;MICRO TAPE
11736 IFG LPTP-1, XX 2,OLP,LPTDN,SNLPD,%%OLP  ;DATA PRODUCTS LPT IN 2-LPT SYSTEM
11737 .ELSE IFN OLPTP, XX 2,LPT,LPTDN,SNLPD,%%OLP     ;DATA PRODUCTS LPT
11738 IFN NLPTP,  XX 2,LPT,NLPTDN,SNLPV,1     ;"VOGUE" LPT (ACTUALLY ODEC)
11739 IFN GLPTP,  XX 2,LPT,GLPTDN,SNLPV,1     ;GOULD LPT
11740         XX 4,DIR,DIRCHN,SNDIR,6         ;DIR "DEVICE"
11741 IFN VIDP,   XX 2,NVD,NVIDOP,SNBAT,2     ;VIDISSECTOR
11742 IFN PLTP,   XX 2,PLT,PLTDN,SNPLT,1      ;PLOTTER
11743 IFN PTRP,   XX 5,PTP,PTPI,SNPTP,1       ;PAPER TAPE PUNCH
11744 IFN IMXP,   XX 4,IMX,IMPXDN,SNIMPX,1    ;INPUT A/D MULTIPLEXOR
11745 IFN OMXP,   XX 4,OMX,OMPXDN,SNOMPX,1    ;OUTPUT A/D MULTIPLEXOR
11746         XX 3,CLO,DCLUAI,SNCLK,7         ;CORE LINK INPUT
11747         XX 3,CLO,DCLBO,SNCLK,10         ;CORE LINK OUTPUT
11748 IFN PTRP,   XX 5,PTR,REDUAI,SNPTR,1     ;PAPER TAPE READER
11749 IFN 340P,   XX 4,DIS,DN340B,SN340,2     ;340 DISPLAY
11750 ;IFN 340P,  XX 1,IDS,DN340I,SN340I,2    ;340 INTERPRETIVE DISPLAY
11751 IFN CODP,   XX 2,COD,CODDN,SNCOD,1      ;CODE
11752         XX 6,DSK,DQUAI,SN2311,11        ;DISK
11753 IFN VIDP,   XX 4,TVC,DNVDIU,SNBAT,2     ;TV CAMERA
11754 IFN PDP6P,  XX 4,PDP,PDPUIO,SNPDP,5     ;PDP-6 DEVICE
11755 IFN TABP,   XX 2,TAB,DTABUI,SNTAB,2     ;TABLET
11756 IFN NMTCS,  XX 6,MT0,MTUAIX,SNMTC,%%MT  ;MAGTAPE
11757         XX 6,JOB,JDUAI,SNJOB,12         ;JOB DEVICES
11758         XX 6,BOJ,BDUAI,SNBOJ,13         ;BOJ DEVICE
11759         XX 1,IIP,IIOPOP,0,2             ;INTERRUPT-ON-IOPOP DEVICE
11760         XX 1,SPY,ISPY,SNSPY,20          ;SPY
11761 REPEAT 2,[
11762         XX 1,STY,,SNSTY,14              ;STY INPUT
11763         XX 1,STY,,SNSTY,15              ;STY OUTPUT
11764 ]
11765 IFN NCPP,  XX 4,NET,NETDUI,SNNET,%%NET  ; Arpanet NCP
11766 IFN TCPP,  XX 4,TCP,TCPDUI,SNTCP,%%TCP  ; Internet TCP
11767 IFN INETP, XX 1,IPQ,IPQDN,SNIPQ,%%IPQ   ; Internet Queue
11768 IFN MSPP,  XX 1,MSP,MSPIO,SNMSP,2       ;MS SWITCH HACK
11769 IFN STKP,  XX 1,STK,STKDP,SNSTK,2       ;STANFORD KEYBOARD
11770 IFN NTYP,  XX 4,NTY,NTYIT,SNNUL,2       ;NTY 11 KLUDGE
11771
11772 IFN .-DCHSTB-LIOTTB,.ERR BARF AT DCHSTB
11773 EXPUNGE XX,%%MT,%%UTP,%%OLP,%%NET,%%TCP,%%CHA,%%IPQ
11774
11775 DCHSTE==.-1     ;END FOR GETSYS (CHDEVS)
11776 \f
11777 ;RSTB - INDEXED BY IOTTB INDEX FROM RH(IOCHNM)
11778 ;THIS TABLE IS IN 5-BIT BYTES; THE VALUES ARE THE INDICES
11779 ;INTO THE RSTB1 AND DFRCTB TABLES.
11780 .SEE RSTB       ;ASSEMBLED SECOND TO GET VALUES OF TEMPORARY %%dev SYMBOLS.
11781
11782 ;RSTB1 - INDEX FROM RSTB (BELOW)
11783 ;LH IOPUSH/POP ROUTINE, RH RESET ROUTINE
11784 RSTB1:  CPOPJ,,CPOPJ    ;0 RANDOM DEVICE
11785         TYIIOP,,TYIRS   ;1 TTY INPUT
11786         TYOIOP,,TYORS   ;2 TTY OUTPUT
11787         CPOPJ,,USRST    ;3 USR DEVICE
11788         CPOPJ,,JBIRS    ;4 JOB INPUT
11789         CPOPJ,,JBORS    ;5 JOB OUTPUT
11790         IIOPPR,,[JRST 4,CPOPJ]  ;6 INTERRUPT ON IOPOP DEVICE
11791         STYIIP,,STYIRS  ;7 STY INPUT
11792         STYOIP,,STYORS  ;10 STY OUTPUT
11793         CPOPJ,,CPOPJ    ;11 DISK OUTPUT
11794         DIRHIP,,CPOPJ   ;12 DIRHNG
11795         CPOPJ,,TRPDEV   ;13 TRAP
11796         OFFSET -RSTB1   ;OPTIONAL DEVICES BEGIN HERE
11797 IFN OLPTP, %%LPT:: CPOPJ,,LPTRS
11798 IFN NLPTP, %%NLP:: CPOPJ,,NLPTRS
11799 IFN PLTP,  %%PLT:: CPOPJ,,PLTRS
11800 IFN PTRP,  %%PTR:: CPOPJ,,PTRRS
11801 IFN PTRP,  %%PTP:: CPOPJ,,PUNCLR
11802 IFN IMXP,  %%IMX:: CPOPJ,,IMPXRS
11803 IFN 340P,  %%340:: CPOPJ,,DSIZAP
11804 IFN CODP,  %%COD:: CODIOP,,CODRS
11805 IFN PDP6P, %%PDP:: PDPIOP,,PDPRST
11806 IFN TABP,  %%TAB:: CPOPJ,,TABCLR
11807 IFN NCPP,  %%NET:: NETIOP,,NETRS
11808 IFN TCPP,  %%TCP:: TCPIOP,,TCPRST
11809 IFN INETP, %%IPQ:: IPQIOP,,IPQRST
11810 IFN STKP,  %%STK:: CPOPJ,,STKRS
11811 IFN CHAOSP,%%CHA:: CHAIOP,,CPOPJ
11812         OFFSET 0
11813
11814 ;DFRCTB - INDEX FROM RSTB (BELOW)
11815 ;LH FORCE ROUTINE, RH FINISH ROUTINE
11816 DFRCTB: OPNL34,,OPNL34  ;0 RANDOM DEVICE
11817         OPNL2,,OPNL2    ;1 TTY INPUT (ILLEGAL)
11818         POPJ1,,TTYFIN   ;2 TTY OUTPUT
11819         OPNL34,,OPNL34  ;3 USR
11820         OPNL2,,OPNL2    ;4 JOB (SHOULDN'T GET HERE?)
11821         OPNL22,,OPNL22  ;5 JOB (SHOULDN'T GET HERE?)
11822         OPNL22,,OPNL22  ;6 IIP (SHOULDN'T GET HERE)
11823         OPNL2,,OPNL2    ;7 STY INPUT (ILLEGAL)
11824         POPJ1,,STYFIN   ;10 STY OUTPUT
11825         QSKFRC,,QSKFIN  ;11 DISK OUTPUT
11826         OPNL34,,OPNL34  ;12 DIRHNG
11827         TRPDEV,,TRPDEV  ;13 TRAP
11828         OFFSET -DFRCTB  ;OPTIONAL DEVICES BEGIN HERE
11829 IFN OLPTP, %%LPT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11830 IFN NLPTP, %%NLP:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11831 IFN PLTP,  %%PLT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11832 IFN PTRP,  %%PTR:: OPNL34,,OPNL34
11833 IFN PTRP,  %%PTP:: POPJ1,,PUNFIN
11834 IFN IMXP,  %%IMX:: OPNL34,,OPNL34
11835 IFN 340P,  %%340:: OPNL34,,OPNL34
11836 IFN CODP,  %%COD:: POPJ1,,CODFIN
11837 IFN PDP6P, %%PDP:: OPNL34,,OPNL34
11838 IFN TABP,  %%TAB:: OPNL34,,OPNL34
11839 IFN NCPP,  %%NET:: NETFRC,,NETFIN
11840 IFN TCPP,  %%TCP:: TCPFRC,,TCPFIN
11841 IFN INETP, %%IPQ:: IPQFRC,,IPQFIN
11842 IFN STKP,  %%STK:: OPNL34,,OPNL34
11843 IFN CHAOSP,%%CHA:: CHAFRC,,CHAFIN
11844         OFFSET 0
11845 \f
11846 ;TABLE OF INDICES INTO THE RSTB1, DFRCTB TABLES ON THE PRECEDING PAGE
11847 ;THESE INDICES ARE UNRELATED TO THE INDICES IN DCHSTB A COUPLE PAGES BACK.
11848 ;NOTE THAT THE %% SYMBOLS ARE PURELY TEMPORARY AND EXPUNGED AT THE BOTTOM OF THIS PAGE.
11849
11850 RSTB:   .BYTE 5
11851
11852                         0       ;CHNL NOT OPEN
11853                 REPEAT 2,1      ;TTY INPUT
11854                 REPEAT 2,2      ;TTY OUTPUT
11855                 REPEAT 4,0      ;NUL DEVICE
11856                 REPEAT 4,3      ;USR DEVICE
11857                 REPEAT 2,0      ;FOREIGN USR
11858                         12      ;DIRHNG
11859                         13      ;TRAP
11860 IFN CHAOSP,     REPEAT 2,%%CHA
11861 IFN NUNITS,     REPEAT 6,0      ;DEC TAPE
11862 IFN OLPTP,      REPEAT 2,%%LPT
11863 IFN NLPTP,      REPEAT 2,%%NLP
11864 IFN GLPTP,      REPEAT 2,0
11865                 REPEAT 4,0      ;DIR "DEVICE"
11866 IFN VIDP,       REPEAT 2,0
11867 IFN PLTP,       REPEAT 2,%%PLT
11868 IFN PTRP,       REPEAT 5,%%PTP
11869 IFN IMXP,       REPEAT 4,%%IMX
11870 IFN OMXP,       REPEAT 4,0
11871                 REPEAT 6,0      ;CORE LINK.
11872 IFN PTRP,       REPEAT 5,%%PTR
11873 IFN 340P,       REPEAT 4,%%340
11874 ;IFN 340P,              0
11875 IFN CODP,       REPEAT 2,%%COD  ;CODE
11876                 REPEAT 3, 0 ? 11 ;DISK IN, DISK OUT
11877 IFN VIDP,       REPEAT 4,0
11878 IFN PDP6P,      REPEAT 4,%%PDP  ;PDP-6 DEVICE
11879 IFN TABP,       REPEAT 2,%%TAB
11880 IFN NMTCS,      REPEAT 6,0      ;MAGTAPE
11881                 REPEAT 3,[4
11882                           5
11883                 ]               ;JOB
11884                 REPEAT 3,[0     ;BOJ INPUT
11885                           0     ;BOJ OUTPUT
11886                 ]               ;BOJ
11887                         6       ;INTERRUPT ON IOPOP DEVICE
11888                         0       ;SPY
11889                 7 ? 10 ? 7 ? 10 ;PSEUDO-TTY
11890 IFN NCPP,       REPEAT 4,%%NET  ;NET RESET INR/INS
11891 IFN TCPP,       REPEAT 4,%%TCP  ; TCP RESET
11892 IFN INETP,      %%IPQ           ; Internet Queue
11893 IFN MSPP,               0       ;MS SWITCH HACK
11894 IFN STKP,               %%STK   ;STANFORD KEYBOARD
11895 IFN NTYP,       REPEAT 4,0      ;NTY 11 KLUDGE
11896
11897 IFN LIOTTB-.BYTC,.ERR BARF AT RSTB
11898         .BYTE
11899 EXPUNGE %%LPT,%%NLP,%%PLT,%%PTR,%%PTP,%%IMX,%%340,%%COD,%%PDP,%%TAB,%%NET,%%TCP,%%STK,%%CHA,%%IPQ
11900 \f
11901 DEFINE DVHR X,Y
11902 X!Y!TERMIN
11903
11904 DEFINE DV NAME,OPNRTE,BITS,TAG
11905         SIXBIT/NAME/
11906 DVHR [DEFINE DVHR X,Y
11907 X!][TAG BITS,,OPNRTE
11908 Y!TERMIN]
11909 TERMIN
11910
11911 ;DEVICE TABLES FOR AOPEN
11912 ;
11913 ;DEVTAB  SIXBIT NAME
11914 ;DEVADR
11915  %DVIN==400000  ;4.9 DEVICE CAN DO INPUT
11916  %DVOUT==200000 ;4.8 DEVICE CAN DO OUTPUT
11917  %DVDIR==100000 ;4.7 DEVICE CAN GIVE DIRECTORY
11918  %DVDEL==40000  ;4.6 ALLOW DELETE/RENAME
11919  %DVLNK==20000  ;4.5 ALLOW MLINK
11920                 ;RIGHT HALF, OPEN ROUTINE ADDRESS
11921 %DV==1,,520000  ;BIT TYPEOUT MASK
11922
11923 DEVTAB:
11924 IFN NLPTP,      DV LPT,NLPTO,%DVOUT
11925 IFG OLPTP-NLPTP,DV LPT,LPTO,%DVOUT
11926 IFG LPTP-1,     DV OLP,LPTO,%DVOUT
11927 IFN GLPTP,      DV LPT,GLPTO,%DVOUT
11928 IFN TTLPTP,     DV LPT,LPTO,%DVOUT
11929
11930                 DV DSK,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAQSK:
11931                 DV COM,COMO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11932         MNAME [ DV ],QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK     ;"AI:" ON
11933                                                                 ; AI, ETC.
11934 IFE MCOND MC,[  ; When MC and MX swap names, these names will stay
11935 IFN KL10P,      DV KL,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11936 IFN KS10P,      DV KS,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11937 ] ;MC
11938 IFE MCOND MX,[
11939 IFN KL10P,      DV KL,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11940 IFN KS10P,      DV KS,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11941 ] ;MX
11942                 DV SYS,SYSO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11943                 DV DNRF,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11944                 DV DNR,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11945                 DV DIRHNG,DIRHO,%DVIN+%DVDIR
11946                 DV TRAP,TRPDEV,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11947                 DV TTY,TTYO1,%DVIN+%DVOUT+%DVDIR
11948                 DV NUL,NULO,%DVIN+%DVOUT
11949                 DV USR,USRO,%DVIN+%DVOUT
11950 IFN VIDP,       DV NVD,NVIDI,%DVIN+%DVOUT
11951 IFN CHAOSP,     DV CHAOS,CHASO,%DVIN+%DVOUT
11952 IFN NCPP,       DV NET,NETO,%DVIN+%DVOUT
11953 IFN TCPP,       DV TCP,TCPO,%DVIN+%DVOUT
11954 IFN INETP,      DV IPQ,IPQO,%DVIN+%DVOUT
11955 IFN MSPP,       DV IPC,IPCO,%DVIN+%DVOUT
11956                 DV STY,STTYO,%DVIN+%DVOUT
11957                 DV JOB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAJOB:
11958                 DV BOJ,BOJO,%DVIN+%DVOUT
11959                 DV OJB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11960 IFN STKP,       DV STK,STKO,%DVIN
11961 IFN PLTP,       DV PLT,PLOTO,%DVOUT
11962 IFN PLTP,       DV IPL,IPLO,%DVOUT              ;INTERPRETED PLOTTER
11963 IFN XGP,        DV XPL,XPLO,%DVOUT
11964 IFN IMXP,       DV IMX,IMPXO,%DVIN
11965 IFN OMXP,       DV OMX,OMPXO,%DVOUT
11966 IFN PTRP,       DV PTR,PTRO,%DVIN
11967 IFN PTPP,       DV PTP,PTPO,%DVOUT
11968 IFN 340P,       DV DIS,DISO,%DVOUT              ;340 AS OUTPUT DEVICE
11969 ;IFN 340P,      DV IDS,IDISO,%DVOUT             ;340 AS INTERPRETED DISPLAY
11970                 DV CLU,CLUO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11971                 DV CLO,CLOO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11972                 DV CLI,CLIO,%DVOUT+%DVDIR+%DVDEL
11973                 DV CLA,CLAO,%DVIN+%DVDIR+%DVDEL
11974 IFN CODP,       DV COD,CODO,%DVOUT
11975 IFN VIDP,       DV TVC,TVCO,%DVIN+%DVOUT
11976                 DV ERR,ERRO,%DVIN
11977 IFN TPLP+TTLPTP&DEMON, DV TPL,TPLO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11978 IFN TABP,       DV TAB,TABO,%DVIN
11979                 DV SPY,SPYO,%DVIN
11980                 DV COR,CORO,%DVDIR              ;DIR=LAST LINE OF TTY^F
11981 IFN NTYP,       DV NTY,NTYOPN,%DVIN+%DVOUT      ;NTY 11 KLUDGE
11982
11983 NDEVS==.-DEVTAB
11984
11985 DVT1:           DV TTY,TTYO,%DVIN+%DVOUT+%DVDIR
11986                 DV TY,TTYO,%DVIN+%DVOUT+%DVDIR
11987                 DV T,TTYO,%DVIN+%DVOUT+%DVDIR
11988 IFN NUNITS,     DV UT,UTO,%DVIN+%DVOUT+%DVDIR+%DVDEL,DVAUT:
11989                 DV STY,STTYOA,%DVIN+%DVOUT
11990                 DV ST,STTYOA,%DVIN+%DVOUT
11991                 DV S,STTYOA,%DVIN+%DVOUT
11992                 DV DSK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK  ;PARTICULAR UNIT
11993                 DV DK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK   ;PARTICULAR UNIT
11994                 DV PK,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK   ;PARTICULAR PACK
11995                 DV P,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK    ;PARTICULAR PACK
11996 IFN NMTCS,      DV MT,MAGTO,%DVIN+%DVOUT        ;MAGTAPE
11997
11998 NDV1==.-DVT1
11999 EDEVS==.-1      ;END FOR GETSYS (DEVS)
12000
12001 DEVADR: DVHR
12002 IFN .-DEVADR-NDEVS-NDV1,.ERR DVHR LOST
12003 \f
12004 SUBTTL .OPER, .CALL DISPATCH
12005
12006 AOPER:  MOVE J,R        ;AC FIELD OF UUO
12007         ADDI R,IOCHNM(U)        ;SET UP IO CHANNEL REFERENCE POINTER
12008         CAIL C,MXOPR    ;SKIP IF UUO E FIELD IS LESS THAN MAX OPR
12009         JRST ILUUO      ;ILLEGAL OPER
12010         JRST @OPRDSP(C) ;LEGAL OPER-- DISPATCH ON E FIELD OF UUO
12011
12012 OPRDSP: ILUUO
12013         OPRIRP A!X      ;AITYI,ALISTEN,ASLEEP,ETC.
12014
12015 ;
12016 ;CALL DISPATCH
12017 ;
12018 ACALL:  MOVE B,C        ;SET UP COPY OF ERR ADR NOT TO BE RELOCATED
12019         JRST @CALDIS(R) ;DISPATCH INDEX OF UUO'S AC FIELD
12020
12021 CALDIS: ASYSC
12022         ADISMIS
12023         ALOSE
12024         ATRANAD
12025         AVALRET ;4
12026         AUTRAN
12027         UACORE
12028         ATRNDL
12029         ADSTART ;10
12030         AFDELE
12031         ADSTL
12032         ASUSET
12033         ALTPEN  ;14
12034         AVSCAN
12035         APOTSET
12036 REPEAT 20-.+CALDIS,ILUUO
12037 \f
12038 SUBTTL MISCELLANEOUS UUO'S
12039
12040 ;SHUT DOWN SYSTEM
12041
12042 ASHUTD: UMOVE C,(J)             ;Arg is time to down in thirtieths.
12043         JUMPL C,AREVIV          ;Negative time means REVIVE.
12044         CAMG C,[43200.*30.*60.] ;If time is longer than thirty days
12045          CAIGE C,5*60.*30.      ; or less than five minutes
12046           POPJ P,               ;   Fail (prevent clock delta-T from losing).
12047         ADD C,TIME              ;Interval+now is when we will die.
12048         PUSHJ P,SWTL            ;Seize shutdown lock.
12049             SHUTLK
12050         SKIPGE SHUTDN           ;Already down?
12051          JRST LSWPOP            ; Yes.
12052         PUSHJ P,CLQDEL          ;Flush obsolete clock queue entry, if any.
12053             DEDBLK
12054         MOVEM C,SHUTDN          ;Remember time we will die.
12055         SUB C,TIME              ;Interval until death.
12056         LSH C,1                 ;Time till death after next clock-queue int.
12057         MOVEM C,DEDTIM          ;Remember time until death.
12058         PUSHJ P,DEATHX          ;Make DEATH entry on clock queue.
12059          BUG                    ; DEDTIM says time to die already?
12060         JRST LSWPJ1             ;Unlock shutdowns.
12061
12062 ;READ TIME TILL SYSTEM DOWN
12063
12064 ADIETI: XCTR XW,[SETOM (J)]     ;READ -1 IF NOT GOING DOWN
12065         SKIPG A,SHUTDN
12066          POPJ P,                ;NOT DYING
12067         SUB A,TIME
12068         JRST APTUAJ             ;GIVE TO USER
12069
12070 ;REVIVE SYS
12071
12072 AREVIV: PUSHJ P,SWTL
12073             SHUTLK
12074         SKIPN SHUTDN
12075          JRST LSWPOP            ;NOT DYING
12076         PUSHJ P,CLQDEL
12077             DEDBLK
12078         SETZM SHUTDN
12079         SETZM DEDTIM
12080         PUSHJ P,DEATHM
12081         JRST LSWPOP
12082
12083 ;FROM CLOCK QUEUE BLOCK
12084
12085 DEATHZ: PUSHJ P,DEATHX
12086          SKIPA
12087           JRST CLQRET
12088         MOVSI T,SCLOUT
12089         PUSHJ P,SUPSET  ;DIE
12090         SETOM DEDTIM
12091         JRST CLQRET
12092
12093 ;GET VARIOUS SYS STATUS
12094
12095 ASSTAT: CONO PI,CLKOFF
12096         SKIPLE A,SHUTDN
12097          SUB A,TIME
12098         SKIPG SHUTDN
12099          SUBI A,1       ;TIME TILL DOWN IF > 0,  -1 IF UP,  -2 IF DOWN
12100         CONO PI,CLKON
12101         MOVE B,SYSDBG
12102         MOVE C,SUSRS
12103         MOVE D,PARERR
12104         ADD D,NXMERR
12105         MOVE E,TIME
12106         MOVE TT,[ITSMCH]        ;SIXBIT NAME OF THIS MACHINE.
12107         MOVE I,[ITSVRS]
12108         MOVN Q,USRHI            ;Q GETS NUMBER OF FREE JOB SLOTS
12109         IDIVI Q,LUBLK
12110         ADDI Q,MAXJ
12111         MOVE J,USRHI
12112 ASSTT1: SUBI J,LUBLK
12113         SKIPN UNAME(J)
12114          ADDI Q,1
12115         JUMPG J,ASSTT1
12116         JRST POPJ1
12117 \f
12118 SUBTTL SYMBOLIC SYSTEM CALL HANDLER
12119
12120 ;IN ORDER @A...Z[\]^_ !".../0...9:;,=.? (THAT IS IN NUMERICAL ORDER)
12121
12122 SYSCTB: SIXBIT /ACCESS/ ;IOCHNL, ADR
12123         SIXBIT /ATTACH/
12124         SIXBIT /ATTY/
12125         SIXBIT /CALL/   ;SIXBIT /<NEXT CALL>/
12126 IFN CHAOSP,[
12127         SIXBIT /CHAOSO/
12128         SIXBIT /CHAOSQ/
12129 ];CHAOSP
12130         SIXBIT /CLOSE/  ;IOCHNL
12131         SIXBIT /CNSGET/ ;GET SEMIPERMANENT TTY INFO
12132         SIXBIT /CNSSET/ ;SET SEMIPERMANENT INFO (TCMXH, TCTYP, TTYOPT, TTYCOM, ETC)
12133         SIXBIT /CORBLK/ ;HACK PAGE MAP
12134         SIXBIT /CORTYP/ ;READ STATUS OF PAGE.
12135         SIXBIT /DELETE/ ;FILE DELETE
12136         SIXBIT /DELEWO/ ;DELETE FILE OPEN ON SPEC'D CHANNEL
12137 IFN DEMON,SIXBIT /DEMSIG/       ;SIGNAL DAEMON
12138         SIXBIT /DETACH/ ;DISOWN ENTIRE TREE
12139         SIXBIT /DIRSIZ/
12140         SIXBIT /DISMIS/
12141         SIXBIT /DISOWN/ ;DISOWN AN INFERIOR JOB
12142 IFN DL10P, SIXBIT /DL10MP/
12143         SIXBIT /DSKUPD/ ;SIMULATE REFERENCE OF FILE
12144         SIXBIT /ECHOIN/ ;ECHO-NEGOTIATE
12145         SIXBIT /FILBLK/ ; READ NAME AREA OF FILE
12146         SIXBIT /FILLEN/ ;READ FILE LENGTH
12147         SIXBIT /FINISH/
12148         SIXBIT /FLAP/   ;TAPE #
12149         SIXBIT /FLUSH/  ;OLD NAME FOR FINISH, EVENTUALLY "
12150         SIXBIT /FORCE/
12151         SIXBIT /IOPOP/
12152         SIXBIT /IOPUSH/
12153         SIXBIT /IOT/    ;IOCHNL, QUAN OR BLK POINTER
12154 IFN INETP,SIXBIT /IPKIOT/
12155         SIXBIT /ITYIC/
12156         SIXBIT /JOBCAL/ ;GENERAL JOBGET
12157         SIXBIT /JOBGET/ ;JOB CHNL
12158         SIXBIT /JOBINT/ ;JOB CHNL
12159         SIXBIT /JOBIOC/
12160         SIXBIT /JOBRET/ ;JOB CHNL
12161         SIXBIT /JOBREU/
12162         SIXBIT /JOBSTS/ ;SET JOB CHNL STATUS
12163 IFN KL10P,SIXBIT /KLPERF/ ;ACTIVATE & CONTROL PERFORMANCE METER
12164         SIXBIT /LISTEN/ ;IOCHNL, ADR
12165         SIXBIT /LNKEDP/ ;DISK CH.  RETURNS NONZERO IF LINKS WERE TRACED TO OPEN IT.
12166         SIXBIT /LOAD/   ;USER CH, I/O CH, VARBLK
12167         SIXBIT /LOGIN/  ;SIXBIT /<NAME>/
12168         SIXBIT /LOGOUT/ ;. . .
12169         SIXBIT /LOSE/
12170         SIXBIT /MLINK/  ;MAKE LINK
12171 IFN NCPP,       SIXBIT /NETAC/
12172         SIXBIT /NETBLK/ ;HANG ON NCP STATE
12173 IFN IMPP,[
12174         SIXBIT /NETHST/ ;GETS STATUS OF HOST
12175         SIXBIT /NETIMP/ ;GETS STATUS OF IMP
12176 ];IMPP
12177 IFN NCPP,       SIXBIT /NETINT/
12178 IFN INETP,[     ; A temporary cond, should become permanent.
12179         SIXBIT /NETRFC/ ; Get pending request for connection
12180 ]
12181         SIXBIT /OPEN/   ;FILE OPEN
12182         SIXBIT /PDUMP/  ;USER CH, I/O CH, VARBLK
12183         SIXBIT /PGDUMP/ ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12184         SIXBIT /PGWRIT/ ;DUMP PAGE OUT OF CORE
12185 IFN CHAOSP,     SIXBIT /PKTIOT/
12186 IFN QAUTHP,     SIXBIT /RAUTH/  ;READ AUTHOR OF FILE
12187         SIXBIT /RCHST/  ;READ OPENED FILENAMES & ACCESS POINTER
12188         SIXBIT /RCPOS/  ;READ CURSOR POS
12189 IFN DEMON,SIXBIT /RDDMST/       ;READ DEAMON STATUS
12190         SIXBIT /RDMPBT/ ;READ FILE DUMPED BIT IOCHN, ADR
12191         SIXBIT /RELOAD/
12192         SIXBIT /RENAME/ ;FILE RENAME
12193         SIXBIT /RENMWO/ ;RENAME WHILE OPEN
12194         SIXBIT /REOWN/
12195         SIXBIT /RESET/
12196         SIXBIT /RESRDT/ ;RESTORE REFERENCE DATE
12197         SIXBIT /RFDATE/ ;READ TIME OF CREATION OF FILE IOCHN, ADR
12198         SIXBIT /RFNAME/ ;READ FILE NAME AND MODE CHANNEL OPEN TO
12199         SIXBIT /RFPNTR/ ;READ ACCESS POINTER
12200         SIXBIT /RQDATE/ ;READ DSK DATE
12201         SIXBIT /RSSIZE/ ;READ SCREEN SIZE
12202 IFN QAUTHP,     SIXBIT /SAUTH/  ;SET AUTHOR OF FILE
12203         SIXBIT /SCML/   ;SET # COMMAND LINES
12204         SIXBIT /SCPOS/  ;SET TTY CURSOR POSITION
12205         SIXBIT /SDMPBT/ ;SET FILE DUMPED BIT IOCHN, ADR
12206         SIXBIT /SETIOC/ ;CAUSE IO CHANNEL ERROR IN JOB/BOJ CHANNEL
12207         SIXBIT /SFDATE/ ;SET TIME OF CREATION OF FILE IOCHN, ADR
12208         SIXBIT /SIOT/   ;IOT A STRING GIVEN B.P. AND LENGTH
12209         SIXBIT /SOPEN/  ;OPEN, TAKING MODE,,CHNL AND BP.
12210         SIXBIT /SRDATE/ ;SET REFERENCE DATE
12211         SIXBIT /SREAPB/ ;SET THE DO NOT REAP BIT
12212         SIXBIT /SSERVE/ ;Set .SERVER without timing errors
12213         SIXBIT /SSTATU/ ;READS VARIOUS SYSTEM STATUS
12214         SIXBIT /STATUS/
12215 IFN DEMON,SIXBIT /STDMST/       ;SET DEAMON STATUS
12216         SIXBIT /STLGET/ ;GET INFO ON SERVER TELNET CONTROLLING A STY
12217         SIXBIT /STYGET/ ;GET INFO ABOUT SPECIFIED STY
12218 IFN NETP,SIXBIT /STYNET/        ;CONNECT STY TO NETWORK SOCKETS, FOR TELNET SERVERS.
12219         SIXBIT /T11MP/  ;TEMP ? TEN11 HACKER
12220 IFN TCPP,SIXBIT /TCPOPN/        ; Open TCP Internet connection
12221         SIXBIT /TRANAD/ ;CREATE TRANSLATION ENTRY
12222         SIXBIT /TRANCL/ ;CLEAR TRANSL. LIST(S) FOR A JOB.
12223         SIXBIT /TRANDL/ ;DELETE A TRANSL. ENTRY.
12224         SIXBIT /TRANEX/ ;READ A JOB'S TRANSL. LIST.
12225         SIXBIT /TRANS/  ;TRANSLATE A FILENAME.
12226         SIXBIT /TRPOPN/ ;OPEN TRAP DEVICE FOR AN INFERIOR
12227         SIXBIT /TTYESC/ ;SIMULATE TYPING OF ^_
12228         SIXBIT /TTYFLS/ ;FLUSH ITYIC'ED INPUT
12229         SIXBIT /TTYGET/ ;SUPPLY TTY CH, RETURNS THREE WORDS OF TTY STATUS
12230         SIXBIT /TTYSET/ ;SUPPLY TTY CH AND THREE WORDS OF TTY STATUS
12231         SIXBIT /TTYVAR/ ;HACK TTY VARIABLES
12232         SIXBIT /TVWHER/
12233         SIXBIT /UNLOCK/ ;UNLOCK A SPEC'D JOBS LOCKS.
12234         SIXBIT /USRMEM/ ;READ OR WRITE A JOB'S MEMORY.
12235         SIXBIT /USRVAR/ ;HACK USER VARIABLES
12236         SIXBIT /VIDBUF/ ;ASSIGN/DEASSIGN VIDEO BUFFER.
12237         SIXBIT /VIDSW/  ;SET VIDEO SWITCH.
12238         SIXBIT /WHOLIN/ ;GET OR SET WHO-LINE MODE AND JOB.
12239         SIXBIT /WHYINT/ ;FIND OUT WHY AN I/O CHANNEL INTERRUPTED
12240         SIXBIT /XGPIM/  ;OUTPUT TO XGP IN IMAGE MODE
12241 LSYSCT==:.-SYSCTB
12242
12243 ZZ==.-SYSCTB-1
12244 RADIX 2
12245 ZZ2==CONC [.LENGTH /]\ZZ,/
12246 RADIX 8
12247 REPEAT 1_<ZZ2>-ZZ-1,377777,,-1
12248 ;4.X BIT IMPLIES SUPPLY ROUTINE WITH POINTER TO X'TH ARG, NOT ARG ITSELF
12249 ;3.9-3.7 = MINIMUM NUMBER OF ARGS
12250 ;3.1 => DECODE 1ST ARG AS IO CHNL, LEAVING IOCHNM WD ADDR IN RH(R),
12251 ; IOCHNM WD CONTENTS IN H, CLSTB ENTRY'S LH IN LH(R).
12252 ;3.2 => NEVER PASS TO SPECIAL CHECKER FOR JOB CHNL
12253 ;3.3 => DON'T BARF IF CHNL NOT OPEN, CALLED ROUTINE WILL HANDLE IT
12254
12255 ;# ARGS ACTUALLY SUPPLIED IN W WHEN DISPATCHING THRU SYSCTD, ARGS IN A...J
12256 SYSCTD: 200,,NACCES
12257         100,,NATTAC
12258         100,,NATTY
12259         100,,NCALL
12260 IFN CHAOSP,[
12261         200,,CHAOSO
12262         100,,CHAOSQ
12263 ];CHAOSP
12264         100,,NCLOSE(7)
12265         100,,NCNSGET
12266         100,,NCNSSET
12267         24300,,NCORBL
12268         100,,NCORTY
12269         100,,NDEL
12270         100,,DELEWO(1)
12271 IFN DEMON,100,,ADEMSIG
12272         NDETAC
12273         100,,NDIRSIZ(1)
12274         1100,,NDISMIS
12275         100,,NDISOWN
12276 IFN DL10P, 100,,DL10MP
12277         100,,ADSKUP(1)
12278         6500,,NECHOIN(1)
12279         100,,NFILBLK(1)
12280         100,,NFILLEN(1)
12281         100,,NFINIS(1)
12282 IFN NUNITS,     100,,NFLAP
12283 IFE NUNITS,     100,,OPNL1
12284         100,,NFINIS(1)  ;OLD NAME FOR FINISH, EVENTUALLY FLUSH
12285         100,,NFORCE(1)
12286         100,,NIOPOP(7)
12287         100,,NIOPUS(7)
12288         2100,,NIOT(7)   ;(7) FOR CHNL NOT OPEN TO BE IOC ERROR, (3) TO BE OPEN LOSS
12289 IFN INETP, 100,,IPKIOT(1)       ; Requires at least 1 arg
12290         100,,NITYIC
12291         100,,NJBCL(1)
12292         100,,NJBGT(1)
12293         100,,NJBINT(1)
12294         100,,NSTIOC(1)
12295         100,,NJBRT(1)
12296         20500,,NJBREU
12297         100,,NJBSTS(1)
12298 IFN KL10P,KLPERF
12299         100,,NLISTE
12300         100,,NLNKEDP(1)
12301         200,,NLOAD
12302         200,,NLOGIN
12303         ALOGOU
12304         100,,NLOSE
12305         200,,NMLINK
12306 IFN NCPP,       100,,ANETAC(1)
12307 IFE INETP,[
12308 IFE CHAOSP,     4200,,ANETBLK(1)
12309 IFN CHAOSP,     4200,,CHANBK(1)
12310 ]
12311 IFN INETP,      4200,,NETBLK(1) ; Block (.hang) on net I/O channel
12312 IFN IMPP,[
12313         100,,ANETHST
12314         ANETIMP
12315 ];IMPP
12316 IFN NCPP,       100,,NNETINT(1)
12317 IFN INETP,      100,,NETRFC
12318         200,,NOPEN
12319         4300,,PDUMP
12320         100,,NPGWRT     ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12321         100,,NPGWRT
12322 IFN CHAOSP,     200,,PKTIOT(1)
12323 IFN QAUTHP,     100,,ARAUTH(1)
12324         100,,NRCHST
12325         100,,ARCPOS
12326 IFN DEMON,100,,ARDDMST
12327         100,,NRDMPBT(1)
12328         000,,NRELOAD
12329         200,,NRNAM
12330         200,,NRNWO
12331         100,,NREOWN(3)
12332         100,,NRESET(7)
12333         100,,NRESRDT(1)
12334         100,,NRFDATE(1)
12335         100,,NRFNAM
12336         100,,NRFPNT(3)
12337         ARQDAT
12338         100,,ARSSIZ
12339 IFN QAUTHP,     200,,ASAUTH(1)
12340         200,,ASCML
12341         100,,NSCPOS
12342         200,,NSDMPBT(1)
12343         200,,NSTIOC(1)
12344         200,,NSFDATE(1)
12345         6300,,NSIOT(7)  ;(7) FOR IOC ERROR IF CHNL NOT OPEN, (3) FOR OPEN LOSS
12346         200,,NSOPEN
12347         200,,NSRDATE(1)
12348         100,,ASREAP(1)
12349         100,,NSSERV
12350         ASSTAT
12351         100,,NSTATUS(7)
12352 IFN DEMON,100,,ASTDMST
12353         100,,NSTLGT
12354         100,,NSTYGT
12355 IFN NETP,200,,NSTYNT(3)
12356         200,,NT11M
12357 IFN TCPP,500,,TCPOPN
12358         300,,NTRNAD
12359         100,,NTRNCL
12360         200,,NTRNDL
12361         200,,NTRNEX
12362         100,,NTRNS
12363         200,,TRPOPN
12364         100,,NTTYESC
12365         100,,NTTYFLS
12366         100,,ATTYGT
12367         300,,ATTYST
12368         2200,,NTTYVA
12369         100,,NTVWHERE
12370         100,,NUNLOCK
12371         2200,,NUSRME
12372         2200,,NUSRVA
12373         100,,NVDBF
12374         200,,NVIDSW
12375         100,,NWHOLI
12376         100,,NWHYINT(1)
12377         1100,,NXGPIM
12378
12379 IFN .-SYSCTD-1-ZZ,.ERR NEW SYS CALL DISPATCH LOSES!!!
12380
12381 REPEAT 1_<ZZ2>-ZZ-1,ILUUO
12382 \f
12383 ;.CALL ADR1  SKIPS UNLESS SOMETHING WRONG
12384 ;ADR1:  SETZ
12385 ;       SIXBIT /<CALL NAME>/
12386 ;       REPEAT #ARGS,BITS,, <ADDRESS OF ARGUMENT>
12387 ;       BITS=   4.9 => LAST ARG
12388 ;               4.3 - 4.1 0 = NORMAL ARG
12389 ;                         1 = IMMEDIATE
12390 ;                         2 = OUTPUT ARG
12391 ;                         3 = RETURN THE FAILURE CODE IF FAIL
12392 ;                         4 = WORD OF CONTROL BITS
12393 ;                         5 = IMMEDIATE CONTROL BITS
12394
12395 ASYSC:  PUSHJ P,ASCGRG  ;B HAS E OF UUO
12396          JRST OPNL43    ;CALL NAME UNKNOWN.
12397          JRST OPNL15    ;MORE THAN 8 ARGS
12398          JRST OPNL30    ;TOO FEW ARGS
12399         PUSHJ P,ASYSC1  ;DISPATCH TO ROUTINE.
12400          POPJ P,        ;NO SKIP - OPENL HAS ALREADY BEEN CALLED.
12401         AOS (P)         ;SKIP - PROPAGATE THE SKIP UP THE PDL
12402         MOVE U,USER     ;!!
12403         MOVE R,SYSCVL(U);SUCCESS RETURN, ZERO ERROR CODE ARG IF ANY
12404         TLNE R,%SCVER
12405          XCTR XW,[SETZM (R)]
12406         JUMPGE R,CPOPJ  ;JUMP IF NO OUTPUT VALUES WANTED
12407 SYSCPT: HRRZ W,FORTY    ;VALUES WANTED, PUT INTO USER MEMORY FROM ACS
12408         ADDI W,2
12409         MOVSI T,-8
12410 SYSCP2: UMOVE R,(W)
12411         TLNN R,1000
12412         TLNN R,2000
12413          JRST SYSCP3
12414         PUSHJ P,ASCIND
12415         MOVE J,1(T)
12416         UMOVEM J,(R)
12417         AOBJP T,CPOPJ
12418 SYSCP3: JUMPL R,CPOPJ
12419         AOJA W,SYSCP2
12420
12421 ASYSC1: MOVE T,SYSCTD(H)
12422         TLNN T,1        ;DECODE 1ST ARG AS IO CHNL?
12423          JRST (T)       ;NO, DISPATCH TO CALL.
12424         TLNE T,2        ;OK TO GIVE TO JOB CHNL CHECKER?
12425         JRST CHNDCD     ;NO - GO DECODE CHANNEL
12426         HRL J,T         ;SAVE DISPATCH ADDR
12427         HRRI T,AIOCAL   ;MAKE DECODER RETURN TO CHECK FOR JOB DEVICE
12428         JRST CHNDCD
12429
12430 NCALL:  MOVE T,A
12431         MOVE R,[B,,A]
12432         BLT R,A+6
12433         SETZM A+7       ;MAX 8 ARGS, 1 USED FOR NAME
12434         SOS W
12435         PUSHJ P,ASCRCH
12436          JRST OPNL43
12437         MOVEI J,ASYSC+2 ;LOOK LIKE PUSHJ'ED FROM ASYSC
12438         MOVEM J,(P)
12439         LDB J,[331000,,SYSCTD(H)]
12440         JUMPE J,NCALL2
12441         AOS B,FORTY
12442         JRST NCALL3     ;HE WANTS POINTERS, WE HAVE JUST VALUES.
12443                 ;MUST GET ARGS AGAIN
12444
12445 ASCRCH: MOVEI H,0
12446         REPEAT ZZ2,[CAML T,SYSCTB+1_<ZZ2-.RPCNT-1>(H)
12447         ADDI H,1_<ZZ2-.RPCNT-1>
12448         ]
12449         CAMN T,SYSCTB(H)
12450         AOS (P)
12451         POPJ P,
12452 \f
12453 ;JSP T,HERE TO DECODE IO CHNL IN A, MODIFIERS IN 3.1-3.3 OF T.
12454 ;IF RH(T) = AIOCAL, LH(J) IS REAL RETURN ADDRESS.
12455 ;RETURNS IOCHNM ADDR IN RH(R), IOCHNM WD CONTENTS IN H, CLSTB BITS IN LH(R)
12456 ;CAN POPJ OUT FOR INVALID CHANNEL.
12457
12458 CHNDCD: TRNE A,-NIOCHN  ;IS 1ST ARG A LEGAL CHNL NUM?
12459          JRST OPNL14
12460         CAMN U,USER
12461          HRROM A,UUAC(U);REMEMBER CHNL # FOR IOC ERRORS, ETC.
12462         MOVEI R,(A)
12463         ADDI R,IOCHNM(U) ;YES, COMPUTE IOCHNM WD ADDR
12464         MOVE H,(R)      ;RETURN CONTENTS IN H.
12465         HLL R,CLSTB(H)  ;RETURN CLSTB BITS IN LH(R).
12466         TLNE R,%CLST
12467          JRST [ CAME U,USER     ;TRAP DEVICE
12468                  JRST .+1       ;IF CHANNEL BELONGS TO THIS USER, TRAP
12469                 JRST TRPDEV ]   ;OTHERWISE, IS PROBABLY RFNAME, LET IT THROUGH
12470         TRNN H,-1       ;IF CHNL NOT OPEN
12471          TLNE T,4       ;AND NOT SPECIALLY OK FOR THIS SYSTEM CALL
12472           JRST (T)
12473         JRST OPNL44     ;THEN BARF
12474
12475 ;JOB DEVICE CHECKER - PUT AIOCAL IN RH(T), JRST CHNDCD
12476
12477 AIOCAL: HLRZ T,J                ;GET DISPATCH ADR BACK
12478         TLNN R,%CLSJ            ;IS CHANNEL JOB DEVICE?
12479          JRST (T)               ;NO - DISPATCH
12480         HLRZS H                 ;ISOLATE JOB DEVICE INDEX
12481         DPB W,[230400,,JBSTS(H)]        ;SAVE ARG COUNT
12482         MOVNS W
12483         HRLZS W
12484         HRRI W,1                ;NOW HAVE AOBJN PNTR TO DATA
12485         MOVE T,(W)              ;COPY ARGS TO JOB AC TABLES
12486         MOVEM T,@JBACTB-1(W)
12487         AOBJN W,.-2
12488         MOVEI W,10              ;SET NON-STANDARD OP-CODE
12489         HRRM W,JBSTS(H)
12490         MOVE E,H                ;PUT JOB INDEX IN E FOR JBWT
12491         CONO PI,CLKOFF
12492 AIOCA1: PUSHJ P,JBWT            ;WAIT FOR JOB TO ANSWER
12493         MOVE H,E                ;GET JOB INDEX BACK IN H (FOR JBACTB)
12494         MOVE W,[-8,,1]          ;LOAD ANSWERS INTO ACS
12495         MOVE T,@JBACTB-1(W)
12496         MOVEM T,(W)
12497         AOBJN W,.-2
12498         LDB T,[350400,,JBSTS(H)]        ;GET SKIP COUNT
12499         JUMPN T,POPJ1                   ;SKIP COUNT NOT ZERO - SKIP
12500         LDB C,[270600,,JBSTS(H)]        ;GET OPEN LOSS CODE
12501         SKIPE C                         ;MAKE SURE IN BOUNDS
12502         CAILE C,NOPNLS
12503         MOVEI C,22
12504         JRST OPNL1-1(C) ;GO REPORT LOSSAGE AND DON'T SKIP
12505 \f
12506 ;SYSTEM CALL GET ARGS
12507 ASCGRG: UMOVE T,(B)
12508         CAME T,[SETZ]
12509          JRST ILUUO
12510         UMOVE T,1(B)
12511         MOVEM T,LSCALL(U)
12512         PUSHJ P,ASCRCH
12513          POPJ P,        ;CALL NAME UNRECOGNIZED.
12514         AOS (P)
12515         LDB J,[331000,,SYSCTD(H)]       ;GET BITS CORRESP TO ARGS WHICH SAY SUPPLY PNTR TO NTH ONE
12516 NCALL3: MOVEI W,2(B)
12517         MOVE T,[-9,,A]
12518         SETZM CTLBTS(U)
12519 ASYSC2: UMOVE R,(W)
12520         TLNE R,37
12521          PUSHJ P,ASCIND ;CALC EFFECTIVE ADDRESS
12522         TLNE R,2000
12523          JRST ASYSC3    ;OUTPUT OR ERRORCODE ARG
12524         TLNE R,4000
12525          JRST ASYSC5    ;CONTROL BITS
12526         AOBJP T,CPOPJ
12527         ROT J,-1
12528         JUMPL J,ASYSC7  ;J IF WANT ADDRESS, NOT VALUE
12529         TLNE R,1000
12530          TLZA R,-1      ;IMMEDIATE, GET 0,,ADR
12531           UMOVE R,(R)   ;ELSE GET WORD POINTED TO
12532 ASYSC7: MOVEM R,-1(T)   ;PUT INTO AC
12533         JRST ASYSC4
12534
12535 ASYSC5: TLNE R,1000     ;CTL BITS
12536          TLZA R,-1      ;IMMEDIATE, GET 0,,ADR
12537           XCTR XR,[HRRZ R,(R)]  ;ELSE WORD ADDRESS
12538         XORM R,CTLBTS(U)        ;XOR ALL THESE ARGS TOGETHER
12539 ASYSC4: XCTR XR,[SKIPL (W)]     ;SKIP IF TERMINATE BIT ON
12540          AOJA W,ASYSC2
12541         HLRE W,T
12542         ADDI W,9        ;COMPUTE NUMBER OF ARGUMENTS SUPPLIED
12543 NCALL2: LDB T,[300300,,SYSCTD(H)]
12544         SUB T,W
12545         JUMPG T,POPJ1   ;NOT ENOUGH ARGS
12546         JRST POPJ2      ;OK
12547
12548 ASYSC3: TLNE R,1000
12549          JRST ASYSC8    ;ERROR CODE ARG
12550         XCTR XRW,[MOVES (R)] ;OUTPUT ARG, JUST MAKE SURE IT'S THERE
12551         MOVSI R,%SCVOT  ;AND FLAG PRESENCE
12552 ASYSC9: IORM R,SYSCVL(U)
12553         JRST ASYSC4
12554
12555 ASYSC8: HRLI R,%SCVER   ;ERROR-CODE ARG
12556         TDNE R,SYSCVL(U);CAN'T HAVE MORE THAN ONE ERRORCODE ARG
12557          JRST CPOPJ     ;SAY "TOO MANY ARGS"
12558         XCTR XRW,[MOVES (R)] ;MAKE SURE IT'S THERE; MUSTN'T PCLSR OUT OF OPENL
12559         JRST ASYSC9
12560 \f
12561 ;PERFORM INDEXING AND INDIRECTION ON ADDRESS WORD IN R.
12562 ;DON'T CLOBBER BITS 3.6 - 4.9.  SET BITS 3.1 - 3.5 TO ZERO
12563 ;PUT ADDR IN RH.
12564 ASCIND: TLNN R,37
12565         POPJ P,
12566 ASCIN1: PUSH P,R
12567         LDB R,[220400,,R]
12568         CAIE R,0
12569         XCTR XR,[HRRZ R,(R)]
12570         ADD R,(P)
12571         HLL R,(P)       ;GET ORIG @, MAY HAVE BEEN CARRIED INTO BY -1(17)
12572         TLZ R,17
12573         TLZE R,(@)
12574         UMOVE R,(R)
12575         DPB R,[2700,,(P)]
12576         POP P,R
12577         TLNN R,37
12578         POPJ P,
12579         PUSHJ P,OPBRK   ;ALLOW PCLSR
12580         JRST ASCIN1
12581
12582 TPFLT:  CONO PI,CLKOFF          ;PREVENT INTERRUPT AFTER IORM SPM ING BACK
12583                                 ; ON TOP OF 1000 BIT
12584 IFN KA10P,[
12585         SPM UPGML(U)
12586         PUSH P,B
12587         MOVSI B,1000
12588         IORM B,UPQUAN(U)
12589         POP P,B
12590         LPMRI UPGML(U)  ;TAKE TRAP, MAYBE DONT COME BACK
12591         JRST CLKONJ
12592 ] ;KA10P
12593 IFN KL10P,[
12594         POP P,PFOPC1    ;IF RESTART FAULT, RETURN FROM TPFLT
12595         JRST TPFLT1     ;JOIN REGULAR PAGE FAIL CODE
12596 ] ;KL10P
12597 IFN KS10P,[
12598         POP P,EPTPFO            ; If fault returns, just return from TPFLT
12599         JRST TPFLT1
12600 ] ;KS10P
12601 \f
12602 SUBTTL PURE DUMP
12603
12604 ;`PDUMP' SYMBOLIC SYSTEM CALL
12605 ; ARG 1 - JOB SPEC FOR JOB TO BE DUMPED
12606 ; ARG 2 - DISK CHANNEL TO DUMP ONTO
12607 ; ARG 3 - STATE WORD (MODIFIED) INITIALLY 0, THEN 4.9 + PAGE # ABOUT TO DUMP
12608
12609 PDUMP:  MOVE J,A
12610         JSP T,NCRUI2    ;DECODE JOB SPEC (1ST ARG)
12611          JFCL
12612         MOVE A,J
12613         JUMPL J,OPNL31  ;CAN'T PDUMP THE PDP6.
12614         MOVE D,B
12615         JSP T,PDUMDC    ;DECODE 2ND ARG, B-> IOCHNM WORD.
12616         TLNN J,%CLSQO
12617          JRST OPNL34    ;NOT DISK WRITE CHANNEL.
12618         HRRZM D,UUAC(U) ;SO SET IN CASE OF ERROR
12619         HLRZ D,(B)
12620         MOVEM D,SRN3(U) ;REMEMBER DISK CHANNEL NUMBER FOR LATER.
12621         PCLT
12622         XCTR XRW,[MOVES D,(C)]
12623         MOVEM C,SRN4(U) ;REMEMBER STATE WORD ADDRESS FOR LATER
12624         MOVEM A,EPDL(U) ;USER INDEX
12625 PDUMA:  CAIN A,(U)      ;IF PDUMP'ING SELF, MUSTN'T PCLSR,
12626          PUSHJ P,NULSET ;SO DO A NULSET INSTEAD OF THE SOSSET
12627         CAIN A,(U)
12628          JRST PDUMP9    ;SO THAT A LSWPOP CAN BE DEON AT THE END IN EITHER CASE.
12629         PUSHJ P,RPCLSR  ;HACKING ANOTHER JOB: STOP IT.
12630         PUSHJ P,SOSSET
12631           USTP(A)
12632 PDUMP9: MOVE A,SRN3(U)  ;GET DISK CHANNEL NUMBER
12633         MOVE C,SRN4(U)
12634         UMOVE D,(C)     ;PICK UP STATE WORD
12635         JUMPN D,PDUMP5  ;JUMP IF ALREADY WROTE MAP PAGE
12636         PUSHJ P,PDBWG   ;GET BUFFER AND COMMIT DISK TRACK FOR MAP PAGE
12637         SETZM (E)       ;CLEAR FIRST WORD OF MAP
12638                         ;AND DROP INTO PDUMP4
12639 ;HANDLE THE NEXT PAGE.
12640 PDUMP4: PUSHJ P,PUPLC   ;GET BYTE POINTERS
12641         LDB W,Q         ;CIRC POINTER ENTRY
12642         LDB R,T         ;PAGE MAP ENTRY
12643         ANDCMI R,PMAGEM ;CLEAR AGE BITS
12644         CAIN W,-1
12645          TLO R,(SETZ)   ;ABS PAGE
12646         SKIPN W
12647          MOVEI R,0      ;PAGE NON-EXISTANT
12648         TRNN R,600000
12649          LSH R,16.      ;SWAPPED OUT
12650         MOVE W,D        ;VIRTUAL PAGE NUMBER
12651         ADDI W,1(E)     ;ADDRESS OF ENTRY IN BLOCK
12652         MOVEM R,(W)     ;STORE ENTRY
12653         CAIGE D,377
12654          AOJA D,PDUMP4
12655         HRLI W,1(W)
12656         SETZM 1(W)
12657         HRRI W,2(W)
12658         BLT W,1777(E)
12659         MOVE D,EPDL(U)
12660         MOVEI W,1000(E) ;1000-1017 ACS
12661         CAMN D,U
12662          JRST [ XCTR XBR,.+2
12663                 JRST .+3]
12664         HRLI W,AC0S(D)
12665         BLT W,1017(E)
12666         PUSHJ P,QSBWW
12667         SETZM QSMPRC(A) ;SO NEXT IOT GETS A NEW BUFFER
12668         MOVSI D,(SETZ)  ;SET STATE WORD TO `DUMPING PAGE 0'
12669 ;DROPS THROUGH
12670 \f;DROPS IN
12671 ;DUMP NEXT PAGE
12672 PDUMP5: MOVE C,SRN4(U)  ;STORE BACK STATE WORD
12673         UMOVEM D,(C)
12674 PDUMP8: PUSHJ P,PUPLC
12675         LDB W,Q
12676         CAIE W,-1
12677         SKIPN W
12678          AOJA D,PDUMP6  ;PAGE ABSOLUTE OR NONEXISTANT
12679 PDUMP3: PUSHJ P,PDBWG   ;GET BUFFER AND COMMIT DISK TRACK TO DUMP THIS PAGE INTO
12680         MOVE J,EPDL(U)  ;SET UP MAP TO POINT TO USER BEING DUMPED
12681         PUSHJ P,MPLDJ
12682         HRLZ J,D        ;GET VIRTUAL ADDRESS OF PAGE BEING DUMPED
12683         LSH J,10.
12684         HRR J,E         ;BLT POINTER TO COPY THE PAGE
12685         XCTR XBR,[BLT J,1777(E)]        ;COPY PAGE INTO DISK BUFFER
12686         PUSHJ P,MPLDZ   ;RESTORE TO NORMAL MAP
12687         PUSH P,D
12688         PUSHJ P,QSBWW   ;WRITE OUT THE COPIED PAGE
12689         SETZM QSMPRC(A) ;SO NEXT IOT GETS NEW BUFFER
12690         POP P,D
12691         AOS D           ;DONE WITH THIS PAGE
12692 PDUMP6: TRNN D,400      ;SKIP IF FINISHED WHOLE ADDRESS SPACE
12693          JRST PDUMP5
12694         JRST LSWPJ1     ;UNSTOP USER AND POPJ1
12695
12696 ;ROUTINE TO GET DISK BUFFER AND COMMIT TRACK (FOR PDUMP)
12697 ;RETURNS BUFFER ADDRESS IN E.  PRESERVES D.
12698
12699 PDBWG:  SKIPL E,QSMDN(A)        ;GET CORE BLOCK # OF DISK BUFFER
12700          JRST [ LSH E,10.       ;CONVERT TO ADDRESS
12701                 POPJ P, ]
12702         MOVE E,[444400,,1]      ;NO BUFFER, GET ONE
12703         MOVEI B,QBOV
12704         PUSHJ P,QSBWG
12705          PUSHJ P,UDELAY         ;CAN'T GET MEMORY, WAIT A WHILE
12706         JRST PDBWG
12707
12708 ;ROUTINE TO LOOK UP PAGE (FOR PDUMP AND PURE LOAD)
12709 ;PAGE# IN RH(D), USER# IN EPDL(U).  RESULTS FROM UPLC IN Q AND T.
12710
12711 PUPLC:  PUSH P,A
12712         PUSH P,U
12713         MOVE U,EPDL(U)
12714         MOVE A,D
12715         ANDI A,377
12716         PUSHJ P,UPLC
12717         POP P,U
12718         JRST POPAJ
12719
12720 ;DECODE 2ND ARG TO PDUMP & LOAD.
12721 ;B GETS IOCHNM WORD ADDR, LH OF J GETS LH OF CLSTB ENTRY, RH GETS LH(IOCHNM).
12722
12723 PDUMDC: TRNE B,-NIOCHN
12724          JRST OPNL14
12725         ADDI B,IOCHNM(U)
12726         HRRZ J,(B)
12727         HLLZ J,CLSTB(J)
12728         HLR J,(B)
12729         JRST (T)
12730 \f
12731 SUBTTL PURE AND SBLK LOAD
12732
12733 ;`LOAD' SYMBOLIC SYSTEM CALL
12734 ; ARG 1 - JOB SPEC FOR JOB TO BE LOADED
12735 ; ARG 2 - DISK CHANNEL TO LOAD FROM
12736 ; ARG 3 - (OPTIONAL) FIRST ADDR,,LAST ADDR TO BE LOADED
12737 ;         OR ZERO => LOAD ONLY PURE PAGES
12738 ;         WHEN LOADING A PDUMPED FILE, FIRST,,LAST ROUNDED OFF TO PAGES
12739 ; DEFAULT 3RD ARG IS 0,,-1 NORMALLY, 20,,-1 LOADING SELF, 20,,37777 LOADING PDP6
12740
12741 ;PAGE WORD
12742 ;4.9=1 ABSOLUTE, 1.1-2.9 = PTW
12743 ;4.8=1 SHARED WITH OTHER PAGES AT LEAST ONE OF WHICH IS WRITE
12744 ;4.7=1 LINK WITH VIRT PG IN RH 1.8-1.1
12745 ;2.9-2.8 0 NXM, 1 RD ONLY, 2 OR 3 READ/WRITE
12746 ;2.7=1 WORD ALREADY PROCESSED
12747
12748 NLOAD:  MOVE J,A
12749         JSP T,NCORUI    ;DECODE THE JOB SPEC.
12750          JRST NLOAD6     ;JOB GUARANTEED WRITEABLE.
12751         JSP T,NCORWR    ;ELSE CHECK IF WRITEABLE.
12752          CAIN J,-1      ;BUT CAN WRITE PDP6.
12753           CAIA
12754            JRST OPNL31  ;NOT WRITEABLE.
12755 NLOAD6: HRREI A,(J)     ;MAKE SURE EXTEND SIGN IF PDP6.
12756         JSP T,PDUMDC    ;DECODE 2ND ARG.
12757         TLNN J,%CLSQO
12758          TLNN J,%CLSQ
12759           JRST OPNL34   ;NOT DISK READ CHANNEL.
12760         LDB J,[QSBSIZ(J)]
12761         CAIE J,36.
12762          JRST OPNL12    ;"MODE NOT AVAILABLE" IF CHANNEL NOT 36-BIT BYTES.
12763         MOVE R,B        ;IOCHNM ADDRESS IN CASE WE GET TO QICL
12764         JUMPL A,NLOADE  ;DONT STOP THE 6
12765         CAMN A,U
12766          JRST NLOADA    ;DONT STOP IF LOADING INTO SELF
12767         PUSHJ P,RPCLSR
12768         PUSHJ P,LSWPOP  ;SOS JOB'S DIELOK - IT CAN'T DIE WHILE STOPPED.
12769         MOVSI T,BSSTP   ;STOPPING WITH BSSTP INSTEAD OF RH OF USTP
12770         IORM T,USTP(A)  ;AVOIDS DEADLY EMBRACE WITH CORE JOB (SEE CUSTOP)
12771         SOS USTP(A)
12772         PUSHJ P,LOSSET  ;ARRANGE TO CLEAR BSSTP ON PCLSR.
12773             NLUPCL
12774         CAIGE W,3
12775          HRLOI C,0      ;DEFAULT 3RD ARG
12776         JRST NLOADE
12777
12778 NLOADA: PUSHJ P,LSWPOP  ;DIELOK
12779         CAIGE W,3
12780          HRLOI C,20     ;DEFAULT 3RD ARG
12781 NLOADE: MOVEM A,SRN3(U) ;SAVE USER INDEX (-1 => PDP6)
12782 IFN PDP6P,[
12783         JUMPL A,[HLRZ A,C       ;PDP6, ENSURE LIMITS SMALL ENOUGH
12784                 CAIGE A,20
12785                  HRLI C,20      ;ACS NOT ACCESSIBLE
12786                 MOVEI A,LPDP6M*2000-1
12787                 CAIGE A,(C)
12788                  HRR C,A        ;HAS ONLY 16K MEMORY
12789                 JRST .+1]
12790 ]
12791         HLRZ A,(B)
12792         MOVEM A,SRN4(U) ;SAVE # OF DISK CHANNEL
12793         SETZM SRN5(U)   ;START LOADING AT VIR PG #0
12794         MOVEM C,EPDLT1(U) ;SAVE LOAD LIMITS
12795         HLRZ D,C
12796         CAILE D,(C)
12797          JRST OPNL33    ;FIRST > LAST
12798         HLRZ C,QPCLSR(A)
12799         JUMPE C,NLOADD
12800         HRRZ Q,SRN3(U)
12801         CAIN C,(Q)
12802          JRST NLDSBB    ;(COMING BACK AFTER PCLSR)
12803         SETZM QPCLSR(A)
12804 ;DROPS THROUGH
12805 \f;DROPS IN
12806 ;GET FIRST BLOCK OF FILE BEING LOADED
12807 NLOADD: CAMN U,PCLUSR
12808         SETZM PCLIDX
12809         SKIPL TT,QSMDN(A)
12810          JRST NLOADB
12811         PCLT
12812         SKIPG QSBFS(A)
12813          PUSHJ P,UFLS   ;HANG UNTIL A BLOCK IS READ IN
12814         MOVE Q,QSRAC(A)
12815         TLNE Q,%QAACC+%QAMPU+%QAPAR
12816          JRST OPNL7     ;LOST ONE WAY OR ANOTHER
12817         MOVE E,[444400,,1]
12818         MOVEI B,QBIV
12819         PUSHJ P,QSBGB   ;SET UP CHNL AREA. TT ADDR OF FIRST WORD OF BLOCK
12820          BUG
12821          JRST NLOADC    ;QSBGB SKIPS FOR NORMAL RETURN
12822          JRST OPNL46    ;SKIPPED TWICE => EOF
12823
12824 NLOADB: MOVE J,QMPBSZ(A)
12825         LSH TT,10.
12826 NLOADC: SKIPE (TT)      ;SKIP IF PURE DUMPED FILE
12827          JRST NLDSB     ;SBLK
12828         SKIPGE SRN3(U)
12829          JRST OPNL34    ;TRYING TO PURE LOAD PDP6
12830         MOVSI Q,%QAACC  ;WILL GO RANDOM ACCESSING THROUGH FILE
12831         IORM Q,QSRAC(A) ;THIS ALSO INHIBITS ACTIVATION AT PI LEVEL
12832         HLRZ H,EPDLT1(U);LOW LOAD BOUNDARY
12833         SKIPE EPDLT1(U)
12834          CAIL H,20
12835           JRST NLOADH   ;ACS NOT BE LOADED
12836         MOVSI Q,1000(TT);ADDRESS OF DUMPED ACS
12837         HRLS H
12838         ADD Q,H
12839         HRRZ H,EPDLT1(U);HIGH LOAD BOUNDARY
12840         CAILE H,17
12841          MOVEI H,17
12842         HRRZ J,SRN3(U)  ;JOB TO BE LOADED
12843         PUSHJ P,MPLDJ
12844         XCTR XBW,[BLT Q,(H)] ;LOAD UP HIS ACS
12845         PUSHJ P,MPLDZ
12846 NLOADH: MOVEI R,1(TT)   ;ADDRESS OF FIRST WORD OF DUMPED MAP
12847         MOVEM R,EPDL3(U)        ;SAVE
12848         MOVEI Q,2000
12849         PUSHJ P,QFNTR   ;FIND DISK ADDRESS OF SECOND BLOCK
12850          JRST OPNL46    ;OFF END OF FILE
12851         SOS QSBI(A)     ;UNDO QFNTR HACK
12852         AOS QSLGL(A)
12853         PUSHJ P,QUDULK  ;UNLOCK USER DIRECTORY
12854         PUSHJ P,SWTL    ;LOCK CIRPSW
12855             CIRPSW
12856 ;DROPS THROUGH
12857 \f;DROPS IN
12858 ;HERE TO DO NEXT PAGE (WHEN LOADING PDUMPED FILE)
12859 NLOAD0: PUSHJ P,OPBRK
12860         MOVE A,@EPDL3(U)
12861         TRNE A,600000   ;SKIP IF NO ACCESS (IGNORE)
12862          TRNE A,100000
12863           JRST NLD14    ;THIS PAGE ALREADY DONE OR NO ACCESS
12864         MOVE Q,EPDLT1(U)
12865         TRNE A,400000   ;SKIP IF READ ONLY
12866          JUMPE Q,NLD14  ;IMPURE NOT BE LOADED
12867         MOVE A,SRN5(U)  ;VIRTUAL PAGE NUMBER
12868         JUMPE Q,NLD16
12869         AND Q,[-2000,,-2000]
12870         LSH Q,-10.      ;FIRST PAGE,,LAST PAGE
12871         HLRZ T,Q
12872         CAIL A,(T)
12873          CAILE A,(Q)
12874           JRST NLD14    ;PAGE OUTSIDE OF RANGE TO BE LOADED
12875 NLD16:  MOVE U,SRN3(U)  ;USER INDEX
12876         PUSHJ P,UPLC
12877         LDB R,Q         ;LOOK IN CIRCULAR POINTER ENTRY FOR THIS PAGE
12878         JUMPE R,NLOAD1  ;DOESN'T ALREADY HAVE THIS VIRTUAL PAGE
12879         PUSH P,T        ;SAVE BYTE POINTER TO PAGE MAP FOR THIS VIRTUAL PAGE
12880         PUSH P,Q        ;SAVE BYTE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12881         PUSHJ P,PAGERT  ;FLUSH THE ALREADY EXISTING VIRTUAL PAGE
12882         POP P,Q
12883         POP P,T
12884 NLOAD1: MOVE U,USER
12885         MOVE R,@EPDL3(U)        ;PICK UP DUMPED PAGE MAP WORD
12886         ANDCMI R,PMAGEM ;CLEAR AGE BITS (WOULD LOSE AT NLOAD4+4)
12887         JUMPGE R,NLOAD3 ;NOT ABSOLUTE PAGE
12888         ANDI R,PMRCM    ;ABS PG #
12889         CAIL R,TSYSM
12890 IFE PDP6P,      JRST OPNL32
12891 .ELSE [
12892         JRST [  CAIGE R,<PDP6BM_-10.+LPDP6M>
12893                  CAIGE R,<PDP6BM_-10.>
12894                   JRST OPNL32
12895                 HRRZ R,@EPDL3(U)        ;ALLOW USER TO LOAD WRITABLE PDP6 PAGES.
12896                 ANDCMI R,PMAGEM\PMUNSD  ;GIVE HIM WHATEVER ACCESS HE RQ'S.
12897                 JRST NLOAD5]]
12898 ;IFN TEN11P,[           ;NOT NECESSARY SINCE 10-11 PAGES ABOVE TSYSM NOW
12899 ;       TRNN R,400
12900 ;       JRST .+3
12901 ;       MOVE E,T11MP-400(R)
12902 ;       AOJN E,NLOAD2   ;DONT ALLOW PAGE TO POINT TO TEN11
12903 ;]
12904
12905         LDB E,[MUR,,MEMBLT(R)]
12906         CAIN E,MUHOLE
12907          TDZA R,R       ;IF PAGE NXM TODAY, DON'T ACTUALLY GIVE ACCESS
12908
12909 NLOAD5:   TRO R,200000  ;RD ONLY
12910         DPB R,T         ;STORE ENTRY IN PAGE MAP
12911         MOVEI R,-1
12912         DPB R,Q         ;STORE -1 IN CIRCULAR POINTER
12913 NLOAD2: MOVE E,SRN5(U)  ;VIRTUAL PAGE NUMBER
12914         MOVE U,SRN3(U)  ;USER INDEX LOADING INTO
12915         PUSHJ P,GHUSRA  ;RECOMPUTE HUSRAD
12916 NLD14:  MOVE U,USER
12917         MOVEI R,100000
12918         IORB R,@EPDL3(U)        ;MARK DUMPED PAGE WORD AS ALREADY DONE
12919         MOVE A,SRN4(U)  ;DISK CHANNEL
12920         TLNN R,500000   ;SKIP IF NO CORRESPONDING BLOCK IN FILE
12921         TRNN R,600000   ;SKIP IF MUST ADVANCE ONE BLOCK
12922          JRST .+3       ;DON'T ADVANCE FILE POINTER
12923           PUSHJ P,QFNTN ;ADVANCE TO NEXT DISK ADDRESS
12924            JRST OPNL46  ;PREMATURE EOF
12925         AOS R,SRN5(U)   ;NEXT VIRTUAL PAGE
12926         CAMN U,PCLUSR
12927          MOVEM R,PCLIDX
12928         AOS EPDL3(U)    ;NEXT MAP WORD
12929         CAIGE R,400
12930          JRST NLOAD0    ;LOOP
12931         PUSHJ P,LSWPOP  ;RELEASE CIRPSW
12932         MOVE B,SRN3(U)  ;USER INDEX LOADING INTO
12933         CAME B,U        ;SKIP IF LOADING INTO SELF
12934          PUSHJ P,LSWPOP ;UNSTOP USER
12935         MOVE B,QFBLNO(A)
12936         SETZM QFBLNO(A)
12937         MOVEM B,QRADAD(A)
12938         JRST POPJ1
12939 \f
12940 NLOAD3: TLNN R,100000   ;SKIP IF LINK WITH PAGE IN RH OF R
12941          JRST NLOAD4
12942         PUSH P,T        ;SAVE BYTE POINTER TO MAP ENTRY FOR THIS VIRTUAL PAGE
12943         PUSH P,Q        ;SAVE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12944         LDB A,[1700,,R] ;VIRTUAL PAGE NUMBER BEING LINKED TO
12945         CAIL A,400
12946          JRST NLOAD8    ;BAD VIRT PAGE #
12947         MOVE E,SRN5(U)  ;VIRTUAL PAGE NUMBER OF PAGE BEING LINKED
12948         MOVE U,SRN3(U)  ;USER INDEX LOADING INTO
12949         PUSHJ P,UPLC
12950         LDB W,Q         ;CIRCULAR POINTER OF OTHER ENTRY
12951         JUMPE W,NLOAD8  ;DIDN'T EXIST
12952         CAIN W,-1
12953          JRST NLOAD8    ;POINTS TO AN ABSOLUTE PAGE
12954         MOVE C,U
12955         IDIVI C,LUBLK
12956         SKIPE D
12957          BUG            ;L DOESN'T DIVIDE U
12958         LSH C,10        ;USER NUMBER _ 8
12959         TRZE C,400000
12960          BUG            ;USER INDEX WAS TOO LARGE
12961         IOR C,E         ;NEW CIRCULAR POINTER
12962         POP P,D         ;NEW CIRCULAR POINTER BYTE POINTER
12963         DPB W,D         ;STORE OTHER ENTRY AS NEW CIRCULAR POINTER ENTRY
12964         DPB C,Q         ;MAKE OTHER CIRCULAR POINTER ENTRY POINT TO NEW ONE
12965         LDB E,T         ;OTHER MAP ENTRY
12966         POP P,T         ;POINTER TO NEW MAP ENTRY
12967         ANDI R,600000   ;PROTECTION BITS
12968         TRZN E,600000
12969          JRST NLD11
12970         IOR E,R
12971         JRST NLD10
12972 NLD11:  LSH R,-20
12973         DPB R,T
12974 NLOAD9: AOS SNSWPG      ;INCR CNT OF SWAPPED OUT FOR SYS
12975         AOSA NSWPGS(U)  ;USER LOADING INTO HAS ONE MORE SWAPPED OUT PAGE
12976 NLD10:   DPB E,T
12977 NLD13:  AOS NMPGS(U)    ;USER HAS ONE MORE PAGE
12978         AOS SNMPGS      ;SYSTEM HAS 1 MORE PAGE
12979 NLD15:  MOVE U,USER
12980         JRST NLOAD2     ;RECOMPUTE HUSRAD AND LOOP
12981
12982 NLOAD4: MOVE A,SRN4(U)  ;DISK CHANNEL
12983         MOVEI TT,(R)    ;PUT DESIRED ACCESS IN RH(TT),
12984         ANDI TT,600000
12985         TDNE R,[200000,,400000]
12986          IORI TT,%CBCPY ;ALONG WITH INITIAL-SWAPIN BIT IF NEC.
12987         PUSHJ P,NCORQ7  ;FIND OR CREATE MMP ENTRY.
12988          JRST OPNL37    ;MMP FULL
12989         MOVE E,SRN5(U)  ;GET PAGE # IN JOB BEING LOADED
12990         MOVE U,SRN3(U)  ;TARGET USER.
12991         PUSHJ P,NCORR1  ;INSERT THE PAGE.
12992         JRST NLD15
12993
12994 NLOAD8: SUB P,[2,,2]
12995         JRST OPNL46
12996
12997 NLOADZ: PUSHJ P,LSWPOP  ;FREE CIRPSW
12998         MOVEI T,3
12999         CAMLE T,LMEMFR
13000          PUSHJ P,UFLS
13001         PUSHJ P,SWTL
13002             CIRPSW
13003 POPSM2: SOS (P)         ;RETURN TO LOCN BEFORE PUSHJ
13004         SOS (P)
13005         POPJ P,
13006
13007 ;QTAOS: PUSHJ P,QTLOCK  ;LOCK TUT
13008 QTAOS1: MOVE D,QSLGL(A) ;DISK TRACK
13009         PUSHJ P,TUTPNT
13010         SKIPG B
13011          BUG            ;NOT PART OF ANY FILE
13012         CAIGE B,TUTMNY
13013          AOS B
13014         DPB B,D         ;ADD ONE TO TUT ENTRY FOR THIS TRACK
13015         JRST QTULK
13016 \f
13017 NLUPCL: MOVSI T,BSSTP   ;THIS IS THE LOSSET ROUTINE TO CLEAR BSSTP.
13018         SKIPGE A,SRN3(U)
13019          BUG
13020         ANDCAM T,USTP(A)
13021         POPJ P,
13022
13023 NLDSBB: HRRZ J,SRN3(U)  ; (COMING BACK AFTER PCLSRING OUT) A HAS DSK CHNL #)
13024         PUSHJ P,MPLDJ   ;LOAD MAP (ALSO CLOBBER UMAPS)
13025         SKIPL C,SRN3(U)
13026          CAIN U,(C)
13027           JRST NLDSBH
13028         PUSHJ P,LSWPOP
13029         PUSHJ P,LOSSET
13030             NLUPCL
13031         MOVSI B,BSSTP
13032         IORM B,USTP(C)
13033 NLDSBH: HRRZ B,QPCLSR(A)
13034         JRST (B)
13035
13036 NLDSB:  SKIPN EPDLT1(U)
13037          JRST OPNL12    ;LOAD ONLY PURE FROM SBLK FILE LOSES
13038         HRLZ B,SRN3(U)
13039         HRRI B,NLDSBD
13040         MOVEM B,QPCLSR(A)       ;RESTART POINT IN CASE OF PCLSR
13041         MOVEM J,QSMPRC(A)
13042         MOVEM TT,QSMPRP(A)
13043         HRRZ J,SRN3(U)
13044         PUSHJ P,MPLDJ   ;LOAD MAP (ALSO CLOBBER UMAPS)
13045
13046 ;DROPS THROUGH
13047 \f
13048 ;DROPS IN
13049 NLDSB1: HRROI I,EPDL3(U)
13050         MOVEM I,SRN4(U) ;SET UP AOBJN PTR TO READ INTO EPDL3
13051 NLDSBD: MOVEI C,SRN4(U) ;SET C UP TO POINT TO AOBJN PTR
13052         HRLI C,(TRN)    ;INDICATE EXEC MODE ADR
13053         PUSHJ P,QBI
13054         SKIPGE SRN4(U)
13055          JRST NLDSB9    ;PREMATURE EOF
13056         MOVE I,EPDL3(U)
13057         CAME I,[JRST 1]
13058          JRST NLDSB1    ;IGNORE INITIAL STUFF UNTIL JRST 1
13059 NLDSBK: MOVEI B,NLDSBE
13060         HRRM B,QPCLSR(A)
13061 NLDSBE: HRROI I,QLDPTR(A)
13062         MOVEM I,SRN4(U)
13063         MOVEI C,SRN4(U)
13064         HRLI C,(TRN)
13065         PUSHJ P,QBI     ;GET AN AOBJN POINTER
13066         SKIPGE SRN4(U)
13067          JRST NLDSB9    ;PREMATURE EOF
13068         SKIPL B,QLDPTR(A)
13069          JRST NLDSB6    ;NOT AN AOBJN POINTER
13070         HLRZ C,EPDLT1(U);FIRST ADDRESS TO BE LOADED
13071         SUBI C,(B)
13072         JUMPLE C,NLDSB3
13073         HLROS B         ;SKIP # WDS IN C
13074         ADD B,C         ;-# WDS REMAINING IN BLOCK
13075         SKIPLE B
13076          SUB C,B        ;FLUSH WHOLE BLOCK
13077         LDB D,[1200,,QSMPRP(A)]
13078         SKIPGE QSMDN(A)
13079          MOVEI D,0
13080         ADD D,QFBLNO(A)
13081         ADD D,C         ;ADVANCE ACC PTR TO SKIP PART OR ALL OF BLOCK
13082         MOVEM D,QRADAD(A)
13083         MOVSI D,%QAACC
13084         IORM D,QSRAC(A)
13085         JUMPGE B,[AOS QRADAD(A) ;SKIPPING WHOLE BLOCK, ALSO SKIP CHECKSUM
13086                   JRST NLDSBK]  ;AND GO READ NEXT BLOCK
13087         HRLS C
13088         ADDM C,QLDPTR(A) ;UPDATE AOBJN POINTER
13089 NLDSB3: MOVEI B,NLDSBF  ;MAYBE FLUSH EXISTING MEMORY AND GET NEW
13090         HRRM B,QPCLSR(A)
13091 NLDSBF: HRRZ E,QLDPTR(A) ;START ADR OF BLOCK
13092         HLRE C,QLDPTR(A) ;-LENGTH OF BLOCK
13093         SUB E,C         ;DON'T COMBINE THIS INSN WITH NEXT, MIGHT BE MOBY BLOCK
13094         SUBI E,1        ;GET END ADR OF BLOCK
13095         HRRZ T,EPDLT1(U);HIGH LOAD LIMIT
13096         SUBM E,T        ;NUMBER OF WORDS OF EXCESS IN BLOCK
13097         MOVEM T,EPDLT2(U) ;SAVE FOR LATER USE
13098         JUMPLE T,NLDSB7 ;JUMP IF BLOCK HAS NO EXCESS
13099         SUB E,T         ;ADJUST END ADDRESS
13100         HRLZS T
13101         ADDM T,QLDPTR(A);DECREASE COUNT IN AOBJN POINTER
13102 NLDSB7: LSH E,-10.      ;LAST PAGE NEEDED
13103         PUSH P,A
13104         PUSH P,R        ;R HAS IOCHNM WD, NEEDED IF REACH QICL VIA QBI.
13105         PUSH P,E        ;PAGE NO. OF LAST PAGE NEEDED
13106 NLDSB4: MOVE E,(P)
13107         CAMGE E,SRN5(U)
13108          JRST NLDSB5    ;ALREADY HAVE NEEDED PAGES
13109         MOVE A,SRN5(U)
13110         PUSH P,U
13111         MOVE U,SRN3(U)  ;LOOK UP THIS PAGE IN MAP OF USER WE'RE HACKING.
13112         PUSHJ P,UPLC    ;IF THERES A WRITABLE PAGE
13113         POP P,U
13114         LDB A,T         ;IN THE SLOT ALREADY, KEEP IT.
13115         TRNN A,600000
13116          TRNN A,2
13117           TRNE A,400000
13118            JRST NLDSBM
13119         CAME U,SRN3(U)  ;IF NOT HACKING SELF, NCORLL WILL LSWPOP
13120          PUSHJ P,NULSET ;WHAT IT THINKS IS A LOSSET LIKE NLUPCL
13121         PUSHJ P,SWTL
13122           CIRPSW
13123         MOVEI R,%JSNEW  ;GET FRESH PAGE
13124         MOVE TT,SRN3(U) ;INTO THE JOB WE'RE HACKING.
13125         MOVE C,SRN5(U)  ;PAGE # TO GIVE IT.
13126         MOVSI A,%CBRED+%CBWRT+%CBNDW    ;WANT WRITE ACCESS.
13127         PUSHJ P,NCORL   ;UNDOES NULSET AND SWTL.
13128          JRST NLSBPL    ;COULDNT GET PAGE (CALLED LSWCLR)
13129 NLDSBM: AOS SRN5(U)
13130         JRST NLDSB4     ;CHECK WHETHER WE NEED MORE PAGES.
13131 \f
13132 NLDSB5: SUB P,[1,,1]    ;NOW WE HAVE ALL PAGES NEEDED TO LOAD THIS BLOCK.
13133         POP P,R
13134         POP P,A
13135 NLDSBQ: MOVEI B,NLDSBC
13136         HRRM B,QPCLSR(A)
13137 NLDSBC: HRRZI C,QLDPTR(A)
13138         HRLI C,(SETZ)
13139         PUSHJ P,QBI     ;DO A BLOCK IOT, USING THAT AOBJN POINTER.
13140         AOSG B,EPDLT2(U);SKIP RESIDUE OF BLOCK AND CHECKSUM
13141          MOVEI B,1      ;NO RESIDUE, JUST SKIP CHECKSUM
13142         LDB D,[1200,,QSMPRP(A)]
13143         SKIPGE QSMDN(A)
13144          MOVEI D,0
13145         ADD D,QFBLNO(A)
13146         ADD D,B
13147         MOVEM D,QRADAD(A)
13148         MOVSI D,%QAACC
13149         IORM D,QSRAC(A)
13150         JRST NLDSBK
13151
13152 NLDSB6: LDB D,[1200,,QSMPRP(A)]
13153         SKIPGE QSMDN(A)
13154          MOVEI D,0
13155         ADD D,QFBLNO(A)
13156         SUBI D,1
13157         MOVEM D,QRADAD(A)
13158         MOVSI D,%QAACC
13159         IORM D,QSRAC(A)
13160 NLDSB8: CAME U,SRN3(U)  ;UNLESS HACKING SELF OR PDP6, WE HAVE A SOSSET OF USTP TO POP.
13161          SKIPGE SRN3(U)
13162           CAIA
13163            PUSHJ P,LSWPOP
13164         AOSA (P)
13165 NLDSB9:  PUSHJ P,OPNL46 ;LOAD FILE NOT IN VALID SBLK FORMAT
13166 NLSBP1: PUSHJ P,MPLDZ
13167         SETZM QPCLSR(A)
13168         POPJ P,
13169
13170 NLSBPL: SUB P,[2,,2]    ;FLUSH PUSHES OF E AND R.
13171         POP P,A
13172         JRST NLSBP1
13173 \f
13174 SUBTTL .GUN, .LOGOUT
13175
13176 ;DESTROY PROCEDURE TREE WHOSE TOP INDEX SUPPLIED BY USER
13177 AGUN:   XCTR XR,[SKIPG A,(J)]
13178          POPJ P,        ;LOSE, NEG OR SYSTEM JOB
13179         IMULI A,LUBLK
13180         CONO PI,CLKOFF
13181         CAMGE A,USRHI   ;USER INDEX UNREASONABLE => LOSE.
13182         CAIG A,LUBLK
13183          JRST CLKONJ
13184         JRST ALOGO6
13185
13186 ALOGOU: SKIPL SUPPRO(U)
13187          JUMPN J,ABREAK ;.LOGOUT N, TURNS INTO .BREAK N,33 IF NOT TOP LEVEL
13188         MOVE A,U        ;.LOGOUT, AND STY CLOSE.
13189         CONO PI,CLKOFF
13190 ;A HAS JOB BEING LOGGED OUT; U HAS JOB THAT'S DOING IT.
13191 ;.GUN AND .LOGOUT ACT BY PUTTING THE JOB IN SUCH A STATE THAT
13192 ;IT CAN DO NOTHING BUT TRY TO DISAPPEAR. IF THE JOB IS ALREADY
13193 ;IN THAT STATE, THIS ROUTINE DOES NOTHING. THAT PREVENTS
13194 ;RECURSION LOOPS WHEN KILLING CYCLIC STRUCTURES INVOLVING STY'S.
13195 ;EXCEPTION: IF THE JOB TO BE LOGGED OUT IS THE RUNNING JOB,
13196 ;WE DO THE REAL WORK BY GOING TO ALOGO1.
13197 ALOGO6: SKIPE UNAME(A)  ;JOB TO BE LOGGED OUT IS GONE.
13198         SKIPL SUPPRO(A) ;CAN'T LOG OUT UNLESS TOP LEVEL.
13199          JRST CLKONJ
13200         CAME A,U
13201          AOS (P)        ;IF .GUN GETS THIS FAR, IT HAS "SUCCEEDED".
13202         MOVSI T,BULGOS+BULGO
13203         TDNE T,APRC(A)  ;IF JOB IS ALREADY LOGGING OUT,
13204          JRST ALOGO7    ; SEE IF IT IS THE RUNNING JOB
13205         MOVSI B,%PCUSR
13206         CAMN A,USER
13207          AOJA B,ALOGO5
13208         PUSH P,U
13209         MOVE U,USER
13210         MOVEM A,SRN3(U) ;AUCL4 FINDS USR IDX TO HACK HERE.
13211         PUSHJ P,LOSSET
13212             AUCL4       ;CLEAR BULGOS IF AUCL3 PCLSR'S
13213         PUSHJ P,AUCL3   ;SET BULGOS AND WAIT FOR DIELOK TO CLEAR.
13214         POP P,U
13215         CONO PI,CLKOFF
13216         PUSHJ P,LSWDEL
13217         EXCH B,UPC(A)   ;SET HIM UP TO LOG OUT.
13218 ALOGO4: MOVEM B,SRN3(A)         ; Remember old PC for unlocking locks.
13219         MOVE B,[.LOGOUT]        ;PUT THE FOLLOWING ROUTINE IN JOB'S AC'S:
13220         MOVEM B,AC0S(A)         ;       0/      .LOGOUT
13221         CAMN A,USER             ;       1/      .VALUE
13222          UMOVEM B,0             ;       2/      JRST 0
13223         MOVSI B,(.VALUE)
13224         MOVEM B,AC0S+1(A)
13225         CAMN A,USER
13226          UMOVEM B,1
13227         MOVSI B,(JRST)
13228         MOVEM B,AC0S+2(A)
13229         CAMN A,USER
13230          UMOVEM B,2
13231         MOVSI B,BULGOS
13232         IORM B,APRC(A)  ;SAY HE'S DIEING SO NO-ONE WILL HACK HIM.
13233         MOVEM U,EPDL(A) ;RECORD WHO IS KILLING HIM.
13234         MOVE B,UNAME(U)
13235         MOVEM B,SRN4(A)
13236         MOVE B,JNAME(U)
13237         MOVEM B,SRN5(A)
13238         SETZM PICLR(A)  ;PREVENT INTERRUPTS.
13239         SETZM MSKST(A)
13240         SETZM PIRQC(A)
13241         MOVSI B,BUSRC
13242         ANDCAM B,USTP(A) ;MAKE SURE HE CAN RUN - ELSE HE WOULDN'T LOG OUT.
13243 ALOGO7: CONO PI,CLKON
13244         CAME A,USER
13245          POPJ P,
13246         JRST ALOGO1     ;IF JOB IS RUNNING JOB, MUST HACK AROUND
13247
13248 ALOGO5: EXCH B,UUOH     ;LOGGING OUT SELF - MAKE OUR PC LOOK
13249         SOJA B,ALOGO4   ; AS IF WE HAD EXECUTED THE .LOGOUT IN AC 0
13250 \f
13251 ;COME HERE IF LOGGING OUT ONESELF (A=USER).
13252 ALOGO1: MOVE U,A
13253         PUSHJ P,AUCL3   ;WAIT TILL NO-ONE IS LOOKING AT ME,
13254         PUSHJ P,UBLAM   ;CLOSE MY CHANNELS AND KILL MY INFERIORS AND CORE.
13255         MOVE A,USER
13256         CONO PI,CLKOFF  ;DON'T SCHEDULE WHILE GOING AWAY
13257         MOVSI T,BULGO
13258         IORM T,APRC(A)  ;SYS JOB KILLS ANY TREES WITH BULGO SET.
13259         MOVSI T,SCLGUN
13260         IORM T,SUPCOR   ;TELL SYS JOB TO LOOK AROUND FOR TREES TO KILL.
13261         MOVSI T,BUSRC   ;SUICIDE: MAKE SURE WE DON'T RUN ANY MORE.
13262         IORM T,USTP(A)
13263         JRST UDELAY     ;CAUSE A SCHEDULE
13264
13265 ;COME WITH JOB INDEX IN A. INDICATE THAT JOB IS ABOUT TO DIE,
13266 ;THEN WAIT TILL IT'S SAFE TO KILL IT.
13267 ;TURNS CLOCK ON.
13268 AUCL3:  MOVSI T,BULGOS
13269         IORM T,APRC(A)  ;SAY THIS JOB STARTING TO GO AWAY.
13270         CONO PI,CLKON   ;NOONE CAN START HACKING US NOW; SAFE.
13271         CAME A,USER     ;IF NOT LOGGING OUT RUNNING USER,
13272          PUSHJ P,1USTOP ;STOP THE JOB BEING KILLED.
13273         SKIPE DIELOK(A) ;WAIT TILL NO-ONE IS LOOKING AT THAT JOB.
13274          PUSHJ P,UFLS
13275         HRLOI T,#BUSRC  ;AND NO-ONE ELSE HAS HIM PCLSR'ED.
13276         TDNE T,USTP(A)
13277          PUSHJ P,UFLS
13278         POPJ P,         ;WE SUCCEEDED, BUT CALLER HAS WORK TO DO.
13279 \f
13280 SUBTTL REAL TIME USER FEATURE
13281 ;
13282 ;.REALT AC,     SKIPS ONLY IF REAL TIME FACILITY REQUESTED AND SEIZED
13283 ;AC=    4.9=>TURN OFF OLD CLOCK RATE, FLUSHING REAL TIME FACILITY AND
13284 ;                REMAINDER OF CURRENT TICK AND ZEROING TICK COUNT
13285 ;       4.8=>TURN ON NEW CLOCK RATE
13286 ;       4.7=>TRY TO SEIZE REAL TIME USER FACILITY
13287 ;       4.6=>DON'T SETTLE FOR PSEUDO-REAL TIME STATUS
13288 ;       4.5 =>ONLY WANT PSEUDO
13289 ;       4.4=>PROGRAM TO BE BLOCKED EXCEPT FOR HIGH PRIORITY PHASE OR INT. LEVEL
13290 ;       4.3=>READ INTO WD3+4 AS DESCRIBED BELOW (BEFORE ANY OTHER BITS INTERPRETED)
13291 ;       3.1-4.2=RESERVED FOR EXPANSION, SHOULD BE ZERO
13292 ;       1.1-2.9=RH=POINTER TO 4 WORD BLOCK
13293 ;       WD1=FRAME TIME IN 60'THS (MUST BE <2**18.)
13294 ;       WD2=PRIORITY TIME IN 60'THS (MUST BE <7 AND <WD1/2)
13295 ;       WD3= IF 4.3 ON, SET RH TO FRAME TIME, LH TO TICKS SINCE EXAMINED
13296 ;       WD4= IF 4.3 ON, SET RH TO HIGH PRIORITY TIME, LH TO 0 IF CURRENTLY LOW
13297                 ;PRIORITY OR -1 IF CURRENTLY HIGH PRIORITY
13298 ;
13299 AREALT: UMOVE A,(J)
13300         TLNN A,4000
13301         JRST AREAL1
13302         CONO PI,CLKOFF
13303         MOVE T,UTIME(U)
13304         MOVE Q,URTIME(U)
13305         CONO PI,CLKON
13306         UMOVEM T,2(A)
13307         UMOVEM Q,3(A)
13308 AREAL1: TLNN A,700000
13309         POPJ P,
13310         HRRZ T,UREALT
13311         CAMN T,U
13312         SETOM UREALT
13313         SETZM URTIME(U)
13314         TLNN A,400000
13315         JRST AREAL2
13316         PUSHJ P,CLQDEL  ;TURN OFF OLD INTS
13317         UCLBLK(U)
13318         SETZM UTIME(U)  ;ZERO TICK COUNT
13319 AREAL2: TLNN A,200000
13320         JRST AREAL4
13321         XCTR XR,[SKIPG T,(A)]
13322         JRST ILUUO
13323         HRRM T,UTIME(U)
13324 AREAL4: TLNN A,100000
13325         JRST AREAL6
13326         XCTR XR,[SKIPLE T,1(A)]
13327         CAIL T,13.
13328         JRST ILUUO
13329         HRRZ B,UTIME(U)
13330         LSH B,-1
13331         CAMLE T,B
13332         JRST ILUUO
13333         HRROS T
13334         TLNE A,10000
13335         TLZ T,1
13336         MOVEM T,URTIME(U)
13337         TLNE A,20000
13338         JRST AREAL6
13339         CONO PI,CLKOFF
13340         SKIPGE UREALT
13341         JRST AREAL7
13342         TLNE A,40000
13343         SETZM URTIME(U)
13344         JRST AREAL5
13345 AREAL7: MOVEM U,UREALT
13346         AOS (P)
13347 AREAL5: CONO PI,CLKON
13348 AREAL6: SKIPN T,UTIME(U)
13349         POPJ P,
13350         SKIPE B,URTIME(U)
13351         MOVE T,B
13352         HRRZS T
13353         PUSHJ P,CLQADD
13354         UCLBLK(U)
13355         POPJ P,
13356
13357
13358 ;CLOCK LEVEL ROUTINE
13359 UREALB: SUBI U,UCLBLK   ;SET INDEX TO QUEUE BLOCK
13360         SKIPE B,URTIME(U)
13361         JRST URLTB2
13362 URLTB1: MOVSI T,(%PIRLT)
13363         IORM T,PIRQC(U)
13364         MOVSI T,1
13365         ADDM T,UTIME(U)
13366         HRRZ T,UTIME(U)
13367         SKIPGE B
13368         HRRZ T,B
13369 URLTBX: SETZM SCHFLG    ;CAUSE SCHEDULE THIS CLOCK BREAK
13370         MOVEI C,UCLBLK(U)
13371         JRST CLQREE
13372
13373 URLTB2: TLC B,-1
13374         MOVEM B,URTIME(U)
13375         MOVSI T,1
13376         HRRZ C,UREALT
13377         JUMPGE B,URLTB4
13378         CAMN C,U
13379         HRRZS UREALT
13380         JRST URLTB1
13381
13382 URLTB4: CAMN C,U
13383         IORM T,UREALT
13384         HRRZ T,UTIME(U)
13385         HRRZS B
13386         SUB T,B
13387         JUMPG T,URLTBX
13388         BUG
13389 \f
13390 SUBTTL MISCELLANEOUS SYSTEM CALLS
13391
13392 $INSRT TIME             ;ROUTINES HAVING TO DO WITH CLOCKS AND THINGS
13393
13394 ;
13395 ;.CLOSE CH,     ;CLOSE ANY I/O TRANSACTION OPEN ON CHANNEL CH
13396 ;
13397 CCLOSE: HRREI C,-IOCHNM(R)      ;CLOSE CALLED INTERNALLY
13398         SUB C,U
13399         TRNE C,-NIOCHN
13400          BUG            ;R WAS NOT AN IOCHNM WORD ADDRESS.
13401         HRRZM C,UUAC(U) ;SOME CLOSE ROUTINES LOOK AT UUAC
13402         JRST ACLOSE
13403
13404 NCLOSE: AOS (P)
13405 ACLOSE: HLRZ A,(R)      ;SET UP A WITH L.H. OF I/O CH WORD
13406         HRRZ B,(R)      ;SET UP B WITH R.H. "
13407         MOVE C,CLSTB(B) ;GET CLOSE TABLE ENTRY
13408         TLNE C,%CLSNRM  ;SKIP IF NOT STANDARD CLOSE
13409          JRST STDCLS    ;JUMP TO STANDARD CLOSE
13410         PUSH P,R        ;SAVE R
13411         PUSHJ P,(C)     ;CALL CLOSE ROUTINE
13412         POP P,R         ;RESTORE R
13413 STDCLX: SETZM (R)       ;CLEAR I/O CHANNEL WORD
13414         SETZM IOCHST-IOCHNM(R)  ;CLEAR I/O CHNL STATUS WORD
13415         POPJ P,
13416
13417 STDCLS: CONO PI,CLKOFF  ;INHIBIT CLOCK BREAKS
13418         SOSGE 1(C)      ;DECREMENT USE COUNTER, SKIP IF STILL IN USE AT LEAST ONCE
13419          SETOM (C)      ;NO LONGER IN USER, FREE BY SETOM'ING "XXXUSR" VARIABLE
13420         CONO PI,CLKON   ;ENABLE CLOCK BREAKS
13421         JRST STDCLX
13422
13423 AVALRET:UMOVE A,(B)     ;CALL 4,
13424         MOVEM A,VALUE(U)
13425         MOVEI T,%PIVAL
13426         JRST ILLOP4
13427
13428 AUTRAN: UMOVE C,(B)
13429         HRR C,U
13430         CONO PI,CLKOFF          ;Don't let USRHI change or anything like that
13431         MOVE A,USRHI
13432 UTRNL:  SUBI A,LUBLK
13433         JUMPL A,CLKONJ
13434         SKIPE D,UNAME(A)
13435          CAME C,SUPPRO(A)
13436           JRST UTRNL
13437         MOVE E,JNAME(A)
13438         CONO PI,CLKON
13439         UMOVEM D,1(B)
13440         UMOVEM E,2(B)
13441         JRST POPJ1
13442
13443 ;RETURN WITH LOSER IN A IN LOSER MODE AND CLOCK OFF
13444 ;
13445 RPCCK:  PUSHJ P,RPCLSR  ;STOP USER (ALSO PUTS HIM IN USER MODE)
13446         CONO PI,CLKOFF  ;TURN OFF CLOCK
13447         JRST UPCLSR     ;"RESTART USER" (HE CAN'T RUN TILL CLOCK BACK ON)
13448 \f
13449 ;.LOSE X <=> .CALL [SETZ ? SIXBIT/LOSE/ ? 401000,,X ]
13450
13451 ;.CALL LOSE
13452 ;       USED TO REPORT LOSSAGE TO SUPERIOR PROCEDURE
13453 ;ARG 1 - LOSING INSTRUCTION ADDR,,LOSSAGE CODE (CODES DEFINED BY DDT)
13454 ;ARG 2 - NEW PC (DEFAULT = PC-2 SO CAN USE AS A NON-SKIP-RETURN HANDLER)
13455 ;CTL 1.1 - DEFAULT ARG 2 TO PC INSTEAD OF PC-2
13456 ;CTL 1.2 - SETZM @.40ADDR
13457 ;CTL 1.3 - DON'T USE THE NEW PC AS THE LOSING INSTRUCTION ADDR
13458
13459 ALOSE:  HRRZ A,FORTY            ;ARG 1 = EFF ADDR OF UUO
13460         MOVEI W,1
13461         TDZA T,T
13462 NLOSE:   MOVE T,CTLBTS(U)
13463         MOVE D,40ADDR(U)
13464         TRNE T,2
13465          XCTR XRW,[MOVES (D)]
13466         TLZ B,BADPC             ;COMPUTE NEW PC FROM ARG 2 OR UUOH
13467         SKIPGE IOTLSR(U)
13468          TLO B,%PCUIO
13469         TLO B,%PCUSR
13470         MOVE C,UUOH
13471         TRNN T,1
13472          HRRI C,-2(C)
13473         CAIGE W,2
13474          MOVE B,C
13475         TRNN T,4
13476          HRL A,B
13477         HRRI B,1(B)             ;PCLSR'ING WILL SOS
13478         MOVEM A,VALUE(U)        ;PASS TO SUPERIOR
13479         MOVEM B,UUOH
13480         TRNE T,2
13481          XCTR XW,[SETZM (D)]
13482         MOVSI T,%PJLOS
13483         JRST UUOERR
13484 \f
13485 AUCLOSE:
13486 IFN PDP6P,[
13487         MOVE A,(R)      ;OPER 10
13488         MOVE A,CLSTB(A)
13489         TLNE A,%CLS6
13490          JRST PDPUCL
13491 ]
13492         PUSHJ P,AUCL2
13493          POPJ P,
13494         PUSHJ P,1USTOP
13495         MOVEM A,SRN3(U)
13496         PUSHJ P,LOSSET
13497            AUCL4
13498         PUSHJ P,AUCL3   ;STOP JOB, AND WAIT TILL SAFE TO KILL IT
13499                         ;(TURNS CLOCK ON)
13500         EXCH U,A
13501         PUSH P,A
13502         HLLZ T,SUPPRO(U)
13503         PUSH P,T
13504         PUSH P,R
13505         PUSHJ P,UBLAST
13506         POP P,R
13507         PUSHJ P,ZUSLOG  ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
13508         CONO PI,CLKON
13509         POP P,T
13510         POP P,U
13511         ANDCAM T,IFPIR(U)
13512         JRST LSWDEL
13513
13514 AUCL4:  HRRZ A,SRN3(U)
13515         MOVSI T,BULGOS
13516         ANDCAM T,APRC(A)
13517         POPJ P,
13518
13519 AUCL2:  HLRZ A,(R)      ;GUY BEING CLOSED
13520         HRRZ B,(R)
13521         LDB TT,[.BP (%CLSFU),CLSTB(B)]
13522         JUMPN TT,OPNL31 ;FOREIGN JOB => .UCLOSE ISCAN'T MODIFY JOB
13523         SKIPL CLSTB(B)  .SEE %CLSU
13524          JRST OPNL34    ;NOT A JOB AT ALL?
13525         CONO PI,CLKOFF
13526         MOVE TT,TTYTBL(U)
13527         JUMPGE TT,AUCL1 ;HAVE TTY NOW
13528         TLNN TT,%TBDTY  ;NOT GIVING IT AWAY.
13529          CAIE A,(TT)    ;SKIP IF GAVE IT TO GUY WE'RE KILLING
13530           JRST AUCL1
13531         PUSHJ P,SDTTY   ;TAKE IT BACK FROM HIM.
13532          JFCL
13533 AUCL1:  HLRZ A,(R)
13534         JRST POPJ1
13535 \f
13536 ;DISMIS SYSTEM CALL. 1ST ARG INT PDL PTR (WILL BE DECREMENTED
13537 ;IF NOT AN IMMEDIATE ARG)
13538 ;2ND ARG OPTIONAL PC TO DISMIS TO (OVERRIDES THAT IN INT PDL)
13539 ;3RD ARG OPTIONAL NEW .DF1 VALUE       "       "    "     "
13540 ;4TH ARG OPTIONAL NEW .DF2 VALUE ...
13541 ;5TH ARG OPTIONAL ERROR CODE AS IN LOSE.  IF PRESENT WILL LOSE RIGHT AFTER DISMISSING.
13542 ;IF 4 ARGS GIVEN, 1ST IGNORED EXCEPT FOR POSSIBLY DECREMENTING, OR POPPING OF ACS.
13543 ;CTL BITS (SAME FORMAT AS LH OF 1ST WORD OF INTERRUPT DISPATCH TABLE)
13544 ;SPECIFY POPPING OF SAME EXTRA INFO THAT INTERRUPTS CAN PUSH.
13545
13546 NDISMIS:CAIL W,5
13547          MOVEM E,VALUE(U)
13548         MOVE E,A        ;GET IN E THE INT PDL PTR.
13549         TLNN E,1000     ;IF 1ST ARG IMMEDIATE, IT IS PTR,
13550          UMOVE E,(A) ;ELSE IT PTS TO PTR.
13551         MOVE H,E        ;SAVE UNPOPPED PDL POINTER FOR PDL OV CHECKING.
13552         TLNE A,1000     ;IF PDL PTR ISN'T IMMEDIATE, POP IT ACC. TO CTL BITS.
13553          JRST NDISM2
13554         MOVE T,CTLBTS(U)
13555         TRNE T,400000
13556          SUB E,[3,,3]   ;POP OFF DEBUGGING INFO IF IT WAS PUSHED.
13557         LDB TT,[000500,,T]
13558         JUMPE TT,NDISM2 ;IF ACS WERE PUSHED, POP THEM TOO.
13559         HRLS TT
13560         SUB E,TT        ;DECREMENT THE PDL POINTER ENOUGH
13561         LDB I,[060500,,T]
13562         HRLI I,1(E)     ;AND COPY FROM THE PDL TO THE ACS.
13563         ADDI TT,-1(I)
13564         XCTR XBRW,[BLT I,(TT)]
13565 NDISM2: CAIGE W,2       ;IF NO 2ND ARG, GET PC FROM INT PDL
13566          UMOVE B,(E)
13567         CAIGE W,3       ;IF NO 3RD ARG, GET .DF1 FROM INT PDL
13568          UMOVE C,-2(E)
13569         CAIGE W,4       ;IF NO 4TH ARG GET .DF2 FROM INT PDL
13570          UMOVE D,-1(E)
13571         TLNE A,1000     ;IF 1ST ARG NOT IMMED, DECREMENT IT
13572          JRST NDISM3
13573         SUB E,[5,,5]
13574         UMOVEM E,(A)
13575         JUMPGE E,NDISM3 ;AND CHECK FOR PDL OVFLO.
13576         SKIPL H
13577          PUSHJ P,NDISMP ;PDL OVFLO, SET INT BIT IF INT ENABLED.
13578 NDISM3: MOVEM C,IDF1(U) ;RESTORE THE PC, .DF1, .DF2
13579         MOVEM D,IDF2(U)
13580         MOVSI T,%PJLOS
13581         CAIL W,5
13582          IORM T,PIRQC(U)
13583         JRST NDISM1
13584
13585 NDISMP: MOVEI TT,%PIPDL ;PDL OV INT BIT.
13586         TDNE TT,MSKST(U)
13587          IORM TT,PIRQC(U)
13588         POPJ P,
13589 \f
13590 ;OLD-STYLE DISMISS JOINS HERE
13591 ADISMIS:UMOVE B,(B)     ;CALL 1,
13592 NDISM1: TLO B,%PCUSR
13593         TLZ B,BADPC
13594         SKIPGE IOTLSR(U)
13595          TLO B,%PCUIO
13596 IFN KL10P,[
13597         SETCM A,UUOH            ;IF ONE-PROCEEDING THE .DISMISS
13598         TLNN A,%PS1PR-%PSINH
13599          TLO B,%PS1PR-%PSINH    ;TRAP IMMEDIATELY AT THE NEW PC
13600 ]
13601         MOVEM B,UUOH
13602         SETOM PICLR(U)
13603
13604 ;CHECK FOR PENDING INTERRUPTS AND TAKE THEM RIGHT AWAY
13605 APISE1:
13606 IFN PDP6P,[
13607         CAMN U,PDPISR
13608          CONO DSDEV,DSDCHN      ;ENABLE INTERRUPT FROM 6
13609 ]
13610         MOVE A,U
13611         PUSHJ P,APISE6  ;SEE IF ANY DEVICES WANT TO RE-INTERRUPT.
13612         MOVEI C,%PIARO
13613         ANDCAB C,PIRQC(U)
13614         SETCM D,MSKST(U)
13615         IOR D,IDF1(U)   ;FIND ALL DISABLED OR DEFERRED
13616         SKIPN PICLR(U)  ;(ALL ARE DEFERRED WHEN PI IS OFF).
13617          SETO D,
13618         AND D,[BADBTS]  ;BAD
13619         TDNE C,D        ;PENDING INTERRUPTS
13620          JRST ADISM7    ;IF THERE ARE ANY, LET THEM HAPPEN.
13621         AND C,MSKST(U)
13622         ANDCM C,IDF1(U)
13623         JUMPN C,ADISM7  ;1ST WD INT. PENDING.
13624         MOVE C,IFPIR(U)
13625         AND C,MSKST2(U)
13626         ANDCM C,IDF2(U)
13627         JUMPE C,CPOPJ   ;JUMP IF NO 2ND WORD INT PENDING.
13628 ADISM7: MOVE C,[JRST ONEFLS]
13629         MOVEM C,UEXIT
13630         POPJ P,
13631 \f
13632 APISE6: MOVE D,MSKST(A) ;IF INTERRUPT FROM CONSOLE ENDBLED,
13633         TRNN D,%PITYI
13634          JRST APISE7
13635         SKIPL T,TTYTBL(A) ;IF THIS JOB HAS ITS CONSOLE
13636         SKIPN TINTC(T)  ;AND THE CONSOLE HAS INT. CHARS,
13637          JRST APISE7
13638         MOVEI D,%PITYI  ;GENERATE AN INTERRUPT.
13639         IORM D,PIRQC(A)
13640 APISE7: MOVE D,MSKST2(A) ;LOOK AT HIS ENABLED IO CHANNELS.
13641         ANDI D,177777
13642 APISE0: JFFO D,APISE9   ;CHECK EACH ONE.
13643         JRST APISE8     ;ALL CHECKED.
13644
13645 APISE9: MOVNS E         ;CHECK ONE IO CHNL THAT'S ENABLED TO INT.
13646         ANDCM D,CHNBIT+35.(E) ;MARK THIS CHNL AS HANDLED.
13647         ADDI E,35.+IOCHNM(A)  ;GET ADDR OF IOCHNM WD FOR CHANNEL.
13648         HRRZ T,(E)      ;IS IT A TTY INPUT CHANNEL?
13649         CAIL T,TYIDN
13650         CAILE T,TYIBN
13651          JRST APISE2
13652         LDB T,[$TIIDX,,(E)] ;YES, GET THE TTY NUMBER.
13653         HRRZ C,TTYSTS(T)
13654         CAIE T,%TINON   ;IF IT ISN'T A DISOWNED TY CHANNEL,
13655         CAIE C,(A)      ;AND THE TTY BELONGS TO THIS JOB,
13656          JRST APISE0
13657         SKIPN TINTC(T)  ;AND IT HAS AN INT. CHAR WAITING,
13658          JRST APISE0
13659         MOVE C,TYIMSK(T)
13660 APISE4: AND C,MSKST2(A) ;GIVE AN INT. ON ONE OF THE CHANNELS IT'S OPEN ON.
13661         MOVN T,C
13662         AND C,T
13663         IORM C,IFPIR(A)
13664         JRST APISE0
13665
13666 APISE2: CAIN T,STYDUI   ;NOT A TTY CHNL. IS IT A STY CHNL?
13667          JRST APISE3
13668         CAIE T,STYDBI
13669          JRST APISE0
13670 APISE3: LDB T,[$TIIDX,,(E)]     ;YES, GET TTY #.
13671         SKIPL C,STYSTS-NFSTTY(T) ;STY IN USE BY THIS JOB?
13672         CAIE C,(A)
13673          JRST APISE0
13674         SKIPGE TTYOAC(T)        ;TTY OUTPUT PENDING?
13675          JRST APISE0
13676         MOVE C,STYMSK-NFSTTY(T) ;YES, INT. ON ONE CHANNEL.
13677         JRST APISE4
13678
13679 APISE8:
13680 IFN STKP,[
13681         SKIPL C,STKUSR
13682         CAIE C,(A)
13683          POPJ P,
13684         HRRZ C,STKMSK
13685         AND C,MSKST2(A)
13686         SKIPLE STKBC
13687         IORM C,IFPIR(A)
13688 ]
13689         POPJ P,
13690 \f
13691 ;.SLEEP AC,     ;IF C(AC) + OR ZERO:    ;BECOME DORMANT FOR C(AC) 1/30'THS OF A SEC
13692                 ;IF C(AC) -:    ;BECOME DORMANT TILL MAGNITUDE OF C(AC) > C(TIME)
13693 ASLEEP: XCTR XR,[MOVN T,(J)]    ;PICK UP NEGATIVE OF C(AC)
13694         JUMPGE T,ASLP1  ;JUMP IF C(AC) WAS NEG
13695         SUB T,TIME      ;COMPUTE NEG OF TIME SLEEP SHOULD RUN OUT
13696         UMOVEM T,(J)    ;STORE BACK SO YOU WILL WIN IF PCLSR'ED OUT
13697 ASLP1:  MOVMS A,T               ;MAKE POSITIVE
13698         SUBI A,60.*30.          ;IF SLEEPING FOR MORE THAN A MINUTE
13699         MOVSI B,%SWDSO
13700         CAMLE A,TIME
13701         IORM B,USWST(U)         ;PUT RIP VAN WINKLE ON ICE
13702         PCLT
13703         JRST ASLP2              ;ALWAYS GO TO UFLS AT LEAST ONCE
13704
13705         CAMLE T,TIME    ;HANG TILL C(T) LESS THAN C(TIME)
13706 ASLP2:  PUSHJ P,UFLS
13707         XCTR XW,[SETZM (J)]     ;CLEAR OUT ARG (FOR COMPATIBILITY WITH WHEN AC WAS COUNTED OUT)
13708         JRST CLKONJ     ;MAKE SURE CLKCHN ON IN CASE SLEEP WAS 0 & SKIPPED UFLS ENTIRELY
13709
13710 ;RELOAD CALL - IGNORE ARGS
13711 ;MUST BE FROM TOP LEVEL NON-DISOWNED JOB
13712 ;RELOADS AND STARTS SYS: ATSIGN WHATEVER
13713
13714 NRELOAD:SKIPGE SUPPRO(U)
13715         SKIPGE APRC(U)
13716          JRST OPNL40            ;NOT TOP LEVEL
13717         CONO PI,CLKOFF
13718         PUSHJ P,LOGUPD          ;LOG OUT
13719         PUSHJ P,DMNPLI          ;AND IN AGAIN
13720         PUSHJ P,USRST2          ;RESET USER VARS
13721         CONO PI,CLKON
13722         SETZM @UTMPTR(U)        ;TEMPORARY HIGH PRIORITY
13723         JRST USTCDR             ;LOAD FILE AND START IT
13724
13725 AMASTER:UMOVE J,(J)
13726         CONO PI,CLKOFF  ;OPER 61
13727         SKIPL A,UMASTER
13728          JRST AMAST2
13729         SKIPGE J
13730 AMAST1:  HRRZM U,UMASTER
13731         JRST CLKOJ1
13732
13733 AMAST2: CAME U,A
13734          JRST AMAST3
13735         SKIPL J
13736          SETOM UMASTER
13737         JRST CLKOJ1
13738
13739 AMAST3: JUMPGE J,CLKOJ1
13740         SKIPGE TTYTBL(U)
13741          JRST CLKONJ    ;LOSEY
13742         PUSHJ P,RPCCK
13743         CAME A,UMASTER
13744          JRST AMASTER
13745         JRST AMAST1
13746 \f
13747 ;.CALL SSERVE - Set .SERVER variable without timing screw.
13748 ; ARG1: <job>, the client whose .SERVER variable is to be munged
13749 ; ARG2: <job>, the server to be stored in the variable
13750 ; If one arg is given, it is the server and the client defaults to %JSELF
13751 NSSERVER:
13752         MOVE J,A
13753         CAIL W,2
13754          SKIPA A,B
13755           MOVEI J,%JSELF
13756         JSP T,NCORUI            ; Decode client and AOS his DIELOK
13757          JRST NSSRV1            ; OK to write
13758         JSP T,NCORWR            ; Check further
13759          JRST OPNL31            ; CAN'T MODIFY JOB
13760 NSSRV1:
13761 IFN PDP6P,[
13762         CAIN J,-1               ; PDP6?
13763          JRST OPNL34            ; WRONG TYPE DEVICE
13764 ];PDP6P
13765         EXCH J,A                ; A: client  J: server
13766         JSP T,NCORUI            ; Decode server and AOS his DIELOK
13767          JFCL                   ; Don't give a damn about writability
13768 IFN PDP6P,[
13769         CAIN J,-1               ; PDP6?
13770          JRST OPNL34            ; WRONG TYPE DEVICE
13771 ];PDP6P
13772         MOVEM J,SERVER(A)       ; Safe to set it now
13773         PUSHJ P,LSWPOP          ; Server's DIELOK
13774         JRST LSWPJ1             ; Client's DIELOK
13775
13776 \f
13777         SUBTTL LOGIN/ATTACH/DETACH/DISOWN CODE
13778
13779 ;SYMBOLIC CALL LOGIN:  LOG A TREE IN.  MUST BE GIVEN BY TOP-LEVEL NON-LOGGED-IN JOB
13780 ;WITH NO INFERIORS.
13781 ;ARG 1 - DESIRED UNAME
13782 ;ARG 2 - "TERMINAL NAME", PUT IN TRMNAM USER VARIABLE AND PRINTED AS SIXBIT ON SYSCON.
13783 ;ARG 3 - DESIRED XUNAME, FOR DEMON TO KNOW WHO TO ACCOUNT.
13784
13785 NLOGIN: HLRE T,UNAME(U) 
13786         AOJN T,OPNL31   ;JUMP ON ALREADY LOGGED IN
13787         SKIPL SUPPRO(U)
13788          JRST OPNL40    ;CAN'T LOG IN IF NOT TOP LEVEL
13789         JUMPE A,OPNL11
13790         HLRE T,A
13791         AOJE T,OPNL11           ;BAD NAME
13792         CAIGE W,3
13793          MOVE C,A       ;IF XUNAME (ARG 3) MISSING, DEFAULT TO UNAME.
13794         MOVEI D,0
13795         CONO PI,CLKOFF
13796 ALOG2:  SKIPN UNAME(D)
13797          JRST ALOG4
13798         MOVE T,JNAME(D)
13799         CAMN T,JNAME(U)
13800          CAME A,UNAME(D)
13801           JRST ALOG3
13802         JRST OPNL13     ;CONSOLE CONTROLLED TREE ALREADY LOGGED IN THAT NAME
13803
13804 ALOG3:  HRRZ T,SUPPRO(D)
13805         CAMN T,U        ;CAN'T LOGIN IF HAVE INFERIOR.  RESTRICTION IMPOSED HERE
13806          JRST OPNL12    ;SINCE WE NO CODE HERE TO SET INFERIOR'S UNAME.
13807 ALOG4:  ADDI D,LUBLK
13808         CAMGE D,USRHI
13809          JRST ALOG2     ;LOOP FOR ALL SETS OF PROCEDURE VARIABLES
13810         HRRZ T,TTYTBL(U)
13811         HRLI T,[ASCIZ / LOGIN  /]
13812         PUSHJ P,SGWAIT          ;ASK THE SYSTEM JOB TO PRINT OUT THE RELEVANT INFO
13813         SKIPL TTYTBL(U)         ;SKIP IF NOT CONSOLE CONTROLLED
13814          AOS SUSRS              ;INCREMENT COUNT OF LOGGED IN CONSOLE CONTROLLED TREES
13815         MOVEM A,UNAME(U)        ;SET UNAME TO WHAT LOGGED IN AS
13816         MOVEM A,SLGIV
13817         MOVEM A,USYSNM(U)       ;SET SNAME "
13818         MOVEM A,HSNAME(U)       ;SET HOME SNAME "
13819         MOVEM C,XUNAME(U)       ;SET XUNAME " " (USER MAY MUNG LATER)
13820         MOVEM B,TRMNAM(U)
13821         MOVEM B,SLGIV+2         ;INCLUDE TRMNAM AS SECOND NAME PRINTED
13822         PUSHJ P,DMNPLI          ;GIVE INFO TO DEMON
13823         JRST CLKOJ1             ;TURN CLK ON AND SKIP RETURN
13824
13825 ASETM2: UMOVE A,1(J)    ;.OPER 5
13826         MOVEM A,MSKST2(U)
13827 ASETMSK:        UMOVE D,(J)     ;OPER 4
13828         MOVE A,U
13829         MOVEI I,1
13830         SOS (P)         ;WILL SKIP RETURN
13831         JRST USMASK     ;ACT LIKE .SUSET.
13832
13833 ARSYSI: SKIPA A,[ITSVRS]        ;OPER 52
13834 ARDTIME:MOVE A,TIME             ;OPER 17
13835         JRST APTUAJ
13836
13837 IFE KS10P,[     ; On the KS10 they made DATAI 0, a UUO!
13838 ARDSW:  DATAI A                 ;OPER 20
13839         JRST APTUAJ
13840 ] ;IFE KS10P
13841 IFN KS10P, ARDSW==:ILUUO
13842
13843 ASUPSET:MOVEI C,003777  ;OPER 53
13844         XCTR XR,[AND C,(J)]
13845         MOVE D,SUPCOR   ;SAVE OLD CONTENTS
13846         XORB C,SUPCOR
13847         UMOVEM C,(J)
13848         HRROI A,SUPCOR
13849         JRST ASPST2
13850 \f
13851 ;       .CALL DET
13852 ;       ERROR RETURN
13853 ;       NORMAL RETURN
13854
13855 ;DET:   SETZ
13856 ;       SIXBIT /DETACH/
13857 ;       SETZ [<JOB SPEC>]       ;SEE NCORUI
13858
13859 ;DISOWN JOB'S ENTIRE TREE AND FREE CONSOLE.  IF TREE HAS NO
13860 ;CONSOLE, JUST MAKES IT DISOWNED.  NO ARG => THIS JOB'S TREE
13861 ;ALWAYS SKIPS IF THE JOB SPEC IS REASONABLE.
13862
13863 ;CTL BIT 1.1 => DON'T SET SIGN OF APRC (DON'T MAKE TREE "DISOWNED").
13864 ;CTL BIT 1.2 => USE SYSTEM TREE'S RESOURCE WORD
13865 ;CTL BIT 1.4 => KILL TREE AN HOUR FROM NOW IF IT ISN'T REOWNED
13866 ;CTL BIT 1.5 => SUPPRESS THE CONSOLE-FREE MESSAGE ON THE TTY
13867
13868 NDETAC: HLRZ B,A        ;XOR LH OF 1ST ARG INTO CTL BITS
13869         XORM B,CTLBTS(U)
13870         PUSHJ P,SWTL    ;MAKE SURE NOBODY ELSE IS REARRANGING TREES.
13871             TREESW
13872         MOVEI J,(U)     ;DEFAULT TO OUR TREE
13873         JUMPE W,NDETA0  ;JUMP IF NO ARGS SUPPLIED
13874         MOVE J,A        ;JOB SPEC
13875         JSP T,NCORUI    ;DECODE ARG, GET USER INDEX IN J
13876          JFCL           ;IGNORE INFO ON WRITEABILITY
13877         CAIG J,LUBLK    ;DONT DETACH SYSJOB OR CORE JOB
13878          JRST OPNL31
13879 NDETA0: SKIPL T,SUPPRO(J)       ;FIND TOP LEVEL JOB OF TREE (IN J)
13880          JRST [ MOVE J,T 
13881                 JRST NDETA0 ]
13882         HRRZ A,J        ;TOP OF TREE
13883         SKIPGE APRC(A)
13884          JRST LSWCJ1    ;TREE IS ALREADY DISOWNED.
13885         MOVEI Q,NDETA8
13886         PUSHJ P,IFPLUP  ;STOP ALL BUT THIS JOB
13887         PUSHJ P,NDETA7  ;DO THE WORK
13888         JRST LSWCJ1     ;UNSTOP THE TREE
13889
13890 NDETA7: PUSH P,U        ;US
13891         PUSH P,A        ;TOP LEVEL
13892         MOVEI U,(A)
13893         CONO PI,CLKOFF
13894         PUSHJ P,LOGUPD  ;FOR ACCOUNTING PURPOSES, THIS IS LIKE A LOGOUT
13895         CONO PI,CLKON
13896 NDETA1: MOVEI U,(A)     ;GET IN U USER INDEX OF OWNER OF TTY
13897         MOVE A,TTYTBL(U)        ;GET IN A TTY NUMBER
13898         TLNE A,%TBDTY   ;TREE HAS NO TTY =>
13899          JRST [ POP P,A ;JUST MAKE IT DISOWNED.
13900                 POP P,U
13901                 JRST NDETA5 ]
13902         JUMPL A,NDETA1  ;GAVE TTY AWAY
13903         MOVE T,(P)              ;TOP-LEVEL JOB OF TREE SAVES USER TTY OPTIONS IN
13904         MOVE B,TTYOPT(A)        ;HIS STTYOP VARIABLE
13905         AND B,[%TOUSR,,%TPUSR]
13906         MOVEM B,STTYOP(T)
13907         LDB B,[.BP (%TCRFS+%TCQRY),TTYCOM(A)]
13908         IORI B,4                ;MAKE STTYOP NON-ZERO TO SHOW IT WAS STORED
13909         DPB B,[170300,,STTYOP(T)]       ;OVERLAPS PADLF FIELD
13910         HRRZS A
13911         PUSH P,TTYSTS(A)        ;SAVE THIS TTY INFO
13912         PUSH P,TTYST1(A)        ;WILL PUT INTO TTY OWNER'S USER VARS
13913         PUSH P,TTYST2(A)        ;AFTER SUCCEED IN FREEING THE TTY
13914         MOVE B,A
13915         IMULI B,TPLEN*2
13916         MOVN B,TPVB+TPLEN(B)
13917         ADD B,TCMXV(A)
13918         PUSH P,B
13919         MOVSI B,%TCDET  ;IF TREE DETACHED DUE TO TOP LVL INT,
13920         SKIPN USER      ;THE CONSOLE FREE MESSAGE SHOULD SAY SO.
13921          IORM B,TTYCOM(A)       .SEE SYSCFM
13922                         ;THIS ALSO HAPPENS IF DIALUP LINE HUNG UP, OS'ERS BEWARE!
13923 ;DROPS THROUGH
13924 \f;DROPS IN
13925 IFN N11TYS,[
13926         CONO PI,CLKOFF
13927         PUSHJ P,TVBNCL  ;CLEAR VIDEO BUFFER #
13928         CONO PI,CLKON
13929 ];N11TYS
13930         MOVE B,-5(P)    ;GET BACK IDX OF RUNNING JOB
13931         MOVE B,CTLBTS(B)
13932         MOVSI T,%TACFM
13933         TRNE B,20       ;CTL BIT 1.5 => MARK THE TTY AS NOT NEEDING CNSL FREE MSG.
13934          IORM T,TTYSTA(A)
13935         PUSHJ P,TTYLO1  ;NOW MAKE CONSOLE FREE.
13936         POP P,B         ;CAN'T PCLSR AFTER THIS POINT
13937         DPB B,[$TBECL,,TTYTBL(U)]
13938         POP P,TTSTSV+1(U)       ;STORE INTO TTY'S OLD OWNER
13939         POP P,TTSTSV(U) ;OLD TTY VARS FROM BEFORE FREEING IT
13940         POP P,B
13941         MOVEM B,TTSTSV+2(U)
13942         SKIPA A,(P)     ;TOP LEVEL JOB
13943 NDETAA:  HRRZ A,T
13944         SKIPGE T,TTYTBL(A)      ;SKIP IF HE HAS IT
13945          JRST NDETAA    ;NOW DO GUY HE GAVE IT TO
13946         CAIE A,(U)
13947          BUG            ;BUT.  BUT.  BUT.
13948         MOVSI B,%TBNOT+%TBDTY   ;TAKEN FROM --ME-- AND DOESN'T HAVE IT
13949         IORM B,TTYTBL(A)
13950         HLLZS TTYTBL(A)
13951         POP P,A         ;TOP LEVEL
13952         POP P,U         ;US
13953         HLRO B,UNAME(A)
13954         AOSE B          ;IF DETACHED TREE WAS LOGGED IN
13955          SOS SUSRS      ;ONE LESS CONSOLE CONTROLLED TREE
13956 NDETA5: MOVSI B,BUMRTL  ;IF REQUESTED, MARK TREE AS DUE TO DIE
13957         MOVE D,CTLBTS(U) ;IN AN HOUR.
13958         ANDCAM B,APRC(A)
13959         TRNE D,10
13960          IORM B,APRC(A)
13961         CONO PI,CLKOFF  ;PERFORM ACCOUNTING FOR THIS USER AS IF HE WERE LOGGING OUT.
13962         EXCH U,A
13963         PUSHJ P,LOGUPD
13964         EXCH U,A
13965         MOVE D,JNAME(A) ;IF TOP LEVEL JOB ...
13966         CAME D,[SIXBIT /HACTRN/]        ;IS A HACTRN,
13967          JRST NDETA3
13968 NDETA2: AOS D           ;AOS ITS NAME LEVEL UNTIL ...
13969         PUSHJ P,UJNAMU  ;IT IS UNIQUE
13970          JRST NDETA2    ;(UJNAMU TURNS OFF CLOCK)
13971         MOVEM D,JNAME(A)
13972 NDETA3: EXCH U,A
13973         PUSHJ P,DMNPLI  ;LOG BACK IN, NAME MAY HAVE CHANGED FROM HACTRN TO HACTRO
13974         EXCH U,A
13975         CONO PI,CLKON
13976         MOVEI Q,NDETA9  ;NOW SAY ALL JOBS IN TREE
13977         JRST IFPLUP     ;ARE DISOWNED
13978
13979 NDETA8: CAIE A,(U)      ;IF JOB ISN'T SELF, STOP IT
13980          JRST IFSTOP
13981         POPJ P,
13982 \f
13983 ;"ATTACH" SYSTEM CALL:
13984 ;1ST ARG - JOB SPEC -> OUR INFERIOR, OR TOP OF A DISOWNED TREE.
13985 ;2ND ARG - TTY SPEC (OF A TTY WHICH MUST BE FREE)
13986  ;2ND ARG ABSENT => USE OUR CONSOLE, AND GUN OUR TREE
13987 ;CONTROL BIT 400000 => CHANGE JOB'S NAME TO HACTRN (IF 2 ARGS)
13988 ;                 4 => START JOB AFTER ATTACHING (JUST LIKE DETACH)
13989
13990 ;CONNECTS THE SPECIFIED JOB TO THE SPECIFIED TTY, AS A CONSOLE CONTROLLED TREE.
13991 ;IF THE TTY IS OUR CONSOLE, WE ARE LOGGED OUT.
13992 ;IF THE JOB IS OUR INFERIOR, IT IS FIRST DISOWNED.
13993
13994 NATTAC: PUSHJ P,SWTL
13995             TREESW
13996         SOJE W,NATTAN
13997         EXCH A,B        ;2ND ARG => IT IS TTY SPEC, SO DECODE IT.
13998         JSP J,ATTYCI
13999         MOVE A,B
14000         MOVE B,I        ;AND PUT IT IN B.
14001         JRST NATTA6
14002
14003 NATTAN: SKIPL B,SUPPRO(U) ;NO 2ND ARG => WE MUST BE TOP LEVEL, SINCE WE'LL HAVE
14004          JRST OPNL40      ;TO LOG OUT. B GETS NEGATIVE.
14005 NATTA6: MOVE J,A
14006         JSP T,NCRUI2    ;DECODE 1ST ARG, GET USR IDX IN J.
14007          JFCL
14008         SKIPGE A,SUPPRO(J)
14009          JRST NATTA5    ;JOB SPEC'D MUST BE EITHER
14010         CAIE U,(A)      ;OUR INFERIOR, OR
14011          JRST OPNL31
14012         JRST NATTA7
14013
14014 NATTA5: SKIPL APRC(J)   ;THE TOP OF A DISOWNED TREE.
14015          JRST OPNL31
14016 ;NOW IF TTY IS OUR CONSOLE, B IS NEGATIVE; OTHERWISE, B HAS TTY #.
14017 NATTA7: PUSH P,CTLBTS(U)
14018         SETZM CTLBTS(U) ;DON'T GET FAKED OUT AT NATTA1, NATTA2, DSWNTY.
14019         PUSH P,J
14020         MOVE A,J
14021         MOVEI Q,NDETA8  ;STOP SPEC'D JOB AND ITS INFERIORS.
14022         PUSHJ P,IFPLUP
14023         JUMPL B,NATTAG
14024 NATTAM: CONO PI,TTYOFF
14025         SKIPL T,TTYSTA(B)       ;SEE IF TTY IS FREE
14026          JRST NATTAL
14027         MOVSI T,(SETZ)  ;IT IS, GRAB IT
14028         ANDCAM T,TTYSTA(B)      .SEE %TACFM
14029         ANDCAM T,TTYSTS(B)      .SEE %TSFRE
14030         CONO PI,TTYON
14031         JRST NATTA8     ;SINCE NO PCLSR POSSIBLE, DON'T BOTHER WITH A LOSSET OF THESE
14032
14033 NATTAL: HRRE Q,TTYSTS(B)
14034         CONO PI,TTYON
14035         SKIPG Q         ;IF TTY IS IN USE
14036         TLNE T,%TACTZ   ;OR BEING ^Z'ED, DEVICE NOT AVAIL
14037          JRST [ SUB P,[2,,2] ? JRST OPNL10 ]
14038         MOVSI T,%TACFM+%TACTZ   ;OTHERWISE JUST WAIT FOR CONSOLE FREE
14039         TDNN T,TTYSTA(B)        ;MESSAGE TO FINISH COMING OUT
14040          PUSHJ P,UFLS
14041         JRST NATTAM
14042 \f
14043 NATTAG: MOVE A,U        ;IF HACKING OUR CONSOLE, MUST STOP OUR WHOLE TREE
14044         MOVEI Q,NDETA8  ;(EXCEPT US, OF COURSE - NDETA8 CHECKS THAT).
14045         PUSHJ P,IFPLUP
14046         MOVEI B,(U)
14047 NATTA4: MOVE B,TTYTBL(B) ;FIND THE TTY'S NUMBER.
14048         TLNE B,%TBDTY
14049          JRST NATTAL    ;THIS TREE HAS NO TTY?
14050         JUMPL B,NATTA4  .SEE %TBNOT
14051         PUSHJ P,SDTTY   ;GET TTY BACK TO TOP OF TREE FOR AGBLT3 LATER.
14052          BUG
14053         HRRO B,TTYTBL(U)
14054 ;I BELIEVE THAT NOTHING CAN PCLSR BEYOND THIS POINT.
14055 ;RH OF B HAS TTY #; SIGN IS SET IF TTY IS OUR CONSOLE.
14056 NATTA8: AOS TTNTO(B)    ;KEEP DSWNTZ FROM HALTING (WILL UNDO THIS LATER)
14057         PUSH P,B        ;PUSH <CONSOLE-FLAG>,,<TTY #>
14058         HRRZ A,-1(P)    ;LEGALITY OF CALL FULLY CHECKED; CAN START ALTERING.
14059         SKIPGE APRC(A)  ;IF SPEC'D JOB IS OUR INFERIOR, DISOWN IT.
14060          JRST NATTA9
14061         MOVE B,TTYTBL(A)
14062         TLNE B,%TBDTY   ;IF THE INFERIOR HAS THE TTY, TAKE IT AWAY.
14063          JRST NATTAF
14064         PUSHJ P,SDTTY
14065          BUG
14066 NATTAF: HRRZ A,-1(P)
14067         MOVEI Q,DSWNTY  ;JUST LIKE .DISOWN, BUT KNOW JOBS ARE ALREADY STOPPED.
14068         PUSHJ P,IFPLUP
14069         PUSHJ P,NATTA1
14070 NATTA9: MOVEI Q,NATTA2
14071         MOVE A,U
14072         SKIPGE (P)      ;IF HACKING OUR CONSOLE, DISOWN OUR TREE SO IT IS FREE.
14073          PUSHJ P,IFPLUP
14074                         ;OUR TTY NOW IN INCONSISTENT STATE SINCE WE ARE DISOWNED
14075                         ;BUT TTY STILL BELONGS TO US. AGBLT3 FIXES THAT.
14076         MOVE B,(P)
14077         SOSGE TTNTO(B)
14078          BUG
14079         MOVE TT,-1(P)   ;NOW "RE-OWN" THE SPEC'D JOB
14080         MOVE A,UNAME(TT);NOT CHANGING ITS UNAME
14081         HRRZ J,B        ;TO THE DESIRED TTY, WITH APPRO. RESOURCE WORD.
14082         MOVEI D,USRRCE(B)
14083         TLO D,400000    ;TELLS UFN2A THE TREE SHOULD BECOME UN-DISOWNED.
14084         SETZ B,         ;NO INTERRUPT BIT NEEDED.
14085         SETOM DLSRCH    ;INHIBIT SCHEDULING (UFN2A UNDOES THIS)
14086         PUSH P,U
14087         PUSHJ P,UFN2A
14088         POP P,U
14089         HRRZ A,-1(P)
14090         SKIPA C,A
14091 NATTAH:  MOVE C,D       ;FIND THE JOB IN THE TREE BEING ATTACHED
14092         MOVE D,TTYTBL(C)
14093         TLNN D,%TBDTY   ;THAT IS SUPPOSED TO GET CONTROL OF THE TTY.
14094          JRST NATTAH
14095         SETOM SUPPRO(A) ;BUT DON'T LEAVE IT THINKING IT IS OUR INFERIOR.
14096         SKIPGE I,(P)
14097          JRST NATTAD
14098         HLRE B,UNAME(A) ;ATTACHING JOB TO FREE TTY:
14099         AOSE B  
14100          AOS SUSRS      ;THIS MAY MEAN 1 MORE LOGGED IN CONSOLE-CTL'ED TREE.
14101         CONO PI,TTYOFF
14102         PUSHJ P,TTYINI  ;INIT TTYOPT, ECHO AREA, TTYCOM, TTYSTA.
14103         MOVSI B,%TSFRE  ;NOW MAKE TTY'S TTYSTS HAPPY
14104         ANDCAM B,TTYSTS(I)
14105         MOVSI B,%TSCNS
14106         IORM B,TTYSTS(I)
14107         HRRM A,TTYSTS(I)
14108         CONO PI,TTYON#1 ;TTYCHN ON, BUT NOT CLKCHN.
14109         PUSH P,U
14110         PUSH P,I        ;IF THE JOB BEING ATTACHED IS LOGGED IN,
14111         MOVE U,-3(P)    ;PERFORM ACCOUNTING FOR IT.
14112         HLRO T,UNAME(U)
14113         AOSE T
14114          PUSHJ P,LOGUPD
14115         POP P,I
14116         POP P,U
14117 ;DROPS THROUGH
14118 \f;DROPS IN
14119         MOVE D,['HACTRN]
14120         PUSHJ P,UJNAMU
14121          JRST NATTAI
14122         MOVE B,-2(P)    ;SAVED CTLBTS(U) AT ENTRY
14123         TRNE B,400000
14124          MOVEM D,JNAME(A)
14125 NATTAI: MOVE B,-2(P)    ;CTLBTS
14126         MOVSI D,%USTSP  ;BUSRC
14127         TRNE B,4
14128          ANDCAM D,USTP(A)       ;START JOB BEING ATTACHED, IF REQUESTED TO
14129         PUSH P,U
14130         HRRZ U,C        ;GET USR IDX GIVING TTY TO IN U,
14131 IFN N11TYS,[
14132         HRRZ T,I        ;TTY # IN T FOR USTTV0
14133         PUSHJ P,USTTV0  ;GIVE THE JOB A BLINKER IF IT DESERVES ONE.
14134          JFCL
14135 ]
14136         POP P,A         ;USR IDX TAKING TTY FROM (BUT NOT REALLY TAKING). I AND U STILL SET.
14137         PUSHJ P,AGBLT4  ;MOVE HIS PER-JOB VARIABLES INTO THE TTY'S VARIABLES, ETC.
14138         JRST NATTAE     ;CLOCK IS NOW BACK ON.
14139
14140 NATTAD: CONO PI,CLKOFF
14141         MOVE J,JNAME(U) ;ATTACHING OUR TTY TO JOB:
14142         MOVEM J,JNAME(A) ;GIVE JOB OUR JNAME ALONG WITH OUR TTY.
14143         MOVE A,U
14144         HRRZ U,C
14145         PUSHJ P,AGBLT6  ;TRANSFER TTY TO HIM, SAVING OUR TTY STATE AND LOADING HIS.
14146 NATTAE: MOVE U,A
14147         POP P,B
14148         EXCH U,(P)      ;U := USER INDEX OF TOP OF TREE BEING ATTACHED
14149         MOVSI T,BUMRTL  ;SINCE TREE HAS BEEN ATTACHED, IT SHOULDN'T
14150         ANDCAM T,APRC(U) ;DIE AN HOUR AFTER IT WAS DETACHED.
14151         SKIPN STTYOP(U) ;RESTORE SAVED TTY OPTIONS, IF ANY
14152          JRST NATTAP
14153         LDB T,[170200,,STTYOP(U)]
14154         DPB T,[.BP (%TCRFS+%TCQRY),TTYCOM(I)]
14155         MOVE T,[%TOUSR,,%TPUSR]
14156         ANDCAM T,TTYOPT(I)
14157         AND T,STTYOP(U)
14158         IORM T,TTYOPT(I)
14159 NATTAP: HLRE T,UNAME(U)
14160         CONO PI,CLKOFF
14161         AOSE T
14162          PUSHJ P,DMNPLI ;LOG HIM IN
14163         CONO PI,CLKON
14164         POP P,U
14165         SUB P,[1,,1]    ;FLUSH SAVED CTLBTS
14166         PUSHJ P,LSWCLR  ;UNSTOP THE JOBS AND FREE TREESW
14167         JUMPGE B,POPJ1  ;RETURN IF WE DIDN'T GIVE AWAY OUR CONSOLE.
14168         SETOM TTYTBL(U) ;DON'T WANT ALOGOU TO TYPE LOGOUT MESSAGE.
14169         JRST ALOGOUT    ;LOG THIS JOB OUT.
14170 \f
14171 ;.CALL DISOWN
14172 ; RH OF ARG IS JOB SPEC, OF OUR INFERIOR.
14173 ; LH OF ARG XOR CONTROL BITS:
14174 ;  1.1 => RETAIN PRIORITY (DON'T SET APRC)
14175 ;  1.2 => USE SYSTEM RESOURCE
14176 ;  1.3 => CLEAR .USTP AFTER DISOWNING (THUS AVOIDING TIMING ERROR)
14177 ;  1.4 => SET BUMRTL SO THAT JOB WILL BE GUNNED IF IT IS STOPPED FOR A WHOLE HOUR
14178 ;          AND NOT REOWNED OR ATTACHED.
14179
14180 NDISOWN:HLRZ J,A
14181         XORM J,CTLBTS(U) ;XOR LH OF 1ST ARG INTO CTL BITS.
14182         HRRZ J,A
14183         JSP T,NCRUI2    ;DECODE JOB SPEC; DON'T SET DIELOK.
14184          JFCL
14185         CAIN J,-1
14186          JRST OPNL31    ;PDP6 NO GOOD.
14187         MOVEI R,IOCHNM(U)
14188         ADD R,A         ; R GETS ADDR OF IOCHNM WORD IF ARG WAS CHANNEL #,
14189         TRNE A,400000   ;GET S0 IF ARG WAS OTHER SORT OF JOB SPEC.
14190          SETZ R,
14191         HRRZ A,J
14192         HRRZ J,SUPPRO(A)
14193         CAME J,U
14194          JRST OPNL31    ;NO GOOD IF NOT OUR INFERIOR.
14195         JRST NDISO1     ;JOIN OLD-STYLE DISOWN
14196
14197 ;.DISOWN CH,    ;MAKES DIRECTLY INFERIOR PROCEDURE OPEN ON CHANNEL CH
14198                 ;THE TOP LEVEL JOB OF A DISOWNED JOB
14199
14200 ADISOWN:HRRZ B,(R)      ;PICK UP CH TYPE INDEX
14201         SKIPL CLSTB(B) .SEE %CLSU       ;SKIP IF AN INF. USER CHANNEL
14202          JRST IOCER7    ;OTHER TYPE, GIVE IOC ERROR
14203         HLRZ A,(R)      ;PICK UP INF.'S INDEX
14204         SETZM CTLBTS(U)
14205 NDISO1: PUSHJ P,SWTL
14206             TREESW
14207         SETZM STTYOP(A)
14208         MOVE B,TTYTBL(A)
14209         TLNE B,%TBDTY   ;SKIP IF TTY TAKEN AWAY
14210          JRST ADISO1
14211         PUSH P,R
14212         PUSH P,A        ;JOB TO BE DISOWNED HAS THE TTY: TAKE IT AWAY.
14213         PUSHJ P,SDTTY
14214          BUG
14215         POP P,A
14216         POP P,R
14217 ADISO1: MOVEI Q,DSWNTY
14218         PUSHJ P,IFPHAK  ;HACK INFERIORS
14219         CAME U,USER
14220          BUG
14221         PUSHJ P,NATTA1  ;FLUSH OUR POINTERS TO INFERIOR, AND SET FLAGS
14222         CAME U,USER
14223          BUG
14224         JRST LSWCJ1     ;UNSTOP HIS TREE AND FREE TREESW
14225
14226 ;FLUSH INFERIOR-JOB CHANNELS FROM JOB IN U TO JOB IN A
14227 ;CANNOT PCLSR BECAUSE JOB IS CURRENT OR STOPPED ALREADY
14228 NATTA1: MOVEI R,0       ;NO PROTECTED CHANNEL
14229         MOVEI D,%CLSU
14230         EXCH U,A
14231         PUSHJ P,ZUSES1  ;FLUSH POINTERS TO INFERIOR
14232         EXCH U,A
14233         SETOM SUPPRO(A) ;MARK AS TOP LEVEL
14234         MOVE W,CTLBTS(U)
14235         MOVSI TT,BUSRC  ;CLEAR .USTP IF REQUESTED
14236         TRNE W,4
14237          ANDCAM TT,USTP(A)
14238         MOVSI TT,BUMRTL
14239         TRNE W,10
14240          IORM TT,APRC(A)
14241         POPJ P,
14242
14243 DSWNTY: SKIPL TTYTBL(A)
14244          BUG            ;CHECKED AT HIGHER LEVEL, DATA INCONSISTENT
14245 NATTA2: TDZA T,T        ;DO SOS TTNTO OF CONSOLE TTY.
14246 NDETA9:  SETO T,        ;DON'T.
14247         PUSHJ P,CHSCAA  ;LOOK AT ALL CNHLS
14248             PUSHJ P,DSWNTZ      ;BLESSING CONSOLE TTY CHNLS
14249         MOVEI TT,SYSRCE ;SET RESOURCE POINTER TO SYSTEM OR DISOWNED
14250         MOVE W,CTLBTS(U);DEPENDING ON CTLBTS
14251         TRNN W,2
14252          MOVEI TT,USRRCE+NCT
14253         MOVEM TT,UTMPTR(A)
14254         MOVSI T,400000
14255         TRNN W,1
14256          IORM T,APRC(A) ;MARK AS DISOWNED
14257         POPJ P,
14258
14259 ;BLESS CONSOLE TTY CHANNELS. IF T NONZERO, DON'T SOS TTNTO.
14260 DSWNTZ: HLRZ B,(R)      ;GET LH OF IOCHNM WORD
14261         HRRZ J,(R)      ;GET DEV TYPE INDEX
14262         CAIL J,TYIDN    ;SKIP IF LESS THAN LEAST TTY INDEX
14263          CAILE J,TYOBN  ;SKIP UNLESS .LTEQ. HIGHEST
14264           POPJ P,       ;NOT A TTY CHANNEL
14265         TRZ B,#%TICNS#(.BM $TIIDX)
14266         TRZE B,%TICNS   ;SKIP IF NOT A CONSOLE TTY
14267          CAIN B,%TINON  ;DO NOTHING TO "DISOWNED" TTY CHNLS
14268           POPJ P,
14269         MOVEI J,%TINON  ;CHANGE OTHER TTY CHNLS TO DISOWNED
14270         DPB J,[$TIIDX,,(R)]     ;CHNLS.
14271         JUMPN T,CPOPJ   ;IN NDETAC, TTNTO ALREADY SETZM'D.
14272         SOSLE TTNTO(B)  ;DECREMENT OPEN COUNT
14273          POPJ P,
14274         BUG             ;SHOULD BE OPEN AT HIGHER LEVELS
14275
14276 ;ROUTINE TO SCAN ALL I/O CHANNEL AND I/O PDL SLOTS OF A PROCEDURE
14277 ;R 4.9=1 => REGULAR CHANNEL  4.9=0 => IOPUSHED CHANNEL
14278 CHSCAA: MOVEI R,IOCHNM(A)
14279 CHSCAN: HRLI R,-20
14280 CHSCA2: XCT @(P)
14281         AOBJN R,CHSCA2
14282         HRLI R,-<LUIOP/2>+400000
14283 CHSCA4: XCT @(P)
14284         ADD R,[1,,2]
14285         JUMPG R,CHSCA4
14286         JRST POPJ1
14287 \f;
14288 ;IFPHAK AND IFPLUP TAKE A USER INDEX IN A AND THE ADDRESS OF A ROUTINE
14289 ;       IN Q.  THEY CALL THE ROUTINE FOR THE PROCEDURE AND ALL OF ITS
14290 ;       INFERIORS BUT IFPHAK ALSO STOPS THE SPECIFIED PROCEDURE AND
14291 ;       ALL ITS INFERIORS STRINGING THEIR USTP'S INTO THE CURRENT USER'S
14292 ;       LSWPR.
14293 ;
14294 IFPHAK: PUSH P,U
14295         PUSH P,Q
14296         MOVE U,USER     ;MADE SURE YOU USE THE RIGHT LSWPR
14297         MOVEI Q,IFSTOP  ;SET UP TO STOP
14298         PUSHJ P,IFPLUP
14299         POP P,Q
14300         POP P,U
14301 IFPLUP: PUSH P,E        ;SAVE E
14302         PUSH P,H        ; " H
14303         SKIPA H,A
14304 IFPLU5: MOVE A,E        ;RECURSE
14305         PUSH P,H
14306         PUSH P,Q
14307         PUSHJ P,(Q)     ;CALL ROUTINE
14308         POP P,Q
14309         POP P,H
14310         MOVEI E,LUBLK*2 ;INITIALIZE TO INDEX OF JOB AFTER CORE JOB
14311 IFPLU2: SKIPN UNAME(E)
14312         JRST IFPLU3
14313         HRRZ T,SUPPRO(E)
14314         CAIN T,(A)
14315         JRST IFPLU5
14316 IFPLU3: ADDI E,LUBLK    ;STEP TO NEXT VAR BLOCK
14317         CAMGE E,USRHI   ;SKIP IF ALL EXAMINED
14318         JRST IFPLU2     ;NOT ALL, CONTINUE
14319         CAME H,A        ;ALL, SKIP IF BACK TO TOP LEVEL
14320         JRST IFPLU4     ;NOT AT TOP LEVEL, POP UP
14321         POP P,H         ;RESTORE H
14322         POP P,E         ; " E
14323         POPJ P,         ;RETURN FROM CALL TO IFPLUP
14324
14325 IFPLU4: MOVE E,A        ;POP
14326         HRRZ A,SUPPRO(A)        ;UP
14327         JRST IFPLU3     ;AND CONTINE
14328
14329 IFSTOP: PUSHJ P,RPCLSR  ;STOP ROUTINE WHOSE INDEX IS IN A
14330         HRRZ T,USTP(A)
14331         SOJE T,IFSTP1
14332         SKIPE LSWB0+1(A)
14333         JRST UPCLSR     ;HAVE ALREADY HACKED THIS GUY
14334 IFSTP1: MOVEI T,USTP(A) ;GET LOC OF USTP (WAS AOSED BY RPCLSR)
14335         MOVEI H,LSWB0(A)        ;GET LOC OF A LOCKED SWITCH BLOCK OF PROC STOPPED
14336         MOVEM T,(H)     ;SET WD1
14337         PUSH P,U
14338         HRRZ T,U
14339         IDIVI T,LUBLK
14340         POP P,U
14341         HRL T,LSWPR(U)
14342         IORI T,603000   ;SOS WHEN UNLOCKED
14343         MOVSM T,1(H)
14344         MOVEM H,LSWPR(U)        ;ADD TO LOCKED SWITCH LIST OF USER
14345         POPJ P,
14346 \f
14347 UBLAM:  SKIPL APRC(U)   ;SKIP IF DISOWNED
14348          PUSHJ P,SDTTY  ;GET TTY UP TO THIS LEVEL
14349           JFCL
14350 UBLAST: PUSHJ P,IODCL   ;CLOSE IO DEVICES ETC
14351 UBLST2: SETZ B,
14352         PUSH P,U        ;DO NOT USE THIS ROUTINE FOR CORING UP.
14353         HRRZ Q,U
14354 IFE SWPWSP,[
14355         CAME Q,BUSR
14356          JRST UBLST4
14357         SETOM BUSR      ;SWAP-BLOCKED NO MORE
14358         SOS NUSWB
14359         MOVSI TT,(SETZ)
14360         ANDCAM TT,USWSCD(U)
14361 ];SWPWSP
14362 UBLST4: MOVE U,USER
14363         PUSHJ P,ACRF1   ;CORE DOWN TO NUM OF BLOCKS IN B
14364          BUG
14365         MOVE U,USER     ;;CHECK FOR ALLEGED BUG SOMEPLACE IN ACRF1
14366         SKIPL CORRQ(U)  ;
14367          BUG            ;;NOT SUPPOSED TO RETURN UNTIL CORE REQUEST SATISFIED
14368         POP P,U
14369         SKIPE NMPGS(U)  ;
14370          BUG            ;;THUS GUY'S CORE SHOULD BE GONE BY NOW
14371         POPJ P,
14372
14373
14374 AEOFC:  UMOVE B,(J)
14375         LDB B,[400,,B]  ;OPER 50
14376         ADDI B,IOCHNM(U)
14377         MOVE A,(B)
14378         MOVE A,CLSTB(A)
14379         HLR A,(B)
14380 IFN NUNITS,     TLNE A,%CLSDI
14381 .ALSO           SKIPA A,UTEOF(A)
14382         MOVEI A,EOFCH
14383         JRST APTUAJ
14384
14385 ;OPER TO REQUEST OR FLUSH RUNNING IN IOT USER MODE
14386 AIOTLS: MOVSI A,400000
14387         MOVSI B,%PCUIO
14388         XCTR XR,[SKIPGE (J)]
14389          JRST AIOTL1    ;JUMP IF WANT TO ENTER IOTLSR MODE
14390         ANDCAM A,IOTLSR(U)
14391         ANDCAM B,UUOH
14392         POPJ P,
14393
14394 AIOTL1: SKIPGE IOTLSR(U)
14395          JRST AIOTL2    ;ALREADY IN IOTLSR, JUST TURN THE BIT ON AGAIN FOR HIM
14396         BUG INFO,SIXBIT,UNAME(U),SIXBIT,JNAME(U),[IOTLSR]
14397         MOVEI T,SCRMSG  ;WAIT FOR IT TO BE PRINTED (HA HA WHAT ABOUT BUFFERING?)
14398         TDNE T,SUPCOR
14399          PUSHJ P,UFLS
14400         IORM A,IOTLSR(U)
14401 AIOTL2: IORM B,UUOH
14402         JRST CLKONJ
14403 \f
14404 SUBTTL FILENAME TRANSLATION
14405
14406 ;ROUTINE TO TRANSLATE A FILENAME.
14407 ;WANTS DEV, FN1, FN2, SNAME IN A, B, C, D RESP. LEFT-JUST.
14408 ;WANTS MODE IN RH OF E.
14409 ;RETURNS TRANSLATED NAMES IN SAME PLACE.
14410 TRAN:   SKIPN D ;MAYBE DEFAULT THE SNAME.
14411 TRAN6:  MOVE D,USYSNM(U)
14412         MOVEM B,EPDLT1(U)
14413         MOVEM C,EPDLT2(U)
14414         MOVEM D,EPDLT3(U)
14415         MOVEM A,EPDLT4(U)
14416         SKIPN TRNCNT    ;IF NO TRANSL. ENTRIES IN USE,
14417         JRST POPJ1      ;SHORT CUT.
14418         PUSHJ P,TRANRF  ;GET READ ACCESS TO TRANSL LISTS.
14419         LDB I,[100,,E]  ;GET INPUT/OUTPUT BIT.
14420         MOVEI H,10      ;MAX. NUM. TRANSLS ALLOWED.
14421 TRAN0:  HRROI Q,(U)     ;1ST TRY THIS JOB'S TRNLST.
14422         MOVE J,TRNLST(U)
14423         JRST TRAN5
14424 TRAN1:  SKIPGE Q,SUPPRO(Q)      ;MOVE UP TREE TO TRNLS1.
14425         SETZ Q,         ;AFTER TOP OF TREE, USE SYS.
14426 TRAN2:  MOVE J,TRNLS1(Q)        ;USE THIS GUY'S TRNLS1.
14427         MOVEI Q,(Q)     ;INDICATE THAT FACT IN SIGN.
14428         JRST TRAN5
14429 TRAN3:  CAME B,TRANI1(J)        ;ENTRY'S FN1 MATCHES
14430         SKIPN TRANI1(J) ;OR IS NULL?
14431         SKIPA TT,TRANI2(J)      ;YES, GET FN2.
14432         JRST TRAN4      ;NO, TRY NEXT ENTRY.
14433         CAME TT,C       ;FN2 MTCHES OR NULL.
14434         JUMPN TT,TRAN4
14435         CAME D,TRANIS(J)        ;SNAME ?
14436         SKIPN TRANIS(J)
14437         SKIPA TT,TRANID(J)      ;YES, GET DEV.
14438         JRST TRAN4
14439         CAME A,TT
14440         JUMPN TT,TRAN4  ;TEST DEV.
14441         HLRZ TT,TRANLK(J)       ;GET ENTRY'S MODE BITS.
14442         TRNN TT,1(I)    ;TRANSLATE OUR MODE?
14443         JRST TRAN4      ;NO.
14444         MOVEM B,EPDLT1(U)
14445         MOVEM C,EPDLT2(U)
14446         MOVEM D,EPDLT3(U)
14447         MOVEM A,EPDLT4(U)
14448 IRPS X,,OD O1 O2 OS
14449         SKIPE TRAN!X(J)
14450         MOVE A+.IRPCN,TRAN!X(J)
14451 TERMIN                  ;REPLACE NAMES FROM ENTRY.
14452         TRNE TT,400000  ;ATOMIC?
14453         JRST TRANX3     ;YES, EXIT.
14454         SOJG H,TRAN0    ;ELSE RETRANSL.
14455         JRST TRANX2     ;IF TOO MANY TRANSL., DON'T SKIP.
14456
14457 TRAN4:  HRRE J,TRANLK(J)        ;CDR DOWN LIST.
14458 TRAN5:  JUMPGE J,TRAN3  ;TRY NEXT UNLESS AT END.
14459         JUMPL Q,TRAN2   ;IF DID TRNLST, DO SAME JOB'S TRNLS1.
14460         JUMPN Q,TRAN1   ;ELSE DO SUPPRO'S TRNLS1.
14461 TRANX3: AOS (P)         ;EXIT IF DID SYS.
14462 TRANX2: SOS TRNREF      ;NO LONGER USING TRANSL. LISTS.
14463         POPJ P,
14464
14465 TRANRF: AOS TRNREF      ;SAY USING TRANSL. LISTS.
14466         SKIPGE TRANSW
14467         POPJ P,         ;OK IF NOT BEING CHANGED.
14468         SOS TRNREF      ;NOT REFERENCING AFTER ALL.
14469         SKIPL TRANSW    ;WAIT TILL FREE.
14470         PUSHJ P,UFLS
14471         JRST TRANRF     ;TRY AGAIN.
14472 \f;TRANS SYSTEM CALL.
14473 NTRNS:  JSP T,DEFARG    ;DEFAULT 5 ARGS TO 0.
14474         5
14475         XOR E,CTLBTS(U) ;XOR CTL BITS WITH ARG S
14476         PUSHJ P,TRAN    ;TRANSLATE NAME.
14477          JRST OPNL3             ;FAIL IF TOO MANY TRANSL.
14478         JRST POPJ1      ;ELSE GIVE BACK TRANSL'D NAMES.
14479
14480
14481 DEFARG: CAML W,(T)      ;IF NOT ALL SPEC'D,
14482         JRST 1(T)
14483         SETZM A(W)      ;DEFAULT ONE AND RETRY.
14484         AOJA W,DEFARG
14485
14486 ;LOCK TRANSW, AND SET UP 1ST ARG FOR NTRNAD, NTRNDL, NTRNCL.
14487 ;RH OF A HAS JOB SPEC; CONTROL BIT ARGS XOR'D INTO LH.
14488 ;THE 4.8 BIT, IF SET, INDICATES TRNLS1 RATHER THAN TRNLST.
14489 ;OTHER LH BITS IGNORED,, NOT CHANGED BY NTRNUI.
14490 ;ON RETURN, A'S LH IS UNCHANGED, RH IS SUCH THAT
14491 ;   TRANLK(A) IS THE ADDR OF THE SPECIFIED TRNLS VAR.
14492 NTRNUI: PUSHJ P,SWTL
14493          TRANSW
14494         TSC A,CTLBTS(U)
14495         MOVEI J,(A)
14496         JSP T,NCRUI2    ;DECODE THE JOB-SPEC.
14497          JRST NTRNU1    ;JOB GUARANTEED WRITEABLE.
14498         JUMPE J,NTRNU1  ;ALLOW JOBS TO MUNG THE SYSTEM TRANSLATION LIST.
14499         JSP T,NCORWR    ;ELSE CHECK.
14500          JRST OPNL31    ;NOT WRITEABLE.
14501 NTRNU1: CAIN J,-1
14502          JRST OPNL34    ;PDP6??
14503         HRRI A,TRNLST-TRANLK(J)
14504         TLNE A,200000   ;4.8 BIT SAYS WHICH TRNLS TO USE.
14505         ADDI A,TRNLS1-TRNLST
14506         JRST (Q)
14507
14508 ;GET UP TO 4 ARGS INTO D ... D+3, FROM AOBJN PTR IN B.
14509 NTRNGA: MOVSI H,-4      ;UP TO 4 ARGS.
14510         JUMPGE B,NTRNG3
14511 NTRNG0: UMOVE J,(B)
14512         JUMPGE W,NTRNG2 ;W IS -1 FOR .TRANA, .TRAND;
14513         TRNN H,-1       ;IN THAT CASE LEFT-JUST. DEV. (1ST ARG)
14514         HRLZI J,(J)
14515 NTRNG2: CAMN J,[SIXBIT/*/]
14516         MOVEI J,0       ;REPLACE * BY BLANK.
14517         MOVEM J,D(H)    ;STORE AWAY.
14518         AOBJP H,CPOPJ   ;DONE AFTER 4TH ARG.
14519         AOBJN B,NTRNG0  ;ELSE GET NEXT.
14520 NTRNG3: SETZM D(H)      ;ZERO REMAINING ARGS.
14521         AOBJN H,NTRNG3
14522         POPJ P,
14523 \f;TRANEX CALL  --  READ IN A JOB'S TRANSL LIST.
14524 ;1ST ARG RH - JOB SPEC. BIT 4.8 - IF SET, TRNLS1 NOT TRNLST.
14525 ;2ND ARG AOBJN -> PLACE TO STORE LIST INTO.
14526 ;UPDATED AOBJN PTR IS OUTPUT ARG.
14527 ;SKIPS IF ENTIRE LIST FIT IN BUFFER.
14528 ;EACH ENTRY TAKES 9 WDS OF SPACE: MODE,, IN 1ST,
14529 ;INPUT DEV, FN1, FN2, SNAME; THEN OUTPUT DEV, FN1, FN2, SNAME.
14530 NTRNEX: PUSHJ P,TRANRF  ;GET READ ACCESS TO TRANSL LISTS.
14531         PUSHJ P,SOSSET  ;RELINQUISH IF BLOCKED.
14532         TRNREF
14533         TSC A,CTLBTS(U)
14534         MOVEI J,(A)
14535         JSP T,NCRUI2    ;DECODE THE JOB SPEC.
14536          JFCL           ;NOT TRYING TO WRITE.
14537         HRRI A,TRNLST-TRANLK(J)
14538         TLNE A,200000   ;MAKE TRANLK(A) BE TRNLS VAR.
14539         ADDI A,TRNLS1-TRNLST
14540         SUB B,[1,,1]    ;SINCE WE AOBJ BEFORE ACTING.
14541 NTRNE1: HRRE T,TRANLK(A)        ;AT END -> RETURN SKIPPING.
14542         JUMPL T,NTRNE8
14543         HLLZ D,TRANLK(T)        ;RETURN LH ONLY OF 1ST WD.
14544         TLOA T,-9
14545 NTRNE2: MOVE D,TRANLK(T)        ;ALL OF OTHER 8 WDS.
14546         AOBJP B,[       PUSHJ P,OPNL37
14547                         JRST NTRNE9]
14548         ;FAIL IF NO ROOM.
14549         UMOVEM D,(B)
14550         ADDI T,SIOMT-1
14551         AOBJN T,NTRNE2  ;STORE ALL 9.
14552         MOVEI A,-9*SIOMT(T)     ;GO TO NEXT.
14553         JRST NTRNE1
14554
14555 NTRNE8: AOS (P)
14556         AOBJP B,.+1     ;COMPENSATE FOR SUB .
14557         PUSHJ P,LSWPOP  ;RELEASE READ ACCESS.
14558 NTRNE9: MOVE A,B
14559         JRST SYSCPT     ;RETURN AOBJN PTR.
14560 \f;TRANDL CALL -- DELETE ENTRY FROM TRANSL LIST.
14561 ;1ST ARG RH JOB SPEC. OF JOB WHICH IS OK TO MODIFY.
14562 ;1ST ARG LH MODE BITS AS FOR .TRANAD, ALSO 4.8 BIT SAYS TRNLS1
14563 ;       (SPEC'D JOB AND INFS, RATHER THAN JUST SPEC'D JOB)
14564 ;2ND ARG AOBJN -> INPUT DEV, FN1, FN2, SNAME. (ONLY DEV NEC.).
14565 ;SKIPS IF SOMETHING WAS DELETED.
14566 NTRNDL: JSP Q,NTRNUI    ;PROCESS 1ST ARG., LOCK TRANSW.
14567 NTRND:  PUSHJ P,NTRNDA  ;ACTUALLY DELETE.
14568         JRST OPNL4      ;NOTHING TO DELETE => FILE NOT FOUND
14569         JRST LSWPJ1     ;SKIP IF NTRNDA DID.
14570
14571 NTRNDA: TLZ A,-1#400003
14572         PUSHJ P,NTRNGA  ;ELSE GET INPUT NAMES.
14573         SKIPGE TRANLK(A)
14574         POPJ P,
14575         HRRZS (P)       ;CLEAR SKIP FLAG.
14576         SKIPA T,A
14577 NTRND2: MOVEI T,(H)     ;CDR DOWN BOTH PTRS.
14578 NTRND0: HRRE H,TRANLK(T)        ;LOOK AT NEXT ENTRY.
14579         JUMPL H,NTRNDX  ;EXIT IF END.
14580         CAMN D,TRANID(H)        ;ALL 4 INPUT NAMES MUST MATCH.
14581         CAME E,TRANI1(H)
14582         JRST NTRND2     ;ELSE NOT TO BE DELETED.
14583         CAMN TT,TRANI2(H)
14584         CAME I,TRANIS(H)
14585         JRST NTRND2
14586         HLLZ R,A        ;GET MODE FROM ARG.
14587         TLZ R,400000    ;DONT CLOBBER ATOM BIT
14588         ANDCA R,TRANLK(H)       ;TURN OFF IN MODE FROM ENTRY.
14589         CAME R,TRANLK(H)        ;IF DELETED ONE, CALL WILL SKIP.
14590         HRROS (P)
14591         MOVEM R,TRANLK(H)
14592         TLNE R,3                ;IF NEITHER DIRECTION LEFT, SPLICE OUT.
14593         JRST NTRND2
14594         SKIPE TRNREF    ;WAIT TILL NOONE READING TRANSL LISTS.
14595         PUSHJ P,UFLS
14596         SOS TRNCNT      ;ONE LESS ENTRY IN USE.
14597         HRRZ R,TRANFL   ;MAKE LINK -> CURRENT FREE LIST.
14598         EXCH R,TRANLK(H)
14599         HRRM R,TRANLK(T)        ;REST OF TRNLS INTO PREDECESSOR'S LINK.
14600         HRRZM H,TRANFL  ;ADD THIS ONE TO FREE LIST.
14601         JRST NTRND0
14602
14603 NTRNDX: HRRES TRANLK(A) ;IN CASE DELETED 1ST ENTRY.
14604         SKIPGE (P)
14605         AOS (P)         ;SKIP IF SET FLAG.
14606         POPJ P,
14607 \f;TRANAD CALL. -- ADD AN ENTRY TO A TRANSL LIST.
14608 ;1ST 2 ARGS AS FOR TRANDL.
14609 ;3RD ARG LIKE 2ND BUT GIVES OUTPUT NAMES.
14610 ;SKIPS UNLESS ALL ENTRIES WERE IN USE.
14611 NTRNAD: JSP Q,NTRNUI
14612 NTRNA:  TLNN A,3        ;IF RELLY NOTHING WOULD BE TRANSL'D,
14613          JRST LSWPJ1    ;DON'T BOTHER ADDING..
14614         PUSHJ P,NTRNDA  ;DELETE ANY EXISTING TRANSL. FOR THESE INPUT NAMES.
14615         JFCL            ;IF WERE NONE.
14616         SKIPGE T,TRANFL
14617         JRST OPNL5      ;NO FREE ENTRIES - DIRECTORY FULL.
14618         AOS TRNCNT      ;1 MORE ENTRY IN USE.
14619 IRPS X,,ID I1 I2 IS
14620         MOVEM D+.IRPCN,TRAN!X(T)
14621 TERMIN                  ;PUT INPUT NAMES INTO ENTRY.
14622         MOVE B,C
14623         PUSHJ P,NTRNGA  ;GET OUTPUT NAMES.
14624 IRPS X,,OD O1 O2 OS
14625         MOVEM D+.IRPCN,TRAN!X(T)
14626 TERMIN                  ;STORE OUTPUT NAMES.
14627         MOVE H,TRANLK(A)        ;PUT CURRENT TRNLS INTO LINK.
14628         EXCH H,TRANLK(T)
14629         HRREM H,TRANFL  ;STORE BACK REST OF FREE LIST.
14630         MOVEM T,TRANLK(A)       ;TRNLS NOW STARTS WITH THSI ONE.
14631         HLLM A,TRANLK(T)        ;STORE MODE BITS.
14632         JRST LSWPJ1
14633 \f;TRANCL CALL -- RESET A ONE OR BOTH TRANSL LISTS FOR A JOB.
14634 ;1ST ARG RH HAS JOB SPEC OF MODIFYABLE JOB.
14635 ; BIT 4.8 CLEAR TRNLS1 VAR. (TRANSL FOR THIS JOB & INFS).
14636 ; BIT 4.7 CLEAR TRNLST VAR. (TRANSL FOR THIS JOB ONLY).
14637 ; ALWAYS SKIPS IF VALID.
14638 NTRNCL: JSP Q,NTRNUI    ;RH(A) -> TRNLST OR TRNLS1 VAR.
14639         TLNE A,200000
14640         SUBI A,TRNLS1-TRNLST    ;MAKE -> TRNLST VAR.
14641         SUBI A,TRNLST-TRANLK
14642         JRST NTRNC4
14643
14644 NTRNCA: SUBI A,TRNLST-TRANLK    ;MAKE HOLD USR IDX.
14645 NTRNC:  PUSHJ P,SWTL    ;GET WRITE ACCESS.
14646         TRANSW
14647 NTRNC4: AOS (P)
14648         SKIPE TRNREF    ;WAIT FOR READ REFS TO FINISH.
14649         PUSHJ P,UFLS
14650         TLNN A,100000   ;IF 4.7, HANDLE TRNLST.
14651         JRST NTRNC0
14652         HRRE T,TRNLST(A)
14653         SETOM TRNLST(A) ;SET LIST TO NIL.
14654         JUMPGE T,NTRNC1 ;IF WASN'T NIL, FREE ENTRIES ON IT.
14655 NTRNC0: TLZN A,200000   ;MAYBE HANDLE TRNLS1.
14656         JRST LSWPOP
14657         HRRE T,TRNLS1(A)
14658         SETOM TRNLS1(A)
14659         JUMPL T,LSWPOP  ;NOTHING TO DO IF ALREADY NIL.
14660 NTRNC1: MOVEI C,(T)     ;SAVE START OF LIST.
14661 NTRNC2: SOS TRNCNT      ;UPDATE NUM ENTRIES IN USE.
14662         HRRES H,TRANLK(T)
14663         JUMPL H,NTRNC3  ;AT END, SPLICE INTO FREELIST.
14664         MOVEI T,(H)     ;ELSE CDR DOWN.
14665         JRST NTRNC2
14666 NTRNC3: EXCH C,TRANFL
14667         HRRZM C,TRANLK(T)
14668         JRST NTRNC0     ;MAYBE CONSIDER THE OTHER LIST.
14669 \f;.TRANA, .TRAND CALLS.
14670 ATRANA: UMOVE E,(B)
14671         JSP T,ATRNDT    ;SET UP ARGS FOR NTRNA .
14672         PUSHJ P,SWTL    ;GET WRITE ACCESS.
14673         TRANSW
14674         JRST NTRNA
14675
14676 ATRNDL:
14677 ATRAND: XCTR XR,[SKIPN E,(B)]
14678         JRST ATRND0     ;ZERO UNAME -> TRANCL .
14679         JSP T,ATRNDT    ;SET UP ARGS.
14680         PUSHJ P,SWTL    ;GET WRITE ACCESS.
14681         TRANSW
14682         JRST NTRND
14683
14684 ATRND0: JSP T,ATRNDT
14685         TLO A,300000    ;SAY CLEAR BOTH LISTS.
14686         CAMN D,[SIXBIT/*/]
14687         SUBI A,TRNLS1-TRNLST    ;NAKE SURE -> TRNLST VAR.
14688         JRST NTRNCA
14689
14690 ATRNDT: MOVE C,JNAME(U)
14691         MOVEM C,ATRNJN  ;WHO THE HELL'S USING THESE?
14692         CAME E,UNAME(U) ;UNAME MUST BE 0 OR THSI JOB'S.
14693         JUMPN E,CPOPJ   ;ELSE MAKE UUO FAIL.
14694         MOVNI W,1       ;SIGNAL TO NTRNGA.
14695         MOVEI C,5(B)    ;SET UP 2 AOBJN PTRS
14696         MOVEI B,2(B)
14697         HRLI C,-3       ;-> INPUT NAMES (B), OUTPUT NAMES (C).
14698         HRLI B,-3
14699         XCTR XR,[HLL A,(B)]     ;GET MODE BITS.
14700         UMOVE D,-1(B)
14701         JUMPE D,CPOPJ   ;JNAME MUSTN'T BE 0.
14702         CAME D,[SIXBIT/*/]      ;IF *, USE THIS JOB'S TRNLS1.
14703         JRST ATRND2
14704         HRRI A,TRNLS1-TRANLK(U)
14705         JRST (T)
14706
14707 ATRND2: MOVEI H,0       ;ELSE FIND JOB WITH THAT JNAME.
14708         MOVE E,UNAME(U) ;THIS JOB'S UNAME.
14709 ATRND1: CAMN E,UNAME(H)
14710         CAME D,JNAME(H)
14711         JRST ATRND3     ;NOT THE ONE WE'RE LOOKING FOR.
14712         HRRE E,SUPPRO(H)
14713         CAIE U,(E)      ;IS THIS OUR INF.
14714         CAIN U,(H)      ;IS IT THE CURRENT JOB?
14715         CAIA
14716         POPJ P,         ;NO, CAN'T SET ITS TRANSL LIST.
14717         HRRI A,TRNLST-TRANLK(H)
14718         JRST (T)        ;OK, SET ITS TRNLST VAR.
14719 ATRND3: ADDI H,LUBLK
14720         CAMGE H,USRHI   ;LOOK AT ALL JOBS.
14721         JRST ATRND1
14722         POPJ P,         ;CAN'D TRANAD NON EX JOB.
14723 \f
14724 SUBTTL JOB, BOJ DEVICE ROUTINES
14725
14726 EBLK
14727 JBMN==10        ;MAXIMUM NUMBER OF JOBS ON JOB DEVICE
14728
14729 JBCUI:  REPEAT JBMN,-1  ;-1 => CHNL FREE, ELSE (IF JBCG POSITIVE) CREATOR'S USR IDX.
14730 JBCG:   BLOCK JBMN      ;-1 IF CREATOR GONE AWAY
14731 JBWST:  REPEAT JBMN,SNJOB       ;CREATED JOB'S WAIT STATUS (CREATED JOB=HANDLER JOB)
14732 %JB==1,,525252
14733 %JBWIN==400000  ;4.9 => CREATED JOB HAS DONE A SUCCESSFUL JOBRET
14734 %JBREU==200000  ;4.8 => JOB CLOSED AND MADE ITSELF AVAILABLE FOR REUSE
14735 %JBVAL==020000  ;4.5 => VALID BIT (CREATOR CAME IN, NO JOBRET YET)
14736 %JBSTR==010000  ;4.4 => STORED BIT (CREATOR CAME IN, NO JOBGET YET)
14737 %JBUNH==004000  ;4.3 => BOJ BLK UNHANG BIT
14738 %JBSIO==001000  ;4.1 => IF DOING AN IOT, THIS BITS SAYS ITS REALLY A SIOT
14739 %JBLOS==000400  ;3.9 => CREATED JOB WAS CLOSED AND KNOWS IT, SO DON'T REUSE
14740         ;1.1-2.9 => LAST STATUS SET BY BOJ
14741
14742 JBDEV:  BLOCK JBMN      ;DEVICE NAME, USER-SETTABLE (MOSTLY FOR PEEK AND WHO LINES)
14743 JBFN1:  BLOCK JBMN      ;FN1
14744 JBFN2:  BLOCK JBMN      ;FN2
14745 JBSYS:  BLOCK JBMN      ;SYSNAME
14746 JBOPNM: BLOCK JBMN      ;OPEN MODE
14747 JBFNP:  BLOCK JBMN      ;BP TO ASCIZ FILENAME STRING IN USER ADDRESS SPACE (OR 0 IF NONE).
14748 JBCJUI: BLOCK JBMN      ;RH = CREATED JOB'S USER INDEX.
14749                         ;LH = -1 IFF CREATED JOB GOING AWAY.  JOB MUST EXIST
14750                         ;SINCE WHEN IT DIES IT FLUSHES THE JOB CHANNEL
14751                         ;AND ITS CREATOR'S CHANNELS.
14752 JBSTS:  BLOCK JBMN      ;STATUS OF JOB-BOJ INTERACTIONS
14753 ;4.9=1 => IMAGE =0 => ASCII
14754 ;4.8=1 => BLOCK =0 => UNIT
14755 ;4.7=1 => WRITE =0 => READ
14756 ;4.6-4.3 => NUMBER OF TIMES TO SKIP
14757 ;4.2-3.6 => OPEN LOSS
14758 ;3.5-3.2 => # OF ARGS ON LAST .CALL
14759 ;1.4 => SYSTEM CALL OTHER THAN THOSE BELOW.
14760 ;1.3-1.1 => SYSTEM CALL
14761         ;0      OPEN
14762         ;1      IOT OR SIOT
14763         ;2      MLINK
14764         ;3      RESET
14765         ;4      RCHST
14766         ;5      ACCESS
14767         ;6      FDELE (DELETE OR RENAME)
14768         ;7      FDELE (RENAME WHILE OPEN)
14769
14770 JBST2:  BLOCK JBMN      ;SECOND WORD OF JOBGET INFO
14771                         ;FOR UNIT IOT, 1
14772                         ;FOR SIOT, THE BYTE COUNT
14773                         ;FOR BLOCK IOT, THE BLOCK POINTER
14774                         ;NEW FN1 FOR RENAME, MLINK.
14775 JBOFN1: BLOCK JBMN      ;FN1 BEFORE LAST TRANS
14776 JBOFN2: BLOCK JBMN      ;FN2 "" ""
14777 JBOSYN: BLOCK JBMN      ;SYSNAM ""
14778 JBODEV: BLOCK JBMN      ;DEV  " "
14779 JBNFN2: BLOCK JBMN      ;NEW FN2 FOR FDELE.
14780 JBAC7:  BLOCK JBMN      ;7TH ARG TO .CALL, NEW SNAME FOR MLINK.
14781 JBAC10: BLOCK JBMN      ;TABLE FOR .CALL ARG 10, FIRST BP ARG TO SOPEN/RENAME/MLINK/DELETE.
14782 JBAC11: BLOCK JBMN      ;TABLE FOR .CALL ARG 11, SECOND BP ARG TO RENAME, MLINK OR RENMWO.
14783
14784 JBACTB: JBST2(H)        ;TABLE OF POINTERS TO .CALL ARG TABLES
14785         JBOFN1(H)
14786         JBOFN2(H)
14787         JBOSYN(H)
14788         JBODEV(H)
14789         JBNFN2(H)
14790         JBAC7(H)
14791         JBAC10(H)
14792         JBAC11(H)
14793
14794 JBIOCJ: BLOCK JBMN      ;IO CHNL ERROR WORD.  4.9 => IOCER ON NEXT JOB IOT
14795                         ;RH = IOCER TYPE
14796
14797 JBSW:   -1              ;LOCK ON ASSIGNMENT OF INDEX IN ABOVE TABLES
14798         0
14799 BBLK
14800 \f
14801 ;OPEN ON BOJ: DEVICE
14802
14803 ;3.5 = 1 => UNHANG ON BLK IOT AFTER EACH XFER OF MAXIMAL SIZE
14804 BOJO:   JUMPN W,OPNL12  ;NO SUCH MODE
14805         SKIPGE E,JBI(U) ;JOB CHANNEL INDEX
14806          JRST [ MOVE E,OPTION(U) ;IF THIS JOB ISN'T A JOB DEVICE,
14807                 TLNN E,%OPOJB   ;IF IT'S EXPECTING TO BE AN OJB DEVICE, OK.
14808                  JRST OPNL10    ;OTHERWISE IT CAN'T WIN.
14809                 SKIPGE JBI(U)   ;IF IT CAN WIN, WAIT TILL IT HAS.
14810                  PUSHJ P,UFLS
14811                 JRST BOJO]      ;THEN TRY AGAIN.
14812         CAIL E,JBMN
14813          BUG            ;JOB CHANNEL INDEX TOO BIG
14814         CAME U,JBCJUI(E)
14815          BUG
14816         HRLZ A,E
14817         HLRZS C
14818         MOVSI TT,%JBUNH
14819         TRNE C,20
14820          IORM TT,JBWST(E)
14821         JSP Q,OPSLC7
14822             BDUAI,,BDUAO
14823             BDBI,,BDBO
14824             BDUII,,BDUIO
14825             BDBI,,BDBO
14826 \f
14827 ;OPEN ON JOB: DEVICE
14828 ;MODE BITS:
14829 ;3.1-3.3 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
14830 ;A,B HAVE FILENAMES, RH(C) HAS DEVICE (JOB OR OJB)
14831 ;RH(D) AND LH(C) BOTH HAVE OPEN-MODE.
14832
14833 JOBO:   PUSHJ P,FLDRCK
14834          JRST JOBO3
14835           JRST OPNL11   ;ILLEGAL FILE NAME
14836 JOBO3:  CAMN A,[SIXBIT /M.F.D./]
14837          CAME B,[SIXBIT /(FILE)/]
14838           JRST JOBO2
14839         JRST OPNL11     ;ILLEGAL FILE NAME
14840 JOBO2:  MOVEI J,0       ;SET J TO JOBGET "COMMAND" NUMBER
14841         CAIN W,2
14842          MOVEI J,2      ;MLINK, MOSTLY JUST LIKE FDELE, BUT SEE JOBOF3
14843         CAIN W,4
14844          MOVEI J,6      ;FDELE
14845         MOVNI E,1
14846         MOVSI Q,-JBMN
14847         PUSHJ P,SWTL    ;LOCK JOB CHNL ASSIGN SWITCH
14848             JBSW
14849 JOBO5:  SKIPGE TT,JBCUI(Q)      ;SKIP IF NOT FREE
14850          JRST JOBO4
14851         MOVE T,UUOH
14852         TLNN T,%PCFPD
14853          JRST JOBORU    ;JUMP IF THIS IS FIRST ATTEMPT TO OPEN
14854         HRRZ H,C
14855         CAIN H,'OJB
14856          JRST JOBO6
14857         SKIPGE JBCG(Q)  ;LOOK FOR CHANNEL ON WHICH THIS USER
14858          CAIE TT,(U)    ;PREVIOUSLY ATTEMPTED TO OPEN, BUT PCLSRED
14859           JRST JOBO6
14860         MOVE T,EPDLT1(U)
14861         MOVE TT,EPDLT2(U)
14862         CAMN T,JBFN1(Q)
14863          CAME TT,JBFN2(Q)
14864           JRST JOBO6            ;NOT OPENING SAME FILE
14865         MOVE TT,EPDLT4(U)
14866         MOVE T,EPDLT3(U)
14867         CAMN TT,JBDEV(Q)
14868          CAME T,JBSYS(Q)
14869           JRST JOBO6            ;NOT FOR SAME FILE
14870         CONO PI,CLKOFF
14871         HLRZ H,C
14872         HRRZ T,JBSTS(Q)
14873         CAIN T,(J)
14874          CAME H,JBOPNM(Q)
14875           JRST JOBO6            ;NOT FOR SAME OPEN TYPE AND MODE
14876         MOVE TT,JBWST(Q)
14877         TLNE TT,%JBLOS+%JBWIN+%JBREU
14878          JRST JOBO6             ;HANDLER JOB NOT IN CORRECT STATE
14879         HRRZ E,Q        ;REUSE SAME HANDLER JOB AS IN PREVIOUS ATTEMPT TO OPEN
14880         SETZM JBCG(E)   ;I'M BACK
14881         PUSHJ P,LSWPOP  ;FREE JBSW
14882         TLO TT,%JBVAL
14883         MOVEM TT,JBWST(E) ;RE-GIVE OPEN COMMAND STILL SITTING IN JBSTS ETC.
14884         HRLI E,400000   ;OPEN-TYPE WAIT
14885         PUSHJ P,JBWT2   ;WAIT FOR HANDLER JOB TO PROCESS IT
14886         JRST JOBO8      ;FINISH OFF THEN OPEN
14887
14888 ;FIRST ATTEMPT TO OPEN, CHECK FOR REUSEABLE HANDLER JOBS BEFORE CREATING NEW
14889 JOBORU: CONO PI,CLKOFF
14890         MOVE TT,JBWST(Q)
14891         SKIPGE JBCG(Q)
14892          TLZN TT,%JBREU
14893           JRST JOBO6    ;IN USE ALREADY OR NOT WILLING TO BE REUSED
14894         MOVE T,EPDLT4(U)
14895         CAMN T,JBODEV(Q)
14896          JRST JOBOR1    ;IF SAME SIMULATED DEVICE, OK TO SIEZE
14897         CAMN A,JBOFN1(Q)
14898          CAME B,JBOFN2(Q)
14899           JRST JOBO6    ;DIFFERENT HANDLER NAME
14900         MOVE T,USYSN1(U)
14901         CAME T,JBOSYN(Q)
14902          JRST JOBO6     ;DIFFERENT HANDLER NAME
14903 JOBOR1: MOVEM TT,JBWST(Q) ;THIS ONE OK, SIEZE IT
14904         HRRZ E,Q
14905         MOVEM U,JBCUI(E)
14906         HLRZM C,JBOPNM(E)
14907         SETZM JBCG(E)
14908         SETZM JBIOCJ(E)
14909         PUSHJ P,LSWPOP  ;FREE JBSW
14910         JRST JOBO7
14911 \f
14912 JOBO4:  HRRZ E,Q        ;REMEMBER FREE JOB CHNL IN CASE NEEDED
14913 JOBO6:  CONO PI,CLKON
14914         AOBJN Q,JOBO5   ;SCAN REST OF JOB CHANNELS
14915         JUMPL E,OPNL6   ;DEVICE FULL
14916         MOVEM U,JBCUI(E);STORE CREATOR'S USER INDEX
14917         PUSHJ P,LSWPOP  ;FREE JOBSW
14918         PUSHJ P,STMSET  ;SETOM JBCUI(E) ON LOSSAGE
14919             JBCUI(E)
14920         SETZM JBDEV(E)
14921         SETZM JBFNP(E)
14922         HLRZM C,JBOPNM(E)
14923         SETZM JBCG(E)
14924         SETZM JBIOCJ(E)
14925         MOVEI T,SNJOB   ;INITIALIZE STATUS
14926         MOVEM T,JBWST(E)
14927         PUSH P,R
14928         PUSH P,U
14929         PUSH P,J
14930         PUSH P,D
14931         PUSH P,E
14932         PUSH P,A
14933         PUSH P,B
14934         ANDI C,-1       ;FOR OJB DEVICE, LOOK FOR EXISTING JOB.
14935         CAIN C,'OJB
14936          JRST JOBO6B
14937         MOVE A,UNAME(U) ;FOR JOB DEVICE, CREATE NEW JOB.
14938         IDIVI E,10.
14939         MOVEI B,'0(E)
14940         LSH B,6
14941         ADDI B,'0(TT)
14942         ADD B,[SIXBIT /JOB./]   ;CREATE JNAME = 'JOB.MN'
14943         MOVE C,[7,,(SIXBIT /USR/)]
14944         MOVE D,[SETZ 3]
14945         PUSHJ P,USROJ   ;GENERATE USER(CAN ONLY PCLSR BEFORE CREATING INFERIOR)
14946          JRST POP7J     ;USER OPEN FAILED, MUST HAVE GONE TO OPNL ALREADY
14947         CONO PI,CLKOFF
14948         POP P,B
14949         POP P,A
14950         POP P,E
14951         SETOM SUPPRO(TT)
14952         MOVE T,[JBSTCD,,AC0S]
14953         ADDI T,(TT)
14954         BLT T,AC17S(TT)
14955         HRLZI T,%PCUSR
14956         MOVEM T,UPC(TT)
14957         MOVEM A,AC0S+10(TT)
14958         MOVEM B,AC0S+11(TT)
14959         MOVE T,USYSN1(U)
14960         MOVEM T,USYSNM(TT)      ;SET CREATED JOB'S SYS NAME TO OURS
14961         SETZM USTP(TT)          ;START JOB AS SOON AS CLK BACK ON
14962         JRST JOBO6C
14963 \f
14964 ;OJB: DEVICE, LOOK FOR JOB WHOSE NAMES ARE THE FILENAMES SPECIFIED IN THE OJB OPEN.
14965 JOBO6B: MOVE C,[7+UBPFJ,,'USR]  ;DON'T EVER CREATE JOB FOR OJB.
14966         MOVE D,[SETZ 3+UBPFJ_<-1>]
14967         PUSHJ P,USROOJ
14968          JRST POP7J
14969         SUB P,[2,,2]
14970         POP P,E
14971 ;TT HAS USER IDX OF JOB TO BE USED; CAN'T PCLSR AFTER THIS POINT.
14972 JOBO6C: PUSHJ P,LSWDEL  ;SETOM JBCUI(E)
14973         POP P,D
14974         POP P,J
14975         POP P,U
14976         POP P,R
14977         HRRZM TT,JBCJUI(E)
14978         MOVEM E,JBI(TT)
14979 JOBO7:  CONO PI,CLKOFF
14980         MOVE TT,EPDLT1(U)
14981         MOVEM TT,JBOFN1(E)
14982         MOVEM TT,JBFN1(E)
14983         MOVE TT,EPDLT2(U)
14984         MOVEM TT,JBOFN2(E)
14985         MOVEM TT,JBFN2(E)
14986         MOVE TT,EPDLT3(U)
14987         MOVEM TT,JBOSYN(E)
14988         MOVEM TT,JBSYS(E)
14989         MOVE TT,EPDLT4(U)
14990         MOVEM TT,JBODEV(E)
14991         MOVEM TT,JBDEV(E)
14992         MOVE TT,EPDL(U)
14993         MOVEM TT,JBAC10(E)
14994         MOVE TT,EPDL3(U)
14995         MOVEM TT,JBAC11(E)
14996         JUMPN J,[PUSHJ P,JFDEL5 ;DELETE/RENAME/MLINK
14997                  JRST JOBO9]
14998         LDB TT,[000300,,JBOPNM(E)]
14999         ROT TT,-3
15000         MOVEM TT,JBSTS(E)
15001         HRRZ C,JBOPNM(E)        ;GET ALL OF OPEN MODE
15002         MOVEM C,JBNFN2(E)       ;GIVE IT
15003 JOBO9:  PUSHJ P,JBWT1           ;STORE STUFF AND HANG
15004 JOBO8:  LDB TT,[350400,,JBSTS(E)]
15005         JUMPE TT,JOBOPL         ;OPEN LOST
15006         LDB C,[000400,,JBSTS(E)]
15007         JUMPN C,[ SETOM JBCG(E) ;DELETE/RENAME/MLINK
15008                   JRST POPJ1 ]
15009         MOVE C,JBOPNM(E)
15010         SETZM IOCHST-IOCHNM(R)
15011         HRLZ A,E
15012         JSP Q,OPSLC7
15013             JDUAI,,JDUAO
15014             JDBI,,JDBO
15015             JDUII,,JDUIO
15016             JDBI,,JDBO
15017
15018 JOBOPL: LDB C,[270600,,JBSTS(E)]
15019         SETOM JBCG(E)
15020         SKIPE C
15021          CAILE C,NOPNLS
15022           MOVEI C,22
15023         JRST OPNL1-1(C)
15024
15025 ;RENAME WHILE OPEN ON JOB CHNL
15026 JFDEL4: HLRZ E,(TT)     ;JOB CHNL INDEX
15027         MOVEI J,7
15028         PUSHJ P,JFDEL5  ;DO "FDELE"
15029         MOVE TT,EPDL3(U) ;PASS ALONG THE BP ARG IF THERE WAS ONE.
15030         MOVEM TT,JBAC11(E)
15031         SETZM JBAC10(E)
15032         JRST AIOCA1     ;GET RESULTS
15033
15034 ;FDELE/RENMWO/MLINK ON JOB CHANNEL
15035 JFDEL5: MOVEM J,JBSTS(E)
15036         MOVE TT,SRN3(U)   ;REMEMBER NAMES TO RENAME AS
15037         MOVEM TT,JBST2(E) ;FOR JOBGET TO RETURN.
15038         MOVE TT,SRN4(U)
15039         MOVEM TT,JBNFN2(E)
15040         MOVE TT,SRN5(U)   ;IN CASE THIS IS MLINK, MAKE SURE THE "TO" SNAME
15041         MOVEM TT,JBAC7(E) ;IS GIVEN TO JOBGET.
15042         CONO PI,CLKOFF
15043         POPJ P,
15044 \f
15045 ;GIVE AN INTERRUPT TO THE JOB DEVICE HANDLER.
15046 ;JOB CHNL INDEX IN E,  CLOBBERS TT,J,Q,H
15047 ;CALL WITH CLKOFF
15048
15049 JBINT:  HRRZ TT,JBCJUI(E)
15050         MOVEI J,IOCHNM(TT)
15051         HRLI J,-20
15052         MOVSI H,%CLSBJ
15053 JBINT1: MOVE Q,(J)
15054         TDNN H,CLSTB(Q) ;SKIP IF BOJ
15055 JBINT2:  AOBJN J,JBINT1
15056         JUMPGE J,CPOPJ
15057         SUBI J,IOCHNM(TT)
15058         MOVE Q,CHNBIT(J)
15059         IORM Q,IFPIR(TT)
15060         ADDI J,IOCHNM(TT)
15061         JRST JBINT2
15062
15063 ;THIS IS THE CODE PUT IN THE ACS TO LOAD IN THE JOB DEVICE HANDLER
15064
15065 JBSTCD: .OPEN 1,7       ;0
15066          .LOGOUT
15067         .CALL 12
15068          .LOGOUT
15069         .IOT 1,2
15070         .CLOSE 1,
15071         JRST (2)
15072         4,,(SIXBIT /DSK/)       ;7
15073         0       ;10 FN1
15074         0       ;11 FN2
15075         SETZ    ;12
15076         SIXBIT /LOAD/
15077         16
15078         SETZ 17
15079         -1      ;16 (LOAD INTO SELF)
15080         1       ;17
15081
15082 ;HAND THE JOB DEVICE HANDLER A SYSTEM CALL AND WAIT FOR IT TO BE HANDLED.
15083 ;CALL WITH CLOCK OFF, JOB CHNL IN E
15084 JBWT1:  TLOA E,400000   ;OPEN/FDELE/MLINK, CLOSE CHANNEL IF PCLSR
15085 JBWT:    TLZ E,400000   ;NORMAL ENTRY POINT, DON'T CLOSE IF PCLSR
15086         TLZA E,200000
15087 JBWTI:   HRLI E,200000  ;ENTER HERE TO INHIBIT SETTING %PCFPD IF PCLSR
15088         MOVSI TT,%JBVAL+%JBSTR
15089         IORM TT,JBWST(E)        ;TURN ON VALID AND STORED
15090 JBWT2:  PUSHJ P,JBINT   ;GIVE INT
15091         PUSHJ P,LOSSET
15092             JBPCL       ;CLEAR VALID AND STORED IF PCLSR
15093         MOVE T,E        ;CAUSES EPDL2 TO HAVE JOB INDEX
15094         PCLT
15095 JBFLS:  SKIP JBFLS
15096         PUSHJ P,UFLS    ;AWAIT RESULTS FROM HANDLER JOB
15097         MOVSI TT,%PCFPD
15098         ANDCAM TT,UUOH  ;NOW WE KNOW WE'LL RETURN TO USER WITHOUT PCLSRING FIRST
15099         JRST LSWDEL
15100
15101 JBPCL:  MOVE A,AC0S+E(U)        ;HERE IF PCLSR OUT
15102         SKIPL JBCJUI(A)         ;UNLESS HANDLER GOING AWAY
15103          TLNE A,200000          ;OR THIS SYSTEM CALL DOESN'T WANT IT,
15104           JRST JBPCL1
15105         MOVSI T,%PCFPD          ;SET FIRST PART DONE FLAG
15106         IORM T,UPC(U)           ;NOTE PCLSR HAS ALREADY MOVED UUOH INTO UPC
15107 JBPCL1: MOVSI T,%JBVAL+%JBSTR   ;NOT VALID, NOT STORED
15108         ANDCAM T,JBWST(A)
15109         JUMPGE A,CPOPJ
15110         SETOM JBCG(A)   ;SAY THE CREATOR HAS CLOSED IT
15111 IRPS X,,E TT J Q H
15112         PUSH P,X
15113 TERMIN
15114         MOVE E,A        ;AND GIVE THE HANDLER AN INTERRUPT
15115         PUSHJ P,JBINT
15116 IRPS X,,H Q J TT E
15117         POP P,X
15118 TERMIN
15119         POPJ P,
15120 \f
15121 ;JOB DEVICE BLOCK MODE IOT EITHER DIRECTION
15122 JBBI:   XCTR XRW,[MOVES D,(C)]  ;REFERENCE POINTER
15123         LDB B,[410300,,D]
15124         CAIGE B,3
15125          POPJ P,
15126         MOVEM D,JBST2(A)
15127         MOVE B,C
15128         HRRZ T,D        ;-> FIRST WORD TO TRANSFER
15129         HLROS D         ;MINUS WORD COUNT
15130         IORI D,700000   ;FLUSH CHAR COUNT
15131         SUBM T,D        ;D -> LAST WORD + 1 TO TRANSFER
15132         JRST JBIPG      ;SWAP IN BUFFER THEN DO IOT
15133
15134 ;JOB DEVICE UNIT MODE IOT EITHER DIRECTION
15135         JRST JBSI       ;SIOT
15136 JBUI:   MOVSI T,%JBSIOT
15137         ANDCAM T,JBWST(A)
15138         MOVEI T,1
15139         MOVEM T,JBST2(A)
15140         UMOVE W,(C)     ;FOR UNIT OUTPUT
15141 JBIOT1: HRRZ TT,JBOPNM(A)
15142         ROT TT,-3       ;MODE
15143         HRRI TT,1       ;IOT CMD
15144         HRRZ E,A        ;JOB CHNL INDEX
15145         MOVEM TT,JBSTS(E)
15146         MOVEM C,SRN3(U) ;MAY BE ADDRESS OF BLOCK IOT POINTER
15147         CONO PI,CLKOFF
15148         SKIPL TT,JBIOCJ(E)
15149          JRST JBWTI     ;GO SIGNAL HANDLER JOB
15150         SETZM JBIOCJ(E) ;TAKE IOC ERROR INSTEAD
15151         JRST IOCERF-MIOTER(TT)
15152
15153 ;JOB DEVICE SIOT EITHER DIRECTION
15154 JBSI:   AOS (P)                 ;SIOT SHOULD SKIP RETURN
15155         MOVSI T,%JBSIOT
15156         IORM T,JBWST(A)
15157         XCTR XRW,[MOVES T,(B)]  ;BYTE PNTR ARG
15158         LDB E,[300600,,T]       ;BYTE SIZE
15159         MOVEI D,36.
15160         IDIVM D,E       ;E := # BYTES PER WORD
15161         XCTR XRW,[MOVES D,(C)]  ;BYTE COUNT ARG
15162         MOVEM D,JBST2(A)
15163         IDIV D,E        ;D := WORD COUNT, E := EXCESS BYTES
15164         IBP T           ;-> FIRST WORD TO TRANSFER
15165         ADD D,T
15166         SOJLE E,JBIPG
15167 JBSI1:  IBP D
15168         SOJG E,JBSI1
15169 JBIPG:  HRRZS D         ;-> LAST WORD TO TRANSFER + 1
15170         ANDI T,-2000    ;-> FIRST PAGE INVOLVED IN TRANSFER
15171         LDB E,[.BP .UII#.UIO,JBOPNM(A)] ;0 INPUT 1 OUTPUT
15172 JBIPG1: SKIPE E         ;SWAP IN THE NECESSARY PAGES
15173          XCTR XR,[SKIPA 20(T)]
15174           XCTR XRW,[MOVES 20(T)]
15175         ADDI T,2000
15176         CAMGE T,D
15177          JRST JBIPG1
15178         JRST JBIOT1
15179 \f
15180 ;FLSINS ROUTINE TO WAIT FOR CREATOR TO BE HUNG AT JBFLS
15181 ;4.9 OF SRN3 = 1 => WAIT FOR WRITE   0 => READ
15182 ;1.1-1.4 => CODE OF UUO TO WAIT FOR
15183
15184 BJWAIT: SKIPE B,FLSINS(T)
15185          CAME B,JBFLS
15186           POPJ P,       ;NOT HUNG AT JBFLS
15187         HRRZ B,EPDL2(T) ;JOB INDEX THAT CREATOR IS HACKING
15188         HLRZ E,T        ;JOB INDEX OF BOJ USER
15189         CAME B,E
15190          POPJ P,        ;CREATOR HACKING JOB DEVICE ON SOME OTHER CHANNEL
15191         MOVE TT,JBSTS(B)
15192         LSH TT,2        ;4.9 => READ/WRITE BIT NOW
15193         EQV TT,SRN3(U)  ;4.9 OF SRN3 => WHAT TO LOOK FOR
15194         JUMPGE TT,CPOPJ ;DOESN'T MATCH
15195         MOVE TT,JBSTS(B) ;INSN CREATOR IS DOING
15196         XOR TT,SRN3(U)  ;INSN LOOKING FOR
15197         TRNN TT,17
15198          AOS (P)        ;THEY MATCH, AWAKEN BOJ JOB
15199         POPJ P,
15200 \f
15201 ;BOJ DEVICE UNIT MODE OUTPUT
15202 BJUO:   SKIPGE C
15203          SKIPA H,(C)
15204           UMOVE H,(C)
15205         MOVEI B,1       ;WAIT FOR INPUT IOT
15206         MOVEM B,SRN3(U)
15207         HRLZ T,A        ;JOB INDEX
15208         HRR T,JBCUI(A)  ;CREATOR'S USER INDEX
15209         PUSHJ P,CWAIT   ;WAIT FOR CREATOR TO BE IN IOT, RETURN WITH CLK OFF
15210             PUSHJ P,BJWAIT
15211         PUSHJ P,BJUO1
15212         JRST CLKONJ
15213
15214 BJUO1:  MOVE TT,JBSTS(A)
15215         TLNE TT,200000
15216          JRST BJUOB     ;BLOCK MODE CREATOR IOT
15217         LDB D,[.BP (%JBSIOT),JBWST(A)]
15218         JUMPN D,BJUOS   ;CREATOR SIOT
15219         MOVEM H,AC0S+W(T)
15220 BJIUNH: MOVSI D,%JBWIN
15221         IORM D,JBWST(A) ;SET SUCCESSFUL JOBRET BIT
15222         MOVSI D,%JBVAL+%JBSTR
15223         ANDCAM D,JBWST(A)
15224         MOVEI D,0
15225         DPB D,[350400,,JBSTS(A)]        ;DON'T SKIP
15226         EXCH D,FLSINS(T)        ;RESTART CREATOR
15227         CONSO PI,1
15228          CAME D,JBFLS
15229           BUG           ;HE WASNT WHERE HE BELONGED
15230         POPJ P,         ;NEED NOT CLKON, CALLER WILL TURN IT ON
15231
15232 ;BOJ UNIT OUTPUT TO JOB SIOT
15233 BJUOS:  PUSHJ P,BJBINI
15234         XCTRI XBYTE,[IDPB H,(B)]
15235          SKIPA C,AC0S+C(T)
15236           BUG
15237         XCTR XRW,[SOSG (C)]
15238          JRST BJIUNP
15239         JRST PLDZ
15240
15241 BJBINI: HRLI T,%UMALL
15242         MOVE J,T
15243         PUSHJ P,PLD1
15244         MOVE B,AC0S+B(T)
15245         XCTRI XRW,[MOVE D,(B)]
15246          POPJ P,
15247         BUG
15248
15249 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT
15250 BJUOB:  PUSHJ P,BJBINI
15251         SKIPL JBSTS(A)
15252          JRST BJUOBA    ;ASCII
15253         XCTRI XW,[MOVEM H,(D)]
15254          CAIA
15255           BUG
15256         ADD D,[1,,1]
15257         XCTRI XW,[MOVEM D,(B)]
15258          CAIA
15259           BUG
15260         JUMPGE D,BJIUNP
15261         JRST PLDZ
15262
15263 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT, ASCII MODE
15264 BJUOBA: LDB E,[410300,,D]       ;CHAR COUNT
15265         CAIGE E,3
15266          JRST BJIUNP
15267         XCTRI XR,[MOVE W,(D)]
15268          SKIPA E,BTOCHT-3(E)
15269           BUG
15270         IDPB H,E
15271         XCTRI XW,[MOVEM W,(D)]
15272          CAIA
15273           BUG
15274         ADD D,[700000,,]
15275         TLNN D,500000
15276          ADD D,[500001,,1]
15277         XCTRI XW,[MOVEM D,(B)]
15278          CAIA
15279           BUG
15280         TLNE D,700000
15281          JRST PLDZ
15282 BJIUNP: PUSHJ P,BJIUNH  ;UNHANG CREATOR
15283         JRST PLDZ
15284 \f
15285 ;BOJ DEVICE BLOCK OUTPUT
15286 BJBO:   SKIPGE JBCG(A)
15287          POPJ P,
15288         XCTR XRW,[MOVES D,(C)]  ;D GETS IOT POINTER
15289         LDB E,[410300,,D]
15290         CAIGE E,3
15291          POPJ P,
15292         HLRO B,D
15293         IORI B,700000   ;FLUSH CHAR CNT
15294         HRRZ T,D
15295         SUB T,B
15296         CAILE T,-1
15297          JRST IOADC             ;DON'T WRAP AROUND (WHY NOT?)
15298         UMOVE H,(D)             ;H GETS FIRST WORD
15299         MOVEI B,1
15300         PUSHJ P,BJBWT           ;WAIT FOR JOB INPUT IOT, COME BACK WITH CLK OFF.
15301          JRST CLKONJ            ;UNHANG
15302         MOVEI I,1               ;FOR BJBB
15303         MOVE TT,JBSTS(A)
15304         TLNE TT,200000
15305          JRST BJBB      ;CREATOR IOT IS IN BLOCK MODE
15306         JUMPGE TT,BJBOA ;CREATOR IOT IS ASCII
15307         ADD D,[1,,1]
15308 BJBO1:  PUSH P,C
15309         PUSH P,D
15310         PUSHJ P,BJUO1
15311         POP P,D
15312         POP P,C
15313         XCTRI XW,[MOVEM D,(C)]
15314          SKIPA T,IOTTB+BDBO
15315           BUG
15316 BJBEX:  TLNN D,700000
15317          JRST CLKONJ    ;BOJ BLOCK POINTER EXHAUSTED
15318         MOVE E,JBWST(A)
15319         CONO PI,CLKON
15320         TLNN E,%JBVAL   ;SKIP IF JOB IOT STILL WAITING FOR MORE
15321          TLNN E,%JBUNH
15322           JRST (T)      ;TRANSFER MORE
15323         POPJ P,         ;UNHANG BOJ IOT PREMATURELY
15324
15325 ;BOJ BLOCK ASCII OUTPUT FETCH CHARACTER
15326 BJBOA:  MOVE E,BTOCHT-3(E)
15327         MOVE W,H
15328         ILDB H,E
15329         ADD D,[700000,,]
15330         TLNN D,500000
15331          ADD D,[500001,,1]
15332         JRST BJBO1
15333
15334 ;BOJ BLOCK IOT WAIT.  AWAITS JOB IOT, UNLESS UNHANGING.
15335 ;TURNS CLKOFF.  SKIPS UNLESS SUPPOSED TO UNHANG.
15336 BJBWT:  MOVEM B,SRN3(U)         ;SAVE WHAT JOB UUO TO WAIT FOR
15337         HRLZ T,A                ;SET UP ARG FOR BJWAIT FLSINS
15338         HRR T,JBCUI(A)
15339         MOVE TT,JBWST(A)        ;CHECK FOR DON'T HANG MODE
15340         TLNE TT,%JBUNH
15341          JRST BJBWT1
15342         PUSHJ P,CWAIT           ;WAIT FOR JOB IOT
15343             PUSHJ P,BJWAIT
15344         JRST POPJ1
15345
15346 BJBWT1: CONO PI,CLKOFF          ;IF NOT ALREADY IN JOB IOT, DON'T WAIT
15347         JRST BJWAIT             ;TEST CREATOR STATUS, POPJ OR POPJ1
15348 \f
15349 ;BOJ DEVICE UNIT MODE INPUT
15350 BJUI:   MOVE B,[SETZ 1] ;WAIT FOR OUTPUT IOT
15351         MOVEM B,SRN3(U)
15352         HRLZ T,A        ;JOB INDEX
15353         HRR T,JBCUI(A)  ;CREATOR'S USER INDEX
15354         PUSHJ P,CWAIT   ;WAIT FOR CREATOR TO IOT, RETURN WITH CLKOFF
15355             PUSHJ P,BJWAIT
15356         PUSHJ P,BJUI1
15357         JRST CLKONJ
15358
15359 BJUI1:  MOVE TT,JBSTS(A)
15360         TLNE TT,200000
15361          JRST BJUIB     ;BLOCK MODE CREATOR IOT
15362         LDB D,[.BP (%JBSIOT),JBWST(A)]
15363         JUMPN D,BJUIS
15364         MOVE W,AC0S+W(T)
15365         JRST BJIUNH     ;SUCCESSFUL
15366
15367 ;BOJ UNIT INPUT FROM JOB SIOT
15368 BJUIS:  PUSHJ P,BJBINI
15369         XCTRI XBYTE,[ILDB W,(B)]
15370          SKIPA C,AC0S+C(T)
15371           BUG
15372         XCTR XRW,[SOSG (C)]
15373          JRST BJIUNP
15374         JRST PLDZ
15375
15376 ;BOJ UNIT INPUT FROM JOB BLOCK IOT
15377 BJUIB:  PUSHJ P,BJBINI
15378         SKIPL JBSTS(A)
15379          JRST BJUIBA
15380         XCTRI XR,[MOVE W,(D)]
15381          CAIA
15382           BUG
15383         ADD D,[1,,1]
15384         XCTRI XW,[MOVEM D,(B)]
15385          CAIA
15386           BUG
15387         JUMPGE D,BJIUNP
15388         JRST PLDZ
15389
15390 ;BOJ UNIT INPUT FROM JOB BLOCK IOT, ASCII MODE
15391 BJUIBA: LDB E,[410300,,D]       ;CHAR COUNT
15392         MOVEI W,0
15393         CAIGE E,3
15394          JRST BJIUNP
15395         XCTRI XR,[MOVE W,(B)]
15396          SKIPA E,BTOCHT-3(E)
15397           BUG
15398         ILDB W,E
15399         ADD D,[700000,,]
15400         TLNN D,500000
15401          ADD D,[500001,,1]
15402         XCTRI XW,[MOVEM D,(B)]
15403          CAIA
15404           BUG
15405         TLNN D,700000
15406          JRST BJIUNP
15407         JRST PLDZ
15408 \f
15409 ;BOJ DEVICE BLOCK MODE INPUT
15410 BJBI:   SKIPGE JBCG(A)
15411          POPJ P,                ;EOF
15412         XCTR XRW,[MOVES D,(C)]  ;D GETS IOT POINTER
15413         LDB B,[410300,,D]
15414         CAIGE B,3
15415          POPJ P,
15416         HLRO E,D
15417         IORI E,700000   ;FLUSH CHAR CNT
15418         HRRZ T,D
15419         SUB T,E
15420         CAILE T,-1
15421          JRST IOADC     ;DON'T WRAP AROUND
15422         MOVE B,[SETZ 1]
15423         PUSHJ P,BJBWT           ;WAIT FOR JOB OUTPUT IOT, COME BACK WITH CLK OFF
15424          JRST CLKONJ            ;UNHANG
15425         MOVEI I,0               ;FOR BJBB
15426         MOVE TT,JBSTS(A)
15427         TLNE TT,200000
15428          JRST BJBB      ;CREATOR IOT IS IN BLOCK MODE
15429         PUSH P,C
15430         PUSH P,D
15431         PUSHJ P,BJUI1   ;GET DATA OUT OF CREATOR UNIT MODE IOT
15432         POP P,D
15433         POP P,C
15434         MOVE H,W
15435         MOVEI T,BJBI
15436         JUMPGE TT,BJBIA ;ASCII
15437         XCTRI XW,[MOVEM H,(D)]
15438          CAIA
15439           BUG
15440         ADD D,[1,,1]
15441         JRST BJBIX
15442
15443 ;BOJ BLOCK ASCII INPUT STORE CHAR
15444 BJBIA:  LDB E,[410300,,D]
15445         CAIGE E,3
15446          JRST CLKONJ
15447         XCTRI XR,[MOVE W,(D)]
15448          SKIPA E,BTOCHT-3(E)
15449           BUG
15450         IDPB H,E
15451         XCTRI XW,[MOVEM W,(D)]
15452          CAIA
15453           BUG
15454         ADD D,[700000,,]
15455         TLNN D,500000
15456          ADD D,[500001,,1]
15457 BJBIX:  MOVEI T,BJBI
15458         XCTRI XW,[MOVEM D,(C)]
15459          JRST BJBEX
15460           BUG
15461 \f
15462 BJOV:   BJBI
15463         BJBO
15464
15465 ;BOJ BLOCK IOT TO/FROM JOB BLOCK IOT
15466 BJBB:   MOVE J,T
15467         HRLI J,%UMALL   ;UMAPS FOR PURELY CREATOR IOT
15468         MOVEM J,SRN4(U)
15469 BJBBL:  MOVE J,SRN4(U)
15470         PUSHJ P,PLD1
15471         MOVE E,SRN3(T)
15472         XCTRI XRW,[MOVES H,(E)]
15473          CAIA           ;H HAS JOB BLOCK IOT POINTER
15474           BUG
15475         PUSHJ P,PLDZ
15476         XCTRI XRW,[MOVES D,(C)]
15477          CAIA           ;D HAS BOJ BLOCK IOT POINTER
15478           BUG
15479         JUMPGE H,[PUSHJ P,BJIUNH
15480                   MOVE T,BJOV(I)
15481                   JRST BJBEX]
15482         JUMPGE D,CLKONJ
15483         HLRE B,H
15484         CAML D,H
15485          HLRE B,D       ;CHOOSE SMALLER OF TWO BLOCK SIZES
15486         MOVNS B         ;COUNT TO BE XFERRED
15487         HRLZ E,H        ;JOB ADDRESS
15488         HRR E,D         ;JOB,,BOJ  (FROM,,TO FOR BOJ INPUT)
15489         HLRZ Q,E        ;JOB ADDRESS
15490         CAIGE Q,20
15491          JRST BJBB1     ;JOB ADDR IS AN AC
15492         HRRZ J,T        ;SET UP UMAPS (JOB USER INDEX IN RH)
15493         TRZE E,400000
15494          TLOA J,%UMMPL  ;TO HI PG, HACK OUR LO PAGE
15495           TLO J,%UMMPU  ;TO LO PG, HACK OUR HI PAGE
15496         TLZE E,400000
15497          TLOA J,%UMLTU  ;TO POINT TO HIS UPPER
15498           TLO J,%UMUTL  ;TO POINT TO HIS LOWER
15499         TLNN J,%UMMPU+%UMUTL    ;MAPPING HIS UPPER FROM OUR LOWER?
15500          JRST BJBB3     ;YES.  MAKE SURE NOT SCREWED BY AC PNTR
15501 BJBB3A: PUSHJ P,PLD1
15502         TRZ Q,400000
15503         MOVNS Q         ;LIMIT SIZE OF XFER TO MIN OF
15504         ADDI Q,400000   ;DIST OF TO ADR FROM SEG BOUNDARY
15505         CAMLE B,Q       ;AND DIST OF FROM ADR FROM SEG BOUNDARY
15506          HRRZ B,Q
15507         MOVNI Q,(E)     ; - BOJ ADDR
15508         ADDI Q,400000
15509         CAMLE B,Q
15510          HRRZ B,Q
15511         TLNN J,%UMMPL   ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
15512          TLOA E,400000  ;SET JOB ADDR TO HI SEG
15513           TRO E,400000  ;SET BOJ ADDR TO HI SEG
15514         SKIPE I
15515          MOVSS E        ;XFER OTHER DIRECTION
15516         MOVE Q,E        ;SAVE COPY OF BLT POINTER
15517         ADDI B,(E)      ;GET LA + 1
15518         XCTRI XBRW,[BLT E,-1(B)]        ;XFER DATA
15519          HRRZS E,B      ;NO FAULT.  SIMULATE STORE BACK OF POINTER (CAN BE 1,,0)
15520         PUSH P,J
15521         PUSHJ P,PLDZ
15522         SUBM E,Q
15523 BJBB2:  HRLS Q          ;NUMBER OF WORDS ACTUALLY XFERRED IN BOTH HALVES
15524         XCTRI XRW,[ADDM Q,(C)]  ;UPDATE BOJ BLK PNTR
15525          JRST .+2
15526           BUG
15527         MOVE J,SRN4(U)
15528         PUSHJ P,PLD1    ;MAP TO CREATOR
15529         POP P,J
15530         MOVE W,SRN3(T)
15531         XCTRI XRW,[ADDM Q,(W)] ;UPDATE JOB BLK PNTR
15532          JRST .+2
15533           BUG
15534         CAIN B,(E)
15535          JRST BJBBL     ;NO FAULT, LOOP BACK
15536         PUSHJ P,PLD1    ;RESTORE TO FROB AT TIME OF FAULT
15537 BJBBF:  PUSHJ P,TPFLT   ;TAKE FAULT (TURNS CLK ON)
15538         PUSHJ P,MPLDZ   ;RESTORE NORMAL MAP
15539         JRST @BJOV(I)   ;RESTART THE IOT
15540 \f
15541 ;JOB ADDR IS AN AC
15542 BJBB1:  ADDI Q,UUOACS(T)
15543         JUMPN I,BJBB1A
15544         MOVE B,(Q)      ;READ JOB WORD
15545 BJBB3C: XCTRI XW,[MOVEM B,(E)]
15546          JRST .+2
15547           JRST BJBBF
15548 BJBB2A: MOVEI Q,1       ;1 WORD XFERRED
15549         HRRZ B,E        ;FAKE OUT FAULT TEST
15550         PUSH P,J
15551         JRST BJBB2
15552
15553 BJBB1A: XCTRI XR,[MOVE B,(E)]
15554          JRST .+2
15555           JRST BJBBF
15556         MOVEM B,(Q)
15557         JRST BJBB2A
15558
15559 BJBB3:  TLNE E,777760   ;SKIP ON XFERRING FROM AC AREA, HI TO HI
15560          JRST BJBB3A    ;NO.  OK TO DO BLT
15561         JUMPN I,BJBB3B
15562         HRLI J,%UMALL   ;HACK OUR HI TO POINT TO HIS HI
15563         PUSHJ P,PLD1
15564         XCTRI XR,[MOVE B,(Q)]
15565          JRST .+2
15566           BUG
15567         PUSHJ P,PLDZ
15568         HRRZ E,D        ;TO ADDRESS
15569         JRST BJBB3C
15570
15571 BJBB3B: XCTRI XR,[MOVE B,(D)]
15572          JRST .+2
15573           JRST BJBBF
15574         HRLI J,%UMALL
15575         PUSHJ P,PLD1    ;HACK OUR HI TO POINT TO HIS HI
15576         XCTRI XW,[MOVEM B,(Q)]
15577          JRST .+2
15578           BUG
15579         PUSHJ P,PLDZ
15580         JRST BJBB2A
15581 \f
15582 ;.CALL JOBGET
15583 ;ARG 1 - BOJ CHNL
15584 ;UP TO SIX WDS RETURNED
15585 ;WD1 BITS:
15586 %JG==1,,525252
15587                 ;4.9-4.7 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
15588                 ;    4.9-4.7 SHOULDN'T BE USED, SINCE THE FULL MODE IS IN WD7 ON AN OPEN
15589 %JGCLS==40000   ;4.6 => CLOSE  (NOTE 4.5 USED TO BE A CLS BIT ALSO)
15590 %JGSIO==1000    ;4.1 => SIOT (ONLY IF OPCODE = 1)
15591 %JGFPD==200     ;3.8 => THIS CALL WAS PCLSRED AND IS RESTARTING
15592 ;1.4-1.1 => TYPE OF OPERATION
15593 %JO==,,-1
15594 %JOOPN==0       ;OPEN
15595 %JOIOT==1       ;IOT/SIOT
15596 %JOLNK==2       ;MLINK
15597 %JORST==3       ;RESET
15598 %JORCH==4       ;RCHST
15599 %JOACC==5       ;ACCESS
15600 %JORNM==6       ;FDELE (DELETE OR RENAME)
15601 %JORWO==7       ;FDELE (RENAME WHILE OPEN)
15602 %JOCAL==10      ;SYMBOLIC .CALL
15603
15604 ;WD2 SET ONLY FOR BLOCK IOT POINTER, ACCESS POINTER, NEW FN1 FOR FDELE
15605 ;WD3    FN1
15606 ;WD4    FN2
15607 ;WD5    SYS NAME
15608 ;WD6    LEFT ADJUSTED DEVICE NAME
15609 ;WD7    NEW FN2 FOR FDELE.
15610 ;IGNORE ALL RETURNED INFO ON AN ERROR RETURN
15611 ;IF 4.5 OR 4.6 IS SET THEN ALL ELSE IS MEANINGLESS
15612
15613 NJBGT:  SETZM T         ;INDICATE JOBGET, NOT JOBCAL
15614 NJBCL0: HLRZ E,H        ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15615         TLNN R,%CLSBJ   ;NOT A BOJ CHANNEL => WRONG TYPE DEVICE
15616          JRST OPNL34
15617         CONO PI,CLKOFF
15618         MOVE C,JBWST(E)
15619         TLNN C,%JBVAL
15620          JRST NJBGTE    ;FAIL IF VALID NOT SET
15621         TLZ C,%JBSTR
15622         MOVEM C,JBWST(E)        ;CLEAR STORED BIT
15623         MOVE B,JBCUI(E)
15624         MOVE B,SUUOH(B)
15625         CONO PI,CLKON
15626         MOVE A,JBSTS(E)
15627         TLZ A,077777    ;FLUSH RANDOM BITS FROM LH
15628         TLNE B,%PCFPD
15629          TLO A,%JGFPD
15630         TLNE C,%JBSIOT
15631          TLO A,%JGSIO
15632         JUMPN T,NJBCL1  ;BRANCH IF JOBCAL
15633 NJBGT0: MOVE B,JBST2(E)
15634         MOVE C,JBOFN1(E)
15635         MOVE D,JBOFN2(E)
15636         MOVE TT,JBODEV(E)
15637         MOVE I,JBNFN2(E)
15638         MOVE E,JBOSYN(E)
15639         CONO PI,CLKON
15640         JRST POPJ1
15641
15642 NJBGTE: SKIPL JBCG(E)   ;HAS CREATOR GONE AWAY?
15643          JRST OPNL36    ;NO, VALID CLEAR
15644         CONO PI,CLKON   ;YES, GIVE CLOSE
15645         MOVSI A,%JBLOS
15646         IORM A,JBWST(E)
15647         MOVSI A,%JGCLS  ;GIVE CLOSE BITS
15648         JRST POPJ1      ;DON'T GIVE ANYTHING ELSE WHETHER JOBGET OR JOBCAL
15649 \f
15650 ;       .CALL ADR
15651 ;       ERROR RETURN
15652 ;       NORMAL RETURN
15653
15654 ;ADR:   SETZ
15655 ;       SIXBIT /JOBCAL/
15656 ;       [BOJCHNL]
15657 ;       [-N,,ADR OF DATA BUFFER]        ;OPTIONAL
15658 ;       SETZM OPCODE
15659 ; OPCODE WILL BE THE SAME AS RETURNED IN WD1 BY JOBGET
15660 ; IF OPCODE<10 THEN WD2-WD7 OF JOBGET WILL BE WRITTEN INTO DATA BUFFER
15661 ;       FOLLOWED BY JOB'S EPDL AND EPDL3 (THE BPS FOR BP-STYLE OPENS, ETC).
15662 ;IF OPCODE=10 THEN JOB'S LAST .CALL WILL BE DESCRIBED:
15663 ;       WORD 1 OF DATA BUFFER => SIXBIT OF OPERATION (I.E. THE NAME
15664 ;               OF THE .CALL)
15665 ;       WORD 2 OF DATA BUFFER => FLAG BITS OF .CALL
15666 ;       WORD 3 OF DATA BUFFER => # OF ARGS TO .CALL
15667 ;       WORDS 4-12 => INPUT ARGS TO .CALL
15668
15669 NJBCL:  CAIL W,2                ;DID CALLER SUPPLY AOBJN POINTER?
15670          SKIPN T,B              ;IF SO AND NON-ZERO USE IT
15671           MOVEI T,1             ;OTHERWISE SET T NONZERO
15672         JRST NJBCL0             ;GO JOIN JOBGET CODE FOR ERROR CHECKING
15673
15674 NJBCL1: JUMPGE T,POPJ1          ;BACK FROM JOBGET - ANY AOBJN PNTR?
15675         MOVEI C,9               ;YES - OPCODE 10?
15676         TRNN A,10
15677          JRST NJBCL2            ;NO - JUST COPY 9 STANDARD ARGS
15678         HLRE D,T                ;GET LENGTH OF USERS DATA BUFFER
15679         MOVE B,JBCUI(E)         ;GET JOB'S USER INDEX
15680         MOVE C,LSCALL(B)        ;GET NAME OF JOB'S LAST CALL
15681         UMOVEM C,(T)            ;PUT INTO CALLERS BUFFER
15682         AOJE D,POPJ1            ;IF NO MORE ROOM - DONE
15683         MOVE C,CTLBTS(B)        ;GET USER'S .CALL FLAG BITS
15684         UMOVEM C,1(T)
15685         AOJE D,POPJ1
15686         LDB C,[230400,,JBSTS(E)]        ;GET # OF ARGS
15687         UMOVEM C,2(T)
15688         JUMPE C,POPJ1           ;ANY ARGS TO PASS?
15689         ADD T,[3,,3]            ;YES - COPY INTO BUFFER
15690 NJBCL2: JUMPGE T,POPJ1          ;ANY ROOM LEFT?
15691         MOVNS C                 ;GET SMALLEST WORD COUNT
15692         HLRE B,T
15693         CAMLE C,B
15694          HRL T,C                ;MAKE AOBJN PNTR AS SMALL AS POSSIBLE
15695         MOVE H,E                ;JOB INDEX IN H FOR USING JBACTB
15696         MOVEI B,JBACTB          ;GET PNTR TO ARG TABLES
15697 NJBCL3: MOVE C,@(B)             ;GET NEXT ARG
15698         UMOVEM C,(T)            ;GIVE TO CALLER
15699         AOS B
15700         AOBJN T,NJBCL3
15701         JRST POPJ1              ;DONE - GO SKIP
15702 \f
15703 ;       .CALL ADR
15704 ;       ERROR RETURN
15705 ;       NORMAL RETURN
15706
15707 ;ADR:   SETZ
15708 ;       SIXBIT /JOBRET/
15709 ;       [BOJCHNL]
15710 ;       [OPEN LOSS #(IF RH = 0),,# TIMES FOR CREATING JOB TO SKIP]
15711 ;       SETZ [-N,,ADR OF DATA BUFFER]
15712
15713 ;RETURN DATA (E.G. RETURN TO RCHST,STATUS OR THE RETURN ARGS TO A .CALL)
15714 ;WILL BE COPIED FROM THE CALLER'S DATA BUFFER
15715
15716 NJBRT:  HLRZ E,H        ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15717         TLNN R,%CLSBJ   ;NOT BOJ CHNL => WRONG TYPE DEVICE.
15718          JRST OPNL34
15719         CAIGE W,3       ;RETURN ARGS PROVIDED?
15720          SETZM C        ;NO - ZERO IT
15721         JUMPGE C,NJBRT1 ;DO NOTHING IF NO RETURNS OR NO AOBJN
15722         HLRE D,C        ;GET LENGTH OF BUFFER
15723         CAMGE D,[-8.]   ;MAKE SURE AREA AT MOST 8 LONG
15724          MOVNI D,8      ;OVER 8 - USE 8
15725         HRL C,D         ;FIX AOBJN PNTR
15726         MOVMS D
15727         ADDI D,-1(C)    ;GET ADDRESS OF LAST WORD NEEDED
15728         XCTR XR,[SKIP (C)]      ;MAKE SURE PAGES ARE IN
15729         XCTR XR,[SKIP (D)]
15730 NJBRT1: CONO PI,CLKOFF  ;NOW OK TO TURN CLOCK OFF
15731         MOVE A,JBWST(E)
15732         TLNE A,%JBVAL
15733          TLNE A,%JBSTR
15734           JRST OPNL36   ;FAIL IF STORED IS SET OR IF VALID IS CLEARED
15735         SKIPGE JBCG(E)
15736          JRST OPNL41
15737         HRRZ TT,JBCUI(E)
15738         MOVE D,FLSINS(TT)
15739         CAME D,JBFLS
15740          BUG
15741         TLO A,%JBWIN
15742         TLZ A,%JBVAL+%JBSTR
15743         MOVEM A,JBWST(E)        ;SET SUCCESSFUL JOBRET BIT, CLEAR VALID AND STORED
15744         DPB B,[350400,,JBSTS(E)]        ;NUMBER OF TIMES TO SKIP
15745         MOVSS B
15746         DPB B,[270600,,JBSTS(E)]        ;OPEN LOSS
15747         MOVSI B,-6              ;DEFAULT # WDS TO RETURN FOR .RCHST IS 6.
15748         MOVEM B,JBAC11(E)
15749         JUMPGE C,NJBRT3         ;ANY RETURN ARGS?
15750         MOVEM C,JBAC11(E)       ;REMEMBER HOW MANY, FOR .RCHST TO RETURN THAT MANY.
15751         MOVE H,E                ;YES - COPY THEM
15752         MOVEI D,JBACTB
15753 NJBRT2: XCTRI XR,[MOVE B,(C)]   ;GET IT
15754          AOSA D
15755           BUG                   ;PAGE IS TIED - NO?
15756         MOVEM B,@-1(D)          ;PUT INTO ARG TABLE
15757         AOBJN C,NJBRT2
15758 NJBRT3: SETZM FLSINS(TT)        ;RESTART CREATOR
15759         JRST CLKOJ1
15760
15761 ;JOB DEVICE CLOSE ROUTINE
15762 JOBCLS: SETOM JBCG(A)
15763         MOVE E,A
15764         CONO PI,CLKOFF
15765         PUSHJ P,JBINT   ;INTERRUPT POOR BOJ GUY
15766         JRST CLKONJ     ;SINCE HE HAS NO CREATOR
15767 \f
15768 ; ROUTINES FOR JOB ACCESS, RFPNTR, RESET, AND STATUS
15769
15770 RFPJOB: MOVEI J,4               ;USE OLD .RCHST OPERATION, OPCODE 4
15771         HRRM J,JBSTS(A)
15772         MOVE E,A
15773         CONO PI,CLKOFF
15774         PUSHJ P,JBWT            ;SIGNAL JOB, WAIT FOR ANSWER
15775         HLRE TT,JBAC11(E)       ;GET # VALUES RETURNED
15776         MOVNS TT
15777         CAIL TT,5
15778          SKIPA A,JBODEV(E)      ;GET ACCESS POINTER RETURNED
15779           SETO A,               ;NO ACCESS POINTER RETURNED, USE -1
15780         CAIL TT,6               ;UP TO TWO MORE EXTRA RCHST RESULTS MIGHT BE RETURNED
15781          MOVE Q,JBNFN2(E)
15782         CAIL TT,7
15783          MOVE I,JBAC7(E)
15784         CAIL TT,5
15785          MOVEI W,1(TT)          ;# RESULTS FOR RCHST
15786         MOVEI B,36.             ;ALWAYS RETURN 36. AS BYTE SIZE UNTIL MORE WINNING
15787         JRST POPJ1              ;CONVENTIONS EXIST.
15788
15789 JBSTAT: HLRZ A,(R)      ;GET JOB INDEX
15790         HRRZ D,JBWST(A) ;GET MOST RECENT STATUS
15791         POPJ P,
15792
15793 JBORS:
15794 JBIRS:  MOVEI D,3       ;RESET IS OPCODE 3
15795         HLRZ A,(R)
15796         HRRM D,JBSTS(A)
15797         CONO PI,CLKOFF
15798         MOVE E,A
15799         PUSHJ P,JBWT    ;WAIT FOR IT TO GET PROCESSED
15800         POPJ P,
15801
15802 JBACCS: MOVEI D,5       ;ACCESS IS OPCODE 5
15803         HLRZ A,(R)
15804         HRRM D,JBSTS(A)
15805         MOVEM B,JBST2(A)
15806         CONO PI,CLKOFF
15807         MOVE E,A
15808         PUSHJ P,JBWT
15809         JRST POPJ1
15810 \f
15811 ;.CALL JOBIOC           (OLD NAME SETIOC STILL WORKS)
15812 ;ARG1:  CHANNEL BOJ DEVICE IS OPEN ON
15813 ;ARG2:  TYPE OF IOCER TO CAUSE
15814
15815 ;THIS CALL CAUSES THE NEXT IOT EXECUTED BY THE
15816 ;PROCEDURE ON THE OTHER END OF THE CHANNEL TO GET
15817 ;THE SPECIFIED IO CHANNEL ERROR
15818
15819 NSTIOC: HLRZ E,H        ;GET JOB CHNL IDX FROM LH OF IOCHNM WD.
15820         CAIL B,MIOTER
15821          CAILE B,NIOTER
15822           JRST OPNL33   ;BAD ARG. (NOT LEGAL IOCER)
15823         TLO B,(SETZ)    ;IN CASE IOCER 0 EVER EXISTS
15824         TLNN R,%CLSBJ
15825          JRST OPNL34    ;NOT BOJ CHANNEL
15826         CONO PI,CLKOFF
15827         MOVE A,JBCUI(E) ;PREPARE TO STOP CREATOR.
15828         SKIPGE JBCG(E)
15829          JRST OPNL41    ;CREATOR WENT AWAY
15830         MOVE H,APRC(A)
15831         TLNE H,BULGOS
15832          JRST OPNL41    ;HE'S BEING KILLED NOW.
15833         PUSHJ P,RPCLSR  ;STOP
15834         MOVEM B,JBIOCJ(E)
15835         AOS (P)
15836         JRST UPCLSR
15837
15838
15839 ;.CALL JOBSTS
15840 ;ARG1 - CHANNEL BOJ IS OPEN ON   - REMAINING ARGS ARE OPTIONAL  -
15841 ;ARG2 - NEW STATUS (RIGHT HALF OF STATUS WORD ONLY - I.E. DEVICE DEPENDENT STUFF)
15842 ;ARG3 - NEW DEVICE NAME FOR PEEK, WHO-LINE STATUS, RFNAME/RCHST
15843 ;ARG4 - NEW FN1 FOR ..
15844 ;ARG5 - NEW FN2 FOR ..
15845 ;ARG6 - NEW SNAME FOR ..
15846 ;ARG7 - NEW OPEN MODE FOR ..
15847 ;ARG8 - BP TO ASCIZ STRING IN USER ADDRESS SPACE CONTAINING FULL FILENAMES.
15848
15849 NJBSTS: TLNN R,%CLSBJ
15850          JRST OPNL34
15851         HLRZ A,(R)      ;GET JOB INDEX
15852         CAIGE W,2       ;DID HE SUPPLY STATUS?
15853          MOVEI B,SNJOB  ;NO - RESET TO INITIAL
15854         HRRM B,JBWST(A) ;REMEMBER WHAT HE SAYS
15855         MOVEI B,8
15856         SUB B,W
15857         JUMPGE B,.+1(B) ;STORE WHATEVER ADDITIONAL ARGS WERE GIVEN
15858           JSP B,NJBST2          ;8
15859           JSP B,NJBST1          ;7
15860           MOVEM TT,JBSYS(A)     ;6
15861           MOVEM E,JBFN2(A)      ;5
15862           MOVEM D,JBFN1(A)      ;4
15863           MOVEM C,JBDEV(A)      ;3
15864           JRST POPJ1            ;2
15865           JRST POPJ1            ;1   (DON'T TAKE THIS INSN OUT)
15866
15867 NJBST1: XOR I,JBOPNM(A)
15868         TRNE I,.BAO#.UAI
15869          JRST OPNL12            ;NOT ALLOWED TO CHANGE BLOCK VS UNIT, IN VS OUT
15870         XORM I,JBOPNM(A)
15871         JRST (B)
15872
15873 NJBST2: MOVE R,Q                ;STORE BP IN Q INTO JBFNP WORD,
15874         PUSHJ P,ASCIND          ;AFTER DOING INDEXING AND INDIRECT.
15875         MOVEM R,JBFNP(A)
15876         JRST (B)
15877 \f
15878 ;       .CALL ADR       ;SKIPS UNLESS JOB END OF CHNL NOT THERE
15879
15880 ;ADR:   SETZ
15881 ;       SIXBIT /JOBINT/
15882 ;       401000,,BOJCH
15883
15884 ;GIVE CREATOR A SECOND WORD INT ON CHANNEL CORRESP TO BOJCH
15885
15886 NJBINT: TLNN R,%CLSBJ   ;ERROR IF NOT BOJ CHNL.
15887          JRST OPNL34
15888         CONO PI,CLKOFF
15889         HLRZ E,H
15890         SKIPGE JBCG(E)
15891          JRST OPNL41
15892         MOVE A,JBCUI(E)
15893         MOVSI D,%CLSJ
15894         SETZ C,
15895         PUSHJ P,CHSCAA
15896             PUSHJ P,[HRRZ B,(R)
15897                      SKIPGE R           ;IOPDL CHNLS DON'T INTERRUPT
15898                       TDNN D,CLSTB(B)
15899                        POPJ P,
15900                      HRRZ B,R
15901                      SUBI B,IOCHNM(A)
15902                      IOR C,CHNBIT(B)
15903                      POPJ P,]
15904         AND C,MSKST2(A)
15905         JUMPE C,OPNL41  ;I CAN'T
15906         MOVN B,C
15907         AND C,B         ;INT ONLY ONCE, ON HIGHEST NUMBERED CHANNEL
15908         IORM C,IFPIR(A)
15909         JRST CLKOJ1
15910
15911
15912 ;.CALL JOBREU
15913 ;ARG 1 - SIMULATED DEVICE NAME
15914 ;ARG 2 - FN1 OF ..
15915 ;ARG 3 - FN2 OF ..
15916 ;ARG 4 - SNAME OF FILE WHICH HANDLER LOADED FROM
15917 ;ARG 5 - AMOUNT OF TIME TO SLEEP WAITING FOR SOMEONE TO OPEN
15918
15919 ;THIS CALL, WHEN EXECUTED BY A JOB DEVICE HANDLER JOB, MAKES
15920 ;THE HANDLER AVAILABLE FOR RE-USE.  TAKES SUCCESS RETURN IF
15921 ;SOMEONE REUSES YOU; YOU SHOULD THEN DO THE "INITIAL JOBGET"
15922
15923 NJBREU: SKIPGE H,JBI(U)
15924          JRST OPNL10    ;NOT A BOJ HANDLER JOB
15925         SKIPL JBCG(H)
15926          PUSHJ P,UFLS   ;WAIT FOR CLOSE TO FINISH HAPPENING
15927         MOVEM A,JBODEV(H)
15928         MOVEM B,JBOFN1(H)
15929         MOVEM C,JBOFN2(H)
15930         MOVEM D,JBOSYN(H)
15931         TLNE E,1000
15932          JRST [ MOVNI E,(E)     ;IMMEDIATE TIME, LOSE ON PCLSR
15933                 SUB E,TIME      ;BUT ACCEPT ANYWAY SINCE NETBLK DOES
15934                 JRST NJBRU1 ]
15935         MOVE TT,E
15936         UMOVE E,(TT)    ;GET TIME ARGUMENT
15937         JUMPL E,NJBRU1
15938         MOVNS E
15939         SUB E,TIME
15940         UMOVEM E,(TT)   ;POS REL TIME GIVEN, MAKE NEG ABS AND WRITE BACK
15941 NJBRU1: MOVSI TT,%JBREU         ;E NOW HAS NEGATIVE TIME TO SLEEP UNTIL
15942         IORM TT,JBWST(H)
15943         PUSHJ P,LOSSET
15944             NJBRUL              ;TURN OFF %JBREU WHEN CALL EXITED FOR WHATEVER REASON
15945         SKIPA T,H
15946          PUSHJ P,NJBRUW
15947           PUSHJ P,UFLS
15948         SKIPGE JBCG(H)
15949          JRST OPNL41    ;TIMED OUT
15950         JRST LSWPJ1
15951
15952 ;FLSINS ROUTINE TO WAIT UNTIL TIMED OUT OR OPENED BY SOMEONE
15953 NJBRUW: MOVN A,AC0S+E(U)
15954         CAML A,TIME
15955          SKIPL JBCG(T)
15956           AOS (P)
15957         POPJ P,
15958
15959 ;LOSSET ROUTINE TO LEAVE AWAITING-REUSE STATE
15960 NJBRUL: MOVSI A,%JBREU
15961         MOVE T,AC0S+H(U)
15962         ANDCAM A,JBWST(T)
15963         POPJ P,
15964 \f
15965 SUBTTL PERIPHERAL DEVICE ROUTINES IN SEPARATE FILES
15966
15967 IFN NMTCS,[
15968  IFN TM10P,[
15969 $INSRT MTAPE
15970  ]
15971  IFN TM03S,[
15972 $INSRT NMTAPE
15973 ]
15974 ]
15975 IFN NUNITS,[
15976 $INSRT UTAPE
15977 ]
15978
15979 $INSRT DISK
15980
15981 IFN NETP,[      ; General ITS network code, includes specific nets
15982 OVHMTR NET
15983 $INSRT NET
15984 ]
15985
15986 IFN E.SP,[
15987 $INSRT ITSDIS
15988 ]
15989
15990 IFN MSPP,[
15991 $INSRT ITSMSP
15992 ]
15993
15994 $INSRT TS3TTY
15995
15996 $INSRT ITSDEV
15997
15998 .BYTE 0         ;RECORD THE SYMS .EVAL'ED BY USER PROGRAMS
15999 $INSRT EVSYMS
16000 .BYTE
16001 \f
16002 SUBTTL DM DAEMON UUO'S
16003
16004 IFE DEMON,ADEMON==ILUUO
16005
16006 IFN DEMON,[
16007 ADEMON: JUMPE J,[AOJA J,.+2]    ;IF J = 0 THEN SUBTRACT ONE
16008         UMOVE J,(J)     ;GET VALUE HERE
16009         PUSHJ P,LSWTL
16010         400000,,DEMSW
16011         PUSHJ P,DEMUSR  ;FIND CURRENT USER IN DEMON TABLE
16012         JRST UTOLKJ     ;FAIL, JUST RETURN, NOT DEMON
16013         HRRE TT,DMTTBL+2(B)
16014         SUB TT,J
16015         HRRM TT,DMTTBL+2(B)     ;PUT NEW COUNT IN DEMON TABLE
16016         SKIPLE TT
16017 UTOLJ1: AOS (P)
16018 UTOLKJ: CONO PI,UTCON
16019         JRST LSWPOP
16020
16021 ADEMSIG:MOVE D,B
16022         CONO PI,CLKOFF  ;DON'T LET SYS JOB LOOK TILL WE'RE READY.
16023         MOVSI T,SCLDMN  ;TELL IT TO LOOK FOR US, AFTER UFLS TURNS CLOCK ON.
16024         IORM T,SUPCOR
16025         SETZB T,SRN3(U) ;SYS JOB WILL SETOM SRN3 TO RESTART US
16026         SKIPN SRN3(U)   ;WITH 0 IN T => FILE EXISTS, OR OPNL CODE.
16027          PUSHJ P,UFLS   ;SYS JOB DETECTS US BY PC=ADEMS1.
16028                         ;DEMON NAME IS EXPECTED TO BE IN A.
16029 ADEMS1: JUMPN T,OPNL1-1(T)
16030         CAIGE W,2       ;NO SECOND ARG, JST SIGNAL
16031          JRST ADEMS3
16032         JUMPL D,NUDMTB  ;IF 2ND ARG < MERELY CALL NUJBST, NO DEMON ENTRY
16033         TDZA TT,TT      ;ZERO OUT TT
16034 ADEMS3:  SETOM TT       ;SET FLAG
16035         PUSHJ P,LSWTL   ;SIEZE SWITCH
16036             DEMSW
16037         PUSHJ P,DEMSIG
16038          JRST LSWPOP    ;SIGNAL FAILED
16039         SKIPN TT        ;FLAG NOT SET
16040          HRLM D,DMTTBL +2(B)    ;SET TIME RQ
16041         JRST CKOPJ1     ;RELEASE SWITCH
16042
16043 NUDMTB: PCLT
16044         PUSHJ P,DMBLK1  ;WAIT TILL DEMON BLOCK IS CLEARED
16045          PUSHJ P,UFLS
16046         HRROI T,DMBLK
16047         MOVEM A,DMBLK   ;SAVE IN BLOCK NOW
16048         PUSHJ P,NUJBST
16049          JRST NUDMTB    ;IF FAILURE AFTER WAIT LOOP BACK
16050         JRST POPJ1      ;SUCCESS
16051
16052 DMBLK1: SKIPGE DMBLK+1  ;FOR DEMON BLOCK TEST
16053          POPJ P,        ;RETURN, NOT FINISHED LOADING
16054         MOVE T,UTTYCT
16055         CAIGE T,MXCZS   ;ROOM IN RING BUFFER
16056          AOS (P)
16057         POPJ P, ;SKIP IF ROOM
16058 \f;UTILITY ROUTINES FOR DEAMONS
16059
16060 DEMSIG: PUSHJ P,DEMNAM  ;LOOK FOR NAME
16061         JRST DEMSG2     ;HAVE TO MAKE NEW ENTRY
16062 DEMSG1: AOS (P)
16063         HLLZ E,DMTTBL+2(B)      ;18 BITS 2'S COMPLEMENT
16064         AOS DMTTBL+2(B)
16065         HLLM E,DMTTBL+2(B)      ;MUST DO THIS WAY TO FIT ABOVE
16066         SKIPE DMTTBL+1(B)       ;DOWN, WANT SYS JOB TO LOOK AT
16067         POPJ P,
16068         MOVSI E,SCLDMN
16069         IORM E,SUPCOR
16070         AOS REQCNT      ;ONLY SIGNAL IF NECESSARY
16071         POPJ P,
16072
16073 DEMSG2: SOSGE DEMCNT    ;IF NO ROOM FLUSH
16074         POPJ P,
16075         PUSH P,A
16076         MOVEI A,DMTLL   ;BUMP POINTER
16077         ADDB A,DMTPTR
16078         IDIVI A,DMLNG   ;TRUNCATE TO LENGNTH OF TABLE
16079         SKIPE DMTTBL(B)
16080         JRST .-4        ;SEARCH FOR NEW ENTRY
16081         POP P,DMTTBL(B) ;SET NAME IN TABLE
16082         JRST DEMSG1
16083
16084 ;ROUTINES TO FIND ENTRY IN TABLE.
16085 ;DEMNAM TAKES NAME IN A, DEMUSR TAKES USER INDEX IN U
16086 ;THEY SKIP RETURN IF SUCCESSFUL, RETURN OTHERWISE
16087 ;IF SUCCESSFUL DEMON TABLE INDEX IS IN B
16088
16089 DEMUSR: JUMPL U,CPOPJ
16090         MOVSI B,-DMLNG
16091         CAMN U,DMTTBL+1(B)
16092         JRST POPJ1
16093         ADD B,[DMTLL,,DMTLL]
16094         JUMPL B,.-3
16095         POPJ P,
16096
16097 DEMNAM: MOVSI B,-DMLNG  ;SEARCH BY NAME
16098         CAMN A,DMTTBL(B)
16099         JRST POPJ1
16100         ADD B,[DMTLL,,DMTLL]
16101         JUMPL B,.-3
16102         POPJ P,
16103
16104 DEMOUT: PUSHJ P,LSWTL   ;CALLED BY KILLING JOB (IN CASE OWNED)
16105         400000,,DEMSW
16106         PUSHJ P,DEMUSR
16107         JRST UTOLKJ
16108         SETZM DMTTBL+1(B)       ;MARK AS DOWN,SYSTEM JOB DECIDES WHAT TO DO
16109         AOS REQCNT
16110         MOVSI B,SCLDMN
16111         IORM B,SUPCOR
16112         JRST UTOLKJ
16113
16114 DEMMRV: SETZM DMTTBL+2(B)       ;CALL WITH UTCOFF (SYS JOB) REMOVES ENTRY FROM TBL
16115         SETZM DMTTBL+3(B)       ;WITH INDEX OF DEMON IN B
16116         SETZM DMTTBL(B)
16117         MOVEI B,1
16118         AOSGE DEMCNT
16119         MOVEM B,DEMCNT
16120         JRST UTCONJ
16121
16122 \f
16123 ;DEAMON READ AND SET STATUS ROUTINES
16124
16125 ARDDMST:        PUSHJ P,LSWTL   ;READ DEAMON STATUS
16126         DEMSW
16127         PUSHJ P,DEMNAM
16128         JRST RDDMS1     ;LOST TRY USER INDEX
16129         MOVE A,DMTTBL+1(B)
16130         MOVEI C,L
16131         IDIVM C,A       ;DIVIDE BY L, DON'T CLOBBER B
16132 RDDMS2: MOVE C,DMTTBL+3(B)
16133         MOVE B,DMTTBL+2(B)
16134         PUSHJ P,LSWPOP
16135         JRST POPJ1
16136
16137 RDDMS1: PUSH P,U
16138         MOVE U,A
16139         PUSHJ P,DEMUSR  ;BAD USER
16140         JRST LKUPOP
16141         POP P,U
16142         MOVE A,DMTTBL(B)
16143         JRST RDDMS2
16144 LKUPOP: POP P,U
16145         JRST LSWPOP
16146
16147 ASTDMST:        PUSHJ P,LSWTL   ;SET DEAMON STATUS
16148         400000,,DEMSW
16149         MOVE D,B
16150         PUSHJ P,DEMNAM
16151         JRST STDMS1
16152 STDMS2: JUMPL D,STDMS4
16153 STDMS3: SOSLE W
16154         MOVEM D,DMTTBL+2(B)
16155         SOSLE W
16156         MOVEM C,DMTTBL+3(B)
16157         JRST UTOLJ1
16158 STDMS1: PUSH P,U
16159         MOVE U,A
16160         PUSHJ P,DEMUSR
16161         JRST UTULKP
16162         POP P,U
16163         JUMPGE D,STDMS2
16164 STDMS4: SKIPGE DMTTBL+1(B)      ;REMOVE FROM TABLE IF POSSIBLE
16165         JRST UTOLKJ     ;CAN'T DELETE, LOADING
16166         SETZM DMTTBL+1(B)       ;DOWN
16167         SETZM DMTTBL+2(B)       ;REMOVE REQUESTS
16168         AOS REQCNT      ;SIGNAL SYS JOB
16169         MOVSI B,SCLDMN
16170         IORM B,SUPCOR
16171         JRST UTOLJ1
16172 UTULKP: POP P,U
16173         JRST UTOLKJ
16174 ]
16175
16176 \f
16177 SUBTTL .GETSYS UUO
16178
16179 ;.GETSYS AC,    ;TRANSFERS SYSTEM AREA SPECIFIED BY C(AC+1)
16180                 ;TO USER AREA STARTING AT R.H. C(AC) OF LENGTH MINUS L.H. C(AC)
16181
16182 AGETSYS:
16183 ; Alan 4/2/86:  Took this out because people don't use .GETSYS this way
16184 ; anymore:
16185 ;       PUSHJ P,UDELAY          ;CAUSE A SCHEDULE TO STOP GETSYSER FROM
16186 ;                               ; MONOPOLIZING SYSTEM
16187         MOVSI A,-LGSNAM         ;NEGATIVE OF TABLE LENGTH
16188         UMOVE B,1(J)            ;LOOK AT USERS AC+1, THE 6BIT NAME
16189         CAME B,GSNAME(A)        ;CYCLE THROUGH TABLE
16190          AOBJN A,.-1            ;OF NAMES, POINTER IN RIGHT HALF OF A
16191         JUMPGE A,AGETSL         ;JUMP IF NOT IN TABLE
16192         UMOVE B,(J)             ;GET POINTER TO USERS RECEPTACLE BLOCK
16193 AGETS1: HLRZ C,GSYS1(A)         ;GET LOW END OF BLOCK
16194         HRRZS A                 ;CLEAR COUNT IN L.H. OF A
16195         CAIGE A,NUTCFN          ;SKIP IF UTC OFF NOT REQUIRD
16196          CONO PI,UTCOFF         ;TURN OFF ALL CHANNELS BUT CH 1
16197         skipn c                 ; If LH contains 0, RH is routine to call.
16198          jrst @gsys1(a)         ; (JUMPE C,@GSYS1(A) generates spurious
16199                                 ; page faults, so don't "fix" this.)
16200         HRRZ D,GSYS1(A)         ;GET HIGH END OF BLOCK
16201 ;AT THIS POINT:         ;B USER'S POINTER (UNRELOCATED)
16202                         ;C BEGINNING OF AREA IN SYS
16203                         ;D END OF AREA
16204 agets2: SUBI D,-1(C)            ;BLOCK LENGTH TO BE SENT
16205         HLRZ E,B                ;GET NEG BLK LENGTH FROM USERS PNTR
16206         ADDI E,-1(D)            ;-1 CAUSES CARRY BIT IF .GT.
16207         TLNE E,-1               ;CARRY INDICATES LOSS
16208          JRST AGETS5            ;MORE THAN USER WANTS
16209         HRLS D                  ;BLOCK LENGTH IN BOTH HALVES
16210         HRRZ E,B                ;FIRST WORD (UNRELOCATED)
16211         HRL E,C                 ;SOURCE ADDRESS FOR BLT
16212         HRRZ C,E                ;DESTINATION INTO C
16213         ADD C,D                 ;FINAL ADDRESS +1
16214 AGETS7: XCTRI XBW,[BLT E,-1(C)] ;BLT IT TO HIM
16215          AOSA (P)               ;INCREMENT RETURN, INDICATE SUCCESS
16216           JRST AGETS6
16217         CONO PI,UTCON
16218         ADD B,D
16219         UMOVEM B,(J)            ;TELL USER HOW MUCH HE GOT
16220 AGETS4: POPJ P,
16221
16222 AGETSL: XCTR XW,[SETZM 1(J)]    ;INDICATE BAD SIXBIT
16223         POPJ P,
16224
16225 AGETS5: MOVNS D                 ;TELL USER HOW MUCH HE NEEDS
16226         CONO PI,UTCON           ;NEGATIVE OF RIGHT BLOCK LENGTH
16227         XCTR XRW,[HRLM D,(J)]   ;SET UP PROPER BLOCK LENGTH IN HIS AC
16228         JRST AGETS4
16229
16230 AGETS6: CONO PI,UTCON           ;ONE PAGE WASN'T THERE
16231         XCTR XRW,[MOVES (E)]    ;SO TOUCH IT (TAKE MPV INTERRUPT IF REAL MPV)
16232         JRST AGETS1             ;AND TRY AGAIN (BLT WILL GET FARTHER THIS TIME)
16233                                 ;HAD TO RETRY FROM BEGINNING SINCE THIS MAY BE
16234                                 ;ONE THAT HAS TO BE TRANSFERRED INTACT WITH UTCOFF
16235 \f
16236 GSNAME: SIXBIT /MEMORY/
16237 IFN NUNITS,SIXBIT /UTAPE/
16238 IFN NCPP,[SIXBIT /NCPSM/
16239         SIXBIT /NCPPQ/
16240         SIXBIT /NCPHT/
16241 ]
16242 NUTCFN==.-GSNAME        ;NUMBER TO GET WITH UTCOFF (same as NETOFF)
16243         SIXBIT /USERS/
16244         SIXBIT /USER/
16245         SIXBIT /GETS/
16246         SIXBIT /DEVS/
16247         SIXBIT /CALLS/
16248 IFN IMXP,       SIXBIT /IMPX/
16249         SIXBIT /CLINK/
16250         SIXBIT /DSYMS/
16251         SIXBIT /USYMS/  ;.UPC, .VAL, .TTY, ETC.
16252         SIXBIT /CHDEVS/
16253         SIXBIT /NCALLS/
16254         SIXBIT /TTYVAR/
16255         SIXBIT /USRVAR/
16256         SIXBIT /ITSNMS/
16257 LGSNAM==:.-GSNAME
16258
16259 ;ENTRIES ARE:   BOTTOM,,TOP  OF AREA TO BE TRANSMITTED OR INST TO EXECUTE
16260 GSYS1:  IOBFTL,,EMEMTL          ;lh zero => jrst to THIS ENTRY
16261 IFN NUNITS, UTCHNT,,UTCHE       ;UTAPE
16262 IFN NCPP,[IMSOKB,,IMSOKE        ;NCP SOCKET MAP
16263         IMPBPQ-1,,IMPEPQ        ;NCP PENDING RFC QUEUE
16264         IMPHTB,,IMPHTB+255.     ;NCP HOST TABLE
16265 ]
16266         0,,USRSV                ;USERS
16267         0,,USR1V                ;USER
16268         GSNAME,,GSNAME+LGSNAM-1 ;GETS
16269         DEVTAB,,EDEVS           ;DEVS
16270         SYSYMB,,SYSYME          ;CALLS
16271 IFN IMXP,       IMXTBB,,IMXTBE  ;IMPX
16272         CLVBEG,,CLVEND          ;CLINK
16273         0,,DSYMS                ;DSYMS
16274         SYSUSB,,SYSUSE          ;USYMS
16275         DCHSTB,,DCHSTE          ;CHDEVS
16276         SYSCTB,,SYSCTB+LSYSCT-1 ;NCALLS
16277         TYVTAB,,TYVTAB+LTYVTA-1 ;TTYVAR
16278         USETTB,,USETTB+MXVAL-1  ;USRVAR
16279         ITSNMS,,ITSNMS+LITSNM-1 ;ITSNMS
16280 IFN LGSNAM-<.-GSYS1>, .ERR GSNAME and GSYS1 don't match.
16281
16282 ITSNMS: ITSIRP [
16283         SIXBIT /ITS/
16284         ]
16285 LITSNM==:.-ITSNMS
16286         0
16287         0                       ; Make it easy to add more.
16288
16289 USRSV:  MOVEI C,USRSTG
16290         MOVE D,USRHI
16291         ADDI D,USRSTG-1
16292         JRST agets2
16293
16294 USR1V:  UMOVE C,2(J)
16295         IMULI C,LUBLK
16296         CAML C,USRHI
16297          JRST USR1VL
16298         ADDI C,USRSTG
16299         MOVE D,C
16300         ADDI D,LUBLK-1
16301         JRST agets2
16302
16303 USR1VL: XCTR XW,[SETOM 2(J)]
16304         JRST AGETS4
16305
16306 DSYMS:  HRRZ C,DDT-2
16307         HLRE D,DDT-2
16308         SETCMM D        ;OFFSET BY ONE
16309         ADD D,C
16310         JRST agets2
16311 \f
16312 SUBTTL .GETLOC, .EVAL, ETC.
16313
16314 ;GET AN ABSOLUTE LOCATION       ;.GETLOC AC,    ;C(A)=FROM(ABS),,TO(RELATIVE)
16315 ;
16316 AGETLOC:UMOVE A,(J)             ;GET TO ADDRESS
16317         HLRZ B,A                ;GET FROM ADDRESS
16318         XCTRI [MOVE C,(B)]
16319          JRST .+2
16320           JRST ILEXPF           ;ILLEGAL EXEC PAGE FAULT
16321         UMOVEM C,(A)            ;GIVE TO USER
16322         POPJ P,
16323
16324 ;SET AN ABSOLUTE LOCATION       ;.SETLOC AC,    ;C(AC)=FROM(RELATIVE),,TO(ABS)
16325 ;
16326 ASETLOC:TDZA D,D        ;CLEAR COND FLAG, SKIP
16327
16328 ;SET AN ABSOLUTE LOCATION ONLY IF C(ABS)=C(TEST) & SKIP IF SUCCESSFUL
16329 ;.IFSET AC,     ;C(AC)=<POINTER TO 2 WORD BLOCK>,,TO ADR(ABS)
16330 ;WORD 1=TEST    ;WORD 2=NEW C(ABS)
16331
16332 AIFSET: MOVNI D,1       ;SET COND FLAG
16333         XCTR XR,[HRRZ A,(J)]    ;GET TO ADDRESS (ABSOLUTE)
16334         XCTR XR,[HLRZ B,(J)]
16335         UMOVE C,(B)             ;GET WORD
16336         XCTRI [MOVES (A)]
16337          JRST .+2
16338           JRST ILEXPF
16339         JUMPE D,ASPST1  ;NORMAL SETLOC
16340         UMOVE D,1(B)    ;GET NEW VALUE
16341         CONO PI,CLKOFF  ;PREVENT INTERRUPTS
16342         CAME C,(A)      ;CHECK WORD AGAINST TEST WORD
16343          JRST CLKONJ    ;NOT EQUAL => IGNORE
16344         MOVE C,D
16345         AOS (P)         ;CAUSE RETURN TO SKIP
16346         CAIG A,SYSB_10. ;CHECK IF IN SYS
16347          JRST ASPST1    ;YES SO DO REG SETLOC
16348         EXCH D,(A)      ;NO SO DO NOW BEFORE SHUFFLE & GET OLD
16349 ASPST2: MOVE C,D
16350         HRROS A         ;LET SYS JOB KNOW ALREADY DONE
16351 ASPST1: CAMN C,(A)      ;SKIP IF DIFFERENT FROM C(TO ADR)
16352          JRST CLKONJ    ;SAME
16353         MOVE D,SYSITM   ;IF SYSTEM JOB HAS BEEN HUNG OR LOOPING FOR 30 SEC,
16354         ADDI D,30.*30.
16355         CAMGE D,TIME
16356          JUMPGE A,ASPST3        ;GO DO THE WORK OURSELVES (BUT DON'T DO IT TWICE).
16357 ASPST4: MOVE D,UNAME(U) ;GET UNAME OF SETLOCER
16358         MOVSI T,SCLSET
16359         PUSHJ P,CWAIT   ;WAIT TILL VARIABLES TO COMMUNICATE WITH SYS JOB ARE FREE
16360             TDNE T,SUPCOR       ;ARG TO CALL IN .-1
16361         MOVEM A,SETSLC  ;REMEMBER ABS LOCATION
16362         MOVEM C,SETSLQ  ; " NEW CONTENTS (OR OLD IF LH(SETSLC)=-1)
16363         MOVEM D,SETSU   ; " USER
16364 CSPST:  IORM T,SUPCOR   ;TELL SYS JOB TO DO IT
16365         JRST CLKONJ
16366
16367 ASPST3: HRRZ D,UPC      ;SYS JOB HAS BEEN HANGING FOR 30 SEC.
16368         CAIN D,SCOR1    ;WHY? JUST SLEEPING?
16369          JRST ASPST4    ;YES => SIGNAL IT TO DO THE WORK
16370         MOVEM C,(A)     ;ELSE GIVE UP ON IT AND DO IT NOW
16371         JRST CLKONJ
16372 \f
16373 ;LOOK UP ITS SYMBOL     ;.EVAL AC,      ;C(AC)=SQUOZE SYMBOL
16374 ;REPLACES SYMBOL BY VALUE & SKIPS IF SUCCESSFUL
16375 ;IF YOU WANT TO .EVAL A SYMBOL IN A PROGRAM HABITUALLY AND IMPLICITLY,
16376 ;AND WANT IT TO CONTINUE TO WORK, YOU HAD BETTER ADD AN ENTRY TO THE FILE
16377 ;AI:SYSTEM;EVSYMS > SAYING WHAT PROGRAM AND WHAT SYMBOL. THEN, ITS HACKERS
16378 ;CAN AVOID SCREWING YOU WITHOUT WARNING.
16379
16380 AEVAL:  PUSHJ P,SWTL
16381         ARDFSW
16382         UMOVE B,(J)     ;GET SYM
16383         PUSHJ P,SYMLK   ;LOOK UP
16384         JRST LSWPOP     ;NOT FOUND
16385         MOVE A,(C)      ;GET VALUE
16386         PUSHJ P,LSWPOP
16387         AOS (P)         ;CAUSE UUO TO SKIP
16388         JRST APTUAJ     ;RETURN VALUE
16389
16390 ;REDEFINE ITS SYMBOL    ;.REDEF AC,     ;C(AC)=POINTER TO 2 WORD BLOCK
16391 ;WORD 1 = SYMBOL        ;WORD 2 = VALUE
16392 ;DELETE SYM IF ALL 4 FLAG BITS SET
16393 ;  OTHERWISE SET SYMBOL FLAGS TO THOSE SPECIFIED, EXCEPT REJECT ANY ATTEMPT TO
16394 ;  ADD A PROGRAM NAME
16395 ;ADD SYM IF NOT FOUND   ;FAIL ONLY IF NOT ENOUGH ROOM
16396 ;SKIPS IF SUCCESSFUL
16397
16398 AREDEF: PUSHJ P,SWTL
16399             ARDFSW
16400         XCTR XR,[HRRZ D,(J)]    ;GET POINTER FROM AC
16401         UMOVE B,(D)     ;GET SYMBOL
16402         PUSHJ P,SYMLK   ;LOOK UP
16403         JRST ARDF2      ;NOT FOUND, CREATE
16404         XCTR XR,[SETCM A,(D)]   ;GET SYM (COMPLEMENTED)
16405         TLNN A,740000   ;SKIP IF ANY FLAGS NOT SET
16406         JRST ARDF3      ;ALL SET => DELETE
16407         SETCA A,
16408         TLNN A,740000
16409         JRST LSWPOP
16410         MOVEM A,-1(C)
16411         UMOVE A,1(D)    ;GET VALUE
16412         MOVEM A,(C)     ;STORE IN SYMTAB
16413         JRST ARDF4      ;SORT AND SKIP-RETURN.
16414
16415 ARDF2:  MOVE C,DDT-2    ;GET POINTER
16416         SUB C,[2,,2]    ;DECREMENT FOR NEW ENTRY
16417         MOVEI A,-1(C)   ;FUDGE FOR BLOCK CALC
16418         LSH A,-10.      ;CONVERT TO # OF BLOCKS UP TO SYMTAB -1
16419         UMOVE B,(D)     ;GET SYM
16420         MOVE T,FDDTPG
16421         LSH T,10.
16422         TLNE B,740000   ;LOSE IF PROG NAME
16423         CAMLE A,T       ;CHECK FOR LOSSAGE
16424          JRST LSWPOP    ;DON'T OVERWRITE ITS
16425         EXCH B,2(C)     ;STORE OVER GLOBAL BLOCK HEADER,
16426         MOVEM B,(C)     ;MOVE THAT HEADER DOWN 2 WDS.
16427         UMOVE A,1(D)    ;GET VALUE
16428         EXCH A,3(C)
16429         ADD A,[-2,,]    ;1 MORE SYM IN GLOBAL BLOCK.
16430         MOVEM A,1(C)    ;STORE
16431         MOVEM C,DDT-2   ;UPDATE POINTER
16432         JRST ARDF4      ;GO SORT AND SKIP-RETURN.
16433
16434 ARDF3:  MOVE B,DDT-2    ;GET POINTER
16435         MOVE A,(B)      ;MOVE THE GLOBAL HEADER
16436         EXCH A,2(B)     ;UP OVER 1ST SYM
16437         MOVEM A,-1(C)   ;WHICH GOES INTO FREE SLOT.
16438         MOVE A,1(B)
16439         ADD A,[2,,]     ;GLOBAL BLOCK 1 SYM SHORTER.
16440         EXCH A,3(B)
16441         MOVEM A,(C)
16442         MOVE A,[2,,2]
16443         ADDM A,DDT-2    ;UPDATE POINTER
16444 ARDF4:  MOVSI E,(SETZ)  ;TELL DDT ITS SYMTAB WAS ALTERED.
16445         IORM E,DDT-1
16446         PUSHJ P,SBUBL   ;DO 1 BUBBLE-SORT UP AND 1 DOWN.
16447         JRST LSWPJ1     ;FREE ARDFSW AND EXIT.
16448 \f
16449 ;DO ONE BUBBLE SORT PASS UP, ONE DOWN; LEAVE J <0 IFF DID AN EXCHANGE.
16450 ;CLOBBER A-E.
16451 SBUBL:  MOVE E,DDT-2
16452         HLL E,1(E)
16453         ADD E,[2,,2]    ;AOBJN -> SYMS IN GLOBAL BLOCK.
16454 SBUBL0: SETZ J,
16455         MOVE B,[2,,2]   ;INCREMENT FOR UPWARD PASS.
16456         MOVE C,[JUMPL A,SBUBL1]
16457         SUBI E,2        ;(WILL INCREMENT BEFORE ACTING)
16458         MOVE A,E
16459         PUSHJ P,SBUBL2
16460         MOVNS B         ;DECREMENT FOR DOWNWARD PASS.
16461         MOVE C,[CAMN A,E]
16462         JRST SBUBL2
16463
16464 SBUBL1: MOVE D,1(A)     ;CHECK NEXT PAIR OF ENTRIES.
16465         CAMG D,3(A)
16466          JRST SBUBL2    ;IN CORRECT ORDER.
16467         EXCH D,3(A)
16468         MOVEM D,1(A)    ;WRONG ORDER, EXCHANGE.
16469         MOVE D,(A)
16470         EXCH D,2(A)
16471         MOVEM D,(A)
16472         SETO J,         ;SAY DID AN EXCHANGE.
16473 SBUBL2: ADD A,B         ;MOVE TO NEXT ENTRY.
16474         XCT C           ;TEST IF FINISHED.
16475          POPJ P,
16476         JRST SBUBL1     ;(NOT FINISHED)
16477
16478 ;LOOK UP SYMBOL IN B IN ITS SYMBOL TABLE (CLOBBERS A,B,C)
16479 ;RETURN WITH POINTER TO VALUE WORD IN C
16480 ;SKIPS IF SUCCESSFUL
16481
16482 SYMLK:  TLZ B,740000    ;FLUSH FLAGS
16483         MOVE C,774000-2 ;PICK UP AOBJN POINTER TO SYMTAB FROM EXEC DDT
16484 SYMLK2: MOVE A,(C)      ;GET SYM
16485         AOBJP C,[JRST 4,.+1]    ;INCREMENT POINTER
16486         TLNE C,376      ;GO THROUGH HAIR EVERY 200 SYMS
16487         JRST SYMLK3     ;NOT THIS TIME
16488         PUSHJ P,OPBRK
16489 SYMLK3: TLNN A,200000   ;SKIP IF DELETE INPUT (FLAG PREVENTS MATCH)
16490         TLZE A,740000   ;FLUSH FLAGS & CAUSE LOSS IF ALL 0 (PROG NAME)
16491         CAME A,B        ;COMPARE
16492         AOBJN C,SYMLK2  ;LOSS, TRY ANOTHER
16493         JUMPL C,POPJ1   ;SKIP RETURN IF FOUND
16494         POPJ P,         ;NOT SO IF LOSS
16495
16496 AWSNAME:XCTR XR,[SKIPE B,(J)]   ;OPER 35
16497          MOVEM B,USYSNM(U)
16498         POPJ P,
16499
16500 AUPISET:UMOVE B,(J)     ;OPER 36
16501         ASH B,-35.
16502         EXCH B,PICLR(U)
16503         UMOVEM B,(J)
16504         SKIPN PICLR(U)
16505          POPJ P,
16506         JRST APISE1
16507 \f
16508 ;GENERATE A UNIQUE SYM  ;.GENSYM AC,    ;LOADS AC WITH SYM
16509 ;
16510 AGENSYM:PUSHJ P,SWTL    ;WAIT TILL INTERLOCK FREE THEN SEIZE IT
16511           GENSSW
16512         MOVEI TT,IGNSYM
16513         PUSHJ P,SIXAOS  ;INCREMENT SYM
16514         MOVE A,IGNSYM   ;GET SYM
16515         PUSHJ P,LSWPOP  ;UNLOCK FOR NEXT USER
16516         JRST APTUAJ     ;GIVE USER GENERATED SYMBOL
16517
16518 ;GENERATE A UNIQUE NUM  ;.GENNUM AC,    ;LOADS AC WITH NUMBER 
16519 ;
16520 AGENNUM:AOS A,IGNNUM    ;INCREMENT NUMBER
16521         JRST APTUAJ     ;AND GIVE IT TO USER
16522
16523 EBLK
16524
16525 GENSSW: -1
16526         0
16527 IGNSYM: SIXBIT /SYS/
16528
16529 IGNNUM: 0
16530
16531 BBLK
16532
16533 SIXAOS: PUSH P,I
16534         PUSH P,J
16535         AOS (TT)        ;INCREMENT SYM
16536         MOVE I,[440600,,(TT)]   ;GET POINTER TO FIRST CHAR
16537 SIXAS2: ILDB J,I        ;GET FIRST (NEXT) CHAR
16538         SKIPN J         ;SKIP IF NOT ZERO
16539         MOVEI J,1       ;REPLACE EMBEDDED SPACE WITH "!"
16540         DPB J,I         ;PUT BACK
16541         CAME I,[60600,,(TT)]    ;SKIP IF FIRST FIVE CHARS HAVE BEEN EXAMINED
16542          JRST SIXAS2    ;GO TO NEXT CHAR
16543         POP P,J
16544         POP P,I
16545         POPJ P,
16546 \f
16547 IFN KL10P,[
16548
16549 SUBTTL KL10 PERFORMANCE COUNTER
16550
16551 ;KLPERF SYMBOLIC SYSTEM CALL
16552 ;ARG 1: <JOB> TO MEASURE PERFORMANCE DURING;
16553         ;-3 => NULL JOB, -4 => ALL JOBS
16554 ;ARG 2: P.A. ENABLES WORD (SEE NON-EXISTENT KL10 SYS REF MAN)
16555         ;0 => FREE THE FACILITY, ELSE TRIES TO GRAB IT
16556 ;NO ARGS => JUST READS THE VALUES WITHOUT CHANGING THE ENABLING CONDITIONS.
16557         ;IN THAT CASE, IT IS OK IF FACILITY IS OWNED BY SOMEONE ELSE
16558 ;VAL 1: PREVIOUS <JOB> SETTING
16559 ;VAL 2: PREVIOUS P.A. ENABLE WORD
16560 ;VAL 3: TIME BASE HIGH WORD
16561 ;VAL 4: TIME BASE LOW WORD
16562 ;VAL 5: PERF CTR HIGH WORD
16563 ;VAL 6: PERF CTR LOW WORD
16564
16565 KLPERF: CONO PI,CLKOFF
16566         JUMPN W,KLPER1
16567 KLPER0: MOVE J,MTRJOB   ;NO ARGS => DONT CHANGE SETTINGS,
16568         MOVE B,PAEON    ;JUST RETURN CURRENT COUNT.
16569         JRST KLPER3
16570
16571 KLPER1: JUMPN B,KLPER2  ;TRYING TO TURN IT ON?
16572         CAME U,MTRUSR
16573          JRST KLPER0    ;FREEING THE FACILITY WHEN DON'T OWN IT?
16574         PUSHJ P,PRFOFF  ;NO, TRYING TO FREE IT - DO SO.
16575         MOVEI J,-2
16576         JRST KLPER3
16577
16578 KLPER2: SKIPGE MTRUSR   ;IF FACILITY IS FREE, SIEZE IT.
16579          MOVEM U,MTRUSR
16580         CAME U,MTRUSR
16581          JRST OPNL10    ;ALREADY BELONGS TO SOME OTHER JOB.
16582         MOVEI J,2(A)
16583         CAIN J,-2       ;ALL JOBS?
16584          JRST KLPER4
16585         CAIN J,-1       ;NULL JOB?
16586          JRST KLPER3
16587         MOVE J,A
16588         JSP T,NCRUI2    ;ELSE DECODE JOB SPEC; OBJECT TO PDP6
16589          JFCL
16590         CAME J,U
16591          JRST KLPER3
16592 ;TRYING TO TURN ON FOR SELF OR ALL JOBS - IT OUGHT TO BE ON RIGHT NOW!
16593 KLPER4: CONO MTR,2001   ;TURN ON TIME BASE, INTERVAL PIA=1
16594         WRPAE B         ;SET ENABLES
16595 KLPER3: EXCH B,PAEON
16596         SKIPGE A,MTRJOB
16597          TRZA A,2       ;UN CONVERT -1 => -3, -2 => -4
16598           LSH A,-9      ;IDIVI A,LUBLK
16599 IF2 IFN LUBLK-1000,.ERR NO DIVIDE
16600         HRREM J,MTRJOB
16601         RCCL C          ;C,D GET TIME BASE
16602         RPERFC E        ;E,TT GET PERFC
16603         JRST CLKOJ1
16604
16605 ;TURN OFF THE PERFORMANCE COUNTER.  PUT BACK IN RUN-TIME MEASURING MODE
16606 PRFOFF: MOVNI A,2       ;NOT ATTACHED TO ANY JOB
16607         MOVEM A,MTRJOB
16608         WRPAE [1576,,1200]      ;MEASURE MAIN-PROGRAM TIME IN 80 NS UNITS (MODEL A)
16609         CONO MTR,4001   ;TIME-BASE OFF, INTERVAL PIA=1
16610         RPERFC STPERF   ;START-OF-QUANTUM TIME IS NOW
16611         RPERFC NULPRF   ;ALSO FOR NULL-JOB
16612         SETOM MTRUSR    ;NO LONGER IN USE
16613         POPJ P,
16614 ] ;END IFN KL10P
16615 \f
16616 $INSRT CORE             ;CORE JOB AND MEMORY MANAGEMENT ROUTINES
16617
16618 SUBTTL NULL DEVICE
16619 ;  IMMEDIATE EOF ON INPUT, HAS NO EFFECT ON OUTPUT
16620 ;
16621 NULO:   HLRS A,C                ;REMEMBER MODE FOR .STATUS
16622         JSP Q,OPSLC3            ;SET UP IOCHNM WORD AND EXIT
16623             NLIDN,,NLODN        ;ARG
16624             NLBIDN,,NLBDN       ;ARG
16625
16626 ;UNIT NULL DEVICE INPUT
16627 NULI:   JRST UNIEOF
16628
16629 ;BLOCK NULL DEVICE INPUT
16630 NULBI:  POPJ P,
16631
16632 ;BLOCK NULL DEVICE OUTPUT ENTRY
16633 ;ADVANCE BLOCK MODE .IOT POINTER
16634 NULBOD: XCTR XR,[HLRE A,(C)]    ;GET NEG LENGTH FROM LEFT HALF
16635         MOVNS A                 ;GET POSITIVE LENGTH
16636         XCTR XR,[ADD A,(C)]     ;ADD STARTING LOC (R.H.)
16637         XCTR XW,[HRRZM A,(C)]   ;STORE BACK "COUNTED OUT" POINTER
16638         POPJ P,
16639
16640 ;STANDARD DEVICE .STATUS ROUTINE
16641 STDSTA: DPB A,[60300,,D]        ;A HAS LH OF IOC WORD
16642         TRO D,1_9               ;SYS BUF CAP FULL
16643         TRNE D,1_6              ;SKIP IF INPUT
16644         TRC D,3_9               ;TURN OFF SYS BUF CAP FULL, SET EMPTY
16645         POPJ P,
16646 \f
16647 SUBTTL USER DEVICE
16648
16649 UBPFJ==10       ;DEMAND FOREIGN JOB (BIT IN LH (DEV) FOR .OPEN (USR))
16650
16651 USROJ:  TDZA J,J        ;ENTRY FROM JOB DEVICE DONT GET CORE.
16652 USRO:   MOVNI J,1       ;INDICATE NOT FROM JOB OPEN
16653         CAIA
16654 USROOJ:  MOVEI J,1      ;OJB DEVICE; EXISTING JOB OK ONLY IF %OPOJB BIT SET.
16655         PCLT
16656         SKIPL CORRQ(U)
16657         PUSHJ P,UFLS    ;PREVENT ATTEMPT TO CORE, PCLSR OUT, AND THINK YOU'VE WON AT SETBF1, ETC
16658         PUSHJ P,SWTL
16659             TREESW
16660         JUMPE B,USRO4   ;JNAME = 0 => UNAME IS JOB SPEC.
16661         SKIPN A         ;IF UNAME=0
16662          MOVE A,UNAME(U)        ;MAKE IT THIS JOB'S UNAME
16663         CAME A,UNAME(U) ;SKIP IF FIRST FILE NAME IS UNAME OF OPENER
16664          JRST USROA
16665         CAME B,[SIXBIT /PDP10/] ;SKIP IF SECOND FILE NAME IS "PDP10"
16666          CAMN B,[SIXBIT /PDP6/] ;OR PDP6
16667 IFN PDP6P,JRST PDPO
16668     .ELSE JRST OPNL1
16669 USROA:  CONO PI,CLKOFF
16670         PUSHJ P,LSWPOP  ;TREESW
16671 USROB:  SETZ TT,
16672 USRO3:  CAME A,UNAME(TT)
16673          JRST AGIN
16674         CAMN B,JNAME(TT)
16675          JRST UFN1      ;FOUND UNAME JNAME PAIR
16676 AGIN:   ADDI TT,LUBLK
16677         CAMGE TT,USRHI
16678          JRST USRO3
16679         TLNE C,UBPFJ    ;JOB MUST EXIST TO WIN IF UBPFJ SET
16680          JRST OPNL4
16681         CAME A,UNAME(U) ;INFERIOR PROCEDURE MUST HAVE SAME UNAME
16682          JRST OPNL20
16683         PUSH P,U
16684 TCORS:  MOVSI T,%TBNOT+%TBDTY   ;DOESN'T HAVE TTY, ISN'T GIVING IT AWAY
16685         PUSHJ P,USTRA
16686          JRST TCORS1    ;USTRA FAILED - SEE WHY, MAYBE RETRY (U CLOBBERED)
16687         MOVEM A,UNAME(U)
16688         MOVEM B,JNAME(U)
16689         MOVEM A,USYSNM(U)
16690         MOVE TT,U
16691         POP P,U
16692         MOVE A,UTMPTR(U)
16693         MOVEM A,UTMPTR(TT)
16694         MOVE A,HSNAME(U)
16695         MOVEM A,HSNAME(TT)
16696         MOVE A,XUNAME(U)
16697         MOVEM A,XUNAME(TT)
16698         MOVEM B,XJNAME(TT)
16699         PUSHJ P,USRST5  ;SET UP TTY STUFF
16700         MOVSI A,400000
16701         SKIPGE APRC(U)
16702          IORM A,APRC(TT)        ;NEW INFERIOR IS DISOWNED IF CREATOR IS.
16703         JUMPE J,CLKOJ1  ;RETURN HERE FOR JOB DEVICE (INDEX IN TT)
16704         PUSHJ P,ULUP1   ;FIND AN INTERRUPT BIT FOR THE JOB.
16705          JRST NOGO1     ;NONE => GO KILL THE JOB AND RETURN FAILURE.
16706         CONO PI,CLKON   ;NOW CAN'T FAIL TO CREATE THE JOB FOR GOOD.
16707         HRLZ B,B
16708         HRR B,U
16709         MOVEM B,SUPPRO(TT)
16710         MOVE U,TT
16711         PUSHJ P,UFOUND  ;SET UP THE OPENER'S CHANNEL.
16712          JFCL
16713         MOVE Q,TT
16714         MOVEI B,1
16715         PUSHJ P,ACORE1  ;MAY PCLSR OUT, BUT CORE JOB WILL DO WORK ANYWAY.
16716          SKIPA R,UUAC(U);NO CORE AVAILABLE, KILL THE JOB
16717           JRST POPJ1    ;SUCCESS
16718         ADDI R,IOCHNM(U)
16719         PUSHJ P,AUCLOSE
16720         JRST OPNL37     ;NO CORE AVAILABLE
16721 \f
16722 ULUP1:  CLEARB A,T
16723 ULUP:   HRRZ E,SUPPRO(T)
16724         SKIPN UNAME(T)  ;SKIP IF VARIABLE BLOCK IN USE
16725         JRST ULUP2
16726         CAIN E,(U)      ;SKIP IF NOT AN INFERIOR
16727         IOR A,SUPPRO(T) ;IOR IN INTERRUPT BIT OF INFERIOR
16728 ULUP2:  ADDI T,LUBLK    ;ADVANCE TO NEXT BLOCK
16729         CAMGE T,USRHI   ;SKIP IF ALL EXAMINED
16730         JRST ULUP       ;LOOP
16731 UFIN:   MOVEI B,1       ;SELECT INT BIT
16732 UFIN2:  TLON A,(B)
16733         JRST POPJ1
16734         LSH B,1
16735         CAIGE B,1_<NINFP>
16736         JRST UFIN2
16737         POPJ P,
16738
16739 NOGO1:  MOVSI T,BULGO+BULGOS
16740         IORM T,APRC(TT) ;TELL THE SYS JOB TO KILL THE JOB WE JUST GOT
16741         MOVSI T,SCLGUN
16742         IORM T,SUPCOR
16743         JRST OPNL5      ;DIREC FULL (TOO MANY LOSERS)
16744
16745 NOGO4:  SUB P,[1,,1]
16746         JRST OPNL6
16747
16748 TCORS1: PCLT            ;COME HERE FROM TCORS IF ATTEMPT TO FIND FREE JOB SLOT FAILED.
16749         SKIPGE SJCFF    ;IF THIS IS NEGATIVE, USTRA DIDN'T EVEN REQUEST MORE
16750          JRST [ SKIPGE SJCFF
16751                  PUSHJ P,UFLS
16752                 JRST TCORS2]
16753         MOVE TT,USRHI
16754         CAIL TT,MAXJ*LUBLK
16755          JRST NOGO4                     ;USER MEM EXPANDED TO MAX
16756         SKIPGE SUPCOR   .SEE SCLEX      ;PRESUMABLY USTRA ASKED SYS JOB FOR MORE JOB SLOTS
16757          PUSHJ P,UFLS                   ;SO WAIT TILL SYS JOB ANSWERS THE REQUEST
16758 TCORS2: CONO PI,CLKOFF                  ;AND SEE IF THERE ARE NOW ENOUGH SLOTS.
16759         JRST TCORS
16760 \f
16761 USRO4:  EXCH J,A        ;USR: OPEN WITH JNAME=0: USE UNAME AS JOB SPEC.
16762         JSP T,NCORUI
16763          JFCL
16764 IFN PDP6P,[
16765         CAIN J,-1       ;SPEC'D JOB IS PDP6 => OK,
16766          JRST PDPO
16767 ]
16768         CONO PI,CLKOFF
16769         PUSHJ P,LSWPOP  ;SOS DIELOK(J)
16770         PUSHJ P,LSWPOP  ;TREESW
16771         MOVE TT,J
16772         MOVE J,A
16773 ;COME HERE WHEN JOB ALREADY EXISTS, WITH CLOCK OFF AND USR IDX IN TT.
16774 ;A, B, C STILL HAVE UNAME, JNAME AND OPEN MODE.
16775 UFN1:   JUMPE J,[ADDI B,10000   ;OPENING JOB-DEVICE AND JOB EXISTS??
16776                  JRST USROB]    ;KEEP CHANGING JNAME UNTIL WE CREATE A JOB.
16777         CAIG TT,LUBLK
16778          JUMPL J,UFNDF          ;SKIP SOME CHECKS ON SYS & CORE
16779         JUMPG J,[MOVSI T,%OPOJB         ;OJB DEVICE OPEN; IF JOB DOESN'T HAVE %OPOJB SET,
16780                 TDNE T,OPTION(TT)       ;THEN IT HASN'T GIVEN PERMISSION TO BE HACKED.
16781                  SKIPL JBI(TT)          ;IF IT'S ALREADY A JOB DEVICE DON'T HACK IT.
16782                   JRST [CONO PI,CLKON   ;IN EITHER CASE, WAIT TILL ALL'S OK,
16783                         SKIPL JBI(TT)
16784                          PUSHJ P,UFLS
16785                         TDNN T,OPTION(TT)
16786                          PUSHJ P,UFLS
16787                         JRST USROOJ]    ;THEN RE-TRY THE OPEN.
16788                 LDB T,[.BP BULGOS_22,APRC(TT)]
16789                 JUMPN T,OPNL42
16790                 JRST CLKOJ1]    ;RETURN SUCCESS TO JOBO6C.
16791         TLNE C,UBPFJ
16792          JRST UFNDF     ;USER WANTS IT AS FOREIGN JOB
16793         HRRZ E,SUPPRO(TT)
16794         CAIN E,(U)
16795          JRST UFN1C     ;OPENING UP INFERIOR
16796         SKIPGE T,APRC(TT)
16797          SKIPL SUPPRO(TT)       ;UNLESS IT'S A TOP-LEVEL DISOWNED JOB,
16798           JRST UFNDF    ;THEN FOREIGN JOB
16799         PUSHJ P,UFN2B   ;REOWN DISOWNED TREE
16800          POPJ P,        ;CAN'T
16801         JRST UFOUND     ;DID
16802
16803 UFN1C:  MOVE U,TT       ;OPENING PROCEDURE IMMEDIATE SUPERIOR OF PROCEDURE BEING OPENED
16804         JRST UFOUND
16805 \f
16806 ;
16807 ; REOWN A DISOWNED PROCEDURE TREE
16808 ;
16809
16810 NREOWN: TLNN R,%CLSFU           ;MUST BE A FOREIGN USER CHANNEL
16811          JRST OPNL34
16812         CONO PI,CLKOFF
16813         HLRZ TT,H
16814         SKIPGE T,APRC(TT)
16815          SKIPL SUPPRO(TT)
16816           JRST OPNL31           ;TO A TOP-LEVEL DISOWNED JOB
16817         HRLM R,(P)
16818         PUSHJ P,UFN2B           ;REOWN THE JOB (TURNS CLOCK ON)
16819          POPJ P,                ;FAILED
16820         HLRZ R,(P)              ;TURN THE CHANNEL INTO AN INFERIOR CHANNEL.
16821         MOVNI T,FUWIDN-UWIDN
16822         ADDM T,(R)
16823         JRST POPJ1
16824
16825 ;REOWN JOB TT POINTS TO, ITS APRC IS IN T.  SKIPS IF SUCCESSFUL.
16826 ;CALL WITH CLKOFF, WILL TURN IT ON.
16827 UFN2B:  TLNE T,BULGOS
16828          JRST OPNL42    ;CAN'T REOWN JOB WHICH IS LOGGING OUT.
16829         SKIPGE APRC(U)  ;IF REOWNING JOB IS DISOWNED, PROHIBIT SO THAT
16830          JRST OPNL31    ;IT DOESN'T REOWN ITSELF AND SCREW THINGS UP
16831         PUSHJ P,ULUP1   ;FIND AN INTERRUPT BIT FOR IT. (IN B)
16832          JRST OPNL5     ;WE HAVE 8 INFERIORS ALREADY.
16833         AOS (P)         ;GOING TO WIN
16834         SETOM DLSRCH    ;INHIBIT SCHEDULING
16835         CONO PI,CLKON   ;TURN CLOCK BACK ON, THIS MAY TAKE A WHILE
16836         MOVSI A,BUMRTL  ;DOOMED DETACHED JOBS ARE RESCUED BY REOWNING.
16837         ANDCAM A,APRC(TT)
16838         MOVE A,UNAME(U) ;PICK UP NEW UNAME
16839         SETCM D,APRC(U)
16840         TLZ D,#400000   ;SIGN OF D SET IFF REOWNER ISN'T DISOWNED.
16841         MOVE J,UTMPTR(U) ;PICK UP NEW USER RESOURCE POINTER
16842         HRR D,J
16843         SUBI J,USRRCE   ;GET NEW CONSOLE #
16844         CAIL J,NCT      ;IF NEW TREE STILL HAS NO TTY,
16845          MOVEI J,%TINON ;"DISOWNED" TTY CHNLS SHOULD REMAIN SUCH
16846 ;HERE, A HAS UNAME, D HAS <SIGN IFF MAKING NON-DISOWNED>,,UTMPTR, J HAS CONSOLE # OR %TINON,
16847 ;U HAS REOWNER, TT HAS JOB BEING REOWNED.
16848 UFN2A:  PUSH P,B        ;SAVE INTERRUPT BIT
16849 UFN3:   MOVEM A,UNAME(TT)       ;SET TO NEW UNAME
16850         HRRZM D,UTMPTR(TT)      ;SET TO NEW USER RESOURCE POINTER
16851         MOVEI R,IOCHNM(TT)
16852         PUSHJ P,CHSCAN
16853         PUSHJ P,UFN3ZZ
16854         HLLZ T,D                ;LH(D) HAS 0 IF REOWNER DISOWNED, ELSE 400000
16855         ANDCAM T,APRC(TT)       ;MARK AS NOT DISOWNED IF REOWNER ISN'T DISOWNED.
16856 UFNL3:  MOVE B,JNAME(TT)        ;PICK UP CURRENT JNAME
16857         MOVEI E,0       ;LOOP ON ALL USERS
16858 UFNL1:  CAMN A,UNAME(E) ;SKIP ON NOT SAME UNAME
16859          CAME B,JNAME(E) ;SKIP ON SAME UNAME-JNAME
16860           JRST UFNL2    ;NOT SAME NAME AND/OR VAR BLK NOT IN USE
16861         JRST UFN7       ;NAME CONFLICT, RESOLVE
16862 UFNL2:  ADDI E,LUBLK
16863         CAMGE E,USRHI
16864          JRST UFNL1
16865         MOVEI E,0       ;INITIALIZE FOR LOOP TO LOOK FOR INFERIORS AND DUPLICATE NAMES
16866 UFN4:   SKIPN UNAME(E)  ;SKIP IF VAR BLOCK IN USE
16867          JRST UFN5      ;TRY NEXT
16868         HRRZ I,SUPPRO(E)        ;PICK UP SUPERIOR POINTER OF BLOCK BEING EXAMINED
16869         CAIN I,(TT)     ;SKIP IF NOT INFERIOR
16870          JRST UFN6      ;INFERIOR, PSEUDO-RECURSE
16871 UFN5:   ADDI E,LUBLK    ;ADVANCE TO NEXT BLOCK
16872         CAMGE E,USRHI   ;SKIP IF ALL EXAMINED
16873          JRST UFN4      ;LOOP
16874         SKIPGE SUPPRO(TT)       ;SKIP IF NOT BACK TO TOP
16875          JRST UFNX      ;BACK TO TOP LEVEL
16876         MOVE E,TT       ;POP BACK UP
16877         HRRZ TT,SUPPRO(E)       ;TO PREVIOUS LEVEL
16878         MOVE B,JNAME(TT)        ;RESTORE B
16879         JRST UFN5       ;PROCEED AT PREVIOUS LEVEL
16880 \f
16881 UFNX:   POP P,B
16882         HRLM B,SUPPRO(TT)
16883         HRRM U,SUPPRO(TT)       ;SET UP SUPERIOR POINTER IN TO LEVEL DISOWNED
16884         SETZM DLSRCH            ;RE-ENABLE SCHEDULING
16885         MOVE U,TT
16886         POPJ P,
16887
16888 UFN6:   MOVE TT,E       ;PSEUDO-RECURSE
16889         JRST UFN3       ;START UP ON LOWER LEVEL
16890
16891 UFN7:   CAMN E,TT       ;SKIP UNLESS FOUND SELF
16892          JRST UFNL2
16893         ADDI TT,JNAME   ;SET UP ARG TO SIXAOS
16894         PUSHJ P,SIXAOS  ;INCREMENT JNAME
16895         SUBI TT,JNAME   ;RESTORE TT
16896         JRST UFNL3      ;RESTART LOOP
16897
16898 ;RESUSCITATE TTY CHNLS
16899 UFN3ZZ: HRRZ Q,(R)
16900         CAIL Q,TYIDN
16901         CAILE Q,TYOBN
16902          POPJ P,        ;NOT A TTY CH
16903         HLRZ Q,(R)
16904         TRNN Q,%TICNS
16905          POPJ P,        ;NOT CONSOLE
16906         CAIE J,%TINON
16907          AOS TTNTO(J)
16908         DPB J,[$TIIDX,,(R)]
16909         POPJ P,
16910
16911 UFOUND: HLRZS C         ;U HAS INF PROC
16912         HRL A,U
16913         MOVE U,USER
16914         HRRZ R,UUAC(U)
16915         ADDI R,IOCHNM(U)        ;CLOBBERED BY CORE
16916         JSP Q,OPSLC3
16917             UWIDN,,UWODN
16918             UBIDN,,UBODN
16919
16920 UFNDF:  TLNE C,1
16921          JRST OPNL12    ;ATTEMPTED OUTPUT
16922         LDB A,[.BP BULGOS_22,APRC(TT)]
16923         JUMPN A,OPNL42  ;USER GOING AWAY
16924         HRL A,TT
16925         JSP Q,OPSLD1
16926             FUWIDN,,FUBIDN
16927 \f
16928 USRST:  PUSHJ P,AUCL2   ;.RESET SIMULATES CLOSING AND REOPENING
16929          POPJ P,
16930         CONO PI,CLKON
16931         PUSHJ P,1USTOP
16932         EXCH U,A        ;BUT WITH LESS OVERHEAD
16933         PUSH P,A
16934         PUSHJ P,IODCL
16935         MOVEI B,BULGOS  ;WE'RE NOT REALLY TRYING TO KILL THE INFERIOR,
16936         ANDCAM B,APRC(U) ;SO DON'T LET OTHERS THINK HE'S BEING KILLED.
16937         MOVE Q,U
16938         SETZ B,
16939         EXCH U,(P)
16940         PUSHJ P,ACRF1   ;FLUSH ALL OF CORE
16941          BUG
16942 USRST1: MOVEI B,1
16943         MOVE Q,(P)
16944         PUSHJ P,ACRF1   ;THEN GET 1 PAGE
16945          JRST [ PUSHJ P,UDELAY
16946                 JRST USRST1]
16947         EXCH U,(P)
16948         MOVSI T,%TBNOT+%TBDTY
16949         MOVEM T,TTYTBL(U)
16950         MOVE J,U
16951         EXCH U,(P)
16952         PUSHJ P,MPLDJ
16953         XCTR XW,[CLEARM 0]
16954         MOVEI T,1
16955         XCTR XBRW,[BLT T,1777]
16956         PUSHJ P,MPLDZ
16957         EXCH U,(P)
16958         PUSHJ P,LOGUSE
16959         CONO PI,CLKOFF
16960         PUSHJ P,USRST2
16961         CONO PI,CLKON
16962         PUSHJ P,USRST4  ;SHOULD SKIP
16963          BUG
16964         POP P,A
16965         EXCH U,A
16966         MOVE TT,A
16967 USRST5: MOVE A,TTSTSV(U)        ;INITIALIZE SAVED TTYSET OF NEW JOB EQUAL TO CREATOR'S.
16968         SKIPL B,TTYTBL(U)       ;NOTE THAT THE WHEREABOUTS OF THE CREATOR'S TTYSET
16969          MOVE A,TTYST1(B)       ;DEPENDS ON WHETHER HE HAS THE TTY NOW.
16970         MOVEM A,TTSTSV(TT)
16971         MOVE A,TTSTSV+1(U)
16972         SKIPL B
16973          MOVE A,TTYST2(B)
16974         MOVEM A,TTSTSV+1(TT)
16975         MOVEI A,(TT)            ;RH OF NEW JOB'S SAVED TTYSTS IS HIS INDEX.
16976         HRLI A,%TSCNS           ;NOW CONSTRUCT THE LH.
16977         MOVE B,UTMPTR(TT)       ;TO DO THAT, FIND THE TREE'S TTY NUMBER
16978         MOVE B,TTYOPT-USRRCE(B) ;TO FIND THE TTY'S TTYOPT WORD,
16979         TLNE B,%TOROL           ;WHICH TELLS HOW TO INIT THE BITS IN THE TTYSTS.
16980          TLO A,%TSROL
16981         TLNN B,%TOMOR
16982          TLO A,%TSMOR
16983         TLNE B,%TOSA1
16984          TLO A,%TSSAI
16985         MOVEM A,TTSTSV+2(TT)
16986         POPJ P,
16987 \f
16988 ;.CALL USRMEM
16989 ; ARG 1   JOB WHOSE MEMORY SHOULD BE READ OR WRITTEN
16990 ; ARG 2   ADDRESS TO READ OR WRITE
16991 ; ARGS 3,4  LIKE USRVAR, TTYVAR
16992 ; VAL 1   PREVIOUS CONTENTS OF LOCATION
16993 ; VAL 2   NEW CONTENTS OF LOCATION (SAME AS PREVIOUS IF NOT WRITING).
16994 ;         (NOT VALID IN BLOCK MODE)
16995
16996 ; BIT 1.1  IF SET, THEN IF PAGE ISN'T READABLE OR WRITEABLE, GIVE AN MPV
16997 ;               OR PURE INTERRUPT TO THE JOB BEING REFERENCED.
16998 ; BIT 2.9  IF SET, ALLOWS US TO WRITE IN ANY JOB.
16999
17000 NUSRMEM:
17001         MOVE J,A
17002         JSP T,NCORUI
17003          JRST NUSRM1            ;WE CAN SURELY WRITE.
17004         MOVE H,CTLBTS(U)
17005         CAIGE W,3               ;ELSE, IF WE WANT TO WRITE,
17006          TRNE H,1               ;OR WANT TO GIVE THE REFERENCED JOB INTERRUPTS,
17007           TRNE H,400000         ;THEN UNLESS WE ARE FORCING IT,
17008            JRST NUSRM1
17009         JSP T,NCORWR            ;SEE IF IT IS A JOB WE ARE ALLOWED TO WRITE IN.
17010          JRST OPNL31
17011 NUSRM1: MOVE H,CTLBTS(U)
17012         CAIE J,-1
17013          CAIG J,LUBLK           ;CAN'T GIVE SYS OR CORE JOBS INTERRUPTS, OR PDP6.
17014           TRNN H,1
17015            CAIA
17016             JRST OPNL31
17017 IFN PDP6P,[
17018         CAIN J,-1
17019          JRST NUSRMS
17020 ];PDP6P
17021         CAILE J,LUBLK
17022          CAMN J,U
17023           JRST NUSRMS
17024         MOVE A,J                ;IF TARGET JOB ISN'T SELF OR PDP6
17025         PUSHJ P,RPCLSR          ; OR SYS OR CORE, STOP IT.
17026         PUSHJ P,SOSSET
17027             USTP(J)
17028 NUSRMS: PUSHJ P,NUSRM2          ;DO THE WORK
17029          POPJ P,                ;LOST, OPNL HAS LSWCLR'ED
17030         JRST LSWCJ1             ;POSSIBLY UNLOCK USTP, DIELOK AND TAKE SUCCESS RETURN
17031
17032 NUSRM2: PUSHJ P,VARCAL          ;E:=ADDR, D:=DATA, W:=INSTRUCTION
17033         HRRZS E
17034         CAIGE E,20
17035          JRST NUSRM6            ;ACS ALWAYS SWAPPED-IN AND ACCESSIBLE
17036         PUSH P,U
17037         MOVE U,J
17038         LDB A,[121000,,E]       ;GET PAGE # IN A AND REF'D JOB IN U.
17039 IFE PDP6P, PUSHJ P,UPLC
17040 IFN PDP6P,[
17041         PUSHJ P,[ CAIE J,-1     ;SKIP IF PDP6
17042                    JRST UPLC    ;DECODE THEM FOR ORDINARY JOB.
17043                   CAIL A,LPDP6M
17044                    TDZA T,T     ;FOR PDP6, MOST PAGES DON'T EXIST,
17045                     MOVE T,[002200,,[600000]]   ;AND THE REST ARE WRITABLE.
17046                   POPJ P,]
17047 ];PDP6P
17048         POP P,U
17049         LDB A,T                 ;GET PAGE ACCESS HALFWORD.
17050         TRNN A,600000           ;IF PAGE SWAPPED OUT, PUT ACCESS BITS IN PLACE THEY WOULD BE
17051          LSH A,16.              ; FOR AN IN-CORE PAGE.
17052         JUMPE A,NUSRM9          ;LOSE IF NO PAGE THERE
17053         TRNN A,400000           ;OR IF WE ARE TRYING TO WRITE THE WORD AND PAGE IS READ-ONLY.
17054          JUMPN W,NUSRM8
17055 NUSRM6: PUSHJ P,MPLDJ           ;NOW LOAD MAP OF JOB IN J
17056         HRLI E,(SKIP)           ;GET ACCESS TO DATA WORD, SWAP IN PAGE
17057         SKIPE W
17058          HRLI E,(MOVES)
17059 NUSRM4: CONO PI,CLKOFF          ;CLK OFF SO ONCE IN CAN'T SWAP OUT AGAIN
17060         XCTRI XRW,E             ;NOT GETTING BENEFIT OF USUAL PCLSR BEFORE
17061          JRST NUSRM5            ;SWAP OUT FEATURE SINCE IT'S ANOTHER JOB
17062         PUSHJ P,TPFLT
17063         JRST NUSRM4
17064
17065 NUSRM5: UMOVE B,(E)             ;NOW THAT PAGE IS IN, GET OLD CONTENTS
17066         MOVE A,B                ;IN A AND B
17067         JUMPE W,NUSRM3
17068         HRRI W,B                ;IF WRITING,
17069         XCT W                   ;EXECUTE USER'S INSN., MODIFYING 2ND VALUE IN B,
17070         TRNN J,-1               ;SYSTEM JOB?
17071          JRST OPNL31            ;******* WRITING SYS, TURN INTO .SETLOC *******
17072         UMOVEM B,(E)            ;AND STORE IT BACK INTO REF'D JOB.
17073 NUSRM3: PUSHJ P,MPLDZ           ;RESTORE NORMAL PAGE MAP, TURN CLKON.
17074         JRST POPJ1              ;SUCCESS
17075
17076 NUSRM8: SKIPA T,[%PIWRO]        ;HERE IF TRYING TO WRITE IN READ ONLY PAGE.
17077 NUSRM9:  MOVEI T,%PIMPV         ;HERE IF ACCESSING NONEXISTENT PAGE.
17078         TRNN H,1                ;SKIP IF TO GIVE INTERRUPT
17079          JRST OPNL32
17080         CAMN J,USER
17081          JRST UUOERR            ;INTERRUPT TO SELF
17082         IORM T,PIRQC(J)         ;INTERRUPT OTHER USER
17083         JRST OPNL32             ;CAN'T GET THAT ACCESS TO PAGE.
17084 \f
17085 ;COMMENTS BELOW APPLY TO UBI IN MANY CASES.  FOR UBO, TRANSFER GOES THE
17086 ;OTHER DIRECTION
17087
17088 UBO:    MOVNI I,1
17089         JRST UBIL
17090
17091 UBI:    MOVEI I,0       ;SIGNAL UBI
17092
17093 UBIL:   JUMPL C,UBIA
17094         XCTR XRW,[MOVES TT,(C)] ;MAKE SURE WRITE CYCLES WILL WIN
17095 UBIB:   TRNE A,200000   ;SKIP UNLESS 6
17096          MOVNI A,1      ;SO CAILE BELOW WILL SKIP OVER SUSTPR AMONG OTHER REASONS
17097         CAILE A,LUBLK   ;SKIP ON SYS JOB, CORE JOB, PDP6 OR JOB ALREADY STOPPED
17098          PUSHJ P,SUSTPR ;RANDOM JOB STOP
17099         JUMPGE TT,UBI4  ;THRU
17100         TLO A,400000    ;INDICATE ALREADY STOPPED SO WONT TRY IT AGAIN
17101         HLRO B,TT
17102         MOVNS B         ;COUNT TO BE XFERRED
17103         HRLZ E,IOCHST-IOCHNM(R) ;EXAMINED USER ADDRESS
17104         HRR E,TT        ;FROM,,TO (INFERIOR ADR,,SUPERIOR ADR)
17105         HLRZ Q,E
17106         TLNE A,200000
17107          JRST UBI5A     ;PDP6
17108 UBI5:   CAIGE Q,20      ;INF ADR IN Q
17109          JRST UBI3      ;READ AC
17110         HRRZ J,A        ;SET UP UMAPS WORD
17111         TRZE E,400000
17112          TLOA J,%UMMPL  ;TO HI PG, HACK OUR LOW PG
17113           TLO J,%UMMPU  ;TO LOW PG, HACK OUR HI PG
17114         TLZE E,400000
17115          TLOA J,%UMLTU  ;TO POINT TO HIS UPPER
17116           TLO J,%UMUTL  ;TO POINT TO HIS LOWER
17117         TLNN J,%UMMPU+%UMUTL    ;MAPPING HIS UPPER WITH OUR LOWER?
17118          JRST UBI3A     ;YES MAKE SURE NOT SCREWED BY AC PNTR
17119 UBI3B:  PUSHJ P,MPLD1
17120         TRZ Q,400000
17121         MOVNS Q         ;LIMIT SIZE OF XFER TO MIN OF DESIRED
17122         ADDI Q,400000   ;DIST OF TO ADR FROM SEG BOUNDARY
17123         CAMLE B,Q
17124          HRRZ B,Q
17125         MOVNI Q,(E)     ;AND DIST OF FROM ADR FROM SEQ BOUNDARY
17126         ADDI Q,400000
17127         CAMLE B,Q
17128          HRRZ B,Q
17129         TLNN J,%UMMPL   ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
17130          TLOA E,400000  ;SET FROM ADR TO HI PG
17131           TRO E,400000  ;SET TO ADR TO HI PG
17132         SKIPE I         ;SKIP ON UBI
17133          MOVSS E                ;UBO, XFERR OTHER DIRECTION
17134         MOVE Q,E        ;SAVE COPY OF BLT PNTR
17135         ADDI B,(E)      ;GET LA +1
17136 UBI3H:  XCTRI XBRW,[BLT E,-1(B)]        ;XFERR DATA
17137 UBI3K:   MOVEI E,(B)    ;NO FAULT, SIMULATE STORE BACK OF BLT PNTR AFTER COMP OF BLT (RH ANYWAY)
17138 UBI3L:  PUSH P,J
17139         PUSHJ P,MPLDZ   ;RETURN TO NORMAL MAP TO STORE BACK USER PNTR
17140         POP P,J         ;SAVE PREV MAP FOR EVENTUAL USE
17141         SUBM E,Q        ;FIGURE OUT HOW MANY WDS ACTUALLY XFERRED
17142         HRRZS Q
17143 UBI3E:  HRLS Q          ;# WDS TRANSFERRED,,SAME
17144         JUMPL C,UBIC    ;UPDATE USER PNTR
17145         XCTRI XRW,[ADDM Q,(C)]
17146          JRST .+2
17147           BUG           ;SHOULD HAVE ALREADY CHECKED THIS
17148 UBID:   ADD Q,IOCHST-IOCHNM(R)  ;UPDATE INFERIOR PNTR
17149         HRRM Q,IOCHST-IOCHNM(R) ;WRAPPING AROUND IF PASS 1,,0
17150         TLZ B,-1
17151         CAIN B,(E)      ;WAS THERE A FAULT?
17152          JRST UBIL      ;NO, LOOP
17153         PUSHJ P,UBI4    ;UNSTOP THE JOB.
17154         PUSHJ P,MPLD1   ;RESTORE TO FROB AT TIME OF FAULT
17155 UBI3C:  PUSHJ P,TPFLT
17156         PUSHJ P,MPLDZ
17157         JRST UBIL
17158 \f
17159 UBI4:   TLNN A,200000   ;SKIP ON REALLY PDP6
17160          TLZ A,400000   ;FLUSH RANDOM BIT SO COMPARE WILL WORK
17161         CAILE A,LUBLK
17162          JRST UPCLSR
17163         POPJ P,
17164
17165 UBMCK1: PUSHJ P,UBI4
17166         JRST IOADC
17167
17168 UBIA:   TRNE C,777760
17169          BUG
17170         MOVE TT,(C)
17171         JRST UBIB
17172
17173 UBIC:   TRNE C,777760
17174          BUG
17175         ADDM Q,(C)
17176         JRST UBID
17177
17178 UBI5A:  CAIL Q,400000
17179          JRST UBMCK1
17180         JRST UBI5
17181
17182 UWO:    SKIPGE C
17183          SKIPA D,(C)
17184           UMOVE D,(C)
17185         TDZA I,I
17186 UWI:     SETO I,        ;0 FOR OUTPUT, -1 FOR INPUT.
17187         TRNE A,200000
17188          MOVNI A,1      ;-1 MEANS PDP6.
17189         CAMN A,USER
17190          HRLI A,-1      ;DON'T STOP SELF
17191         CAIG A,LUBLK
17192          JRST UWI1      ;SYS, CORE, SELF, OR PDP6
17193         PUSHJ P,SUSTPR
17194         PUSHJ P,SOSSET  ;MIGHT TAKE PAGE FAULT AND GET PCLSRED
17195             USTP(A)
17196 UWI1:   HRRZ E,IOCHST-IOCHNM(R)
17197         HRRZ J,A
17198         PUSHJ P,MPLDJ   ;MAP JOB BEING IOT'ED FROM.
17199         XCTR XRW,[      MOVE W,(E)
17200                         MOVEM D,(E)]+1(I)
17201         AOS IOCHST-IOCHNM(R)    ;ADVANCE ACCESS POINTER
17202         CAILE A,LUBLK
17203          PUSHJ P,LSWPOP
17204         JRST MPLDZ
17205 \f
17206 UBI3A:  TLNE E,777760   ;SKIP ON XFERRING FROM AC AREA, HI TO HI
17207          JRST UBI3B     ;NO OK
17208         JUMPN I,UBO3A   ;UBO
17209         PUSHJ P,MPLDJ
17210         XCTRI XR,[MOVE B,(Q)]   ;PICK UP WD
17211          JRST .+2       ;OK
17212           JRST UBI3C    ;TAKE FAULT
17213         PUSHJ P,MPLDZ   ;BACK TO NORMAL MAP
17214         HRRZ E,TT       ;TO ADR
17215         JRST UBI3D
17216
17217 ;USR DEV IOT STOP ROUTINE
17218 USUSTP: SOS USTP(A)
17219 SUSTPR: MOVSI T,BCSTOP+BUCSTP
17220         TDNE T,USTP(A)  ;WAIT TILL NOT BEING SHUFFLED
17221          PUSHJ P,UFLS
17222         PUSHJ P,RPCLSR  ;AOS'ES USTP
17223         MOVSI T,BCSTOP+BUCSTP
17224         TDNE T,USTP(A)
17225          JRST USUSTP
17226         POPJ P,
17227
17228 UBI3:   ADDI Q,AC0S(A)
17229         JUMPN I,UBO3    ;UBO
17230         TLNE A,200000
17231          TDZA B,B       ;READ PDP6 AC
17232           MOVE B,(Q)    ;READ NORMAL AC
17233 UBI3D:  XCTRI XW,[MOVEM B,(E)]
17234          JRST .+2
17235           JRST UBI3C    ;TAKE FAULT
17236 UBI3G:  MOVEI Q,1       ;1 WD XFERRED
17237         HRRZ B,E        ;FAKE OUT FAULT TEST
17238         JRST UBI3E
17239
17240 UBO3:   TLNE A,200000
17241          JRST UBI3G     ;TRYING TO WRITE PDP6 AC IGNORE
17242         XCTRI XR,[MOVE B,(E)]
17243          JRST .+2
17244           JRST UBI3C
17245         MOVEM B,(Q)
17246         JRST UBI3G
17247
17248
17249 UBO3A:  XCTRI XR,[MOVE B,(TT)]
17250          JRST .+2
17251           JRST UBI3C    ;TAKE FAULT
17252         PUSHJ P,MPLDJ   ;MAP HIM.
17253         XCTRI XW,[MOVEM B,(Q)]
17254          JRST .+2
17255           JRST UBI3C
17256         PUSHJ P,MPLDZ   ;BACK TO NORMAL
17257         JRST UBI3G
17258 \f
17259 SUBTTL CORE LINK DEVICE
17260
17261 EBLK
17262 CLVBEG: NCLCH
17263 CLSYN:  BLOCK NCLCH     ;SYSTEM NAME ;0=>VARIABLES FREE
17264 CLN1:   BLOCK NCLCH     ;FN1
17265 CLN2:   BLOCK NCLCH     ;FN2
17266 CLUSR:  REPEAT NCLCH,-1 ;LH=WRITING USER ;RH=READING USER ;-1=>NOT OPEN THAT HALF
17267 CLRAC:  BLOCK NCLCH     ;4.9=LOCKED BY CORE ALLOCATOR
17268                         ;4.8=VERY SLOW CLOCK ROUTINE CONSIDERING FLUSHING THIS BUFFER
17269  %CAFLS==100000         ;4.7=INPUT CLOSED, TURN OUTPUT INTO NUL DEVICE
17270  %CA==1,,500000         ;RH=UT BUFFER NUMBER (IOBFT ADR)
17271
17272 CLOSW:  -1      ;USER LOCK TO STOP MORE THAN ONE PERSON FROM SIMULTANEOUSLY MODIFYING
17273         0       ;THE CORE LINK VARIABLES
17274 CLVEND==.-1
17275 BBLK
17276
17277 ;FORMAT OF CORE LINK 200 WORD BUFFER
17278 ;
17279 CLBVSP==8
17280 CLBCHS==100.
17281 CLBEOF==<CLBCHS+4>/5
17282 IFG CLBVSP+CLBCHS+CLBEOF-128.,.ERR CLBXXX LOSSAGE
17283
17284 ;
17285 ;0:   CHARACTER COUNT
17286 ;1&2: READ AND WRITE CHARACTER OR WORD POINTERS
17287 ;3&4: READ AND WRITE EOF POINTERS
17288 ;CLBVSP TO CLBVSP+CLBCHS-1: CHARACTERS OR WORDS
17289 ;CLBVSP+CLBCHS UP: EOF BITS STORED AS SEVEN FIVE BIT BYTES PER WORD,
17290 ;               EACH BIT CORRESPONDING TO A CHARACTER POSITION.
17291
17292 CLAO:   SKIPA J,[2]     ;CLA .OPEN (TO ANSWER A CLI INTERRUPT)
17293 CLIO:    MOVNI J,1      ;CLI .OPEN (INTERRUPTS USER SPECIFIED BY FILE NAME)
17294         JRST CLI2
17295
17296 CLUO:   TDZA J,J        ;CLU .OPEN
17297 CLOO:    MOVEI J,1      ;CLO .OPEN
17298 CLI2:   JUMPL C,CLFDEL  ;JUMP IF AN .FDELE
17299         PUSHJ P,FLDRCK
17300          JRST CLO1      ;NOT FILE DIRECTORY
17301         MOVEI J,2
17302         JRST LISTF7
17303 \f
17304 CLFDEL: MOVEI J,3
17305 CLO1:   PUSHJ P,SWTL    ;SEIZE SWITCH TO STOP VARIABLES FROM CHANGING UNDER YOU
17306             CLOSW
17307         LDB H,[220100,,C]       ;DIRECTION BIT
17308         JUMPL J,CLOO5
17309 CLOO5B: MOVE Q,USYSN1(U)        ;PICK UP SNAME
17310         MOVSI I,-NCLCH
17311         CAIN J,2        ;SKIP UNLESS CLA
17312          JRST CLO1A     ;JUMP IF CLA .OPEN
17313         CAIGE J,0
17314 CLO1A1:  MOVE Q,[SIXBIT/_CLI_/]
17315 CLOL:   CAMN Q,CLSYN(I) ;LOOK FOR SNAME, FN1, & FN2
17316          CAME A,CLN1(I)
17317           JRST CLOO1
17318         CAME B,CLN2(I)
17319          JRST CLOO1
17320         JUMPL J,OPNL23  ;"FILE LOCKED" IF ALREADY EXISTS, FOR CLI:.
17321         CAIN J,3        ;SKIP UNLESS DELETE
17322          JRST CLO1D     ;FOUND FILE TO DELETE
17323 CLO1A6: LDB TT,CLOOT1(H)
17324         CAIE TT,-1
17325          JRST OPNL23    ;ALREADY OPEN THIS DIRECTION (FILE LOCKED)
17326         HRRZ TT,CLRAC(I)
17327         LDB Q,[IOSA,,IOBFT(TT)]
17328         LSH Q,6
17329 CLOX:   DPB U,CLOOT1(H) ;STORE USER INDEX
17330         MOVSI TT,200000
17331         ANDCAM TT,CLRAC(I)      ;CLEAR VERY SLOW CLOCK BIT
17332         PUSHJ P,LSWPOP  ;RELEASE SWITCH
17333         HRL A,I
17334         LDB C,[220300,,C]
17335         SKIPGE J
17336          PUSHJ P,CLOX1  ;FOR CLI:, PUT OUR UNAME AND JNAME INTO BUFFER.
17337         MOVEI TT,44     ;WORD
17338         TRNN C,6
17339          MOVEI TT,7     ;UNIT ASCII
17340         ADD Q,H         ;OFFSET FOR DIRECTION
17341         DPB TT,[300600,,1(Q)]   ;SET UP ITEM POINTER
17342         MOVEI TT,5      ;WORD
17343         TRNN C,6
17344          MOVEI TT,1     ;UNIT ASCII
17345         DPB TT,[300600,,3(Q)]   ;SETUP EOF POINTER
17346         JSP Q,OPSLC7    ;SET UP IOCHNM OF USER
17347          DCLUAI,,DCLUAO ;UNIT ASCII INPUT ;UNIT ASCII OUTPUT
17348          DCLBI,,DCLBO   ;BLOCK INPUT ;BLOCK OUTPUT
17349          DCLUBI,,DCLUBO ;UNIT BINARY INPUT ;UNIT BINARY OUTPUT
17350          DCLBI,,DCLBO
17351
17352 CLOX1:  MOVEI TT,44     ;CHANGE OUTPUT BYTE SIZE TO 36.
17353         DPB TT,[300600,,2(Q)]
17354         MOVEI TT,5      ;WHICH INVOLVES STORING 5 CHARACTERS OF EOF BITS AT ONCE.
17355         DPB TT,[300600,,4(Q)]
17356         PUSH P,C
17357         HRROI C,TT
17358         MOVE TT,UNAME(U)
17359         PUSHJ P,CLOXO   ;NOW WE CAN IOT WORDS OUT, EVEN IF CHANNEL IS ASCII MODE.
17360         SUBI Q,1
17361         MOVE TT,JNAME(U)
17362         PUSHJ P,CLOXO
17363         SOJA Q,POPCJ    ;NOW RETURN, AND SET UP THE CORRECT BYTE SIZES.
17364 \f
17365 CLOO1:  AOBJN I,CLOL    ;LOOP FOR ALL SETS OF CORE LINK VARIABLES
17366         CAIE J,1
17367          JUMPGE J,OPNL4 ;CLA, CLU DELETE LOSE
17368         MOVSI I,-NCLCH
17369 CLOO3:  SKIPN CLSYN(I)  ;LOOK FOR FREE VARIABLES TO CREATE FILE
17370          JRST CLOO2
17371         AOBJN I,CLOO3
17372         JRST OPNL5      ;GIVE DIREC FULL ERROR
17373
17374 CLOOT1: 2200,,CLUSR(I)  ;READING
17375         222200,,CLUSR(I) ;WRITING
17376
17377 CLOO2:  MOVEM A,CLN1(I) ;SET UP VARIABLES
17378         MOVEM B,CLN2(I)
17379         MOVEI D,SCNCLO(I)       ;SYS CHNL NO
17380         PUSHJ P,TCALL   ;GET 200 WORD BUFFER
17381             JRST IUTCONS
17382          JRST CLOO4     ;NO MEM AVAIL
17383         MOVEM Q,CLSYN(I)        ;DONT SET UP SYS UNTIL MEM AVAIL
17384         HRRM A,CLRAC(I)
17385         LDB Q,[IOSA,,IOBFT(A)]  ;SET UP BUFFER
17386         LSH Q,6
17387         SETZM (Q)       ;CHAR COUNT
17388         MOVE TT,Q
17389         ADDI TT,CLBVSP  ;SET UP BUF POINTERS
17390         MOVEM TT,1(Q)
17391         MOVEM TT,2(Q)
17392         HRLI TT,440000
17393         ADDI TT,CLBCHS  ;SET UP EOF POINTERS
17394         MOVEM TT,3(Q)
17395         MOVEM TT,4(Q)
17396         JRST CLOX
17397
17398 ;NO MEMORY AVAILABLE FOR 200-WD BUFFERS
17399 CLOO4:  AOS SWPOPR      ;MAYBE SWAPPING SOMETHING OUT WILL HELP
17400         PUSHJ P,LSWPOP  ;UNLOCK CLOSW
17401         PUSHJ P,UDELAY  ;WAIT A WHILE
17402         JRST CLO1       ;TRY AGAIN
17403 \f
17404 CLOO5:  CONO PI,CLKOFF  ;TURN OFF CLOCK TO STOP U&J NAMES FROM CHANGING
17405         MOVEI Q,2*LUBLK
17406 CLOO5A: CAMN A,UNAME(Q) ;LOOK FOR USER WHOSE NAMES MATCH THE SPECIFIED FILE NAMES
17407         CAME B,JNAME(Q)
17408          JRST CLOO6
17409         MOVEI T,%PICLI  ;IF GET TO HERE, HAVE FOUND USER WITH RIGHT NAMES
17410         TDNN T,MSKST(Q) ;SKIP IF HE HAS CLI INT DISABLED
17411          JRST OPNL11
17412         IORM T,PIRQC(Q) ;GIVE USER INT
17413         CONO PI,CLKON
17414         JRST CLOO5B
17415
17416 CLOO6:  ADDI Q,LUBLK    ;GO TO NEXT USER SLOT
17417         CAMGE Q,USRHI   ;SKIP IF ALL EXAMINED
17418          JRST CLOO5A
17419         JRST OPNL11
17420
17421 CLO1D:  MOVE T,CLUSR(I)
17422         AOJN T,OPNL23   ;FILE LOCKED
17423         AOS (P)
17424         MOVE A,I
17425         PUSHJ P,CLIOTB  ;NO TIMING ERROR SINCE CORE JOB WILL PCLSR USR ON
17426         SKIPN B,SRN3(U) ;CORE LINK BEFORE MOVING BUFFER
17427          JRST CLO1D2
17428         MOVEM B,CLN1(A)
17429         MOVE B,SRN4(U)
17430         MOVEM B,CLN2(A)
17431         JRST LSWPOP     ;CLOSW
17432
17433 CLO1A:  MOVE A,UNAME(U)
17434         MOVE B,JNAME(U)
17435         JRST CLO1A1
17436 \f
17437 ;CORE LINK .IOT SET UP ROUTINE
17438
17439 CLIOTB: SKIPGE CLRAC(A) ;WAIT IF BUFFER LOCKED BY CORE ALLOCATOR
17440          PUSHJ P,UFLS   ;(DO NOT CHANGE ABOVE TO "SKIPGE TT,CLRAC(A)")
17441         HRRZ TT,CLRAC(A)
17442         LDB Q,[IOSA,,IOBFT(TT)] ;GET POINTER TO BUFFER
17443         LSH Q,6
17444         POPJ P,
17445
17446
17447 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII INPUT
17448
17449 CLUAI:  PUSHJ P,CLIOTB  ;SETUP
17450         MOVSI T,%CAFLS
17451         TDNE T,CLRAC(A)
17452          PUSHJ P,UFLS
17453         SKIPN (Q)       ;WAIT TILL CHAR COUNT NON-ZERO
17454          PUSHJ P,UFLS
17455 CLUAI1: MOVE J,3(Q)
17456         ILDB I,J        ;GET EOF BIT
17457         JUMPN I,UNIEOF
17458 CLUAIE: ILDB W,1(Q)     ;GET CHARACTER
17459         SOS (Q)         ;DECREMENT BUF COUNT
17460 CLFAXP: LDB TT,[700,,1(Q)]      ;FIX UP POINTERS
17461         CAIN TT,CLBVSP+CLBCHS-1
17462          PUSHJ P,CLFAX2 ;MAYBE TIME TO RING BUFFER
17463         HLRZ TT,J       ;GET BYTE POSITION AND SIZE
17464         CAIN TT,010100  ;IF TO END OF 35-BIT WORD, ADVANCE
17465          IBP J          ;TO NEXT WORD (5-BIT BYTES 1 BIT AT A TIME)
17466         MOVEM J,3(Q)
17467         POPJ P,
17468
17469 UNIEOF: HRROI W,EOFCH
17470         JRST POPJ1
17471
17472 CLFAX2: LDB TT,[370500,,1(Q)]   ;PICK UP TOP 5 BITS OF BYTE POSITION
17473         JUMPN TT,CPOPJ  ;NOT QUITE YET
17474 CLFBX2: MOVEI TT,CLBVSP ;J HAS NEW EOF PNTR
17475         DPB TT,[700,,1(Q)]      ;RING CHAR POINTER
17476         MOVEM J,3(Q)
17477         MOVEI J,44
17478         DPB J,[360600,,1(Q)]
17479         MOVEI TT,CLBVSP+CLBCHS
17480         DPB TT,[700,,3(Q)]      ;RING EOF POINTER
17481         DPB J,[360600,,3(Q)]
17482         MOVE J,3(Q)
17483         POPJ P,
17484 \f
17485 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII OUTPUT
17486
17487 CLUAO:  MOVE T,CLRAC(A)
17488         TLNE T,%CAFLS
17489          POPJ P,
17490         PUSHJ P,CLIOTB  ;SETUP
17491         MOVEI T,CLBCHS*5-11.
17492         CAMGE T,(Q)     ;WAIT TILL THERE IS SPACE IN BUF
17493          PUSHJ P,UFLS
17494         MOVE J,4(Q)
17495         SKIPGE C
17496          SKIPA B,(C)    ;GET CHAR FROM EXEC
17497           UMOVE B,(C)   ;GET CHAR FROM USER
17498         MOVEI TT,0
17499         IDPB TT,J       ;INDICATE NOT AN EOF
17500         IDPB B,2(Q)     ;STORE IN BUF
17501         MOVEI TT,1      ;GET MASK FOR LOW ORDER BIT
17502         ANDCAM TT,@2(Q) ;FLUSH IN CURRENT WORD
17503 CLCWU2: AOS (Q)         ;INCREMENT BUF COUNT
17504         MOVEI I,0       ;FAKE OUT EOF TEST
17505         AOJA Q,CLFAXP   ;FAKE OUT CLFAXP AND FIX UP POINTERS
17506
17507
17508 CLBI:   JSP W,WRDBTI    ;BLOCK INPUT.
17509
17510 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY INPUT
17511
17512 CLUBI:  PUSHJ P,CLIOTB  ;SETUP
17513         MOVSI T,%CAFLS
17514         TDNE T,CLRAC(A)
17515          PUSHJ P,UFLS
17516         MOVEI T,5
17517         CAMLE T,(Q)     ;WAIT TILL A WORD IS AVAILABLE
17518          PUSHJ P,UFLS
17519 CLUBI1: MOVE J,3(Q)
17520         ILDB I,J        ;GET EOF BITS
17521         JUMPN I,CLUBIF  ;JUMP ON EOF
17522 CLUBIE: ILDB W,1(Q)     ;GET WORD
17523 CLCRB2: MOVNI T,5
17524         ADDB T,(Q)      ;DECREMENT COUNT
17525         JUMPGE T,CLFBXP
17526         SETZM (Q)       ;CAME FROM CLCLRL WITH PARTIAL WORD IN BUFFER
17527 CLFBXP: JRST CLFAXP
17528
17529 CLUBIF: TROE I,20       ;SKIP IF EOF NOT ON FIRST CHAR OF WORD
17530          JRST POPJ1
17531         DPB I,J         ;SET EOF ON FIRST CHAR
17532         MOVE J,1(Q)
17533         ILDB W,J        ;PICK UP WORD WITH EOF IN MIDDLE
17534         POPJ P,
17535 \f
17536 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY OUTPUT
17537
17538 CLUBO:  MOVE T,CLRAC(A)
17539         TLNE T,%CAFLS
17540          POPJ P,
17541         PUSHJ P,CLIOTB  ;SETUP
17542 ;CLI: OPEN CALLS HERE TO OUTPUT UNAME AND JNAME.
17543 CLOXO:  MOVEI T,CLBCHS*5-11.
17544         CAMGE T,(Q)     ;WAIT TILL THERE IS SPACE FOR A WORD
17545          PUSHJ P,UFLS
17546         MOVE J,4(Q)
17547         SKIPGE C
17548          SKIPA B,(C)    ;GET WORD FROM EXEC
17549           UMOVE B,(C)   ;GET WORD FROM USER
17550         MOVEI TT,0
17551         IDPB TT,J       ;INDICATE NOT AN EOF
17552         IDPB B,2(Q)     ;STORE IN BUF
17553 CLCWB2: MOVEI TT,5
17554         ADDM TT,(Q)     ;INCREMENT COUNT
17555         AOJA Q,CLFAXP   ;FAKE OUT CLFBXP AND FIX UP POINTERS
17556
17557
17558 ;CORE LINK .IOT ROUTINE FOR BLOCK OUTPUT
17559
17560 CLBO:   MOVE I,C        ;SAVE A POINTER TO USERS BLKO POINTER
17561         XCTR XR,[SKIPL H,(I)]   ;PICKUP BLKO POINTER
17562          POPJ P,
17563         SKIPA E,H       ;SECOND COPY, ALSO FLAG TO CLBIN
17564 CLBI2:   UMOVEM E,(I)   ;TO INFORM USER & IN CASE YOU ARE PCLSR'ED
17565         HRRZ C,E
17566         PUSHJ P,CLUBO   ;TRANSFER ONE WORD
17567         AOBJN E,CLBI2   ;TRY FOR NEXT
17568 CLBI3:  UMOVEM E,(I)    ;COUNT EXHAUSTED OR EOF
17569         POPJ P,
17570 \f
17571 ;CORE LINK .CLOSE ROUTINE FOR BINARY OR BLOCK OUTPUT
17572
17573 CLCLWB: PUSHJ P,CLCWC   ;STORE EOF BITS FOR WORD
17574          JRST CLCWU6    ;NO ROOM SO LAST MUST HAVE BEEN EOF HACK SO FLUSH
17575         IBP 2(Q)        ;KEEP WORD POINTER IN STEP
17576         PUSHJ P,CLCWB2  ;FIX UP COUNT AND POINTERS
17577 CLCWU6: MOVNI B,1
17578         DPB B,[222200,,CLUSR(A)]        ;OBLITERATE USER INDEX
17579         MOVSI B,%CAFLS
17580         ANDCAM B,CLRAC(A)
17581         JRST LSWPOP     ;RELEASE SWITCH
17582
17583 ;CORE LINK .CLOSE ROUTINE FOR UNIT ASCII OUTPUT
17584
17585 CLCLWU: PUSHJ P,CLCWC   ;STORE EOF BIT FOR CHAR
17586          JRST CLCWU6
17587         MOVEI TT,EOFCH
17588         IDPB TT,2(Q)    ;STORE AN EOF CHAR
17589         PUSHJ P,CLCWU2  ;FIX UP COUNT AND POINTERS
17590         SOS Q           ;CLCWU2 AOJAS
17591         LDB TT,[360600,,2(Q)]
17592         SOJE TT,CLCWU6  ;JUST FILLED A WHOLE WORD => STOP PADDING.
17593         PUSHJ P,LSWPOP  ;ELSE PAD ONCE MORE.
17594         JRST CLCLWU
17595
17596
17597 ;COMMON SUBROUTINE FOR CORE LINK OUTPUT .CLOSE ROUTINES
17598
17599 CLCWC:  PUSHJ P,SWTL    ;LOCK SWITCH (IF SIGN OF CLRAC IS EVER REALLY USED,
17600             CLOSW       ;THIS MIGHT CAUSE A DEADLY EMBRACE).
17601         PUSHJ P,CLIOTB  ;SETUP
17602         MOVEI T,CLBCHS*5-5.
17603         CAMGE T,(Q)     ;WAIT FOR THERE TO BE ROOM
17604          POPJ P,
17605         MOVE J,4(Q)
17606         MOVNI TT,1
17607         IDPB TT,J       ;SET EOF BIT(S)
17608         JRST POPJ1
17609 \f
17610 ;CORE LINK .CLOSE ROUTINE FOR INPUT
17611
17612 CLO1D2: SETZM CLSYN(A)  ;FREE VARIABLES
17613         HRRZS A,CLRAC(A) ;CORE LINK NO LONGER IN USE
17614         PUSHJ P,BRTN    ;RETURN BUFFER TO FREE STATE
17615         JRST LSWPOP
17616
17617 CLISTA: PUSHJ P,CLIOTB  ;CORE LINK INPUT STATUS
17618         SKIPN J,(Q)     ;COUNT
17619          TRO D,1_10.    ;SYS BUF CAP EMPTY
17620         CAIL J,CLBCHS*5-5
17621          TRO D,1_9      ;SYS BUF CAP EMPTY
17622         POPJ P,
17623
17624 CLCLRA: TDZA C,C        ;UNIT ASCII
17625 CLCLRB:  MOVNI C,1      ;IMAGE OR BLOCK (I.E. WORDS)
17626         PUSHJ P,CLIOTB
17627         PUSHJ P,SWTL
17628             CLOSW
17629 ;FLUSH ALL REAL DATA
17630 CLCLRL: SKIPN (Q)       ;SKIP IF BUFFER CONTAINS DATA, READ IT UNTIL EOF
17631          JRST CLCLR1
17632         PUSHJ P,[JUMPE C,CLUAI1 ? JRST CLUBI1]
17633          JRST CLCLRL
17634 CLCLR2: MOVE J,3(Q)     ;FOUND AN EOF, FLUSH THE EOF WORD
17635         ILDB I,J
17636         PUSHJ P,[JUMPE C,CLUAIE ? JRST CLUBIE]
17637         MOVE T,1(Q)
17638         TLNE T,760000
17639          JRST CLCLR2    ;NOT YET TO WORD BOUNDARY
17640         JRST CLCLR3
17641
17642 CLCLR1: MOVSI B,%CAFLS
17643         IORM B,CLRAC(A)
17644         PUSH P,A
17645         PUSH P,Q
17646         HLRZ A,CLUSR(A)
17647         PUSHJ P,NJRPCL
17648         PUSHJ P,NJUPCL
17649         POP P,Q
17650         POP P,A
17651 CLCLR3: HLLOS B,CLUSR(A)        ;NO LONGER OPEN FOR INPUT
17652         SKIPN (Q)               ;IF NO DATA IN BUFFER
17653          AOJE B,CLO1D2          ;AND NOT OPEN FOR OUTPUT, GO FREE THE BUFFER AND VARS
17654         JRST LSWPOP
17655 \f
17656 SUBTTL COMMON I/O ROUTINES
17657
17658 ;STANDARD DEVICE OPEN
17659
17660 STDOP1: MOVEI R,R       ;ENTRY TO NOT CLOBBER IOCHNM
17661 STDOPN: HLRZ A,(Q)      ;LH MASK ON 4.9-3.2 OF LH OPEN WRD
17662         AND D,A ;RH POINTER TO ..USR,..USE PAIR
17663         ROT D,-1        ;FOLLOWING WORDS CONTAIN LIST FOR ALL MASKED STATES
17664         ADDI D,(Q)      ;LH MSKED STATE =0, RH =1, IOTTB ENTRY NUMBERS
17665         HRRZ A,1(D)
17666         SKIPL D
17667         HLRZ A,1(D)
17668         JUMPE A,OPNL12  ;MODE NOT AVAIL
17669         HRRZ E,(Q)
17670         CONO PI,CLKOFF
17671         CAME U,(E)
17672         SKIPGE 1(E)
17673         AOSA 1(E)
17674         JRST OPNL10     ;DEVICE NOT AVAIL
17675         MOVEM U,(E)
17676         HLL A,C
17677         JRST OPNSLT
17678
17679 OPSLD1: ANDI D,1        ;ENTRY TO USE BOTTOM BIT OF AC D
17680 OPSLD3: ANDI D,3        ;ENTRY TO USE BOTTOM TWO BIT OF AC D
17681         MOVE C,D
17682 OPSLC3: ANDI C,3        ;ENTRY TO USE BOTTOM TWO BITS OF AC C
17683 OPSLC7: ANDI C,7        ;ENTRY TO USE BOTTOM THREE BITS OF AC C
17684         ROT C,-1
17685         ADDI C,(Q)
17686         HRR A,(C)
17687         SKIPL C
17688         HLR A,(C)
17689 OPNSLT: MOVEM A,(R)     ;SET USERS IOCHNM
17690         JRST CLKOJ1
17691 \f
17692 ;BLOCK OUTPUT TO CHARACTER DEVICE 
17693 ;ADR OF CHR ROUTINE IN E
17694 ; THAT ROUTINE MUST NOT CLOBBER C, D, E, OR TT
17695 ;C POINTS TO AOBJN POINTER IN USER SPACE
17696 ;MUSTN'T CLOBBER J (TTY OUTPUT ASSUMES).
17697
17698 NBTOCH: XCTR XRW,[MOVES D,(C)]  ;CHECK WRITEABILITY OF AOBJN PTR
17699         LDB TT,[410300,,D]      ;USE HIGH 3 BITS OF USER PNTR AS CHR CNT
17700         CAIGE TT,3
17701          POPJ P,                ;USER TRYING TO XFER >32K FLUSH
17702         SKIPA TT,BTOCHT-3(TT)   ;PICK UP APPROPRIATE BYTE PTR (WORD IN W)
17703 NBTO1:   UMOVEM D,(C)           ;UPDATE USER'S AOBJN PTR
17704         UMOVE W,(D)             ;FETCH CURRENT WORD FROM USER
17705         ILDB A,TT               ;FETCH CURRENT CHARACTER
17706         PUSHJ P,(E)             ;SEND TO DEVICE
17707         ADD D,[700000,,]        ;UPDATE PTR
17708         TLNE D,500000
17709          JRST NBTO1             ;GO TO NEXT CHR
17710         MOVE TT,BTOCHT+4
17711         ADD D,[500001,,1]       ;INCR TO NEXT WORD
17712         JUMPL D,NBTO1
17713         UMOVEM D,(C)    ;COUNTED OUT, UPDATE FINAL TIME & RETURN
17714         POPJ P,
17715
17716 BTOCHT: REPEAT 5,<44-<4-.RPCNT>*7>_14+700,,W
17717
17718 ;BLOCK INPUT FROM CHARACTER DEVICE
17719 ;E AND C SET UP LIKE NBTOCH
17720 ;INTERNALLY LH OF E USED FOR FLAGS:
17721 ; 4.9 EOF FLAG (SIGN)
17722 ; 4.8 => JUST RETURN WITHOUT ERROR IF AT BEGINNING OF WORD,
17723 ;        OTHERWISE IGNORE BIT.
17724 ; 4.7 => RETURN WITHOUT ERROR EVEN IF NOT AT BEGINNING OF WORD.
17725
17726 INBTCH: HRRZS E         ;CLEAR GARBAGE IN LH
17727         XCTR XRW,[MOVES D,(C)] ;SET UP LIKE NBTOCH
17728         LDB TT,[410300,,D]
17729         CAIGE TT,3
17730          POPJ P,
17731         SKIPA TT,BTOCHT-3(TT)
17732 INBTO1:  UMOVEM D,(C)
17733         XCTR XRW,[MOVES (D)] ;CHECK WRITABILITY OF CURRENT WORD
17734         JUMPL E,INBTO2  ;JUMP IF EOF
17735         PUSH P,C
17736         PUSH P,D
17737         PUSH P,TT
17738         PUSH P,R
17739         HLRZ A,(R)
17740         PUSHJ P,(E)     ;RETN CHR IN W
17741          JRST .+3
17742           TLO E,200000
17743         TLO E,400000
17744         MOVE I,W
17745         POP P,R
17746         POP P,TT
17747         POP P,D
17748         POP P,C
17749         LDB W,[410300,,D]
17750         TLNN E,100000
17751          CAIN W,7       ;SKIP IF NOT AT 1ST CHAR.
17752           TLNN E,300000
17753            JRST INBTO3
17754         POPJ P,
17755
17756 INBTO3: UMOVE W,(D)             ;PICK UP CURRENT WORD
17757         IDPB I,TT               ;INSERT CHARACTER
17758         UMOVEM W,(D)            ;PUT WORD BACK
17759         ADD D,[700000,,]
17760         TLNE D,500000
17761          JRST INBTO1            ;DO ANOTHER CHR THIS WORD
17762         MOVE TT,BTOCHT+4
17763         ADD D,[500001,,1]       ;INCR TO NEXT WD
17764         SKIPL E                 ;SKIP IF EOF
17765          JUMPL D,INBTO1
17766         UMOVEM D,(C)            ;DONE, UPDATE POINTER AND RETURN
17767         POPJ P,
17768
17769 INBTO2: MOVEI I,EOFCH           ;EOF, STORE EOF CHARACTER
17770         JRST INBTO3
17771
17772 ;BLOCK IO TO WORD DEVICE
17773 ;C POINTS TO AOBJN POINTER IN USER SPACE
17774 ;Q POINTS TO WORD HANDLING ROUTINE (POINTER WILL BE IN C)
17775 ;MUST NOT CLOBBER Q OR H (PTR ROUTINES DO POPJ2 SOMETIMES)
17776 ;WRDBRT CHECKED FOR ON PDL BY TVC ROUTINES
17777
17778 WRDBT:  MOVE H,C
17779         UMOVE C,(H)             ;FETCH USER'S AOBJN POINTER
17780         JUMPGE C,CPOPJ
17781         JRST WRDBT3
17782
17783 WRDBT2: PUSHJ P,OPBRK
17784 WRDBT3: ANDI C,-1
17785         PUSHJ P,(Q)
17786 WRDBRT:  JRST WRDBT5            ;NO SKIP - WORD XFERRED
17787          SKIPA C,[1,,1]         ;1 SKIP - LAST WORD XFERRED
17788           POPJ P,               ;2 SKIPS - EOF, NO WORD XFERRED
17789         XCTR XRW,[ADDM C,(H)]
17790         POPJ P,
17791
17792 WRDBT5: MOVE C,[1,,1]
17793         XCTR XRW,[ADDB C,(H)]
17794         JUMPL C,WRDBT2
17795         POPJ P,
17796
17797 ;JSP W,WRDBTI TO DO WRDBT FOR A UNIT MODE INPUT ROUTINE SATISFYING NEW
17798 ;CALLING CONVENTION FOR THOSE.
17799 WRDBTI: JSP Q,WRDBT
17800         XCTR XRW,[MOVES (C)]
17801         PUSH P,W
17802         PUSHJ P,(W)
17803          JRST WRDBT4
17804          JRST POPWJ2
17805         AOS -1(P)
17806 WRDBT4: UMOVEM W,(C)
17807         MOVEI Q,WRDBTI+1
17808         POP P,W
17809         POPJ P,
17810 \f
17811 ;CHANGED CONVENTIONS: 
17812  ;1) EOF IS NO LONGER CHECKED FOR CHARACTER BY CHARACTER.
17813  ;   INSTEAD, THE GET-BUFFER ROUTINE SHOULD SET UP THE BYTE COUNT
17814  ;   TO A SMALLER VALUE THAN USUAL.
17815  ;   AN ATTEMPT TO GET ANOTHER BUFFER AFTER REACHING EOF
17816  ;   SHOULD CAUSE THE GET-BUFFER ROUTINE TO SKIP TWICE.
17817  ;2) THE THE BUFFER POINTER IS NOW A B.P. EVEN IN IMAGE MODE.
17818  ;   ALSO, THE L.H. OF THE B.P. IS NOT INITTED HERE.
17819  ;   IT MUST BE SET UP BY THE OPEN ROUTINE. ALSO, ACCESS ROUTINES
17820  ;   FOR DSK MUST KNOW HOW TO SET IT UP.
17821  ;   ALSO, THE BUFFER GET ROUTINE SHOULD SET IT UP,
17822  ;   INSTEAD OF RETURNING THE BUFFER ADDRESS IN TT.
17823  ;3) THE BYTE SIZE THE FILE IS OPEN ON IS PASSED AS AN ARGUMENT.
17824  ;   THIS ROUTINE WORKS FOR ANY CHANNEL BYTE SIZE WITH ANY
17825  ;   SIOT BYTE SIZE.
17826
17827 ;GENERAL BLOCK I/O
17828 ;RH OF E HAS # BYTES/WORD OF FILE BYTE SIZE.  LH OF E HAS B.P. 44NN00.
17829 ;RH(C) = ADDR OF COUNT, IN USER MEMORY
17830 ;RH(TT) = ADDR OF USER'S B.P.
17831 ; ARGUMENTS B ->
17832 ;0(B)   ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
17833 ;1(B)   ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
17834 ;2(B)   ROUTINE TO GET NEXT BUFFER.  NO SKIP IF NO MEMORY
17835 ;        OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
17836 ;        AND BUFFER BYTE POINTER ALREADY SET UP.
17837 ;         2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
17838 ;       WHEN THIS ROUTINE IS CALLED, E CONTAINS THE
17839 ;       NUMBER OF BYTES/WORD (GOOD FOR DETERMINING CHANNEL MODE).
17840 ;3(B)   ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
17841 ;       MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO,
17842 ;       IN WHICH CASE IT SHOULD CONTAIN THE NEW NUMBER OF BYTES.
17843 ;4(B)   NOT USED
17844 ;5(B)   IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
17845 ;       IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
17846
17847 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
17848 ;SIOKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
17849
17850 SIOKT:  PUSH P,E
17851         PUSH P,TT
17852         PUSH P,C
17853         JRST SIOKT1
17854
17855 ;NEXT BUFFER
17856
17857 SIOKNB: PUSHJ P,@3(B)   ;"DISCARD" BUFFER
17858         SKIPE J,@1(B)   ;CHECK AMOUNT REMAINING ONE MORE TIME
17859          JRST SIOKT1    ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
17860         SKIPG 5(B)      ;NEED TO WAIT FOR DEVICE?
17861          JRST SIOKF1    ;NO.
17862 SIOKN1: SKIPG 5(B)      ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
17863          JRST SIOKW1    ;DEVICE CAN'T WAIT SO UDELAY
17864         XCT 5(B)        ;DEVICE WAIT
17865 SIOKF:  PUSHJ P,UFLS
17866
17867 SIOKF1: PUSHJ P,@2(B)   ;NOW GET NEXT BUFFER
17868          JRST SIOKN1    ;HMM, HAVE TO WAIT
17869           JRST SIOKT1   ;BUFFER HAS BEEN GOT.
17870         JRST POP3J1     ;EOF, TRANSFER IS COMPLETE
17871
17872 SIOKT1: UMOVE TT,@(P)   ;GET COUNT OF BYTES TO TRANSFER
17873         JUMPLE TT,POP3J1        ;COUNT DECREMENTED TO 0; TRANSFER DONE.
17874         SKIPG D,@1(B)   ;CHECK AMOUNT LEFT IN BUFFER
17875          JRST SIOKNB    ;NEW BUFFER NEEDED
17876         CAMLE TT,D      ;AMT OF ROOM LEFT IN CURRENT BUFFER
17877          MOVE TT,D      ;TRANSFER ONLY AMT LEFT IN BUFFER
17878         UMOVE J,@-1(P)
17879         IBP J
17880         LDB D,[301400,,J]
17881         MOVE C,@(B)
17882         IBP C           ;TO TRANSFER WORD-WISE, BOTH B.P.'S MUST
17883         HRL J,C
17884         LDB C,[301400,,C]
17885         CAIE C,(D)      ;HAVE SAME BYTE SIZE,
17886          JRST SIOKS1
17887         LDB D,[060600,,C]
17888         ANDI C,77
17889         ADDI C,(D)
17890 ;DROPS THROUGH
17891 \f;DROPS IN
17892         CAIGE TT,@-2(P) ;THERE MUST BE AT LEAST 1 WORD TO TRANSFER,
17893          JRST SIOKS1
17894         CAIE C,44       ;AND MUST BE ABOUT TO START THE NEXT WORD.
17895          JRST SIOKSL
17896         PUSH P,TT+1
17897         IDIVI TT,@-3(P) ;GET # WDS TO BLT
17898         POP P,TT+1
17899         SKIPGE (B)
17900          MOVSS J        ;WRITING, SWAP BLT POINTER
17901         MOVE D,J
17902         ADDI TT,(D)     ;1+LAST WORD TO BLT INTO
17903         SKIPGE (B)
17904          JRST SIOKN6    ;JUMP IF WRITING
17905         XCTRI XBW,[BLT D,-1(TT)] ;READING
17906 SIOKN7:  MOVEI D,(TT)   ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
17907 SIOKN8: SUBM D,J
17908         HRRZS J         ;# WDS ACTUALLY XFERRED
17909         ADDM J,@(B)     ;INCR BUFFER PNTR
17910         XCTR XRW,[ADDM J,@-1(P)]
17911         IMULI J,@-2(P)
17912         MOVNS J
17913         XCTR XRW,[ADDM J,@(P)]
17914         ADDM J,@1(B)    ;DECREMENT COUNT LEFT IN BUFFER
17915         CAIE D,(TT)     ;SKIP IF TRANSFERRED ALL WE COULD
17916          PUSHJ P,TPFLT  ;TAKE FAULT
17917 SIOKN3: SKIPN @1(B)
17918          PUSHJ P,@3(B)  ;BUFFER EXHAUSTED, DISCARD (MAY COME BACK TO LIFE).
17919         JRST SIOKT1     ;TRY AGAIN TO TRANSFER.
17920
17921 SIOKW1: PUSHJ P,UDELAY
17922         JRST SIOKF1
17923
17924 SIOKN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
17925          JRST SIOKN7
17926         JRST SIOKN8
17927
17928 ;COME HERE FOR SLOW (BYTE AT A TIME) SIOT TO BLOCK MODE DEVICE.
17929 ;TT HAS NUMBER OF BYTES TO TRANSFER - IT IS KNOWN THAT THE DEVICE
17930 ;CAN SUPPLY THAT MANY FROM ITS CURRENT BUFFER.
17931 SIOKSL: SUBM C,D        ;D GETS SIZE; C HAS # BITS REMAINING TO BE HANDLED
17932         IDIV C,D        ;C GETS # BYTES TO XFER TILL REACH WORD BOUNDARY.
17933         MOVE TT,C       ;XFER THAT MANY, THEN TRY AGAIN, SO WILL USE FAST MODE.
17934 SIOKS1: SKIPL (B)
17935          JRST SIOKSI    ;INPUT AND OUTPUT PART HERE
17936         LDB D,[300600,,@(B)]    ;BYTE SIZE IN THE BUFFER
17937         MOVEI C,36.
17938         IDIV C,D        ;D := # EXTRA BITS AT RIGHT END OF WORD
17939         MOVEI J,1
17940         LSH J,(D)
17941         SOS J           ;J := MASK FOR THEM
17942         UMOVE C,@-1(P)  ;GET COPY OF USER'S B.P. FOR SWAPPING IN PAGES.
17943 SIOKS3: IBP C           ;IF NOT FOR THESE 2 INSNS, ILDB MIGHT GET PAGE FAULT
17944         UMOVE (C)       ;WHICH WOULD CAUSE EXTRA INCREMENTING OF B.P.
17945         XCTR XBYTE,[ILDB D,@-1(P)] ;FETCH NEXT BYTE,
17946         IDPB D,@(B)
17947         MOVE D,@(B)
17948         ANDCAM J,(D)    ;TURN OFF EXTRA BITS IN THIS WORD OF BUFFER
17949         SOS @1(B)
17950         XCTR XRW,[SOS @(P)]
17951         SOJG TT,SIOKS3
17952         JRST SIOKN3
17953
17954 SIOKSI: UMOVE C,@-1(P)  ;GET COPY OF USER'S B.P., FOR WRITEABILITY TESTING.
17955 SIOKS2: IBP C
17956         XCTR XRW,[MOVES (C)]    ;MAKE SURE WE CAN WRITE IN NEXT BYTE.
17957         ILDB D,@(B)             ;GET NEXT BYTE FROM DEVICE BUFFER
17958         XCTR XBYTE,[IDPB D,@-1(P)];GIVE IT TO USER.
17959         XCTR XRW,[SOS @(P)]     ;UPDATE USER'S COUNT
17960         SOS @1(B)               ;AND THE SYSTEM'S COUNT.
17961         SOJG TT,SIOKS2
17962         JRST SIOKN3
17963
17964 ;CONVENIENT EXIT ROUTINE FOR BUFFER-GET ROUTINES.
17965 ;ASSUMES ADDR OF START OF BUFFER IN TT,
17966 ;SIZE (IN WORDS) OF DATA AREA IN J.
17967 ;E SHOULD HAVE WHAT IT HAD WHEN SIOKT WAS CALLED.
17968 SIOBGX: IMULI J,(E)
17969 SIOBG1: HLL TT,E
17970 SIOBG2: MOVEM TT,@(B)
17971         MOVEM J,@1(B)
17972         JRST POPJ1
17973 \f
17974 ;BYTE AT A TIME I/O TO BLOCK MODE DEVICE
17975 ;SEE PRECEDING PAGE (SIOKT) FOR COMMENTS ON CALLING SEQUENCE
17976 ;EXCEPT: ON INPUT, VALUE RETURNED IN W, AND C,D HAVE NO SIGNIFICANCE;
17977 ;ON OUTPUT, RH(C) HAS ADDRESS OF ARG, SIGN(C) SET IFF ADDRESS IS EXEC-MODE,
17978 ; AND D HAS NO SIGNIFICANCE.
17979
17980 CHRKT:  SKIPGE (B)
17981          JRST CHRKTO    ;WRITING
17982         JRST CHRKTI     ;READING
17983
17984 CHRKTI: SOSGE @1(B)     ;DECREMENT ACTIVE CHAR COUNT
17985          JRST CHRKT1    ;GET NEW BUFFER
17986         ILDB W,@(B)     ;READ - GET NEXT CHAR
17987         POPJ P,
17988
17989 CHRKTO: SKIPGE C        ;USED WHEN FILLING OUT BLOCK AT CLOSE, AND ELSEWHERE.
17990          SKIPA J,(C)
17991           UMOVE J,(C)   ;GET CHAR. FROM USER
17992         SOSGE @1(B)     ;DECREMENT ACTIVE CHAR COUNT
17993          JRST CHRKT1    ;GET NEW BUFFER
17994         IDPB J,@(B)     ;DEPOSIT IN BUFFER
17995         CAIE E,5        ;SKIP IF ASCII
17996          POPJ P,
17997         MOVEI J,1
17998         MOVE D,@(B)
17999         ANDCAM J,(D)    ;CLEAR EXTRA BIT
18000         POPJ P,
18001
18002 CHRKT1: AOS @1(B)       ;COMPENSATE FOR OVER-SOS
18003         PUSHJ P,@3(B)   ;GET RID OF THIS BUFFER
18004         SKIPLE J,@1(B)  ;CHECK AMOUNT REMAINING ONE MORE TIME
18005          JRST CHRKT     ;SPRUNG BACK TO LIFE (LAST BLOCK OF FILE WRITE OVER)
18006         SKIPG 5(B)      ;NEED TO WAIT FOR DEVICE?
18007          JRST CHRKF1    ;NO.
18008 CHRKN1: SKIPG 5(B)      ;HAVE TO WAIT
18009          JRST [ PUSHJ P,UDELAY
18010                 JRST CHRKF1 ]
18011         XCT 5(B)        ;DEVICE WAIT
18012          PUSHJ P,UFLS
18013
18014 CHRKF1: PUSHJ P,@2(B)   ;GOBBLE NEW BLOCK
18015          JRST CHRKN1    ;NOT READY, WAIT
18016           JRST CHRKT
18017         CAME E,[444400,,1]
18018          JRST UNIEOF    ;READING PAST EOF IN ASCII MODE.
18019         JRST IOCER2     ;READING PAST EOF IN IMAGE MODE.
18020 \f
18021 ;GENERAL BLOCK I/O
18022 ;E HAS BPLH,,# BYTES/WORD OF FILE BYTE SIZE - MUST BE 444400,,1
18023 ;RH(C) = ADDR OF AOBJN POINTER
18024 ; AND 4.9 => AOBJN PTR IS IN EXEC ADDRESS SPACE,
18025 ;     4.8 => BLOCK IT POINTS TO IS IN EXEC ADDRESS SPACE. (INPUT ONLY)
18026 ; ARGUMENTS B ->
18027 ;0(B)   ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
18028 ;1(B)   ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
18029 ;2(B)   ROUTINE TO GET NEXT BUFFER.  NO SKIP IF NO MEMORY
18030 ;        OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
18031 ;        AND BUFFER B.P. IN @(B) ALREADY SET UP.
18032 ;         2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
18033 ;3(B)   ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
18034 ;       MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO.
18035 ;4(B)   NOT USED
18036 ;5(B)   IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
18037 ;       IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
18038
18039 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
18040 ;BLKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
18041
18042 ;CODE IS ON NEXT PAGE
18043 \f
18044 BLKT:   CAME E,[444400,,1]
18045          BUG            ;BLKT CALLED ON UNIT ASCII MODE CHANNEL??
18046         SKIPL C         ;SKIP IF POINTER IN USER SPACE
18047          XCTR XRW,[MOVES (C)] ;USER SPACE, MAKE SURE WRITE CYCLE WILL WIN
18048         JRST BLKT1
18049
18050 ;NEXT BUFFER
18051
18052 BLKTNB: PUSHJ P,@3(B)   ;"DISCARD" BUFFER
18053         SKIPE @1(B)     ;CHECK AMOUNT REMAINING ONE MORE TIME
18054          JRST BLKT1     ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
18055         SKIPG 5(B)      ;NEED TO WAIT FOR DEVICE?
18056          JRST BLKTF1    ;NO.
18057 BLKTN1: SKIPG 5(B)      ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
18058          JRST BLKTW1    ;DEVICE CAN'T WAIT SO UDELAY
18059         XCT 5(B)        ;DEVICE WAIT
18060 BLKTF:  PUSHJ P,UFLS
18061
18062 BLKTF1: PUSHJ P,@2(B)   ;NOW GET NEXT BUFFER
18063          JRST BLKTN1    ;HMM, HAVE TO WAIT
18064           JRST BLKT1
18065         POPJ P,         ;EOF, TRANSFER FINISHED
18066
18067 BLKT1:  SKIPGE C        ;SET UP FOR TRANSFER
18068          SKIPA J,(C)    ;GET EXEC MODE BLOCK .IOT (AOBJN) POINTER
18069           UMOVE J,(C)   ;GET USER MODE AOBJN POINTER
18070         JUMPGE J,CPOPJ  ;POINTER COUNTED OUT, TRANSFER DONE
18071         SKIPG D,@1(B)   ;CHECK AMOUNT LEFT IN BUFFER
18072          JRST BLKTNB    ;NEW BUFFER NEEDED
18073         HLRE TT,J
18074         MOVNS TT        ;DESIRED SIZE OF BLOCK
18075         CAMLE TT,D      ;AMT OF ROOM LEFT IN CURRENT BUFFER
18076          MOVE TT,D      ;TRANSFER ONLY AMT LEFT IN BUFFER
18077         MOVE D,@(B)     ;CANONICALIZE THE BUFFER B.P. SO RH => NEXT WORD TO XFER
18078         IBP D
18079         HRL J,D         ;MERGE WITH USER'S BLOCK ADDR TO GET BLT AC.
18080         SKIPGE (B)
18081          MOVSS J        ;WRITING, SWAP BLT POINTER
18082         MOVE D,J
18083         ADDI TT,(D)     ;1+LAST WORD TO BLT INTO
18084         TLNE C,200000
18085          JRST BLKTN9    ;JUMP IF EXEC AOBJN POINTER
18086         SKIPGE (B)
18087          JRST BLKTN6    ;JUMP IF WRITING
18088         XCTRI XBW,[BLT D,-1(TT)] ;READING
18089 BLKTN7:  MOVEI D,(TT)   ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
18090 BLKTN8: SUBM D,J
18091         HRRZS J         ;# WDS ACTUALLY XFERRED
18092         ADDM J,@(B)     ;INCR BUFFER PNTR
18093         HRLS J          ;PUT # WDS IN BOTH HALVES
18094         JUMPL C,BLKTN3  ;UPDATE AOBJN PTR IN EXEC SPACE
18095         XCTRI XRW,[ADDM J,(C)] ;UPDATE AOBJN PTR IN USER SPACE
18096          JRST .+2
18097           BUG           ;MUMBLE.  THIS WAS SUPPOSED TO BE THERE.
18098
18099 BLKTN4: MOVNI J,(J)
18100         ADDM J,@1(B)    ;DECREMENT COUNT LEFT IN BUFFER
18101         CAIE D,(TT)     ;SKIP IF TRANSFERRED ALL WE COULD
18102          PUSHJ P,TPFLT  ;TAKE FAULT IF ANY
18103         SKIPN @1(B)
18104          PUSHJ P,@3(B)  ;BUFFER EXHAUSTED, "DISCARD"
18105         JRST BLKT1      ;GO TRANSFER ANOTHER CHUNK
18106
18107 BLKTN3: ADDM J,(C)      ;UPDATE EXEC AOBJN POINTER
18108         JRST BLKTN4
18109
18110 BLKTW1: PUSHJ P,UDELAY
18111         JRST BLKTF1
18112
18113 BLKTN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
18114          JRST BLKTN7
18115         JRST BLKTN8
18116
18117 BLKTN9: BLT D,-1(TT)    ;READING INTO EXEC SPACE
18118         JRST BLKTN7
18119 \f
18120 SUBTTL DIRECTORY AND ERR DEVICES
18121
18122 QMLSTF: MOVEI J,4       ;ENTRY TO GET MASTER 2314 DIRECTORY
18123         JRST LISTF7
18124
18125 QLISTF: MOVEI J,3       ;ENTRY FOR 2314 USER DIRECTORY
18126 LISTF7: MOVEI I,0
18127 LISTFE: PUSHJ P,SWTL    ;ENTER HERE FOR ALL KINDS OF DIRECTORIES.
18128         UDCSW
18129         MOVSI TT,-NUDCH
18130 UD1:    SKIPGE UDUSR(TT)
18131          JRST UD2
18132         AOBJN TT,UD1
18133         PUSHJ P,LSWPOP
18134         PUSHJ P,UDELAY  ;DIRECTORY NOT AVAILABLE NOW, WAIT
18135         JRST LISTFE
18136
18137 UD2:    MOVEM J,DSKLST(TT)
18138         MOVEM I,UDUSR(TT)
18139         MOVEM U,UDUIND(TT)
18140         PUSHJ P,LSWPOP
18141         MOVE Q,USYSN1(U)
18142         MOVEM Q,UDSYSN(TT)
18143         JUMPG J,UDIF    ;JUMP IF NOT UTAPE DIR.
18144 IFE NUNITS, BUG         ;HOW DID UTAPE GET HERE?
18145 IFN NUNITS,[
18146         CONO PI,CLKOFF
18147         MOVE Q,UDIRO(I)
18148         MOVEM Q,DIRPT(TT)
18149         CONO PI,CLKON
18150         MOVEI J,200
18151         TRNE D,2
18152         JRST UDBIN      ;IMAGE MODE UTAPE DIR
18153         MOVEI Q,LISTF   ;ASCII MODE UTAPE DIR
18154 ]
18155 UDIF1:  MOVEM Q,DIRPC(TT)
18156         HRL A,TT
18157         JSP Q,OPSLD1
18158         DIRCHN,,DIRBN
18159
18160 UDIF:   HLRZ Q,UDT-1(J) ;INITIAL COROUTINE PC
18161         HRRZ T,UDT-1(J) ;PLACE TO FINISH OPENING - USUALLY UDIF1.
18162         JRST (T)
18163
18164 UQL1:   HRRZM H,UUDPP(TT)       ;2314 MFD (FROM UDIF)
18165         MOVEI J,2000
18166         TRNE D,2
18167         JRST QUDBIN
18168         JRST UDIF1
18169
18170 UQL1A:  PUSHJ P,STMSET  ;DISK UFD (FROM UDIF). WE CAN STILL PCLSR,
18171         UDUSR(TT)       ;ARRANGE TO GIVE BACK THE DIRECTORY CHANNEL.
18172 UQL1B:  PUSH P,TT
18173         PUSHJ P,QUDLK
18174         PUSHJ P,TCALL   ;GET A LOW-HALF PAGE TO COPY UFD INTO.
18175           JRST IOMQ     ;GET LOW HALF PAGE
18176          JRST UQL1W     ;NOT AVAIL NOW
18177         MOVEI T,MU23LS
18178         DPB T,[MUR,,MEMBLT(A)]  ;MARK THE PAGE AS A UFD COPY.
18179         LSH A,10.
18180         MOVEM A,DIRPT(TT)
18181         MOVEM A,UUDPP(TT)
18182         HRL A,QSNLCN(H)
18183         HRRI T,2000(A)
18184         BLT A,-1(T)     ;COPY UFD
18185         PUSHJ P,QUDULK
18186         PUSHJ P,LSWDEL  ;STMSET OF UDUSR.
18187         SKIPG QSNNR(H)
18188          BUG            ;WE ALWAYS GET OUR MAN
18189         PUSHJ P,LSWPOP  ;SOS QSNNR
18190         POP P,TT
18191         MOVEI J,2000
18192         TRNE D,2
18193         JRST UDBIN
18194         JRST UDIF1
18195
18196 UQL1W:  PUSHJ P,QUDULK
18197         POP P,TT
18198         PUSHJ P,UDELAY
18199         JRST UQL1B
18200 \f
18201 ;LH INITIAL PC RH DISP ADR AT OPEN TIME
18202 UDT:    NDLF,,UDIF1     ;NON DIR DEVICE
18203         UCL1,,UDIF1     ;CORE LINK
18204         UQL2,,UQL1A     ;2314 UFD
18205         QMLS1,,UQL1     ;2314 MFD
18206         ERR1,,ERR2      ;ERR DEVICE
18207         TTYFLD,,UDIF1   ;TTY DIR
18208         TTYF99,,UDIF1   ;COR DIR (LAST LINE OF TTY DIR)
18209 UDTLN==.-UDT
18210
18211 QUDBIN: HRRZ T,QMDRO
18212         MOVEM T,DIRPT(TT)
18213 UDBIN:  MOVEM J,NUM(TT) ;DOESN'T USE DIRPC THIS PC
18214         MOVEM J,ENDT(TT)
18215         MOVEI J,444400
18216         HRLM J,DIRPT(TT)
18217         HRL A,TT
18218         JSP Q,OPSLD1
18219         NDATAI,,NBLKI
18220
18221 UTDCLS: MOVE B,DSKLST(A)
18222         CAIN B,3
18223         JRST UTDCL1
18224 UTDCLX: SETOM UDUSR(A)
18225         POPJ P,
18226
18227 UTDCL1: PUSH P,A
18228         MOVE A,UUDPP(A)
18229         LSH A,-10.
18230         PUSHJ P,MEMR
18231         POP P,A
18232         JRST UTDCLX
18233
18234 ;UNIT MODE IOT ON DIR DEVICE COMES HERE (RETURN CHAR IN W)
18235 DIRCH:  SETOM SRN3(U)   ;SAY WE WANT ONLY 1 CHARACTER.
18236         PUSHJ P,DIRCHR
18237         HRRZ W,I
18238         CAIN W,^C
18239          JRST UNIEOF
18240         POPJ P,
18241
18242 ;BLOCK MODE IOT ON DIR DEVICE.
18243 DIRB:   JSP Q,WRDBT     ;PUSHJ'S TO .+1 FOR EACH WORD.
18244 DIRB1:  XCTR XRW,[MOVES (C)]    ;MAKE SURE WE CAN WRITE.
18245         PUSH P,C
18246         PUSH P,H
18247         SETZM SRN3(U)   ;SAY WE WANT A WHOLE WORD OF CHARS.
18248         PUSHJ P,DIRCHR
18249         POP P,H
18250         POP P,C
18251         LDB Q,[350700,,SRN3(U)]
18252         CAIN Q,^C       ;IF THE WORD STARTS WITH ^C,
18253          JRST POPJ2     ;IT IS EOF; DON'T RETURN IT, UNHANG IOT.
18254         MOVE Q,SRN3(U)
18255         UMOVEM Q,(C)
18256         MOVEI Q,DIRB1   ;FASTER THAN PUSHING AND POPPING Q.
18257         POPJ P,         ;RETURN INTO WRDBT
18258
18259         SKIPA T,[SIOKT]
18260 DDATAI:  MOVEI T,CHRKTI ;UNIT IMAGE INPUT FROM DIRECTORY.
18261         CAIA
18262 DBLKI:   MOVEI T,BLKT   ;BLOCK IMAGE INPUT FROM DIRECTORY
18263         MOVE E,[444400,,1]
18264         JSP B,(T)       ;TO BLKT, SIOKT, OR CHRKTI
18265           DIRPT(A)
18266           NUM(A)
18267           POPJ2         ;EOF IF TRY TO GET ANOTHER BUFFER
18268           CPOPJ         ;BUFFER DISCARD ROUTINE
18269           BUG
18270           SKIPA
18271 \f
18272 ;ERR DEVICE AND ERROR MESSAGE TABLES
18273 ; ERR DEVICE WORKS MUCH LIKE DIR DEVICE
18274
18275 ERRO:   MOVEI J,5
18276         JRST LISTF7
18277
18278 ERR2:   SOJE A,ERR21    ;LAST ERRONEOUS CHANNEL
18279         SOJE A,ERR22    ;CHANNEL SPECIFIED IN B
18280         SOJE A,ERR23    ;STATUS WORD IN B
18281         SOJE A,ERR24    ;.CALL ERROR ARG IN B
18282         SETOM UDUSR(TT)
18283         JRST OPNL11
18284
18285 ERR21:  LDB B,[BCHPTR]
18286 ERR22:  ANDI B,17
18287         ADDI B,IOCHST(U)
18288         SKIPA B,(B)
18289 ERR24:   MOVSS B
18290 ERR23:  MOVEM B,UUDPP(TT)
18291         JRST UDIF1
18292
18293 CORO:   PUSHJ P,FLDRCK
18294         JRST OPNL11
18295         MOVEI J,7
18296         JRST LISTF7
18297
18298 ERR1:   SKIPN I,UUDPP(A)
18299         JRST ERR3
18300         LDB B,[220600,,UUDPP(A)]        ;OPEN LOSS FIELD
18301         JUMPE B,ERR1B
18302         CAIL B,NERMES+1
18303          MOVEI B,NERMES+1
18304         MOVE TT,ERMST1-1(B)
18305         JSP B,MESPNT
18306 ERR1B:  LDB B,[300300,,UUDPP(A)]        ;IDS ERROR FIELD
18307         JUMPE B,ERR1C
18308         MOVE TT,ERMST2-1(B)
18309         JSP B,MESPNT
18310 ERR1C:  LDB B,[330400,,UUDPP(A)]        ;IOCERR FIELD
18311         JUMPE B,UCL7
18312         CAIL B,MIOTER
18313         CAIL B,NERM1+MIOTER
18314         MOVEI B,NERM1+MIOTER
18315         MOVE TT,ERMST3-MIOTER(B)
18316         JSP B,MESPNT
18317         JRST UCL7
18318
18319 ERR3:   MOVEI TT,[ASCIZ /ISE0
18320 /]
18321         JSP B,MESPNT
18322         JRST UCL7
18323 \f
18324 ;LISP ASSUMES THAT NO "ERR" DEVICE MESSAGE WILL EVER CONTAIN
18325 ; !, #, ^, OR LOWER CASE LETTERS.  PLEASE MAINTAIN THIS STATE
18326 ;   GLS (GUY STEELE)
18327
18328 ERMST1: [ASCIZ /NO SUCH DEVICE
18329 /]
18330         [ASCIZ /WRONG DIRECTION
18331 /]
18332         [ASCIZ /TOO MANY TRANSLATIONS
18333 /]
18334         [ASCIZ /FILE NOT FOUND
18335 /]
18336         [ASCIZ /DIRECTORY FULL
18337 /]
18338         [ASCIZ /DEVICE FULL
18339 /]
18340         [ASCIZ /DEVICE NOT READY
18341 /]
18342         [ASCIZ /DEVICE NOT AVAILABLE
18343 /]
18344         [ASCIZ /ILLEGAL FILE NAME
18345 /]
18346         [ASCIZ /MODE NOT AVAILABLE
18347 /]
18348         [ASCIZ /FILE ALREADY EXISTS
18349 /]
18350         [ASCIZ /BAD CHANNEL NUMBER
18351 /]
18352         [ASCIZ /TOO MANY ARGUMENTS (CALL)
18353 /]
18354         [ASCIZ /PACK NOT MOUNTED
18355 /]
18356         [ASCIZ /DIRECTORY NOT AVAIL
18357 /]
18358         [ASCIZ /NON-EXISTENT DIRECTORY
18359 /]
18360         [ASCIZ /LOCAL DEVICE ONLY
18361 /]
18362         [ASCIZ /SELF-CONTRADICTORY OPEN
18363 /]
18364         [ASCIZ /FILE LOCKED
18365 /]
18366         [ASCIZ /M.F.D. FULL
18367 /]
18368         [ASCIZ /DEVICE NOT ASSIGNABLE TO THIS PROCESSOR
18369 /]
18370         [ASCIZ /DEVICE WRITE-LOCKED
18371 /]
18372         [ASCIZ /LINK DEPTH EXCEEDED
18373 /]
18374         [ASCIZ /TOO FEW ARGUMENTS (CALL)
18375 /]
18376         [ASCIZ /CAN'T MODIFY JOB
18377 /]
18378         [ASCIZ /CAN'T GET THAT ACCESS TO PAGE
18379 /]
18380         [ASCIZ /MEANINGLESS ARGS
18381 /]
18382         [ASCIZ /WRONG TYPE DEVICE
18383 /]
18384         [ASCIZ /NO SUCH JOB
18385 /]
18386         [ASCIZ /VALID CLEAR OR STORED SET
18387 /]
18388         [ASCIZ /NO CORE AVAILABLE
18389 /]
18390         [ASCIZ /NOT TOP LEVEL
18391 /]
18392         [ASCIZ /OTHER END OF PIPELINE GONE OR NOT OPEN
18393 /]
18394         [ASCIZ /JOB GONE OR GOING AWAY
18395 /]
18396         [ASCIZ /ILLEGAL SYSTEM CALL NAME
18397 /]
18398         [ASCIZ /CHANNEL NOT OPEN
18399 /]
18400         [ASCIZ /INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18401 /]
18402         [ASCIZ /UNRECOGNIZABLE FILE
18403 /]
18404         [ASCIZ /LINK TO NON-EXISTENT FILE
18405 /]
18406 IFN .-ERMST1-NOPNLS,.ERR WRONG TABLE LENGTH
18407 ;ADD NEW MESSAGES HERE
18408
18409 IFN 0,[         A CLASSIFICATION OF OPEN-LOSS MESSAGES
18410
18411 FULL -  NO CORE (MMP FULL)
18412         DIR NOT AVAIL (DIR CHNL TABLE FULL)
18413         DEVICE FULL
18414         DIR FULL
18415         MFD FULL
18416         INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18417
18418 NO SUCH - DEVICE, FILE, JOB, DIRECTORY, PAGE (CAN'T GET ACCESS)
18419           ILLEGAL SYSTEM CALL NAME
18420
18421 ALREADY ONE SUCH - FILE (FILE ALREADY EXISTS - RENAME)
18422
18423 WRITING - CAN'T MODIFY JOB
18424          DEVICE WRITE-LOCKED
18425          WRONG DIRECTION
18426          MODE NOT AVAILABLE
18427          CAN'T GET ACCESS TO PAGE
18428
18429 ARGS (THE PARAMETERS ARE RIDICULOUS) -
18430         SELF-CONTRADICTORY OPEN COMMAND
18431         ILLEGAL FILE NAME
18432         BAD CHANNEL NUMBER
18433         TOO FEW ARGS
18434         TOO MANY ARGS
18435         MEANINGLESS ARGS
18436         CHANNEL NOT OPEN
18437
18438 NOT AVAILABLE (IT EXISTS BUT YOU CAN'T USE IT) -
18439         DEVICE NOT READY
18440         DEVICE NOT AVAILABLE
18441                NOT ASSIGNABLE TO THIS PROCESSOR
18442         LOCAL DEVICE
18443         PACK NOT MOUNTED
18444         FILE LOCKED
18445         OTHER END OF PIPELINE GONE
18446         JOB GONE OR GOING AWAY
18447
18448 DEPTH - LINK DEPTH EXCEEDED
18449         TOO MANY TRANSLATIONS
18450
18451 OTHER - NOT TOP LEVEL
18452         VALID CLEAR OR STORED SET
18453 ]
18454 \f
18455 NERMES==.-ERMST1
18456         [ASCIZ /OPEN TYPE NOT DETERMINED
18457 /]
18458
18459 ERMST2: [ASCIZ /IDS ILLEGAL SCOPE MODE
18460 /]
18461         [ASCIZ /IDS SCOPE HUNG
18462 /]
18463         [ASCIZ /MORE THAN 1K SCOPE BUFFER
18464 /]
18465         [ASCIZ /IDS MEM PROTECT
18466 /]
18467         [ASCIZ /IDS ILLEGAL SCOPE OP
18468 /]
18469         [ASCIZ /IDS MEM PROTECT ON PDL PNTR
18470 /]
18471         [ASCIZ /IDS ILLEGAL PARAMETER SET
18472 /]
18473
18474 ERMST3: [ASCIZ /DEVICE HUNG OR REPORTING NON-DATA ERROR
18475 /]
18476         [ASCIZ /END OF FILE
18477 /]
18478         [ASCIZ /NON-RECOVERABLE DATA ERROR
18479 /]
18480         [ASCIZ /NON-EXISTENT SUB DEVICE
18481 /]
18482         [ASCIZ /OVER IOPOP
18483 /]
18484         [ASCIZ /OVER IOPUSH
18485 /]
18486         [ASCIZ /USR OP CHNL DOES NOT HAVE USR OPEN
18487 /]
18488         [ASCIZ /CHNL NOT OPEN
18489 /]
18490         [ASCIZ /DEVICE FULL
18491 /]
18492         [ASCIZ /CHNL IN ILLEGAL MODE ON IOT
18493 /]
18494         [ASCIZ /ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY
18495 /]
18496         [ASCIZ /DIRECTORY FULL
18497 /]
18498         [ASCIZ /DIRECTORY'S ALLOCATION EXHAUSTED
18499 /]
18500 ;INSERT NEW MESSAGES HERE
18501 NERM1==.-ERMST3
18502         [ASCIZ /IOT OR OPR TYPE NOT DETERMINED
18503 /]
18504 \f
18505 ;DIRECTORY LISTING ROUTINES
18506
18507 UQL3C:  SKIPA I,["*]
18508 UQL3:    MOVEI I,"-
18509         PUSHJ P,OUTC
18510         JRST UQL3A
18511
18512 UQL2:   MOVEI TT,[MNAME ASCIZ /,  /]    ;GENERATE USER DIRECTORY
18513         JSP B,MESPNT
18514         MOVE I,UUDPP(A)
18515         MOVEI J,UDNAME(I)
18516         JSP B,SIXTYC    ;SEND DIRECTORY NAME
18517         MOVEI TT,[ASCIZ /
18518 FREE BLOCKS /]
18519         JSP B,MESPNT
18520         MOVSI E,-NQS
18521 UQL2A:  SKIPGE QACT(E)
18522          JRST UQL3      ;UNIT NOT ENGAGED
18523         MOVE J,QTUTO(E)
18524         TLNE J,40000
18525          JRST UQL3C     ;TUT FOR UNIT NOT IN
18526         MOVEI I,"#
18527         PUSHJ P,OUTC
18528         MOVE TT,QPKID(E)
18529         JSP B,GDPT      ;AND #
18530         MOVEI I,"=
18531         PUSHJ P,OUTC
18532         MOVE TT,QSFT(E)
18533         JSP B,GDPT      ;AND # FREE TRACKS
18534 UQL3A:  PUSHJ P,OUTCS
18535         AOBJN E,UQL2A
18536         JSP B,MESPCR
18537         MOVE I,UUDPP(A)
18538         MOVEM I,DIRPT(A)
18539         MOVE Q,UDNAMP(I)
18540 UQL4:   CAIL Q,2000
18541          JRST UCL7
18542         HRLI I,440600+Q
18543         HLLM I,DIRPT(A)
18544 \f
18545 UQLP:   ADDI Q,2        ;MOVE PNTR TO 3RD WRD OF FILE DESC
18546         MOVE I,@DIRPT(A)
18547         MOVEI TT,[ASCIZ /* /]   ;DELETED OR BEING WITTEN
18548         TLNN I,UNIGFL
18549          MOVEI TT,[ASCIZ /  /]
18550         JSP B,MESPNT
18551         MOVE I,@DIRPT(A)
18552         TLNE I,UNLINK
18553          JRST UQLL1     ;LINK
18554         LDB TT,[UNPKN+@DIRPT(A)]
18555         JSP B,GDPT      ;PRINT PACK #
18556         LDB TT,[UNPKN+@DIRPT(A)]
18557         CAIG TT,9
18558 UQLL2:   PUSHJ P,OUTCS
18559         PUSHJ P,OUTCS
18560         SUBI Q,2        ;BACK TO FIRST WD
18561         JSP B,SIXTYA    ;SEND FIRST FILE NAME
18562         JSP B,SIXTYB    ;AND SECOND (AOSES Q)
18563         PUSHJ P,OUTCS
18564         AOS Q           ;SET Q TO POINT TO FILE DESC PNTR
18565         LDB E,[UNDSCP+@DIRPT(A)]        ;PICK UP FILE DESC PNTR
18566         IDIVI E,UFDBPW
18567         ADDI E,UDDESC   ;COMPUTE WORD ADDRESS
18568         MOVE I,@DIRPT(A)        ;SAVE STATUS WORD
18569         EXCH E,Q        ;MOVE INTO PNTR
18570         MOVE TT,QBTBLI(TT)
18571         TLO TT,Q
18572         HLLM TT,DIRPT(A)        ;SET UP DIRPT TO POINT TO FILE DESC
18573         TLNE I,UNLINK
18574          JRST QLL1      ;LINK
18575         MOVEI TT,0
18576 UQL5:   JSP B,UQL5R     ;CHECK IF ABOUT TO INCREMENT OFF WORD
18577         ILDB I,DIRPT(A)
18578         JUMPE I,UQL5A   ;STOP
18579         CAILE I,UDTKMX
18580          JRST UQL5B
18581         ADD TT,I
18582         JRST UQL5
18583
18584 UQLL1:  MOVEI I,"L
18585         PUSHJ P,OUTC
18586         JRST UQLL2
18587 \f
18588 QLL1:   CLEARM ENDT(A)  ;CNTS TO 3 FOR USER NAME AND 2 FILE NAMES
18589 QLL3:   CLEARM NUM(A)   ;CHR CNTR
18590 QLLIST: JSP B,UQL5R
18591         ILDB I,DIRPT(A)
18592         JUMPE I,QLL4
18593         CAIN I,';
18594          JRST QLL2
18595         CAIN I,':
18596          JRST QLL5
18597 QLL5A:  ADDI I,40
18598         PUSHJ P,OUTC
18599         AOS I,NUM(A)
18600         CAIGE I,6
18601          JRST QLLIST
18602 QLL2:   PUSHJ P,OUTCS
18603         AOS I,ENDT(A)
18604         CAIGE I,3
18605          JRST QLL3
18606 QLL4:   JSP B,MESPCR
18607         MOVEI Q,3(E)    ;ADVANCE Q
18608         JRST UQL4
18609
18610 QLL5:   JSP B,UQL5R
18611         ILDB I,DIRPT(A)
18612         JRST QLL5A
18613
18614 UQL5R:  MOVE I,DIRPT(A) ;CHECK IF ABOUT TO ILDB OFF WORD
18615         TLNE I,770000
18616          JRST (B)       ;NO
18617         MOVEI I,440600+Q        ;YES INCREMENT Q INSTEAD
18618         HRLM I,DIRPT(A)
18619         AOJA Q,(B)
18620
18621 UQL5B:  CAIGE I,UDWPH   ;PLACE HOLDER
18622          AOJA TT,UQL5   ;SKIP AND TAKE
18623         CAIN I,UDWPH
18624          JRST UQL5      ;NULL
18625         REPEAT NXLBYT,[JSP B,UQL5R
18626         IBP DIRPT(A)
18627 ]
18628         AOJA TT,UQL5    ;SPACE OVER 2ND HALF OF LOAD ADDRESS
18629 \f
18630 UQL5A:  JSP B,GDPT      ;TYPE OUT # BLOCKS
18631         PUSHJ P,OUTCS
18632         MOVE Q,E        ;FILE POINTER
18633         MOVEI I,"!
18634         SKIPGE B,@DIRPT(A)      ;SKIP ON NOT DUMPED
18635          MOVEI I,40
18636         PUSHJ P,OUTC    ;HAS NOT BEEN BACKED UP
18637         MOVEI I,"$
18638         TLNN B,UNREAP   ;SKIP ON DON'T-REAP
18639          MOVEI I,40
18640         PUSHJ P,OUTC
18641         MOVEI Q,1(E)
18642         LDB E,[1200,,DIRPT(A)]
18643         JUMPN E,[JRST 4,.]
18644         MOVE TT,@DIRPT(A)
18645         AOJE TT,UQL5C   ;DATE NOT KNOWN
18646         LDB TT,[UNMON+@DIRPT(A)]
18647         JSP B,GDPT      ;TYPE MONTH
18648         MOVEI I,"/
18649         PUSHJ P,OUTC
18650         LDB TT,[UNDAY+@DIRPT(A)]
18651         JSP B,GDPT      ;TYPE DAY
18652         MOVEI I,"/
18653         PUSHJ P,OUTC
18654         LDB TT,[UNYRB+@DIRPT(A)]
18655         JSP B,GDPT      ;TYPE YEAR
18656         PUSHJ P,OUTCS
18657         HRRZ TT,@DIRPT(A)
18658         IDIVI TT,60.*60.*2
18659         MOVE E,I
18660         JSP B,G2DPT
18661         MOVEI I,":
18662         PUSHJ P,OUTC
18663         MOVE TT,E
18664         IDIVI TT,60.*2
18665         MOVE E,I
18666         JSP B,G2DPT
18667         MOVEI I,":
18668         PUSHJ P,OUTC
18669         MOVE TT,E
18670         LSH TT,-1
18671         JSP B,G2DPT
18672 UQL5D:  JSP B,MESPCR
18673         ADDI Q,2        ;ADVANCE Q
18674         JRST UQL4
18675
18676 UQL5C:  MOVEI I,"-
18677         PUSHJ P,OUTC
18678         JRST UQL5D
18679
18680 ;GENERATE MFD LISTING
18681 QMLS1:  CONO PI,CLKOFF
18682         MOVE Q,QMDRO
18683         HRLI Q,440600+Q
18684         MOVEM Q,DIRPT(A)
18685         MOVE Q,MDNAMP(Q)
18686         CONO PI,CLKON
18687 QMLS2:  CAIL Q,1777
18688          JRST UCL7
18689         SKIPN @DIRPT(A)
18690          JRST QMLS3
18691         JSP B,SIXTYA
18692         JSP B,MESPCR
18693 QMLS3:  ADDI Q,LMNBLK
18694         JRST QMLS2
18695 \f
18696 ;DIRECTORY LISTING ROUTINES FOR UTAPE
18697
18698 IFN NUNITS,[
18699 LISTF:  MOVEI Q,220600+Q
18700         HRLM Q,DIRPT(A)
18701         MOVEI Q,177
18702         MOVE TT,@DIRPT(A)
18703         AOJE TT,LISTF1
18704         JSP B,SIXTYP
18705 LISTF1: MOVEI TT,[ASCIZ /
18706 FREE FILES /]
18707         JSP B,MESPNT
18708         MOVSI Q,-23.
18709         MOVEI TT,0
18710 LISTF4: SKIPE @DIRPT(A)
18711         AOJA Q,LISTF8
18712         AOS Q
18713         SKIPN @DIRPT(A)
18714         AOS TT
18715 LISTF8: AOBJN Q,LISTF4
18716         JSP B,GDPT
18717         MOVEI TT,[ASCIZ /       FREE BLOCKS /]
18718         JSP B,MESPNT
18719         SETZB J,TT
18720         JSP B,BLKPNT
18721 LISTD2: JSP B,MESPCR
18722         MOVSI Q,-23.
18723 LISTF2: MOVEI I,440600+Q
18724         HRLM I,DIRPT(A)
18725         MOVE I,@DIRPT(A)
18726         JUMPE I,LISTF5
18727 LISTF6: PUSHJ P,OUTCS
18728         JSP B,SIXTYA
18729         JSP B,SIXTYB
18730         PUSHJ P,OUTCS
18731         MOVEI J,1(Q)
18732         JSP B,BLKPNN
18733 LISTD4: JSP B,MESPCR
18734 LISTF3: AOBJN Q,LISTF2
18735 ];END IFN NUNITS
18736
18737 UCL7:   MOVEI I,14      ;END DIR WITH FORMFEED AND EOF CHARS
18738         PUSHJ P,OUTC
18739         HRROI I,EOFCH
18740         JRST .-2
18741
18742 IFN NUNITS, LISTF5:     AOJA Q,LISTF3
18743 \f
18744 ; DIRECTORY LISTING ROUTINES FOR MISC. DEVICES + CORE LINK
18745
18746 NDLF:   MOVEI TT,[ASCIZ /
18747 NON-DIRECTORY DEVICE/]
18748         JSP B,MESPNT
18749         JRST UCL7
18750
18751 ;DIRECTORY OF CORE LINK DEVICE
18752 UCL1:   MOVSI Q,-NCLCH
18753 UCL6:   SKIPN CLSYN(Q)
18754         JRST UCL5A
18755         MOVEI J,CLSYN(Q)
18756         JSP B,SIXTYC
18757         MOVEI J,CLN1(Q)
18758         JSP B,SIXTYC
18759         MOVEI J,CLN2(Q)
18760         JSP B,SIXTYC
18761         HLRE B,CLUSR(Q)
18762         AOJE B,UCL2
18763         MOVEI J,UNAME-1(B)
18764         MOVEM B,NUM(A)
18765         JSP B,SIXTYC
18766         MOVE B,NUM(A)
18767         MOVEI J,JNAME-1(B)
18768         JSP B,SIXTYC
18769 UCL3:   MOVEI TT,[ASCIZ /->/]
18770         JSP B,MESPNT
18771         HRRE B,CLUSR(Q)
18772         AOJE B,UCL4
18773         MOVEI J,UNAME-1(B)
18774         MOVEM B,NUM(A)
18775         JSP B,SIXTYC
18776         MOVE B,NUM(A)
18777         MOVEI J,JNAME-1(B)
18778         JSP B,SIXTYC
18779 UCL5:   JSP B,MESPCR
18780 UCL5A:  AOBJN Q,UCL6
18781         JRST UCL7
18782
18783 UCL4:   MOVEI B,UCL5
18784         JRST .+2
18785 UCL2:   MOVEI B,UCL3
18786         MOVEI J,[SIXBIT /CLOSED/]
18787 SIXTYC: HRLI J,440600
18788         MOVEM J,DIRPT(A)
18789         PUSHJ P,OUTCS
18790         JRST SIXTYP
18791 \f
18792 ; DIRECTORY LISTING ROUTINES FOR TTY
18793
18794 TTYFLD: MOVEI TT,[ASCIZ /
18795 TTY UNAME  JNAME  CORE  TOTAL IDX
18796 /]
18797         JSP B,MESPNT
18798         MOVSI Q,-NCT
18799 TTYF1:  HRRE E,TTYSTS(Q)
18800         AOJE E,TTYF5    ;JUMP IF NOT IN USE
18801         MOVE E,TTYSTS(Q)
18802         MOVEI I,"T      ;TTY
18803         TLNN E,%TSCNS
18804          MOVEI I,"D     ;"DEVICE"
18805         PUSHJ P,OUTC
18806         HRRZ TT,Q
18807         JSP B,G2OPT
18808         HRRZS E
18809 TTYF11: MOVEI J,UNAME(E)
18810         JSP B,SIXTYC
18811         MOVEI J,JNAME(E)
18812         JSP B,SIXTYC
18813         PUSHJ P,OUTCS
18814         MOVE TT,NMPGS(E)
18815         JSP B,G4SDPT
18816         PUSHJ P,OUTCS
18817         PUSHJ P,OUTCS
18818         MOVEM E,DIRPT(A)
18819         MOVE E,UTMPTR(E)
18820         SETZB B,TT
18821 TTYF3:  SKIPE UNAME(B)
18822          CAME E,UTMPTR(B)
18823           JRST TTYF4
18824         ADD TT,NMPGS(B)
18825 TTYF4:  ADDI B,LUBLK
18826         CAMGE B,USRHI
18827          JRST TTYF3
18828         JSP B,G4SDPT
18829         PUSHJ P,OUTCS
18830         PUSHJ P,OUTCS
18831         HRRZ TT,DIRPT(A)
18832         SKIPL SUPPRO(TT)
18833          JRST [ HRRZ TT,SUPPRO(TT) ? JRST .-1 ]
18834         IDIVI TT,LUBLK
18835         JSP B,GOPT
18836         JSP B,MESPCR
18837 TTYF5:  AOBJN Q,TTYF1
18838 TTYF99: MOVEI TT,[ASCIZ /FREE CORE  /]
18839         JSP B,MESPNT
18840         MOVE TT,MEMFR
18841         SUB TT,NCBCOM
18842         JSP B,GDPT
18843         MOVEI TT,[ASCIZ / OUT /]
18844         JSP B,MESPNT
18845         MOVE TT,NPGSWO
18846         JSP B,GDPT
18847         JSP B,MESPCR
18848         JRST UCL7
18849 \f
18850 SIXTYB: AOS Q
18851 SIXTYA: PUSHJ P,OUTCS
18852         MOVEI I,440600+Q
18853         HRLM I,DIRPT(A)
18854
18855 SIXTYP: ILDB I,DIRPT(A)
18856         ADDI I,40
18857         PUSHJ P,OUTC
18858         MOVE I,DIRPT(A)
18859         TLNE I,770000
18860         JRST SIXTYP
18861         JRST (B)
18862
18863 MESP3S: SKIPA TT,[[ASCIZ /   /]]
18864 MESPCR: MOVEI TT,[ASCIZ /
18865 /]
18866 MESPNT: HRLI TT,440700
18867         MOVEM TT,NUM(A)
18868         ILDB I,NUM(A)
18869         JUMPE I,(B)
18870         PUSHJ P,OUTC
18871         JRST .-3
18872
18873 OUTCS:  MOVEI I,40
18874 OUTC:   SKIPL TT,SRN3(U) ;IF WANT 1 CHAR, RETURN WITH IT, SAVING ACS.
18875          JRST OUTC1     ;IF WANT WHOLE WORD, SEE IF WORD IS FULL.
18876 OUTC2:  MOVEM E,SAVE(A)
18877         MOVEM Q,SAVQ(A)
18878         MOVEM B,SAVB(A)
18879         POP P,DIRPC(A)
18880         POPJ P,
18881
18882 OUTC1:  LSH TT,6
18883         ADDI TT,(I)     ;MERGE THIS CHAR (IN I) INTO WORD BEING ACCUMULATED.
18884         LSH TT,1
18885         MOVEM TT,SRN3(U)
18886         TLNE TT,774000  ;IF THE WORD IS FULL, RETURN TO DIRB.
18887          JRST OUTC2
18888         POPJ P,         ;ELSE POPJ FROM OUTC, TO GET MORE CHARS.
18889 \f
18890 ;NUMERIC PRINTOUT ROUTINES FOR FILE DIRECTORIES.
18891 ;ALL CALLED WITH JSP B,.  ALL TAKE ARG IN TT.
18892
18893 ;PRINT NUMBER IN TT IN DECIMAL, RIGHT-ADJUSTED IN FOUR COLUMNS.
18894 G4SDPT: CAIL TT,1000.
18895          JRST GDPT              ;IF IT NEEDS 4 DIGITS, JUST PRINT IT.
18896         MOVEM TT,NUM(A)
18897         CAIL TT,100.            ;ELSE FIGURE OUT HOW MANY LEADING SPACES ARE NEEDED
18898          JRST G4SDP1
18899         CAIL TT,10.
18900          JRST G4SDP2
18901         PUSHJ P,OUTCS           ;AND PRINT THAT MANY.
18902 G4SDP2: PUSHJ P,OUTCS
18903 G4SDP1: PUSHJ P,OUTCS
18904         MOVE TT,NUM(A)
18905         JRST GDPT
18906
18907 ;PRINT CONTENTS OF TT AS TWO OCTAL DIGITS.
18908 G2OPT:  IDIVI TT,8
18909         JRST G2DPT2
18910
18911 ;PRINT CONTENTS OF TT AS THREE DECIMAL DIGITS.
18912 G3DPT:  IDIVI TT,100.
18913         MOVEM I,NUM(A)
18914         MOVEI I,"0(TT)
18915         PUSHJ P,OUTC
18916         MOVE TT,NUM(A)
18917 G2DPT:  IDIVI TT,10.
18918 G2DPT2: MOVEM I,NUM(A)
18919         MOVEI I,"0(TT)
18920         PUSHJ P,OUTC
18921         MOVE I,NUM(A)
18922         ADDI I,"0
18923         PUSHJ P,OUTC
18924         JRST (B)
18925
18926 ;PRINT ARG IN TT IN DECIMAL USING AS MANY DIGITS AS IT NEEDS.
18927 GDPT:   HRLI B,10.
18928         JRST GDPT0
18929
18930 ;PRINT ARG IN TT IN OCTAL USING AS MANY DIGITS AS NECESSARY.
18931 GOPT:   HRLI B,8
18932 GDPT0:  MOVSS B
18933         SETZM ENDT(A)
18934         MOVEM TT,NUM(A)
18935 GDPT1:  PUSH P,Q
18936          MOVE Q,TT
18937          IDIVI TT,(B)
18938          CAME TT,ENDT(A)
18939           JRST .-3
18940         MOVEM Q,ENDT(A)
18941         POP P,Q
18942         ADDI I,"0
18943         PUSHJ P,OUTC
18944         MOVE TT,NUM(A)
18945         CAME TT,ENDT(A)
18946          JRST GDPT1
18947         MOVSS B
18948         JRST (B)
18949 \f
18950 ;ROUTINE TO CALL A DIRECTORY COROUTINE
18951 DIRCHR: MOVE E,SAVE(A)
18952         MOVE B,SAVB(A)
18953         MOVE Q,SAVQ(A)
18954         JRST @DIRPC(A)
18955
18956 IFN NUNITS,[
18957 BLKPNA: MOVEI J,1(I)
18958         LSH J,-1
18959         JRST BLKPNT+1
18960
18961 BLKPNN: LSH J,-1
18962 BLKPNT: MOVEI TT,0
18963         MOVEI I,56
18964 BLKPN2: MOVEI E,440500+I
18965         HRLM E,DIRPT(A)
18966 BLKPN1: ILDB E,DIRPT(A)
18967         CAIN E,37
18968         JRST BLKPN3
18969         CAMN E,J
18970         AOS TT
18971         HLRZ E,DIRPT(A)
18972         TRNE E,760000
18973         JRST BLKPN1
18974         AOJA I,BLKPN2
18975 BLKPN3: JUMPE J,GDPT
18976         MOVSI I,-23.
18977 BLKPN4: MOVE E,@DIRPT(A)
18978         AOS I
18979         CAMN J,@DIRPT(A)
18980         JUMPE E,BLKPNA
18981         AOBJN I,BLKPN4
18982         JRST GDPT
18983 ];NUNITS
18984 EBLK
18985
18986 UDUSR:  REPEAT NUDCH,-1 ;-1 => FREE, ELSE UTAPE # IF UTAPE DIR, ELSE 0.
18987 UDUIND: BLOCK NUDCH     ;IF DIR CHANNEL IN USE, HOLDS JOB # OF JOB USING IT.
18988
18989 IRPS X,,DIRPC:DIRPT:NUM:ENDT:SAVB:SAVQ:UDSYSN:UUDPP:SAVE:
18990 X:      REPEAT NUDCH,-1
18991         TERMIN
18992 UDCSW:  -1
18993         0
18994
18995 DSKLST: BLOCK NUDCH     ;0 LISTING UTAPE 1 NON-DIR DEVICE
18996                                 ;2 CORE LINK 3 2311
18997 ;NO BBLK SINCE VARIABLES ON NEXT PAGE
18998 \f
18999 SUBTTL UTC LEVEL INTERRUPT
19000
19001 ;NO EBLK SINCE VARIABLES ON PREVIOUS PAGE
19002
19003 UTCPDP: -LUTCP,,UTCP-1  ;UTC-LEVEL PDL
19004 UTCP:   BLOCK LUTCP
19005 UTACS:  BLOCK 20        ;UTC-LEVEL AC SAVE
19006
19007 IFE KS10P,[     ; On the KS10 we can take advantage of the Unibus interrupt
19008                 ; vectoring scheme to dispatch quicker, so this code was
19009                 ; reorganized somewhat.
19010 UTCBRK: 0
19011 BBLK
19012 IFN KL10P,[
19013         CONSO PI,1_<7-UTCCHN>
19014          JRST 4,.       ;HARDWARE BUG ALLEGEDLY FIXED
19015 ]
19016         MOVEM U,UTACS+U
19017         MOVEI U,UTACS
19018         BLT U,UTACS+U-1
19019         MOVE P,UTCPDP
19020 IFN NUNITS,[
19021 IFE NEWDTP,[
19022         CONSZ DC,6
19023          JRST PIPOS     ;HAS CHNL >1
19024 PIPX:
19025 ]
19026 IFN NEWDTP,[
19027         SKIPGE CUINT
19028          JRST UTCB0
19029 ]
19030 ];IFN NUNITS
19031 IFN IMPP,[      ; See if it's an IMP interface interrupt
19032 IFN KAIMP,[
19033         CONI IMP,TT
19034         LDB A,[000300,,TT]
19035         CAIE A,NETCHN
19036          JRST UTCB2
19037         TRNE TT,IMPLW+IMPHER+IMPERR+IMPOD+IMPID
19038 ]
19039 IFN DMIMP,[
19040         CONI FI,TT
19041         TRNN TT,70      ;CHECK PIA
19042          JRST UTCB2     ;DO NOT PROCESS IF NO PIA
19043         TRNE TT,FILW+FIDOWN+FIWASD+FIOD+FIID
19044 ]
19045          JRST IMPINT
19046 UTCB2:] ;IFN IMPP
19047
19048 IFN DC10P,[
19049         CONI DC0,TT
19050         TRNE TT,DPIRQC
19051          JRST QINT
19052 ]
19053 IFE KA10P, CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS
19054 IFN T300P,[
19055         SKIPE DSCDON
19056          JRST T3INT
19057 ];T300P
19058 IFN RP10P,[
19059         CONI DPC,TT
19060         TRNE TT,7
19061          TRNN TT,10     ;IF BIT IS ON IT IS INTERRUPTING - LET QINT HAVE IT
19062           SKIPGE QGTBZY
19063            JRST QINT
19064 ]
19065 IFN RH10P,[
19066         CONI DSK,TT
19067         TRNN TT,%HIDON+%HIATN   ;INTERRUPTING HARDWARILY
19068          SKIPGE QGTBZY          ;INTERRUPTING SOFTWARILY
19069           JRST QINT
19070 ]
19071 IFN TM10P,[
19072         CONI MTC,A
19073         CONI MTS,C
19074         LDB TT,[030300,,A]
19075         CAIE TT,MTCCHN
19076          JRST UTCBK2
19077         TRNN C,100      ;IF NOT JOB DONE
19078          TRZ C,30000    ; THEN DON'T BELIEVE PAR ERR OF EOF
19079         TRNN A,400      ;IF NEXT UNIT NOT ENABLED
19080          TRZ C,2        ;THEN TURN OFF NEXT UNIT FLAG
19081         TRNE C,440302   ; UNIT HUNG, ILLEGAL, BAD TAPE (UGH), LOAD NEXT UNIT, JOB DONE
19082          JRST MGHBRK
19083 UTCBK2: SKIPN MGTBZY    ; SOFT WARE CALL
19084          JRST MGSBRK
19085 ]
19086 IFN NUNITS,     JRST UTCB0
19087
19088 POPRET:
19089 IFN NUNITS,[
19090         MOVE A,TIME
19091         MOVEM A,LUTOTM
19092 ]
19093 DSKEX:
19094 IMPEX:
19095 MGEX:   MOVSI U,UTACS
19096         BLT U,U
19097         JRST 12,@UTCBRK
19098
19099 ] ;IFE KS10P
19100
19101 IFN KS10P,[
19102
19103 UTCBRK: 0                       ; Still EBLK'ed from previous page...
19104 BBLK
19105         MOVEM U,UTACS+U
19106         MOVEI U,UTACS
19107         BLT U,UTACS+U-1
19108         MOVE P,UTCPDP
19109         CONO PI,020000+200_<-UTCCHN>    ;BAG-BITING DEC LOSERS
19110 IFN KSIMP,[
19111         AOSN IMPBZY             ;-1 if IMP wants a jump-start
19112          PUSHJ P,IMPINT
19113 ]
19114 IFN RH11P,[
19115         SKIPGE QGTBZY
19116          JRST QINT
19117 ] ;RH11P
19118 IFN TM03S,[
19119         SKIPN MGTBZY
19120          JRST MGSBRK
19121 ]
19122 IMPEX:
19123 MGEX:
19124 DSKEX:  MOVSI U,UTACS
19125         BLT U,U
19126         JRST 12,@UTCBRK
19127
19128 ;;; Interrupt routines that are directly dispatched to by the KS10/Unibus
19129 ;;; interrupt kludge should do JSR UTCSAV as their very first instruction.
19130 ;;; The word before the JSR is expected to contain the interrupted PC.
19131 ;;; They should then exit through DSKEX just like everybody else.
19132
19133 EBLK
19134 UTCSAV: 0
19135 BBLK
19136         MOVEM U,UTACS+U
19137         MOVEI U,UTACS
19138         BLT U,UTACS+U-1
19139         MOVE P,UTCPDP
19140         MOVE U,UTCSAV
19141         MOVE TT,-2(U)
19142         MOVEM TT,UTCBRK
19143         JRST (U)
19144
19145 ] ;KS10P
19146 \f
19147 $INSRT SYSJOB           ;SYSTEM JOB AND RELATED STUFF
19148
19149
19150 SUBTTL DCHNTB AND DCHNTC
19151
19152 EBLK
19153 CHSPUR: BLOCK 8         ;NUM OF SPURIOUS INTS PER CH (ZERO = DCHK)
19154 BBLK
19155
19156 IFE KS10P,[     ; KS10 doesn't even pretend to have devices.
19157
19158 ;***** DCHNTB *****
19159 ;4.9 = KNOWN DEVICE
19160 ;4.8 = HAS PIA 2
19161 ;4.7-4.4 PIA 2 SHIFT
19162 ;4.3-4.1 PIA 2 ACTIVE VALUE
19163 ;3.9 = PIA 2 MAY BE ZERO
19164 ;3.8 = HAS PIA 1
19165 ;3.7-3.4 PIA 1 SHIFT
19166 ;3.3-3.1 PIA 1 ACTIVE VALUE
19167 ;2.9 = PIA 1 MAY BE ZERO
19168 ;2.8 = ALLOW USER DATAI, BLKI
19169 ;2.7 DATAO, BLKO
19170 ;2.6 CONI, CONSO, CONSZ
19171 ;2.5 CONO
19172 ;2.4 SPECIAL KL10 DEVICE, BLKI/BLKO ARE DATAI/DATAO TO A SECOND DEVICE REGISTER
19173 ;1.6-1.1=N, IF NON ZERO: IGNORE DEV UNLESS CONI BIT N-1 IS ON
19174                 ;(IF DSDEV PRESENT)
19175
19176 ;***** DCHNTC *****
19177 ;4.9 = SUSPICIOUS DEVICE
19178 ;4.8 = FOUND CLOBBERED
19179 ;4.7 = SUSPECTED OF CAUSING SPURIOUS INTS
19180 ;4.6-4.4 = CHANNEL CAUSING INTS ON
19181 ;3.9-3.1 = SUSPICION COUNT
19182 ;2.9-1.1 = CONI
19183
19184 DCHNTB:
19185 IFE KL10P,[
19186         400200+APRCHN,,240000   ;0 APR
19187         SETZ                    ;4 PI
19188 ]
19189 IFN KL10P,[
19190         400200+APRCHN,,250000   ;0 APR (ALLOW DATAI, "BLKI", CONI)
19191         SETZ 010000             ;4 PI (ALLOW NOTHING)
19192 ]
19193
19194 DEFINE DCHENT D,W
19195 LOC DCHNTB+D_-2
19196         W
19197         TERMIN
19198
19199 IFN KL10P,[
19200         DCHENT PAG,SETZ 240000          ;ALLOW DATAI, CONI, BUT NOT "BLKI"
19201         DCHENT CCA,SETZ                 ;ALLOW NOTHING
19202 ;XCTR of some of the instructions for these devices fails to relocate
19203 ;the address to user space, due to bugs in the hardware.  Flush 'em.
19204 ;       DCHENT TIM,SETZ 250000          ;ALLOW DATAI, "BLKI", CONI
19205 ;       DCHENT MTR,[400201,,250000]     ;INTERVAL TIMER PIA=1.  ALLOW DI,BI,CI
19206         DCHENT TIM,SETZ                 ;20 ALLOW NOTHING
19207         DCHENT MTR,SETZ                 ;24 ALLOW NOTHING
19208         DCHENT 30,SETZ                  ;30 RESERVED
19209 ]
19210 IFN DSDP,       DCHENT DSDEV,[REPEAT 2,400200+DSDCHN,,440000]   ;20,24
19211 IFN DL10P,[     DCHENT DLB,SETZ 240000                  ;60 DL10
19212                 DCHENT DLC,[400200+TTYCHN,,240000]      ;64 DL10
19213 ]
19214 IFN STKP,       DCHENT STK,[400200+LPTCHN,,440000]      ;70 STK
19215 IFN PTRP,       DCHENT PTP,[400200+PCHCHN,,440000]      ;100 PTP
19216 IFN PTRP,       DCHENT PTR,[400200+PTRCHN,,440000]      ;104 PTR
19217 IFN NOTYS,      DCHENT TTY,[400200+TTYCHN,,40000]       ;120 TTY
19218 IFN OLPTP,      DCHENT OLPT,[400200+LPTCHN,,440000]     ;124 OLPT
19219 IFN 340P,       DCHENT DIS,[630600+DISCHN+SDCHN_9,,440001]      ;130 DIS
19220 IFN E.SP,       DCHENT DIS,[400200+DISCHN,,440000]              ;130 E&S
19221 IFN KL10P,      DCHENT DTE,[400200+IFE PDCLKP,[APRCHN].ELSE [TTYCHN],,240000] ;200 DTE20
19222 IFN RP10P,      DCHENT DPC,[400200+DSKCHN,,440000]      ;250 DPC
19223 IFN RH10P,      DCHENT DSK,[400200+DSKCHN,,040000]      ;270 RH10
19224 IFN NUNITS,[
19225 IFE NEWDTP,[
19226                 DCHENT DC,[400000,,440000]      ;200 DC
19227                 DCHENT UTC,[400200+UTCCHN,,440000]      ;210 UTC
19228                 DCHENT UTS,[SETZ 40000]         ;214 UTS
19229 ]
19230 IFN NEWDTP,[
19231                 DCHENT DTC,[630600+UTCCHN+DCCHN_9.,,440000]     ;320
19232                 DCHENT DTS,[SETZ 40000] ;324
19233 ]
19234 ]               ;END OF IFN NUNITS
19235 IFN TM10P,[
19236                 DCHENT MTC,[400230+MTCCHN,,440001]      ;340 MTC
19237                 DCHENT MTS,[SETZ 40001]                 ;344 MTS
19238 ]
19239 IFN MTYP,       DCHENT MTY,[400200+TTYCHN,,40000]       ;400 MORTON BOX
19240                                                         ;420 SPACEWAR CONSOLES
19241 IFN DMIMP,      DCHENT FI,[400230+NETCHN,,400000]       ;424 DM IMP HARDWARE
19242 IFN NDAP,       DCHENT 454,[400200,,760000]             ;454 D/A
19243 IFN KAIMP,      DCHENT IMP,[400000,,400001]     ;460 AI-KA/ML-KA/MC-KL IMP
19244                                                 ; HARDWARE THIS SAYS IMP
19245                                                 ; HAS NO PIA BECAUSE IT
19246                                                 ; CHANGES
19247 IFN NLPTP,      DCHENT NLPT,[400200+LPTCHN,,440000]     ;464 NEW LPT
19248 IFN CH10P,      DCHENT CHX,[400200+CHXCHN,,040000]      ;470 CHAOSNET
19249 IFE KL10P,      DCHENT 500,[400000,,240000]             ;500 ML-KA, DM CALENDAR; AI-KA R CLK
19250 IFN KL10P&PDCLKP,DCHENT 500,[400200+APRCHN,,240000]     ;500 MC-KL F CLK
19251 IFN ARMP,       DCHENT TIPDEV,[400200+TIPBCH,,440000]   ;504 ARM TIP BREAK
19252 IFE MCOND AIKA, DCHENT 510,[400000,,360000]             ;510 ANOTHER D/A??
19253                         ;DOES ANYONE KNOW WHAT DEVICE 510 IS??
19254 IFN RBTCP,      DCHENT RBTCON,[400200+TABCHN,,440001]   ;514 ROBOT CONSOLE
19255 IFN ARMP,       DCHENT 564,[400200,,440000]             ;564 ARM TACTILE SENSE
19256 IFN OMXP,       DCHENT OMPX,[400200+OMPCHN,,440001]     ;570 OMX
19257 IFN IMXP,       DCHENT MPX,[SETZ 40001]                 ;574 IMX
19258 ;Comment this out since the AI-KA one is no longer on the bus
19259 ;IFN TK10P,     DCHENT NTY,[400200+TTYCHN,,40000]       ;600 NTY
19260 IFN NTYP,       DCHENT NTY,[400200+NTYCHN,,40000]       ;    NTY FOR 11 KLUDGE
19261 IFN DPKPP,      DCHENT DPK,[400200+TTYCHN,,40000]       ;604 DATAPOINT KLUDGE
19262 IFN DC10P,[
19263                 DCHENT DC0,[400200+DSKCHN,,40000]       ;610 DC0
19264                 DCHENT DC1,[400000,,]                   ;614 DC1
19265 ]
19266 IFN VIDP,       DCHENT NVDX,[REPEAT 4,400200+NVDCHN,,440001]    ;620-634 BAT
19267 IFN PLTP,       DCHENT PLT,[400200+PLTCHN,,440000]      ;654 PLT
19268                 DCHENT 704,[400000,,440000]             ;704 ???
19269 IFN HCLKP,[
19270                 DCHENT CLK1,[400200,,240000]            ;710 CLK1
19271                 DCHENT CLK2,[SETZ 40000]                ;714 CLK2
19272 ]
19273 LOC DCHNTB+127.
19274 EBLK
19275 DCHNTC: BLOCK 128.
19276 DCACS:  BLOCK 20        ;SAVE ACS
19277 CCSDEV: 0               ;+ => SOME SUSPICIOUS DEVICES
19278 BBLK
19279 \f
19280 DCHK:   0       ;TO CALL FROM DDT
19281         MOVEM 17,DCACS+17
19282         MOVEI 17,DCACS
19283         BLT 17,DCACS+16
19284         MOVEI J,0
19285         JSP E,SPUR
19286         SKIPN W
19287          AOS DCHK
19288         MOVEI 17,DCACS
19289         BLT 17,17
19290         JRST @DCHK
19291
19292 ;CHECK FOR CLOBBERED DEVS, CALL WITH JSP E,
19293 CHECK:  JSP H,DCSTUP
19294 CHECK1: SKIPL TT,DCHNTB(I)
19295          JRST CHECK4    ;UNKNOWN DEVICE
19296 IFN DSDP,[
19297         TRNN TT,77
19298          JRST CHECK2
19299         ANDI TT,77
19300         JSP H,DCCONI
19301         LSH B,-1(TT)
19302         JUMPGE B,CHECK4
19303         MOVE TT,DCHNTB(I)
19304 ]
19305 CHECK2: JSP H,DCCONI
19306         TLNN TT,200     ;SKIP IF PI TO TEST
19307          JRST CHECK4
19308         LDB T,[250400,,TT]      ;GET SKIP
19309         MOVEI Q,7
19310         LSH Q,(T)
19311         AND B,Q
19312         LDB Q,[220300,,TT]      ;GET CHANNEL
19313         LSH Q,(T)
19314         CAME B,Q
19315          JRST CHECK5
19316 CHECK3: LSH TT,-9       ;SHIFT TO PIA2
19317         JRST CHECK2
19318
19319 CHECK5: JUMPN B,CHECKL  ;JUMP IF NONZERO AND WRONG
19320         TRNE TT,400000  ;SKIP IF CAN NOT BE ZERO
19321          JRST CHECK3    ;ZERO OK
19322         JRST CHECKL
19323
19324 CHECK4: ADD A,[400,,]   ;INCREMENT DEVICE CODE
19325         AOBJN I,CHECK1
19326 SPURCX: SKIPE C
19327          BUG PAUSE,[BITS ],OCT,C,[MAY BE STUCK ON IN I/O BUS]
19328         MOVSI T,SCLCK5
19329         SKIPE W         ;SKIP IF NO TROUBLE DETECTED
19330          IORM T,SUPCOR
19331         JRST (E)
19332
19333 DCSTUP: MOVE A,[CONI B] ;SET UP
19334         MOVEI W,0
19335         MOVNI C,1
19336         MOVSI I,-128.
19337         JRST (H)
19338 \f
19339 DCCONI: XCT A
19340         AND C,B
19341         SKIPL DCHNTC(I) ;SKIP IF DEVICE ALREADY SUSPICIOUS,SAVES FIRST SUSPICIOUS
19342         HRRM B,DCHNTC(I)        ;STORE AWAY CONI
19343         JRST (H)
19344
19345 CHECKL: JSP H,DCSAOS
19346         MOVSI T,600000  ;CLOB
19347         IORM T,DCHNTC(I)
19348         JRST CHECK3
19349
19350 DCSAOS: MOVE D,A        ;MAKE A CONO
19351         TDZ D,[40,,-1]
19352         SKIPL T,DCHNTB(I)       ;SKIP IF KNOWN DEV
19353         JRST DCSAS2     ;JUST RESET UNKNOWN TO ZERO
19354         TLNE T,200000   ;SKIP IF NO PIA2
19355         TLNE T,400      ;SKIP IF PIA2 CAN NOT BE ZERO
19356         JRST DCSAS1
19357         LDB TT,[330300,,T]      ;GET PIA2
19358         LDB T,[360400,,T]       ;GET PIA2 SHIFT
19359         LSH TT,(T)
19360         IOR D,TT                ;ADD CORRECT CANNEL TO CONO
19361         MOVE T,DCHNTB(I)        ;SKIP IF NO PIA1
19362 DCSAS1: TLNE T,200      ;SKIP IF PIA1 CANNOT BE ZERO
19363         TRNE T,400000
19364         JRST DCSAS2
19365         LDB TT,[220300,,T]      ;GET P1A 1
19366         LDB T,[250400,,T]       ;GET PIA 1 SHIFT
19367         LSH TT,(T)              ;OR IN PIA 1
19368         IOR D,TT                ;ZAP
19369 DCSAS2: XCT D
19370         HLRZ T,DCHNTC(I)
19371         TLNN T,300000
19372          AOS W  ;THIS MAY BE THE CAUSE OF OUR TROUBLES
19373         ANDI T,777
19374         AOS T
19375         AOS CCSDEV
19376         CAILE T,777
19377          SOJA T,[JRST 4,.+1]    ;LOSEY LOSEY
19378         DPB T,[221100,,DCHNTC(I)]
19379         JRST (H)
19380
19381 ;CHANNEL IN J SPURIOUS INTERRUPT ON, CALL WITH JSP E,
19382 SPUR:   SKIPL J
19383          CAIL J,10
19384           JRST 4,SPUR1
19385         AOS U,CHSPUR(J)
19386 SPUR1:  MOVE U,E
19387         JSP E,CHECK
19388         MOVE E,U
19389         JSP H,DCSTUP
19390 SPUR2:  SKIPGE TT,DCHNTB(I)
19391          JRST SPUR4
19392         JSP H,DCCONI
19393         JUMPGE B,SPUR4
19394         JSP H,DCSAOS
19395         MOVSI T,500000
19396         IORM T,DCHNTC(I)
19397         DPB J,[360300,,DCHNTC(I)]
19398 SPUR4:  ADD A,[400,,]
19399         AOBJN I,SPUR2
19400         JRST SPURCX
19401
19402 ] ;IFE KS10P
19403 \f
19404 IFN KS10P,[
19405
19406 SUBTTL KS10 UNIBUS
19407
19408 DEFINE UBINT VEC,-REST
19409 .VEC.==<VEC>
19410 IFN .VEC.&3, .ERR Bogus interrupt vector: VEC
19411 .VEC.==.VEC./4
19412 LOC .BAS.+.VEC.
19413         REST
19414 IFG .VEC.-.MAX., .MAX.==.VEC.
19415 IFL .VEC.-.MIN., .ERR Unibus interrupt table lossage.
19416 TERMIN
19417
19418 ;;;
19419 ;;; Interrupt table for Unibus Q.
19420 ;;;
19421 UBAQIT:
19422 .MIN.==53       ; Guess smallest interrupt vector on Unibus Q
19423 .MAX.==.MIN.-1
19424 .BAS.==.-.MIN.
19425 UBAQIB==:.BAS.
19426
19427 UBINT PHVEC, JSR DSKBRK         ; RH11 FOR DISK
19428
19429 LOC .BAS.+.MAX.+1
19430
19431 ;;;
19432 ;;; Interrupt table for Unibus I.
19433 ;;;
19434 UBAIIT:
19435 .MIN.==45       ; Guess smallest interrupt vector on Unibus I
19436 .MAX.==.MIN.-1
19437 .BAS.==.-.MIN.
19438 UBAIIB==:.BAS.
19439
19440 IFN TM03S,[
19441 UBINT %TMVEC, JSR MGHBRK        ;RH11 FOR TAPE
19442 ]
19443
19444 IFN DZ11P,[
19445 REPEAT DZ11NB,[
19446 UBINT 340+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,RB   ; DZ receive
19447 UBINT 344+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,XB   ; DZ transmit
19448 ]];DZ11P
19449
19450 IFN KSIMP,[
19451 UBINT %LHVEC, JSR IMPIBK        ;IMP Input side break
19452 UBINT %LHVEC+4, JSR IMPOBK      ;IMP output side break
19453 ]
19454
19455 IFN CH11P,[
19456 UBINT 270, JSR CHXBKH           ; Usual Chaosnet vector
19457 UBINT 230, JSR CHXBKH           ; Except some interrupt here instead
19458 ];CH11P
19459
19460 LOC .BAS.+.MAX.+1
19461
19462 ;;; Assignment of pages in Unibus pager for DMA devices.
19463 ;;; Note that these pages are 2000 PDP-10 words long (ITS sized) rather
19464 ;;; than 1000 (DEC sized).  Each page here thus occupies -two- locations in
19465 ;;; the Unibus pager.  There are 32. such pages on each Unibus.
19466 ;;;
19467 ;;; Unibus Q:
19468 QUBPG==:5                       ; Chosen at random.
19469
19470 ;;; Unibus I:
19471 IFN TM03S,[
19472 IUTPG==:5                       ;Magtape IO page. well, 5 worked last time
19473 ]
19474
19475 IFN KSIMP,[
19476 IUIMPG==:6                      ;IMP Data transfer page
19477 ]
19478
19479 ] ;KS10P
19480 \f
19481 SUBTTL OVERHEAD METERING ROUTINE
19482
19483 IFN KL10P,[
19484
19485 EBLK
19486 ;TABLE OF OVERHEAD REGIONS.  ENTRY IS SIXBITNAME,,PC ? COUNT
19487         0       ;COUNTS STUFF BEFORE FIRST OVHMTR MACRO
19488 OVHTBL: OVHTAB
19489         'USR,,-1
19490         0       ;COUNTS USER-MODE PC'S
19491 LOVHTB==.-OVHTBL
19492
19493 ;COME HERE ON PI CHANNEL 1 EVERY 39 MILLISECONDS
19494 OVHSVA: 0
19495 OVHSVB: 0
19496 OVHBRK: 0
19497 BBLK
19498         CONO TIM,060000+3900.   ;CLEAR DONE
19499         EXCH T,OVHBRK           ;GET PC INTERRUPTED OUT OF
19500         TLNE T,%PSUSR           ;ONLY METER IF EXEC MODE
19501          JRST OVHBRX
19502         MOVEM A,OVHSVA
19503         MOVEM B,OVHSVB
19504         MOVSI A,-LOVHTB
19505 OVHBR1: HRRZ B,OVHTBL(A)
19506         AOBJN A,.+1             ;2-WORD ENTRIES
19507         CAIG B,(T)              ;SKIP IF PC LIES IN PREVIOUS REGION
19508          AOBJN A,OVHBR1
19509         SKIPGE A                ;IN CASE T = 777777
19510          AOS OVHTBL-2(A)        ;AOS PREVIOUS REGION'S COUNT
19511         MOVE B,OVHSVB
19512         SKIPA A,OVHSVA
19513 OVHBRX:  AOS OVHTBL+LOVHTB-1    ;AOS COUNT OF USER-MODE PC's
19514         EXCH T,OVHBRK
19515         JRST 12,@OVHBRK
19516 ];KL10P
19517 \f
19518 IFN KS10P,[
19519 RDPCST=DATAI 14,                ;INSTRUCTIONS FOR PC SAMPLING TABLE
19520 WRPCST=DATAO 14,
19521
19522 ;TABLE OF OVERHEAD REGIONS.  ENTRY IS PC,,SIXBITNAME
19523 OVHTB1: 0,,'LOW                 ;LOWER FENCE
19524         OVHTAB
19525         377777,,'USR            ;UPPER FENCE
19526 LOVHTB==.-OVHTB1
19527 REPEAT <1_<36.-<.LZ <LOVHTB-1>>>>-LOVHTB, 377777,,-1  ;PAD TO POWER OF TWO SIZE
19528
19529 EBLK
19530
19531 OVHTB2: BLOCK LOVHTB            ;CORRESPONDING COUNTS (LAST IS FOR USER MODE)
19532
19533 OVHCNT: 28.                     ;COUNTER TO SLOW THINGS DOWN TO CUT OVERHEAD
19534
19535 LOVHPC==100                     ;64 SAMPLES SHOULD BE ENOUGH
19536 OVHPCS: BLOCK LOVHPC
19537
19538 BBLK
19539
19540 ;CALCULATE OVERHEAD USING PC SAMPLE TABLE
19541 ;CLOBBERS A,B,C
19542 OVHCLK: SOSL OVHCNT             ;TIME TO DO IT YET?
19543          JRST OVHCL9            ;NO, IGNORE THESE SAMPLES
19544         MOVEI A,28.             ;SEE ONLY ONE SAMPLE OUT OF EVERY 29 ON AVERAGE
19545         MOVEM A,OVHCNT          ;SO TIME SPENT IN THIS ROUTINE IS NOT EXCESSIVE
19546         RDPCST C                ;SEE HOW FULL THE PC SAMPLING TABLE IS
19547         HRLOI C,-OVHPCS-1(C)
19548         EQVI C,OVHPCS           ;AOBJN POINTER TO SAMPLES ACTUALLY TAKEN
19549         JUMPGE C,OVHCL9         ;NONE
19550         CAMGE C,[-LOVHPC,,OVHPCS]
19551          JRST OVHCL9            ;BOGUS AOBJN POINTER, MAYBE PCST NOT TURNED ON
19552 OVHCL1: MOVE A,(C)              ;NEXT SAMPLED PC
19553         TLNE A,%PSUSR           ;ONLY SEARCH TABLE IF EXEC MODE
19554          JRST OVHCL8            ;ALL USER MODE PC'S ARE COUNTED IN LAST BUCKET
19555         HRLO A,A                ;-1 IN RH IS GREATER THAN ANY SIXBIT
19556         MOVEI B,1_<35.-<.LZ <LOVHTB-1>>>        ;HALF THE SIZE OF THE TABLE
19557 REPEAT <36.-<.LZ <LOVHTB-1>>>,[ ;LOG SEARCH
19558         CAMG A,OVHTB1(B)        ;NOT CAMGE BECAUSE OF PADDING AT END
19559          SUBI B,1_<35.-.RPCNT-<.LZ <LOVHTB-1>>>
19560         ADDI B,1_<34.-.RPCNT-<.LZ <LOVHTB-1>>>
19561 ]
19562         LOC .-1                 ;OPTIMIZE OUT ADDI B,0
19563         AOSA OVHTB2(B)
19564 OVHCL8:  AOS OVHTB2+LOVHTB-1
19565         AOBJN C,OVHCL1
19566 OVHCL9: WRPCST [-LOVHPC,,OVHPCS]        ;TURN ON / RESTART PC SAMPLING
19567         POPJ P,
19568 ];KS10P
19569
19570 ;HERE IS A TABLE OF REGISTERED 3-LETTER OVERHEAD REGION CODES
19571
19572 ;ALC - ALLOCATE CORE PAGE FRAME
19573 ;CHx - CHAOSNET STUFF (VARIOUS VALUES OF x)
19574 ;FLT - MISCELLANEOUS FAULTS
19575 ;IMP - ARPANET INTERRUPT (NOT STYNET)
19576 ;LOW - LOW CORE, BEFORE FIRST OVHMTR MACRO & PCS IN UPPER HALF OF EXEC SPACE
19577 ;NET - ALL NETWORKS, ALL PI LEVELS, NOT OTHERWISE ACCOUNTED FOR
19578 ;PGF - PAGE FAULT
19579 ;PPI - PPIUM
19580 ;QIN - DISK INTERRUPT LOW LEVEL
19581 ;QSC - DISK INTERRUPT HIGH LEVEL, DISK SCHEDULER
19582 ;SC1 - SCHEDULER 1 - ENTRY
19583 ;SC2 - SCHEDULER 2 - SEARCH
19584 ;SC3 - SCHEDULER 3 - EXIT
19585 ;SC4 - SCHEDULER 4 - UNSWAPBLOCK
19586 ;SLW - SLOW CLOCK
19587 ;SWF - SWAP FIND NEW USER (SWAPOUT SCHEDULER)
19588 ;SWP - SWAP PAGE
19589 ;SWS - SWAP SCHEDULER
19590 ;SWU - SWAP USER
19591 ;TTI - TTY INPUT INTERRUPT LEVEL
19592 ;TTO - TTY OUTPUT INTERRUPT LEVEL
19593 ;TTY - MISC TTY CODE
19594 ;USR - USER MODE
19595 ;UUO - UUO LEVEL, MISCELLANEOUS ROUTINES, AND TOTAL MISCELLANY
19596 ;WS - WORKING SET & SWAP-BLOCK ENTRY CODE
19597 \f
19598 SUBTTL PC LSR TEST FEATURE
19599
19600 ;CALLED BY PCLT MACRO
19601 ;WHICH ASSEMBLES
19602 ;SKIPE PCLDBM
19603 ;PUSHJ P,PCLTST
19604
19605 PCLTST: PUSH P,U
19606         MOVE U,PCLIDX
19607         MOVEM U,PCLHT
19608         MOVE U,USER
19609         CAME U,PCLUSR
19610         JRST POPUJ
19611 PCLX:   CAIA    ;PATCH IN OTHER CHECKS (SHOULD JRST POPUJ TO IGNORE)
19612         MOVE U,USER     ;PATCH ROUTINE MAY CLOBBER U
19613         AOSN PCLNXT
19614         JRST PCLT1      ;FOUND PLACE, CAUSE PCLSR
19615         HRRZ U,-1(P)
19616         CAME U,PCLL
19617         JRST POPUJ      ;NOT MARK (NOT AT RIGHT LOCN)
19618         HRRO U,USER     ;4.9 U FLAG 
19619 PCLT1:  PUSH P,A        ;COMPUTE HASH ADR OF RETURNS ON PDL
19620         PUSH P,B
19621         PUSH P,C
19622         HRREI A,-USRSTG(P)
19623         JUMPL A,PCLT1A  ;SYS JOB'S PDL?
19624         IDIVI A,LUBLK
19625         IMULI A,LUBLK
19626         MOVEI A,USRPDL(A)       ;GET START OF USERS PDL IN A
19627 PCLT3:  HRRZ B,(A)
19628         JUMPE B,PCLT2
19629         CAIL B,HSYSCD
19630         JRST PCLT2
19631         HLRZ C,-1(B)
19632         TRZ C,37
19633         CAIE C,(PUSHJ P,)
19634         JRST PCLT2
19635         XOR B,PCLHT
19636         ROT B,1
19637         MOVEM B,PCLHT
19638 PCLT2:  CAIGE A,-2-3(P)
19639         AOJA A,PCLT3
19640         MOVE A,PCLHT    ;COMPUTED HASH
19641         JUMPGE U,PCLT4  ;GOING TO PCLSR HERE, STORE HASH AS MARK FOR NEXT TIME
19642         CAME A,PCLHSH
19643         JRST PCLT5
19644         SKIPGE PCLDBM
19645         JRST PCLT6      ;IN HOLD MODE, PCLSR HERE
19646         SETOM PCLNXT    ;FOUND MARK, PCLSR NEXT TIME
19647 PCLT5:  POP P,C
19648         POP P,B
19649         POP P,A
19650         JRST POPUJ
19651
19652 PCLT4:  MOVEM A,PCLHSH  ;STORE HASH FOR NEXT TIME
19653         HRRZ A,-3-1(P)
19654         MOVEM A,PCLL
19655 PCLT6:  CONO PI,CLKOFF
19656         MOVE B,PCLDBM
19657         MOVEI A,%PIC.Z
19658         CAIN B,1        ;DON'T ^Z.
19659         IORM A,PIRQC(U)
19660         POP P,C
19661         POP P,B
19662         POP P,A
19663         POP P,U
19664         JRST PCLME
19665
19666         PUSHJ P,PCLME1
19667 PCLME:  PUSHJ P,UFLS
19668         JRST 4,.
19669
19670 PCLME1: PUSHJ P,PCLSR
19671         JFCL
19672         JRST POPJ1
19673
19674 PCLT1A: TRNE U,-1
19675          JRST 4,.
19676         JRST 4,.        ;TEMP MODIFY END CHECK IF WANT TO WIN FOR SYS JOB
19677 \f
19678 SUBTTL ILLUO NON-RELEVANT SYSTEM CALLS
19679 IFE E.SP,[
19680         ADSTEP==URET
19681         ADCONT==URET
19682         ADWORD==URET
19683 ]
19684 IFE 340P\E.SP,[
19685         ADSTAR==URET
19686         ADCLOS==URET
19687         ADSTOP==URET
19688         ADSTL==URET
19689 ]
19690 IFE 340P,[
19691         ALTPEN==URET
19692         ANDIS==URET
19693 ]
19694 IFE VIDP,[
19695         AVSCAN==ILUUO
19696         AVSTST==ILUUO
19697 ]
19698 IFE IMXP,[
19699         APOTSET==ILUUO
19700 ]
19701 IFE PDP6P,[
19702         AIPDP==ILUUO
19703 ]
19704 IFE NMTCS,[
19705         AMTAPE==ILUUO
19706 ]
19707
19708 IFE ARMP,[
19709         AARMOV==ILUUO
19710         AARMRS==ILUUO
19711         AARMOF==ILUUO
19712 ]
19713 IFE PTRP,[
19714         AFEED==CPOPJ
19715 ]
19716 IFE RBTCP,[
19717         ARBTC==ILUUO
19718 ]
19719 IFE NETP,[
19720         ANETIM==OPNL1   ;NO SUCH DEVICE ERROR FOR SYMBOLIC SYSTEM CALLS.
19721         ANETBL==OPNL1
19722         ANETHS==OPNL1
19723 ];NETP
19724 IFE NCPP,[
19725         ANETAC==CPOPJ   ;MAKE OLD UUOS FAIL
19726         ANETIN==CPOPJ
19727 ];NCPP
19728
19729 IFE NUNITS,[
19730         AUBLAT==URET
19731         AUTNAM==URET
19732         AUINIT==URET
19733         AUDISM==URET
19734         AASSIGN==URET
19735         ADESIGN==URET
19736 ]
19737
19738 ;Here generate the table for the BUG macro.  Note that entries for
19739 ;bugs in the initialization code will appear here also!  That's
19740 ;why we have the kludgey add 10
19741 BUGTAB: BLOCK LBUGTB+10
19742 LBUGT2==.-BUGTAB
19743         0               ;Marks end of table
19744
19745 CONSTANTS
19746 HSYSCD::        ;HIGHEST SYSTEM CODE
19747 \f
19748 SUBTTL RANDOM STORAGE
19749 EBLK
19750
19751 SCHHP:  SCHHB           ;PNTR TO SCHED HIST BUFFER
19752 SCHHB:  BLOCK SSCHDB    ;SCHED HIST BUFFER
19753                         ;4.9 =1 EXEC
19754                         ;4.8 =1 QUANT TERMINATED BY PG FAULT
19755                         ;4.7-3.8  LENGTH OF RUN TIME IN 512 USEC UNITS
19756                         ;    MUST ACCOMODATE 150 MILLISECOND QUANTA
19757                         ;3.7-3.1 USER ("NUMERIC INDEX)
19758                         ;RH PC QUANT STARTED AT
19759 SWPHTP: SWPHTB
19760 SWPHTL==200
19761 SWPHTB: BLOCK SWPHTL    ;SWAPPING HISTORY TABLE
19762                         ;4.9-4.8 EVENT: 0=START LOADING, 1=FINISH LOADING, 
19763                         ;               2=SWAP OUT, 3=SWAP BLOCK
19764                         ;4.7-3.9 WORKING SET SIZE MINUS ONE (0=0)
19765                         ;3.8-3.1 USER NUMBER
19766                         ;2.9-1.1 RH(TIME)
19767         BLOCK SWPHTL    ;CORRESPONDING UTRNTM
19768
19769 PGIHTP: PGIHTB
19770 PGIHTL==200
19771 PGIHTB: BLOCK PGIHTL    ;PAGE-IN HISTORY TABLE
19772                         ;4.9 1 IF JOB WAS LOADING
19773                         ;4.7-3.9 USER VIRTUAL PAGE NUMBER
19774                         ;3.8-3.1 USER NUMBER
19775                         ;2.9-1.1 RH(TIME)
19776         BLOCK PGIHTL    ;CORRESPONDING UTRNTM
19777
19778 IFN SCHBLN,[
19779 SCHMNY: 0               ;0 DO FULL SCHEDULE, -1 NEXT "SCHEDULE" SHOULD LOOK IN SCHBTB
19780 SCHBNJ: 0               ;NUMBER OF VALID ENTRIES IN SCHBTB
19781 SCHBTB: BLOCK SCHBLN    ;RUNNABLE JOB BUFFER
19782 SCHBPR: BLOCK SCHBLN    ;PRIORITIES OF THOSE
19783 NSCHOV: 0               ;COUNT OF BUFFER OVERFLOWS
19784 ]
19785 ;TRANSLATION ENTRY _ T
19786 ;TRANLK(T) IS  MODE,,NEXT ENTRY
19787 ;MODE IS 0 IF ENTRY ON FREE LIST, ELSE NOT 0, AND
19788  ;BITS 3.1 => INPUT, 3.2 => OUTPUT, 4.9 => ATOMIC TRANSLATION (DON'T RETRANSLATE)
19789 ;NEXT-ENTRY IS -1 FOR NIL, ELSE IDX REL TRAN!X
19790 ;TRANID(T) THRU TRANIS(T) - FROM-NAMES
19791 ;TRANOD(T) THRU TRANOS(T) - TO-NAMES
19792
19793 TRANLK: REPEAT SIOMT,,,.RPCNT-1 ;GENERATE 1ST WDS, LINKED TOGETHER.
19794 TRANID: BLOCK SIOMT
19795 TRANI1: BLOCK SIOMT
19796 TRANI2: BLOCK SIOMT
19797 TRANIS: BLOCK SIOMT
19798 TRANOD: BLOCK SIOMT
19799 TRANO1: BLOCK SIOMT
19800 TRANO2: BLOCK SIOMT
19801 TRANOS: BLOCK SIOMT
19802
19803 TRANFL: SIOMT-1         ;TRANSL ENTRY FREE LIST.
19804 TRNCNT: 0               ;NUM ENTRIES IN USE.
19805 TRNREF: 0               ;NUM. READ-ONLY ACCESSES TO TRANSL LISTS.
19806 TRANSW: -1              ;SWITCH FOR WRITE REF.
19807         0
19808
19809 IFE SCHBLN,     U0P:    0       ;PRIORITY OF BEST USER SO FAR
19810
19811 USER:   -1      ;USER # OF CURRENT LOSER
19812 SYSL:   SYSB*2000
19813 LITM:   0       ;LAST TIME SYS INCREASED CORE
19814
19815 SLGIV:  BLOCK 3 ;LOGIN
19816
19817 SETSLC: 0       ;SETLOC VARIABLES
19818 SETSLQ: 0
19819 SETSU:  -1
19820
19821 SWUNAM: 0       ;SYS WRITE VARIABLES
19822 SWJNAM: 0
19823 SWFN1:  0
19824 SWFN2:  0
19825 SWFN3:  0
19826 SWMOD:  0
19827 \f
19828 DMON:   SIXBIT /DRAGON/
19829         -1      ;USER INDEX OF DEMON JOB
19830
19831 NQMFWR: 0       ;COUNT OF FILES WRITTEN ON .MAIL. - FOR MAILER DEMON TO HANG ON.
19832 IFN XGP,[
19833 NXGPFW: 0       ;COUNT OF FILES WRITTEN ON .XGPR. - FOR XGPSPL
19834 ]
19835
19836 ;DEAMON VARIABLES
19837 ;VARIABLES FOR DEAMON CODE HACK
19838 IFN DEMON,[
19839
19840 IFN TTLPTP,TPLFLG: 1    ;FLAG FOR TPL
19841
19842 DMTLL==4        ;LEGNTH OF DEAMON TABLE SLOT
19843 NODEAM==20.     ;NUMBER OF SLOTS
19844 DMLNG==NODEAM*DMTLL
19845
19846 DEMSW:  0
19847         0       ;MAIN PROG SWITCH FOR DEMON
19848 REQCNT: 1       ;COUNT OF REQUEST'S FOR SYS JOB
19849 DMTPTR: 0       ;POINTER FOR DEMSIG TO DEM TBL, AN INDEX INTO IT, TAKEN MODULO DMLNG
19850 DMLSEX: -DMLNG,,0       ;POINTER TO DEAMON TABLE AOBJN
19851 DEMCNT: <NODEAM.-1>     ;AMOUNT OF SLOTS REMAINING IN THE TABLE
19852
19853 DMBLK:  0
19854         0       ;SLOT FOR NON DEAMON LOAD VIA NUJBST
19855
19856 DMOBLK: SIXBIT /   SYS/
19857         SIXBIT /ATSIGN/
19858         0       ;BLOCK USED BY SYSTEM JOB TO CHECK OPEN
19859
19860 ;DEAMON TABLE--CONSISTS OF SLOTS OF FOUR WORDS FOR EACH DEMON
19861 ;WORD 1 CONTAINS ITS SIXIT NAME
19862 ;WORD 2 CONTAINS THE USER INDEX,-1 IF LOADING, 0 IF DOWN
19863 ;WORD 3 2 QUANTITIES IN 18 BIT 2'S COMPLEMENT--
19864 ;LH ALWAYS > = 0, IF 0 ONLY TAKES EXPLICIT REQUESTS IN > 0 A REQUEST
19865 ;RH CONTAINS THE NUMBER OF REQUESTS PENDING FOR THE DEAMON
19866 ;FOR THE DEAMON WILL BE GENERATED EVERY 2 MINUTES
19867 ;WORD 4 CONTAINS THE TIME TILL THE NEXT IMPLICIT REQUEST WILL BE GENERATED.
19868
19869
19870 DMTTBL:  SIXBIT /DEMSTR/
19871         0
19872         1       ;STARTUP DEAMON
19873         0
19874         
19875 BLOCK <NODEAM-1>*DMTLL  
19876 ]
19877 TIMOFF: -1      ;TIME SINCE MIDNIGHT IN HALF SECONDS ("TIME IN DSK FORMAT").
19878 QDATE:  -1      ;DISK FORMAT DATE: -1 => SYSTEM DOESN'T KNOW DATE, ELSE
19879                 ;BITS 3.1-3.5 HAVE DAY OF MONTH, 3.6-3.9 HAVE MONTH OF YEAR,
19880                 ;4.1-4.7 HAVE YEAR MOD 100. .
19881 QDATEI: -1      ;-1 => SYSTEM DOESN'T KNOW DATE, ELSE
19882                 ;DATE AND TIME THE DATE AND TIME WERE FIRST DETERMINED, IN DSK FORMAT.
19883 PDYTIM: -1      ;TIME SINCE BEGINNING OF YEAR IN HALF-SECONDS (BACKUP TO PDCLK)
19884 FYEAR:  0       ;YEAR (E.G. 1969.)
19885 PDTIME: 0       ;NON-ZERO => OFFSET FOR PDCLK
19886                 ;WHEN SUBTRACTED FROM PDCLK DATAI GIVES # PD-UNITS SINCE
19887                 ; BEGINNING OF YEAR
19888                 ;ONE SECOND = 60. PD-UNITS
19889                 ; Also contains similar offset for KS-10 clock in 60ths.
19890 LPDTIM: -1      ;LAST PD CLK TIME, -1 IF PD CLK NOT RUNNING OR JUST PDSET'ED
19891
19892 SUPCOR: 0       ;CONTROLS SYS JOB, SEE SYSDTB, SCOR, ETC
19893                 ;EACH BIT REQUESTS ONE FUNCTION IF SET.
19894 SUPCOP: SCLDAT+IFN DEMON,[SCLDMN],,SCRCKS
19895                 ;THIS WORD OR'D INTO SUPCOR EVERY SECOND.
19896 SCKPHS: 0       ;USED FOR COUNTING EVERY SECOND 1/2 SECOND CLOCK
19897                 ;TO SET SUPCOP BITS EVERY SECOND
19898 SYSITM: 0       ;TIME SYS JOB LAST STARTED WAITING ON SUPCOR
19899 LNETIM: 0       ;TIME AT WHICH NETWORK WAS LAST BROUGHT UP
19900 RSWTIM: 1       ;Time (in DSK format) when last checked system resources.
19901 \f
19902 MXPARS==10.     ;MAX # PAR ERRS TO PRINT OUT
19903 PARPG:  BLOCK 8 ;STORAGE OF PAGE MAP WHILE HACKING PARITY ERROR CHECK
19904 PARCNT: 0       ;# OF PAR ERROR ENTRIES IN TABLE
19905 PARCON: BLOCK MXPARS    ;CONTENTS OF BAD PARITY LOCATIONS
19906 PARADR: BLOCK MXPARS    ;ADDRESSES OF BAD PARITY LOCATIONS
19907 PARAND: -1              ;QND OF ALL BAD WORDS
19908 PARIOR: 0               ;IOR OF ALL BAD WORDS
19909 PARAAN: -1              ;AND F ALL BAD ADDRS
19910 PARAOR: 0               ;IOR OF ALL BAD ADDRS
19911 IFE KA10P,[
19912 PARPFW: 0               ;PAGE FAIL WORD
19913 PARERA: 0               ;ADDRESS OF PAR ERR
19914 PARWRD: 0               ;BAD DATA
19915 ] ;IFE KA10P
19916 IFN KL10P,[
19917 PARRSN: 0               ;0 => PAR ERR PAGE FAULT IN PROG
19918                         ;-1 => PAR ERR INTERRUPT; NEEDN'T STOP
19919                         ;THE RUNNING JOB.
19920 ] ;KL10P
19921 PARDIE: 0       ;-1 => FATAL PARITY ERROR
19922 TPLSWP: 0       ;-1 => USE OLP FOR TPL
19923 IFN PDP6P,[
19924 PDP6UP: 0       ;0 => PDP6 IS DOWN. (AS USUAL)
19925 ]
19926 IFN ECCMEM,[
19927 IFE MCOND AIKA,[
19928 ECCADR: 1,,777760       ;ECC HISTORY STARTS HERE
19929 ECCLEN==16.             ;16 LOCATIONS OF ECC HISTORY
19930 ECCIDX: 0               ;LAST LOCATION ACCESSED
19931 ]]
19932 IFN TEN11P,[
19933 TEN11F: 0       ;0 -> NORMAL
19934                 ;-1 -> COMPLETELY IGNORE 10-11 INTERFACE
19935                 ; 1 -> RESET 10-11 INTERFACE, OTHERWISE IGNORE
19936 T11ERC: 0       ;COUNT OF CONTROL PAGE RAM ERRORS
19937 T11CCN: 0       ;CORRECT CONTENTS
19938 T11WCN: 0       ;WRONG CONTENTS
19939 T11PG:  0       ;PAGE # INVOLVED
19940 ]
19941 IFN N11TYS,[
19942 TVBLAD: 17742   ;VIDEO BUFFER TO FLASH WHEN JOB RUNNING (PDP10 VIDEO BUFFER ADDR)
19943 ]
19944 IFN DL10P,[
19945 DL10F:  -1      ;-1 NORMAL, 0 => 11 DOWN
19946 DL10HC: 0       .SEE TTDLBRK ;NUMBER OF LOOPS WHEN HUNG UP WAITING FOR 11 TO GOBBLE BUFFER
19947 ]
19948 \f
19949 DLSRCH: 0       ;-1 => DON'T RUN ANY USER BUT THE ONE ALREADY RUNNING
19950                 ;(UNLESS WE TAKE A PAGE FAULT).
19951 CPDLP:  -CPDLL,,LCPDL-1 ;CLOCK PDL POINTER
19952 LCPDL:  BLOCK CPDLL     ;CLOCK INT LEVEL PDL
19953
19954 CLKBSW: 0               ;READ SWITCHES INTO HERE TO DECIDE WHETHER TO GO TO DDT.
19955
19956 CLROOT: SSLCKB          ;CLOCK QUEUE ROOT
19957
19958 SSLCKB: SCLKI           ;SLOW CLOCK RQ BLOCK
19959         .+2             .SEE CHA5CK ;OR 15SCLB
19960         JRST SSLCK
19961
19962 IFN CHAOSP,[
19963 CHA5CK: 5*60.-SCLKI     ;5-SECOND CLOCK FOR CHAOS NET
19964         15SCLB          ;NOTE INITIAL TRIGGERING OF CLOCKS BELOW DELAYED AN EXTRA 5 SECONDS
19965         JRST CHA5CL
19966 ];CHAOSP
19967
19968 15SCLB: 15.*60.-SCLKI
19969         .+2             .SEE PRVCLB ;OR VSLCKB
19970         JRST 15SCLK
19971
19972 IFE SWPWSP,[
19973 PRVCLB: NPVSEC*60.-15.*60.-SCLKI        ;PRIVILEDGED USER VARIABLE CHECK
19974         VSLCKB
19975         JRST PRVCLK
19976 ];SWPWSP
19977
19978 VSLCKB: 0       ;VERY SLOW CLOCK BLOCK
19979         CLINFB                  ;CAUSE SLOW CLOCK TICK SOON AFTER SYS COMES UP
19980         JRST VSSLCK
19981
19982 CLINFB: 377777,,-1      ;ABOUT 15 YEARS
19983         0
19984         BUG             ;?
19985
19986 IFN CCLKP,[
19987 CCLKB:  0       ;FOR CHESS CLOCK HACK
19988         -1
19989         JRST RCCLK
19990 CCLK1:  0
19991 CCLK2:  0
19992 ]
19993
19994 IINTIC==60.     ;# TWO-MINUTE TICKS PER VERY VERY SLOW CLOCK TICK (2 HOURS)
19995 IINCNT: 0       ;# TWO-MINUTE TICKS REMAINING UNTIL NEXT VERY VERY SLOW CLOCK TICK
19996 .SEE VSCLK
19997
19998 IFN N11TYS,[
19999 WHOCLB: 0       ;WHO LINE TIMER
20000         -1
20001         JRST WHOSET
20002 ]
20003
20004 UTTYS:  BLOCK MXCZS     ;RING BUFFER FOR JOBS TO BE STARTED
20005 UTTYI:  UTTYS
20006 UTTYO:  UTTYS
20007 UTTYCT: 0
20008
20009 PCLDBM: 0       ;.NE. 0 ACTIVATE PC LSR DEBUG MODE
20010                         ;1 => ADVANCE PLACE WHERE PCLSR
20011                         ;2 => ADVANCE BUT DON'T ^Z.
20012                         ;- HOLD
20013 PCLUSR: -1      ;USER PCLSR MODE ACTIVE FOR
20014 PCLL:   0       ;PLACE WHERE LAST PCLSR TESTED
20015 PCLHSH: 0       ;HASH OF RETURNS ON PDL AT LAST PLACE TRAPPED OUT OF
20016 PCLNXT: -1      ;-1 => FROB NEXT TIME IN ADVANCE MODE
20017 PCLHT:  0       ;TEMP
20018 PCLIDX: 0       ;INITIALIZE PCLT TO THIS (SET TO LOOP COUNT IF NECESSARY)
20019 \f
20020 CORRNR: 0       ;LAST USER TO RUN CORE
20021 SJSPG:  0       ;-1 => LAST FREE PG RESERVED FOR SYS JOB; DON'T GIVE IT TO ANYONE ELSE.
20022 UTBFLF: 0       ;-1 SIGNAL TO TRY TO FLUSH I/O BLOCKS
20023 UFDFLF: 0       ;-1 SIGNAL TO TRY TO FLUSH 2311 UFDS
20024 CORCNT: 0
20025 UFLSF:  0       ;FLAG FROM UFLS TO CLKBRK
20026 CLKFL1: 0       ;FLAG COUNTER TO CONTROL CLOCK LEVEL 
20027 SCHFLG: 0       ;SCHEDULE TIMER (DIVIDES 60 CPS)
20028 27FCLK: 0       ;-1 IF FAST CLOCK SHOULD CALL TYP27S
20029 SCITM:  0       ;SEE SYSEX, SYSDEC
20030 LCLK1:  0
20031 SYSCKP: -LTSTB,,TSTB    ;SYSTEM CHECKSUMS CHECKER POINTER
20032 SYSPDP: -LSYSP,,SYSPDL-1        ;PDL POINTER FOR SYSTEM JOB
20033 SYSPDL: BLOCK LSYSP     ;PDL FOR SYS JOB
20034 IFN TPLP,TPLBUF:        BLOCK TPLBSZ    ;PSEUDO LPT BUFFER - MUST BE ABOVE SUACS
20035 IFN TPLP\DEMON,TPLFNO:  SIXBIT /!/      ;UNIQUE TPL FIRST FILE NAME
20036 SJCFF:  0       ;-1 WHEN SYS JOB IN PROCESS OF FLUSHING CORE
20037                         ;AVOIDS TIMING ERROR DUE TO HUSRAD NOT REALLY REFLECTING WHAT ITS GOING TO BE
20038 SLSWPR: 0       ;STORE SYS JOB'S LSWPR WHILE HACKING UUOS
20039
20040 BBLK
20041
20042 IFN TPLP,       TPLFN:  2,,(SIXBIT /TPL/)
20043 IFN KL10P,[
20044 KLEBCC: 0 ? <1_23.>/<4*25./2>   ;EBOX COUNTER CONVERSION TO 4 USEC CONSTANT (FOR 25 MHZ)
20045                 ;RESULT IS IN AC+2 AFTER DMUL AC,KLEBCC
20046 KLMBCC:; 1 ? 110000,,           ;FOR CONVERTING AN MBOX COUNT TO THE TIME (IN EBOX UNITS)
20047                                 ;IT SUPPOSEDLY AMOUNTS TO.
20048                                 ;WE ASSUME 102.5 NANOSEC OD WAITING TIME PER MBOX CYCLE
20049                                 ;THIS NUMBER IS 102.5/80.
20050                                 ;DMUL AC,KLMBCC PUTS ANSWER IN AC+1, AC+2
20051                                 ;WITH BINARY POINT BETWEEN THE WORDS.
20052         0 ? 0           ;M8538 MODIFIED SO EBOX COUNTER CONTINUES TO COUNT
20053                         ;DURING MBOX WAIT TIME, SO SET KLMBCC = ZERO.
20054 EBLK
20055
20056 MTRUSR: -1              ;USER TO WHOM PERF CTR IS ASSIGNED
20057 MTRJOB: -2              ;USER BEING MEASURED BY PERF CTR,
20058                         ;OR -1 => NULL JOB, OR -2 => ALL JOBS.
20059
20060 PAEON:  0               ;SELECTED PERF CTR ENABLE WORD
20061 PAEOFF: 0               ;DISABLE THE PERF CTR (WHEN WRONG JOB IS RUNNING)
20062 STPERF: 0 ? 0           ;VALUE OF PERF COUNTER AT START OF QUANTUM
20063 STEBOX: 0 ? 0           ;VALUE OF EBOX COUNTER AT START OF QUANTUM
20064 STMBOX: 0 ? 0           ;VALUE OF MBOX COUNTER AT START OF QUANTUM
20065 ] ;KL10P
20066 IFE KL10P, EBLK
20067 IFN TPLP,[
20068 TPLFN1: 0
20069 TPLFN2: 0
20070 TPLFN3: 0
20071 ]
20072 IFN NLPTP, NTNLPL: 0    ;NUMBER OF TIMES NLPT LOST PIA
20073 VARIABLES
20074
20075
20076 TSTB:   REPEAT CKNUM,CONC CK,\.RPCNT,
20077 LTSTB==.-TSTB
20078
20079 CKSUMS: BLOCK CKNUM
20080 CKXORS: BLOCK 36.       ;XOR OF ALL ADRS IN PURE AREAS IN SYS WITH CORRESP
20081                 ;BIT SET (RH)
20082 TCKXOR: BLOCK 36.       ;TEST XORS
20083
20084 SSYSCL==SSYS
20085 SYSCLB==SSYSCL_-10.+IFN 1777&SSYSCL,1
20086
20087 IFE KA10P,[
20088 AC1PTR: UUOACS  ;-> WHERE AC BLOCK 1 IS CURRENTLY LOADED FROM
20089 ] ;IFE KA10P
20090
20091 USRHI:  0       ;HIGHEST LOC USED FOR USER STORAGE
20092 \f
20093 SUBTTL LOCATIONS TO PATCH WHEN DEBUGGING
20094
20095 SYSDBG: 0       ;0 NORMAL TIMESHARING
20096                 ;+ GIVE "ITS BEING DEBUGGED" MESSAGE
20097                 ;-N ALSO ALLOW ONLY CONSOLE #N AND T00 TO CTRL/Z.
20098                 ;-512.*N => ALLOW ONLY HOST N TO TELNET IN.
20099                 ;-512.*N+M => ALLOW HOST N AND TTY M.
20100 DMLLDF: -1      ;-1 => START DAEMONS AUTOMATICALLY, 0 DON'T.
20101 IFN DEMON,DMNFLG: 1  ;1 => START DM-STYLE DAEMONS, 0 DON'T.
20102
20103 IFN NETP,NETUSW: 0 ;-1 => DON'T START UP A JOB IN ANSWER TO A CONNECT REQUEST
20104                 ;FROM A HOST OTHER THAN OURSELVES
20105
20106 SYSCN:  SYSCON  ;NUMBER OF TTY TO RECEIVE SYSTEM CONSOLE OUTPUT.
20107                 ;-1 TO THROW IT AWAY.  YOU CAN CHANGE THIS ANY TIME.
20108
20109 SUPPLG: 0       ;-1 => SUPPRESS LOGIN/LOGOUT MESSAGES ON SYSTEM CONSOLE.
20110
20111 IFE KS10P,[     ; KS has no lights.
20112 MIPGDS: 0       ;-1 => DON'T LIGHT LIGHTS (KA HAS HARDWARE SWITCH, KL NEEDS
20113                 ; THIS)
20114 ] ;IFE KS10P
20115
20116 IFN RH10P+RH11P,[
20117 USFHLT: 0       ;-1 => HALT ON DISK UNSAFES AND OTHER BAD ERRORS
20118                 ;0 => RETRY.  NOTE SET POSITIVE FOR 1/2 SECOND AFTER
20119                 ; A RETRY TO AVOID LOOPING, DETECT SOLID ERRORS.
20120 ] ;RH10P+RH11P
20121
20122 .SEE USEHM      ;NONZERO => USE HIGH MOBY, ELSE ONLY 256K
20123
20124 .SEE USEMDM     ;NONZERO => USE MEDIUM MEMORY AS ADDITIONAL "LOW HALF" PAGES
20125
20126 IFN N11TYS,[
20127 TT11P:  1       ;0 => PDP11-TTYS ARE NOT IN USE
20128                 ;1 => SYSTEM SHOULD INITIALIZE THEM
20129                 ;-1 => INITIALIZED AND IN USE
20130                 ;TO BRING THE TV'S DOWN, ZEROING TT11P ISN'T ENOUGH
20131                 ;EITHER DO WHAT TT11LS DOES, OR JUST SET SCR11D IN SUPCOR
20132                 ;(THE LATTER MAY NOT TAKE EFFECT INSTANTLY, HOWEVER)
20133                 ;TO BRING THE TV'S UP, JUST SET TT11P TO 1 AND WAIT 2 SECONDS
20134 ]
20135
20136 .SEE IMPUP      ;0 UP, -1 DOWN, 1 DOWN AND DON'T TRY TO BRING BACK UP
20137
20138 .SEE TEN11F     ;0 UP, -1 TOTALLY DOWN, 1 RESET PLEASE
20139
20140 .SEE DL10F      ;0 PDP11 DOWN, -1 UP
20141
20142 .SEE PDP6UP     ;0 PDP6 DOWN, -1 UP
20143
20144 .SEE LASTGC     ;NAME OF LAST DISK DIRECTORY GARBAGE COLLECTED
20145
20146
20147 SUBTTL SWAPPING ALGORITHM CONTROL SWITCHES
20148
20149 IFE SWPWSP,[    ;THESE AREN'T LOOKED AT IN SWPWSP SYSTEM
20150 ENSWSC: SWBLK   ;ENABLE CALLING OF SWSCD FROM 15 SEC CLOCK
20151 ENUPC:  1-SWBLK ;ENABLE USER-PC PAGE OF RUNNING USER NOT BE SWAPPED OUT
20152 ENPZRO: SWBLK   ;ENABLE PAGE-ZERO OF RUNNING USER NOT BE SWAPPED OUT
20153 ENSWBK: SWBLK   ;ENABLE SWPNX1 TO SWAP BLOCK A USER
20154 ENPVCL: 1-SWBLK ;ENABLE PRVCLK ROUTINE
20155 ENPREE: 1-SWBLK ;ENABLE PREEMPTION ON PAGE SWAP IN (SEE QSWI1)
20156 ENAGE:  1-SWBLK ;ENABLE AGE BITS TO ABORT SWAP OUT IF PAGE IS USED
20157 ];SWPWSP
20158 AGERTE: 8       ;NUMBER OF PAGES TO AGE EACH 1/2 SECOND.
20159                 ;IN A 512K SYSTEM, LAP TIME IS ABOUT 200/AGERTE SECONDS.
20160 \f
20161 SUBTTL SYSTEM LOCKS
20162
20163 CIRPSW: -1      ;CIRCULAR POINTER SWITCH
20164         0
20165
20166 MEMFRZ: -1      ;MEMORY FROZE
20167         0
20168
20169 CASW:   -1      ;CORE ALLOCATE INTERLOCK SWITCH (REQUESTS TO CORE JOB)
20170         0
20171
20172 SHUTLK: -1      ;LOCK VAR FOR SHUTDN
20173         0       ;USED TO TELL WHO CAUSED SYS DOWN
20174
20175 TREESW: -1      ;LOCK MANIPULATION OF JOB TREE STRUCTURE
20176         0       ;ATTACH, DETACH, DISOWN, REOWN ALL LOCK.
20177
20178 CUSER:  -1      ;CORE ALLOCATOR USER
20179         0       ;DUMMY CORE ALOC USE VAR
20180
20181 ARDFSW: -1      ;LOCK VAR FOR .REDEF
20182         0
20183
20184 IFN 340P\E.SP,[
20185 DISUSR: -1      ;340 USER
20186         0       ;DUMMY 340 USE VAR
20187 ]
20188
20189 IFN CODP,[
20190 CODUSR: -1      ;CODE SENDER
20191 CODUSE: -1
20192 ]
20193
20194 IFN PLTP,[
20195 PLTUSR: -1      ;PLOTTER USER
20196 PLTUSE: -1
20197 ]
20198
20199 IFN LPTP\TTLPTP,[
20200 LPTUSR: -1      ;LINE PRINTER USER
20201 LPTUSE: -1
20202 ]
20203 IFG LPTP-1,[
20204 OLPUSR: -1
20205 OLPUSE: -1
20206 ]
20207 IFN LPTP,[
20208   IFE LPTP-1,[
20209     IFN NLPTP,[
20210         NLUSR==LPTUSR
20211         NLUSE==LPTUSE
20212     ]
20213     IFN OLPTP,[
20214         OLUSR==LPTUSR
20215         OLUSE==LPTUSE
20216     ]
20217   ]
20218   IFG LPTP-1,[
20219     OLUSR==OLPUSR
20220     OLUSE==OLPUSE
20221     NLUSR==LPTUSR
20222     NLUSE==LPTUSE
20223   ]
20224 ]
20225
20226 IFN PTRP,[
20227 PTPUSR: -1
20228 PTPUSE: -1
20229
20230 PTRUSR: -1
20231 PTRUSE: -1
20232 ]
20233
20234 IFN VIDP,[
20235 NVDUSR: -1
20236 NVDUSE: -1
20237 ]
20238
20239 IFN PDP6P,[
20240 PDPUSR: -1      ;PDP-6 USER
20241 PDPUSE: -1
20242 PDPISR: -1      ;PDP6 AS INFERIOR (INTS ON IO CHANNEL)
20243 PDPISE: -1      ;PDP6 USE VAR
20244 ]
20245
20246 IFN TABP,[
20247 TABUSR: -1      ;TABLET USER
20248 TABUSE: -1
20249 ]
20250
20251 IFN STKP,[
20252         STKUSR: -1
20253         STKUSE: -1
20254 ]
20255 \f
20256 TIME:   0       ;TIME SINCE SYSTEM START IN 1/30'THS
20257 SUSRS:  0       ;NUMBER USERS ON SYS
20258 RVVTIM: 0       ;VALUE OF TIME WHEN SYSTEM WAS LAST REVIVED FROM A CRASH
20259 USRRCE: BLOCK NCT+1     ;USER RESOURCE +1 FOR DISOWNED JOBS
20260 SYSRCE: 0       ;SYS JOB RESOURCE
20261 SLOADU: 0       ;100. * <EFFECTIVE # OF COMPETING USERS>, IN FIXED POINT.
20262 RNABLU: 0       ;RUNNABLE USERS
20263 NPGWTU: 0       ;NUMBER OF JOBS CURRENTLY WAITING FOR A PAGE
20264 LOUTIM: 0       ;TOTAL TIME USED BY LOGGED OUT USERS
20265 UMASTER:        -1      ;INDEX OF MASTER USER
20266 SWRCE:  BLOCK NCT+2     ;SWAP SCHED RESOURCE
20267 SWIPRQ: 0       ;TOTAL # SWAP IN REQUESTS
20268 SHUTDN: 0       ;"TIME" SYS WILL DIE, 0 IF NOT DYING, -1 IF DEAD
20269 DEDTIM: 0       ;TIME TILL DEATH AFTER NEXT CLK QUEUE INT
20270                 ; < 0 => SYSTEM ACTUALLY DOWN (CHECKED BY ^Z, NUJBST, %OPLIV JOBS)
20271 DTHTIM: 0       ;TIME SYSTEM DIED
20272 DEDBLK: 0
20273         -1
20274         JRST DEATHZ
20275
20276 ATRNJN: 0       ;JNAME OF LAST JOB TO DO A .TRANAD OR .TRANDL
20277                 ;(SO I CAN SEE IF THEY'RE USED AT ALL).
20278
20279 IFN DZ11P,[
20280 DZXSPR: 0       ;Count of spurious DZ-11 transmitter interrupts.
20281 DZRSPR: 0       ;Count of spurious DZ-11 receiver interrupts.
20282 ];DZ11P
20283
20284 NCORRQ: 0       ;NUMBER CORE RQS HERE SO TRANSFERRED TO PEEK
20285 NCBCOM: 0       ;NUMBER CORE BLOCKS COMMITTED TO CORGP
20286
20287 NQDE:   BLOCK NQS       ;NUMBER OF 2314 DATA ERRORS
20288 NQHE:   BLOCK NQS       ;NUMBER OF 2314 HARDWARE ERRORS
20289         BLOCK 1         ;NQSE-1 COUNTS SPUR INTS WHILE NO XFER (QSDU -1)
20290 NQSE:   BLOCK NQS       ;NUMBER OF SPURIOUS 2314 ERROR INTERRUPTS
20291 NQCMPE: BLOCK NQS       ;NUMBER OF 2314 READ/COMPARE ERRORS
20292 NQWDE:  BLOCK NQS       ;# DATA ERRS ON WRITE
20293 NQRDE:  BLOCK NQS       ;# DATA ERRS ON READS
20294 NIRSWE: 0       ;# IRRCV ERRS ON SWAPPING XFERS
20295 QIRRCV: 0       ;IRRECOVERABLE DISK ERRORS
20296 QIRCBK: 0       ;BLOCK # W/ IRRCV ERROR
20297 QIRUNT: 0       ;UNIT OF ABOVE
20298 NQWRE:  0       ;# WRITE ERRS RCC OK
20299 NQWIRE: 0       ;# WRITE ERRS RCC LOST
20300 NWXFR:  0       ;NUMBER WRITE TRANSFERS (FILE, DIR, ETC.)
20301 NRXFR:  0       ;NUMBER READ
20302 NSWXFR: 0       ;NUMBER WRITE SWAPS
20303 NSRXFR: 0       ;NUMBER READ SWAPS
20304
20305 ;DON'T CHANGE ORDER .SEE MEMTYP
20306 PARERR: 0                       ;COUNT OF CORE PARITY ERRORS
20307 NXMERR: 0                       ;COUNT OF NXMS
20308 IFE KA10P,      BPFERR: 0       ;COUNT OF BAD PAGE FAILS
20309 PARPC:  0                       ;PC ON CORE PARITY INTERRUPT
20310 NXMPC:  0                       ;PC ON NXM
20311 IFE KA10P,      BPFPC:  0       ;PC ON BAD PAGE FAIL
20312 PARUSR: -1                      ;USER ON PAR ERR
20313 NXMUSR: -1                      ;USER ON NXM
20314 IFE KA10P,      BPFUSR: -1      ;USER ON BAD PAGE FAIL
20315 IFE KA10P,      BPFPFW: 0       ;PFW ON BAD PAGE FAIL
20316
20317 IFN KS10P,[
20318 ECCERR: 0       ;COUNT OF ECC CORRECTED ERRORS LOGGED
20319 ECCERA: 0       ;MEMORY STATUS AND ADDRESS OF MOST RECENT
20320 ECCAND: -1      ;AND OF ALL ERRORS
20321 ECCIOR: 0       ;IOR OF ALL ERRORS
20322 ] ;IFN KS10P
20323
20324 IFN DPKPP,      NDPKPE: 0       ;# PARITY ERRS FROM DATAPOINT KLUDGE
20325
20326 SNMPGS: 0       ;SYSTEM, NUMBER OF VIRTUAL USER PAGES
20327 SNSWPG: 0       ;SYS, NUM OF SWAPPED OUT VIR. PGS
20328
20329 USRTM1: 0       ;4USEC TICKS USED BY USERS SINCE LAST (1/2 SEC) UPDATE TO USRTIM
20330 USRTIM: 0       ;TIME USED BY ALL USERS 1 SEC UNITS
20331 NULTM1: 0       ;4USEC TICKS USED BY NULJOB SINCE LAST (1/2 SEC) UPDATE TO NULTM3
20332 NULTM3: 0       ;NUMBER OF SECONDS USED BY NULJOB
20333 NULTIM: 0       ;TIME USED BY NULL JOB (60'THS) - OBSOLETE BUT STILL MAINTAINED
20334 IFN KL10P,[
20335 NULEBC: 0 ? 0   ;EBOX COUNT WHEN NULL JOB ENTERED
20336 NULMBC: 0 ? 0   ;MBOX COUNT WHEN NULL JOB ENTERED
20337 NULPRF: 0 ? 0   ;PERF COUNT WHEN NULL JOB ENTERED
20338 ] ;KL10P
20339 IFE KA10P,[
20340 PFAILF: 0       ; KL: -1 => ENTRY TO CLOCK LEVEL WAS VIA PFAIL
20341                 ;     -2 => VIA INTPFL
20342                 ; KS: -1 => BOTH CASES
20343 ] ;IFE KA10P
20344 LOSTM1: 0       ;4USEC TICKS LOST SINCE LAST (1/2 SEC) UPDATE TO LOSTIM
20345 LOSTIM: 0       ;SECONDS OF LOST TIME (ALL OTHERWISE RUNNABLE JOBS WAITING FOR PAGES)
20346 IDLTM1: 0       ;4 USEC TICKS IDLE SINCE LAST (1/2 SEC) UPDATE TO IDLTIM
20347 IDLTIM: 0       ;SECONDS OF IDLE TIME (NO JOBS WANT TO RUN)
20348 LOSRCE: 0       ;USRRCE WORD FOR LOST TIME
20349 IDLRCE: 0       ;USRRCE WORD FOR IDLE TIME
20350
20351 UREALT: -1      ;RH=INDEX OF THE REAL TIME USER
20352                 ;LH=0=> THIS USER HAS HIGHEST PRIORITY
20353                 ;LH>0=> USER NOT IN HIGH PRIORITY PHASE
20354                 ;LH<0=> FACILITY IDLE
20355 INFORM [HIGHEST USED]\<.-1>
20356 \fSUBTTL USER VARIABLES
20357
20358 ;ONE COPY FOR EACH PROCEDURE
20359 ;FOR KL AND KS, THIS IS THE UPT
20360
20361 IFN KL10P,[
20362 DEFINE KLUPT N,NAME/            ;CHECKS "HARD-WIRED" UPT LOCATIONS
20363 IFN .-USRSTG-<N>,[
20364 .ERR "NAME" LOST IN UPT
20365 LOC USRSTG+<N>
20366 ]
20367 TERMIN
20368 ] ;KL10P
20369
20370 IFE KL10P,[
20371 DEFINE KLUPT N,NAME/
20372 TERMIN
20373 ] ;IFE KL10P
20374
20375 IFN KL10P, LOC <.+777>&-1000    ;KL UPT MUST START AT HARDWARE PAGE BOUNDARY
20376
20377 IFN KS10P, LOC <.+7>&-10        ; KS UPT must be 0 mod 8 (see UUOPCW)
20378
20379 USRSTG:: KLUPT 0,;USER PAGE MAP
20380
20381 UPGMP:  BLOCK NUVPG/2   ;PAGE MAP STORAGE (PROGRAMS UP TO NUVPG LONG)
20382 ;               2.9-2.8 ACCESS RIGHTS
20383 ;                       00      NO ACCESS (BY SOFTWARE CONVENTION, 1.2-1.1
20384 ;                               HAVE THE "REAL" ACCESS BITS, WHICH MAY BE 00,
20385 ;                               BUT MAY NOT, E.G. FOR A SWAPPED OUT PAGE).
20386 ;                       01      READ ONLY
20387 ;                       10      READ/WRITE/FIRST
20388 ;                       11      READ/WRITE
20389 .SEE PMCSHM     ;CACHE BIT
20390 .SEE PMAGEM     ;AGE BITS
20391 .SEE PMRCM      ;LOW N BITS ARE PHYSICAL CORE PAGE NUMBER (IN 1K PAGES)
20392 UPGCP:  BLOCK NUVPG/2   ;CIRCULAR POINTERS (CORRESPONDS 1-1 WITH UPGMP)
20393 ;               IF -1, ABSOLUTE PAGE, NOT LINKED.  OTHERWISE:
20394 ;               2.9     IF 0:
20395 ;                       2.8-1.9 USER INDEX
20396 ;                       1.8-1.1 PAGE NUMBER IN THAT USER'S UPGCP
20397 ;                       IF 1:
20398 ;                       2.8     IF 0:
20399 ;                               2.7-1.1 LINK TO MMP TABLE
20400 ;                               IF 1:
20401 ;                               2.7-1.1 LINK TO MEM PNT TABLE
20402 UMAPS:  0       ;USER MAP STATUS
20403         .SEE %UM
20404 UDBR1A==UPGMP   ;ADDRESS TO PUT IN DBR1
20405 UDBR2A==UPGMP+<NUVPG/4> ;ADDR FOR DBR2
20406 UPGCPH==UPGCP+<NUVPG/4> ;ADDR OF HIGH HALF OF CIRC PNTRS
20407
20408 TTYTBL: 0       ;TTY ASSIGNED THIS USER OR INDICATION THAT THERE IS NONE
20409 %TBNOT==400000  ;4.9 DOES NOT HAVE TTY NOW
20410 %TBNVR==200000  ;4.8 IF JOB DOESN'T HAVE TTY, OPENS SHOULD FAIL.
20411 %TBINT==100000  ;4.7 IF JOB DOESN'T HAVE TTY, ATTEMPT TO USE TTY SHOULD INTERRUPT.
20412                 ;JOB CAN SET BITS 4.8 AND 4.7.
20413 %TBWAT==40000   ;4.6 IF 1, %TBINT AND %TBNVR ARE OVERRIDDEN AND TTY USE ATTEMPTS
20414                 ;    ALWAYS HANG. SET BY DDT FOR $P, CLEARED BY ^P. ONLY SUPERIOR CAN SET.
20415 %TBDTY==010000  ;4.4 TTY TAKEN FROM --ME--.  WHEN GIVEN BACK,
20416                  ;DON'T PASS IT ON TO MY INFERIOR.
20417 %TBOUT==004000  ;4.3 ALLOW THIS JOB TO OUTPUT WHETHER OWNS TTY OR NOT
20418 %TBINF==002000  ;4.2 ALLOW MY INFERIORS TO OUTPUT IF THEY HAVE %TBOUT.
20419 %TBOIG==001000  ;4.1 IGNORE MY OUTPUT
20420 %TBIIN==000400  ;3.9 INTERRUPT IF I TRY TO DO INPUT
20421 $TBECL==220600  ;3-6-3.1 # ECHO LINES IF I DONT HAVE DISPLAY
20422                 ;RH USER NUM GAVE TTY AWAY TO OR TTY NUM IF HAS IT
20423 %TBCLR==410077  ;CLEAR THESE BITS IN TTYTBL OF A JOB RECEIVING THE TTY
20424
20425 TTSTSV: BLOCK 3 ;JOB'S SAVED TTYST1,TTYST2,TTYSTS, WHEN JOB DOESN'T HAVE THE TTY.
20426
20427 NMPGS:  0       ;NUMBER OF NON-ABSOLUTE PAGES (INCLUDES PURE)
20428 NSWPGS: 0       ;NUMBER SWAPPED OUT PAGES (AOSED FOR EACH USER OF SHARED PAGE SWAPPED OUT)
20429 HUSRAD: 0       ;MEM ADR OF PAGE ABOVE HIGHEST THAT EXISTS (MAX 1,,0)
20430 UPC:    0       ;USER PC STORAGE
20431 LUBTM:  0       ;TIME LAST UNBLOCKED (FOR IDENTIFYING INACTIVE JOBS)
20432 JBI:    -1      ;JOB DEVICE INDEX. IF NOT -1, THIS JOB IS A JOB-DEVICE,
20433                 ;AND JBI HAS INDEX INTO JOB DEVICE TABLES.
20434 \f
20435 UPGML:          ;USER PAGE MAP LOAD (EIGHT WORDS FOR LPM AND SPM INSTRUCTIONS)
20436 IFE KS10P,[     ; KS10 version given below.
20437                 UPJPC:  0       ;JPC.  KA HAS FAULT ADDRESS IN LH.
20438 IFE KL10P,      UPOPC:  0       ;OLD PC FLAGS,,OPC (UNUSED ON KL-10)
20439                 UPMAR:  0,,0    ;MAR ADDRESS AND CONDITION
20440                                 ;FOR KA-10:
20441                                 ;       3.3     0=EXEC, 1=USER
20442                                 ;       3.2-3.1 MAR CONDITION:
20443                                 ;               0       NEVER
20444                                 ;               1       INSTR FETCH
20445                                 ;               2       WRITE
20446                                 ;               3       ALWAYS
20447                                 ;       2.9-1.1 VIRTUAL ADDRESS
20448                                 ;FOR KL-10:
20449                                 ;       3.9-3.7 ADDRESS BREAK CONDITIONS:
20450                                 ;               3.9     FETCH
20451                                 ;               3.8     READ
20452                                 ;               3.7     WRITE
20453                                 ;       3.6     0=EXEC, 1=USER
20454                                 ;       3.5-1.1 VIRTUAL ADDRESS
20455 IFE KL10P,      UPQUAN: EXPGNG+1,,0             ;F.S. QUAN AND FAULT BITS
20456 IFN KL10P,      UPFW:   0                       ;PAGE FAIL WORD
20457 IFE KL10P,DBL==100_1
20458 IFN KL10P,DBL==0
20459                 UPDBR1: DBL,,UPGMP              ;DBR1
20460                 UPDBR2: DBL,,UPGMP+100          ;DBR2
20461 IFE KL10P,      UPDBR3: DBL,,EXEUMP             ;DBR3
20462 IFE KL10P,      UPACP:  1040,,UUOACS            ;B KEY,C KEY,,AC POINTER
20463 ] ;IFE KS10P
20464
20465 IFN KS10P,[
20466 UPDBR1: UPGMP           ; DBR1
20467 UPDBR2: UPGMP+100       ; DBR2
20468 UPQUAN: 0               ; Runtime counter
20469 UPJPC:  0               ; User mode JPC if microcode supports
20470 UPEJPC: 0               ; Exec mode JPC if microcode supports
20471 ] ;KS10P
20472
20473 UPGMLE::                                ;END OF PAGE MAP (+1)
20474
20475 IFN KL10P,[
20476         KLUPT 420,      ;RESERVED UPT 420
20477 UPT420: 0
20478         KLUPT 421,      ;TRAP 1 INSN    ;ARITHMETIC OVERFLOW
20479 TR1INS: JSR ILLTRP       ;FOR ITS-STYLE INTERRUPT, CONTAINS 0,,%PIARO
20480         KLUPT 422,      ;TRAP 2 INSN    ;PDL OVERFLOW
20481 TR2INS: JSR ILLTRP       ;SYS JOB SHOULDN'T OVERFLOW    ;FOR ITS-STYLE, 0,,%PIPDL
20482         KLUPT 423,      ;TRAP 3 INSN    ;USED FOR ONE-PROCEED
20483 TR3INS: JSR ILLTRP       ;SYS JOB SHOULDN'T ONE-PROCEED ;FOR ITS-STYLE, 0,,%PI1PR
20484         KLUPT 424,      ;MUUO DEPOSIT LOCATION
20485 SV40::
20486 MUUODP: 0       .SEE FORTY
20487         KLUPT 425,      ;MUUO OLD PC STORAGE
20488 SUUOH::
20489 XUUOH:  0
20490         KLUPT 426,      ;MUUO PAGING AND CONTEXT WORD
20491 MUUOCX: 0
20492         KLUPT 427,      ;RESERVED UPT 427
20493 UPT427: 0
20494         KLUPT 430,      ;MUUO NEW PC WORDS
20495 MUUOKN: %PSPCU,,UUOH0           ;FOR OTHER JOBS, MUUOEX (A JRST 4,).
20496 MUUOKT: %PSPCU,,MUUOEX          ;NO JOB SHOULD EVER TRAP IN EXEC MODE.
20497 MUUOSN: %PSPCU,,MUUOEX          ;NO JOB SHOULD EVER RUN IN SUPERV. STATE.
20498 MUUOST: %PSPCU,,MUUOEX          ;..
20499 MUUOCN: %PSPCU,,UUOH0           ;NORMAL UUOS
20500 MUUOCT: %PSPCU,,MUUOTR          ;UUOS AS TRAP INSN
20501 MUUOPN: %PSPCU,,UUOH0           ;PUBLIC MODE IDENTICAL TO CONCEALED MODE,
20502 MUUOPT: %PSPCU,,MUUOTR          ; ALTHOUGH IT'S A SCREW FOR A LOSER TO BECOME PUBLIC
20503 ]               ;END OF IFN KL10P
20504 \f
20505 IFN KS10P,[
20506 DEFINE KSUPT UPTNAM
20507 IFN .-USRSTG-<UPTNAM>,[
20508 .ERR UPTNAM lost in UPT
20509 LOC USRSTG+<UPTNAM>
20510 ]
20511 TERMIN
20512
20513 UPFW:   0       ; Saved page fail word from last fault.  Copied from EPTPFW
20514                 ; at time of fault usually.
20515
20516 KSUPT UPTTR1
20517 TR1INS: JSR ILLTRP
20518
20519 KSUPT UPTTR2
20520 TR2INS: JSR ILLTRP
20521
20522 KSUPT UPTTR3
20523 TR3INS: JSR ILLTRP
20524
20525 KSUPT UPTUUO
20526 SV40::
20527 MUUODP: 0
20528
20529 KSUPT UPTUPC
20530 SUUOH::
20531 XUUOH:  0
20532
20533 KSUPT UPTUCX
20534 MUUOCX: 0
20535
20536 KSUPT 427
20537 UPT427: 0
20538
20539 KSUPT UPTUEN
20540 MUUOKN: %PSPCU,,UUOH0   ;UUO in Exec mode new PC
20541                         ;For other jobs: %PSPCU,,MUUOEX
20542 KSUPT UPTUET
20543 MUUOKT: %PSPCU,,MUUOEX  ;UUO as trap instruction in Exec mode new PC
20544
20545 KSUPT UPT1PO            ;PC saved here after one-proceed
20546 1PROPC: 0
20547
20548 KSUPT UPT1PN            ;One-proceed sets PC to this
20549 1PRNPC: %PSPCU,,ONEPRO
20550
20551 KSUPT UPTUUN
20552 MUUOCN: %PSPCU,,UUOH0   ;Normal UUO new PC
20553
20554 KSUPT UPTUUT
20555 MUUOCT: %PSPCU,,MUUOTR  ;UUO as trap instruction new PC
20556
20557 EXPUNGE KSUPT
20558
20559 ] ;KS10P
20560 \f
20561 UUOACS: BLOCK 20
20562 AC0S:   BLOCK 15        ;SWAP OUT AC S
20563 AC15S:  0
20564 AC16S:  0
20565 AC17S:  0
20566
20567 IFN KL10P,[
20568 ;KLUPT 500,     ;PAGE FAIL WORD STORAGE         ;MICROCODE MOD PUTS
20569 ;KLUPT 501,     ;PAGE FAIL OLD PC STORAGE       ; THESE LOCATIONS IN
20570 ;KLUPT 502,     ;PAGE FAIL NEW PC               ; THE EPT FOR ITS
20571 ]               ;END OF IFN KL10P
20572
20573 UUO::   ;THE FOLLOWING LOCATIONS (UP TO SUEXND) ARE SWAPPED IN & OUT OF
20574         ;UEXIT ETC. WITH THE USER 
20575 SUEXIT: JRST 2,@XUUOH   ;USER UUO EXIT INS
20576 SCLUSV: MOVEM U,AC17S   ;CLOCK U SAVE
20577
20578 IFN KA10P,[
20579 SUUOH:  0       ;C(@41) (ABSOLUTE)
20580 SUEXND::
20581
20582 SV40:   0       ;C(40) WHEN USER OUT (SEE SWITCH)
20583 ] ;KA10P
20584
20585 IFE KA10P,[
20586 SCLCXS: DATAI PAG,CLCX  ;CLOCK SAVE OF CONTEXT
20587 SUEXND::
20588 ] ;IFE KA10P
20589
20590 IFN <SUEXND-UUO>-<UEXND-UEXIT>, .ERR SUEXIT BLOCK LOST
20591
20592 IFE KA10P,[
20593 CLCX:   0       ;SAVED CONTEXT (DATAI PAG,) AT CLKBRK AND PFAIL
20594 ] ;IFE KA10P
20595
20596 IFN KL10P,[
20597 KLUPT 504,      ;EBOX COUNT
20598 EBOXCT: 0 ? 0   ;NUMBER OF EBOX TICKS (25 MHZ) OVER 2 LEFT 12. THAT EBOX
20599                 ;RAN FOR THIS USER
20600 KLUPT 506,      ;CACHE COUNT
20601 MBOXCT: 0 ? 0   ;NUMBER OF MBOX CYCLES REQUESTED BY EBOX FOR THIS USER LEFT 12.
20602
20603 EXPUNGE KLUPT
20604 ] ;KL10P
20605
20606 UTIME:  0       ;RH=CLOCK INTERVAL IN 60'THS, LH=COUNT OF TICKS SINCE READ
20607 UTRNTM: 0       ;TOTAL RUN TIME IN 4 MICROSEC UNITS
20608 USIPRQ: 0       ;# SWAPIN REQUESTS
20609 \f
20610 USWST:  0       ;SWAPPING STATUS BITS.
20611 %SW==525252(1)  ;IN THE LEFT HALF
20612 %SWDSO==400000  ;4.9 => DESIRED TO BE SWAPPED OUT (MUST BE SIGN BIT).
20613 %SWPGW==200000  ;4.8 => FLSINS IS WAITING FOR A PAGE
20614 %SWBEM==100000  ;4.7 => BEST EFFORT MADE TO SWAP OUT, DON'T LOOK AT JOB AGAIN
20615 %SWRUN==040000  ;4.6 => SWAPPED OUT WHILE RUNNABLE, SO CONSIDER MEM STATUS BEFORE REACTIVATION
20616                 ; THIS BIT IS NEVER LOOKED AT.
20617 %SWPCL==020000  ;4.5 => PAGE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
20618                 ; SO WHEN FLSINS SKIPS DON'T CLEAR IT BUT PCLSR INSTEAD.
20619 %SWINT==010000  ;4.4 => IF WAITING FOR PAGE, NEED IT TO INTERRUPT
20620 %SWPRV==004000  ;4.3 => "PRIVELEGED USER"
20621 IFN SWPWSP,[
20622 EXPUNGE %SWPRV
20623 %SWOUT==000400  ;3.9 => JOB IS SWAPPED OUT OR SWAP BLOCKED
20624 %SWSB== 000200  ;3.8 => JOB IS SWAP BLOCKED
20625 %SWLOD==000100  ;3.7 => JOB IS LOADING
20626  ;VALID STATES OF ABOVE 3 BITS: 0=SWAPPED IN, 1=LOADING, 4=SWAPPED OUT, 6=SWAP BLOCKED
20627
20628 UWRKST: 0       ;WORKING SET.  2**18 TIMES SUM(ALL THIS JOB'S PAGES) 1 OVER # SHARERS
20629                 ;INCREMENTALLY MAINTAINED WHILE JOB IS LOADING OR SWAPPED IN.
20630                 ;NOTE # SHARERS IS IN RH(MMSWP)
20631 USVWRK: 0       ;SAVES UWRKST AS OF LAST TIME SWAPPED IN
20632 USWTIM: 0       ;TIME ENTERED LOADING, SWAPPED OUT, OR SWAP BLOCKED STATE.
20633                 ;WHILE SWAPPED IN, HAS THE TIME AT WHICH IT CEASES TO BE PROTECTED
20634                 ;AGAINST MEMORY PREEMPTION.
20635 ];SWPWSP
20636 USWPRI: 0       ;JOB SWAP PRIORITY.  LOWER NUMBER MEANS MORE LIKELY TO STAY IN
20637                 ; AND MORE LIKELY TO COME IN.  SEE ALSO SWRCE, WHICH IS SIMILAR.
20638 IFE SWPWSP,     ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE PRODUCT
20639                 ;OF THE WORKING SET TIMES THE FRACTION OF CPU USED
20640                 ;WHICH IS A MEASURE OF MEMORY USE WITH INTERACTIVE JOBS GIVEN AN ADVANTAGE.
20641 IFN SWPWSP,     ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE "ADJUSTED
20642                 ;MEMORY USAGE", WHICH IS THE (LOGARITHM OF THE WORKING SET SIZE)
20643                 ;MULTIPLIED BY THE SUM OF CPU TIME AND I/O WAIT TIME.  ALSO, WHEN
20644                 ;A DISOWNED JOB IS SWAPPED OUT, USWPRI IS MULTIPLIED BY 4 TO PREVENT
20645                 ;IT FROM COMING BACK IN FOR A WHILE UNLESS THERE IS REALLY NO 
20646                 ;COMPETITION FOR MEMORY.  ALSO, WHEN A SWAPPED-OUT JOB WAKES UP FROM
20647                 ;AN I/O WAIT, USWPRI IS DIVIDED BY 2 TO GIVE INTERACTIVE JOBS AN
20648                 ;ADVANTAGE.  THE SWPWSP SYSTEM DOES NOT CURRENTLY LOOK AT SWRCE.
20649 IFE SWPWSP,[
20650 USWSCD: 0       ;SWAP SCHEDULING WORD 4.9=1 SWAPIN INHIBITED THIS JOB (SWAP BLOCKED)
20651 LTRNTM: 0       ;SAVED RUN TIME FOR PRIV USR
20652 LSIPRQ: 0       ;SAVED SWAP IN REQ FOR PRIV USER
20653 UPGSEC: 0       ;NUMBER OF PAGE FAULTS PER <NPVSEC> RUN TIME SECONDS
20654 LPRVTM: 0       ;LAST TIME PRIV USER
20655 ];SWPWSP
20656 PAGRAN: 0       ;.PAGRANGE.  1ST PG #,,LAST PG # INCLUSIVE RANGE OF PAGES TO BE PAGED AHEAD.
20657 PAGAHD: 0       ;.PAGAHEAD.  0, OR PAGE-AHEAD-DISTANCE,,PAGE-BEHIND-DISTANCE
20658
20659 TRUNTM: 0       ;IF NOT TOP LEVEL, MINUS RUNTIME (4.069 US) ALREADY SENT TO SUPERIOR
20660                 ;IF TOP LEVEL, RUNTIME USED BY SUBTREE MINUS TIME SENT TO DEMON ALREADY
20661 TSIPRQ: 0       ;DITTO FOR SWAPIN REQUESTS
20662 UTMPTR: SYSRCE  ;POINTER TO RESOURCE WORD FOR THIS LOSER (JTMU FOR TREE)
20663 JTMU:   0       ;REDUCED BY 1/16 EVERY 1/2 SEC
20664                         ;INCREMENTED BY TIME RUN IN 4 USEC
20665                         ;MAX EQV VAL 1000000/8-1/16X=0
20666                         ;EQV VAL=2X10^6
20667                         ;AMONG JOBS WITH EQUAL RESOURSE
20668                         ;LOWEST JTMU HAS HIGHEST PRIORITY
20669
20670 IOCHNM: REPEAT NIOCHN,0 ;IO CHANNEL ASSIGNMENT
20671                         ;RH INDEX INTO IOTTB AND CLSTB
20672                         ;LH DEV CHNL AND/OR OTHER
20673 SIOCHN: BLOCK LUIOP     ;MUST FOLLOW IOCHNM
20674                         ;I/O CHANNEL PDL
20675 SIOCP:  SIOCHN-1        ;POINTER INTO I/O CHANNEL PDL
20676 IOCHST: BLOCK NIOCHN    ;I/O CHANNEL STATUS FOR CH'S AT IOCHNM
20677                         ;3.1-4.9 IO STATUS
20678                         ;1.1-2.9 .ACCESS POINTER
20679 \f
20680 CORRQ:  -1      ;RQ TO CORE JOB
20681                 ;4.9=1=>NO REQUEST
20682                 ;4.8=0 OLD TYPE RQ,1.1-1.9 # BLKS,3.1-3.8=USR NUMBER RQ'ED FOR
20683                 ;4.8=1 NEW TYPE
20684                 ;4.3 ADD FRESH BLOCK (IGNORE 4.2,4.1)
20685                 ;4.1=1=> ADDING ABSOLUTE BLOCK
20686                 ;3.9=1=>REQUEST WRITE ABILITY
20687                 ;2.9=1 INSERT, =0 DELETE ONLY IGNORE 4.1-4.3
20688                 ;2.1-2.8 VIRTUAL PAGE AFFECTED
20689                 ;1.1-1.9 USER RQ IS FOR
20690
20691 APRC:   APRCHN  ;R.H. CONO TO APR WHEN USER STARTS (HAS AR OV ENABLE, ETC.)
20692                 ;4.9=1=> PROCEDURE IS IN A DISOWNED TREE
20693 BUMRTL==100000  ;4.7 => GUN TREE IF HASN'T RUN FOR AN HOUR
20694                 ;(MEANINGFUL ONLY IN TOP LEVEL JOB).
20695                 ;CLEARED BY REOWNING OR ATTACHING.
20696 BUSRCR==40000   ;4.6 CORE RQ PENDING ON THIS JOB
20697 BULGO==20000    .SEE SYSGUN ;USER IS DISABLED, WAITING TO BE FLUSHED BY SYS JOB.
20698 BCHPTR==330400,,APRC(U) ;4.1-4.4 LAST CH ON WHICH AN ERR OCCURED (SEE ERR DEV)
20699 BULGOS==400     ;AN ATTEMPT IS BEING MADE TO DELETE OR LOG OUT THIS JOB
20700                 ;SO NO-ONE ELSE SHOULD START TO. THIS BIT ALSO LOCKS OUT
20701                 ;MOST WAYS OF HACKING THE JOB (INCL. THOSE THAT SET DIELOK).
20702                 ;3.1-3.5 MUST BE ZERO
20703
20704 DIELOK: 0       ;NUMBER OF JOBS LOOKING AT OR HACKING THIS JOB.
20705                 ;BEFORE KILLING A JOB, WAIT FOR ITS DIELOK TO BECOME 0.
20706
20707 USTP:   0       ;0 RUNNABLE, (IS SET NON ZERO FOR IDLE SETS OF VARS TO SPEED SEARCH)
20708 %UST==1,,537777
20709 %USTCM==400000  ;CORE BEING SHUFFLED (SHOULD ACTUALLY BE OBSOLETE).
20710 %USTCJ==200000  ;CORE BEING GIVEN BY CORE JOB.
20711 %USTSP==100000  ;STOPPED BY SUPERIOR
20712 %USTCG==40000   ;STOPPED BY SUPERIOR TO GIVE IT CORE (CORBLK, OR .USET OF .MEMT).
20713
20714 BCSTOP==400000  ;BIT IN USTP FOR CORE MOVAGE
20715 BUCSTP==200000  ;CORE STOPPING LOSER TO GIVE MORE CORE RQSTED BY ANOTHER LOSER
20716 BUSRC==100000   ;USER CONTROL BIT, SET & CLEARED BY SUPERIOR PROCEDURE
20717 BSSTP==40000    ;SET BY SUPERIOR WHEN HACKING MEM BOUND AT URMEMT OR UMEMEX
20718 ;1.1-2.9        ;USED BY UBO AND FRIENDS INHIBITS RELOCATION BY CORE ALLOCATOR
20719                 ;MUST BE MODIFIED WITH CLKOFF  MUST NOT BE SET IF CSTOP IS SET
20720                 ;IS A COUNTER OF TRANSIENT REASONS FOR PROCEDURE BEING STOPPED
20721
20722 PIRQC:  0       ;INT REQ AWAITING SERVICE (SOFTWARE INTS EFFECTED BY SEARCH)
20723 MSKST:  0       ;INT MASK REGISTER FOR BITS IN PIRQC
20724 IFPIR:  0       ;SECOND WORD OF INTERRUPT REQUESTS
20725                 ;3.8-3.1 INF PROC INT
20726                 ;2.7-1.1 IO CHANNEL INT
20727                 ;1.1= CHANNEL 0
20728 MSKST2: 0       ;INT MASK FOR IFPIR
20729 IDF1:   0       ;DEFER BITS FOR 1ST WD INTERRUPTS.
20730 IDF2:   0       ;FOR 2ND WORD INTERRUPTS.
20731                 ;IF AN INTERRUPT IS DEFERRED, IT IS TREATED AS
20732                 ;IF THE JOB'S PICLR VAR HELD 0.
20733 PICLR:  0       ;INT IN PROGRESS FLAG, -1=>ENABLED, 0=>IN PROGRESS
20734
20735 SUPPRO: 0       ;-1 => TOP LEVEL PROCEDURE
20736                 ;OTHERWISE: INT BIT,,PNTR TO SUPERIOR PROCEDURE
20737
20738 FLSINS: 0       ;USER BLOCKING INSTRUCTION;  STATE:
20739                 ; 0 => RUNABLE (UNLESS USTP .NE. 0) 
20740                 ; OTHERWISE HUNG,  IF NO SKIP SAFE TO RESTART AT UUO (UNLESS UFINAL .NE. 0)
20741 RPCL:   0       ;0,,N  RPCLSR'ING N
20742                 ;-1,,N  BEING RPCLSR'ED BY N
20743 \f
20744 UNAME:  0       ;USER NAME
20745                 ;THIS WORD FOR EACH PROCEDURE IS COPIED FROM THE UNAME OF THE PROCEDURE
20746                 ;THAT CREATES IT (SEE USR DEV).  FOR AN INITIAL TOP LEVEL PROCEDURE IT
20747                 ;IS INITIALLY -1 BUT IS MODIFIED BY ALOGIN.  IT IS THE SAME FOR ALL
20748                 ;PROCEDURES IN A TREE.
20749 JNAME:  0       ;JOB NAME
20750                 ;EACH LOGGED IN PROCEDURE HAS A UNIQUE UNAME, JNAME PAIR.  THE JNAME
20751                 ;OF AN INITIAL TOP LEVEL JOB IS "HACTRN".  FOR OTHER JOBS IT IS THE SECOND
20752                 ;FILE NAME SPECIFIED IN THE .OPEN ON THE USR DEVICE THAT CREATES THEM.
20753 USYSNM: 0       ;USER SYSTEM NAME
20754                 ;THIS VARIABLE IS INITIALLY SET TO THE SAME VALUE AS UNAME FOR
20755                 ;A PROCEDURE.  IT CAN BE READ OR WRITTEN BY THE PROCEDURE (ASUSET)
20756                 ;OR BY ITS SUPERIOR (AUSET).  ITS ONLY USE IS AS THE DEFAULT THIRD FILE NAME ON
20757                 ;USER SHARED DEVICES (2311'S (SEE QSKO),  AND CORE
20758                 ;LINK (SEE CLOO)).
20759 USYSN1: 0       ;3RD NAME FOR QSKO, CLOO (AFTER DEFAULTING AND TRANSLATION)
20760 HSNAME: 0       ;HOME SNAME
20761
20762 IOTLSR: 0       ;4.9 IOT USER MOD (=1 ENABLES USER TO DO DIRECT I/O
20763                 ; INSTRUCTIONS) 
20764                 ;RH VIRTUAL PAGE # OF LAST MPV, WIRO OR NXI (SHIFTED TO
20765                 ; ADDRESS SIZE) 
20766 UMARPC: 0       ;PC AT MAR INTERRUPT
20767 LSWPR:  0       ;LOCKED SWITCH POINTER
20768 UCLBLK: 0       ;CLOCK QUEUE BLOCK
20769         -1
20770         JRST UREALB
20771 URTIME: 0       ;LH=0=>LOW PRIORITY PHASE 1=> LOW PRIORITY WITH BLOCKING
20772                 ;LH=-1=>HIGH PRIORITY PHASE 2=> HIGH PRIORITY WITH BLOCKING
20773                 ;RH=LENGTH OF HIGH PRIOITY IN 60'THS
20774 RTIMER: -1      ;POSITIVE => MICROSEC RUNTIME TILL RUNTIME INT
20775
20776 LSPCL:  0       ;UPC AT LAST PCLSR,,DIFFERENT UPC AT PREVIOUS PCLSR
20777 LEXFDR: 0       ;DEBUGGING INFO FOR PAGE FAULTS WHICH SIGNAL AN INTERRUPT
20778                 ; TO THE LOSER
20779                 ;LH FAULT BITS OF LAST SUCH FAULT
20780                 ;RH PC OF LAST SUCH FAULT THAT WAS FROM EXEC MODE (WENT TO
20781                 ; IOADCR)
20782                 ;PAGE FAULTS WHICH JUST SWAP IN A PAGE DON'T SET THIS.
20783 LSUUO:  0       ;LAST SYS UUO (FOR DEBUGGING PURPOSE)
20784 LSCALL: 0       ;SIXBIT NAME OF LAST .CALL 0, (FOR PEEK)
20785 CTLBTS: 0       ;CTL BITS TO .CALL 0, XORED TOGETHER IN HERE (RIGHT HALF)
20786 SYSCVL: 0       ;CONTROLS OUTPUT ARGS FROM SYSTEM .CALL
20787  %SCV==1,,525252
20788  %SCVOT==400000 ;4.9 CALL HAS OUTPUT ARGS FLAG (TO SAVE TIME)
20789  %SCVER==200000 ;4.8 CALL HAS ERROR CODE ARG FLAG
20790                 ;3.6-4.7 UNUSED 3.1-3.5 MUST BE ZERO
20791                 ;1.1-2.9 ADDRESS OF ERROR CODE ARG
20792 IOTBTS: 0       ;DEVICE-INDEPENDENT IOT CONTROL BITS GO HERE, IN IOT AND SIOT
20793 USTYN:  0       ;TTY NO OF THE STY WHICH THIS JOB KNOWS AS "STY:" (WITHOUT
20794                 ; NUMBER). 
20795 UUAC:   0       ;AC FLD OF LAST UUO OR DESIRED CHANNEL IN CASE OF NOPEN ETC
20796                 ;SELECTS CHNL FOR ALL IOTS, OPENS ETC
20797                 ;LH -1 IF STORED BY CHNDCD, ELSE ZERO (SEE WHO LINE ROUTINES)
20798 TRMNAM: 0       ;TERMINAL IDENTIFICATION
20799 TRNLST: 0       ;TRANSL LIST FOR THIS JOB. -1 => NIL, OR IDX INTO TRAN!X
20800 TRNLS1: 0       ;TRANSL LIST FOR THIS JOB & INFERS.
20801 UTRAPM::        ;SIGN BIT OF OPTIONS IS UUO-TRAP-TO-SUPERIOR MODE
20802 OPTION: 0       ;OPTIONS WORD, SETTABLE BY USER
20803                 ;EACH BIT CONTROLS SOME SYSTEM ACTION FOR THIS JOB
20804         .SEE %OP
20805 XUNAME: 0       ;"WHO I REALLY AM" AS OPPOSED TO "WHO I AM LOGGED IN AS"
20806 XJNAME: 0       ;JOB NAME USER SPEC'ED AS OPPOSED TO UNIQUIZED VERSION
20807 \f
20808 40ADDR: 20,,40  ;RH=ADDRESS OF USER'S 6-WORD BLOCK FOR UUO'S, INTS, SWITCHES, LOCKING.
20809                 ;LH=ADDRESS OF USER'S 20-WORD BLOCK FOR SUPERIOR'S USE.  0=20.
20810 IFN N11TYS,[
20811 TVCREG: -1      ;TV CONSOLE REG FOR THIS USER OF -1 NONE
20812 TVVBN:  -1      ;-1 OR CONSOLE REG FOR RUN BLINKING
20813 NVDBA:  0       ;# VIDEO BUFFERS ASSIGNED (WITH NVDBA SYSTEM CALL).
20814 ];N11TYS
20815 UWHO1:  0       ;WHOLINE FLAGS
20816 UWHO2:  0       ;TWO HALFWORDS, PRINTING CONTROLLED BY UWHO1 4.9-3.3
20817 UWHO3:  0       ;TWO MORE HALF WORDS, CONTROLLED BY UWHO1 3.2-1.5
20818 IFN KL10P,[
20819 ULSPBR: 0       ;STBR,,GCSTBR FOR SPECIAL LISP INSTRUCTIONS
20820 ]
20821 SERVER: -1      ;User index of server job who is allowed write access to
20822                 ; this job to implement some oddball protocol.  -1 if none.
20823 ;INSERT NEW USER VARIABLES HERE^
20824
20825 USRPDL: -LUPDL,,UPDL-1  ;USER PDL
20826 UPDL:   BLOCK LUPDL-1
20827 EPDL2:  0       ;SAVES C(T) FOR FLSINS
20828 QLD:    0       ;LINK DEPTH
20829 VALUE::         ;PROCEDURE "VALUE" RETURN
20830 SRN3:   0       ;SAVED N3, N4 FOR RENAMES AT AOPEN ALSO USER INDEX AT NLOAD
20831                 ;SRN3, SRN4 USED BY CORBLK .CALL
20832 .SEE IODCS2     ;SRN3 contains saved user mode PC for unlocking own locks.
20833 .SEE ALOGO4     ;NO CLOSE ROUTINE MAY USE SRN4 OR SRN5
20834 SRN4:   0       ;ALSO DEVICE CHNL IOCHNM POINTER AT NLOAD
20835 SRN5:   0       ;SAVED N5 FOR LINK ALSO VIRTUAL PAGE NUMBER AT NLOAD
20836 EPDL3:  0       ;USED BY 2311 ROUTINES (QFNG) ALSO QSMDN ADDR AT NLOAD ALSO BY TYOW2
20837 .SEE ALOGO4     ;NO CLOSE ROUTINE MAY USE EPDL
20838                 ;FOR BP-STYLE RENAME, RENMWO AND MLINK,
20839                 ;HOLDS BP (OR BP BLK PTR) TO NAMES TO RENAME OR LINK TO.
20840 EPDL:   0       ;USED BY 2311 ROUTINES.
20841                 ;FOR SOPEN AND BP-STYLE RENAME, DELETE, HOLDS BP OR BP BLOCK PTR.
20842 EPDLT1: 0       ;FN1 BEFORE LAST TRANSLATION, USED BY NLOAD
20843 EPDLT2: 0       ;FN2   "     "      "       , USED BY NLOAD
20844 EPDLT3: 0       ;SYS NAME "  "      "
20845 EPDLT4: 0       ;LEFT ADJ DEVICE NAME " " "
20846
20847 STTYOP: 0       ;IN THE TOP OF A DETACHED TREE, THIS CONTAINS THE SAVED USER TTY
20848                 ; OPTIONS.  2.9=1 IF IT IS VALID, 2.7-2.8 ARE QUERY AND REFUSE MODE,
20849                 ; THE REST ARE TTYOPT BITS.
20850
20851 IFN 0,[ ;FAKE OUT @
20852 LSWB0:
20853 ]
20854 REPEAT NULBLK,[
20855 CONC LSWB,\.RPCNT,:     BLOCK 2
20856 ]               ;SWITCH BLOCK FORMAT
20857                 ;WD1 ASSOCIATED ADDRESS OR QUANTITY
20858                 ;3.6-3.1 USER NUMBER OF SWITCH HOLDER
20859                 ;2.9-1.1 PNTR TO NEXT SWITCH ON LIST OR 0 IF NONE
20860                 ;FOR REMAINDER OF FORMAT SEE LSWDIS
20861
20862 IFN KL10P,[
20863 IFGE USRSTG+1000-., INFORM SPACE LEFT IN UPT,\1000-<.-USRSTG>
20864 IFL USRSTG+1000-., .ERR USER VARS TOO BIG FOR UPT!
20865 .ELSE LOC USRSTG+1000
20866 ] ;IFN KL10P
20867
20868 IFN KS10P, LOC <.+7>&-10        ; KS UPT must be 0 mod 8 (see UUOPCW)
20869
20870 LUBLK==.-USRSTG
20871 L==LUBLK
20872 INFORM [STORAGE PER LOSER]\LUBLK
20873         BLOCK LUBLK     ;USER VARIABLES FOR CORE JOB
20874 SYSB==<1777+.>_-10.
20875 MXC==SYSUSB-SYSB        ;AVAIL BLOCKS AFTER SYS+DDT
20876
20877 \fSUBTTL TSS INITIALIZATION
20878 ;NEXT LINE COMMENTED OUT BECAUSE IT CAUSES MORE TROUBLE THAN IT SAVES
20879 ;.HKALL==1      ;(THE FOLLOWING CODE IS WIPED OUT AT ICLR)
20880 EXEUMP=UPGMP+100        ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S PAGE TABLE
20881                         ;SYMBOL IS DEFINED HERE SINCE UPGMP WAS JUST DEFINED 6 PGS AGO
20882
20883 BEG:    SKIPN SALV      ;SEE IF LOSER FORGOT TO LOAD SALV WHEN BUILDING SYSTEM,
20884                         ;OR SALV MEM IS NXM.  EVIL!  EVIL!
20885          BUG AWFUL,[HEY!  WHERE'S THE SALVAGER?]
20886         JSR SALV+1      ;CALL NO-QUESTIONS-ASKED SALVAGER
20887 GO:     JFCL 17,.+1
20888         JRST .+1
20889         JFCL 1,[JRST 4,.]       ;SYSTEM WONT RUN ON 6
20890 IFN KL10P,[
20891         CONSO PAG,600000
20892          SWPIA                  ;IF CACHE OFF, FLUSH CRUFT THAT MAY BE IN IT
20893         CONSZ PAG,600000
20894          SWPUA                  ;IF CACHE ON, UPDATE CORE SO DDT IS GOOD
20895         CONSZ 200000
20896          JRST .-1
20897         SPCCTX 0,1,USRSTG,DISABLE       ;SET UP UPT ADDR, BUT NO ACCTING TILL
20898         MOVEI T,0                       ;MORE INIT IS DONE.
20899         XCTR XBW,[BLT T,17]             ;CLEAR BLK 1 TO AVOID RANDOM PARITY
20900                                         ; ERRORS
20901 ] ;KL10P
20902 IFN KS10P,[
20903         CONO 20700+APRCHN       ; Clear memory related APR flags
20904                                 ; (ECC, Bad, NXM)
20905         MOVSI TT,%KEHLD+%KEREF+%KEPWR
20906         IOWR TT,[KSECCS]        ; Reset memory status register.
20907         MOVEI TT,%UBTIM+%UBBAD+%UBPAR+%UBNXD+%UBINI
20908         IOWRQ TT,UBASTA         ; Reset both Unibus's and both adaptors.
20909         IOWRI TT,UBASTA
20910         MOVEI TT,DSKCHN_3       ; Set PI level for RH11.  (No, you can't do
20911         IOWRQ TT,UBASTA         ; this at the same time you reset the Unibus.)
20912         MOVEI TT,MTCCHN_3+TTYCHN        ; PI for Tape, for Chaos and TTYs.
20913         IOWRI TT,UBASTA
20914         WRHSB [HSB]             ; Set halt status block location.
20915         CLRCSH                  ; Reset cache once for good measure.
20916         SPCCTX 0,1,USRSTG       ; Set up UPT and AC blocks.
20917 ] ;KS10P
20918 IFN TEN11P,[
20919         MOVEI TT,600000+<T11CPA_-10.>
20920         SKIPGE TEN11F
20921          MOVEI TT,0
20922         DPB TT,[.T11CP+EXEUMP]
20923         SETOM T11MP+<T11CPA&777777>_-10.        ;DONT USE MAP PAGE AS 10-11 PAGE
20924 ;IFN PDP6P,[            ;THESE ARE IN SEPARATE MOBIES NOW
20925 ;       MOVE TT,[-LPDP6M,,<PDP6BM&777777>_-10.]
20926 ;       SETOM T11MP(TT) ;CONFLICTS WITH PDP-6 MEM
20927 ;       AOBJN TT,.-1
20928 ;]
20929 ;IFG TSYSM-256.,[
20930 ;       MOVSI TT,-TSYSM+256.
20931 ;       SETOM T11MP(TT) ;CONFLICT PAGES
20932 ;       AOBJN TT,.-1
20933 ;]
20934 ]
20935         MOVE P,SYSPDP
20936
20937 ;INIT THE EXEC PAGE MAP'S DDT PAGES.
20938         HRRZ A,DDT-2    ;LOWEST ADDR IN SYMBOL TABLE
20939         SUBI A,100      ;LEAVE ROOM FOR EXTRA SYMS, 340 ROUTINES' LOSSAGE, ETC.
20940         LSH A,-10.      ;GET PAGE SYMTAB STARTS IN
20941         MOVEM A,FDDTPG
20942         MOVEI Q,NQS-1   ;PUT THE TUTS JUST BELOW THE DDT PAGES
20943 BEGTT1: SKIPE QACT(Q)
20944          JRST BEGTT3    ;UNIT NOT IN USE
20945         MOVE T,NTBL(Q)  ;NUMBER OF PAGES IN THIS TUT
20946 BEGTT2: SUBI A,1
20947         MOVE B,[MU23TT_<.TZ .BM <MUR>>]
20948         MOVEM B,MEMBLT(A)
20949         DPB Q,[MNUMB,,MEMBLT(A)]
20950         SOJG T,BEGTT2
20951         MOVE B,A
20952         LSH B,10.
20953         HRLI B,640000
20954         MOVEM B,QTUTO(Q)
20955 BEGTT3: SOJGE Q,BEGTT1
20956         MOVEM A,FTUTPG
20957         ;NOW MAKE SURE ALL THOSE PAGES ARE MAPPED
20958         MOVEI B,-200(A)         ;ASSUMING TSYSM AT LEAST 128K
20959         LSH B,-1                ;GET A B.P. TO IDPB MAP HWD OF 1ST DDT PAGE
20960         ADD B,[442200,,EXEUMP]
20961         TRNE A,1
20962          IBP B
20963         MOVEI C,600000+PMCSHM(A) ;COMPUTE CONTENTS OF THAT MAP WORD.
20964         MOVE D,[MUDDT_<.TZ .BM <MUR>>]
20965 BEG3:   CAML A,FDDTPG
20966          MOVEM D,MEMBLT(A)
20967 IFG TSYSM-128., IDPB C,B
20968         AOS C
20969 IFG TSYSM-400,  CAIE A,400
20970 .ELSE           CAIE A,TSYSM    ;STORE THAT MAP WORD AND ALL REST THERE ARE.
20971          AOJA A,BEG3
20972
20973 ;INITIALIZE REST OF EXEC PAGE MAP
20974 IFN DIRMAP,[
20975         MOVE Q,[222200,,EXEUMP]
20976         SETZB A,B
20977         SKIPE USEMDM            ;MAKE MEDIUM MEM NXM IF DIRMAP NOT TURNED ON
20978          MOVEI B,600200+PMCSHM  ;THIS MAY BE USEFUL FOR DEBUGGING
20979         MOVE T,FTUTPG
20980         SUBI T,201              ;STOP AT 1ST TUT PAGE.
20981 BEG2:   CAIL A,NEXPGS
20982          DPB B,Q
20983         IBP Q
20984         ADDI B,1
20985         CAMGE A,T
20986          AOJA A,BEG2
20987 ];END IFN DIRMAP
20988 ;DROPS THROUGH
20989 \f;DROPS IN
20990
20991 ;SET UP EXEC LOWER MAP (EVEN ON KA, WILL BE LOOKED AT BY .CALL CORBLK)
20992         MOVE A,[600000,,600001+PMCSHM]  ;PAGE 0 IS NOT CACHED   
20993         MOVSI B,-100
20994          MOVEM A,EXELMP(B)
20995          TLO A,PMCSHM
20996          ADD A,[2,,2]
20997          AOBJN B,.-3
20998
20999 ;SET UP SYS JOB'S CIRCULAR POINTERS SO ALL THE PAGES IT HAS ARE ABSOLUTE
21000
21001         MOVE A,[442200,,UPGMP]
21002         MOVE B,[442200,,UPGCP]
21003         MOVEI D,0
21004 BEG6:   ILDB T,A
21005         MOVEI E,-1
21006         JUMPN T,BEG7
21007         CAIL D,200+MMP0 ;ALLOW USERS TO COPY MMP EXEC PGS
21008          CAILE D,200+NEXPGS
21009           MOVEI E,0     ;PG IT DOESN'T HAVE, AND NOT COPYABLE EXEC PG
21010 BEG7:   IDPB E,B
21011         CAIGE D,377
21012          AOJA D,BEG6
21013
21014 ;EXEC MAP PREPARED, NOW TURN ON PAGING
21015
21016 IFN KA10P,[
21017         LPMR UPGML
21018         CONO 633550
21019 ] ;KA10P
21020 IFN KS10P,[
21021         CONO 67760      ; Disable and Clear all flags
21022         CONO 127660     ; Enable and Clear all flags except memory ECC
21023         APRID A
21024         TLNN A,%UCITS
21025          BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21026         LDBR3 EXEUMP            ; Load exec DBRs.
21027         LDBR4 EXELMP
21028         LPMR UPGML
21029         SPCCTX 1,1,USRSTG       ; Select AC blocks and set UBR.
21030         WREBR 020000+<EPT/1000> ; Paging on and set EBR.
21031 ] ;KS10P
21032 IFN KL10P,[
21033         CONO 327740     ;ENABLE AND CLEAR ALL FLAGS EXCEPT SWEEP DONE
21034         APRID A
21035         TLNN A,%UCITS
21036          BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21037         SPCCTX 6,6      ;LOAD MICROCODE CONSTANTS NEEDED BY PAGEING INTO
21038                         ; BLOCK 6.
21039         MOVEI 3,EXEUMP  ;DBR3
21040         MOVEI 4,EXELMP  ;DBR4
21041         MOVSI 5,PMAGEM  ;LH.AGE
21042         MOVEI 6,PMAGEM  ;RH.AGE
21043         MOVEI 7,1000    ;CN1000
21044         MOVEI 10,100    ;CN100
21045         CONO PAG,660000+<EPT/1000>      ;CACHE ON, ITS PAGER, TRAP ENB, EPT ADDR
21046         SPCCTX 1,1,USRSTG,DISABLE
21047         LPMR UPGML
21048 ]               ;END IFN KL10P
21049         MOVE P,SYSPDP
21050
21051 ;INITIALIZE FREE LISTS IN MEMBLT
21052
21053         MOVEI A,1       ;A PG NO - NOTE: DON'T DO PAGE ZERO
21054 BEGF0:  CAML A,FTUTPG   ;IF THIS ISN'T A DDT OR TUT PAGE, THEN
21055         CAIL A,400
21056          PUSHJ P,CIMEMR ;PUT THIS PAGE ON THE RIGHT FREE LIST
21057         CAIGE A,TSYSM-1
21058          AOJA A,BEGF0
21059 IFN TEN11P,[
21060         SKIPGE TEN11F
21061          JRST BEG4
21062         MOVSI A,-256.   ;CLEAR THE INTERFACE'S "VALID" BITS.
21063         SETZM 400000+T11CP*2000(A)
21064         AOBJN A,.-1
21065 BEG4:]
21066 IFN XGP,[
21067         SKIPE TEN11F
21068          JRST BEGX1
21069         MOVE A,[600000+<XGP11_8>,,1777]
21070         PUSHJ P,T11AD
21071          BUG            ;NO 10-11 PAGES AVAILABLE?
21072         MOVEI TT,600000+<<T11CPA_-18.>_8>(B)    ;GET CORRESP EXEC MAP PG SETUP
21073         DPB TT,[.XGPC+EXEUMP]
21074         MOVEI TT,600000+<<T11CPA_-18.>_8>+XGPTP
21075         DPB TT,[.XGPB+EXEUMP]   ;SETUP PAGE FOR PDP-11 BUFFER
21076 BEGX1:]
21077 \f
21078 ;CHECK AVAIL MEM FOR EXISTANCE
21079
21080 IFN ECCMEM,[
21081         LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21082         IORI TT,200000          ;GRANT READ ACCESS
21083         DPB TT,[.ECCPG+EXEUMP]
21084         LPMR UPGML
21085         MOVE A,400000+ECCPG*2000+1760   ;GET CURRENT HISTORY POINTER
21086         LSH A,-32.
21087         MOVEM A,ECCIDX
21088 ];ECCMEM
21089         MOVEI A,TSYSM-1
21090 CKML:   MOVEI TT,600000(A)
21091         DPB TT,[.PAREP+EXEUMP]
21092         LPMR UPGML
21093 IFN ECCMEM,[
21094         LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21095         CAMN A,TT               ;THIS PAGE?
21096          JRST CKML1A            ;YES, TREAT AS IF OFFLINE, THOUGH WILL ACCESS IT
21097                                 ; DIRECTLY FROM TIME TO TIME
21098 ]
21099         MOVE TT,A
21100         LSH TT,10.
21101         MOVSI T,-8
21102         CAML TT,MEMLZL(T)
21103          CAML TT,MEMLZH(T)
21104           AOBJN T,.-2
21105         JUMPL T,CKML1A          ;THIS BLOCK KNOWN TO BE LOSING
21106         SKIPL USEHM
21107          CAIGE A,256.
21108           JRST .+2
21109            JRST CKML1A          ;HIGH MOBY NOT TO BE USED
21110 IFN KL10P,[
21111         MOVEI TT,CKML1          ;KL10 CAN GET PARITY FAULT ON REFERENCE TO NXM
21112         MOVEM TT,PFNPC
21113         HRRM TT,MUUOKN          ;IT CAN ALSO GET A UUO
21114 ] ;KL10P
21115 IFN KS10P,[
21116         MOVEI TT,CKML1
21117         MOVEM TT,EPTPFN
21118 ] ;KS10P
21119         CAIL A,256.             ;IF NOT IN BOTTOM 256K, DON'T ASSUME GOOD DATA
21120          SETZM 400000+PAREP*2000+20     ;STORE ZERO SO DON'T GET PARITY ERROR
21121         MOVE 0,400000+PAREP*2000+20     ;IF THIS NXMS, MEM THE SYS THINKS
21122                                         ; IT HAS IS NON EXISTANT
21123 IFN KA10P,[
21124         CONSZ 10000
21125          JRST CKML1             ;THAT MEM NXM
21126 ] ;KA10P
21127 IFN KL10P,[
21128         MOVEI TT,PFAIL
21129         MOVEM TT,PFNPC
21130         MOVEI TT,UUOH0
21131         HRRM TT,MUUOKN
21132         CONSZ 2000
21133          JRST CKML1             ;THAT MEM NXM
21134 ] ;KL10P
21135 IFN KS10P,[
21136         MOVEI TT,PFAIL
21137         MOVEM TT,EPTPFN
21138         CONSZ 400
21139          JRST 4,.       ; This can't happen, right?  (If we got a NXM, we
21140                         ; would have trapped to CKML1 already.)
21141 ] ;KS10P
21142         SKIPL CKMBLK    ;WINS
21143          JRST CKML6     ;THUS ENDING BLOCK OF LOSERS
21144 CKML2:  SOJGE A,CKML
21145         AOSN CKMFLG     ;ANY MEM OFF UNEXPECTEDLY?
21146          JRST CKML5     ;NO
21147         MOVEI TT,[ASCIZ/
21148 IS THIS OK? /]          ;YES, MAKE SURE SOMEBODY KNOWS ABOUT IT.  MAY BE SERIOUS SCREW.
21149         PUSHJ P,T00ASZ
21150         PUSHJ P,T00TYI
21151         ANDI A,137
21152         CAIE A,"Y
21153          JRST DDT
21154         MOVEI TT,[ASCIZ/
21155 /]
21156         PUSHJ P,T00ASZ  ;CRLF
21157 CKML5:
21158 IFN KL10P,[
21159         CONO 26400      ;CLEAR ANY NXM AND PARITY INTERRUPTS
21160         CONI MTS,TT
21161         TLNN TT,400
21162          BUG PAUSE,[TAPE DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21163         CONI DSK,TT
21164         TLNN TT,4000
21165          BUG PAUSE,[DISK DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21166 ] ;KL10P
21167 IFN KS10P, CONO 20400           ; Clear NXM flag
21168 ;DROPS THROUGH
21169 \f;DROPS IN
21170
21171 IFN RP10P,[
21172         DATAI DPC,A
21173         TLNN A,NOWRIH           ;CHECK FOR FORMAT SWITCH ON RP10
21174          BUG PAUSE,[RP-10 WRITE HEADERS ENABLED, PLEASE FLIP THE SWITCH]
21175 ];RP10P
21176
21177 IFE <MCOND MLKA,>&<MCOND DM,>,[ ;CHECK FOR LOSING SWITCHES ON MEMORY ON ML-KA AND DM
21178
21179         MOVSI D,(DWRITC)        ;MAKE COMMAND FOR VERY LAST BLOCK ON DISK
21180         MOVEI A,NCYLS+XCYLS-1
21181         DATAO DPC,[DNOOPC]      ;DETERMINE TYPE OF DRIVE 0
21182         DATAI DPC,B
21183         TRNE B,RP03BT
21184          MOVEI A,MCYLS+XCYLS-1  ;RP03
21185         DPB A,[DCYL D]
21186         LSH A,-8
21187         DPB A,[DCYLXB D]
21188         MOVEI A,NHEDS-1
21189         DPB A,[DSURF D]
21190         ADDI D,QICWA
21191         MOVEM D,CKMSWC
21192         SUB D,[DWRITC-DREADC]
21193         MOVEM D,CKMSRC
21194         SUB D,[DREADC-DSEEKC]
21195         MOVEM D,CKMSSC
21196         MOVEI A,0
21197 CKMS1:  LDB TT,[MUR,,MEMBLT(A)] ;MEM EXIST?
21198         CAIE TT,MUFR            ;AND NOT DDT?
21199          JRST CKMS2
21200         MOVEI B,600000(A)
21201         DPB B,[.PAREP+EXEUMP]
21202         LPMR UPGML
21203         CAIGE A,CKMSZZ          ;MEM LOADED?
21204          JRST CKMS3             ;YES
21205         MOVSI B,'FOO            ;NO, LOAD IT
21206         MOVEM B,CKMSBF
21207         MOVE B,[CKMSBF,,CKMSBF+1]
21208         BLT B,CKMSBF+177
21209         MOVEI B,'BAR
21210         HRRM B,CKMSBF+69.
21211         HRRM A,CKMSBF+6         ;MAKE DIFF FROM OTHER SUCH PAGES
21212         MOVEI C,1
21213         MOVE B,A
21214         LSH B,-4                ;16K BLOCK # IN B
21215         LSH C,(B)               ;GET UNIQUE BIT SO PARITY ERR IF TWO AT SAME ADDR
21216         MOVEM C,CKMSBF+35
21217         MOVE B,[CKMSBF,,400000+PAREP*2000]
21218         BLT B,400000+PAREP*2000+177
21219 CKMS3:  MOVE B,A                ;MAKE IOWD
21220         LSH B,10.
21221         SOS B
21222         HRLI B,-200
21223         LDB C,[100300,,A]       ;MA 15-17
21224         TRC C,7
21225         DPB C,[410300,,B]
21226         MOVEM B,QICWA
21227         SETZM QICWA+1
21228         CONO DPC,175700
21229         DATAO DPC,CKMSSC        ;POSITION HEADS
21230         CONSO DPC,10
21231          JRST .-1
21232         DATAO DPC,CKMSWC        ;WRITE OUT SECTOR
21233         CONSZ DPC,20
21234          JRST .-1
21235         CONI DPC,B
21236         TLNE B,17
21237          JRST CKMS4             ;CHANNEL ERROR MEM LOSING
21238         TRNE B,177700
21239          JRST CKMS2             ;FOO, DISK LOSING
21240         MOVE B,[-200,,CKMSBF-1] ;READ IT BACK   
21241         MOVEM B,QICWA
21242         SETZM QICWA+1
21243         SETZM CKMSBF+69.
21244         CONO DPC,175700
21245         DATAO DPC,CKMSRC
21246         CONSZ DPC,20
21247          JRST .-1
21248         CONI DPC,B
21249         TLNE B,17
21250          JRST CKMS2             ;MEM LOSS IN CKMSBF?
21251         TRNE B,177700
21252          JRST CKMS2             ;FOO, DISK LOSING
21253         MOVSI B,-200            ;COMPARE
21254         MOVE C,CKMSBF(B)
21255         CAME C,400000+PAREP*2000(B)
21256          JRST CKMS4             ;NOT SAME SWITCHES LOSING
21257         AOBJN B,.-3
21258 CKMS2:
21259 IFE MCOND DM,   ADDI A,16.      ;MA10'S !!
21260 IFE MCOND MLKA, ADDI A,32.      ;ML-KA MEM IS IN 32K MODULES
21261         CAIGE A,TSYSM
21262          JRST CKMS1
21263         CONO DPC,175700         ;RESET THE DISK CONTROL
21264         DATAO DPC,[DEASEC+776]  ;AT EASE!
21265         CONO PI,20000           ;TURN OFF IOB PI REQ LIGHT
21266         JRST CKMSX              ;DONE WITH THIS, CONTINUE INITIALIZATION
21267
21268 CKMSBF: BLOCK 200
21269
21270 CKMS4:  MOVEI TT,[ASCIZ/MEM ADDR SWITCHES DISAGREE CPU VS DSK AT LOC /]
21271         PUSHJ P,T00ASZ
21272         PUSHJ P,T00BKO
21273         MOVEI TT,[ASCIZ/0000/]
21274         PUSHJ P,T00ASZ
21275         JRST DDT
21276
21277 CKMSZZ==./2000+2                ;ABOVE HIGHEST CODE
21278
21279 CKMSX:
21280 ]               ;END IFE MCOND MLKA & DM
21281 \f;DROPS IN
21282         MOVEI TT,0
21283         DPB TT,[.PAREP+EXEUMP]
21284         LPMR UPGML
21285 IFN KA10P,      CONO PI,240000+11577+IFN C1MXP,20000
21286 IFE KA10P,      CONO PI,11577
21287 IFN NOTYS,      CONO TTY,TTYCHN
21288 IFN NETYS,[
21289                 SETOM DTEODN            ;CAN GET SET ON WHILE LOADING, BUT INTR GETS LOST
21290 IFE PDCLKP,     CONO DTE,1170+APRCHN    ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21291 IFN PDCLKP,     CONO DTE,1170+TTYCHN    ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21292 ]               ;END OF IFN NETYS
21293 IFN E.SP,[
21294         CONO DIS,515330 ;RESET E&S
21295         MOVEI TT,E.SPM
21296         MOVEM TT,34     ;SET PAGER LOC (USED BY DSKDUMP)
21297 ]
21298 IFN TM10B,[
21299         MOVEI TT,MIOWD
21300         MOVEM TT,MICWA  ;SETUP LOC FOR MEM CHAN TAPE
21301 ]
21302 IFN RP10P+RH10P,[
21303         MOVEI TT,QIOWD
21304         MOVEM TT,QICWA  ;SETUP FOR DEC DISK CHANNEL
21305 ]
21306 IFN ARMP,       DATAO 760,[0]   ;RESET LITE ON ARM
21307 IFN DSDP,       CONO DSDEV,10   ;RESET INT RQ FROM PDP10
21308 IFN RBTCP,      CONO RBTCON,0   ;RESET TABLET
21309
21310         MOVE A,DDT-2    ;PUT GLOBAL BLOCK HEADER AT BEGINNING
21311         MOVE B,[SQUOZE 0,GLOBAL]
21312         CAME B,(A)      ;SEARCH FOR GLOBAL BLOCKS
21313         AOBJN A,[       AOBJN A,.-1
21314                         JRST BEGS1]
21315         MOVE C,DDT-2
21316         MOVEI D,(C)
21317         SUBI D,(A)      ;GET ,,-#WDS  BEFORE GLOBAL BLOCK
21318         MOVSI D,(D)
21319         ADDM D,1(A)     ;GLOBAL BLOCK NOW LARGER
21320         EXCH B,(C)      ;EXCHANGE IT WITH FIRST SYM
21321         MOVEM B,(A)
21322         MOVE B,1(A)
21323         EXCH B,1(C)
21324         MOVEM B,1(A)
21325 BEGS1:  PUSHJ P,SBUBL
21326         JUMPL J,BEGS1   ;KEEP SORTING UNTIL SYMS IN ORDER
21327         MOVSI A,400000
21328         IORM A,DDT-1
21329
21330 ; SORT THE UUO/SUSET/BIT SYMBOL TABLE BY VALUE
21331
21332         MOVE E,[SYSYMB-SYSYME-1,,SYSYMB]
21333         PUSHJ P,SBUBL0
21334         JUMPL J,.-2
21335
21336         MOVE A,[-LTSTB,,TSTB]
21337 BEG1:   MOVE B,(A)
21338         MOVEI C,(B)
21339         EQV C,(B)
21340         AOBJN B,.-1
21341         MOVEM C,CKSUMS-TSTB(A)
21342         MOVE B,(A)
21343 CKXC2:  MOVE C,(B)
21344 REPEAT 36.,[
21345         IFL .RPCNT-18., TLNE C,400000_<-.RPCNT>
21346         .ELSE           TRNE C,400000_<18.-.RPCNT>
21347         XORM B,CKXORS+.RPCNT
21348 ]
21349         AOBJN B,CKXC2
21350         AOBJN A,BEG1
21351         HRRZS 37                ;MAKE SURE SYS DOESNT IMMEDIATELY COME DOWN
21352 ;DROPS THROUGH
21353 \f;DROPS IN
21354         MOVEI A,0
21355         CLEARM QACTB
21356 QSETUP: MOVE B,DCHBT(A)
21357         SKIPN QACT(A)
21358         IORM B,QACTB
21359         CAIGE A,NQS-1
21360         AOJA A,QSETUP
21361 IFN DC10P,      CONO DC0,DCCSET+DCDENB+DSKCHN   ;RESET 2314 AND SET DATA ERROR ENABL
21362 IFN 340P,       CONO DIS,100
21363 IFN TK10P,      CONO NTY,TTYCHN
21364 IFN MTYP,       CONO MTY,TTYCHN
21365         CLEARM USRHI
21366         CLEARB U,USER
21367         MOVE P,SYSPDP
21368 IFN DPKPP,[
21369         CONO DPK,400070+TTYCHN  ;INITIALIZE DP KLUDGE
21370         DATAO DPK,[4,,DPKBAS]
21371         MOVE T,[-NDPTYS,,NFDPTY]
21372         MOVEI B,0       ;LINE #
21373 DPIL:   LDB A,[$TTOSP,,TTYTYP(T)]       ;OUTPUT SPEED
21374         MOVE A,DPSP(A)          ;MAP TO DPK SPEED CODE
21375         DPB B,[140400,,A]       ;LINE #
21376         CONO DPK,500+TTYCHN(A)  ;LOAD OUT SPEED
21377         LDB A,[$TTISP,,TTYTYP(T)]       ;INPUT SPEED
21378         MOVE A,DPSP(A)          ;MAP TO DPK SPEED CODE
21379         DPB B,[140400,,A]
21380         CONO DPK,700+TTYCHN(A)  ;LOAD IN SPEED
21381         AOS B
21382         AOBJN T,DPIL
21383 ]
21384 IFN DZ11P,[
21385         PUSHJ P,DZINIT
21386 ];DZ11P
21387 IFN N11TYS,[
21388         SKIPE TEN11F
21389          JRST BEG5
21390         MOVSI R,-NTTPG-NTVBP+1
21391         MOVE T,[.TTPG0+EXEUMP]
21392 BEG9:   MOVEI A,(R)     ;SET UP 1 MORE TEN-11 MAP ENTRY
21393         LSH A,20.
21394         IORI A,1777     ;A FULL PAGE
21395         TLO A,600000+TT11NM*400
21396         PUSHJ P,T11AD
21397          BUG
21398         ADDI B,600000+<<T11CPA_-18.>_8>         ;READ-WRITE, IN HIGH MOBY.
21399         DPB B,T
21400         IBP T
21401         AOBJN R,BEG9
21402         MOVE A,[(600000+TT11NM*400)TT11CR_8]    ;POINTER TO CONSOLE REG
21403         PUSHJ P,T11AD
21404          BUG
21405         ADDI B,600000+<<T11CPA_-18.>_8>
21406         DPB B,T
21407         LPMR UPGML
21408         SKIPE TT11P     ;IF WE'RE SUPPOSED TO USE THE TV 11,
21409          SETZM TT11UP   ;REQUEST IT TO RE-INIT.
21410                 ;IF TT11UP BECOMES NONZERO, THE 11 IS UP.
21411 BEG5:   ];END IFN N11TYS
21412 IFN CH11P,[
21413         XCTRI [IORDI A,CAIMYN]
21414          CAIA
21415           BUG HALT,[CHAOSNET INTERFACE NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS)]
21416 ] ;CH11P
21417 IFN CHAOSP,[ IFN T11CHP,[
21418         SKIPE TEN11F    ;SET UP TEN-11 CHAOS NET INTERFACE PAGE
21419          JRST BEG8
21420         MOVE A,[(600000+CH11NM*400)1004_8+1777]
21421         PUSHJ P,T11AD
21422          BUG
21423         ADDI B,600000+<<T11CPA_-18.>_8>
21424         DPB B,[.CHSPG+EXEUMP]
21425 BEG8:   ]] ;CHAOSP, T11CHP
21426 IFN DL10P,[             ;INITIALIZE DL10
21427         CONO DLC,400000 ;MR CLR
21428         CONO DLB,1      ;TURN OFF EXCESS LIGHTS
21429         CONO DLB,2      ;..
21430         CONO DLB,3      ;..
21431         CONO DLB,DL10AR ;64 WORDS FOR PDP11 #0 AT DL10AR
21432         DATAO DLC,[200001,,]    ;KA INTERRUPT MODE
21433         SKIPE DL10F
21434          CONO DLC,100020+TTYCHN ;ENB PDP11 PORT #0 AND ENB INTR
21435         MOVSI T,1
21436         SKIPN DL10UP
21437          SOJG T,.-1
21438         SKIPGE T        ;IF THE 11 DIDN'T SAY IT WAS UP,
21439          SETZM DL10F    ;MARK IT NON-FUNCTIONAL.
21440 ]
21441 IFN KL10P,[
21442         CONO TIM,460000+3900.   ;SET INTERVAL TIMER TO 39 MILLISECONDS FOR OVHMTR
21443         CONO MTR,433001 ;TIME BASE ON, ACCOUNT FOR USER + EXEC NO PI, INTERVAL PIA=1
21444         PUSHJ P,PRFOFF  ;INIT PERFORMANCE COUNTER
21445 ] ;KL10P
21446 \f
21447 ;DROPS IN
21448         MOVSI T,%TBNOT+%TBDTY+%TBNVR    ;SYS JOB HAS NO CONSOLE ALL TO ITSELF
21449         MOVEI U,LUBLK
21450         PUSHJ P,USSINI  ;INITIALIZE SYS JOB VARIABLES BLOCK
21451          JRST .-1
21452         AOS NMPGS
21453 IFE KA10P,[
21454         MOVEI T,UUOH0   ;CLOBBERED BY USSINI
21455         HRRM T,MUUOKN
21456 ] ;IFE KA10P
21457         MOVSI T,600000
21458         HLLM T,UPGMP    ;GIVE PG 0 TO SYS JOB
21459         MOVSI T,-1
21460         HLLM T,UPGCP
21461         MOVEI T,2000
21462         MOVEM T,HUSRAD
21463         MOVEI T,SYSRCE  ;SET SYS JOB RESOURCE POINTER
21464         MOVEM T,UTMPTR
21465         MOVSI A,(SIXBIT /SYS/)  ;""" NAMES
21466         MOVEM A,USYSNM(U)
21467         MOVEM A,UNAME(U)
21468         MOVEM A,XUNAME(U)
21469         MOVEM A,JNAME(U)
21470         MOVEM A,XJNAME(U)
21471         SETZM USTP(U)
21472         MOVSI T,%TBNOT+%TBDTY+%TBNVR    ;CORE JOB HAS NO CONSOLE
21473         MOVEI U,2*LUBLK
21474         PUSHJ P,USSINI  ;SET UP CORE JOB VARIABLES BLOCK
21475          JRST .-1
21476         MOVE A,[SIXBIT /CORE/]
21477         MOVEM A,USYSNM(U)
21478         MOVEM A,UNAME(U)
21479         MOVEM A,XUNAME(U)
21480         MOVSI A,(SIXBIT /JOB/)
21481         MOVEM A,JNAME(U)
21482         MOVEM A,XJNAME(U)
21483         MOVEI T,SYSRCE
21484         MOVEM T,UTMPTR+LUBLK
21485         SETZM USTP(U)
21486         MOVEI A,CORJI
21487 IFE KA10P, HRLI A,%PSPCU        ;DOES CORE JOB XCTR?
21488         MOVEM A,UPC(U)
21489 IFE KA10P,[
21490         MOVE T,[JSR ILLTRP]     ;SYS AND CORE JOBS SHOULDN'T TRAP
21491         MOVEM T,TR1INS          ;THESE WON'T BE USED ANYWAY UNLESS
21492         MOVEM T,TR2INS          ;SOMEDAY THEY SHOULD RUN IN USED MODE
21493         MOVEM T,TR3INS
21494         MOVEM T,TR1INS+L
21495         MOVEM T,TR2INS+L
21496         MOVEM T,TR3INS+L
21497 ] ;IFE KA10P
21498         MOVEI A,SYSB+2          ;GIVE SYSTEM CORE TO SYS JOB, WITH A COUPLE
21499         MOVEM A,CORRQ           ; SPARE JOB SLOTS
21500         AOS NCORRQ
21501         SOS A
21502         ADDM A,NCBCOM
21503 ;       DATAI CLK1,LCLK1
21504         CONO PI,100+UTCON-1     ;ALL EXCEPT 7
21505 IFN KA10P, CONO 3000+APRCHN
21506 IFN KL10P,[
21507 IFN PDCLKP, CONO CLK,APRCHN
21508 .ELSE [ MOVEI A,%DTCLN  ;TURN ON 60-CYCLE CLOCK
21509         MOVEM A,DTECMD
21510         SETZM DTEFLG
21511         CONO DTE,%DBL11
21512         SKIPN DTEFLG
21513          JRST .-1
21514 ]
21515         CONO APRCHN     ;ENABLE APR FAULT INTERRUPTS
21516         SWPUA           ;UPDATE MEMORY AGAIN TO MAKE SURE DDT + SYMBOL
21517                         ; TABLE OUT OF CACHE
21518         CONSZ 200000
21519          JRST .-1
21520 ] ;KL10P
21521 IFN KS10P,[
21522         WRINT [KSFREQ]          ; 60 cycle clock.
21523         CONO APRCHN             ; Enable APR faults and clock ints.
21524         CLRCSH                  ; Is this necessary?  What the heck...
21525 ] ;KS10P
21526 IFN CH10P,[
21527         CONI CHX,T              ;CHECK CHAOS ADDRESS SWITCHES
21528         LDB T,[$CHXAD,,T]
21529         CAIE T,MYCHAD
21530          JRST [ MOVEI TT,[ASCIZ/CHAOSNET ADDRESS SWITCHES ARE SET WRONG/]
21531                 PUSHJ P,T00ASZ
21532                 JRST DDT ]
21533         CONO CHX,@CHXCNO        ;ENABLE INTERRUPTS
21534 ];CH10P
21535         JRST ICLR
21536 \f
21537 CKML1:                  ;MEM NON-EXISTANT PATCH OUT
21538 IFN KA10P, CONO 10000   ;TURN OFF NXM FLAG
21539 IFN KL10P,[
21540         CONO 22000
21541         MOVEI TT,PFAIL
21542         MOVEM TT,PFNPC
21543         MOVEI TT,UUOH0
21544         HRRM TT,MUUOKN
21545 ] ;KL10P
21546 IFN KS10P,[
21547         CONO 20400
21548         MOVEI TT,PFAIL
21549         MOVEM TT,EPTPFN
21550 ] ;KS10P
21551         SKIPGE CKMBLK
21552          MOVEM A,CKMBLK ;HIGHEST IN BLOCK OF LOSERS
21553 CKML1A: LDB TT,[MUR,,MEMBLT(A)]
21554         CAIE TT,MUFR
21555          BUG            ;?
21556         CAIG A,SYSB+1
21557          JRST 4,.       ;SYS MEM NON EX? (BUG PROBABLY WON'T WORK)
21558         PUSHJ P,MPOUT2  ;FLUSH THAT BLOCK
21559         MOVEI TT,MUHOLE
21560         DPB TT,[MUR,,MEMBLT(A)]
21561         CAIL A,400      ;IF NXM IN LOW MOBY
21562          JRST CKML2
21563         MOVEI U,0
21564         PUSHJ P,UPLC
21565         LDB TT,T
21566         ANDI TT,PMRCM
21567         CAIE TT,(A)
21568          JRST CKML2
21569         DPB U,T         ;PATCH THIS BLOCK OUT OF EXEC MAP
21570         DPB U,Q
21571         JRST CKML2
21572
21573 ; REPORT A BLOCK OF LOSING MEMORY
21574
21575 CKML6:  PUSH P,A
21576         MOVEI TT,[ASCIZ/MEM OFF /]
21577         AOSN CKMFLG
21578          PUSHJ P,T00ASZ
21579         ADDI A,1        ;LOWEST LOSER = HIGHEST WINNER + 1 PAGE
21580         PUSHJ P,T00BKO
21581         MOVEI A,"-
21582         PUSHJ P,T00TYO
21583         MOVE A,CKMBLK
21584         PUSHJ P,T00BKO
21585         MOVEI A,40
21586         PUSHJ P,T00TYO
21587         SETOM CKMBLK
21588         POP P,A
21589         JRST CKML2
21590
21591 USEHM:  -1      ;-1 => USE MEM IN HIGH MOBY (IF PRESET)
21592
21593 CKMBLK: -1      ;IF + HIGHEST LOSING BLOCK IN CONTIG RANGE
21594 CKMFLG: -1      ;IF + PRINTED MESSAGE ALREADY
21595 CKMSWC: 0       ;WRITE CMD
21596 CKMSRC: 0       ;READ CMD.
21597 CKMSSC: 0       ;SEEK CMD.
21598 ;UP TO 8 RANGES OF ADDRESSES THAT SHOULD NOT BE USED BECAUSE THEY
21599 ;DON'T WORK BUT AREN'T NXM.
21600 MEMLZL: BLOCK 8 ;LOWEST LOC
21601 MEMLZH: BLOCK 8 ;HIGHEST LOC+1
21602 FTUTPG: 0       ;FIRST PAGE USED FOR TUTS
21603 \f
21604 ;INPUT CHAR FROM CONSOLE TTY AND ECHO
21605
21606 T00TYI:
21607 IFN KA10P,[
21608         CONSO TTY,40
21609          JRST .-1
21610         DATAI TTY,A
21611         ANDI A,177
21612 ] ;KA10P
21613 IFN KL10P,[
21614         SETZM DTEFLG
21615         MOVEI A,%DTTYI
21616         MOVEM A,DTECMD
21617         CONO DTE,%DBL11
21618         SKIPN DTEFLG
21619          JRST .-1
21620         SKIPN A,DTEF11
21621          JRST T00TYI
21622 ] ;KL10P
21623 IFN KS10P,[
21624         SKIPN A,8CTYIN
21625          JRST .-1
21626         ANDI A,177
21627 ] ;KS10P
21628
21629 ; TYPE CHAR IN A ON CONSOLE TTY
21630
21631 T00TYO:
21632 IFN KA10P,[
21633         CONSZ TTY,20
21634          JRST .-1
21635         DATAO TTY,A
21636 ] ;KA10P
21637 IFN KL10P,[
21638         SETZM DTEFLG
21639         MOVEM A,DTECMD
21640         CONO DTE,%DBL11
21641         SKIPN DTEFLG
21642          JRST .-1
21643 ] ;KL10P
21644 IFN KS10P,[
21645         PUSH P,A
21646         ANDI A,177
21647         IORI A,400
21648         MOVEM A,8CTYOT
21649         CONI A
21650         IORI A,80INT
21651         CONO (A)
21652         SKIPE 8CTYOT
21653          JRST .-1
21654         POP P,A
21655 ] ;KS10P
21656         POPJ P,
21657
21658 ; TYPE BLOCK NO IN A AS HIGH 3 OCTAL DIGITS OF ADDR
21659 ; (ALL MEMORIES MULTIPLE OF 4K.  MAX MEMORY 2M WORDS.)
21660
21661 T00BKO: PUSH P,A
21662         PUSH P,B
21663         LSHC A,-8
21664 REPEAT 3,[
21665         ADDI A,"0
21666         PUSHJ P,T00TYO
21667         MOVEI A,0
21668         LSHC A,3
21669 ]
21670         JRST POPBAJ
21671
21672 ; TYPE ASCIZ IN TT ON T00
21673
21674 T00ASZ: PUSH P,A
21675         HRLI TT,440700
21676 T00AZ1: ILDB A,TT
21677         JUMPE A,POPAJ
21678         PUSHJ P,T00TYO
21679         JRST T00AZ1
21680 \f
21681 IFN DPKPP,[     ;MAP SYSTEM SPEED CODES TO DATAPOINT KLUDGE CODES
21682 DPSP:   0_9     ;134
21683         1_9     ;600
21684         2_9     ;110
21685         3_9     ;150
21686         4_9     ;300
21687         5_9     ;1200
21688         5_9     ;1800 *
21689         6_9     ;2400
21690         7_9     ;4800
21691 REPEAT 20-<.-DPSP>, 7_9 ;FAST *
21692 ];DPKPP
21693
21694 CONSTANTS
21695 VARIABLES
21696
21697 IEND:
21698 .HKALL==0
21699
21700 ; Define location known as start of SALV disk salvager.  If system overruns
21701 ; this address, must either reduce system size or increase the SALV start
21702 ; address.  If SALV is changed, the SALV program must also be changed to
21703 ; start at the right place.  There is a limit to how high it can go,
21704 ; however.
21705 IFN KL10P, SALV==:105*2000      ; MC-KL is getting huge
21706 .ELSE SALV==:100*2000
21707 IFG IEND-SALV,.FATAL System overruns SALV start addr!
21708
21709 IFGE TSYSM-256.,DDT=774000
21710 .ELSE DDT=TSYSM*2000-4000
21711 DSKDMP==DDT+3700
21712
21713 IFG LBUGTB-LBUGT2,[
21714 .ERR MAKE THE BUGTAB BIGGER
21715 INFORM LBUGTB-LBUGT2,\LBUGTB-LBUGT2
21716 .FATAL FATAL ERROR, RUNNING THIS WOULD CAUSE TOTALLY WEIRD BUGS
21717 ]
21718
21719 IF2 EXPUNGE FOO,ZZZQ,FNM,ZCHR,ZZ,ZZZ,BUGB,BUGF,BUGN,BUGNN
21720
21721 END BEG         ;START AT BEG TO SALVAGE AND RUN ITS, START AT GO TO JUST ITS