2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
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.
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.
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.
24 .NSTGWD .SEE PATB ;NO STORAGE WORDS ALLOWED UNTIL PATB
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
35 ; MD Mostly Development KS10
40 ;THE FILE "CONFIG" HAS ASSEMBLY SWITCHES AS A FUNCTION OF MACHINE.
43 IFN ASCII/A/&ASCII/ /,.FATAL USE UPPER CASE!
44 DEFINE MCOND X ;0 IFF THIS IS MACHINE X.
46 DEFINE MNAME X ;USED TO SUBSTITUTE IN THIS MACHINE'S NAME.
48 FOO==.TTYFLG ;MAKE ERR FILE LOOK NICE
55 IFNDEF PCLSW,PCLSW==1 ;1 => ASSEMBLE PCLSR TEST FEATURE
56 IFNDEF TT11BY,TT11BY==8 ;PDP11-TV OUTPUT BUFFER BYTE SIZE.
57 .MLLIT==1 ;MULTI-LINE LITERAL MODE
58 ASTIME==.OP .OPER+@,0,.RTIME ;GET ASSEMBLY TIME AND DATE IN SIXBIT.
59 ASDATE==.OP .OPER+@,0,.RDATE ;RH OF INSN MUST BE 0, SO MIDAS WILL PUT IN PROPER AC FLD.
75 P=15 ;DO NOT CHANGE! ;PDL POINTER
79 .XCREF A,B,C,D,E,TT,I,Q,J,R,W,H,P,T,U
81 IF1 EXPUNGE APR,OCT,DEC ;FOR NEW CALENDAR HACK
83 NULBLK==4 ;NUMBER OF LOCKED SWITCH BLKS IN USR VARIABLES
84 ;USES 2 WDS OF USER VAR PER
86 NPVSEC==30. ;NUMBER OF SECONDS A USER IS ALLOWED TO BE IN THE PRIVILEDGED SWAPPING CLASS
87 IF2 LIOBLK==<USRSTG+LUBLK*MAXJ+1777>_-10. ;LOWEST BLOCK NEVER TO BE SHUFFLED
88 ;ALSO MAX # OF BLOCKS SYS JOB MAY HAVE
89 IF2 MAXJ==<LIOBLK_10.-USRSTG>/LUBLK ;ROUND UP TO ACTUAL MAX #JOBS
91 DIRMAP==1 ;ENABLE DIRECT MAPPING OF HIGH HALF
92 ;I DON'T THINK IT WORKS TO TURN THIS OFF.
93 NIOCHN==20 ;NUMBER OF I/O CHANNELS PER USER
95 DEFINE $INSRT $%$%$% ;PRINTX MESSAGE WHEN FILE GETS INSERTED
97 PRINTX \ ==> INSERTED: \
105 ;;; CONFIG uses this macro...
109 $INSRT CONFIG ;CONFIGURATION SWITCHES FOR ALL KNOWN MACHINES
111 $INSRT BITS ;DEFINITIONS OF MANY BIT NAMES
113 ;IN BADBTS => CLASS 2 OR 1 INTERRUPT ;IN VBDBTS=> CLASS 1 INTERRUPT
114 VBDBTS==%PIB42\%PIVAL\%PIBRK\%PIC.Z\%PI1PR\%PITRP\%PIDCL
115 BADBTS==VBDBTS\%PIMPV\%PIIOC\%PIILO\%PIMAR\%PIDIS\%PIOOB\%PILOS\%PIFET\%PIWRO\%PIPAR\%PITTY\%PIPDL\%PINXI
117 UUOMIN==40000,, ;SMALLEST NUM THAT COULD BE A SYSTEM CALL
118 UUOMAX==50000,, ;ONE GREATER THAN LARGEST NUM "
119 UIOT=UUOMAX ;USE FOR USER I/O INST TRAP
121 ;MAX DYN ALLOC ALLOC IO BUFFERS
122 MXIOB==100 ;MAX POSSIBLE
124 SIOMT==50 ;MAX SIZE TRANSLATION TABLE
126 LUPDL==50 ;LENGTH USER PDL MUST BE >= 40 FOR 2311 GC
127 LUIOP==20 ;LENGTH OF USER IO PDL
128 CPDLL==40 ;LENGTH CLOCK CHANNEL PDL
129 LUTCP==40 ;LENGTH UTC PDL (NETWORKS AND DISKS)
130 LSYSP==100 ;SYSTEM JOB PDL
131 LTTYP==40 ;LENGTH OF TTY (INTERRUPT LEVEL) PDL
133 DMNSZ==20 ;# ENTRIES IN DEMON BUFFER (DMNBF)
135 MXCZS==5 ;MAX NUMBER ^Z'S PER CLOCK BREAK
137 SCLKI==30. ;60'THS PER SLOW CLOCK
138 VSCLKI==2*60.*60. ;60'THS PER VERY SLOW CLOCK TICK
139 MXOPT==8. ;SLOW CLOCK MAX UT OP CAN TAKE
140 NINFP==8. .SEE UFIN ;MAX # OF DIRECT INFERIORS A PROCEDURE MAY HAVE
142 SSCHDB==100 ;LENGTH OF SCHEDULER HISTORY BUFFER
144 SPD==60.*60.*24. ;# SECS IN A DAY (FITS IN A HALFWORD)
145 PDUPS==60. ;# PDCLK INCREMENTS/SEC
147 OPNCOM==410300 ;COMMAND FIELD IN LH OF FIRST OPEN WORD
149 IFN 340P,N340PB==10. ;# EXEC PGS USED FOR 340 DATA MUST BE EVEN
151 NTTPG==6 ;# EXEC PGS FOR PDP11 TV TTYS.
152 NTVBP==11 ;THESE PAGES ADDRESS THE WHOLE VIDEO BUFFER MEMORY ADDRESS
153 ;SPACE OF THE TV 11. THE LAST OF THESE ADDRESSES THE
156 NUVPG==256. ;NUMBER OF VIRTUAL PAGES PER USER. SIZE OF PAGE TABLE VARS.
157 ;DON'T TRY TO CHANGE THIS.
158 ;CIRCULAR PAGE LINK FORM
163 ;2.8=0 2.7-1.1 LINK TO MMP TABLE
164 ;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE
165 ;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED
167 SUBTTL GOBBLE TTYTYP FILE
169 IFN XGP\N11TYS,[IFE TEN11P,[
170 .ERR XGP OR N11TYS WITHOUT TEN11P
175 IFNDEF UNSPLP,UNSPLP==<TTLPTP+OLPTP+NLPTP>*DEMON*<1-TPLP>
176 ;1 IF THE "UNSPOO" PROGRAM DOES LPT SPOOLING.
179 MNAME PRINTX \NO PARAMS KNOWN FOR , MACHINE.
185 ;TTY LINES DEFINITIONS
187 ;MACRO WHICH RETURNS THE %TY BIT FOR THE CONTROLLER ACCORDING TO THE LINE NUMBER
190 IRPS F,,[0 NFKSTY NFETY NFNTY NFNVTY NFDZTY NFDPTY NFMTY NFDLTY NFSTTY NF11TY
191 ]NT,,[NOTYS NKSTYS NETYS NNTYS NNVTTS NDZTYS NDPTYS NMTYS NDLTYS NSTTYS N11TYS
192 ]FG,,[%TYOTY %TYKST %TYETY %TYNTY %TYNVA %TYDZT %TYDPK %TYMTY %TYDL %TYSTY %TY11T]
193 IFGE <N>-F,[IFL <N>-<F+NT>,[FG]]TERMIN TERMIN
195 ;MACRO WHICH RETURNS $TTISP, $TTOSP BITS GIVEN BAUD RATES
197 DEFINE SPEEDC <IBAUD,OBAUD>
198 <IFB IBAUD,[SPEED1 OBAUD]IFNB IBAUD,[SPEED1 IBAUD]>*%TTISP+<SPEED1 OBAUD>*%TTOSP!TERMIN
201 IRPS BD,,[0 600 110 150 300 1200 1800 2400 4800 9600 25K 40K 50K 80K
202 ]CD,,[0 1 2 3 4 5 6 7 10 11 12 13 14 15 ]
203 IFSE BAUD,BD,[CD] TERMIN TERMIN
205 ;KEYWORD PARAMETERS TO TTY DEFINITION MACROS
206 ; FOR OVER-RIDING DEFAULTS
207 ;SPEED NUMBER OF BAUDS OUTPUT
208 ;ISPEED NUMBER OF BAUDS INPUT IF DIFFERENT
209 ;TT LH(TTTYP) IN ADDITION TO SPEED CODE
210 ;TY RH(TTYTYP) IN ADDITION TO CONTROLLER BIT
211 ;TO LH(TTYOPT) IN ADDITION TO USUAL CODES FOR TERMINAL TYPE
212 ;TP RH(TTYOPT) IN ADDITION TO PAD CODES
216 ;ROL LINES PER GLITCH WHEN SCROLLING
218 ;DEFINE TTY AS PRINTING.
219 ;IF SPEED IS 110, ASSUME TTY IS TELETYPE,
220 ;MEANING CAN'T BS, STANDARDIZE ALTMODES.
221 ;IF KA10 CONSOLE TTY OR TK10 TTY, NEED PARITY
222 DEFINE TTDPRT N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNPRT,SMARTS=0
224 T!N!$HOR==80.-IFE 110-SPEED,8
226 T!N!$OPT==TO+%TOOVR+%TOALT+IFN 110-SPEED,[%TOMVB+%TOLWR-%TOALT],,<1+IFE 300-SPEED,[IFE TY&<%TYDIL\%TYRLM>,[3]]>*%TPPCR+TP
227 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>\<IFE N,[IFN NOTYS,[%TTPAR]]>\<IFGE N-NFNTY,[IFL N-<NFNTY+NNTYS>,[%TTPAR]]>,,TY+<CNTRLR N>
232 ;DEFINE TTY AS MEMOREX
233 DEFINE TTDMRX N,+SPEED=600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0
237 T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,4*%TPPLF+6*%TPPCR+TP
238 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
243 ;DEFINE TTY AS TERMINET.
244 DEFINE TTDTRM N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0
248 T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,5*%TPPLF+TP
249 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
254 ;DEFINE TTY AS A LPT.
255 DEFINE TTDLPT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=0,HOR=200.,TCT=%TNPRT,SMARTS=0
259 T!N!$OPT==TO+%TOMVB+%TOOVR,,TP
260 T!N!$TYP==%TTDDI+TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
265 ;DEFINE TTY AS AN LA36 DECWRITER.
266 DEFINE TTDLA36 N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=132.,TCT=%TNPRT,SMARTS=0
270 T!N!$OPT==TO+%TOMVB+%TOOVR+%TOLWR,,TP
271 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
276 ;DEFINE TTY AS IMLAC. (RUNNING SOFTWARE-TTY PROGRAM)
277 DEFINE TTDIML N,+SPEED=50K,ISPEED=25K,TT=0,TY=0,TO=0,TP=0,HOR=90.,VER=44.,TCT=%TNSFW,ROL=10.,SMARTS=%TQIM1
281 T!N!$OPT==TO+%TOOVR+%TOLWR+%TOMVB+%TOMVU+%TOERS+%TOLID+%TOCID,,TP
282 T!N!$TYP==%TTDDI+TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
288 DEFINE TTDVT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNESC,ROL=1,SMARTS=0
292 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS,,TP+%TPPTB*<IFE SPEED-9600,[1] .ELSE [3]>
293 ;DIRECT POSITIONING LOSES AT 9600
294 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
300 DEFINE TTDH19 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNH19,ROL=1,SMARTS=0
304 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3
305 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
311 DEFINE TTDAAA N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS+%TPMTA,HOR=80.,VER=48.,TCT=%TNAAA,ROL=1,SMARTS=0
315 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*2
316 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
322 DEFINE TTDC100 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=79.,VER=24.,TCT=%TNHDS,ROL=1,SMARTS=0
326 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3+<IFG SPEED-1200,%TPPCR>
327 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
332 ;DEFINE TTY AS TEKTRONIX.
333 DEFINE TTDTEK N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNTEK,HOR=73.,VER=35.,SMARTS=0
337 T!N!$OPT==TO+%TOMVU+%TOOVR+%TOMVB+%TOLWR+%TOMOR,,TP
338 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
343 ;DEFINE TTY AS A LOSING DATAPOINT
344 DEFINE TTDLSR N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,SMARTS=0
347 T!N!$HOR==71.-IFN MCOND AIKA,1 ;OTHER DATAPOINTS HAVE SHORTER SCREENS.
349 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP
350 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
354 ;DEFINE TTY AS DATAPOINT.
355 DEFINE TTDDPT N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=[72.-IFN MCOND AIKA,[1]],SMARTS=0
358 T!N!$HOR==HOR ;OTHER DATAPOINTS HAVE SHORTER SCREENS.
360 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP
361 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
365 ;DEFINE TTY AS A TELERAY 1061
366 DEFINE TTDRAY N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,SMARTS=0
371 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOERS+%TOLWR+%TOLID+%TOCID,,3*%TPPTB+TP
372 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
376 ;DEFINE A TTY THAT IS A GT40.
377 DEFINE TTDGT40 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNDP,HOR=72.,VER=32.,ROL=1,SMARTS=0
381 T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOOVR+%TOLWR,,TP
382 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
387 ;DEFINE A TTY THAT IS A LINE TO A PDP11.
388 DEFINE TTD11 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=0,TCT=%TNPRT,HOR=72.,VER=MOVE,ROL=1,SMARTS=0
392 T!N!$OPT==TO+%TOMVB+%TOOVR+%TOALT,,TP
393 T!N!$TYP==TT+%TTDDI+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
398 ;DEFINE A TTY THAT IS RANDOM.
399 DEFINE TTDRAN N,+SPEED=FOO.,ISPEED=,TT=0,TY=0,TO=FOO.,TP=FOO.,TCT=FOO.,HOR=FOO.,VER=FOO.,ROL=FOO.,SMARTS=0
404 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
410 DEFINE TTDDTM N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS+3*%TPPCR,HOR=80.,VER=24.
414 T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOLWR+%TOLID+%TOCID,,TP
415 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
420 ;DEFINE A PDP11 TV COMMUNICATING VIA TEN-11 INTERFACE. NO OPTIONS.
422 T!N!$SMT==%TQGRF+%TQVIR+%TQREC+%TQXOR+<.DPB 14,<.BP %TQHGT>>+<.DPB 6,<.BP %TQWID>>,,%TRSCN
425 T!N!$OPT==%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI+%TOLID+%TOCID,,%TP11T+%TPRSC
426 T!N!$TYP==%TTLCL+<SPEEDC 9600,9600>,,%TY11T
431 ;DEFINE A PDP11 TV COMMUNICATING AS A SOFTWARE TTY. TYPICALLY A GRINNELL (512x512).
432 DEFINE TTDGRN N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPCBS+%TPORS,HOR=86.,VER=50.,TCT=%TNSFW,ROL=0,SMARTS=0
436 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI,,TP
437 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
442 ;DEFINE AN STY LINE. NO OPTIONS.
447 T!N!$OPT==%TOMVB+%TOOVR+%TOLWR+%TORAW,,%TPORS
454 IFE MCOND MCHN,TERMIN
456 ;;; THE NEXT TWO MACROS CAUSE TTYTYP FILE TO BE INSERTABLE BY BOTH
457 ;;; PDP-10 AND PDP-11 PROGRAMS.
468 EXPUNGE TTDPRT,TTDTRM,TTDDPT,TTDMRX,TTDGT40,TTD11,TTDRAN,TTDGRN,TTDVT,TTDTEK
469 EXPUNGE TTDTV,TTD2741,TTDSTY,TTDLPT,TTDIML,TTDLA36,TTDLSR
470 EXPUNGE SPEEDC,SPEED1,CNTRLR,MCONDX,.ENDC,.ENDR
475 ;Macro for reporting a bug or other interesting condition
476 ;Use this in place of JRST 4, especially when condition is automatically
477 ;recoverable or wants explanation typed out for benefit of loser.
479 ;First argument is one of the following symbols:
480 ; INFO - just print on the system console
481 ; CHECK - same as INFO unless SYSDBG non-zero or buffer full, then same as PAUSE
482 ; PAUSE - print message, go to DDT, allow alt-P
483 ; HALT - print message, go to DDT, do not allow alt-P
484 ; DDT - PAUSE but not because of a bug (shorter message), allow alt-P
485 ; AWFUL - same as HALT but usable when there is no pdl in P
486 ; Should there be a combination of AWFUL and PAUSE?
487 ; That would require restoring P upon attempt to continue
488 ;Arguments after the first are either strings to be printed
489 ;(enclose in brackets), or format,value pairs. Value is any
490 ;address; indexing and indirection are allowed, however registers
491 ;P and TT may not be referenced.
492 ;A format is one of the following symbols:
493 ; OCT - octal number, with ,, if bits on in the left halt
494 ; DEC - decimal number
495 ; THOU - decimal number with commas every three digits
496 ; CR - print a carriage return (unfortunately swallows and ignores an arg)
497 ; SIXBIT - sixbit word
498 ; ASCIZ - asciz string
499 ;Undefined formats will be taken as strings to be printed.
500 ;The maximum number of value arguments is 6
501 ;A space is printed after each formatted value. A space is also
502 ;printed after the last string and before any additional formatted values.
504 ;With no arguments, BUG may be used in place of JRST 4,.
505 ;It uses the same amount of storage but has the advantage of going
506 ;straight to DDT. In this case there won't be a specific message
507 ;about what the bug was, of course.
509 ;Note that the BUG macro always generates one word of code, and hence
510 ;may be skipped over.
511 ;All registers are preserved.
512 ;P must point at a valid PDL.
514 ;Due to Midas inadequacy, the BUG macro may not be used from inside
515 ;a literal. You will get an error (label inside brackets) if you try it.
518 ; BUG PAUSE,[DSK: DRIVE NUMBER ],OCT,Q,[IS OFF-LINE.]
520 DEFINE BUG FLAVOR,ARGS/
522 ;Make sure we are not in a literal, since cannot get value of "."
523 BUGBUG: EXPUNGE BUGBUG
524 ;Generate call to appropriate flavour of subroutine
526 IRPS FLA,,[INFO,CHECK,PAUSE,HALT,DDT]SUB,,[BUGINF,BUGCHK,BUGPSE,BUGHLT,BUGDDT]
531 IFSE [FLAVOR]AWFUL, JSR BUGAWF
532 .ELSE IFE ZZ, .ERR "FLAVOR" UNKNOWN FLAVOUR OF BUG
534 BUGB==0 ;Initialize formatting bits
536 ;Initialize remote macros
537 DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003*
538 ZZ001!ZZ002!ZZ003!TERMIN
544 BUGN==0 ;number of accumulated arguments
545 BUGNN==0 ;total number of arguments
546 BUGF==0 ;next thing not argument
549 IFN BUGF,[ ;Address of word to print
555 .ELSE [ ;Name of format in which to print?
556 IRPS FMT,,OCT DEC THOU CR UNUSED5 SIXBIT ASCIZ
559 BUGB==BUGB+<<.IRPCNT+1>_<<5-BUGNN>*3>>
562 IFE BUGF,[ ;Just a string to be printed
563 IFN BUGN,[ ;Say to output some arguments before this string
570 IFG BUGNN-6, .ERR MORE THAN 6 WORDS TO BE PRINTED IN BUG MACRO
571 ;Make bug table entry: length,,pc ? bits,,string ? args
572 IF1, BUGMC1 'ZZ==[ASCIZ|',,'|]'
577 BUGMC1 'BUGB,,[ASCIZ|',,'|]'
581 LBUGTB==LBUGTB+BUGNN+2
586 LBUGTB==0 ;Initialize length of bug table
588 ;This support macro appends a string to the middle argument of BUGMC1
590 BUGMC1 //,[DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003*
591 ZZ001!ZZ002!]//,STRING!!ZZ003!TERMIN
594 ;This support macro appends a character, given by number, to the middle
596 ;Only for characters 0 through 7
598 IRPC C,,.QUOTE/
\0\ 1\ 2\ 3\ 4\ 5\ 6\a/
605 ;This one is a simple remote macro
607 BUGMC4 [DEFINE BUGMC4 ZZ001
612 SUBTTL DEFINE PI CHANNELS
614 LPTP==OLPTP+NLPTP+GLPTP ;ANY KIND OF LPT EXCEPT A TTY LPT
615 IFE NMTCS,[ ;IF NO MAG TAPES AT ALL
616 TM10A==0 ; CAN'T HAVE ANY KIND!
620 TM10P==TM10A+TM10B ;SOME KIND OF A TM10 MAGTAPE PRESENT
621 IFN TABP,TABCLK==0 ;1=>PUT TABLET ON CLOCK CHNL
623 ;PRIORITY INTERRUPT CHANNEL ASSIGNMENTS
625 DCLOC=40+2*DCCHN ;DC INTERRUPT LOCATION
626 IFN IMPP, IMPCHN==1 ;IMP STUFF
627 IFN NETP, NETCHN==2 ;SOFTWARE ACTIVATED...
628 UTCCHN==2 ;UTC CHANNEL
629 DSKCHN==UTCCHN ;2314 CHANNEL
630 MTCCHN==UTCCHN ;MAG TAPE CONTROL CHANNEL
631 LPTCHN==4 ;LINE PRINTER, PAPER TAPE, ETC. CHANNEL
632 TTYCHN==3 ;TTY CHANNEL
633 IFN PLTP, PLTCHN==4 ;PLOTTER CHANNEL
634 IFN PTRP, PCHCHN==4 ;PTP CHANNEL
635 IFN PTRP, PTRCHN==4 ;PAPER TAPE READER CHANNEL
636 IFN NTYP, NTYCHN==4 ;NTY 11 KLUDGE
637 IFN 340P, SDCHN==4 ;DISPLAY SPECIAL CHANNEL
638 IFN DSDP, DSDCHN==4 ;INTERRUPT FROM OTHER PROCESSOR
639 IFN ARMP, TIPBCH==5 ;ARM TIP BREAK CHNL
640 IFN OMXP, OMPCHN==5 ;OUTPUT MULTIPLEXOR
641 IFN VIDP, NVDCHN==5 ;NEW VIDI
642 IFN TABP, IFE TABCLK, TABCHN==5 ;TABLET
643 IFN 340P\E.SP, DISCHN==6 ;DISPLAY DATA CHNL
644 IFN CH10P, CHXCHN==5 ;CHAOSNET
645 ;WOULD BE 6 BUT PI 6 BROKEN IN ML-KA TTLIOB
646 IFN CH11P, CHXCHN==6 ;UNIBUS CHAOSNET PACKET COPYING
647 IFN TABP, IFN TABCLK, TABCHN==7 ;TABLET
648 APRCHN==7 ;DO NOT CHANGE
650 PIOFF==400 ;TURN OFF PI SYSTEM
651 PION==200 ;TURN ON PI SYSTEM
652 PICOFF==1200 ;TURN OFF PI CHANNEL
653 PICON==2200 ;TURN ON PI CHANNEL
654 PICIRQ==4200 ;REQUEST INTERRUPT ON PI CHANNEL
655 CLKON==2201 ;ABSOLUTE
657 IFN OMXP, OMXON==CLKON\<400_-OMPCHN-1>
658 IFN OMXP, OMXOFF==CLKOFF\<400_-OMPCHN-1>
659 LPTON==CLKON\<400_-LPTCHN-1>
660 LPTOFF==CLKOFF\<400_-LPTCHN-1>
661 IFN PTRP, PTPON==CLKON\<400_-PCHCHN-1>
662 IFN PTRP, PTROFF==CLKOFF\<400_-PCHCHN-1>
663 IFN PTRP, PTRON==CLKON\<400_-PTRCHN-1>
664 IFN PTRP, PTROFF==CLKOFF\<400_-PTRCHN-1>
665 TTYON==CLKON\<400_-TTYCHN-1>
666 TTYOFF==CLKOFF\<400_-TTYCHN-1>
667 UTCON==CLKON\<400_-UTCCHN-1>
668 UTCOFF==CLKOFF\<400_-UTCCHN-1>
669 IFN NETP, NETON==UTCON
670 IFN NETP, NETOFF==UTCOFF
671 IFN KL10P, DTEON==CLKON
672 IFN KL10P, DTEOFF==CLKOFF
674 DSKRQ==PICIRQ\PICON\<200_-DSKCHN> ;RQ INT + TURN ON FOR SAKE OF KL
675 MTCRQ==PICIRQ\PICON\<200_-MTCCHN>
676 UTCRQ==PICIRQ\PICON\<200_-UTCCHN>
677 TTYRQ==PICIRQ\PICON\<200_-TTYCHN>
678 CLKRQ==PICIRQ\PICON\<200_-APRCHN>
679 IFN NETP,NETRQ==PICIRQ\PION\<200_-NETCHN>
680 IFN CH11P,CHXRQ==PICIRQ\PICON\<200_-CHXCHN>
688 TABON==CLKON\<400_-TABCHN-1>
689 TABOFF==CLKOFF\<400_-TABCHN-1>
693 IFN NUNITS, IFE NEWDTP, CUINT==5000+UTCCHN ;CONO TO UTC TO ACTIVATE UTAPE INTERRUPT
695 PMLCAD==(.BP <PMRCM,,>) ;BYTE POINTER TO L.H. REAL CORE ADR
696 PMRCAD==(.BP PMRCM) ;BYTE POINTER TO R.H. REAL CORE ADR
698 SUBTTL DEFINE DEVICE CODES, IOBFT CHNL NUMBERS
700 IFN STKP, STK==70 ;STANFORD KEYBOARD
701 IFN OLPTP, OLPT==124 ;LINE PRINTER
703 IFN TM10P, MTC==340 ;MAG TAPE CONTROL
704 IFN TM10P, MTS==344 ;MAG TAPE STATUS
705 IFN VIDP, NVDX==620 ;NEW VIDI X
706 IFN VIDP, NVDY==624 ;NEW VIDI Y
707 IFN VIDP, NVDT==630 ;NEW VIDI T (DEFLECTION DELAY)
708 IFN PLTP, PLT==654 ;CAL COMP PLOTTER
709 IFN HCLKP, CLK1==710 ;HOLLOWAY CLOCK
710 IFN HCLKP, CLK2==714 ; "
711 IFN IMXP, MPX==574 ;INPUT MULTIPLEXOR
712 IFN OMXP, OMPX==570 ;OUTPUT MULTIPLEXOR
713 IFN TK10P\NTYP, NTY==600 ;KNIGHT TTY KLUDGE
715 IFN DL10P, DLB==60 ;DL10 BASE
716 .ALSO DLC==64 ;DL10 CONTROL
717 IFN PDCLKP, PDCLK==500 ;DE-CORIOLIS CLOCK (FOR ML-KA AND DM, CALENDAR CLOCK)
718 IFN DSDP, DSDEV==20 ;DE SELECTION AND INTER COM DEVICE
719 IFN DSDP, DSDEVN==24 ;DE SELECTION DEV (FOR DEVICES YOU DATAO DEV CODE TO DSDEVN)
720 IFN ARMP, TIPDEV==504 ;TIP BREAK DEVICE
721 IFN RBTCP, RBTCON==514 ;ROBOT CONSOLE
722 IFN DPKPP, DPK==604 ;DATA POINT KLUDGE
723 IFN DC10P, DC0==610 ;2314 DISK CONTROL
724 IFN DC10P, DC1==614 ;2314 DISK CONTROL
725 IFN RP10P, DPC==250 ;RP10 DISK CONTROL
726 IFN RH10P, DSK==270 ;RH10 DISK CONTROL
727 IFN KAIMP, IMP==460 ; AI-KA/ML-KA/MC-KL IMP interface
728 IFN DMIMP, FI==424 ; DM IMP hardware
737 ;IOBFT CHANNEL NUMBERS - 77 MEANS "FREE"
739 IFN NUNITS, NUTIC==8 ;NUMBER UT IN CHNLS
741 IFN NUNITS, NUTOC==8 ;NUMBER UT OUT CHNLS
743 NFCLC==NUTIC+NUTOC+1 ;# OF FIRST CORE LINK CHNL
744 NCLCH==14 ;NUMBER CORE LINK CHNLS
745 NFNETC==NFCLC+NCLCH ;# OF FIRST NCP NET CHNL (if any)
746 ;NNETCH DEFINED IN CONFIG
747 IFG NFNETC+NNETCH-77, .ERR TOO MANY IOBFT CHANNELS
749 SUBTTL RANDOM DEFINITIONS FOR I/O DEVICES
751 IFN DSDP, IFN VIDP, DSNVID==200000,, ;DEASSIGN BIT FOR NVD
752 IFN DSDP, IFN 340P, DSNDIS==4000,, ;DEASSIGN BIT FOR DIS
753 IFN DSDP, IFN NMTCS, DSMTC==1,, ;DEASSIGN BIT FOR MAG TAPE
755 IFN RBTCP, RLTSWC==17 ;ROBOT CONSOLE SELECT FOR LIGHTS AND SWITCHES
756 IFN RBTCP, IFN TABP, RTABC==16 ;ROBOT CONSOLE SELECT FOR TABLET
758 IFN IMXP, LCHN==177 ;MULTIPLEXOR LIMIT ON READ IN
760 NUDCH==14 ;NUMBER DIRECTORY CHNLS
761 IFN IMXP, NPOTCH==20. ;NUMBER POT CHANNELS
762 IFG NQCHN+1+NQS-77, .ERR MORE THAN 6 BITS OF DISK CHANNEL NUMBER
764 IFN CODP, CODBFL==5 ;CODE BUFFER
765 IFN PTRP, PUNSIZ==20 ;PTP BUF SIZ
766 IFN PTRP, REDSIZ==200 ;PTR BUF SIZ
767 IFN PLTP, LPLBUF==200 ;PLT BUF SIZ
768 IFN LPTP, LPTBSZ==1000 ;LPT BUF SIZ
769 IFN VIDP, NVDLNG==340 ;NVD BUF SIZE
770 IFN TPLP, TPLBSZ==100 ;TPL BUFFER SIZE IN SYS JOB
771 IFN TABP, LTABBF==100 ;TABLET BUFFER
772 IFN N11TYS, TT11CR==764044 ;UNIBUS ADR OF TV11 CONSOLE REG
774 EOFCH==3 ;SYSTEM END OF FILE CHR
775 EOFWRD=REPEAT 5,[EOFCH_<.RPCNT*7+1>\]0 ;WORD OF EOFCH'S
777 IFN 340P, DVEF==4000 ;DISPLAY VERTICAL EDGE FLAG
778 IFN 340P, DHEF==1000 ;DISPLAY HOR EDGE FLAG
780 IFN 340P, EWRT==400./12. ;EQIV "COST" IN DISPLAY WRDS FOR TRIP THRU RECYC
781 IFN 340P, MDISWD=70000 ;MAX # WDS SENT TO SCOPE IN 1/2 SEC
783 NSWPV==E.SP\340P+VIDP+IMXP ;# OF DEVICES THAT CAN SWAPIN PAGES
786 IFN NMTCS, MAGLOC==76 ;INTERRUPT LOCS FOR MAGTAPE
787 IFN NUNITS, DCMLOC==74 ;" " FOR DC
788 IFN IMXP, IMXLC==66 ;" " IMX
790 IMPILC==70 ;INPUT FROM IMP
791 IMPOLC==72 ;OUTPUT TO IMP
796 IFN NMTCS, MAGLOC==42
797 IFN NUNITS, DCMLOC==42
800 ;PLOTTER CONTROL BITS
812 SUBTTL STUFF PECULIAR TO KA-10 PROCESSOR
814 ;;;PAGING BOX INSTRUCTIONS
816 LPM=102000,, ;LOAD PG MEM STATE VECTOR DONT CLR ASSOC MEM
817 LPMR= LPM 2, ;CLEAR ASSOC MEM AND LOAD
818 SPM= LPM 1, ;STORE PG MEM STATE VECTOR
819 LPMRI=LPM 6, ;LOAD PM, CLEAR ASSOC REG, AND CAUSE INTERRUPT
820 EXPGNG==4 .SEE UPQUAN ;4 TO TURN ON EXEC PAGING
821 XCTR=103000,, ;EXECUTE INSTRUCTION WITH MAPPING CONTROLLED BY AC FIELD
822 ;VIOLATION CAUSES USER MEM PROTECT INTERRUPT UNLESS INHIBITED
823 ;VIOLATION ALSO SKIPS BUT THIS IS OF NO CONSEQUENCE UNLESS
824 ;INTERRUPT IS INHIBITED SINCE PC WILL BE RESET FROM OPC
825 XCTRI= XCTR 4, ;XCTR WITH PAGE FAULT INHIBITED (SKIPS ON FAULT)
826 ; AC FIELD VALUES FOR XCTR AND XCTRI
827 XR==1 ;MAP READ MAIN OPERAND OF SIMPLE INSTRUCTION (MOVE, SKIPL, HLL)
828 XW==2 ;MAP WRITE MAIN OPERAND OF SIMPLE INSTRUCTION (MOVEM)
829 XRW==3 ;MAP READ/WRITE OPERAND OF SIMPLE INSTRUCTION (E.G. IORM)
830 XBYTE==3;MAP BYTE DATA AND BYTE POINTER (ILDB, IDPB)
832 XBW==2 ;MAP BLT WRITE
833 XBRW==3 ;MAP BOTH OPERANDS OF BLT
834 ;KA10 PAGING BOX GOES BY WHETHER IT'S A READ OR WRITE (OR RW) CYCLE
835 ;KL10 PAGING BOX WORKS DIFFERENTLY (SEE BELOW)
836 ;DO NOT USE MULTI-OPERAND INSTRUCTIONS (DMOVE, PUSH, ETC.) WITH XCTR
838 DEFINE CLRPGM U ;CLEAR PAGER ASSOCIATIVE MEMORY. ARG IS USUALLY "(U)".
839 SPM UPGML!U ;STORE SO DON'T LOSE QUANTUM TIMER
843 ;;; MISCELLANEOUS BUILTIN I/O DEVICES
845 PI==4 ;INTERRUPT SYSTEM
846 LIGHTS==PI ;DEVICE CODE FOR DATAO THAT SETS CONSOLE LIGHTS.
847 CLK==0 ;DEVICE CODE FOR 60 HZ CLOCK INTERRUPT (APR)
848 CLKINT==1000 ;CONI CLK, BIT FOR INTERRUPT. ALSO CONO BIT TO CLEAR.
849 PTR==104 ;PAPER TAPE READER
850 PTP==100 ;PAPER TAPE PUNCH
851 TTY==120 ;CONSOLE TTY
852 DTC==320 ;DECTAPE CONTROL
853 IFN 340P, DIS==130 ;340 DISPLAY
855 PI0LOC==40 ;INTERRUPT VECTOR BASE
857 OIPBIT==%PC1PR ;PC BITS FOR 1-PROCEED.
858 BADPC==%PCUIO+%PCSPC+37 ;BITS IN PC USER NOT ALLOWED TO TURN ON
860 DEFINE UUOH ;UUO HANDLER LOCATIONMS ARE REFERENCED THROUGH THESE MACROS
866 DEFINE SYSCTX ;SET UUO LEVEL AC BLOCKS
869 DEFINE USRCTX ;SET USER-MODE AC BLOCKS
872 DEFINE OVHMTR NAME ;OVERHEAD METERING DOESN'T WORK ON KA'S
877 SUBTTL STUFF PECULIAR TO KL-10 PROCESSOR
879 ;;;PAGING BOX INSTRUCTIONS
881 XCTR=074000,, ;EXECUTE INSTRUCTION WITH MAPPING, PAGE FAILS ENABLED
882 XCTRI=075000,, ;SAME BUT SKIPS IF THERE IS PAGE FAIL (DONE SNEAKILY BY SOFTWARE)
883 LPMR=076000,, ;LOAD PAGER MEMORY (JPC, DBRS) AND CLEAR PT DIR
884 SPM=077000,, ;STORE PAGER MEMORY
885 ;AC FIELD VALUES FOR XCTR AND XCTRI
886 XR==4 ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING)
887 XW==4 ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR WRITING)
888 XRW==4 ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING AND WRITING)
889 XBYTE==5;MAP BYTE DATA AND BYTE POINTER
890 XBR==1 ;MAP BLT SOURCE
891 XBW==4 ;MAP BLT DESTINATION
892 XBRW==5 ;MAP BOTH BLT OPERANDS
893 XEA==16 ;MAP EFFECTIVE ADDRESS COMPUTATION
894 ;IN KL10 BITS ARE: 14 INDIRECT WORDS
895 ; 10 XR UNDER SOME RANDOM WIERD CONDITIONS (?)
896 ; 4 MAIN OPERAND " " " ALSO BYTE WRITE
897 ; 2 INDEX REGISTER, @ AND XR IN BYTE PTRS
898 ; 1 2ND OPND - BLT SOURCE, BYTE READ, STACK DATA
900 DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS. ARG IS USUALLY "(U)".
901 CONO PAG,660000+<EPT/1000>
904 ;;; INTERNAL "I/O" DEVICES
906 PI==4 ;INTERRUPT SYSTEM
907 PAG==10 ;CONO, DATAO PAG SET UP PAGING
909 CCA==14 ;CACHE OPERATIONS
910 TIM==20 ;TIMER DEVICE
911 MTR==24 ;METERS DEVICE
913 IFN PDCLKP,[ ;IF THIS KL-10 HAS FREEMAN KL-UDGE BOARD,
914 LIGHTS==500 ;DATAO LIGHTS, SETS CONSOLE LIGHTS.
915 CLK==500 ;60 HZ CLOCK INTERRUPT (ON KL-UDGE BOARD)
916 CLKINT==10 ;CONI CLK, BIT FOR INTERRUPT. ALSO CONO BIT TO CLEAR.
917 ;ALSO DATAI 500, IS THE DECORIOLIS CLOCK.
918 ;AND CONO 500,400000 TURNS CLOCK BACK ON AFTER POWER FAIL.
921 OIPBIT==%PS1PR ;1-PROCEED BITS IN THE PC.
922 BADPC==%PSUIO+37 ;%PSPUB IS OK?
924 ;;; SPECIAL INSTRUCTIONS
926 SWPIA=DATAI CCA, ;INVALIDATE WHOLE CACHE
927 SWPIO=CONI CCA, ;INVALIDATE ONE PAGE OF CACHE
928 SWPUO=CONSO CCA, ;UNLOAD ONE PAGE OF CACHE
929 SWPUA=DATAO CCA, ;UNLOAD WHOLE CACHE
930 WRPAE=702100,, ;WRITE PERFORMANCE-COUNTER ENABLES
931 APRID==BLKI ;READ CPU SERIAL NUMBER AND OPTIONS
932 RDERA=BLKI PI, ;READ ERROR ADDRESS
933 RCCL=DATAI TIM, ;READ CALENDAR CLOCK (DOUBLE WORD)
934 RPERFC=BLKI TIM, ;READ PERFORMANCE COUNTER (DOUBLE WORD)
935 REBOXC=DATAI MTR, ;READ EBOX CYCLE COUNTER (DOUBLE WORD)
936 RMBOXC=BLKI MTR, ;READ MBOX CYCLE COUNTER (DOUBLE WORD)
942 ;;;PAGE FAIL WORD - UPFW(U)
945 %PFUSR==400000 ;USER PAGE
946 %PFCOD==370000 ;FAILURE CODE:
947 %PFPRO==210000 ;PROPRIETARY VIOLATION
948 %PFMAR==230000 ;MAR BREAK
949 %PFILW==240000 ;ILLEGAL WRITE IN READ ONLY
950 %PFPNA==330000 ;PAGE NO ACCESS
951 %PFPTP==250000 ;PAGE TABLE PARITY
952 %PFPAR==360000 ;PARITY ERROR, DATA IN AR
953 %PFPRX==370000 ;PARITY ERROR, DATA IN ARX
954 %PFPUB==4000 ;PUBLIC PAGE
957 $PFPNO==121000 ;VIRTUAL PAGE NUMBER
958 ;1.1-3.5 VIRTUAL ADDRESS
960 DEFINE UUOH ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS
966 ;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR) OLDACS,
967 ; UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME FOR UPT.
968 ; DISABLE, IF NONBLANK, CAUSES ACCOUNTING UPDATING NOT TO BE DONE EVEN THOUGH
970 DEFINE SPCCTX CURACS,OLDACS,UPT,DISABLE
971 DATAO PAG,[IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+2^13+CURACS_33+OLDACS_30+UPT/1000+400000-IFNB UPT,[IFB DISABLE,[400000]]]
974 SYSCTX=SPCCTX 0,1 ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1.
975 USRCTX=SPCCTX 1,1 ;USERS RUN IN BLOCK 1.
977 AC!N!CTX=SPCCTX 0,N ;CUR AC 0, PREV N. USE XCTR TO ACCESS SPECIAL ACS
981 ; 0 ACCUMULATORS FOR SYSTEM (AT UUO LEVEL)
982 ; 1 ACCUMULATORS FOR USER
983 ; 2 USED TEMPORARILY BY TTY INPUT INTERRUPTS
985 ; BLOCKS 2 & 3 ARE USED BY THE UNFINISHED MUSIC MICROCODE
986 ; BLOCKS 4 & 5 ARE USED BY THE UNFINISHED JPC RING FEATURE
987 ; 6-7 USED BY MICROCODE
991 SUBTTL STUFF PECULIAR TO THE KS-10 PROCESSOR
993 EPT==:0 ; This MUST agree with the Salvager!
997 DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS. ARG IS USUALLY "(U)".
998 WREBR 20000+<EPT/1000>
1001 OIPBIT==1000 ;BIT 8 (SYMBOLIC NAME %PSINH)
1002 BADPC==%PSUIO+37 ;BITS IN PC THAT USER CANNOT TURN ON
1004 DEFINE UUOH ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS
1010 ;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR)
1011 ; OLDACS, UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME
1013 DEFINE SPCCTX CURACS,OLDACS,UPT
1014 WRUBR [IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+CURACS_33+OLDACS_30+UPT]
1017 SYSCTX=SPCCTX 0,1 ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1.
1018 USRCTX=SPCCTX 1,1 ;USERS RUN IN BLOCK 1.
1020 AC!N!CTX=SPCCTX 0,N ;CUR AC 0, PREV N. USE XCTR TO ACCESS SPECIAL ACS
1024 ; 0 ACCUMULATORS FOR SYSTEM (AT UUO LEVEL)
1025 ; 1 ACCUMULATORS FOR USER
1026 ; 2 USED TEMPORARILY BY TTY INPUT INTERRUPTS
1028 ; 7 USED BY MICROCODE (AC0 GETS BAD DATA WHEN MEMORY ERROR OCCURS, THIS
1029 ; COULD BE FIXED IF ANYONE THINKS IT IS WORTH IT...)
1032 IFE KS10P,[ ; For the benefit of processors without UMOVE and UMOVEM.
1034 DEFINE UMOVE (AC,ADDR)
1035 XCTR XR,[MOVE AC,ADDR]
1038 DEFINE UMOVEM (AC,ADDR)
1039 XCTR XW,[MOVEM AC,ADDR]
1044 SUBTTL SYS IOC STATUS WORD FORMAT
1046 ;RIGHT HALF WORD DEVICE STATUS
1047 ;1.1-1.6 SYS PHYSICAL DEVICE CODE
1049 ;2.1 SYS BUFF CAP FULL
1051 ;2.9-2.3 DEVICE DEPENDANT
1053 ;LEFT HALF WORD CHANNEL STATUS
1054 ;3.6-3.1 SET BY OPENS THAT DONT SKIP
1055 ;4.5-3.7 SET BY IOC ERRORS (INTERRUPTS) AT IOT OR OPER TIME
1056 ;3.9-3.7 ARE FOR 340 OR E&S ERRORS
1057 ;4.5-4.1 ARE FOR OTHER DEVICES
1058 ;A LIST OF ERROR CODES FOR OPEN FAILURES ARE IN THE FILE BITS.
1060 NDOPL==7 ;NUM OF DIS OPNL
1062 ;4.5-3.7 SET BY IOC ERRORS AT IOT OR OPER TIME
1064 ;3.9-3.7 SET BY 340 ROUTINES
1065 ;1 ILLEGAL SCOPE MODE
1067 ;3 MORE THAN 1K SYS SCOPE BUF
1070 ;6 MEMORY PROTECT ON PDL POINTER
1071 ;7 ILLEGAL PARAMETER SET
1075 ;13 DIRECTORY'S ALLOCATION EXHAUSTED
1077 ;11 ILLEGAL CHR AFTER ^P ON TTY DISPLAY
1078 ;10 CHNL IN ILLEGAL MODE WHEN .IOT ATTEMPTED
1081 ;7 USR OP CHNL DOES NOT HAVE USR OPEN
1082 ;6 ATTEMPT TO OVER IOPUSH
1083 ;5 ATTEMPT TO OVER IOPOP
1084 ;4 NON-EXISTANT SUB DEVICE
1085 ;3 NON-RECOVERABLE DATA ERROR ;NON-EX-MEM ON PDP6 REF
1087 ;1 DEVICE HUNG OR REPORTING NON-DATA ERROR
1089 MIOTER==1 ;LOWEST IOCERR CODE USED
1090 NIOTER==13. ;NUMBER " "
1092 ;4.9-4.5 ALWAYS ZERO (USED BY IOPUSH FOR CHNL NUM)
1094 ;SYS PERIPHERAL DEVICE CODES
1096 ;1.6 INDICATES DIRECTORY DEVICE
1097 ;1.5 INDICATES NON PHYSICAL DEVICE
1100 SNTDS==2 ;TERMINAL DISPLAY
1101 SNLPD==3 ;DATA PRODUCTS LPT
1109 SN340==13 ;340 AS ASCII DEVICE
1110 ;SN340I==14 ;INTERPRETED DISPLAY ON 340
1112 SNCOD==16 ;CODE DEVICE
1119 SNNET==26 ; Arpanet NCP
1120 SNLPV==27 ;VOGUE LPT
1121 SNSTK==30 ;STANFORD KEYBOARD
1122 SNMSP==31 ;CROCK "IPC" FOR NOW
1123 IFN CHAOSP,SNCHA==32 ;CHAOS NET
1124 IFN TCPP,SNTCP==33 ; Internet TCP/IP network device
1125 SNTRAP==34 ;TRAP "DEVICE"
1126 IFN INETP,SNIPQ==35 ; Internet Queue
1127 IFN KS10P,SNUBI==36 ; Unibus interrupt
1132 SNCLK==62 ;CLO, CLU, & CLI
1135 SNDIRH==65 ;DIRHNG "DEVICE"
1136 SNLCK==66 ;LOCK "DEVICE"
1138 SUBTTL SYSTEM VERSION NUMBER & MISC MACROS
1140 ITSMCH==:<MNAME SIXBIT/,/> ; Define SIXBIT machine name symbol
1141 ITSVRS==:.FNAM2 ; Preserve SIXBIT symbol value of ITS version #
1142 FNM==ITSVRS ;SRI GETS VERSION NUMBER
1143 ;WORKS FOR DECIMAL IGNORES LOW ORDER NON-NUMERIC CHRS
1147 IFGE ZZZQ-'0,IFLE ZZZQ-'9,.GO BAR
1168 ZZZ==10 ;SAVE OLD RADIX
1170 MOVEI I,[MNAME [.ASCII ?
1175 ;"MONTHS OF THE YEAR" MACRO
1178 IRPS M,,[JAN:FEB:MAR:APR:
1180 SEP:OCT:NOV:DEC:]L,,[31. 29. 31. 30.
1187 FOO==-1 ;ACCUMULATED VALUE FOR FOLLOWING DEFINITION:
1190 FOO==FOO+L] ;JAN=-1, FEB=30., MAR=59., ETC.
1201 SSYS==0 ;LENGTH OF SYS CODE
1204 IFN CKPAR,.ERR LOSS AT EBLK
1206 IFE .-CKZZ,.STOP ;NO WORDS BETWEEN BBLK AND EBLK
1207 CONC CK,\CKNUM,==CKZZ-.,,CKZZ
1214 IFE CKPAR,.ERR LOSS AT BBLK
1222 ;INSERT CALL TO THIS MACRO AT ANY PLACE IT IS POSSIBLE TO PCLSR
1223 ;(IF IT IS DESIRED FOR PCLSR TEST FEATURE TO TEST THAT SECTION)
1245 JRST 4,. ;PI 2 NOT OFF AND NOT IN PROGRESS
1248 SUBTTL DEFINE EXEC PAGES
1257 .!X==220000*ZZQ+2200,,ZZQQ
1260 ;EXEC MAP ASSIGNMENTS
1262 EXECPG 340P1, ;USED TO FETCH + TRACE 340 PNTRS
1264 REPEAT N340PB,CONC [EXECPG DPG]\.RPCNT,; ;DATA AREA PNTRS FOR 340 DATA
1266 EXECPG CORJF, ;CORE JOB FROM PAGE
1267 EXECPG CORJT, ;CORE JOB TO PAGE
1269 EXECPG VSB1, ;.VSCAN B1
1270 EXECPG VSB2, ;.VSCAN B2
1273 EXECPG T11CP, ;TEN11 CONTROL PAGE
1275 EXECPG PAREP, ;USED BY SYSTEM IN ITS DILIGENT EFFORTS TO FIX PARITY ERRORS
1277 IFN ECCMEM, EXECPG ECCPG, ;PAGE USED TO ACCESS ECC HISTORY
1280 EXECPG XGPC, ;LOW 2K OF XGP PDP-11 (USED TO TRACE BUFF POINTERS)
1281 EXECPG XGPB, ;2K BUFFER IN PDP-11 (CHANGES LOCATION)
1282 EXECPG XGPUB, ;XGP USER CORE EXEC PG SETUP TO POINT TO USER CORE DURING XGPIM SYSTEM CALL
1285 REPEAT NTTPG,[CONC [EXECPG TTPG]\.RPCNT,
1287 REPEAT NTVBP,[CONC [EXECPG TTR]\.RPCNT,
1289 IFN CHAOSP,[ IFN T11CHP,[
1290 EXECPG CHSPG ;CHAOS NET 10-11 COMMUNICATION PAGE
1291 T11CHS=400000+CHSPG*2000
1293 ;^ INSERT NEW EXEC PAGES HERE
1294 ;EXEC PAGES BELOW THIS POINT WILL BE COPYABLE BY USERS
1295 REPEAT NMMP,CONC [EXECPG MMP]\.RPCNT,; ;MMP TABLE
1296 MMP=MMP0*2000+400000 ;VIRTUAL ADDRESS OF MMP
1298 NEXPGS==EXPGN ;# EXEC PGS USED
1302 .YSTGWD ;STORAGE WORDS OKAY NOW
1304 IFN KL10P, LOC EPT+1000 ;KL needs a full DEC page for EPT
1306 IFE KSIMP, LOC EPT+1000 ;KS needs a full DEC page, too,
1307 IFN KSIMP, LOC EPT+2000 ; unless you are losing even worse.
1315 LOC 30 ; 8080 communications area
1324 IFE RP10P+RH10P,BBLK
1339 E.SPM ;POINTER , NEVER CHANGES
1348 IFN KA10P, JSR UUOH ;UUO TRAP
1349 IFE KA10P, JSR LUUOEX ;USER UUO IN EXEC MODE (ERROR)
1353 REPEAT 6*2, JSR RINT ;INITIALIZE ANY UNUSED PI LOCNS
1356 IFN KA10P, JSR 60H ;60 TRAP
1357 IFN C1MXP, REPEAT 2*7., JSR RINT1 ;INITIALIZE C1MPX LOCNS
1360 JSR CLKBRK ;PROCESSOR OR CLOCK INTERRUPT
1364 JSR LPTBRK ;LPT,DISPLAY,PTP,PTR,OTHER PROCESSOR
1365 IFN 340P, JSR DRECYC ;HACK HACK
1368 JSR TTYBRK ;TTY,DATAPOINT KLUDGE
1372 JSR UTCBRK ;MICRO TAPE OR DISK (S)
1382 JSR DIGNOR ;340 DISPLAY BLKO GETS PATCHED IN HERE
1383 CONO PI,4000+200_<-SDCHN> ;HACK HACK
1393 JSR OMPXBK ;OUTPUT MPXR, NVID, ETC.
1409 PFOPC: 0 ;PAGE FAIL OLD PC STORED HERE
1410 PFNPC: PFAIL ;WHERE TO GO FOR PAGE FAIL
1413 EPTDIA: JRST SALV ;STD COMMAND START ADDRESS ("DIAGNOSTIC")
1414 EPTDDT: JRST DDT ;DDT COMMAND START ADDRESS
1415 EPTSTL: JRST DSKDMP ;STL COMMAND START ADDRESS ("LOADER")
1416 EPTITS: JRST BEG ;STM COMMAND START ADDRESS ("MONITOR")
1419 EPTTR1: CAI ;ARITH OVERFLOW EXEC MODE IGNORED
1420 EPTTR2: JSR ILLTRP ;PDL OVERFLOW EXEC MODE IS AN ERROR
1421 EPTTR3: JSR ILLTRP ;ONE PROC CODE?
1424 DTEBPO: 0 ;BYTE TRANSFER NOT USED
1425 DTEBPI: 0 ;BYTE TRANSFER NOT USED
1426 DTELOC: ;INTERRUPT FROM CONSOLE 11
1427 IFE PDCLKP, JSR DTEBRK ;IF USING 11 FOR CLOCK, FIRST CHECK FOR CLOCK INTR
1428 .ELSE JSR TTYBRK ;OTHERWISE JUST USING 11 FOR TTYS.
1430 DTEPRO: 0 ;NO PROTECTED EXAMINES
1432 DTEPRI: 0 ;NOR PROTECTED DEPOSITS
1436 REPEAT 8,MUUOEX ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1439 EPTEBC: 0 ? 0 ;EBOX COUNT FOR PROC BRK ROUTINES AND NULL JOB
1440 EPTMBC: 0 ? 0 ;MBOX DITTO
1443 JSR OVHBRK ;INTERVAL TIMER INTERRUPT, EVERY 39 MILLISEC ON CHANNEL 1
1445 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1446 ;ON KL10 OVHBRK CHECKS WHERE THE PC IS IF IT IS IN EXEC MODE.
1448 DEFINE OVHMTR NAME ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1449 OVHMT1 NAME,\. ;EVALUATE "." AT THIS POINT IN TIME
1453 DEFINE OVHMT1 NAME,POINT
1454 OVHTAB [DEFINE OVHTAB FOO
1455 FOO] <(SIXBIT/NAME/)>,,POINT ? 0
1459 ;THIS IS THE CORRESPONDING REMOTE MACRO
1468 UBAQIB ; Pointer to interrupt table for Unibus Q (dsk)
1471 UBAIIB ; Pointer to interrupt table for Unibus I (other)
1474 EPTPFW: 0 ; Page fail word
1475 EPTPFO: 0 ; Page fail old PC
1476 EPTPFN: PFAIL ; Page fail new PC
1478 IRP I,,[1,2,3,4,5,6,7]
1480 EPTP!I!W: 0 ; Page fail word
1481 EPTP!I!O: 0 ; Page fail old PC
1482 EPTP!I!N: PF!I!AIL ; Page fail new PC at PI level I
1486 EPTTR1: CAI ;ARITH OVERFLOW EXEC MODE IGNORED
1487 EPTTR2: JSR ILLTRP ;PDL OVERFLOW EXEC MODE IS AN ERROR
1488 EPTTR3: JSR ILLTRP ;TRAP 3 SHOULD NOT HAPPEN
1491 EPT1PO: 0 ;ONE-PROCEED OLD-PC
1492 EPT1PN: MUUOEX ;ONE-PROCEED SHOULD NOT HAPPEN IN UPT=EPT MODE
1495 EPTUEN: MUUOEX ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1502 ;Here because with EPT at 0, this is the second half of physical
1503 ; page 0, which is uncached, which we want, and otherwise unused.
1505 LOC EPT+1000 ; IMP data reformatting buffers
1511 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1512 ;ON KS10 PC SAMPLING FACILITY IS USED, 60-CYCLE CLOCK COLLECTS THAT DATA
1513 ;NOTE THAT THE TABLE FORMAT IS NOT THE SAME AS ON KL10, FOR SPEED REASONS
1515 DEFINE OVHMTR NAME ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1516 OVHMT1 NAME,\. ;EVALUATE "." AT THIS POINT IN TIME
1520 DEFINE OVHMT1 NAME,POINT
1521 OVHTAB [DEFINE OVHTAB FOO
1522 FOO] POINT,,<(SIXBIT/NAME/)>
1526 ;THIS IS THE CORRESPONDING REMOTE MACRO
1532 IFN DL10P,[ ;DL10 COMMUNICATIONS AREA IN NON-ENCACHED LOW CORE
1533 IFN KL10P, LOC 500 ;500-777 RESERVED FOR DL10 AREA AND BUFFERS
1534 IFN KA10P, LOC 100 ;IF KA10, PUT DL10 AREA JUST BELOW START OF SYSTEM
1535 IFN KS10P, .ERR DL10 on KS10 system?
1537 DL10AR: JSR TTYBRK ;INTERRUPT INSTRUCTION (NOT ACTUALLY USED)
1539 ;FOLLOWING LOCATIONS MUST AGREE WITH IOELEVEN PROGRAM
1541 DL10VR: NDLTYS_8+NFDLTY ;"I/O VERSION NUMBER"
1542 DL10UP: 0 ;INCREMENTED BY -11 EVERY 1/60 SECOND.
1543 ;SETOM'ED BY 10 EVERY 1/2 SECOND. DETECTS UP/DOWNNESS.
1545 DL10SO: 0 ;LINE # TO SET OUTPUT DONE FOR, SET BY -10, CLEARED BY -11.
1547 DL10IL: 0 ;LINE # WITH INPUT AVAILABLE. CLEARED BY -10 AFTER CHAR READ.
1548 DL10IC: 0 ;CHARACTER RECEIVED FROM THAT LINE.
1550 DL10OD: 0 ;LINE # WITH OUTPUT DONE. CLEARED BY -10 WHEN PROCESSED.
1551 DL10BS: 0 ;BUFFER SIZE FOR THAT LINE.
1553 DL10BP: 0 ;WIERD DL10 BYTE POINTER TO TTY OUTPUT BUFFER.
1554 DL10CC: 0 ;NUMBER OF CHARACTERS BEING OUTPUT TO TTY.
1555 DL10LN: 0 ;LINE # OUTPUT BEING SENT TO. CLEARED BY -11 WHEN GOBBLED.
1557 DL10CL: 0 ;DIALUP LINE CONNECT OR DISCONNECT INFO. SET BY 11, 0'D BY 10.
1558 ;0000NN => LINE # NN DISCONNECTED.
1559 ;01RTNN => LINE # NN CONNECTED, %TTISP=R, %TTOSP=T.
1561 DL10PL: 0 ;LINE # TO SET PARAMETERS OF. CLEARED BY -11 WHEN PROCESSED.
1562 DL10PR: 0 ;VALUE OF DH11 LPR REGISTER.
1563 DL10PS: 0 ;NUMBER OF BYTES OF OUTPUT BUFFERING DESIRED.
1565 DL10XD: 0 ;1=EXAMINE -11 CORE, 2=DEPOSIT. CLEARED BY -11 WHEN DONE.
1566 DL10XA: 0 ;EXAMINE/DEPOSIT ADDRESS
1567 DL10XW: 0 ;EXAMINE/DEPOSIT WORD
1569 GLPTBP: 0 ;BYTE POINTER TO BUFFER FOR GOULD LPT
1570 GLPTBC: 0 ;BYTE COUNT " " - IF NONZERO BUFFER IS ACTIVE BY PDP11.
1571 GLPTER: 0 ;NONZERO => PDP11 CLAIMS PRINTER IS BROKEN.
1572 GLPGRF: 0 ;NONZERO => GRAPHICS MODE (SET BY 10).
1574 ;CHAOS NET SHARED VARIABLES
1575 DLCINI: 1 ;THE COMMENTS ARE IN THE CHAOS FILE
1587 DLXEND:: ;END OF ASSIGNED DL10 AREA
1589 IFG .-DL10AR-100, .ERR DL-10 AREA TOO BIG, CHANGE CONO IN TSS INITIALIZATION
1590 LOC DL10AR+100 ;SKIP OVER 11-ACCESSIBLE AREA
1592 DL10BF: BLOCK <261.+3>/4 ;OUTPUT BUFFER, 8-BIT BYTES. HAS TO BE NON-ENCACHED.
1595 GLPBSZ==255. ;BUFFER SIZE IN WORDS. MAXIMUM POSSIBLE WITHOUT MODIFYING (ELIMINATING)
1596 ;"WORD COUNT" HARDWARE IN DL-10.
1597 GLPMPP: 0 ;MAIN PROGRAM POINTER - IF NONZERO BUFFER IS ACTIVE BY M.P. LEVEL (PDP10)
1598 GLPMPC: 0 ;MAIN PROGRAM COUNTER
1599 GLPTBF: BLOCK GLPBSZ ;ONE BUFFER FOR NOW
1602 IFN KL10P, IFG .-1000,.ERR DL10 STORAGE TOO BIG, DOESN'T FIT IN UNENCACHED PAGE
1603 IFN KA10P, PATB=. ;MOVE ORIGIN OF SYSTEM UP
1606 IFN NETYS,[ ;ASSEMBLE DTE20 CONTROL AREA
1607 IFE KL10P, .ERR DTE20 WITHOUT KL10?
1610 DTEVER: NETYS_8+NFETY ;400 I/O VERSION NUMBER, SET BY 10, CHECKED BY 11
1612 DTECHK: 0 ;401 INCREMENTED BY 11 60 TIMES PER SECOND
1613 ;SETOMED BY 10 EVERY HALF SECOND.
1614 ;USED TO TELL 11 THAT 10 IS UP.
1616 DTEINP: -1 ;402 -1 IF IDLE, ELSE INPUT REQUEST FROM 10 TO 11
1617 ;SETUP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING THIS.
1618 ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES HERE
1619 DTEOUT: -1 ;403 -1 IF IDLE, ELSE OUTPUT REQUEST FROM 10 TO 11
1620 ;SETUP DTEBPO IN EPT BEFORE SETTING THIS.
1621 ;CONTENTS OF DTEINP AND DTEOUT ARE DESCRIBED BELOW.
1622 ;THESE ARE SET BY THE 10, SETOMED BY 11 WHEN TRANSFER STARTS.
1623 ;RH # BYTES EXPECTED. LH COMMAND+LINE#. COMMANDS ARE:
1624 %DCTYO==1000 ;TELETYPE OUTPUT (NOTE 4.1=0 INPUT, =1 OUTPUT)
1625 %DCETI==2000 ;ETHERNET INPUT (N.Y.I.)
1626 %DCETO==3000 ;ETHERNET OUTPUT (N.Y.I.)
1628 DTELSP: -1 ;404 LINE # WHOSE SPEED IS TO BE SET, SET BY 10, SETOMED BY 11
1629 DTELPR: -1 ;405 CORRESPONDING DH11 LINE PARAMETER REGISTER,,BUFFER SIZE
1631 DTEOST: -1 ;406 LINE# TO START OUTPUT ON (SET OUTPUT DONE).
1632 ;SET BY 10, SETOMED BY 11
1634 BLOCK 1 ;407 NOT USED
1636 DTETYI: -1 ;410 TELETYPE INPUT. SET BY 11, SETOMED BY 10.
1637 ;LH LINE#,,RH CHAR RCVED.
1639 DTEODN: -1 ;411 TELETYPE OUTPUT DONE. SET BY 11, SETOMED BY 10.
1640 ;LH LINE#,,RH BUFFER SIZE.
1642 DTEHNG: -1 ;412 HANGUP/DIALIN WORD. SET BY 11, SETOMED BY 10.
1643 ;0000NN LINE # NN HUNG UP.
1644 ;01RTNN LINE # NN HAS SPEED RCV=R, XMT=T (CODES AS IN TTYTYP)
1646 ;^ ADD MORE LOCATIONS HERE, NOT TO EXCEED 437
1648 ;LOCATIONS 440-457 ARE KNOWN ABOUT BY BOTH IOELEV AND KLDCP,
1649 ;USED MOSTLY FOR NON-TIMESHARING PROGRAMS.
1654 ;FOR VARIABLES (MONITORABLE WITH KEYS)
1655 NSKED: 0 ;# TIMES NON-NULL JOB IS RUN
1656 NNSKED: 0 ;# TIMES NULL JOB IS RUN
1657 NRSKED: 0 ;# OF FULL SCHEDULES (MUST SCAN ALL JOBS)
1658 NSSKED: 0 ;# OF SCHEDULES SAVED BY SCHBLN FEATURE.
1659 NRESKED:0 ;# TIMES A JOB SCHEDULED JUST AFTER IT RAN.
1660 NSCHDU: 0 ;TOTAL NUMBER OF JOBS FOUND RUNNABLE IN FULL SCHEDULES
1661 NNULBK: 0 ;# OF CONSECUTIVE BLOCKS OF NULLTIME.
1662 NUINT: 0 ;# TIMES USER GIVEN INTERRUPT
1663 NAUINT: 0 ;# ATTEMPTED USER INT (POSSIBLY UNSUCCESSFUL DUE TO PG FAULT)
1664 NPCLSR: 0 ;# ATT TO PCLSR
1665 NEPCLS: 0 ;# PCLSRS WHERE JOB WAS IN EXEC MODE
1666 NFPCLS: 0 ;# OF PCLSRS THAT FAILED (JOB WAS IN EXEC MODE AND NOT BLOCKED)
1667 NSOUSR: 0 ;# ATT TO SWAP OUT USR
1668 NSOPGS: 0 ;# TIMES THRU LOOP LOOKING FOR PG TO SWAP OUT
1669 NPGSO: 0 ;# TIMES AT SWOPG
1670 NAGEAB: 0 ;# TIMES SWAP OUT ABORTED BY AGE BITS
1671 NSHRAB: 0 ;# TIMES SWAP OUT ABORTED BY SHARING
1672 NPGFLT: 0 ;# PAGE FAULT (ALL CAUSES)
1673 NCLKI: 0 ;# CHNL 7 INTS (ALL CAUSES)
1674 NPGLD: 0 ;# TIMES AT PGLDU
1675 NUFLS: 0 ;# TIMES AT UFLS
1676 NTUSB: 0 ;# TIMES USER SWAP BLOCKED
1677 NTSBUP: 0 ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND LET IN
1678 NTSBUB: 0 ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND BLOCKED
1679 NTSBUU: 0 ;# TIMES SWAP BLOCKED USER UNBLOCKED BEFORE TIME (MEM APPARENTLY AVAIL)
1680 NAGES: 0 ;# TIMES AROUND PAGE-AGEING LOOP
1682 ;THE FOLLOWING FOUR MUST BE CONSECUTIVE
1683 NRPI: 0 ;# REFS TO PAGE IN (BUT MAP WAS NOT SET UP, ETC)
1684 NRPCI: 0 ;# PAGE FAULTS REFS TO PAGE COMMING IN
1685 NRPO: 0 ;# REFS TO PAGE OUT
1686 NRPGO: 0 ;# TO PAGES GOING OUT
1687 CLKBRS: 0 ;CLKBRK COPIED INTO HERE (SINCE CLKBRK GETS CHANGED)
1689 PAT: IFG .-PATB-40,.ERR PAT TOO HIGH
1695 PATCH: BLOCK 140 ;PATCH SPACE CODE AND CONSTANTS
1701 BLOCK 40 ;PATCH SPACE VARIABLES
1703 SUBTTL PROCESSOR BREAK ROUTINES
1705 DEFINE CLKSAV BRK=CLKBRK
1706 IFE KA10P, XCT CLCXSV ;DATAI PAG,CLCX(U)
1707 XCT CLUSAV ;STORE U IN AC17S FOR CURRENT USER (UNLESS NULL JOB)
1708 MOVE U,BRK ;SAVE AWAY BRK
1710 IFSN BRK,CLKBRK, MOVEM U,CLKBRK ;SAVE IN CLKBRK IF NOT CLKBRK
1714 DEFINE CLKLEV ;ENTER CLOCK-LEVEL CONTEXT
1715 SPCCTX 0,1,EPT ;UPT = EPT; CLOCK LEVEL CONTEXT.
1717 JRST 2,@.+1 ;MAKE XCTR WORK RIGHT
1729 IFN KL10P,[ ;CODE USED IF GETTING 60-CYCLE CLOCK FROM PDP11 (IN CASE MAIN CLOCK DOWN)
1733 ;THE TTY CODE ASSUMES, SINCE THE DTE20 IS USED BY ITS SOLELY AS
1734 ;THE INTERFACE TO THE CONSOLE TTY AND THE LINE-FREQUENCY CLOCK,
1735 ;THAT IT MAY FREELY GIVE THE "MONITOR TTY OUTPUT" COMMAND WHEN
1736 ;THE "MONITOR TTY OUTPUT DONE" INTERRUPT IS RECEIVED. ANY CODE
1737 ;WHICH HACKS THE DTE OTHER THAN AT PI LEVEL OR IN ITS INITIALIZATION
1738 ;MUST THEREFORE OBSERVE THE FOLLOWING PROTOCOL:
1740 ; SKIPN DTEFLG ;WAIT FOR MONITOR TTY OUTPUT TO GO THROUGH
1745 ; SKIPN DTEFLG ;WAIT FOR THIS COMMAND TO GO THROUGH
1752 CONSO PI,1_<7-APRCHN> ;TEMPORARY (I HOPE) HARDWARE BUG IN KL10 PI HARDWARE
1753 JRST 4,. ;ALLEGEDLY FIXED
1754 CONO PI,TTYRQ ;REALLY WANTED TO INTERRUPT ON TTY CHANNEL,
1755 JFCL ; BUT HAVE TO DO IT THIS WAY DUE TO
1756 JFCL ; MISFEATURES IN THE PI HARDWARE
1757 SKIPN DTECLK ;DON'T TAKE OUT THE JFCLS!!
1759 CLKSAV DTEBRK ;TAKE CLOCK INTERRUPT
1764 CLKBRK: 0 ;PC SAVED HERE BY JSR FOR CLOCK INT.
1768 CONSO PI,1_<7-APRCHN> ;HARDWARE BUG IN KL10 PI SYSTEM
1769 JRST 4,. ;ALLEGEDLY FIXED
1771 IFE KA10P, CONO PI,020000+200_<-APRCHN> ;BAG-BITING DEC LOSERS CHANGED
1772 ;FUNCTIONAL SPECIFICATION OF
1773 ;PROGRAMMED REQUESTS
1774 CLKBR2: CLKSAV ;SAVE AC BLK STATUS AND U.
1776 SKIPGE U,USER ;PICK UP INDEX OF CURRENT USER, SKIP UNLESS NULL JOB
1777 JRST [ SPM UPGML ;JUMP IF NULL JOB WAS RUNNING
1779 SPM UPGML(U) ;STORE PAGE MAP AWAY
1780 AOSN UFLSF ;SKIP UNLESS GOT HERE FROM UFL6
1782 MOVEM T,AC16S(U) ;STORE AWAY T
1784 BLT T,AC15S(U) ;STORE REST OF ACS
1785 CLKBKR: CLKLEV ;SET UP CROCK-LEVEL CONTEXT HARDWARE
1787 ;;; CHECK FOR THINGS OTHER THAN CLOCK TICKS (PAR ERR, PG FAULT, NXM, PDLOV,
1788 ;;; AROV AND ARFOV ARE POSSIBLE ON ONE MACHINE OR THE OTHER).
1791 CONSZ 270220 ;CHECK PDL OV, MEM PROTECT, NXM, FOV, AR OV
1792 JRST CLKB1 ;JUMP ON LOSSAGE
1793 CLKB1D: CONSZ PI,200000
1799 JRST PFA6 ;PAGE FAULT
1800 CONSZ 7740 ;This is all but the cache sweep done bit (=20).
1801 JRST CLKB2 ;APR ERROR INTERRUPT
1807 CONSZ 7620 ;This is all but the interval timer's bit (=40).
1808 JRST CLKBKS ; (Memory ECC (=100) doesn't interrupt)
1813 IFN PDCLKP\KA10P,[ ;IF 60 HZ CLOCK IS IN HARDWARE
1815 JRST CLK1F ;INTERRUPT NOT FROM CLOCK, MUST BE SPURIOUS (OR
1819 ;DROP THROUGH FOR PLAIN CLOCK-TICK.
1821 ; 60-CYCLE CLOCK INTERRUPT
1824 ;IFN 340P, DATAI CLK1,LQTIM
1825 SOSG @CLROOT ;COUNT DOWN, SKIP IF NOT YET TO NEXT REQUEST
1826 JRST CLQBRK ;SERVICE CLOCK QUEUE REQUEST
1828 IFN KS10P, CONO 020040+APRCHN ;Clear interval flag
1829 IFN PDCLKP\KA10P, CONO CLK,CLKINT+APRCHN ;Clear hardware clock flag
1830 IFE PDCLKP\KA10P\KS10P, SETZM DTECLK ;Clear software clock flag
1835 IFN KL10P, SKIPGE DTESWR
1836 IFN KS10P, SKIPE 8SWIT0
1837 BUG DDT,[SWITCH 0 IS UP]
1838 IFN KS10P, SETZM 8SWIT0 ; Allow hacker to <alt>P
1839 IFN CHAOSP, IFN T11CHP, PUSHJ P,T11WAK ;RUN TEN-11 CHAOS NET INTERFACE
1846 JRST DSTPD ;WAIT IF DTIME CLOBERED DUE TO RATE EXCEEDED
1854 CONO DIS,1100\SDCHN_3\DISCHN ;RESTART DISPLAY
1858 SKIPN T,E.SPGW ; E&S WAITING FOR PAGE
1860 HRRZM T,DISSPG ; SAVE FOR SWPPIN
1861 SKIPL T,DISUSR ; -1 IMPLIES NO USER
1862 MOVEM T,DISSWI ; USER INDEX FOR SWPPIN
1866 SKIPE @TT11HD ;ANY INPUT FROM PDP11?
1867 PUSHJ P,TT11IN ;YES, DO INPUT INT LVL STUFF FOR IT,.
1870 PUSHJ P,DZSCAN ;SCAN DZ'S FOR INPUT
1874 PUSHJ P,TTECH ;CHARACTERS TO BE ECHO ED
1876 SKIPE STYNTA ;IF THERE ARE STY'S CONNECTED TO NETWORK I/O,
1877 PUSHJ P,STYNTC ;XFER BETWEEN THEM.
1879 IFN KS10P, PUSHJ P,OVHCLK
1882 AOS TIME ;GET HERE EVERY THIRTIETH OF A SECOND
1884 SKIPE PREEMP ;CHECK FOR PRE-EMPTION INTERRUPT
1888 JRST CLKB5 ;TIME NOT UP
1890 JRST SCHED ;SCHEDULE
1894 SKIPE PREEMP ;CHECK FOR PRE-EMPTION INTERRUPT. THIS IS HERE
1895 JRST PRESCD ; BECAUSE OF SCREW CASE WHEREBY DLSRCH PREVENTS
1896 ; PREEMP FROM DOING ANYTHING, AND PREEMP WOULD
1897 ; PREVENT CLOCK FLAG FROM GETTING CLEARED IF IT WAS
1898 ; TESTED BEFORE CLOCK.
1900 ; MOVEI J,APRCHN ;DO NOT TAKE THESE OUT WITHOUT SEEING RG!!!!
1903 AOS CHSPUR+APRCHN ;COUNT SPURIOUS INT
1904 JRST SCHED ;(MIGHT HAVE BEEN RUNNING NULL JOB)
1912 CLKB2: CONSZ 2000 ;NXM
1914 CONSZ 1040 ;POWER FAIL OR I/O PAGE FAIL
1915 BUG HALT,[KL: POWER FAIL OR I/O PAGE FAIL]
1916 CONSZ 300 ;CACHE DIR OR PT DIR PAR ERR.
1917 BUG HALT,[KL: CACHE OR MAP DIR PAR ERR]
1918 CONSO 4400 ;SBUS ERR OR MB PAR ERR
1919 JRST SCHED ;CALLED MEMHNG, AND NOTHING ELSE => SCHEDULE.
1920 SETOM PARRSN ;TEL PAR ERR SCANNER THIS IS AN INTERRUPT, NOT A PG FAIL.
1921 RDERA PARERA ;STORE ADDR OF PAR ERR.
1926 CLKBKS: CONSZ 7600 ; Any bad guys? (8080 -> KS is 20, Interval is 40,
1927 JRST CLKKS1 ; Memory ECC is 100.)
1928 CONO 020020+APRCHN ; 8080 wants service. Clear the bit.
1929 MOVEI I,NFKSTY ; TTY # (fancy name for 0)
1930 CONO PI,TTYOFF ; Pretend this is TTY interrupt level.
1931 SKIPN A,8CTYIN ; Any input from 8080?
1933 SETZM 8CTYIN ; Yes: Make room for more.
1934 PUSHJ P,NTYI1 ; Stuff it into the tty.
1935 MOVEI I,NFKSTY ; Just in case...
1936 CLKKS2: SKIPN 8CTYOT ; Room for output yet?
1937 PUSHJ P,TYPSC ; Yes: Get some now.
1938 CONO PI,TTYON ; No: 8080 will wake us up later.
1939 JRST SCHED ; Null job might have been running.
1941 CLKKS1: CONSZ 1000 ;Power failure
1942 BUG HALT,[KS: POWER FAIL]
1943 CONSZ 6000 ;KS -> 8080 or Flag 24
1944 BUG HALT,[KS: KS->8080 FLAG OR FLAG 24 SET]
1947 CONSO 200 ;Bad memory data
1955 CLUFLS: CONO PI,CLKON ;FROM UFLS
1963 ;CLOCK QUEUE SERVICE
1964 CLQBRK: SKIPG U,CLROOT ;GET POINTER TO CURRENT BLOCK
1965 BUG ;CLK QUEUE SCREWED
1966 SKIPG T,1(U) ;GET POINTER TO NEXT BLOCK
1967 BUG ;CLK QUEUE SCREWED
1968 MOVEM T,CLROOT ;SET UP POINTER FOR NEXT BLOCK
1969 SETOM 1(U) ;INDICATE CURRENT BLOCK IDLE
1970 XCT 2(U) ;EXECUTE REQUEST (PROBABLY A JRST)
1971 ;FALL THROUGH IF SINGLE INST RQ
1972 CLQRET: ;RETURN FROM REQUEST
1973 SKIPN @CLROOT ;SKIP IF TIME TILL NEXT RQ NONZERO
1974 JRST CLQBRK ;ZERO TIME DELTA, DO NEXT RQ
1975 JRST CLQBRT ;RETURN TO CLOCK ROUTINE
1977 CLQTTR: JUMPE TT,CLQRET ;COMMON RETURN FOR TT IDLE FLAG
1978 CLQREE: MOVEI E,CLQRET ;RE ENTER RQ
1980 ;CLOCK OFF OR IN PROGRESS LEVEL ADD TO CLOCK QUEUE, CALL BY JSP E,
1981 ; T HAS TIME TILL RQ IN 60'THS
1982 ; C POINTS TO THREE WORD BLOCK, RQ'ED INST IS IN THIRD
1983 CLQPUT: MOVEI B,CLROOT-1
1984 CLQPU2: MOVE A,B ;REPLACE POINTER TO PREV BLOCK WITH CURRENT
1985 SKIPG B,1(B) ;GET LINK TO NEXT BLOCK
1986 BUG ;CLK QUEUE SCREWED
1987 SUB T,(B) ;SUBTRACT TIME DELTA FOR NEXT BLOCK
1988 JUMPG T,CLQPU2 ;JUMP IF RQ LATER THAN CURRENT BLOCK
1989 JUMPE T,CLQPU6 ;JUMP IF RQ SAME AS " " (COULD USE PU2 BUT THIS FASTER)
1990 ADD T,(B) ;RQ EARLIER, ADD BACK
1991 MOVEM T,(C) ;SET DELTA OF BLOCK BEING ADDED
1992 SUB T,(B) ;COMPUTE NEG OF DELTA FOR NEXT BLOCK
1993 MOVNM T,(B) ;SET TIME DELTA FOR NEXT BLOCK
1994 MOVEM B,1(C) ;SET LINK OF NEW BLOCK TO NEXT
1995 MOVEM C,1(A) ;SET LINK OF PREV BLOCK TO NEW
1998 CLQPU6: SETZM (C) ;SET TIME DELTA OF NEW BLOCK TO ZERO
1999 MOVE A,1(B) ;GET POINTER TO NEXT BLOCK
2000 MOVEM A,1(C) ;SET POINTER OF NEW TO NEXT BLOCK
2001 MOVEM C,1(B) ;SET POINT OF CURRENT TO NEW BLOCK
2004 ;MAIN PROG LEVEL ADD TO CLOCK QUEUE
2005 ;CALL BY PUSHJ P,CLQADD
2006 ;WITH POINTER TO BLOCK IN NEXT WORD AND TIME TILL RQ IN T IN 60'THS
2007 ;POINTER TO BLOCK SHOULD NOT BE INDEXED BY C
2009 CLQAD1: MOVEI T,1 ;RQ IN ONE TICK
2011 MOVE C,@-1(P) ;GET BLOCK POINTER
2013 SKIPL 1(C) ;SKIP IF IDLE
2014 JRST POPCJ1 ;IGNORE THIS RQ, BLOCK ALREADY ACTIVE
2018 SKIPN (C) ;DELTA WORD OF IDLE BLOCK SHOULD BE ZERO
2019 SKIPG T ;TIME SHOULD BE NON-ZERO
2020 BUG ;CLK QUEUE SCREWED
2022 JSP E,CLQPUT ;ADD RQ
2023 CLQDE4: CONO PI,CLKON
2029 ;DELETE CLOCK QUEUE ENTRY
2030 ;CALL BY PUSHJ P,CLQDEL WITH POINTER TO BLOCK IN NEXT WORD
2032 MOVE C,@-1(P) ;GET BLOCK POINTER
2035 SKIPGE 1(C) ;IGNORE RQ TO DELETE IF IDLE
2043 CLQCLR: MOVEI B,CLROOT-1 ;CLOCK OFF OR IN PROGRESS VERSION
2045 SKIPG B,1(B) ;GET POINTER TO NEXT BLOCK
2046 BUG ;CLK QUEUE SCREWED
2047 CAME B,C ;SKIP IF FOUND BLOCK TO DELETE
2049 SKIPG B,1(B) ;GET POINTER TO BLOCK AFTER ONE TO DELETE
2050 BUG ;CLK QUEUE SCREWED
2051 MOVEM B,1(A) ;PATCH AROUND DELETED BLOCK
2053 ADDM A,(B) ;ADD DELTA OF DELETED BLOCK TO NEXT
2054 SETZM (C) ;CLEAR DEL
2055 SETOM 1(C) ;MARK IDLE
2058 OVHMTR PGF ;PAGE FAULT
2062 PFAILU: 0 ;SAVED U AS OF A PAGE FAILURE
2063 PFINST: 0 ;PF INSTRUCTION IF XCT
2064 PFOPC1: 0 ;SAVE PFOPC WHILE SWITCHING TO CLK LEVEL (PROTECT AGAINST XCTRI)
2067 ;PAGE FAULTS COME HERE, WITH PC IN PFOPC, AND PI SYSTEM TURNED OFF.
2069 PFAIL: MOVEM U,PFAILU
2071 ANDI U,%PFCOD ;GET THE PFAIL CODE FROM THE PFW
2074 JRST PFA2 ;IT'S A PAR ERR; BYPASS XCTR HACKS
2078 LDB U,[331100,,(U)] ;GET OPCODE OF LOSING INSTRUCTION.
2079 ;ASSUME THAT IN EXEC MODE VIRTUAL
2080 ; AND PHYSICAL ADDRESSES ARE IDENTICAL
2081 ; FOR INSTRUCTION FETCHES. ALSO ASSUME
2082 ; THAT NOBODY DOES XCT OF XCT OF XCTR.
2083 PFA4: CAIE U,XCTRI_-33 ;SKIP IF "XCTR WITH INHIBIT"
2085 REPEAT 2, AOS PFOPC ;ONCE COMPENSATING FOR INSTR ABORT, AND ONCE TO SKIP
2087 JRST 17,@PFOPC ;KL-10 CROCK: JRST 17, TURNS ON PI SYSTEM
2089 PFA1: CAIE U,XCTR_-33 ;SKIP IF "XCTR WITH NO INHIBIT"
2091 PFA2: CONSO PI,77400 ;PI IN PROGRESS?
2092 CONSO PI,1 ;CHANNEL 7 ENABLED?
2093 BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS OR CLKOFF]
2095 BUG AWFUL,[PAGE FAULT IN NULL JOB]
2098 MOVE U,PFAILU ;RESTORE U SO CLKSAV CAN RE-SAVE IT
2099 TPFLT1: SETOM PFAILF
2100 CONO PI,CLKRQ ;CAUSE CLK BREAK AND PI SYSTEM ON
2101 JRST . ;TAKES A WHILE TO GO OFF
2103 ;COME BACK HERE PI IN PROGRESS ON CLK CHANNEL
2105 MOVEM T,CLKBRK ;SAVE PC AS OF PAGE FAULT AS PLACE INTERRUPTED FROM
2106 AOSN PFAILF ;IF INTERRUPTED FROM INTPFL,
2107 JRST PFA9 ; PC DOESN'T POINT TO FAULTING INSTRUCTION
2108 TLNE T,%PSUSR ;MAYBE SPURIOUS MPV ON IOT IN USER MODE?
2110 JRST PFA9 ;CAN'T BE, I/O IS LEGAL
2113 CAIE TT,%PFPNA ;CAN'T BE IF PAGE FAULT IS REALLY SOME OTHER RANDOM BREAK
2114 CAIN TT,%PFILW ;SUCH AS A PARITY ERROR
2118 ; MOVEM T,UPOPC(U) ;SOLELY FOR THE .OPC USER VARIABLE
2119 LDB E,[$PFPNO,,UPFW(U)] ;FAILING PAGE NO
2121 ANDI D,%PFCOD ;GET THE PAGE-FAULT CODE.
2122 MOVEI A,0 ;INIT USER INT BITS
2125 JRST PFA5 ;REAL PAGE FAULT OR RWF
2129 JRST PFA7 ;OTHER RANDOM BREAKS
2132 JRST PFA14 ;PARITY ERROR
2133 MOVSI D,SCLBPF ;UNKNOWN PFW, GET SYSTEM JOB TO BARF ABOUT IT
2135 BUG PAUSE,[BAD PAGE FAIL WORD ],OCT,BPFPFW ;LOSING IN REAL TIME
2143 JRST SCHED ;IGNORE THE FAULT (BUT DO A FULL SCHEDULE SO SYS JOB WAKES)
2145 PFA14: SETZM PARRSN ;SAY THIS IS PAR ERR TRAP, NOT PAR ERR INTERRUPT.
2147 MOVEM D,PARPFW ;SAVE PFW OF PAR ERR FOR ERROR MESSAGE
2148 AC7CTX ;SELECT AC BLOCK 7, USED BY UCODE.
2149 UMOVE D,0 ;SAVE THE AC THAT HOLDS THE BAD WORD
2151 SYSCTX ;AND RESET THE DATAO PAG TO NORMAL VALUE
2152 JRST CLKB1E ;GO SCAN FOR THE ERROR.
2154 PFA3: CAIE U,XCT_-33
2155 BUG HALT,[PAGE FAULT IN SYSTEM AT ],OCT,PFOPC ;BARF!
2156 MOVE U,@PFOPC ;QUUX! LET ONE LEVEL OF XCT WIN
2159 LDB U,[331100,,@PFINST]
2162 PFA11: XCTRI XR,[MOVE T,(T)] ;GET INSTRUCTION IN WHICH PAGE FAIL OCCURRED
2163 TLCA T,700000 ;AND CHECK HIGH THREE BITS OF OPCODE
2164 JRST PFA9 ;JUMP IF FAULT WAS ON INSTRUCTION FETCH
2166 JRST PFA12 ;JUMP IF INSTRUCTION NOT AN IOT
2167 PFA13: MOVSI TT,(HRRI T,)
2169 XCTRI XEA,TT ;COMPUTE ITS EFFECTIVE ADDRESS
2170 TLZA T,37 ;CLEAR @+XR, BUT LEAVE OPCODE AND AC
2171 JRST PFA9 ;JUMP IF FAULT ON INDIRECT WORD
2172 MOVEM T,MUUODP(U) ;IT WAS A SPURIOUS MPV, SO
2173 MOVE T,CLKBRK ; SIMULATE TRAPPING AS A UUO
2175 MOVEM T,XUUOH(U) ;STORE OLD PC
2177 MOVEM T,MUUOCX(U) ;AND OLD CONTEXT
2179 MOVEM T,CLKBRK ;GET NEW PC
2180 JRST CLKB5 ;AND RESTART USER AT UUOH0
2182 PFA12: TLNN T,700000 ;MAYBE AN INSTRUCTION OVERLAYED ON AN MUUO, E.G. LPMR
2183 TLNN T,040000 ;OPCODES 040-077 QUALIFY.
2186 TLNE T,777000 ;SKIP IF OPCODE WAS XCT
2190 ;Following instruction is suspected of not working (sometimes using wrong AC block)
2191 ; XCTRI XEA,T ;COMP EFFECTIVE ADDRESS OF XCT IN USER CONTEXT
2192 ;; JRST PFA11 ;AND GO PROCESS INSTRUCTION AT THAT ADDRESS
2193 ; JRST [ MOVEM T,TRMNAM(U) ;TEMPORARY FOR DEBUGGING
2195 ; JRST PFA9 ;HERE IF FAULT WAS IN INDIRECT CYCLE
2197 PFA15: DATAI PAG,TT ;HMM, SEE IF WRONG AC BLOCK SELECTED
2200 LDB TT,[220400,,T] ;CHECK FOR NEED TO SIMULATE INDEXING
2205 PFA16: TLNN T,(@) ;CHECK FOR NEED TO SIMULATE INDIRECT
2207 XCTRI XR,[MOVE T,(T)]
2208 JRST PFA15 ;PROCESS INDIRECT WORD
2209 JRST PFA9 ;TAKE FAULT ON INDIRECT WORD
2210 ;End replacement code.
2217 IRP I,,[1,2,3,4,5,6,7]
2218 PF!I!SVU: 0 ;Saved U at PI level I page fail
2219 PF!I!SVT: 0 ;Saved T at PI level I page fail
2220 PF!I!INS: 0 ;Instruction at PI level I page fail
2222 IFN .-PF1SVU-21., .ERR Wrong length PFXSVU block.
2226 IRP I,,[1,2,3,4,5,6,7]
2227 PF!I!AIL: ;;PI level I page fail comes here.
2228 MOVEM T,PF!I!SVT ;Save T
2229 MOVEM U,PF!I!SVU ;Save U
2230 JSP U,PIFAIL ;Set up U and join common code
2232 IFN .-PF1AIL-21., .ERR Wrong length PFXAIL block.
2233 PFXSVT==:0,,<PF7SVT-<PF7AIL+3>>
2234 PFXINS==:0,,<PF7INS-<PF7AIL+3>>
2235 PFXWRD==:0,,<EPTP7W-<PF7AIL+3>>
2236 PFXOPC==:0,,<EPTP7O-<PF7AIL+3>>
2238 PIFAIL: MOVE T,PFXWRD(U) ;Check page fail word
2240 BUG AWFUL,[NON-EX IO REG WITH PI IN PROGRESS ],OCT,PFXWRD(U),[PC=],OCT,PFXOPC(U)
2241 TLNE T,%PFNXM\%PFPAR
2242 BUG AWFUL,[NXM OR PARITY ERROR WITH PI IN PROGRESS]
2243 MOVE T,PFXOPC(U) ;Check for user mode.
2245 BUG AWFUL,[PAGE FAULT IN USER MODE WITH PI IN PROGRESS]
2246 SKIPA T,(T) ;We assume that it wasn't the instruction
2247 ;fetch itself that caused the fault.
2248 PIFL2: MOVEI U,PF7AIL-PF7XCT(U) ;Correct U on return from PFXXCT
2249 MOVEM T,PFXINS(U) ;Save instruction that caused fault
2250 LSH T,-33 ;Look at opcode
2251 CAIE T,XCTRI_-33 ;XCTRI gets special treatment:
2253 REPEAT 2, AOS PFXOPC(U) ;Arrange for it to skip.
2254 JRST PFXRET(U) ;And return.
2256 IRP I,,[1,2,3,4,5,6,7]
2258 MOVE T,PF!I!SVT ;Restore T
2259 MOVE U,PF!I!SVU ;Restore U
2260 JRST 2,@EPTP!I!O ;Return
2262 IFN .-PF1RET-21., .ERR Wrong length PFXRET block.
2263 PFXRET==:0,,<PF7RET-<PF7AIL+3>>
2265 ;;;Let XCT chains that end in XCTRI win. We assume that none of the
2266 ;;;fetches along the way to the XCTRI itself caused the fault.
2267 PIFL1: CAIE T,XCT_-33
2268 BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS]
2269 MOVE T,PFXSVT(U) ;Restore T
2270 JRST PFXXCT(U) ;Go pick up word XCT'ed
2272 IRP I,,[1,2,3,4,5,6,7]
2274 MOVE U,PF!I!SVU ;Restore U
2275 MOVE T,@PF!I!INS ;Pick up XCTed instruction
2276 JSP U,PIFL2 ;Set up U again and rejoin common code
2278 IFN .-PF1XCT-21., .ERR Wrong length PFXXCT block.
2279 PFXXCT==:0,,<PF7XCT-<PF7AIL+3>>
2283 PFLCLK: 0 ; Did page fault happen with CLKOFF?
2284 PFLSVU: 0 ; Saved U during page fail
2285 PFLSVT: 0 ; Saved T during page fail
2286 PFLINS: 0 ; Faulting instruction
2291 ;;; If we are swapped out while running with Exec mode PC between PFAIL and
2292 ;;; PFAILE inclusive, EPTPFO is saved as our PC. (There are actually only
2293 ;;; a few PC's for which this is possible given that we mostly run CLKOFF.)
2298 CONO PI,CLKOFF ; Don't bother me
2299 MOVEM U,PFLSVU ; Save U
2300 MOVEM T,PFLSVT ; Save T
2302 BUG AWFUL,[PAGE FAULT IN NULL JOB]
2303 MOVE T,EPTPFW ; Get the explanation
2304 MOVEM T,UPFW(U) ; Save it for others
2305 MOVE U,PFLSVU ; Restore U, only needed it for a moment.
2306 TLNE T,%PFNXM\%PFPAR ; Bad stuff should interrupt us, right?
2307 BUG AWFUL,[NXM OR PARITY ERROR DIDN'T INTERRUPT]
2309 TLNE T,%PSUSR ; In Exec mode?
2311 MOVE T,(T) ; We assume that it wasn't the instruction
2312 ; fetch itself that caused the fault.
2313 PFLOOP: MOVEM T,PFLINS ; Save instruction that caused fault.
2314 LSH T,-33 ; Check opcode for XCTRI
2315 CAIN T,XCTRI_-33 ; Should we skip?
2317 CAIN T,XCTR_-33 ; Touching user address?
2319 CAIE T,UMOVE_-33 ; These guys are just like XCTR
2322 ;; Let XCT chains win. We assume that none of the fetches along
2323 ;; the way caused the fault.
2325 BUG HALT,[PAGE FAULT IN SYSTEM AT],OCT,EPTPFO
2326 MOVE T,PFLSVT ; Restore T for a moment
2327 MOVE T,@PFLINS ; Pick up XCTed instruction
2330 ;;; Come here to cause faulting instruction to skip.
2331 PFLSKP: MOVE T,PFLSVT ; Restore T
2332 REPEAT 2, AOS EPTPFO
2333 SKIPL PFLCLK ; Unless clock was already off
2334 CONO PI,CLKON ; turn it back on
2335 PFAILE: JRST 2,@EPTPFO
2337 ;;; Come here on NXI error.
2340 ;;; We come here when the page fault is "soft" and it happened in user mode
2341 ;;; or while using XCTR, UMOVE, or UMOVEM.
2342 PFLUSR: MOVE T,EPTPFW
2343 TLNN T,%PFNXI ; Non-existent IO Register?
2346 TLNE T,%PSUSR ; NXI in User IOT mode is not fatal.
2348 BUG AWFUL,[NON-EX IO REG ],OCT,EPTPFW,[PC=],OCT,EPTPFO
2349 PFLU1: MOVE T,PFLSVT ; Restore T
2350 SKIPGE PFLCLK ; Check for lossage
2351 BUG AWFUL,[PAGE FAULT WITH CLKOFF AT],OCT,EPTPFO
2352 TPFLT1: SETOM PFAILF ; Cause CLK level to go to PFLU2
2353 CCLKRQ: CONO PI,CLKRQ
2354 JRST . ; Takes a while to go off...
2356 ;;;CLKBRK comes back here at CLK level.
2357 PFLU2: MOVE T,EPTPFO
2358 MOVEM T,CLKBRK ;Save PC of page fault as place interrupted
2360 LDB E,[$PFPNO,,UPFW(U)] ;E: Virtual page number
2362 ANDI D,%PFNXI\%PFWRT\%PF2.9\%PF2.8 ;D: Page fault code
2363 MOVEI A,0 ;A: User interrupt bits
2364 TRNE D,%PFNXI ;NXI in User IOT mode.
2367 ;Drops through into PFA5
2372 CLKB1: MOVE T,CLKBRK
2374 JRST CLKFO1 ;FLOATING OVERFLOW ENABLED
2375 CLKFO2: CONSZ 20 ;SKIP IF AR OV INT NOT ENABLED
2376 CONSO 10 ;OV ENABLED, SKIP IF OV
2377 CONSZ 270000 ;NOT OV, CHECK PDL OV, MEM PROTECT, NXM
2378 JRST CLKB1C ;PDL OV, NXM, ETC
2379 JRST CLKB1D ;ONLY CLOCK BREAK, AR OV JUST ENABLED
2381 CLKFO1: CONSO 100 ;SKIP ON FLOATING OVERFLOW
2382 JRST CLKFO2 ;NOT REALLY FLOATING OVERFLOW
2383 CLKB1C: JUMPL U,CNLJL ;NULL JOB LOST
2384 MOVEI A,0 ;SET UP INTERRUPT BITS FOR USER
2385 CONSZ 20 ;SKIP IF OV NOT ENABLED
2386 CONSO 10 ;OV ENABLED, SKIP ON OV
2387 JRST CLB1A ;NOT AROV
2389 CLB1A: CONSZ 200 ;SKIP IF FL OV NOT ENABLED
2390 CONSO 100 ;FL OV ENABLED, SKIP ON FL OV
2391 JRST CLB1B ;NOT FLOATING OVERFLOW
2393 CLB1B: CONSO 270000 ;SKIP IF PDL OV, NXM, OR MEM PROTECT
2395 CONSZ 10000 ;NON EX MEM
2399 TRO A,%PIPDL ;PDL OVFLO
2400 TLNN T,%PCUSR ;SKIP IF IN USER MODE
2401 BUG HALT,[PDL OVERFLOW IN EXEC MODE]
2402 CLKB1H: CONSO 20000 ;MEM PROTECT
2404 HLLZ D,UPQUAN(U) ;PICK UP FAULT BITS
2406 TLNN D,770 ;ALL CONDITIONS WHICH ABORT INSTRUCTION
2407 JRST CLKB1J ;(PLUS PAGE NXM FOR RANDOMNESS)
2408 TRZ A,%PIPDL ;INSTRUCTION ABORTED, DON'T SET PDL OV
2411 HRR T,UPOPC(U) ;FIX UP OPC
2412 MOVEM T,CLKBRK ;RESET PC FROM OPC
2414 HLRZ E,UPJPC(U) ;GET VIRTUAL PAGE # (LH OF JPC)
2417 ANDI E,377 ;FLUSH AGE ETC
2419 ;DROP THROUGH INTO PFA5
2427 TLNE D,320 ;SKIP IF REALLY PAGE FAULT
2428 JRST CFH4 ;OTHERWISE WRITE IN READ ONLY OR EXECUTING IMPURE PAGE
2432 ; A BITS FOR USER'S PIRQC
2433 ; D PAGE FAULT BITS OR CODE
2434 ; E VIRTUAL PAGE NUMBER OF PAGE FAILURE
2435 ; TT THE UMAPS SETTING
2436 ;THE MYSTERIES OF W:
2437 ; RH IS A USER INDEX
2438 ; LH 0 => NORMAL PAGE FAULT
2439 ; NON0 => SWAP IN REQUEST FOR OTHER REASON. D,TT SHOULD BE 0.
2441 ; 4.9 => DMA DEVICE SWAP-IN, SEE SWIRQB, SWPPIN
2442 ; 4.8 => FROM SCHEDULER, TO GIVE INTERRUPT (?) THIS IS NO LONGER USED,
2444 ; 4.7 => FROM CFHAHD, TO PAGE AHEAD. THIS IS ONE LEVEL OF RECURSIVE
2446 ; FOR A NORMAL PAGE FAULT, THE USER PC IS IN CLKBRK.
2448 CFHSW1: HRRZM E,CFHUVP ;USER'S VIRTUAL PAGE NUMBER
2451 MOVEI C,UPGCPH(W) ;VIRTUAL ADDRESS IN USER'S HIGH SEG
2452 TLNN TT,%UMMPU ;IS MY UPPER NORMAL?
2453 JRST CFH2 ;YES, USE MY UPPER CPB
2454 MOVEI C,UPGCPH(TT) ;NO, TRY HIS UPPER.
2455 TLNE TT,%UMUTL ;IS MY UPPER GOING TO HIS LOWER?
2456 MOVEI C,UPGCP(TT) ;YES, TRY HIS LOWER.
2459 CFH1: MOVEI C,UPGCP(W) ;VIRT ADDRESS IN USER'S LOW SEG
2461 JRST CFH2 ;MY LOWER DBR NOT HACKED
2463 TLNE TT,%UMLTU ;WAS MY LOWER HACKED TO POINT TO UPPER?
2464 MOVEI C,UPGCPH(TT) ;YES.
2470 MOVE T,C ;CALCULATE MAP ENTRY B.P. FROM CIRC PTR B.P.
2471 ADD T,[(200000-2000)UPGMP-UPGCP]
2472 LDB E,C ;CIRC MEM USE POINTER FOR PAGE FAULT
2473 JUMPE E,CFH4 ;ADDRESS IS IN REAL ILM
2475 JRST CFH4 ;ON REFERENCE TO ABS PAGE ALSO ILM
2476 IFN KL10P,[ CAIE D,%PFILW
2481 JRST CFH4 ;WRITE IN READ ONLY?
2482 JRST CFHRWF ;READ WRITE FIRST
2485 IFN KS10P,[ CAIN D,%PFWRT\%PF2.8 ;WRITE IN READ ONLY
2487 CAIN D,%PFWRT\%PF2.9 ;READ WRITE FIRST
2489 TRNE D,%PF2.8\%PF2.9 ;PAGE NOT IN MAP
2490 BUG HALT,[BOGUS PAGE FAIL CODE]
2496 ;REFERENCE TO PAGE WITH NO ACCESS IN MAP.
2497 CFHW1: SKIPGE RPCL(W)
2498 JUMPGE W,CFF1 ;BEING RPCLSRED?
2501 JRST CFH5 ;CIRPSW NOT AVAILABLE
2506 BUG ;MMP OUT OF RANGE
2507 MOVE C,E ;CIRC PNTR ALREADY POINTS TO MMP
2511 CFHSW3: PUSHJ P,UCPRL ;FIND MMP
2515 CFHSW4: LDB D,[410200,,(C)] ;TWO BITS OF MMP ENTRY GIVES DISPOSITION OF PAGE
2524 ;PAGE FAULT IN JOB BEING PCLSR'D.
2527 BUG ;BEING RPCLSRED IN USER MODE
2530 ANDCAM D,UPQUAN(W) ;CLR PG FLT
2532 CONO 470000+APRCHN ;CLR PDL OV + QT OV + MPV + NXM
2539 MOVE T,CLCX(W) ;RESTORE UPT BUT NOT ACS
2543 CONO PI,CLKOFF ;GO ALLOW SELF TO GET RPCLSRED
2544 JRST 10,UFL1 ;GO INTO UFLS WITH CLK OFF RATHER THAN
2547 CFHRWF: ;HANDLE "WRITE IN READ-WRITE-FIRST PAGE" PAGE FAULT.
2550 JRST CFHW1 ;SOMETIMES NO ACCESS SEEMS TO BE ON TOO
2553 BUG ;GOT "WRITE IN R-W-F PAGE" BUT PAGE ISN'T R-W-F.
2560 ;; EXIT FROM PAGE FAULT HANDLING FOR NON-ERROR FAULT.
2561 ;; C SHOULD CONTAIN 0 IF CAN CONTINUE NOW, OR A FLSINS TO WAIT WITH.
2562 ;; A SHOULD CONTAIN -1 IF FAULT HANDLED SUCCESFULLY (PAGE IN OR ON ITS WAY), ELSE 0.
2566 CFH5A: JUMPE C,CFHX1 ;IF NOT GOING TO WAIT, SKIP NPGWTU CODE
2568 IORM D,USWST(W) ;WAITING FOR PAGE
2569 AOS NPGWTU ;KEEP COUNT OF USERS WAITING FOR A PAGE
2575 IFN KA10P, MOVSI D,1770 ;CLEAR FAULT STATUS BITS
2579 ;; WAIT FOR CIRPSW TO BE AVAILABLE.
2582 MOVE C,[SKIPL CIRPSW]
2586 ;PAGE FAULT ON PAGE THAT'S REALLY IN CORE.
2587 CFHPI: PUSHJ P,CFHAHC ;SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2590 AOS NPGAHR ;COUNT NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2594 AOS NPGBHR ;COUNT NUMBER OF PAGES AGED BY PAGE-BEHIND WHICH WERE USED AGAIN.
2597 PUSH P,C ;SAVE MMP ENTRY ADDRESS FOR PPIUM.
2599 100000,,.+2 ;RETURN ON MEMPNT
2600 BUG ;NO MEMORY LINKED IN?
2601 SUB P,[4,,4] ;FIND MEMBLT INDEX
2603 TLNE D,MMPBAD ;WAS THIS PAGE RECENTLY A PAR ERR VICTIM?
2604 JRST CFHPB ;YES; READ IT BACK OFF THE DISK IF POSSIBLE.
2606 JUMPGE W,E.SBAR ;IF NOT CALLED FROM SWPPIN
2607 HRRZ H,DISUSR ;CHECK TO SEE IF SERVICING E&S
2608 CAIN H,(W) ;NOT DISPLAY, THEN SKIP
2609 PUSHJ P,E.SPGI ;ELSE TIE DOWN PAGE
2613 HLLZS MMSWP(A) ;CLEAR LENGTH OF CIRC LIST (BUT NOT EXEC PGS COUNT)
2616 PUSHJ P,PPIUM ;PUT PAGE INTO USERS' MAPS
2617 IFN E.SP,SETZM E.SPGH ; CLEAR QSWI1 FLAG
2622 ;COME HERE FOR PAGE WHICH SEEMS TO BE IN CORE, BUT HAD A PAR ERR RECENTLY.
2623 ;"SWAP IT OUT", SO IF IT'S PURE IT WILL JUST BE READ BACK FROM DISK.
2626 SETOM CIRPSW ;UNLOCK, SO SWPOPG CAN RE-LOCK.
2627 MOVE C,USER ;TELL SWPOPG WHICH JOB SHOULDN'T BE PCLSR'ED.
2628 PUSHJ P,SWPOPL ;"SWAP OUT" THE PAGE (EVEN IF LOCKED DOWN)
2629 JRST [ POP P,W ;FAILED TO GO OUT. COULD BE EXEC PAGE POINTING TO IT,
2630 SETZ A, ;OR A JOB THAT CAN'T BE PCLSRED RIGHT NOW.
2631 MOVSI C,(CAIA) ;WAIT A LITTLE AND TRY AGAIN (HOPE FOR THE BEST)
2634 AOSE CIRPSW ;SWPOPG UNLOCKS; RE-LOCK.
2635 JRST CFH5 ;OR ELSE GO INTO PAGE-WAIT TILL CIRPSW FREE.
2637 JRST CFHSW4 ;TRY AGAIN TO REFERENCE PAGE, SWAPPING IT BACK IN.
2639 ;ON A RANDOM PAGE FAULT, SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2640 ;ASSUMES W SET UP AS FOR CFHSW1, AND TT
2641 CFHAHC: MOVE D,CFHUVP ;GET USER'S VIRTUAL PAGE NUMBER.
2642 TLNN W,-1 ;PAGE AHEAD ONLY FOR NORMAL PAGE FAULT (SO PC IS IN CLKBRK).
2643 SKIPN PAGAHD(W) ;IS PAGE-AHEAD WANTED FOR THIS JOB?
2648 TDNE TT,T ;NO PAGE-AHEAD ON PAGE NOT MAPPED NORMALLY.
2652 CAML D,H ;IS PAGE IN RANGE FOR AUTOMATIC PAGE-AHEAD?
2653 CAML D,T ;IF SO, GO DO IT.
2660 ;AUTOMATIC PAGE-AHEAD AND PAGE-BEHIND.
2661 ;WHEN PAGE N IS PUT INTO THE MAP, PAGE N+1 IS SWAPPED IN
2662 ;AND PAGE N-1 IS SWAPPED OUT.
2663 ;(ACTUALLY, 1 IS A PARAMETER, IN THE PAGAHD VARIABLE)
2664 CFHAHD: PUSH P,CFHUVP
2665 ;LOOP, REQUESTING SWAP-IN FOR THE NEXT N PAGES. E HAS PAGE NUMBER TO SWAP IN.
2666 CFHAH1: MOVE E,CFHUVP
2670 CAMN A,E ;DETECT END OF LOOP.
2672 SKIPL T ;ELSE INCREMENT OR DECREMENT PAGE NUMBER.
2675 PUSHJ P,CFHRNG ;IS PAGE NUMBER IN RANGE FOR PAGE-AHEAD?
2678 HRLI W,500000 ;PAGE AHEAD THE PAGE. 100000 MEANS PAGE-AHEAD.
2680 SETOM CIRPSW ;ALLOW CFHSW1 TO LOCK CIRPSW.
2684 SETZM CIRPSW ;BUT REALLY IT'S ALREADY LOCKED SO KEEP IT SO.
2687 AOS NPGAH1 ;COUNT NUMBER OF TIMES AN ATTEMPT FAILS.
2690 ;NOW IT'S TIME FOR PAGE-BEHIND. E HAS PAGE NUMBER TO SWAP OUT.
2692 ;???? IS THERE ANY NEED TO PRESERVE U, EVER, INSIDE CFHSW1?
2694 HRRE A,PAGAHD(W) ;GET PAGE-BEHIND DISTANCE.
2696 ADDB A,E ;COMPUTE WHICH PAGE TO PAGE OUT.
2697 PUSHJ P,CFHRNG ;SKIP IF PAGE IS IN RANGE FOR PAGE-BEHIND.
2700 PUSHJ P,UPLC ;LOOK UP THE PAGE IN THE MAP.
2701 LDB D,Q ;D GETS CIRC PNTR
2702 JUMPE D,CFHAH4 ;NO PAGE THERE
2704 JRST CFHAH4 ;ABSOLUTE PAGE, DO NOTHING.
2706 TRO D,PMAGEM ;AGE THE PAGE, IF THE PAGE IS REALLY IN THE MAP,
2709 AOS NPGBHA ;COUNT PAGES AHED FOR PAGE-BEHIND.
2710 MOVE D,T ;SAVE B.P. TO PAGE MAP HALFWORD, FOR CFHAH6.
2711 MOVE C,Q ;STARTING FROM CIRC PTR, FIND MMP
2715 SUB P,[4,,4] ;FOUND MMP, C POINTS TO IT
2716 MOVE E,C ;SAVE ADDRESS OF MMP ENTRY
2717 MOVSI T,MMPTMP\MMPOUT ;IF PAGE IS IN TRANSIT OR OUT, DO NOTHING TO IT.
2721 TLNN T,%PCUSR ;IF JOB IN EXEC MODE, CAN'T SWAP OUT PAGE, SO JUST LEAVE AGED.
2724 SUB T,NCBCOM ;IF LOTS OF FREE MEM, DON'T SWAP OUT.
2728 PUSHJ P,UCPRL ;GET CORE PAGE NUMBER IN T.
2733 JUMPN A,CFHAH6 ;POINTED TO BY AN EXEC PAGE, E.G. 340, CAN'T SWAP OUT.
2737 MOVE A,T ;PHYSICAL PAGE # TO SWAP OUT
2738 HRRZ C,W ;DON'T PCLSR ME
2739 SETOM CIRPSW ;SWPOPG WILL WANT TO RE-LOCK CIRPSW.
2740 PUSHJ P,SWPOPG ;SWAP OUT
2741 JRST CFHAH5 ;CAN'T SWAP OUT => LEAVE JUST AGED.
2742 AOS NPGBHD ;COUNT PAGES SWAPPED OUT BY PAGE-BEHIND.
2748 AOS CIRPSW ;SWPOPG UNLOCKS; RE-LOCK.
2749 POPJ P, ;CAN'T GET LOCKED BY SOMEONE ELSE, WE ARE AT CLOCK LEVEL
2751 ;HERE FOR PAGE-BEHIND PAGE WHICH WE CAN'T OR DON'T WANT TO SWAP OUT.
2752 CFHAH6: MOVSI T,MMPPGB ;IT HAS ALREADY BEEN AGED. MARK IT FOR METERING PURPOSES.
2753 IORM T,(E) ;E POINTS TO MMP ENTRY.
2758 ;SKIP IF PAGE NUMBER IN E IS IN RANGE FOR PAGE-AHEAD OR PAGE-BEHIND.
2759 ;ASSUMES USER INDEX IN W. CLOBBERS T.
2772 CFHAHS: 20 ;IF LESS THAN THIS MUCH FREE MEM, PAGE-BEHIND SHOULD SWAP OUT.
2774 NPGAHD: 0 ;NUMBER OF PAGES WE ACTUALLY SWAPPED IN FOR PAGE-AHEAD.
2775 NPGAH1: 0 ;NUMBER OF TIMES WE WERE UNABLE TO PAGE AHEAD.
2776 NPGBHD: 0 ;NUMBER OF PAGES WE ACTUALLY SWAPPED OUT FOR PAGE-BEHIND.
2777 NPGBHA: 0 ;NUMBER OF PAGES WE DID PAGE-BEHIND.
2778 NPGAHR: 0 ;NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2779 NPGBHR: 0 ;NUMBER OF PAGES AGED FOR PAGE BEHIND AND USED AGAIN.
2783 ;REFERENCE TO SWAPPED OUT PAGE, MMP ADDRESS IN C. SWAP IN THE PAGE.
2784 ;W HAS THE USER INDEX AND FLAGS.
2785 CFHPO: PUSHJ P,CFHPOA
2786 JRST [ SETZ A, ;FAILED. RETURN CODE FOR FAILURE, IF THIS IS FOR DEVICE (W<0).
2788 TLNN W,100000 ;IF THIS IS A PAGE-AHEAD REQUEST,
2790 MOVSI A,MMPPGA ;MARK THE MMP ENTRY SO,
2792 AOS NPGAHD ;AND COUNT IT AS A SUCCESSFUL ATTEMPT TO PAGE AHEAD.
2793 CFHPOB: TLNN W,200000
2795 PUSHJ P,CFHAHC ;ORDINARY PG FAULT => MAYBE PAGE AHEAD.
2797 IFN SWPWSP,[ ;SWAPPING IN A PAGE FOR THIS GUY
2798 ANDCAM D,USWST(W) ;SO CLEAR BEST EFFORT MADE TO SWAP OUT BIT
2801 TDNN D,USWST(W) ;IF JOB IS BRINGING IN FIRST PAGE
2802 JRST CFHPO2 ; SINCE BEING SWAPPED OUT,
2803 ANDCAM D,USWST(W) ;CLEAR BEST EFFOR MADE TO SWAP OUT BIT
2804 EXCH U,W ;AND MAKE SWAP HISTORY TABLE ENTRY
2805 MOVSI T,0 ;FOR "BEGIN LOADING"
2811 CFHPO2: MOVNI A,1 ;SIGNAL "SUCCESS"
2814 MOVSI D,MMPTMP ;BIT ON IF PAGE "IN TRANSIT"
2816 MOVEM D,EPDL2(W) ;HANG USER UNTIL PAGE GETS WHERE IT'S GOING
2817 HRLI C,(TDNE T,) ;COMBINE WITH ADDRESS OF MMP
2821 ;SWAP IN PAGE. W HAS USER INDEX AND FLAGS. C HAS MMP ADDRESS.
2822 ;SKIPS IF SUCCESSFUL. OTHERWISE RETURNS FLSINS IN C.
2823 ;SIGN BIT IN W IS SET FOR SWAP IN FOR DEVICE OR FOR PAGE-AHEAD
2824 ;(THAT IS, NOT ONE WHICH A JOB MUST WAIT FOR)
2825 ;SO DON'T INCREMENT SOME COUNTERS AND DON'T BOTHER WITH FLSINS IN C.
2828 SKIPGE USWSCD(W) ;IF SWAP BLOCKED, EITHER UNBLOCK OR GIVE UP.
2833 MOVE E,USWST(W) ;IF SWAPPED OUT, WE ARE EITHER GOING TO ENTER
2834 TLNE E,%SWOUT ;THE LOADING STATE OR THE SWAP BLOCKED STATE
2841 JUMPN E,CFHPO5 ;INITIAL SWAPIN; GIVE UP AND WAIT NOW IF TUT IS LOCKED.
2842 CFHPO7: PUSHJ P,HMRQC ;GET PHYS MEM BLOCK, NUMBER IN A.
2843 JRST CFHPO1 ;MEM NOT AVAILABLE
2845 DPB B,[410200,,(C)] ;INDICATE COMING IN
2846 HRRZ B,(C) ;OLD CP OF MMP
2847 MOVEM B,MEMPNT(A) ;BECOMES LINK OUT OF CORE BLOCK
2848 HLRZ B,1(C) ;B := DISK ADDRESS
2849 LDB I,[$MMPUN,,(C)] ;I := DISK NUMBER
2852 HRLM B,MEMPNT(A) ;SET DISK ADDRESS CORE BLOCK COMING FROM
2859 SKIPE E ;IF INITIAL SWAP IN PAGE, SOS THE TUT NOW
2860 PUSHJ P,CFHPO8 ;SINCE WE ARE DISSOCIATING THE PAGE FROM THE DISK BLOCK.
2863 BUG ;SHOULDN'T HAVE TO SWAP IN THE SYSTEM
2864 CONO PI,UTCON-1 ;LEAVE CLKCHN OFF.
2866 AOS SWIPRQ ;TOTAL SWAP IN REQUESTS
2867 ;; MARK THE PHYSICAL MEMORY BLOCK AS BEING SWAPPED INTO BY THIS PAGE.
2869 DPB B,[MUR,,MEMBLT(A)]
2871 HRRM B,(C) ;MAKE CP OF MMP POINT TO MEMPNT
2874 DPB TT,[MMMPX,,MEMBLT(A)] ;STORE MMP INDEX IN MEMBLT
2876 ANDCAM TT,MEMBLT(A) ;SET END OF LIST IN THIS BLOCK
2877 ;; PUT THE TRANSFER ON THE SWAP IN LIST.
2879 HLRZ TT,SINLST(I) ;GET PREV BLOCK
2881 DPB A,[MLO,,MEMBLT(TT)] ;CHAIN TO PREV BLOCK
2883 MOVEM A,SINLST(I) ;OR TO HEADER IF FIRST
2884 HRLM A,SINLST(I) ;AND SET NEW LAST BLOCK
2885 AOS SILNG ;AOS NUMBER OF PENDING SWAP IN RQS.
2886 PUSHJ P,QSTRT1 ;WAKE UP DISK INTERRUPT LEVEL.
2888 ;; UPDATE SWAP HISTORY TABLE.
2890 IDIVI TT,LUBLK ;TT 3.1-3.8 GETS USER NUMBER, BASHES I
2902 MOVEM TT,PGIHTL-1(T)
2904 CAIL T,PGIHTB+PGIHTL
2909 JRST POPJ1 ;HANG USER UNTIL PAGE IN
2911 ;IF SWAPPNG IN "INITIAL SWAP IN" PAGE, CHECK TO SEE WHETHER TUT IS AVAILABLE.
2912 ;WE CAN'T SWAP THE PAGE IN IF NOT.
2913 CFHPO5: LDB I,[$MMPUN,,(C)] ;GET DSK #
2917 JRST CFHPO7 ;DISK TUT AVAIL
2920 JUMPL W,CPOPJ ;NO COUNTER AOS IF SWAPIN FOR DEVICE OR PAGE AHEAD.
2921 MOVE C,[SKIPGE QTUTO] ;ALSO MUSTN'T SMASH C
2926 ;LATER ON, COME HERE TO SOS THE TUT, AFTER GETTING THE MEM, WHEN WE CAN NO LONGER BLOCK.
2927 CFHPO8: ANDCAM E,(C) ;CLEAR INITIAL SWAPIN BIT
2933 HRRZS 1(C) ;CLEAR ASSIGNED TRACK NUMBER SO NEW SPACE ASSIGNED ON SWAPOUT
2936 ;HERE IF NO MEMORY TO SWAP PAGE INTO.
2937 CFHPO1: CONO PI,UTCON-1
2940 SKIPGE MEMFRZ ;IF BECAUSE MEMFRZ LOCKED, MAKE JOB WAIT FOR MEMFRZ.
2942 MOVE C,[SKIPL MEMFRZ]
2946 CFHPO4: MOVE C,[PUSHJ P,CFHPO3]
2948 SUB D,SWPOPR ;- # PGS GOING OUT
2949 ADDI D,10. ;MAKE SURE AT LEAST 10. GOING OUT
2958 CFHPO3: PUSH P,A ;FLSINS ROUTINE (NEEDED MEM)
2962 JRST POPAJ1 ;NEEDED MEM AVAILABLE
2966 JUMPGE A,POPAJ ;WILL EVENTUALLY WIN
2968 ADDM A,SWPOPR ;LOSING - SWAP SOME MORE STUFF OUT
2972 ;HERE IF TRYING TO SWAP IN A PAGE BUT SWAP BLOCKED
2973 CFBO1: MOVE E,MEMFR ;GUY SWAPPED BLOCKED
2978 JUMPGE E,CFBO3 ;SEEMS TO BE ROOM SO LET IT COME IN
2980 JUMPL W,CPOPJ ;HANG GUY UNTIL SWAP BLOCK GOES AWAY
2981 MOVE C,[SKIPGE USWSCD]
2991 OVHMTR WS ;WORKING-SET COMPUTATIONS
2994 ;HERE WHEN A SWAPPED OUT OR SWAP BLOCKED JOB TRIES TO SWAP IN A PAGE.
2995 ;JOB IN W, C -> MMP, USWST(W) IN E. RETURN TO CFSB1.
2996 ;WE DECIDE WHETHER ENOUGH CORE CAN BE GARNERED TO LET HIM IN, AND PUT
2997 ;HIM INTO THE LOADING STATE, OR ELSE PUT HIM INTO THE SWAP BLOCKED STATE.
3000 TLNN E,%SWSB ;ALREADY SWAP BLOCKED?
3001 PUSHJ P,WSRCM ;NO, RECOMPUTE WORKING SET
3003 MOVE B,USWPRI(W) ;FIND SUM OF WS'S OF SWAPPED IN GUY'S WITH BIGGER USWPRI
3005 MOVE D,USVWRK(W) ;COMPUTE AMT OF WS NOT ALREADY IN CORE
3008 CAML D,[TSYSM-100.,,]
3009 JRST .+3 ;WS > PHYSICAL MEM, ALLOW IN ANYWAY, FOO!
3011 CAMGE A,D ;WILL IT FIT IN AVAILABLE MEM?
3012 JRST CFSB2 ;NO, SWAP BLOCK
3013 PUSHJ P,CFELD ;YES, ENTER 'LOADING' STATE
3014 JRST CFSB1 ;AND GO AHEAD AND BRING IN THE PAGE
3016 CFSB2: TLNN W,200000 ;IF PAGE-AHEAD, JUST RETURN.
3019 MOVSI A,%SWSB ;ALREADY SWAP BLOCKED?
3022 IORM A,USWST(W) ;NO, ENTER SWAP BLOCKED STATE
3026 MOVSI T,3_16. ;MAKE SWAP HISTORY TABLE ENTRY FOR SWP BLK
3029 SUB T,USWTIM(W) ;HOW LONG SWAP BLOCKED
3030 CAIGE T,20.*30. ;IF LESS THAN 20 SECONDS,
3031 SKIPA T,[15.] ; SLEEP FOR 1/2 SECOND,
3032 MOVEI T,5*30. ; OTHERWISE SLEEP FOR 5 SECONDS
3036 MOVEI A,0 ;WILL THEN TAKE FAULT AGAIN AND
3037 MOVE C,[CAMLE T,TIME] ;CHECK AVAILABLE MEMORY AGAIN
3041 ;ROUTINE TO FIND MEMORY AVAILABLE TO A JOB WHOSE USWPRI IS IN B
3042 ;RETURNS IN LH(A) SUITABLE FOR COMPARING TO UWRKST. SMASHES T,TT,J
3044 WSAVL: MOVEI J,2*LUBLK ;DON'T LOOK AT SYS NOR CORE JOB
3045 MOVSI T,%SWOUT+%SWLOD ;IF THESE BITS CLEAR, JOB IS SWAPPED IN
3046 MOVE A,MEMFR ;FREE CORE
3047 SUB A,NCBCOM ;FUDGE FOR THINGS IN PROCESS
3050 ADD A,NLOOSP ;LOOSE PAGES ARE EVICTABLE
3051 SUB A,SWPOPR ;DON'T COUNT PAGES ALREADY COMMITTED TO EVICT
3052 HRLZI A,-4(A) ;ALIGN AS UWRKST AND ALLOW 4 PAGES OF SLOP
3053 SKIPA TT,TIME ;TO SEE IF PROTECTED AGAINST MEMORY PREEMPTION
3054 WSAVL1: ADDI J,LUBLK
3059 JRST WSAVL1 ;DOESN'T EXIST, OR NOT SWAPPED IN, OR LOADING
3062 JRST WSAVL1 ;HIGHER PRIORITY OR PROTECTED
3063 ADD A,UWRKST(J) ;THIS GUY'S WORKING SET IS PREEMPTABLE
3066 ;Routine to re-compute working set, also re sets up map
3067 ;to point to any pages which are swapped in but not mapped in.
3068 ;This is necessary in order to get the proper estimate of
3069 ;how much core is going to have to be swapped out to make
3070 ;this job fit. Called when a job leaves the swapped-out state,
3071 ;to enter either Loading or Swap-blocked.
3072 ;Job is in W, smashes A,B,C,D,E,T,TT,H,I,U.
3073 ;Call with CIRPSW locked and clk in progress.
3074 WSRCM: SETZM UWRKST(W)
3075 MOVEI E,UPGMP(W) ;SET UP SCAN OF USER'S MAP
3077 MOVEI C,UPGCP(W) ;AND OF CIRCULAR POINTERS
3079 LDB D,[121100,,HUSRAD(W)] ;# OF USER PAGES
3080 WSRCM1: ILDB A,E ;GET PAGE MAP ENTRY
3081 ILDB B,C ;AND CIRCULAR POINTER
3082 JUMPE A,WSRCM2 ;JUMP IF PAGE DOESN'T EXIST
3084 JRST WSRCM2 ;ABS PAGE, DON'T COUNT
3085 TRNN A,600000 ;ALREADY SWAPPED IN?
3086 JRST WSRCM3 ;NO, GO PONDER
3087 ANDI A,PMRCM ;GET PAGE MAPPED TO
3088 HRRZ B,MMSWP(A) ;GET # SHARERS
3089 MOVSI A,1 ;COMPUTE WS ADJUSTMENT
3092 WSRCM2: SOJG D,WSRCM1 ;LOOP
3095 WSRCM3: PUSH P,C ;PAGE NOT MAPPED, SEE IF IT'S IN
3097 100000,,WSRCM4 ;RETURN WITH 4 PUSHES IF MEMORY IN LOOP
3098 POP P,C ;NO MEMORY, LEAVE ALONE
3102 WSRCM4: SUB P,[4,,4] ;FOUND MEMORY, IN T
3104 MOVEI A,2 ;USE READ/WRITE/FIRST RATHER THAN READ/WRITE
3106 IORI A,PMCSHM(T) ;SET UP MAP
3108 AOS C,MMSWP(T) ;ONE MORE USER POINTING TO PAGE
3111 IDIVM A,B ;ADJUST WS AS IF WAS ALREADY POINTING TO PAGE
3112 ADDM B,UWRKST(W) ;ADDM DOES NOTHING IF THERE WAS DIVIDE BY ZERO
3113 IMULI C,-1(C) ;COMPUTE WS DECREASE DUE TO ADDITIONAL SHARING
3115 IDIV A,C ;IF DIVIDE BY ZERO, A GETS RIGHT THING!
3116 MOVE C,(P) ;ADJUST ALL SHARER'S WS'S
3123 WSRCM5: ADDM A,UWRKST(U)
3126 ;LEAVE LOADING STATE IF IN IT. JOB IN U, SMASH C,TT,T,I
3127 LVLOAD: MOVE C,USWST(U)
3129 POPJ P, ;NOT IN LOADING STATE
3130 LVLOA0: MOVEM C,USWST(U) ;TURN OFF LOADING STATE
3132 SUB T,USWTIM(U) ;TIME IT TOOK TO LOAD
3133 IMUL T,LODFCT ;COMPUTE PROTECT TIME
3137 MOVSI T,1_16. ;MAKE SWAP HISTORY TABLE ENTRY
3140 ;PUT JOB IN W INTO THE 'LOADING' STATE. CALL WITH D CONTAINING USVWRK-UWRKST.
3141 ;WSRCM MUST HAVE BEEN CALLED ALREADY ON THIS JOB. SMASHES A,D,T,TT,I
3143 CFELD: MOVE T,USWST(W)
3145 SOS NUSWB ;CEASES TO BE SWAP-BLOCKED
3146 TLZ T,%SWOUT+%SWSB+%SWDSO+%SWBEM
3149 MOVE T,TIME ;SAVE TIME STARTED TO LOAD
3152 MOVSI T,0 ;MAKE SWAP HISTORY TABLE ENTRY
3155 HLRZ D,D ;NUMBER OF PAGES GOING TO NEED, PROBABLY
3156 MOVE A,MEMFR ;FREE CORE
3157 SUB A,NCBCOM ;FUDGE FOR THINGS IN PROCESS
3160 SUB D,A ;NUMBER OF PAGES GOING TO HAVE TO SWAP OUT
3162 ADDM D,SWPOPR ;START THEM GOING OUT NOW
3166 OVHMTR FLT ;MISC FAULTS
3168 CFH4: TLNE W,100000 ;PAGE-AHEAD OF NON-EX PAGE: DO NOTHING.
3170 JUMPL W,SWIILM ;IF FROM DMA DEVICE, GIVE ERROR
3171 ;HERE FOR FAULTS WHICH ABORT THE INSTRUCTION.
3172 PFA7: MOVE T,OPTION(U) ;IF USER WANTS IT,
3173 TLNN T,%OPOPC ;GIVE HIM THE OPC RATHER THAN
3174 AOSA T,CLKBRK ;THE INCREMENTD PC.
3175 PFA7A: MOVE T,CLKBRK ;HERE FOR KL10 MAR BREAK AND KS10 NXI
3176 ;ERROR, ALWAYS GIVE ORIGINAL PC, INST
3180 MOVEI C,IOADCR ;FROM EXEC MODE SO RESET PC TO IOADCR
3182 HRRM C,LEXFDR(U) ;AND SAVE FAULT EXEC ADR FOR DEBUGGING
3183 CLEARM DLSRCH ;IN CASE IT WAS SET
3184 CLEARM UMAPS(U) ;RESTORE NORMAL MAP IN CASE RANDOM ONE WAS
3187 CLKB1J: HRLM D,LEXFDR(U) ;SAVE PF BITS FOR DEBUGGING PURPOSES
3189 IFN KS10P,[ TRNE D,%PFNXI ;Non-existent IO register in KS10 Unibus.
3193 IFN KS10P, TRNN D,%PFNXI\%PF2.9\%PF2.8
3194 IFN KA10P, TLZE D,210 ;NO ACCESS OR DBL
3195 IFN KL10P, CAIN D,%PFPNA
3199 IFN KA10P, TLZE D,20 ;PURE
3200 IFN KL10P, CAIN D,%PFPRO
3204 IFN KS10P, CAIN D,%PFWRT\%PF2.8
3205 IFN KA10P, TLZE D,100 ;W IN RD ONLY
3206 IFN KL10P, CAIN D,%PFILW
3209 TDNE A,[%PIMPV\%PIWRO\%PINXI]
3210 PUSHJ P,MPVMAS ;SAVE FAULT PAGE # FOR DEBUGGING
3212 ;;; NO ABORT-TYPE FAULTS, CHECK OTHERS:
3215 IFN KL10P, CAIN D,%PFMAR
3220 IFN KA10P,[ TLZE D,2000
3221 PUSHJ P,CPROC1 ;ONE PROCEED
3222 ANDCA D,UPQUAN(U) ;GET BITS FLUSHED BY TLZE'S
3227 ANDCMI D,-1 ;DON'T CLOBBER USER'S RUNTIME.
3228 TLZ D,4 ;DON'T CLOBBER EXEC PAGING FLAG.
3229 TLO D,1 ;IGNORE QUANTUM-TIMEOUT INT.
3232 CLKB1K: LPMR UPGML(U)
3233 CLKB1G: IFN KA10P, CONO 470000+APRCHN ;RESET
3234 CLB1X: MOVE T,CLKBRK ;PUT USER'S PC WHERE IT BELONGS
3237 IOR B,MSKST(U) ;GET OR OF ENABLED AND BAD BITS
3238 AND B,A ;GET AND WITH BITS ACTUALLY ON
3239 JUMPE B,CLB1XA ;NOT BAD OR ENABLED, FORGET ABOUT IT
3240 IORM B,PIRQC(U) ;GIVE INTERRUPT
3241 CAIN T,IOADCR ;READY TO BE INTERRUPTED?
3242 JRST CLKB5 ;NOT QUITE, RUN MOMENTARILY AND WILL UFLS
3243 IFN SCHBLN,SETZM SCHMNY ;DO FULL SCHEDULE TO DELIVER THE INTERRUPT
3246 CLB1XA: MOVSI T,%SWINT .SEE INTPFL ;IF PAGE FAULT DUE TO USER TRYING TO
3247 TDNN T,USWST(U) ;INTERRUPT, BETTER SCHED SO HE GETS THE INT.
3248 SKIPE FLSINS(U) ;ELSE PROCEED THE USER IF HE HAS GOT WHAT HE WANTED.
3249 JRST SCHED2 ;OR IF HE'S WAITING, GO SCHEDULE.
3252 IFN KA10P,[ ;NULL JOB LOST
3253 CNLJL: CONSZ 230220 ;SKIP ON JUST "ADDR BREAK" (QUANTUM OVERFLOW)
3254 BUG PAUSE,[KA: APR ERROR IN NULL JOB]
3258 CFHFPF: BUG PAUSE,[PAGE FAULT IN SYSTEM, PC=],OCT,CLKBRK,[PAGE=],OCT,E
3259 MOVSI D,1770 ;FALSE PAGE FAULT
3267 CONI RINTAP ;SAVE STATUS IN CASE SOMEONE DUMPS IT
3269 BUG AWFUL,[RANDOM INTERRUPT, APR ],OCT,RINTAP,[PI ],OCT,RINTPI
3270 JRST 12,@RINT ;YOU CAN TRY PROCEEDING
3273 RINTAP: 0 ;APR STATUS AT RINT
3274 RINTPI: 0 ;PI STATUS AT RINT
3276 IFN KS10P,[ ; On KS, all random interrupts are created equal.
3295 IFE KS10P,[ ;KS10 HAS NO MAR
3299 HLLZ B,UPOPC(U) ;FLAGS
3303 XOR T,CLKBRK ;DID PC CHANGE FROM START OF INST TO PLACE TRAPPED?
3304 TDNE T,[#<%PCFPD,,>]
3305 TLO B,(@) ;YES, INSTRUCTION COMPLETED, FLAG FOR USER
3306 ] ;KA10P ;LOSES FOR JSR .-1 WITH MAR AT .-1, BUT OTHERWISE OK
3308 MOVE B,CLKBRK ;PC OF FAULTING INST IF USER, OR IOADCR IF EXEC
3309 ; MOVEM B,UPOPC(U) ;SOLELY FOR .OPC USER VAR
3310 ;NOTE- ON KL10 THE INSTRUCTION IS NEVER COMPLETED, DON'T SET 3.5
3313 JRST PCMAR1 ;USR MODE, USE PC FROM PAGER
3314 MOVE B,UUOH ;EXEC MODE, USE USER PC (UUO)
3316 IFN KL10P,[ ;ON KL10 AVOID DOING AOS UUOH AT IOADCR
3321 PCMAR1: MOVEM B,UMARPC(U)
3324 IFN KA10P, DPB B,[220300,,UPMAR(U)] ;DISABLE MAR
3325 IFN KL10P, DPB B,[270400,,UPMAR(U)] ;DISABLE MAR
3331 CPROC1: MOVE T,CLKBRK
3332 TLNN T,%PCUSR ;SKIP IF FROM USER MODE
3334 TRO A,%PI1PR ;GIVE USER INTERRUPT
3337 CPRUUO: MOVE T,[JRST ONEPROC] ;ONE PROCEED INT. FROM EXEC. MODE
3338 MOVEM T,UEXIT ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
3343 JRST AROV2 ;NOT REALLY SET OR SET BY SYS
3345 SKIPE PICLR(U) ;SKIP IF INTERRUPTS TO USER NOT ENABLED
3346 TRO A,%PIARO ;GIVE USER INTERRUPT
3349 AROV2: MOVEM T,CLKBRK
3361 ;;; HANDLE PARITY ERRORS.
3363 CLKB1E: SETZM PARDIE ;AT FIRST ASSUME THE PAR ERR ISN'T FATAL.
3364 CONO PI,PIOFF ;TURN OFF WORLD
3365 IFN KA10P, CONO PI,240000 ;RESET
3366 IFN KL10P,[ ;CLEAR THE CACHE
3372 CLRCSH ;Clear the cache
3375 TDNE B,SUPCOR ;IF PREV ERROR NOT PRINTED, PRINT IT NOW AND PAUSE
3376 BUG PAUSE,[TOO MANY PARITY ERRORS. PREV STATUS=],DEC,PARCNT,OCT,PARAAN,OCT,PARAOR,OCT,PARAND,OCT,PARIOR
3377 IORM B,SUPCOR ;TELL SYS JOB TO PRINT OUR DATA WHEN WE FINISH.
3378 AOS PARERR ;COUNT # OF PAR ERRS SINCE SYSTEM STARTED.
3379 SETOM PARAND ;INIT LOGAND AND LOGOR OF ALL BAD DATA WORDS
3381 SETOM PARAAN ;AND SIMILAR FOR ADDRESSES OF PAR ERRS.
3386 MOVEM T,PARUSR ;REMEMBER WHICH JOB GOT THE PAR ERR.
3387 JUMPL T,PARSCJ ;PAR ERR IN NULL JOB? OR WHAT?
3389 SKIPE PARRSN ;PAR ERR IN WORD NOT REFERENCED
3390 JRST PARSCJ ; SHOULDN'T SCREW THE RUNNING JOB
3393 SETOM PARDIE ;PAR ERR IN A SUPERVISOR-MODE JOB IS HOPELESS.
3395 IORM TT,PIRQC(T) ;GIVE RUNNING USER A PARITY ERROR (CLASS 1 INT)
3398 PUSH P,PFNPC ;MAKE SURE THE PAR ERRS WE DETECT WHILE SCANNING DON'T
3399 MOVEI D,PARFX4 ;CALL US RECURSIVELY (ON KA, THAT'S DONE BY HAVING
3400 MOVEM D,PFNPC ;CLKCHN OFF)
3403 PUSH P,EPTP7N ;Same hack for the KS except page fails trap
3404 MOVEI D,PARFX4 ;as a function of current PI level.
3407 MOVEI D,0 ;POINTER TO ERROR BUFFER
3409 PUSHJ P,PARSCN ;SCAN MAIN MEM BLOCKS
3411 MOVE TT,[-LPDP6M,,PDP6BM_-10.] ;SCAN PDP6 MEM FOR PARITY ERRORS
3412 SKIPGE PDP6UP ;BUT NOT IF PDP6 IS DOWN.
3417 CONO 024400+APRCHN ;CLEAR PAR ERR FLAGS.
3421 CONO 020200+APRCHN ;CLEAR FLAG
3422 MOVSI A,%KEHLD+%KEREF ;CLEAR STATUS AND ERROR ADDR
3426 DPB A,[.PAREP+EXEUMP]
3427 LPMR PARPG ;SET UP MAP WITH PARPG SET TO MPV.
3428 MOVEM D,PARCNT ;SAVE AWAY COUNT OF ERRORS IN BUFFER
3430 BUG HALT,[PARITY ERROR IN SYSTEM MEMORY. CNT=],DEC,PARCNT,[ADR AND ],OCT,PARAAN,CR,0,[ ADR IOR ],OCT,PARAOR,[DATA AND ],OCT,PARAND,[DATA IOR ],OCT,PARIOR
3431 ;FATAL ERROR (DONT ALLOW CONTINUE SINCE ERR IS
3432 ;KNOWN TO BE A LOSER)
3433 CONO PI,PION ;TURN WORLD BACK ON
3437 PARFX3: HRRZ T,TT ;SCAN AOBJN POINTER IN TT
3440 LDB T,[MUR,,MEMBLT(TT)]
3442 JRST PARFX8 ;HOLE THERE
3443 PARFX7: MOVEI T,600000(TT) ;NOTE THAT WE ARE NOT ENABLING THE CACHE.
3444 DPB T,[.PAREP+EXEUMP] ;ON KL10 THIS WILL CAUSE A 1-WORD READ.
3445 LPMR PARPG ;SET UP TO CHECK PAGE # IN TT
3446 MOVEI B,0 ;ADDRESS WITHIN PAGE
3448 IFN KA10P, CONO PI,200000 ;CLEAR PAR ERR
3449 PARFX5: MOVE C,400000+PAREP*2000(B) ;REFERENCE EVERY MEMORY LOCATION
3451 ;;ON KA, MUST CHECK EXPLICITLY.
3452 ;;ON KL AND KS, PAR ERR WILL TRAP RIGHT TO PARFX4.
3453 CONSZ PI,200000 ;PARITY ERR?
3456 CAIGE B,1777 ;SKIP ON FINISHED WITH BLOCK
3458 PARFX8: AOBJN TT,PARFX3 ;CHECK NEXT PAGE
3461 PARFX4: ;HERE WHEN THE SCAN FINDS A WORD WITH BAD PARITY
3462 IFN KL10P, HRRZ T,PFOPC
3463 IFN KS10P, HRRZ T,EPTP7O
3465 ;;DID THIS TRAP COME FROM SCAN LOOP WHERE WE EXPECT THEM?
3469 UMOVE C,0 ;GET CONTENTS OF LOCATION WITH BAD PARITY
3472 SETO T, ;MAKE SURE T ISN'T ACCIDENTALLY 0 AT PARFX6.
3475 IOR E,B ;MAKE MEM ADR
3476 CAIGE E,20 ;PAR ERR IN SHADOW ACS ISN'T SERIOUS.
3478 ANDM E,PARAAN ;UPDATE ANDS AND ORS OF DATA AND ADRS
3484 SETOM PARDIE ;PARITY ERROR IN EXEC CORE
3488 LDB T,[MUR,,MEMBLT(TT)]
3498 SETOM PARDIE ;ERR IN CRITICAL MEMORY (DISK DIR, ETC)
3499 PARFX6: MOVEM C,400000+PAREP*2000(B) ;FIX UP MEMORY AS BEST WE CAN
3500 MOVEM C,PARCON(D) ;SAVE LOSING CONTENTS
3501 MOVEM E,PARADR(D) ;SAVE LOSING ADDRESS
3502 CAIL D,MXPARS-1 ;OVERFLOWING BUFFER?
3503 SOS D ;JUST DON'T CLOBBER STUFF. AT LEAST PARAND, ETC. WILL BE VALID.
3505 PUSH P,D ;PAR. ERR IN USER MEMORY,
3509 PUSHJ P,UCPRL4 ;HAS ANY JOB WRITTEN IN THIS PAGE?
3511 JUMPL D,PARFXB ;SOMEONE HAS; JUST GIVE EVERYONE AN INTERRUPT.
3512 PUSHJ P,UCPRL4 ;DOES MMP SAY PAGE WAS WRITTEN? IF SO, SET SIGN(D);
3513 200000,,PARFU2 ;OTHERWISE, SET MMPBAD, CAUSING PAGE TO BE RELOADED FROM DISK.
3515 PARFXB: PUSHJ P,UCPRL4 ;PAGE HAS BEEN WRITTEN SINCE LAST ON DISK, SO WE CAN'T ESCAPE
3516 400000,,PARFU3 ;GIVING EVERY JOB AN INTERRUPT.
3518 PARFX9: AOS B ;INCREMENT B HERE SO YOU DON'T HACK THE SAME
3519 ; WORD AGAIN. IF THAT WORD WAS SOLIDLY BAD,
3520 ; THIS CODE WOULD LOOP
3521 CAIG B,1777 ;MIGHT BE DONE WITH PAGE
3525 PARFU1: CAIG U,LUBLK
3526 SETOM PARDIE ;SYS JOB OR CORE JOB HAS PAGE
3528 MOVE A,I ;FIND PAGE-MAP HALFWORD FOR THIS PAGE
3533 CAIE A,1 ;MAP SET UP TO A PAGE, AND IN READ-ONLY MODE?
3535 DPB A,T ;YES, UNMAP IT SO THAT NEXT ACCESS WILL TRAP AND GO TO CFHPB
3536 SOS MMSWP(D) ; IN CASE WE WILL SET MMPBAD.
3537 ;NOTE, THIS MAY CRASH THE SYSTEM IF THE JOB WAS RUNNING IN A UUO,
3538 ;HAD CHECKED ACCESS TO THE PAGE, AND WAS ASSUMING IT COULD ACCESS
3539 ;IT AGAIN SAFELY. USUALLY THIS ONLY HAPPENS WHEN WRITING, HOWEVER.
3540 IFN SWPWSP, ;DON'T BOTHER ADJUSTING WORKING SET. WILL BE FIXED ON NEXT SWAPIN.
3542 PARFU4: TLO D,400000 ;IF THIS JOB HAS WRITTEN THE PAGE, SET SIGN (D)
3543 POPJ P, ;TO SIGNAL THAT SETTING MMPBAD IS NO USE.
3545 PARFU2: MOVE T,(C) ;C HAS ADDR OF MMP ENTRY; HAS PAGE BEEN WRITTEN BY A JOB
3546 TLNN T,MMPWRT ;THAT NO LONGER HAS IT IN MAP?
3547 TLNN T,MMPWOD ;OR HAS IT NEVER BEEN ON DISK?
3548 JRST PARFU4 ;IF SO, AVOID SETTING MMPBAD, AND INTERRUPT EVERYONE.
3550 JUMPE T,PARFU4 ;DITTO IF THERE IS NO DISK SPACE ASSIGNED.
3555 PARFU3: MOVSI T,(%PIPAR)
3561 LDB B,[221100,,UPJPC(U)] ;FAULT ADDR
3562 TRZN B,400 ;SKIP IF REFERENCE WAS VIA USER MAP
3567 HRLI C,PMLCAD ;POINTER TO CORE ADR FIELD OF LH PAGE IN MAP WD
3569 HRLI C,PMRCAD ;RH MAP WD
3570 LDB C,B ;C GETS PAGE #
3571 CAIGE C,<PDP6BM_-10.>+LPDP6M
3576 JRST MEMHN3 ;USER MODE PDP6 NXM
3577 MOVEI B,IOCER3 ;PDP6 MEM
3583 ; JRST 4,.+1 ;COMMENTED OUT SINCE NXM STOP SHOULD ALWAYS BE SET.
3585 IFN KA10P,CONO 10000+APRCHN ;CLEAR NON EX MEM AFTER HALT TO RESET MEMORY
3586 IFN KL10P,CONO 22000+APRCHN
3588 CONO 20400+APRCHN ;Clear APR flag
3589 MOVSI B,%KEHLD+%KEREF ;Clear saved error address
3593 TDNE B,SUPCOR ;Haven't printed previous error?
3594 BUG PAUSE,[TOO MANY NXM ERRORS.]
3604 MEMHN3: MOVSI B,%PIMPV ;PDP6 NXM GIVE MPV INTERRUPT
3608 \fSUBTTL SLOW CLOCK SERVICE ROUTINE
3610 OVHMTR SLW ;SLOW CLOCK
3612 SSLCK: SKIPGE SHUTDN ;SYSTEM "DEAD" =>
3613 PUSHJ P,COFFIN ;GO TO DDT AFTER RIGOR MORTIS SETS IN.
3614 SETCMB A,SCKPHS ;CHECK SYSTEM CHECKSUMS EVERY OTHER SLOW CLOCK TICK
3615 MOVE T,SUPCOP ;WHICH IS ONCE PER SECOND.
3619 CONSO 100 ; Check for memory ECC corrected errors
3621 IORD A,[KSECCS] ; A: status and error addr
3622 MOVEM A,ECCERA ; Remember most recent one
3623 AOS ECCERR ; Also count 'em
3624 CONO 20100+APRCHN ; Clear memory ECC APR flag
3625 MOVSI T,%KEHLD+%KEREF ; Clear status and error addr
3628 AND A,ECCAND ; A: AND of previous errors
3629 IOR T,ECCIOR ; T: IOR of previous errors
3630 CAMN A,ECCAND ; If either changes, this is news.
3632 BUG INFO,[MEMORY: ECC CORRECTED ERROR],OCT,ECCERA
3635 SSLCK0: ] ;IFN KS10P
3636 IFN NETP,PUSHJ P,NETCLK ; Run 1/2 sec clock routines for various net stuff
3637 IFN NETYS, SETOM DTECHK ;TELL 11 WE'RE ALIVE
3640 CONO DPK,TTYCHN ;CROCK - IF DPK LOSES ITS PIA, GIVE IT BACK.
3645 SETOM UTBFLF ;SIGNAL CORE JOB TO FLUSH UTAPE BUFFERS
3647 SSLCK2: SKIPE UTTYCT ;SKIP IF NO NEW USERS
3648 SKIPL TREESW ;SKIP UNLESS SOMEBODY'S MUNGING THE TREE STRUCTURE.
3650 PUSHJ P,USTART ;NEW USER TO START
3655 MOVEM T,DWDS ;RESET DISPLAY RATE COUNTER
3657 CONO PI,UTCOFF ;UTC OFF WHILE HACKING UTAPE, MTAPE, DISK, ETC.
3665 AOSN UIDLE ;SKIP IF DEC TAPE NOT IDLE
3666 JRST [MOVEM T,LUTOTM ? JRST SSLCK1] ;DEC TAPE IDLE
3667 SUB T,LUTOTM ;SUBTRACT LAST UTC OPERATION TIME
3669 CAIGE T,MXOPT*SCLKI ;SKIP IF DEC TAPE HUNG TOO LONG ON ONE OPERATION
3671 SETOM UTHERR ;SET UTC HUNG ERR FLAG
3672 SSLCK1: CONO UTC,CUINT ;CAUSE DEC TAPE INTERRUPT ROUTINE TO RUN
3678 JRST [MOVEM T,LUTOTM ? JRST SSLCK1]
3687 SKIPL QSDU ;IF DISK TRANSFER IN PROGRESS
3688 JRST [ MOVE T,LQTM ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3691 PUSHJ P,QHUNG ;YES, UNHANG THE DISK
3694 SKIPL QSDU1 ;IF TRANSFER IN PROGRESS ON OTHER CONTROLLER
3695 JRST [ MOVE T,LQTM1 ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3698 PUSHJ P,QHUNG1 ;YES, UNHANG THE DISK
3701 IFN DC10P, PUSHJ P,QRCTMO ;RECALIBRATE TIMEOUT
3703 PUSHJ P,QSTRTR ;WAKE UP DISK ROUTINES
3704 IFN NMTCS, PUSHJ P,MSTRTR ;WAKE UP MAG TAPE ROUTINES (MUST BE SEPARATE INTR)
3708 IFG NMTYS,[ ;TRY TO UNHANG MORTON TTY CARDS
3709 MOVE I,[-NMTYS,,NFMTY]
3711 SUBI T,60. ;IF HAVEN'T TYPED FOR 2 SECONDS
3712 SSLCM1: SKIPL TTYOAC(I) ;YET SUPPOSED TO BE TYPING
3716 CONO MTY,@TTYLT(I) ;SELECT THE LINE
3717 DATAO MTY,[0] ;AND BANG ON IT
3718 CONO PI,TTYON-1 ;MAYBE IF WE'RE LUCKY ITS DONE FLAG WILL COME ON
3719 SSLCM2: AOBJN I,SSLCM1
3722 IFN KAIMP, CONI IMP,IMPCNI ;KEEPS HOST READY ON
3724 ;KS doesn't drop interrupts, I hope
3725 PUSHJ P,IMPOST ;START UP OUTPUT
3729 PUSHJ P,IMPCCL ;CLOSE NETWORK CHANNELS
3731 PUSHJ P,IMPAAA ;WAKE UP STYS THAT NEED IT
3733 SKIPGE IMPTCU ;IF IMP IS TRYING TO COME UP
3734 AOSE IMPUCT ;AND UP-COMING TIMEOUT EXHAUSTED
3736 BUG INFO,[NET: TIMED OUT TRYING TO COME UP]
3737 MOVEI A,1 ;THEN MAKE IT STAY DOWN
3738 MOVEM A,IMPUP ;IF THIS IS ML-KA THE IMP CABLE PROBABLY BROKE AGAIN
3743 CONO DSDEV,DSDCHN ;ENABLE INTERRUPTS FROM 6
3749 BUG CHECK,[TTY: TIMEOUT ON OUTPUT XFER TO DTE, DTEBBY],OCT,DTEBBY
3753 ;SEE IF THE TV PDP11 WANTS TO GO DOWN.
3754 SKIPN TEN11F ;PROVIDED THE PDP11 IS THERE,
3755 SKIPN TT11P ;AND WE'RE TRYING TO USE IT,
3757 LDB A,[061600,,TT11HA] ;DOES 11 WANT WHO LINES UPDATED?
3758 CAIL A,2000*NTTPG ;RANGE CHECK SO CLOBBERED 11 MEMORY DOESN'T CAUSE ILL MEM REF
3759 BUG HALT,[GARBAGE POINTER IN TV-11 MEMORY]
3760 SKIPGE 1+400000+TTPG0*2000(A)
3761 JRST [ MOVEI T,SCRWHO ;YES
3763 CLEARM 1+400000+TTPG0*2000(A)
3765 SKIPE TT11DN ;IF IT IS REQUESTING TO GO DOWN,
3767 SETZM TT11P ;DON'T USE IT & WAIT FOR IT TO RE-INIT,
3769 MOVEM T,TT11DN ;GIVE IT OUR PERMISSION TO GO DOWN.
3770 MOVEI T,SCR11D ;CAUSE "11 DOWN" MESSAGE
3772 SSLCK5: SKIPN TEN11F
3773 SKIPG TT11P ;WAITING FOR 11 TO BE UP?
3775 SKIPN TT11UP ;SKIP ON 11 UP
3778 IORM T,SUPCOR ;INIT THE TTYS
3781 SKIPLE T,AGERTE ;IF IT'S ENABLED, AGE SOME PAGES
3789 SETOM DL10UP ;COULD ALSO CHECK WHETHER PDP11 IS INCREMENTING THIS.
3791 TRNE A,20 ;SEE IF PDP11 HALTED.
3793 BUG INFO,[I/O PDP11 WENT DOWN]
3801 AOS QACTTM ;Bump this for benefit of QSK dir writers.
3802 SKIPN SWPOPR ;If there is a request to swap out pages
3803 SKIPE SOLNG ; or if there are pages now going out
3804 JRST SSKQ2 ; do not bother with LMEMFR, warnings.
3805 MOVN A,LMEMFR ;See how many free low-memory pages.
3807 JUMPLE A,SSRCK ;Okay
3808 AOS NCORRQ ;Wake up core job to do some shuffling
3810 ADD A,LMEMFR ;Core wanted minus high free
3812 ADDM A,SWPOPR ;Swap out to make room.
3813 ;Check to see if we are running out of various resources.
3814 ;RSWTIM is a timestamp of last warning, initialized by DATIM6 and PDDCHK.
3815 SSRCK: MOVE A,RSWTIM ;Get time we last checked.
3817 CAML A,TIMOFF ;If we checked less then 30 secs ago
3818 JRST SSKQ2 ; don't deluge the console.
3819 MOVE A,TIMOFF ;Else remember that we are cheking now.
3821 MOVEI A,5 ;There should be at least 5 free low pages.
3822 CAMLE A,LMEMFR ;If there are not, print warning.
3823 BUG INFO,[Warning: Just ],DEC,LMEMFR,[ free pages in low core.]
3824 SKIPN QFCHN ;Check disk channels.
3825 BUG INFO,[Warning: No free qsk channels.]
3826 MOVN A,USRHI ;Check job slots.
3830 BUG INFO,[Warning: System full - no job slots.]
3834 PUSHJ P,DISCHK ;CHECK FOR 340 DEATH
3836 PUSHJ P,PDCCHK ;CHECK ON REAL-TIME HACKS
3838 PUSHJ P,PTRCHK ;CHECK ON PAPER TAPE READER
3839 PUSHJ P,PTPCHK ;CHECK ON PAPER TAPE PUNCH
3841 IFE KS10P,[ ; Silly KS10 doesn't have devices...
3846 SCDCK1: SKIPGE A,DCHNTC(I)
3854 SCDCK2: AOBJN I,SCDCK1
3855 SCDCK3:; JSP E,CHECK ;CHECK FOR CLOBBERED DEVICES
3859 MOVE A,NLPTBR ;IF LPT OUTPUT BUFFER NOT EMPTY
3861 JRST [ CONSZ NLPT,100 ;AND LPT IS READY
3862 CONSZ NLPT,7 ;BUT HAS NO PIA
3864 CONO NLPT,LPTCHN ;THEN IT LOST AGAIN
3865 AOS NTNLPL ;COUNT NUMBER OF TIMES NEW LPT LOST
3870 ;THIS ASSUMES THAT THE PDP-10/XBUS ADDRESS OFFSET IS ZERO
3871 ECCLOG: MOVE B,400000+ECCPG*2000+1760
3873 CAMN B,ECCIDX ;DID ECC HISTORY POINTER ADVANCE?
3875 AOS A,ECCIDX ;YES, GET NEXT WORD FROM ECC HISTORY
3876 MOVE B,400000+ECCPG*2000+1760-1(A)
3877 ANDI A,17 ;ADVANCE OUR COPY OF POINTER
3879 LDB A,[240700,,B] ;SYNDROME BITS
3880 TLZ B,777774 ;REDUCE B TO ADDRESS BITS
3881 BUG INFO,[MEM: ECC ERROR, ADDRESS ],OCT,B,[SYNDROME],OCT,A
3882 JRST ECCLOG ;LOOK FOR MORE HISTORY
3886 PUSHJ P,GPDTIM ;WHAT CALENDAR TIME IS IT?
3888 EXCH A,LPDTIM ;REMEMBER IT FOR NEXT CLOCK TICK.
3889 JUMPL A,ALCR0 ;TIME NOT KNOWN THIS AND/OR LAST TICK => DO NOTHING
3890 SUB A,LPDTIM ;ELSE HOW LONG HAS IT BEEN SINCE PREVIOUS TICK?
3891 CAML A,[-5*PDUPS] ;MORE THAN 5 SECONDS? SHOULD ONLY BE 1/60
3892 JRST ALCR0 ;ONLY EXPLANATION IS ITS WAS STOPPED AND CONTINUED.
3893 SKIPL SYSDBG ;SO UNLESS THAT'S NORMALLY EXPECTED
3894 PUSHJ P,DEATHM ;TELL THE WORLD "ITS REVIVED"
3895 MOVE T,TIME ;REMEMBER WHEN THIS LAST HAPPENED
3901 ;DECAY VARIOUS EXPONENTIAL AVERAGES. ON KA10, RUN IN ACS SINCE IT'S FASTER.
3902 ;ON KL10, DON'T, SINCE IT'S SLOWER. ON KS10, DON'T, BECAUSE IT IS
3903 ;JUST AS FAST TO RUN IN THE ACS BUT IT WASTES TIME TO MOVE THE CODE
3913 ALCR1: MOVN T,USRRCE(U) ;A ;DECAY USRRCE AVERAGES
3916 CAMLE T,SLOADU ;D ;AND SET SLOADU TO HIGHEST USRRCE
3922 IFE KA10P, AOBJN U,ALCR1
3925 ASH T,-4-2 ;DISOWNED JOBS (DECAY SLOWER)
3927 IMULI T,1999. ;MAKE COMMENSURATE WITH REGULAR USRRCE'S
3928 ASH T,-13. ; (You might think that you could just
3929 ; divide by 4, but in fact the ratio
3930 ; between the two decay rates is
3931 ; ln(64/63)/ln(16/15) = .24401474)
3932 ADDM T,SLOADU ;DISOWNED TIME COULD HAVE BEEN USED BY REAL
3935 ASH T,-4+1 ;SYS, CORE, AND SOME DAEMON JOBS (DECAY FASTER)
3937 IRPS RCE,,LOSRCE IDLRCE
3938 MOVN T,RCE ;LOST TIME AND IDLE TIME
3942 ADDM T,SLOADU ;IDLE TIME COULD HAVE BEEN USED BY USERS
3944 IFE KS10P, MOVE A,[193682794.] ; = 100. * 250000. * .5 / ln(16/15)
3945 ; (100% of 250000. four usec ticks per second,
3946 ; decaying by 16/15 every .5 second.)
3947 IFN KS10P, MOVE A,[198524864.] ; = 100. * 256250. * .5 / ln(16/15)
3948 ; (256250. 3.9 usec ticks per second.)
3950 ; MOVE A,[100.*15.*125000.] ;100% DIVIDED BY MAXIMUM SINGLE TREE %
3951 ADD A,LOSRCE ;WITH FUDGE FACTOR FOR LOST TIME
3952 IDIVM A,SLOADU ;GIVES EFFECTIVE # OF COMPETITORS FOR MACHINE.
3953 ; It is possible for SLOADU to drop below 100. (giving a fair share greater
3954 ; than 100%). This happens because the decay rate for disowned jobs is
3955 ; less than the decay rate for consoles. If the load switches abruptly
3956 ; from the disowned jobs to some console, the resource word for the console
3957 ; fills up quicker than the disowned resource word decays, causing their
3958 ; sum to briefly exceed the maximum. This would be hard to fix without
3959 ; introducing additional resource words just for better maintaining SLOADU.
3961 ; An additional odd effect: If only disowned jobs are running, and a
3962 ; network server starts up, the fair share drops almost to zero. This is
3963 ; because when such jobs are created, their resource word is zeroed to
3964 ; given them an initial priority boost.
3973 ALCR4: MOVN H,JTMU(T) ;A
3986 IFE KA10P, JRST ALCR4
3991 SUBI U,LUBLK ;ACCOUNT FOR I/O WAIT TIME IN USWPRI
3992 MOVSI T,%SWOUT+%SWPGW
3998 ALCR5: SKIPE UNAME(U) ;A ;IGNORE JOBS WHICH DON'T EXIST OR
3999 TDNE T,USWST(U) ;B ;ARE SWAPPED-OUT OR IN PAGE-WAIT
4000 IFN KA10P, JRST I ;C
4001 IFE KA10P, JRST ALCR6
4002 SKIPN USTP(U) ;D ;CHARGE JOBS WHICH ARE STOPPED
4003 SKIPE FLSINS(U) ;E ;OR BLOCKED
4005 ALCR6: SUBI U,LUBLK ;I ;NEXT JOB
4010 IFE KA10P, JUMPG U,ALCR5
4012 SKIPGE 37 ;CHECK FOR PLANNED SYSTEM DEATH
4013 PUSHJ P,DEATH ;ABOUT TO START DYING
4015 IRPS 4US,,[IDLTM1 LOSTM1 USRTM1 NULTM1]SEC,,[IDLTIM LOSTIM USRTIM NULTM3]
4016 MOVE A,4US ;KEEP SYSTEM WIDE USAGES AS TWO WORDS
4017 IDIVI A,250000. ;ONE IN 4.069 USEC UNITS
4018 ADDM A,SEC ;AND ONE IN SECONDS
4019 MOVEM B,4US ;SO NO OVERFLOW
4021 IMULI A,60. ;CONVERT TO 60THS
4022 ADDM A,NULTIM ;ADD TO 60THS USED (OBSOLETE)
4025 JRST CLQREE ;RE-ENTER RQ FOR SLOW CLOCK BREAK
4027 IFN SWPWSP,[ ;JOB IN U NEEDS TO BE CHARGED FOR MEMORY USED WHILE BLOCKED OR STOPPED
4028 ALCR7: HLLO W,UWRKST(U)
4029 JFFO W,.+1 ;H GETS 19 - LOG(WORKING SET SIZE + 1/2)
4031 IMUL H,[-125000.] ;CHARGE FOR 1/2 SECOND OF MEMORY USAGE
4034 IFE KA10P, JRST ALCR6
4037 ;SYSTEM IN FINAL THROES OF COMING DOWN, SEE IF IT'S OVER YET
4039 COFFIN: MOVE T,NLOOSP ;MUST SWAP OUT ALL LOOSE PAGES
4041 JUMPN T,CPOPJ ;SWAPPAGE OUT STILL GOING ON
4042 MOVEI T,NQCHN+1+NQS-1
4045 SKIPL QSGL(T) ;NOT OVER IF ANY DISK CHANNELS ARE ACTIVE
4048 MOVE TT,QACTB ;SEE IF DISK STUFF NOT OUT YET
4050 POPJ P, ;MFD NOT OUT
4052 COFFI8: TDNE T,QTUTO(A)
4053 JRST COFFI9 ;TUT NEVER CAME IN
4055 POPJ P, ;TUT NOT OUT
4056 COFFI9: AOBJN A,COFFI8
4058 COFFI1: SKIPN QSNUD(A)
4061 POPJ P, ;UFD NOT WRITTEN
4062 COFFI2: AOBJN A,COFFI1
4067 POPJ P, ;TAPE STILL FLAPPING
4071 ADDI A,15.*30. ;DON'T WAIT FOR CONSOLES MORE THAN 15 SECONDS
4072 CAMGE A,TIME ;BECAUSE %TCHNG ISN'T NECESSARILY SET
4074 MOVEI A,NFSTTY-1 ;CHECK FOR REAL CONSOLES STILL TYPING OUT
4075 MOVSI T,%TCHNG ;AND NOT HUNG (NEVER GOING TO FINISH TYPING OUT)
4079 JUMPGE A,CPOPJ ;A CONSOLE IS STILL TYPING, DON'T GO DOWN YET
4080 COFFI3: SKIPL A,SYSCN
4083 POPJ P, ;SYSTEM CONSOLE HAS A LOT OF TYPING TO DO
4085 COFFI7: CAML A,USRHI
4088 POPJ P, ;JOBS STILL EXIST
4092 ;SYSTEM FULLY DOWN; GO TO DDT.
4093 COFFI4: BUG DDT,[SHUTDOWN COMPLETE]
4094 SETZM SHUTDN ;IF USER PROCEEDS, BRING SYSTEM BACK UP
4095 SETZM DEDTIM ;ARRANGE TO RELOAD ATSIGN DRAGON
4096 SETZM FLSINS ;BY RESTARTING SYS JOB WHERE IT DOES THAT
4101 ;ROUTINE TO AGE SOME PAGES. THIS ROUTINE SLOWLY CIRCULATES THROUGH
4102 ;CORE. IF IT TOUCHES A PAGE TWICE, AND NO USER HAS TOUCHED IT,
4103 ;THE PAGE GETS SWAPPED OUT. ALSO FLUSHES PAGES NOT IN ANY USER'S MAP.
4104 ;ENTER WITH VALUE OF AGERTE IN T.
4108 POPJ P, ;NO MEMORY COMPETITION, DON'T BOTHER
4109 ADD T,AGEREQ ;INCREASE NUMBER OF PAGES NEEDING TO BE AGED
4110 CAIGE T,100 ; BUT DON'T LET IT GET INFINITELY HUGE
4111 MOVEM T,AGEREQ ; IF CIRPSW IS LOCKED FOR A LONG TIME
4112 SKIPN DLSRCH ;IF MUSTN'T PCLSR ANYONE, OR
4113 SKIPL CIRPSW ; IF CIRPSW LOCKED, HAVE TO WAIT UNTIL NEXT SLOW CLOCK
4115 LDB W,[121000,,HUSRAD] ;DON'T AGE SYSTEM JOB (CIRC PNTRS NOT CONNECTED)
4116 MOVE A,AGEPOS ;CONTINUE AGEING FROM WHERE LEFT OFF LAST TIME
4117 SKIPGE U,USER ;CHECK FOR NULJOB
4119 MOVE T,CLKBRK ;PC FOR USER WHO MAY GET PCLSR'D
4120 MOVEM T,UPC(U) .SEE SWOP2
4121 LPMR UPGML(U) ;DON'T LEAVE SWAPPED OUT PAGES IN ASSOC MEM
4126 JRST [ MOVEM A,AGEPOS ? SETZM AGEREQ ? POPJ P, ]
4128 LDB T,[MUR,,MEMBLT(A)]
4134 MOVNI C,1 ;NO USERS ACTIVELY USING THIS PAGE, SWAP IT OUT
4139 AGE1: MOVEI C,UPGMP(U)
4140 MOVE T,I ;DON'T CLOBBER I
4146 LDB T,C ;GET PAGE MAP WORD
4148 POPJ P, ;USER NOT CONNECTED TO THIS PAGE
4150 POPJ P, ;HASN'T TOUCHED THIS PAGE SINCE AGE BITS LAST SET
4151 DPB T,C ;HAS TOUCHED PAGE, TURN AGE BITS BACK ON
4152 SUB P,[4,,4] ;AND BACK OUT OF UCPRL
4157 DISCHK: SKIPGE DISOFF
4164 DISZAP: MOVE T,[JSR DBLKPB]
4166 MOVEI T,DIS300-1 ;CAUSE 340 TO STOP AND INTERRUPT SOON
4169 CONO DIS,5100+SDCHN_3+DISCHN
4175 SETZM 37 ;CLEAR START DYING FLAG
4176 MOVEI T,60.*5.*60. ;5 MIN
4183 DEATHX: SKIPN T,DEDTIM
4191 DEATHY: MOVEM TT,DEDTIM
4195 DEATHM: MOVEI A,%PIDWN
4196 PUSHJ P,INTALL ;TELL THE WORLD
4197 MOVSI T,SCLSHD ;CAUSE TYPE OUT ON UNLOGGED-IN CONSOLES
4198 SUPSET: IORM T,SUPCOR
4201 VSSLCK: MOVSI T,SCLVSK
4202 IORM T,SUPCOR ;CAUSE VERY SLOW CLOCK TO RUN
4208 RCCLK: DATAI 374,T ;HACK CHESS CLOCK
4218 WHOSET: MOVEI T,SCRWHO ;CAUSE SYS TO UPDATE WHO LINES
4220 MOVEI T,5.*60.-5 ;5 SECONDS MINUS A LITTLE SO DOESN'T SYNC WITH OTHER CLOCKS
4225 SUBTTL SWAP SCHEDULER
4227 OVHMTR SWS ;SWAP SCHEDULER
4231 IFN IMPP, PUSHJ P,IMRSTO ;RESET CONTROL LINK RFNM WAIT FOR LOSING IMP.
4233 ;RECOMPUTE SWAP BLOCK DATA.
4234 ;DECAY SWAP PRIORITIES (USWPRI AND SWRCE)
4235 ;RESET BEST-EFFORT-HAS-BEEN-MADE TO SWAP OUT BITS
4237 MOVSI B,%SWBEM ;SET UP TO CLEAR "BEST EFFORT TO SWAP OUT BIT"
4238 SETOM SBEFLG ;NOT YET DESPERATE ENOUGH TO TRY USERS WHOSE BEST EFFORT BITS ARE SET
4240 CLEARB T,NUSWB ;# USERS LOCKED OUT
4241 SETOM BUSR ;SMALLEST SWAPPED BLOCKED USER
4242 MOVE D,[37777,,777777]
4243 MOVEM D,BUSIZ ;SIZE OF SMALLEST SWAP-BLOCKED USER.
4244 CLEARM ASBUM ;REAL MEM OCC BY ACTIVE SWAPPED BLOCKED LOSERS
4245 MOVSI D,400000 ;TO CLEAR SWAPPED BLOCKED BIT
4247 .ELSE MOVEI T,LUBLK*2
4254 ADDM C,USWPRI(T) ;DECAY JOB SWAP PRI'S
4258 SUBI C,1 ;COMPENSATE FOR PAGE ZERO ALWAYS IN
4260 CAMLE C,NSWPGS(T) ;SKIP ON NOT COMPLETELY OUT
4261 ANDCAM B,USWST(T) .SEE %SWBEM
4264 JRST 15S4 ;CLEAR SWAPPED BLOCK BIT AND MAYBE ADD TO AUSOPG AND TRUMM (IF HE WAS HUNG ON IT)
4272 PUSHJ P,SWSCD ;SWAP BLOCK LOSERS IF NECESSARY
4275 15S5: MOVN C,SWRCE(T) ;DECAY TREE SWAP PRI'S
4284 15S4: ANDCAM D,USWSCD(T) ;CLEAR SWAP BLOCK BIT
4285 SKIPN TT,FLSINS(T) ;WAS HE HUNG TESTING IT
4288 CAME TT,[SKIPGE USWSCD]
4289 JRST 15S3 ;HE WASN'T HUNG ON THIS
4290 CLEARM FLSINS(T) ;HE WAS SO NOW HES ACTIVE
4293 SOS NPGWTU ;FLSINS WAS SET BY PAGE FAULT, SO CONSIDERED
4294 TLZ TT,%SWBEM ;TO BE WAITING FOR A PAGE
4297 ADDM TT,TRUMM ;GUY IS NOW RUNNABLE
4298 SUB TT,NSWPGS(T) ;ANY PAGES HE MAY HAVE IN MEM NO LONGER BELONG TO A BLOCKED USER
4303 MOVE TT,NSWPGS(T) ;ANY SWAPPED OUT PAGES BELONG TO AN ACTIVE USER
4310 PRVCLK: SKIPN ENPVCL
4315 SETOM PRVUSR ;TURN OFF CURRENT PRIVILEDGED USER
4317 PRVCK1: CAML J,USRHI
4321 MOVE B,UTRNTM(J) ;GET USER RUN TIME
4325 IMUL A,[NPVSEC*125000.] ;1/2 NUMBER OF 4 MICROSECOND INTERVALS IN THE PRIV INTERVAL
4329 LSH B,-1 ;DIVIDE LAST VALUE BY TWO
4331 MOVEM A,UPGSEC(J) ; LAST/2 + CURRENT
4335 MOVEM A,LSIPRQ(J) ;SAVE OLD VARIABLES
4336 PRVCK3: ADDI J,LUBLK
4339 PRVCK2: PUSHJ P,NPRVUS ;GET NEXT PRIV USR
4340 PRVCK4: MOVEI T,NPVSEC*60.
4344 NPRVUS: MOVEI J,2*LUBLK
4346 MOVNI T,30.*2 ;DON'T LET A BLOCKED OR STOPPED PERSON BE PRIVILEDGED
4350 NPVUS1: CAML J,USRHI
4352 CAMGE T,LUBTM(J) ;BLOCKED TOO LONG?
4360 NPVUS3: ADDI J,LUBLK
4363 NPVUS2: MOVEM U,PRVUSR
4374 IFNDEF MEMSYS,MEMSYS==50 ;GUESS AT AMOUNT OF MEM SYSTEM NEEDS
4375 IFNDEF MEMSY1,MEMSY1==50 ;AMOUNT OF MEM ANY ONE USER MUST LEAVE TO "FIT".
4377 SWSCD: MOVE E,TRUMM ;SEE IF NECESSARY TO SWAP BLOCK SOMEONE
4378 CAIGE E,TSYSM-SYSB-MEMSYS
4379 POPJ P, ;NO SHOULD FIT
4385 ADD E,BUMPGS ;WILL SWAP OUT BLOCKED USERS FIRST
4388 JUMPGE E,CPOPJ ;SHOULD HAVE ROOM FOR EVERYBODY
4389 MOVMM E,SWSCT1 ;SAVE # PGS REQ
4390 MOVNI E,1 ;NEED TO GRONK USER (MAYBE)
4391 CLEARB T,TT ;TT SWP PRI OF PROCESS
4392 MOVEI R,0 ;R SWP PRI OF TREE
4393 SWSCP1: CAML T,USRHI
4399 JRST SWSCP7 ;GUY ALREADY LOCKED OUT
4401 JRST SWSCP4 ;SEE IF REALLY BLOCKED OR JUST PAGE WAIT
4402 SWSCP5: MOVE B,UTMPTR(T)
4403 CAML R,SWRCE-USRRCE(B)
4405 JRST SWSCP6 ;THIS GUY A BIGGER LOSER THAT PREV BIGGEST
4406 SWSCP7: ADDI T,LUBLK
4410 MOVE R,SWRCE-USRRCE(B)
4412 JRST SWSCP7 ;GUY REALLY BLOCKED
4414 SWSCP4: MOVE B,USWST(T)
4420 SWSCP2: JUMPL E,CPOPJ ;NO VICTIM
4422 CAIGE B,TSYSM-SYSB-MEMSY1
4423 JRST SWSCP9 ;"SMALL LOSER"
4425 CAMLE B,SWSCT1 ;SKIP ON WILL STILL NEED TO BLOCK MORE LOSERS
4427 SWSCP9: MOVSI B,400000
4428 IORM B,USWSCD(E) ;SWAP BLOCK LOSER
4436 SWSCP8: SUB TT,NSWPGS(E)
4439 ADDM TT,ASBUM ;THIS GUY SWAPPED BLOCKED
4441 ADDM TT,TRUMM ;DOESNT COUNT ANY MORE
4445 ADDM TT,AUSOPG ;NOT REALLY ACTIVE ANY MORE
4446 JRST SWSCD ;SEE IF THATS ENUF
4451 ;PUT PAGE INTO USERS' MAPS (OF ALL USERS THAT ARE CONNECTED VIA CIRCULAR POINTERS)
4452 ;ALSO UPDATES THE WORKING SETS.
4453 ;CALL WITH PAGE NUMBER IN A, STARTING BYTE POINTER IN C, AND TDNE T,MMP IN D.
4454 ;SMASHES T,H,I,U,E,TT,C
4457 MOVEI E,0 ;COUNT USERS OF THE PAGE
4459 400000,,[AOJA E,CPOPJ]
4460 HRRM E,MMSWP(A) ;ALL THESE SHARERS WILL BE CONNECTED TO THE PAGE
4461 MOVSI T,1 ;COMPUTE WORKING SET ADJUSTMENT
4462 IDIVM T,E ;I.E. 1 OVER NUMBER OF SHARERS
4464 PUSHJ P,UCPRL ;GIVE PAGE TO ALL USERS WAITING FOR IT
4468 ;SET UP MAP TO MEMBLT INDEX IN A
4471 BUG ;SYS JOB OR CORE JOB
4480 JUMPE I,[JRST 4,.] ;DOESN'T REALLY EXIST?
4481 MOVSI T,MMPPGA ;DON'T REALLY PUT IN MAP IF PAGE-AHEAD PAGE.
4482 TDNE T,(D) ;JUST PRE-EMPT.
4484 TRNE I,600000 ;DO NOTHING IF ALREADY IN MAP.
4486 JRST QSWI2 ;ALREADY IN MAP, POSSIBLE AS A RESULT OF RIDICULOUS TIMING ERROR
4489 JRST E.SPGJ ; CHECK E&S WANTS READ/WRITE FIRST FIX
4491 SOS NSWPGS(U) ; NUMBER OF SWAPPED-OUT PAGES
4492 SOS SNSWPG ;DECR CNT OF SWAPPED OUT FOR SYS
4493 SKIPN (P) ;DON'T SET UP PG 0 AS R-W-F.
4496 MOVEI I,2 ;SET READ/WRITE TO READ/WRITE/FIRST
4498 IORI I,PMCSHM(A);BRING IN ADDRESS AND CACHE BITS
4502 AOS MMSWP(A) ;INCREMENT COUNT OF USERS IN RING
4505 ADDM E,UWRKST(U) ;ADJUST WORKING SET
4509 ;IF THIS USER IS WAITING FOR THIS PAGE, MAKE HIM RUNNABLE BY PUTTING
4510 ;HIM ON THE SCHMNY LIST, AND PRE-EMPT THE CURRENTLY-RUNNING USER.
4511 ;THE IDEAS ARE TO START THIS USER'S NEXT PAGE READ AS SOON AS POSSIBLE,
4512 ;AND TO ELIMINATE THE SCHEDULING THAT WOULD OTHERWISE BE NECESSARY TO RUN THIS GUY.
4514 CONSZ PI,200_-APRCHN ;CAN'T PREEMPT IF CLKOFF
4515 CONSZ PI,100000_-APRCHN ;OR IN PROGRESS, BECAUSE
4516 JRST POPIJ ;MIGHT ZERO FLSINS WHILE SCHEDULER
4517 ;IS EXECUTING IT & SIMILAR NASTIES
4519 CAME D,FLSINS(U) ;IF JOB THAT JUST GOT PAGE IS WAITING FOR IT
4522 SETZM FLSINS(U) ;THEN THAT JOB PREEMPTS CURRENT ONE
4525 SOS NPGWTU ;FLSINS WAS DUE TO PAGE FAULT (MIGHT BE IN .CALL CORBLK)
4530 CONO PI,CLKRQ ;REQUEST INT TO SCHEDULER
4545 E.SPGJ: SKIPE E.SPGH ; FLAG FROM E.SPGI
4547 JRST QSWI2 ; LEAVE AS IS
4551 JRST QSWI3 ; GO MAKE READ/WRITE
4552 ; DON'T SOS NSWPGS, SINCE PAGE IS ALREADY HERE
4555 SUBTTL USER SCHEDULER
4557 OVHMTR SC1 ;SCHEDULER 1 - ENTRY
4559 IFN KL10P, IFNDEF SCCOST, SCCOST==250. ;CHARGE 1 MILLISEC FOR SCHEDULING
4560 IFN KA10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4561 IFN KS10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4563 SCHED: SKIPGE U,USER
4567 ;; If user is swapped out while running in the page fail code, then
4568 ;; EPTPFO is used as the PC. Either he is on his way in, in which
4569 ;; case he will come back when restarted, or he is on his way out,
4570 ;; in which case this just pushes him on his way.
4574 CAIL T,PFAIL ; First instruction inclusive
4575 CAILE T,PFAILE ; Last instruction inclusive
4578 SCHED0: ] ;IFN KS10P
4580 IFN SCHBLN,SETZM SCHMNY ;ENTERED FROM QUANTUM RUNOUT, TIME TO CHECK ALL USERS
4581 SCHED2: ;ENTERED FROM UFLS OR PAGE FAULT, CHECK FOR AUXIL PERSON TO RUN
4582 ;IF SCHMNY IS STILL -1
4584 MOVSI T,UEXIT ;GET HERE FROM CLUFLS
4589 XCTR XR,[HRRZ A,13] ;GCSTBR
4590 XCTR XR,[HRL A,14] ;STBR
4593 SKIPL MTRUSR ;SKIP IF PERF COUNTER AVAILABLE
4594 JRST [ DMOVE A,MBOXCT(U) ;COMPUTE EQV CPU TIME FROM MBOX+EBOX ACCT
4595 DSUB A,STMBOX ;AS INCREMENTAL RUNTIME
4603 DSUB A,STPERF ;USER RUN TIME IN 80 NS UNITS LEFT 12
4604 DIVI A,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS IN A
4607 IFN KS10P, LDB A,[044000,,UPQUAN(U)] ;GET TIME USED IN 3.9 USEC UNITS
4608 IFN KA10P, LDB A,[022100,,UPQUAN(U)] ;GET TIME USED IN 4.069 USEC UNITS
4609 ADDM A,USRTM1 ;SYSTEM TOTAL USER RUN TIME
4610 ADDM A,UTRNTM(U) ;INCREASE RUN TIME
4611 ADDM A,JTMU(U) ;DECREASE PROCEDURE PRIORITY
4612 MOVEI B,SCCOST(A) ;ACCOUNT FOR OVERHEAD IN STARTING UP
4613 ADDM B,@UTMPTR(U) ;DECREASE PROCEDURE TREE PRIORITY
4615 MOVE T,NMPGS(U) ;USWPRI IS PAGES IN CORE X CPU TIME
4619 HLLO B,UWRKST(U) ;USWPRI IS LOG(WORKING SET SIZE) X (CPU TIME + IO WAIT TIME)
4620 JFFO B,.+1 ;C GETS 19 - LOG(WORKING SET SIZE + 1/2)
4626 ADDM T,USWPRI(U) ;CHARGE AGAINST SWAPPINNG PRI
4627 ADDM T,SWRCE-USRRCE(Q) ;AND FOR TREE
4629 LSH B,-7 ;GET RUNTIME IN 512 USEC UNITS
4631 MOVEI B,777 ;TO FIT IN SCHEDULER HISTORY TBL
4636 TRO B,1000 ;BLOCKAGE DUE TO PAGE FAULT
4638 CAML A,LODQNT ;CHECK FOR LEAVING LOADING STATE
4639 SCHED8: TLZN C,%SWLOD ;DUE TO RUNNING FOR MORE THAN LODQNT BETWEEN PAGE FAULTS
4640 JRST .+2 ;OR DUE TO BLOCKAGE FOR REASON OTHER THAN A PAGE FAULT
4641 PUSHJ P,LVLOA0 ;LEAVE LOADING STATE
4644 DPB B,[311200,,@SCHHP] ;COMPLETE SCHEDULER HISTORY TBL ENTRY
4645 SKIPL Q,RTIMER(U) ;SKIP UNLESS RUNTIME INT ACTIVE
4647 SCHED3: SKIPGE DLSRCH
4648 JRST SEAREP ;DELETE SEARCH, EXIT
4650 SKIPE PREEMP ;PRE-EMPT?
4651 JRST SCHEDP ;YES, AVOID DOING FULL SCHEDULE
4654 SKIPN SCHMNY ;IF NOT YET TIME TO DO A FULL SCHEDULE,
4656 SCHED4: HLRZ U,UREALT ;THEN CHECK LIST OF JOBS SCHEDULED BEFORE
4657 JUMPE U,SEARL0 ;ALWAYS SCHEDULE IF HIGH PRIORITY REAL TIME USER ACTIVE
4658 PUSHJ P,SCHGB ;POP NEXT JOB OFF LIST
4659 JUMPL U,SEARL0 ;EMPTY
4661 JRST SCHED4 ;JOB CEASED TO BE RUNNABLE
4662 AOS NSSKED ;OK, RUN THIS ONE
4669 MOVSI T,(%PIRUN) ;GIVE RUNTIME INTERRUPT
4673 ; HERE TO DO A FULL SCHEDULE (LOOK AT ALL JOBS)
4676 OVHMTR SC2 ;SCHEDULER 2 - SEARCH
4678 SEARL0: AOS NRSKED ;1 MORE REAL SCHED (ACTUALLY SEARCHES JOBS)
4679 CLEARM TRUMM ;TOTAL RUNNABLE USER MEM
4680 CLEARM AUSOPG ;ACTIVE USER SWAPPED OUT PAGES
4681 CLEARM BUMPGS ;PAGES IN REAL CORE BELONGING TO BLOCKED USERS
4682 IFE SWPWSP, CLEARM ASBUM ;PGS IN REAL MEM OCC BY SWAPPED BLOCKED LOSERS
4685 PUSHJ P,SWPON ;SWAP OUT STUFF
4688 PUSHJ P,SWPPIN ;SERVICE SWAPPING REQUESTS FROM OTHER PROCESSORS (DISPLAY)
4690 SETZB U,J ;JOB BEING SCHEDULED
4691 SETZM RNABLU ;NUM RUNABLE USERS
4693 SETZM SCHBNJ ;GOT NO RUNNABLE JOBS YET
4694 SETOM SCHMNY ;ALLOW ALL THE RUNNABLES WE FIND TO RUN
4696 .ELSE SETOM I ;BEST USER SO FAR
4698 MOVEM T,SCHFLG ;DONT SCHED AGAIN FOR 1/7.5 SEC
4701 ;HERE IF NULL JOB HAD BEEN RUNNING
4703 SCHED9: AOS NNSKED ;1 MORE TIME NULL JOB WAS RUN
4704 IFN KA10P, LDB C,[022100,,UPQUAN] ;GET TIME NULL JOB RAN IN 4.069 USEC UNITS
4705 IFN KS10P, LDB C,[044000,,UPQUAN] ;GET TIME NULL JOB RAN IN 3.9 USEC UNITS
4707 CAMN U,MTRJOB ;IF METERING ONLY NULL JOB, STOP METERS NOW
4710 CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1
4711 REBOXC A ;COMPUTE NULL JOB'S EQUIVALENT RUNTIME IN 4 USEC UNITS
4715 DMUL C,KLMBCC ;CONVERT MBOX COUNT TO EBOX COUNTER UNITS,
4716 DADD A,D ;ADD TO EBOX COUNT
4717 DMUL A,KLEBCC ;CONVERT TO 4 USEC UNITS.
4719 JRST [ RPERFC C ;PERFORMANCE METER AVAILABLE, USE IT INSTEAD
4721 DIVI C,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS
4724 ADDM C,NULTM1 ;ACCUMULATE TOTAL NULL TIME IN 4 USEC UNITS
4725 SKIPE NPGWTU ;IF SOMEONE WOULD HAVE BEEN RUNNING IF THEY
4726 ADDM C,LOSTM1 ; WEREN'T WAITING FOR A PAGE, THIS WAS LOST TIME
4727 SKIPN NPGWTU ;BUT OTHERWISE
4728 ADDM C,IDLTM1 ;IT WAS COMPLETE IDLE TIME
4729 SKIPE NPGWTU ;NOW COMPUTE % TIME IDLE AND LOST
4733 IFN PAGPRE,SKIPN PREEMP ;CHECK FOR PRE-EMPT
4734 JRST SEARL0 ;NOW GO DO A FULL SCHEDULE
4736 SCHEDP: SETZM PREEMP
4738 PUSHJ P,SCHGB ;U GETS USER TO PRE-EMPT THIS ONE (LAST INTO SCHMNY LIST)
4739 JUMPL U,SCHDP1 ;NO ONE TO PRE-EMPT, RUN SAME USER AGAIN
4740 PUSHJ P,SCHACK ;MAKE SURE PRE-EMPTING JOB IS RUNNABLE
4741 JRST SCHEDP ;AFRAID NOT
4742 AOS NPREEM ;OK, RUN THIS ONE
4744 PUSHJ P,SCHSB ;PRE-EMPTED JOB IS STILL A CANDIDATE FOR RUNNING
4747 SCHDP1: SKIPGE U,USER ;TRY TO RUN SAME USER AGAIN
4748 JRST SCHED1 ;RUN NULL JOB AGAIN
4749 PUSHJ P,SCHACK ;MAKE SURE THIS JOB IS STILL RUNNABLE (COULD HAVE UFLSED)
4750 JRST SEARL0 ;FOO, BETTER DO A FULL SCHEDULE
4751 JRST SCHED6 ;OK, RUN THIS GUY
4754 ;MAIN SEARCH LOOP, RETURN HERE TO EXAMINE NEXT PROCEDURE
4755 SEARL: MOVEI U,LUBLK ;LENGTH OF USER VAR BLOCK
4756 ADDB U,J ;STEP TO NEXT USER
4757 CAML U,USRHI ;SKIP IF EXISTS
4758 JRST SEAREN ;ALL PROCEDURES HAVE BEEN EXAMINED
4759 SEARL1: SKIPE T,USTP(U)
4760 JRST SEARS1 ;EMPTY OR STOPPED JOB SLOT
4762 JRST SEAR2A ;FIRST WORD INTERRUPT PENDING
4763 SEARL2: SKIPE B,IFPIR(U)
4764 JRST INTWD2 ;SECOND WORD INTERRUPT PENDING
4765 SEARL3: SKIPN FLSINS(U)
4766 JRST SEARC ;NOT BLOCKED
4767 SEARL4: MOVE T,EPDL2(U)
4768 XCT FLSINS(U) ;TEST BLOCKING CONDITION (MAY SKIP ONCE OR TWICE)
4769 JRST SEARLB ;UNRUNABLE
4770 JRST SEARC ;LOW PRIORITY UNBLOCK
4771 SKIPA Q,[-1] ;HIGH PRIORITY UNBLOCK
4772 MOVEI Q,3 ;EXTRA LOW PRIORITY
4775 SEARC: SETZM Q ;SET TO NORMAL PRIORITY
4776 PUSHJ P,UPRIVL ;COMPUTE PRIVELEGE LEVEL (MAY SKIP ONCE OR TWICE)
4777 SOJA Q,SEARC2 ;HIGH-PRIORITY
4780 ADDI Q,2 ;DISOWNED JOB IN USER MODE
4781 SEARC2: AOS RNABLU ;ANOTHER RUNABLE USER
4783 MOVEM T,LUBTM(U) ;RECORD LAST TIME UNBLOCKED
4786 JRST SEARC7 ;HE'S SWAPPED BLOCKED SO HE DOESNT COUNT
4788 JUMPE U,SEARC4 ;DON'T FIGURE SYSTEM JOB.
4790 ANDCAM T,USWST(U) ;RUNNABLE SO NOT DESIRED OUT
4792 ADDM T,TRUMM ;TOTAL RUNNABLE USER MEM
4794 ADDM T,AUSOPG ;TOTAL PAGES OF RUNNABLE USERS SWAPPED OUT
4795 SEARC4: CAMN U,UREALT ;IF THIS IS REAL TIME USER IN HIGH PRIORITY
4796 JRST [ MOVEI A,0 ; PHASE, SCHEDULE WITH INFINITE PRIORITY
4798 SKIPLE T,URTIME(U) ;NON SKIP IF POSSIBLE REAL TIME BLOCK
4799 TLNN T,1 ;SKIP IF REAL TIME BLOCK UNLESS PI IN PROGRESS
4801 SKIPGE PICLR(U) ;SKIP IF PI IN PROGRESS
4802 JRST SEARL ;REAL TIME BLOCKED
4803 SEARC6: MOVE A,@UTMPTR(U) ;GET AMOUNT OF MACHINE TIME USED RECENTLY BY TREE PROCEDURE IS IN
4804 LSH A,3 ;COMBINE WITH TIME FOR JUST THIS PROCEDURE
4805 ADD A,JTMU(U) ;TO GET PRIORITY FIGURE (SMALLER NUMBER IS HIGHER PRI)
4806 LSH A,(Q) ;ADJUST PRIORITY BY MULTIPLICATIVE FACTOR IN Q
4807 ;THE EFFECT OF THIS PRIORITY COMPUTATION IS THAT JOBS IN THE SAME TREE
4808 ;ARE COMPARED BY JTMU, WHILE JOBS IN DIFFERENT TREES ARE COMPARED MAINLY
4809 ;BY USRRCE, ALTHOUGH A MUCH SMALLER JTMU CAN OVERRIDE A SOMEWHAT LARGER
4810 ;USRRCE. THIS IS SOMEWHAT DIFFERENT THAN THE COMPUTATION THAT WAS HERE
4811 ;BEFORE MAY 1980, BUT THAT COMPUTATION'S RESULTS EVEN DEPENDED ON THE
4812 ;ORDER THAT JOBS HAPPENED TO BE INSPECTED, AND ALLOWED A TREE WITH
4813 ;A LARGE NUMBER OF RUNNING JOBS TO GET AN UNFAIR SHARE OF THE MACHINE.
4815 IFN SCHBLN, PUSHJ P,SCHSJB ;INSERT JOB INTO PRIORITY-SORTED LIST
4816 .ELSE [ JUMPL I,SEARP5
4817 CAML A,U0P ;SKIP IF IS BETTER THAN BEST SO FAR
4819 SEARP5: MOVEM U,I ;I GETS NEW BEST USER SO FAR
4820 MOVEM A,U0P ;U0P GETS PRIORITY OF THAT USER
4822 JRST SEARL ;TRY NEXT
4825 SEARC7: MOVE T,NMPGS(U) ;RUNNABLE AND SWAPPED BLOCKED
4832 ;JOB IS NOT RUNNABLE
4833 SEARLB: JUMPE U,SEARL ;DON'T FIGURE SYSTEM JOB
4835 IFE SWPWSP, SKIPL USWSCD(U) ;IF LOCKED OUT, DONT COUNT
4836 IFN SWPWSP, TLNN T,%SWSB
4838 JRST SEARB1 ;NOT WAITING FOR PAGE
4839 MOVE T,NMPGS(U) ;USER IS WAITING FOR PAGE SO COUNT FOR ACTIVE
4845 SEARB1: TLNE T,%SWBEM
4846 JRST SEARL ;HAVE MADE BEST SWAPOUT EFFORT
4850 ADDM T,BUMPGS ;REAL MEM PGS BELONGING TO BLOCKED USERS
4853 SEARS1: SKIPN UNAME(U)
4855 MOVE T,USWST(U) ;GUY STOPPED, DOES HE HAVE PAGES IN REAL MEM?
4857 JRST SEARL ;HAVE TRIED BEST EFFORT TO SWAP OUT
4864 ;TEST ALL THINGS THAT MAKE A PERSON UNRUNNABLE, OR AT LEAST
4865 ;REQUIRE THE ATTENTION OF THE SCHEDULER
4866 ;SKIP-RETURN IF JOB IS RUNNABLE, BASHES T, A
4867 SCHACK: CAMGE U,USRHI ;NON-EXISTENT
4868 SKIPE USTP(U) ;STOPPED
4871 JRST [ TDNE T,[BADBTS]
4872 JRST SCHACI ;NON-DEFERRABLE
4874 JRST .+3 ;ALL INTERRUPTS DEFERRED
4880 JRST [ SKIPN PICLR(U)
4881 JRST .+1 ;ALL INTERRUPTS DEFERRED
4886 SKIPE FLSINS(U) ;FLUSH INSTRUCTION NOT SATISFIED
4887 JRST [ MOVE T,EPDL2(U)
4888 XCT FLSINS(U) ;IT MAY BE SATISFIED BUT NOT CLEARED YET
4889 POPJ P, ;STILL BLOCKED
4890 JRST .+1 ;CAN SKIP VARIOUS RANDOM NUMBERS OF TIMES
4893 SCHAC1: SKIPLE T,URTIME(U) ;REAL-TIME BLOCKED
4900 SCHACI: MOVE T,UPC(U) ;TRYING TO INTERRUPT, NEEDS SCHEDULER
4901 TLNN T,%PCUSR ;ATTENTION UNLESS RUNNING IN EXEC MODE
4902 SKIPE FLSINS(U) ;IN WHICH CASE NEED TO LET IT FINISH
4903 POPJ P, ;SO IT CAN BE PCLSRED
4906 ;PUT JOB IN U, PRIORITY IN A, INTO STACK IN PRIORITY ORDER. BASH T,TT,B.
4907 SCHSJB: SKIPG T,SCHBNJ ;FIRST SEARCH FOR SLOT IN WHICH TO INSERT
4908 JRST SCHSJ1 ;BUFFER NOW EMPTY, SKIP SEARCH
4911 SOJG T,.-1 ;LOOP TERMINATES WITH T SLOT WHERE IT BELONGS
4913 SOJA T,SCHSJ3 ;BUFFER FULL, WORK DIFFERENTLY
4914 SCHSJ0: MOVE B,SCHBTB-1(TT) ;MOVE STUFF UP TO ADD ANOTHER ENTRY
4921 SCHSJ5: MOVEM U,SCHBTB(T)
4925 SCHSJ3: AOS NSCHOV ;BUFFER NOT BIG ENOUGH FOR ALL RUNNABLE JOBS
4926 JUMPL T,CPOPJ ;THIS JOB IS LOWEST PRIORITY, FORGET IT
4927 JUMPE T,SCHSJ5 ;THIS JOB IS SECOND-LOWEST PRIORITY, FORGET LOWEST
4928 MOVE TT,[SCHBTB+1,,SCHBTB]
4929 BLT TT,SCHBTB-1(T) ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4930 MOVE TT,[SCHBPR+1,,SCHBPR]
4934 ;PUSH JOB IN I ONTO STACK OF RUNNABLE JOBS
4937 JRST [ SOS SCHBNJ ;BUFFER OVERFLOW
4938 AOS NSCHOV ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4939 MOVE T,[SCHBTB+1,,SCHBTB]
4940 BLT T,SCHBTB+SCHBLN-2
4941 MOVEM I,SCHBTB+SCHBLN-1
4946 ;POP STACK OF RUNNABLE JOBS INTO U (RETURNS -1 IF STACK EMPTY)
4947 SCHGB: SOSL U,SCHBNJ
4949 SETZM SCHBNJ ;BUFFER EMPTY, U HAS -1
4967 ;DETERMINES USER PRIVILEGE LEVEL FOR SCHEDULING AND SWAPPING
4968 UPRIVL: SKIPN RPCL(U) ;BEING RPCLSR'ED?
4969 CAMN U,UMASTER ;MASTER?
4970 POPJ P, ;HIGHLY PRIVILEGED
4971 AOS (P) ;SKIP AT LEAST ONCE
4972 IFN 340P\E.SP, ALTSKP DISUSR
4973 IFN VIDP, ALTSKP NVDUSR
4974 IFN TABP, ALTSKP TABUSR
4975 IFN ARMP, ALTSKP ARMUSR
4976 IFN LPTP, ALTSKP LPTUSR
4977 IFG LPTP-1, ALTSKP OLPUSR
4978 IFN PLTP, ALTSKP PLTUSR
4981 POPJ P, ;DON'T FIGURE DISOWNED IF USING ABOVE DEVICES
4988 OVHMTR SC3 ;SCHEDULER 3 - EXIT
4994 PUSHJ P,SSWC1 ;SEE IF ENUF CORE TO UNBLOCK A SWAPPED BLOCKED LOSER
4997 SKIPGE U,I ;SKIP IF NON-NULL JOB BEST
5004 PUSHJ P,SCHGB ;GET HIGHEST-PRIORITY JOB
5005 JUMPL U,SCHED1 ;NONE, RUN NULL JOB
5007 SCHED6: SKIPE FLSINS(U)
5010 JUMPL U,SCHDN ;JUMP IF SWITCHING FROM NULL JOB
5011 CAMN U,USER ;SKIP UNLESS RUNNING SAME JOB AGAIN
5012 JRST SEAREP ;JUMP ON SAME JOB
5014 CAMN U,MTRJOB ;IF LEAVING JOB BEING METERED, STOP METER AND
5017 CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1
5019 ;SWAP OUT THE OLD JOB'S CONSOLE REGISTER, AND CLEAR ITS BLINKER.
5023 JRST SSTVR1 ;DONT HACK 11
5024 SKIPL TVCREG(U) ;DO WE WANT TO SAVE TV CONSOLE REG FOR THIS GUY?
5025 SKIPN T,400000+TTR10*2000 ;0 IS NOT A (VERY) LEGITIMATE CONSOLE REG FCN
5026 JRST SSTVR2 ;SO ASSUME 11 STOPPED, DONT CLOBBER PREV THING
5028 SSTVR2: SKIPGE T,TVVBN(U) ;DID WE SET RUNNING BLINKER FOR THIS GUY?
5030 MOVEM T,400000+TTR10*2000 ;SET TO VIDEO BUFFER WE SET IT IN
5031 MOVE A,TVBLAD ;ADDR IN VIDEO BUFFER WE FLASHED
5032 CLEARM 400000+TTR0*2000(A) ;CLEAR IT
5036 MOVEM T,SV40(U) ;SAVE LAST UUO EXECUTED FOR THIS USER
5037 MOVE T,UPC(U) ;IF USER HAS JUST TRAPPED TO 60,
5045 ADDM T,UPC(U) ;THEN MOVE HIM INTO UUOH INSTEAD
5046 MOVE T,60 ;AND MOVE 60H'S VARIABLES INTO UUOH'S VARS
5047 MOVEM T,SV40(U) ;(THAT'S ALL 60H DOES ANYWAY).
5053 ;COME HERE TO SET UP A JOB THAT WASN'T ALREADY RUNNING.
5057 JRST SCHDN2 ;JUMP IF SWITCHING TO NULL JOB
5059 MOVE T,SV40(U) ;LOAD NEW KRUFT
5063 SKIPGE TT11P ;DONT HACK 11 IF ITS DOWN (MOSTLY IN CASE ITS BEING HACKED
5066 JRST SLTVR1 ;DONT HACK 11
5067 SKIPGE T,TVVBN(U) ;BLINK RUNNING FROB?
5069 MOVEM T,400000+TTR10*2000
5072 MOVEM T,400000+TTR0*2000(A)
5074 SLTVR2: MOVSI T,12_<8+4+16.-18.> ;ALU NOP
5077 MOVEM T,400000+TTR10*2000
5080 CAMN U,MTRJOB ;IF THIS JOB'S BEING METERED, TURN ON METER AND TIME BASE.
5083 CONO MTR,2001 ;TIME-BASE ON, INTERVAL PIA=1
5085 SOS NRESKED ;COMPENSATE FOR EXTRA AOS ON NEXT PAGE
5089 ;COME HERE TO START UP A JOB EVEN IF IT WAS ALREADY RUNNING BEFORE THIS SCHEDULE.
5094 ANDCAM T,UPQUAN(U) ;RESET QUANTUM TIMER
5097 RPERFC STPERF ;SAVE PERF METERS FOR LATER USE
5098 DMOVE A,EBOXCT(U) ;COMPUTING RUN TIME EFFECTIVELY RESETS
5099 DMOVEM A,STEBOX ;QUANTUM TIMER
5103 IFN KS10P, SETZM UPQUAN(U) ;RESET QUANTUM TIMER
5109 IFE KS10P,[ ; KS has no lights.
5113 DATAO LIGHTS,B ;LIGHTS HAVE ONE BIT, SHOWING WHICH JOB IS RUNNING.
5115 MOVN B,A ;GET JOB'S NUMBER IN B
5116 MOVE T,UPC(U) ;USER'S PC WORD
5118 AOS A,SCHHP ;SET UP SCHEDULER HISTORY TBL
5122 HRRM T,(A) ;STORE PC
5125 HRLM B,(A) ;STORE USER INDEX AND USER BIT
5128 BLT T,UEXND-1 ;BLT IN UEXIT BLOCK
5132 XCTR XW,[HRRZM T,13] ;GCSTBR
5133 XCTR XW,[HLRZM T,14] ;STBR
5134 ] ;KL10P ;CONTEXT WILL BE RESTORED AT CLKB5 BELOW
5135 IFN KA10P, CONO @APRC(U)
5138 ; THIS IS THE ONE PLACE WHERE CLOCK LEVEL RETURNS TO THE USER JOB
5141 IFE KA10P, DATAO PAG,@CLCXSV ;RESTORE CONTEXT
5143 MOVSI U,AC0S(U) ;RESTORE AC BLOCK 0
5145 JRST 12,@CLKBRK ;RESTORE PC, FLAGS, AND PI
5147 ;HERE WHEN STARTING A USER WHO HAD BEEN FLSING
5149 SCHED5: MOVE T,USWST(U)
5151 TLNN T,%SWPGW ;PAGE WAITS DON'T COUNT AS BLOCKING
5152 TLNN T,%SWOUT ;IF SWAPPED-OUT, UNBLOCKING BUMPS SWAP-IN PRIORITY
5154 MOVE TT,USWPRI(U) ; (A SOMEWHAT QUESTIONABLE FEATURE)
5160 JRST SCHED7 ;JUMP IF PAGES SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5162 SOS NPGWTU ;NOT WAITING FOR A PAGE ANY MORE
5163 MOVSI T,%SWPGW+%SWRUN+%SWINT ;NOT WAITING FOR PAGE,NOT UNBLOCKED SWAPOUT,
5164 ANDCAM T,USWST(U) ;NOT WAITING FOR INTERRUPT PAGE
5165 SETZM FLSINS(U) ;NOT WAITING FOR ANYTHING
5168 SCHED7: PUSHJ P,PCLSR ;PAGES WERE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5169 BUG ;SO PCLSR JOB SINCE IT MIGHT BE COUNTING ON THOSE PAGES
5170 JRST SCHED1 ;PCLSR MUST SUCCEED. JOB WAS BLOCKED WITH EMPTY LSWPR.
5173 ;COME HERE TO RUN THE NULL JOB.
5175 SCHDN2: SKIPL A ;WERE RUNNING IT ALREADY?
5176 AOS NNULBK ;NO, INCREMENT # CONSECUTIVE BLOCKS OF NULLTIME.
5178 MOVEM T,CLUSAV ;AVOID LOSSAGE AT CLKBRK+1 NEXT CLOCK INT
5179 IFE KA10P, MOVEM T,CLCXSV
5180 IFE KS10P,[ ; KS has no lights.
5182 DATAO LIGHTS,[0] ;LOAD LIGHTS WITH JOB RUNNING (NONE)
5192 CONO MTR,2001 ;TIME-BASE ON, INTERVAL PIA=1
5197 IFN KS10P, SETZM UPQUAN
5198 CLEARM SCHFLG ;RESCHEDULE ON NEXT CLK INT
5200 JRST 12,@[%PSPCU,,NULJOB] ;DISMISS INT AND GO TO NULL JOB
5202 NULJOB: MOVSI (JRST 4,)
5203 MOVEI 17,1 ;SET ACS 0 TO 16 TO JRST 4,0
5204 BLT 17,16 ;TO CATCH SPURIOUS TRANFERS TO ACS
5205 MOVE 17,[AOJA 17] ;RUNS IN ACS TO FREE MEMORY FOR OTHER PROCESSORS
5206 JRST 2,@[%PCUSR,,17] ;RUNS IN USER MODE FOR SAKE OF RANDOMNESS
5209 OVHMTR SC4 ;SCHEDULER 4 - UNSWAPBLOCKER
5211 ;SEE IF THERE IS ENOUGH CORE TO UNBLOCK A SWAP-BLOCKED JOB.
5212 SSWC1: SKIPGE U,BUSR
5223 POPJ P, ;THERE ISN'T ENOUGH ROOM.
5225 ANDCAM T,USWSCD(U) ;CLEAR SWAP BLOCKED
5228 MOVEM D,BUSIZ ;SIZE OF SMALLEST SWAP-BLOCKED USER.
5235 SSWSC4: CAML U,USRHI
5244 SSWSC5: ADDI U,LUBLK
5247 SSWSC6: MOVEM R,BUSR ;STORE NEW SMALLEST SWAPPED BLOCKED LOSER
5251 SSWSC3: JUMPL I,SEARL0 ;MAYBE CAN RUN THIS GUY NOW
5255 OVHMTR SWU ;SWAP USER
5257 ;SWAP OUT N PAGES (N IS IN SWPOPR)
5259 SKIPGE CIRPSW ;CAN'T DO ANYTHING WITHOUT CIRPSW
5261 POPJ P, ;ALREADY STUFF ON WAY OUT
5262 SKIPL U,PSWOUS ;SEE IF CONTINUING TO SWAP OUT A USER
5266 SKIPE LSWPR(U) ;PREFER NOT TO SWAP OUT
5267 JRST SWPON1 ;USER WHO HAS SWITCHES LOCKED
5268 SKIPE UNAME(U) ;SKIP ON USER KILLED
5269 SKIPL USWST(U) .SEE %SWDSO ;OR NOT DESIRED OUT ANY MORE
5270 SWPON1: PUSHJ P,SWPON2 ;FIND NEW USER TO FLUSH
5272 SWPON6: MOVSI A,%SWDSO ;THIS USER NOW DESIRED OUT
5278 JRST SWPU1 ;OK TO SWAP USER
5279 SKIPN LSWPR(U) ;PCLSR IF HAS LOCKS, OR AT JBFLS,
5280 SKIPN FLSINS(U) ;OR IF NOT BLOCKED
5282 MOVSI T,%SWPCL ;OTHERWISE, DON'T PCLSR NOW, BUT
5283 IORM T,USWST(U) ;WHEN IT UNBLOCKS
5284 JRST SWPU1 ;AND START SWAPPING OUT ITS PAGES
5286 SWPON8: PUSHJ P,PCLSR ;GET OUT OF SYS BEFORE SWAPPING OUT
5290 ;FOUND NO USER TO SWAP OUT
5292 JRST SWOL1 ;SWAP OUT SOME LOOSE PAGES
5293 AOSE SBEFLG ;HAVE WE COME HERE TWICE?
5294 JRST SWUP6 ;YES, GIVE UP
5295 MOVSI B,%SWBEM ;NO, TURN OFF EVERYONE'S BEST EFFORT BIT
5296 MOVEI J,2*LUBLK ;AND LOOK AT EVERYONE AGAIN SINCE WE'RE DESPERATE
5297 SWUP9: CAML J,USRHI ;TO FIND A PAGE TO SWAP OUT
5303 SWUP7: PUSHJ P,SWPON2 ;HAVING TURNED OFF %SWBEM, FIND A USER TO SWAP OUT
5304 JUMPG U,SWPON6 ;GO SOMEONE, GO DO
5305 SWUP6: SETZM SWPOPR ;CAN'T FIND ANYONE TO SWAP OUT, GIVE UP
5309 SWOL1: SKIPN A,FLOOSP ;SWAP OUT SOME LOOSE PAGES
5310 BUG ;NLOOSP WAS TOO HIGH?
5313 BUG ;CIRPSW, EXEC PAGE COUNT ALREADY CHECKED
5314 SETOM SBEFLG ;WE FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5316 SOSLE SWPOPR ;ENOUGH
5317 CAIL C,20. ;ENOUGH FOR NOW
5319 SKIPE NLOOSP ;SWAP OUT MORE PAGES
5322 \f;START SWAPPING OUT THIS USER'S PAGES
5326 IORM A,USWST(U) ;INDICATE USER WAS RUNNABLE AT TIME OF SWAP OUT
5331 MOVE T,UPC(U) ;CALCULATE WHAT PAGE HIS PC IS ON
5332 LDB C,[121000,,UPC(U)]
5335 MOVE A,[222200,,(C)]
5341 ANDI A,PMRCM ;MASK TO REAL CORE ADR BITS
5342 SKIPN USTP(U) ;ONLY IF RUNNING
5343 TLNN T,%PCUSR ;AND IN USR MODE
5345 MOVEM A,SWUPC ;THEN DON'T ALLOW UPC PAGE TO BE SWAPPED OUT
5350 JRST SWPU3A ;PICK UP FROM WHERE LEFT OFF
5355 MOVEI C,UPGMP(U) ;ADDRESS OF PAGE MAP (START FROM PG 0)
5357 HRLI C,442200 ;CNVRT TO BYTE PNTR TO MAP
5361 LDB B,[121100,,HUSRAD(U)] ;DO ALL PAGES THAT MIGHT EXIST
5362 SWPU2: ILDB D,SWPCBP ;CIRC PNTR ENTRY
5363 ILDB A,SWPMBP ;PAGE MAP ENTRY
5365 JUMPE D,SWPU3A ;DOESN'T HAVE PAGE
5368 SKIPE USTP(U) ;DON'T SWAP OUT PAGE 0 IF NOT STOPPED
5369 CAIN D,-1 ;PAGE IS ABSOLUTE
5371 TRNN A,600000 ;NO ACCESS
5375 TRON A,PMAGEM ;HAS PAGE BEEN REFERENCED? (AGE MASK)
5379 SWPU2A: ANDI A,PMRCM ;MASK TO REAL CORE PAGE #
5380 CAMN A,SWUPC ;DON'T SWAP OUT PAGE WHERE PC IS IF RUNNING
5383 IFN SWPWSP,[ ;I DOUBT THAT MOST OF THAT NONSENSE DOES ANYTHING
5384 TRNE A,600000 ;NO ACCESS
5385 CAIN D,-1 ;OR PAGE IS ABSOLUTE
5386 JRST SWPU3A ;MEANS DON'T SWAP OUT
5387 ANDI A,PMRCM ;MASK TO REAL CORE PAGE #
5389 HRRZ D,MMSWP(A) ;NUMBER OF USERS WHO HAVE THIS PAGE MAPPED
5390 SOJN D,SWPU4 ;PAGE IS SHARED
5391 SWPU6: MOVEM B,PSWLC ;SAVE HOW FAR SWAP-OUT SCAN GOT
5393 PUSHJ P,SWPOPG ;SWAP OUT THIS PAGE
5395 SETOM SBEFLG ;FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5397 SOSLE SWPOPR ;ENOUGH
5398 CAIL C,20. ;ENOUGH FOR NOW
5402 SWPU3A: SOJG B,SWPU2
5405 IORM B,USWST(U) ;SET BEST EFFORT BIT
5407 SKIPL APRC(U) ;IF DISOWNED,
5409 MOVE B,USWPRI(U) ;DECREASE PRIORITY TO COME BACK IN
5414 \f;TRYING TO SWAP OUT A SHARED PAGE
5415 SWPU4: MOVEM B,PSWLC ;SAVE HOW FAR SWAP-OUT SCAN GOT
5417 BUG ;CIRPSW LOCKED IN SWAP OUT CODE
5418 MOVE C,[2200,,MEMPNT(A)]
5421 400000,,SWPU5 ;CONSULT THE OTHER USERS OF THE PAGE
5424 JRST SWPU6 ;OK TO SWAP IT OUT
5426 SWPU5: SKIPGE TT,USWST(U) .SEE %SWDSO
5427 POPJ P, ;USER DESIRED OUT, CAN'T HOLD PAGE IN
5428 IFN SWPWSP, TLNN TT,%SWLOD ;IF USER IS LOADING, HOLDS PAGE IN
5438 TRNE TT,600000 ;SKIP IF NO ACCESS, IGNORE AGE
5439 TRNE TT,PMAGEM ;HAS SHE USED THIS PAGE?
5440 POPJ P, ;NO, CAN'T HOLD PAGE IN
5441 SWPU5A: SUB P,[4,,4]
5442 SETOM CIRPSW ;SHARED W/USER WHO IS WANTED IN CORE
5443 AOS NSHRAB ;SO DON'T SWAP IT OUT
5446 ;COME HERE WITH BEST USER TO SWAP OUT IN U, CLASS IN C
5447 SWPONX: JUMPL U,CPOPJ ;NO SWAP OUTTABLE LOSER
5452 SETO U, ;WOULD RATHER SWAP OUT LOOSE PAGES
5455 SWPNX2: MOVSI T,%SWOUT ;MAKE USER SWAPPED OUT
5457 JRST SWPNX3 ;ALREADY IS?
5462 MOVEM T,USWTIM(U) ;DROPS INTO SWPNX3
5468 JRST [ SETO U, ? POPJ P, ] ;WOULD RATHER SWAP OUT LOOSE PAGES
5470 JRST SWPNX3 ;HE'S ALREADY SWAP BLOCKED
5471 TLNN B,%SWPGW ;IS HE RUNNABLE?
5475 MOVE B,NMPGS(U) ;HE'S RUNNABLE
5476 CAIGE B,TSYSM-SYSB-MEMSY1
5477 JRST SWPNX1 ;SMALL, NO THRASH
5484 JUMPG B,SWPNX3 ;LET THIS GUY THRASH
5485 SWPNX1: SKIPN ENSWBK
5487 MOVSI B,(SETZ) ;SWAP BLOCK THIS LOSER
5491 MOVE B,NMPGS(U) ;SMALLEST SWAP BLOCKED LOSER?
5495 MOVEM B,BUSIZ ;DROP INTO SWPNX3
5497 ;HAVING DECIDED TO SWAP OUT JOB IN U, MAKE SWAP HISTORY TABLE ENTRY
5498 SWPNX3: MOVSI T,2_16.
5499 ;GENERAL SWAP HISTORY TABLE KEEPER. ENTER WITH JOB IN U, EVENT IN T, BASHES TT,I,T
5501 IDIVI TT,LUBLK ;TT 3.1-3.8 GETS JOB NUMBER, BASHES I
5504 IFN SWPWSP, HLRZ T,UWRKST(U)
5514 MOVEM TT,SWPHTL-1(T)
5516 CAIL T,SWPHTB+SWPHTL
5520 OVHMTR SWF ;SWAP FIND USER
5522 ;FIND A USER TO SWAP OUT, RETURN IN U, -1 IF NONE
5523 SWPON2: SETOM PSWSFL ;START FROM BEG OF USER
5526 PUSHJ P,CKPRUS ;MAKE SURE PRIV USER EXISTS AND HAS NOT BEEN BLOCKED FOR A LONG TIME
5529 ADD T,TIME ;A MINUTE AGO
5532 MOVEI C,NSSCDC ;# SWAP OUT CLASSES
5533 SWPON4: CAML J,USRHI ;C HAS INDEX OF MAX CLASS INTERESTED IN
5534 JRST SWPONX ;LOOKED AT ALL USERS, GO PONDER RESULTS
5535 SKIPE UNAME(J) ;SEE IF FOR REAL
5536 SKIPN NMPGS(J) ;DON'T BOTHER IF HAS NO MEMORY
5540 TLNE B,%SWBEM+%SWLOD ;DON'T SWAP OUT IF BEST EFFORT ALREADY MADE,
5541 JRST SWPON3 ; OR STILL LOADING IN
5544 CAMLE TT,TIME ;IF PROTECT TIME HASN'T ELAPSED YET, GETS HIGHER PRIORITY
5545 JRST SWPTK ;TO PREVENT THRASHING
5550 JRST SWPON3 ;BEST EFFORT ALREADY MADE
5553 JRST SWPON7 ;PREFER NOT TO SWAP OUT LOSER WITH SWITCHES LOCKED
5556 JRST SWPON5 ;FLSINS IS WAITING FOR A PAGE (NOT REALLY BLOCKED)
5558 SOJA I,SWPTK ;BLOCKED FOR A LONG TIME (CLASS 0)
5560 SWPON5: SKIPE USTP(J)
5561 JRST SWPTK ;CLASS 1 (BLOCKED)
5564 JRST [ MOVEI I,7 ;CLASS 7 (PRIV USER)
5567 JUMPL B,[AOJA I,SWPTK] .SEE %SWDSO ;DESIRED OUT (CLASS 2)
5570 SOJA I,SWPTK ;DISOWNED (CLASS 3)
5573 JRST SWPTK ;SWAP BLOCKED (CLASS 4)
5576 AOJA I,SWPTK ;DOESNT HAVE TTY (CLASS 5)
5577 SWPON7: MOVEI I,6 ;OTHERWISE....
5580 JRST SWPON3 ;THIS GUY IN MORE WINNING CLASS
5585 .ELSE MOVE A,UWRKST(J)
5588 XCT SWPTT(C) ;IN SAME CLASS, COMPARE CLASS-DEPENDENT PRIORITY MEASURES
5590 SWPTK2: MOVE E,@SWPTT(I) ;MAKE THIS GUY BEST VICTIM
5593 SWPON3: ADDI J,LUBLK
5596 ;SKIP IF THIS GUY (J) IS BETTER LOSER TO FLUSH THAN PREV BEST (IN E)
5597 SWPTT: CAMG E,LUBTM(J) ;BLOCKED FOR A LONG TIME (0) - LATER LUBTM WINS
5598 CAMG E,LUBTM(J) ;BLOCKED (1) - LATER LUBTM WINS
5599 CAML E,A ;DESIRED OUT (2) - SMALLER WORKING SET WINS
5600 CAML E,A ;DISOWNED (3) - SMALLER WORKING SET WINS
5601 CAML E,A ;RUNNABLE, SWAP BLOCK SET (4) - SMALLER WORKING SET WINS
5602 CAML E,USWPRI(J) ;RUNNABLE, W/O TTY (5) - GO BY PRIORITY
5603 CAML E,USWPRI(J) ;OTHERWISE (6) - GO BY PRIORITY
5604 IFE SWPWSP, BUG ;PRIVELEGED USER (7) - SHOULD ONLY BE ONE
5605 IFN SWPWSP, CAMG E,USWTIM(J);PROTECTED (7) - LATER UNPROTECT TIME WINS
5609 CKPRUS: MOVSI B,%SWPRV
5611 ANDCAM B,USWST(U) ;TURN OFF PRIV USER BIT
5613 ADD TT,TIME ;TWO SECONDS AGO
5624 OVHMTR UUO ;RANDOM UUOS
5626 ;AC: A.9 =>1 SWAP OUT USER
5628 ;4.7=1 => LOOP FOR A WHILE
5629 ;3.9-3.1 USER # SELF IF 0
5630 ;RH => USER VIRTUAL PG #
5631 ;OR 4.9=0, 4.8=0, 4.7=0 SWAP OUT RH # OF PAGES
5632 ;IF 4.9=0, 4.8=1 AND 4.7=0, HACK PCLSR TEST FEATURE ON CURRENT USER
5633 ;RH =0 LEAVE PCLSR TEST MODE =1 ENTER IN ADVANCE MODE =-1 ENTER IN HOLD MODE
5634 ; =2 ENTER IN ADVANCE BUT DON'T ^Z
5643 JRST ASWPCL ;PC LSR TEST MODE.
5644 HRRZM A,SWPOPR ;CLOBBER CLOBBER
5648 ANDI B,777 .SEE MAXJ ;FIELD SHOULD BE BIG ENOUGH
5667 ASWAP2: PUSHJ P,CWAIT ;RETURNS WITH CLKOFF AND CIRPSW AVAILABLE
5669 HRRZS A ;A HAS VIRTUAL PAGE #
5670 PUSHJ P,UPLC ;RETURN POINTERS IN T AND Q
5671 LDB A,T ;GET MAP ENTRY
5672 LDB C,Q ;GET CIRC PNTR
5673 CAIE C,-1 ;DON'T SWAP OUT ABS PAGE
5675 POPJ P, ;ALREADY OUT OR DOESN'T HAVE PAGE
5676 ANDI A,PMRCM ;MASK TO REAL CORE PAGE #
5682 ASWAP3: MOVE B,[1250000.]
5687 ASWPCL: MOVEM U,PCLUSR
5697 ; ARG 2 - PAGE NUMBER IN <JOB>'S ADDRESS SPACE
5698 ;IF ONLY ONE ARGUMENT IS GIVEN, IT IS ARG 2, AND ARG 1 DEFAULTS TO CURRENT USER
5700 ;THE PAGE IS SWAPPED OUT. THE CALL DOESN'T RETURN UNTIL THE SWAP IS COMPLETED.
5701 ; THIS ALLOWS USER TO BE SURE THAT THE COPY ON DISK IS UP TO DATE.
5702 ;CONTROL BIT 1.1 => RETURN IMMEDIATELY, NO WAITING. TO WAIT LATER, JUST DO
5703 ; ANOTHER PGWRIT WITHOUT SETTING 1.1.
5704 ;CONTROL BIT 1.2 => UNLOCK PAGE. IF YOU CALL THIS ON A LOCKED PAGE,
5705 ; WITHOUT SETTING BIT 1.2, THE PAGE WILL BE SWAPPED OUT, BUT THE NEXT
5706 ; TIME IT IS SWAPPED IN IT WILL BE LOCKED AGAIN. THIS IS USEFUL FOR
5707 ; CONTROLLING EXACTLY WHEN A DATA BASE PAGE GETS WRITTEN TO DISK.
5710 JRST [ MOVE J,U ? JRST NPGWR1 ]
5712 JSP T,NCORUI ;DECODE THE JOB SPEC
5714 JSP T,NCORWR ;WHICH MUST BE WRITABLE
5719 JRST OPNL34 ;CAN'T HACK PDP6
5721 MOVE A,B ;NOTE: SWPOPG TAKES CARE OF THE PCLSR'ING
5722 PUSHJ P,NPGWR1 ;CALL MAIN ROUTINE
5723 POPJ P, ;LOST, OPNL CLEARED LSWPR
5724 JRST LSWPJ1 ;WON, UNLOCK DIELOK
5726 ;USER INDEX IN J, PAGE NUMBER IN A
5727 NPGWR1: TDNE A,[-1,,-400]
5728 JRST OPNL32 ;PAGE NUMBER NOT VALID
5729 PUSHJ P,CWAIT ;DON'T ALLOW PAGE MAPS TO CHANGE, AND TURN CLK OFF
5730 SKIPL CIRPSW ;DON'T NEED UTCOFF BECAUSE UTC LEVEL CAN ONLY PUT PAGES INTO MAPS
5734 LDB D,Q ;D GETS CIRC PNTR
5735 JUMPE D,OPNL32 ;NO PAGE THERE
5737 JRST OPNL12 ;ABSOLUTE PAGE
5739 MOVE C,Q ;STARTING FROM UPGCP, FIND MMP
5743 SUB P,[4,,4] ;FOUND MMP, C POINTS TO IT
5744 MOVSI T,MMPTMP ;IF PAGE IS IN TRANSIT
5747 TDNE T,(C) ;AWAIT COMPLETION
5749 JRST NPGWR1 ] ;THEN TRY AGAIN
5750 MOVE E,C ;SAVE ADDRESS OF MMP ENTRY
5751 PUSHJ P,UCPRL ;SEE IF PAGE IS IN MEMORY
5753 POP P,U ;NOT SWAPPED IN, BYPASS SWAP-OUT CODE
5756 NPGWR3: SUB P,[4,,4] ;IT'S SWAPPED-IN TO CORE PAGE IN T
5759 JUMPN D,OPNL12 ;POINTED TO BY AN EXEC PAGE, E.G. 340, SHOULDN'T MESS.
5760 PUSH P,A ;SAVE USER'S VIRTUAL PAGE #
5761 PUSH P,J ;SAVE WHAT JOB THAT IS
5762 PUSH P,E ;SAVE ADDRESS OF MMP ENTRY
5763 MOVE A,T ;PHYSICAL PAGE # TO SWAP OUT
5764 MOVE C,USER ;DON'T PCLSR ME
5765 PUSHJ P,SWPOPL ;SWAP OUT, EVEN IF LOCKED
5766 JRST NPGWR4 ;NO DISK SPACE, OR SOME JOB NOT PCLSRABLE
5770 NPGWR2: MOVE T,CTLBTS(U)
5772 TRNE T,2 ;CONTROL BIT 1.2 UNLOCKS
5774 TRNE T,1 ;CONTROL BIT 1.1 INHIBITS WAITING FOR SWAP TO FINISH.
5776 MOVSI T,MMPTMP ;PAGE IN TRANSIT BIT
5777 TDNE T,(E) ;WAIT FOR BIT TO TURN OFF
5781 ;COULDN'T SWAP OUT, WAIT A WHILE AND TRY AGAIN
5782 NPGWR4: PUSHJ P,UDELAY ;UDELAY TURNS CLKON
5792 IFN 340P\E.SP, DISSWI: -1 ;USER
5793 IFN VIDP, VIDSWI: -1
5794 IFN IMXP, POTSWI: -1
5795 IFN NSWPV-.+SWIRQB,.ERR NSWPV ERR
5798 IFN 340P\E.SP, DISSPG: 0 ;VIRTUAL PAGE NUMBER
5802 SWPNTB: ;SIGNAL BITS IN LH OF W TO CFHSW1
5803 IFN 340P\E.SP, 400000 ;DISPLAY
5804 IFN VIDP, 400000 ;VID
5805 IFN IMXP, 400000 ;POTS
5807 SWILMT: ;PIRQC BIT TO SET ON ILM
5808 IFN 340P\E.SP, %PIDIS
5812 PSWOUS: -1 ;INDEX OF PARTIALLY SWAPPED OUT USER
5813 PSWCLS: 0 ;CLASS OF PARTIALLY SWAPPED OUT USER
5814 PSWSFL: 0 ;-1 START FROM BEG OF USER, ELSE PICK UP WHERE LEFT OFF
5815 SWPMBP: 0 ;PNTR TO MAP
5816 SWPCBP: 0 ;PNTR TO CIRC DESC SPACE
5817 PSWLC: 0 ;LOOP COUNT
5818 SBEFLG: -1 ;0 => ALREADY ONCE WANTED TO CLEAR ALL "BEST EFFORT" BITS.
5819 SWPOPR: 0 ;NUMBER OF PAGES DESIRED TO BE SWAPPED OUT
5820 SWPOPB: 0 ;SWAP OUT REQUEST BUT ONLY SWAP OUT NON-RUNNING USERS TO MEET (UNUSED?)
5821 SILNG: 0 ;TOTAL LENGTH OF SWAP IN LISTS
5822 SOLNG: 0 ;TOTAL LENGTH OF SWAP OUT LISTS
5823 ;SINLST AND SOUTLS ARE IN DISK CODE. VARIATION ON QBFP.
5824 SWODSK: NQS-1 ;UNIT TO SWAP OUT ON NEXT
5825 SWOBK: 0 ;MEMBLT BEING SWAPPED OUT
5826 SWOMMP: 0 ;MMP ADDRESS (NOT INDEX)
5827 SPGNMF: 0 ;-1 => PAGE NOT MODIFIED
5828 CFHAS: 0 ;TEMP FOR A AT CFH
5829 SWPIQS: 0 ;SAVE Q AT SWPPIN
5830 CFHUVP: 0 ;USER'S VIRTUAL PAGE NUMBER TOOK FAULT ON
5831 LUMPS: 0 ;UMAPS USED FOR CURRENT USER, MAY DIFFER FROM
5832 ;UMAPS(U) IF TOOK FAULT TRYING TO CAUSE INTERRUPT
5833 TRUMM: 0 ;TOTAL USER MEM ACTIVE USERS
5834 NPGSWO: 0 ;NUMBER OF CURRENTLY SWAPPED OUT PAGES
5835 AUSOPG: 0 ;ACTIVE USER SWAPPED OUT PAGES
5836 BUMPGS: 0 ;REAL CORE PAGES OCC BY BLOCKED + STOPPED LOSERS
5837 NUSWB: 0 ;# LOSERS SWAP BLOCKED
5838 SWPOPU: 0 ;USER PG "BELONGS" TO (IE NOT NECC TO PCLSR THIS GUY,
5839 ;BUT PCLSR ANYONE ELSE LINKED TO PG.)
5840 AGEREQ: 0 ;NUMBER OF PAGES BEING AGED AT SLOW CLOCK
5841 AGEPOS: 0 ;LAST PAGE # AGED
5844 PRVUSR: -1 ;PRIV USR
5845 PRVCUT: 1500 ;CUT OFF FOR PRIV USR
5846 SWUPC: 0 ;ABSOLUTE PAGE NUMBER OF USER MODE PC DURNING SWAP OUT
5847 SWPP0F: -1 ;-1 IF CONSIDERING PAGE 0
5848 ASBUM: 0 ;REAL MEM OCC BY ACTIVE "SWAPPED BLOCKED" LOSERS
5849 SWSCT1: 0 ;TEM AT SWSCD
5850 BUSR: 0 ;INDEX OF SMALLEST SWAP BLOCKED LOSER
5851 BUSIZ: 0 ;SIZE OF BUSR
5855 PREEMP: 0 ;IF NON-ZERO, A PRE-EMPT IS IN PROGRESS (WHEN WE NEXT GET TO CLK LVL)
5856 NPREEL: 0 ;NUMBER OF LOOPS AT SCHEDP (ATTEMPTED PREEMPTS)
5857 NPREEM: 0 ;NUMBER OF SUCCESSFULL PREEMPTS
5858 NPREE1: 0 ;NUMBER OF TIMES A PAGE CAME IN AND WE STARTED TO THINK ABOUT PREEMPTION
5859 NPREE2: 0 ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE OF CLKOFF OR IN PROGRESS
5860 NPREE3: 0 ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE FLSINS WAS WRONG
5863 ;COUNTS OF REASONS FOR ENTRY TO SCHED
5864 ;THESE METERS MAY BE TEMPORARY - SOME OF THEM ARE REDUNDANT
5865 ;REASONS NOT COUNTED - VARIOUS PARITY, NXM, AND OTHER ERROR CASES
5866 NLPPRE: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PREEMPT
5867 NLPCLK: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO CLOCK
5868 NLPUFL: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO UFLS
5869 NLPPAG: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE-IN
5870 NLPPGT: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND TUT LOCKED
5871 NLPPGC: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CIRPSW LOCKED
5872 NLPPGM: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND MEMFRZ LOCKED
5873 NLPPG3: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CALLED CFHPO3 (NO MEM)
5874 NLPPGB: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND SWAP-BLOCKED
5875 NPPIUM: 0 ;NUMBER OF TIMES PAGE PUT INTO BUNCHA USERS' MAPS
5876 NPPIU1: 0 ;NUMBER OF USERS PAGES PUT INTO MAPS OF (RATIO OF THESE 2 IS SHARING)
5879 LODQNT: ;RUN TIME IN 4-USEC UNITS BETWEEN PG FAULTS TO LEAVE
5881 IFN KL10P, 3000. ;12 MS
5882 IFN KA10P, 9000. ;36 MS
5883 IFN KS10P, 3000. .ERR Guessed LODQNT on KS10?
5884 LODFCT: 3,,0 ;MULTIPLY LOADING TIME BY THIS TO GET PROTECT TIME (INT,,FRAC)
5885 NUPTAW: 0 .SEE SWOP6 ;NUMBER OF USERS PAGE TAKEN AWAY FROM
5889 NPLBLJ: 0 ;NUMBER OF PAGE LOADS BY LOADING JOBS
5890 NPLBNL: 0 ;NUMBER OF PAGE LOADS BY NON-LOADING JOBS
5893 ; 1-, 5-, 15- minute average population of each state,
5894 ; also avg of NPGWTU and RNABLU (for load avg)
5895 ; avg of core occupied by jobs in each state,
5896 ; i.e. UWRKST for load, pro, sw in.
5897 ; Relationship of sum of UWRKST's of loading and swapped in
5898 ; versus total core occupied by user pages.
5899 ; Average time spent in each state before moving on,
5900 ; versus size of job. Maybe cpu time as well as
5907 OVHMTR SWP ;SWAP PAGE
5909 ;SWAP OUT PAGE WHOSE MEMBLT INDEX IS IN A
5911 ;C IS USER WHO DOESN'T NEED TO BE PCLSRED BEFORE HIS PAGES CAN BE SWAPPED.
5912 SWPOPL: TDZA B,B ;THIS ENTRY IGNORES LOCK BIT
5913 SWPOPG: MOVSI B,MMPLOK ;THIS ENTRY RESPECTS LOCK BIT
5918 BUG ;DON'T SWAP OUT PART OF SYSTEM
5921 LDB C,[MMMPX,,MEMBLT(A)]
5923 HRRZM C,SWOMMP ;STORE ADDRESS OF FIRST WORD OF MMP ENTRY
5924 TDNE B,(C) .SEE MMPLOK ;LOCKED IN CORE?
5925 JRST [ CAIGE A,256. ;IF SO, DON'T SWAP OUT UNLESS IN "LOW" MEMORY
5926 CAIGE A,LIOBLK ;IN WHICH CASE MUST GO OUT TO AVOID SYSTEM DEADLOCK
5927 JRST SCRPSJ ;SEE CODE AT CIMEMR
5930 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES
5934 SOS CIRPSW ;RELEASE SWITCH
5936 JUMPN B,SWOP1 ;JUMP IF DISK SPACE ALREADY ASSIGNED
5937 SWODF3: MOVSI B,-NQS
5938 SWODF6: AOS I,SWODSK
5940 SUBI I,NQS ;WRAP AROUND
5941 MOVEM I,SWODSK ;CURRENT SWAPPING DSK
5942 CONO PI,UTCOFF-1 ;DON'T CHANGE STATE OF CLOCK CHNL.
5943 SKIPGE QTUTO(I) ;TUT LOCKED
5946 SKIPG QSFTS(I) ;DSK FULL IN SWAPPING AREA
5950 CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL.
5951 MOVEI A,NQCHN+1(I) ;QMFTP(A) CONTAINS TRACK TO START FROM
5952 PUSHJ P,QGTK4 ; RETURNS TRACK IN D
5954 SWODF5: MOVSI A,(SETZ)
5957 HRLM D,1(A) ;STORE DISK ADDRESS IN MMP ENTRY
5961 SWODF7: AOBJN B,SWODF6 ;TRY NEXT DSK FOR SWAPPING AREA
5962 CONO PI,UTCON-1 ;NON FOUND FIND FILE SPACE
5966 SWODF2: SKIPL QTUTO(E) ;FIND WHICH DISK HAS MOST FREE SPACE
5973 SWODF4: AOBJN E,SWODF2
5974 JUMPL I,CPOPJ ;NO DSK SPACE AVAIL
5975 HRRZM I,SWODSK ;LAST DSK HACKED
5976 JUMPLE D,CPOPJ ; NO ROOM ANYWHERE
5979 JRST UTCNJ ;TUT LOCKED
5983 MOVEI D,NBLKS/2 ;STARTING POINT
5984 MOVEI A,NQCHN+1(I) ;DISK CHANNEL
5986 PUSHJ P,QGTK4 ;RETURNS TRACK IN D
5988 MOVEM E,QMFTP(A);DON'T LEAVE SWAPPING CHNL POINTING INTO FILE SPACE
5992 SCRPSJ: SETOM CIRPSW
5999 ;COME HERE FROM SWPOPG AND MMPRTN TO SWAP OUT A PAGE.
6000 ;CLOCK OFF OR IN PROGRESS AND ARGUMENTS IN SWOBK AND SWOMMP.
6001 ;PUTS BLOCK ON SWAPOUT LIST IF DISK COPY NEEDS TO BE UPDATED, ELSE
6002 ;JUST DELETES MEMORY. IF NO USERS ARE USING THE PAGE,
6003 ;RETURNS THE MMP ENTRY OR ARRANGES FOR THE DISK ROUTINES TO.
6005 SWOP1A: CONO PI,UTCOFF-1 ;DON'T CHANGE STATE OF CLOCK CHNL.
6006 MOVE A,SWOBK ;CORE BLOCK # CONTAINING PAGE TO BE SWAPPED OUT
6007 HLRZ C,MMSWP(A) ;NUMBER OF EXEC PAGES POINTING TO THIS PAGE
6008 JUMPN C,SWOP5 ;POINTED TO BY EXEC PAGE, CAN'T SWAP OUT
6011 SWOPT2: LDB I,DPEP(C)
6014 ANDI I,PMRCM ;MASK TO REAL CORE PAGE #
6016 BUG ;DISPLAY STILL SET UP TO PAGE BEING SWAPPED OUT
6017 SWOPT1: AOBJN C,SWOPT2
6022 IORM C,MEMBLT(A) ;PREVENT NEW EXEC PAGES FROM BEING SET UP POINTING HERE
6024 MOVE C,[2200,,MEMPNT]
6026 SETOB B,SPGNMF ;INITIALIZE PAGE NOT MODIFIED FLAG, AND COUNT USERS IN B
6031 MOVSI D,-1 ;COMPUTE WORKING SET CONTRIBUTION TO BE TAKEN AWAY
6032 IDIV D,MMSWP(A) ;LH(MMSWP) KNOWN TO BE ZERO!
6033 PUSHJ P,UCPRL ;CHECK ALL USERS, TAKE PAGE AWAY FROM SOME
6034 400000,,SWOP6 ;ALSO COUNTS USERS IN B
6036 AOJE B,SWOP7 ;JUMP IF NO USERS USING PAGE, RETURN MMP ENTRY
6037 CAMN B,NUPTAW ;ANY USERS STILL MAPPED TO PAGE?
6038 JRST SWOP8 ;NO, GO SWAP IT OUT
6039 MOVSI D,1 ;YES, COMPUTE WORKING SET ADJUSTMENT
6040 IDIV D,MMSWP(A) ;TO BE ADDED BACK IN TO THEM
6041 PUSHJ P,UCPRL ;GO BACK AND FIX WORKING SETS
6043 JRST SWOP6E ;ABORT SWAP OUT
6047 PUSH P,I ;NOTE: CAN BACK OUT OF THIS PUSH AT SWOP2B
6049 400000,,SWOP2 ;RETURN ON USERS (CAN BACK OUT AT SWOP2B)
6053 SWOP7: MOVSI B,MMPGON ;NO USERS USING PAGE, SO MMP ENTRY WILL BE RETURNED
6054 IORM B,@SWOMMP ;FLAG THAT MMP ENTRY WILL SOON GO AWAY
6055 MOVEI A,0 ;REMOVE FROM LOOSE PAGE LIST
6057 SWOP7A: MOVE B,A ;B PREDECESSOR
6058 SKIPN A,T ;T SUCCESSOR
6060 LDB T,[MLO,,MEMBLT(A)]
6063 SKIPE B ;FOUND, PATCH OUT OF LIST
6064 DPB T,[MLO,,MEMBLT(B)]
6071 BUG ;NLOOSP TOO LOW.
6075 ;THIS UCPRL ROUTINE SCANS ALL USERS, COUNTS THEM IN B,
6076 ;USES D TO ADJUST WORKING SETS OF USERS WHICH ARE MAPPED TO
6077 ;THE PAGE, AND TAKES THE PAGE AWAY FROM ANY USERS IT CAN,
6078 ;COUNTING THEM IN NUPTAW.
6079 SWOP6: AOS B ;COUNT USERS OF THIS PAGE
6081 BUG ;SYS JOB OR CORE JOB?
6083 MOVEI C,UPGMP(U) ;MAKE C POINT TO UPGMP ENTRY (PTW)
6093 ADDM D,UWRKST(U) ;IS MAPPED TO PAGE, ADJUST WORKING SET
6095 JRST SWOP6A ;DON'T CONSIDER PCLSRING SWPOPU
6099 SKIPN LSWPR(U) ;PCLSR IF HAS SWITCHES LOCKED
6102 MOVSI T,%SWPCL ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6109 PUSHJ P,PCLSR ;BETTER NOT CLOBBER U OR H OR A
6116 ;WHEN WE GET HERE, THIS JOB CAN'T HOLD THIS PAGE IN
6117 SWOP6A: TRNN I,600000
6118 JRST SWOP6C ;NOT SET UP SINCE PREV SWAPPED OUT
6119 AOS NUPTAW ;TAKE IT AWAY
6120 LSH I,-16. ;SAVE ACCESS MODE IN LOW ADR BITS
6121 CAILE I,2 ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6122 CLEARM SPGNMF ;PAGE HAS BEEN MODIFIED
6123 CAIN I,2 ;FLUSH R.W.F.
6125 DPB I,C ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6126 AOS NSWPGS(U) ;INCR COUNT OF SWAPPED OUT PGS OF USER
6127 AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS
6128 SOS MMSWP(A) ;DECR COUNT OF PAGE SHARERS
6130 CAMN U,DISUSR ;IF USER OF E&S
6131 PUSHJ P,E.SLPM ;LOAD ITS MAP
6136 SWOP6F: CAMN U,-4(P) ;DON'T LOOK AT USER TAKING PAGE AWAY FROM
6137 POPJ P, ;ELSE DROP INTO SWOP6B
6138 ;THIS UCPRL ROUTINE ADJUSTS WORKING SETS OF JOBS THAT
6139 ;ARE MAPPED TO THE PAGE USING D.
6141 MOVEI C,UPGMP(U) ;MAKE C POINT TO UPGMP ENTRY (PTW)
6151 ADDM D,UWRKST(U) ;IS MAPPED TO PAGE, ADJUST WORKING SET
6157 ;COME HERE VIA UCPRL FOR ALL USERS OF PAGE BEING SWAPPED OUT
6159 SWOP2: AOS B ;COUNT USERS OF THIS PAGE
6161 BUG ;SYS JOB OR CORE JOB?
6168 SKIPN LSWPR(U) ;PCLSR IF HAS SWITCHES LOCKED
6171 MOVSI T,%SWPCL ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6175 SWOP2D: PUSHJ P,PCLSR
6177 SWOP2A: MOVEI C,UPGMP(U)
6187 JRST SWOP2C ;NOT SET UP SINCE PREV SWAPPED OUT
6188 LSH I,-16. ;SAVE ACCESS MODE IN LOW ADR BITS
6189 CAILE I,2 ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6190 CLEARM SPGNMF ;PAGE HAS BEEN MODIFIED
6191 CAIN I,2 ;FLUSH R.W.F.
6193 DPB I,C ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6194 AOS NSWPGS(U) ;INCR COUNT OF SWAPPED OUT PGS OF USER
6195 AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS
6197 SOS MMSWP(I) ;KEEP ACCURATE COUNT OF UPGMP'S POINTING AT THIS PAGE
6199 CAMN U,DISUSR ;IF USER OF E&S
6200 PUSHJ P,E.SLPM ;LOAD ITS MAP
6205 SWOP2B: SUB P,[6,,6] ;2 PUSHES OF I AND 4 FOR UCPRL
6207 SWOP6E: MOVE A,SWOBK ;ABORT SWAP-OUT
6213 SWOP8: DPB I,C ;DELINK MEMPNT
6214 MOVEI I,3 .SEE MMPOUT .SEE MMPTMP
6215 DPB I,[410200,,@SWOMMP] ;INDICATE ON THE WAY OUT
6223 TLNN C,MMPGON ;UNLESS PAGE WILL BE FORGOTTEN AFTER SWAP OUT,
6224 AOS NPGSWO ; KEEP COUNT OF PAGES CURRENTLY SWAPPED OUT
6225 TLNE C,MMPWRT ;IF WAS WRITTEN BY USER WHO LATER DELETED IT,
6227 SKIPGE SPGNMF ;OR IF PAGE MODIFIED,
6229 JRST SWOP3 ;OR IF HASN'T BEEN WRITTEN TO DISK, MUST WRITE OUT.
6230 MOVEI I,2 ;NO NEED TO WRITE OUT. INDICATE OUT.
6231 DPB I,[410200,,@SWOMMP]
6232 PUSHJ P,IMEMR ;RETURN THE MEMORY
6235 PUSHJ P,RETMMP ;ALSO RETURN THE MMP ENTRY IF NECESSARY
6239 UTCNJ: CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL
6242 SWOP3: CAIGE A,TSYSM ;HAVE TO WRITE THIS PAGE OUT
6248 BUG ;DISK NUMBER NOT LEGITIMATE
6250 ANDCAM C,MEMBLT(A) ;SET END OF LIST IN THIS BLOCK
6251 HLRZ C,SOUTLS(I) ;GET PREV BLOCK
6253 DPB A,[MLO,,MEMBLT(C)] ;CHAIN TO PREV BLOCK
6255 MOVEM A,SOUTLS(I) ;OR TO HEADER IF FIRST
6256 HRLM A,SOUTLS(I) ;AND SET NEW LAST BLOCK
6259 HRLM C,MEMPNT(A) ;STORE DISK ADDRESS
6261 DPB B,[MUR,,MEMBLT(A)]
6264 UTCNJ1: CONO PI,UTCON-1
6268 SWPPIN: MOVSI Q,-NSWPV ;# OF DEVICES THAT CAN SWAP IN PAGES
6269 SWPPI4: SKIPGE W,SWIRQB(Q) ;USER INDEX
6271 MOVE E,SWIVPN(Q) ;VIRTUAL PAGE NUMBER
6278 SWPPI6: AOBJN Q,SWPPI4
6284 TRNN Q,-1 ; IS DEVICE DIS? (E&S IS INDEX 0 IN SWIRQB)
6285 SETZM E.SPGW ; IF SO, CLEAR PAGE WAIT.
6293 SUBTTL LOAD USER PAGE MAP
6295 OVHMTR UUO ;RANDOM UUOS (WELL, SOME MINOR SCHED STUFF, TOO)
6297 ;SET PAGE MAP AT M.P. LEVEL, ASSUMING UMAPS HAS BEEN ALTERED.
6298 ;UMAPS EXISTS SO SCHEDULER CAN RESTORE THE MAP AFTER OTHER JOBS RUN.
6299 ;FORMAT OF A MAP SPECIFICATION IS:
6301 %UMMPL==200000 ;1 => MAP LOWER HALF TO SPEC'D JOB'S; 0 => USE LOWER OF JOB IN U.
6302 %UMMPU==100000 ;1 => MAP UPPER HALF TO SPEC'D JOB'S; 0 => USE UPPER OF JOB IN U.
6303 %UMALL==300000 ;SET => SELECT WHOLE MAP OF SPEC'D JOB.
6304 %UMUTL==40000 ;IGNORED IF %UMMPU=0. IF %UMMPU=1, MEANS USE SPEC'D JOB'S LOWER
6305 ;INSTEAD OF ITS UPPER, AS OUR UPPER HALF. READ "%UM UPPER-TO-LOWER".
6306 %UMLTU==20000 ;"%UM-LOWER-TO-UPPER". WITH %UMMPL, MAKES LOWER -> SPEC'D JOB'S UPPER.
6307 %UMSOA==4000 ;1 => USE AC0S AS THE USER'S ACS, INSTEAD OF UUOACS.
6308 ;NOTE IF %UMLTU=1, OR IF LOWER -> PDP6, THE GARBAGS ACS ARE USED.
6309 ;ELSE, THE ACS COME FROM THE JOB WHICH OUR LOWER HALF COMES FROM.
6310 ;RH ;JOB INDEX OF THE "SPECIFIED JOB". -1 => PDP6.
6311 ;NOT NEEDED IF %UMMPL=%UMMPU=0.
6313 PGLDU: MOVE R,UMAPS(U)
6314 ;SET PAGE MAP AT INT. LEVEL, NOT CLOBBERING JOB'S UMAPS. ARG IN R.
6315 PGLD: MOVEM R,LUMPS ;LAST UMAPS ACTUALLY USED
6316 AOS NPGLD ;COUNT # CALLS TO PGLD
6317 PUSH P,A ;R HAS UMAPS CODE
6321 IFN KA10P, MOVSI B,NUVPG/2 ;SET UP NORMAL DBL, MIGHT BE CHANGED IF PDP6
6322 IFE KA10P, MOVSI B,0 ;ONLY KA10 HAS DBL
6324 JRST PGLD3A ;USE NORMAL LOW SEG
6327 JRST PGLD3B ;USE PNTR TO PDP6
6330 TLNE R,%UMLTU ;SKIP ON USE HIS LOWER
6331 JRST PGLD3D ;USE HIS UPPER
6332 PGLD3A: HRRI B,UDBR1A(C)
6334 JRST PGLD3G ;MAKE AC'S POINT AT SWAP OUT AC'S
6336 PGLD3F: MOVEM B,UPDBR1(U)
6337 IFN KA10P, DPB A,[2300,,UPACP(U)] ;STORE AC PNTR
6339 CAMN A,AC1PTR ;IF CHANGING AC BLOCK 1
6341 EXCH A,AC1PTR ;STORE OLD BLOCK 1
6343 XCTR XBR,[BLT B,17(A)]
6344 MOVS A,AC1PTR ;AND LOAD NEW BLOCK 1
6346 PGLD3H: ] ;IFE KA10P
6347 IFN KA10P, MOVSI B,NUVPG/2 ;SET UP DBL FOR DBR2
6348 IFE KA10P, MOVSI B,0
6351 JRST PGLD6 ;USE NORMAL UPPER SEG
6359 PGLD6: MOVEM B,UPDBR2(U)
6360 PGLDR1: LPMR UPGML(U)
6366 IFN PDP6P, PGLD3B: SKIPA B,PDP6MP
6367 PGLD3D: HRRI B,UDBR2A(R)
6371 PGLD3G: MOVEI A,AC0S(C)
6374 GACS: BLOCK 20 ;GARBAGE AC'S POINTED TO BY ACPNTR WHEN ITS REALLY POINTING
6375 ;AT UPPER PAGES OR PDP6 SHOULD HOPEFULLY NEVER GET REFERENCED
6377 ;MAIN PROGRAM MAP-SETTING ROUTINES.
6379 MP6LD: SKIPA J,[%UMMPU,,-1] ;LOAD UPPER DBR TO PNT TO 6
6381 MPLDZ: MOVEI J,0 ;SET NORMAL MAP - OUR OWN CORE.
6382 MPLD1: CAMN J,UMAPS(U) ;SET UMAPS AS SPEC'D
6385 MPLD: CONO PI,CLKOFF
6389 ;SET MAP TO JOB # IN J; MIGHT OR MIGHT NOT BE THE CURRENT JOB. SAVES RH(J)
6391 TLOA J,%UMSOA+%UMALL ;OTHER JOB'S ACS ARE IN ITS AC0S.
6392 TLO J,%UMALL ;THIS JOB => WANT UUOACS.
6395 ;SIMILAR ROUTINES, BUT FOR USE WHEN CLKCHN IS OFF AND SHOULD STAY OFF.
6397 PLD6: SKIPA J,[%UMMPU,,-1] ;MAKE UPPER DBR POINT TO PDP6.
6399 PLDZ: MOVEI J,0 ;NORMAL MAP
6400 PLD1: MOVEM J,UMAPS(U)
6401 PLD: SPM UPGML(U) ;IF ANY INHIBITED FAULT PRESENT, CAUSE IT TO GET STORED AWAY
6403 PUSHJ P,PGLDU ;CAUSE ACTUAL PG LOAD TO HAPPEN
6407 SUBTTL GIVING THE USER INTERRUPTS
6409 SEAR2E: MOVE A,PIRQC(U)
6411 ;ROUTINE TO HANDLE FIRST WORD (PIRQC) INTS
6412 SEAR2A: JUMPL A,SEAR2B ;REQUEST TO PCLSR
6414 JRST SEAR2C ;PI IN PROG, ONLY LOOK FOR FATAL INTS.
6416 AND Q,MSKST(U) ;ENABLED UNDEFERRED INTS.
6417 TDNN A,Q ;ANY OF THOSE PENDING,
6418 TDNE A,[BADBTS] ;OR ANY CLASS 1 OR 2 => INTERRUPT.
6421 ANDCA Q,A ;GET DISABLED OR DEFERRED PENDING INTS.
6422 TDNN Q,[BADBTS] ;ANY CLASS 1 OR 2 DISABLED OR DEFERRED
6423 JRST INTWD1 ;NO, INT. THIS JOB.
6424 JRST SEAR2D ;YES, INT. SUPERIOR.
6426 SEAR2C: TDNN A,[BADBTS] ;PI IN PROG: ANY CLASS 1 OR 2 ?
6427 JRST SEARL2 ;NO, NOTHING TO DO.
6428 SEAR2D: PUSHJ P,PCLSR ;INT. THE SUPERIOR: PCLSR FIRST.
6429 JRST SEARC ;CAN'T STOP THIS JOB IN EXEC MODE.
6430 SETZ B, ;OK, HANDLE FATAL 1ST WORD INTS IN A, AND NO 2ND WORD INTS.
6432 ;HANDLE A FATAL INTERRUPT BY INTERRUPTING THE SUPERIOR.
6433 ;FATAL 1ST WORD INTERRUPTS IN A, FATAL 2ND WORD INTS IN B.
6434 INTSUP: MOVEM A,SRN4(U) ;.FTL1
6435 MOVEM B,SRN5(U) ;.FTL2 ;PUT THE FATAL INTERRUPTS WHERE SUPERIOR CAN READ THEM.
6437 IORM T,USTP(U) ;STOP INFERIOR
6438 IFN SWPWSP, PUSHJ P,LVLOAD
6439 MOVSI T,BULGOS ;IF LOST TRYING TO LOG OUT, ABORT LOGOUT
6441 MOVE Q,U ;SAVE USER INTERRUPTING
6442 SKIPGE U,SUPPRO(U) ;SKIP UNLESS TOP LEVEL
6443 JRST INTTOP ;REALLY TOP LEVEL
6444 HLLZ T,U ;GET INT BIT
6445 IORM T,IFPIR(U) ;TURN ON INTERRUPT BIT IN SUPERIOR
6446 HRRZS U ;CLEAR LEFT HALF OF U
6447 CAIL J,(U) ;SKIP IF SUPERIOR HAS NOT YET BEEN SCHEDULED
6448 JRST SEARL1 ;RESCHEDULE SUPERIOR
6449 JRST SEARL ;HAVEN'T GOT TO HIM YET SO CONTINUE
6451 INTTOP: MOVEI T,SCRDET
6452 SKIPL APRC(Q) ;IF JOB ISN'T ALREADY DISOWNED
6453 IORM T,SUPCOR ;SAY SOMEONE WANTS TO BE DETACHED.
6454 JRST SEARL ;LEAVE STOPPED, SYS JOB WILL DETACH SOMEDAY.
6456 SEAR2B: PUSHJ P,PCLSR ;PCLSR THE JOB, E.G. SO IT CAN GET AN IOC ERROR
6457 JRST SEARC ;RUNNING IN EXEC MODE, GO RUN IT
6458 MOVSI A,(SETZ) ;CLEAR REQUEST
6460 JRST SEARL1 ;INSPECT THIS JOB AGAIN
6462 ;IFPIR IS NONZERO BUT PIRQC IS ZERO.
6463 INTWD2: SKIPN PICLR(U)
6464 JRST SEARL3 ;IGNORE 2ND WD INTS IF PI IN PROG.
6466 ANDCM B,IDF2(U) ;GET ENABLED UNDEFERRED INTS.
6467 JUMPE B,SEARL3 ;ALL DISABLED OR DEFERRED.
6468 JSP T,INTPAG ;MAKE SURE NOT WAITING FOR PAGE NEEDED FOR INT.
6469 PUSHJ P,PCLSR ;DON'T INT. EXCEPT IN USER MODE.
6471 SETZ A, ;1ST WD INTS TO GIVE = 0.
6472 JRST INTSRC ;2ND WD INTS TO GIVE ALREADY IN B.
6474 ;PIRQC WAS NONZERO BUT NO FATAL INTS.
6475 INTWD1: JSP T,INTPAG ;IF TRIED BEFORE & WENT TO INTPFL, WAIT FOR PAGE.
6476 PUSHJ P,PCLSR ;CAN INT. ONLY IN USER MODE.
6479 AND B,MSKST2(U) ;GET PENDING ENABLED UNDEFERRED 2ND WD INTS IN B.
6482 ANDCM A,IDF1(U) ;PENDING ENABLED UNDEFERRED 1ST WD INTS IN A.
6483 INTSRC: AOS NAUINT ;ELSE 1 MORE ATTEMPT TO INTERRUPT.
6484 MOVSI R,%UMSOA ;LOAD ORDINARY MAP FOR THIS USER.
6485 PUSHJ P,PGLD ;BUT ACS -> SWAP OUT ACS.
6486 HRRZ T,40ADDR(U) ;GET ADDR OF USER'S LOCATION "40"
6487 XCTRI XR,[MOVE T,2(T)] ;TRY TO GET CONTENTS OF "42" (..I SO STOP ON EXEC PG FAULT DOESNT)
6489 JRST INTPFL ;PAGE FAULT IN XCTR, GIVE UP & WAIT FOR PAGE.
6491 JUMPE R,INTBAD ;42 POINTS TO 0 => BADPI ERROR.
6493 TLNN TT,%OPINT ;NEW STYLE INTERRUPTS?
6494 JRST INTOLD ;NO, OLD STYLE.
6495 XCTRI XR,[MOVE R,(R)] ;GET ADDR OF HIS INT PDL PTR.
6499 CAMGE T,[-72.*5-1,,]
6501 XCTRI XR,[MOVE H,(R)] ;GET CONTENTS OF INT PDL PTR.
6502 JRST INTSR2 ;ADVANCE T PAST INT PDL PTR ADDR.
6505 INTSR0: XCTRI XR,[MOVE C,(T)] ;GET THE INTS NEXT INT TABLE ENTRY
6507 JRST INTPFL ;APPLIES TO.
6508 XCTRI XR,[AND D,1(T)]
6511 AND C,A ;WHICH OF THEM ARE WE TRYING TO GIVE?
6513 JUMPE D,INTSR1 ;NOT GIVING ANY OF THEM, TRY NEXT ENTRY.
6514 MOVE Q,IDF1(U) ;GET CURRENT SETTINGS OF DEFER WORDS.
6515 XCTRI XW,[MOVEM Q,3(H)]
6516 SKIPA Q,IDF2(U) ;AND PUT INTO NEXT INT PDL FRAME.
6518 XCTRI XW,[MOVEM Q,4(H)]
6519 SKIPA Q,UPC(U) ;ALSO PUT CURRENT PC IN FRAME.
6521 XCTRI XW,[MOVEM Q,5(H)]
6524 XCTRI XR,[MOVE E,2(T)] ;NOW SEE WHICH DEFER BITS TO TURN ON NOW.
6527 XCTRI XR,[MOVE TT,3(T)]
6530 XCTRI XR,[MOVE Q,4(T)] ;AND THE NEW PC.
6535 TLO Q,%PCUIO ;DON'T CHANGE HIS IOTLSR STATUS.
6536 XCTRI XW,[MOVEM C,1(H)]
6537 CAIA ;PUT INTS BEING GIVEN IN
6538 JRST INTPFL ;INT. PDL FRAME.
6539 XCTRI XW,[MOVEM D,2(H)]
6542 MOVE W,H ;REMEMBER PDL PTR BEFORE INCREMENT, FOR PDL OV TESTING
6544 LDB J,[220500,,R] ;HOW MANY ACS SHOULD WE SAVE?
6545 JUMPE J,INTSR5 ;NONE?
6547 ADD H,J ;ADVANCE THE PDL PTR OVER WHERE THEY'LL GO.
6548 SUBM H,J ;GET BACK THE OLD UN-ADVANCED PDL PTR IN J.
6550 HRLI J,(R) ;PUT 3.7-4.1 OF R INTO LH(J) CIRCUITOUSLY
6553 AOS J ;MAKE J POINT AT 1ST UNUSED PDL WORD.
6554 XCTRI XBRW,[BLT J,(H)]
6557 INTSR5: JUMPGE R,INTSR4 ;SAVE DEBUGGING INFO ON INT PDL IF USER WISHES
6559 XCTRI XW,[MOVEM J,1(H)]
6562 XCTRI XW,[MOVEM J,2(H)]
6565 XCTRI XW,[MOVEM J,3(H)]
6569 INTSR4: MOVE J,U ;MAYBE? SCHED LOOP WANTS USER IDX IN J?
6570 XCTRI XW,[MOVEM H,(R)] ;STORE BACK THE PDL POINTER, THUS FINALIZING ALL
6571 TDZA A,C ;INTS HAVE BEEN GIVEN; NOW WE CAN CHANGE THE USER VARS.
6575 IORM E,IDF1(U) ;SET THE DEFER BITS SPEC'D IN TABLE ENTRY.
6577 MOVEM Q,UPC(U) ;START USER AT INT HANDLER.
6578 JUMPL H,INTSR3 ;NOW CHECK FOR INT PDL OVFLO.
6580 MOVEI TT,%PIPDL ;THERE WAS OVFLO, SET PDL OV INT
6581 TDNN TT,MSKST(U) ;IF ENABLED.
6584 JRST SEAR2E ;RE-TRY THE INTERRUPT.
6586 INTSR3: JUMPN A,SEAR2E ;MORE INTS TO GIVE => RETRY.
6588 INTSRX: AOS NUINT ;1 MORE INT GIVEN SUCESSFULLY.
6590 JRST SEARC ;SCHEDULE.
6592 INTSR1: ADD T,[4,,4] ;NO INTS GIVEN, TRY NEXT ENTRY.
6593 INTSR2: AOBJN T,INTSR0
6594 JRST INTSUP ;ENABLED INTS BUT NO ENTRIES FOR THEM.
6596 ;GIVE INTS THE OLD WAY.
6597 INTOLD: SKIPN C,A ;GIVE INTS OF 1 WD AT A TIME.
6598 SKIPA C,B ;(NO 1ST WD, GIVE ALL 2ND WD)
6599 TDZA B,B ;(SOME 1ST WD INTS, GIVE NO 2ND WD INTS)
6600 TLO C,4^5 ;(GIVING 2ND WD, SET SIGN TO SAY SO)
6601 XCTRI XW,[MOVEM C,(T)]
6602 SKIPA Q,UPC(U) ;STORE INTS BEING GIVEN,
6604 MOVEI T,2(T) ;ADVANCE -> PLACE TO START USER.
6605 XCTRI XW,[MOVEM Q,-1(T)]
6606 TLOA T,%PCUSR ;OLD PC STORED, SET UP NEW.
6608 ANDCAM A,PIRQC(U) ;SAY THESE INTS NOW GIVEN.
6612 MOVEM T,UPC(U) ;SET HIS PC -> TSINT+2
6616 ;IF WE ARE WAITING FOR A PAGE NEEDED FOR TAKING AN INTERRUPT,
6617 ;GIVE UP ON TRYING TO TAKE TE INT. UNLESS PAGE HAS COME IN SINCE LAST TRY.
6618 INTPAG: MOVSI E,%SWPGW
6621 JRST (T) ;JOB NOT WAITING FOR PAGE
6624 JRST (T) ;NOT WAITING FOR INTERRUPT PAGE
6628 JRST SEARL ;PAGE NOT IN
6629 MOVSI T,%SWPGW+%SWINT ;PAGE IN
6635 ;COME HERE WHEN AN XCTRI TAKES FAULT WHILE TRYING TO STORE AN INTERRUPT.
6636 INTPFL: MOVE J,U ;MAYBE? SCHED MAIN LOOP WANTS USR IDX IN J.
6637 SPM UPGML(U) ;STORE MAP IN INTERRUPTING STATE
6638 IFN KA10P, LDB T,[221000,,UPJPC(U)] ;FAULT ADDRESS
6639 IFN KL10P, LDB T,[$PFPNO,,UPFW(U)]
6640 IFN KS10P, LDB T,[$PFPNO,,EPTP7W] ; Fault happened at PI level 7.
6647 JUMPE E,INTBAD ;DON'T HAVE PAGE
6651 JRST INTBAB ;WRITE IN RD ONLY
6652 INTBAC: HLLZ T,UPC(U) ;SIMULATE SETUP OF OPC
6655 MOVEM T,UPOPC(U) ;FAULT STATUS
6657 IORM T,UPQUAN(U) ;BIT NOT SET BY XCTRI
6659 IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATT
6660 LPMRI UPGML(U) ;SET MPV FLAG, WILL CAUSE INT. LATER LPMR'S WON'T
6662 JRST SCHED6 ;"RUN" USER, TAKING PAGE FAULT IMMEDIATELY
6664 INTBAB: TLNE T,50 ;NO ACCESS OR W IN RWF
6665 JRST INTBAC ;PAGING BOX BUG? IGNORE RD ONLY
6666 JRST INTBAD ;REALLY IS READ-ONLY.
6678 JRST INTBAD ;REAL VIOLATION
6681 ;KL10P ;PF OR RWF, TAKE THE FAULT, READ IN THE PAGE, THEN TRY TO INTERRUPT AGAIN
6683 INTBAB: MOVSI T,%SWINT
6684 IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATTEMPT
6685 SETOM DLSRCH ;DON'T INTERRUPT AT INTBA1, SCHEDULE, TRY TO PCLSR
6688 EXCH T,UPC(U) ;HACK USER'S PC
6690 JRST SCHED6 ;RUN USER, RETURNING IMMEDIATELY TO INTBA1
6692 INTBA1: CONO PI,PIOFF
6694 MOVEM U,PFAILU ;SIMULATE A PAGE FAULT ON THE INTERRUPT WORD
6697 MOVEM U,PFOPC1 ;RESTORE USER'S PC
6699 MOVEM U,PFAILF ;FLAG FAULT FROM INTPFL
6700 MOVE U,PFAILU ;RESTORE U SO CLKSAV CAN RE-SAVE IT
6701 CONO PI,CLKRQ ;TURN PI SYSTEM ON AND CAUSE CLOCK BREAK
6702 JRST . ;TAKES A WHILE TO GO OFF
6706 TLNE T,%PF2.8 ; Write in read only?
6707 JRST INTBAD ; Yes: %PIB42
6708 MOVEM T,UPFW(U) ; No: Set up for a simulated fault
6710 IORM T,USWST(U) ; Signal fault as result of interrupt attempt
6711 SETOM PFAILF ; Cause CLK level to go to PFLU2 at
6712 ; first opportunity.
6713 MOVEI T,CCLKRQ ; Make sure that happens real fast
6714 EXCH T,UPC(U) ; by setting his PC thusly.
6715 MOVEM T,EPTPFO ; Save old PC as location of fault.
6716 JRST SCHED6 ; Go run this user.
6719 INTBAD: MOVEI A,%PIB42 ;TURN ON BAD PI LOC INT BIT
6720 IORB A,PIRQC(U) ;GIVE USER INTERRUPT(MUST IORM TO AVOID TIMING ERR)
6721 JRST SEAR2A ;RE-PERFORM ACTIONS FOR NON-ZERO PIRQC
6722 ;WILL CAUSE AN INTERRUPT TO SUPERIOR
6724 ;INTERRUPT ALL USERS THAT WANT IT
6725 ; C(A) IS BIT IN PIRQC TO TURN ON
6726 DBGINT: MOVSI A,(%PIDBG) ;"SYS BEING DEBUGGED" INT
6727 INTALL: MOVEI U,0 ;ENTRY INITIALIZE
6728 INTA2: ADDI U,LUBLK ;ADVANCE TO NEXT BLOCK OF USER VARIABLES
6729 CAML U,USRHI ;SKIP UNLESS AT END
6730 POPJ P, ;THROUGH, RETURN
6731 SKIPN UNAME(U) ;SKIP IF BLOCK IN USE
6732 JRST INTA2 ;IDLE, IGNORE
6733 LDB T,[410100,,USTP(U)] ;GET BUCSTP OF USERS STOP WORD
6734 JUMPN T,INTA2 ;IF USER CONTROL STOPPED, JUMP TO IGNORE
6735 MOVE B,MSKST(U) ;PICK UP INTERRUPT MASK
6736 AND B,A ;MASK C(B) TO APPROPRIATE BIT
6737 IORM B,PIRQC(U) ;GIVE INT TO USER
6740 SUBTTL PCLSR ROUTINES
6742 ; PUT PC OF USER WHOSE INDEX IS IN U IN USER MODE
6743 ; (CALL ONLY WITH CLOCK OFF OR CLOCK BREAK IN PROGRESS)
6744 ;SKIPS IF SUCCESSFUL, FAILS IF USER RUNNING IN EXEC CODE OR HAS TO BE FINALIZED
6748 BUG ;PCLSR'ING NULL, SYS OR CORE JOB?
6752 CAMN T,U ;IS U REALLY A MULTIPLE OF LUBLK?
6753 SKIPN UNAME(U) ;SHOULD NOT HAPPEN TO NONEXTANT JOB
6756 JRST POPJ1 ;USER STOPPED (MUST ALREADY BE IN USER MODE)
6759 JRST PCLSR2 ;LOSER IS RPCLSR'ING SOMEONE
6760 PCLSR3: MOVE T,SUEXIT(U)
6762 CAME T,[JRST 2,@XUUOH]
6763 JRST PCLSR5 ;EXIT ALREADY CLOBBERED
6764 MOVE T,UPC(U) ;PICK UP PROGRAM COUNTER (FLAGS IN L.H.)
6765 TLNN T,%PCUSR ;SKIP IF USER MODE ON
6766 JRST PCLSR8 ;JOB CURRENTLY IN EXEC MODE
6767 SOS NEPCLS ;WAS WRONGLY AOS'ED
6768 CLEARM FLSINS(U) ;IN CASE HE WAS WAITING FOR A PAGE OR CIRPSW
6772 MOVSI T,%SWPGW+%SWRUN+%SWINT
6777 PCLSR8: SKIPE FLSINS(U) ;SKIP IF UNBLOCKED
6778 JRST PCLSR1 ;HUNG, TRY TO BACK UP TO UUO
6779 PCLSR4: MOVE T,[JRST ONEFLS]
6780 MOVEM T,SUEXIT(U) ;MUNG EXIT OF UUO, COME BACK LATER
6784 PCLSR2: SETZM RPCL(U) ;CLEAR OUT POINTERS IN BOTH DIRECTIONS
6788 PCLSR5: SKIPN FLSINS(U)
6789 JRST PCLSRF ;NOT HUNG, LET RUN TO COMPLETION
6790 IFN KA10P,[ ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6791 CAME T,[JRST ONEPROC] ;SKIP IF ONE PROCEEDING A SYS CALL
6794 IORM T,SUUOH(U) ;RESET SINGLE INSTRUCTION PROCEED
6796 IFN KS10P,[ ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6797 CAME T,[JRST ONEPR4] ;SKIP IF ONE PROCEEDING A SYS CALL
6800 IORM T,XUUOH(U) ;RESET SINGLE INSTRUCTION PROCEED
6805 IFN KA10P, MOVE T,[JRST 2,@UUOH]
6810 MOVEM T,SUEXIT(U) ;UNCLOBBER EXIT
6811 PCLSR1: HLRZ T,LSPCL(U) ;SAVE LAST TWO DISTINCT LOCS PCLSR'ED FROM
6816 PCLSR9: SOS T,SUUOH(U) ;GET USER LOCATION OF HIS CURRENT UUO
6820 TLCN T,%PS1PR-%PSINH
6821 TLO T,%PSINH ;ONE PROCEEDING AND INSTR NOT COMPLETE
6823 MOVEM T,UPC(U) ;SET USERS PROGRAM COUNTER
6825 MOVSI T,701100 ;RESTORE PAGE-CONTEXT TO USER MODE
6828 CLEARM UMAPS(U) ;RESTORE TO NORMAL MAP
6829 SETZM FLSINS(U) ;CLEAR OUT ANY BLOCKING CONDITION
6833 MOVSI T,%SWPGW+%SWRUN+%SWPCL+%SWINT ;NOT BLOCKED ON PAGE, NOT UNBLOCKED SWAPOUT,
6834 ANDCAM T,USWST(U) ; NOT INTERRUPT PAGE, NOT SWAPPED OUT WHILE BLOCKED
6836 JRST LSWZAP ;REQUIRED TO UNLOCK SWITCHES
6839 MOVEI T,UUOACS(U) ;IF JOB U'S ACS ARE IN HARDWARE AC BLOCK 1,
6840 CAMN T,AC1PTR ;COPY THEM INTO UUOACS WHERE THEY BELONG.
6841 XCTR XBR,[BLT T,UUOACS+17(U)]
6846 JRST POPJ1 ;EXIT AFTER BACKING UP TO UUO
6848 ; AOS USTP OF USER IN A
6850 NJRPCL: CAIE A,-1 ;ENTRY TO IGNORE IF NULL JOB
6851 RPCLSR: CAMN A,USER ;NORMAL ENTRY
6852 POPJ P, ;TRYING TO RPCLSR SELF OR NULL JOB
6855 MOVE U,A ;GET INDEX OF RPCLSRED JOB IN U
6856 MOVE A,USER ;GET RPCLSRING USER INDEX IN A
6857 CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
6858 PUSHJ P,PCLSR ;PUT USER IN USER MODE
6859 JRST RPCLOS ;JUMP IF CAN'T DO IT RIGHT NOW
6860 AOS USTP(U) ;WIN,STOP USER
6861 CONO PI,CLKON ;RE-ENABLE CLOCK BREAKS
6862 RPCLS1: MOVE A,U ;RESTORE A
6866 RPCLOS: SKIPE RPCL(U) ;SKIP IF ZERO RPCL FOR USER BEING RPCLSRED
6867 JRST RPCLS2 ;SOMEONE GOT THERE FIRST
6868 SKIPE RPCL(A) ;SKIP IF ZERO RPCL FOR RPCSRING USER
6869 JRST UDELAY ;YOU ARE BEING RPCLSR'ED, SURRENDER
6870 HRROM A,RPCL(U) ;SET UP RPCL IN VARS OF RPCLSRED USER
6871 HRRM U,RPCL(A) ;" OF RPCLSRING USER
6873 SKIPE RPCL(A) ;WILL NOT SKIP AT FIRST
6874 PUSHJ P,UFLS ;WAIT FOR PERSON BEING RPCLSRED TO GET TO ONEFL2
6877 RPCLS2: MOVE A,U ;RESTORE A AND U
6880 SKIPE RPCL(A) ;WAIT FOR OTHER GUY TO WIN
6882 JRST RPCLSR ;THEN TRY AGAIN
6887 NJUPCL: CAIE A,-1 ;ENTRY TO IGNORE IF NULL JOB
6888 UPCLSR: CAMN A,USER ;REGULAR ENTRY
6889 POPJ P, ;TRYING TO UPCLSR SELF OR NULL JOB
6896 ; RETURN FROM SYSTEM CALL IN ONE PROCEED MODE
6898 ONEPROC:CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
6899 MOVE U,USER ;BE SURE U HAS RUNNING USER INDEX IN IT
6901 IORM T,PIRQC(U) ;GIVE USER INTERRUPT
6905 SUBTTL KS-10 ONE-PROCEED
6908 ONEPRO: SYSCTX ;SWITCH TO SYSTEM AC BLOCK
6910 BUG AWFUL,[ONE-PROCEED IN NULL JOB]
6911 MOVE T,1PROPC(U) ;PC OF NEXT INSTRUCTION TO EXECUTE
6912 TLNE T,%PSUSR ;NORMALLY USER MODE IS EXPECTED
6914 HRRZ T,T ;SEE IF IT'S FIRST INSTRUCTION OF EXEC ENTRY
6917 SKIPA TT,[JRST ONEPR4]
6918 BUG AWFUL,[ONE-PROCEED IN EXEC MODE],OCT,1PROPC(U)
6919 MOVEM TT,UEXIT ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
6920 CAIE T,UUOH0 ;AND RESUME PROCESSING UUO
6926 ONEPR3: MOVEM T,UUOH ;PUT USER PC WHERE ONEFLS WANTS IT
6927 ONEPR4: SYSCTX ;COME HERE WHEN ONE-PROC'D UUO FINISHES
6928 MOVE U,USER ;BE SURE U HAS RUNNING USER INDEX IN IT
6930 IORM T,PIRQC(U) ;GIVE USER INTERRUPT
6934 SUBTTL USER START ROUTINES
6936 ; CALLED EVERY SLOW CLOCK TICK WHEN TTY WANTING TOP PROCEDURE LOADED
6939 USTRT1: SKIPL T,@UTTYO ;GET TTY TO BE STARTED
6940 JRST [ MOVE U,MMPFR ;WHEN STARTING A HACTRN, MAKE SURE CORE IS AVAILABLE
6942 JRST USTRTL ;IT'S NOT, SAY SYSTEM FULL
6943 JRST .+2 ] ;T HAS INITIAL TTYTBL
6944 MOVSI T,%TBNOT+%TBDTY+%TBNVR ;NOT A REAL TTY, INITIALIZE TTYTBL TO NO TTY
6945 PUSHJ P,USTRA ;CREATE NEW USER SLOT ENTRY
6946 JRST USTSC1 ;LOSE, HAVE TO WAIT
6947 SKIPGE T,@UTTYO ;SKIP IF REALLY A TTY
6948 JRST USTRTS ;DONT LOAD A HACTRN
6949 MOVE T,[SIXBIT /HACTRN/] ;LOAD HACKTRN
6950 USTRT2: MOVEM T,JNAME(U) ;SET JOB NAME
6960 SETZM @UTMPTR(U) ;GIVE TEMPORARY HIGH PRIORITY
6961 SETZM USTP(U) ;START UP
6962 USTSC2: AOS T,UTTYO ;AOS RING BUFF
6967 JRST USTRT1 ;MORE JOBS TO SET UP
6970 USTRTS: MOVEM U,1(T) ;STORE USER'S INDEX IN SECOND WORD
6971 MOVE T,(T) ;GET JNAME FROM FIRST WORD (POINTED TO BY RH OF @UTTYO)
6973 CAME T,[SIXBIT /LDRDEM/]
6974 CAMN T,[SIXBIT /UNSPOO/]
6975 AOS UTMPTR(U) ;LOADER, UNSPOOLER -> SYSTEM TREE
6979 USTSC1: MOVE U,USRHI ;IF A USER IS ^Z'ING AND THERE IS NO POSSIBILITY
6980 SKIPL T,@UTTYO ;OF GETTING MORE JOB SLOTS,
6983 USTRTL: MOVSI U,%TANJS ;THEN MARK THE TTY AS IN NEED OF A "SYSTEM FULL" MESSAGE
6985 MOVEI U,SCRCFM ;AND WAKE UP THE SYS JOB.
6987 JRST USTSC2 ;REMOVE THIS TTY FROM LIST OF THOSE NEEDING A ^Z.
6989 ;GOBBLE NEW USER SLOT, RESET VARIABLES (SKIPS IF IT WINS)
6990 ;RETURNS INDEX IN U. IF FAILS, CLOBBERS U!
6993 JRST USTR1 ;ASSIGN MORE CORE TO USER STORAGE
6995 JRST USTR2 ;HAVE FOUND FREE USER SLOT (IN U)
7000 POPJ P, ;SYSTEM JOB FLUSHING CORE, WAIT UNTIL IT STABILIZES
7001 MOVEI U,LUBLK ;MOVE UP USRHI IF SYS HAS ENOUGH CORE
7004 MOVE T,HUSRAD ;LENGTH OF SYS
7006 JRST MORCOR ;SYS NEEDS MORE CORE FOR USER VARIABLES
7008 USSINI: SETOM USTP-LUBLK(U) ;SYS INITIALIZATION ENTRY
7010 USTR2: PUSHJ P,USTR4 ;RESET USER VARIABLES
7016 BLT T,IOCHNM+17(U) ;CLEAR ALL I/O CHANNELS
7017 USRST4: HRLI T,AC0S(U)
7020 BLT T,AC17S(U) ;CLEAR AC'S & RETURN HAPPY
7023 MORCOR: SUB P,[1,,1]
7025 ANDCAM T,SUPCOR ;CLEAR ANY SYS CORE DECREASE REQ
7027 JRST SUPSET ;REQUEST MORE CORE FROM SYS JOB
7029 ; INITIALIZE A SET OF USER VARIABLES
7030 ; T HAS INITIAL TTYTBL, POSITIVE IT IS TTY # ELSE NO TTY
7031 USTR4: MOVEM T,TTYTBL(U)
7034 HRRM U,TTYSTS(T) ;TELL TTY IT NOW BELONGS TO NEW JOB,
7035 MOVSI U,%TSCNS ;AND IS NOW A CONSOLE.
7038 ANDCAM U,TTYSTS(T) ;AND IS NO LONGER FREE
7039 MOVSI U,%TACFM+%TACTZ
7040 ANDCAM U,TTYSTA(T) ;AND WILL NEED CONSOLE FREE MESSAGE
7043 USTR4A: MOVEM T,UTMPTR(U)
7050 DPB T,[000300,,UNAME(U)]
7052 DPB T,[060300,,UNAME(U)]
7054 DPB T,[140300,,UNAME(U)]
7068 ADDI T,2*30. ;PROTECT FROM SWAPOUT FOR 2 SECONDS (RANDOMLY)
7073 SETOM JBI(U) ;NOT JOB DEVICE HANDLER (NOT YET, ANYWAY)
7076 SETOM TRNLST(U) ;INIT TRANSL LISTS TO NIL
7079 JUMPE U,.+5 ;SYSTEM JOB DOESN'T HAVE A MAP
7083 BLT T,UPGCP+NUVPG/2-1(U)
7088 MOVSI T,(DATAI PAG,)
7098 MOVSI T,(CAI) ;INITIALLY IGNORE TRAPS 1 AND 2
7101 IFE KS10P,MOVEI T,%PI1PR ;TRAP 3 IS IGNORED TOO ON KS
7102 MOVEM T,TR3INS(U) ;TRAP 3 GIVES ONE-PROCEED INTERRUPT ON KL
7106 MOVSI T,MUUOKN ;UUO NEW PC'S ARE SAME AS SYS JOB'S,
7107 HRRI T,MUUOKN(U) ; EXCEPT THAT UUO IN EXEC MODE IS AN ERROR
7113 MOVE T,[%PSPCU,,MUUOEX]
7114 MOVEM T,MUUOKN(U) ; UUO in Exec mode is an error
7115 MOVEM T,MUUOKT(U) ; (either case)
7117 MOVEM T,MUUOCN(U) ; Normal UUO
7119 MOVEM T,MUUOCT(U) ; UUO as trap instruction
7121 MOVEM T,1PRNPC(U) ; One-proceed jumps to ONEPRO
7124 MOVE T,[JRST 2,@UUOH]
7132 MOVE T,[JRST UREALB]
7134 CLEARM UPGML(U) ;CLEAR USER PG MAP VARIABS
7139 MOVSI T,1+EXPGNG ;DONT ENABLE QUAN COUNTER FOR NOW (BUT SET
7143 MOVEM T,UPDBR3(U) ;SET UP EXEC DBR
7144 MOVSI T,IFN MCOND DM,[1040] .ELSE [0] ;ON DM, B+C MEMORIES DON'T WORK
7145 MOVEM T,UPACP(U) ;SET UP B+C MEMORY PTRS
7147 IFN KS10P, SETZM UPQUAN(U) ; Clear quantum counter.
7151 ;DROPS THROUGH, AND .RESET OF USR DEVICE COMES HERE.
7152 USRST2: MOVE T,UNAME(U)
7153 MOVEM T,USYSNM(U) ;CLOCK MUST BE OFF OR PI IN PROG ON 7
7154 MOVE T,TIME ;DON'T SWAP JOB OUT RIGHT AWAY
7170 SETZM NVDBA(U) ;0 VIDEO BUFFERS ASSIGNED BY JOB.
7217 MOVSI T,%OPOJB ;USR RESET DOESN'T CLEAR OJB OPTION BIT
7222 USTR4B: MOVEI T,USRRCE+NCT
7226 ;SET UP THE BLINKER FOR THE JOB IN U.
7227 USTTV0: SKIPN TEN11F
7233 MOVE A,TT11HD ;11 HEADER ADR
7235 LDB B,[141000,,1(A)] ;VIDEO BUFFER #
7236 TRO B,17_8 ;CSET ALU FCTN
7237 LSH B,4+16. ;INTO POSITION FOR MOVEMING INTO CONSOLE REG
7251 .UII,,(SIXBIT/SYS/) ;7
7261 USTCDR: SYSCTX ;GOT HERE FROM ULEAVE WHICH SELECTED THE USER ACS,
7262 MOVE U,USER ; SELECT SYSTEM ACS INSTEAD.
7263 MOVEI A,USTCDR+1 ;COME BACK HERE IN CASE OF PCLSR
7276 SUBTTL USER KILL ROUTINES
7279 ; CLOSE ALL DEVICES AND INFERIOR PROCEDURES OF A JOB (INDEX IN U)
7281 IODCL: MOVNI I,1 ;SET TO STOP
7282 PUSHJ P,IODCL3 ;STOP ALL INFERIOR JOBS (RECURSIVE)
7283 MOVEI I,0 ;THEN KILL.
7286 TLNE A,%OPLOK ;IF USER HAS ENABLED THE SWITCH-UNLOCK FEATURE,
7287 PUSHJ P,IODCSW ;UNLOCK HIS LOCKED SWITCHES.
7288 IFN 340P\E.SP, PUSHJ P,ADCLOSE ;FLUSH DISPLAY
7289 IFN IMXP, PUSHJ P,POTCLS ;DISCONNECT HIS POTS
7292 PUSHJ P,SCNSTP ;KILL SCANNER IF HIS
7294 IFN ARMP, PUSHJ P,AARMOFF ;FLUSH ARM
7295 IFN DEMON, PUSHJ P,DEMOUT ;FLUSH EXISTANCE (CURRENT OR FORMER) AS DAEMON.
7298 PUSHJ P,VBDFLS ;DEASSIGN ALL VIDEO BUFFERS.
7301 CAMN U,MTRUSR ;DEASSIGN THE PERFORMANCE COUNTER
7304 PUSHJ P,CLQDEL ;RELEASE AND STOP CLOCK QUEUE BLOCK
7308 SETOM UREALT ;UN REAL TIME
7309 CAMN U,UMASTER ;UNMASTER
7311 PUSHJ P,AIOPDL ;POP UP ALL OF IO PDL (CLOSING CHNLS POPPED INTO)
7313 IODCL1: PUSHJ P,CCLOSE ;CLOSE ALL CHANNELS
7314 CAIGE R,IOCHNM+NIOCHN-1(U)
7317 SKIPGE T,JBI(U) ;IF THIS JOB IS A JOB-DEVICE,
7319 HRROS JBCJUI(T) ;TELL THE JOB CHANNEL THAT THE HANDLER IS GONE.
7321 SKIPGE JBCG(T) ;IF OUR CREATOR STILL HAS A JOB CHANNEL,
7323 MOVE A,JBCUI(T) ;FLUSH THE CREATOR'S JOB CHANNELS,
7325 PUSHJ P,RPCLSR ;STOPPING THE CREATOR IN CASE HE'S USING THEM NOW.
7326 MOVE T,JBI(U) ;RPCLSR CLOBBERS T.
7336 PUSHJ P,UPCLSR ;ALLOW THE CREATOR TO CONTINUE AND GET IOC ERROR OR RETRY OPEN
7337 IODCL6: CONO PI,CLKON
7338 SETOM JBCUI(T) ;FLUSH THE JOB-DEVICE SLOT.
7339 SETOM JBI(U) ;SAY THIS JOB NO LONGER A JOB-DEVICE.
7342 IODCL3: PUSH P,I ;I=0 KILL I=-1 STOP I=1 JUST CLOSE CHANNELS.
7345 IODCL4: HRRZ E,SUPPRO(A)
7346 SKIPE UNAME(A) ;SKIP IF VARIABLES BLOCK IDLE
7347 CAIE E,(U) ;SKIP ONLY IF IT IS A DIRECT INF.
7348 JRST IODCL5 ;TRY NEXT SET OF VARS
7351 PUSHJ P,1USTOP ;STOP (WITH BUSRC BIT)
7357 PUSHJ P,IODCLA ;KILL OR CLOSE CHNLS, RECURSE
7359 SKIPE -2(P) ;KILLING?
7360 JRST IODCL7 ;JUST CLOSING CHNLS.
7361 MOVE A,U ;KILLING; WAIT TILL NO OTHER JOB
7362 PUSHJ P,AUCL3 ;IS LOOKING AT THE ONE THAT WE'RE KILLING.
7363 PUSHJ P,UBLST2 ;FLUSH CORE
7365 PUSHJ P,ZUSLOG ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
7369 IODCL5: ADDI A,LUBLK
7371 JRST IODCL4 ;LOOP FOR ALL SETS OF USER VARIABLES
7376 IODCL8: PUSHJ P,IODCL3
7379 ;SYSTEM CALL UNLOCK. 1 ARG, A JOB SPEC.
7380 ;THAT JOB'S LOCKS ARE ALL UNLOCKED.
7383 JSP T,NCORUI ;DECODE THE JOB SPEC.
7384 JRST NUNLO1 ;WE'RE CERTAINLY ALLOWED TO WRITE THIS JOB.
7385 JUMPE U,NUNLO1 ;SYSTEM JOB CAN DO IT TO ANYBODY
7386 JSP T,NCORWR ;NOT SURE, SO CHECK.
7387 JRST OPNL31 ;NO, NOT ALLOWED.
7393 ;THE CALL IS ALLOWED, SO UNLOCK THAT JOB'S LOCKS
7396 MOVE A,J ; If not self,
7397 PUSHJ P,RPCLSR ; assure a User mode PC
7402 NUNLO2: MOVE A,UUOH ; If we are asked to unlock
7403 SUBI A,1 ; our own locks, put our PC in
7404 MOVEM A,SRN3(U) ; SRN3 where IODCSW will look for it
7407 TLNE A,%OPLOK ; Provided it is using locks at all...
7410 PUSHJ P,LSWPOP ; USTP
7411 JRST LSWPJ1 ; DIELOK
7412 ; Returns with U clobbered, which seems to be OK for .CALL's?
7415 ;CALL HERE TO UNLOCK THE SWITCHES A JOB HAS LOCKED (USER IDX IN U).
7416 ;LOCATION 43 (ACTUALLY, 3+C(40ADDR)) HAS THE LIST POINTER. 0 IS NIL.
7417 ;ANYTHING ELSE POINTS TO 2-WORD BLOCK; THE 1ST WORD IS THE SWITCH OR THE
7418 ;ADDRESS OF THE SWITCH. THE RH OF THE SECOND IS THE CDR OF THE LIST.
7419 ;THE LH OF THE SECOND IS THE UNLOCK INTRUCTION. THE INDEX FIELD IS IGNORED,
7420 ;ONE LEVEL OF INDIRECTION IS PERMITTED, AND THE INSN MUST BE EITHER
7421 ;AOS OR SOS WITH 0 IN AC FLD, A LOGICAL INSTRUCTION (TOP 3 BITS = 4),
7422 ;A HALFWORD INSTRUCTION, OR A MOVE,MOVN,MOVS,MOVN,ADD OR SUB SERIES INSN,
7423 ;OR 0 WHICH MEANS SETOM. ONLY INSNS THAT MODIFY MEMORY ARE USEFUL.
7424 ;44 IS AN AOBJN POINTER TO THE CRITICAL RTNS TABLE, OF 2-WORDS ENTRIES.
7425 ;THE 1ST WORD EACH IS <BEGINNING OF RANGE>,,<END OF RANGE>+1.
7426 ;THE SECOND IS THE UNLOCK INSTRUCTION, WITH THE ADDRESS OF THE SWITCH
7427 ;IN THE RH (AGAIN, 1 LEVEL OF INDIRECTION IS PERMITTED).
7428 ;IF THE PC IS IN THAT RANGE, THE UNLOCK INSN IS EXECUTED.
7429 ;43 AND 44 ARE UPDATED DURING PROCESSING TO PREVENT PCLSR LOSSAGE.
7430 ;SEE .INFO.;ITS LOCKS
7433 ;MACRO TO DO XCTR, OR POPJ IF THAT WOULD CAUSE INTERRUPT.
7438 ; IODCSW: Unlock locks for user in U
7439 ; User should be stopped so that he is in user mode.
7440 ; The only exception is if we are unlocking the locks of the running job,
7441 ; in which case the contents of SRN3 will be used as our PC.
7442 ; Clobbers just about everything except U.
7444 PUSHJ P,IODCS0 ; Do actual work, if any...
7445 MOVE U,USER ; But be sure to always
7446 PUSHJ P,MPLDZ ; restore normal page map of running user.
7450 MOVE U,USER ;SET UP MAP TO USER BEING HACKED (IDX IN J).
7451 PUSHJ P,MPLDJ ;LH(J) CLOBBERED, RH SAVED.
7452 HRRZ U,J ;U HAS WHAT IT HAD AT CALL (USR BEING HACKED).
7453 MOVEI C,1000 ;COUNT LENGTH OF LIST SO CIRCULAR LISTS DON'T HANG US UP.
7455 XCTRIJ XRW,[MOVES B,3(E)] ;GET HIS "43" (AND MAKE SURE IT'S WRITABLE)
7456 IODCS1: JUMPE B,IODCS2 ;REACHED END OF LOCKED SWITCH LIST, MAYBE?
7457 XCTRIJ XR,[HLL B,1(B)] ;MERGE LOCK INSN WITH ADDR OF SWITCH.
7458 PUSHJ P,IODCDO ;EXECUTE THE UNLOCK INSN
7459 POPJ P, ;IODCDO DETECTED MPV OR PUR INTERRUPT.
7460 XCTR XR,[HRRZ B,1(B)] ;REPLACE LIST BY ITS CDR.
7464 IODCS2: XCTRIJ XRW,[MOVES E,4(E)] ;GET JOB'S "44", AND MAKE SURE IT'S WRITEABLE.
7465 HRRZ C,UPC(U) ;GET ITS PC, FOR COMPARISON.
7466 CAMN U,USER ; Except if this is us,
7467 HRRZ C,SRN3(U) ; then unlock PC is in SRN3
7468 JUMPGE E,CPOPJ ;THERE ARE NO PROTECTED RANGES => DONE.
7469 IODCS3: XCTRIJ XR,[MOVS B,(E)] ;GET BOUNDS OF NEXT PROTECTED RANGE.
7470 CAIGE C,(B) ;IS PC ABOVE LOWER BOUND?
7473 CAIL C,(B) ;IS IT BELOW UPPER?
7475 XCTRIJ XR,[MOVE B,1(E)] ;PC IS IN THIS RANGE; GET UNLOCK INSN
7476 PUSHJ P,IODCDO ;EXECUTE IT
7477 POPJ P, ;NO SKIP => MPV OR PUR INTERRUPT DETECTED.
7478 IODCS4: ADD E,[2,,2] ;CHECK ALL ENTRIES IN CRITICAL RTN TABLE, 1 BY 1.
7479 HRRZ B,40ADDR(U) ;UPDATE 44 SO ENTRIES ALREADY PROCESSED ARE
7480 UMOVEM E,4(B) ;ACTUALLY IN THE TABLE. THIS IS IN CASE PCLSR.
7484 ;PRECEDE AN XCTR WITH JSP TT,IODCXC TO POPJ IF THE XCTR WOULD
7485 ;CAUSE AN INTERRUPT (MPV OR PUR). CLOBBERS A,T,Q.
7486 IODCXC: MOVEI A,@(TT) ;GET EFFECTIVE ADDR OF XCTR.
7487 MOVEI A,@(A) ;GET EFFECTIVE ADDR OF XCTR'ED INSN.
7488 LSH A,-10. ;GET PAGE # BEING REFERENCED.
7489 PUSHJ P,UPLC ;SET T = B.P. TO PAGE MAP HALFWORD. CLOBBERS Q.
7491 TRNE T,600000 ;IF PAGE IS SWAPPED IN, PUT ACCESS BITS IN
7492 LSH T,-20 ;SAME PLACE THEY ARE WHEN SWAPPED OUT (LOW 2 BITS).
7493 ;FOLLOWING CODE COMMENTED OUT BECAUSE IT DOESN'T WORK ON THE KL10 XCTR
7494 ; TRNE T,2 ;CHANGE CODE 2 (READ-WRITE, NOT WRITTEN) TO 3 (READ-WRITE).
7496 ; LSH T,27 ;PUT ACCESS CODE IN AC FIELD, AND TEST
7497 ; ANDCA T,(TT) ;AGAINST WHAT THE XCTR WILL TRY TO DO.
7498 ; TLNN T,(0 3,) ;ALL DESIRED ACCESS AVAILABLE =>
7499 ; JRST (TT) ;WE WIN.
7500 ; POPJ P, ;ELSE QUIT OUT OF CALLING ROUTINE.
7502 ;FOLLOWING CODE INSERTED INSTEAD. THIS RELIES ON THE FACT
7503 ;THAT ONLY THE FOLLOWING INSTRUCTIONS ARE XCTRIJ'ED:
7504 ; BOOLE,HWT,MOVXX,ADDX,SUBX,AOSX,SOSX
7505 MOVE A,@(TT) ;GET INSTRUCTION XCTR'ED
7507 TLCE A,300000 ;SKIP IF AOS OR SOS
7508 TLNE A,002000 ;SKIP IF DOESN'T WRITE IN MEMORY
7509 TRNE T,2 ;INSTRUCTION WRITES, SKIP IF RW OR RWF ACCESS NOT PRESENT
7510 TRNN T,3 ;INSTRUCTION READS, SKIP IF ANY ACCESS PRESENT
7511 POPJ P, ;INSUFFICIENT ACCESS, QUIT OUT OF CALLING ROUTINE
7512 JRST (TT) ;WINNING, GO DO THE XCTR
7514 ;PUSHJ P,IODCDO WITH INSN IN B TO XCTRIJ IT, CHECKING FOR LEGALITY
7515 ;AND PERFORMING ONE LEVEL OF INDIRECTION IF THE @ BIT IS SET.
7516 ;(WE CAN'T AFFORD AN INFINITE LOOP WHILE KILLING A JOB EVEN IF IT IS
7518 ;INDEX FIELD IS IGNORED. IF THE OPCODE IS 0, SETOM IS USED INSTEAD.
7519 ;SKIPS IF INSN IS LEGAL AND DOESN'T CAUSE MPV OR PUR INTERRUPT.
7520 ;CLOBBERS A,D,J,T,TT,Q
7521 IODCDO: MOVE J,B ;B IS NOT CLOBBERED.
7524 XCTRIJ XR,[HRR J,(J)] ;INDIRECTION IS WANTED; DO IT.
7525 IODCD1: TLNN J,-1 ;IF LH IS 0, REPLACE BY (SETOM)
7528 CAIE A,AOS_-27 ;AOS AND SOS ARE LEGAL WITH 0 IN AC FIELD.
7532 CAIE A,4 ;ALL INSNS WITH 4 IN TOP 3 BITS (LOGICAL INSNS) ARE OK.
7533 CAIN A,5 ;HALFWORD INSTRUCTIONS ALSO OK.
7536 CAIE A,MOVE_-36 ;ALL FORMS OF MOVE, MOVS, MOVN AND MOVM OK
7539 CAIE A,ADD_-36 ;ADD & SUB OK. (OF COURSE, ONLY TO-MEMORY INSNS MAKE SENSE)
7541 IODCD3: LDB A,[270400,,J] ;AC FIELD NEED NOT BE 0, SO GET CONTENTS OF SPEC'D AC,
7544 DPB A,[270400,,J] ;AND MAKE THE INSN USE AC D, WHERE THE VALUE IS.
7546 XCTRIJ XRW,J ;EXECUTE INSN, CHECKING FOR INTERRUPTS.
7550 ; FLUSH LAST VESTIGES OF USER
7551 ; ELIMINATES ALL POINTERS TO USER & FREES USER VARIABLES (CLOBBERS U TO "USER")
7552 ; R, IF NON-ZERO, IS ADDRESS OF CHANNEL NOT TO BE CLOSED UNTIL LAST MINUTE
7553 ; (IN CASE PCLSR OUT OF .UCLOSE)
7555 ZUSER: MOVEI A,(U) ;CLEAR BOTH TRANSLATION LISTS
7556 HRLI A,300000 ;FOR THIS JOB.
7559 MOVEI A,0 ;AND GET RID OF EXISTING FOREIGN-USER CHANNELS.
7560 ZUSER2: SKIPE UNAME(A)
7561 PUSHJ P,ZUSES ;SEE IF THIS USER HAS ANY POINTERS TO BE FLUSHED
7562 CAMN U,SERVER(A) ; If we were a server for this guy,
7563 SETOM SERVER(A) ; clear it out.
7566 JRST ZUSER2 ;LOOP FOR ALL SETS OF USER VARIABLES
7570 SKIPE NMPGS(U) ;USER SHOULD HAVE NO MEMORY BY NOW
7572 SETZM UNAME(U) ;ONLY PLACE THAT UNAME IS ZEROED
7573 SETOM USTP(U) ;SET USTP TO SPEED SEARCH
7574 MOVE A,U ;USER FLUSHED
7577 IORM T,SUPCOR ;CAUSE USER VARIABLE BLOCKS DECREASE PROGRAM TO RUN
7578 POPJ P, ;RETURN WITH CLOCK OFF
7581 ;CALLED BY ADISOWN, NATTACH, NDETACH, ETC.
7582 ZUSES: MOVEI D,%CLSU\%CLSFU\%CLSJI\%CLSJO ;CLSTB BITS FOR CHANNELS TO CLOSE
7587 SETZM B ;CLEAR STOPPED PROC FLAG
7588 PUSHJ P,CHSCAA ;EXECUTE FOLLOWING INST FOR EACH CHANNEL AND I/O PDL SLOT
7592 SKIPE B ;SKIP UNLESSS YOU STOPPED THE PROC
7593 PUSHJ P,UPCLSR ;RESTART USER
7596 ZACHEK: HLRZ T,(R) ;CHECK FOR CHANNEL TO ZAP
7602 POPJ P, ;IS IT EITHER TYPE OF USER CHANNEL? OR JOB CHNL?
7604 PUSHJ P,RPCLSR ;STOP USER
7607 TRNN T,%CLSFU ;IS IT A FOREIGN USR CHNL?
7608 JRST ZACHK2 ;NO, SUPERIOR OR JOB CHNL.
7609 JUMPG R,ZACHK1 ;IOPDL CHANNEL
7610 MOVEI T,LUBLK ;SEE IF A HAS BEEN CLOBBERED
7611 IDIVM A,T ;(AT LEAST MAKE SURE IT'S A VALID USER INDEX)
7616 HRRZ T,R ;NORMAL CHANNEL, INTERRUPT ON IT.
7621 ZACHK2: CAIE C,(R) ;UNLESS THE ONE NOT TO BE CLOSED UNTIL LAST MINUTE,
7622 SETZM (R) ;FOR ANY KIND OF CHANNEL, CLEAR IT OUT.
7625 ZACHK1: MOVEI T,IIOPOP ;FOREIGN USR IN IOPDL SLOT: INTERRUPT WHEN IOPOPPED.
7629 ZUSLOG: PUSH P,[ZUSER] ;DO LOGUSE THEN ZUSER
7631 ;LOG RUNTIME AND SWAPIN REQUESTS USED BY JOB IN U
7632 ;JOB CALLED FOR SHOULD NOT BE CURRENT OR ABLE TO RUN DURING CALL
7633 ;JOB SHOULD NOT BE TOP LEVEL EXCEPT WHEN DMNPLO CALLS
7634 ; HERE JUST BEFORE SENDING THE USAGE TO THE DEMON
7637 LOGUSE: MOVN TT,UTRNTM(U)
7639 EXCH TT,TRUNTM(U) ;AVOID CHARGING FOR THIS USAGE TWICE
7641 SUB TT,TRUNTM(U) ;COMPUTE TOTAL USAGE NOT YET CHARGED
7643 SKIPGE I,SUPPRO(U) ;FIND HIGHEST JOB IN TREE
7644 POPJ P, ;BUT IF TOP LEVEL RETURN WITH USAGE IN TT, T
7645 ;THIS IS TO FIND A BUG. -- CStacy, 4/30/82
7646 CAME I,U ;IS THIS JOB ITS OWN SUPERIOR?
7648 BUG PAUSE,[SOME JOB IS ITS OWN SUPERIOR, U AND I=],OCT,U
7649 LOGUS1: SKIPL SUPPRO(I)
7650 JRST [ MOVE I,SUPPRO(I) ? JRST .-1 ]
7651 ADDM TT,TRUNTM(I) ;ADD CHARGES TO TREE'S ACCOUNT
7655 ;DO LOGOUT FOR TREE HEADED BY JOB IN U
7656 ;CALLER SHOULD THEN PUSHJ P,DMNPLI TO LOG JOB BACK IN
7657 ;THIS IS USED TO KEEP ACCOUNTING STRAIGHT WHEN DETACH, CHUNAME, RELOAD (SIGH)
7658 ;IF JOB IS CURRENTLY RUNNING, TIME USED IN CURRENT QUANTUM
7659 ;WON'T GET CHARGED THIS TIME AROUND. TOO BAD.
7660 ;CLOBBERS T,TT,I,J,D. CALL WITH CLKOFF OR IN PROGRESS.
7665 LOGUP1: ADDI U,LUBLK
7668 CAMN J,UTMPTR(U) ;SKIP JOBS IN OTHER TREES (FOR SPEED)
7669 SKIPGE SUPPRO(U) ;AND SKIP TOP LEVEL JOBS
7671 SKIPE UNAME(U) ;DON'T GET CONFUSED BY EMPTY SLOTS
7672 PUSHJ P,LOGUSE ;PROBABLY AN INFERIOR IN TREE LOGGING OUT, UPDATE ACCT
7676 JRST DMNPLO ;TELL DEMON ABOUT TREE'S USAGE
7678 SUBTTL USER UUO WAIT (HANG UP) ROUTINE
7679 ; DOES NOT WORK FOR XCT T OR FOR X (T)
7680 ; THE INSTRUCTION BEFORE THE PUSHJ P,UFLS GETS EXECUTED WITH AN
7681 ; ARGUMENT PASSED IN T AND ITS USER INDEX IN U. I BELIEVE IT
7682 ; IS ONLY ALLOWED TO BASH T AND A.
7684 UFLS: CONSZ PI,77400
7685 BUG HALT,[UFLS WITH PI IN PROGRESS]
7686 CONO PI,CLKOFF ;DOES NOT ALLOW CLOCK INTS
7688 SKIPGE U,USER ;GET INDEX OF USER BEING BLOCKED
7689 JRST 4,. ;NULL JOB SHOULD NOT GET BLOCKED
7690 MOVEM T,EPDL2(U) ;SAVE C(T) FOR FLSINS AT PCLSR
7691 MOVEM T,AC16S(U) ;SAVE IN SWAP OUT AC ALSO
7692 POP P,UPC(U) ;WORK FOR INST INDEX OF P
7694 BLT T,AC15S(U) ;STORE REST OF ACS
7695 MOVE T,UPC(U) ;GET PC AT CALL (=CALL+1 ; =SKIP +2)
7696 SKIPA T,-2(T) ;GET POINTER TO SKIP
7697 UFL3: MOVE T,(T) ;GET CONTENTS OF E (WAS AN XCT)
7698 MOVE U,AC17S(U) ;WIN FOR INSNS INDEX OF U.
7699 HRRI T,@T ;CALCULATE E
7700 TLZ T,37 ;CLEAR OUT @ AND INDEX BITS
7702 MOVEM T,FLSINS(U) ;STORE AS BLOCKING CONDITION
7705 JRST UFL3 ;JUMP IF INSTRUCTION WAS XCT
7706 CONO PI,UTCON-1 ;TURN ON ALL PIS EXCEPT CLOCK
7707 MOVSI T,%SWPGW+%SWINT
7708 ANDCAM T,USWST(U) ;CLEAR WAITING FOR PAGE TYPE FLSINS
7709 SKIPGE RPCL(U) ;SKIP IF NOT BEING RPCLSRED
7710 JRST UFL1 ;LOSER IS BEING RPCLSRED
7711 UFL6: MOVE U,AC17S(U) ;FOR CLUSAV TO STORE
7713 CONO PI,CLKRQ ;CAUSE INTERRUPT TRANSFERING TO CLOCK ROUTINE PI IN
7715 IFE KA10P, JRST . ;ON KL AND KS SEEMS TO TAKE A WHILE TO GO OFF ("I
7716 ; CAN WAIT FOREVER, YOU KNOW")
7717 IFN KA10P, JRST 4,. ;ON KA SHOULD GO OFF RIGHT AWAY
7719 UFL1: MOVE P,CPDLP ;MUST NOT USE USR PDL SINCE THAT CAN
7720 ;GET CLOBBERED BY LSWDIS VIA UFL5
7721 ;CLOCK IS OFF, SO CPDLP IS OK
7723 MOVE T,UEXIT ;PICK UP EXIT INSTR
7724 CAME T,[JRST ONEPROC] ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7726 JRST UFL1A ;NOT ONE PROCEEDING
7727 MOVSI T,%PC1PR ;GET ONE PROCEED BIT
7728 IORM T,UUOH ;TURN IT ON IN PC
7731 MOVE T,UEXIT ;PICK UP EXIT INSTR
7732 CAME T,[JRST ONEPR4] ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7734 JRST UFL1A ;NOT ONE PROCEEDING
7735 MOVSI T,OIPBIT ;GET ONE PROCEED BIT
7736 IORM T,UUOH ;TURN IT ON IN PC
7738 SOS T,UUOH ;UUOH HAS REAL PC IF UFL5 SKIPS. WILL GET SET BY ONEPR1
7739 PUSHJ P,UFL5 ;BACK UP TO UUO
7740 JRST UFL6 ;FINALIZATION REQUIRED
7744 SUBTTL VARIOUS WAIT & LOCK-SWITCH ROUTINES
7746 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH UTCCHN OFF
7748 LWAIT1: CONO PI,UTCON ;TURN INTERRUPTS ON
7750 XCT @(P) ;ENTRY, EXECUTE INSTRUCTION
7751 PUSHJ P,UFLS ;HANG TILL INSTRUCTION SKIPS
7752 CONO PI,UTCOFF ;TURN INTERRUPTS OFF
7755 JRST POPJ1 ;WIN, RETURN SKIPPING OVER ARG
7757 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE -1 AND SEIZE IT
7761 HRLM T,(P) ;MAKE PC STORED ON PDL INDIRECT
7762 SKIPGE @(P) ;SKIP IF ALREADY LOCKED
7763 JRST SWTL1 ;NOT LOCKED SO TRY TO GRAB IT
7764 MOVEI T,@(P) ;ADDRESS OF SWITCH
7765 HLRZ T,1(T) ;USER THAT HAS SWITCH
7768 CAMN T,USER ;SKIP IF THIS USER DOESN'T HAVE IT
7769 BUG ;THIS USER ALREADY HAS THAT SWITCH
7770 SWTL1: SKIPL @(P) ;(DO NOT CHANGE TO AOSE)
7771 PUSHJ P,UFLS ;HANG TILL NEGATIVE
7790 ;IF LOCK ALREADY SEIZED, JUST SET UP POINTERS
7795 SWTAD: PCLT ;TRY TO LOCK SWITCH (@NEXT LOCN). IF SUCEED, SKIP EXTRA TIME.
7796 MOVE T,@(P) ;IF FAIL, DO N LSWPOPS (AS SPEC IN 4.6-4.1 OF NEXT WORD)
7797 SKIPGE (T) ;AND WAIT FOR SWITCH TO SEEM TO BE AVAILABLE.
7798 JRST SWTAD1 ;THEN RETURN (NOTE: NOT LOCKING IT).
7799 SWTAD2: TLNN T,77000
7811 SWTAD1: CONO PI,CLKOFF
7813 JRST [ CONO PI,CLKON
7815 AOS (P) ;SKIP OVER FAILURE RETURN
7819 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH CLKCHN OFF
7820 CWAIT1: CONO PI,CLKON ;TURN CLOCK ON
7822 XCT @(P) ;ENTRY, EXECUTE INSTRUCTION
7823 PUSHJ P,UFLS ;HANG TILL INSTRUCTION SKIPS
7824 CONO PI,CLKOFF ;TURN CLOCK OFF
7827 JRST POPJ1 ;WIN, RETURN SKIPPING OVER ARG
7830 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE NON-NEGATIVE AND SEIZE IT
7832 MOVEI T,(@) ;IF 4.9 OF NEXT LOCN =1, RETURN WITH UTCOFF
7848 ;SWITCH LIST LOCK, DOES NOT WORK FOR SWITCHES POINTED TO INDEX OF A, B, OR D
7849 ;FOLLOW BY LIST OF SWITCHES
7850 ;4.9-4.4=0 4.3-4.1 0 AOSE SWITCH 1 SIGN SWITCH
7856 BLT T,AC0S+17(U) ;FOR SLWAIT FIRST TIME
7857 SLUGH1: HRRZ T,-3(P) ;POINTER TO SWITCH LIST
7861 SLUGH2: MOVE A,(T) ;TRY TO LOCK LIST
7863 JRST SLUWIN ;REACHED END OF LIST
7864 LDB B,[220400,,A] ;INDEX
7873 AOBJP T,SLUGH2 ;LH COUNTS SWITCHES SUCCESSFULLY SEIZED
7874 ;SHOULD NVERE FALL THROUGH
7878 LDB B,[220400,,A] ;INDEX
7879 LDB D,[330300,,A] ;TYPE CODE
7887 AOJA T,SLWAIT ;THAT SWITCH OK, TRY OTHERS
7889 SLWATT: SKIPL (A) ;WAIT FOR NEG (AOSE SW)
7890 SKIPGE (A) ;WAIT FOR POS (SIGN SW)
7895 SUB P,[1,,1] ;"RETURN" BUT NOT INCREMENTED
7898 SLLOCK: PUSHJ P,SWTLX
7902 SLULO2: JUMPE A,SLUGH1 ;NONE SEIZED TRY AGAIN
7903 PUSHJ P,LSWPOP ;RELEASE THOSE SEIZED
7906 SWTLX: CONO PI,CLKOFF ;DON'T GO OFF HALF-LOCKED
7915 LSWTLX: CONO PI,UTCOFF
7928 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING SWITCH
7934 ;SET UP ROUTINE TO BE CALLED ON PCLSR'ING OUT
7944 ;SET UP ROUTINE TO AOS VARIABLE UPON UNLOCKING SWITCH
7949 ;SET UP ROUTINE TO SOS VARIABLE UPON UNLOCKING SWITCH
7954 ;SET UP ROUTINE TO SOS LH UPON UNLOCKING SWITCH
7955 ;HALT IF SWITCH'S LH EVER BECOMES NEGATIVE
7960 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING SWITCH
7961 ;THAT ROUTINE MAY ONLY CLOBBER A AND T!! IT GETS CALLED
7962 ;WITH USER IN U, AND THE JOB'S ACS IN AC0S(U)-AC17S(U)
7971 ;SET UP ROUTINE TO CLEAR SIGN BIT OF VARIABLE UPON UNLOCKING SWITCH
7976 ;SET UP ROUTINE TO DO NOTHING UPON UNLOCKING SWITCH
7983 ;ROUTINE TO ADD THIS PROCEDURE TO A LIST POINTED TO
7984 ;BY THE WORD AFTER THE CALL. UNLOCKING REMOVES IT FROM THE LIST
7985 LSTSET: PUSH P,TT ;LEAVES CLKON
7999 BUG ;NOT ENOUGH BLOCKS
8000 LSTST2: MOVE T,@-4(P) ;ADDRESS OF HEAD OF LIST
8002 PUSH P,(T) ;PUSH HEAD OF LIST
8003 POP P,(Q) ;POP INTO LSWB BLOCK
8013 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING OF SWITCH
8014 ;BY OTHER THAN PCLSRING OUT
8019 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING OF SWITCH
8020 ;BY OTHER THAN PCLSRING OUT
8034 ;SET USER LOCK SWITCH BLOCK, WD1 IN T, MODE IN TT
8039 REPEAT NULBLK,[IFN .RPCNT,ADDI Q,2
8043 BUG ;NOT ENOUGH BLOCKS
8055 LSWCJ1: AOS (P) ;EXIT TO DO LSWCLR AND SKIP-RETURN.
8057 ;UNLOCK ALL SWITCHES, CALLED BY OPENL, ADISOWN, IOADCR
8060 ;TEMPORARY CODE ADDED 1/22/80 TO SEE IF THERE ARE ANY MORE OF
8065 SKIPN T,LSWPR(U) ;MUST HAVE USER IN U
8073 TLO U,400000 ;SIGNAL NOT PCLSR
8090 LSWZAP: PUSH P,U ;FROM PCLSR
8104 TLZN U,200000 ;HAS PC BEEN CLOBBERED? ;THIS IS ONLY FOR FINSET R.I.P.
8107 SETZM LSUUO(U) ;INDICATE OCCURRENCE OF FINSET (WILL MEAN WE HAVEN'T MISSED MARK)
8108 JRST PCLSR4 ;REQUIRED TO START UP ROUTINE
8110 ;-1(P) HAS POINTER TO SWITCH BLOCK TO UNDO.
8111 ;A HAS SECOND WORD OF THAT BLOCK.
8112 ; 4.9=1 => PERFORM FUNCTION ON PCLSR
8113 ; 4.8=1 => PERFORM FUNCTION ON ANY LSWPOP OTHER THAN PCLSR
8114 ; 4.1-4.3 => FUNCTION
8115 ; 3.1-3.9 USER # LAST LOCKED BY
8116 ; 1.1-2.9 LSWPR THREAD
8118 LSWDIS: LDB T,[330300,,A] ;FUNCTION
8119 TLNE A,400000 ;SKIP IF NOT FOR PCLSR
8120 JUMPGE U,LSWDS1 ;PCLSRED AND 4.9=1
8121 TLNN A,200000 ;NOT FOR PCLSR OR FOR PCLSR BUT NOT PCLSRED
8122 POPJ P, ;NOT FOR EITHER LSWPOP
8123 JUMPGE U,CPOPJ ;FOR OTHER LSWPOP BUT PCLSRED
8124 LSWDS1: JRST LSWTAB(T)
8126 LSWTAB: JRST UNSWTL ;0 (AOSE) ALSO USED FOR QUSR
8127 JRST UNLSWT ;1 (SIGN)
8128 JRST ULROUT ;2 (GO TO ROUTINE)
8129 JRST ULAOS ;3 (AOS, SOS)
8130 JRST UNLST ;4 (UNLOCK FROM LIST)
8131 JRST ULSOS ;5 (SOS, AOS)
8132 JRST ULSTM ;6 (SETOM)
8133 JRST ULAOSL ;7 (AOS,SOS LEFT HALF)
8135 UNSWTL: MOVE T,-1(P)
8139 ULSTM: MOVE T,@-1(P)
8143 UNLSWT: MOVE T,@-1(P)
8148 ULAOSL: MOVE T,@-1(P)
8154 ULAOS: MOVE T,@-1(P)
8167 ULSOS: MOVE T,@-1(P)
8171 ULROUT: MOVE T,@-1(P)
8173 JRST ULROU1 ;A LOSSET - MAY CLOBBER A OR T; USR INDEX IN U
8174 HRRZM T,UPC(U) ;IT'S A FINSET, EXPECTS THE OLD METHOD OF CALL.
8178 MOVSI T,%PSPCU ;IT MIGHT TRY AN XCTR
8181 TLOE U,200000 ;SIGNAL PC CLOBBERED
8182 BUG ;PC TRIED TO BE CLOBBERED TWICE
8185 ULROU1: JUMPGE U,(T) ;IF LOSSET, AND LSWPOPPING,
8187 ADDI A,(U) ;PUT THE ACS IN THE AC0S, SINCE
8188 BLT A,AC0S+H(U) ;THAT'S WHERE THEY'LL BE IF CALL LOSSET ROUTINE WHILE PCLSRING.
8191 ;FIND SWITCH POINTED TO BY WORD AFTER
8192 ;PUSHJ P,LSWREM AND UNLOCK IT
8213 LSWDEL: PUSH P,U ;REMOVE SWITCH FROM HEAD OF LIST
8214 MOVE U,USER ;DO NOT ATTEMPT TO UNLOCK IT
8229 ;POP C(T)'TH FROB BACK
8230 LSWPON: PUSHJ P,LSWBAK
8234 ;DELETE C(T)'TH FROB BACK
8235 LSWDLN: PUSHJ P,LSWBAK
8241 TLO U,400000 ;SIGNAL NOT PCLSR IN CASE OF LSWPPP
8245 SOJE Q,LSWBA3 ;UNLOCKING FIRST FROB
8250 PUSH P,LSWPR(U) ;DON'T WORRY, YOU CAN'T GET PCLSR'ED JUST BELOW
8257 LSWBA3: MOVE T,LSWPR(U)
8261 SUBTTL VARIOUS RETURNS
8307 CKOCJ1: CONO PI,CLKON
8311 CLKONJ: CONO PI,CLKON
8315 CLKOPJ: CONO PI,CLKON
8319 OMXONJ: CONO PI,OMXON
8324 TTYONJ: CONO PI,TTYON
8327 IFN PTRP, PTRONJ:: PTPONJ::
8328 LPTONJ: CONO PI,LPTON
8335 UTCONJ: CONO PI,UTCON
8361 SUBTTL UUO PROCESSOR
8369 .STATUS=UUOMIN+6_27.
8370 .ACCESS=UUOMIN+7_27.
8379 ;REPEAT OVER USET NAMES FROM 0 TO 77.
8381 IRPS X,,[UPC VAL TTY FLS UNAME JNAME MASK USTP
8382 PIRQC INTB MEMT SV40 IPIRQ APIRQ SNAME PICLR
8383 MARA MARPC UUOH UIND RUNT MSK2 IFPIR APRC
8384 CNSL UTRP IIFPI AIFPI IMASK AMASK IMSK2 AMSK2
8385 JPC OPC RTMR HSNAME BCHN MPVA IDF1 ADF1
8386 IDF2 ADF2 DF1 DF2 OPTION 40ADDR TVCREG
8387 TTST TTS1 TTS2 WHO1 WHO2 WHO3 SUPPRO TR1INS
8388 TR2INS MBOX MBO1 EBOX EBO1 XUNAME XJNAME FTL1 FTL2]
8393 ;REPEAT OVER USET NAMES 600 AND UP.
8395 IRPS X,,[PAGRAN PAGAHD SERVER]
8399 ;NOTE: OPER'S BELOW ARE 8 PER LINE
8400 ; USE UP ILUUO'S BEFORE ADDING TO END
8401 ; THE FOLLOWING SHOULD GO AWAY EVENTUALLY
8409 IRPS X,,[ITYI LISTEN SLEEP SETMSK SETM2 DEMON CLOSE
8410 UCLOSE ATTY DTTY IOPUSH IOPOP DCLOSE DSTOP RDTIME
8411 RDSW GUN UDISMT GETSYS IPDP GETLOC SETLOC DISOWN
8412 DWORD DSTEP GENSYM LOGOUT REALT WSNAME UPISET RESET
8413 ARMOVE DCONTIN CBLK ASSIGN DESIGN RTIME RDATE HANG
8414 EOFC IOTLSR RSYSI SUPSET PDTIME ARMRS UBLAT IOPDL
8415 ITYIC MASTER VSTST NETAC NETS REVIVE DIETIM SHUTDN
8416 ARMOFF NDIS FEED EVAL REDEF IFSET UTNAM UINIT
8417 RYEAR RLPDTM RDATIM RCHST RBTC DMPCH SWAP MTAPE
8424 IRPS X,,[DISMIS LOSE TRANAD VALUE UTRAN CORE TRAND
8425 DSTART FDELE DSTRTL SUSET LTPEN VSCAN POTSET]
8428 ;THESE ARE THE SYMBOLS USED BY MIDAS AND DDT. THEY ALSO
8429 ;EXIST IN SYS:ITS DEFS.
8430 ;SYMBOLS SHOULD BE LEFT IN CURRENT ORDER OR DDT WILL LOSE
8431 SYSYMB: USTIRP [SQUOZE 44,.R!X
8441 USTIR1 [SQUOZE 44,.R!X
8443 USTIRP [SQUOZE 44,.S!X
8445 USTIR1 [SQUOZE 44,.S!X
8448 GLOSYM [IOT,OPEN,OPER]
8462 OPRIRP [IFSN X,ILUUO,[.!X=.OPER ZZ
8474 .!X=.CALL .IRPCNT+1,
8479 GLOSYM [USET,BREAK,STATUS,ACCESS]
8482 ;THESE SYMBOLS ARE USED BY DDT, SO THE USER CAN OPEN .PIRQC, ETC.
8483 ;BEGINNING FOR .GETSYS (USYMS)
8501 SYSUSE==.-1 ;END FOR .GETSYS (USYMS)
8503 ;SIXBIT NAME TABLES FOR WHO LINE GENERATION.
8504 ;ALSO USED BY PEEK FOR PRINTING OUT JOBS' STATUS.
8506 OPRSXB: SIXBIT/OPER/
8511 CALSXB: SIXBIT/CALL/
8518 IRPS X,,IOT OPEN OPER CALL USET BREAK STATUS ACCESS
8523 ;MACRO TO SAVE ACS AS APPROPRIATE FOR OUR CPU, LOAD UP U,
8524 ;CHECK VARIOUS ERROR CONDITIONS.
8528 BUG AWFUL,[UUO WITH PI IN PROGRESS]
8530 UMOVEM U,17 ;SAVE 17
8531 SKIPGE U,USER ;LOAD CURRENT USERS INDEX,
8532 BUG AWFUL,[UUO IN NULL JOB]
8533 UMOVEM T,16 ;SAVE LOC 16 FOR USER
8535 XCTR XBW,[BLT T,15] ;SAVE REST OF ACS IN USERS SHADOW 0-15
8540 BUG AWFUL,[UUO IN NULL JOB]
8541 LDB T,[330300,,MUUOCX(U)]
8543 BUG AWFUL,[UUO WHILE IN AC BLK ],DEC,T
8547 ; UUO AND ILLOP TRAP HANDLER
8549 ;EITHER DISPATCHES TO APPROPRIATE UUO ROUTINE,
8550 ; RETURNS CONTROL TO USERS UUO ROUTINE, GOES TO ILLOP, USRTRP, OR USRIOT.
8551 ;CODE ON THIS PAGE IS INTERRUPTABLE AT ANY POINT
8553 ;COME HERE TO RETURN A UUO TO THE USER. RESTORES USER ACS W THROUGH U ONLY.
8554 USRUUO: CAIG U,LUBLK
8555 BUG AWFUL,[RETURNABLE UUO FROM SYS OR CORE JOB,PC=],OCT,UUOH
8558 BUG AWFUL,[RETURNABLE UUO FROM EXEC MODE,PC=],OCT,UUOH
8560 MOVE P,USRPDL(U) ;IN CASE AN XCTR FAULTS.
8561 XCTR XR,[HLRZ H,1(W)]
8562 CAIE H,(JSR) ;ELSE OK ONLY IF OPCODE IN 41 IS 0 OR JSR.
8563 JUMPN H,ILUUO ;THIS IS IN CASE USER IS HANDLING USER-UUO'S WITH PUSHJ
8564 ;AND HIS UUOH ISN'T ABLE TO BE JSR'D TO.
8565 XCTR XR,[HRRZ H,1(W)]
8566 JUMPE H,ILUUO ;0 ISN'T ACCEPTABLE AS UUOH ADDRESS.
8568 UMOVEM T,(W) ;ALL IS LEGAL; PLANT UUO INTO USERS "40".
8569 MOVE T,UUOH ;SIMULATE A JSR AT USER'S "41"
8572 HRRM H,UUOH ;SET TO RETURN TO USER AT FIRST INSTRUCTION OF UUO HANDLER
8577 ULEAVE: USRCTX ;SELECT USER MODE AC BLOCK IF NEC.
8581 ;THE FOLLOWING BLOCK OF LOCATIONS IS SWITCHED WITH SOME USER VARS
8583 UEXIT: JRST 2,@XUUOH ;EXIT FROM UUO (FOR KL-10, POINTS TO APPROPRIATE
8586 CLUSAV: MOVEM U,AC17S ;CLOCK SAVE OF U
8589 CLCXSV: DATAI PAG,CLCX ;CLOCK LEVEL CONTEXT SAVE
8593 XUUOH: 0 ;UUO AND ILLOP TRAP GETS HERE - UUOH0 MUST BE . + 1.
8596 UEXND:: ;END OF SWAPPED UEXIT BLOCK.
8601 MUUOT1: SKIPGE UTRAPM(U) ;IF SUPERIOR WANTS TO CATCH UUOS, THIS IS FATAL INT.
8603 SKIPGE T,FORTY ;PICK UP THE UUO OR ILLOP
8607 JRST USRUUO ;NOT A SYSTEM CALL, GIVE TO USER
8610 ;HERE WITH UUO TO BE HANDLED BY SYSTEM IN T
8611 ILLOP1: JUMPN U,UUOH1
8612 MOVEI Q,0 ;SAVE SYS JOB EXEC MODE LSWPR PNTR
8615 UUOH1: SKIPE LSWPR(U)
8617 MOVEM T,LSUUO(U) ;SAVE UUO FOR DEBUGGING PURPOSES
8618 LSH T,-27. ;RIGHT JUSTIFY OP CODE
8619 SKIPL UUODSP-UUOMIN_-27.(T)
8624 UUOTR3: SETZM SYSCVL(U) ;DIDN'T GET INTO SYSTEM VIA .CALL
8625 MOVE P,USRPDL(U) ;SET UP USER PDL
8626 HRRZ C,FORTY ;PICK UP EFFECTIVE ADDRESS OF UUO
8627 LDB R,[270400,,FORTY] ;PICK UP AC FIELD OF UUO
8628 MOVEM R,UUAC(U) ;SAVE AC FLD
8629 PUSHJ P,@UUODSP-UUOMIN_-27.(T) ;DISPATCH ON UUO TYPE
8630 JRST URET ;NORMAL RETURN (NON SKIP)
8632 IFE KA10P, MOVE U,USER ;(SINCE UUOH IS IN THE USER VARIABLES)
8633 AOS UUOH ;UUO ROUTINE SKIPPED, AOS USER RETURN POINT
8635 MOVE A,PIRQC(U) ;CHECK FOR RETURNING TO USER WITH PCLSR'ING FATAL
8637 TDNE A,[BADBTS&#<%PIC.Z\%PIDIS>] ;A FEW BITS ARE FATAL BUT SET
8639 JRST [ HRRZ A,UEXIT ;INT SET, MAKE SURE UEXIT IS CLOBBERED
8640 IFN KA10P, CAIE A,ONEPRO ;TO A LOCATION WHICH WILL CHECK PIRQC.
8641 IFN KS10P, CAIE A,ONEPR4
8652 URET2: SKIPE LSWPR(U)
8655 MOVEI T,0 ;RESTORE SYS JOB EXEC LSWPR
8659 BUG ;RETURNING TO USER MODE WITH CLOCK OFF
8662 XCTR XBR,[BLT U,U] ;RESTORE USERS ACS FROM USERS SHADOW 0-17
8666 URETC: REPEAT NULBLK/2,[
8667 SKIPN CONC LSWB,\<2*.RPCNT>,+1(U)
8668 SKIPE CONC LSWB,\<2*.RPCNT+1>,+1(U)
8672 SKIPE CONC LSWB,\<NULBLK-1>,+1(U)
8677 URPCL1: SKIPN LSUUO(U)
8678 JRST URET2 ;DIDN'T REALLY MISS MARK (DUE TO FINSET)
8679 SETOM PCLNXT ;MISSED MARK, REINITIALIZE
8684 UUOTRO: MOVE T,FORTY
8687 USRIOT: MOVSI T,(UIOT) ;I/O INST TURNS INTO PSEUDO UUO TO DISPATCH ON
8692 ;HANDLE UUOS EXECUTED FOR TRAPS (PDL OV, ARITH OV, ONE PROCEED).
8693 ;MOST ARE AS USUAL, BUT OPCODE 0 IORM'S ADDRESS INTO PIRQC.
8694 ;NOTE: LOSER IS NOT PERMITTED TO USE OPCODE 0 - SEE USTR1I, ETC.
8699 JRST MUUOT1 ;IF OPCODE ISN'T 0, TREAT UUO NORMALLY (STARTING A
8701 MOVSI A,%PSTR1+%PSTR2
8702 ANDCAB A,UUOH ;TURN OFF TRAP FLAGS, GET PC
8705 TLNE A,%PCFOV ;DISTINGUISH FIXED AND FLOATING OVERFLOW.
8707 MUUOT2: MOVE A,MSKST(U)
8709 AND T,A ;INTS SETTING WHICH AREN'T DISABLED
8714 IOR A,[BADBTS] ;MASK FOR INTS WHICH AREN'T DEFERRED
8716 JRST ONEPR1 ;TAKE INT
8717 JRST URET ;IGNORE INT
8719 MUUOEX: BUG AWFUL,[MUUO IN EXEC MODE, PC=],OCT,EPT+425
8720 ;UUO IN EXEC MODE NOT IN SYS JOB
8723 BUG AWFUL,[LUUO IN EXEC MODE,PC=],OCT,LUUOEX
8726 BUG AWFUL,[TRAP IN EXEC MODE,PC=],OCT,ILLTRP
8731 60H: 0 ;TRAPS FROM 60
8733 60H0: UUOSAV ;IF WE LOSE PROCESSOR HERE, 60 GETS COPIED INTO 40,
8734 ; 60H IS COPIED INTO UUOH, AND UPC GETS MOVED INTO
8736 60HE: CONO PI,CLKOFF
8745 ;COME HERE FROM UEXIT WHEN USER IS BEING PCLSR'ED
8746 ; KA10 - ALL USER ACS ARE IN MACHINE ACS AND IN UUOACS
8747 ; KL10 & KS10 - ALL USERS ACS ARE IN AC BLOCK 1
8749 ONEFLS: CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
8751 MOVE U,USER ;GET INDEX OF CURRENT USER
8752 ONEPR2: SKIPE T,RPCL(U) ;SKIP IF NO RPCLSRING OCCURING
8753 JRST ONEFL2 ;RPCLSRING GOING ON
8754 ONEPR1: MOVE U,USER ;GET INDEX OF CURRENT USER
8755 CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
8758 MOVEI T,AC0S(U) ;PUT USER ACS INTO SWAP OUT ACS
8759 XCTR XBR,[BLT T,AC17S(U)]
8761 MOVEM T,UPC(U) ;SIMULATE JRST 2,@UUOH
8762 IFN KA10P, MOVE T,[JRST 2,@UUOH]
8767 MOVEM T,UEXIT ;RESTORE UEXIT
8769 MOVE U,USER ;AS IF HAD RETURNED TO USER THEN CLKBRK
8770 ;EXCEPT THAT AC'S ARE ALREADY STORED IN AC0S
8771 JRST UFL6 ;RESCHEDULE, ETC
8773 ONEFL2: JUMPG T,[JRST 4,.] ;LOSEY LOSEY (SHOULD NOT TRY TO EXIT WHILE TRYING TO RPCLSR SOMEONE)
8774 MOVE A,FLSINS(T) ;GET FLSINS OF USER SUPPOSEDLY RPCLSRING YOU
8775 SUBI A,RPCL(T) ;HIS FLSINS SHOULD BE A SKIPE OF HIS RPCL
8776 CAME A,[SKIPE] ;SKIP IF HE HAS THE RIGHT FLSINS
8777 JRST 4,. ;LOSEY LOSEY
8778 CLEARM FLSINS(T) ;ASSURE NO INTERRUPT
8779 SETZM RPCL(U) ;ACS IN UUO ACS CLOCK OFF
8780 AOS USTP(U) ;STOP SELF
8781 SETZM RPCL(T) ;UNHANG LOSER RPCLSR'ING YOU
8784 ;ROUTINES TO GIVE THE RUNNING JOB AN INTERRUPT AND ABORT THE CURRENT INSTRUCTION
8786 TTYLOS: SKIPA T,[%PITTY] ;JOB WHOSE %TBINT IS SET TRIED TO USE ITS TTY WHEN DIDN'T OWN IT
8787 IOADC: MOVEI T,%PIMPV ;I/O UUO MEMORY PROTECT VIOLATION
8790 ABREAK: MOVEI T,%PIBRK ;.BREAK - INTERRUPT TO SUPERIOR
8791 ILLOP4: IORM T,PIRQC(U)
8795 IOCERF: ;ADDRESS OF FIRST IO CHANNEL ERROR
8798 REPEAT ZZ,CONC IOCER,\.RPCNT+MIOTER,: JSP T,IOCERX
8799 IFG NIOTER-9,[REPEAT NIOTER-9,CONC IOCR,\.RPCNT+MIOTER+9,: JSP T,IOCERX
8801 IFN 0, IOCER1: IOCER2: IOCER3: IOCER4: IOCER5: IOCER6: IOCER7: ;FOR @
8802 .ALSO IOCER8: IOCER9: IOCR10: IOCR11: IOCR12: IOCR13: IOCR14:
8805 IOCERX: CONSZ PI,77400
8806 JRST 4,. ;ERR WITH PI IN PROGRESS
8810 DPB TT,[BCHPTR] ;STORE LAST CHNL IN ERROR
8812 DPB T,[330600,,IOCHST(TT)]
8813 IOCERR: MOVEI T,%PIIOC
8817 ILUUO: SKIPA T,[%PIILO] ;ILLEGAL SYSTEM UUO
8818 TRPDEV: ;ATTEMPTED USE OF TRAP DEVICE
8819 USRTRP: MOVSI T,(%PITRP) ;SYSTEM UUO IN TRAP MODE
8822 IORM T,PIRQC(U) ;GIVE USER INT BIT
8824 MOVE T,OPTION(U);PC CLOBBERED TO HERE IF MPV IN EXEC MODE - INTR OUT OF UUO
8825 TLNN T,%OPOPC ;UNLESS USER HAS SAID NOT TO,
8826 AOS UUOH ;UNDO SOS THAT PCLSR'ING WILL DO; PC SHOULD END UP -> AFTER UUO.
8827 UUOER2: CONO PI,CLKON ;THERE HAD BETTER BE A CLASS 1 OR 2 INT. PENDING.
8829 SETZM SCHMNY ;CAUSE FULL SCHEDULE SO INTERRUPT WILL BE SEEN
8830 JFCL ; (IT'S A CROCK TO HAVE TO DO THIS, BUT HARD TO FIX)
8831 PUSHJ P,UFLS ;LET THE INTERRUPT PCLSR US.
8834 UUOER1: MOVE U,USER ;UUOERR ASSUMING %OPOPC
8839 ILEXPF: CONO PI,CLKOFF ;GET HERE AFTER EXEC PAGE FAULT TAKEN ON XCTRI
8841 MOVSI A,1770 ;CLEAR FAULT REASON BITS
8846 IFE KA10P, ILEXPF==ILUUO ;NO CLEANUP NECESSARY
8850 ;AT DISPATCH TIME, P HAS UPDL, C HAS RH OF 40
8851 ;R HAS AC FIELD OF UUO, U HAS USER INDEX
8853 UUODSP: SETZ AIOT ;SETZ FLAGS UUO'S TO REFLECT TO USER WHEN %OPDEC OPTIONS
8854 SETZ AOPEN ;IN EFFECT. THEY ARE THE UUOS WHICH OVERLAP DEC
8862 IF2,IFN <UIOT-UUOMIN>_-27.+UUODSP-.+1,.ERR LOSE AT UUODSP
8865 NIOT: CAIL W,3 ;SET IOTBTS TO USER'S 3RD ARG, OR TO 0.
8868 HRRZ C,B ;ADDRESS OF 2ND ARG
8870 SKIPA C,[SETZ] ;USING OUTPUT ARG INSTEAD OF INPUT, FOR UNIT INPUT MODE
8872 AOSA (P) ;GOING TO SUCCEED NOW
8873 JRST OPNL30 ;NOT ENOUGH ARGS
8877 AIOT: SETZM CTLBTS(U)
8879 ADDI R,IOCHNM(U) ;GET IOCHNM WD ADDR IN R.
8884 HLRZ A,(R) ;PICK UP LEFT HALF (DEVICE DEPENDENT)
8885 HRRZ B,(R) ;PICK UP RIGHT HALF (INDEX INTO IOTTB, ETC.)
8886 MOVE D,IOTTB(B) ;GO TO ROUTINE FOR PARTICULAR DEV AND MODE
8887 TLNE D,%IOTOT+%IOTBK+%IOTSP ;BUT FOR "NORMAL" UNIT MODE INPUT, SPECIAL:
8889 XCTR XRW,[MOVES (C)] ;MAKE SURE XCTR XW, BELOW WON'T PCLSR.
8891 PUSHJ P,(D) ;CALL IOT ROUTINE, EXPECTING VALUE IN W.
8892 AIOT3: JRST AIOT2 ;NOTE AIOT3 MAY BE CHECKED FOR ON PDL.
8897 SKIPA A,W ;RETURNING IN NEW SYSTEM-CALL STYLE
8903 AACCES: HRRZ A,UUAC(U)
8906 MOVEM T,LSCALL(U) ;IN CASE PASSED TO JOB DEVICE
8909 JRST IOCER8 ;FOR .ACCESS, SIGNAL FAILURE WITH IOC ERROR.
8910 POPJ P, ;ONLY POSSIBLE FAILURE IS CHANNEL NOT OPEN.
8912 NACCES: MOVEI T,AIOCAL ;GET <CLSTB BITS>,,<IOCHNM WD ADDR> IN R
8916 NACCE1: TLNN R,%CLSQ\%CLSU\%CLSFU
8918 HRRM B,IOCHST-IOCHNM(R) ;STORE USR .ACCESS POINTER
8920 JRST POPJ1 ;NOT DISK
8922 MOVEM B,QRADAD(I) ;STORE ACCESS POINTER FOR DSK
8924 IORM D,QSRAC(I) ;SET ADR HAS BEEN HACKED FLAG
8927 ;SIOT SYMBOLIC SYSTEM CALL - IOT A STRING.
8928 ; 1ST ARG CHANNEL NUMBER.
8929 ; 2ND ARG BYTE POINTER
8930 ; 3RD ARG STRING LENGTH
8931 ; 4TH (OPTIONAL) ARG DEVICE-INDEPENDENT CONTROL BITS
8932 ; CTLBTS DEVICE DEPENDENT CONTROL BITS
8934 NSIOT: TLNN B,1000 ;OBJECT IF B.P. OR COUNT IS IMMEDIATE.
8941 TLNE D,%IOTBK+%IOTSP ;SIOT ALLOWED ONLY ON UNIT MODE CHANNELS.
8942 JRST OPNL12 ;"MODE NOT AVAILABLE".
8943 XCTR XRW,[MOVES A,(B)] ;ENSURE BYTE POINTER WRITABLE
8944 TLNE A,(@) ;CAN'T HACK BYTE POINTER WITH INDIRECT ADDRESSING
8945 JRST OPNL33 ;MEANINGLESS ARGS
8947 PUSHJ P,NSIOT9 ;HACK INDEXING
8948 XCTR XRW,[MOVES A,(C)] ;ENSURE BYTE COUNT WRITABLE
8949 JUMPLE A,POPAJ1 ;0 BYTES TO BE XFERED => SUCCEED IMMEDIATELY.
8951 MOVE TT,B ;IN CASE SPECIAL ROUTINE WANTS TO CALL SIOKT
8952 TLNE D,%IOTBP ;IF THERE'S A SPECIAL DEVICE ROUTINE FOR SIOT,
8953 JRST -1(D) ;GO TO IT.
8954 ;THIS CALL IS LEGAL AND ORDINARY. LOOP, CALLING THE UNIT MODE ROUTINE.
8958 PUSH P,D ;PUT ALL IMPORTANT INFO ON STACK FOR MAIN LOOP
8959 HRRZS (P) ;TO LOOK AT.
8962 JRST NSIOIL ;INPUT AND OUTPUT PART HERE
8963 NSIOOL: UMOVE A,@-3(P)
8964 IBP A ;THIS HAIR IS TO AVOID INCREMENTING THE USER'S COPY
8965 UMOVE D,(A) ;OF THE BYTE POINTER BEFORE THE BYTE HAS BEEN
8966 HRRI A,D ;FINALLY TAKEN WITH NO POSSIBILITY OF PCLSR'ING OUT.
8967 LDB D,A ;CAN'T USE XCTR XR,[LDB D,A] BECAUSE ON THE KA10
8968 MOVE C,[SETZ D] ;THAT WOULD USE THE LOSER'S AC A.
8970 MOVE A,-4(P) ;SET UP ARGS FOR IOT ROUTINE; C HAS ADDR OF VALUE.
8971 PUSHJ P,@-1(P) ;CALL THE IOT ROUTINE.
8972 XCTR XRW,[IBP @-3(P)] ;NOW STEP THE B.P. AND COUNT.
8973 XCTR XRW,[SOS A,@-2(P)]
8977 NSIOIL: UMOVE A,@-3(P)
8978 IBP A ;MAKE SURE NO FAULT IDPB'ING THE BYTE
8979 XCTR XRW,[MOVES (A)]
8980 MOVE R,(P) ;NOW GET THE ARGS FOR THE IOT ROUTINE,
8982 PUSHJ P,@-1(P) ;AND CALL IT, WITH VALUE COMING IN W.
8983 JRST NSIOI3 ;NO SKIP => WE WIN.
8984 JRST NSIOTX ;1 SKIP => THERE'S NO INPUT; RETURN WITHOUT STEPPING B.P.
8985 ;2 SKIPS => THIS BYTE IS THE LAST ONE AVAILABLE.
8986 XCTR XBYTE,[IDPB W,@-3(P)]
8987 XCTR XRW,[SOS @-2(P)]
8990 NSIOI3: XCTR XBYTE,[IDPB W,@-3(P)]
8991 XCTR XRW,[SOS A,@-2(P)]
8993 NSIOTX: SUB P,[5,,5]
8996 NSIOT9: EXCH A,R ;INDEXED BYTE POINTER, EVAL INDEX ONCE AND WRITE BACK
9002 ; ROUTINES TO SIMULATE SOME I/O INSTRUCTIONS WHEN EXECUTED BY USER
9004 IFE KS10P,[ ; KS10 will never have any devices so we might as well punt
9005 ; this sham right from the start.
9007 AUIOT: MOVE I,FORTY ;GET I/O INST
9008 ANDI R,7 ;GET IOT TYPE FIELD
9009 LDB J,[320700,,FORTY]
9010 LDB D,[420200,,IOTTYP(R)]
9011 JRST @IOTTYP(R) ;DISPATCH ON TYPE
9013 IOTTYP: 000000,,IOTTY3 ;BLKI
9014 000000,,IOTTY2 ;DATAI
9015 200000,,IOTTY3 ;BLKO
9016 200000,,IOTTY2 ;DATAO
9017 600000,,IOTTY2 ;CONO
9018 400000,,IOTTY2 ;CONI
9019 400000,,IOTTY1 ;CONSZ
9020 400000,,IOTTY1 ;CONSO
9022 IOTTY1: CAIN J,177 ;IF EQ INST WAS 7777XX,,XXXXXX
9023 JRST ILUUO ;USER HAS EXECUTED A SMALL NEGATIVE NUMBER
9030 JRST IOTTY2 ;SPECIAL BLKI THAT IS TREATED LIKE DATAI
9032 TLO I,40 ;BLOCK TYPE, TURN ON BIT TO CONVERT TO UNIT
9033 UMOVE C,(I) ;GET BLOCK POINTER
9034 ADD C,[1,,1] ;ADVANCE
9035 TLNE C,-1 ;SKIP IF OVERFLOW
9036 AOS (P) ;CAUSE RETURN TO SKIP
9037 UMOVEM C,(I) ;STORE BACK
9038 HRR I,C ;MODIFY INST ADR TO RH OF BLOCK POINTER
9039 IOTTY2: SKIPL C,DCHNTB(J)
9044 IOTTYB: XCTR XRW,I ;DO IOT
9045 POPJ P, ;NORMAL RETURN
9046 JRST POPJ1 ;IOT SKIPPED RETURN
9048 IOTTYA: SKIPGE DCHNTC(J)
9049 JRST ILUUO ;SUSPICIOUS DEVICE
9054 IFN KS10P, AUIOT==:ILUUO ; For now.
9056 IFN 0,[ ; Simple IO instruction simulating for the KS should look
9057 ; like this. Unfortunately XCTR XRW,[APRID 100] clobbers
9058 ; exec location 100. Further investigation is needed
9059 ; before figuring out how to deal with this.
9061 AUIOT: LDB R,[271500,,FORTY] ; Get opcode and AC.
9062 CAIE R,APRID_-27 ; For now this is the only instruction we
9063 ; simulate on the KS
9065 XCTR XRW,FORTY ; Do it
9066 POPJ P, ; Return normally
9067 JRST POPJ1 ; It skipped (well APRID can't, but perhaps
9068 ; someday something else will)
9071 SUBTTL .SUSET, .USET, .CALL USRVAR
9073 ;COMMON CODE FOR USRVAR, TTYVAR, ETC. SYMBOLIC SYSTEM CALLS
9074 ;PUSHJ P,VARCAL WITH FIRST ARG DECODED INTO H,I,J,R; B,C,W,U SET UP AS IN .CALL
9075 ;NOTE B IS A POINTER TO THE SECOND ARG (IN BLOCK MODE IS WRITTEN BACK)
9076 ;POPJS (OR PUSHJS IN THE CASE OF BLOCK MODE) BACK WITH E CONTAINING
9077 ;VARIABLE SPEC, D INPUT DATA, W INSTRUCTION TO HACK IT (0 TO READ INTO A,
9078 ;OTHERWISE OP D, WITH RH CLEAR WHERE OP IS MOVEM, ANDCAM, ADDM, ETC.)
9080 VARCAL: HRRZ E,B ;USE 2ND ARG AND NUM OF ARGS TO DETERMINE TYPE OF OPERATION
9082 JRST VARCA1 ;IMMEDIATE 2ND ARG
9083 UMOVE E,(B) ;GET VALUE OF 2ND ARG
9086 JRST VARCBL ;BLOCK MODE (2ND ARG LOOKS LIKE AOBJN POINTER)
9087 VARCA1: EXCH D,C ;D GETS 3RD ARG, INPUT DATA
9089 JRST VARCA2 ;JUMP IF IMMEDIATE INSTRUCTION MODE
9090 CAIGE W,3 ;SKIP IF WRITING
9091 TDZA W,W ;W 0 FOR READING
9092 MOVSI W,(MOVEM D,) ;SIMPLE CASE OF WRITING (SEE VARCBL FOR HAIR)
9093 POPJ P, ;CALLER WILL DO OPERATION AND POPJ1 OR OPEN-LOSS
9095 VARCA2: ADD P,[2,,2] ;IMMEDIATE INSTRUCTION MODE. MAKE STACK SAME AS AT VARCAL.
9096 TLNN C,-1 ;E HAS VARIABLE SPEC
9097 MOVSS C ;C GETS INSTRUCTION
9098 PUSHJ P,VARCA3 ;PERFORM THE INSTRUCTION
9099 JRST POP3J1 ;TAKE GOOD RETURN FROM THE CALL
9101 VARCBL: PUSH P,J ;BLOCK MODE. SAVE J WHICH SOME SUSETS CLOBBER
9102 PUSH P,B ;SAVE POINTER TO AOBJN POINTER TO SPEC,INSN PAIR LIST
9103 XCTR XRW,[MOVES B,@(P)] ;GET AOBJN POINTER, TEST WRITEABILITY
9104 VARCB1: UMOVE E,(B) ;GET VARIABLE SPEC
9105 UMOVE C,1(B) ;GET "INSTRUCTION"
9106 MOVE J,-1(P) ;GET DECODED FIRST ARG OR WHATEVER (SOME USRVAR ROUTINES CLOBBER J)
9107 PUSHJ P,VARCA3 ;PERFORM THE INSTRUCTION
9109 XCTR XRW,[ADDB B,@(P)] ;ADVANCE AOBJN POINTER
9110 JUMPL B,VARCB1 ;MORE STUFF TO DO
9111 JRST POP3J1 ;POINTER COUNTED OUT, POP B, J, PUSHJ TO VARCAL
9113 VARCA3: EXCH C,R ;HERE TO PERFORM INSTRUCTION IN C
9115 PUSHJ P,ASCIND ;EVALUATE INSTRUCTION'S EFFECTIVE ADDRESS
9117 LDB B,[410300,,C] ;GET MAJOR PDP10 OPCODE CLASS
9119 VARCBE ;0 UUO ILLEGAL
9120 VARCBE ;1 FP/BYTE ILLEGAL
9121 VARCB2 ;2 MOVE/ADD/SUB
9122 VARCBE ;3 CAM ETC. RESERVED FOR .HANGING IN THE FUTURE
9124 VARCBE ;5 HWT ILLEGAL
9126 VARCBE ;7 IOT ILLEGAL
9128 VARCBE: SUB P,[4,,4] ;POP PUSHJ TO VARCA3, B, J, PUSHJ TO VARCAL
9129 JRST OPNL33 ;BAD ARG
9131 VARCB6: TLNE C,006000 ;TEST INSTRUCTION - SKIP IF NO SKIP
9132 JRST VARCBE ;SKIPPING TESTS RESERVED FOR FUTURE .HANGS
9133 TLNE C,010000 ;SKIP IF IMMEDIATE
9134 XCTR XR,[SKIPA D,(C)]
9136 TLNE C,001000 ;SKIP IF TDX OR TRX
9138 LDB C,[370200,,C] ;GET MODIFICATION TYPE
9139 XCT (C)[JRST VARCBE ;NO MODIFICATION OBVIOUSLY AN ERROR
9140 MOVSI W,(ANDCAM D,) ;TXZ
9141 MOVSI W,(XORM D,) ;TXC
9142 MOVSI W,(IORM D,)] ;TXO
9145 VARCB4: TLNE C,002000 ;BOOLEAN INSTRUCTION - OK IF RESULT TO AC
9147 TLNN C,001000 ;SKIP IF IMMEDIATE
9148 XCTR XR,[SKIPA D,(C)]
9150 HLLZ W,C ;SET UP OPCODE TO HAVE A+M EXCHANGED
9151 TLZ W,003777 ;AND RESULT TO BE SENT TO MEMORY
9155 TLO W,(<002000,,> D,)
9158 VARCB2: SETZB W,D ;MOVE/ADD/SUB GROUP
9161 JRST VARCBB ;SIMPLY READING
9163 JRST VARCBE ;RESULT MUST BE TO AC
9164 TLZ C,(0 17,) ;CHANGE AC FIELD TO D
9166 TLNE C,060000 ;SKIP IF MOVE GROUP
9168 XCTR XR,C ;FETCH OPERAND, DO MODIFICATION IF CALLED FOR (MOVN)
9169 MOVSI W,(MOVEM D,) ;OPERATION WILL BE SIMPLE STORE
9172 VARCB5: TLC C,070000
9174 JRST VARCBE ;NOT ADD/SUB
9175 XCTR XR,C ;ADD TO/SUBTRACT FROM ZERO IN D
9176 MOVSI W,(ADDM D,) ;DROP INTO VARCBA
9178 ;HERE WITH E, W, D ALL SET UP FOR WRITING.
9179 VARCBA: PUSHJ P,@-3(P) ;CALL BACK TO CALLER OF VARCAL
9180 JRST POP4J ;LOST, POP PUSHJ TO VARCA3, B, J, VARCAL, TAKE ERR RETURN
9181 POPJ P, ;WON, RETURN FROM VARCA3
9183 ;HERE WITH E AND W SET UP FOR READING.
9184 VARCBB: PUSH P,C ;SAVE ADDRESS TO BE READ INTO
9185 XCTR XRW,[MOVES (C)] ;NO FAULT. INSURANCE OF WRITEABILITY.
9186 PUSHJ P,@-4(P) ;GET VALUE OF VARIABLE INTO A
9187 JRST POP5J ;LOST POP C, VARCA3, B, J, VARCAL, TAKE ERR RETURN TO USER
9188 POP P,C ;WON, STORE RESULT INTO USER
9190 POPJ P, ;AND RETURN FROM VARCA3
9192 USETBT: 420200,,USETL(E) ;BYTE POINTER TO UENTRY FIELD A
9193 400200,,USETL(E) ; " B
9194 200200,,USETL(E) ; " C
9195 160200,,USETL(E) ; " D
9197 USETRL: 221600,,USETL(E) ;BYTE POINTER TO UENTRY FIELD E
9198 001600,,USETL(E) ; " F
9200 ;IN EACH UENTRY ENTRY: A IS THE METHOD FOR USET READ
9201 ; B IS THE METHOD FOR SUSET READ
9202 ; C IS THE METHOD FOR USET SET
9203 ; D IS THE METHOD FOR SUSET SET
9204 ; E & F ARE USED BY THE METHODS AS LISTED BELOW
9205 ;METHOD 0 = ILLEGAL MODE
9206 ;METHOD 1 = USE F AS RELATIVE LOC OF VAR
9207 ;METHOD 2 = USE E AS ROUTINE TO TRANSFER TO
9208 ;METHOD 3 = USE F AS ROUTINE TO TRANSFER TO
9210 DEFINE UENTRY A,B,C,D,E,F
9212 A_20+B_16+E,,C_20+D_16+F
9214 IFN 777774&<A\B\C\D>,[PRINTX /UENTRY A,B,C,D TOO BIG
9215 /] IFN 740000&<E\F>,[PRINTX /UENTRY E,F TOO BIG
9216 /] IFSE [E!F],[PRINTX /UENTRY E,F NULL
9221 USETL: UENTRY 1,1,2,0,UPCSET,UPC-USRSTG ;.UPC
9222 UENTRY 1,1,1,1,,VALUE-USRSTG ;.VAL
9223 UENTRY 3,3,2,2,USTTY,URTTY ;.TTY
9224 UENTRY 1,1,0,0,,FLSINS-USRSTG ;.FLS
9225 UENTRY 1,1,0,2,UUNAME,UNAME-USRSTG ;.UNAME
9226 UENTRY 1,1,2,2,UJNAME,JNAME-USRSTG ;.JNAME
9227 UENTRY 1,1,2,2,USMASK,MSKST-USRSTG ;.MASK
9228 UENTRY 1,1,2,0,USTOP,USTP-USRSTG ;.USTP
9230 UENTRY 1,1,2,2,USPIRQ,PIRQC-USRSTG ;.PIRQC
9231 UENTRY 2,2,0,0,UGSUPR, ;.INTB
9232 UENTRY 1,1,2,2,USMEMT,HUSRAD-USRSTG ;.MEMT
9233 UENTRY 1,1,0,0,,SV40-USRSTG ;.SV40
9234 REPEAT 2,UENTRY 1,1,2,2,IAPIRQ,PIRQC-USRSTG ;.IPIRQ/.APIRQ
9235 UENTRY 1,1,2,2,USYNST,USYSNM-USRSTG ;.SNAME
9236 UENTRY 1,1,2,2,UPISET,PICLR-USRSTG ;.PICLR
9238 UENTRY 2,2,3,3,URMAR,USMAR ;.MARA
9239 UENTRY 1,1,1,1,,UMARPC-USRSTG ;.MARPC
9240 UENTRY 1,1,0,0,,SUUOH-USRSTG ;.UUOH
9241 UENTRY 2,2,0,0,UINDEX, ;.UIND
9242 UENTRY 1,2,0,0,UTRNTR,UTRNTM-USRSTG ;.RUNT
9243 UENTRY 1,1,2,2,USMSK2,MSKST2-USRSTG ;.MSK2
9244 UENTRY 1,1,2,2,USIFPI,IFPIR-USRSTG ;.IFPIR
9245 UENTRY 1,1,0,0,,APRC-USRSTG ;.APRC
9247 UENTRY 3,3,0,0,,URCNSL ;.CNSL
9248 UENTRY 2,0,3,0,RUTRAP,SUTRAP ;.UTRP
9249 REPEAT 2,UENTRY 1,1,2,2,IAIFPI,IFPIR-USRSTG ;.IIFPI/.AIFPI
9250 REPEAT 2,UENTRY 1,1,2,2,IAMASK,MSKST-USRSTG ;.IMASK/.AMASK
9251 REPEAT 2,UENTRY 1,1,2,2,IAMSK2,MSKST2-USRSTG ;.IMSK2/.AMSK2
9253 UENTRY 3,3,2,2,UJPCS,UJPCR, ;.JPC
9254 UENTRY 2,2,0,0,UROPC, ;.OPC
9255 UENTRY 1,1,1,1,,RTIMER-USRSTG ;.RTMR
9256 UENTRY 1,1,1,1,,HSNAME-USRSTG ;.HSNAME
9257 ;IFN KL10P,UENTRY 1,1,1,1,,ULSPBR-USRSTG ;.LSPBR
9258 ;.ELSE UENTRY 1,1,1,1,,SRN3-USRSTG
9259 UENTRY 2,2,3,3,RUBCHN,SUBCHN, ;.BCHN
9260 UENTRY 2,2,0,0,MPVARD ;.MPVA
9261 REPEAT 2,UENTRY 1,1,2,2,IADF1,IDF1-USRSTG ;.IDF1, .ADF1
9263 REPEAT 2,UENTRY 1,1,2,2,IADF2,IDF2-USRSTG ;.IDF2, .ADF2
9264 UENTRY 1,1,2,2,USDF1,IDF1-USRSTG ;.DF1
9265 UENTRY 1,1,2,2,USDF2,IDF2-USRSTG ;.DF2
9266 UENTRY 1,1,1,1,,OPTION-USRSTG ;.OPTION
9267 UENTRY 1,1,1,1,,40ADDR-USRSTG ;.40ADDR
9268 IFE N11TYS, UENTRY 1,1,1,1,,SRN3-USRSTG ;.TVCREG - JOB'S CONSOLE REGISTER CONTENTS
9269 IFN N11TYS, UENTRY 1,1,1,2,STVCRG,TVCREG-USRSTG
9270 UENTRY 1,1,1,1,,TTSTSV+2-USRSTG ;.TTST
9272 UENTRY 1,1,1,1,,TTSTSV-USRSTG ;.TTS1
9273 UENTRY 1,1,1,1,,TTSTSV+1-USRSTG ;.TTS2
9274 UENTRY 1,1,1,1,,UWHO1-USRSTG ;.WHO1
9275 UENTRY 1,1,1,1,,UWHO2-USRSTG ;.WHO2
9276 UENTRY 1,1,1,1,,UWHO3-USRSTG ;.WHO3
9277 UENTRY 3,3,0,0,,RUSUPP ;.SUPPRO
9278 IFN KA10P, UENTRY 2,2,0,0,URTR1I ;.TR1INS
9279 IFE KA10P, UENTRY 1,1,1,1,,TR1INS-USRSTG
9280 IFN KA10P, UENTRY 2,2,0,0,URTR2I ;.TR2INS
9281 IFE KA10P, UENTRY 1,1,1,1,,TR2INS-USRSTG
9284 REPEAT 4,UENTRY 1,1,0,0,,SRN3-USRSTG
9287 UENTRY 1,0,0,0,,MBOXCT-USRSTG ;.MBOX
9288 UENTRY 1,0,0,0,,MBOXCT+1-USRSTG ;.MBO1
9289 UENTRY 1,0,0,0,,EBOXCT-USRSTG ;.EBOX
9290 UENTRY 1,0,0,0,,EBOXCT+1-USRSTG ;.EBO1
9292 UENTRY 1,1,1,1,,XUNAME-USRSTG ;.XUNAME (USER'S REAL NAME)
9293 UENTRY 1,1,1,1,,XJNAME-USRSTG ;.XJNAME
9294 UENTRY 1,1,1,1,,SRN4-USRSTG ;.FTL1
9295 UENTRY 1,1,1,1,,SRN5-USRSTG ;.FTL2
9296 UENTRY 1,1,1,1,,PAGRAN-USRSTG ;.PAGRANGE
9297 UENTRY 1,1,1,1,,PAGAHD-USRSTG ;.PAGAHEAD
9298 UENTRY 2,2,3,3,URSERV,USSERV ;.SERVER
9300 EXPUNGE UENTRY ;NO MORE UENTRY'S
9302 MXVAL2==.RADIX 2,CONC [.LENGTH/]\MXVAL-1,/ ;BASE 2 LOG OF TABLE SIZE
9304 ;SIXBIT TABLE OF USER VARIABLE NAMES. MUST BE IN CORRECT ORDER,
9307 USETTB: SIXBIT/ADF1/
9374 IFN .-USETTB-MXVAL, .ERR USETTB INCONSISTENT WITH USETL
9375 REPEAT 1_<MXVAL2>-<MXVAL-1>-1, <SETZ>-1 ;PAD TO POWER OF 2 WITH PLUS INFINITY
9377 ;THE FOLLOWING TABLE IS PARALLEL TO USETTB AND GIVES THE NUMERIC USET CODE
9378 ;WHICH SHOULD BE IN THE RANGE 0 - 77 OR 600 AND UP.
9446 IFN .-USETBN-MXVAL, .ERR USETBN INCONSISTENT WITH USETL
9448 ;.CALL USRVAR HACK USER VARIABLES.
9450 ;ARG 2 - AOBJN PNTR FOR BLOCK MODE OR 0,,USER-VAR-NUMBER OR SIXBIT/USER-VAR-NAME/
9451 ;ARG 3 - DATA IF WRITING AND NOT IN BLOCK MODE. (OPTIONAL)
9452 ;ARG 4 - IMMEDIATE INSTRUCTION, OVERRIDES ARG 3. (OPTIONAL)
9453 ;VAL 1 - DATA IF READING AND NOT IN BLOCK MODE
9455 NUSRVA: MOVE J,A ;DECODE FIRST ARG
9456 JSP T,NCORUI ;GET JOB AND LOCK ITS DIELOK
9457 JRST NUSRV0 ;DEFINITELY WRITEABLE
9458 JSP T,NCORWR ;NOT SURE, CHECK FURTHER
9459 TLO J,(SETZ) ;SET WRITE PROTECT BIT
9465 PUSHJ P,NUSRV5 ;DO IT
9467 JRST LSWPJ1 ;WON, UNLOCK DIELOK AND TAKE SUCCESS RETURN
9469 NUSRV5: PUSHJ P,VARCAL ;DECODE ARGS, HACK BLOCK MODE, SET E, W, D.
9470 NUSRV3: SETZB B,I ;ENTER HERE FROM .USET AND .SUSET
9471 TLNN E,-1 ;NOW DECODE USER VARIABLE SPEC
9472 JRST NUSRV1 ;JUMP IF OLD STYLE NUMERIC SPEC
9473 REPEAT MXVAL2,[ ;SIXBIT SPEC LOOK UP IN TABLE
9474 CAML E,USETTB+1_<MXVAL2-.RPCNT-1>(B)
9475 ADDI B,1_<MXVAL2-.RPCNT-1>
9479 JRST OPNL11 ;ILLEGAL USER VARIABLE NAME
9480 MOVE E,USETBN(B) ;TRANSLATE TO NUMERIC SPEC
9481 NUSRV1: JUMPE W,NUSRV2 ;READING
9482 JUMPL J,OPNL31 ;WRITING AND WRITE PROTECTED
9483 MOVEI I,2 ;MAGIC INDEX 1.2=R/W 1.1=OTHER/SELF
9488 AOJE B,PDPPMT ;USER IS PDP6
9494 JRST AUSET2 ;100 TO 577 ARE .IOC, .IOS, .IOP, .PMAP VARS.
9495 NUSRV4: CAIL E,MXVAL ;DETECT USET CODE BEYOND 6XX MAXIMUM.
9497 LDB B,USETBT(I) ;GET METHOD BITS
9498 SOJL B,OPNL12 ;VARIABLE NOT AVAILABLE THIS MODE (WRITE PROTECT?)
9499 SOJL B,AUSVAR ;SIMPLE VARIABLE
9500 LDB B,USETRL(B) ;GET ADDRESS OF ROUTINE TO CALL
9501 HRRZ A,J ;SOME ROUTINES WANT USER INDEX IN A
9505 PUSH P,D ;READ/ALTER/REWRITE
9510 TRZ I,2 ;FIRST READ IT
9513 JRST POP5J ;READ LOST
9520 XCT W ;MODIFY THE VALUE IN A
9523 JRST NUSRV4 ;THEN WRITE IT BACK
9526 ; .SUSET [N,,LOC] ;SAME AS .USET (SEE BELOW) BUT REFERS TO SELF
9528 ASUSET: HRRZ J,U ;JOB TO BE HACKED IS SELF
9529 SETZM UUAC(U) ;IF ERROR, RETURN LOSS IN .IOS+0
9532 ; ;IF N&200000=1, BLOCK MODE
9533 ; .USET CH,[N,,LOC] ;IF N&400000=0, READS USER VAR SPECIFIED BY REST OF N
9534 ; FOR INFERIOR OR FOREIGN USER OPEN ON CHANNEL CH
9535 ; INTO USER LOCATION LOC
9536 ;IF N&400000.NE.0, SETS USER VAR SPECIFIED BY REST OF N
9537 ; FOR DIRECTLY INFERIOR USER OPEN ON CHANNEL CH
9538 ; FROM USER LOCATION LOC
9539 AUSET: MOVE J,R ;DECODE AC FIELD AS CHANNEL NUMBER
9541 JRST IOCER7 ;USR OP CHNL DOES NOT HAVE USR OPEN
9542 AUSET0: XCTR XR,[HRRZ B,(C)] ;GET ADDRESS READING INTO OR WRITING FROM
9543 XCTR XR,[HLRZ E,(C)] ;GET VARIABLE AND DIRECTION
9545 JRST ABUSET ;BLOCK MODE
9547 JRST AUSET1 ;JUMP IF READING
9548 JUMPL J,IOCER7 ;WRITE PROTECT VIOLATION
9549 MOVSI W,(MOVEM D,) ;FLAG WRITING
9550 UMOVE D,(B) ;GET DATA TO WRITE
9551 PUSHJ P,NUSRV3 ;DO THE WRITE
9556 ABUSET: TRNE E,400000
9557 TLOE J,(MOVE) ;SET BLOCK BIT
9558 JRST ILUUO ;BLOCK IN BLOCK LOSES
9559 UMOVE Q,(C) ;GET AOBJN PTR AGAIN
9560 ABUST2: UMOVEM Q,(C) ;STORE AWAY UPDATED POINTER
9571 AUSET1: MOVEI W,0 ;FLAG READING
9572 XCTR XRW,[MOVES (B)] ;ENSURE WRITEABILITY
9574 PUSHJ P,NUSRV3 ;GET VALUE OF VARIABLE INTO A
9577 APTUAJ: UMOVEM A,(J)
9580 ;DECODE ARG FOR USET
9581 AUSETJ: JSP T,NCRUI2
9587 AUSVAR: LDB C,USETRL+1 ;GET ADDRESS OF VARIABLE
9596 PDPPMT: MOVEI A,%JSSIX#%JSNUM ;PDP6 HAS ONLY A FEW VARIABLES, WHICH ARE READ-ONLY
9599 MOVEI A,LPDP6M*2000 ;FIXED MEM BOUND FOR PDP-6
9602 JRST POPJ1 ;IGNORE OTHER VARIABLES
9605 ;VARIABLES 100 - 577 (.IOC, .IOS, .IOP, .PMAP)
9606 AUSET2: JUMPN W,OPNL31 ;JUMP IF TRYING TO WRITE
9609 JRST AUSET4 ;>140=>.RIOP+M
9611 JRST AUSET3 ;117<E<140=>.RIOS+M
9612 ADDI E,IOCHNM(J) ;77<E<120=>.RIOC+M
9613 AUSETX: MOVE A,(E) ;GET VAR
9616 AUSET3: MOVE R,J ;INFERIOR USER INDEX
9617 ADDI R,IOCHNM(E) ;GET CHANNEL POINTER
9619 JRST NSTATUS ;DO A .CALL STATUS
9621 AUSET4: CAIL E,40+LUIOP ;COMPARE AGAINST LAST IO PDL LOC
9622 JRST AUSET5 ;READ MAP ENTRY
9623 ADDI E,SIOCHN-40(J) ;MAKE UP POINTER TO VAR
9626 ;USET VARIABLE 200+N -- READ MAP VARIABLE FOR PAGE N.
9627 ; (0 <= N < 400) E CONTAINS N+100.
9629 ;VALUE OF MAP WORD READ:
9631 ;4.9 - PAGE WRITEABLE.
9632 ;4.8 - PAGE EXISTS (IF THIS OFF, WHOLE WORD IS 0)
9633 ;4.7 - PAGE IS IN CORE.
9634 ;4.6 - PAGE IS PUBLIC (ANYONE CAN WRITE IT)
9636 ;3.1 - 3.9 - # TIMES PAGE SHARED (LIKE CORTYP'S 4TH VALUE'S RH)
9637 ;2.1 - 2.9 - ABS PAGE # OR PAGE # IN NEXT SHARER
9638 ; (LIKE CORTYP'S 3RD VALUE)
9639 ;1.1 - 1.9 - 0 => ABS PAGE (OR NO PAGE, OF COURSE)
9640 ; -1 => UNSHARED PAGE,
9641 ; ELSE USR NUM. OF NEXT SHARER.
9646 CIRPSW ;DON'T LET PAGE TABLES CHANGE.
9647 MOVEI A,-100(E) ;PAGE NUMBER IN JOB.
9649 PUSHJ P,NCORT0 ;PUT CORTYP'S VALUES IN A THRU D.
9651 PUSHJ P,LSWPOP ;FREE CIRPSW.
9652 ANDI B,777 ;CORTYP'S 2ND VALUE IN 1.1 - 1.9
9653 DPB C,[111100,,B] ;3RD VALUE IN 2.1 - 2.9
9654 TLO B,(D) ;4TH VALUE RH INTO 3.1-3.9
9656 TLO B,(D) ;4TH VAL BITS 4.8-4.9 INTO 4.6-4.7
9657 IOR A,B ;TOGETHER WITH 1ST VALUE'S 4.8, 4.9.
9660 USTOP: AOS (P) ;GOING TO WIN
9661 JUMPN D,1USTOP ;NONZERO VALUE => STOP THE JOB.
9662 MOVE B,APRC(A) ;ZERO => START.
9663 TLNE B,BULGOS ;BUT DON'T EVER START A JOB THAT'S BEING KILLED.
9667 1USTOP: MOVNI D,1 ;SET TO STOP
9668 1USTRT: PUSHJ P,RPCLSR ;STOP USER IN A
9669 DPB D,[.BP BUSRC_22,USTP(A)] ;BUSRC
9678 UPCSET: PUSHJ P,RPCLSR ;STOP USER IN USER MODE
9679 TLO D,%PCUSR ;BE SURE USER MODE IS ON IN NEW PC
9680 TLZ D,BADPC ;BE SURE PRIVILEGED BITS ARE OFF
9681 SKIPGE IOTLSR(A) ;SKIP UNLESS USER IS SUPPOSED TO BE IN IOT-USER MODE
9682 TLO D,%PCUIO ;TURN ON IOT-USER MODE
9683 MOVEM D,UPC(A) ;SET PC
9684 PUSHJ P,UPCLSR ;RESTART
9687 UJPCS: CAIN U,(A) ;SET .JPC, WITH CARE IF SETTING OWN
9694 UJPCR: CAIN U,(A) ;READ .JPC:
9695 SPM UPGML(U) ;IF READING ONE'S OWN, MAKE SURE IT'S UP TO DATE.
9700 UROPC: HLLZ A,UPOPC(J)
9705 IFE KA10P, UROPC: JRST OPNL12 ;.OPC NOT SUPPORTED ON KL AND KS ((CAN'T
9706 ; USE == DUE TO FWD REF))
9708 IFN N11TYS,[ ;SET OWN TV CONSOLE REGISTER
9709 STVCRG: MOVEM D,TVCREG(U) ;ENABLE TVCREG TO BE SWAPPED IN AND OUT OF HARDWARE
9710 JUMPL D,POPJ1 ;IF TURNING ON; OR, IF TURNING OFF, ALL DONE
9711 SKIPGE TT11P ;ALLOWED TO TOUCH HARDWARE?
9714 MOVEM D,400000+TTR10*2000 ;UPDATE REG IN HARDWARE
9715 MOVEM D,TVCREG(U) ;AND UPDATE AGAIN IN SOFTWARE IN CASE CLOBBERED AT SSTVR2
9719 IFE KS10P,[ ; KS10 doesn't have a MAR and it never will...
9722 URMAR: MOVE A,UPMAR(J)
9723 IFN KA10P, TLZ A,777770
9724 IFN KL10P, LDB B,[270400,,A]
9725 IFN KL10P, HRL A,MARPTB(B)
9729 USMAR: CONO PI,CLKOFF ;TURN OFF CLOCK INTERRUPTS
9731 SPM UPGML(J) ;STORE PG VARIABLES IF HACKING CURRENT USER
9734 TLO D,4 ;SET USER MODE
9742 LPMR UPGML(J) ;USE LPMR BECAUSE KL10 DOESN'T HAVE VANILLA LPM
9745 IFN KL10P,[ ;MAR PERMUTATION TABLE. MAYBE CAN DO BETTER???? *****
9747 MARPTB: 0 1, 0 ;OFF ;NONE (EXEC)
9748 0 11, 0 ;FETCH ;NONE (USER)
9749 0 3, 2 ;WRITE ;WRITE(EXEC)
9750 0 17, 6 ;ANY ;WRITE (USER)
9751 0 1, 10 ;OFF ;READ (EXEC)
9752 0 11, 14 ;FETCH ;READ (USER)
9753 0 3, 12 ;WRITE ;NOT FETCH (EXEC)
9754 0 17, 16 ;ANY ;NOT FETCH (USER)
9755 0 5, 1 ;READ ;FETCH (EXEC)
9756 0 15, 5 ;READ+FETCH ;FETCH (USER)
9757 0 7, 13 ;NOT FETCH ;NOT READ (EXEC)
9758 0 13, 17 ;NOT READ ;NOT READ (USER)
9759 0 5, 11 ;READ ;READ+FETCH (EXEC)
9760 0 15, 15 ;READ+FETCH ;READ+FETCH (USER)
9761 0 7, 3 ;NOT FETCH ;ANY (EXEC)
9762 0 13, 7 ;NOT READ ;ANY (USER)
9771 RUSUPP: HRRE A,SUPPRO(J) ;READ SUPERIOR'S USER INDEX
9772 JUMPL A,POPJ1 ;-1 => TOP LEVEL
9773 UINDEX: IDIVI A,LUBLK ;GET INDEX NUMBER
9774 JRST POPJ1 ;GIVE TO USER
9777 UTRNTR: CONO PI,CLKOFF
9780 LDB A,[2300,,UPQUAN(U)]
9781 LSH A,-2 ;SIMULATE 4.069 USEC CLOCK
9784 SKIPL MTRUSR ;SKIP IF PERFORMANCE METER AVAILABLE
9785 JRST [ RMBOXC A ;REQUIRES AC ORDER - A,B,C,D,E
9787 DMUL A,KLMBCC ;BECAUSE DMUL PRODUCES FOUR WORD RESULT
9801 LDB A,[400400,,UPQUAN(U)] ; 3.9 USEC CLOCK
9806 ;SET JOB'S TTYTBL (.TTY VARIABLE).
9807 USTTY: CONO PI,CLKOFF ;PREVENT TIMING ERROR.
9808 HLLZ E,TTYTBL(J) ;GET CURRENT VALUE
9809 XOR E,D ;GET WHICH BITS USER WANTS TO CHANGE
9810 AND E,[%TBNVR+%TBINT+%TBWAT+%TBOUT+%TBINF+%TBIIN+%TBOIG,,] ;GET BITS USER IS ALLOWED TO CHANGE
9812 TLZ E,%TBWAT ;THESE BITS CAN BE ALTERED ONLY BY THE SUPERIOR
9813 XORM E,TTYTBL(J) ;ALTER THE USER-CONTROLLED BITS WITHOUT WRITING THE OTHERS.
9816 ;READ JOB'S TTYTBL (.TTY) VARIABLE
9817 URTTY: CONO PI,CLKOFF
9824 ;READ JOB'S .CNSL VARIABLE - TTY# OF TREE'S CONSOLE
9825 URCNSL: MOVE A,UTMPTR(J)
9828 SUBI A,NCT+2 ;DISOWNED -1 SYS -2
9831 UJNAME: JUMPE D,OPNL33 ;SET INFERIOR'S JNAME
9832 CAME D,[SIXBIT/PDP6/]
9833 CAMN D,[SIXBIT/PDP10/]
9834 JRST OPNL33 ;CHANGING TO ILLEGAL NAME
9838 PUSHJ P,UJNAMU ;IS NEW JNAME UNIQUE?
9840 MOVEM D,JNAME(A) ;YES
9845 UJNAMU: MOVE B,UNAME(A)
9848 UJNAM1: CAME B,UNAME(E)
9852 UJNAMF: ADDI E,LUBLK
9857 UJNAMG: PUSHJ P,UPCLSR
9859 JRST OPNL13 ;DUPLICATE NAME
9860 JRST CLKOJ1 ;WASN'T REALLY CHANGING THE NAME
9862 UUNAME: HLRE I,D ;SET OWN UNAME
9863 AOJE I,OPNL33 ;CHECK FOR ILLEGAL ___nnn UNAME
9865 UJNAMS: SETO I, ;SET OWN JNAME
9866 JUMPE D,OPNL33 ;CHECK FOR EVIL NAMES
9868 BUG ;SOMETHING SCREWED
9870 JRST OPNL40 ;MUST BE TOP LEVEL
9871 CONO PI,CLKOFF ;TURN CLOCK OFF NOW SO WE DON'T GET REOWNED OR SOMETHING
9873 SKIPA C,JNAME(U) ;CHANGING UNAME, KEEPING JNAME
9874 SKIPA C,UNAME(U) ;VICE VERSA
9875 EXCH D,C ;NOW C=UNAME, D=JNAME
9876 MOVEI E,0 ;CHECK FOR DUPLICATE NAMES
9877 UUNAM0: SKIPE UNAME(E)
9878 CAMN E,U ;ALLOW SETTING TO SAME NAME AS BEFORE
9883 CAMN A,I ;JOB CAN'T HAVE INFERIORS IF SETTING UNAME
9884 JRST OPNL13 ;OR DUPLICATE U-JNAME IF SETTING EITHER
9885 UUNAM1: ADDI E,LUBLK
9890 SKIPA A,D ;D GETS CLOBBERED
9891 JRST CLKOJ1 ;THE NAMES WEREN'T ACTUALLY CHANGED! (SYNCOM DOES IT).
9892 CAME C,UNAME(U) ;IF NOT LOGGED IN, AND CHANGING UNAME,
9893 SKIPGE TTYTBL(U) ; AND CONSOLE-CONTROLLED,
9897 AOS SUSRS ;DISGUST! SHOULD BE USING LOGIN
9898 UUNAM2: HRRZ T,TTYTBL(U)
9899 HRLI T,[ASCIZ / CHUNAM /]
9900 PUSHJ P,SGWAIT ;REQUEST SYSTEM JOB TO PRINT OUR MSG
9901 MOVEM C,SLGIV+2 ;INCLUDE NEW UNAME AS SECOND NAME
9902 UUNAM3: PUSHJ P,LOGUPD ;CHARGE OLD NAME FOR USAGE SO FAR
9903 MOVEM C,UNAME(U) ;THEN SWITCH NAMES
9905 PUSHJ P,DMNPLI ;LOG BACK IN UNDER NEW NAMES
9908 ;WAIT FOR SLGIV VARIABLES TO BECOME FREE, AND REQUEST THE
9909 ;SYSTEM JOB TO PROCESS THEM. TAKES STRING,,TTY IN T, AND
9910 ;PLACES UNAME(U) IN SLGIV, AND T INTO SLGIV+1. THE CALLER
9911 ;IS RESPONSIBLE FOR FILLING IN SLGIV+2
9914 MOVSI T,SCLLGI ;SOMEBODY ELSE IS USING THOSE VARIABLES
9915 PUSHJ P,CWAIT ;WAIT FOR THE SYSTEM JOB TO FINISH WITH
9916 TDNE T,SUPCOR ;THEM.
9917 IORM T,SUPCOR ;REQUEST THE SYSTEM JOB TO PRINT OUR MSG
9918 POP P,SLGIV+1 ;STRING,,TTY #
9919 MOVE T,UNAME(U) ;STORE AWAY THE UNAME
9923 RUTRAP: LDB A,[430100,,UTRAPM(J)] ;GET SPECIAL TRAP MODE INDICATOR
9926 SUTRAP: DPB D,[430100,,UTRAPM(J)] ;SET " " " "
9930 URTR1I: SKIPA A,[0,,%PIARO] ;READ "TRAP 1 INSTRUCTION" FOR KA-10
9931 URTR2I: MOVEI A,%PIPDL ;TRAP 2
9945 MOVEM A,SRN5(U) ;ARGUMENT TO NCORFS
9947 NCORFS ;CLEARS BSSTP IN USTP(A).
9954 ;SET SYSTEM NAME (ZERO IGNORED)
9959 ;SET INFERIOR'S INTERRUPT MASK
9960 USMASK: SKIPA E,[2] ;MOVEM
9961 IAMASK: ANDI E,1 ;ANDCAM OR IORM
9962 ANDCM D,[VBDBTS] ;BITS FOR CLASS 1 INTS CAN'T BE CHANGED.
9963 XCT (E)[ IORB D,MSKST(A)
9967 MOVEI B,440+APRCHN ;NOW UPDATE JOB'S APRC VARIABLE.
9976 IFE KA10P, PUSHJ P,TRINST
9980 ;SET THE AROV AND PDLOV TRAP INSNS ACCORDING TO WHETHER THE
9981 ;INTERRUPTS ARE ENABLED; BUT DON'T OVERRIDE AN EXPLICIT SPECIFICATION
9982 ;BY THE USER, WHICH IS ANYTHING OTHER THAN 0 OR (CAI) IN THE LH.
9984 TRINST: MOVE D,MSKST(A)
9985 MOVSI B,(CAI) ;CAI IS FASTER THAN JFCL - NO AC DECODE
9986 TDNE D,[%PIFOV+%PIARO] ;AND OVERFLOW GOES OFF A LOT
9992 ; MOVSI B,(CAI) ;THESE LINES COMMENTED OUT TO MAKE
9993 ; TRNE D,%PIPDL ; PDL OVERFLOW CLASS 2 INSTEAD OF CLASS 3
10002 ;SET INFERIOR'S PI IN PROGRESS FLAG
10003 UPISET: ASH D,-35. ;SHIFT SIGN BIT TO BOTTOM BIT
10004 MOVEM D,PICLR(A) ;SET VARIABLE
10005 ;COME HERE WHEN ANY INTERRUPT VARIABLE'S VALUE IS CHANGED
10006 ;BY A .USET OR .SUSET; TAKE ANY INTS THAT ARE NOW PENDING.
10007 UPISE1: HRRZ A,J ;IAMASK, ETC. MODIFY A. RESTORE IT.
10008 AOS (P) ;GOING TO WIN
10009 TRNN I,1 ;SKIP IF A SUSET
10011 JRST APISE1 ;SEE IF SHOULD REINTERRUPT
10013 IAMSK2: ADDI A,MSKST2-IDF1
10014 IADF1: ADDI A,IDF1-IDF2
10015 IADF2: ADDI A,IDF2-PIRQC ;IORM OR ANDCAM INTO IDF2.
10016 IAPIRQ: ADDI A,PIRQC-IFPIR
10017 IAIFPI: ANDI E,1 ;GET USET PARITY (0=IORM, 1=ANDCAM)
10018 XCT IAINS(E) ;DO APPRO OP
10021 IAINS: IORB D,IFPIR(A) ;SET BITS
10022 ANDCAB D,IFPIR(A) ;FLUSH BITS
10024 USMSK2: ADDI A,MSKST2-IDF1 ;SET .MSK2, ETC.
10025 USDF1: ADDI A,IDF1-IDF2
10026 USDF2: ADDI A,IDF2-PIRQC
10027 USPIRQ: ADDI A,PIRQC-IFPIR
10028 USIFPI: MOVEM D,IFPIR(A)
10031 ;.RBCHN, .SBCHN READ/SET NUMBER OF LAST CHANNEL ON WHICH ERROR OCCURRED
10032 RUBCHN: LDB A,[BCHPTR#(A#U)]
10035 SUBCHN: DPB D,[BCHPTR#(A#U)]
10039 UGSUPR: HLLZ A,SUPPRO(J)
10042 ;SAVE AWAY MA (HIGH BITS) ON LAST MPV OR WIRO
10043 ;CALLED FROM CLKBRK, DONT CLOBBER A OR D
10048 LSH T,10. ;HIGH BITS ONLY ON KA
10050 IFE KA10P, HRRZ T,UPFW(U)
10054 ;.RMPVA READ VIRTURAL PAGE # (8 BITS) OF LAST MPV OR WIRO
10056 MPVARD: HRRZ A,IOTLSR(J)
10059 ;.RSERVER Read server user number, or -1 if none.
10060 URSERV: SKIPL A,SERVER(J)
10064 ;.SSERVER Set server user number, or clear if negative.
10065 ; (To prevent timing screws, you should really use the SSERVE call to set
10066 ; this variable, but for debugging convenience...)
10067 USSERV: IMULI D,LUBLK
10073 SUBTTL USER INSTRUCTION HANG ROUTINE (.HANG)
10075 ; .HANG was rewritten by Alan Feb 87:
10077 ; The general theory is that .HANG should behave -exactly- like JRST .-1 as
10078 ; much as possible. Thus, it is considered to make sense to put any
10079 ; skipping or jumping instruction before a .HANG. We are always careful to
10080 ; return from the .HANG by jumping to the previous instruction, so any side
10081 ; effects (such as clearing bits or incrementing accumulators or memory) are
10082 ; always performed, and jumps will be correctly taken.
10084 ; There are two ways to leave a .HANG, either the job can get PCLSR'ed, or
10085 ; the awaited condition can become true. We arrange for -both- cases to
10086 ; return the job to the previous instruction by SOSing UUOH -once- before
10087 ; calling UFLS, and once more if UFLS returns.
10089 ; As an additional feature, .HANG with a non-zero accumulator behaves like
10090 ; the disjunction of ordinary .HANG and .SLEEP, allowing the user to do a
10091 ; timeout. The accumulator should initially contain an argument, as for
10092 ; .SLEEP, that indicates when .HANG should timeout. In that case only,
10093 ; .HANG returns to the following instruction and the designated accumulator
10094 ; will contain zero. If such a .HANG is interrupted, or if it returns
10095 ; because the awaited condition is now true, that accumulator will contain
10096 ; the correct negative number indicating the absolute time it would have
10099 ; Accepted instructions are:
10100 ; Any CAI, CAM, JUMP, SKIP, AOJ, AOS, SOJ, or SOS class instruction.
10101 ; Any test instruction.
10103 ; JFCL with 0 in the AC field.
10104 ; Or an XCT that eventually fetches one of the above.
10106 ; As special cases SKIPA 0, and CAIA 0, are taken to request a schedule,
10107 ; and JFCL 0, and SKIP 0, set %SWDSO.
10109 ; As before, it is a limitation that changes to memory referenced by .HANG
10110 ; when computing effective addresses and fetching XCT'ed instructions will
10111 ; not cause the job to wake up. But how could it be otherwise? Changes to
10112 ; the accumulators will of course cause the job to be PCLSR'ed.
10115 UMOVE R,-2(R) ; Get user's flush instruction
10116 HRLOI A,377777 ; A: most positive fixnum
10117 JUMPE J,AHANG2 ; No AC => timeout when hell freezes over
10118 XCTR XR,[MOVN A,(J)] ; A: argument as for .SLEEP
10119 JUMPG A,AHANG2 ; 'twas already neg., so wait 'til then
10120 SUB A,TIME ; else compute time
10121 UMOVEM A,(J) ; store back negative for PCLSRing
10122 MOVN A,A ; A: time to wait for
10123 AHANG2: PUSHJ P,ASCIND ; Compute E for instruction
10124 HLRZ C,R ; C: Opcode and AC
10127 JRST AHANGI ; User might be waiting for a while
10130 JRST AHANGF ; User is just trying to cause a schedule
10131 LSH C,-9 ; C: 9-bit opcode
10133 JRST AHANG1 ; XCT - Go loop
10135 JRST AHANGO ; JFFO is like JUMPN
10136 LSH C,-6 ; C: First 3 bits of opcode
10138 JRST AHANGC ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS
10141 IFN KS10P, JRST ILUUO
10143 ;CODE TO ALLOW CONSO, CONSZ AS .HANG INSTRUCTIONS
10144 HLRZ C,R ;CHECK FOR CONSO, CONSZ
10146 LDB B,[320700,,R] ;GET DEVICE CODE/4
10149 CAIE C,(CONSZ\CONSO)
10150 JRST ILUUO ;UNRECOGNIZED INSTRUCTION, OR USER CONI NOT
10159 AHANG9: XCT EPDL(U)
10167 AHANG1: PUSHJ P,OPBRK ; Don't let "XCT ." hang you up
10168 UMOVE R,(R) ; Get new instruction
10169 JRST AHANG2 ; And start over
10171 ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS ? .HANG
10172 AHANGC: TLNN R,040000
10173 JRST AHANG3 ; CAI, CAM, JUMP, SKIP
10175 JRST AHANGJ ; AOJ, SOJ
10177 SKIPA T,[-1] ; AOS: Compare with -1
10178 MOVEI T,1 ; SOS: Compare with 1
10179 TLZ R,770777 ; Clear all but last 3 bits of opcode
10180 TLO R,(CAM T,) ; Build a CAM instruction
10181 TLNE R,001000 ; With the opposite sense
10185 AHANG3: TLNN R,020000
10186 JRST AHANG4 ; CAI, CAM
10189 TLZ R,(0 17,) ; SKIP
10193 AHANGO: TLC R,(JFFO#JUMPN)
10194 AHANGJ: HRRI R,AHANGX
10197 ; SKIPA ? .HANG -- just flush once (ignores timeout)
10203 ; JFCL ? .HANG -- hang infinitely (or until timeout)
10204 AHANGI: MOVE B,TIME
10205 ADDI B,60.*30. ; If sleeping for more than a minute
10206 MOVSI C,%SWDSO ; Desire swap out
10207 CAML A,B ; (just like .SLEEP)
10216 AHANGT: TLZ R,060000 ; Make opcode be TRN or TDN series
10217 TLNE R,010000 ; If TRN, only AC matters
10218 JRST AHANGB ; TDN: Both AC and memory matter
10219 ; Wait for something that only references the user's accumulators.
10220 ; (Instruction in R might be some kind of jump to AHANGX.)
10221 AHANGA: PUSHJ P,AHANGG ; Get contents of user's AC into T
10223 XCT R ; Must try it once to prevent timing screw
10224 JRST AHANG5 ; OK, wait forever for PCLSR
10227 AHANG4: TLNN R,010000 ; If CAM, both AC and memory matter
10228 JRST AHANGA ; CAI: Only AC matters
10229 ; Wait for something that references memory.
10230 ; (Instruction in R better not be a jump!)
10231 AHANGB: PUSHJ P,AHANGG ; Get contents of user's AC into T
10232 AHANGM: MOVEM R,EPDL(U)
10234 TRNE R,-20 ; Memory reference really only AC?
10235 JRST AHANG6 ; No, real memory, go wait
10236 XCTR XRW,R ; Must try it once to prevent timing screw
10237 JRST AHANG5 ; OK, wait forever for PCLSR
10241 AHANG6: PUSHJ P,UFLS
10242 AHANGX: ;; Everyone exits here after SOSing UUOH once (before hanging).
10243 ;; Thus we always exit to the previous instruction (just like being
10244 ;; PCLSRed), unless we timeout instead.
10245 CAMGE A,TIME ; Timeout?
10250 AHANGY: XCTR XW,[SETZM (J)] ; Let user know we timed out
10251 AOS UUOH ; And fall through instead of backing out
10254 ;.HANG flush instruction routine, called with PUSHJ only on clock level
10257 MOVEI TT,0 ; Save MAR word
10258 EXCH TT,UPMAR(U) ; so will not MAR
10260 MOVEM TT,UPMAR(U) ; Restore MAR
10262 IFN KS10P, LPMR UPGML(U)
10266 AOS (P) ; Might be because location swapped out or
10267 POPJ P, ; missing, but that's OK because we always
10268 ; exit to the previous instruction!
10270 ; Kind of like ASCIND for the accumulators...
10271 AHANGG: LDB T,[270400,,R]
10272 UMOVE T,(T) ; Get contents of AC from user
10273 TLZ R,(0 17,) ; Clear out AC field in instruction
10274 TLO R,(0 T,) ; Replace AC field with T
10277 ; Allow interrupt if being PCLSRed
10280 CAMN T,[JRST ONEFLS]
10285 SUBTTL .OPEN AND FRIENDS
10288 ;.FDELE FILBLK ;DELETE OR RENAME FILE SPECIFIED AT FILBLK
10290 AFDELE: SETZM UUAC(U)
10291 UMOVE A,(C) ;GET DEVICE
10293 DPB W,[OPNCOM,,A] ;SET OP TO SPECIFY AN .FDELE
10296 ;OPEN SET UP AND DISPATCH
10297 ;3.1=0 => INPUT =1 OUTPUT
10298 ;3.2=0 => UNITS =1 BLOCK
10299 ;3.3=0 => ASCII =1 IMAGE
10300 ;4.9-4.7 OPERATION FIELD
10301 ; 0=> NORMAL READ OR WRITE
10302 ; 1=> WRITE OVER MODE
10304 ; 4=> DELETE OR RENAME (INTERNAL)
10306 ;.OPEN CH,FILBLK ;OPEN FILE SPECIFIED AT FILBLK ON LOGICAL CHANNEL CH
10308 AOPEN: ;C HAS EFF ADR OF UUO AND R ITS AC FIELD
10309 ADDI R,IOCHNM(U) ;MAKE R POINT TO SPECIFIED I/O CHANNEL WORD
10311 PUSHJ P,ACLOSE ;CLOSE PREV
10313 UMOVE A,(C) ;GET DEV AND MODE BITS
10316 JRST OPNL23 ;BARF IF TRY TO DELETE WITH .OPEN
10317 AFDEL1: MOVEI TT,SRN3(U) ;MOVE 4TH-6HT ARGS
10318 HRLI TT,3(C) ;TO SRN3 THRU SRN5
10320 XCTR XBR,[BLT TT,-1(Q)]
10321 UMOVE B,1(C) ;GET 2ND, 3RG ARGS (FILENAMES)
10323 MOVE D,USYSNM(U) ;USE DEFAULT SNAME.
10324 HLRZ E,A ;GET MODE BITS.
10325 HRLZI A,(A) ;LEFT-JUSTIFY DEVICE NAME.
10328 NOPNE: CAIN W,4 ;SKIP ON NOT .FDELE (ENTRY FOR NCALL TYPE OPEN, ETC COMMANDS)
10329 SKIPN SRN3(U) ;SKIP ON RENAME
10330 JRST AOPEN3 ;JUMP IF A .OPEN OR DELETING .FDELE
10331 JUMPN B,AOPEN3 ;JUMP UNLESS RENAME WHILE OPEN.
10332 MOVE TT,C ;GET CH ON WHICH FILE IS SUPPOSIDLY OPEN
10333 TDNE TT,[-NIOCHN] ;SKIP IF CH LOGICALLY LESS THAN 20
10334 JRST OPNL14 ;BAD CHANNEL NUM
10335 ADDI TT,IOCHNM(U) ;RELOCATE TO POINT TO CH WORD FOR USER
10336 MOVE Q,(TT) ;GET CH WORD
10337 JUMPE Q,OPNL44 ;CHNL NOT OPEN
10338 HLRZ Q,CLSTB(Q) ;GET LEFT HALF OF CLOSE TABLE ENTRY FOR INDEX IN I/O CH WORD
10339 TRNE Q,%CLSJI\%CLSJO
10340 JRST JFDEL4 ;JOB DEVICE CHNL
10341 TRNN Q,%CLSDO\%CLSQ ;SKIP IF A DIRECTORY DEVICE
10342 JRST POPJ1 ;JUMP IF NOT DIRECTORY DEVICE
10343 HLRZ J,(TT) ;PICK UP DEV CHNL NO
10344 EXCH A,B ;PUT FN1, FN2 IN A, B.
10347 TRNN Q,%CLSDO ;SKIP IF DEC TAPE
10349 MOVSI C,'UT0 ;GET DUMMY UT DEV NAME.
10350 HRRZ I,UTTNO(J) ;GET POSSIBLE (?) TAPE NUM
10351 TLO C,(I) ;STORE IN DEV NAME
10352 MOVE TT,DVAUT ;WILL EXIT TO UTAPE OPEN RTN.
10356 MOVSI C,'DSK ;NOT UT, MUST BE DSK.
10357 MOVE TT,DVAQSK ;NOBODY ELSE HANDLES RENAME WHILE OPEN.
10360 AOPEN3: PUSHJ P,TRAN ;PERFORM I/O TRANSLATIONS
10361 JRST OPNL3 ;TOO MANY TRANSLATIONS.
10362 MOVEM D,USYSN1(U);SAVE TRAN'D SNAME FOR OPEN RTN.
10363 PUSH P,A ;PUT NAMES ON STACK.
10366 MOVSI B,-NDEVS ;LOAD LENGTH OF FIRST DEV NAME TABLE
10367 CAME A,DEVTAB(B);SEARCH FIRST DEV NAME TABLE
10368 AOBJN B,.-1 ;LOOP TILL FOUND OR COUNTED OUT
10369 JUMPG B,OPEN1 ;JUMP IF NOT FOUND
10370 OPEN2: MOVE TT,DEVADR(B) ;LOAD BITS,,OPEN-ROUTINE-ADDRESS
10371 OPEN21: POP P,B ;UNSAVE SECOND FILE NAME
10372 POP P,A ;UNSAVE FIRST FILE NAME
10373 POP P,C ;UNSAVE DEVICE NAME
10375 JRST [ TLNN TT,%DVDEL
10376 JRST OPNL34 ;DEVICE DOES NOT ALLOW DELETE
10379 JRST [ TLNN TT,%DVLNK
10380 JRST OPNL34 ;DEVICE DOES NOT ALLOW LINK
10382 OPEN2B: HRRZ D,E ;MODE BITS
10383 EXCH E,C ;SAVE DEVICE IN E
10384 HLL C,E ;SET UP OLD-STYLE C: MODE,,DEV
10387 ;AT THIS POINT: A & B HAVE FILE NAMES, C HAS MAPPED DEV AND MODE BITS, D HAS MODE BITS,
10388 ;W HAS OPEN COMMAND, E HAS DEVICE NAME, TT HAS DEVADR WORD (BITS,,ROUTINE)
10390 ROT D,-1 ;ROTATE IN/OUT BIT TO SIGN
10391 CAIN W,4 ;SKIP IF NOT A .FDELE
10392 TDZ D,[400000,,7] ;A .FDELE, MAKE LOOK LIKE OPEN FOR READ
10394 JRST OPEN2D ;NORMAL OPEN
10395 JUMPL D,OPNL2 ;WRITING DIRECTORY?
10396 JUMPN W,OPNL12 ;DELETING, RENAMING, LINKING, WRITING OVER DIRECTORY?
10398 JRST (TT) ;OPEN DEVICE FOR DIRECTORY
10399 ;ASKING FOR DIR OF DEVICE SYSTEM DOESN'T HAVE DIR ROUTINE FOR.
10400 ;PASS IT OFF TO THE UNKNOWN-DEVICE HANDLER.
10401 PUSH P,E ;PUSH DEVICE NAME
10404 HLRZ E,C ;GET MODE BITS
10405 JRST OPEN22 ;PASS TO UNKNOWN DEVICE JOB
10407 OPEN2D: TLNE TT,%DVIN
10408 JUMPGE D,(TT) ;OPENING FOR INPUT AND DEVICE CAN DO INPUT
10410 JUMPL D,(TT) ;OPENING FOR OUTPUT AND DEVICE CAN DO OUTPUT
10411 JRST OPNL2 ;DEVICE DOESN'T GO THAT DIRECTION
10413 ;CHECK FOR NUMBERED DEV
10414 OPEN1: MOVE B,[-NDV1,,DVT1-DEVTAB] ;LOAD AOBJN POINTER WITH COUNT FOR 2ND DEV TABLE
10415 OPEN1A: MOVEI I,0 ;INITIALIZE NUMBERED DEV NUM TO ZERO
10416 MOVE D,[440600,,-2(P)] ;GET BYTE POINTER INTO DEV REQUESTED
10417 MOVE C,[440600,,DEVTAB(B)] ;GET BYTE POINTER INTO CURRENT TABLE ENTRY
10418 OPENA1: ILDB A,C ;GET CHAR FROM TABLE
10419 ILDB J,D ;GET CHAR FROM DEV
10420 JUMPE A,OPEN1B ;JUMP ON SPACE IN TABLE, "MATCHES" DIGIT IN DEV
10421 CAIN A,(J) ;SKIP IF CHAR DIFFER
10422 JRST OPEN1C ;SAME, TRY FOR NEXT CHAR
10423 OPENZ1: AOBJN B,OPEN1A ;LOOP TO NEXT TABLE ENTRY OR COUNT OUT
10424 ;CHECK FOR NAMED SECONDARY PACK
10425 ;FIND THE ONE WITH THIS NAME AND THE BIGGEST QSFT.
10426 ;ASSUME THAT BY THE TIME WE GET HERE TUTS HAVE BEEN READ IN AND SO FORTH
10427 SKIPE A,-2(P) ;GET DEVICE NAME AGAIN
10428 CAMN A,[-1] ;0 OR -1 ARE NOT LEGAL PACK NAMES
10430 MOVEI C,NQS-1 ;SEARCH NAMES OF SECONDARY PACKS
10431 SETOB TT,I ;I BEST DRIVE SO FAR, TT BEST QSFT SO FAR
10432 OPENZ2: CAMN A,QRESRV(C)
10433 JRST [ CAML TT,QSFT(C)
10439 MOVE TT,[%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,,QSKOB]
10442 ;"UNKNOWN DEVICE" HANDLER. FOO DEVICE IS LOADED BY
10443 ;SYS;ATSIGN DEVICE FROM FILE DEVICE;JOBDEV FOO
10445 OPEN22: POP P,EPDLT2(U) ;WHEN WE USE SYS:ATSIGN DEVICE AS A JOB DEVICE,
10446 POP P,EPDLT1(U) ;SET UP THE "NAMES BEFORE LAST TRANSLATION" TO BE
10447 POP P,EPDLT4(U) ;THE NAMES BEING USED, INCLUDING "FOO" AS THE DEVICE.
10451 MOVE TT,DVAJOB ;DEVADR ENTRY FOR JOB:
10458 OPEN1B: JUMPE J,OPEN1C ;JUMP IF DEV ARG EXHAUSTED
10459 SUBI J,'0 ;CONVERT SIXBIT DIGIT TO NUMBER
10460 JUMPL J,OPENZ1 ;JUMP IF TOO SMALL, NOT A DIGIT
10461 CAILE J,9 ;SKIP IF LESS THAN 10.
10462 JRST OPENZ1 ;LOSE, TRY NEXT
10463 ASH I,3 ;MULTIPLY NUM SO FAR BY 8
10464 ADD I,J ;ADD NEW DIGIT
10465 OPEN1C: TLNE C,770000 ;SKIP IF ALL SIX CHAR POSITIONS COMPARED
10466 JRST OPENA1 ;GO TO NEXT POSITION
10469 NSOPEN: HRRZ R,A ;Args: 1 mode (LH) chnl (RH), 2 BP or aobjn -> block of BPs.
10473 PUSH P,A ;Save channel number.
10474 PUSH P,B ;Save BP or BP block ptr.
10476 POP P,R ;Get back the BP or aobjn pointer.
10477 MOVEM R,EPDL(U) ;Save where job device can get it.
10478 PUSHJ P,FNPRS ;Parse into DEV, FN1, FN2, SNM in A, B, C, D.
10479 MOVEM D,SRN3(U) ;Make symbolic open of network win using 5th arg as foreign host.
10480 POP P,R ;Pop back channel number argument.
10488 JRST OPNL12 ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10492 ;Given in R a BP into user memory, or an aobjn -> of BPs block in user memory,
10493 ;parse filenames into A, B, C, D. Clobbers Q, T, R, H, I.
10494 FNPRS: SETZ Q, ;Guess that it is a BP, not a block of them.
10495 SETZ A, ;Clear out the old-fashioned filename words.
10499 SETCM T,R ;Is our "BP" realy an aobjn pointer to fewer than 64 things?
10500 TLNE R,-1 ;If LH is 0, treat as BP and replace with 440700 later.
10503 MOVE Q,R ;Put the aobjn pointer in Q and get the first BP in R.
10505 FNPRS8: PUSHJ P,ASCIND
10506 FNPRS7: PUSHJ P,FNPRS4 ; Read a sixbit word
10507 JUMPL I,FNPRS9 ; Nothing there at all!
10508 CAIN H,"; ; Directory?
10509 JRST FNPRS0 ; Go do special hack
10510 MOVEI I,B ; assume FN1
10511 SKIPE B ; unless we already have a FN1
10512 MOVEI I,C ; in which case assume FN2
10514 MOVEI I,A ; unless it was a device
10515 SKIPN (I) ;Put it there, unless already something there.
10517 JUMPN H,FNPRS7 ;H=0 means end of last arg string.
10518 FNPRS9: ;; Supply default values for all components except FN1.
10520 MOVSI A,(SIXBIT /DSK/)
10524 MOVSI C,(SIXBIT />/)
10537 ;;; Extract in T the next SIXBIT word from user memory off bp in R,
10538 ;;; clobbering I (test 4.9 to see if there was no word read at all).
10539 ;;; Terminating character returned in H (0 means we got to the end of the
10540 ;;; string). Q should be an aobjn pointer to a block in user memory of
10541 ;;; additional BPs.
10544 FNPRS6: PUSHJ P,FNPRS3
10545 JUMPE H,CPOPJ ; that was the end of the string
10548 JRST FNPRS5 ; done?
10550 JRST FNPRS5 ; done?
10560 FNPRS5: JUMPL I,FNPRS6 ; keep looking if we haven't seen anything yet.
10563 ;Extract in H the next character from user memory off the byte pointer in R.
10564 ;Q should be an aobjn pointer to a block of further BPs
10565 ;(in user memory) to use after this one is exhausted.
10569 UMOVE H,(R) ;Fetch the word the BP points to.
10571 HRRI R,H ;Change the BP to point to H.
10572 LDB H,R ;Extract the desired byte.
10575 AOBJP Q,CPOPJ ;When one BP is exhausted, go to the next (if any).
10580 NOPEN: HRRZ R,A ;ARGS 1 MODE (LH) CHNL (RH) 2-5 LIKE NOPEN1 1-4
10592 SOS W ;STRIP OF FIRST ARG
10593 POP P,D ;B-E POPPED INTO A-D
10597 POP P,R ;A POPPED INTO R
10602 JRST OPNL12 ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10604 MOVEM D,SRN3(U) ;MAKE SYMBOLIC OPEN OF NETWORK WIN USING 5TH ARG AS FOREIGN HOST.
10605 NDEL1: CLEARM SRN4(U)
10606 NRN2: CLEARM SRN5(U)
10607 NOPENX: TRNE R,-NIOCHN
10609 HRRZM R,UUAC(U) ;CHNL # (MAYBE ONLY FOR ERRS) IN R
10614 ;DEFAULT THE ARGS FOR .CALL OPEN, ETC,; PUT MODE IN E.
10615 NOPEN1: SETZM EPDL(U)
10618 MOVSI B,(SIXBIT /@/)
10620 MOVSI C,(SIXBIT /@/)
10622 MOVE D,USYSNM(U) ;SYSTEM NAME
10623 HLRZ E,R ;GET MODE BITS FOR TRAN.
10626 ;MAKE LINK 1-4 AS NOPEN1, 5 SNAME 2 6,7 FN1,2(2)
10627 NMLINK: MOVSI R,200000
10628 CAIN W,2 ;Only 2 args are BPs.
10629 JRST [ PUSHJ P,2FNPRS
10631 CAIGE W,7 ;Otherwise, must be seven word of sixbit.
10639 NDEL: SETZM SRN3(U)
10642 CAIN W,1 ;If it's just a BP (or block of them),
10643 JRST [ MOVE R,A ;Parse it into filenames in A-D.
10648 MOVSI R,400000 ;DELETE, ARGS AS NOPEN1
10652 NRNAM: MOVSI R,400000
10653 CAIN W,2 ;Only 2 args are BPs.
10654 JRST [ PUSHJ P,2FNPRS
10656 CAIGE W,6 ;Otherwise, must be six word of sixbit.
10660 MOVSI R,400000 ;RENAME 1-4 AS NOPEN1 5,6 NEW FN1,2
10664 ;Parse two BPs (or aobjn pointers to blocks of BPs) into user memory
10665 ;into filenames. The second bunch go in SRN3 - SRN5; the first in A - D.
10666 ;The two args are saved in EPDL and EPDL3. Clears E, preserves R.
10668 MOVEM A,EPDL(U) ;Save two BPs for job device.
10670 PUSH P,A ;Decode the second BP first, to get the new names.
10673 MOVEM B,SRN3(U) ;Stick them where RENAME looks.
10676 POP P,R ;Parse the first BP, to get the old file filenames.
10682 ;Takes either channel, FN1 (sixbit) and FN2 (sixbit)
10683 ;or channel and BP (or aobjn -> block of BPs).
10684 NRNWO: SETZM EPDL(U)
10688 PUSHJ P,[MOVE R,B ;If channel and BP, parse the BP into filenames.
10689 MOVEM R,EPDL3(U) ;But also save it for job device.
10691 MOVEM B,SRN3(U) ;PUT AWAY NEW NAMES.
10694 ANDI C,-1 ;We call "RENAME" with old fn2 = channel number.
10697 MOVSI R,400000 ;OPNCOM IS .FDELE .
10701 SUBTTL HACKS FOR OPENS THAT LOSE
10704 IFN 0,[ ;THESE "DEFNS" EXIST ONLY SO @ WILL CREF THEM
10705 OPNL1: OPNL2: OPNL3: OPNL4: OPNL5: OPNL6: OPNL7:
10706 OPNL10: OPNL11: OPNL12: OPNL13: OPNL14: OPNL15: OPNL16: OPNL17:
10707 OPNL20: OPNL21: OPNL22: OPNL23: OPNL24: OPNL25: OPNL26: OPNL27:
10708 OPNL30: OPNL31: OPNL32: OPNL33: OPNL34: OPNL35: OPNL36: OPNL37:
10709 OPNL40: OPNL41: OPNL42: OPNL43: OPNL44: OPNL45: OPNL46: OPNL47:
10710 OPNL50: OPNL51: OPNL52: OPNL53: OPNL54: OPNL55: OPNL56: OPNL57:
10711 OPNL60: OPNL61: OPNL62: OPNL63: OPNL64: OPNL65: OPNL66: OPNL67:
10712 OPNL70: OPNL71: OPNL72: OPNL73: OPNL74: OPNL75: OPNL76: OPNL77:
10715 ;HERE ARE THE REAL DEFNS
10716 REPEAT NOPNLS,CONC OPNL,\.RPCNT+1,: JSP D,OPENL
10718 OPENL: CONSZ PI,77400
10719 BUG ;ERROR WITH PI IN PROGRESS
10720 MOVE U,USER ;BE SURE U=CURRENT USER'S INDEX
10721 MOVEI D,-OPNL1(D) ;GET LOSSAGE NUMBER
10722 MOVE R,SYSCVL(U);POSSIBLY RETURN IN ERROR-CODE ARG TO .CALL
10725 HRRZ R,UUAC(U) ;GET CH NUM
10728 PUSHJ P,LSWCLR ;UNLOCK SWITCHES
10729 DPB R,[BCHPTR] ;SAVE AS MOST RECENT CHANNEL IN ERR
10730 ADD R,U ;RELOCATE TO POINT TO USER VARS
10731 DPB D,[220600,,IOCHST(R)] ;STORE IN STATUS WORD
10734 SUBTTL RCHST, STATUS, RFNAME, RFPNTR, WHYINT CALLS
10737 ;1ST ARG IS A <JOB>, WHOSE CHANNEL IS TO BE LOOKED AT.
10738 ;2ND ARG IS A CHANNEL NUMBER.
10739 ;3RD ARG IS BP TO STORE ASCIZ FILENAME STRING THROUGH.
10740 ;4TH ARG IS MAXIMUM NUMBER OF CHARACTERS TO STORE (DEFAULTS TO 1,,0).
10741 ;ONLY 1 ARG => IT IS CHANNEL #, AND JOB IS "SELF".
10742 ;FIRST 4 VALUES ARE THE DEVICE, FN1, FN2 AND SNAME
10743 ; AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10744 ;FIFTH VALUE IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN
10746 NRFNAM: MOVE J,A ;FIRST ARG IS JOB SPEC
10748 SKIPA A,B ;GET CHANNEL # INTO A IN EITHER CASE
10749 MOVEI J,%JSELF ;IF ONLY ONE ARG, JOB SPEC IS SELF
10750 MOVE Q,C ;SAVE BP FOR STORING ASCIZ FILENAME STRING - IF ANY.
10755 JSP T,NCORUI ;DECODE JOB SPEC
10759 JRST OPNL34 ;PDP6 DOESN'T HAVE CHANNELS
10764 MOVE U,J ;LOOK IN THAT JOB'S CHANNELS
10765 PUSHJ P,NRFNM1 ;GET THE CRUFT
10767 PUSHJ P,LSWPOP ;UNSOS DIELOK.
10770 POP P,I ;I GETS 4TH ARG: MAX NUMBER OF CHARS TO STORE IN STRING.
10771 JUMPE T,POPJ1 ;IF DEVICE ROUTINE HAS CLEARED Q, IT HAS STORED THE STRING.
10772 ;NOTE NETRCH PUTS AN EXTRA VALUE FOR .RCHST (GARBAGE, TO US) IN Q!
10773 JUMPE Q,POPJ1 ;IF BP ARG WAS 0, CALLER DOESN'T WANT A STRING.
10777 MOVE J,A ;IF SO, STORE ALL 4 FILENAMES DOWN IT, ONE BY ONE.
10791 ;STORE THE SIXBIT WORD IN J FOLLOWED BY THE ASCII CHAR IN T
10792 ;INTO USER ADDRESS SPACE DOWN THE BP IN Q.
10793 NRFNS1: JUMPE J,CPOPJ ;OUTPUT NOTHING AT ALL IF THE SIXBIT WORD IS EMPTY.
10794 CAIGE I,4 ;GIVE UP NOW IF TOO CLOSE TO END OF ALLOCATED SPACE.
10797 ROTC J,6 ;ELSE GET NEXT CHAR IN R, AND CONVERT TO ASCII AND STORE.
10800 CAIE R,": ;PRECEDE ANY SPECIAL CHARACTERS WITH ^Q.
10814 PUSHJ P,NRFNSB ;IF NAME FINISHED BUT NOT EMPTY, FOLLOW BY TERMINATOR.
10819 PUSHJ P,NRFNSB ;IF TERMINATOR IS : OR ;, FOLLOW IT WITH A SPACE.
10822 ;STORE A BYTE IN TT DOWN BP IN Q TO USER SPACE, INCREMENTING FIRST.
10823 ;XCTR XBYTE LOSES BECUSE IT GETS THE BP FROM USER SPACE.
10835 ;GET THE FILENAMES FOR THE CHANNEL IN A OF JOB IN U INTO A THRU D.
10836 ;IF Q IS NONZERO, IT IS A BP TO STORE AN ASCIZ STRING, AND W IS THE
10837 ;MAX NUMBER OF CHARACTERS TO STORE.
10838 ;THE DEVICE DEPENDENT ROUTINE CAN STORE THE STRING ITSELF
10839 ;AND SET Q TO ZERO SO THAT IT WILL NOT BE STORED THE STANDARD WAY.
10840 NRFNM1: MOVE T,[4,,NRFNM2]
10841 JRST CHNDCD ;R GETS ADDR OF IOCHNM WD, H GETS CONTENTS.
10842 NRFNM2: HLRZ A,H ;PUT LH(IOCHNM WD) WHERE DEVICE RTN LOOKS
10844 JUMPG J,[ ;IF 6-LETTER DEVICE NAME, LH IS POSITIVE ADDRESS
10845 HLRZS J ;OF FULL NAME. NOTE THERE BETTER BE NO
10846 MOVE J,(J) ;3-CHAR DEVICES WHOSE NAME DOES NOT START
10847 JRST .+1 ] ;WITH A LETTER.
10848 PUSH P,J ;SAVE THE PROBABLE VALUE OF DEVICE NAME
10849 LDB J,[1400,,DCHSTB(H)]
10850 HLRZ J,DRFNTB(J) ;GET RFNAME ROUTINE POINTER
10851 SETZB B,C ;FN1, FN2 ARE 0 FOR NON-DIR-DEV
10852 SETZ D, ;SNAME IS 0 FOR NON-MULTI-DIR-DEV
10853 LDB E,[.BP (%IOTOM),IOTTB(H)] ;PROBABLE VALUE OF MODE
10854 PUSHJ P,(J) ;CALL DEVICE-SPECIFIC ROUTINE
10855 SKIPA A,(P) ;NO SKIP => USE DEVICE NAME FROM DCHSTB
10856 MOVE A,J ;SKIP => USE DEVICE NAME RETURNED IN J
10860 ;ARG 1 - CHANNEL NUMBER
10861 ;VAL 1 - ACCESS POINTER OF CHANNEL
10862 ;VAL 2 - BYTE SIZE OF CHANNEL.
10863 ;FAILS IF NOT A RANDOM-ACCESS DEVICE
10865 NRFPNT: HLRZ A,H ;CHANNEL ALREADY DECODED, SET UP LH(IOCHNM) FOR DEV RTN
10866 LDB J,[1400,,DCHSTB(H)]
10867 HRRZ J,DRFNTB(J) ;GET RFPNTR ROUTINE POINTER
10868 JRST (J) ;IT SHOULD PUT POINTER IN A AND POPJ1, OR OPNL34
10870 ;SYMBOLIC CALL "RCHST"
10871 ;1ST ARG IS A CHANNEL NUMBER.
10872 ;6 OR MORE VALUES. THE FIRST 4 ARE THE DEVICE, FN1, FN2 AND SNAME
10873 ; AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10874 ;THE 5TH IS THE ACCESS POINTER, OR -1 IF NOT RANDOM ACCESS.
10875 ;THE 6TH IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN.
10876 ;MORE VALUES ARE RETURNED ONLY FOR NET:, AT THE MOMENT.
10877 ;THE DEV SUBROUTINE MAY PUT EXTRA RESULTS IN TT, I, AND Q, AND PUT # RESULTS INTO W
10879 NRCHST: SETO I, ;DEFAULT POSSIBLE EXTRA RESULTS
10880 SETO TT, ;DEFAULT ACCESS POINTER TO -1
10881 MOVEI W,6 ;NORMAL NUMBER OF RESULTS IS 6
10883 PUSHJ P,NRFNM1 ;GET RESULTS 1 THROUGH 4 AND 6, AND SET UP R AND H
10884 POPJ P, ;CHANNEL NUMBER MUST HAVE BEEN BAD
10886 PUSH P,B ;SAVE THE AC THAT RFPNTR CLOBBERS.
10887 HLRZ A,H ;GET ROUTINE TO GET ACCESS POINTER
10888 LDB J,[1400,,DCHSTB(H)]
10889 HRRZ J,DRFNTB(J) ;ROUTINE BETTER PRESERVE B,C,D,E,TT,I,Q
10890 CAIL J,OPENL ;KLUDGILY SKIP IF WOULD OPEN-LOSS
10891 PUSHJ P,(J) ;GET ACCESS POINTER IN A, ALWAYS SKIPS
10892 MOVE A,TT ;NOT RANDOM ACESS, USE DEFAULT VALUE
10893 MOVE TT,E ;OPEN MODE IS 6TH RESULT
10894 MOVE E,A ;ACCESS POINTER IS 5TH RESULT
10897 ;.RCHST AC, WITH AC/ CH,,ADDR
10898 ;RETURNS, IN THE 5 OR MORE WORDS STARTING AT ADDR,
10899 ;THE RESULTS OF A SYMBOLIC RCHST ON CHANNEL CH.
10900 ;EXCEPTION - THE DEVICE NAME IS RETURNED IN THE RH
10901 ;OF THE FIRST WORD , SO IT IS TRUNCATED TO 18 BITS.
10902 ;EXCEPTION - THE OPEN MODE VALUE IS NOT RETURNED. LATER VALUES
10903 ;ARE SHIFTED DOWN ONE WORD.
10906 ARCHST: UMOVE J,(J) ;GET CONTENTS OF AC
10909 JRST ILUUO ;BAD CHANNEL NUMBER
10911 PUSHJ P,NRCHST ;DO THE REAL WORK.
10912 BUG ;ONLY ERROR RETURN SHOULD BE BAD CHANNEL NUMBER
10913 HLRZS A ;PUT DEV NAME IN RH FOR HISTORY'S SAKE
10914 POP P,J ;RH(J) HAS PLACE TO STORE DATA
10916 MOVE I,Q ;SHIFT DOWN LAST 2 VALS OVER THE OPEN MODE.
10918 ADDI W,-2(J) ;W HAD 1+ # VALS, NOW HAS PLACE TO PUT LAST ONE
10919 XCTR XBW,[BLT J,(W)]
10922 ;.STATUS CH,LOC ;STORE IN LOC THE STATUS OF CHANNEL CH
10923 ;AND OF THE DEV OPEN ON IT IF ANY
10924 ;1.1-1.6 SYS PERIPHERAL DEVICE CODE
10925 ;1.7-2.9 DEVICE DEPENDENT
10926 ;3.1-4.9 LH(IOCHST)
10928 ASTATUS:ADDI R,IOCHNM(U) ;SET UP AC'S LIKE CHNDCD
10929 ASTAT1: MOVE H,(R) ;ENTER HERE FROM .USET [.RIOS,,]
10931 PUSHJ P,NSTATUS ;CALL NEW SYSTEM CALL VERSION
10933 UMOVEM A,(C) ;GIVE TO USER
10937 ;ARG 1 - CHANNEL NUMBER
10938 ;VAL 1 - SAME AS .STATUS
10940 NSTATUS:HLRZ A,H ;SET UP LH(IOCHNM)
10941 LDB D,[140600,,DCHSTB(H)] ;GET SYS PERIPHERAL DEVICE CODE
10942 LDB J,[340300,,IOTTB(H)] ;GET I/O CHANNEL MODE FROM 4.5-4.2
10943 DPB J,[060300,,D] ;RETURN IN BITS 1.9-1.7
10944 LDB J,[1400,,DCHSTB(H)]
10945 HLRZ J,DSTSTB(J) ;GET STATUS ROUTINE POINTER
10946 PUSHJ P,(J) ;ROUTINE FILLS OUT STATUS WORD IN D
10947 HLL D,IOCHST-IOCHNM(R) ;FILL IN LEFT HALF FROM IOCHST
10948 TLZ D,740000 ;CLEAR BITS USED FOR CHANNEL NUM ON IO PDL
10949 MOVE A,D ;RETURN VALUE IN A
10950 JRST POPJ1 ;THIS CALL ALWAYS SUCCEEDS
10953 ;ARG 1 - CHANNEL NUMBER
10954 ;VAL 1 - %WY CODE FOR TYPE OF DEVICE
10955 ;ADDITIONAL VALUES DEVICE-DEPENDENT
10956 ;THIS IS THE USUAL CALL TO GIVE IN RESPONSE TO A SECOND WORD INTERRUPT
10958 NWHYINT:HLRZ A,H ;SET UP LH(IOCHNM)
10959 LDB J,[1400,,DCHSTB(H)]
10960 HRRZ J,DSTSTB(J) ;GET WHYINT ROUTINE POINTER
10963 ;DEVICE-SPECIFIC RFNAME/RCHST ROUTINES
10964 ;CALLED WITH STANDARD CHNDCD STUFF IN H AND R, LH(IOCHNM) IN A
10965 ;MUST PRESERVE H AND R; CAN CLOBBER W TO INDICATE EXTRA STUFF FOR RCHST
10967 RCHUSR: MOVE B,UNAME(A) ;GET UNAME
10968 MOVE C,JNAME(A) ;GET JNAME
10971 IFN NUNITS,[ ;UTAPE .RCHST
10972 RCHUTP: HRRZ C,UTTNO(A)
10973 MOVSI J,'UT0(C) ;GET REAL DEV NAME "UTN" IN J
10974 AOS (P) ;SKIP TO RETURN CHANGED DEV NAME
10975 MOVE D,UTASS(C) ;THE "SNAME" IS THE USER TAPE IS ASSIGNED TO.
10978 MOVE B,UTN1(A) ;OUTPUT, GET FN1
10979 MOVE C,UTN2(A) ;NOW FN2
10982 ;UTAPE INPUT .RCHST
10983 RCHUTI: LDB T,[220500,,UTDBC(A)] ;GET FILE NUMBER
10985 LSH T,1 ;TURN INTO INDEX INTO DIRECTORY
10987 ADD T,UDIRO(C) ;GET POINTER TO FILE NAMES
10988 MOVE B,(T) ;GET FN1
10989 MOVE C,(T) ;GET FN2
10993 ;RCHST ROUTINE FOR TTY
10995 ANDI J,#%TICNS#(.BM $TIIDX)
10996 IOR E,J ;MERGE TTY OPEN MODE BITS WITH THE GENERAL ONES.
11005 HRLZS J ;J NOW HAS SIXBIT/TNM/, NM = TTY #.
11006 JRST POPJ1 ;SKIP TO SAY DEV NAME IS IN J.
11008 ;RCHST ROUTINE FOR STY
11009 RCHSTY: MOVE J,TTYOPT(A)
11011 IORI E,4 ;STY BIT 1.3 => TTY IS HALF-DUPLEX.
11012 MOVE J,STYSTS-NFSTTY(A)
11014 IORI E,20 ;BIT 1.5 => WANT TO RECEIVE %TDORS ON .RESET OF TYOC,
11015 TRNN E,1 ;FIND THE DON'T-HANG-BIT FOR THIS DIRECTION.
11016 TLZA J,#%SSOHG ;AND FLUSH THE ONE FOR THE OTHER DIRECTION.
11018 TLNE J,-1 ;THEN TESTING BOTH TESTS ONLY THE RELEVANT ONE.
11027 RCHDRH: HRRZ A,IOCHST-IOCHNM(R) ;TRACK NUMBER
11028 IMULI A,LMNBLK ;DIRHNG DEVICE RFNAME
11029 ADDI A,2000-LMNBLK*NUDSL
11034 ;RCHST ROUTINE FOR DIRECTORY CHANNELS AND THE ERR DEVICE.
11035 RCHDIR: MOVE T,DSKLST(A) ;GET THE TYPE OF DIRECTORY CODE.
11036 SKIPE J,UDUSR(A) ;IF DEVICE # IS NONZERO, ADD IT TO DEV NAME
11037 HRLZS J ;(ONLY HAPPENS FOR UTAPE)
11038 ADD J,RCHDRD-1(T) ;DETERMINE DEV NAME FROM DIRECTORY TYPE
11039 MOVE B,RCHDR1-1(T) ;SAME FOR FN1
11040 SKIPN C,RCHDR2-1(T) ;AND FN2, EXCEPT 0 FOR ERR DEVICES
11041 MOVE C,UUDPP(A) ; SO WE WILL GET THE STATUS WORD BEING DECODED.
11043 MOVE D,UDSYSN(A) ;FOR DISK UFD'S, GET THE SNAME
11044 JRST POPJ1 ;RETURN, SAYING WE HAVE SPEC'D THE DEVICE NAME.
11046 .SEE UDT ;THESE TABLES ARE IN PARALLEL WITH UDT
11047 RCHDRD: 'UT0,, ? 'CLU,, ? 'DSK,, ? 'DSK,,
11048 'ERR,, ? 'TTY,, ? 'COR,,
11049 IF2 IFN .-UDTLN-RCHDRD,.ERR RCHDRD WRONG LENGTH
11051 RCHDR1: '.FILE. ? '.FILE. ? '.FILE. ? 'M.F.D.
11052 3 ? '.FILE. ? '.FILE.
11053 IF2 IFN .-UDTLN-RCHDR1,.ERR RCHDR1 WRONG LENGTH
11055 RCHDR2: SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(FILE)/
11056 0 ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/
11057 IF2 IFN .-UDTLN-RCHDR2,.ERR RCHDR2 WRONG LENGTH
11061 ;CORE LINK .RCHST ROUTINE
11063 RCHCLO: CONO PI,CLKOFF
11064 MOVE B,CLN1(A) ;GET FN1
11065 MOVE C,CLN2(A) ;GET FN2
11066 MOVE D,CLSYN(A) ;GET SYSTEM NAME
11069 ;RFNAME ROUTINE FOR DSK
11071 RCHQSK: MOVE H,QUDPR(A) ;FILE STATUS FOR DISK PICKUP USER DIR POINTER
11072 PUSHJ P,QUDLK ;LOCK DIRECTORY
11073 MOVE C,QSNLCN(H) ;LOCATION OF DIRECTORY
11075 ADD C,QUDFPR(A) ;ADD LOCN OF FILE WITHIN DIRECTORY
11076 MOVE B,(C) ;GET FIRST FILE NAME
11077 MOVE C,1(C) ;GET SECOND FILE NAME
11081 TRO E,20 ;LINK MODE
11082 MOVE H,(R) ;PRESERVE H
11085 ;RFNAME ROUTINE FOR BOJ:
11087 RCHBOJ: CONO PI,CLKOFF ;BOJ DEVICE .RCHST ROUTINE
11088 MOVE T,JBCUI(A) ;RETURNS CREATOR'S NAME
11092 SETZB B,C ;CREATOR GONE, RETURN BLANK NAMES
11095 ;RFNAME ROUTINE FOR JOB:
11107 ;COPY THE BOJ JOB'S ASCIZ FILENAME STRING INTO OUR CALLER'S STRING.
11108 ;THE CALLER'S BP IS IN Q, AND HIS MAX CHARS TO STORE IS IN W.
11109 RFNJ1: SKIPN B,JBFNP(A)
11114 AOS DIELOK(J) ;PREVENT THE JOB FROM DIEING.
11121 ;D HAS BP TO FETCH WITH, POINTING INTO C, WHICH CONTAINS WORD FETCHED FROM BOJ JOB.
11122 ;RH(B) HAS ADDR OF NEXT WORD TO FETCH FROM THE BOJ JOB.
11123 ;TT CONTAINS THE PREVIOUS CHARACTER TRANSFERRED, OR 1
11124 ;IF THE PREVIOUS CHARACTER WAS QUOTED WITH A ^Q.
11126 TRNN D,#C ;IF THE BP IN D ADVANCES PAST C,
11128 PUSHJ P,RFNJ3 ;FETCH ANOTHER WORD INTO C, MAKE D POINT THERE AGAIN,
11129 LDB E,D ;AND FETCH THE SAME BYTE OVER AGAIN.
11130 RFNJ4: SOJL W,RFNJ5
11132 PUSHJ P,NRFNSB ;STORE BYTE INTO CALLER, UNLESS HIS STRING IS FULL.
11134 CAIN TT,^Q ;A QUOTED CHAR DOES NOT TERMINATE AND DOES NOT QUOTE.
11137 JUMPN E,RFNJ2 ;STOP STORING AFTER A NULL WHICH ISN'T QUOTED.
11143 ;READ THE NEXT WORD (ADDR IN B) FROM THE BOJ JOB.
11150 PUSHJ P,UPLC ;LOOK UP THE BOJ JOB'S PAGE.
11154 LDB J,T ;IF IT DOESN'T EXIST, LOAD A ZERO,
11155 JUMPE J,RFNJ6 ;AVOID GETTING MPV.
11164 RFPUSR: HRRZ A,IOCHST-IOCHNM(R) ;GET THE ACCESS PTR
11165 MOVEI B,36. ;BYTE SIZE IS ALWAYS FULL WORD.
11170 RFPQSK: LDB B,[QSBSIZ(A)] ;GET FILE BYTE SIZE
11172 TDNN T,QSRAC(A) ;IF .ACCESS WAS DONE AND NOT HANDLED,
11174 MOVE A,QRADAD(A) ;GET WHAT THE .ACCESS SPECIFIED.
11177 RFPQS1: MOVE J,QFBLNO(A) ;GET BYTE # OF STRAT OF CURRENT BLOCK.
11178 SKIPGE QSMDN(A) ;SKIP ON A BUFFER ACTIVE
11179 JRST RFPQS2 ;NONE ACTIVE => QFBLNO POINTS TO NEXT BLOCK TO BE READ.
11180 ADD J,QMPBSZ(A) ;ELSE CORRECT FOR THE NUMBER OF BYTES WE'VE PROCESSED
11181 SUB J,QSMPRC(A) ;IN THE ACTIVE BLOCK (QFBLNO -> 1ST WD OF BLOCK).
11185 SUBTTL RESET,IOPUSH,IOPOP,IOPDL,FORCE,FLUSH .CALLS
11187 ;.RESET CH, ;RESET BUFFERED INFO ON CHANNEL CH
11188 ;NOT IMPLEMENTED FOR MANY DEVICES
11189 ;HAS SPECIAL EFFECTS ON "USR" DEVICE
11191 ;ARG 1 - CHANNEL NUMBER
11195 ARESET: HRRZ A,(R) ;PICK UP INDEX FROM I/O CH WORD
11196 SKIPA T,[HRRZ T,RSTB1(A)] ;.RESET USES RH OF TABLE
11197 AIOPP1: MOVE T,[HLRZ T,RSTB1(A)] ;.IOPUSH, .IOPOP USE LH OF TABLE
11198 IDIVI A,7 ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11199 ADD A,[440500,,RSTB]
11202 LDB A,A ;GET BYTE FROM TABLE
11203 XCT T ;GET REAL TABLE ENTRY IN T
11206 ;IO CHANNEL PUSH DOWN LIST ROUTINES
11207 ;C(I) =0 AT DSP => IOPUSH =1 => IOPOP
11210 AIOPUSH:MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11211 CAML T,[LUIOP-1,,0] ;LUIOP-2,,<ptr> is OK, leaves room for 1 more.
11212 JRST IOCER6 ;OVER PUSH ERROR
11213 PUSH T,(R) ;PUSH CURRENT IOCHNM
11214 PUSH T,IOCHST-IOCHNM(R) ;&IOCHST
11217 DPB J,[400400,,(T)] ;STORE CHANNEL NUM FOR POSSIBLE USE BY AIOPDL
11218 MOVEM T,SIOCP(U) ;STORE BACK PDL POINTER
11219 MOVEI I,0 ;INDICATE IOPUSH
11221 PUSHJ P,AIOPP1 ;CALL DEVICE'S IOPDL HANDLER. SHOULD NOT HANG
11223 SETZM (R) ;CLEAR OUT IOCHNM
11224 SETZM IOCHST-IOCHNM(R) ;&IOCHST
11228 AIOPOP: PUSHJ P,ACLOSE ;CLOSE WHATEVER MAY BE OPEN ON CHANNEL POPPING INTO
11229 MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11231 JRST IOCER5 ;OVER POP ERROR
11232 POP T,IOCHST-IOCHNM(R) ;POP BACK IOCHST
11235 SETZM 1(T) ;CLEAR OUT PDL WORD TO AVOID CONFUSION IN
11236 ;ROUTINES THAT GROVEL OVER I/O PDL
11237 MOVEM T,SIOCP(U) ;STORE BACK PDL POINTER
11238 MOVEI I,1 ;INDICATE IOPOP
11239 JRST AIOPP1 ;CALL DEVICE'S IOPDL HANDLER
11241 AIOPDL: MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11242 TLNN T,-1 ;SKIP UNLESS IO PDL EMPTY
11244 LDB R,[400400,,(T)] ;FIND OUT WHAT CHNL TOP ENTRY WAS PUSHED FROM
11246 PUSHJ P,AIOPOP ;POP BACK INTO CHNL PUSHED FROM
11249 IIOPPR: JUMPE I,[JRST 4,CPOPJ] ;IOPUSH
11250 SETZM (R) ;CLOSE CHANNEL
11251 SUBI R,IOCHNM(U) ;GET CHANNEL NUMBER
11252 MOVE R,CHNBIT(R) ;SECOND WORD INTERRUPT BIT
11253 IORM R,IFPIR(U) ;GIVE TO USER
11257 ;ARG 1 - CHANNEL NUMBER
11258 ;IF ANY OUTPUT IS BUFFERED UP, CAUSES IT TO BE SENT TO THE DEVICE
11259 ;(IF FORCE WAS NOT DONE, IT MIGHT NOT BE SENT UNTIL A COMPLETE
11260 ;BUFFERFULL HAD BEEN OUTPUT BY THE USER.)
11262 NFORCE: SKIPA T,[HLRZ T,DFRCTB(D)] ;FORCE USES LH OF TABLE
11263 NFINI1: MOVE T,[HRRZ T,DFRCTB(D)] ;FINISH USES RH OF TABLE
11264 HLRZ A,(R) ;PASS LH(IOCHNM) TO DEVICE ROUTINES
11265 HRRZ D,(R) ;USE RH(IOCHNM) AS BYTE INDEX INTO RSTB
11266 IDIVI D,7 ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11267 ADD D,[440500,,RSTB]
11270 LDB D,D ;GET BYTE FROM TABLE
11271 XCT T ;GET REAL TABLE ENTRY IN T
11275 ;ARG 1 - CHANNEL NUMBER
11276 ;FIRST DOES A FORCE, THEN WAITS FOR ALL OUTPUT TO GET TO THE DEVICE
11278 NFINIS: PUSHJ P,NFORCE ;CALL DEV ROUTINE FOR FORCING
11280 JRST NFINI1 ;THEN CALL DEV ROUTINE FOR WAITING
11282 ;.NETS CH, - UUO VERSION OF .CALL FORCE.
11283 ANETS: PUSHJ P,NFORCE
11284 JRST IOCER1 ;ILLEGAL HARDWARE OPERATION
11287 SUBTTL I/O DEVICE DISPATCH TABLES
11290 This page tries to document the ITS I/O device dispatch tables and
11291 dispatch environment. It is not completed yet.
11293 The tables use several different indices, which are:
11294 opnidx - result of device name lookup in DEVTAB
11295 ioidx - result of OPEN; has symbolic values. This is the index
11296 stored in RH of IOCHNM (per-job channel table)
11297 sidx - secondary index from DCHSTB(ioidx)
11298 ridx - secondary index from RSTB(ioidx)
11300 The following system calls are dispatched through these tables.
11301 There are 11 dispatch routines that each device must specify.
11302 The format is "CALL [table name(index-used) -> device-routine]"
11304 OPEN [DEVADR(opnidx) -> devO]
11305 "opnidx" is looked up from DEVTAB which holds the device names.
11306 The device's OPEN routine is in the RH of DEVADR.
11307 It must set up the user's IOCHNM word for the channel,
11308 by setting the RH to the right "ioidx" and the LH to whatever
11313 CLOSE [CLSTB(ioidx) -> devCLS]
11314 The device's CLOSE routine is in the RH of CLSTB.
11315 It must zero the user's IOCHNM word for the channel.
11319 IOT, SIOT [IOTTB(ioidx) -> devVarious]
11320 These routines do I/O transfers. The main reason "ioidx"
11321 has so many possible values (causing IOTTB to be large) is
11322 because lots of devices specify different ioidx's for different
11323 modes - input/output, block/unit, image/ascii, etc - in order
11324 to speed up actual I/O transfers, which are probably the most
11325 common device-related system calls.
11329 STATUS [LH(DTSTB(sidx)) -> devSTA]
11331 WHYINT [RH(DTSTB(sidx)) -> devWHY]
11333 RCHST, RFNAME [LH(DRFNTB(sidx)) -> devRCH]
11335 RFPNTR [RH(DRFNTB(sidx)) -> devRFP]
11337 IOPUSH, IOPOP [LH(RSTBI(ridx)) -> devIOP]
11339 RESET [RH(RSTBI(ridx)) -> devRST]
11341 FORCE [LH(DFRCTB(ridx)) -> devFRC]
11343 FINISH [RH(DFRCTB(ridx)) -> devFIN]
11347 ;DISPATCH TABLE FOR .CLOSE UUO
11348 ;TRANSFERED THROUGH USING RIGHT HALF OF IOCHNM WORD AS AN INDEX
11349 ;R HAS THE ADDRESS OF THE IOCHNM WORD.
11351 ;VARIOUS ROUTINES USE THE BITS IN THE L.H. TO DECIDE WHETHER
11352 ;A CHANNEL IS ACCEPTABLE FOR SOME OPERATION.
11354 %CLSU==400000 ;USR DEVICE (INFERIOR)
11355 %CLSDO==200000 ;DECTAPE OUTPUT
11356 %CLSJI==100000 ;JOB INPUT
11357 %CLSDI==40000 ;DECTAPE INPUT
11358 %CLSTI==20000 ;TTY INPUT
11359 %CLSCL==10000 ;CORE-LINK DEVICE
11360 %CLSBJ==4000 ;BOJ DEVICE
11361 %CLSQO==2000 ;DISK OUTPUT
11362 %CLSFU==1000 ;NON-INFERIOR USR
11363 %CLSNRM==400 ;STANDARD CLOSE ROUTINE USED FOR THIS DEVICE.
11364 ;RH SHOULD POINT, NOT AT THEROUTINE, BUT AT THE USR-USE PAIR
11367 %CLSJO==40 ;JOB OUTPUT
11368 %CLSST==20 ;STY DEVICE
11369 %CLST==10 ;TRAP DEVICE
11371 %CLSJ==%CLSJI\%CLSJO ;EITHER DIRECTION OF JOB DEVICE
11372 %CL1QO==%CLSQO\%CLSQ ;BOTH BITS FOR DISK OUTPUT
11376 TYIDN:: REPEAT 2, %CLSTI,,TYICLS ;TYI
11377 TYODN:: REPEAT 2, TYOCLS ;TYO
11378 NLIDN:: REPEAT 4, CPOPJ ;NULL
11379 UWIDN:: REPEAT 4, %CLSU ,,CPOPJ ;USER
11380 FUWIDN:: REPEAT 2, %CLSFU,,CPOPJ ;FOREIGN USER
11381 DNDIRH:: DIRHCL ;DIRHNG
11382 DNTRAP:: %CLST,,CPOPJ ;TRAP
11383 DNLCK:: LCKCL ;LOCK
11384 IFN KS10P,DNUBI:: UBICL ;UNIBUS INTERRUPT
11385 IFN CHAOSP,CHAIDN:: REPEAT 2, CHACLS ;CHAOS NET
11387 DNUACII:: REPEAT 3,[
11388 %CLSDI,,UTICL ;UTAPE.
11391 IFN OLPTP,LPTDN:: REPEAT 2, LPTCLS ;LPT
11396 IFN GLPTP,GLPTDN:: REPEAT 2, GLPCLS
11397 DIRCHN:: REPEAT 4, UTDCLS ;DIRECTORY DEVICE
11398 IFN VIDP,NVIDOP:: REPEAT 2, NVDCLS ;NVIDI
11399 IFN PLTP,PLTDN:: REPEAT 2, %CLSNR,,PLTUSR ;PLOTTER
11401 PTPI:: REPEAT 5, %CLSNR,,PTPUSR ;PAPER TAPE PUNCH
11403 IFN IMXP,IMPXDN:: REPEAT 4, IMPXCL ;IMX
11404 IFN OMXP,OMPXDN:: REPEAT 4, OMPXCL ;OMX
11405 DCLUAI:: %CLSCL,,CLCLRA ;CORE LINK
11412 REDUAI:: REPEAT 5, PTRCLS ;PAPER TAPE READER
11415 DN340B:: REPEAT 4, ADCL1 ;340
11419 CODDN:: REPEAT 2, CODCLS ;CODE DEV
11421 DQUAI:: %CLSQ ,,QICL ;DISK
11427 IFN VIDP,DNVDIU:: REPEAT 4, TVCCLS ;TVC
11428 IFN PDP6P,PDPUIO:: REPEAT 4, %CLS6 ,,PDPCLS ;USR IN PDP10 MODE
11429 IFN TABP,DTABUI:: REPEAT 2, %CLSNR,,TABUSR ;TABLET
11431 MTUAIX:: REPEAT 3, MTICL ;MAG TAPE
11435 %CLSJI,,JOBCLS ;JOB DEVICE
11438 BDUAI:: REPEAT 6, %CLSBJ,,CPOPJ ;BOJ
11439 IIOPOP:: [JRST 4,CPOPJ] ;INTERRUPT ON IOPOP DEVICE
11441 STYDUI:: REPEAT 2,[ ;PSEUDO TTY
11445 IFN NCPP,NETDUI:: REPEAT 4, NETCLS ; Arpanet NCP
11446 IFN TCPP,TCPDUI:: REPEAT 4, TCPCLS ; Internet TCP
11447 IFN INETP,IPQDN:: IPQCLS ; Internet Queue
11448 IFN MSPP,MSPIO:: MSCLOS ;MESS SWITCHER (DM)
11449 IFN STKP,STKDP:: STKCLS ;STANFORD KEYBOARD
11450 IFN NTYP,NTYIT:: REPEAT 4, NTYCLS ;A KLUDGE ON THE NTY
11452 IF2,IFN .-CLSTB-LIOTTB,.ERR BARF AT CLSTB
11454 ;DISPATCH TABLE FOR .IOT UUO
11455 ;TRANSFERED THROUGH USING RIGHT HALF OF I/O CHANNEL WORD AS AN INDEX
11457 %IOTBK==400000 ;4.9 = 1 => BLOCK = 0 => UNIT
11458 %IOTOT==200000 ;4.8 = 1 => OUTPUT = 0 => INPUT "
11459 %IOTBP==100000 ;4.7 = 1 => THERE IS A SPECIAL ROUTINE FOR SIOT,
11460 ;AND ITS ADDRESS IS -1 + RH(IOTTB WORD).
11461 %IOTSP==40000 ;4.6 => THIS DEVICE IS FUNNY. SIOT ISN'T ALLOWED,
11462 ;AND IOT LETS THE DEVICE RTN DO ALL THE WORK.
11463 ;PRESENT ONLY FOR UNIT INPUT MODES.
11464 %IOT10==20000 ;4.5 => THIS CHANNEL WAS OPENED WITH BIT 1.4 SET IN MODE
11465 %IOTIM==10000 ;4.4 => THIS CHANNEL WAS OPENED WITH BIT 1.3 (IMAGE MODE) SET IN MODE
11466 ; 4000 ;4.3 COPIES %IOTBK. THUS, BITS 4.5-4.2 REFLECT THE BOTTOM 4 BITS
11467 ; 2000 ;4.2 COPIES %IOTOT. OF THE OPEN-MODE.
11468 %IOTOM==36000 ;BITS 4.5 - 4.2
11470 %IOTBO==606000 ;BLOCK OUTPUT.
11471 %IOTBI==404000 ;BLOCK INPUT.
11472 %IOTUO==202000 ;UNIT OUTPUT.
11473 %IOTUI==000000 ;UNIT INPUT.
11477 TYIDN:: %IOTUI,,TYI ;TTY ENTRIES MUST BE COMPACT
11478 TYIBN:: %IOTBI,,TTYBI
11479 TYODN:: %IOTUO,,TYO (%IOTBP)
11480 TYOBN:: %IOTBO,,TTYBO ;LAST TTY DEVICE
11481 NLIDN:: %IOTUI,,NULI
11482 NLBIDN:: %IOTBI,,NULBI
11483 NLODN:: %IOTUO,,CPOPJ
11484 NLBDN:: %IOTBO,,NULBOD
11485 UWIDN:: %IOTUI,,UWI (%IOTIM)
11486 UBIDN:: %IOTBI,,UBI
11487 UWODN:: %IOTUO,,UWO (%IOTIM)
11488 UBODN:: %IOTBO,,UBO
11489 FUWIDN:: %IOTUI,,UWI (%IOT10)
11490 FUBIDN:: %IOTBI,,UBI (%IOT10)
11491 DNDIRH:: %IOTUI,,IOCR10
11493 DNLCK:: %IOTUO,,IOCR10
11495 DNUBI:: %IOTUI,,IOCR10
11498 CHAIDN:: %IOTUI+%IOTBP,,CHAUI
11499 CHAODN:: %IOTUO+%IOTBP,,CHAUO
11502 DNUACII:: %IOTUI,,UASCII
11503 DNUACCO:: %IOTUO,,UASCCO
11504 DNUBKI:: %IOTBI,,UBLKI
11505 DNUBKO:: %IOTBO,,UBLKO
11506 DNUDTI:: %IOTUI,,UDATAI (%IOTIM)
11507 DNUDTO:: %IOTUO,,UDATAO (%IOTIM)
11510 LPTDN:: %IOTUO,,PILPT1
11511 LPTBN:: %IOTBO,,BLPTO
11514 NLPTDN:: %IOTUO,,NLPT1
11515 NLPTBN:: %IOTBO,,BNLPTO
11518 GLPTDN:: %IOTUO,,GLPTDO (%IOTBP)
11519 GLPTBN:: %IOTBO,,GLPTBO
11521 DIRCHN:: %IOTUI,,DIRCH
11522 DIRBN:: %IOTBI,,DIRB
11523 NDATAI:: %IOTUI,,DDATAI (%IOTIM+%IOTBP)
11524 NBLKI:: %IOTBI,,DBLKI (%IOTIM)
11526 NVIDOP:: %IOTUI,,NVIDIT (%IOTSP)
11527 BNVIDO:: %IOTBI,,BNVIDI
11530 PLTDN:: %IOTUO,,PLOT
11531 PLTBN:: %IOTBO,,BPLOT
11534 PTPI:: %IOTUO,,PIPUN (%IOT10)
11535 PTPA:: %IOTUO,,APIPUN
11536 PTPB:: %IOTBO,,BPIPUN
11537 PTPWA:: %IOTUO,,WAPIPN (%IOTIM)
11538 PTPWB:: %IOTBO,,WBPIPN (%IOTIM)
11541 IMPXDN:: %IOTUI,,IMPXS (%IOTSP)
11542 IMXDN:: %IOTUI,,IMPXS1 (%IOTSP)
11543 BIMXDN:: %IOTBI,,BIMXS1 (%IOTSP)
11544 BIMPXD:: %IOTBI,,BIMPXS (%IOTSP)
11547 OMPXDN:: %IOTUO,,OMPXS (%IOTSP)
11548 OMXDN:: %IOTUO,,OMXDS (%IOTSP)
11549 BOMXDN:: %IOTBO,,BOMXDS (%IOTSP)
11550 BOMPXD:: %IOTBO,,BOMPXS (%IOTSP)
11552 DCLUAI:: %IOTUI,,CLUAI
11553 DCLUAO:: %IOTUO,,CLUAO
11554 DCLBI:: %IOTBI,,CLBI
11555 DCLBO:: %IOTBO,,CLBO
11556 DCLUBI:: %IOTUI,,CLUBI (%IOTIM)
11557 DCLUBO:: %IOTUO,,CLUBO (%IOTIM)
11559 REDUAI:: %IOTUI,,PTRUAI
11560 REDBAI:: %IOTBI,,PTRBAI
11561 REDUII:: %IOTUI,,PTRUII (%IOTIM)
11562 REDBII:: %IOTBI,,PTRBII (%IOTIM)
11563 REDUTI:: %IOTUI,,PTRUTI (%IOT10)
11566 DN340B:: %IOTBO,,340B ;340 ENTRIES MUST BE COMPACT; BLOCK FIRST, THEN UNIT
11567 DN340W:: %IOTUO,,340W (%IOTSP)
11568 DN340C:: %IOTUO,,340C (%IOTSP)
11569 DN340H:: %IOTUO,,340H (%IOTSP)
11570 ;DN340I:: %IOTUO,,340I (%IOTSP)
11571 DN340L:: ;LAST 340 DEVICE ENTRY
11574 CODDN:: %IOTUO,,SEND
11575 CODBN:: %IOTBO,,BSEND
11577 DQUAI:: %IOTUI,,QUAI (%IOTBP)
11578 DQUAO:: %IOTUO,,QUAO (%IOTBP)
11581 DQUII:: %IOTUI,,QUII (%IOTIM %IOTBP)
11582 DQUIO:: %IOTUO,,QUIO (%IOTIM %IOTBP)
11584 DNVDIU:: %IOTUI,,RNVDIU (%IOTSP)
11585 DNVDIB:: %IOTBI,,RNVDIB (%IOTSP)
11586 DNVDOU:: %IOTUO,,RNVDOU (%IOTSP)
11587 DNVDOB:: %IOTBO,,RNVDOB (%IOTSP)
11590 PDPUIO:: %IOTUO,,UWO ;BUT JOB WILL BE -1 TO INDICATE PDP6
11591 PDPBIO:: %IOTBO,,UBO
11592 PDPUII:: %IOTUI,,UWI
11593 PDPBII:: %IOTBI,,UBI
11596 DTABUI:: %IOTUI,,UTABI
11597 DTABBI:: %IOTBI,,BTABI
11600 MTUAIX:: %IOTUI,,MTUAI (%IOTBP) ;MAGTAPE
11601 MTUIIX:: %IOTUI,,MTUII (%IOTIM %IOTBP)
11602 MTBIX:: %IOTBI,,MTBI
11603 MTUAOX:: %IOTUO,,MTUAO (%IOTBP)
11604 MTUIOX:: %IOTUO,,MTUIO (%IOTIM %IOTBP)
11605 MTBOX:: %IOTBO,,MTBO
11607 JDUAI:: %IOTUI,,JBUI(%IOTBP)
11608 JDUAO:: %IOTUO,,JBUI(%IOTBP)
11609 JDBI:: %IOTBI,,JBBI
11610 JDBO:: %IOTBO,,JBBI
11611 JDUII:: %IOTUI,,JBUI (%IOTBP %IOTIM)
11612 JDUIO:: %IOTUO,,JBUI (%IOTBP %IOTIM)
11613 BDUAI:: %IOTUI,,BJUI
11614 BDUAO:: %IOTUO,,BJUO
11615 BDBI:: %IOTBI,,BJBI
11616 BDBO:: %IOTBO,,BJBO
11617 BDUII:: %IOTUI,,BJUI (%IOTIM)
11618 BDUIO:: %IOTUO,,BJUO (%IOTIM)
11619 IIOPOP:: [JRST 4,CPOPJ] ;INTERRUPT ON IOPOP DEVICE
11620 ISPY:: %IOTUI,,SPYI
11621 STYDUI:: %IOTUI,,STTYI ;PSEUDO TTY
11622 STYDUO:: %IOTUO,,STTYW
11623 STYDBI:: %IOTBI,,STTBI
11624 STYDBO:: %IOTBO,,STTBO
11626 NETDUI:: %IOTUI,,NETI
11627 NETDUO:: %IOTUO,,NETW (%IOTBP)
11628 NETDBI:: %IOTBI,,NETBI
11629 NETDBO:: %IOTBO,,NETBO
11632 TCPDUI:: %IOTUI,,TCPI (%IOTBP)
11633 TCPDUO:: %IOTUO,,TCPW (%IOTBP)
11634 TCPDBI:: %IOTBI,,TCPBI
11635 TCPDBO:: %IOTBO,,TCPBO
11638 IPQDN:: IPQIO ; No I/O calls used on this dev!
11647 NTYIT:: %IOTUI,,NTYTI ;KLUDGE FOR FAST, LARGE BUFFER ON NTY
11648 NTYOT:: %IOTUO,,NTYTO
11649 NTYBIT:: %IOTBI,,NTYBI
11650 NTYBOT:: %IOTBO,,NTYBO
11655 ;TABLES FOR VARIOUS CHANNEL STATUS CALLS
11657 ;DCHSTB - INDEXED BY IOTTB INDEX (RH OF IOCHNM)
11658 ;LH SIXBIT MAIN DEVICE NAME
11659 ;1.1-2.3 INDEX INTO THE NEXT TWO TABLES
11660 ;2.4-2.9 SYSTEM PERIPHERAL DEVICE CODE (FOR .STATUS)
11661 .SEE DCHSTB ;ASSEMBLED SECOND TO GET VALUES OF THE TEMPORARY %%dev SYMBOLS.
11663 ;DSTSTB - INDEX FROM DCHSTB
11664 ;LH STATUS ROUTINE, RH WHYINT ROUTINE (OPNL34 IF DEVICE DOESN'T GIVE 2ND WD INTS)
11666 DSTSTB: CPOPJ,,OPNL44 ;0 CHANNEL NOT OPEN
11667 STDSTA,,OPNL34 ;1 RANDOM DEVICE
11668 CPOPJ,,OPNL34 ;2 OTHER KIND OF RANDOM DEVICE
11669 STATYI,,TYIWHY ;3 TTY INPUT
11670 STATYO,,TYOWHY ;4 TTY OUTPUT
11671 CPOPJ,,OPNL34 ;5 USR DEVICE
11672 CPOPJ,,OPNL34 ;6 DIR "DEVICE"
11673 CLISTA,,OPNL34 ;7 CORE LINK INPUT
11674 STDSTA,,OPNL34 ;10 CORE LINK OUTPUT
11675 CPOPJ,,OPNL34 ;11 DISK
11676 JBSTAT,,OPNL22 ;12 JOB DEVICES (WHYINT SHOULDN'T GET HERE)
11677 CPOPJ,,OPNL34 ;13 BOJ DEVICE
11678 STASTI,,STIWHY ;14 STY INPUT
11679 STASTO,,STOWHY ;15 STY OUTPUT
11680 CPOPJ,,TRPDEV ;16 TRAP DEVICE
11681 CPOPJ,,OPNL34 ;17 DIRHNG DEVICE
11682 CPOPJ,,OPNL34 ;20 SPY DEVICE
11683 CPOPJ,,OPNL34 ;21 LOCK DEVICE
11684 OFFSET -DSTSTB ;BEGIN OPTIONAL DEVICES
11685 IFN KS10P, %%UBI:: CPOPJ,,OPNL34
11686 IFN NMTCS, %%MT:: STAMTC,,OPNL34
11687 IFN NUNITS,%%UTP:: CPOPJ,,OPNL34
11688 IFN OLPTP, %%OLP:: STALPT,,OPNL34
11689 IFN NCPP, %%NET:: STANET,,NETWHY
11690 IFN TCPP, %%TCP:: TCPSTA,,TCPWHY
11691 IFN INETP, %%IPQ:: IPQSTA,,IPQWHY
11692 IFN CHAOSP,%%CHA:: CPOPJ,,CHAWHY
11695 ;DRFNTB - INDEX FROM DCHSTB
11696 ;LH RFNAME ROUTINE, RH RFPNTR ROUTINE OR OPNL34 IF NOT RANDOM ACCESS
11698 DRFNTB: CPOPJ,,OPNL44 ;0 CHNL NOT OPEN
11699 CPOPJ,,OPNL34 ;1 RANDOM DEVICE
11700 CPOPJ,,OPNL34 ;2 OTHER KIND OF RANDOM DEVICE
11701 RCHTTY,,OPNL34 ;3 TTY INPUT
11702 RCHTTY,,OPNL34 ;4 TTY OUTPUT
11703 RCHUSR,,RFPUSR ;5 USR DEVICE
11704 RCHDIR,,OPNL34 ;6 DIR "DEVICE"
11705 RCHCLO,,OPNL34 ;7 CORE LINK INPUT
11706 RCHCLO,,OPNL34 ;10 CORE LINK OUTPUT
11707 RCHQSK,,RFPQSK ;11 DISK
11708 RFNJOB,,RFPJOB ;12 JOB DEVICES
11709 RCHBOJ,,OPNL34 ;13 BOJ DEVICE
11710 RCHSTY,,OPNL34 ;14 STY INPUT
11711 RCHSTY,,OPNL34 ;15 STY OUTPUT
11712 CPOPJ,,CPOPJ ;16 TRAP DEVICE
11713 RCHDRH,,OPNL34 ;17 DIRHNG DEVICE
11714 SPYRCH,,OPNL34 ;20 SPY DEVICE
11715 LCKRCH,,OPNL34 ;21 LOCK DEVICE
11716 OFFSET -DRFNTB ;BEGIN OPTIONAL DEVICES
11717 IFN KS10P, %%UBI:: UBIRCH,,OPNL34
11718 IFN NMTCS, %%MT:: RCHMGT,,OPNL34
11719 IFN NUNITS,%%UTP:: RCHUTP,,OPNL34
11720 IFN OLPTP, %%OLP:: CPOPJ,,OPNL34
11721 IFN NCPP, %%NET:: NETRCH,,OPNL34
11722 IFN TCPP, %%TCP:: TCPRCH,,TCPRFP
11723 IFN INETP, %%IPQ:: IPQRCH,,IPQRFP
11724 IFN CHAOSP,%%CHA:: CHARCH,,OPNL34
11726 IFN <.-DRFNTB>-<DRFNTB-DSTSTB>, .ERR DRFNTB & DSTSTB NOT SAME LENGTH
11728 DEFINE XX NTIMES,DEVNAM,DN,SNXXX,IDX
11729 IFNB DN, DN==:.-DCHSTB ;CHECK THAT DCHSTB IS IN SAME ORDER AS IOTTB
11730 IFG SIXBIT/DEVNAM/, ZZ==[SIXBIT/DEVNAM/] ;DECIDE WHETHER FITS IN LH
11732 IFE SIXBIT/DEVNAM/&777777, ZZ==(SIXBIT/DEVNAM/)
11733 .ELSE ZZ==[SIXBIT/DEVNAM/]
11735 REPEAT NTIMES, ZZ,,SNXXX_14+IDX
11738 DCHSTB: XX 1,,,,0 ;CHNL NOT OPEN
11739 XX 2,TTY,TYIDN,,3 ;TTY INPUT
11740 XX 2,TTY,TYODN,,4 ;TTY OUTPUT
11741 XX 4,NUL,NLIDN,SNNUL,1 ;NUL DEVICE
11742 XX 4,USR,UWIDN,SNUSR,5 ;USR DEVICE
11743 XX 2,USR,FUWIDN,SNFUSR,5 ;FOREIGN USR
11744 XX 1,DIRHNG,DNDIRH,SNDIRH,17 ;DIRHNG
11745 XX 1,TRAP,DNTRAP,SNTRAP,16 ;TRAP
11746 XX 1,LOCK,DNLCK,SNLCK,21 ;LOCK
11747 IFN KS10P, XX 1,UBI,DNUBI,SNUBI,%%UBI ;UBIBUS INTERRUPT
11748 IFN CHAOSP, XX 2,CHAOS,CHAIDN,SNCHA,%%CHA ;CHAOS NET
11749 IFN NUNITS, XX 6,UT,DNUACII,SNUTC,%%UTP ;MICRO TAPE
11750 IFG LPTP-1, XX 2,OLP,LPTDN,SNLPD,%%OLP ;DATA PRODUCTS LPT IN 2-LPT SYSTEM
11751 .ELSE IFN OLPTP, XX 2,LPT,LPTDN,SNLPD,%%OLP ;DATA PRODUCTS LPT
11752 IFN NLPTP, XX 2,LPT,NLPTDN,SNLPV,1 ;"VOGUE" LPT (ACTUALLY ODEC)
11753 IFN GLPTP, XX 2,LPT,GLPTDN,SNLPV,1 ;GOULD LPT
11754 XX 4,DIR,DIRCHN,SNDIR,6 ;DIR "DEVICE"
11755 IFN VIDP, XX 2,NVD,NVIDOP,SNBAT,2 ;VIDISSECTOR
11756 IFN PLTP, XX 2,PLT,PLTDN,SNPLT,1 ;PLOTTER
11757 IFN PTRP, XX 5,PTP,PTPI,SNPTP,1 ;PAPER TAPE PUNCH
11758 IFN IMXP, XX 4,IMX,IMPXDN,SNIMPX,1 ;INPUT A/D MULTIPLEXOR
11759 IFN OMXP, XX 4,OMX,OMPXDN,SNOMPX,1 ;OUTPUT A/D MULTIPLEXOR
11760 XX 3,CLO,DCLUAI,SNCLK,7 ;CORE LINK INPUT
11761 XX 3,CLO,DCLBO,SNCLK,10 ;CORE LINK OUTPUT
11762 IFN PTRP, XX 5,PTR,REDUAI,SNPTR,1 ;PAPER TAPE READER
11763 IFN 340P, XX 4,DIS,DN340B,SN340,2 ;340 DISPLAY
11764 ;IFN 340P, XX 1,IDS,DN340I,SN340I,2 ;340 INTERPRETIVE DISPLAY
11765 IFN CODP, XX 2,COD,CODDN,SNCOD,1 ;CODE
11766 XX 6,DSK,DQUAI,SN2311,11 ;DISK
11767 IFN VIDP, XX 4,TVC,DNVDIU,SNBAT,2 ;TV CAMERA
11768 IFN PDP6P, XX 4,PDP,PDPUIO,SNPDP,5 ;PDP-6 DEVICE
11769 IFN TABP, XX 2,TAB,DTABUI,SNTAB,2 ;TABLET
11770 IFN NMTCS, XX 6,MT0,MTUAIX,SNMTC,%%MT ;MAGTAPE
11771 XX 6,JOB,JDUAI,SNJOB,12 ;JOB DEVICES
11772 XX 6,BOJ,BDUAI,SNBOJ,13 ;BOJ DEVICE
11773 XX 1,IIP,IIOPOP,0,2 ;INTERRUPT-ON-IOPOP DEVICE
11774 XX 1,SPY,ISPY,SNSPY,20 ;SPY
11776 XX 1,STY,,SNSTY,14 ;STY INPUT
11777 XX 1,STY,,SNSTY,15 ;STY OUTPUT
11779 IFN NCPP, XX 4,NET,NETDUI,SNNET,%%NET ; Arpanet NCP
11780 IFN TCPP, XX 4,TCP,TCPDUI,SNTCP,%%TCP ; Internet TCP
11781 IFN INETP, XX 1,IPQ,IPQDN,SNIPQ,%%IPQ ; Internet Queue
11782 IFN MSPP, XX 1,MSP,MSPIO,SNMSP,2 ;MS SWITCH HACK
11783 IFN STKP, XX 1,STK,STKDP,SNSTK,2 ;STANFORD KEYBOARD
11784 IFN NTYP, XX 4,NTY,NTYIT,SNNUL,2 ;NTY 11 KLUDGE
11786 IFN .-DCHSTB-LIOTTB,.ERR BARF AT DCHSTB
11787 EXPUNGE XX,%%UBI,%%MT,%%UTP,%%OLP,%%NET,%%TCP,%%CHA,%%IPQ
11789 DCHSTE==.-1 ;END FOR GETSYS (CHDEVS)
11791 ;RSTB - INDEXED BY IOTTB INDEX FROM RH(IOCHNM)
11792 ;THIS TABLE IS IN 5-BIT BYTES; THE VALUES ARE THE INDICES
11793 ;INTO THE RSTB1 AND DFRCTB TABLES.
11794 .SEE RSTB ;ASSEMBLED SECOND TO GET VALUES OF TEMPORARY %%dev SYMBOLS.
11796 ;RSTB1 - INDEX FROM RSTB (BELOW)
11797 ;LH IOPUSH/POP ROUTINE, RH RESET ROUTINE
11798 RSTB1: CPOPJ,,CPOPJ ;0 RANDOM DEVICE
11799 TYIIOP,,TYIRS ;1 TTY INPUT
11800 TYOIOP,,TYORS ;2 TTY OUTPUT
11801 CPOPJ,,USRST ;3 USR DEVICE
11802 CPOPJ,,JBIRS ;4 JOB INPUT
11803 CPOPJ,,JBORS ;5 JOB OUTPUT
11804 IIOPPR,,[JRST 4,CPOPJ] ;6 INTERRUPT ON IOPOP DEVICE
11805 STYIIP,,STYIRS ;7 STY INPUT
11806 STYOIP,,STYORS ;10 STY OUTPUT
11807 CPOPJ,,CPOPJ ;11 DISK OUTPUT
11808 DIRHIP,,CPOPJ ;12 DIRHNG
11809 CPOPJ,,TRPDEV ;13 TRAP
11810 OFFSET -RSTB1 ;OPTIONAL DEVICES BEGIN HERE
11811 IFN KS10P, %%UBI:: UBIIOP,,CPOPJ
11812 IFN OLPTP, %%LPT:: CPOPJ,,LPTRS
11813 IFN NLPTP, %%NLP:: CPOPJ,,NLPTRS
11814 IFN PLTP, %%PLT:: CPOPJ,,PLTRS
11815 IFN PTRP, %%PTR:: CPOPJ,,PTRRS
11816 IFN PTRP, %%PTP:: CPOPJ,,PUNCLR
11817 IFN IMXP, %%IMX:: CPOPJ,,IMPXRS
11818 IFN 340P, %%340:: CPOPJ,,DSIZAP
11819 IFN CODP, %%COD:: CODIOP,,CODRS
11820 IFN PDP6P, %%PDP:: PDPIOP,,PDPRST
11821 IFN TABP, %%TAB:: CPOPJ,,TABCLR
11822 IFN NCPP, %%NET:: NETIOP,,NETRS
11823 IFN TCPP, %%TCP:: TCPIOP,,TCPRST
11824 IFN INETP, %%IPQ:: IPQIOP,,IPQRST
11825 IFN STKP, %%STK:: CPOPJ,,STKRS
11826 IFN CHAOSP,%%CHA:: CHAIOP,,CPOPJ
11829 ;DFRCTB - INDEX FROM RSTB (BELOW)
11830 ;LH FORCE ROUTINE, RH FINISH ROUTINE
11831 DFRCTB: OPNL34,,OPNL34 ;0 RANDOM DEVICE
11832 OPNL2,,OPNL2 ;1 TTY INPUT (ILLEGAL)
11833 POPJ1,,TTYFIN ;2 TTY OUTPUT
11834 OPNL34,,OPNL34 ;3 USR
11835 OPNL2,,OPNL2 ;4 JOB (SHOULDN'T GET HERE?)
11836 OPNL22,,OPNL22 ;5 JOB (SHOULDN'T GET HERE?)
11837 OPNL22,,OPNL22 ;6 IIP (SHOULDN'T GET HERE)
11838 OPNL2,,OPNL2 ;7 STY INPUT (ILLEGAL)
11839 POPJ1,,STYFIN ;10 STY OUTPUT
11840 QSKFRC,,QSKFIN ;11 DISK OUTPUT
11841 OPNL34,,OPNL34 ;12 DIRHNG
11842 TRPDEV,,TRPDEV ;13 TRAP
11843 OFFSET -DFRCTB ;OPTIONAL DEVICES BEGIN HERE
11844 IFN KS10P, %%UBI:: OPNL34,,OPNL34
11845 IFN OLPTP, %%LPT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11846 IFN NLPTP, %%NLP:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11847 IFN PLTP, %%PLT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11848 IFN PTRP, %%PTR:: OPNL34,,OPNL34
11849 IFN PTRP, %%PTP:: POPJ1,,PUNFIN
11850 IFN IMXP, %%IMX:: OPNL34,,OPNL34
11851 IFN 340P, %%340:: OPNL34,,OPNL34
11852 IFN CODP, %%COD:: POPJ1,,CODFIN
11853 IFN PDP6P, %%PDP:: OPNL34,,OPNL34
11854 IFN TABP, %%TAB:: OPNL34,,OPNL34
11855 IFN NCPP, %%NET:: NETFRC,,NETFIN
11856 IFN TCPP, %%TCP:: TCPFRC,,TCPFIN
11857 IFN INETP, %%IPQ:: IPQFRC,,IPQFIN
11858 IFN STKP, %%STK:: OPNL34,,OPNL34
11859 IFN CHAOSP,%%CHA:: CHAFRC,,CHAFIN
11862 ;TABLE OF INDICES INTO THE RSTB1, DFRCTB TABLES ON THE PRECEDING PAGE
11863 ;THESE INDICES ARE UNRELATED TO THE INDICES IN DCHSTB A COUPLE PAGES BACK.
11864 ;NOTE THAT THE %% SYMBOLS ARE PURELY TEMPORARY AND EXPUNGED AT THE BOTTOM OF THIS PAGE.
11869 REPEAT 2,1 ;TTY INPUT
11870 REPEAT 2,2 ;TTY OUTPUT
11871 REPEAT 4,0 ;NUL DEVICE
11872 REPEAT 4,3 ;USR DEVICE
11873 REPEAT 2,0 ;FOREIGN USR
11877 IFN KS10P, %%UBI ;UNIBUS INTERRUPT
11878 IFN CHAOSP, REPEAT 2,%%CHA
11879 IFN NUNITS, REPEAT 6,0 ;DEC TAPE
11880 IFN OLPTP, REPEAT 2,%%LPT
11881 IFN NLPTP, REPEAT 2,%%NLP
11882 IFN GLPTP, REPEAT 2,0
11883 REPEAT 4,0 ;DIR "DEVICE"
11884 IFN VIDP, REPEAT 2,0
11885 IFN PLTP, REPEAT 2,%%PLT
11886 IFN PTRP, REPEAT 5,%%PTP
11887 IFN IMXP, REPEAT 4,%%IMX
11888 IFN OMXP, REPEAT 4,0
11889 REPEAT 6,0 ;CORE LINK.
11890 IFN PTRP, REPEAT 5,%%PTR
11891 IFN 340P, REPEAT 4,%%340
11893 IFN CODP, REPEAT 2,%%COD ;CODE
11894 REPEAT 3, 0 ? 11 ;DISK IN, DISK OUT
11895 IFN VIDP, REPEAT 4,0
11896 IFN PDP6P, REPEAT 4,%%PDP ;PDP-6 DEVICE
11897 IFN TABP, REPEAT 2,%%TAB
11898 IFN NMTCS, REPEAT 6,0 ;MAGTAPE
11902 REPEAT 3,[0 ;BOJ INPUT
11905 6 ;INTERRUPT ON IOPOP DEVICE
11907 7 ? 10 ? 7 ? 10 ;PSEUDO-TTY
11908 IFN NCPP, REPEAT 4,%%NET ;NET RESET INR/INS
11909 IFN TCPP, REPEAT 4,%%TCP ; TCP RESET
11910 IFN INETP, %%IPQ ; Internet Queue
11911 IFN MSPP, 0 ;MS SWITCH HACK
11912 IFN STKP, %%STK ;STANFORD KEYBOARD
11913 IFN NTYP, REPEAT 4,0 ;NTY 11 KLUDGE
11915 IFN LIOTTB-.BYTC,.ERR BARF AT RSTB
11917 EXPUNGE %%UBI,%%LPT,%%NLP,%%PLT,%%PTR,%%PTP,%%IMX,%%340,%%COD,%%PDP,%%TAB,%%NET,%%TCP,%%STK,%%CHA,%%IPQ
11922 DEFINE DV NAME,OPNRTE,BITS,TAG
11924 DVHR [DEFINE DVHR X,Y
11925 X!][TAG BITS,,OPNRTE
11929 ;DEVICE TABLES FOR AOPEN
11931 ;DEVTAB SIXBIT NAME
11933 %DVIN==400000 ;4.9 DEVICE CAN DO INPUT
11934 %DVOUT==200000 ;4.8 DEVICE CAN DO OUTPUT
11935 %DVDIR==100000 ;4.7 DEVICE CAN GIVE DIRECTORY
11936 %DVDEL==40000 ;4.6 ALLOW DELETE/RENAME
11937 %DVLNK==20000 ;4.5 ALLOW MLINK
11938 ;RIGHT HALF, OPEN ROUTINE ADDRESS
11939 %DV==1,,520000 ;BIT TYPEOUT MASK
11942 IFN NLPTP, DV LPT,NLPTO,%DVOUT
11943 IFG OLPTP-NLPTP,DV LPT,LPTO,%DVOUT
11944 IFG LPTP-1, DV OLP,LPTO,%DVOUT
11945 IFN GLPTP, DV LPT,GLPTO,%DVOUT
11946 IFN TTLPTP, DV LPT,LPTO,%DVOUT
11948 DV DSK,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAQSK:
11949 DV COM,COMO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11950 MNAME [ DV ],QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;"AI:" ON
11952 DV SYS,SYSO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11953 DV DNRF,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11954 DV DNR,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11955 DV DIRHNG,DIRHO,%DVIN
11956 DV TRAP,TRPDEV,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11957 DV LOCK,LCKO,%DVOUT
11959 DV TTY,TTYO1,%DVIN+%DVOUT+%DVDIR
11960 DV NUL,NULO,%DVIN+%DVOUT
11961 DV USR,USRO,%DVIN+%DVOUT
11962 IFN VIDP, DV NVD,NVIDI,%DVIN+%DVOUT
11963 IFN CHAOSP, DV CHAOS,CHASO,%DVIN+%DVOUT
11964 IFN NCPP, DV NET,NETO,%DVIN+%DVOUT
11965 IFN TCPP, DV TCP,TCPO,%DVIN+%DVOUT
11966 IFN INETP, DV IPQ,IPQO,%DVIN+%DVOUT
11967 IFN MSPP, DV IPC,IPCO,%DVIN+%DVOUT
11968 DV STY,STTYO,%DVIN+%DVOUT
11969 DV JOB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAJOB:
11970 DV BOJ,BOJO,%DVIN+%DVOUT
11971 DV OJB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11972 IFN STKP, DV STK,STKO,%DVIN
11973 IFN PLTP, DV PLT,PLOTO,%DVOUT
11974 IFN PLTP, DV IPL,IPLO,%DVOUT ;INTERPRETED PLOTTER
11975 IFN XGP, DV XPL,XPLO,%DVOUT
11976 IFN IMXP, DV IMX,IMPXO,%DVIN
11977 IFN OMXP, DV OMX,OMPXO,%DVOUT
11978 IFN PTRP, DV PTR,PTRO,%DVIN
11979 IFN PTPP, DV PTP,PTPO,%DVOUT
11980 IFN 340P, DV DIS,DISO,%DVOUT ;340 AS OUTPUT DEVICE
11981 ;IFN 340P, DV IDS,IDISO,%DVOUT ;340 AS INTERPRETED DISPLAY
11982 DV CLU,CLUO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11983 DV CLO,CLOO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11984 DV CLI,CLIO,%DVOUT+%DVDIR+%DVDEL
11985 DV CLA,CLAO,%DVIN+%DVDIR+%DVDEL
11986 IFN CODP, DV COD,CODO,%DVOUT
11987 IFN VIDP, DV TVC,TVCO,%DVIN+%DVOUT
11989 IFN TPLP+TTLPTP&DEMON, DV TPL,TPLO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11990 IFN TABP, DV TAB,TABO,%DVIN
11992 DV COR,CORO,%DVDIR ;DIR=LAST LINE OF TTY^F
11993 IFN NTYP, DV NTY,NTYOPN,%DVIN+%DVOUT ;NTY 11 KLUDGE
11997 DVT1: DV TTY,TTYO,%DVIN+%DVOUT+%DVDIR
11998 DV TY,TTYO,%DVIN+%DVOUT+%DVDIR
11999 DV T,TTYO,%DVIN+%DVOUT+%DVDIR
12000 IFN NUNITS, DV UT,UTO,%DVIN+%DVOUT+%DVDIR+%DVDEL,DVAUT:
12001 DV STY,STTYOA,%DVIN+%DVOUT
12002 DV ST,STTYOA,%DVIN+%DVOUT
12003 DV S,STTYOA,%DVIN+%DVOUT
12004 DV DSK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR UNIT
12005 DV DK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR UNIT
12006 DV PK,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR PACK
12007 DV P,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR PACK
12008 IFN NMTCS, DV MT,MAGTO,%DVIN+%DVOUT ;MAGTAPE
12011 EDEVS==.-1 ;END FOR GETSYS (DEVS)
12014 IFN .-DEVADR-NDEVS-NDV1,.ERR DVHR LOST
12016 SUBTTL .OPER, .CALL DISPATCH
12018 AOPER: MOVE J,R ;AC FIELD OF UUO
12019 ADDI R,IOCHNM(U) ;SET UP IO CHANNEL REFERENCE POINTER
12020 CAIL C,MXOPR ;SKIP IF UUO E FIELD IS LESS THAN MAX OPR
12021 JRST ILUUO ;ILLEGAL OPER
12022 JRST @OPRDSP(C) ;LEGAL OPER-- DISPATCH ON E FIELD OF UUO
12025 OPRIRP A!X ;AITYI,ALISTEN,ASLEEP,ETC.
12030 ACALL: MOVE B,C ;SET UP COPY OF ERR ADR NOT TO BE RELOCATED
12031 JRST @CALDIS(R) ;DISPATCH INDEX OF UUO'S AC FIELD
12048 REPEAT 20-.+CALDIS,ILUUO
12050 SUBTTL MISCELLANEOUS UUO'S
12054 ASHUTD: UMOVE C,(J) ;Arg is time to down in thirtieths.
12055 JUMPL C,AREVIV ;Negative time means REVIVE.
12056 CAMG C,[43200.*30.*60.] ;If time is longer than thirty days
12057 CAIGE C,5*60.*30. ; or less than five minutes
12058 POPJ P, ; Fail (prevent clock delta-T from losing).
12059 ADD C,TIME ;Interval+now is when we will die.
12060 PUSHJ P,SWTL ;Seize shutdown lock.
12062 SKIPGE SHUTDN ;Already down?
12064 PUSHJ P,CLQDEL ;Flush obsolete clock queue entry, if any.
12066 MOVEM C,SHUTDN ;Remember time we will die.
12067 SUB C,TIME ;Interval until death.
12068 LSH C,1 ;Time till death after next clock-queue int.
12069 MOVEM C,DEDTIM ;Remember time until death.
12070 PUSHJ P,DEATHX ;Make DEATH entry on clock queue.
12071 BUG ; DEDTIM says time to die already?
12072 JRST LSWPJ1 ;Unlock shutdowns.
12074 ;READ TIME TILL SYSTEM DOWN
12076 ADIETI: XCTR XW,[SETOM (J)] ;READ -1 IF NOT GOING DOWN
12080 JRST APTUAJ ;GIVE TO USER
12084 AREVIV: PUSHJ P,SWTL
12087 JRST LSWPOP ;NOT DYING
12095 ;FROM CLOCK QUEUE BLOCK
12097 DEATHZ: PUSHJ P,DEATHX
12101 PUSHJ P,SUPSET ;DIE
12105 ;GET VARIOUS SYS STATUS
12107 ASSTAT: CONO PI,CLKOFF
12111 SUBI A,1 ;TIME TILL DOWN IF > 0, -1 IF UP, -2 IF DOWN
12118 MOVE TT,[ITSMCH] ;SIXBIT NAME OF THIS MACHINE.
12120 MOVN Q,USRHI ;Q GETS NUMBER OF FREE JOB SLOTS
12124 ASSTT1: SUBI J,LUBLK
12130 SUBTTL SYMBOLIC SYSTEM CALL HANDLER
12132 ;IN ORDER @A...Z[\]^_ !".../0...9:;,=.? (THAT IS IN NUMERICAL ORDER)
12134 SYSCTB: SIXBIT /ACCESS/ ;IOCHNL, ADR
12137 SIXBIT /CALL/ ;SIXBIT /<NEXT CALL>/
12142 SIXBIT /CLOSE/ ;IOCHNL
12143 SIXBIT /CNSGET/ ;GET SEMIPERMANENT TTY INFO
12144 SIXBIT /CNSSET/ ;SET SEMIPERMANENT INFO (TCMXH, TCTYP, TTYOPT, TTYCOM, ETC)
12145 SIXBIT /CORBLK/ ;HACK PAGE MAP
12146 SIXBIT /CORTYP/ ;READ STATUS OF PAGE.
12147 SIXBIT /DELETE/ ;FILE DELETE
12148 SIXBIT /DELEWO/ ;DELETE FILE OPEN ON SPEC'D CHANNEL
12149 IFN DEMON,SIXBIT /DEMSIG/ ;SIGNAL DAEMON
12150 SIXBIT /DETACH/ ;DISOWN ENTIRE TREE
12153 SIXBIT /DISOWN/ ;DISOWN AN INFERIOR JOB
12154 IFN DL10P, SIXBIT /DL10MP/
12155 SIXBIT /DSKUPD/ ;SIMULATE REFERENCE OF FILE
12156 SIXBIT /ECHOIN/ ;ECHO-NEGOTIATE
12157 SIXBIT /FILBLK/ ; READ NAME AREA OF FILE
12158 SIXBIT /FILLEN/ ;READ FILE LENGTH
12160 SIXBIT /FLAP/ ;TAPE #
12161 SIXBIT /FLUSH/ ;OLD NAME FOR FINISH, EVENTUALLY "
12165 SIXBIT /IOT/ ;IOCHNL, QUAN OR BLK POINTER
12166 IFN INETP,SIXBIT /IPKIOT/
12168 SIXBIT /JOBCAL/ ;GENERAL JOBGET
12169 SIXBIT /JOBGET/ ;JOB CHNL
12170 SIXBIT /JOBINT/ ;JOB CHNL
12172 SIXBIT /JOBRET/ ;JOB CHNL
12174 SIXBIT /JOBSTS/ ;SET JOB CHNL STATUS
12175 IFN KL10P,SIXBIT /KLPERF/ ;ACTIVATE & CONTROL PERFORMANCE METER
12176 SIXBIT /LISTEN/ ;IOCHNL, ADR
12177 SIXBIT /LNKEDP/ ;DISK CH. RETURNS NONZERO IF LINKS WERE TRACED TO OPEN IT.
12178 SIXBIT /LOAD/ ;USER CH, I/O CH, VARBLK
12179 SIXBIT /LOGIN/ ;SIXBIT /<NAME>/
12180 SIXBIT /LOGOUT/ ;. . .
12182 SIXBIT /MLINK/ ;MAKE LINK
12183 IFN NCPP, SIXBIT /NETAC/
12184 SIXBIT /NETBLK/ ;HANG ON NCP STATE
12186 SIXBIT /NETHST/ ;GETS STATUS OF HOST
12187 SIXBIT /NETIMP/ ;GETS STATUS OF IMP
12189 IFN NCPP, SIXBIT /NETINT/
12190 IFN INETP,[ ; A temporary cond, should become permanent.
12191 SIXBIT /NETRFC/ ; Get pending request for connection
12193 SIXBIT /OPEN/ ;FILE OPEN
12194 SIXBIT /PDUMP/ ;USER CH, I/O CH, VARBLK
12195 SIXBIT /PGDUMP/ ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12196 SIXBIT /PGWRIT/ ;DUMP PAGE OUT OF CORE
12197 IFN CHAOSP, SIXBIT /PKTIOT/
12198 IFN QAUTHP, SIXBIT /RAUTH/ ;READ AUTHOR OF FILE
12199 SIXBIT /RCHST/ ;READ OPENED FILENAMES & ACCESS POINTER
12200 SIXBIT /RCPOS/ ;READ CURSOR POS
12201 IFN DEMON,SIXBIT /RDDMST/ ;READ DEAMON STATUS
12202 SIXBIT /RDMPBT/ ;READ FILE DUMPED BIT IOCHN, ADR
12204 SIXBIT /RENAME/ ;FILE RENAME
12205 SIXBIT /RENMWO/ ;RENAME WHILE OPEN
12208 SIXBIT /RESRDT/ ;RESTORE REFERENCE DATE
12209 SIXBIT /RFDATE/ ;READ TIME OF CREATION OF FILE IOCHN, ADR
12210 SIXBIT /RFNAME/ ;READ FILE NAME AND MODE CHANNEL OPEN TO
12211 SIXBIT /RFPNTR/ ;READ ACCESS POINTER
12212 SIXBIT /RQDATE/ ;READ DSK DATE
12213 SIXBIT /RSSIZE/ ;READ SCREEN SIZE
12214 IFN QAUTHP, SIXBIT /SAUTH/ ;SET AUTHOR OF FILE
12215 SIXBIT /SCML/ ;SET # COMMAND LINES
12216 SIXBIT /SCPOS/ ;SET TTY CURSOR POSITION
12217 SIXBIT /SDMPBT/ ;SET FILE DUMPED BIT IOCHN, ADR
12218 SIXBIT /SETIOC/ ;CAUSE IO CHANNEL ERROR IN JOB/BOJ CHANNEL
12219 SIXBIT /SFDATE/ ;SET TIME OF CREATION OF FILE IOCHN, ADR
12220 SIXBIT /SIOT/ ;IOT A STRING GIVEN B.P. AND LENGTH
12221 SIXBIT /SOPEN/ ;OPEN, TAKING MODE,,CHNL AND BP.
12222 SIXBIT /SRDATE/ ;SET REFERENCE DATE
12223 SIXBIT /SREAPB/ ;SET THE DO NOT REAP BIT
12224 SIXBIT /SSERVE/ ;Set .SERVER without timing errors
12225 SIXBIT /SSTATU/ ;READS VARIOUS SYSTEM STATUS
12227 IFN DEMON,SIXBIT /STDMST/ ;SET DEAMON STATUS
12228 SIXBIT /STLGET/ ;GET INFO ON SERVER TELNET CONTROLLING A STY
12229 SIXBIT /STYGET/ ;GET INFO ABOUT SPECIFIED STY
12230 IFN NETP,SIXBIT /STYNET/ ;CONNECT STY TO NETWORK SOCKETS, FOR TELNET SERVERS.
12231 SIXBIT /T11MP/ ;TEMP ? TEN11 HACKER
12232 IFN TCPP,SIXBIT /TCPOPN/ ; Open TCP Internet connection
12233 SIXBIT /TRANAD/ ;CREATE TRANSLATION ENTRY
12234 SIXBIT /TRANCL/ ;CLEAR TRANSL. LIST(S) FOR A JOB.
12235 SIXBIT /TRANDL/ ;DELETE A TRANSL. ENTRY.
12236 SIXBIT /TRANEX/ ;READ A JOB'S TRANSL. LIST.
12237 SIXBIT /TRANS/ ;TRANSLATE A FILENAME.
12238 SIXBIT /TRPOPN/ ;OPEN TRAP DEVICE FOR AN INFERIOR
12239 SIXBIT /TTYESC/ ;SIMULATE TYPING OF ^_
12240 SIXBIT /TTYFLS/ ;FLUSH ITYIC'ED INPUT
12241 SIXBIT /TTYGET/ ;SUPPLY TTY CH, RETURNS THREE WORDS OF TTY STATUS
12242 SIXBIT /TTYSET/ ;SUPPLY TTY CH AND THREE WORDS OF TTY STATUS
12243 SIXBIT /TTYVAR/ ;HACK TTY VARIABLES
12245 SIXBIT /UNLOCK/ ;UNLOCK A SPEC'D JOBS LOCKS.
12246 SIXBIT /USRMEM/ ;READ OR WRITE A JOB'S MEMORY.
12247 SIXBIT /USRVAR/ ;HACK USER VARIABLES
12248 SIXBIT /VIDBUF/ ;ASSIGN/DEASSIGN VIDEO BUFFER.
12249 SIXBIT /VIDSW/ ;SET VIDEO SWITCH.
12250 SIXBIT /WHOLIN/ ;GET OR SET WHO-LINE MODE AND JOB.
12251 SIXBIT /WHYINT/ ;FIND OUT WHY AN I/O CHANNEL INTERRUPTED
12252 SIXBIT /XGPIM/ ;OUTPUT TO XGP IN IMAGE MODE
12257 ZZ2==CONC [.LENGTH /]\ZZ,/
12259 REPEAT 1_<ZZ2>-ZZ-1,377777,,-1
12260 ;4.X BIT IMPLIES SUPPLY ROUTINE WITH POINTER TO X'TH ARG, NOT ARG ITSELF
12261 ;3.9-3.7 = MINIMUM NUMBER OF ARGS
12262 ;3.1 => DECODE 1ST ARG AS IO CHNL, LEAVING IOCHNM WD ADDR IN RH(R),
12263 ; IOCHNM WD CONTENTS IN H, CLSTB ENTRY'S LH IN LH(R).
12264 ;3.2 => NEVER PASS TO SPECIAL CHECKER FOR JOB CHNL
12265 ;3.3 => DON'T BARF IF CHNL NOT OPEN, CALLED ROUTINE WILL HANDLE IT
12267 ;# ARGS ACTUALLY SUPPLIED IN W WHEN DISPATCHING THRU SYSCTD, ARGS IN A...J
12268 SYSCTD: 200,,NACCES
12283 IFN DEMON,100,,ADEMSIG
12288 IFN DL10P, 100,,DL10MP
12294 IFN NUNITS, 100,,NFLAP
12295 IFE NUNITS, 100,,OPNL1
12296 100,,NFINIS(1) ;OLD NAME FOR FINISH, EVENTUALLY FLUSH
12300 2100,,NIOT(7) ;(7) FOR CHNL NOT OPEN TO BE IOC ERROR, (3) TO BE OPEN LOSS
12301 IFN INETP, 100,,IPKIOT(1) ; Requires at least 1 arg
12318 IFN NCPP, 100,,ANETAC(1)
12320 IFE CHAOSP, 4200,,ANETBLK(1)
12321 IFN CHAOSP, 4200,,CHANBK(1)
12323 IFN INETP, 4200,,NETBLK(1) ; Block (.hang) on net I/O channel
12328 IFN NCPP, 100,,NNETINT(1)
12329 IFN INETP, 100,,NETRFC
12332 100,,NPGWRT ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12334 IFN CHAOSP, 200,,PKTIOT(1)
12335 IFN QAUTHP, 100,,ARAUTH(1)
12338 IFN DEMON,100,,ARDDMST
12351 IFN QAUTHP, 200,,ASAUTH(1)
12357 6300,,NSIOT(7) ;(7) FOR IOC ERROR IF CHNL NOT OPEN, (3) FOR OPEN LOSS
12364 IFN DEMON,100,,ASTDMST
12367 IFN NETP,200,,NSTYNT(3)
12369 IFN TCPP,500,,TCPOPN
12391 IFN .-SYSCTD-1-ZZ,.ERR NEW SYS CALL DISPATCH LOSES!!!
12393 REPEAT 1_<ZZ2>-ZZ-1,ILUUO
12395 ;.CALL ADR1 SKIPS UNLESS SOMETHING WRONG
12397 ; SIXBIT /<CALL NAME>/
12398 ; REPEAT #ARGS,BITS,, <ADDRESS OF ARGUMENT>
12399 ; BITS= 4.9 => LAST ARG
12400 ; 4.3 - 4.1 0 = NORMAL ARG
12403 ; 3 = RETURN THE FAILURE CODE IF FAIL
12404 ; 4 = WORD OF CONTROL BITS
12405 ; 5 = IMMEDIATE CONTROL BITS
12407 ASYSC: PUSHJ P,ASCGRG ;B HAS E OF UUO
12408 JRST OPNL43 ;CALL NAME UNKNOWN.
12409 JRST OPNL15 ;MORE THAN 8 ARGS
12410 JRST OPNL30 ;TOO FEW ARGS
12411 PUSHJ P,ASYSC1 ;DISPATCH TO ROUTINE.
12412 POPJ P, ;NO SKIP - OPENL HAS ALREADY BEEN CALLED.
12413 AOS (P) ;SKIP - PROPAGATE THE SKIP UP THE PDL
12415 MOVE R,SYSCVL(U);SUCCESS RETURN, ZERO ERROR CODE ARG IF ANY
12417 XCTR XW,[SETZM (R)]
12418 JUMPGE R,CPOPJ ;JUMP IF NO OUTPUT VALUES WANTED
12419 SYSCPT: HRRZ W,FORTY ;VALUES WANTED, PUT INTO USER MEMORY FROM ACS
12422 SYSCP2: UMOVE R,(W)
12430 SYSCP3: JUMPL R,CPOPJ
12433 ASYSC1: MOVE T,SYSCTD(H)
12434 TLNN T,1 ;DECODE 1ST ARG AS IO CHNL?
12435 JRST (T) ;NO, DISPATCH TO CALL.
12436 TLNE T,2 ;OK TO GIVE TO JOB CHNL CHECKER?
12437 JRST CHNDCD ;NO - GO DECODE CHANNEL
12438 HRL J,T ;SAVE DISPATCH ADDR
12439 HRRI T,AIOCAL ;MAKE DECODER RETURN TO CHECK FOR JOB DEVICE
12445 SETZM A+7 ;MAX 8 ARGS, 1 USED FOR NAME
12449 MOVEI J,ASYSC+2 ;LOOK LIKE PUSHJ'ED FROM ASYSC
12451 LDB J,[331000,,SYSCTD(H)]
12454 JRST NCALL3 ;HE WANTS POINTERS, WE HAVE JUST VALUES.
12455 ;MUST GET ARGS AGAIN
12458 REPEAT ZZ2,[CAML T,SYSCTB+1_<ZZ2-.RPCNT-1>(H)
12459 ADDI H,1_<ZZ2-.RPCNT-1>
12465 ;JSP T,HERE TO DECODE IO CHNL IN A, MODIFIERS IN 3.1-3.3 OF T.
12466 ;IF RH(T) = AIOCAL, LH(J) IS REAL RETURN ADDRESS.
12467 ;RETURNS IOCHNM ADDR IN RH(R), IOCHNM WD CONTENTS IN H, CLSTB BITS IN LH(R)
12468 ;CAN POPJ OUT FOR INVALID CHANNEL.
12470 CHNDCD: TRNE A,-NIOCHN ;IS 1ST ARG A LEGAL CHNL NUM?
12473 HRROM A,UUAC(U);REMEMBER CHNL # FOR IOC ERRORS, ETC.
12475 ADDI R,IOCHNM(U) ;YES, COMPUTE IOCHNM WD ADDR
12476 MOVE H,(R) ;RETURN CONTENTS IN H.
12477 HLL R,CLSTB(H) ;RETURN CLSTB BITS IN LH(R).
12479 JRST [ CAME U,USER ;TRAP DEVICE
12480 JRST .+1 ;IF CHANNEL BELONGS TO THIS USER, TRAP
12481 JRST TRPDEV ] ;OTHERWISE, IS PROBABLY RFNAME, LET IT THROUGH
12482 TRNN H,-1 ;IF CHNL NOT OPEN
12483 TLNE T,4 ;AND NOT SPECIALLY OK FOR THIS SYSTEM CALL
12485 JRST OPNL44 ;THEN BARF
12487 ;JOB DEVICE CHECKER - PUT AIOCAL IN RH(T), JRST CHNDCD
12489 AIOCAL: HLRZ T,J ;GET DISPATCH ADR BACK
12490 TLNN R,%CLSJ ;IS CHANNEL JOB DEVICE?
12491 JRST (T) ;NO - DISPATCH
12492 HLRZS H ;ISOLATE JOB DEVICE INDEX
12493 DPB W,[230400,,JBSTS(H)] ;SAVE ARG COUNT
12496 HRRI W,1 ;NOW HAVE AOBJN PNTR TO DATA
12497 MOVE T,(W) ;COPY ARGS TO JOB AC TABLES
12498 MOVEM T,@JBACTB-1(W)
12500 MOVEI W,10 ;SET NON-STANDARD OP-CODE
12502 MOVE E,H ;PUT JOB INDEX IN E FOR JBWT
12504 AIOCA1: PUSHJ P,JBWT ;WAIT FOR JOB TO ANSWER
12505 MOVE H,E ;GET JOB INDEX BACK IN H (FOR JBACTB)
12506 MOVE W,[-8,,1] ;LOAD ANSWERS INTO ACS
12507 MOVE T,@JBACTB-1(W)
12510 LDB T,[350400,,JBSTS(H)] ;GET SKIP COUNT
12511 JUMPN T,POPJ1 ;SKIP COUNT NOT ZERO - SKIP
12512 LDB C,[270600,,JBSTS(H)] ;GET OPEN LOSS CODE
12513 SKIPE C ;MAKE SURE IN BOUNDS
12516 JRST OPNL1-1(C) ;GO REPORT LOSSAGE AND DON'T SKIP
12518 ;SYSTEM CALL GET ARGS
12519 ASCGRG: UMOVE T,(B)
12525 POPJ P, ;CALL NAME UNRECOGNIZED.
12527 LDB J,[331000,,SYSCTD(H)] ;GET BITS CORRESP TO ARGS WHICH SAY SUPPLY PNTR TO NTH ONE
12528 NCALL3: MOVEI W,2(B)
12531 ASYSC2: UMOVE R,(W)
12533 PUSHJ P,ASCIND ;CALC EFFECTIVE ADDRESS
12535 JRST ASYSC3 ;OUTPUT OR ERRORCODE ARG
12537 JRST ASYSC5 ;CONTROL BITS
12540 JUMPL J,ASYSC7 ;J IF WANT ADDRESS, NOT VALUE
12542 TLZA R,-1 ;IMMEDIATE, GET 0,,ADR
12543 UMOVE R,(R) ;ELSE GET WORD POINTED TO
12544 ASYSC7: MOVEM R,-1(T) ;PUT INTO AC
12547 ASYSC5: TLNE R,1000 ;CTL BITS
12548 TLZA R,-1 ;IMMEDIATE, GET 0,,ADR
12549 XCTR XR,[HRRZ R,(R)] ;ELSE WORD ADDRESS
12550 XORM R,CTLBTS(U) ;XOR ALL THESE ARGS TOGETHER
12551 ASYSC4: XCTR XR,[SKIPL (W)] ;SKIP IF TERMINATE BIT ON
12554 ADDI W,9 ;COMPUTE NUMBER OF ARGUMENTS SUPPLIED
12555 NCALL2: LDB T,[300300,,SYSCTD(H)]
12557 JUMPG T,POPJ1 ;NOT ENOUGH ARGS
12560 ASYSC3: TLNE R,1000
12561 JRST ASYSC8 ;ERROR CODE ARG
12562 XCTR XRW,[MOVES (R)] ;OUTPUT ARG, JUST MAKE SURE IT'S THERE
12563 MOVSI R,%SCVOT ;AND FLAG PRESENCE
12564 ASYSC9: IORM R,SYSCVL(U)
12567 ASYSC8: HRLI R,%SCVER ;ERROR-CODE ARG
12568 TDNE R,SYSCVL(U);CAN'T HAVE MORE THAN ONE ERRORCODE ARG
12569 JRST CPOPJ ;SAY "TOO MANY ARGS"
12570 XCTR XRW,[MOVES (R)] ;MAKE SURE IT'S THERE; MUSTN'T PCLSR OUT OF OPENL
12573 ;PERFORM INDEXING AND INDIRECTION ON ADDRESS WORD IN R.
12574 ;DON'T CLOBBER BITS 3.6 - 4.9. SET BITS 3.1 - 3.5 TO ZERO
12581 XCTR XR,[HRRZ R,(R)]
12583 HLL R,(P) ;GET ORIG @, MAY HAVE BEEN CARRIED INTO BY -1(17)
12591 PUSHJ P,OPBRK ;ALLOW PCLSR
12594 TPFLT: CONO PI,CLKOFF ;PREVENT INTERRUPT AFTER IORM SPM ING BACK
12595 ; ON TOP OF 1000 BIT
12602 LPMRI UPGML(U) ;TAKE TRAP, MAYBE DONT COME BACK
12606 POP P,PFOPC1 ;IF RESTART FAULT, RETURN FROM TPFLT
12607 JRST TPFLT1 ;JOIN REGULAR PAGE FAIL CODE
12610 POP P,EPTPFO ; If fault returns, just return from TPFLT
12616 ;`PDUMP' SYMBOLIC SYSTEM CALL
12617 ; ARG 1 - JOB SPEC FOR JOB TO BE DUMPED
12618 ; ARG 2 - DISK CHANNEL TO DUMP ONTO
12619 ; ARG 3 - STATE WORD (MODIFIED) INITIALLY 0, THEN 4.9 + PAGE # ABOUT TO DUMP
12622 JSP T,NCRUI2 ;DECODE JOB SPEC (1ST ARG)
12625 JUMPL J,OPNL31 ;CAN'T PDUMP THE PDP6.
12627 JSP T,PDUMDC ;DECODE 2ND ARG, B-> IOCHNM WORD.
12629 JRST OPNL34 ;NOT DISK WRITE CHANNEL.
12630 HRRZM D,UUAC(U) ;SO SET IN CASE OF ERROR
12632 MOVEM D,SRN3(U) ;REMEMBER DISK CHANNEL NUMBER FOR LATER.
12634 XCTR XRW,[MOVES D,(C)]
12635 MOVEM C,SRN4(U) ;REMEMBER STATE WORD ADDRESS FOR LATER
12636 MOVEM A,EPDL(U) ;USER INDEX
12637 PDUMA: CAIN A,(U) ;IF PDUMP'ING SELF, MUSTN'T PCLSR,
12638 PUSHJ P,NULSET ;SO DO A NULSET INSTEAD OF THE SOSSET
12640 JRST PDUMP9 ;SO THAT A LSWPOP CAN BE DEON AT THE END IN EITHER CASE.
12641 PUSHJ P,RPCLSR ;HACKING ANOTHER JOB: STOP IT.
12644 PDUMP9: MOVE A,SRN3(U) ;GET DISK CHANNEL NUMBER
12646 UMOVE D,(C) ;PICK UP STATE WORD
12647 JUMPN D,PDUMP5 ;JUMP IF ALREADY WROTE MAP PAGE
12648 PUSHJ P,PDBWG ;GET BUFFER AND COMMIT DISK TRACK FOR MAP PAGE
12649 SETZM (E) ;CLEAR FIRST WORD OF MAP
12650 ;AND DROP INTO PDUMP4
12651 ;HANDLE THE NEXT PAGE.
12652 PDUMP4: PUSHJ P,PUPLC ;GET BYTE POINTERS
12653 LDB W,Q ;CIRC POINTER ENTRY
12654 LDB R,T ;PAGE MAP ENTRY
12655 ANDCMI R,PMAGEM ;CLEAR AGE BITS
12657 TLO R,(SETZ) ;ABS PAGE
12659 MOVEI R,0 ;PAGE NON-EXISTANT
12661 LSH R,16. ;SWAPPED OUT
12662 MOVE W,D ;VIRTUAL PAGE NUMBER
12663 ADDI W,1(E) ;ADDRESS OF ENTRY IN BLOCK
12664 MOVEM R,(W) ;STORE ENTRY
12672 MOVEI W,1000(E) ;1000-1017 ACS
12674 JRST [ XCTR XBR,.+2
12679 SETZM QSMPRC(A) ;SO NEXT IOT GETS A NEW BUFFER
12680 MOVSI D,(SETZ) ;SET STATE WORD TO `DUMPING PAGE 0'
12684 PDUMP5: MOVE C,SRN4(U) ;STORE BACK STATE WORD
12686 PDUMP8: PUSHJ P,PUPLC
12690 AOJA D,PDUMP6 ;PAGE ABSOLUTE OR NONEXISTANT
12691 PDUMP3: PUSHJ P,PDBWG ;GET BUFFER AND COMMIT DISK TRACK TO DUMP THIS PAGE INTO
12692 MOVE J,EPDL(U) ;SET UP MAP TO POINT TO USER BEING DUMPED
12694 HRLZ J,D ;GET VIRTUAL ADDRESS OF PAGE BEING DUMPED
12696 HRR J,E ;BLT POINTER TO COPY THE PAGE
12697 XCTR XBR,[BLT J,1777(E)] ;COPY PAGE INTO DISK BUFFER
12698 PUSHJ P,MPLDZ ;RESTORE TO NORMAL MAP
12700 PUSHJ P,QSBWW ;WRITE OUT THE COPIED PAGE
12701 SETZM QSMPRC(A) ;SO NEXT IOT GETS NEW BUFFER
12703 AOS D ;DONE WITH THIS PAGE
12704 PDUMP6: TRNN D,400 ;SKIP IF FINISHED WHOLE ADDRESS SPACE
12706 JRST LSWPJ1 ;UNSTOP USER AND POPJ1
12708 ;ROUTINE TO GET DISK BUFFER AND COMMIT TRACK (FOR PDUMP)
12709 ;RETURNS BUFFER ADDRESS IN E. PRESERVES D.
12711 PDBWG: SKIPL E,QSMDN(A) ;GET CORE BLOCK # OF DISK BUFFER
12712 JRST [ LSH E,10. ;CONVERT TO ADDRESS
12714 MOVE E,[444400,,1] ;NO BUFFER, GET ONE
12717 PUSHJ P,UDELAY ;CAN'T GET MEMORY, WAIT A WHILE
12720 ;ROUTINE TO LOOK UP PAGE (FOR PDUMP AND PURE LOAD)
12721 ;PAGE# IN RH(D), USER# IN EPDL(U). RESULTS FROM UPLC IN Q AND T.
12732 ;DECODE 2ND ARG TO PDUMP & LOAD.
12733 ;B GETS IOCHNM WORD ADDR, LH OF J GETS LH OF CLSTB ENTRY, RH GETS LH(IOCHNM).
12735 PDUMDC: TRNE B,-NIOCHN
12743 SUBTTL PURE AND SBLK LOAD
12745 ;`LOAD' SYMBOLIC SYSTEM CALL
12746 ; ARG 1 - JOB SPEC FOR JOB TO BE LOADED
12747 ; ARG 2 - DISK CHANNEL TO LOAD FROM
12748 ; ARG 3 - (OPTIONAL) FIRST ADDR,,LAST ADDR TO BE LOADED
12749 ; OR ZERO => LOAD ONLY PURE PAGES
12750 ; WHEN LOADING A PDUMPED FILE, FIRST,,LAST ROUNDED OFF TO PAGES
12751 ; DEFAULT 3RD ARG IS 0,,-1 NORMALLY, 20,,-1 LOADING SELF, 20,,37777 LOADING PDP6
12754 ;4.9=1 ABSOLUTE, 1.1-2.9 = PTW
12755 ;4.8=1 SHARED WITH OTHER PAGES AT LEAST ONE OF WHICH IS WRITE
12756 ;4.7=1 LINK WITH VIRT PG IN RH 1.8-1.1
12757 ;2.9-2.8 0 NXM, 1 RD ONLY, 2 OR 3 READ/WRITE
12758 ;2.7=1 WORD ALREADY PROCESSED
12761 JSP T,NCORUI ;DECODE THE JOB SPEC.
12762 JRST NLOAD6 ;JOB GUARANTEED WRITEABLE.
12763 JSP T,NCORWR ;ELSE CHECK IF WRITEABLE.
12764 CAIN J,-1 ;BUT CAN WRITE PDP6.
12766 JRST OPNL31 ;NOT WRITEABLE.
12767 NLOAD6: HRREI A,(J) ;MAKE SURE EXTEND SIGN IF PDP6.
12768 JSP T,PDUMDC ;DECODE 2ND ARG.
12771 JRST OPNL34 ;NOT DISK READ CHANNEL.
12774 JRST OPNL12 ;"MODE NOT AVAILABLE" IF CHANNEL NOT 36-BIT BYTES.
12775 MOVE R,B ;IOCHNM ADDRESS IN CASE WE GET TO QICL
12776 JUMPL A,NLOADE ;DONT STOP THE 6
12778 JRST NLOADA ;DONT STOP IF LOADING INTO SELF
12780 PUSHJ P,LSWPOP ;SOS JOB'S DIELOK - IT CAN'T DIE WHILE STOPPED.
12781 MOVSI T,BSSTP ;STOPPING WITH BSSTP INSTEAD OF RH OF USTP
12782 IORM T,USTP(A) ;AVOIDS DEADLY EMBRACE WITH CORE JOB (SEE CUSTOP)
12784 PUSHJ P,LOSSET ;ARRANGE TO CLEAR BSSTP ON PCLSR.
12787 HRLOI C,0 ;DEFAULT 3RD ARG
12790 NLOADA: PUSHJ P,LSWPOP ;DIELOK
12792 HRLOI C,20 ;DEFAULT 3RD ARG
12793 NLOADE: MOVEM A,SRN3(U) ;SAVE USER INDEX (-1 => PDP6)
12795 JUMPL A,[HLRZ A,C ;PDP6, ENSURE LIMITS SMALL ENOUGH
12797 HRLI C,20 ;ACS NOT ACCESSIBLE
12798 MOVEI A,LPDP6M*2000-1
12800 HRR C,A ;HAS ONLY 16K MEMORY
12804 MOVEM A,SRN4(U) ;SAVE # OF DISK CHANNEL
12805 SETZM SRN5(U) ;START LOADING AT VIR PG #0
12806 MOVEM C,EPDLT1(U) ;SAVE LOAD LIMITS
12809 JRST OPNL33 ;FIRST > LAST
12814 JRST NLDSBB ;(COMING BACK AFTER PCLSR)
12818 ;GET FIRST BLOCK OF FILE BEING LOADED
12819 NLOADD: CAMN U,PCLUSR
12825 PUSHJ P,UFLS ;HANG UNTIL A BLOCK IS READ IN
12827 TLNE Q,%QAACC+%QAMPU+%QAPAR
12828 JRST OPNL7 ;LOST ONE WAY OR ANOTHER
12831 PUSHJ P,QSBGB ;SET UP CHNL AREA. TT ADDR OF FIRST WORD OF BLOCK
12833 JRST NLOADC ;QSBGB SKIPS FOR NORMAL RETURN
12834 JRST OPNL46 ;SKIPPED TWICE => EOF
12836 NLOADB: MOVE J,QMPBSZ(A)
12838 NLOADC: SKIPE (TT) ;SKIP IF PURE DUMPED FILE
12841 JRST OPNL34 ;TRYING TO PURE LOAD PDP6
12842 MOVSI Q,%QAACC ;WILL GO RANDOM ACCESSING THROUGH FILE
12843 IORM Q,QSRAC(A) ;THIS ALSO INHIBITS ACTIVATION AT PI LEVEL
12844 HLRZ H,EPDLT1(U);LOW LOAD BOUNDARY
12847 JRST NLOADH ;ACS NOT BE LOADED
12848 MOVSI Q,1000(TT);ADDRESS OF DUMPED ACS
12851 HRRZ H,EPDLT1(U);HIGH LOAD BOUNDARY
12854 HRRZ J,SRN3(U) ;JOB TO BE LOADED
12856 XCTR XBW,[BLT Q,(H)] ;LOAD UP HIS ACS
12858 NLOADH: MOVEI R,1(TT) ;ADDRESS OF FIRST WORD OF DUMPED MAP
12859 MOVEM R,EPDL3(U) ;SAVE
12861 PUSHJ P,QFNTR ;FIND DISK ADDRESS OF SECOND BLOCK
12862 JRST OPNL46 ;OFF END OF FILE
12863 SOS QSBI(A) ;UNDO QFNTR HACK
12865 PUSHJ P,QUDULK ;UNLOCK USER DIRECTORY
12866 PUSHJ P,SWTL ;LOCK CIRPSW
12870 ;HERE TO DO NEXT PAGE (WHEN LOADING PDUMPED FILE)
12871 NLOAD0: PUSHJ P,OPBRK
12873 TRNE A,600000 ;SKIP IF NO ACCESS (IGNORE)
12875 JRST NLD14 ;THIS PAGE ALREADY DONE OR NO ACCESS
12877 TRNE A,400000 ;SKIP IF READ ONLY
12878 JUMPE Q,NLD14 ;IMPURE NOT BE LOADED
12879 MOVE A,SRN5(U) ;VIRTUAL PAGE NUMBER
12881 AND Q,[-2000,,-2000]
12882 LSH Q,-10. ;FIRST PAGE,,LAST PAGE
12886 JRST NLD14 ;PAGE OUTSIDE OF RANGE TO BE LOADED
12887 NLD16: MOVE U,SRN3(U) ;USER INDEX
12889 LDB R,Q ;LOOK IN CIRCULAR POINTER ENTRY FOR THIS PAGE
12890 JUMPE R,NLOAD1 ;DOESN'T ALREADY HAVE THIS VIRTUAL PAGE
12891 PUSH P,T ;SAVE BYTE POINTER TO PAGE MAP FOR THIS VIRTUAL PAGE
12892 PUSH P,Q ;SAVE BYTE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12893 PUSHJ P,PAGERT ;FLUSH THE ALREADY EXISTING VIRTUAL PAGE
12896 NLOAD1: MOVE U,USER
12897 MOVE R,@EPDL3(U) ;PICK UP DUMPED PAGE MAP WORD
12898 ANDCMI R,PMAGEM ;CLEAR AGE BITS (WOULD LOSE AT NLOAD4+4)
12899 JUMPGE R,NLOAD3 ;NOT ABSOLUTE PAGE
12900 ANDI R,PMRCM ;ABS PG #
12902 IFE PDP6P, JRST OPNL32
12904 JRST [ CAIGE R,<PDP6BM_-10.+LPDP6M>
12905 CAIGE R,<PDP6BM_-10.>
12907 HRRZ R,@EPDL3(U) ;ALLOW USER TO LOAD WRITABLE PDP6 PAGES.
12908 ANDCMI R,PMAGEM\PMUNSD ;GIVE HIM WHATEVER ACCESS HE RQ'S.
12910 ;IFN TEN11P,[ ;NOT NECESSARY SINCE 10-11 PAGES ABOVE TSYSM NOW
12913 ; MOVE E,T11MP-400(R)
12914 ; AOJN E,NLOAD2 ;DONT ALLOW PAGE TO POINT TO TEN11
12917 LDB E,[MUR,,MEMBLT(R)]
12919 TDZA R,R ;IF PAGE NXM TODAY, DON'T ACTUALLY GIVE ACCESS
12921 NLOAD5: TRO R,200000 ;RD ONLY
12922 DPB R,T ;STORE ENTRY IN PAGE MAP
12924 DPB R,Q ;STORE -1 IN CIRCULAR POINTER
12925 NLOAD2: MOVE E,SRN5(U) ;VIRTUAL PAGE NUMBER
12926 MOVE U,SRN3(U) ;USER INDEX LOADING INTO
12927 PUSHJ P,GHUSRA ;RECOMPUTE HUSRAD
12930 IORB R,@EPDL3(U) ;MARK DUMPED PAGE WORD AS ALREADY DONE
12931 MOVE A,SRN4(U) ;DISK CHANNEL
12932 TLNN R,500000 ;SKIP IF NO CORRESPONDING BLOCK IN FILE
12933 TRNN R,600000 ;SKIP IF MUST ADVANCE ONE BLOCK
12934 JRST .+3 ;DON'T ADVANCE FILE POINTER
12935 PUSHJ P,QFNTN ;ADVANCE TO NEXT DISK ADDRESS
12936 JRST OPNL46 ;PREMATURE EOF
12937 AOS R,SRN5(U) ;NEXT VIRTUAL PAGE
12940 AOS EPDL3(U) ;NEXT MAP WORD
12943 PUSHJ P,LSWPOP ;RELEASE CIRPSW
12944 MOVE B,SRN3(U) ;USER INDEX LOADING INTO
12945 CAME B,U ;SKIP IF LOADING INTO SELF
12946 PUSHJ P,LSWPOP ;UNSTOP USER
12952 NLOAD3: TLNN R,100000 ;SKIP IF LINK WITH PAGE IN RH OF R
12954 PUSH P,T ;SAVE BYTE POINTER TO MAP ENTRY FOR THIS VIRTUAL PAGE
12955 PUSH P,Q ;SAVE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12956 LDB A,[1700,,R] ;VIRTUAL PAGE NUMBER BEING LINKED TO
12958 JRST NLOAD8 ;BAD VIRT PAGE #
12959 MOVE E,SRN5(U) ;VIRTUAL PAGE NUMBER OF PAGE BEING LINKED
12960 MOVE U,SRN3(U) ;USER INDEX LOADING INTO
12962 LDB W,Q ;CIRCULAR POINTER OF OTHER ENTRY
12963 JUMPE W,NLOAD8 ;DIDN'T EXIST
12965 JRST NLOAD8 ;POINTS TO AN ABSOLUTE PAGE
12969 BUG ;L DOESN'T DIVIDE U
12970 LSH C,10 ;USER NUMBER _ 8
12972 BUG ;USER INDEX WAS TOO LARGE
12973 IOR C,E ;NEW CIRCULAR POINTER
12974 POP P,D ;NEW CIRCULAR POINTER BYTE POINTER
12975 DPB W,D ;STORE OTHER ENTRY AS NEW CIRCULAR POINTER ENTRY
12976 DPB C,Q ;MAKE OTHER CIRCULAR POINTER ENTRY POINT TO NEW ONE
12977 LDB E,T ;OTHER MAP ENTRY
12978 POP P,T ;POINTER TO NEW MAP ENTRY
12979 ANDI R,600000 ;PROTECTION BITS
12986 NLOAD9: AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS
12987 AOSA NSWPGS(U) ;USER LOADING INTO HAS ONE MORE SWAPPED OUT PAGE
12989 NLD13: AOS NMPGS(U) ;USER HAS ONE MORE PAGE
12990 AOS SNMPGS ;SYSTEM HAS 1 MORE PAGE
12992 JRST NLOAD2 ;RECOMPUTE HUSRAD AND LOOP
12994 NLOAD4: MOVE A,SRN4(U) ;DISK CHANNEL
12995 MOVEI TT,(R) ;PUT DESIRED ACCESS IN RH(TT),
12997 TDNE R,[200000,,400000]
12998 IORI TT,%CBCPY ;ALONG WITH INITIAL-SWAPIN BIT IF NEC.
12999 PUSHJ P,NCORQ7 ;FIND OR CREATE MMP ENTRY.
13000 JRST OPNL37 ;MMP FULL
13001 MOVE E,SRN5(U) ;GET PAGE # IN JOB BEING LOADED
13002 MOVE U,SRN3(U) ;TARGET USER.
13003 PUSHJ P,NCORR1 ;INSERT THE PAGE.
13006 NLOAD8: SUB P,[2,,2]
13009 NLOADZ: PUSHJ P,LSWPOP ;FREE CIRPSW
13015 POPSM2: SOS (P) ;RETURN TO LOCN BEFORE PUSHJ
13019 ;QTAOS: PUSHJ P,QTLOCK ;LOCK TUT
13020 QTAOS1: MOVE D,QSLGL(A) ;DISK TRACK
13023 BUG ;NOT PART OF ANY FILE
13026 DPB B,D ;ADD ONE TO TUT ENTRY FOR THIS TRACK
13029 NLUPCL: MOVSI T,BSSTP ;THIS IS THE LOSSET ROUTINE TO CLEAR BSSTP.
13035 NLDSBB: HRRZ J,SRN3(U) ; (COMING BACK AFTER PCLSRING OUT) A HAS DSK CHNL #)
13036 PUSHJ P,MPLDJ ;LOAD MAP (ALSO CLOBBER UMAPS)
13045 NLDSBH: HRRZ B,QPCLSR(A)
13048 NLDSB: SKIPN EPDLT1(U)
13049 JRST OPNL12 ;LOAD ONLY PURE FROM SBLK FILE LOSES
13052 MOVEM B,QPCLSR(A) ;RESTART POINT IN CASE OF PCLSR
13056 PUSHJ P,MPLDJ ;LOAD MAP (ALSO CLOBBER UMAPS)
13061 NLDSB1: HRROI I,EPDL3(U)
13062 MOVEM I,SRN4(U) ;SET UP AOBJN PTR TO READ INTO EPDL3
13063 NLDSBD: MOVEI C,SRN4(U) ;SET C UP TO POINT TO AOBJN PTR
13064 HRLI C,(TRN) ;INDICATE EXEC MODE ADR
13067 JRST NLDSB9 ;PREMATURE EOF
13070 JRST NLDSB1 ;IGNORE INITIAL STUFF UNTIL JRST 1
13071 NLDSBK: MOVEI B,NLDSBE
13073 NLDSBE: HRROI I,QLDPTR(A)
13077 PUSHJ P,QBI ;GET AN AOBJN POINTER
13079 JRST NLDSB9 ;PREMATURE EOF
13081 JRST NLDSB6 ;NOT AN AOBJN POINTER
13082 HLRZ C,EPDLT1(U);FIRST ADDRESS TO BE LOADED
13085 HLROS B ;SKIP # WDS IN C
13086 ADD B,C ;-# WDS REMAINING IN BLOCK
13088 SUB C,B ;FLUSH WHOLE BLOCK
13089 LDB D,[1200,,QSMPRP(A)]
13093 ADD D,C ;ADVANCE ACC PTR TO SKIP PART OR ALL OF BLOCK
13097 JUMPGE B,[AOS QRADAD(A) ;SKIPPING WHOLE BLOCK, ALSO SKIP CHECKSUM
13098 JRST NLDSBK] ;AND GO READ NEXT BLOCK
13100 ADDM C,QLDPTR(A) ;UPDATE AOBJN POINTER
13101 NLDSB3: MOVEI B,NLDSBF ;MAYBE FLUSH EXISTING MEMORY AND GET NEW
13103 NLDSBF: HRRZ E,QLDPTR(A) ;START ADR OF BLOCK
13104 HLRE C,QLDPTR(A) ;-LENGTH OF BLOCK
13105 SUB E,C ;DON'T COMBINE THIS INSN WITH NEXT, MIGHT BE MOBY BLOCK
13106 SUBI E,1 ;GET END ADR OF BLOCK
13107 HRRZ T,EPDLT1(U);HIGH LOAD LIMIT
13108 SUBM E,T ;NUMBER OF WORDS OF EXCESS IN BLOCK
13109 MOVEM T,EPDLT2(U) ;SAVE FOR LATER USE
13110 JUMPLE T,NLDSB7 ;JUMP IF BLOCK HAS NO EXCESS
13111 SUB E,T ;ADJUST END ADDRESS
13113 ADDM T,QLDPTR(A);DECREASE COUNT IN AOBJN POINTER
13114 NLDSB7: LSH E,-10. ;LAST PAGE NEEDED
13116 PUSH P,R ;R HAS IOCHNM WD, NEEDED IF REACH QICL VIA QBI.
13117 PUSH P,E ;PAGE NO. OF LAST PAGE NEEDED
13120 JRST NLDSB5 ;ALREADY HAVE NEEDED PAGES
13123 MOVE U,SRN3(U) ;LOOK UP THIS PAGE IN MAP OF USER WE'RE HACKING.
13124 PUSHJ P,UPLC ;IF THERES A WRITABLE PAGE
13126 LDB A,T ;IN THE SLOT ALREADY, KEEP IT.
13131 CAME U,SRN3(U) ;IF NOT HACKING SELF, NCORLL WILL LSWPOP
13132 PUSHJ P,NULSET ;WHAT IT THINKS IS A LOSSET LIKE NLUPCL
13135 MOVEI R,%JSNEW ;GET FRESH PAGE
13136 MOVE TT,SRN3(U) ;INTO THE JOB WE'RE HACKING.
13137 MOVE C,SRN5(U) ;PAGE # TO GIVE IT.
13138 MOVSI A,%CBRED+%CBWRT+%CBNDW ;WANT WRITE ACCESS.
13139 PUSHJ P,NCORL ;UNDOES NULSET AND SWTL.
13140 JRST NLSBPL ;COULDNT GET PAGE (CALLED LSWCLR)
13141 NLDSBM: AOS SRN5(U)
13142 JRST NLDSB4 ;CHECK WHETHER WE NEED MORE PAGES.
13144 NLDSB5: SUB P,[1,,1] ;NOW WE HAVE ALL PAGES NEEDED TO LOAD THIS BLOCK.
13147 NLDSBQ: MOVEI B,NLDSBC
13149 NLDSBC: HRRZI C,QLDPTR(A)
13151 PUSHJ P,QBI ;DO A BLOCK IOT, USING THAT AOBJN POINTER.
13152 AOSG B,EPDLT2(U);SKIP RESIDUE OF BLOCK AND CHECKSUM
13153 MOVEI B,1 ;NO RESIDUE, JUST SKIP CHECKSUM
13154 LDB D,[1200,,QSMPRP(A)]
13164 NLDSB6: LDB D,[1200,,QSMPRP(A)]
13172 NLDSB8: CAME U,SRN3(U) ;UNLESS HACKING SELF OR PDP6, WE HAVE A SOSSET OF USTP TO POP.
13177 NLDSB9: PUSHJ P,OPNL46 ;LOAD FILE NOT IN VALID SBLK FORMAT
13178 NLSBP1: PUSHJ P,MPLDZ
13182 NLSBPL: SUB P,[2,,2] ;FLUSH PUSHES OF E AND R.
13186 SUBTTL .GUN, .LOGOUT
13188 ;DESTROY PROCEDURE TREE WHOSE TOP INDEX SUPPLIED BY USER
13189 AGUN: XCTR XR,[SKIPG A,(J)]
13190 POPJ P, ;LOSE, NEG OR SYSTEM JOB
13193 CAMGE A,USRHI ;USER INDEX UNREASONABLE => LOSE.
13198 ALOGOU: SKIPL SUPPRO(U)
13199 JUMPN J,ABREAK ;.LOGOUT N, TURNS INTO .BREAK N,33 IF NOT TOP LEVEL
13200 MOVE A,U ;.LOGOUT, AND STY CLOSE.
13202 ;A HAS JOB BEING LOGGED OUT; U HAS JOB THAT'S DOING IT.
13203 ;.GUN AND .LOGOUT ACT BY PUTTING THE JOB IN SUCH A STATE THAT
13204 ;IT CAN DO NOTHING BUT TRY TO DISAPPEAR. IF THE JOB IS ALREADY
13205 ;IN THAT STATE, THIS ROUTINE DOES NOTHING. THAT PREVENTS
13206 ;RECURSION LOOPS WHEN KILLING CYCLIC STRUCTURES INVOLVING STY'S.
13207 ;EXCEPTION: IF THE JOB TO BE LOGGED OUT IS THE RUNNING JOB,
13208 ;WE DO THE REAL WORK BY GOING TO ALOGO1.
13209 ALOGO6: SKIPE UNAME(A) ;JOB TO BE LOGGED OUT IS GONE.
13210 SKIPL SUPPRO(A) ;CAN'T LOG OUT UNLESS TOP LEVEL.
13213 AOS (P) ;IF .GUN GETS THIS FAR, IT HAS "SUCCEEDED".
13214 MOVSI T,BULGOS+BULGO
13215 TDNE T,APRC(A) ;IF JOB IS ALREADY LOGGING OUT,
13216 JRST ALOGO7 ; SEE IF IT IS THE RUNNING JOB
13222 MOVEM A,SRN3(U) ;AUCL4 FINDS USR IDX TO HACK HERE.
13224 AUCL4 ;CLEAR BULGOS IF AUCL3 PCLSR'S
13225 PUSHJ P,AUCL3 ;SET BULGOS AND WAIT FOR DIELOK TO CLEAR.
13229 EXCH B,UPC(A) ;SET HIM UP TO LOG OUT.
13230 ALOGO4: MOVEM B,SRN3(A) ; Remember old PC for unlocking locks.
13231 MOVE B,[.LOGOUT] ;PUT THE FOLLOWING ROUTINE IN JOB'S AC'S:
13232 MOVEM B,AC0S(A) ; 0/ .LOGOUT
13233 CAMN A,USER ; 1/ .VALUE
13234 UMOVEM B,0 ; 2/ JRST 0
13244 IORM B,APRC(A) ;SAY HE'S DIEING SO NO-ONE WILL HACK HIM.
13245 MOVEM U,EPDL(A) ;RECORD WHO IS KILLING HIM.
13250 SETZM PICLR(A) ;PREVENT INTERRUPTS.
13254 ANDCAM B,USTP(A) ;MAKE SURE HE CAN RUN - ELSE HE WOULDN'T LOG OUT.
13255 ALOGO7: CONO PI,CLKON
13258 JRST ALOGO1 ;IF JOB IS RUNNING JOB, MUST HACK AROUND
13260 ALOGO5: EXCH B,UUOH ;LOGGING OUT SELF - MAKE OUR PC LOOK
13261 SOJA B,ALOGO4 ; AS IF WE HAD EXECUTED THE .LOGOUT IN AC 0
13263 ;COME HERE IF LOGGING OUT ONESELF (A=USER).
13265 PUSHJ P,AUCL3 ;WAIT TILL NO-ONE IS LOOKING AT ME,
13266 PUSHJ P,UBLAM ;CLOSE MY CHANNELS AND KILL MY INFERIORS AND CORE.
13268 CONO PI,CLKOFF ;DON'T SCHEDULE WHILE GOING AWAY
13270 IORM T,APRC(A) ;SYS JOB KILLS ANY TREES WITH BULGO SET.
13272 IORM T,SUPCOR ;TELL SYS JOB TO LOOK AROUND FOR TREES TO KILL.
13273 MOVSI T,BUSRC ;SUICIDE: MAKE SURE WE DON'T RUN ANY MORE.
13275 JRST UDELAY ;CAUSE A SCHEDULE
13277 ;COME WITH JOB INDEX IN A. INDICATE THAT JOB IS ABOUT TO DIE,
13278 ;THEN WAIT TILL IT'S SAFE TO KILL IT.
13280 AUCL3: MOVSI T,BULGOS
13281 IORM T,APRC(A) ;SAY THIS JOB STARTING TO GO AWAY.
13282 CONO PI,CLKON ;NOONE CAN START HACKING US NOW; SAFE.
13283 CAME A,USER ;IF NOT LOGGING OUT RUNNING USER,
13284 PUSHJ P,1USTOP ;STOP THE JOB BEING KILLED.
13285 SKIPE DIELOK(A) ;WAIT TILL NO-ONE IS LOOKING AT THAT JOB.
13287 HRLOI T,#BUSRC ;AND NO-ONE ELSE HAS HIM PCLSR'ED.
13290 POPJ P, ;WE SUCCEEDED, BUT CALLER HAS WORK TO DO.
13292 SUBTTL REAL TIME USER FEATURE
13294 ;.REALT AC, SKIPS ONLY IF REAL TIME FACILITY REQUESTED AND SEIZED
13295 ;AC= 4.9=>TURN OFF OLD CLOCK RATE, FLUSHING REAL TIME FACILITY AND
13296 ; REMAINDER OF CURRENT TICK AND ZEROING TICK COUNT
13297 ; 4.8=>TURN ON NEW CLOCK RATE
13298 ; 4.7=>TRY TO SEIZE REAL TIME USER FACILITY
13299 ; 4.6=>DON'T SETTLE FOR PSEUDO-REAL TIME STATUS
13300 ; 4.5 =>ONLY WANT PSEUDO
13301 ; 4.4=>PROGRAM TO BE BLOCKED EXCEPT FOR HIGH PRIORITY PHASE OR INT. LEVEL
13302 ; 4.3=>READ INTO WD3+4 AS DESCRIBED BELOW (BEFORE ANY OTHER BITS INTERPRETED)
13303 ; 3.1-4.2=RESERVED FOR EXPANSION, SHOULD BE ZERO
13304 ; 1.1-2.9=RH=POINTER TO 4 WORD BLOCK
13305 ; WD1=FRAME TIME IN 60'THS (MUST BE <2**18.)
13306 ; WD2=PRIORITY TIME IN 60'THS (MUST BE <7 AND <WD1/2)
13307 ; WD3= IF 4.3 ON, SET RH TO FRAME TIME, LH TO TICKS SINCE EXAMINED
13308 ; WD4= IF 4.3 ON, SET RH TO HIGH PRIORITY TIME, LH TO 0 IF CURRENTLY LOW
13309 ;PRIORITY OR -1 IF CURRENTLY HIGH PRIORITY
13311 AREALT: UMOVE A,(J)
13320 AREAL1: TLNN A,700000
13328 PUSHJ P,CLQDEL ;TURN OFF OLD INTS
13330 SETZM UTIME(U) ;ZERO TICK COUNT
13331 AREAL2: TLNN A,200000
13333 XCTR XR,[SKIPG T,(A)]
13336 AREAL4: TLNN A,100000
13338 XCTR XR,[SKIPLE T,1(A)]
13357 AREAL7: MOVEM U,UREALT
13359 AREAL5: CONO PI,CLKON
13360 AREAL6: SKIPN T,UTIME(U)
13370 ;CLOCK LEVEL ROUTINE
13371 UREALB: SUBI U,UCLBLK ;SET INDEX TO QUEUE BLOCK
13374 URLTB1: MOVSI T,(%PIRLT)
13381 URLTBX: SETZM SCHFLG ;CAUSE SCHEDULE THIS CLOCK BREAK
13402 SUBTTL MISCELLANEOUS SYSTEM CALLS
13404 $INSRT TIME ;ROUTINES HAVING TO DO WITH CLOCKS AND THINGS
13407 ;.CLOSE CH, ;CLOSE ANY I/O TRANSACTION OPEN ON CHANNEL CH
13409 CCLOSE: HRREI C,-IOCHNM(R) ;CLOSE CALLED INTERNALLY
13412 BUG ;R WAS NOT AN IOCHNM WORD ADDRESS.
13413 HRRZM C,UUAC(U) ;SOME CLOSE ROUTINES LOOK AT UUAC
13417 ACLOSE: HLRZ A,(R) ;SET UP A WITH L.H. OF I/O CH WORD
13418 HRRZ B,(R) ;SET UP B WITH R.H. "
13419 MOVE C,CLSTB(B) ;GET CLOSE TABLE ENTRY
13420 TLNE C,%CLSNRM ;SKIP IF NOT STANDARD CLOSE
13421 JRST STDCLS ;JUMP TO STANDARD CLOSE
13423 PUSHJ P,(C) ;CALL CLOSE ROUTINE
13425 STDCLX: SETZM (R) ;CLEAR I/O CHANNEL WORD
13426 SETZM IOCHST-IOCHNM(R) ;CLEAR I/O CHNL STATUS WORD
13429 STDCLS: CONO PI,CLKOFF ;INHIBIT CLOCK BREAKS
13430 SOSGE 1(C) ;DECREMENT USE COUNTER, SKIP IF STILL IN USE AT LEAST ONCE
13431 SETOM (C) ;NO LONGER IN USER, FREE BY SETOM'ING "XXXUSR" VARIABLE
13432 CONO PI,CLKON ;ENABLE CLOCK BREAKS
13435 AVALRET:UMOVE A,(B) ;CALL 4,
13440 AUTRAN: UMOVE C,(B)
13442 CONO PI,CLKOFF ;Don't let USRHI change or anything like that
13444 UTRNL: SUBI A,LUBLK
13455 ;RETURN WITH LOSER IN A IN LOSER MODE AND CLOCK OFF
13457 RPCCK: PUSHJ P,RPCLSR ;STOP USER (ALSO PUTS HIM IN USER MODE)
13458 CONO PI,CLKOFF ;TURN OFF CLOCK
13459 JRST UPCLSR ;"RESTART USER" (HE CAN'T RUN TILL CLOCK BACK ON)
13461 ;.LOSE X <=> .CALL [SETZ ? SIXBIT/LOSE/ ? 401000,,X ]
13464 ; USED TO REPORT LOSSAGE TO SUPERIOR PROCEDURE
13465 ;ARG 1 - LOSING INSTRUCTION ADDR,,LOSSAGE CODE (CODES DEFINED BY DDT)
13466 ;ARG 2 - NEW PC (DEFAULT = PC-2 SO CAN USE AS A NON-SKIP-RETURN HANDLER)
13467 ;CTL 1.1 - DEFAULT ARG 2 TO PC INSTEAD OF PC-2
13468 ;CTL 1.2 - SETZM @.40ADDR
13469 ;CTL 1.3 - DON'T USE THE NEW PC AS THE LOSING INSTRUCTION ADDR
13471 ALOSE: HRRZ A,FORTY ;ARG 1 = EFF ADDR OF UUO
13474 NLOSE: MOVE T,CTLBTS(U)
13477 XCTR XRW,[MOVES (D)]
13478 TLZ B,BADPC ;COMPUTE NEW PC FROM ARG 2 OR UUOH
13489 HRRI B,1(B) ;PCLSR'ING WILL SOS
13490 MOVEM A,VALUE(U) ;PASS TO SUPERIOR
13493 XCTR XW,[SETZM (D)]
13499 MOVE A,(R) ;OPER 10
13510 PUSHJ P,AUCL3 ;STOP JOB, AND WAIT TILL SAFE TO KILL IT
13519 PUSHJ P,ZUSLOG ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
13526 AUCL4: HRRZ A,SRN3(U)
13531 AUCL2: HLRZ A,(R) ;GUY BEING CLOSED
13533 LDB TT,[.BP (%CLSFU),CLSTB(B)]
13534 JUMPN TT,OPNL31 ;FOREIGN JOB => .UCLOSE ISCAN'T MODIFY JOB
13535 SKIPL CLSTB(B) .SEE %CLSU
13536 JRST OPNL34 ;NOT A JOB AT ALL?
13539 JUMPGE TT,AUCL1 ;HAVE TTY NOW
13540 TLNN TT,%TBDTY ;NOT GIVING IT AWAY.
13541 CAIE A,(TT) ;SKIP IF GAVE IT TO GUY WE'RE KILLING
13543 PUSHJ P,SDTTY ;TAKE IT BACK FROM HIM.
13548 ;DISMIS SYSTEM CALL. 1ST ARG INT PDL PTR (WILL BE DECREMENTED
13549 ;IF NOT AN IMMEDIATE ARG)
13550 ;2ND ARG OPTIONAL PC TO DISMIS TO (OVERRIDES THAT IN INT PDL)
13551 ;3RD ARG OPTIONAL NEW .DF1 VALUE " " " "
13552 ;4TH ARG OPTIONAL NEW .DF2 VALUE ...
13553 ;5TH ARG OPTIONAL ERROR CODE AS IN LOSE. IF PRESENT WILL LOSE RIGHT AFTER DISMISSING.
13554 ;IF 4 ARGS GIVEN, 1ST IGNORED EXCEPT FOR POSSIBLY DECREMENTING, OR POPPING OF ACS.
13555 ;CTL BITS (SAME FORMAT AS LH OF 1ST WORD OF INTERRUPT DISPATCH TABLE)
13556 ;SPECIFY POPPING OF SAME EXTRA INFO THAT INTERRUPTS CAN PUSH.
13560 MOVE E,A ;GET IN E THE INT PDL PTR.
13561 TLNN E,1000 ;IF 1ST ARG IMMEDIATE, IT IS PTR,
13562 UMOVE E,(A) ;ELSE IT PTS TO PTR.
13563 MOVE H,E ;SAVE UNPOPPED PDL POINTER FOR PDL OV CHECKING.
13564 TLNE A,1000 ;IF PDL PTR ISN'T IMMEDIATE, POP IT ACC. TO CTL BITS.
13568 SUB E,[3,,3] ;POP OFF DEBUGGING INFO IF IT WAS PUSHED.
13570 JUMPE TT,NDISM2 ;IF ACS WERE PUSHED, POP THEM TOO.
13572 SUB E,TT ;DECREMENT THE PDL POINTER ENOUGH
13574 HRLI I,1(E) ;AND COPY FROM THE PDL TO THE ACS.
13576 XCTR XBRW,[BLT I,(TT)]
13577 NDISM2: CAIGE W,2 ;IF NO 2ND ARG, GET PC FROM INT PDL
13579 CAIGE W,3 ;IF NO 3RD ARG, GET .DF1 FROM INT PDL
13581 CAIGE W,4 ;IF NO 4TH ARG GET .DF2 FROM INT PDL
13583 TLNE A,1000 ;IF 1ST ARG NOT IMMED, DECREMENT IT
13587 JUMPGE E,NDISM3 ;AND CHECK FOR PDL OVFLO.
13589 PUSHJ P,NDISMP ;PDL OVFLO, SET INT BIT IF INT ENABLED.
13590 NDISM3: MOVEM C,IDF1(U) ;RESTORE THE PC, .DF1, .DF2
13597 NDISMP: MOVEI TT,%PIPDL ;PDL OV INT BIT.
13602 ;OLD-STYLE DISMISS JOINS HERE
13603 ADISMIS:UMOVE B,(B) ;CALL 1,
13604 NDISM1: TLO B,%PCUSR
13609 SETCM A,UUOH ;IF ONE-PROCEEDING THE .DISMISS
13610 TLNN A,%PS1PR-%PSINH
13611 TLO B,%PS1PR-%PSINH ;TRAP IMMEDIATELY AT THE NEW PC
13616 ;CHECK FOR PENDING INTERRUPTS AND TAKE THEM RIGHT AWAY
13620 CONO DSDEV,DSDCHN ;ENABLE INTERRUPT FROM 6
13623 PUSHJ P,APISE6 ;SEE IF ANY DEVICES WANT TO RE-INTERRUPT.
13627 IOR D,IDF1(U) ;FIND ALL DISABLED OR DEFERRED
13628 SKIPN PICLR(U) ;(ALL ARE DEFERRED WHEN PI IS OFF).
13630 AND D,[BADBTS] ;BAD
13631 TDNE C,D ;PENDING INTERRUPTS
13632 JRST ADISM7 ;IF THERE ARE ANY, LET THEM HAPPEN.
13635 JUMPN C,ADISM7 ;1ST WD INT. PENDING.
13639 JUMPE C,CPOPJ ;JUMP IF NO 2ND WORD INT PENDING.
13640 ADISM7: MOVE C,[JRST ONEFLS]
13644 APISE6: MOVE D,MSKST(A) ;IF INTERRUPT FROM CONSOLE ENDBLED,
13647 SKIPL T,TTYTBL(A) ;IF THIS JOB HAS ITS CONSOLE
13648 SKIPN TINTC(T) ;AND THE CONSOLE HAS INT. CHARS,
13650 MOVEI D,%PITYI ;GENERATE AN INTERRUPT.
13652 APISE7: MOVE D,MSKST2(A) ;LOOK AT HIS ENABLED IO CHANNELS.
13654 APISE0: JFFO D,APISE9 ;CHECK EACH ONE.
13655 JRST APISE8 ;ALL CHECKED.
13657 APISE9: MOVNS E ;CHECK ONE IO CHNL THAT'S ENABLED TO INT.
13658 ANDCM D,CHNBIT+35.(E) ;MARK THIS CHNL AS HANDLED.
13659 ADDI E,35.+IOCHNM(A) ;GET ADDR OF IOCHNM WD FOR CHANNEL.
13660 HRRZ T,(E) ;IS IT A TTY INPUT CHANNEL?
13664 LDB T,[$TIIDX,,(E)] ;YES, GET THE TTY NUMBER.
13666 CAIE T,%TINON ;IF IT ISN'T A DISOWNED TY CHANNEL,
13667 CAIE C,(A) ;AND THE TTY BELONGS TO THIS JOB,
13669 SKIPN TINTC(T) ;AND IT HAS AN INT. CHAR WAITING,
13672 APISE4: AND C,MSKST2(A) ;GIVE AN INT. ON ONE OF THE CHANNELS IT'S OPEN ON.
13678 APISE2: CAIN T,STYDUI ;NOT A TTY CHNL. IS IT A STY CHNL?
13682 APISE3: LDB T,[$TIIDX,,(E)] ;YES, GET TTY #.
13683 SKIPL C,STYSTS-NFSTTY(T) ;STY IN USE BY THIS JOB?
13686 SKIPGE TTYOAC(T) ;TTY OUTPUT PENDING?
13688 MOVE C,STYMSK-NFSTTY(T) ;YES, INT. ON ONE CHANNEL.
13703 ;.SLEEP AC, ;IF C(AC) + OR ZERO: ;BECOME DORMANT FOR C(AC) 1/30'THS OF A SEC
13704 ;IF C(AC) -: ;BECOME DORMANT TILL MAGNITUDE OF C(AC) > C(TIME)
13705 ASLEEP: XCTR XR,[MOVN T,(J)] ;PICK UP NEGATIVE OF C(AC)
13706 JUMPGE T,ASLP1 ;JUMP IF C(AC) WAS NEG
13707 SUB T,TIME ;COMPUTE NEG OF TIME SLEEP SHOULD RUN OUT
13708 UMOVEM T,(J) ;STORE BACK SO YOU WILL WIN IF PCLSR'ED OUT
13709 ASLP1: MOVMS A,T ;MAKE POSITIVE
13710 SUBI A,60.*30. ;IF SLEEPING FOR MORE THAN A MINUTE
13713 IORM B,USWST(U) ;PUT RIP VAN WINKLE ON ICE
13715 JRST ASLP2 ;ALWAYS GO TO UFLS AT LEAST ONCE
13717 CAMLE T,TIME ;HANG TILL C(T) LESS THAN C(TIME)
13718 ASLP2: PUSHJ P,UFLS
13719 XCTR XW,[SETZM (J)] ;CLEAR OUT ARG (FOR COMPATIBILITY WITH WHEN AC WAS COUNTED OUT)
13720 JRST CLKONJ ;MAKE SURE CLKCHN ON IN CASE SLEEP WAS 0 & SKIPPED UFLS ENTIRELY
13722 ;RELOAD CALL - IGNORE ARGS
13723 ;MUST BE FROM TOP LEVEL NON-DISOWNED JOB
13724 ;RELOADS AND STARTS SYS: ATSIGN WHATEVER
13726 NRELOAD:SKIPGE SUPPRO(U)
13728 JRST OPNL40 ;NOT TOP LEVEL
13730 PUSHJ P,LOGUPD ;LOG OUT
13731 PUSHJ P,DMNPLI ;AND IN AGAIN
13732 PUSHJ P,USRST2 ;RESET USER VARS
13734 SETZM @UTMPTR(U) ;TEMPORARY HIGH PRIORITY
13735 JRST USTCDR ;LOAD FILE AND START IT
13737 AMASTER:UMOVE J,(J)
13738 CONO PI,CLKOFF ;OPER 61
13742 AMAST1: HRRZM U,UMASTER
13751 AMAST3: JUMPGE J,CLKOJ1
13759 ;.CALL SSERVE - Set .SERVER variable without timing screw.
13760 ; ARG1: <job>, the client whose .SERVER variable is to be munged
13761 ; ARG2: <job>, the server to be stored in the variable
13762 ; If one arg is given, it is the server and the client defaults to %JSELF
13768 JSP T,NCORUI ; Decode client and AOS his DIELOK
13769 JRST NSSRV1 ; OK to write
13770 JSP T,NCORWR ; Check further
13771 JRST OPNL31 ; CAN'T MODIFY JOB
13775 JRST OPNL34 ; WRONG TYPE DEVICE
13777 EXCH J,A ; A: client J: server
13778 JSP T,NCORUI ; Decode server and AOS his DIELOK
13779 JFCL ; Don't give a damn about writability
13782 JRST OPNL34 ; WRONG TYPE DEVICE
13784 MOVEM J,SERVER(A) ; Safe to set it now
13785 PUSHJ P,LSWPOP ; Server's DIELOK
13786 JRST LSWPJ1 ; Client's DIELOK
13789 SUBTTL LOGIN/ATTACH/DETACH/DISOWN CODE
13791 ;SYMBOLIC CALL LOGIN: LOG A TREE IN. MUST BE GIVEN BY TOP-LEVEL NON-LOGGED-IN JOB
13792 ;WITH NO INFERIORS.
13793 ;ARG 1 - DESIRED UNAME
13794 ;ARG 2 - "TERMINAL NAME", PUT IN TRMNAM USER VARIABLE AND PRINTED AS SIXBIT ON SYSCON.
13795 ;ARG 3 - DESIRED XUNAME, FOR DEMON TO KNOW WHO TO ACCOUNT.
13797 NLOGIN: HLRE T,UNAME(U)
13798 AOJN T,OPNL31 ;JUMP ON ALREADY LOGGED IN
13800 JRST OPNL40 ;CAN'T LOG IN IF NOT TOP LEVEL
13803 AOJE T,OPNL11 ;BAD NAME
13805 MOVE C,A ;IF XUNAME (ARG 3) MISSING, DEFAULT TO UNAME.
13808 ALOG2: SKIPN UNAME(D)
13814 JRST OPNL13 ;CONSOLE CONTROLLED TREE ALREADY LOGGED IN THAT NAME
13816 ALOG3: HRRZ T,SUPPRO(D)
13817 CAMN T,U ;CAN'T LOGIN IF HAVE INFERIOR. RESTRICTION IMPOSED HERE
13818 JRST OPNL12 ;SINCE WE NO CODE HERE TO SET INFERIOR'S UNAME.
13819 ALOG4: ADDI D,LUBLK
13821 JRST ALOG2 ;LOOP FOR ALL SETS OF PROCEDURE VARIABLES
13823 HRLI T,[ASCIZ / LOGIN /]
13824 PUSHJ P,SGWAIT ;ASK THE SYSTEM JOB TO PRINT OUT THE RELEVANT INFO
13825 SKIPL TTYTBL(U) ;SKIP IF NOT CONSOLE CONTROLLED
13826 AOS SUSRS ;INCREMENT COUNT OF LOGGED IN CONSOLE CONTROLLED TREES
13827 MOVEM A,UNAME(U) ;SET UNAME TO WHAT LOGGED IN AS
13829 MOVEM A,USYSNM(U) ;SET SNAME "
13830 MOVEM A,HSNAME(U) ;SET HOME SNAME "
13831 MOVEM C,XUNAME(U) ;SET XUNAME " " (USER MAY MUNG LATER)
13833 MOVEM B,SLGIV+2 ;INCLUDE TRMNAM AS SECOND NAME PRINTED
13834 PUSHJ P,DMNPLI ;GIVE INFO TO DEMON
13835 JRST CLKOJ1 ;TURN CLK ON AND SKIP RETURN
13837 ASETM2: UMOVE A,1(J) ;.OPER 5
13839 ASETMSK: UMOVE D,(J) ;OPER 4
13842 SOS (P) ;WILL SKIP RETURN
13843 JRST USMASK ;ACT LIKE .SUSET.
13845 ARSYSI: SKIPA A,[ITSVRS] ;OPER 52
13846 ARDTIME:MOVE A,TIME ;OPER 17
13849 IFE KS10P,[ ; On the KS10 they made DATAI 0, a UUO!
13850 ARDSW: DATAI A ;OPER 20
13853 IFN KS10P, ARDSW==:ILUUO
13855 ASUPSET:MOVEI C,003777 ;OPER 53
13856 XCTR XR,[AND C,(J)]
13857 MOVE D,SUPCOR ;SAVE OLD CONTENTS
13869 ; SETZ [<JOB SPEC>] ;SEE NCORUI
13871 ;DISOWN JOB'S ENTIRE TREE AND FREE CONSOLE. IF TREE HAS NO
13872 ;CONSOLE, JUST MAKES IT DISOWNED. NO ARG => THIS JOB'S TREE
13873 ;ALWAYS SKIPS IF THE JOB SPEC IS REASONABLE.
13875 ;CTL BIT 1.1 => DON'T SET SIGN OF APRC (DON'T MAKE TREE "DISOWNED").
13876 ;CTL BIT 1.2 => USE SYSTEM TREE'S RESOURCE WORD
13877 ;CTL BIT 1.4 => KILL TREE AN HOUR FROM NOW IF IT ISN'T REOWNED
13878 ;CTL BIT 1.5 => SUPPRESS THE CONSOLE-FREE MESSAGE ON THE TTY
13880 NDETAC: HLRZ B,A ;XOR LH OF 1ST ARG INTO CTL BITS
13882 PUSHJ P,SWTL ;MAKE SURE NOBODY ELSE IS REARRANGING TREES.
13884 MOVEI J,(U) ;DEFAULT TO OUR TREE
13885 JUMPE W,NDETA0 ;JUMP IF NO ARGS SUPPLIED
13887 JSP T,NCORUI ;DECODE ARG, GET USER INDEX IN J
13888 JFCL ;IGNORE INFO ON WRITEABILITY
13889 CAIG J,LUBLK ;DONT DETACH SYSJOB OR CORE JOB
13891 NDETA0: SKIPL T,SUPPRO(J) ;FIND TOP LEVEL JOB OF TREE (IN J)
13894 HRRZ A,J ;TOP OF TREE
13896 JRST LSWCJ1 ;TREE IS ALREADY DISOWNED.
13898 PUSHJ P,IFPLUP ;STOP ALL BUT THIS JOB
13899 PUSHJ P,NDETA7 ;DO THE WORK
13900 JRST LSWCJ1 ;UNSTOP THE TREE
13902 NDETA7: PUSH P,U ;US
13903 PUSH P,A ;TOP LEVEL
13906 PUSHJ P,LOGUPD ;FOR ACCOUNTING PURPOSES, THIS IS LIKE A LOGOUT
13908 NDETA1: MOVEI U,(A) ;GET IN U USER INDEX OF OWNER OF TTY
13909 MOVE A,TTYTBL(U) ;GET IN A TTY NUMBER
13910 TLNE A,%TBDTY ;TREE HAS NO TTY =>
13911 JRST [ POP P,A ;JUST MAKE IT DISOWNED.
13914 JUMPL A,NDETA1 ;GAVE TTY AWAY
13915 MOVE T,(P) ;TOP-LEVEL JOB OF TREE SAVES USER TTY OPTIONS IN
13916 MOVE B,TTYOPT(A) ;HIS STTYOP VARIABLE
13917 AND B,[%TOUSR,,%TPUSR]
13919 LDB B,[.BP (%TCRFS+%TCQRY),TTYCOM(A)]
13920 IORI B,4 ;MAKE STTYOP NON-ZERO TO SHOW IT WAS STORED
13921 DPB B,[170300,,STTYOP(T)] ;OVERLAPS PADLF FIELD
13923 PUSH P,TTYSTS(A) ;SAVE THIS TTY INFO
13924 PUSH P,TTYST1(A) ;WILL PUT INTO TTY OWNER'S USER VARS
13925 PUSH P,TTYST2(A) ;AFTER SUCCEED IN FREEING THE TTY
13928 MOVN B,TPVB+TPLEN(B)
13931 MOVSI B,%TCDET ;IF TREE DETACHED DUE TO TOP LVL INT,
13932 SKIPN USER ;THE CONSOLE FREE MESSAGE SHOULD SAY SO.
13933 IORM B,TTYCOM(A) .SEE SYSCFM
13934 ;THIS ALSO HAPPENS IF DIALUP LINE HUNG UP, OS'ERS BEWARE!
13939 PUSHJ P,TVBNCL ;CLEAR VIDEO BUFFER #
13942 MOVE B,-5(P) ;GET BACK IDX OF RUNNING JOB
13945 TRNE B,20 ;CTL BIT 1.5 => MARK THE TTY AS NOT NEEDING CNSL FREE MSG.
13947 PUSHJ P,TTYLO1 ;NOW MAKE CONSOLE FREE.
13948 POP P,B ;CAN'T PCLSR AFTER THIS POINT
13949 DPB B,[$TBECL,,TTYTBL(U)]
13950 POP P,TTSTSV+1(U) ;STORE INTO TTY'S OLD OWNER
13951 POP P,TTSTSV(U) ;OLD TTY VARS FROM BEFORE FREEING IT
13953 MOVEM B,TTSTSV+2(U)
13954 SKIPA A,(P) ;TOP LEVEL JOB
13956 SKIPGE T,TTYTBL(A) ;SKIP IF HE HAS IT
13957 JRST NDETAA ;NOW DO GUY HE GAVE IT TO
13959 BUG ;BUT. BUT. BUT.
13960 MOVSI B,%TBNOT+%TBDTY ;TAKEN FROM --ME-- AND DOESN'T HAVE IT
13966 AOSE B ;IF DETACHED TREE WAS LOGGED IN
13967 SOS SUSRS ;ONE LESS CONSOLE CONTROLLED TREE
13968 NDETA5: MOVSI B,BUMRTL ;IF REQUESTED, MARK TREE AS DUE TO DIE
13969 MOVE D,CTLBTS(U) ;IN AN HOUR.
13973 CONO PI,CLKOFF ;PERFORM ACCOUNTING FOR THIS USER AS IF HE WERE LOGGING OUT.
13977 MOVE D,JNAME(A) ;IF TOP LEVEL JOB ...
13978 CAME D,[SIXBIT /HACTRN/] ;IS A HACTRN,
13980 NDETA2: AOS D ;AOS ITS NAME LEVEL UNTIL ...
13981 PUSHJ P,UJNAMU ;IT IS UNIQUE
13982 JRST NDETA2 ;(UJNAMU TURNS OFF CLOCK)
13985 PUSHJ P,DMNPLI ;LOG BACK IN, NAME MAY HAVE CHANGED FROM HACTRN TO HACTRO
13988 MOVEI Q,NDETA9 ;NOW SAY ALL JOBS IN TREE
13989 JRST IFPLUP ;ARE DISOWNED
13991 NDETA8: CAIE A,(U) ;IF JOB ISN'T SELF, STOP IT
13995 ;"ATTACH" SYSTEM CALL:
13996 ;1ST ARG - JOB SPEC -> OUR INFERIOR, OR TOP OF A DISOWNED TREE.
13997 ;2ND ARG - TTY SPEC (OF A TTY WHICH MUST BE FREE)
13998 ;2ND ARG ABSENT => USE OUR CONSOLE, AND GUN OUR TREE
13999 ;CONTROL BIT 400000 => CHANGE JOB'S NAME TO HACTRN (IF 2 ARGS)
14000 ; 4 => START JOB AFTER ATTACHING (JUST LIKE DETACH)
14002 ;CONNECTS THE SPECIFIED JOB TO THE SPECIFIED TTY, AS A CONSOLE CONTROLLED TREE.
14003 ;IF THE TTY IS OUR CONSOLE, WE ARE LOGGED OUT.
14004 ;IF THE JOB IS OUR INFERIOR, IT IS FIRST DISOWNED.
14006 NATTAC: PUSHJ P,SWTL
14009 EXCH A,B ;2ND ARG => IT IS TTY SPEC, SO DECODE IT.
14012 MOVE B,I ;AND PUT IT IN B.
14015 NATTAN: SKIPL B,SUPPRO(U) ;NO 2ND ARG => WE MUST BE TOP LEVEL, SINCE WE'LL HAVE
14016 JRST OPNL40 ;TO LOG OUT. B GETS NEGATIVE.
14018 JSP T,NCRUI2 ;DECODE 1ST ARG, GET USR IDX IN J.
14021 JRST NATTA5 ;JOB SPEC'D MUST BE EITHER
14022 CAIE U,(A) ;OUR INFERIOR, OR
14026 NATTA5: SKIPL APRC(J) ;THE TOP OF A DISOWNED TREE.
14028 ;NOW IF TTY IS OUR CONSOLE, B IS NEGATIVE; OTHERWISE, B HAS TTY #.
14029 NATTA7: PUSH P,CTLBTS(U)
14030 SETZM CTLBTS(U) ;DON'T GET FAKED OUT AT NATTA1, NATTA2, DSWNTY.
14033 MOVEI Q,NDETA8 ;STOP SPEC'D JOB AND ITS INFERIORS.
14036 NATTAM: CONO PI,TTYOFF
14037 SKIPL T,TTYSTA(B) ;SEE IF TTY IS FREE
14039 MOVSI T,(SETZ) ;IT IS, GRAB IT
14040 ANDCAM T,TTYSTA(B) .SEE %TACFM
14041 ANDCAM T,TTYSTS(B) .SEE %TSFRE
14043 JRST NATTA8 ;SINCE NO PCLSR POSSIBLE, DON'T BOTHER WITH A LOSSET OF THESE
14045 NATTAL: HRRE Q,TTYSTS(B)
14047 SKIPG Q ;IF TTY IS IN USE
14048 TLNE T,%TACTZ ;OR BEING ^Z'ED, DEVICE NOT AVAIL
14049 JRST [ SUB P,[2,,2] ? JRST OPNL10 ]
14050 MOVSI T,%TACFM+%TACTZ ;OTHERWISE JUST WAIT FOR CONSOLE FREE
14051 TDNN T,TTYSTA(B) ;MESSAGE TO FINISH COMING OUT
14055 NATTAG: MOVE A,U ;IF HACKING OUR CONSOLE, MUST STOP OUR WHOLE TREE
14056 MOVEI Q,NDETA8 ;(EXCEPT US, OF COURSE - NDETA8 CHECKS THAT).
14059 NATTA4: MOVE B,TTYTBL(B) ;FIND THE TTY'S NUMBER.
14061 JRST NATTAL ;THIS TREE HAS NO TTY?
14062 JUMPL B,NATTA4 .SEE %TBNOT
14063 PUSHJ P,SDTTY ;GET TTY BACK TO TOP OF TREE FOR AGBLT3 LATER.
14066 ;I BELIEVE THAT NOTHING CAN PCLSR BEYOND THIS POINT.
14067 ;RH OF B HAS TTY #; SIGN IS SET IF TTY IS OUR CONSOLE.
14068 NATTA8: AOS TTNTO(B) ;KEEP DSWNTZ FROM HALTING (WILL UNDO THIS LATER)
14069 PUSH P,B ;PUSH <CONSOLE-FLAG>,,<TTY #>
14070 HRRZ A,-1(P) ;LEGALITY OF CALL FULLY CHECKED; CAN START ALTERING.
14071 SKIPGE APRC(A) ;IF SPEC'D JOB IS OUR INFERIOR, DISOWN IT.
14074 TLNE B,%TBDTY ;IF THE INFERIOR HAS THE TTY, TAKE IT AWAY.
14078 NATTAF: HRRZ A,-1(P)
14079 MOVEI Q,DSWNTY ;JUST LIKE .DISOWN, BUT KNOW JOBS ARE ALREADY STOPPED.
14082 NATTA9: MOVEI Q,NATTA2
14084 SKIPGE (P) ;IF HACKING OUR CONSOLE, DISOWN OUR TREE SO IT IS FREE.
14086 ;OUR TTY NOW IN INCONSISTENT STATE SINCE WE ARE DISOWNED
14087 ;BUT TTY STILL BELONGS TO US. AGBLT3 FIXES THAT.
14091 MOVE TT,-1(P) ;NOW "RE-OWN" THE SPEC'D JOB
14092 MOVE A,UNAME(TT);NOT CHANGING ITS UNAME
14093 HRRZ J,B ;TO THE DESIRED TTY, WITH APPRO. RESOURCE WORD.
14095 TLO D,400000 ;TELLS UFN2A THE TREE SHOULD BECOME UN-DISOWNED.
14096 SETZ B, ;NO INTERRUPT BIT NEEDED.
14097 SETOM DLSRCH ;INHIBIT SCHEDULING (UFN2A UNDOES THIS)
14103 NATTAH: MOVE C,D ;FIND THE JOB IN THE TREE BEING ATTACHED
14105 TLNN D,%TBDTY ;THAT IS SUPPOSED TO GET CONTROL OF THE TTY.
14107 SETOM SUPPRO(A) ;BUT DON'T LEAVE IT THINKING IT IS OUR INFERIOR.
14110 HLRE B,UNAME(A) ;ATTACHING JOB TO FREE TTY:
14112 AOS SUSRS ;THIS MAY MEAN 1 MORE LOGGED IN CONSOLE-CTL'ED TREE.
14114 PUSHJ P,TTYINI ;INIT TTYOPT, ECHO AREA, TTYCOM, TTYSTA.
14115 MOVSI B,%TSFRE ;NOW MAKE TTY'S TTYSTS HAPPY
14120 CONO PI,TTYON#1 ;TTYCHN ON, BUT NOT CLKCHN.
14122 PUSH P,I ;IF THE JOB BEING ATTACHED IS LOGGED IN,
14123 MOVE U,-3(P) ;PERFORM ACCOUNTING FOR IT.
14134 MOVE B,-2(P) ;SAVED CTLBTS(U) AT ENTRY
14137 NATTAI: MOVE B,-2(P) ;CTLBTS
14138 MOVSI D,%USTSP ;BUSRC
14140 ANDCAM D,USTP(A) ;START JOB BEING ATTACHED, IF REQUESTED TO
14142 HRRZ U,C ;GET USR IDX GIVING TTY TO IN U,
14144 HRRZ T,I ;TTY # IN T FOR USTTV0
14145 PUSHJ P,USTTV0 ;GIVE THE JOB A BLINKER IF IT DESERVES ONE.
14148 POP P,A ;USR IDX TAKING TTY FROM (BUT NOT REALLY TAKING). I AND U STILL SET.
14149 PUSHJ P,AGBLT4 ;MOVE HIS PER-JOB VARIABLES INTO THE TTY'S VARIABLES, ETC.
14150 JRST NATTAE ;CLOCK IS NOW BACK ON.
14152 NATTAD: CONO PI,CLKOFF
14153 MOVE J,JNAME(U) ;ATTACHING OUR TTY TO JOB:
14154 MOVEM J,JNAME(A) ;GIVE JOB OUR JNAME ALONG WITH OUR TTY.
14157 PUSHJ P,AGBLT6 ;TRANSFER TTY TO HIM, SAVING OUR TTY STATE AND LOADING HIS.
14160 EXCH U,(P) ;U := USER INDEX OF TOP OF TREE BEING ATTACHED
14161 MOVSI T,BUMRTL ;SINCE TREE HAS BEEN ATTACHED, IT SHOULDN'T
14162 ANDCAM T,APRC(U) ;DIE AN HOUR AFTER IT WAS DETACHED.
14163 SKIPN STTYOP(U) ;RESTORE SAVED TTY OPTIONS, IF ANY
14165 LDB T,[170200,,STTYOP(U)]
14166 DPB T,[.BP (%TCRFS+%TCQRY),TTYCOM(I)]
14167 MOVE T,[%TOUSR,,%TPUSR]
14171 NATTAP: HLRE T,UNAME(U)
14174 PUSHJ P,DMNPLI ;LOG HIM IN
14177 SUB P,[1,,1] ;FLUSH SAVED CTLBTS
14178 PUSHJ P,LSWCLR ;UNSTOP THE JOBS AND FREE TREESW
14179 JUMPGE B,POPJ1 ;RETURN IF WE DIDN'T GIVE AWAY OUR CONSOLE.
14180 SETOM TTYTBL(U) ;DON'T WANT ALOGOU TO TYPE LOGOUT MESSAGE.
14181 JRST ALOGOUT ;LOG THIS JOB OUT.
14184 ; RH OF ARG IS JOB SPEC, OF OUR INFERIOR.
14185 ; LH OF ARG XOR CONTROL BITS:
14186 ; 1.1 => RETAIN PRIORITY (DON'T SET APRC)
14187 ; 1.2 => USE SYSTEM RESOURCE
14188 ; 1.3 => CLEAR .USTP AFTER DISOWNING (THUS AVOIDING TIMING ERROR)
14189 ; 1.4 => SET BUMRTL SO THAT JOB WILL BE GUNNED IF IT IS STOPPED FOR A WHOLE HOUR
14190 ; AND NOT REOWNED OR ATTACHED.
14193 XORM J,CTLBTS(U) ;XOR LH OF 1ST ARG INTO CTL BITS.
14195 JSP T,NCRUI2 ;DECODE JOB SPEC; DON'T SET DIELOK.
14198 JRST OPNL31 ;PDP6 NO GOOD.
14200 ADD R,A ; R GETS ADDR OF IOCHNM WORD IF ARG WAS CHANNEL #,
14201 TRNE A,400000 ;GET S0 IF ARG WAS OTHER SORT OF JOB SPEC.
14206 JRST OPNL31 ;NO GOOD IF NOT OUR INFERIOR.
14207 JRST NDISO1 ;JOIN OLD-STYLE DISOWN
14209 ;.DISOWN CH, ;MAKES DIRECTLY INFERIOR PROCEDURE OPEN ON CHANNEL CH
14210 ;THE TOP LEVEL JOB OF A DISOWNED JOB
14212 ADISOWN:HRRZ B,(R) ;PICK UP CH TYPE INDEX
14213 SKIPL CLSTB(B) .SEE %CLSU ;SKIP IF AN INF. USER CHANNEL
14214 JRST IOCER7 ;OTHER TYPE, GIVE IOC ERROR
14215 HLRZ A,(R) ;PICK UP INF.'S INDEX
14217 NDISO1: PUSHJ P,SWTL
14221 TLNE B,%TBDTY ;SKIP IF TTY TAKEN AWAY
14224 PUSH P,A ;JOB TO BE DISOWNED HAS THE TTY: TAKE IT AWAY.
14229 ADISO1: MOVEI Q,DSWNTY
14230 PUSHJ P,IFPHAK ;HACK INFERIORS
14233 PUSHJ P,NATTA1 ;FLUSH OUR POINTERS TO INFERIOR, AND SET FLAGS
14236 JRST LSWCJ1 ;UNSTOP HIS TREE AND FREE TREESW
14238 ;FLUSH INFERIOR-JOB CHANNELS FROM JOB IN U TO JOB IN A
14239 ;CANNOT PCLSR BECAUSE JOB IS CURRENT OR STOPPED ALREADY
14240 NATTA1: MOVEI R,0 ;NO PROTECTED CHANNEL
14243 PUSHJ P,ZUSES1 ;FLUSH POINTERS TO INFERIOR
14245 SETOM SUPPRO(A) ;MARK AS TOP LEVEL
14247 MOVSI TT,BUSRC ;CLEAR .USTP IF REQUESTED
14255 DSWNTY: SKIPL TTYTBL(A)
14256 BUG ;CHECKED AT HIGHER LEVEL, DATA INCONSISTENT
14257 NATTA2: TDZA T,T ;DO SOS TTNTO OF CONSOLE TTY.
14258 NDETA9: SETO T, ;DON'T.
14259 PUSHJ P,CHSCAA ;LOOK AT ALL CNHLS
14260 PUSHJ P,DSWNTZ ;BLESSING CONSOLE TTY CHNLS
14261 MOVEI TT,SYSRCE ;SET RESOURCE POINTER TO SYSTEM OR DISOWNED
14262 MOVE W,CTLBTS(U);DEPENDING ON CTLBTS
14264 MOVEI TT,USRRCE+NCT
14268 IORM T,APRC(A) ;MARK AS DISOWNED
14271 ;BLESS CONSOLE TTY CHANNELS. IF T NONZERO, DON'T SOS TTNTO.
14272 DSWNTZ: HLRZ B,(R) ;GET LH OF IOCHNM WORD
14273 HRRZ J,(R) ;GET DEV TYPE INDEX
14274 CAIL J,TYIDN ;SKIP IF LESS THAN LEAST TTY INDEX
14275 CAILE J,TYOBN ;SKIP UNLESS .LTEQ. HIGHEST
14276 POPJ P, ;NOT A TTY CHANNEL
14277 TRZ B,#%TICNS#(.BM $TIIDX)
14278 TRZE B,%TICNS ;SKIP IF NOT A CONSOLE TTY
14279 CAIN B,%TINON ;DO NOTHING TO "DISOWNED" TTY CHNLS
14281 MOVEI J,%TINON ;CHANGE OTHER TTY CHNLS TO DISOWNED
14282 DPB J,[$TIIDX,,(R)] ;CHNLS.
14283 JUMPN T,CPOPJ ;IN NDETAC, TTNTO ALREADY SETZM'D.
14284 SOSLE TTNTO(B) ;DECREMENT OPEN COUNT
14286 BUG ;SHOULD BE OPEN AT HIGHER LEVELS
14288 ;ROUTINE TO SCAN ALL I/O CHANNEL AND I/O PDL SLOTS OF A PROCEDURE
14289 ;R 4.9=1 => REGULAR CHANNEL 4.9=0 => IOPUSHED CHANNEL
14290 CHSCAA: MOVEI R,IOCHNM(A)
14294 HRLI R,-<LUIOP/2>+400000
14300 ;IFPHAK AND IFPLUP TAKE A USER INDEX IN A AND THE ADDRESS OF A ROUTINE
14301 ; IN Q. THEY CALL THE ROUTINE FOR THE PROCEDURE AND ALL OF ITS
14302 ; INFERIORS BUT IFPHAK ALSO STOPS THE SPECIFIED PROCEDURE AND
14303 ; ALL ITS INFERIORS STRINGING THEIR USTP'S INTO THE CURRENT USER'S
14308 MOVE U,USER ;MADE SURE YOU USE THE RIGHT LSWPR
14309 MOVEI Q,IFSTOP ;SET UP TO STOP
14313 IFPLUP: PUSH P,E ;SAVE E
14316 IFPLU5: MOVE A,E ;RECURSE
14319 PUSHJ P,(Q) ;CALL ROUTINE
14322 MOVEI E,LUBLK*2 ;INITIALIZE TO INDEX OF JOB AFTER CORE JOB
14323 IFPLU2: SKIPN UNAME(E)
14328 IFPLU3: ADDI E,LUBLK ;STEP TO NEXT VAR BLOCK
14329 CAMGE E,USRHI ;SKIP IF ALL EXAMINED
14330 JRST IFPLU2 ;NOT ALL, CONTINUE
14331 CAME H,A ;ALL, SKIP IF BACK TO TOP LEVEL
14332 JRST IFPLU4 ;NOT AT TOP LEVEL, POP UP
14335 POPJ P, ;RETURN FROM CALL TO IFPLUP
14337 IFPLU4: MOVE E,A ;POP
14338 HRRZ A,SUPPRO(A) ;UP
14339 JRST IFPLU3 ;AND CONTINE
14341 IFSTOP: PUSHJ P,RPCLSR ;STOP ROUTINE WHOSE INDEX IS IN A
14345 JRST UPCLSR ;HAVE ALREADY HACKED THIS GUY
14346 IFSTP1: MOVEI T,USTP(A) ;GET LOC OF USTP (WAS AOSED BY RPCLSR)
14347 MOVEI H,LSWB0(A) ;GET LOC OF A LOCKED SWITCH BLOCK OF PROC STOPPED
14348 MOVEM T,(H) ;SET WD1
14354 IORI T,603000 ;SOS WHEN UNLOCKED
14356 MOVEM H,LSWPR(U) ;ADD TO LOCKED SWITCH LIST OF USER
14359 UBLAM: SKIPL APRC(U) ;SKIP IF DISOWNED
14360 PUSHJ P,SDTTY ;GET TTY UP TO THIS LEVEL
14362 UBLAST: PUSHJ P,IODCL ;CLOSE IO DEVICES ETC
14364 PUSH P,U ;DO NOT USE THIS ROUTINE FOR CORING UP.
14369 SETOM BUSR ;SWAP-BLOCKED NO MORE
14372 ANDCAM TT,USWSCD(U)
14374 UBLST4: MOVE U,USER
14375 PUSHJ P,ACRF1 ;CORE DOWN TO NUM OF BLOCKS IN B
14377 MOVE U,USER ;;CHECK FOR ALLEGED BUG SOMEPLACE IN ACRF1
14379 BUG ;;NOT SUPPOSED TO RETURN UNTIL CORE REQUEST SATISFIED
14382 BUG ;;THUS GUY'S CORE SHOULD BE GONE BY NOW
14387 LDB B,[400,,B] ;OPER 50
14392 IFN NUNITS, TLNE A,%CLSDI
14393 .ALSO SKIPA A,UTEOF(A)
14397 ;OPER TO REQUEST OR FLUSH RUNNING IN IOT USER MODE
14398 AIOTLS: MOVSI A,400000
14400 XCTR XR,[SKIPGE (J)]
14401 JRST AIOTL1 ;JUMP IF WANT TO ENTER IOTLSR MODE
14406 AIOTL1: SKIPGE IOTLSR(U)
14407 JRST AIOTL2 ;ALREADY IN IOTLSR, JUST TURN THE BIT ON AGAIN FOR HIM
14408 BUG INFO,SIXBIT,UNAME(U),SIXBIT,JNAME(U),[IOTLSR]
14409 MOVEI T,SCRMSG ;WAIT FOR IT TO BE PRINTED (HA HA WHAT ABOUT BUFFERING?)
14413 AIOTL2: IORM B,UUOH
14416 SUBTTL FILENAME TRANSLATION
14418 ;ROUTINE TO TRANSLATE A FILENAME.
14419 ;WANTS DEV, FN1, FN2, SNAME IN A, B, C, D RESP. LEFT-JUST.
14420 ;WANTS MODE IN RH OF E.
14421 ;RETURNS TRANSLATED NAMES IN SAME PLACE.
14422 TRAN: SKIPN D ;MAYBE DEFAULT THE SNAME.
14423 TRAN6: MOVE D,USYSNM(U)
14428 SKIPN TRNCNT ;IF NO TRANSL. ENTRIES IN USE,
14429 JRST POPJ1 ;SHORT CUT.
14430 PUSHJ P,TRANRF ;GET READ ACCESS TO TRANSL LISTS.
14431 LDB I,[100,,E] ;GET INPUT/OUTPUT BIT.
14432 MOVEI H,10 ;MAX. NUM. TRANSLS ALLOWED.
14433 TRAN0: HRROI Q,(U) ;1ST TRY THIS JOB'S TRNLST.
14436 TRAN1: SKIPGE Q,SUPPRO(Q) ;MOVE UP TREE TO TRNLS1.
14437 SETZ Q, ;AFTER TOP OF TREE, USE SYS.
14438 TRAN2: MOVE J,TRNLS1(Q) ;USE THIS GUY'S TRNLS1.
14439 MOVEI Q,(Q) ;INDICATE THAT FACT IN SIGN.
14441 TRAN3: CAME B,TRANI1(J) ;ENTRY'S FN1 MATCHES
14442 SKIPN TRANI1(J) ;OR IS NULL?
14443 SKIPA TT,TRANI2(J) ;YES, GET FN2.
14444 JRST TRAN4 ;NO, TRY NEXT ENTRY.
14445 CAME TT,C ;FN2 MTCHES OR NULL.
14447 CAME D,TRANIS(J) ;SNAME ?
14449 SKIPA TT,TRANID(J) ;YES, GET DEV.
14452 JUMPN TT,TRAN4 ;TEST DEV.
14453 HLRZ TT,TRANLK(J) ;GET ENTRY'S MODE BITS.
14454 TRNN TT,1(I) ;TRANSLATE OUR MODE?
14460 IRPS X,,OD O1 O2 OS
14462 MOVE A+.IRPCN,TRAN!X(J)
14463 TERMIN ;REPLACE NAMES FROM ENTRY.
14464 TRNE TT,400000 ;ATOMIC?
14465 JRST TRANX3 ;YES, EXIT.
14466 SOJG H,TRAN0 ;ELSE RETRANSL.
14467 JRST TRANX2 ;IF TOO MANY TRANSL., DON'T SKIP.
14469 TRAN4: HRRE J,TRANLK(J) ;CDR DOWN LIST.
14470 TRAN5: JUMPGE J,TRAN3 ;TRY NEXT UNLESS AT END.
14471 JUMPL Q,TRAN2 ;IF DID TRNLST, DO SAME JOB'S TRNLS1.
14472 JUMPN Q,TRAN1 ;ELSE DO SUPPRO'S TRNLS1.
14473 TRANX3: AOS (P) ;EXIT IF DID SYS.
14474 TRANX2: SOS TRNREF ;NO LONGER USING TRANSL. LISTS.
14477 TRANRF: AOS TRNREF ;SAY USING TRANSL. LISTS.
14479 POPJ P, ;OK IF NOT BEING CHANGED.
14480 SOS TRNREF ;NOT REFERENCING AFTER ALL.
14481 SKIPL TRANSW ;WAIT TILL FREE.
14483 JRST TRANRF ;TRY AGAIN.
14484 \f;TRANS SYSTEM CALL.
14485 NTRNS: JSP T,DEFARG ;DEFAULT 5 ARGS TO 0.
14487 XOR E,CTLBTS(U) ;XOR CTL BITS WITH ARG S
14488 PUSHJ P,TRAN ;TRANSLATE NAME.
14489 JRST OPNL3 ;FAIL IF TOO MANY TRANSL.
14490 JRST POPJ1 ;ELSE GIVE BACK TRANSL'D NAMES.
14493 DEFARG: CAML W,(T) ;IF NOT ALL SPEC'D,
14495 SETZM A(W) ;DEFAULT ONE AND RETRY.
14498 ;LOCK TRANSW, AND SET UP 1ST ARG FOR NTRNAD, NTRNDL, NTRNCL.
14499 ;RH OF A HAS JOB SPEC; CONTROL BIT ARGS XOR'D INTO LH.
14500 ;THE 4.8 BIT, IF SET, INDICATES TRNLS1 RATHER THAN TRNLST.
14501 ;OTHER LH BITS IGNORED,, NOT CHANGED BY NTRNUI.
14502 ;ON RETURN, A'S LH IS UNCHANGED, RH IS SUCH THAT
14503 ; TRANLK(A) IS THE ADDR OF THE SPECIFIED TRNLS VAR.
14504 NTRNUI: PUSHJ P,SWTL
14508 JSP T,NCRUI2 ;DECODE THE JOB-SPEC.
14509 JRST NTRNU1 ;JOB GUARANTEED WRITEABLE.
14510 JUMPE J,NTRNU1 ;ALLOW JOBS TO MUNG THE SYSTEM TRANSLATION LIST.
14511 JSP T,NCORWR ;ELSE CHECK.
14512 JRST OPNL31 ;NOT WRITEABLE.
14514 JRST OPNL34 ;PDP6??
14515 HRRI A,TRNLST-TRANLK(J)
14516 TLNE A,200000 ;4.8 BIT SAYS WHICH TRNLS TO USE.
14517 ADDI A,TRNLS1-TRNLST
14520 ;GET UP TO 4 ARGS INTO D ... D+3, FROM AOBJN PTR IN B.
14521 NTRNGA: MOVSI H,-4 ;UP TO 4 ARGS.
14523 NTRNG0: UMOVE J,(B)
14524 JUMPGE W,NTRNG2 ;W IS -1 FOR .TRANA, .TRAND;
14525 TRNN H,-1 ;IN THAT CASE LEFT-JUST. DEV. (1ST ARG)
14527 NTRNG2: CAMN J,[SIXBIT/*/]
14528 MOVEI J,0 ;REPLACE * BY BLANK.
14529 MOVEM J,D(H) ;STORE AWAY.
14530 AOBJP H,CPOPJ ;DONE AFTER 4TH ARG.
14531 AOBJN B,NTRNG0 ;ELSE GET NEXT.
14532 NTRNG3: SETZM D(H) ;ZERO REMAINING ARGS.
14535 \f;TRANEX CALL -- READ IN A JOB'S TRANSL LIST.
14536 ;1ST ARG RH - JOB SPEC. BIT 4.8 - IF SET, TRNLS1 NOT TRNLST.
14537 ;2ND ARG AOBJN -> PLACE TO STORE LIST INTO.
14538 ;UPDATED AOBJN PTR IS OUTPUT ARG.
14539 ;SKIPS IF ENTIRE LIST FIT IN BUFFER.
14540 ;EACH ENTRY TAKES 9 WDS OF SPACE: MODE,, IN 1ST,
14541 ;INPUT DEV, FN1, FN2, SNAME; THEN OUTPUT DEV, FN1, FN2, SNAME.
14542 NTRNEX: PUSHJ P,TRANRF ;GET READ ACCESS TO TRANSL LISTS.
14543 PUSHJ P,SOSSET ;RELINQUISH IF BLOCKED.
14547 JSP T,NCRUI2 ;DECODE THE JOB SPEC.
14548 JFCL ;NOT TRYING TO WRITE.
14549 HRRI A,TRNLST-TRANLK(J)
14550 TLNE A,200000 ;MAKE TRANLK(A) BE TRNLS VAR.
14551 ADDI A,TRNLS1-TRNLST
14552 SUB B,[1,,1] ;SINCE WE AOBJ BEFORE ACTING.
14553 NTRNE1: HRRE T,TRANLK(A) ;AT END -> RETURN SKIPPING.
14555 HLLZ D,TRANLK(T) ;RETURN LH ONLY OF 1ST WD.
14557 NTRNE2: MOVE D,TRANLK(T) ;ALL OF OTHER 8 WDS.
14558 AOBJP B,[ PUSHJ P,OPNL37
14563 AOBJN T,NTRNE2 ;STORE ALL 9.
14564 MOVEI A,-9*SIOMT(T) ;GO TO NEXT.
14568 AOBJP B,.+1 ;COMPENSATE FOR SUB .
14569 PUSHJ P,LSWPOP ;RELEASE READ ACCESS.
14571 JRST SYSCPT ;RETURN AOBJN PTR.
14572 \f;TRANDL CALL -- DELETE ENTRY FROM TRANSL LIST.
14573 ;1ST ARG RH JOB SPEC. OF JOB WHICH IS OK TO MODIFY.
14574 ;1ST ARG LH MODE BITS AS FOR .TRANAD, ALSO 4.8 BIT SAYS TRNLS1
14575 ; (SPEC'D JOB AND INFS, RATHER THAN JUST SPEC'D JOB)
14576 ;2ND ARG AOBJN -> INPUT DEV, FN1, FN2, SNAME. (ONLY DEV NEC.).
14577 ;SKIPS IF SOMETHING WAS DELETED.
14578 NTRNDL: JSP Q,NTRNUI ;PROCESS 1ST ARG., LOCK TRANSW.
14579 NTRND: PUSHJ P,NTRNDA ;ACTUALLY DELETE.
14580 JRST OPNL4 ;NOTHING TO DELETE => FILE NOT FOUND
14581 JRST LSWPJ1 ;SKIP IF NTRNDA DID.
14583 NTRNDA: TLZ A,-1#400003
14584 PUSHJ P,NTRNGA ;ELSE GET INPUT NAMES.
14587 HRRZS (P) ;CLEAR SKIP FLAG.
14589 NTRND2: MOVEI T,(H) ;CDR DOWN BOTH PTRS.
14590 NTRND0: HRRE H,TRANLK(T) ;LOOK AT NEXT ENTRY.
14591 JUMPL H,NTRNDX ;EXIT IF END.
14592 CAMN D,TRANID(H) ;ALL 4 INPUT NAMES MUST MATCH.
14594 JRST NTRND2 ;ELSE NOT TO BE DELETED.
14598 HLLZ R,A ;GET MODE FROM ARG.
14599 TLZ R,400000 ;DONT CLOBBER ATOM BIT
14600 ANDCA R,TRANLK(H) ;TURN OFF IN MODE FROM ENTRY.
14601 CAME R,TRANLK(H) ;IF DELETED ONE, CALL WILL SKIP.
14604 TLNE R,3 ;IF NEITHER DIRECTION LEFT, SPLICE OUT.
14606 SKIPE TRNREF ;WAIT TILL NOONE READING TRANSL LISTS.
14608 SOS TRNCNT ;ONE LESS ENTRY IN USE.
14609 HRRZ R,TRANFL ;MAKE LINK -> CURRENT FREE LIST.
14611 HRRM R,TRANLK(T) ;REST OF TRNLS INTO PREDECESSOR'S LINK.
14612 HRRZM H,TRANFL ;ADD THIS ONE TO FREE LIST.
14615 NTRNDX: HRRES TRANLK(A) ;IN CASE DELETED 1ST ENTRY.
14617 AOS (P) ;SKIP IF SET FLAG.
14619 \f;TRANAD CALL. -- ADD AN ENTRY TO A TRANSL LIST.
14620 ;1ST 2 ARGS AS FOR TRANDL.
14621 ;3RD ARG LIKE 2ND BUT GIVES OUTPUT NAMES.
14622 ;SKIPS UNLESS ALL ENTRIES WERE IN USE.
14623 NTRNAD: JSP Q,NTRNUI
14624 NTRNA: TLNN A,3 ;IF RELLY NOTHING WOULD BE TRANSL'D,
14625 JRST LSWPJ1 ;DON'T BOTHER ADDING..
14626 PUSHJ P,NTRNDA ;DELETE ANY EXISTING TRANSL. FOR THESE INPUT NAMES.
14627 JFCL ;IF WERE NONE.
14629 JRST OPNL5 ;NO FREE ENTRIES - DIRECTORY FULL.
14630 AOS TRNCNT ;1 MORE ENTRY IN USE.
14631 IRPS X,,ID I1 I2 IS
14632 MOVEM D+.IRPCN,TRAN!X(T)
14633 TERMIN ;PUT INPUT NAMES INTO ENTRY.
14635 PUSHJ P,NTRNGA ;GET OUTPUT NAMES.
14636 IRPS X,,OD O1 O2 OS
14637 MOVEM D+.IRPCN,TRAN!X(T)
14638 TERMIN ;STORE OUTPUT NAMES.
14639 MOVE H,TRANLK(A) ;PUT CURRENT TRNLS INTO LINK.
14641 HRREM H,TRANFL ;STORE BACK REST OF FREE LIST.
14642 MOVEM T,TRANLK(A) ;TRNLS NOW STARTS WITH THSI ONE.
14643 HLLM A,TRANLK(T) ;STORE MODE BITS.
14645 \f;TRANCL CALL -- RESET A ONE OR BOTH TRANSL LISTS FOR A JOB.
14646 ;1ST ARG RH HAS JOB SPEC OF MODIFYABLE JOB.
14647 ; BIT 4.8 CLEAR TRNLS1 VAR. (TRANSL FOR THIS JOB & INFS).
14648 ; BIT 4.7 CLEAR TRNLST VAR. (TRANSL FOR THIS JOB ONLY).
14649 ; ALWAYS SKIPS IF VALID.
14650 NTRNCL: JSP Q,NTRNUI ;RH(A) -> TRNLST OR TRNLS1 VAR.
14652 SUBI A,TRNLS1-TRNLST ;MAKE -> TRNLST VAR.
14653 SUBI A,TRNLST-TRANLK
14656 NTRNCA: SUBI A,TRNLST-TRANLK ;MAKE HOLD USR IDX.
14657 NTRNC: PUSHJ P,SWTL ;GET WRITE ACCESS.
14660 SKIPE TRNREF ;WAIT FOR READ REFS TO FINISH.
14662 TLNN A,100000 ;IF 4.7, HANDLE TRNLST.
14665 SETOM TRNLST(A) ;SET LIST TO NIL.
14666 JUMPGE T,NTRNC1 ;IF WASN'T NIL, FREE ENTRIES ON IT.
14667 NTRNC0: TLZN A,200000 ;MAYBE HANDLE TRNLS1.
14671 JUMPL T,LSWPOP ;NOTHING TO DO IF ALREADY NIL.
14672 NTRNC1: MOVEI C,(T) ;SAVE START OF LIST.
14673 NTRNC2: SOS TRNCNT ;UPDATE NUM ENTRIES IN USE.
14675 JUMPL H,NTRNC3 ;AT END, SPLICE INTO FREELIST.
14676 MOVEI T,(H) ;ELSE CDR DOWN.
14678 NTRNC3: EXCH C,TRANFL
14680 JRST NTRNC0 ;MAYBE CONSIDER THE OTHER LIST.
14681 \f;.TRANA, .TRAND CALLS.
14682 ATRANA: UMOVE E,(B)
14683 JSP T,ATRNDT ;SET UP ARGS FOR NTRNA .
14684 PUSHJ P,SWTL ;GET WRITE ACCESS.
14689 ATRAND: XCTR XR,[SKIPN E,(B)]
14690 JRST ATRND0 ;ZERO UNAME -> TRANCL .
14691 JSP T,ATRNDT ;SET UP ARGS.
14692 PUSHJ P,SWTL ;GET WRITE ACCESS.
14696 ATRND0: JSP T,ATRNDT
14697 TLO A,300000 ;SAY CLEAR BOTH LISTS.
14699 SUBI A,TRNLS1-TRNLST ;NAKE SURE -> TRNLST VAR.
14702 ATRNDT: MOVE C,JNAME(U)
14703 MOVEM C,ATRNJN ;WHO THE HELL'S USING THESE?
14704 CAME E,UNAME(U) ;UNAME MUST BE 0 OR THSI JOB'S.
14705 JUMPN E,CPOPJ ;ELSE MAKE UUO FAIL.
14706 MOVNI W,1 ;SIGNAL TO NTRNGA.
14707 MOVEI C,5(B) ;SET UP 2 AOBJN PTRS
14709 HRLI C,-3 ;-> INPUT NAMES (B), OUTPUT NAMES (C).
14711 XCTR XR,[HLL A,(B)] ;GET MODE BITS.
14713 JUMPE D,CPOPJ ;JNAME MUSTN'T BE 0.
14714 CAME D,[SIXBIT/*/] ;IF *, USE THIS JOB'S TRNLS1.
14716 HRRI A,TRNLS1-TRANLK(U)
14719 ATRND2: MOVEI H,0 ;ELSE FIND JOB WITH THAT JNAME.
14720 MOVE E,UNAME(U) ;THIS JOB'S UNAME.
14721 ATRND1: CAMN E,UNAME(H)
14723 JRST ATRND3 ;NOT THE ONE WE'RE LOOKING FOR.
14725 CAIE U,(E) ;IS THIS OUR INF.
14726 CAIN U,(H) ;IS IT THE CURRENT JOB?
14728 POPJ P, ;NO, CAN'T SET ITS TRANSL LIST.
14729 HRRI A,TRNLST-TRANLK(H)
14730 JRST (T) ;OK, SET ITS TRNLST VAR.
14731 ATRND3: ADDI H,LUBLK
14732 CAMGE H,USRHI ;LOOK AT ALL JOBS.
14734 POPJ P, ;CAN'D TRANAD NON EX JOB.
14736 SUBTTL JOB, BOJ DEVICE ROUTINES
14739 JBMN==10 ;MAXIMUM NUMBER OF JOBS ON JOB DEVICE
14741 JBCUI: REPEAT JBMN,-1 ;-1 => CHNL FREE, ELSE (IF JBCG POSITIVE) CREATOR'S USR IDX.
14742 JBCG: BLOCK JBMN ;-1 IF CREATOR GONE AWAY
14743 JBWST: REPEAT JBMN,SNJOB ;CREATED JOB'S WAIT STATUS (CREATED JOB=HANDLER JOB)
14745 %JBWIN==400000 ;4.9 => CREATED JOB HAS DONE A SUCCESSFUL JOBRET
14746 %JBREU==200000 ;4.8 => JOB CLOSED AND MADE ITSELF AVAILABLE FOR REUSE
14747 %JBVAL==020000 ;4.5 => VALID BIT (CREATOR CAME IN, NO JOBRET YET)
14748 %JBSTR==010000 ;4.4 => STORED BIT (CREATOR CAME IN, NO JOBGET YET)
14749 %JBUNH==004000 ;4.3 => BOJ BLK UNHANG BIT
14750 %JBSIO==001000 ;4.1 => IF DOING AN IOT, THIS BITS SAYS ITS REALLY A SIOT
14751 %JBLOS==000400 ;3.9 => CREATED JOB WAS CLOSED AND KNOWS IT, SO DON'T REUSE
14752 ;1.1-2.9 => LAST STATUS SET BY BOJ
14754 JBDEV: BLOCK JBMN ;DEVICE NAME, USER-SETTABLE (MOSTLY FOR PEEK AND WHO LINES)
14755 JBFN1: BLOCK JBMN ;FN1
14756 JBFN2: BLOCK JBMN ;FN2
14757 JBSYS: BLOCK JBMN ;SYSNAME
14758 JBOPNM: BLOCK JBMN ;OPEN MODE
14759 JBFNP: BLOCK JBMN ;BP TO ASCIZ FILENAME STRING IN USER ADDRESS SPACE (OR 0 IF NONE).
14760 JBCJUI: BLOCK JBMN ;RH = CREATED JOB'S USER INDEX.
14761 ;LH = -1 IFF CREATED JOB GOING AWAY. JOB MUST EXIST
14762 ;SINCE WHEN IT DIES IT FLUSHES THE JOB CHANNEL
14763 ;AND ITS CREATOR'S CHANNELS.
14764 JBSTS: BLOCK JBMN ;STATUS OF JOB-BOJ INTERACTIONS
14765 ;4.9=1 => IMAGE =0 => ASCII
14766 ;4.8=1 => BLOCK =0 => UNIT
14767 ;4.7=1 => WRITE =0 => READ
14768 ;4.6-4.3 => NUMBER OF TIMES TO SKIP
14769 ;4.2-3.6 => OPEN LOSS
14770 ;3.5-3.2 => # OF ARGS ON LAST .CALL
14771 ;1.4 => SYSTEM CALL OTHER THAN THOSE BELOW.
14772 ;1.3-1.1 => SYSTEM CALL
14779 ;6 FDELE (DELETE OR RENAME)
14780 ;7 FDELE (RENAME WHILE OPEN)
14782 JBST2: BLOCK JBMN ;SECOND WORD OF JOBGET INFO
14784 ;FOR SIOT, THE BYTE COUNT
14785 ;FOR BLOCK IOT, THE BLOCK POINTER
14786 ;NEW FN1 FOR RENAME, MLINK.
14787 JBOFN1: BLOCK JBMN ;FN1 BEFORE LAST TRANS
14788 JBOFN2: BLOCK JBMN ;FN2 "" ""
14789 JBOSYN: BLOCK JBMN ;SYSNAM ""
14790 JBODEV: BLOCK JBMN ;DEV " "
14791 JBNFN2: BLOCK JBMN ;NEW FN2 FOR FDELE.
14792 JBAC7: BLOCK JBMN ;7TH ARG TO .CALL, NEW SNAME FOR MLINK.
14793 JBAC10: BLOCK JBMN ;TABLE FOR .CALL ARG 10, FIRST BP ARG TO SOPEN/RENAME/MLINK/DELETE.
14794 JBAC11: BLOCK JBMN ;TABLE FOR .CALL ARG 11, SECOND BP ARG TO RENAME, MLINK OR RENMWO.
14796 JBACTB: JBST2(H) ;TABLE OF POINTERS TO .CALL ARG TABLES
14806 JBIOCJ: BLOCK JBMN ;IO CHNL ERROR WORD. 4.9 => IOCER ON NEXT JOB IOT
14809 JBSW: -1 ;LOCK ON ASSIGNMENT OF INDEX IN ABOVE TABLES
14813 ;OPEN ON BOJ: DEVICE
14815 ;3.5 = 1 => UNHANG ON BLK IOT AFTER EACH XFER OF MAXIMAL SIZE
14816 BOJO: JUMPN W,OPNL12 ;NO SUCH MODE
14817 SKIPGE E,JBI(U) ;JOB CHANNEL INDEX
14818 JRST [ MOVE E,OPTION(U) ;IF THIS JOB ISN'T A JOB DEVICE,
14819 TLNN E,%OPOJB ;IF IT'S EXPECTING TO BE AN OJB DEVICE, OK.
14820 JRST OPNL10 ;OTHERWISE IT CAN'T WIN.
14821 SKIPGE JBI(U) ;IF IT CAN WIN, WAIT TILL IT HAS.
14823 JRST BOJO] ;THEN TRY AGAIN.
14825 BUG ;JOB CHANNEL INDEX TOO BIG
14839 ;OPEN ON JOB: DEVICE
14841 ;3.1-3.3 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
14842 ;A,B HAVE FILENAMES, RH(C) HAS DEVICE (JOB OR OJB)
14843 ;RH(D) AND LH(C) BOTH HAVE OPEN-MODE.
14845 JOBO: PUSHJ P,FLDRCK
14847 JRST OPNL11 ;ILLEGAL FILE NAME
14848 JOBO3: CAMN A,[SIXBIT /M.F.D./]
14849 CAME B,[SIXBIT /(FILE)/]
14851 JRST OPNL11 ;ILLEGAL FILE NAME
14852 JOBO2: MOVEI J,0 ;SET J TO JOBGET "COMMAND" NUMBER
14854 MOVEI J,2 ;MLINK, MOSTLY JUST LIKE FDELE, BUT SEE JOBOF3
14859 PUSHJ P,SWTL ;LOCK JOB CHNL ASSIGN SWITCH
14861 JOBO5: SKIPGE TT,JBCUI(Q) ;SKIP IF NOT FREE
14865 JRST JOBORU ;JUMP IF THIS IS FIRST ATTEMPT TO OPEN
14869 SKIPGE JBCG(Q) ;LOOK FOR CHANNEL ON WHICH THIS USER
14870 CAIE TT,(U) ;PREVIOUSLY ATTEMPTED TO OPEN, BUT PCLSRED
14876 JRST JOBO6 ;NOT OPENING SAME FILE
14881 JRST JOBO6 ;NOT FOR SAME FILE
14887 JRST JOBO6 ;NOT FOR SAME OPEN TYPE AND MODE
14889 TLNE TT,%JBLOS+%JBWIN+%JBREU
14890 JRST JOBO6 ;HANDLER JOB NOT IN CORRECT STATE
14891 HRRZ E,Q ;REUSE SAME HANDLER JOB AS IN PREVIOUS ATTEMPT TO OPEN
14892 SETZM JBCG(E) ;I'M BACK
14893 PUSHJ P,LSWPOP ;FREE JBSW
14895 MOVEM TT,JBWST(E) ;RE-GIVE OPEN COMMAND STILL SITTING IN JBSTS ETC.
14896 HRLI E,400000 ;OPEN-TYPE WAIT
14897 PUSHJ P,JBWT2 ;WAIT FOR HANDLER JOB TO PROCESS IT
14898 JRST JOBO8 ;FINISH OFF THEN OPEN
14900 ;FIRST ATTEMPT TO OPEN, CHECK FOR REUSEABLE HANDLER JOBS BEFORE CREATING NEW
14901 JOBORU: CONO PI,CLKOFF
14905 JRST JOBO6 ;IN USE ALREADY OR NOT WILLING TO BE REUSED
14908 JRST JOBOR1 ;IF SAME SIMULATED DEVICE, OK TO SIEZE
14911 JRST JOBO6 ;DIFFERENT HANDLER NAME
14914 JRST JOBO6 ;DIFFERENT HANDLER NAME
14915 JOBOR1: MOVEM TT,JBWST(Q) ;THIS ONE OK, SIEZE IT
14921 PUSHJ P,LSWPOP ;FREE JBSW
14924 JOBO4: HRRZ E,Q ;REMEMBER FREE JOB CHNL IN CASE NEEDED
14925 JOBO6: CONO PI,CLKON
14926 AOBJN Q,JOBO5 ;SCAN REST OF JOB CHANNELS
14927 JUMPL E,OPNL6 ;DEVICE FULL
14928 MOVEM U,JBCUI(E);STORE CREATOR'S USER INDEX
14929 PUSHJ P,LSWPOP ;FREE JOBSW
14930 PUSHJ P,STMSET ;SETOM JBCUI(E) ON LOSSAGE
14937 MOVEI T,SNJOB ;INITIALIZE STATUS
14946 ANDI C,-1 ;FOR OJB DEVICE, LOOK FOR EXISTING JOB.
14949 MOVE A,UNAME(U) ;FOR JOB DEVICE, CREATE NEW JOB.
14954 ADD B,[SIXBIT /JOB./] ;CREATE JNAME = 'JOB.MN'
14955 MOVE C,[7,,(SIXBIT /USR/)]
14957 PUSHJ P,USROJ ;GENERATE USER(CAN ONLY PCLSR BEFORE CREATING INFERIOR)
14958 JRST POP7J ;USER OPEN FAILED, MUST HAVE GONE TO OPNL ALREADY
14964 MOVE T,[JBSTCD,,AC0S]
14969 MOVEM A,AC0S+10(TT)
14970 MOVEM B,AC0S+11(TT)
14972 MOVEM T,USYSNM(TT) ;SET CREATED JOB'S SYS NAME TO OURS
14973 SETZM USTP(TT) ;START JOB AS SOON AS CLK BACK ON
14976 ;OJB: DEVICE, LOOK FOR JOB WHOSE NAMES ARE THE FILENAMES SPECIFIED IN THE OJB OPEN.
14977 JOBO6B: MOVE C,[7+UBPFJ,,'USR] ;DON'T EVER CREATE JOB FOR OJB.
14978 MOVE D,[SETZ 3+UBPFJ_<-1>]
14983 ;TT HAS USER IDX OF JOB TO BE USED; CAN'T PCLSR AFTER THIS POINT.
14984 JOBO6C: PUSHJ P,LSWDEL ;SETOM JBCUI(E)
14991 JOBO7: CONO PI,CLKOFF
15008 JUMPN J,[PUSHJ P,JFDEL5 ;DELETE/RENAME/MLINK
15010 LDB TT,[000300,,JBOPNM(E)]
15013 HRRZ C,JBOPNM(E) ;GET ALL OF OPEN MODE
15014 MOVEM C,JBNFN2(E) ;GIVE IT
15015 JOBO9: PUSHJ P,JBWT1 ;STORE STUFF AND HANG
15016 JOBO8: LDB TT,[350400,,JBSTS(E)]
15017 JUMPE TT,JOBOPL ;OPEN LOST
15018 LDB C,[000400,,JBSTS(E)]
15019 JUMPN C,[ SETOM JBCG(E) ;DELETE/RENAME/MLINK
15022 SETZM IOCHST-IOCHNM(R)
15030 JOBOPL: LDB C,[270600,,JBSTS(E)]
15037 ;RENAME WHILE OPEN ON JOB CHNL
15038 JFDEL4: HLRZ E,(TT) ;JOB CHNL INDEX
15040 PUSHJ P,JFDEL5 ;DO "FDELE"
15041 MOVE TT,EPDL3(U) ;PASS ALONG THE BP ARG IF THERE WAS ONE.
15044 JRST AIOCA1 ;GET RESULTS
15046 ;FDELE/RENMWO/MLINK ON JOB CHANNEL
15047 JFDEL5: MOVEM J,JBSTS(E)
15048 MOVE TT,SRN3(U) ;REMEMBER NAMES TO RENAME AS
15049 MOVEM TT,JBST2(E) ;FOR JOBGET TO RETURN.
15052 MOVE TT,SRN5(U) ;IN CASE THIS IS MLINK, MAKE SURE THE "TO" SNAME
15053 MOVEM TT,JBAC7(E) ;IS GIVEN TO JOBGET.
15057 ;GIVE AN INTERRUPT TO THE JOB DEVICE HANDLER.
15058 ;JOB CHNL INDEX IN E, CLOBBERS TT,J,Q,H
15061 JBINT: HRRZ TT,JBCJUI(E)
15066 TDNN H,CLSTB(Q) ;SKIP IF BOJ
15067 JBINT2: AOBJN J,JBINT1
15075 ;THIS IS THE CODE PUT IN THE ACS TO LOAD IN THE JOB DEVICE HANDLER
15077 JBSTCD: .OPEN 1,7 ;0
15084 4,,(SIXBIT /DSK/) ;7
15091 -1 ;16 (LOAD INTO SELF)
15094 ;HAND THE JOB DEVICE HANDLER A SYSTEM CALL AND WAIT FOR IT TO BE HANDLED.
15095 ;CALL WITH CLOCK OFF, JOB CHNL IN E
15096 JBWT1: TLOA E,400000 ;OPEN/FDELE/MLINK, CLOSE CHANNEL IF PCLSR
15097 JBWT: TLZ E,400000 ;NORMAL ENTRY POINT, DON'T CLOSE IF PCLSR
15099 JBWTI: HRLI E,200000 ;ENTER HERE TO INHIBIT SETTING %PCFPD IF PCLSR
15100 MOVSI TT,%JBVAL+%JBSTR
15101 IORM TT,JBWST(E) ;TURN ON VALID AND STORED
15102 JBWT2: PUSHJ P,JBINT ;GIVE INT
15104 JBPCL ;CLEAR VALID AND STORED IF PCLSR
15105 MOVE T,E ;CAUSES EPDL2 TO HAVE JOB INDEX
15108 PUSHJ P,UFLS ;AWAIT RESULTS FROM HANDLER JOB
15110 ANDCAM TT,UUOH ;NOW WE KNOW WE'LL RETURN TO USER WITHOUT PCLSRING FIRST
15113 JBPCL: MOVE A,AC0S+E(U) ;HERE IF PCLSR OUT
15114 SKIPL JBCJUI(A) ;UNLESS HANDLER GOING AWAY
15115 TLNE A,200000 ;OR THIS SYSTEM CALL DOESN'T WANT IT,
15117 MOVSI T,%PCFPD ;SET FIRST PART DONE FLAG
15118 IORM T,UPC(U) ;NOTE PCLSR HAS ALREADY MOVED UUOH INTO UPC
15119 JBPCL1: MOVSI T,%JBVAL+%JBSTR ;NOT VALID, NOT STORED
15122 SETOM JBCG(A) ;SAY THE CREATOR HAS CLOSED IT
15126 MOVE E,A ;AND GIVE THE HANDLER AN INTERRUPT
15133 ;JOB DEVICE BLOCK MODE IOT EITHER DIRECTION
15134 JBBI: XCTR XRW,[MOVES D,(C)] ;REFERENCE POINTER
15140 HRRZ T,D ;-> FIRST WORD TO TRANSFER
15141 HLROS D ;MINUS WORD COUNT
15142 IORI D,700000 ;FLUSH CHAR COUNT
15143 SUBM T,D ;D -> LAST WORD + 1 TO TRANSFER
15144 JRST JBIPG ;SWAP IN BUFFER THEN DO IOT
15146 ;JOB DEVICE UNIT MODE IOT EITHER DIRECTION
15148 JBUI: MOVSI T,%JBSIOT
15152 UMOVE W,(C) ;FOR UNIT OUTPUT
15153 JBIOT1: HRRZ TT,JBOPNM(A)
15156 HRRZ E,A ;JOB CHNL INDEX
15158 MOVEM C,SRN3(U) ;MAY BE ADDRESS OF BLOCK IOT POINTER
15161 JRST JBWTI ;GO SIGNAL HANDLER JOB
15162 SETZM JBIOCJ(E) ;TAKE IOC ERROR INSTEAD
15163 JRST IOCERF-MIOTER(TT)
15165 ;JOB DEVICE SIOT EITHER DIRECTION
15166 JBSI: AOS (P) ;SIOT SHOULD SKIP RETURN
15169 XCTR XRW,[MOVES T,(B)] ;BYTE PNTR ARG
15170 LDB E,[300600,,T] ;BYTE SIZE
15172 IDIVM D,E ;E := # BYTES PER WORD
15173 XCTR XRW,[MOVES D,(C)] ;BYTE COUNT ARG
15175 IDIV D,E ;D := WORD COUNT, E := EXCESS BYTES
15176 IBP T ;-> FIRST WORD TO TRANSFER
15181 JBIPG: HRRZS D ;-> LAST WORD TO TRANSFER + 1
15182 ANDI T,-2000 ;-> FIRST PAGE INVOLVED IN TRANSFER
15183 LDB E,[.BP .UII#.UIO,JBOPNM(A)] ;0 INPUT 1 OUTPUT
15184 JBIPG1: SKIPE E ;SWAP IN THE NECESSARY PAGES
15185 XCTR XR,[SKIPA 20(T)]
15186 XCTR XRW,[MOVES 20(T)]
15192 ;FLSINS ROUTINE TO WAIT FOR CREATOR TO BE HUNG AT JBFLS
15193 ;4.9 OF SRN3 = 1 => WAIT FOR WRITE 0 => READ
15194 ;1.1-1.4 => CODE OF UUO TO WAIT FOR
15196 BJWAIT: SKIPE B,FLSINS(T)
15198 POPJ P, ;NOT HUNG AT JBFLS
15199 HRRZ B,EPDL2(T) ;JOB INDEX THAT CREATOR IS HACKING
15200 HLRZ E,T ;JOB INDEX OF BOJ USER
15202 POPJ P, ;CREATOR HACKING JOB DEVICE ON SOME OTHER CHANNEL
15204 LSH TT,2 ;4.9 => READ/WRITE BIT NOW
15205 EQV TT,SRN3(U) ;4.9 OF SRN3 => WHAT TO LOOK FOR
15206 JUMPGE TT,CPOPJ ;DOESN'T MATCH
15207 MOVE TT,JBSTS(B) ;INSN CREATOR IS DOING
15208 XOR TT,SRN3(U) ;INSN LOOKING FOR
15210 AOS (P) ;THEY MATCH, AWAKEN BOJ JOB
15213 ;BOJ DEVICE UNIT MODE OUTPUT
15217 MOVEI B,1 ;WAIT FOR INPUT IOT
15219 HRLZ T,A ;JOB INDEX
15220 HRR T,JBCUI(A) ;CREATOR'S USER INDEX
15221 PUSHJ P,CWAIT ;WAIT FOR CREATOR TO BE IN IOT, RETURN WITH CLK OFF
15226 BJUO1: MOVE TT,JBSTS(A)
15228 JRST BJUOB ;BLOCK MODE CREATOR IOT
15229 LDB D,[.BP (%JBSIOT),JBWST(A)]
15230 JUMPN D,BJUOS ;CREATOR SIOT
15232 BJIUNH: MOVSI D,%JBWIN
15233 IORM D,JBWST(A) ;SET SUCCESSFUL JOBRET BIT
15234 MOVSI D,%JBVAL+%JBSTR
15237 DPB D,[350400,,JBSTS(A)] ;DON'T SKIP
15238 EXCH D,FLSINS(T) ;RESTART CREATOR
15241 BUG ;HE WASNT WHERE HE BELONGED
15242 POPJ P, ;NEED NOT CLKON, CALLER WILL TURN IT ON
15244 ;BOJ UNIT OUTPUT TO JOB SIOT
15245 BJUOS: PUSHJ P,BJBINI
15246 XCTRI XBYTE,[IDPB H,(B)]
15249 XCTR XRW,[SOSG (C)]
15253 BJBINI: HRLI T,%UMALL
15257 XCTRI XRW,[MOVE D,(B)]
15261 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT
15262 BJUOB: PUSHJ P,BJBINI
15265 XCTRI XW,[MOVEM H,(D)]
15269 XCTRI XW,[MOVEM D,(B)]
15275 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT, ASCII MODE
15276 BJUOBA: LDB E,[410300,,D] ;CHAR COUNT
15279 XCTRI XR,[MOVE W,(D)]
15280 SKIPA E,BTOCHT-3(E)
15283 XCTRI XW,[MOVEM W,(D)]
15289 XCTRI XW,[MOVEM D,(B)]
15294 BJIUNP: PUSHJ P,BJIUNH ;UNHANG CREATOR
15297 ;BOJ DEVICE BLOCK OUTPUT
15298 BJBO: SKIPGE JBCG(A)
15300 XCTR XRW,[MOVES D,(C)] ;D GETS IOT POINTER
15305 IORI B,700000 ;FLUSH CHAR CNT
15309 JRST IOADC ;DON'T WRAP AROUND (WHY NOT?)
15310 UMOVE H,(D) ;H GETS FIRST WORD
15312 PUSHJ P,BJBWT ;WAIT FOR JOB INPUT IOT, COME BACK WITH CLK OFF.
15313 JRST CLKONJ ;UNHANG
15314 MOVEI I,1 ;FOR BJBB
15317 JRST BJBB ;CREATOR IOT IS IN BLOCK MODE
15318 JUMPGE TT,BJBOA ;CREATOR IOT IS ASCII
15325 XCTRI XW,[MOVEM D,(C)]
15328 BJBEX: TLNN D,700000
15329 JRST CLKONJ ;BOJ BLOCK POINTER EXHAUSTED
15332 TLNN E,%JBVAL ;SKIP IF JOB IOT STILL WAITING FOR MORE
15334 JRST (T) ;TRANSFER MORE
15335 POPJ P, ;UNHANG BOJ IOT PREMATURELY
15337 ;BOJ BLOCK ASCII OUTPUT FETCH CHARACTER
15338 BJBOA: MOVE E,BTOCHT-3(E)
15346 ;BOJ BLOCK IOT WAIT. AWAITS JOB IOT, UNLESS UNHANGING.
15347 ;TURNS CLKOFF. SKIPS UNLESS SUPPOSED TO UNHANG.
15348 BJBWT: MOVEM B,SRN3(U) ;SAVE WHAT JOB UUO TO WAIT FOR
15349 HRLZ T,A ;SET UP ARG FOR BJWAIT FLSINS
15351 MOVE TT,JBWST(A) ;CHECK FOR DON'T HANG MODE
15354 PUSHJ P,CWAIT ;WAIT FOR JOB IOT
15358 BJBWT1: CONO PI,CLKOFF ;IF NOT ALREADY IN JOB IOT, DON'T WAIT
15359 JRST BJWAIT ;TEST CREATOR STATUS, POPJ OR POPJ1
15361 ;BOJ DEVICE UNIT MODE INPUT
15362 BJUI: MOVE B,[SETZ 1] ;WAIT FOR OUTPUT IOT
15364 HRLZ T,A ;JOB INDEX
15365 HRR T,JBCUI(A) ;CREATOR'S USER INDEX
15366 PUSHJ P,CWAIT ;WAIT FOR CREATOR TO IOT, RETURN WITH CLKOFF
15371 BJUI1: MOVE TT,JBSTS(A)
15373 JRST BJUIB ;BLOCK MODE CREATOR IOT
15374 LDB D,[.BP (%JBSIOT),JBWST(A)]
15377 JRST BJIUNH ;SUCCESSFUL
15379 ;BOJ UNIT INPUT FROM JOB SIOT
15380 BJUIS: PUSHJ P,BJBINI
15381 XCTRI XBYTE,[ILDB W,(B)]
15384 XCTR XRW,[SOSG (C)]
15388 ;BOJ UNIT INPUT FROM JOB BLOCK IOT
15389 BJUIB: PUSHJ P,BJBINI
15392 XCTRI XR,[MOVE W,(D)]
15396 XCTRI XW,[MOVEM D,(B)]
15402 ;BOJ UNIT INPUT FROM JOB BLOCK IOT, ASCII MODE
15403 BJUIBA: LDB E,[410300,,D] ;CHAR COUNT
15407 XCTRI XR,[MOVE W,(B)]
15408 SKIPA E,BTOCHT-3(E)
15414 XCTRI XW,[MOVEM D,(B)]
15421 ;BOJ DEVICE BLOCK MODE INPUT
15422 BJBI: SKIPGE JBCG(A)
15424 XCTR XRW,[MOVES D,(C)] ;D GETS IOT POINTER
15429 IORI E,700000 ;FLUSH CHAR CNT
15433 JRST IOADC ;DON'T WRAP AROUND
15435 PUSHJ P,BJBWT ;WAIT FOR JOB OUTPUT IOT, COME BACK WITH CLK OFF
15436 JRST CLKONJ ;UNHANG
15437 MOVEI I,0 ;FOR BJBB
15440 JRST BJBB ;CREATOR IOT IS IN BLOCK MODE
15443 PUSHJ P,BJUI1 ;GET DATA OUT OF CREATOR UNIT MODE IOT
15448 JUMPGE TT,BJBIA ;ASCII
15449 XCTRI XW,[MOVEM H,(D)]
15455 ;BOJ BLOCK ASCII INPUT STORE CHAR
15456 BJBIA: LDB E,[410300,,D]
15459 XCTRI XR,[MOVE W,(D)]
15460 SKIPA E,BTOCHT-3(E)
15463 XCTRI XW,[MOVEM W,(D)]
15469 BJBIX: MOVEI T,BJBI
15470 XCTRI XW,[MOVEM D,(C)]
15477 ;BOJ BLOCK IOT TO/FROM JOB BLOCK IOT
15479 HRLI J,%UMALL ;UMAPS FOR PURELY CREATOR IOT
15481 BJBBL: MOVE J,SRN4(U)
15484 XCTRI XRW,[MOVES H,(E)]
15485 CAIA ;H HAS JOB BLOCK IOT POINTER
15488 XCTRI XRW,[MOVES D,(C)]
15489 CAIA ;D HAS BOJ BLOCK IOT POINTER
15491 JUMPGE H,[PUSHJ P,BJIUNH
15497 HLRE B,D ;CHOOSE SMALLER OF TWO BLOCK SIZES
15498 MOVNS B ;COUNT TO BE XFERRED
15499 HRLZ E,H ;JOB ADDRESS
15500 HRR E,D ;JOB,,BOJ (FROM,,TO FOR BOJ INPUT)
15501 HLRZ Q,E ;JOB ADDRESS
15503 JRST BJBB1 ;JOB ADDR IS AN AC
15504 HRRZ J,T ;SET UP UMAPS (JOB USER INDEX IN RH)
15506 TLOA J,%UMMPL ;TO HI PG, HACK OUR LO PAGE
15507 TLO J,%UMMPU ;TO LO PG, HACK OUR HI PAGE
15509 TLOA J,%UMLTU ;TO POINT TO HIS UPPER
15510 TLO J,%UMUTL ;TO POINT TO HIS LOWER
15511 TLNN J,%UMMPU+%UMUTL ;MAPPING HIS UPPER FROM OUR LOWER?
15512 JRST BJBB3 ;YES. MAKE SURE NOT SCREWED BY AC PNTR
15513 BJBB3A: PUSHJ P,PLD1
15515 MOVNS Q ;LIMIT SIZE OF XFER TO MIN OF
15516 ADDI Q,400000 ;DIST OF TO ADR FROM SEG BOUNDARY
15517 CAMLE B,Q ;AND DIST OF FROM ADR FROM SEG BOUNDARY
15519 MOVNI Q,(E) ; - BOJ ADDR
15523 TLNN J,%UMMPL ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
15524 TLOA E,400000 ;SET JOB ADDR TO HI SEG
15525 TRO E,400000 ;SET BOJ ADDR TO HI SEG
15527 MOVSS E ;XFER OTHER DIRECTION
15528 MOVE Q,E ;SAVE COPY OF BLT POINTER
15529 ADDI B,(E) ;GET LA + 1
15530 XCTRI XBRW,[BLT E,-1(B)] ;XFER DATA
15531 HRRZS E,B ;NO FAULT. SIMULATE STORE BACK OF POINTER (CAN BE 1,,0)
15535 BJBB2: HRLS Q ;NUMBER OF WORDS ACTUALLY XFERRED IN BOTH HALVES
15536 XCTRI XRW,[ADDM Q,(C)] ;UPDATE BOJ BLK PNTR
15540 PUSHJ P,PLD1 ;MAP TO CREATOR
15543 XCTRI XRW,[ADDM Q,(W)] ;UPDATE JOB BLK PNTR
15547 JRST BJBBL ;NO FAULT, LOOP BACK
15548 PUSHJ P,PLD1 ;RESTORE TO FROB AT TIME OF FAULT
15549 BJBBF: PUSHJ P,TPFLT ;TAKE FAULT (TURNS CLK ON)
15550 PUSHJ P,MPLDZ ;RESTORE NORMAL MAP
15551 JRST @BJOV(I) ;RESTART THE IOT
15554 BJBB1: ADDI Q,UUOACS(T)
15556 MOVE B,(Q) ;READ JOB WORD
15557 BJBB3C: XCTRI XW,[MOVEM B,(E)]
15560 BJBB2A: MOVEI Q,1 ;1 WORD XFERRED
15561 HRRZ B,E ;FAKE OUT FAULT TEST
15565 BJBB1A: XCTRI XR,[MOVE B,(E)]
15571 BJBB3: TLNE E,777760 ;SKIP ON XFERRING FROM AC AREA, HI TO HI
15572 JRST BJBB3A ;NO. OK TO DO BLT
15574 HRLI J,%UMALL ;HACK OUR HI TO POINT TO HIS HI
15576 XCTRI XR,[MOVE B,(Q)]
15580 HRRZ E,D ;TO ADDRESS
15583 BJBB3B: XCTRI XR,[MOVE B,(D)]
15587 PUSHJ P,PLD1 ;HACK OUR HI TO POINT TO HIS HI
15588 XCTRI XW,[MOVEM B,(Q)]
15596 ;UP TO SIX WDS RETURNED
15599 ;4.9-4.7 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
15600 ; 4.9-4.7 SHOULDN'T BE USED, SINCE THE FULL MODE IS IN WD7 ON AN OPEN
15601 %JGCLS==40000 ;4.6 => CLOSE (NOTE 4.5 USED TO BE A CLS BIT ALSO)
15602 %JGSIO==1000 ;4.1 => SIOT (ONLY IF OPCODE = 1)
15603 %JGFPD==200 ;3.8 => THIS CALL WAS PCLSRED AND IS RESTARTING
15604 ;1.4-1.1 => TYPE OF OPERATION
15607 %JOIOT==1 ;IOT/SIOT
15612 %JORNM==6 ;FDELE (DELETE OR RENAME)
15613 %JORWO==7 ;FDELE (RENAME WHILE OPEN)
15614 %JOCAL==10 ;SYMBOLIC .CALL
15616 ;WD2 SET ONLY FOR BLOCK IOT POINTER, ACCESS POINTER, NEW FN1 FOR FDELE
15620 ;WD6 LEFT ADJUSTED DEVICE NAME
15621 ;WD7 NEW FN2 FOR FDELE.
15622 ;IGNORE ALL RETURNED INFO ON AN ERROR RETURN
15623 ;IF 4.5 OR 4.6 IS SET THEN ALL ELSE IS MEANINGLESS
15625 NJBGT: SETZM T ;INDICATE JOBGET, NOT JOBCAL
15626 NJBCL0: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15627 TLNN R,%CLSBJ ;NOT A BOJ CHANNEL => WRONG TYPE DEVICE
15632 JRST NJBGTE ;FAIL IF VALID NOT SET
15634 MOVEM C,JBWST(E) ;CLEAR STORED BIT
15639 TLZ A,077777 ;FLUSH RANDOM BITS FROM LH
15644 JUMPN T,NJBCL1 ;BRANCH IF JOBCAL
15645 NJBGT0: MOVE B,JBST2(E)
15654 NJBGTE: SKIPL JBCG(E) ;HAS CREATOR GONE AWAY?
15655 JRST OPNL36 ;NO, VALID CLEAR
15656 CONO PI,CLKON ;YES, GIVE CLOSE
15659 MOVSI A,%JGCLS ;GIVE CLOSE BITS
15660 JRST POPJ1 ;DON'T GIVE ANYTHING ELSE WHETHER JOBGET OR JOBCAL
15669 ; [-N,,ADR OF DATA BUFFER] ;OPTIONAL
15671 ; OPCODE WILL BE THE SAME AS RETURNED IN WD1 BY JOBGET
15672 ; IF OPCODE<10 THEN WD2-WD7 OF JOBGET WILL BE WRITTEN INTO DATA BUFFER
15673 ; FOLLOWED BY JOB'S EPDL AND EPDL3 (THE BPS FOR BP-STYLE OPENS, ETC).
15674 ;IF OPCODE=10 THEN JOB'S LAST .CALL WILL BE DESCRIBED:
15675 ; WORD 1 OF DATA BUFFER => SIXBIT OF OPERATION (I.E. THE NAME
15677 ; WORD 2 OF DATA BUFFER => FLAG BITS OF .CALL
15678 ; WORD 3 OF DATA BUFFER => # OF ARGS TO .CALL
15679 ; WORDS 4-12 => INPUT ARGS TO .CALL
15681 NJBCL: CAIL W,2 ;DID CALLER SUPPLY AOBJN POINTER?
15682 SKIPN T,B ;IF SO AND NON-ZERO USE IT
15683 MOVEI T,1 ;OTHERWISE SET T NONZERO
15684 JRST NJBCL0 ;GO JOIN JOBGET CODE FOR ERROR CHECKING
15686 NJBCL1: JUMPGE T,POPJ1 ;BACK FROM JOBGET - ANY AOBJN PNTR?
15687 MOVEI C,9 ;YES - OPCODE 10?
15689 JRST NJBCL2 ;NO - JUST COPY 9 STANDARD ARGS
15690 HLRE D,T ;GET LENGTH OF USERS DATA BUFFER
15691 MOVE B,JBCUI(E) ;GET JOB'S USER INDEX
15692 MOVE C,LSCALL(B) ;GET NAME OF JOB'S LAST CALL
15693 UMOVEM C,(T) ;PUT INTO CALLERS BUFFER
15694 AOJE D,POPJ1 ;IF NO MORE ROOM - DONE
15695 MOVE C,CTLBTS(B) ;GET USER'S .CALL FLAG BITS
15698 LDB C,[230400,,JBSTS(E)] ;GET # OF ARGS
15700 JUMPE C,POPJ1 ;ANY ARGS TO PASS?
15701 ADD T,[3,,3] ;YES - COPY INTO BUFFER
15702 NJBCL2: JUMPGE T,POPJ1 ;ANY ROOM LEFT?
15703 MOVNS C ;GET SMALLEST WORD COUNT
15706 HRL T,C ;MAKE AOBJN PNTR AS SMALL AS POSSIBLE
15707 MOVE H,E ;JOB INDEX IN H FOR USING JBACTB
15708 MOVEI B,JBACTB ;GET PNTR TO ARG TABLES
15709 NJBCL3: MOVE C,@(B) ;GET NEXT ARG
15710 UMOVEM C,(T) ;GIVE TO CALLER
15713 JRST POPJ1 ;DONE - GO SKIP
15722 ; [OPEN LOSS #(IF RH = 0),,# TIMES FOR CREATING JOB TO SKIP]
15723 ; SETZ [-N,,ADR OF DATA BUFFER]
15725 ;RETURN DATA (E.G. RETURN TO RCHST,STATUS OR THE RETURN ARGS TO A .CALL)
15726 ;WILL BE COPIED FROM THE CALLER'S DATA BUFFER
15728 NJBRT: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15729 TLNN R,%CLSBJ ;NOT BOJ CHNL => WRONG TYPE DEVICE.
15731 CAIGE W,3 ;RETURN ARGS PROVIDED?
15732 SETZM C ;NO - ZERO IT
15733 JUMPGE C,NJBRT1 ;DO NOTHING IF NO RETURNS OR NO AOBJN
15734 HLRE D,C ;GET LENGTH OF BUFFER
15735 CAMGE D,[-8.] ;MAKE SURE AREA AT MOST 8 LONG
15736 MOVNI D,8 ;OVER 8 - USE 8
15737 HRL C,D ;FIX AOBJN PNTR
15739 ADDI D,-1(C) ;GET ADDRESS OF LAST WORD NEEDED
15740 XCTR XR,[SKIP (C)] ;MAKE SURE PAGES ARE IN
15742 NJBRT1: CONO PI,CLKOFF ;NOW OK TO TURN CLOCK OFF
15746 JRST OPNL36 ;FAIL IF STORED IS SET OR IF VALID IS CLEARED
15754 TLZ A,%JBVAL+%JBSTR
15755 MOVEM A,JBWST(E) ;SET SUCCESSFUL JOBRET BIT, CLEAR VALID AND STORED
15756 DPB B,[350400,,JBSTS(E)] ;NUMBER OF TIMES TO SKIP
15758 DPB B,[270600,,JBSTS(E)] ;OPEN LOSS
15759 MOVSI B,-6 ;DEFAULT # WDS TO RETURN FOR .RCHST IS 6.
15761 JUMPGE C,NJBRT3 ;ANY RETURN ARGS?
15762 MOVEM C,JBAC11(E) ;REMEMBER HOW MANY, FOR .RCHST TO RETURN THAT MANY.
15763 MOVE H,E ;YES - COPY THEM
15765 NJBRT2: XCTRI XR,[MOVE B,(C)] ;GET IT
15767 BUG ;PAGE IS TIED - NO?
15768 MOVEM B,@-1(D) ;PUT INTO ARG TABLE
15770 NJBRT3: SETZM FLSINS(TT) ;RESTART CREATOR
15773 ;JOB DEVICE CLOSE ROUTINE
15774 JOBCLS: SETOM JBCG(A)
15777 PUSHJ P,JBINT ;INTERRUPT POOR BOJ GUY
15778 JRST CLKONJ ;SINCE HE HAS NO CREATOR
15780 ; ROUTINES FOR JOB ACCESS, RFPNTR, RESET, AND STATUS
15782 RFPJOB: MOVEI J,4 ;USE OLD .RCHST OPERATION, OPCODE 4
15786 PUSHJ P,JBWT ;SIGNAL JOB, WAIT FOR ANSWER
15787 HLRE TT,JBAC11(E) ;GET # VALUES RETURNED
15790 SKIPA A,JBODEV(E) ;GET ACCESS POINTER RETURNED
15791 SETO A, ;NO ACCESS POINTER RETURNED, USE -1
15792 CAIL TT,6 ;UP TO TWO MORE EXTRA RCHST RESULTS MIGHT BE RETURNED
15797 MOVEI W,1(TT) ;# RESULTS FOR RCHST
15798 MOVEI B,36. ;ALWAYS RETURN 36. AS BYTE SIZE UNTIL MORE WINNING
15799 JRST POPJ1 ;CONVENTIONS EXIST.
15801 JBSTAT: HLRZ A,(R) ;GET JOB INDEX
15802 HRRZ D,JBWST(A) ;GET MOST RECENT STATUS
15806 JBIRS: MOVEI D,3 ;RESET IS OPCODE 3
15811 PUSHJ P,JBWT ;WAIT FOR IT TO GET PROCESSED
15814 JBACCS: MOVEI D,5 ;ACCESS IS OPCODE 5
15823 ;.CALL JOBIOC (OLD NAME SETIOC STILL WORKS)
15824 ;ARG1: CHANNEL BOJ DEVICE IS OPEN ON
15825 ;ARG2: TYPE OF IOCER TO CAUSE
15827 ;THIS CALL CAUSES THE NEXT IOT EXECUTED BY THE
15828 ;PROCEDURE ON THE OTHER END OF THE CHANNEL TO GET
15829 ;THE SPECIFIED IO CHANNEL ERROR
15831 NSTIOC: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD.
15834 JRST OPNL33 ;BAD ARG. (NOT LEGAL IOCER)
15835 TLO B,(SETZ) ;IN CASE IOCER 0 EVER EXISTS
15837 JRST OPNL34 ;NOT BOJ CHANNEL
15839 MOVE A,JBCUI(E) ;PREPARE TO STOP CREATOR.
15841 JRST OPNL41 ;CREATOR WENT AWAY
15844 JRST OPNL41 ;HE'S BEING KILLED NOW.
15845 PUSHJ P,RPCLSR ;STOP
15852 ;ARG1 - CHANNEL BOJ IS OPEN ON - REMAINING ARGS ARE OPTIONAL -
15853 ;ARG2 - NEW STATUS (RIGHT HALF OF STATUS WORD ONLY - I.E. DEVICE DEPENDENT STUFF)
15854 ;ARG3 - NEW DEVICE NAME FOR PEEK, WHO-LINE STATUS, RFNAME/RCHST
15855 ;ARG4 - NEW FN1 FOR ..
15856 ;ARG5 - NEW FN2 FOR ..
15857 ;ARG6 - NEW SNAME FOR ..
15858 ;ARG7 - NEW OPEN MODE FOR ..
15859 ;ARG8 - BP TO ASCIZ STRING IN USER ADDRESS SPACE CONTAINING FULL FILENAMES.
15861 NJBSTS: TLNN R,%CLSBJ
15863 HLRZ A,(R) ;GET JOB INDEX
15864 CAIGE W,2 ;DID HE SUPPLY STATUS?
15865 MOVEI B,SNJOB ;NO - RESET TO INITIAL
15866 HRRM B,JBWST(A) ;REMEMBER WHAT HE SAYS
15869 JUMPGE B,.+1(B) ;STORE WHATEVER ADDITIONAL ARGS WERE GIVEN
15872 MOVEM TT,JBSYS(A) ;6
15873 MOVEM E,JBFN2(A) ;5
15874 MOVEM D,JBFN1(A) ;4
15875 MOVEM C,JBDEV(A) ;3
15877 JRST POPJ1 ;1 (DON'T TAKE THIS INSN OUT)
15879 NJBST1: XOR I,JBOPNM(A)
15881 JRST OPNL12 ;NOT ALLOWED TO CHANGE BLOCK VS UNIT, IN VS OUT
15885 NJBST2: MOVE R,Q ;STORE BP IN Q INTO JBFNP WORD,
15886 PUSHJ P,ASCIND ;AFTER DOING INDEXING AND INDIRECT.
15890 ; .CALL ADR ;SKIPS UNLESS JOB END OF CHNL NOT THERE
15896 ;GIVE CREATOR A SECOND WORD INT ON CHANNEL CORRESP TO BOJCH
15898 NJBINT: TLNN R,%CLSBJ ;ERROR IF NOT BOJ CHNL.
15908 PUSHJ P,[HRRZ B,(R)
15909 SKIPGE R ;IOPDL CHNLS DON'T INTERRUPT
15917 JUMPE C,OPNL41 ;I CAN'T
15919 AND C,B ;INT ONLY ONCE, ON HIGHEST NUMBERED CHANNEL
15925 ;ARG 1 - SIMULATED DEVICE NAME
15928 ;ARG 4 - SNAME OF FILE WHICH HANDLER LOADED FROM
15929 ;ARG 5 - AMOUNT OF TIME TO SLEEP WAITING FOR SOMEONE TO OPEN
15931 ;THIS CALL, WHEN EXECUTED BY A JOB DEVICE HANDLER JOB, MAKES
15932 ;THE HANDLER AVAILABLE FOR RE-USE. TAKES SUCCESS RETURN IF
15933 ;SOMEONE REUSES YOU; YOU SHOULD THEN DO THE "INITIAL JOBGET"
15935 NJBREU: SKIPGE H,JBI(U)
15936 JRST OPNL10 ;NOT A BOJ HANDLER JOB
15938 PUSHJ P,UFLS ;WAIT FOR CLOSE TO FINISH HAPPENING
15944 JRST [ MOVNI E,(E) ;IMMEDIATE TIME, LOSE ON PCLSR
15945 SUB E,TIME ;BUT ACCEPT ANYWAY SINCE NETBLK DOES
15948 UMOVE E,(TT) ;GET TIME ARGUMENT
15952 UMOVEM E,(TT) ;POS REL TIME GIVEN, MAKE NEG ABS AND WRITE BACK
15953 NJBRU1: MOVSI TT,%JBREU ;E NOW HAS NEGATIVE TIME TO SLEEP UNTIL
15956 NJBRUL ;TURN OFF %JBREU WHEN CALL EXITED FOR WHATEVER REASON
15961 JRST OPNL41 ;TIMED OUT
15964 ;FLSINS ROUTINE TO WAIT UNTIL TIMED OUT OR OPENED BY SOMEONE
15965 NJBRUW: MOVN A,AC0S+E(U)
15971 ;LOSSET ROUTINE TO LEAVE AWAITING-REUSE STATE
15972 NJBRUL: MOVSI A,%JBREU
15977 SUBTTL PERIPHERAL DEVICE ROUTINES IN SEPARATE FILES
15993 IFN NETP,[ ; General ITS network code, includes specific nets
16010 .BYTE 0 ;RECORD THE SYMS .EVAL'ED BY USER PROGRAMS
16014 SUBTTL DM DAEMON UUO'S
16016 IFE DEMON,ADEMON==ILUUO
16019 ADEMON: JUMPE J,[AOJA J,.+2] ;IF J = 0 THEN SUBTRACT ONE
16020 UMOVE J,(J) ;GET VALUE HERE
16023 PUSHJ P,DEMUSR ;FIND CURRENT USER IN DEMON TABLE
16024 JRST UTOLKJ ;FAIL, JUST RETURN, NOT DEMON
16025 HRRE TT,DMTTBL+2(B)
16027 HRRM TT,DMTTBL+2(B) ;PUT NEW COUNT IN DEMON TABLE
16030 UTOLKJ: CONO PI,UTCON
16034 CONO PI,CLKOFF ;DON'T LET SYS JOB LOOK TILL WE'RE READY.
16035 MOVSI T,SCLDMN ;TELL IT TO LOOK FOR US, AFTER UFLS TURNS CLOCK ON.
16037 SETZB T,SRN3(U) ;SYS JOB WILL SETOM SRN3 TO RESTART US
16038 SKIPN SRN3(U) ;WITH 0 IN T => FILE EXISTS, OR OPNL CODE.
16039 PUSHJ P,UFLS ;SYS JOB DETECTS US BY PC=ADEMS1.
16040 ;DEMON NAME IS EXPECTED TO BE IN A.
16041 ADEMS1: JUMPN T,OPNL1-1(T)
16042 CAIGE W,2 ;NO SECOND ARG, JST SIGNAL
16044 JUMPL D,NUDMTB ;IF 2ND ARG < MERELY CALL NUJBST, NO DEMON ENTRY
16045 TDZA TT,TT ;ZERO OUT TT
16046 ADEMS3: SETOM TT ;SET FLAG
16047 PUSHJ P,LSWTL ;SIEZE SWITCH
16050 JRST LSWPOP ;SIGNAL FAILED
16051 SKIPN TT ;FLAG NOT SET
16052 HRLM D,DMTTBL +2(B) ;SET TIME RQ
16053 JRST CKOPJ1 ;RELEASE SWITCH
16056 PUSHJ P,DMBLK1 ;WAIT TILL DEMON BLOCK IS CLEARED
16059 MOVEM A,DMBLK ;SAVE IN BLOCK NOW
16061 JRST NUDMTB ;IF FAILURE AFTER WAIT LOOP BACK
16062 JRST POPJ1 ;SUCCESS
16064 DMBLK1: SKIPGE DMBLK+1 ;FOR DEMON BLOCK TEST
16065 POPJ P, ;RETURN, NOT FINISHED LOADING
16067 CAIGE T,MXCZS ;ROOM IN RING BUFFER
16069 POPJ P, ;SKIP IF ROOM
16070 \f;UTILITY ROUTINES FOR DEAMONS
16072 DEMSIG: PUSHJ P,DEMNAM ;LOOK FOR NAME
16073 JRST DEMSG2 ;HAVE TO MAKE NEW ENTRY
16075 HLLZ E,DMTTBL+2(B) ;18 BITS 2'S COMPLEMENT
16077 HLLM E,DMTTBL+2(B) ;MUST DO THIS WAY TO FIT ABOVE
16078 SKIPE DMTTBL+1(B) ;DOWN, WANT SYS JOB TO LOOK AT
16082 AOS REQCNT ;ONLY SIGNAL IF NECESSARY
16085 DEMSG2: SOSGE DEMCNT ;IF NO ROOM FLUSH
16088 MOVEI A,DMTLL ;BUMP POINTER
16090 IDIVI A,DMLNG ;TRUNCATE TO LENGNTH OF TABLE
16092 JRST .-4 ;SEARCH FOR NEW ENTRY
16093 POP P,DMTTBL(B) ;SET NAME IN TABLE
16096 ;ROUTINES TO FIND ENTRY IN TABLE.
16097 ;DEMNAM TAKES NAME IN A, DEMUSR TAKES USER INDEX IN U
16098 ;THEY SKIP RETURN IF SUCCESSFUL, RETURN OTHERWISE
16099 ;IF SUCCESSFUL DEMON TABLE INDEX IS IN B
16101 DEMUSR: JUMPL U,CPOPJ
16105 ADD B,[DMTLL,,DMTLL]
16109 DEMNAM: MOVSI B,-DMLNG ;SEARCH BY NAME
16112 ADD B,[DMTLL,,DMTLL]
16116 DEMOUT: PUSHJ P,LSWTL ;CALLED BY KILLING JOB (IN CASE OWNED)
16120 SETZM DMTTBL+1(B) ;MARK AS DOWN,SYSTEM JOB DECIDES WHAT TO DO
16126 DEMMRV: SETZM DMTTBL+2(B) ;CALL WITH UTCOFF (SYS JOB) REMOVES ENTRY FROM TBL
16127 SETZM DMTTBL+3(B) ;WITH INDEX OF DEMON IN B
16135 ;DEAMON READ AND SET STATUS ROUTINES
16137 ARDDMST: PUSHJ P,LSWTL ;READ DEAMON STATUS
16140 JRST RDDMS1 ;LOST TRY USER INDEX
16143 IDIVM C,A ;DIVIDE BY L, DON'T CLOBBER B
16144 RDDMS2: MOVE C,DMTTBL+3(B)
16151 PUSHJ P,DEMUSR ;BAD USER
16159 ASTDMST: PUSHJ P,LSWTL ;SET DEAMON STATUS
16164 STDMS2: JUMPL D,STDMS4
16166 MOVEM D,DMTTBL+2(B)
16168 MOVEM C,DMTTBL+3(B)
16176 STDMS4: SKIPGE DMTTBL+1(B) ;REMOVE FROM TABLE IF POSSIBLE
16177 JRST UTOLKJ ;CAN'T DELETE, LOADING
16178 SETZM DMTTBL+1(B) ;DOWN
16179 SETZM DMTTBL+2(B) ;REMOVE REQUESTS
16180 AOS REQCNT ;SIGNAL SYS JOB
16191 ;.GETSYS AC, ;TRANSFERS SYSTEM AREA SPECIFIED BY C(AC+1)
16192 ;TO USER AREA STARTING AT R.H. C(AC) OF LENGTH MINUS L.H. C(AC)
16195 ; Alan 4/2/86: Took this out because people don't use .GETSYS this way
16197 ; PUSHJ P,UDELAY ;CAUSE A SCHEDULE TO STOP GETSYSER FROM
16198 ; ; MONOPOLIZING SYSTEM
16199 MOVSI A,-LGSNAM ;NEGATIVE OF TABLE LENGTH
16200 UMOVE B,1(J) ;LOOK AT USERS AC+1, THE 6BIT NAME
16201 CAME B,GSNAME(A) ;CYCLE THROUGH TABLE
16202 AOBJN A,.-1 ;OF NAMES, POINTER IN RIGHT HALF OF A
16203 JUMPGE A,AGETSL ;JUMP IF NOT IN TABLE
16204 UMOVE B,(J) ;GET POINTER TO USERS RECEPTACLE BLOCK
16205 AGETS1: HLRZ C,GSYS1(A) ;GET LOW END OF BLOCK
16206 HRRZS A ;CLEAR COUNT IN L.H. OF A
16207 CAIGE A,NUTCFN ;SKIP IF UTC OFF NOT REQUIRD
16208 CONO PI,UTCOFF ;TURN OFF ALL CHANNELS BUT CH 1
16209 skipn c ; If LH contains 0, RH is routine to call.
16210 jrst @gsys1(a) ; (JUMPE C,@GSYS1(A) generates spurious
16211 ; page faults, so don't "fix" this.)
16212 HRRZ D,GSYS1(A) ;GET HIGH END OF BLOCK
16213 ;AT THIS POINT: ;B USER'S POINTER (UNRELOCATED)
16214 ;C BEGINNING OF AREA IN SYS
16216 agets2: SUBI D,-1(C) ;BLOCK LENGTH TO BE SENT
16217 HLRZ E,B ;GET NEG BLK LENGTH FROM USERS PNTR
16218 ADDI E,-1(D) ;-1 CAUSES CARRY BIT IF .GT.
16219 TLNE E,-1 ;CARRY INDICATES LOSS
16220 JRST AGETS5 ;MORE THAN USER WANTS
16221 HRLS D ;BLOCK LENGTH IN BOTH HALVES
16222 HRRZ E,B ;FIRST WORD (UNRELOCATED)
16223 HRL E,C ;SOURCE ADDRESS FOR BLT
16224 HRRZ C,E ;DESTINATION INTO C
16225 ADD C,D ;FINAL ADDRESS +1
16226 AGETS7: XCTRI XBW,[BLT E,-1(C)] ;BLT IT TO HIM
16227 AOSA (P) ;INCREMENT RETURN, INDICATE SUCCESS
16231 UMOVEM B,(J) ;TELL USER HOW MUCH HE GOT
16234 AGETSL: XCTR XW,[SETZM 1(J)] ;INDICATE BAD SIXBIT
16237 AGETS5: MOVNS D ;TELL USER HOW MUCH HE NEEDS
16238 CONO PI,UTCON ;NEGATIVE OF RIGHT BLOCK LENGTH
16239 XCTR XRW,[HRLM D,(J)] ;SET UP PROPER BLOCK LENGTH IN HIS AC
16242 AGETS6: CONO PI,UTCON ;ONE PAGE WASN'T THERE
16243 XCTR XRW,[MOVES (E)] ;SO TOUCH IT (TAKE MPV INTERRUPT IF REAL MPV)
16244 JRST AGETS1 ;AND TRY AGAIN (BLT WILL GET FARTHER THIS TIME)
16245 ;HAD TO RETRY FROM BEGINNING SINCE THIS MAY BE
16246 ;ONE THAT HAS TO BE TRANSFERRED INTACT WITH UTCOFF
16248 GSNAME: SIXBIT /MEMORY/
16249 IFN NUNITS,SIXBIT /UTAPE/
16250 IFN NCPP,[SIXBIT /NCPSM/
16254 NUTCFN==.-GSNAME ;NUMBER TO GET WITH UTCOFF (same as NETOFF)
16260 IFN IMXP, SIXBIT /IMPX/
16263 SIXBIT /USYMS/ ;.UPC, .VAL, .TTY, ETC.
16271 ;ENTRIES ARE: BOTTOM,,TOP OF AREA TO BE TRANSMITTED OR INST TO EXECUTE
16272 GSYS1: IOBFTL,,EMEMTL ;lh zero => jrst to THIS ENTRY
16273 IFN NUNITS, UTCHNT,,UTCHE ;UTAPE
16274 IFN NCPP,[IMSOKB,,IMSOKE ;NCP SOCKET MAP
16275 IMPBPQ-1,,IMPEPQ ;NCP PENDING RFC QUEUE
16276 IMPHTB,,IMPHTB+255. ;NCP HOST TABLE
16280 GSNAME,,GSNAME+LGSNAM-1 ;GETS
16281 DEVTAB,,EDEVS ;DEVS
16282 SYSYMB,,SYSYME ;CALLS
16283 IFN IMXP, IMXTBB,,IMXTBE ;IMPX
16284 CLVBEG,,CLVEND ;CLINK
16286 SYSUSB,,SYSUSE ;USYMS
16287 DCHSTB,,DCHSTE ;CHDEVS
16288 SYSCTB,,SYSCTB+LSYSCT-1 ;NCALLS
16289 TYVTAB,,TYVTAB+LTYVTA-1 ;TTYVAR
16290 USETTB,,USETTB+MXVAL-1 ;USRVAR
16291 ITSNMS,,ITSNMS+LITSNM-1 ;ITSNMS
16292 IFN LGSNAM-<.-GSYS1>, .ERR GSNAME and GSYS1 don't match.
16299 0 ; Make it easy to add more.
16301 USRSV: MOVEI C,USRSTG
16306 USR1V: UMOVE C,2(J)
16315 USR1VL: XCTR XW,[SETOM 2(J)]
16318 DSYMS: HRRZ C,DDT-2
16320 SETCMM D ;OFFSET BY ONE
16324 SUBTTL .GETLOC, .EVAL, ETC.
16326 ;GET AN ABSOLUTE LOCATION ;.GETLOC AC, ;C(A)=FROM(ABS),,TO(RELATIVE)
16328 AGETLOC:UMOVE A,(J) ;GET TO ADDRESS
16329 HLRZ B,A ;GET FROM ADDRESS
16332 JRST ILEXPF ;ILLEGAL EXEC PAGE FAULT
16333 UMOVEM C,(A) ;GIVE TO USER
16336 ;SET AN ABSOLUTE LOCATION ;.SETLOC AC, ;C(AC)=FROM(RELATIVE),,TO(ABS)
16338 ASETLOC:TDZA D,D ;CLEAR COND FLAG, SKIP
16340 ;SET AN ABSOLUTE LOCATION ONLY IF C(ABS)=C(TEST) & SKIP IF SUCCESSFUL
16341 ;.IFSET AC, ;C(AC)=<POINTER TO 2 WORD BLOCK>,,TO ADR(ABS)
16342 ;WORD 1=TEST ;WORD 2=NEW C(ABS)
16344 AIFSET: MOVNI D,1 ;SET COND FLAG
16345 XCTR XR,[HRRZ A,(J)] ;GET TO ADDRESS (ABSOLUTE)
16346 XCTR XR,[HLRZ B,(J)]
16347 UMOVE C,(B) ;GET WORD
16351 JUMPE D,ASPST1 ;NORMAL SETLOC
16352 UMOVE D,1(B) ;GET NEW VALUE
16353 CONO PI,CLKOFF ;PREVENT INTERRUPTS
16354 CAME C,(A) ;CHECK WORD AGAINST TEST WORD
16355 JRST CLKONJ ;NOT EQUAL => IGNORE
16357 AOS (P) ;CAUSE RETURN TO SKIP
16358 CAIG A,SYSB_10. ;CHECK IF IN SYS
16359 JRST ASPST1 ;YES SO DO REG SETLOC
16360 EXCH D,(A) ;NO SO DO NOW BEFORE SHUFFLE & GET OLD
16362 HRROS A ;LET SYS JOB KNOW ALREADY DONE
16363 ASPST1: CAMN C,(A) ;SKIP IF DIFFERENT FROM C(TO ADR)
16365 MOVE D,SYSITM ;IF SYSTEM JOB HAS BEEN HUNG OR LOOPING FOR 30 SEC,
16368 JUMPGE A,ASPST3 ;GO DO THE WORK OURSELVES (BUT DON'T DO IT TWICE).
16369 ASPST4: MOVE D,UNAME(U) ;GET UNAME OF SETLOCER
16371 PUSHJ P,CWAIT ;WAIT TILL VARIABLES TO COMMUNICATE WITH SYS JOB ARE FREE
16372 TDNE T,SUPCOR ;ARG TO CALL IN .-1
16373 MOVEM A,SETSLC ;REMEMBER ABS LOCATION
16374 MOVEM C,SETSLQ ; " NEW CONTENTS (OR OLD IF LH(SETSLC)=-1)
16375 MOVEM D,SETSU ; " USER
16376 CSPST: IORM T,SUPCOR ;TELL SYS JOB TO DO IT
16379 ASPST3: HRRZ D,UPC ;SYS JOB HAS BEEN HANGING FOR 30 SEC.
16380 CAIN D,SCOR1 ;WHY? JUST SLEEPING?
16381 JRST ASPST4 ;YES => SIGNAL IT TO DO THE WORK
16382 MOVEM C,(A) ;ELSE GIVE UP ON IT AND DO IT NOW
16385 ;LOOK UP ITS SYMBOL ;.EVAL AC, ;C(AC)=SQUOZE SYMBOL
16386 ;REPLACES SYMBOL BY VALUE & SKIPS IF SUCCESSFUL
16387 ;IF YOU WANT TO .EVAL A SYMBOL IN A PROGRAM HABITUALLY AND IMPLICITLY,
16388 ;AND WANT IT TO CONTINUE TO WORK, YOU HAD BETTER ADD AN ENTRY TO THE FILE
16389 ;AI:SYSTEM;EVSYMS > SAYING WHAT PROGRAM AND WHAT SYMBOL. THEN, ITS HACKERS
16390 ;CAN AVOID SCREWING YOU WITHOUT WARNING.
16392 AEVAL: PUSHJ P,SWTL
16394 UMOVE B,(J) ;GET SYM
16395 PUSHJ P,SYMLK ;LOOK UP
16396 JRST LSWPOP ;NOT FOUND
16397 MOVE A,(C) ;GET VALUE
16399 AOS (P) ;CAUSE UUO TO SKIP
16400 JRST APTUAJ ;RETURN VALUE
16402 ;REDEFINE ITS SYMBOL ;.REDEF AC, ;C(AC)=POINTER TO 2 WORD BLOCK
16403 ;WORD 1 = SYMBOL ;WORD 2 = VALUE
16404 ;DELETE SYM IF ALL 4 FLAG BITS SET
16405 ; OTHERWISE SET SYMBOL FLAGS TO THOSE SPECIFIED, EXCEPT REJECT ANY ATTEMPT TO
16406 ; ADD A PROGRAM NAME
16407 ;ADD SYM IF NOT FOUND ;FAIL ONLY IF NOT ENOUGH ROOM
16408 ;SKIPS IF SUCCESSFUL
16410 AREDEF: PUSHJ P,SWTL
16412 XCTR XR,[HRRZ D,(J)] ;GET POINTER FROM AC
16413 UMOVE B,(D) ;GET SYMBOL
16414 PUSHJ P,SYMLK ;LOOK UP
16415 JRST ARDF2 ;NOT FOUND, CREATE
16416 XCTR XR,[SETCM A,(D)] ;GET SYM (COMPLEMENTED)
16417 TLNN A,740000 ;SKIP IF ANY FLAGS NOT SET
16418 JRST ARDF3 ;ALL SET => DELETE
16423 UMOVE A,1(D) ;GET VALUE
16424 MOVEM A,(C) ;STORE IN SYMTAB
16425 JRST ARDF4 ;SORT AND SKIP-RETURN.
16427 ARDF2: MOVE C,DDT-2 ;GET POINTER
16428 SUB C,[2,,2] ;DECREMENT FOR NEW ENTRY
16429 MOVEI A,-1(C) ;FUDGE FOR BLOCK CALC
16430 LSH A,-10. ;CONVERT TO # OF BLOCKS UP TO SYMTAB -1
16431 UMOVE B,(D) ;GET SYM
16434 TLNE B,740000 ;LOSE IF PROG NAME
16435 CAMLE A,T ;CHECK FOR LOSSAGE
16436 JRST LSWPOP ;DON'T OVERWRITE ITS
16437 EXCH B,2(C) ;STORE OVER GLOBAL BLOCK HEADER,
16438 MOVEM B,(C) ;MOVE THAT HEADER DOWN 2 WDS.
16439 UMOVE A,1(D) ;GET VALUE
16441 ADD A,[-2,,] ;1 MORE SYM IN GLOBAL BLOCK.
16442 MOVEM A,1(C) ;STORE
16443 MOVEM C,DDT-2 ;UPDATE POINTER
16444 JRST ARDF4 ;GO SORT AND SKIP-RETURN.
16446 ARDF3: MOVE B,DDT-2 ;GET POINTER
16447 MOVE A,(B) ;MOVE THE GLOBAL HEADER
16448 EXCH A,2(B) ;UP OVER 1ST SYM
16449 MOVEM A,-1(C) ;WHICH GOES INTO FREE SLOT.
16451 ADD A,[2,,] ;GLOBAL BLOCK 1 SYM SHORTER.
16455 ADDM A,DDT-2 ;UPDATE POINTER
16456 ARDF4: MOVSI E,(SETZ) ;TELL DDT ITS SYMTAB WAS ALTERED.
16458 PUSHJ P,SBUBL ;DO 1 BUBBLE-SORT UP AND 1 DOWN.
16459 JRST LSWPJ1 ;FREE ARDFSW AND EXIT.
16461 ;DO ONE BUBBLE SORT PASS UP, ONE DOWN; LEAVE J <0 IFF DID AN EXCHANGE.
16463 SBUBL: MOVE E,DDT-2
16465 ADD E,[2,,2] ;AOBJN -> SYMS IN GLOBAL BLOCK.
16467 MOVE B,[2,,2] ;INCREMENT FOR UPWARD PASS.
16468 MOVE C,[JUMPL A,SBUBL1]
16469 SUBI E,2 ;(WILL INCREMENT BEFORE ACTING)
16472 MOVNS B ;DECREMENT FOR DOWNWARD PASS.
16476 SBUBL1: MOVE D,1(A) ;CHECK NEXT PAIR OF ENTRIES.
16478 JRST SBUBL2 ;IN CORRECT ORDER.
16480 MOVEM D,1(A) ;WRONG ORDER, EXCHANGE.
16484 SETO J, ;SAY DID AN EXCHANGE.
16485 SBUBL2: ADD A,B ;MOVE TO NEXT ENTRY.
16486 XCT C ;TEST IF FINISHED.
16488 JRST SBUBL1 ;(NOT FINISHED)
16490 ;LOOK UP SYMBOL IN B IN ITS SYMBOL TABLE (CLOBBERS A,B,C)
16491 ;RETURN WITH POINTER TO VALUE WORD IN C
16492 ;SKIPS IF SUCCESSFUL
16494 SYMLK: TLZ B,740000 ;FLUSH FLAGS
16495 MOVE C,774000-2 ;PICK UP AOBJN POINTER TO SYMTAB FROM EXEC DDT
16496 SYMLK2: MOVE A,(C) ;GET SYM
16497 AOBJP C,[JRST 4,.+1] ;INCREMENT POINTER
16498 TLNE C,376 ;GO THROUGH HAIR EVERY 200 SYMS
16499 JRST SYMLK3 ;NOT THIS TIME
16501 SYMLK3: TLNN A,200000 ;SKIP IF DELETE INPUT (FLAG PREVENTS MATCH)
16502 TLZE A,740000 ;FLUSH FLAGS & CAUSE LOSS IF ALL 0 (PROG NAME)
16504 AOBJN C,SYMLK2 ;LOSS, TRY ANOTHER
16505 JUMPL C,POPJ1 ;SKIP RETURN IF FOUND
16506 POPJ P, ;NOT SO IF LOSS
16508 AWSNAME:XCTR XR,[SKIPE B,(J)] ;OPER 35
16512 AUPISET:UMOVE B,(J) ;OPER 36
16520 ;GENERATE A UNIQUE SYM ;.GENSYM AC, ;LOADS AC WITH SYM
16522 AGENSYM:PUSHJ P,SWTL ;WAIT TILL INTERLOCK FREE THEN SEIZE IT
16525 PUSHJ P,SIXAOS ;INCREMENT SYM
16526 MOVE A,IGNSYM ;GET SYM
16527 PUSHJ P,LSWPOP ;UNLOCK FOR NEXT USER
16528 JRST APTUAJ ;GIVE USER GENERATED SYMBOL
16530 ;GENERATE A UNIQUE NUM ;.GENNUM AC, ;LOADS AC WITH NUMBER
16532 AGENNUM:AOS A,IGNNUM ;INCREMENT NUMBER
16533 JRST APTUAJ ;AND GIVE IT TO USER
16539 IGNSYM: SIXBIT /SYS/
16547 AOS (TT) ;INCREMENT SYM
16548 MOVE I,[440600,,(TT)] ;GET POINTER TO FIRST CHAR
16549 SIXAS2: ILDB J,I ;GET FIRST (NEXT) CHAR
16550 SKIPN J ;SKIP IF NOT ZERO
16551 MOVEI J,1 ;REPLACE EMBEDDED SPACE WITH "!"
16553 CAME I,[60600,,(TT)] ;SKIP IF FIRST FIVE CHARS HAVE BEEN EXAMINED
16554 JRST SIXAS2 ;GO TO NEXT CHAR
16561 SUBTTL KL10 PERFORMANCE COUNTER
16563 ;KLPERF SYMBOLIC SYSTEM CALL
16564 ;ARG 1: <JOB> TO MEASURE PERFORMANCE DURING;
16565 ;-3 => NULL JOB, -4 => ALL JOBS
16566 ;ARG 2: P.A. ENABLES WORD (SEE NON-EXISTENT KL10 SYS REF MAN)
16567 ;0 => FREE THE FACILITY, ELSE TRIES TO GRAB IT
16568 ;NO ARGS => JUST READS THE VALUES WITHOUT CHANGING THE ENABLING CONDITIONS.
16569 ;IN THAT CASE, IT IS OK IF FACILITY IS OWNED BY SOMEONE ELSE
16570 ;VAL 1: PREVIOUS <JOB> SETTING
16571 ;VAL 2: PREVIOUS P.A. ENABLE WORD
16572 ;VAL 3: TIME BASE HIGH WORD
16573 ;VAL 4: TIME BASE LOW WORD
16574 ;VAL 5: PERF CTR HIGH WORD
16575 ;VAL 6: PERF CTR LOW WORD
16577 KLPERF: CONO PI,CLKOFF
16579 KLPER0: MOVE J,MTRJOB ;NO ARGS => DONT CHANGE SETTINGS,
16580 MOVE B,PAEON ;JUST RETURN CURRENT COUNT.
16583 KLPER1: JUMPN B,KLPER2 ;TRYING TO TURN IT ON?
16585 JRST KLPER0 ;FREEING THE FACILITY WHEN DON'T OWN IT?
16586 PUSHJ P,PRFOFF ;NO, TRYING TO FREE IT - DO SO.
16590 KLPER2: SKIPGE MTRUSR ;IF FACILITY IS FREE, SIEZE IT.
16593 JRST OPNL10 ;ALREADY BELONGS TO SOME OTHER JOB.
16595 CAIN J,-2 ;ALL JOBS?
16597 CAIN J,-1 ;NULL JOB?
16600 JSP T,NCRUI2 ;ELSE DECODE JOB SPEC; OBJECT TO PDP6
16604 ;TRYING TO TURN ON FOR SELF OR ALL JOBS - IT OUGHT TO BE ON RIGHT NOW!
16605 KLPER4: CONO MTR,2001 ;TURN ON TIME BASE, INTERVAL PIA=1
16606 WRPAE B ;SET ENABLES
16607 KLPER3: EXCH B,PAEON
16609 TRZA A,2 ;UN CONVERT -1 => -3, -2 => -4
16610 LSH A,-9 ;IDIVI A,LUBLK
16611 IF2 IFN LUBLK-1000,.ERR NO DIVIDE
16613 RCCL C ;C,D GET TIME BASE
16614 RPERFC E ;E,TT GET PERFC
16617 ;TURN OFF THE PERFORMANCE COUNTER. PUT BACK IN RUN-TIME MEASURING MODE
16618 PRFOFF: MOVNI A,2 ;NOT ATTACHED TO ANY JOB
16620 WRPAE [1576,,1200] ;MEASURE MAIN-PROGRAM TIME IN 80 NS UNITS (MODEL A)
16621 CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1
16622 RPERFC STPERF ;START-OF-QUANTUM TIME IS NOW
16623 RPERFC NULPRF ;ALSO FOR NULL-JOB
16624 SETOM MTRUSR ;NO LONGER IN USE
16628 $INSRT CORE ;CORE JOB AND MEMORY MANAGEMENT ROUTINES
16631 ; IMMEDIATE EOF ON INPUT, HAS NO EFFECT ON OUTPUT
16633 NULO: HLRS A,C ;REMEMBER MODE FOR .STATUS
16634 JSP Q,OPSLC3 ;SET UP IOCHNM WORD AND EXIT
16638 ;UNIT NULL DEVICE INPUT
16641 ;BLOCK NULL DEVICE INPUT
16644 ;BLOCK NULL DEVICE OUTPUT ENTRY
16645 ;ADVANCE BLOCK MODE .IOT POINTER
16646 NULBOD: XCTR XR,[HLRE A,(C)] ;GET NEG LENGTH FROM LEFT HALF
16647 MOVNS A ;GET POSITIVE LENGTH
16648 XCTR XR,[ADD A,(C)] ;ADD STARTING LOC (R.H.)
16649 XCTR XW,[HRRZM A,(C)] ;STORE BACK "COUNTED OUT" POINTER
16652 ;STANDARD DEVICE .STATUS ROUTINE
16653 STDSTA: DPB A,[60300,,D] ;A HAS LH OF IOC WORD
16654 TRO D,1_9 ;SYS BUF CAP FULL
16655 TRNE D,1_6 ;SKIP IF INPUT
16656 TRC D,3_9 ;TURN OFF SYS BUF CAP FULL, SET EMPTY
16661 UBPFJ==10 ;DEMAND FOREIGN JOB (BIT IN LH (DEV) FOR .OPEN (USR))
16663 USROJ: TDZA J,J ;ENTRY FROM JOB DEVICE DONT GET CORE.
16664 USRO: MOVNI J,1 ;INDICATE NOT FROM JOB OPEN
16666 USROOJ: MOVEI J,1 ;OJB DEVICE; EXISTING JOB OK ONLY IF %OPOJB BIT SET.
16669 PUSHJ P,UFLS ;PREVENT ATTEMPT TO CORE, PCLSR OUT, AND THINK YOU'VE WON AT SETBF1, ETC
16672 JUMPE B,USRO4 ;JNAME = 0 => UNAME IS JOB SPEC.
16673 SKIPN A ;IF UNAME=0
16674 MOVE A,UNAME(U) ;MAKE IT THIS JOB'S UNAME
16675 CAME A,UNAME(U) ;SKIP IF FIRST FILE NAME IS UNAME OF OPENER
16677 CAME B,[SIXBIT /PDP10/] ;SKIP IF SECOND FILE NAME IS "PDP10"
16678 CAMN B,[SIXBIT /PDP6/] ;OR PDP6
16679 IFN PDP6P,JRST PDPO
16681 USROA: CONO PI,CLKOFF
16682 PUSHJ P,LSWPOP ;TREESW
16684 USRO3: CAME A,UNAME(TT)
16687 JRST UFN1 ;FOUND UNAME JNAME PAIR
16688 AGIN: ADDI TT,LUBLK
16691 TLNE C,UBPFJ ;JOB MUST EXIST TO WIN IF UBPFJ SET
16693 CAME A,UNAME(U) ;INFERIOR PROCEDURE MUST HAVE SAME UNAME
16696 TCORS: MOVSI T,%TBNOT+%TBDTY ;DOESN'T HAVE TTY, ISN'T GIVING IT AWAY
16698 JRST TCORS1 ;USTRA FAILED - SEE WHY, MAYBE RETRY (U CLOBBERED)
16711 PUSHJ P,USRST5 ;SET UP TTY STUFF
16714 IORM A,APRC(TT) ;NEW INFERIOR IS DISOWNED IF CREATOR IS.
16715 JUMPE J,CLKOJ1 ;RETURN HERE FOR JOB DEVICE (INDEX IN TT)
16716 PUSHJ P,ULUP1 ;FIND AN INTERRUPT BIT FOR THE JOB.
16717 JRST NOGO1 ;NONE => GO KILL THE JOB AND RETURN FAILURE.
16718 CONO PI,CLKON ;NOW CAN'T FAIL TO CREATE THE JOB FOR GOOD.
16723 PUSHJ P,UFOUND ;SET UP THE OPENER'S CHANNEL.
16727 PUSHJ P,ACORE1 ;MAY PCLSR OUT, BUT CORE JOB WILL DO WORK ANYWAY.
16728 SKIPA R,UUAC(U);NO CORE AVAILABLE, KILL THE JOB
16729 JRST POPJ1 ;SUCCESS
16732 JRST OPNL37 ;NO CORE AVAILABLE
16735 ULUP: HRRZ E,SUPPRO(T)
16736 SKIPN UNAME(T) ;SKIP IF VARIABLE BLOCK IN USE
16738 CAIN E,(U) ;SKIP IF NOT AN INFERIOR
16739 IOR A,SUPPRO(T) ;IOR IN INTERRUPT BIT OF INFERIOR
16740 ULUP2: ADDI T,LUBLK ;ADVANCE TO NEXT BLOCK
16741 CAMGE T,USRHI ;SKIP IF ALL EXAMINED
16743 UFIN: MOVEI B,1 ;SELECT INT BIT
16751 NOGO1: MOVSI T,BULGO+BULGOS
16752 IORM T,APRC(TT) ;TELL THE SYS JOB TO KILL THE JOB WE JUST GOT
16755 JRST OPNL5 ;DIREC FULL (TOO MANY LOSERS)
16757 NOGO4: SUB P,[1,,1]
16760 TCORS1: PCLT ;COME HERE FROM TCORS IF ATTEMPT TO FIND FREE JOB SLOT FAILED.
16761 SKIPGE SJCFF ;IF THIS IS NEGATIVE, USTRA DIDN'T EVEN REQUEST MORE
16762 JRST [ SKIPGE SJCFF
16767 JRST NOGO4 ;USER MEM EXPANDED TO MAX
16768 SKIPGE SUPCOR .SEE SCLEX ;PRESUMABLY USTRA ASKED SYS JOB FOR MORE JOB SLOTS
16769 PUSHJ P,UFLS ;SO WAIT TILL SYS JOB ANSWERS THE REQUEST
16770 TCORS2: CONO PI,CLKOFF ;AND SEE IF THERE ARE NOW ENOUGH SLOTS.
16773 USRO4: EXCH J,A ;USR: OPEN WITH JNAME=0: USE UNAME AS JOB SPEC.
16777 CAIN J,-1 ;SPEC'D JOB IS PDP6 => OK,
16781 PUSHJ P,LSWPOP ;SOS DIELOK(J)
16782 PUSHJ P,LSWPOP ;TREESW
16785 ;COME HERE WHEN JOB ALREADY EXISTS, WITH CLOCK OFF AND USR IDX IN TT.
16786 ;A, B, C STILL HAVE UNAME, JNAME AND OPEN MODE.
16787 UFN1: JUMPE J,[ADDI B,10000 ;OPENING JOB-DEVICE AND JOB EXISTS??
16788 JRST USROB] ;KEEP CHANGING JNAME UNTIL WE CREATE A JOB.
16790 JUMPL J,UFNDF ;SKIP SOME CHECKS ON SYS & CORE
16791 JUMPG J,[MOVSI T,%OPOJB ;OJB DEVICE OPEN; IF JOB DOESN'T HAVE %OPOJB SET,
16792 TDNE T,OPTION(TT) ;THEN IT HASN'T GIVEN PERMISSION TO BE HACKED.
16793 SKIPL JBI(TT) ;IF IT'S ALREADY A JOB DEVICE DON'T HACK IT.
16794 JRST [CONO PI,CLKON ;IN EITHER CASE, WAIT TILL ALL'S OK,
16799 JRST USROOJ] ;THEN RE-TRY THE OPEN.
16800 LDB T,[.BP BULGOS_22,APRC(TT)]
16802 JRST CLKOJ1] ;RETURN SUCCESS TO JOBO6C.
16804 JRST UFNDF ;USER WANTS IT AS FOREIGN JOB
16807 JRST UFN1C ;OPENING UP INFERIOR
16809 SKIPL SUPPRO(TT) ;UNLESS IT'S A TOP-LEVEL DISOWNED JOB,
16810 JRST UFNDF ;THEN FOREIGN JOB
16811 PUSHJ P,UFN2B ;REOWN DISOWNED TREE
16815 UFN1C: MOVE U,TT ;OPENING PROCEDURE IMMEDIATE SUPERIOR OF PROCEDURE BEING OPENED
16819 ; REOWN A DISOWNED PROCEDURE TREE
16822 NREOWN: TLNN R,%CLSFU ;MUST BE A FOREIGN USER CHANNEL
16828 JRST OPNL31 ;TO A TOP-LEVEL DISOWNED JOB
16830 PUSHJ P,UFN2B ;REOWN THE JOB (TURNS CLOCK ON)
16832 HLRZ R,(P) ;TURN THE CHANNEL INTO AN INFERIOR CHANNEL.
16833 MOVNI T,FUWIDN-UWIDN
16837 ;REOWN JOB TT POINTS TO, ITS APRC IS IN T. SKIPS IF SUCCESSFUL.
16838 ;CALL WITH CLKOFF, WILL TURN IT ON.
16839 UFN2B: TLNE T,BULGOS
16840 JRST OPNL42 ;CAN'T REOWN JOB WHICH IS LOGGING OUT.
16841 SKIPGE APRC(U) ;IF REOWNING JOB IS DISOWNED, PROHIBIT SO THAT
16842 JRST OPNL31 ;IT DOESN'T REOWN ITSELF AND SCREW THINGS UP
16843 PUSHJ P,ULUP1 ;FIND AN INTERRUPT BIT FOR IT. (IN B)
16844 JRST OPNL5 ;WE HAVE 8 INFERIORS ALREADY.
16845 AOS (P) ;GOING TO WIN
16846 SETOM DLSRCH ;INHIBIT SCHEDULING
16847 CONO PI,CLKON ;TURN CLOCK BACK ON, THIS MAY TAKE A WHILE
16848 MOVSI A,BUMRTL ;DOOMED DETACHED JOBS ARE RESCUED BY REOWNING.
16850 MOVE A,UNAME(U) ;PICK UP NEW UNAME
16852 TLZ D,#400000 ;SIGN OF D SET IFF REOWNER ISN'T DISOWNED.
16853 MOVE J,UTMPTR(U) ;PICK UP NEW USER RESOURCE POINTER
16855 SUBI J,USRRCE ;GET NEW CONSOLE #
16856 CAIL J,NCT ;IF NEW TREE STILL HAS NO TTY,
16857 MOVEI J,%TINON ;"DISOWNED" TTY CHNLS SHOULD REMAIN SUCH
16858 ;HERE, A HAS UNAME, D HAS <SIGN IFF MAKING NON-DISOWNED>,,UTMPTR, J HAS CONSOLE # OR %TINON,
16859 ;U HAS REOWNER, TT HAS JOB BEING REOWNED.
16860 UFN2A: PUSH P,B ;SAVE INTERRUPT BIT
16861 UFN3: MOVEM A,UNAME(TT) ;SET TO NEW UNAME
16862 HRRZM D,UTMPTR(TT) ;SET TO NEW USER RESOURCE POINTER
16866 HLLZ T,D ;LH(D) HAS 0 IF REOWNER DISOWNED, ELSE 400000
16867 ANDCAM T,APRC(TT) ;MARK AS NOT DISOWNED IF REOWNER ISN'T DISOWNED.
16868 UFNL3: MOVE B,JNAME(TT) ;PICK UP CURRENT JNAME
16869 MOVEI E,0 ;LOOP ON ALL USERS
16870 UFNL1: CAMN A,UNAME(E) ;SKIP ON NOT SAME UNAME
16871 CAME B,JNAME(E) ;SKIP ON SAME UNAME-JNAME
16872 JRST UFNL2 ;NOT SAME NAME AND/OR VAR BLK NOT IN USE
16873 JRST UFN7 ;NAME CONFLICT, RESOLVE
16874 UFNL2: ADDI E,LUBLK
16877 MOVEI E,0 ;INITIALIZE FOR LOOP TO LOOK FOR INFERIORS AND DUPLICATE NAMES
16878 UFN4: SKIPN UNAME(E) ;SKIP IF VAR BLOCK IN USE
16879 JRST UFN5 ;TRY NEXT
16880 HRRZ I,SUPPRO(E) ;PICK UP SUPERIOR POINTER OF BLOCK BEING EXAMINED
16881 CAIN I,(TT) ;SKIP IF NOT INFERIOR
16882 JRST UFN6 ;INFERIOR, PSEUDO-RECURSE
16883 UFN5: ADDI E,LUBLK ;ADVANCE TO NEXT BLOCK
16884 CAMGE E,USRHI ;SKIP IF ALL EXAMINED
16886 SKIPGE SUPPRO(TT) ;SKIP IF NOT BACK TO TOP
16887 JRST UFNX ;BACK TO TOP LEVEL
16888 MOVE E,TT ;POP BACK UP
16889 HRRZ TT,SUPPRO(E) ;TO PREVIOUS LEVEL
16890 MOVE B,JNAME(TT) ;RESTORE B
16891 JRST UFN5 ;PROCEED AT PREVIOUS LEVEL
16895 HRRM U,SUPPRO(TT) ;SET UP SUPERIOR POINTER IN TO LEVEL DISOWNED
16896 SETZM DLSRCH ;RE-ENABLE SCHEDULING
16900 UFN6: MOVE TT,E ;PSEUDO-RECURSE
16901 JRST UFN3 ;START UP ON LOWER LEVEL
16903 UFN7: CAMN E,TT ;SKIP UNLESS FOUND SELF
16905 ADDI TT,JNAME ;SET UP ARG TO SIXAOS
16906 PUSHJ P,SIXAOS ;INCREMENT JNAME
16907 SUBI TT,JNAME ;RESTORE TT
16908 JRST UFNL3 ;RESTART LOOP
16910 ;RESUSCITATE TTY CHNLS
16914 POPJ P, ;NOT A TTY CH
16917 POPJ P, ;NOT CONSOLE
16920 DPB J,[$TIIDX,,(R)]
16923 UFOUND: HLRZS C ;U HAS INF PROC
16927 ADDI R,IOCHNM(U) ;CLOBBERED BY CORE
16933 JRST OPNL12 ;ATTEMPTED OUTPUT
16934 LDB A,[.BP BULGOS_22,APRC(TT)]
16935 JUMPN A,OPNL42 ;USER GOING AWAY
16940 USRST: PUSHJ P,AUCL2 ;.RESET SIMULATES CLOSING AND REOPENING
16944 EXCH U,A ;BUT WITH LESS OVERHEAD
16947 MOVEI B,BULGOS ;WE'RE NOT REALLY TRYING TO KILL THE INFERIOR,
16948 ANDCAM B,APRC(U) ;SO DON'T LET OTHERS THINK HE'S BEING KILLED.
16952 PUSHJ P,ACRF1 ;FLUSH ALL OF CORE
16956 PUSHJ P,ACRF1 ;THEN GET 1 PAGE
16957 JRST [ PUSHJ P,UDELAY
16960 MOVSI T,%TBNOT+%TBDTY
16967 XCTR XBRW,[BLT T,1777]
16974 PUSHJ P,USRST4 ;SHOULD SKIP
16979 USRST5: MOVE A,TTSTSV(U) ;INITIALIZE SAVED TTYSET OF NEW JOB EQUAL TO CREATOR'S.
16980 SKIPL B,TTYTBL(U) ;NOTE THAT THE WHEREABOUTS OF THE CREATOR'S TTYSET
16981 MOVE A,TTYST1(B) ;DEPENDS ON WHETHER HE HAS THE TTY NOW.
16986 MOVEM A,TTSTSV+1(TT)
16987 MOVEI A,(TT) ;RH OF NEW JOB'S SAVED TTYSTS IS HIS INDEX.
16988 HRLI A,%TSCNS ;NOW CONSTRUCT THE LH.
16989 MOVE B,UTMPTR(TT) ;TO DO THAT, FIND THE TREE'S TTY NUMBER
16990 MOVE B,TTYOPT-USRRCE(B) ;TO FIND THE TTY'S TTYOPT WORD,
16991 TLNE B,%TOROL ;WHICH TELLS HOW TO INIT THE BITS IN THE TTYSTS.
16997 MOVEM A,TTSTSV+2(TT)
17001 ; ARG 1 JOB WHOSE MEMORY SHOULD BE READ OR WRITTEN
17002 ; ARG 2 ADDRESS TO READ OR WRITE
17003 ; ARGS 3,4 LIKE USRVAR, TTYVAR
17004 ; VAL 1 PREVIOUS CONTENTS OF LOCATION
17005 ; VAL 2 NEW CONTENTS OF LOCATION (SAME AS PREVIOUS IF NOT WRITING).
17006 ; (NOT VALID IN BLOCK MODE)
17008 ; BIT 1.1 IF SET, THEN IF PAGE ISN'T READABLE OR WRITEABLE, GIVE AN MPV
17009 ; OR PURE INTERRUPT TO THE JOB BEING REFERENCED.
17010 ; BIT 2.9 IF SET, ALLOWS US TO WRITE IN ANY JOB.
17015 JRST NUSRM1 ;WE CAN SURELY WRITE.
17017 CAIGE W,3 ;ELSE, IF WE WANT TO WRITE,
17018 TRNE H,1 ;OR WANT TO GIVE THE REFERENCED JOB INTERRUPTS,
17019 TRNE H,400000 ;THEN UNLESS WE ARE FORCING IT,
17021 JSP T,NCORWR ;SEE IF IT IS A JOB WE ARE ALLOWED TO WRITE IN.
17023 NUSRM1: MOVE H,CTLBTS(U)
17025 CAIG J,LUBLK ;CAN'T GIVE SYS OR CORE JOBS INTERRUPTS, OR PDP6.
17036 MOVE A,J ;IF TARGET JOB ISN'T SELF OR PDP6
17037 PUSHJ P,RPCLSR ; OR SYS OR CORE, STOP IT.
17040 NUSRMS: PUSHJ P,NUSRM2 ;DO THE WORK
17041 POPJ P, ;LOST, OPNL HAS LSWCLR'ED
17042 JRST LSWCJ1 ;POSSIBLY UNLOCK USTP, DIELOK AND TAKE SUCCESS RETURN
17044 NUSRM2: PUSHJ P,VARCAL ;E:=ADDR, D:=DATA, W:=INSTRUCTION
17047 JRST NUSRM6 ;ACS ALWAYS SWAPPED-IN AND ACCESSIBLE
17050 LDB A,[121000,,E] ;GET PAGE # IN A AND REF'D JOB IN U.
17051 IFE PDP6P, PUSHJ P,UPLC
17053 PUSHJ P,[ CAIE J,-1 ;SKIP IF PDP6
17054 JRST UPLC ;DECODE THEM FOR ORDINARY JOB.
17056 TDZA T,T ;FOR PDP6, MOST PAGES DON'T EXIST,
17057 MOVE T,[002200,,[600000]] ;AND THE REST ARE WRITABLE.
17061 LDB A,T ;GET PAGE ACCESS HALFWORD.
17062 TRNN A,600000 ;IF PAGE SWAPPED OUT, PUT ACCESS BITS IN PLACE THEY WOULD BE
17063 LSH A,16. ; FOR AN IN-CORE PAGE.
17064 JUMPE A,NUSRM9 ;LOSE IF NO PAGE THERE
17065 TRNN A,400000 ;OR IF WE ARE TRYING TO WRITE THE WORD AND PAGE IS READ-ONLY.
17067 NUSRM6: PUSHJ P,MPLDJ ;NOW LOAD MAP OF JOB IN J
17068 HRLI E,(SKIP) ;GET ACCESS TO DATA WORD, SWAP IN PAGE
17071 NUSRM4: CONO PI,CLKOFF ;CLK OFF SO ONCE IN CAN'T SWAP OUT AGAIN
17072 XCTRI XRW,E ;NOT GETTING BENEFIT OF USUAL PCLSR BEFORE
17073 JRST NUSRM5 ;SWAP OUT FEATURE SINCE IT'S ANOTHER JOB
17077 NUSRM5: UMOVE B,(E) ;NOW THAT PAGE IS IN, GET OLD CONTENTS
17078 MOVE A,B ;IN A AND B
17080 HRRI W,B ;IF WRITING,
17081 XCT W ;EXECUTE USER'S INSN., MODIFYING 2ND VALUE IN B,
17082 TRNN J,-1 ;SYSTEM JOB?
17083 JRST OPNL31 ;******* WRITING SYS, TURN INTO .SETLOC *******
17084 UMOVEM B,(E) ;AND STORE IT BACK INTO REF'D JOB.
17085 NUSRM3: PUSHJ P,MPLDZ ;RESTORE NORMAL PAGE MAP, TURN CLKON.
17086 JRST POPJ1 ;SUCCESS
17088 NUSRM8: SKIPA T,[%PIWRO] ;HERE IF TRYING TO WRITE IN READ ONLY PAGE.
17089 NUSRM9: MOVEI T,%PIMPV ;HERE IF ACCESSING NONEXISTENT PAGE.
17090 TRNN H,1 ;SKIP IF TO GIVE INTERRUPT
17093 JRST UUOERR ;INTERRUPT TO SELF
17094 IORM T,PIRQC(J) ;INTERRUPT OTHER USER
17095 JRST OPNL32 ;CAN'T GET THAT ACCESS TO PAGE.
17097 ;COMMENTS BELOW APPLY TO UBI IN MANY CASES. FOR UBO, TRANSFER GOES THE
17103 UBI: MOVEI I,0 ;SIGNAL UBI
17106 XCTR XRW,[MOVES TT,(C)] ;MAKE SURE WRITE CYCLES WILL WIN
17107 UBIB: TRNE A,200000 ;SKIP UNLESS 6
17108 MOVNI A,1 ;SO CAILE BELOW WILL SKIP OVER SUSTPR AMONG OTHER REASONS
17109 CAILE A,LUBLK ;SKIP ON SYS JOB, CORE JOB, PDP6 OR JOB ALREADY STOPPED
17110 PUSHJ P,SUSTPR ;RANDOM JOB STOP
17111 JUMPGE TT,UBI4 ;THRU
17112 TLO A,400000 ;INDICATE ALREADY STOPPED SO WONT TRY IT AGAIN
17114 MOVNS B ;COUNT TO BE XFERRED
17115 HRLZ E,IOCHST-IOCHNM(R) ;EXAMINED USER ADDRESS
17116 HRR E,TT ;FROM,,TO (INFERIOR ADR,,SUPERIOR ADR)
17120 UBI5: CAIGE Q,20 ;INF ADR IN Q
17122 HRRZ J,A ;SET UP UMAPS WORD
17124 TLOA J,%UMMPL ;TO HI PG, HACK OUR LOW PG
17125 TLO J,%UMMPU ;TO LOW PG, HACK OUR HI PG
17127 TLOA J,%UMLTU ;TO POINT TO HIS UPPER
17128 TLO J,%UMUTL ;TO POINT TO HIS LOWER
17129 TLNN J,%UMMPU+%UMUTL ;MAPPING HIS UPPER WITH OUR LOWER?
17130 JRST UBI3A ;YES MAKE SURE NOT SCREWED BY AC PNTR
17131 UBI3B: PUSHJ P,MPLD1
17133 MOVNS Q ;LIMIT SIZE OF XFER TO MIN OF DESIRED
17134 ADDI Q,400000 ;DIST OF TO ADR FROM SEG BOUNDARY
17137 MOVNI Q,(E) ;AND DIST OF FROM ADR FROM SEQ BOUNDARY
17141 TLNN J,%UMMPL ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
17142 TLOA E,400000 ;SET FROM ADR TO HI PG
17143 TRO E,400000 ;SET TO ADR TO HI PG
17144 SKIPE I ;SKIP ON UBI
17145 MOVSS E ;UBO, XFERR OTHER DIRECTION
17146 MOVE Q,E ;SAVE COPY OF BLT PNTR
17147 ADDI B,(E) ;GET LA +1
17148 UBI3H: XCTRI XBRW,[BLT E,-1(B)] ;XFERR DATA
17149 UBI3K: MOVEI E,(B) ;NO FAULT, SIMULATE STORE BACK OF BLT PNTR AFTER COMP OF BLT (RH ANYWAY)
17151 PUSHJ P,MPLDZ ;RETURN TO NORMAL MAP TO STORE BACK USER PNTR
17152 POP P,J ;SAVE PREV MAP FOR EVENTUAL USE
17153 SUBM E,Q ;FIGURE OUT HOW MANY WDS ACTUALLY XFERRED
17155 UBI3E: HRLS Q ;# WDS TRANSFERRED,,SAME
17156 JUMPL C,UBIC ;UPDATE USER PNTR
17157 XCTRI XRW,[ADDM Q,(C)]
17159 BUG ;SHOULD HAVE ALREADY CHECKED THIS
17160 UBID: ADD Q,IOCHST-IOCHNM(R) ;UPDATE INFERIOR PNTR
17161 HRRM Q,IOCHST-IOCHNM(R) ;WRAPPING AROUND IF PASS 1,,0
17163 CAIN B,(E) ;WAS THERE A FAULT?
17164 JRST UBIL ;NO, LOOP
17165 PUSHJ P,UBI4 ;UNSTOP THE JOB.
17166 PUSHJ P,MPLD1 ;RESTORE TO FROB AT TIME OF FAULT
17167 UBI3C: PUSHJ P,TPFLT
17171 UBI4: TLNN A,200000 ;SKIP ON REALLY PDP6
17172 TLZ A,400000 ;FLUSH RANDOM BIT SO COMPARE WILL WORK
17177 UBMCK1: PUSHJ P,UBI4
17180 UBIA: TRNE C,777760
17185 UBIC: TRNE C,777760
17190 UBI5A: CAIL Q,400000
17198 UWI: SETO I, ;0 FOR OUTPUT, -1 FOR INPUT.
17200 MOVNI A,1 ;-1 MEANS PDP6.
17202 HRLI A,-1 ;DON'T STOP SELF
17204 JRST UWI1 ;SYS, CORE, SELF, OR PDP6
17206 PUSHJ P,SOSSET ;MIGHT TAKE PAGE FAULT AND GET PCLSRED
17208 UWI1: HRRZ E,IOCHST-IOCHNM(R)
17210 PUSHJ P,MPLDJ ;MAP JOB BEING IOT'ED FROM.
17211 XCTR XRW,[ MOVE W,(E)
17213 AOS IOCHST-IOCHNM(R) ;ADVANCE ACCESS POINTER
17218 UBI3A: TLNE E,777760 ;SKIP ON XFERRING FROM AC AREA, HI TO HI
17222 XCTRI XR,[MOVE B,(Q)] ;PICK UP WD
17224 JRST UBI3C ;TAKE FAULT
17225 PUSHJ P,MPLDZ ;BACK TO NORMAL MAP
17229 ;USR DEV IOT STOP ROUTINE
17230 USUSTP: SOS USTP(A)
17231 SUSTPR: MOVSI T,BCSTOP+BUCSTP
17232 TDNE T,USTP(A) ;WAIT TILL NOT BEING SHUFFLED
17234 PUSHJ P,RPCLSR ;AOS'ES USTP
17235 MOVSI T,BCSTOP+BUCSTP
17240 UBI3: ADDI Q,AC0S(A)
17243 TDZA B,B ;READ PDP6 AC
17244 MOVE B,(Q) ;READ NORMAL AC
17245 UBI3D: XCTRI XW,[MOVEM B,(E)]
17247 JRST UBI3C ;TAKE FAULT
17248 UBI3G: MOVEI Q,1 ;1 WD XFERRED
17249 HRRZ B,E ;FAKE OUT FAULT TEST
17252 UBO3: TLNE A,200000
17253 JRST UBI3G ;TRYING TO WRITE PDP6 AC IGNORE
17254 XCTRI XR,[MOVE B,(E)]
17261 UBO3A: XCTRI XR,[MOVE B,(TT)]
17263 JRST UBI3C ;TAKE FAULT
17264 PUSHJ P,MPLDJ ;MAP HIM.
17265 XCTRI XW,[MOVEM B,(Q)]
17268 PUSHJ P,MPLDZ ;BACK TO NORMAL
17271 SUBTTL CORE LINK DEVICE
17275 CLSYN: BLOCK NCLCH ;SYSTEM NAME ;0=>VARIABLES FREE
17276 CLN1: BLOCK NCLCH ;FN1
17277 CLN2: BLOCK NCLCH ;FN2
17278 CLUSR: REPEAT NCLCH,-1 ;LH=WRITING USER ;RH=READING USER ;-1=>NOT OPEN THAT HALF
17279 CLRAC: BLOCK NCLCH ;4.9=LOCKED BY CORE ALLOCATOR
17280 ;4.8=VERY SLOW CLOCK ROUTINE CONSIDERING FLUSHING THIS BUFFER
17281 %CAFLS==100000 ;4.7=INPUT CLOSED, TURN OUTPUT INTO NUL DEVICE
17282 %CA==1,,500000 ;RH=UT BUFFER NUMBER (IOBFT ADR)
17284 CLOSW: -1 ;USER LOCK TO STOP MORE THAN ONE PERSON FROM SIMULTANEOUSLY MODIFYING
17285 0 ;THE CORE LINK VARIABLES
17289 ;FORMAT OF CORE LINK 200 WORD BUFFER
17293 CLBEOF==<CLBCHS+4>/5
17294 IFG CLBVSP+CLBCHS+CLBEOF-128.,.ERR CLBXXX LOSSAGE
17297 ;0: CHARACTER COUNT
17298 ;1&2: READ AND WRITE CHARACTER OR WORD POINTERS
17299 ;3&4: READ AND WRITE EOF POINTERS
17300 ;CLBVSP TO CLBVSP+CLBCHS-1: CHARACTERS OR WORDS
17301 ;CLBVSP+CLBCHS UP: EOF BITS STORED AS SEVEN FIVE BIT BYTES PER WORD,
17302 ; EACH BIT CORRESPONDING TO A CHARACTER POSITION.
17304 CLAO: SKIPA J,[2] ;CLA .OPEN (TO ANSWER A CLI INTERRUPT)
17305 CLIO: MOVNI J,1 ;CLI .OPEN (INTERRUPTS USER SPECIFIED BY FILE NAME)
17308 CLUO: TDZA J,J ;CLU .OPEN
17309 CLOO: MOVEI J,1 ;CLO .OPEN
17310 CLI2: JUMPL C,CLFDEL ;JUMP IF AN .FDELE
17312 JRST CLO1 ;NOT FILE DIRECTORY
17317 CLO1: PUSHJ P,SWTL ;SEIZE SWITCH TO STOP VARIABLES FROM CHANGING UNDER YOU
17319 LDB H,[220100,,C] ;DIRECTION BIT
17321 CLOO5B: MOVE Q,USYSN1(U) ;PICK UP SNAME
17323 CAIN J,2 ;SKIP UNLESS CLA
17324 JRST CLO1A ;JUMP IF CLA .OPEN
17326 CLO1A1: MOVE Q,[SIXBIT/_CLI_/]
17327 CLOL: CAMN Q,CLSYN(I) ;LOOK FOR SNAME, FN1, & FN2
17332 JUMPL J,OPNL23 ;"FILE LOCKED" IF ALREADY EXISTS, FOR CLI:.
17333 CAIN J,3 ;SKIP UNLESS DELETE
17334 JRST CLO1D ;FOUND FILE TO DELETE
17335 CLO1A6: LDB TT,CLOOT1(H)
17337 JRST OPNL23 ;ALREADY OPEN THIS DIRECTION (FILE LOCKED)
17339 LDB Q,[IOSA,,IOBFT(TT)]
17341 CLOX: DPB U,CLOOT1(H) ;STORE USER INDEX
17343 ANDCAM TT,CLRAC(I) ;CLEAR VERY SLOW CLOCK BIT
17344 PUSHJ P,LSWPOP ;RELEASE SWITCH
17348 PUSHJ P,CLOX1 ;FOR CLI:, PUT OUR UNAME AND JNAME INTO BUFFER.
17351 MOVEI TT,7 ;UNIT ASCII
17352 ADD Q,H ;OFFSET FOR DIRECTION
17353 DPB TT,[300600,,1(Q)] ;SET UP ITEM POINTER
17356 MOVEI TT,1 ;UNIT ASCII
17357 DPB TT,[300600,,3(Q)] ;SETUP EOF POINTER
17358 JSP Q,OPSLC7 ;SET UP IOCHNM OF USER
17359 DCLUAI,,DCLUAO ;UNIT ASCII INPUT ;UNIT ASCII OUTPUT
17360 DCLBI,,DCLBO ;BLOCK INPUT ;BLOCK OUTPUT
17361 DCLUBI,,DCLUBO ;UNIT BINARY INPUT ;UNIT BINARY OUTPUT
17364 CLOX1: MOVEI TT,44 ;CHANGE OUTPUT BYTE SIZE TO 36.
17365 DPB TT,[300600,,2(Q)]
17366 MOVEI TT,5 ;WHICH INVOLVES STORING 5 CHARACTERS OF EOF BITS AT ONCE.
17367 DPB TT,[300600,,4(Q)]
17371 PUSHJ P,CLOXO ;NOW WE CAN IOT WORDS OUT, EVEN IF CHANNEL IS ASCII MODE.
17375 SOJA Q,POPCJ ;NOW RETURN, AND SET UP THE CORRECT BYTE SIZES.
17377 CLOO1: AOBJN I,CLOL ;LOOP FOR ALL SETS OF CORE LINK VARIABLES
17379 JUMPGE J,OPNL4 ;CLA, CLU DELETE LOSE
17381 CLOO3: SKIPN CLSYN(I) ;LOOK FOR FREE VARIABLES TO CREATE FILE
17384 JRST OPNL5 ;GIVE DIREC FULL ERROR
17386 CLOOT1: 2200,,CLUSR(I) ;READING
17387 222200,,CLUSR(I) ;WRITING
17389 CLOO2: MOVEM A,CLN1(I) ;SET UP VARIABLES
17391 MOVEI D,SCNCLO(I) ;SYS CHNL NO
17392 PUSHJ P,TCALL ;GET 200 WORD BUFFER
17394 JRST CLOO4 ;NO MEM AVAIL
17395 MOVEM Q,CLSYN(I) ;DONT SET UP SYS UNTIL MEM AVAIL
17397 LDB Q,[IOSA,,IOBFT(A)] ;SET UP BUFFER
17399 SETZM (Q) ;CHAR COUNT
17401 ADDI TT,CLBVSP ;SET UP BUF POINTERS
17405 ADDI TT,CLBCHS ;SET UP EOF POINTERS
17410 ;NO MEMORY AVAILABLE FOR 200-WD BUFFERS
17411 CLOO4: AOS SWPOPR ;MAYBE SWAPPING SOMETHING OUT WILL HELP
17412 PUSHJ P,LSWPOP ;UNLOCK CLOSW
17413 PUSHJ P,UDELAY ;WAIT A WHILE
17414 JRST CLO1 ;TRY AGAIN
17416 CLOO5: CONO PI,CLKOFF ;TURN OFF CLOCK TO STOP U&J NAMES FROM CHANGING
17418 CLOO5A: CAMN A,UNAME(Q) ;LOOK FOR USER WHOSE NAMES MATCH THE SPECIFIED FILE NAMES
17421 MOVEI T,%PICLI ;IF GET TO HERE, HAVE FOUND USER WITH RIGHT NAMES
17422 TDNN T,MSKST(Q) ;SKIP IF HE HAS CLI INT DISABLED
17424 IORM T,PIRQC(Q) ;GIVE USER INT
17428 CLOO6: ADDI Q,LUBLK ;GO TO NEXT USER SLOT
17429 CAMGE Q,USRHI ;SKIP IF ALL EXAMINED
17433 CLO1D: MOVE T,CLUSR(I)
17434 AOJN T,OPNL23 ;FILE LOCKED
17437 PUSHJ P,CLIOTB ;NO TIMING ERROR SINCE CORE JOB WILL PCLSR USR ON
17438 SKIPN B,SRN3(U) ;CORE LINK BEFORE MOVING BUFFER
17445 CLO1A: MOVE A,UNAME(U)
17449 ;CORE LINK .IOT SET UP ROUTINE
17451 CLIOTB: SKIPGE CLRAC(A) ;WAIT IF BUFFER LOCKED BY CORE ALLOCATOR
17452 PUSHJ P,UFLS ;(DO NOT CHANGE ABOVE TO "SKIPGE TT,CLRAC(A)")
17454 LDB Q,[IOSA,,IOBFT(TT)] ;GET POINTER TO BUFFER
17459 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII INPUT
17461 CLUAI: PUSHJ P,CLIOTB ;SETUP
17465 SKIPN (Q) ;WAIT TILL CHAR COUNT NON-ZERO
17467 CLUAI1: MOVE J,3(Q)
17468 ILDB I,J ;GET EOF BIT
17470 CLUAIE: ILDB W,1(Q) ;GET CHARACTER
17471 SOS (Q) ;DECREMENT BUF COUNT
17472 CLFAXP: LDB TT,[700,,1(Q)] ;FIX UP POINTERS
17473 CAIN TT,CLBVSP+CLBCHS-1
17474 PUSHJ P,CLFAX2 ;MAYBE TIME TO RING BUFFER
17475 HLRZ TT,J ;GET BYTE POSITION AND SIZE
17476 CAIN TT,010100 ;IF TO END OF 35-BIT WORD, ADVANCE
17477 IBP J ;TO NEXT WORD (5-BIT BYTES 1 BIT AT A TIME)
17481 UNIEOF: HRROI W,EOFCH
17484 CLFAX2: LDB TT,[370500,,1(Q)] ;PICK UP TOP 5 BITS OF BYTE POSITION
17485 JUMPN TT,CPOPJ ;NOT QUITE YET
17486 CLFBX2: MOVEI TT,CLBVSP ;J HAS NEW EOF PNTR
17487 DPB TT,[700,,1(Q)] ;RING CHAR POINTER
17490 DPB J,[360600,,1(Q)]
17491 MOVEI TT,CLBVSP+CLBCHS
17492 DPB TT,[700,,3(Q)] ;RING EOF POINTER
17493 DPB J,[360600,,3(Q)]
17497 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII OUTPUT
17499 CLUAO: MOVE T,CLRAC(A)
17502 PUSHJ P,CLIOTB ;SETUP
17503 MOVEI T,CLBCHS*5-11.
17504 CAMGE T,(Q) ;WAIT TILL THERE IS SPACE IN BUF
17508 SKIPA B,(C) ;GET CHAR FROM EXEC
17509 UMOVE B,(C) ;GET CHAR FROM USER
17511 IDPB TT,J ;INDICATE NOT AN EOF
17512 IDPB B,2(Q) ;STORE IN BUF
17513 MOVEI TT,1 ;GET MASK FOR LOW ORDER BIT
17514 ANDCAM TT,@2(Q) ;FLUSH IN CURRENT WORD
17515 CLCWU2: AOS (Q) ;INCREMENT BUF COUNT
17516 MOVEI I,0 ;FAKE OUT EOF TEST
17517 AOJA Q,CLFAXP ;FAKE OUT CLFAXP AND FIX UP POINTERS
17520 CLBI: JSP W,WRDBTI ;BLOCK INPUT.
17522 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY INPUT
17524 CLUBI: PUSHJ P,CLIOTB ;SETUP
17529 CAMLE T,(Q) ;WAIT TILL A WORD IS AVAILABLE
17531 CLUBI1: MOVE J,3(Q)
17532 ILDB I,J ;GET EOF BITS
17533 JUMPN I,CLUBIF ;JUMP ON EOF
17534 CLUBIE: ILDB W,1(Q) ;GET WORD
17536 ADDB T,(Q) ;DECREMENT COUNT
17538 SETZM (Q) ;CAME FROM CLCLRL WITH PARTIAL WORD IN BUFFER
17539 CLFBXP: JRST CLFAXP
17541 CLUBIF: TROE I,20 ;SKIP IF EOF NOT ON FIRST CHAR OF WORD
17543 DPB I,J ;SET EOF ON FIRST CHAR
17545 ILDB W,J ;PICK UP WORD WITH EOF IN MIDDLE
17548 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY OUTPUT
17550 CLUBO: MOVE T,CLRAC(A)
17553 PUSHJ P,CLIOTB ;SETUP
17554 ;CLI: OPEN CALLS HERE TO OUTPUT UNAME AND JNAME.
17555 CLOXO: MOVEI T,CLBCHS*5-11.
17556 CAMGE T,(Q) ;WAIT TILL THERE IS SPACE FOR A WORD
17560 SKIPA B,(C) ;GET WORD FROM EXEC
17561 UMOVE B,(C) ;GET WORD FROM USER
17563 IDPB TT,J ;INDICATE NOT AN EOF
17564 IDPB B,2(Q) ;STORE IN BUF
17566 ADDM TT,(Q) ;INCREMENT COUNT
17567 AOJA Q,CLFAXP ;FAKE OUT CLFBXP AND FIX UP POINTERS
17570 ;CORE LINK .IOT ROUTINE FOR BLOCK OUTPUT
17572 CLBO: MOVE I,C ;SAVE A POINTER TO USERS BLKO POINTER
17573 XCTR XR,[SKIPL H,(I)] ;PICKUP BLKO POINTER
17575 SKIPA E,H ;SECOND COPY, ALSO FLAG TO CLBIN
17576 CLBI2: UMOVEM E,(I) ;TO INFORM USER & IN CASE YOU ARE PCLSR'ED
17578 PUSHJ P,CLUBO ;TRANSFER ONE WORD
17579 AOBJN E,CLBI2 ;TRY FOR NEXT
17580 CLBI3: UMOVEM E,(I) ;COUNT EXHAUSTED OR EOF
17583 ;CORE LINK .CLOSE ROUTINE FOR BINARY OR BLOCK OUTPUT
17585 CLCLWB: PUSHJ P,CLCWC ;STORE EOF BITS FOR WORD
17586 JRST CLCWU6 ;NO ROOM SO LAST MUST HAVE BEEN EOF HACK SO FLUSH
17587 IBP 2(Q) ;KEEP WORD POINTER IN STEP
17588 PUSHJ P,CLCWB2 ;FIX UP COUNT AND POINTERS
17590 DPB B,[222200,,CLUSR(A)] ;OBLITERATE USER INDEX
17593 JRST LSWPOP ;RELEASE SWITCH
17595 ;CORE LINK .CLOSE ROUTINE FOR UNIT ASCII OUTPUT
17597 CLCLWU: PUSHJ P,CLCWC ;STORE EOF BIT FOR CHAR
17600 IDPB TT,2(Q) ;STORE AN EOF CHAR
17601 PUSHJ P,CLCWU2 ;FIX UP COUNT AND POINTERS
17602 SOS Q ;CLCWU2 AOJAS
17603 LDB TT,[360600,,2(Q)]
17604 SOJE TT,CLCWU6 ;JUST FILLED A WHOLE WORD => STOP PADDING.
17605 PUSHJ P,LSWPOP ;ELSE PAD ONCE MORE.
17609 ;COMMON SUBROUTINE FOR CORE LINK OUTPUT .CLOSE ROUTINES
17611 CLCWC: PUSHJ P,SWTL ;LOCK SWITCH (IF SIGN OF CLRAC IS EVER REALLY USED,
17612 CLOSW ;THIS MIGHT CAUSE A DEADLY EMBRACE).
17613 PUSHJ P,CLIOTB ;SETUP
17614 MOVEI T,CLBCHS*5-5.
17615 CAMGE T,(Q) ;WAIT FOR THERE TO BE ROOM
17619 IDPB TT,J ;SET EOF BIT(S)
17622 ;CORE LINK .CLOSE ROUTINE FOR INPUT
17624 CLO1D2: SETZM CLSYN(A) ;FREE VARIABLES
17625 HRRZS A,CLRAC(A) ;CORE LINK NO LONGER IN USE
17626 PUSHJ P,BRTN ;RETURN BUFFER TO FREE STATE
17629 CLISTA: PUSHJ P,CLIOTB ;CORE LINK INPUT STATUS
17631 TRO D,1_10. ;SYS BUF CAP EMPTY
17633 TRO D,1_9 ;SYS BUF CAP EMPTY
17636 CLCLRA: TDZA C,C ;UNIT ASCII
17637 CLCLRB: MOVNI C,1 ;IMAGE OR BLOCK (I.E. WORDS)
17641 ;FLUSH ALL REAL DATA
17642 CLCLRL: SKIPN (Q) ;SKIP IF BUFFER CONTAINS DATA, READ IT UNTIL EOF
17644 PUSHJ P,[JUMPE C,CLUAI1 ? JRST CLUBI1]
17646 CLCLR2: MOVE J,3(Q) ;FOUND AN EOF, FLUSH THE EOF WORD
17648 PUSHJ P,[JUMPE C,CLUAIE ? JRST CLUBIE]
17651 JRST CLCLR2 ;NOT YET TO WORD BOUNDARY
17654 CLCLR1: MOVSI B,%CAFLS
17663 CLCLR3: HLLOS B,CLUSR(A) ;NO LONGER OPEN FOR INPUT
17664 SKIPN (Q) ;IF NO DATA IN BUFFER
17665 AOJE B,CLO1D2 ;AND NOT OPEN FOR OUTPUT, GO FREE THE BUFFER AND VARS
17670 NLCKCH==:8 ; Should be enough.
17674 LCKNAM: REPEAT NLCKCH, 0 ; 0 => free lock channel, else contains
17675 ; name of lock held by this channel.
17676 LCKUSR: REPEAT NLCKCH, 0 ; Job that holds the lock. Nothing looks
17677 ; at this currently.
17678 LCKSW: -1 ? 0 ; Prevent more than one user from trying to
17679 ; lock a lock at the same time.
17682 ; LCKO is .OPEN routine for LOCK device. First filename is name of lock to
17683 ; seize. 0 is illegal. Only opens for output are permitted (some day we
17684 ; might allow multiple opens for input).
17686 ; Bit 1.4 controls what happens if lock is already held:
17687 ; 0 => error: %ENAFL
17688 ; 1 => Hang until you can seize it
17689 LCKO1: PUSHJ P,LSWPOP ; We lose this time
17690 TLNN C,10 ; 1.4 => HANG MODE
17691 JRST OPNL23 ; FILE LOCKED
17693 CAMN T,LCKNAM(I) ; Wait for unlock, then try again
17695 LCKO: JUMPE A,OPNL11 ; ILLEGAL FILE NAME
17696 PUSHJ P,SWTL ; One potential locker at a time
17698 MOVSI I,-NLCKCH ; Check if it is already locked
17701 JUMPL I,LCKO1 ; Already held
17702 MOVSI I,-NLCKCH ; Search for free lock channel
17705 JUMPGE I,OPNL6 ; DEVICE FULL
17710 MOVEM T,(R) ; Set up channel
17711 JRST LSWPJ1 ; And return
17713 ; .CALL RFNAME returns name of lock:
17714 LCKRCH: MOVE B,LCKNAM(A)
17717 ; .CLOSE releases the lock:
17718 LCKCL: SETZM LCKNAM(A)
17721 SUBTTL COMMON I/O ROUTINES
17723 ;STANDARD DEVICE OPEN
17725 STDOP1: MOVEI R,R ;ENTRY TO NOT CLOBBER IOCHNM
17726 STDOPN: HLRZ A,(Q) ;LH MASK ON 4.9-3.2 OF LH OPEN WRD
17727 AND D,A ;RH POINTER TO ..USR,..USE PAIR
17728 ROT D,-1 ;FOLLOWING WORDS CONTAIN LIST FOR ALL MASKED STATES
17729 ADDI D,(Q) ;LH MSKED STATE =0, RH =1, IOTTB ENTRY NUMBERS
17733 JUMPE A,OPNL12 ;MODE NOT AVAIL
17739 JRST OPNL10 ;DEVICE NOT AVAIL
17744 OPSLD1: ANDI D,1 ;ENTRY TO USE BOTTOM BIT OF AC D
17745 OPSLD3: ANDI D,3 ;ENTRY TO USE BOTTOM TWO BIT OF AC D
17747 OPSLC3: ANDI C,3 ;ENTRY TO USE BOTTOM TWO BITS OF AC C
17748 OPSLC7: ANDI C,7 ;ENTRY TO USE BOTTOM THREE BITS OF AC C
17754 OPNSLT: MOVEM A,(R) ;SET USERS IOCHNM
17757 ;BLOCK OUTPUT TO CHARACTER DEVICE
17758 ;ADR OF CHR ROUTINE IN E
17759 ; THAT ROUTINE MUST NOT CLOBBER C, D, E, OR TT
17760 ;C POINTS TO AOBJN POINTER IN USER SPACE
17761 ;MUSTN'T CLOBBER J (TTY OUTPUT ASSUMES).
17763 NBTOCH: XCTR XRW,[MOVES D,(C)] ;CHECK WRITEABILITY OF AOBJN PTR
17764 LDB TT,[410300,,D] ;USE HIGH 3 BITS OF USER PNTR AS CHR CNT
17766 POPJ P, ;USER TRYING TO XFER >32K FLUSH
17767 SKIPA TT,BTOCHT-3(TT) ;PICK UP APPROPRIATE BYTE PTR (WORD IN W)
17768 NBTO1: UMOVEM D,(C) ;UPDATE USER'S AOBJN PTR
17769 UMOVE W,(D) ;FETCH CURRENT WORD FROM USER
17770 ILDB A,TT ;FETCH CURRENT CHARACTER
17771 PUSHJ P,(E) ;SEND TO DEVICE
17772 ADD D,[700000,,] ;UPDATE PTR
17774 JRST NBTO1 ;GO TO NEXT CHR
17776 ADD D,[500001,,1] ;INCR TO NEXT WORD
17778 UMOVEM D,(C) ;COUNTED OUT, UPDATE FINAL TIME & RETURN
17781 BTOCHT: REPEAT 5,<44-<4-.RPCNT>*7>_14+700,,W
17783 ;BLOCK INPUT FROM CHARACTER DEVICE
17784 ;E AND C SET UP LIKE NBTOCH
17785 ;INTERNALLY LH OF E USED FOR FLAGS:
17786 ; 4.9 EOF FLAG (SIGN)
17787 ; 4.8 => JUST RETURN WITHOUT ERROR IF AT BEGINNING OF WORD,
17788 ; OTHERWISE IGNORE BIT.
17789 ; 4.7 => RETURN WITHOUT ERROR EVEN IF NOT AT BEGINNING OF WORD.
17791 INBTCH: HRRZS E ;CLEAR GARBAGE IN LH
17792 XCTR XRW,[MOVES D,(C)] ;SET UP LIKE NBTOCH
17796 SKIPA TT,BTOCHT-3(TT)
17797 INBTO1: UMOVEM D,(C)
17798 XCTR XRW,[MOVES (D)] ;CHECK WRITABILITY OF CURRENT WORD
17799 JUMPL E,INBTO2 ;JUMP IF EOF
17805 PUSHJ P,(E) ;RETN CHR IN W
17816 CAIN W,7 ;SKIP IF NOT AT 1ST CHAR.
17821 INBTO3: UMOVE W,(D) ;PICK UP CURRENT WORD
17822 IDPB I,TT ;INSERT CHARACTER
17823 UMOVEM W,(D) ;PUT WORD BACK
17826 JRST INBTO1 ;DO ANOTHER CHR THIS WORD
17828 ADD D,[500001,,1] ;INCR TO NEXT WD
17829 SKIPL E ;SKIP IF EOF
17831 UMOVEM D,(C) ;DONE, UPDATE POINTER AND RETURN
17834 INBTO2: MOVEI I,EOFCH ;EOF, STORE EOF CHARACTER
17837 ;BLOCK IO TO WORD DEVICE
17838 ;C POINTS TO AOBJN POINTER IN USER SPACE
17839 ;Q POINTS TO WORD HANDLING ROUTINE (POINTER WILL BE IN C)
17840 ;MUST NOT CLOBBER Q OR H (PTR ROUTINES DO POPJ2 SOMETIMES)
17841 ;WRDBRT CHECKED FOR ON PDL BY TVC ROUTINES
17844 UMOVE C,(H) ;FETCH USER'S AOBJN POINTER
17848 WRDBT2: PUSHJ P,OPBRK
17851 WRDBRT: JRST WRDBT5 ;NO SKIP - WORD XFERRED
17852 SKIPA C,[1,,1] ;1 SKIP - LAST WORD XFERRED
17853 POPJ P, ;2 SKIPS - EOF, NO WORD XFERRED
17854 XCTR XRW,[ADDM C,(H)]
17857 WRDBT5: MOVE C,[1,,1]
17858 XCTR XRW,[ADDB C,(H)]
17862 ;JSP W,WRDBTI TO DO WRDBT FOR A UNIT MODE INPUT ROUTINE SATISFYING NEW
17863 ;CALLING CONVENTION FOR THOSE.
17864 WRDBTI: JSP Q,WRDBT
17865 XCTR XRW,[MOVES (C)]
17871 WRDBT4: UMOVEM W,(C)
17876 ;CHANGED CONVENTIONS:
17877 ;1) EOF IS NO LONGER CHECKED FOR CHARACTER BY CHARACTER.
17878 ; INSTEAD, THE GET-BUFFER ROUTINE SHOULD SET UP THE BYTE COUNT
17879 ; TO A SMALLER VALUE THAN USUAL.
17880 ; AN ATTEMPT TO GET ANOTHER BUFFER AFTER REACHING EOF
17881 ; SHOULD CAUSE THE GET-BUFFER ROUTINE TO SKIP TWICE.
17882 ;2) THE THE BUFFER POINTER IS NOW A B.P. EVEN IN IMAGE MODE.
17883 ; ALSO, THE L.H. OF THE B.P. IS NOT INITTED HERE.
17884 ; IT MUST BE SET UP BY THE OPEN ROUTINE. ALSO, ACCESS ROUTINES
17885 ; FOR DSK MUST KNOW HOW TO SET IT UP.
17886 ; ALSO, THE BUFFER GET ROUTINE SHOULD SET IT UP,
17887 ; INSTEAD OF RETURNING THE BUFFER ADDRESS IN TT.
17888 ;3) THE BYTE SIZE THE FILE IS OPEN ON IS PASSED AS AN ARGUMENT.
17889 ; THIS ROUTINE WORKS FOR ANY CHANNEL BYTE SIZE WITH ANY
17893 ;RH OF E HAS # BYTES/WORD OF FILE BYTE SIZE. LH OF E HAS B.P. 44NN00.
17894 ;RH(C) = ADDR OF COUNT, IN USER MEMORY
17895 ;RH(TT) = ADDR OF USER'S B.P.
17897 ;0(B) ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
17898 ;1(B) ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
17899 ;2(B) ROUTINE TO GET NEXT BUFFER. NO SKIP IF NO MEMORY
17900 ; OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
17901 ; AND BUFFER BYTE POINTER ALREADY SET UP.
17902 ; 2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
17903 ; WHEN THIS ROUTINE IS CALLED, E CONTAINS THE
17904 ; NUMBER OF BYTES/WORD (GOOD FOR DETERMINING CHANNEL MODE).
17905 ;3(B) ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
17906 ; MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO,
17907 ; IN WHICH CASE IT SHOULD CONTAIN THE NEW NUMBER OF BYTES.
17909 ;5(B) IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
17910 ; IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
17912 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
17913 ;SIOKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
17922 SIOKNB: PUSHJ P,@3(B) ;"DISCARD" BUFFER
17923 SKIPE J,@1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME
17924 JRST SIOKT1 ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
17925 SKIPG 5(B) ;NEED TO WAIT FOR DEVICE?
17927 SIOKN1: SKIPG 5(B) ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
17928 JRST SIOKW1 ;DEVICE CAN'T WAIT SO UDELAY
17929 XCT 5(B) ;DEVICE WAIT
17930 SIOKF: PUSHJ P,UFLS
17932 SIOKF1: PUSHJ P,@2(B) ;NOW GET NEXT BUFFER
17933 JRST SIOKN1 ;HMM, HAVE TO WAIT
17934 JRST SIOKT1 ;BUFFER HAS BEEN GOT.
17935 JRST POP3J1 ;EOF, TRANSFER IS COMPLETE
17937 SIOKT1: UMOVE TT,@(P) ;GET COUNT OF BYTES TO TRANSFER
17938 JUMPLE TT,POP3J1 ;COUNT DECREMENTED TO 0; TRANSFER DONE.
17939 SKIPG D,@1(B) ;CHECK AMOUNT LEFT IN BUFFER
17940 JRST SIOKNB ;NEW BUFFER NEEDED
17941 CAMLE TT,D ;AMT OF ROOM LEFT IN CURRENT BUFFER
17942 MOVE TT,D ;TRANSFER ONLY AMT LEFT IN BUFFER
17947 IBP C ;TO TRANSFER WORD-WISE, BOTH B.P.'S MUST
17950 CAIE C,(D) ;HAVE SAME BYTE SIZE,
17957 CAIGE TT,@-2(P) ;THERE MUST BE AT LEAST 1 WORD TO TRANSFER,
17959 CAIE C,44 ;AND MUST BE ABOUT TO START THE NEXT WORD.
17962 IDIVI TT,@-3(P) ;GET # WDS TO BLT
17965 MOVSS J ;WRITING, SWAP BLT POINTER
17967 ADDI TT,(D) ;1+LAST WORD TO BLT INTO
17969 JRST SIOKN6 ;JUMP IF WRITING
17970 XCTRI XBW,[BLT D,-1(TT)] ;READING
17971 SIOKN7: MOVEI D,(TT) ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
17973 HRRZS J ;# WDS ACTUALLY XFERRED
17974 ADDM J,@(B) ;INCR BUFFER PNTR
17975 XCTR XRW,[ADDM J,@-1(P)]
17978 XCTR XRW,[ADDM J,@(P)]
17979 ADDM J,@1(B) ;DECREMENT COUNT LEFT IN BUFFER
17980 CAIE D,(TT) ;SKIP IF TRANSFERRED ALL WE COULD
17981 PUSHJ P,TPFLT ;TAKE FAULT
17982 SIOKN3: SKIPN @1(B)
17983 PUSHJ P,@3(B) ;BUFFER EXHAUSTED, DISCARD (MAY COME BACK TO LIFE).
17984 JRST SIOKT1 ;TRY AGAIN TO TRANSFER.
17986 SIOKW1: PUSHJ P,UDELAY
17989 SIOKN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
17993 ;COME HERE FOR SLOW (BYTE AT A TIME) SIOT TO BLOCK MODE DEVICE.
17994 ;TT HAS NUMBER OF BYTES TO TRANSFER - IT IS KNOWN THAT THE DEVICE
17995 ;CAN SUPPLY THAT MANY FROM ITS CURRENT BUFFER.
17996 SIOKSL: SUBM C,D ;D GETS SIZE; C HAS # BITS REMAINING TO BE HANDLED
17997 IDIV C,D ;C GETS # BYTES TO XFER TILL REACH WORD BOUNDARY.
17998 MOVE TT,C ;XFER THAT MANY, THEN TRY AGAIN, SO WILL USE FAST MODE.
18000 JRST SIOKSI ;INPUT AND OUTPUT PART HERE
18001 LDB D,[300600,,@(B)] ;BYTE SIZE IN THE BUFFER
18003 IDIV C,D ;D := # EXTRA BITS AT RIGHT END OF WORD
18006 SOS J ;J := MASK FOR THEM
18007 UMOVE C,@-1(P) ;GET COPY OF USER'S B.P. FOR SWAPPING IN PAGES.
18008 SIOKS3: IBP C ;IF NOT FOR THESE 2 INSNS, ILDB MIGHT GET PAGE FAULT
18009 UMOVE (C) ;WHICH WOULD CAUSE EXTRA INCREMENTING OF B.P.
18010 XCTR XBYTE,[ILDB D,@-1(P)] ;FETCH NEXT BYTE,
18013 ANDCAM J,(D) ;TURN OFF EXTRA BITS IN THIS WORD OF BUFFER
18015 XCTR XRW,[SOS @(P)]
18019 SIOKSI: UMOVE C,@-1(P) ;GET COPY OF USER'S B.P., FOR WRITEABILITY TESTING.
18021 XCTR XRW,[MOVES (C)] ;MAKE SURE WE CAN WRITE IN NEXT BYTE.
18022 ILDB D,@(B) ;GET NEXT BYTE FROM DEVICE BUFFER
18023 XCTR XBYTE,[IDPB D,@-1(P)];GIVE IT TO USER.
18024 XCTR XRW,[SOS @(P)] ;UPDATE USER'S COUNT
18025 SOS @1(B) ;AND THE SYSTEM'S COUNT.
18029 ;CONVENIENT EXIT ROUTINE FOR BUFFER-GET ROUTINES.
18030 ;ASSUMES ADDR OF START OF BUFFER IN TT,
18031 ;SIZE (IN WORDS) OF DATA AREA IN J.
18032 ;E SHOULD HAVE WHAT IT HAD WHEN SIOKT WAS CALLED.
18033 SIOBGX: IMULI J,(E)
18035 SIOBG2: MOVEM TT,@(B)
18039 ;BYTE AT A TIME I/O TO BLOCK MODE DEVICE
18040 ;SEE PRECEDING PAGE (SIOKT) FOR COMMENTS ON CALLING SEQUENCE
18041 ;EXCEPT: ON INPUT, VALUE RETURNED IN W, AND C,D HAVE NO SIGNIFICANCE;
18042 ;ON OUTPUT, RH(C) HAS ADDRESS OF ARG, SIGN(C) SET IFF ADDRESS IS EXEC-MODE,
18043 ; AND D HAS NO SIGNIFICANCE.
18046 JRST CHRKTO ;WRITING
18047 JRST CHRKTI ;READING
18049 CHRKTI: SOSGE @1(B) ;DECREMENT ACTIVE CHAR COUNT
18050 JRST CHRKT1 ;GET NEW BUFFER
18051 ILDB W,@(B) ;READ - GET NEXT CHAR
18054 CHRKTO: SKIPGE C ;USED WHEN FILLING OUT BLOCK AT CLOSE, AND ELSEWHERE.
18056 UMOVE J,(C) ;GET CHAR. FROM USER
18057 SOSGE @1(B) ;DECREMENT ACTIVE CHAR COUNT
18058 JRST CHRKT1 ;GET NEW BUFFER
18059 IDPB J,@(B) ;DEPOSIT IN BUFFER
18060 CAIE E,5 ;SKIP IF ASCII
18064 ANDCAM J,(D) ;CLEAR EXTRA BIT
18067 CHRKT1: AOS @1(B) ;COMPENSATE FOR OVER-SOS
18068 PUSHJ P,@3(B) ;GET RID OF THIS BUFFER
18069 SKIPLE J,@1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME
18070 JRST CHRKT ;SPRUNG BACK TO LIFE (LAST BLOCK OF FILE WRITE OVER)
18071 SKIPG 5(B) ;NEED TO WAIT FOR DEVICE?
18073 CHRKN1: SKIPG 5(B) ;HAVE TO WAIT
18074 JRST [ PUSHJ P,UDELAY
18076 XCT 5(B) ;DEVICE WAIT
18079 CHRKF1: PUSHJ P,@2(B) ;GOBBLE NEW BLOCK
18080 JRST CHRKN1 ;NOT READY, WAIT
18083 JRST UNIEOF ;READING PAST EOF IN ASCII MODE.
18084 JRST IOCER2 ;READING PAST EOF IN IMAGE MODE.
18087 ;E HAS BPLH,,# BYTES/WORD OF FILE BYTE SIZE - MUST BE 444400,,1
18088 ;RH(C) = ADDR OF AOBJN POINTER
18089 ; AND 4.9 => AOBJN PTR IS IN EXEC ADDRESS SPACE,
18090 ; 4.8 => BLOCK IT POINTS TO IS IN EXEC ADDRESS SPACE. (INPUT ONLY)
18092 ;0(B) ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
18093 ;1(B) ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
18094 ;2(B) ROUTINE TO GET NEXT BUFFER. NO SKIP IF NO MEMORY
18095 ; OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
18096 ; AND BUFFER B.P. IN @(B) ALREADY SET UP.
18097 ; 2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
18098 ;3(B) ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
18099 ; MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO.
18101 ;5(B) IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
18102 ; IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
18104 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
18105 ;BLKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
18107 ;CODE IS ON NEXT PAGE
18109 BLKT: CAME E,[444400,,1]
18110 BUG ;BLKT CALLED ON UNIT ASCII MODE CHANNEL??
18111 SKIPL C ;SKIP IF POINTER IN USER SPACE
18112 XCTR XRW,[MOVES (C)] ;USER SPACE, MAKE SURE WRITE CYCLE WILL WIN
18117 BLKTNB: PUSHJ P,@3(B) ;"DISCARD" BUFFER
18118 SKIPE @1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME
18119 JRST BLKT1 ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
18120 SKIPG 5(B) ;NEED TO WAIT FOR DEVICE?
18122 BLKTN1: SKIPG 5(B) ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
18123 JRST BLKTW1 ;DEVICE CAN'T WAIT SO UDELAY
18124 XCT 5(B) ;DEVICE WAIT
18125 BLKTF: PUSHJ P,UFLS
18127 BLKTF1: PUSHJ P,@2(B) ;NOW GET NEXT BUFFER
18128 JRST BLKTN1 ;HMM, HAVE TO WAIT
18130 POPJ P, ;EOF, TRANSFER FINISHED
18132 BLKT1: SKIPGE C ;SET UP FOR TRANSFER
18133 SKIPA J,(C) ;GET EXEC MODE BLOCK .IOT (AOBJN) POINTER
18134 UMOVE J,(C) ;GET USER MODE AOBJN POINTER
18135 JUMPGE J,CPOPJ ;POINTER COUNTED OUT, TRANSFER DONE
18136 SKIPG D,@1(B) ;CHECK AMOUNT LEFT IN BUFFER
18137 JRST BLKTNB ;NEW BUFFER NEEDED
18139 MOVNS TT ;DESIRED SIZE OF BLOCK
18140 CAMLE TT,D ;AMT OF ROOM LEFT IN CURRENT BUFFER
18141 MOVE TT,D ;TRANSFER ONLY AMT LEFT IN BUFFER
18142 MOVE D,@(B) ;CANONICALIZE THE BUFFER B.P. SO RH => NEXT WORD TO XFER
18144 HRL J,D ;MERGE WITH USER'S BLOCK ADDR TO GET BLT AC.
18146 MOVSS J ;WRITING, SWAP BLT POINTER
18148 ADDI TT,(D) ;1+LAST WORD TO BLT INTO
18150 JRST BLKTN9 ;JUMP IF EXEC AOBJN POINTER
18152 JRST BLKTN6 ;JUMP IF WRITING
18153 XCTRI XBW,[BLT D,-1(TT)] ;READING
18154 BLKTN7: MOVEI D,(TT) ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
18156 HRRZS J ;# WDS ACTUALLY XFERRED
18157 ADDM J,@(B) ;INCR BUFFER PNTR
18158 HRLS J ;PUT # WDS IN BOTH HALVES
18159 JUMPL C,BLKTN3 ;UPDATE AOBJN PTR IN EXEC SPACE
18160 XCTRI XRW,[ADDM J,(C)] ;UPDATE AOBJN PTR IN USER SPACE
18162 BUG ;MUMBLE. THIS WAS SUPPOSED TO BE THERE.
18164 BLKTN4: MOVNI J,(J)
18165 ADDM J,@1(B) ;DECREMENT COUNT LEFT IN BUFFER
18166 CAIE D,(TT) ;SKIP IF TRANSFERRED ALL WE COULD
18167 PUSHJ P,TPFLT ;TAKE FAULT IF ANY
18169 PUSHJ P,@3(B) ;BUFFER EXHAUSTED, "DISCARD"
18170 JRST BLKT1 ;GO TRANSFER ANOTHER CHUNK
18172 BLKTN3: ADDM J,(C) ;UPDATE EXEC AOBJN POINTER
18175 BLKTW1: PUSHJ P,UDELAY
18178 BLKTN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
18182 BLKTN9: BLT D,-1(TT) ;READING INTO EXEC SPACE
18185 SUBTTL DIRECTORY AND ERR DEVICES
18187 QMLSTF: MOVEI J,4 ;ENTRY TO GET MASTER 2314 DIRECTORY
18190 QLISTF: MOVEI J,3 ;ENTRY FOR 2314 USER DIRECTORY
18192 LISTFE: PUSHJ P,SWTL ;ENTER HERE FOR ALL KINDS OF DIRECTORIES.
18195 UD1: SKIPGE UDUSR(TT)
18199 PUSHJ P,UDELAY ;DIRECTORY NOT AVAILABLE NOW, WAIT
18202 UD2: MOVEM J,DSKLST(TT)
18208 JUMPG J,UDIF ;JUMP IF NOT UTAPE DIR.
18209 IFE NUNITS, BUG ;HOW DID UTAPE GET HERE?
18217 JRST UDBIN ;IMAGE MODE UTAPE DIR
18218 MOVEI Q,LISTF ;ASCII MODE UTAPE DIR
18220 UDIF1: MOVEM Q,DIRPC(TT)
18225 UDIF: HLRZ Q,UDT-1(J) ;INITIAL COROUTINE PC
18226 HRRZ T,UDT-1(J) ;PLACE TO FINISH OPENING - USUALLY UDIF1.
18229 UQL1: HRRZM H,UUDPP(TT) ;2314 MFD (FROM UDIF)
18235 UQL1A: PUSHJ P,STMSET ;DISK UFD (FROM UDIF). WE CAN STILL PCLSR,
18236 UDUSR(TT) ;ARRANGE TO GIVE BACK THE DIRECTORY CHANNEL.
18239 PUSHJ P,TCALL ;GET A LOW-HALF PAGE TO COPY UFD INTO.
18240 JRST IOMQ ;GET LOW HALF PAGE
18241 JRST UQL1W ;NOT AVAIL NOW
18243 DPB T,[MUR,,MEMBLT(A)] ;MARK THE PAGE AS A UFD COPY.
18249 BLT A,-1(T) ;COPY UFD
18251 PUSHJ P,LSWDEL ;STMSET OF UDUSR.
18253 BUG ;WE ALWAYS GET OUR MAN
18254 PUSHJ P,LSWPOP ;SOS QSNNR
18261 UQL1W: PUSHJ P,QUDULK
18266 ;LH INITIAL PC RH DISP ADR AT OPEN TIME
18267 UDT: NDLF,,UDIF1 ;NON DIR DEVICE
18268 UCL1,,UDIF1 ;CORE LINK
18269 UQL2,,UQL1A ;2314 UFD
18270 QMLS1,,UQL1 ;2314 MFD
18271 ERR1,,ERR2 ;ERR DEVICE
18272 TTYFLD,,UDIF1 ;TTY DIR
18273 TTYF99,,UDIF1 ;COR DIR (LAST LINE OF TTY DIR)
18276 QUDBIN: HRRZ T,QMDRO
18278 UDBIN: MOVEM J,NUM(TT) ;DOESN'T USE DIRPC THIS PC
18286 UTDCLS: MOVE B,DSKLST(A)
18289 UTDCLX: SETOM UDUSR(A)
18299 ;UNIT MODE IOT ON DIR DEVICE COMES HERE (RETURN CHAR IN W)
18300 DIRCH: SETOM SRN3(U) ;SAY WE WANT ONLY 1 CHARACTER.
18307 ;BLOCK MODE IOT ON DIR DEVICE.
18308 DIRB: JSP Q,WRDBT ;PUSHJ'S TO .+1 FOR EACH WORD.
18309 DIRB1: XCTR XRW,[MOVES (C)] ;MAKE SURE WE CAN WRITE.
18312 SETZM SRN3(U) ;SAY WE WANT A WHOLE WORD OF CHARS.
18316 LDB Q,[350700,,SRN3(U)]
18317 CAIN Q,^C ;IF THE WORD STARTS WITH ^C,
18318 JRST POPJ2 ;IT IS EOF; DON'T RETURN IT, UNHANG IOT.
18321 MOVEI Q,DIRB1 ;FASTER THAN PUSHING AND POPPING Q.
18322 POPJ P, ;RETURN INTO WRDBT
18325 DDATAI: MOVEI T,CHRKTI ;UNIT IMAGE INPUT FROM DIRECTORY.
18327 DBLKI: MOVEI T,BLKT ;BLOCK IMAGE INPUT FROM DIRECTORY
18329 JSP B,(T) ;TO BLKT, SIOKT, OR CHRKTI
18332 POPJ2 ;EOF IF TRY TO GET ANOTHER BUFFER
18333 CPOPJ ;BUFFER DISCARD ROUTINE
18337 ;ERR DEVICE AND ERROR MESSAGE TABLES
18338 ; ERR DEVICE WORKS MUCH LIKE DIR DEVICE
18343 ERR2: SOJE A,ERR21 ;LAST ERRONEOUS CHANNEL
18344 SOJE A,ERR22 ;CHANNEL SPECIFIED IN B
18345 SOJE A,ERR23 ;STATUS WORD IN B
18346 SOJE A,ERR24 ;.CALL ERROR ARG IN B
18350 ERR21: LDB B,[BCHPTR]
18355 ERR23: MOVEM B,UUDPP(TT)
18358 CORO: PUSHJ P,FLDRCK
18363 ERR1: SKIPN I,UUDPP(A)
18365 LDB B,[220600,,UUDPP(A)] ;OPEN LOSS FIELD
18369 MOVE TT,ERMST1-1(B)
18371 ERR1B: LDB B,[300300,,UUDPP(A)] ;IDS ERROR FIELD
18373 MOVE TT,ERMST2-1(B)
18375 ERR1C: LDB B,[330400,,UUDPP(A)] ;IOCERR FIELD
18378 CAIL B,NERM1+MIOTER
18379 MOVEI B,NERM1+MIOTER
18380 MOVE TT,ERMST3-MIOTER(B)
18384 ERR3: MOVEI TT,[ASCIZ /ISE0
18389 ;LISP ASSUMES THAT NO "ERR" DEVICE MESSAGE WILL EVER CONTAIN
18390 ; !, #, ^, OR LOWER CASE LETTERS. PLEASE MAINTAIN THIS STATE
18393 ERMST1: [ASCIZ /NO SUCH DEVICE
18395 [ASCIZ /WRONG DIRECTION
18397 [ASCIZ /TOO MANY TRANSLATIONS
18399 [ASCIZ /FILE NOT FOUND
18401 [ASCIZ /DIRECTORY FULL
18403 [ASCIZ /DEVICE FULL
18405 [ASCIZ /DEVICE NOT READY
18407 [ASCIZ /DEVICE NOT AVAILABLE
18409 [ASCIZ /ILLEGAL FILE NAME
18411 [ASCIZ /MODE NOT AVAILABLE
18413 [ASCIZ /FILE ALREADY EXISTS
18415 [ASCIZ /BAD CHANNEL NUMBER
18417 [ASCIZ /TOO MANY ARGUMENTS (CALL)
18419 [ASCIZ /PACK NOT MOUNTED
18421 [ASCIZ /DIRECTORY NOT AVAIL
18423 [ASCIZ /NON-EXISTENT DIRECTORY
18425 [ASCIZ /LOCAL DEVICE ONLY
18427 [ASCIZ /SELF-CONTRADICTORY OPEN
18429 [ASCIZ /FILE LOCKED
18431 [ASCIZ /M.F.D. FULL
18433 [ASCIZ /DEVICE NOT ASSIGNABLE TO THIS PROCESSOR
18435 [ASCIZ /DEVICE WRITE-LOCKED
18437 [ASCIZ /LINK DEPTH EXCEEDED
18439 [ASCIZ /TOO FEW ARGUMENTS (CALL)
18441 [ASCIZ /CAN'T MODIFY JOB
18443 [ASCIZ /CAN'T GET THAT ACCESS TO PAGE
18445 [ASCIZ /MEANINGLESS ARGS
18447 [ASCIZ /WRONG TYPE DEVICE
18449 [ASCIZ /NO SUCH JOB
18451 [ASCIZ /VALID CLEAR OR STORED SET
18453 [ASCIZ /NO CORE AVAILABLE
18455 [ASCIZ /NOT TOP LEVEL
18457 [ASCIZ /OTHER END OF PIPELINE GONE OR NOT OPEN
18459 [ASCIZ /JOB GONE OR GOING AWAY
18461 [ASCIZ /ILLEGAL SYSTEM CALL NAME
18463 [ASCIZ /CHANNEL NOT OPEN
18465 [ASCIZ /INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18467 [ASCIZ /UNRECOGNIZABLE FILE
18469 [ASCIZ /LINK TO NON-EXISTENT FILE
18471 IFN .-ERMST1-NOPNLS,.ERR WRONG TABLE LENGTH
18472 ;ADD NEW MESSAGES HERE
18474 IFN 0,[ A CLASSIFICATION OF OPEN-LOSS MESSAGES
18476 FULL - NO CORE (MMP FULL)
18477 DIR NOT AVAIL (DIR CHNL TABLE FULL)
18481 INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18483 NO SUCH - DEVICE, FILE, JOB, DIRECTORY, PAGE (CAN'T GET ACCESS)
18484 ILLEGAL SYSTEM CALL NAME
18486 ALREADY ONE SUCH - FILE (FILE ALREADY EXISTS - RENAME)
18488 WRITING - CAN'T MODIFY JOB
18489 DEVICE WRITE-LOCKED
18492 CAN'T GET ACCESS TO PAGE
18494 ARGS (THE PARAMETERS ARE RIDICULOUS) -
18495 SELF-CONTRADICTORY OPEN COMMAND
18503 NOT AVAILABLE (IT EXISTS BUT YOU CAN'T USE IT) -
18505 DEVICE NOT AVAILABLE
18506 NOT ASSIGNABLE TO THIS PROCESSOR
18510 OTHER END OF PIPELINE GONE
18511 JOB GONE OR GOING AWAY
18513 DEPTH - LINK DEPTH EXCEEDED
18514 TOO MANY TRANSLATIONS
18516 OTHER - NOT TOP LEVEL
18517 VALID CLEAR OR STORED SET
18521 [ASCIZ /OPEN TYPE NOT DETERMINED
18524 ERMST2: [ASCIZ /IDS ILLEGAL SCOPE MODE
18526 [ASCIZ /IDS SCOPE HUNG
18528 [ASCIZ /MORE THAN 1K SCOPE BUFFER
18530 [ASCIZ /IDS MEM PROTECT
18532 [ASCIZ /IDS ILLEGAL SCOPE OP
18534 [ASCIZ /IDS MEM PROTECT ON PDL PNTR
18536 [ASCIZ /IDS ILLEGAL PARAMETER SET
18539 ERMST3: [ASCIZ /DEVICE HUNG OR REPORTING NON-DATA ERROR
18541 [ASCIZ /END OF FILE
18543 [ASCIZ /NON-RECOVERABLE DATA ERROR
18545 [ASCIZ /NON-EXISTENT SUB DEVICE
18549 [ASCIZ /OVER IOPUSH
18551 [ASCIZ /USR OP CHNL DOES NOT HAVE USR OPEN
18553 [ASCIZ /CHNL NOT OPEN
18555 [ASCIZ /DEVICE FULL
18557 [ASCIZ /CHNL IN ILLEGAL MODE ON IOT
18559 [ASCIZ /ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY
18561 [ASCIZ /DIRECTORY FULL
18563 [ASCIZ /DIRECTORY'S ALLOCATION EXHAUSTED
18565 ;INSERT NEW MESSAGES HERE
18567 [ASCIZ /IOT OR OPR TYPE NOT DETERMINED
18570 ;DIRECTORY LISTING ROUTINES
18572 UQL3C: SKIPA I,["*]
18577 UQL2: MOVEI TT,[MNAME ASCIZ /, /] ;GENERATE USER DIRECTORY
18581 JSP B,SIXTYC ;SEND DIRECTORY NAME
18586 UQL2A: SKIPGE QACT(E)
18587 JRST UQL3 ;UNIT NOT ENGAGED
18590 JRST UQL3C ;TUT FOR UNIT NOT IN
18598 JSP B,GDPT ;AND # FREE TRACKS
18599 UQL3A: PUSHJ P,OUTCS
18610 UQLP: ADDI Q,2 ;MOVE PNTR TO 3RD WRD OF FILE DESC
18612 MOVEI TT,[ASCIZ /* /] ;DELETED OR BEING WITTEN
18614 MOVEI TT,[ASCIZ / /]
18619 LDB TT,[UNPKN+@DIRPT(A)]
18620 JSP B,GDPT ;PRINT PACK #
18621 LDB TT,[UNPKN+@DIRPT(A)]
18623 UQLL2: PUSHJ P,OUTCS
18625 SUBI Q,2 ;BACK TO FIRST WD
18626 JSP B,SIXTYA ;SEND FIRST FILE NAME
18627 JSP B,SIXTYB ;AND SECOND (AOSES Q)
18629 AOS Q ;SET Q TO POINT TO FILE DESC PNTR
18630 LDB E,[UNDSCP+@DIRPT(A)] ;PICK UP FILE DESC PNTR
18632 ADDI E,UDDESC ;COMPUTE WORD ADDRESS
18633 MOVE I,@DIRPT(A) ;SAVE STATUS WORD
18634 EXCH E,Q ;MOVE INTO PNTR
18637 HLLM TT,DIRPT(A) ;SET UP DIRPT TO POINT TO FILE DESC
18641 UQL5: JSP B,UQL5R ;CHECK IF ABOUT TO INCREMENT OFF WORD
18643 JUMPE I,UQL5A ;STOP
18653 QLL1: CLEARM ENDT(A) ;CNTS TO 3 FOR USER NAME AND 2 FILE NAMES
18654 QLL3: CLEARM NUM(A) ;CHR CNTR
18655 QLLIST: JSP B,UQL5R
18667 QLL2: PUSHJ P,OUTCS
18672 MOVEI Q,3(E) ;ADVANCE Q
18679 UQL5R: MOVE I,DIRPT(A) ;CHECK IF ABOUT TO ILDB OFF WORD
18682 MOVEI I,440600+Q ;YES INCREMENT Q INSTEAD
18686 UQL5B: CAIGE I,UDWPH ;PLACE HOLDER
18687 AOJA TT,UQL5 ;SKIP AND TAKE
18690 REPEAT NXLBYT,[JSP B,UQL5R
18693 AOJA TT,UQL5 ;SPACE OVER 2ND HALF OF LOAD ADDRESS
18695 UQL5A: JSP B,GDPT ;TYPE OUT # BLOCKS
18697 MOVE Q,E ;FILE POINTER
18699 SKIPGE B,@DIRPT(A) ;SKIP ON NOT DUMPED
18701 PUSHJ P,OUTC ;HAS NOT BEEN BACKED UP
18703 TLNN B,UNREAP ;SKIP ON DON'T-REAP
18707 LDB E,[1200,,DIRPT(A)]
18710 AOJE TT,UQL5C ;DATE NOT KNOWN
18711 LDB TT,[UNMON+@DIRPT(A)]
18712 JSP B,GDPT ;TYPE MONTH
18715 LDB TT,[UNDAY+@DIRPT(A)]
18716 JSP B,GDPT ;TYPE DAY
18719 LDB TT,[UNYRB+@DIRPT(A)]
18720 JSP B,GDPT ;TYPE YEAR
18737 UQL5D: JSP B,MESPCR
18738 ADDI Q,2 ;ADVANCE Q
18745 ;GENERATE MFD LISTING
18746 QMLS1: CONO PI,CLKOFF
18758 QMLS3: ADDI Q,LMNBLK
18761 ;DIRECTORY LISTING ROUTINES FOR UTAPE
18764 LISTF: MOVEI Q,220600+Q
18770 LISTF1: MOVEI TT,[ASCIZ /
18775 LISTF4: SKIPE @DIRPT(A)
18780 LISTF8: AOBJN Q,LISTF4
18782 MOVEI TT,[ASCIZ / FREE BLOCKS /]
18786 LISTD2: JSP B,MESPCR
18788 LISTF2: MOVEI I,440600+Q
18792 LISTF6: PUSHJ P,OUTCS
18798 LISTD4: JSP B,MESPCR
18799 LISTF3: AOBJN Q,LISTF2
18802 UCL7: MOVEI I,14 ;END DIR WITH FORMFEED AND EOF CHARS
18807 IFN NUNITS, LISTF5: AOJA Q,LISTF3
18809 ; DIRECTORY LISTING ROUTINES FOR MISC. DEVICES + CORE LINK
18811 NDLF: MOVEI TT,[ASCIZ /
18812 NON-DIRECTORY DEVICE/]
18816 ;DIRECTORY OF CORE LINK DEVICE
18817 UCL1: MOVSI Q,-NCLCH
18818 UCL6: SKIPN CLSYN(Q)
18834 UCL3: MOVEI TT,[ASCIZ /->/]
18845 UCL5A: AOBJN Q,UCL6
18851 MOVEI J,[SIXBIT /CLOSED/]
18852 SIXTYC: HRLI J,440600
18857 ; DIRECTORY LISTING ROUTINES FOR TTY
18859 TTYFLD: MOVEI TT,[ASCIZ /
18860 TTY UNAME JNAME CORE TOTAL IDX
18864 TTYF1: HRRE E,TTYSTS(Q)
18865 AOJE E,TTYF5 ;JUMP IF NOT IN USE
18869 MOVEI I,"D ;"DEVICE"
18874 TTYF11: MOVEI J,UNAME(E)
18886 TTYF3: SKIPE UNAME(B)
18890 TTYF4: ADDI B,LUBLK
18898 JRST [ HRRZ TT,SUPPRO(TT) ? JRST .-1 ]
18902 TTYF5: AOBJN Q,TTYF1
18903 TTYF99: MOVEI TT,[ASCIZ /FREE CORE /]
18908 MOVEI TT,[ASCIZ / OUT /]
18916 SIXTYA: PUSHJ P,OUTCS
18920 SIXTYP: ILDB I,DIRPT(A)
18928 MESP3S: SKIPA TT,[[ASCIZ / /]]
18929 MESPCR: MOVEI TT,[ASCIZ /
18931 MESPNT: HRLI TT,440700
18939 OUTC: SKIPL TT,SRN3(U) ;IF WANT 1 CHAR, RETURN WITH IT, SAVING ACS.
18940 JRST OUTC1 ;IF WANT WHOLE WORD, SEE IF WORD IS FULL.
18941 OUTC2: MOVEM E,SAVE(A)
18948 ADDI TT,(I) ;MERGE THIS CHAR (IN I) INTO WORD BEING ACCUMULATED.
18951 TLNE TT,774000 ;IF THE WORD IS FULL, RETURN TO DIRB.
18953 POPJ P, ;ELSE POPJ FROM OUTC, TO GET MORE CHARS.
18955 ;NUMERIC PRINTOUT ROUTINES FOR FILE DIRECTORIES.
18956 ;ALL CALLED WITH JSP B,. ALL TAKE ARG IN TT.
18958 ;PRINT NUMBER IN TT IN DECIMAL, RIGHT-ADJUSTED IN FOUR COLUMNS.
18959 G4SDPT: CAIL TT,1000.
18960 JRST GDPT ;IF IT NEEDS 4 DIGITS, JUST PRINT IT.
18962 CAIL TT,100. ;ELSE FIGURE OUT HOW MANY LEADING SPACES ARE NEEDED
18966 PUSHJ P,OUTCS ;AND PRINT THAT MANY.
18967 G4SDP2: PUSHJ P,OUTCS
18968 G4SDP1: PUSHJ P,OUTCS
18972 ;PRINT CONTENTS OF TT AS TWO OCTAL DIGITS.
18976 ;PRINT CONTENTS OF TT AS THREE DECIMAL DIGITS.
18977 G3DPT: IDIVI TT,100.
18982 G2DPT: IDIVI TT,10.
18983 G2DPT2: MOVEM I,NUM(A)
18991 ;PRINT ARG IN TT IN DECIMAL USING AS MANY DIGITS AS IT NEEDS.
18995 ;PRINT ARG IN TT IN OCTAL USING AS MANY DIGITS AS NECESSARY.
19015 ;ROUTINE TO CALL A DIRECTORY COROUTINE
19016 DIRCHR: MOVE E,SAVE(A)
19022 BLKPNA: MOVEI J,1(I)
19029 BLKPN2: MOVEI E,440500+I
19031 BLKPN1: ILDB E,DIRPT(A)
19040 BLKPN3: JUMPE J,GDPT
19042 BLKPN4: MOVE E,@DIRPT(A)
19051 UDUSR: REPEAT NUDCH,-1 ;-1 => FREE, ELSE UTAPE # IF UTAPE DIR, ELSE 0.
19052 UDUIND: BLOCK NUDCH ;IF DIR CHANNEL IN USE, HOLDS JOB # OF JOB USING IT.
19054 IRPS X,,DIRPC:DIRPT:NUM:ENDT:SAVB:SAVQ:UDSYSN:UUDPP:SAVE:
19060 DSKLST: BLOCK NUDCH ;0 LISTING UTAPE 1 NON-DIR DEVICE
19061 ;2 CORE LINK 3 2311
19062 ;NO BBLK SINCE VARIABLES ON NEXT PAGE
19064 SUBTTL UTC LEVEL INTERRUPT
19066 ;NO EBLK SINCE VARIABLES ON PREVIOUS PAGE
19068 UTCPDP: -LUTCP,,UTCP-1 ;UTC-LEVEL PDL
19070 UTACS: BLOCK 20 ;UTC-LEVEL AC SAVE
19072 IFE KS10P,[ ; On the KS10 we can take advantage of the Unibus interrupt
19073 ; vectoring scheme to dispatch quicker, so this code was
19074 ; reorganized somewhat.
19078 CONSO PI,1_<7-UTCCHN>
19079 JRST 4,. ;HARDWARE BUG ALLEGEDLY FIXED
19088 JRST PIPOS ;HAS CHNL >1
19096 IFN IMPP,[ ; See if it's an IMP interface interrupt
19102 TRNE TT,IMPLW+IMPHER+IMPERR+IMPOD+IMPID
19106 TRNN TT,70 ;CHECK PIA
19107 JRST UTCB2 ;DO NOT PROCESS IF NO PIA
19108 TRNE TT,FILW+FIDOWN+FIWASD+FIOD+FIID
19118 IFE KA10P, CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS
19126 TRNN TT,10 ;IF BIT IS ON IT IS INTERRUPTING - LET QINT HAVE IT
19132 TRNN TT,%HIDON+%HIATN ;INTERRUPTING HARDWARILY
19133 SKIPGE QGTBZY ;INTERRUPTING SOFTWARILY
19142 TRNN C,100 ;IF NOT JOB DONE
19143 TRZ C,30000 ; THEN DON'T BELIEVE PAR ERR OF EOF
19144 TRNN A,400 ;IF NEXT UNIT NOT ENABLED
19145 TRZ C,2 ;THEN TURN OFF NEXT UNIT FLAG
19146 TRNE C,440302 ; UNIT HUNG, ILLEGAL, BAD TAPE (UGH), LOAD NEXT UNIT, JOB DONE
19148 UTCBK2: SKIPN MGTBZY ; SOFT WARE CALL
19151 IFN NUNITS, JRST UTCB0
19160 MGEX: MOVSI U,UTACS
19168 UTCBRK: 0 ; Still EBLK'ed from previous page...
19174 CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS
19176 AOSN IMPBZY ;-1 if IMP wants a jump-start
19189 DSKEX: MOVSI U,UTACS
19193 ;;; Interrupt routines that are directly dispatched to by the KS10/Unibus
19194 ;;; interrupt kludge should do JSR UTCSAV as their very first instruction.
19195 ;;; The word before the JSR is expected to contain the interrupted PC.
19196 ;;; They should then exit through DSKEX just like everybody else.
19212 $INSRT SYSJOB ;SYSTEM JOB AND RELATED STUFF
19215 SUBTTL DCHNTB AND DCHNTC
19218 CHSPUR: BLOCK 8 ;NUM OF SPURIOUS INTS PER CH (ZERO = DCHK)
19221 IFE KS10P,[ ; KS10 doesn't even pretend to have devices.
19223 ;***** DCHNTB *****
19224 ;4.9 = KNOWN DEVICE
19226 ;4.7-4.4 PIA 2 SHIFT
19227 ;4.3-4.1 PIA 2 ACTIVE VALUE
19228 ;3.9 = PIA 2 MAY BE ZERO
19230 ;3.7-3.4 PIA 1 SHIFT
19231 ;3.3-3.1 PIA 1 ACTIVE VALUE
19232 ;2.9 = PIA 1 MAY BE ZERO
19233 ;2.8 = ALLOW USER DATAI, BLKI
19235 ;2.6 CONI, CONSO, CONSZ
19237 ;2.4 SPECIAL KL10 DEVICE, BLKI/BLKO ARE DATAI/DATAO TO A SECOND DEVICE REGISTER
19238 ;1.6-1.1=N, IF NON ZERO: IGNORE DEV UNLESS CONI BIT N-1 IS ON
19239 ;(IF DSDEV PRESENT)
19241 ;***** DCHNTC *****
19242 ;4.9 = SUSPICIOUS DEVICE
19243 ;4.8 = FOUND CLOBBERED
19244 ;4.7 = SUSPECTED OF CAUSING SPURIOUS INTS
19245 ;4.6-4.4 = CHANNEL CAUSING INTS ON
19246 ;3.9-3.1 = SUSPICION COUNT
19251 400200+APRCHN,,240000 ;0 APR
19255 400200+APRCHN,,250000 ;0 APR (ALLOW DATAI, "BLKI", CONI)
19256 SETZ 010000 ;4 PI (ALLOW NOTHING)
19265 DCHENT PAG,SETZ 240000 ;ALLOW DATAI, CONI, BUT NOT "BLKI"
19266 DCHENT CCA,SETZ ;ALLOW NOTHING
19267 ;XCTR of some of the instructions for these devices fails to relocate
19268 ;the address to user space, due to bugs in the hardware. Flush 'em.
19269 ; DCHENT TIM,SETZ 250000 ;ALLOW DATAI, "BLKI", CONI
19270 ; DCHENT MTR,[400201,,250000] ;INTERVAL TIMER PIA=1. ALLOW DI,BI,CI
19271 DCHENT TIM,SETZ ;20 ALLOW NOTHING
19272 DCHENT MTR,SETZ ;24 ALLOW NOTHING
19273 DCHENT 30,SETZ ;30 RESERVED
19275 IFN DSDP, DCHENT DSDEV,[REPEAT 2,400200+DSDCHN,,440000] ;20,24
19276 IFN DL10P,[ DCHENT DLB,SETZ 240000 ;60 DL10
19277 DCHENT DLC,[400200+TTYCHN,,240000] ;64 DL10
19279 IFN STKP, DCHENT STK,[400200+LPTCHN,,440000] ;70 STK
19280 IFN PTRP, DCHENT PTP,[400200+PCHCHN,,440000] ;100 PTP
19281 IFN PTRP, DCHENT PTR,[400200+PTRCHN,,440000] ;104 PTR
19282 IFN NOTYS, DCHENT TTY,[400200+TTYCHN,,40000] ;120 TTY
19283 IFN OLPTP, DCHENT OLPT,[400200+LPTCHN,,440000] ;124 OLPT
19284 IFN 340P, DCHENT DIS,[630600+DISCHN+SDCHN_9,,440001] ;130 DIS
19285 IFN E.SP, DCHENT DIS,[400200+DISCHN,,440000] ;130 E&S
19286 IFN KL10P, DCHENT DTE,[400200+IFE PDCLKP,[APRCHN].ELSE [TTYCHN],,240000] ;200 DTE20
19287 IFN RP10P, DCHENT DPC,[400200+DSKCHN,,440000] ;250 DPC
19288 IFN RH10P, DCHENT DSK,[400200+DSKCHN,,040000] ;270 RH10
19291 DCHENT DC,[400000,,440000] ;200 DC
19292 DCHENT UTC,[400200+UTCCHN,,440000] ;210 UTC
19293 DCHENT UTS,[SETZ 40000] ;214 UTS
19296 DCHENT DTC,[630600+UTCCHN+DCCHN_9.,,440000] ;320
19297 DCHENT DTS,[SETZ 40000] ;324
19299 ] ;END OF IFN NUNITS
19301 DCHENT MTC,[400230+MTCCHN,,440001] ;340 MTC
19302 DCHENT MTS,[SETZ 40001] ;344 MTS
19304 IFN MTYP, DCHENT MTY,[400200+TTYCHN,,40000] ;400 MORTON BOX
19305 ;420 SPACEWAR CONSOLES
19306 IFN DMIMP, DCHENT FI,[400230+NETCHN,,400000] ;424 DM IMP HARDWARE
19307 IFN NDAP, DCHENT 454,[400200,,760000] ;454 D/A
19308 IFN KAIMP, DCHENT IMP,[400000,,400001] ;460 AI-KA/ML-KA/MC-KL IMP
19309 ; HARDWARE THIS SAYS IMP
19310 ; HAS NO PIA BECAUSE IT
19312 IFN NLPTP, DCHENT NLPT,[400200+LPTCHN,,440000] ;464 NEW LPT
19313 IFN CH10P, DCHENT CHX,[400200+CHXCHN,,040000] ;470 CHAOSNET
19314 IFE KL10P, DCHENT 500,[400000,,240000] ;500 ML-KA, DM CALENDAR; AI-KA R CLK
19315 IFN KL10P&PDCLKP,DCHENT 500,[400200+APRCHN,,240000] ;500 MC-KL F CLK
19316 IFN ARMP, DCHENT TIPDEV,[400200+TIPBCH,,440000] ;504 ARM TIP BREAK
19317 IFE MCOND AIKA, DCHENT 510,[400000,,360000] ;510 ANOTHER D/A??
19318 ;DOES ANYONE KNOW WHAT DEVICE 510 IS??
19319 IFN RBTCP, DCHENT RBTCON,[400200+TABCHN,,440001] ;514 ROBOT CONSOLE
19320 IFN ARMP, DCHENT 564,[400200,,440000] ;564 ARM TACTILE SENSE
19321 IFN OMXP, DCHENT OMPX,[400200+OMPCHN,,440001] ;570 OMX
19322 IFN IMXP, DCHENT MPX,[SETZ 40001] ;574 IMX
19323 ;Comment this out since the AI-KA one is no longer on the bus
19324 ;IFN TK10P, DCHENT NTY,[400200+TTYCHN,,40000] ;600 NTY
19325 IFN NTYP, DCHENT NTY,[400200+NTYCHN,,40000] ; NTY FOR 11 KLUDGE
19326 IFN DPKPP, DCHENT DPK,[400200+TTYCHN,,40000] ;604 DATAPOINT KLUDGE
19328 DCHENT DC0,[400200+DSKCHN,,40000] ;610 DC0
19329 DCHENT DC1,[400000,,] ;614 DC1
19331 IFN VIDP, DCHENT NVDX,[REPEAT 4,400200+NVDCHN,,440001] ;620-634 BAT
19332 IFN PLTP, DCHENT PLT,[400200+PLTCHN,,440000] ;654 PLT
19333 DCHENT 704,[400000,,440000] ;704 ???
19335 DCHENT CLK1,[400200,,240000] ;710 CLK1
19336 DCHENT CLK2,[SETZ 40000] ;714 CLK2
19341 DCACS: BLOCK 20 ;SAVE ACS
19342 CCSDEV: 0 ;+ => SOME SUSPICIOUS DEVICES
19345 DCHK: 0 ;TO CALL FROM DDT
19357 ;CHECK FOR CLOBBERED DEVS, CALL WITH JSP E,
19358 CHECK: JSP H,DCSTUP
19359 CHECK1: SKIPL TT,DCHNTB(I)
19360 JRST CHECK4 ;UNKNOWN DEVICE
19370 CHECK2: JSP H,DCCONI
19371 TLNN TT,200 ;SKIP IF PI TO TEST
19373 LDB T,[250400,,TT] ;GET SKIP
19377 LDB Q,[220300,,TT] ;GET CHANNEL
19381 CHECK3: LSH TT,-9 ;SHIFT TO PIA2
19384 CHECK5: JUMPN B,CHECKL ;JUMP IF NONZERO AND WRONG
19385 TRNE TT,400000 ;SKIP IF CAN NOT BE ZERO
19386 JRST CHECK3 ;ZERO OK
19389 CHECK4: ADD A,[400,,] ;INCREMENT DEVICE CODE
19392 BUG PAUSE,[BITS ],OCT,C,[MAY BE STUCK ON IN I/O BUS]
19394 SKIPE W ;SKIP IF NO TROUBLE DETECTED
19398 DCSTUP: MOVE A,[CONI B] ;SET UP
19406 SKIPL DCHNTC(I) ;SKIP IF DEVICE ALREADY SUSPICIOUS,SAVES FIRST SUSPICIOUS
19407 HRRM B,DCHNTC(I) ;STORE AWAY CONI
19410 CHECKL: JSP H,DCSAOS
19411 MOVSI T,600000 ;CLOB
19415 DCSAOS: MOVE D,A ;MAKE A CONO
19417 SKIPL T,DCHNTB(I) ;SKIP IF KNOWN DEV
19418 JRST DCSAS2 ;JUST RESET UNKNOWN TO ZERO
19419 TLNE T,200000 ;SKIP IF NO PIA2
19420 TLNE T,400 ;SKIP IF PIA2 CAN NOT BE ZERO
19422 LDB TT,[330300,,T] ;GET PIA2
19423 LDB T,[360400,,T] ;GET PIA2 SHIFT
19425 IOR D,TT ;ADD CORRECT CANNEL TO CONO
19426 MOVE T,DCHNTB(I) ;SKIP IF NO PIA1
19427 DCSAS1: TLNE T,200 ;SKIP IF PIA1 CANNOT BE ZERO
19430 LDB TT,[220300,,T] ;GET P1A 1
19431 LDB T,[250400,,T] ;GET PIA 1 SHIFT
19432 LSH TT,(T) ;OR IN PIA 1
19437 AOS W ;THIS MAY BE THE CAUSE OF OUR TROUBLES
19442 SOJA T,[JRST 4,.+1] ;LOSEY LOSEY
19443 DPB T,[221100,,DCHNTC(I)]
19446 ;CHANNEL IN J SPURIOUS INTERRUPT ON, CALL WITH JSP E,
19455 SPUR2: SKIPGE TT,DCHNTB(I)
19462 DPB J,[360300,,DCHNTC(I)]
19463 SPUR4: ADD A,[400,,]
19473 DEFINE UBINT VEC,-REST
19475 IFN .VEC.&3, .ERR Bogus interrupt vector: VEC
19477 IFL .VEC.-.MIN., .MIN.==.VEC.
19478 IFG .VEC.-.MAX., .MAX.==.VEC.
19489 CONC [UB]\NUBIDV,NM==:<.UBA.,,.VEC.>
19490 CONC [UBINT .VEC., JSR UB]\NUBIDV,BK
19495 ;;; Interrupt table for Unibus Q.
19503 UBINT PHVEC, JSR DSKBRK ; RH11 FOR DISK
19505 UBAQIB==:UBAQIT-.MIN.
19509 ;;; Interrupt table for Unibus I.
19517 IFE TM03S, UBIDV 224 ; Tape
19518 UBIDV 300 ; NI1010 In
19519 UBIDV 304 ; NI1010 Out
19522 UBIDV 340+<10*<DZ11NB+.RPCNT>> ; DZ In
19523 UBIDV 344+<10*<DZ11NB+.RPCNT>> ; DZ Out
19527 UBINT %TMVEC, JSR MGHBRK ;RH11 FOR TAPE
19531 UBINT 340+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,RB ; DZ receive
19532 UBINT 344+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,XB ; DZ transmit
19536 UBINT %LHVEC, JSR IMPIBK ;IMP Input side break
19537 UBINT %LHVEC+4, JSR IMPOBK ;IMP output side break
19541 UBINT 270, JSR CHXBKH ; Usual Chaosnet vector
19542 UBINT 230, JSR CHXBKH ; Except some interrupt here instead
19545 UBAIIB==:UBAIIT-.MIN.
19548 ;;; Assignment of pages in Unibus pager for DMA devices.
19549 ;;; All of the Q UBA is statically assigned. The lower half of the I
19550 ;;; UBA is statically assigned, while slots in the upper half of the I UBA
19551 ;;; are assigned dynamically by the UBAASL routine and freed by the
19552 ;;; UBAFSL routine below.
19554 ;;; Note that static pages are 2000 PDP-10 words long (ITS sized) rather
19555 ;;; than 1000 (DEC sized). Each page here thus occupies -two- locations in
19556 ;;; the Unibus pager. There are 32. such pages on the Q Unibus and 16.
19557 ;;; such pages on the I unibus.
19559 ;;; Slots handed out by UBAASL are good for mapping 1000 PDP-10 words
19560 ;;; (one DEC page, and coincidentally the size of a network buffer).
19561 ;;; The number obtained from UBAASL is a direct index into the UBA
19562 ;;; paging RAM, and will range from 32. to 63.
19564 ;;; This two different page size thing is all a mess and I should fix it
19568 QUBPG==:5 ; Chosen at random.
19574 IUTPG==:5 ;Magtape IO page. well, 5 worked last time
19578 IUIMPG==:6 ;IMP Data transfer page
19584 UBAIFS: 777777777760 ;Slot map, bit on if free
19587 ; Allocate a UBA I slot
19588 ; Return +1, A/ slot index
19595 POP P,B ;Clean up for no good reason
19596 BUG HALT,[Out of UBA slots]
19600 LSH A,B ;A/ bit to snarf
19604 ADDI A,32. ;First dynamic slot
19608 ; Deallocate the UBA slot in A
19609 ; A/ UBA index to free. Bashes A,TT
19612 BUG HALT,[Bad UBA index],OCT,A ;Paranoid for now
19626 -1 ; User or -1 in -6(I)
19628 0 ; Saved I in -4(I)
19629 CONC UB,\.RPCNT,BK:
19634 CONC UB,\.RPCNT,DV:
19635 JRST 12,@<CONC UB,\.RPCNT,BK>
19636 CONC UB,\.RPCNT,NM ; Name in 1(I)
19637 IFE .RPCNT, LUBIDV==:.-UBIDVS
19646 UBIBRK: AOS UBICNT(I)
19653 UBIBK9: EXCH U,UBIUSR(I)
19662 UBIO: MOVEI T,NUBIDV
19664 UBIO1: MOVEI I,LUBIDV(I)
19667 JUMPLE T,OPNL4 ; FILE NOT FOUND
19671 JRST OPNL23 ; FILE LOCKED
19692 UBIRCH: MOVE B,UBINAM(A)
19696 UBICL: SETOM UBIUSR(A)
19701 SUBTTL OVERHEAD METERING ROUTINE
19706 ;TABLE OF OVERHEAD REGIONS. ENTRY IS SIXBITNAME,,PC ? COUNT
19707 0 ;COUNTS STUFF BEFORE FIRST OVHMTR MACRO
19710 0 ;COUNTS USER-MODE PC'S
19713 ;COME HERE ON PI CHANNEL 1 EVERY 39 MILLISECONDS
19718 CONO TIM,060000+3900. ;CLEAR DONE
19719 EXCH T,OVHBRK ;GET PC INTERRUPTED OUT OF
19720 TLNE T,%PSUSR ;ONLY METER IF EXEC MODE
19725 OVHBR1: HRRZ B,OVHTBL(A)
19726 AOBJN A,.+1 ;2-WORD ENTRIES
19727 CAIG B,(T) ;SKIP IF PC LIES IN PREVIOUS REGION
19729 SKIPGE A ;IN CASE T = 777777
19730 AOS OVHTBL-2(A) ;AOS PREVIOUS REGION'S COUNT
19733 OVHBRX: AOS OVHTBL+LOVHTB-1 ;AOS COUNT OF USER-MODE PC's
19739 RDPCST=DATAI 14, ;INSTRUCTIONS FOR PC SAMPLING TABLE
19742 ;TABLE OF OVERHEAD REGIONS. ENTRY IS PC,,SIXBITNAME
19743 OVHTB1: 0,,'LOW ;LOWER FENCE
19745 377777,,'USR ;UPPER FENCE
19747 REPEAT <1_<36.-<.LZ <LOVHTB-1>>>>-LOVHTB, 377777,,-1 ;PAD TO POWER OF TWO SIZE
19751 OVHTB2: BLOCK LOVHTB ;CORRESPONDING COUNTS (LAST IS FOR USER MODE)
19753 OVHCNT: 28. ;COUNTER TO SLOW THINGS DOWN TO CUT OVERHEAD
19755 LOVHPC==100 ;64 SAMPLES SHOULD BE ENOUGH
19756 OVHPCS: BLOCK LOVHPC
19760 ;CALCULATE OVERHEAD USING PC SAMPLE TABLE
19762 OVHCLK: SOSL OVHCNT ;TIME TO DO IT YET?
19763 JRST OVHCL9 ;NO, IGNORE THESE SAMPLES
19764 MOVEI A,28. ;SEE ONLY ONE SAMPLE OUT OF EVERY 29 ON AVERAGE
19765 MOVEM A,OVHCNT ;SO TIME SPENT IN THIS ROUTINE IS NOT EXCESSIVE
19766 RDPCST C ;SEE HOW FULL THE PC SAMPLING TABLE IS
19767 HRLOI C,-OVHPCS-1(C)
19768 EQVI C,OVHPCS ;AOBJN POINTER TO SAMPLES ACTUALLY TAKEN
19769 JUMPGE C,OVHCL9 ;NONE
19770 CAMGE C,[-LOVHPC,,OVHPCS]
19771 JRST OVHCL9 ;BOGUS AOBJN POINTER, MAYBE PCST NOT TURNED ON
19772 OVHCL1: MOVE A,(C) ;NEXT SAMPLED PC
19773 TLNE A,%PSUSR ;ONLY SEARCH TABLE IF EXEC MODE
19774 JRST OVHCL8 ;ALL USER MODE PC'S ARE COUNTED IN LAST BUCKET
19775 HRLO A,A ;-1 IN RH IS GREATER THAN ANY SIXBIT
19776 MOVEI B,1_<35.-<.LZ <LOVHTB-1>>> ;HALF THE SIZE OF THE TABLE
19777 REPEAT <36.-<.LZ <LOVHTB-1>>>,[ ;LOG SEARCH
19778 CAMG A,OVHTB1(B) ;NOT CAMGE BECAUSE OF PADDING AT END
19779 SUBI B,1_<35.-.RPCNT-<.LZ <LOVHTB-1>>>
19780 ADDI B,1_<34.-.RPCNT-<.LZ <LOVHTB-1>>>
19782 LOC .-1 ;OPTIMIZE OUT ADDI B,0
19784 OVHCL8: AOS OVHTB2+LOVHTB-1
19786 OVHCL9: WRPCST [-LOVHPC,,OVHPCS] ;TURN ON / RESTART PC SAMPLING
19790 ;HERE IS A TABLE OF REGISTERED 3-LETTER OVERHEAD REGION CODES
19792 ;ALC - ALLOCATE CORE PAGE FRAME
19793 ;CHx - CHAOSNET STUFF (VARIOUS VALUES OF x)
19794 ;FLT - MISCELLANEOUS FAULTS
19795 ;IMP - ARPANET INTERRUPT (NOT STYNET)
19796 ;LOW - LOW CORE, BEFORE FIRST OVHMTR MACRO & PCS IN UPPER HALF OF EXEC SPACE
19797 ;NET - ALL NETWORKS, ALL PI LEVELS, NOT OTHERWISE ACCOUNTED FOR
19800 ;QIN - DISK INTERRUPT LOW LEVEL
19801 ;QSC - DISK INTERRUPT HIGH LEVEL, DISK SCHEDULER
19802 ;SC1 - SCHEDULER 1 - ENTRY
19803 ;SC2 - SCHEDULER 2 - SEARCH
19804 ;SC3 - SCHEDULER 3 - EXIT
19805 ;SC4 - SCHEDULER 4 - UNSWAPBLOCK
19807 ;SWF - SWAP FIND NEW USER (SWAPOUT SCHEDULER)
19809 ;SWS - SWAP SCHEDULER
19811 ;TTI - TTY INPUT INTERRUPT LEVEL
19812 ;TTO - TTY OUTPUT INTERRUPT LEVEL
19813 ;TTY - MISC TTY CODE
19815 ;UUO - UUO LEVEL, MISCELLANEOUS ROUTINES, AND TOTAL MISCELLANY
19816 ;WS - WORKING SET & SWAP-BLOCK ENTRY CODE
19818 SUBTTL PC LSR TEST FEATURE
19820 ;CALLED BY PCLT MACRO
19831 PCLX: CAIA ;PATCH IN OTHER CHECKS (SHOULD JRST POPUJ TO IGNORE)
19832 MOVE U,USER ;PATCH ROUTINE MAY CLOBBER U
19834 JRST PCLT1 ;FOUND PLACE, CAUSE PCLSR
19837 JRST POPUJ ;NOT MARK (NOT AT RIGHT LOCN)
19838 HRRO U,USER ;4.9 U FLAG
19839 PCLT1: PUSH P,A ;COMPUTE HASH ADR OF RETURNS ON PDL
19843 JUMPL A,PCLT1A ;SYS JOB'S PDL?
19846 MOVEI A,USRPDL(A) ;GET START OF USERS PDL IN A
19858 PCLT2: CAIGE A,-2-3(P)
19860 MOVE A,PCLHT ;COMPUTED HASH
19861 JUMPGE U,PCLT4 ;GOING TO PCLSR HERE, STORE HASH AS MARK FOR NEXT TIME
19865 JRST PCLT6 ;IN HOLD MODE, PCLSR HERE
19866 SETOM PCLNXT ;FOUND MARK, PCLSR NEXT TIME
19872 PCLT4: MOVEM A,PCLHSH ;STORE HASH FOR NEXT TIME
19875 PCLT6: CONO PI,CLKOFF
19878 CAIN B,1 ;DON'T ^Z.
19887 PCLME: PUSHJ P,UFLS
19890 PCLME1: PUSHJ P,PCLSR
19896 JRST 4,. ;TEMP MODIFY END CHECK IF WANT TO WIN FOR SYS JOB
19898 SUBTTL ILLUO NON-RELEVANT SYSTEM CALLS
19940 ANETIM==OPNL1 ;NO SUCH DEVICE ERROR FOR SYMBOLIC SYSTEM CALLS.
19945 ANETAC==CPOPJ ;MAKE OLD UUOS FAIL
19958 ;Here generate the table for the BUG macro. Note that entries for
19959 ;bugs in the initialization code will appear here also! That's
19960 ;why we have the kludgey add 10
19961 BUGTAB: BLOCK LBUGTB+10
19963 0 ;Marks end of table
19966 HSYSCD:: ;HIGHEST SYSTEM CODE
19968 SUBTTL RANDOM STORAGE
19971 SCHHP: SCHHB ;PNTR TO SCHED HIST BUFFER
19972 SCHHB: BLOCK SSCHDB ;SCHED HIST BUFFER
19974 ;4.8 =1 QUANT TERMINATED BY PG FAULT
19975 ;4.7-3.8 LENGTH OF RUN TIME IN 512 USEC UNITS
19976 ; MUST ACCOMODATE 150 MILLISECOND QUANTA
19977 ;3.7-3.1 USER ("NUMERIC INDEX)
19978 ;RH PC QUANT STARTED AT
19981 SWPHTB: BLOCK SWPHTL ;SWAPPING HISTORY TABLE
19982 ;4.9-4.8 EVENT: 0=START LOADING, 1=FINISH LOADING,
19983 ; 2=SWAP OUT, 3=SWAP BLOCK
19984 ;4.7-3.9 WORKING SET SIZE MINUS ONE (0=0)
19985 ;3.8-3.1 USER NUMBER
19987 BLOCK SWPHTL ;CORRESPONDING UTRNTM
19991 PGIHTB: BLOCK PGIHTL ;PAGE-IN HISTORY TABLE
19992 ;4.9 1 IF JOB WAS LOADING
19993 ;4.7-3.9 USER VIRTUAL PAGE NUMBER
19994 ;3.8-3.1 USER NUMBER
19996 BLOCK PGIHTL ;CORRESPONDING UTRNTM
19999 SCHMNY: 0 ;0 DO FULL SCHEDULE, -1 NEXT "SCHEDULE" SHOULD LOOK IN SCHBTB
20000 SCHBNJ: 0 ;NUMBER OF VALID ENTRIES IN SCHBTB
20001 SCHBTB: BLOCK SCHBLN ;RUNNABLE JOB BUFFER
20002 SCHBPR: BLOCK SCHBLN ;PRIORITIES OF THOSE
20003 NSCHOV: 0 ;COUNT OF BUFFER OVERFLOWS
20005 ;TRANSLATION ENTRY _ T
20006 ;TRANLK(T) IS MODE,,NEXT ENTRY
20007 ;MODE IS 0 IF ENTRY ON FREE LIST, ELSE NOT 0, AND
20008 ;BITS 3.1 => INPUT, 3.2 => OUTPUT, 4.9 => ATOMIC TRANSLATION (DON'T RETRANSLATE)
20009 ;NEXT-ENTRY IS -1 FOR NIL, ELSE IDX REL TRAN!X
20010 ;TRANID(T) THRU TRANIS(T) - FROM-NAMES
20011 ;TRANOD(T) THRU TRANOS(T) - TO-NAMES
20013 TRANLK: REPEAT SIOMT,,,.RPCNT-1 ;GENERATE 1ST WDS, LINKED TOGETHER.
20014 TRANID: BLOCK SIOMT
20015 TRANI1: BLOCK SIOMT
20016 TRANI2: BLOCK SIOMT
20017 TRANIS: BLOCK SIOMT
20018 TRANOD: BLOCK SIOMT
20019 TRANO1: BLOCK SIOMT
20020 TRANO2: BLOCK SIOMT
20021 TRANOS: BLOCK SIOMT
20023 TRANFL: SIOMT-1 ;TRANSL ENTRY FREE LIST.
20024 TRNCNT: 0 ;NUM ENTRIES IN USE.
20025 TRNREF: 0 ;NUM. READ-ONLY ACCESSES TO TRANSL LISTS.
20026 TRANSW: -1 ;SWITCH FOR WRITE REF.
20029 IFE SCHBLN, U0P: 0 ;PRIORITY OF BEST USER SO FAR
20031 USER: -1 ;USER # OF CURRENT LOSER
20033 LITM: 0 ;LAST TIME SYS INCREASED CORE
20035 SLGIV: BLOCK 3 ;LOGIN
20037 SETSLC: 0 ;SETLOC VARIABLES
20041 SWUNAM: 0 ;SYS WRITE VARIABLES
20048 DMON: SIXBIT /DRAGON/
20049 -1 ;USER INDEX OF DEMON JOB
20051 NQMFWR: 0 ;COUNT OF FILES WRITTEN ON .MAIL. - FOR MAILER DEMON TO HANG ON.
20053 NXGPFW: 0 ;COUNT OF FILES WRITTEN ON .XGPR. - FOR XGPSPL
20057 ;VARIABLES FOR DEAMON CODE HACK
20060 IFN TTLPTP,TPLFLG: 1 ;FLAG FOR TPL
20062 DMTLL==4 ;LEGNTH OF DEAMON TABLE SLOT
20063 NODEAM==20. ;NUMBER OF SLOTS
20064 DMLNG==NODEAM*DMTLL
20067 0 ;MAIN PROG SWITCH FOR DEMON
20068 REQCNT: 1 ;COUNT OF REQUEST'S FOR SYS JOB
20069 DMTPTR: 0 ;POINTER FOR DEMSIG TO DEM TBL, AN INDEX INTO IT, TAKEN MODULO DMLNG
20070 DMLSEX: -DMLNG,,0 ;POINTER TO DEAMON TABLE AOBJN
20071 DEMCNT: <NODEAM.-1> ;AMOUNT OF SLOTS REMAINING IN THE TABLE
20074 0 ;SLOT FOR NON DEAMON LOAD VIA NUJBST
20076 DMOBLK: SIXBIT / SYS/
20078 0 ;BLOCK USED BY SYSTEM JOB TO CHECK OPEN
20080 ;DEAMON TABLE--CONSISTS OF SLOTS OF FOUR WORDS FOR EACH DEMON
20081 ;WORD 1 CONTAINS ITS SIXIT NAME
20082 ;WORD 2 CONTAINS THE USER INDEX,-1 IF LOADING, 0 IF DOWN
20083 ;WORD 3 2 QUANTITIES IN 18 BIT 2'S COMPLEMENT--
20084 ;LH ALWAYS > = 0, IF 0 ONLY TAKES EXPLICIT REQUESTS IN > 0 A REQUEST
20085 ;RH CONTAINS THE NUMBER OF REQUESTS PENDING FOR THE DEAMON
20086 ;FOR THE DEAMON WILL BE GENERATED EVERY 2 MINUTES
20087 ;WORD 4 CONTAINS THE TIME TILL THE NEXT IMPLICIT REQUEST WILL BE GENERATED.
20090 DMTTBL: SIXBIT /DEMSTR/
20095 BLOCK <NODEAM-1>*DMTLL
20097 TIMOFF: -1 ;TIME SINCE MIDNIGHT IN HALF SECONDS ("TIME IN DSK FORMAT").
20098 QDATE: -1 ;DISK FORMAT DATE: -1 => SYSTEM DOESN'T KNOW DATE, ELSE
20099 ;BITS 3.1-3.5 HAVE DAY OF MONTH, 3.6-3.9 HAVE MONTH OF YEAR,
20100 ;4.1-4.7 HAVE YEAR MOD 100. .
20101 QDATEI: -1 ;-1 => SYSTEM DOESN'T KNOW DATE, ELSE
20102 ;DATE AND TIME THE DATE AND TIME WERE FIRST DETERMINED, IN DSK FORMAT.
20103 PDYTIM: -1 ;TIME SINCE BEGINNING OF YEAR IN HALF-SECONDS (BACKUP TO PDCLK)
20104 FYEAR: 0 ;YEAR (E.G. 1969.)
20105 PDTIME: 0 ;NON-ZERO => OFFSET FOR PDCLK
20106 ;WHEN SUBTRACTED FROM PDCLK DATAI GIVES # PD-UNITS SINCE
20107 ; BEGINNING OF YEAR
20108 ;ONE SECOND = 60. PD-UNITS
20109 ; Also contains similar offset for KS-10 clock in 60ths.
20110 LPDTIM: -1 ;LAST PD CLK TIME, -1 IF PD CLK NOT RUNNING OR JUST PDSET'ED
20112 SUPCOR: 0 ;CONTROLS SYS JOB, SEE SYSDTB, SCOR, ETC
20113 ;EACH BIT REQUESTS ONE FUNCTION IF SET.
20114 SUPCOP: SCLDAT+IFN DEMON,[SCLDMN],,SCRCKS
20115 ;THIS WORD OR'D INTO SUPCOR EVERY SECOND.
20116 SCKPHS: 0 ;USED FOR COUNTING EVERY SECOND 1/2 SECOND CLOCK
20117 ;TO SET SUPCOP BITS EVERY SECOND
20118 SYSITM: 0 ;TIME SYS JOB LAST STARTED WAITING ON SUPCOR
20119 LNETIM: 0 ;TIME AT WHICH NETWORK WAS LAST BROUGHT UP
20120 RSWTIM: 1 ;Time (in DSK format) when last checked system resources.
20122 MXPARS==10. ;MAX # PAR ERRS TO PRINT OUT
20123 PARPG: BLOCK 8 ;STORAGE OF PAGE MAP WHILE HACKING PARITY ERROR CHECK
20124 PARCNT: 0 ;# OF PAR ERROR ENTRIES IN TABLE
20125 PARCON: BLOCK MXPARS ;CONTENTS OF BAD PARITY LOCATIONS
20126 PARADR: BLOCK MXPARS ;ADDRESSES OF BAD PARITY LOCATIONS
20127 PARAND: -1 ;QND OF ALL BAD WORDS
20128 PARIOR: 0 ;IOR OF ALL BAD WORDS
20129 PARAAN: -1 ;AND F ALL BAD ADDRS
20130 PARAOR: 0 ;IOR OF ALL BAD ADDRS
20132 PARPFW: 0 ;PAGE FAIL WORD
20133 PARERA: 0 ;ADDRESS OF PAR ERR
20134 PARWRD: 0 ;BAD DATA
20137 PARRSN: 0 ;0 => PAR ERR PAGE FAULT IN PROG
20138 ;-1 => PAR ERR INTERRUPT; NEEDN'T STOP
20141 PARDIE: 0 ;-1 => FATAL PARITY ERROR
20142 TPLSWP: 0 ;-1 => USE OLP FOR TPL
20144 PDP6UP: 0 ;0 => PDP6 IS DOWN. (AS USUAL)
20148 ECCADR: 1,,777760 ;ECC HISTORY STARTS HERE
20149 ECCLEN==16. ;16 LOCATIONS OF ECC HISTORY
20150 ECCIDX: 0 ;LAST LOCATION ACCESSED
20153 TEN11F: 0 ;0 -> NORMAL
20154 ;-1 -> COMPLETELY IGNORE 10-11 INTERFACE
20155 ; 1 -> RESET 10-11 INTERFACE, OTHERWISE IGNORE
20156 T11ERC: 0 ;COUNT OF CONTROL PAGE RAM ERRORS
20157 T11CCN: 0 ;CORRECT CONTENTS
20158 T11WCN: 0 ;WRONG CONTENTS
20159 T11PG: 0 ;PAGE # INVOLVED
20162 TVBLAD: 17742 ;VIDEO BUFFER TO FLASH WHEN JOB RUNNING (PDP10 VIDEO BUFFER ADDR)
20165 DL10F: -1 ;-1 NORMAL, 0 => 11 DOWN
20166 DL10HC: 0 .SEE TTDLBRK ;NUMBER OF LOOPS WHEN HUNG UP WAITING FOR 11 TO GOBBLE BUFFER
20169 DLSRCH: 0 ;-1 => DON'T RUN ANY USER BUT THE ONE ALREADY RUNNING
20170 ;(UNLESS WE TAKE A PAGE FAULT).
20171 CPDLP: -CPDLL,,LCPDL-1 ;CLOCK PDL POINTER
20172 LCPDL: BLOCK CPDLL ;CLOCK INT LEVEL PDL
20174 CLKBSW: 0 ;READ SWITCHES INTO HERE TO DECIDE WHETHER TO GO TO DDT.
20176 CLROOT: SSLCKB ;CLOCK QUEUE ROOT
20178 SSLCKB: SCLKI ;SLOW CLOCK RQ BLOCK
20179 .+2 .SEE CHA5CK ;OR 15SCLB
20183 CHA5CK: 5*60.-SCLKI ;5-SECOND CLOCK FOR CHAOS NET
20184 15SCLB ;NOTE INITIAL TRIGGERING OF CLOCKS BELOW DELAYED AN EXTRA 5 SECONDS
20188 15SCLB: 15.*60.-SCLKI
20189 .+2 .SEE PRVCLB ;OR VSLCKB
20193 PRVCLB: NPVSEC*60.-15.*60.-SCLKI ;PRIVILEDGED USER VARIABLE CHECK
20198 VSLCKB: 0 ;VERY SLOW CLOCK BLOCK
20199 CLINFB ;CAUSE SLOW CLOCK TICK SOON AFTER SYS COMES UP
20202 CLINFB: 377777,,-1 ;ABOUT 15 YEARS
20207 CCLKB: 0 ;FOR CHESS CLOCK HACK
20214 IINTIC==60. ;# TWO-MINUTE TICKS PER VERY VERY SLOW CLOCK TICK (2 HOURS)
20215 IINCNT: 0 ;# TWO-MINUTE TICKS REMAINING UNTIL NEXT VERY VERY SLOW CLOCK TICK
20219 WHOCLB: 0 ;WHO LINE TIMER
20224 UTTYS: BLOCK MXCZS ;RING BUFFER FOR JOBS TO BE STARTED
20229 PCLDBM: 0 ;.NE. 0 ACTIVATE PC LSR DEBUG MODE
20230 ;1 => ADVANCE PLACE WHERE PCLSR
20231 ;2 => ADVANCE BUT DON'T ^Z.
20233 PCLUSR: -1 ;USER PCLSR MODE ACTIVE FOR
20234 PCLL: 0 ;PLACE WHERE LAST PCLSR TESTED
20235 PCLHSH: 0 ;HASH OF RETURNS ON PDL AT LAST PLACE TRAPPED OUT OF
20236 PCLNXT: -1 ;-1 => FROB NEXT TIME IN ADVANCE MODE
20238 PCLIDX: 0 ;INITIALIZE PCLT TO THIS (SET TO LOOP COUNT IF NECESSARY)
20240 CORRNR: 0 ;LAST USER TO RUN CORE
20241 SJSPG: 0 ;-1 => LAST FREE PG RESERVED FOR SYS JOB; DON'T GIVE IT TO ANYONE ELSE.
20242 UTBFLF: 0 ;-1 SIGNAL TO TRY TO FLUSH I/O BLOCKS
20243 UFDFLF: 0 ;-1 SIGNAL TO TRY TO FLUSH 2311 UFDS
20245 UFLSF: 0 ;FLAG FROM UFLS TO CLKBRK
20246 CLKFL1: 0 ;FLAG COUNTER TO CONTROL CLOCK LEVEL
20247 SCHFLG: 0 ;SCHEDULE TIMER (DIVIDES 60 CPS)
20248 27FCLK: 0 ;-1 IF FAST CLOCK SHOULD CALL TYP27S
20249 SCITM: 0 ;SEE SYSEX, SYSDEC
20251 SYSCKP: -LTSTB,,TSTB ;SYSTEM CHECKSUMS CHECKER POINTER
20252 SYSPDP: -LSYSP,,SYSPDL-1 ;PDL POINTER FOR SYSTEM JOB
20253 SYSPDL: BLOCK LSYSP ;PDL FOR SYS JOB
20254 IFN TPLP,TPLBUF: BLOCK TPLBSZ ;PSEUDO LPT BUFFER - MUST BE ABOVE SUACS
20255 IFN TPLP\DEMON,TPLFNO: SIXBIT /!/ ;UNIQUE TPL FIRST FILE NAME
20256 SJCFF: 0 ;-1 WHEN SYS JOB IN PROCESS OF FLUSHING CORE
20257 ;AVOIDS TIMING ERROR DUE TO HUSRAD NOT REALLY REFLECTING WHAT ITS GOING TO BE
20258 SLSWPR: 0 ;STORE SYS JOB'S LSWPR WHILE HACKING UUOS
20262 IFN TPLP, TPLFN: 2,,(SIXBIT /TPL/)
20264 KLEBCC: 0 ? <1_23.>/<4*25./2> ;EBOX COUNTER CONVERSION TO 4 USEC CONSTANT (FOR 25 MHZ)
20265 ;RESULT IS IN AC+2 AFTER DMUL AC,KLEBCC
20266 KLMBCC:; 1 ? 110000,, ;FOR CONVERTING AN MBOX COUNT TO THE TIME (IN EBOX UNITS)
20267 ;IT SUPPOSEDLY AMOUNTS TO.
20268 ;WE ASSUME 102.5 NANOSEC OD WAITING TIME PER MBOX CYCLE
20269 ;THIS NUMBER IS 102.5/80.
20270 ;DMUL AC,KLMBCC PUTS ANSWER IN AC+1, AC+2
20271 ;WITH BINARY POINT BETWEEN THE WORDS.
20272 0 ? 0 ;M8538 MODIFIED SO EBOX COUNTER CONTINUES TO COUNT
20273 ;DURING MBOX WAIT TIME, SO SET KLMBCC = ZERO.
20276 MTRUSR: -1 ;USER TO WHOM PERF CTR IS ASSIGNED
20277 MTRJOB: -2 ;USER BEING MEASURED BY PERF CTR,
20278 ;OR -1 => NULL JOB, OR -2 => ALL JOBS.
20280 PAEON: 0 ;SELECTED PERF CTR ENABLE WORD
20281 PAEOFF: 0 ;DISABLE THE PERF CTR (WHEN WRONG JOB IS RUNNING)
20282 STPERF: 0 ? 0 ;VALUE OF PERF COUNTER AT START OF QUANTUM
20283 STEBOX: 0 ? 0 ;VALUE OF EBOX COUNTER AT START OF QUANTUM
20284 STMBOX: 0 ? 0 ;VALUE OF MBOX COUNTER AT START OF QUANTUM
20292 IFN NLPTP, NTNLPL: 0 ;NUMBER OF TIMES NLPT LOST PIA
20296 TSTB: REPEAT CKNUM,CONC CK,\.RPCNT,
20299 CKSUMS: BLOCK CKNUM
20300 CKXORS: BLOCK 36. ;XOR OF ALL ADRS IN PURE AREAS IN SYS WITH CORRESP
20302 TCKXOR: BLOCK 36. ;TEST XORS
20305 SYSCLB==SSYSCL_-10.+IFN 1777&SSYSCL,1
20308 AC1PTR: UUOACS ;-> WHERE AC BLOCK 1 IS CURRENTLY LOADED FROM
20311 USRHI: 0 ;HIGHEST LOC USED FOR USER STORAGE
20313 SUBTTL LOCATIONS TO PATCH WHEN DEBUGGING
20315 SYSDBG: 0 ;0 NORMAL TIMESHARING
20316 ;+ GIVE "ITS BEING DEBUGGED" MESSAGE
20317 ;-N ALSO ALLOW ONLY CONSOLE #N AND T00 TO CTRL/Z.
20318 ;-512.*N => ALLOW ONLY HOST N TO TELNET IN.
20319 ;-512.*N+M => ALLOW HOST N AND TTY M.
20320 DMLLDF: -1 ;-1 => START DAEMONS AUTOMATICALLY, 0 DON'T.
20321 IFN DEMON,DMNFLG: 1 ;1 => START DM-STYLE DAEMONS, 0 DON'T.
20323 IFN NETP,NETUSW: 0 ;-1 => DON'T START UP A JOB IN ANSWER TO A CONNECT REQUEST
20324 ;FROM A HOST OTHER THAN OURSELVES
20326 SYSCN: SYSCON ;NUMBER OF TTY TO RECEIVE SYSTEM CONSOLE OUTPUT.
20327 ;-1 TO THROW IT AWAY. YOU CAN CHANGE THIS ANY TIME.
20329 SUPPLG: 0 ;-1 => SUPPRESS LOGIN/LOGOUT MESSAGES ON SYSTEM CONSOLE.
20331 IFE KS10P,[ ; KS has no lights.
20332 MIPGDS: 0 ;-1 => DON'T LIGHT LIGHTS (KA HAS HARDWARE SWITCH, KL NEEDS
20337 USFHLT: 0 ;-1 => HALT ON DISK UNSAFES AND OTHER BAD ERRORS
20338 ;0 => RETRY. NOTE SET POSITIVE FOR 1/2 SECOND AFTER
20339 ; A RETRY TO AVOID LOOPING, DETECT SOLID ERRORS.
20342 .SEE USEHM ;NONZERO => USE HIGH MOBY, ELSE ONLY 256K
20344 .SEE USEMDM ;NONZERO => USE MEDIUM MEMORY AS ADDITIONAL "LOW HALF" PAGES
20347 TT11P: 1 ;0 => PDP11-TTYS ARE NOT IN USE
20348 ;1 => SYSTEM SHOULD INITIALIZE THEM
20349 ;-1 => INITIALIZED AND IN USE
20350 ;TO BRING THE TV'S DOWN, ZEROING TT11P ISN'T ENOUGH
20351 ;EITHER DO WHAT TT11LS DOES, OR JUST SET SCR11D IN SUPCOR
20352 ;(THE LATTER MAY NOT TAKE EFFECT INSTANTLY, HOWEVER)
20353 ;TO BRING THE TV'S UP, JUST SET TT11P TO 1 AND WAIT 2 SECONDS
20356 .SEE IMPUP ;0 UP, -1 DOWN, 1 DOWN AND DON'T TRY TO BRING BACK UP
20358 .SEE TEN11F ;0 UP, -1 TOTALLY DOWN, 1 RESET PLEASE
20360 .SEE DL10F ;0 PDP11 DOWN, -1 UP
20362 .SEE PDP6UP ;0 PDP6 DOWN, -1 UP
20364 .SEE LASTGC ;NAME OF LAST DISK DIRECTORY GARBAGE COLLECTED
20367 SUBTTL SWAPPING ALGORITHM CONTROL SWITCHES
20369 IFE SWPWSP,[ ;THESE AREN'T LOOKED AT IN SWPWSP SYSTEM
20370 ENSWSC: SWBLK ;ENABLE CALLING OF SWSCD FROM 15 SEC CLOCK
20371 ENUPC: 1-SWBLK ;ENABLE USER-PC PAGE OF RUNNING USER NOT BE SWAPPED OUT
20372 ENPZRO: SWBLK ;ENABLE PAGE-ZERO OF RUNNING USER NOT BE SWAPPED OUT
20373 ENSWBK: SWBLK ;ENABLE SWPNX1 TO SWAP BLOCK A USER
20374 ENPVCL: 1-SWBLK ;ENABLE PRVCLK ROUTINE
20375 ENPREE: 1-SWBLK ;ENABLE PREEMPTION ON PAGE SWAP IN (SEE QSWI1)
20376 ENAGE: 1-SWBLK ;ENABLE AGE BITS TO ABORT SWAP OUT IF PAGE IS USED
20378 AGERTE: 8 ;NUMBER OF PAGES TO AGE EACH 1/2 SECOND.
20379 ;IN A 512K SYSTEM, LAP TIME IS ABOUT 200/AGERTE SECONDS.
20381 SUBTTL SYSTEM LOCKS
20383 CIRPSW: -1 ;CIRCULAR POINTER SWITCH
20386 MEMFRZ: -1 ;MEMORY FROZE
20389 CASW: -1 ;CORE ALLOCATE INTERLOCK SWITCH (REQUESTS TO CORE JOB)
20392 SHUTLK: -1 ;LOCK VAR FOR SHUTDN
20393 0 ;USED TO TELL WHO CAUSED SYS DOWN
20395 TREESW: -1 ;LOCK MANIPULATION OF JOB TREE STRUCTURE
20396 0 ;ATTACH, DETACH, DISOWN, REOWN ALL LOCK.
20398 CUSER: -1 ;CORE ALLOCATOR USER
20399 0 ;DUMMY CORE ALOC USE VAR
20401 ARDFSW: -1 ;LOCK VAR FOR .REDEF
20405 DISUSR: -1 ;340 USER
20406 0 ;DUMMY 340 USE VAR
20410 CODUSR: -1 ;CODE SENDER
20415 PLTUSR: -1 ;PLOTTER USER
20420 LPTUSR: -1 ;LINE PRINTER USER
20460 PDPUSR: -1 ;PDP-6 USER
20462 PDPISR: -1 ;PDP6 AS INFERIOR (INTS ON IO CHANNEL)
20463 PDPISE: -1 ;PDP6 USE VAR
20467 TABUSR: -1 ;TABLET USER
20476 TIME: 0 ;TIME SINCE SYSTEM START IN 1/30'THS
20477 SUSRS: 0 ;NUMBER USERS ON SYS
20478 RVVTIM: 0 ;VALUE OF TIME WHEN SYSTEM WAS LAST REVIVED FROM A CRASH
20479 USRRCE: BLOCK NCT+1 ;USER RESOURCE +1 FOR DISOWNED JOBS
20480 SYSRCE: 0 ;SYS JOB RESOURCE
20481 SLOADU: 0 ;100. * <EFFECTIVE # OF COMPETING USERS>, IN FIXED POINT.
20482 RNABLU: 0 ;RUNNABLE USERS
20483 NPGWTU: 0 ;NUMBER OF JOBS CURRENTLY WAITING FOR A PAGE
20484 LOUTIM: 0 ;TOTAL TIME USED BY LOGGED OUT USERS
20485 UMASTER: -1 ;INDEX OF MASTER USER
20486 SWRCE: BLOCK NCT+2 ;SWAP SCHED RESOURCE
20487 SWIPRQ: 0 ;TOTAL # SWAP IN REQUESTS
20488 SHUTDN: 0 ;"TIME" SYS WILL DIE, 0 IF NOT DYING, -1 IF DEAD
20489 DEDTIM: 0 ;TIME TILL DEATH AFTER NEXT CLK QUEUE INT
20490 ; < 0 => SYSTEM ACTUALLY DOWN (CHECKED BY ^Z, NUJBST, %OPLIV JOBS)
20491 DTHTIM: 0 ;TIME SYSTEM DIED
20496 ATRNJN: 0 ;JNAME OF LAST JOB TO DO A .TRANAD OR .TRANDL
20497 ;(SO I CAN SEE IF THEY'RE USED AT ALL).
20500 DZXSPR: 0 ;Count of spurious DZ-11 transmitter interrupts.
20501 DZRSPR: 0 ;Count of spurious DZ-11 receiver interrupts.
20504 NCORRQ: 0 ;NUMBER CORE RQS HERE SO TRANSFERRED TO PEEK
20505 NCBCOM: 0 ;NUMBER CORE BLOCKS COMMITTED TO CORGP
20507 NQDE: BLOCK NQS ;NUMBER OF 2314 DATA ERRORS
20508 NQHE: BLOCK NQS ;NUMBER OF 2314 HARDWARE ERRORS
20509 BLOCK 1 ;NQSE-1 COUNTS SPUR INTS WHILE NO XFER (QSDU -1)
20510 NQSE: BLOCK NQS ;NUMBER OF SPURIOUS 2314 ERROR INTERRUPTS
20511 NQCMPE: BLOCK NQS ;NUMBER OF 2314 READ/COMPARE ERRORS
20512 NQWDE: BLOCK NQS ;# DATA ERRS ON WRITE
20513 NQRDE: BLOCK NQS ;# DATA ERRS ON READS
20514 NIRSWE: 0 ;# IRRCV ERRS ON SWAPPING XFERS
20515 QIRRCV: 0 ;IRRECOVERABLE DISK ERRORS
20516 QIRCBK: 0 ;BLOCK # W/ IRRCV ERROR
20517 QIRUNT: 0 ;UNIT OF ABOVE
20518 NQWRE: 0 ;# WRITE ERRS RCC OK
20519 NQWIRE: 0 ;# WRITE ERRS RCC LOST
20520 NWXFR: 0 ;NUMBER WRITE TRANSFERS (FILE, DIR, ETC.)
20521 NRXFR: 0 ;NUMBER READ
20522 NSWXFR: 0 ;NUMBER WRITE SWAPS
20523 NSRXFR: 0 ;NUMBER READ SWAPS
20525 ;DON'T CHANGE ORDER .SEE MEMTYP
20526 PARERR: 0 ;COUNT OF CORE PARITY ERRORS
20527 NXMERR: 0 ;COUNT OF NXMS
20528 IFE KA10P, BPFERR: 0 ;COUNT OF BAD PAGE FAILS
20529 PARPC: 0 ;PC ON CORE PARITY INTERRUPT
20530 NXMPC: 0 ;PC ON NXM
20531 IFE KA10P, BPFPC: 0 ;PC ON BAD PAGE FAIL
20532 PARUSR: -1 ;USER ON PAR ERR
20533 NXMUSR: -1 ;USER ON NXM
20534 IFE KA10P, BPFUSR: -1 ;USER ON BAD PAGE FAIL
20535 IFE KA10P, BPFPFW: 0 ;PFW ON BAD PAGE FAIL
20538 ECCERR: 0 ;COUNT OF ECC CORRECTED ERRORS LOGGED
20539 ECCERA: 0 ;MEMORY STATUS AND ADDRESS OF MOST RECENT
20540 ECCAND: -1 ;AND OF ALL ERRORS
20541 ECCIOR: 0 ;IOR OF ALL ERRORS
20544 IFN DPKPP, NDPKPE: 0 ;# PARITY ERRS FROM DATAPOINT KLUDGE
20546 SNMPGS: 0 ;SYSTEM, NUMBER OF VIRTUAL USER PAGES
20547 SNSWPG: 0 ;SYS, NUM OF SWAPPED OUT VIR. PGS
20549 USRTM1: 0 ;4USEC TICKS USED BY USERS SINCE LAST (1/2 SEC) UPDATE TO USRTIM
20550 USRTIM: 0 ;TIME USED BY ALL USERS 1 SEC UNITS
20551 NULTM1: 0 ;4USEC TICKS USED BY NULJOB SINCE LAST (1/2 SEC) UPDATE TO NULTM3
20552 NULTM3: 0 ;NUMBER OF SECONDS USED BY NULJOB
20553 NULTIM: 0 ;TIME USED BY NULL JOB (60'THS) - OBSOLETE BUT STILL MAINTAINED
20555 NULEBC: 0 ? 0 ;EBOX COUNT WHEN NULL JOB ENTERED
20556 NULMBC: 0 ? 0 ;MBOX COUNT WHEN NULL JOB ENTERED
20557 NULPRF: 0 ? 0 ;PERF COUNT WHEN NULL JOB ENTERED
20560 PFAILF: 0 ; KL: -1 => ENTRY TO CLOCK LEVEL WAS VIA PFAIL
20562 ; KS: -1 => BOTH CASES
20564 LOSTM1: 0 ;4USEC TICKS LOST SINCE LAST (1/2 SEC) UPDATE TO LOSTIM
20565 LOSTIM: 0 ;SECONDS OF LOST TIME (ALL OTHERWISE RUNNABLE JOBS WAITING FOR PAGES)
20566 IDLTM1: 0 ;4 USEC TICKS IDLE SINCE LAST (1/2 SEC) UPDATE TO IDLTIM
20567 IDLTIM: 0 ;SECONDS OF IDLE TIME (NO JOBS WANT TO RUN)
20568 LOSRCE: 0 ;USRRCE WORD FOR LOST TIME
20569 IDLRCE: 0 ;USRRCE WORD FOR IDLE TIME
20571 UREALT: -1 ;RH=INDEX OF THE REAL TIME USER
20572 ;LH=0=> THIS USER HAS HIGHEST PRIORITY
20573 ;LH>0=> USER NOT IN HIGH PRIORITY PHASE
20574 ;LH<0=> FACILITY IDLE
20575 INFORM [HIGHEST USED]\<.-1>
20576 \fSUBTTL USER VARIABLES
20578 ;ONE COPY FOR EACH PROCEDURE
20579 ;FOR KL AND KS, THIS IS THE UPT
20582 DEFINE KLUPT N,NAME/ ;CHECKS "HARD-WIRED" UPT LOCATIONS
20584 .ERR "NAME" LOST IN UPT
20591 DEFINE KLUPT N,NAME/
20595 IFN KL10P, LOC <.+777>&-1000 ;KL UPT MUST START AT HARDWARE PAGE BOUNDARY
20597 IFN KS10P, LOC <.+7>&-10 ; KS UPT must be 0 mod 8 (see UUOPCW)
20599 USRSTG:: KLUPT 0,;USER PAGE MAP
20601 UPGMP: BLOCK NUVPG/2 ;PAGE MAP STORAGE (PROGRAMS UP TO NUVPG LONG)
20602 ; 2.9-2.8 ACCESS RIGHTS
20603 ; 00 NO ACCESS (BY SOFTWARE CONVENTION, 1.2-1.1
20604 ; HAVE THE "REAL" ACCESS BITS, WHICH MAY BE 00,
20605 ; BUT MAY NOT, E.G. FOR A SWAPPED OUT PAGE).
20607 ; 10 READ/WRITE/FIRST
20609 .SEE PMCSHM ;CACHE BIT
20610 .SEE PMAGEM ;AGE BITS
20611 .SEE PMRCM ;LOW N BITS ARE PHYSICAL CORE PAGE NUMBER (IN 1K PAGES)
20612 UPGCP: BLOCK NUVPG/2 ;CIRCULAR POINTERS (CORRESPONDS 1-1 WITH UPGMP)
20613 ; IF -1, ABSOLUTE PAGE, NOT LINKED. OTHERWISE:
20615 ; 2.8-1.9 USER INDEX
20616 ; 1.8-1.1 PAGE NUMBER IN THAT USER'S UPGCP
20619 ; 2.7-1.1 LINK TO MMP TABLE
20621 ; 2.7-1.1 LINK TO MEM PNT TABLE
20622 UMAPS: 0 ;USER MAP STATUS
20624 UDBR1A==UPGMP ;ADDRESS TO PUT IN DBR1
20625 UDBR2A==UPGMP+<NUVPG/4> ;ADDR FOR DBR2
20626 UPGCPH==UPGCP+<NUVPG/4> ;ADDR OF HIGH HALF OF CIRC PNTRS
20628 TTYTBL: 0 ;TTY ASSIGNED THIS USER OR INDICATION THAT THERE IS NONE
20629 %TBNOT==400000 ;4.9 DOES NOT HAVE TTY NOW
20630 %TBNVR==200000 ;4.8 IF JOB DOESN'T HAVE TTY, OPENS SHOULD FAIL.
20631 %TBINT==100000 ;4.7 IF JOB DOESN'T HAVE TTY, ATTEMPT TO USE TTY SHOULD INTERRUPT.
20632 ;JOB CAN SET BITS 4.8 AND 4.7.
20633 %TBWAT==40000 ;4.6 IF 1, %TBINT AND %TBNVR ARE OVERRIDDEN AND TTY USE ATTEMPTS
20634 ; ALWAYS HANG. SET BY DDT FOR $P, CLEARED BY ^P. ONLY SUPERIOR CAN SET.
20635 %TBDTY==010000 ;4.4 TTY TAKEN FROM --ME--. WHEN GIVEN BACK,
20636 ;DON'T PASS IT ON TO MY INFERIOR.
20637 %TBOUT==004000 ;4.3 ALLOW THIS JOB TO OUTPUT WHETHER OWNS TTY OR NOT
20638 %TBINF==002000 ;4.2 ALLOW MY INFERIORS TO OUTPUT IF THEY HAVE %TBOUT.
20639 %TBOIG==001000 ;4.1 IGNORE MY OUTPUT
20640 %TBIIN==000400 ;3.9 INTERRUPT IF I TRY TO DO INPUT
20641 $TBECL==220600 ;3-6-3.1 # ECHO LINES IF I DONT HAVE DISPLAY
20642 ;RH USER NUM GAVE TTY AWAY TO OR TTY NUM IF HAS IT
20643 %TBCLR==410077 ;CLEAR THESE BITS IN TTYTBL OF A JOB RECEIVING THE TTY
20645 TTSTSV: BLOCK 3 ;JOB'S SAVED TTYST1,TTYST2,TTYSTS, WHEN JOB DOESN'T HAVE THE TTY.
20647 NMPGS: 0 ;NUMBER OF NON-ABSOLUTE PAGES (INCLUDES PURE)
20648 NSWPGS: 0 ;NUMBER SWAPPED OUT PAGES (AOSED FOR EACH USER OF SHARED PAGE SWAPPED OUT)
20649 HUSRAD: 0 ;MEM ADR OF PAGE ABOVE HIGHEST THAT EXISTS (MAX 1,,0)
20650 UPC: 0 ;USER PC STORAGE
20651 LUBTM: 0 ;TIME LAST UNBLOCKED (FOR IDENTIFYING INACTIVE JOBS)
20652 JBI: -1 ;JOB DEVICE INDEX. IF NOT -1, THIS JOB IS A JOB-DEVICE,
20653 ;AND JBI HAS INDEX INTO JOB DEVICE TABLES.
20655 UPGML: ;USER PAGE MAP LOAD (EIGHT WORDS FOR LPM AND SPM INSTRUCTIONS)
20656 IFE KS10P,[ ; KS10 version given below.
20657 UPJPC: 0 ;JPC. KA HAS FAULT ADDRESS IN LH.
20658 IFE KL10P, UPOPC: 0 ;OLD PC FLAGS,,OPC (UNUSED ON KL-10)
20659 UPMAR: 0,,0 ;MAR ADDRESS AND CONDITION
20661 ; 3.3 0=EXEC, 1=USER
20662 ; 3.2-3.1 MAR CONDITION:
20667 ; 2.9-1.1 VIRTUAL ADDRESS
20669 ; 3.9-3.7 ADDRESS BREAK CONDITIONS:
20673 ; 3.6 0=EXEC, 1=USER
20674 ; 3.5-1.1 VIRTUAL ADDRESS
20675 IFE KL10P, UPQUAN: EXPGNG+1,,0 ;F.S. QUAN AND FAULT BITS
20676 IFN KL10P, UPFW: 0 ;PAGE FAIL WORD
20677 IFE KL10P,DBL==100_1
20679 UPDBR1: DBL,,UPGMP ;DBR1
20680 UPDBR2: DBL,,UPGMP+100 ;DBR2
20681 IFE KL10P, UPDBR3: DBL,,EXEUMP ;DBR3
20682 IFE KL10P, UPACP: 1040,,UUOACS ;B KEY,C KEY,,AC POINTER
20686 UPDBR1: UPGMP ; DBR1
20687 UPDBR2: UPGMP+100 ; DBR2
20688 UPQUAN: 0 ; Runtime counter
20689 UPJPC: 0 ; User mode JPC if microcode supports
20690 UPEJPC: 0 ; Exec mode JPC if microcode supports
20693 UPGMLE:: ;END OF PAGE MAP (+1)
20696 KLUPT 420, ;RESERVED UPT 420
20698 KLUPT 421, ;TRAP 1 INSN ;ARITHMETIC OVERFLOW
20699 TR1INS: JSR ILLTRP ;FOR ITS-STYLE INTERRUPT, CONTAINS 0,,%PIARO
20700 KLUPT 422, ;TRAP 2 INSN ;PDL OVERFLOW
20701 TR2INS: JSR ILLTRP ;SYS JOB SHOULDN'T OVERFLOW ;FOR ITS-STYLE, 0,,%PIPDL
20702 KLUPT 423, ;TRAP 3 INSN ;USED FOR ONE-PROCEED
20703 TR3INS: JSR ILLTRP ;SYS JOB SHOULDN'T ONE-PROCEED ;FOR ITS-STYLE, 0,,%PI1PR
20704 KLUPT 424, ;MUUO DEPOSIT LOCATION
20706 MUUODP: 0 .SEE FORTY
20707 KLUPT 425, ;MUUO OLD PC STORAGE
20710 KLUPT 426, ;MUUO PAGING AND CONTEXT WORD
20712 KLUPT 427, ;RESERVED UPT 427
20714 KLUPT 430, ;MUUO NEW PC WORDS
20715 MUUOKN: %PSPCU,,UUOH0 ;FOR OTHER JOBS, MUUOEX (A JRST 4,).
20716 MUUOKT: %PSPCU,,MUUOEX ;NO JOB SHOULD EVER TRAP IN EXEC MODE.
20717 MUUOSN: %PSPCU,,MUUOEX ;NO JOB SHOULD EVER RUN IN SUPERV. STATE.
20718 MUUOST: %PSPCU,,MUUOEX ;..
20719 MUUOCN: %PSPCU,,UUOH0 ;NORMAL UUOS
20720 MUUOCT: %PSPCU,,MUUOTR ;UUOS AS TRAP INSN
20721 MUUOPN: %PSPCU,,UUOH0 ;PUBLIC MODE IDENTICAL TO CONCEALED MODE,
20722 MUUOPT: %PSPCU,,MUUOTR ; ALTHOUGH IT'S A SCREW FOR A LOSER TO BECOME PUBLIC
20723 ] ;END OF IFN KL10P
20726 DEFINE KSUPT UPTNAM
20727 IFN .-USRSTG-<UPTNAM>,[
20728 .ERR UPTNAM lost in UPT
20729 LOC USRSTG+<UPTNAM>
20733 UPFW: 0 ; Saved page fail word from last fault. Copied from EPTPFW
20734 ; at time of fault usually.
20760 MUUOKN: %PSPCU,,UUOH0 ;UUO in Exec mode new PC
20761 ;For other jobs: %PSPCU,,MUUOEX
20763 MUUOKT: %PSPCU,,MUUOEX ;UUO as trap instruction in Exec mode new PC
20765 KSUPT UPT1PO ;PC saved here after one-proceed
20768 KSUPT UPT1PN ;One-proceed sets PC to this
20769 1PRNPC: %PSPCU,,ONEPRO
20772 MUUOCN: %PSPCU,,UUOH0 ;Normal UUO new PC
20775 MUUOCT: %PSPCU,,MUUOTR ;UUO as trap instruction new PC
20782 AC0S: BLOCK 15 ;SWAP OUT AC S
20788 ;KLUPT 500, ;PAGE FAIL WORD STORAGE ;MICROCODE MOD PUTS
20789 ;KLUPT 501, ;PAGE FAIL OLD PC STORAGE ; THESE LOCATIONS IN
20790 ;KLUPT 502, ;PAGE FAIL NEW PC ; THE EPT FOR ITS
20791 ] ;END OF IFN KL10P
20793 UUO:: ;THE FOLLOWING LOCATIONS (UP TO SUEXND) ARE SWAPPED IN & OUT OF
20794 ;UEXIT ETC. WITH THE USER
20795 SUEXIT: JRST 2,@XUUOH ;USER UUO EXIT INS
20796 SCLUSV: MOVEM U,AC17S ;CLOCK U SAVE
20799 SUUOH: 0 ;C(@41) (ABSOLUTE)
20802 SV40: 0 ;C(40) WHEN USER OUT (SEE SWITCH)
20806 SCLCXS: DATAI PAG,CLCX ;CLOCK SAVE OF CONTEXT
20810 IFN <SUEXND-UUO>-<UEXND-UEXIT>, .ERR SUEXIT BLOCK LOST
20813 CLCX: 0 ;SAVED CONTEXT (DATAI PAG,) AT CLKBRK AND PFAIL
20817 KLUPT 504, ;EBOX COUNT
20818 EBOXCT: 0 ? 0 ;NUMBER OF EBOX TICKS (25 MHZ) OVER 2 LEFT 12. THAT EBOX
20820 KLUPT 506, ;CACHE COUNT
20821 MBOXCT: 0 ? 0 ;NUMBER OF MBOX CYCLES REQUESTED BY EBOX FOR THIS USER LEFT 12.
20826 UTIME: 0 ;RH=CLOCK INTERVAL IN 60'THS, LH=COUNT OF TICKS SINCE READ
20827 UTRNTM: 0 ;TOTAL RUN TIME IN 4 MICROSEC UNITS
20828 USIPRQ: 0 ;# SWAPIN REQUESTS
20830 USWST: 0 ;SWAPPING STATUS BITS.
20831 %SW==525252(1) ;IN THE LEFT HALF
20832 %SWDSO==400000 ;4.9 => DESIRED TO BE SWAPPED OUT (MUST BE SIGN BIT).
20833 %SWPGW==200000 ;4.8 => FLSINS IS WAITING FOR A PAGE
20834 %SWBEM==100000 ;4.7 => BEST EFFORT MADE TO SWAP OUT, DON'T LOOK AT JOB AGAIN
20835 %SWRUN==040000 ;4.6 => SWAPPED OUT WHILE RUNNABLE, SO CONSIDER MEM STATUS BEFORE REACTIVATION
20836 ; THIS BIT IS NEVER LOOKED AT.
20837 %SWPCL==020000 ;4.5 => PAGE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
20838 ; SO WHEN FLSINS SKIPS DON'T CLEAR IT BUT PCLSR INSTEAD.
20839 %SWINT==010000 ;4.4 => IF WAITING FOR PAGE, NEED IT TO INTERRUPT
20840 %SWPRV==004000 ;4.3 => "PRIVELEGED USER"
20843 %SWOUT==000400 ;3.9 => JOB IS SWAPPED OUT OR SWAP BLOCKED
20844 %SWSB== 000200 ;3.8 => JOB IS SWAP BLOCKED
20845 %SWLOD==000100 ;3.7 => JOB IS LOADING
20846 ;VALID STATES OF ABOVE 3 BITS: 0=SWAPPED IN, 1=LOADING, 4=SWAPPED OUT, 6=SWAP BLOCKED
20848 UWRKST: 0 ;WORKING SET. 2**18 TIMES SUM(ALL THIS JOB'S PAGES) 1 OVER # SHARERS
20849 ;INCREMENTALLY MAINTAINED WHILE JOB IS LOADING OR SWAPPED IN.
20850 ;NOTE # SHARERS IS IN RH(MMSWP)
20851 USVWRK: 0 ;SAVES UWRKST AS OF LAST TIME SWAPPED IN
20852 USWTIM: 0 ;TIME ENTERED LOADING, SWAPPED OUT, OR SWAP BLOCKED STATE.
20853 ;WHILE SWAPPED IN, HAS THE TIME AT WHICH IT CEASES TO BE PROTECTED
20854 ;AGAINST MEMORY PREEMPTION.
20856 USWPRI: 0 ;JOB SWAP PRIORITY. LOWER NUMBER MEANS MORE LIKELY TO STAY IN
20857 ; AND MORE LIKELY TO COME IN. SEE ALSO SWRCE, WHICH IS SIMILAR.
20858 IFE SWPWSP, ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE PRODUCT
20859 ;OF THE WORKING SET TIMES THE FRACTION OF CPU USED
20860 ;WHICH IS A MEASURE OF MEMORY USE WITH INTERACTIVE JOBS GIVEN AN ADVANTAGE.
20861 IFN SWPWSP, ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE "ADJUSTED
20862 ;MEMORY USAGE", WHICH IS THE (LOGARITHM OF THE WORKING SET SIZE)
20863 ;MULTIPLIED BY THE SUM OF CPU TIME AND I/O WAIT TIME. ALSO, WHEN
20864 ;A DISOWNED JOB IS SWAPPED OUT, USWPRI IS MULTIPLIED BY 4 TO PREVENT
20865 ;IT FROM COMING BACK IN FOR A WHILE UNLESS THERE IS REALLY NO
20866 ;COMPETITION FOR MEMORY. ALSO, WHEN A SWAPPED-OUT JOB WAKES UP FROM
20867 ;AN I/O WAIT, USWPRI IS DIVIDED BY 2 TO GIVE INTERACTIVE JOBS AN
20868 ;ADVANTAGE. THE SWPWSP SYSTEM DOES NOT CURRENTLY LOOK AT SWRCE.
20870 USWSCD: 0 ;SWAP SCHEDULING WORD 4.9=1 SWAPIN INHIBITED THIS JOB (SWAP BLOCKED)
20871 LTRNTM: 0 ;SAVED RUN TIME FOR PRIV USR
20872 LSIPRQ: 0 ;SAVED SWAP IN REQ FOR PRIV USER
20873 UPGSEC: 0 ;NUMBER OF PAGE FAULTS PER <NPVSEC> RUN TIME SECONDS
20874 LPRVTM: 0 ;LAST TIME PRIV USER
20876 PAGRAN: 0 ;.PAGRANGE. 1ST PG #,,LAST PG # INCLUSIVE RANGE OF PAGES TO BE PAGED AHEAD.
20877 PAGAHD: 0 ;.PAGAHEAD. 0, OR PAGE-AHEAD-DISTANCE,,PAGE-BEHIND-DISTANCE
20879 TRUNTM: 0 ;IF NOT TOP LEVEL, MINUS RUNTIME (4.069 US) ALREADY SENT TO SUPERIOR
20880 ;IF TOP LEVEL, RUNTIME USED BY SUBTREE MINUS TIME SENT TO DEMON ALREADY
20881 TSIPRQ: 0 ;DITTO FOR SWAPIN REQUESTS
20882 UTMPTR: SYSRCE ;POINTER TO RESOURCE WORD FOR THIS LOSER (JTMU FOR TREE)
20883 JTMU: 0 ;REDUCED BY 1/16 EVERY 1/2 SEC
20884 ;INCREMENTED BY TIME RUN IN 4 USEC
20885 ;MAX EQV VAL 1000000/8-1/16X=0
20887 ;AMONG JOBS WITH EQUAL RESOURSE
20888 ;LOWEST JTMU HAS HIGHEST PRIORITY
20890 IOCHNM: REPEAT NIOCHN,0 ;IO CHANNEL ASSIGNMENT
20891 ;RH INDEX INTO IOTTB AND CLSTB
20892 ;LH DEV CHNL AND/OR OTHER
20893 SIOCHN: BLOCK LUIOP ;MUST FOLLOW IOCHNM
20895 SIOCP: SIOCHN-1 ;POINTER INTO I/O CHANNEL PDL
20896 IOCHST: BLOCK NIOCHN ;I/O CHANNEL STATUS FOR CH'S AT IOCHNM
20898 ;1.1-2.9 .ACCESS POINTER
20900 CORRQ: -1 ;RQ TO CORE JOB
20902 ;4.8=0 OLD TYPE RQ,1.1-1.9 # BLKS,3.1-3.8=USR NUMBER RQ'ED FOR
20904 ;4.3 ADD FRESH BLOCK (IGNORE 4.2,4.1)
20905 ;4.1=1=> ADDING ABSOLUTE BLOCK
20906 ;3.9=1=>REQUEST WRITE ABILITY
20907 ;2.9=1 INSERT, =0 DELETE ONLY IGNORE 4.1-4.3
20908 ;2.1-2.8 VIRTUAL PAGE AFFECTED
20909 ;1.1-1.9 USER RQ IS FOR
20911 APRC: APRCHN ;R.H. CONO TO APR WHEN USER STARTS (HAS AR OV ENABLE, ETC.)
20912 ;4.9=1=> PROCEDURE IS IN A DISOWNED TREE
20913 BUMRTL==100000 ;4.7 => GUN TREE IF HASN'T RUN FOR AN HOUR
20914 ;(MEANINGFUL ONLY IN TOP LEVEL JOB).
20915 ;CLEARED BY REOWNING OR ATTACHING.
20916 BUSRCR==40000 ;4.6 CORE RQ PENDING ON THIS JOB
20917 BULGO==20000 .SEE SYSGUN ;USER IS DISABLED, WAITING TO BE FLUSHED BY SYS JOB.
20918 BCHPTR==330400,,APRC(U) ;4.1-4.4 LAST CH ON WHICH AN ERR OCCURED (SEE ERR DEV)
20919 BULGOS==400 ;AN ATTEMPT IS BEING MADE TO DELETE OR LOG OUT THIS JOB
20920 ;SO NO-ONE ELSE SHOULD START TO. THIS BIT ALSO LOCKS OUT
20921 ;MOST WAYS OF HACKING THE JOB (INCL. THOSE THAT SET DIELOK).
20922 ;3.1-3.5 MUST BE ZERO
20924 DIELOK: 0 ;NUMBER OF JOBS LOOKING AT OR HACKING THIS JOB.
20925 ;BEFORE KILLING A JOB, WAIT FOR ITS DIELOK TO BECOME 0.
20927 USTP: 0 ;0 RUNNABLE, (IS SET NON ZERO FOR IDLE SETS OF VARS TO SPEED SEARCH)
20929 %USTCM==400000 ;CORE BEING SHUFFLED (SHOULD ACTUALLY BE OBSOLETE).
20930 %USTCJ==200000 ;CORE BEING GIVEN BY CORE JOB.
20931 %USTSP==100000 ;STOPPED BY SUPERIOR
20932 %USTCG==40000 ;STOPPED BY SUPERIOR TO GIVE IT CORE (CORBLK, OR .USET OF .MEMT).
20934 BCSTOP==400000 ;BIT IN USTP FOR CORE MOVAGE
20935 BUCSTP==200000 ;CORE STOPPING LOSER TO GIVE MORE CORE RQSTED BY ANOTHER LOSER
20936 BUSRC==100000 ;USER CONTROL BIT, SET & CLEARED BY SUPERIOR PROCEDURE
20937 BSSTP==40000 ;SET BY SUPERIOR WHEN HACKING MEM BOUND AT URMEMT OR UMEMEX
20938 ;1.1-2.9 ;USED BY UBO AND FRIENDS INHIBITS RELOCATION BY CORE ALLOCATOR
20939 ;MUST BE MODIFIED WITH CLKOFF MUST NOT BE SET IF CSTOP IS SET
20940 ;IS A COUNTER OF TRANSIENT REASONS FOR PROCEDURE BEING STOPPED
20942 PIRQC: 0 ;INT REQ AWAITING SERVICE (SOFTWARE INTS EFFECTED BY SEARCH)
20943 MSKST: 0 ;INT MASK REGISTER FOR BITS IN PIRQC
20944 IFPIR: 0 ;SECOND WORD OF INTERRUPT REQUESTS
20945 ;3.8-3.1 INF PROC INT
20946 ;2.7-1.1 IO CHANNEL INT
20948 MSKST2: 0 ;INT MASK FOR IFPIR
20949 IDF1: 0 ;DEFER BITS FOR 1ST WD INTERRUPTS.
20950 IDF2: 0 ;FOR 2ND WORD INTERRUPTS.
20951 ;IF AN INTERRUPT IS DEFERRED, IT IS TREATED AS
20952 ;IF THE JOB'S PICLR VAR HELD 0.
20953 PICLR: 0 ;INT IN PROGRESS FLAG, -1=>ENABLED, 0=>IN PROGRESS
20955 SUPPRO: 0 ;-1 => TOP LEVEL PROCEDURE
20956 ;OTHERWISE: INT BIT,,PNTR TO SUPERIOR PROCEDURE
20958 FLSINS: 0 ;USER BLOCKING INSTRUCTION; STATE:
20959 ; 0 => RUNABLE (UNLESS USTP .NE. 0)
20960 ; OTHERWISE HUNG, IF NO SKIP SAFE TO RESTART AT UUO (UNLESS UFINAL .NE. 0)
20961 RPCL: 0 ;0,,N RPCLSR'ING N
20962 ;-1,,N BEING RPCLSR'ED BY N
20964 UNAME: 0 ;USER NAME
20965 ;THIS WORD FOR EACH PROCEDURE IS COPIED FROM THE UNAME OF THE PROCEDURE
20966 ;THAT CREATES IT (SEE USR DEV). FOR AN INITIAL TOP LEVEL PROCEDURE IT
20967 ;IS INITIALLY -1 BUT IS MODIFIED BY ALOGIN. IT IS THE SAME FOR ALL
20968 ;PROCEDURES IN A TREE.
20970 ;EACH LOGGED IN PROCEDURE HAS A UNIQUE UNAME, JNAME PAIR. THE JNAME
20971 ;OF AN INITIAL TOP LEVEL JOB IS "HACTRN". FOR OTHER JOBS IT IS THE SECOND
20972 ;FILE NAME SPECIFIED IN THE .OPEN ON THE USR DEVICE THAT CREATES THEM.
20973 USYSNM: 0 ;USER SYSTEM NAME
20974 ;THIS VARIABLE IS INITIALLY SET TO THE SAME VALUE AS UNAME FOR
20975 ;A PROCEDURE. IT CAN BE READ OR WRITTEN BY THE PROCEDURE (ASUSET)
20976 ;OR BY ITS SUPERIOR (AUSET). ITS ONLY USE IS AS THE DEFAULT THIRD FILE NAME ON
20977 ;USER SHARED DEVICES (2311'S (SEE QSKO), AND CORE
20979 USYSN1: 0 ;3RD NAME FOR QSKO, CLOO (AFTER DEFAULTING AND TRANSLATION)
20980 HSNAME: 0 ;HOME SNAME
20982 IOTLSR: 0 ;4.9 IOT USER MOD (=1 ENABLES USER TO DO DIRECT I/O
20984 ;RH VIRTUAL PAGE # OF LAST MPV, WIRO OR NXI (SHIFTED TO
20986 UMARPC: 0 ;PC AT MAR INTERRUPT
20987 LSWPR: 0 ;LOCKED SWITCH POINTER
20988 UCLBLK: 0 ;CLOCK QUEUE BLOCK
20991 URTIME: 0 ;LH=0=>LOW PRIORITY PHASE 1=> LOW PRIORITY WITH BLOCKING
20992 ;LH=-1=>HIGH PRIORITY PHASE 2=> HIGH PRIORITY WITH BLOCKING
20993 ;RH=LENGTH OF HIGH PRIOITY IN 60'THS
20994 RTIMER: -1 ;POSITIVE => MICROSEC RUNTIME TILL RUNTIME INT
20996 LSPCL: 0 ;UPC AT LAST PCLSR,,DIFFERENT UPC AT PREVIOUS PCLSR
20997 LEXFDR: 0 ;DEBUGGING INFO FOR PAGE FAULTS WHICH SIGNAL AN INTERRUPT
20999 ;LH FAULT BITS OF LAST SUCH FAULT
21000 ;RH PC OF LAST SUCH FAULT THAT WAS FROM EXEC MODE (WENT TO
21002 ;PAGE FAULTS WHICH JUST SWAP IN A PAGE DON'T SET THIS.
21003 LSUUO: 0 ;LAST SYS UUO (FOR DEBUGGING PURPOSE)
21004 LSCALL: 0 ;SIXBIT NAME OF LAST .CALL 0, (FOR PEEK)
21005 CTLBTS: 0 ;CTL BITS TO .CALL 0, XORED TOGETHER IN HERE (RIGHT HALF)
21006 SYSCVL: 0 ;CONTROLS OUTPUT ARGS FROM SYSTEM .CALL
21008 %SCVOT==400000 ;4.9 CALL HAS OUTPUT ARGS FLAG (TO SAVE TIME)
21009 %SCVER==200000 ;4.8 CALL HAS ERROR CODE ARG FLAG
21010 ;3.6-4.7 UNUSED 3.1-3.5 MUST BE ZERO
21011 ;1.1-2.9 ADDRESS OF ERROR CODE ARG
21012 IOTBTS: 0 ;DEVICE-INDEPENDENT IOT CONTROL BITS GO HERE, IN IOT AND SIOT
21013 USTYN: 0 ;TTY NO OF THE STY WHICH THIS JOB KNOWS AS "STY:" (WITHOUT
21015 UUAC: 0 ;AC FLD OF LAST UUO OR DESIRED CHANNEL IN CASE OF NOPEN ETC
21016 ;SELECTS CHNL FOR ALL IOTS, OPENS ETC
21017 ;LH -1 IF STORED BY CHNDCD, ELSE ZERO (SEE WHO LINE ROUTINES)
21018 TRMNAM: 0 ;TERMINAL IDENTIFICATION
21019 TRNLST: 0 ;TRANSL LIST FOR THIS JOB. -1 => NIL, OR IDX INTO TRAN!X
21020 TRNLS1: 0 ;TRANSL LIST FOR THIS JOB & INFERS.
21021 UTRAPM:: ;SIGN BIT OF OPTIONS IS UUO-TRAP-TO-SUPERIOR MODE
21022 OPTION: 0 ;OPTIONS WORD, SETTABLE BY USER
21023 ;EACH BIT CONTROLS SOME SYSTEM ACTION FOR THIS JOB
21025 XUNAME: 0 ;"WHO I REALLY AM" AS OPPOSED TO "WHO I AM LOGGED IN AS"
21026 XJNAME: 0 ;JOB NAME USER SPEC'ED AS OPPOSED TO UNIQUIZED VERSION
21028 40ADDR: 20,,40 ;RH=ADDRESS OF USER'S 6-WORD BLOCK FOR UUO'S, INTS, SWITCHES, LOCKING.
21029 ;LH=ADDRESS OF USER'S 20-WORD BLOCK FOR SUPERIOR'S USE. 0=20.
21031 TVCREG: -1 ;TV CONSOLE REG FOR THIS USER OF -1 NONE
21032 TVVBN: -1 ;-1 OR CONSOLE REG FOR RUN BLINKING
21033 NVDBA: 0 ;# VIDEO BUFFERS ASSIGNED (WITH NVDBA SYSTEM CALL).
21035 UWHO1: 0 ;WHOLINE FLAGS
21036 UWHO2: 0 ;TWO HALFWORDS, PRINTING CONTROLLED BY UWHO1 4.9-3.3
21037 UWHO3: 0 ;TWO MORE HALF WORDS, CONTROLLED BY UWHO1 3.2-1.5
21039 ULSPBR: 0 ;STBR,,GCSTBR FOR SPECIAL LISP INSTRUCTIONS
21041 SERVER: -1 ;User index of server job who is allowed write access to
21042 ; this job to implement some oddball protocol. -1 if none.
21043 ;INSERT NEW USER VARIABLES HERE^
21045 USRPDL: -LUPDL,,UPDL-1 ;USER PDL
21046 UPDL: BLOCK LUPDL-1
21047 EPDL2: 0 ;SAVES C(T) FOR FLSINS
21049 VALUE:: ;PROCEDURE "VALUE" RETURN
21050 SRN3: 0 ;SAVED N3, N4 FOR RENAMES AT AOPEN ALSO USER INDEX AT NLOAD
21051 ;SRN3, SRN4 USED BY CORBLK .CALL
21052 .SEE IODCS2 ;SRN3 contains saved user mode PC for unlocking own locks.
21053 .SEE ALOGO4 ;NO CLOSE ROUTINE MAY USE SRN4 OR SRN5
21054 SRN4: 0 ;ALSO DEVICE CHNL IOCHNM POINTER AT NLOAD
21055 SRN5: 0 ;SAVED N5 FOR LINK ALSO VIRTUAL PAGE NUMBER AT NLOAD
21056 EPDL3: 0 ;USED BY 2311 ROUTINES (QFNG) ALSO QSMDN ADDR AT NLOAD ALSO BY TYOW2
21057 .SEE ALOGO4 ;NO CLOSE ROUTINE MAY USE EPDL
21058 ;FOR BP-STYLE RENAME, RENMWO AND MLINK,
21059 ;HOLDS BP (OR BP BLK PTR) TO NAMES TO RENAME OR LINK TO.
21060 EPDL: 0 ;USED BY 2311 ROUTINES.
21061 ;FOR SOPEN AND BP-STYLE RENAME, DELETE, HOLDS BP OR BP BLOCK PTR.
21062 EPDLT1: 0 ;FN1 BEFORE LAST TRANSLATION, USED BY NLOAD
21063 EPDLT2: 0 ;FN2 " " " , USED BY NLOAD
21064 EPDLT3: 0 ;SYS NAME " " "
21065 EPDLT4: 0 ;LEFT ADJ DEVICE NAME " " "
21067 STTYOP: 0 ;IN THE TOP OF A DETACHED TREE, THIS CONTAINS THE SAVED USER TTY
21068 ; OPTIONS. 2.9=1 IF IT IS VALID, 2.7-2.8 ARE QUERY AND REFUSE MODE,
21069 ; THE REST ARE TTYOPT BITS.
21071 IFN 0,[ ;FAKE OUT @
21075 CONC LSWB,\.RPCNT,: BLOCK 2
21076 ] ;SWITCH BLOCK FORMAT
21077 ;WD1 ASSOCIATED ADDRESS OR QUANTITY
21078 ;3.6-3.1 USER NUMBER OF SWITCH HOLDER
21079 ;2.9-1.1 PNTR TO NEXT SWITCH ON LIST OR 0 IF NONE
21080 ;FOR REMAINDER OF FORMAT SEE LSWDIS
21083 IFGE USRSTG+1000-., INFORM SPACE LEFT IN UPT,\1000-<.-USRSTG>
21084 IFL USRSTG+1000-., .ERR USER VARS TOO BIG FOR UPT!
21085 .ELSE LOC USRSTG+1000
21088 IFN KS10P, LOC <.+7>&-10 ; KS UPT must be 0 mod 8 (see UUOPCW)
21092 INFORM [STORAGE PER LOSER]\LUBLK
21093 BLOCK LUBLK ;USER VARIABLES FOR CORE JOB
21094 SYSB==<1777+.>_-10.
21095 MXC==SYSUSB-SYSB ;AVAIL BLOCKS AFTER SYS+DDT
21097 \fSUBTTL TSS INITIALIZATION
21098 ;NEXT LINE COMMENTED OUT BECAUSE IT CAUSES MORE TROUBLE THAN IT SAVES
21099 ;.HKALL==1 ;(THE FOLLOWING CODE IS WIPED OUT AT ICLR)
21100 EXEUMP=UPGMP+100 ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S PAGE TABLE
21101 ;SYMBOL IS DEFINED HERE SINCE UPGMP WAS JUST DEFINED 6 PGS AGO
21103 BEG: SKIPN SALV ;SEE IF LOSER FORGOT TO LOAD SALV WHEN BUILDING SYSTEM,
21104 ;OR SALV MEM IS NXM. EVIL! EVIL!
21105 BUG AWFUL,[HEY! WHERE'S THE SALVAGER?]
21106 JSR SALV+1 ;CALL NO-QUESTIONS-ASKED SALVAGER
21109 JFCL 1,[JRST 4,.] ;SYSTEM WONT RUN ON 6
21112 SWPIA ;IF CACHE OFF, FLUSH CRUFT THAT MAY BE IN IT
21114 SWPUA ;IF CACHE ON, UPDATE CORE SO DDT IS GOOD
21117 SPCCTX 0,1,USRSTG,DISABLE ;SET UP UPT ADDR, BUT NO ACCTING TILL
21118 MOVEI T,0 ;MORE INIT IS DONE.
21119 XCTR XBW,[BLT T,17] ;CLEAR BLK 1 TO AVOID RANDOM PARITY
21123 CONO 20700+APRCHN ; Clear memory related APR flags
21125 MOVSI TT,%KEHLD+%KEREF+%KEPWR
21126 IOWR TT,[KSECCS] ; Reset memory status register.
21127 MOVEI TT,%UBTIM+%UBBAD+%UBPAR+%UBNXD+%UBINI
21128 IOWRQ TT,UBASTA ; Reset both Unibus's and both adaptors.
21130 MOVEI TT,DSKCHN_3 ; Set PI level for RH11. (No, you can't do
21131 IOWRQ TT,UBASTA ; this at the same time you reset the Unibus.)
21132 MOVEI TT,MTCCHN_3+TTYCHN ; PI for Tape, for Chaos and TTYs.
21134 WRHSB [HSB] ; Set halt status block location.
21135 CLRCSH ; Reset cache once for good measure.
21136 SPCCTX 0,1,USRSTG ; Set up UPT and AC blocks.
21139 MOVEI TT,600000+<T11CPA_-10.>
21142 DPB TT,[.T11CP+EXEUMP]
21143 SETOM T11MP+<T11CPA&777777>_-10. ;DONT USE MAP PAGE AS 10-11 PAGE
21144 ;IFN PDP6P,[ ;THESE ARE IN SEPARATE MOBIES NOW
21145 ; MOVE TT,[-LPDP6M,,<PDP6BM&777777>_-10.]
21146 ; SETOM T11MP(TT) ;CONFLICTS WITH PDP-6 MEM
21150 ; MOVSI TT,-TSYSM+256.
21151 ; SETOM T11MP(TT) ;CONFLICT PAGES
21157 ;INIT THE EXEC PAGE MAP'S DDT PAGES.
21158 HRRZ A,DDT-2 ;LOWEST ADDR IN SYMBOL TABLE
21159 SUBI A,100 ;LEAVE ROOM FOR EXTRA SYMS, 340 ROUTINES' LOSSAGE, ETC.
21160 LSH A,-10. ;GET PAGE SYMTAB STARTS IN
21162 MOVEI Q,NQS-1 ;PUT THE TUTS JUST BELOW THE DDT PAGES
21163 BEGTT1: SKIPE QACT(Q)
21164 JRST BEGTT3 ;UNIT NOT IN USE
21165 MOVE T,NTBL(Q) ;NUMBER OF PAGES IN THIS TUT
21167 MOVE B,[MU23TT_<.TZ .BM <MUR>>]
21169 DPB Q,[MNUMB,,MEMBLT(A)]
21175 BEGTT3: SOJGE Q,BEGTT1
21177 ;NOW MAKE SURE ALL THOSE PAGES ARE MAPPED
21178 MOVEI B,-200(A) ;ASSUMING TSYSM AT LEAST 128K
21179 LSH B,-1 ;GET A B.P. TO IDPB MAP HWD OF 1ST DDT PAGE
21180 ADD B,[442200,,EXEUMP]
21183 MOVEI C,600000+PMCSHM(A) ;COMPUTE CONTENTS OF THAT MAP WORD.
21184 MOVE D,[MUDDT_<.TZ .BM <MUR>>]
21185 BEG3: CAML A,FDDTPG
21187 IFG TSYSM-128., IDPB C,B
21189 IFG TSYSM-400, CAIE A,400
21190 .ELSE CAIE A,TSYSM ;STORE THAT MAP WORD AND ALL REST THERE ARE.
21193 ;INITIALIZE REST OF EXEC PAGE MAP
21195 MOVE Q,[222200,,EXEUMP]
21197 SKIPE USEMDM ;MAKE MEDIUM MEM NXM IF DIRMAP NOT TURNED ON
21198 MOVEI B,600200+PMCSHM ;THIS MAY BE USEFUL FOR DEBUGGING
21200 SUBI T,201 ;STOP AT 1ST TUT PAGE.
21201 BEG2: CAIL A,NEXPGS
21211 ;SET UP EXEC LOWER MAP (EVEN ON KA, WILL BE LOOKED AT BY .CALL CORBLK)
21212 MOVE A,[600000,,600001+PMCSHM] ;PAGE 0 IS NOT CACHED
21219 ;SET UP SYS JOB'S CIRCULAR POINTERS SO ALL THE PAGES IT HAS ARE ABSOLUTE
21221 MOVE A,[442200,,UPGMP]
21222 MOVE B,[442200,,UPGCP]
21227 CAIL D,200+MMP0 ;ALLOW USERS TO COPY MMP EXEC PGS
21229 MOVEI E,0 ;PG IT DOESN'T HAVE, AND NOT COPYABLE EXEC PG
21234 ;EXEC MAP PREPARED, NOW TURN ON PAGING
21241 CONO 67760 ; Disable and Clear all flags
21242 CONO 127660 ; Enable and Clear all flags except memory ECC
21245 BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21246 LDBR3 EXEUMP ; Load exec DBRs.
21249 SPCCTX 1,1,USRSTG ; Select AC blocks and set UBR.
21250 WREBR 020000+<EPT/1000> ; Paging on and set EBR.
21253 CONO 327740 ;ENABLE AND CLEAR ALL FLAGS EXCEPT SWEEP DONE
21256 BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21257 SPCCTX 6,6 ;LOAD MICROCODE CONSTANTS NEEDED BY PAGEING INTO
21259 MOVEI 3,EXEUMP ;DBR3
21260 MOVEI 4,EXELMP ;DBR4
21261 MOVSI 5,PMAGEM ;LH.AGE
21262 MOVEI 6,PMAGEM ;RH.AGE
21263 MOVEI 7,1000 ;CN1000
21264 MOVEI 10,100 ;CN100
21265 CONO PAG,660000+<EPT/1000> ;CACHE ON, ITS PAGER, TRAP ENB, EPT ADDR
21266 SPCCTX 1,1,USRSTG,DISABLE
21271 ;INITIALIZE FREE LISTS IN MEMBLT
21273 MOVEI A,1 ;A PG NO - NOTE: DON'T DO PAGE ZERO
21274 BEGF0: CAML A,FTUTPG ;IF THIS ISN'T A DDT OR TUT PAGE, THEN
21276 PUSHJ P,CIMEMR ;PUT THIS PAGE ON THE RIGHT FREE LIST
21282 MOVSI A,-256. ;CLEAR THE INTERFACE'S "VALID" BITS.
21283 SETZM 400000+T11CP*2000(A)
21289 MOVE A,[600000+<XGP11_8>,,1777]
21291 BUG ;NO 10-11 PAGES AVAILABLE?
21292 MOVEI TT,600000+<<T11CPA_-18.>_8>(B) ;GET CORRESP EXEC MAP PG SETUP
21293 DPB TT,[.XGPC+EXEUMP]
21294 MOVEI TT,600000+<<T11CPA_-18.>_8>+XGPTP
21295 DPB TT,[.XGPB+EXEUMP] ;SETUP PAGE FOR PDP-11 BUFFER
21298 ;CHECK AVAIL MEM FOR EXISTANCE
21301 LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21302 IORI TT,200000 ;GRANT READ ACCESS
21303 DPB TT,[.ECCPG+EXEUMP]
21305 MOVE A,400000+ECCPG*2000+1760 ;GET CURRENT HISTORY POINTER
21310 CKML: MOVEI TT,600000(A)
21311 DPB TT,[.PAREP+EXEUMP]
21314 LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21315 CAMN A,TT ;THIS PAGE?
21316 JRST CKML1A ;YES, TREAT AS IF OFFLINE, THOUGH WILL ACCESS IT
21317 ; DIRECTLY FROM TIME TO TIME
21325 JUMPL T,CKML1A ;THIS BLOCK KNOWN TO BE LOSING
21329 JRST CKML1A ;HIGH MOBY NOT TO BE USED
21331 MOVEI TT,CKML1 ;KL10 CAN GET PARITY FAULT ON REFERENCE TO NXM
21333 HRRM TT,MUUOKN ;IT CAN ALSO GET A UUO
21339 CAIL A,256. ;IF NOT IN BOTTOM 256K, DON'T ASSUME GOOD DATA
21340 SETZM 400000+PAREP*2000+20 ;STORE ZERO SO DON'T GET PARITY ERROR
21341 MOVE 0,400000+PAREP*2000+20 ;IF THIS NXMS, MEM THE SYS THINKS
21342 ; IT HAS IS NON EXISTANT
21345 JRST CKML1 ;THAT MEM NXM
21353 JRST CKML1 ;THAT MEM NXM
21359 JRST 4,. ; This can't happen, right? (If we got a NXM, we
21360 ; would have trapped to CKML1 already.)
21363 JRST CKML6 ;THUS ENDING BLOCK OF LOSERS
21364 CKML2: SOJGE A,CKML
21365 AOSN CKMFLG ;ANY MEM OFF UNEXPECTEDLY?
21368 IS THIS OK? /] ;YES, MAKE SURE SOMEBODY KNOWS ABOUT IT. MAY BE SERIOUS SCREW.
21376 PUSHJ P,T00ASZ ;CRLF
21379 CONO 26400 ;CLEAR ANY NXM AND PARITY INTERRUPTS
21382 BUG PAUSE,[TAPE DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21385 BUG PAUSE,[DISK DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21387 IFN KS10P, CONO 20400 ; Clear NXM flag
21393 TLNN A,NOWRIH ;CHECK FOR FORMAT SWITCH ON RP10
21394 BUG PAUSE,[RP-10 WRITE HEADERS ENABLED, PLEASE FLIP THE SWITCH]
21397 IFE <MCOND MLKA,>&<MCOND DM,>,[ ;CHECK FOR LOSING SWITCHES ON MEMORY ON ML-KA AND DM
21399 MOVSI D,(DWRITC) ;MAKE COMMAND FOR VERY LAST BLOCK ON DISK
21400 MOVEI A,NCYLS+XCYLS-1
21401 DATAO DPC,[DNOOPC] ;DETERMINE TYPE OF DRIVE 0
21404 MOVEI A,MCYLS+XCYLS-1 ;RP03
21412 SUB D,[DWRITC-DREADC]
21414 SUB D,[DREADC-DSEEKC]
21417 CKMS1: LDB TT,[MUR,,MEMBLT(A)] ;MEM EXIST?
21418 CAIE TT,MUFR ;AND NOT DDT?
21421 DPB B,[.PAREP+EXEUMP]
21423 CAIGE A,CKMSZZ ;MEM LOADED?
21425 MOVSI B,'FOO ;NO, LOAD IT
21427 MOVE B,[CKMSBF,,CKMSBF+1]
21431 HRRM A,CKMSBF+6 ;MAKE DIFF FROM OTHER SUCH PAGES
21434 LSH B,-4 ;16K BLOCK # IN B
21435 LSH C,(B) ;GET UNIQUE BIT SO PARITY ERR IF TWO AT SAME ADDR
21437 MOVE B,[CKMSBF,,400000+PAREP*2000]
21438 BLT B,400000+PAREP*2000+177
21439 CKMS3: MOVE B,A ;MAKE IOWD
21443 LDB C,[100300,,A] ;MA 15-17
21449 DATAO DPC,CKMSSC ;POSITION HEADS
21452 DATAO DPC,CKMSWC ;WRITE OUT SECTOR
21457 JRST CKMS4 ;CHANNEL ERROR MEM LOSING
21459 JRST CKMS2 ;FOO, DISK LOSING
21460 MOVE B,[-200,,CKMSBF-1] ;READ IT BACK
21470 JRST CKMS2 ;MEM LOSS IN CKMSBF?
21472 JRST CKMS2 ;FOO, DISK LOSING
21473 MOVSI B,-200 ;COMPARE
21475 CAME C,400000+PAREP*2000(B)
21476 JRST CKMS4 ;NOT SAME SWITCHES LOSING
21479 IFE MCOND DM, ADDI A,16. ;MA10'S !!
21480 IFE MCOND MLKA, ADDI A,32. ;ML-KA MEM IS IN 32K MODULES
21483 CONO DPC,175700 ;RESET THE DISK CONTROL
21484 DATAO DPC,[DEASEC+776] ;AT EASE!
21485 CONO PI,20000 ;TURN OFF IOB PI REQ LIGHT
21486 JRST CKMSX ;DONE WITH THIS, CONTINUE INITIALIZATION
21490 CKMS4: MOVEI TT,[ASCIZ/MEM ADDR SWITCHES DISAGREE CPU VS DSK AT LOC /]
21493 MOVEI TT,[ASCIZ/0000/]
21497 CKMSZZ==./2000+2 ;ABOVE HIGHEST CODE
21500 ] ;END IFE MCOND MLKA & DM
21503 DPB TT,[.PAREP+EXEUMP]
21505 IFN KA10P, CONO PI,240000+11577+IFN C1MXP,20000
21506 IFE KA10P, CONO PI,11577
21507 IFN NOTYS, CONO TTY,TTYCHN
21509 SETOM DTEODN ;CAN GET SET ON WHILE LOADING, BUT INTR GETS LOST
21510 IFE PDCLKP, CONO DTE,1170+APRCHN ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21511 IFN PDCLKP, CONO DTE,1170+TTYCHN ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21512 ] ;END OF IFN NETYS
21514 CONO DIS,515330 ;RESET E&S
21516 MOVEM TT,34 ;SET PAGER LOC (USED BY DSKDUMP)
21520 MOVEM TT,MICWA ;SETUP LOC FOR MEM CHAN TAPE
21524 MOVEM TT,QICWA ;SETUP FOR DEC DISK CHANNEL
21526 IFN ARMP, DATAO 760,[0] ;RESET LITE ON ARM
21527 IFN DSDP, CONO DSDEV,10 ;RESET INT RQ FROM PDP10
21528 IFN RBTCP, CONO RBTCON,0 ;RESET TABLET
21530 MOVE A,DDT-2 ;PUT GLOBAL BLOCK HEADER AT BEGINNING
21531 MOVE B,[SQUOZE 0,GLOBAL]
21532 CAME B,(A) ;SEARCH FOR GLOBAL BLOCKS
21533 AOBJN A,[ AOBJN A,.-1
21537 SUBI D,(A) ;GET ,,-#WDS BEFORE GLOBAL BLOCK
21539 ADDM D,1(A) ;GLOBAL BLOCK NOW LARGER
21540 EXCH B,(C) ;EXCHANGE IT WITH FIRST SYM
21545 BEGS1: PUSHJ P,SBUBL
21546 JUMPL J,BEGS1 ;KEEP SORTING UNTIL SYMS IN ORDER
21550 ; SORT THE UUO/SUSET/BIT SYMBOL TABLE BY VALUE
21552 MOVE E,[SYSYMB-SYSYME-1,,SYSYMB]
21556 MOVE A,[-LTSTB,,TSTB]
21561 MOVEM C,CKSUMS-TSTB(A)
21565 IFL .RPCNT-18., TLNE C,400000_<-.RPCNT>
21566 .ELSE TRNE C,400000_<18.-.RPCNT>
21567 XORM B,CKXORS+.RPCNT
21571 HRRZS 37 ;MAKE SURE SYS DOESNT IMMEDIATELY COME DOWN
21576 QSETUP: MOVE B,DCHBT(A)
21581 IFN DC10P, CONO DC0,DCCSET+DCDENB+DSKCHN ;RESET 2314 AND SET DATA ERROR ENABL
21582 IFN 340P, CONO DIS,100
21583 IFN TK10P, CONO NTY,TTYCHN
21584 IFN MTYP, CONO MTY,TTYCHN
21589 CONO DPK,400070+TTYCHN ;INITIALIZE DP KLUDGE
21590 DATAO DPK,[4,,DPKBAS]
21591 MOVE T,[-NDPTYS,,NFDPTY]
21593 DPIL: LDB A,[$TTOSP,,TTYTYP(T)] ;OUTPUT SPEED
21594 MOVE A,DPSP(A) ;MAP TO DPK SPEED CODE
21595 DPB B,[140400,,A] ;LINE #
21596 CONO DPK,500+TTYCHN(A) ;LOAD OUT SPEED
21597 LDB A,[$TTISP,,TTYTYP(T)] ;INPUT SPEED
21598 MOVE A,DPSP(A) ;MAP TO DPK SPEED CODE
21600 CONO DPK,700+TTYCHN(A) ;LOAD IN SPEED
21610 MOVSI R,-NTTPG-NTVBP+1
21611 MOVE T,[.TTPG0+EXEUMP]
21612 BEG9: MOVEI A,(R) ;SET UP 1 MORE TEN-11 MAP ENTRY
21614 IORI A,1777 ;A FULL PAGE
21615 TLO A,600000+TT11NM*400
21618 ADDI B,600000+<<T11CPA_-18.>_8> ;READ-WRITE, IN HIGH MOBY.
21622 MOVE A,[(600000+TT11NM*400)TT11CR_8] ;POINTER TO CONSOLE REG
21625 ADDI B,600000+<<T11CPA_-18.>_8>
21628 SKIPE TT11P ;IF WE'RE SUPPOSED TO USE THE TV 11,
21629 SETZM TT11UP ;REQUEST IT TO RE-INIT.
21630 ;IF TT11UP BECOMES NONZERO, THE 11 IS UP.
21631 BEG5: ];END IFN N11TYS
21633 XCTRI [IORDI A,CAIMYN]
21635 BUG HALT,[CHAOSNET INTERFACE NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS)]
21637 IFN CHAOSP,[ IFN T11CHP,[
21638 SKIPE TEN11F ;SET UP TEN-11 CHAOS NET INTERFACE PAGE
21640 MOVE A,[(600000+CH11NM*400)1004_8+1777]
21643 ADDI B,600000+<<T11CPA_-18.>_8>
21644 DPB B,[.CHSPG+EXEUMP]
21645 BEG8: ]] ;CHAOSP, T11CHP
21646 IFN DL10P,[ ;INITIALIZE DL10
21647 CONO DLC,400000 ;MR CLR
21648 CONO DLB,1 ;TURN OFF EXCESS LIGHTS
21651 CONO DLB,DL10AR ;64 WORDS FOR PDP11 #0 AT DL10AR
21652 DATAO DLC,[200001,,] ;KA INTERRUPT MODE
21654 CONO DLC,100020+TTYCHN ;ENB PDP11 PORT #0 AND ENB INTR
21658 SKIPGE T ;IF THE 11 DIDN'T SAY IT WAS UP,
21659 SETZM DL10F ;MARK IT NON-FUNCTIONAL.
21662 CONO TIM,460000+3900. ;SET INTERVAL TIMER TO 39 MILLISECONDS FOR OVHMTR
21663 CONO MTR,433001 ;TIME BASE ON, ACCOUNT FOR USER + EXEC NO PI, INTERVAL PIA=1
21664 PUSHJ P,PRFOFF ;INIT PERFORMANCE COUNTER
21668 MOVSI T,%TBNOT+%TBDTY+%TBNVR ;SYS JOB HAS NO CONSOLE ALL TO ITSELF
21670 PUSHJ P,USSINI ;INITIALIZE SYS JOB VARIABLES BLOCK
21674 MOVEI T,UUOH0 ;CLOBBERED BY USSINI
21678 HLLM T,UPGMP ;GIVE PG 0 TO SYS JOB
21683 MOVEI T,SYSRCE ;SET SYS JOB RESOURCE POINTER
21685 MOVSI A,(SIXBIT /SYS/) ;""" NAMES
21692 MOVSI T,%TBNOT+%TBDTY+%TBNVR ;CORE JOB HAS NO CONSOLE
21694 PUSHJ P,USSINI ;SET UP CORE JOB VARIABLES BLOCK
21696 MOVE A,[SIXBIT /CORE/]
21700 MOVSI A,(SIXBIT /JOB/)
21704 MOVEM T,UTMPTR+LUBLK
21707 IFE KA10P, HRLI A,%PSPCU ;DOES CORE JOB XCTR?
21710 MOVE T,[JSR ILLTRP] ;SYS AND CORE JOBS SHOULDN'T TRAP
21711 MOVEM T,TR1INS ;THESE WON'T BE USED ANYWAY UNLESS
21712 MOVEM T,TR2INS ;SOMEDAY THEY SHOULD RUN IN USED MODE
21718 MOVEI A,SYSB+2 ;GIVE SYSTEM CORE TO SYS JOB, WITH A COUPLE
21719 MOVEM A,CORRQ ; SPARE JOB SLOTS
21724 CONO PI,100+UTCON-1 ;ALL EXCEPT 7
21725 IFN KA10P, CONO 3000+APRCHN
21727 IFN PDCLKP, CONO CLK,APRCHN
21728 .ELSE [ MOVEI A,%DTCLN ;TURN ON 60-CYCLE CLOCK
21735 CONO APRCHN ;ENABLE APR FAULT INTERRUPTS
21736 SWPUA ;UPDATE MEMORY AGAIN TO MAKE SURE DDT + SYMBOL
21737 ; TABLE OUT OF CACHE
21742 WRINT [KSFREQ] ; 60 cycle clock.
21743 CONO APRCHN ; Enable APR faults and clock ints.
21744 CLRCSH ; Is this necessary? What the heck...
21747 CONI CHX,T ;CHECK CHAOS ADDRESS SWITCHES
21750 JRST [ MOVEI TT,[ASCIZ/CHAOSNET ADDRESS SWITCHES ARE SET WRONG/]
21753 CONO CHX,@CHXCNO ;ENABLE INTERRUPTS
21757 CKML1: ;MEM NON-EXISTANT PATCH OUT
21758 IFN KA10P, CONO 10000 ;TURN OFF NXM FLAG
21772 MOVEM A,CKMBLK ;HIGHEST IN BLOCK OF LOSERS
21773 CKML1A: LDB TT,[MUR,,MEMBLT(A)]
21777 JRST 4,. ;SYS MEM NON EX? (BUG PROBABLY WON'T WORK)
21778 PUSHJ P,MPOUT2 ;FLUSH THAT BLOCK
21780 DPB TT,[MUR,,MEMBLT(A)]
21781 CAIL A,400 ;IF NXM IN LOW MOBY
21789 DPB U,T ;PATCH THIS BLOCK OUT OF EXEC MAP
21793 ; REPORT A BLOCK OF LOSING MEMORY
21796 MOVEI TT,[ASCIZ/MEM OFF /]
21799 ADDI A,1 ;LOWEST LOSER = HIGHEST WINNER + 1 PAGE
21811 USEHM: -1 ;-1 => USE MEM IN HIGH MOBY (IF PRESET)
21813 CKMBLK: -1 ;IF + HIGHEST LOSING BLOCK IN CONTIG RANGE
21814 CKMFLG: -1 ;IF + PRINTED MESSAGE ALREADY
21815 CKMSWC: 0 ;WRITE CMD
21816 CKMSRC: 0 ;READ CMD.
21817 CKMSSC: 0 ;SEEK CMD.
21818 ;UP TO 8 RANGES OF ADDRESSES THAT SHOULD NOT BE USED BECAUSE THEY
21819 ;DON'T WORK BUT AREN'T NXM.
21820 MEMLZL: BLOCK 8 ;LOWEST LOC
21821 MEMLZH: BLOCK 8 ;HIGHEST LOC+1
21822 FTUTPG: 0 ;FIRST PAGE USED FOR TUTS
21824 ;INPUT CHAR FROM CONSOLE TTY AND ECHO
21849 ; TYPE CHAR IN A ON CONSOLE TTY
21878 ; TYPE BLOCK NO IN A AS HIGH 3 OCTAL DIGITS OF ADDR
21879 ; (ALL MEMORIES MULTIPLE OF 4K. MAX MEMORY 2M WORDS.)
21892 ; TYPE ASCIZ IN TT ON T00
21901 IFN DPKPP,[ ;MAP SYSTEM SPEED CODES TO DATAPOINT KLUDGE CODES
21911 REPEAT 20-<.-DPSP>, 7_9 ;FAST *
21920 ; Define location known as start of SALV disk salvager. If system overruns
21921 ; this address, must either reduce system size or increase the SALV start
21922 ; address. If SALV is changed, the SALV program must also be changed to
21923 ; start at the right place. There is a limit to how high it can go,
21925 IFN KL10P, SALV==:105*2000 ; MC-KL is getting huge
21926 .ELSE SALV==:100*2000
21927 IFG IEND-SALV,.FATAL System overruns SALV start addr!
21929 IFGE TSYSM-256.,DDT=774000
21930 .ELSE DDT=TSYSM*2000-4000
21933 IFG LBUGTB-LBUGT2,[
21934 .ERR MAKE THE BUGTAB BIGGER
21935 INFORM LBUGTB-LBUGT2,\LBUGTB-LBUGT2
21936 .FATAL FATAL ERROR, RUNNING THIS WOULD CAUSE TOTALLY WEIRD BUGS
21939 IF2 EXPUNGE FOO,ZZZQ,FNM,ZCHR,ZZ,ZZZ,BUGB,BUGF,BUGN,BUGNN
21941 END BEG ;START AT BEG TO SALVAGE AND RUN ITS, START AT GO TO JUST ITS