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 2 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
1131 SNCLK==62 ;CLO, CLU, & CLI
1134 SNDIRH==65 ;DIRHNG "DEVICE"
1135 SNLCK==66 ;LOCK "DEVICE"
1137 SUBTTL SYSTEM VERSION NUMBER & MISC MACROS
1139 ITSMCH==:<MNAME SIXBIT/,/> ; Define SIXBIT machine name symbol
1140 ITSVRS==:.FNAM2 ; Preserve SIXBIT symbol value of ITS version #
1141 FNM==ITSVRS ;SRI GETS VERSION NUMBER
1142 ;WORKS FOR DECIMAL IGNORES LOW ORDER NON-NUMERIC CHRS
1146 IFGE ZZZQ-'0,IFLE ZZZQ-'9,.GO BAR
1167 ZZZ==10 ;SAVE OLD RADIX
1169 MOVEI I,[MNAME [.ASCII ?
1174 ;"MONTHS OF THE YEAR" MACRO
1177 IRPS M,,[JAN:FEB:MAR:APR:
1179 SEP:OCT:NOV:DEC:]L,,[31. 29. 31. 30.
1186 FOO==-1 ;ACCUMULATED VALUE FOR FOLLOWING DEFINITION:
1189 FOO==FOO+L] ;JAN=-1, FEB=30., MAR=59., ETC.
1200 SSYS==0 ;LENGTH OF SYS CODE
1203 IFN CKPAR,.ERR LOSS AT EBLK
1205 IFE .-CKZZ,.STOP ;NO WORDS BETWEEN BBLK AND EBLK
1206 CONC CK,\CKNUM,==CKZZ-.,,CKZZ
1213 IFE CKPAR,.ERR LOSS AT BBLK
1221 ;INSERT CALL TO THIS MACRO AT ANY PLACE IT IS POSSIBLE TO PCLSR
1222 ;(IF IT IS DESIRED FOR PCLSR TEST FEATURE TO TEST THAT SECTION)
1244 JRST 4,. ;PI 2 NOT OFF AND NOT IN PROGRESS
1247 SUBTTL DEFINE EXEC PAGES
1256 .!X==220000*ZZQ+2200,,ZZQQ
1259 ;EXEC MAP ASSIGNMENTS
1261 EXECPG 340P1, ;USED TO FETCH + TRACE 340 PNTRS
1263 REPEAT N340PB,CONC [EXECPG DPG]\.RPCNT,; ;DATA AREA PNTRS FOR 340 DATA
1265 EXECPG CORJF, ;CORE JOB FROM PAGE
1266 EXECPG CORJT, ;CORE JOB TO PAGE
1268 EXECPG VSB1, ;.VSCAN B1
1269 EXECPG VSB2, ;.VSCAN B2
1272 EXECPG T11CP, ;TEN11 CONTROL PAGE
1274 EXECPG PAREP, ;USED BY SYSTEM IN ITS DILIGENT EFFORTS TO FIX PARITY ERRORS
1276 IFN ECCMEM, EXECPG ECCPG, ;PAGE USED TO ACCESS ECC HISTORY
1279 EXECPG XGPC, ;LOW 2K OF XGP PDP-11 (USED TO TRACE BUFF POINTERS)
1280 EXECPG XGPB, ;2K BUFFER IN PDP-11 (CHANGES LOCATION)
1281 EXECPG XGPUB, ;XGP USER CORE EXEC PG SETUP TO POINT TO USER CORE DURING XGPIM SYSTEM CALL
1284 REPEAT NTTPG,[CONC [EXECPG TTPG]\.RPCNT,
1286 REPEAT NTVBP,[CONC [EXECPG TTR]\.RPCNT,
1288 IFN CHAOSP,[ IFN T11CHP,[
1289 EXECPG CHSPG ;CHAOS NET 10-11 COMMUNICATION PAGE
1290 T11CHS=400000+CHSPG*2000
1292 ;^ INSERT NEW EXEC PAGES HERE
1293 ;EXEC PAGES BELOW THIS POINT WILL BE COPYABLE BY USERS
1294 REPEAT NMMP,CONC [EXECPG MMP]\.RPCNT,; ;MMP TABLE
1295 MMP=MMP0*2000+400000 ;VIRTUAL ADDRESS OF MMP
1297 NEXPGS==EXPGN ;# EXEC PGS USED
1301 .YSTGWD ;STORAGE WORDS OKAY NOW
1303 IFN KL10P, LOC EPT+1000 ;KL needs a full DEC page for EPT
1305 IFE KSIMP, LOC EPT+1000 ;KS needs a full DEC page, too,
1306 IFN KSIMP, LOC EPT+2000 ; unless you are losing even worse.
1314 LOC 30 ; 8080 communications area
1323 IFE RP10P+RH10P,BBLK
1338 E.SPM ;POINTER , NEVER CHANGES
1347 IFN KA10P, JSR UUOH ;UUO TRAP
1348 IFE KA10P, JSR LUUOEX ;USER UUO IN EXEC MODE (ERROR)
1352 REPEAT 6*2, JSR RINT ;INITIALIZE ANY UNUSED PI LOCNS
1355 IFN KA10P, JSR 60H ;60 TRAP
1356 IFN C1MXP, REPEAT 2*7., JSR RINT1 ;INITIALIZE C1MPX LOCNS
1359 JSR CLKBRK ;PROCESSOR OR CLOCK INTERRUPT
1363 JSR LPTBRK ;LPT,DISPLAY,PTP,PTR,OTHER PROCESSOR
1364 IFN 340P, JSR DRECYC ;HACK HACK
1367 JSR TTYBRK ;TTY,DATAPOINT KLUDGE
1371 JSR UTCBRK ;MICRO TAPE OR DISK (S)
1381 JSR DIGNOR ;340 DISPLAY BLKO GETS PATCHED IN HERE
1382 CONO PI,4000+200_<-SDCHN> ;HACK HACK
1392 JSR OMPXBK ;OUTPUT MPXR, NVID, ETC.
1408 PFOPC: 0 ;PAGE FAIL OLD PC STORED HERE
1409 PFNPC: PFAIL ;WHERE TO GO FOR PAGE FAIL
1412 EPTDIA: JRST SALV ;STD COMMAND START ADDRESS ("DIAGNOSTIC")
1413 EPTDDT: JRST DDT ;DDT COMMAND START ADDRESS
1414 EPTSTL: JRST DSKDMP ;STL COMMAND START ADDRESS ("LOADER")
1415 EPTITS: JRST BEG ;STM COMMAND START ADDRESS ("MONITOR")
1418 EPTTR1: CAI ;ARITH OVERFLOW EXEC MODE IGNORED
1419 EPTTR2: JSR ILLTRP ;PDL OVERFLOW EXEC MODE IS AN ERROR
1420 EPTTR3: JSR ILLTRP ;ONE PROC CODE?
1423 DTEBPO: 0 ;BYTE TRANSFER NOT USED
1424 DTEBPI: 0 ;BYTE TRANSFER NOT USED
1425 DTELOC: ;INTERRUPT FROM CONSOLE 11
1426 IFE PDCLKP, JSR DTEBRK ;IF USING 11 FOR CLOCK, FIRST CHECK FOR CLOCK INTR
1427 .ELSE JSR TTYBRK ;OTHERWISE JUST USING 11 FOR TTYS.
1429 DTEPRO: 0 ;NO PROTECTED EXAMINES
1431 DTEPRI: 0 ;NOR PROTECTED DEPOSITS
1435 REPEAT 8,MUUOEX ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1438 EPTEBC: 0 ? 0 ;EBOX COUNT FOR PROC BRK ROUTINES AND NULL JOB
1439 EPTMBC: 0 ? 0 ;MBOX DITTO
1442 JSR OVHBRK ;INTERVAL TIMER INTERRUPT, EVERY 39 MILLISEC ON CHANNEL 1
1444 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1445 ;ON KL10 OVHBRK CHECKS WHERE THE PC IS IF IT IS IN EXEC MODE.
1447 DEFINE OVHMTR NAME ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1448 OVHMT1 NAME,\. ;EVALUATE "." AT THIS POINT IN TIME
1452 DEFINE OVHMT1 NAME,POINT
1453 OVHTAB [DEFINE OVHTAB FOO
1454 FOO] <(SIXBIT/NAME/)>,,POINT ? 0
1458 ;THIS IS THE CORRESPONDING REMOTE MACRO
1467 UBAQIB ; Pointer to interrupt table for Unibus Q (dsk)
1470 UBAIIB ; Pointer to interrupt table for Unibus I (other)
1473 EPTPFW: 0 ; Page fail word
1474 EPTPFO: 0 ; Page fail old PC
1475 EPTPFN: PFAIL ; Page fail new PC
1477 IRP I,,[1,2,3,4,5,6,7]
1479 EPTP!I!W: 0 ; Page fail word
1480 EPTP!I!O: 0 ; Page fail old PC
1481 EPTP!I!N: PF!I!AIL ; Page fail new PC at PI level I
1485 EPTTR1: CAI ;ARITH OVERFLOW EXEC MODE IGNORED
1486 EPTTR2: JSR ILLTRP ;PDL OVERFLOW EXEC MODE IS AN ERROR
1487 EPTTR3: JSR ILLTRP ;TRAP 3 SHOULD NOT HAPPEN
1490 EPT1PO: 0 ;ONE-PROCEED OLD-PC
1491 EPT1PN: MUUOEX ;ONE-PROCEED SHOULD NOT HAPPEN IN UPT=EPT MODE
1494 EPTUEN: MUUOEX ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1501 ;Here because with EPT at 0, this is the second half of physical
1502 ; page 0, which is uncached, which we want, and otherwise unused.
1504 LOC EPT+1000 ; IMP data reformatting buffers
1510 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1511 ;ON KS10 PC SAMPLING FACILITY IS USED, 60-CYCLE CLOCK COLLECTS THAT DATA
1512 ;NOTE THAT THE TABLE FORMAT IS NOT THE SAME AS ON KL10, FOR SPEED REASONS
1514 DEFINE OVHMTR NAME ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1515 OVHMT1 NAME,\. ;EVALUATE "." AT THIS POINT IN TIME
1519 DEFINE OVHMT1 NAME,POINT
1520 OVHTAB [DEFINE OVHTAB FOO
1521 FOO] POINT,,<(SIXBIT/NAME/)>
1525 ;THIS IS THE CORRESPONDING REMOTE MACRO
1531 IFN DL10P,[ ;DL10 COMMUNICATIONS AREA IN NON-ENCACHED LOW CORE
1532 IFN KL10P, LOC 500 ;500-777 RESERVED FOR DL10 AREA AND BUFFERS
1533 IFN KA10P, LOC 100 ;IF KA10, PUT DL10 AREA JUST BELOW START OF SYSTEM
1534 IFN KS10P, .ERR DL10 on KS10 system?
1536 DL10AR: JSR TTYBRK ;INTERRUPT INSTRUCTION (NOT ACTUALLY USED)
1538 ;FOLLOWING LOCATIONS MUST AGREE WITH IOELEVEN PROGRAM
1540 DL10VR: NDLTYS_8+NFDLTY ;"I/O VERSION NUMBER"
1541 DL10UP: 0 ;INCREMENTED BY -11 EVERY 1/60 SECOND.
1542 ;SETOM'ED BY 10 EVERY 1/2 SECOND. DETECTS UP/DOWNNESS.
1544 DL10SO: 0 ;LINE # TO SET OUTPUT DONE FOR, SET BY -10, CLEARED BY -11.
1546 DL10IL: 0 ;LINE # WITH INPUT AVAILABLE. CLEARED BY -10 AFTER CHAR READ.
1547 DL10IC: 0 ;CHARACTER RECEIVED FROM THAT LINE.
1549 DL10OD: 0 ;LINE # WITH OUTPUT DONE. CLEARED BY -10 WHEN PROCESSED.
1550 DL10BS: 0 ;BUFFER SIZE FOR THAT LINE.
1552 DL10BP: 0 ;WIERD DL10 BYTE POINTER TO TTY OUTPUT BUFFER.
1553 DL10CC: 0 ;NUMBER OF CHARACTERS BEING OUTPUT TO TTY.
1554 DL10LN: 0 ;LINE # OUTPUT BEING SENT TO. CLEARED BY -11 WHEN GOBBLED.
1556 DL10CL: 0 ;DIALUP LINE CONNECT OR DISCONNECT INFO. SET BY 11, 0'D BY 10.
1557 ;0000NN => LINE # NN DISCONNECTED.
1558 ;01RTNN => LINE # NN CONNECTED, %TTISP=R, %TTOSP=T.
1560 DL10PL: 0 ;LINE # TO SET PARAMETERS OF. CLEARED BY -11 WHEN PROCESSED.
1561 DL10PR: 0 ;VALUE OF DH11 LPR REGISTER.
1562 DL10PS: 0 ;NUMBER OF BYTES OF OUTPUT BUFFERING DESIRED.
1564 DL10XD: 0 ;1=EXAMINE -11 CORE, 2=DEPOSIT. CLEARED BY -11 WHEN DONE.
1565 DL10XA: 0 ;EXAMINE/DEPOSIT ADDRESS
1566 DL10XW: 0 ;EXAMINE/DEPOSIT WORD
1568 GLPTBP: 0 ;BYTE POINTER TO BUFFER FOR GOULD LPT
1569 GLPTBC: 0 ;BYTE COUNT " " - IF NONZERO BUFFER IS ACTIVE BY PDP11.
1570 GLPTER: 0 ;NONZERO => PDP11 CLAIMS PRINTER IS BROKEN.
1571 GLPGRF: 0 ;NONZERO => GRAPHICS MODE (SET BY 10).
1573 ;CHAOS NET SHARED VARIABLES
1574 DLCINI: 1 ;THE COMMENTS ARE IN THE CHAOS FILE
1586 DLXEND:: ;END OF ASSIGNED DL10 AREA
1588 IFG .-DL10AR-100, .ERR DL-10 AREA TOO BIG, CHANGE CONO IN TSS INITIALIZATION
1589 LOC DL10AR+100 ;SKIP OVER 11-ACCESSIBLE AREA
1591 DL10BF: BLOCK <261.+3>/4 ;OUTPUT BUFFER, 8-BIT BYTES. HAS TO BE NON-ENCACHED.
1594 GLPBSZ==255. ;BUFFER SIZE IN WORDS. MAXIMUM POSSIBLE WITHOUT MODIFYING (ELIMINATING)
1595 ;"WORD COUNT" HARDWARE IN DL-10.
1596 GLPMPP: 0 ;MAIN PROGRAM POINTER - IF NONZERO BUFFER IS ACTIVE BY M.P. LEVEL (PDP10)
1597 GLPMPC: 0 ;MAIN PROGRAM COUNTER
1598 GLPTBF: BLOCK GLPBSZ ;ONE BUFFER FOR NOW
1601 IFN KL10P, IFG .-1000,.ERR DL10 STORAGE TOO BIG, DOESN'T FIT IN UNENCACHED PAGE
1602 IFN KA10P, PATB=. ;MOVE ORIGIN OF SYSTEM UP
1605 IFN NETYS,[ ;ASSEMBLE DTE20 CONTROL AREA
1606 IFE KL10P, .ERR DTE20 WITHOUT KL10?
1609 DTEVER: NETYS_8+NFETY ;400 I/O VERSION NUMBER, SET BY 10, CHECKED BY 11
1611 DTECHK: 0 ;401 INCREMENTED BY 11 60 TIMES PER SECOND
1612 ;SETOMED BY 10 EVERY HALF SECOND.
1613 ;USED TO TELL 11 THAT 10 IS UP.
1615 DTEINP: -1 ;402 -1 IF IDLE, ELSE INPUT REQUEST FROM 10 TO 11
1616 ;SETUP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING THIS.
1617 ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES HERE
1618 DTEOUT: -1 ;403 -1 IF IDLE, ELSE OUTPUT REQUEST FROM 10 TO 11
1619 ;SETUP DTEBPO IN EPT BEFORE SETTING THIS.
1620 ;CONTENTS OF DTEINP AND DTEOUT ARE DESCRIBED BELOW.
1621 ;THESE ARE SET BY THE 10, SETOMED BY 11 WHEN TRANSFER STARTS.
1622 ;RH # BYTES EXPECTED. LH COMMAND+LINE#. COMMANDS ARE:
1623 %DCTYO==1000 ;TELETYPE OUTPUT (NOTE 4.1=0 INPUT, =1 OUTPUT)
1624 %DCETI==2000 ;ETHERNET INPUT (N.Y.I.)
1625 %DCETO==3000 ;ETHERNET OUTPUT (N.Y.I.)
1627 DTELSP: -1 ;404 LINE # WHOSE SPEED IS TO BE SET, SET BY 10, SETOMED BY 11
1628 DTELPR: -1 ;405 CORRESPONDING DH11 LINE PARAMETER REGISTER,,BUFFER SIZE
1630 DTEOST: -1 ;406 LINE# TO START OUTPUT ON (SET OUTPUT DONE).
1631 ;SET BY 10, SETOMED BY 11
1633 BLOCK 1 ;407 NOT USED
1635 DTETYI: -1 ;410 TELETYPE INPUT. SET BY 11, SETOMED BY 10.
1636 ;LH LINE#,,RH CHAR RCVED.
1638 DTEODN: -1 ;411 TELETYPE OUTPUT DONE. SET BY 11, SETOMED BY 10.
1639 ;LH LINE#,,RH BUFFER SIZE.
1641 DTEHNG: -1 ;412 HANGUP/DIALIN WORD. SET BY 11, SETOMED BY 10.
1642 ;0000NN LINE # NN HUNG UP.
1643 ;01RTNN LINE # NN HAS SPEED RCV=R, XMT=T (CODES AS IN TTYTYP)
1645 ;^ ADD MORE LOCATIONS HERE, NOT TO EXCEED 437
1647 ;LOCATIONS 440-457 ARE KNOWN ABOUT BY BOTH IOELEV AND KLDCP,
1648 ;USED MOSTLY FOR NON-TIMESHARING PROGRAMS.
1653 ;FOR VARIABLES (MONITORABLE WITH KEYS)
1654 NSKED: 0 ;# TIMES NON-NULL JOB IS RUN
1655 NNSKED: 0 ;# TIMES NULL JOB IS RUN
1656 NRSKED: 0 ;# OF FULL SCHEDULES (MUST SCAN ALL JOBS)
1657 NSSKED: 0 ;# OF SCHEDULES SAVED BY SCHBLN FEATURE.
1658 NRESKED:0 ;# TIMES A JOB SCHEDULED JUST AFTER IT RAN.
1659 NSCHDU: 0 ;TOTAL NUMBER OF JOBS FOUND RUNNABLE IN FULL SCHEDULES
1660 NNULBK: 0 ;# OF CONSECUTIVE BLOCKS OF NULLTIME.
1661 NUINT: 0 ;# TIMES USER GIVEN INTERRUPT
1662 NAUINT: 0 ;# ATTEMPTED USER INT (POSSIBLY UNSUCCESSFUL DUE TO PG FAULT)
1663 NPCLSR: 0 ;# ATT TO PCLSR
1664 NEPCLS: 0 ;# PCLSRS WHERE JOB WAS IN EXEC MODE
1665 NFPCLS: 0 ;# OF PCLSRS THAT FAILED (JOB WAS IN EXEC MODE AND NOT BLOCKED)
1666 NSOUSR: 0 ;# ATT TO SWAP OUT USR
1667 NSOPGS: 0 ;# TIMES THRU LOOP LOOKING FOR PG TO SWAP OUT
1668 NPGSO: 0 ;# TIMES AT SWOPG
1669 NAGEAB: 0 ;# TIMES SWAP OUT ABORTED BY AGE BITS
1670 NSHRAB: 0 ;# TIMES SWAP OUT ABORTED BY SHARING
1671 NPGFLT: 0 ;# PAGE FAULT (ALL CAUSES)
1672 NCLKI: 0 ;# CHNL 7 INTS (ALL CAUSES)
1673 NPGLD: 0 ;# TIMES AT PGLDU
1674 NUFLS: 0 ;# TIMES AT UFLS
1675 NTUSB: 0 ;# TIMES USER SWAP BLOCKED
1676 NTSBUP: 0 ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND LET IN
1677 NTSBUB: 0 ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND BLOCKED
1678 NTSBUU: 0 ;# TIMES SWAP BLOCKED USER UNBLOCKED BEFORE TIME (MEM APPARENTLY AVAIL)
1679 NAGES: 0 ;# TIMES AROUND PAGE-AGEING LOOP
1681 ;THE FOLLOWING FOUR MUST BE CONSECUTIVE
1682 NRPI: 0 ;# REFS TO PAGE IN (BUT MAP WAS NOT SET UP, ETC)
1683 NRPCI: 0 ;# PAGE FAULTS REFS TO PAGE COMMING IN
1684 NRPO: 0 ;# REFS TO PAGE OUT
1685 NRPGO: 0 ;# TO PAGES GOING OUT
1686 CLKBRS: 0 ;CLKBRK COPIED INTO HERE (SINCE CLKBRK GETS CHANGED)
1688 PAT: IFG .-PATB-40,.ERR PAT TOO HIGH
1694 PATCH: BLOCK 140 ;PATCH SPACE CODE AND CONSTANTS
1700 BLOCK 40 ;PATCH SPACE VARIABLES
1702 SUBTTL PROCESSOR BREAK ROUTINES
1704 DEFINE CLKSAV BRK=CLKBRK
1705 IFE KA10P, XCT CLCXSV ;DATAI PAG,CLCX(U)
1706 XCT CLUSAV ;STORE U IN AC17S FOR CURRENT USER (UNLESS NULL JOB)
1707 MOVE U,BRK ;SAVE AWAY BRK
1709 IFSN BRK,CLKBRK, MOVEM U,CLKBRK ;SAVE IN CLKBRK IF NOT CLKBRK
1713 DEFINE CLKLEV ;ENTER CLOCK-LEVEL CONTEXT
1714 SPCCTX 0,1,EPT ;UPT = EPT; CLOCK LEVEL CONTEXT.
1716 JRST 2,@.+1 ;MAKE XCTR WORK RIGHT
1728 IFN KL10P,[ ;CODE USED IF GETTING 60-CYCLE CLOCK FROM PDP11 (IN CASE MAIN CLOCK DOWN)
1732 ;THE TTY CODE ASSUMES, SINCE THE DTE20 IS USED BY ITS SOLELY AS
1733 ;THE INTERFACE TO THE CONSOLE TTY AND THE LINE-FREQUENCY CLOCK,
1734 ;THAT IT MAY FREELY GIVE THE "MONITOR TTY OUTPUT" COMMAND WHEN
1735 ;THE "MONITOR TTY OUTPUT DONE" INTERRUPT IS RECEIVED. ANY CODE
1736 ;WHICH HACKS THE DTE OTHER THAN AT PI LEVEL OR IN ITS INITIALIZATION
1737 ;MUST THEREFORE OBSERVE THE FOLLOWING PROTOCOL:
1739 ; SKIPN DTEFLG ;WAIT FOR MONITOR TTY OUTPUT TO GO THROUGH
1744 ; SKIPN DTEFLG ;WAIT FOR THIS COMMAND TO GO THROUGH
1751 CONSO PI,1_<7-APRCHN> ;TEMPORARY (I HOPE) HARDWARE BUG IN KL10 PI HARDWARE
1752 JRST 4,. ;ALLEGEDLY FIXED
1753 CONO PI,TTYRQ ;REALLY WANTED TO INTERRUPT ON TTY CHANNEL,
1754 JFCL ; BUT HAVE TO DO IT THIS WAY DUE TO
1755 JFCL ; MISFEATURES IN THE PI HARDWARE
1756 SKIPN DTECLK ;DON'T TAKE OUT THE JFCLS!!
1758 CLKSAV DTEBRK ;TAKE CLOCK INTERRUPT
1763 CLKBRK: 0 ;PC SAVED HERE BY JSR FOR CLOCK INT.
1767 CONSO PI,1_<7-APRCHN> ;HARDWARE BUG IN KL10 PI SYSTEM
1768 JRST 4,. ;ALLEGEDLY FIXED
1770 IFE KA10P, CONO PI,020000+200_<-APRCHN> ;BAG-BITING DEC LOSERS CHANGED
1771 ;FUNCTIONAL SPECIFICATION OF
1772 ;PROGRAMMED REQUESTS
1773 CLKBR2: CLKSAV ;SAVE AC BLK STATUS AND U.
1775 SKIPGE U,USER ;PICK UP INDEX OF CURRENT USER, SKIP UNLESS NULL JOB
1776 JRST [ SPM UPGML ;JUMP IF NULL JOB WAS RUNNING
1778 SPM UPGML(U) ;STORE PAGE MAP AWAY
1779 AOSN UFLSF ;SKIP UNLESS GOT HERE FROM UFL6
1781 MOVEM T,AC16S(U) ;STORE AWAY T
1783 BLT T,AC15S(U) ;STORE REST OF ACS
1784 CLKBKR: CLKLEV ;SET UP CROCK-LEVEL CONTEXT HARDWARE
1786 ;;; CHECK FOR THINGS OTHER THAN CLOCK TICKS (PAR ERR, PG FAULT, NXM, PDLOV,
1787 ;;; AROV AND ARFOV ARE POSSIBLE ON ONE MACHINE OR THE OTHER).
1790 CONSZ 270220 ;CHECK PDL OV, MEM PROTECT, NXM, FOV, AR OV
1791 JRST CLKB1 ;JUMP ON LOSSAGE
1792 CLKB1D: CONSZ PI,200000
1798 JRST PFA6 ;PAGE FAULT
1799 CONSZ 7740 ;This is all but the cache sweep done bit (=20).
1800 JRST CLKB2 ;APR ERROR INTERRUPT
1806 CONSZ 7620 ;This is all but the interval timer's bit (=40).
1807 JRST CLKBKS ; (Memory ECC (=100) doesn't interrupt)
1812 IFN PDCLKP\KA10P,[ ;IF 60 HZ CLOCK IS IN HARDWARE
1814 JRST CLK1F ;INTERRUPT NOT FROM CLOCK, MUST BE SPURIOUS (OR
1818 ;DROP THROUGH FOR PLAIN CLOCK-TICK.
1820 ; 60-CYCLE CLOCK INTERRUPT
1823 ;IFN 340P, DATAI CLK1,LQTIM
1824 SOSG @CLROOT ;COUNT DOWN, SKIP IF NOT YET TO NEXT REQUEST
1825 JRST CLQBRK ;SERVICE CLOCK QUEUE REQUEST
1827 IFN KS10P, CONO 020040+APRCHN ;Clear interval flag
1828 IFN PDCLKP\KA10P, CONO CLK,CLKINT+APRCHN ;Clear hardware clock flag
1829 IFE PDCLKP\KA10P\KS10P, SETZM DTECLK ;Clear software clock flag
1834 IFN KL10P, SKIPGE DTESWR
1835 IFN KS10P, SKIPE 8SWIT0
1836 BUG DDT,[SWITCH 0 IS UP]
1837 IFN KS10P, SETZM 8SWIT0 ; Allow hacker to <alt>P
1838 IFN CHAOSP, IFN T11CHP, PUSHJ P,T11WAK ;RUN TEN-11 CHAOS NET INTERFACE
1845 JRST DSTPD ;WAIT IF DTIME CLOBERED DUE TO RATE EXCEEDED
1853 CONO DIS,1100\SDCHN_3\DISCHN ;RESTART DISPLAY
1857 SKIPN T,E.SPGW ; E&S WAITING FOR PAGE
1859 HRRZM T,DISSPG ; SAVE FOR SWPPIN
1860 SKIPL T,DISUSR ; -1 IMPLIES NO USER
1861 MOVEM T,DISSWI ; USER INDEX FOR SWPPIN
1865 SKIPE @TT11HD ;ANY INPUT FROM PDP11?
1866 PUSHJ P,TT11IN ;YES, DO INPUT INT LVL STUFF FOR IT,.
1869 PUSHJ P,DZSCAN ;SCAN DZ'S FOR INPUT
1873 PUSHJ P,TTECH ;CHARACTERS TO BE ECHO ED
1875 SKIPE STYNTA ;IF THERE ARE STY'S CONNECTED TO NETWORK I/O,
1876 PUSHJ P,STYNTC ;XFER BETWEEN THEM.
1878 IFN KS10P, PUSHJ P,OVHCLK
1881 AOS TIME ;GET HERE EVERY THIRTIETH OF A SECOND
1883 SKIPE PREEMP ;CHECK FOR PRE-EMPTION INTERRUPT
1887 JRST CLKB5 ;TIME NOT UP
1889 JRST SCHED ;SCHEDULE
1893 SKIPE PREEMP ;CHECK FOR PRE-EMPTION INTERRUPT. THIS IS HERE
1894 JRST PRESCD ; BECAUSE OF SCREW CASE WHEREBY DLSRCH PREVENTS
1895 ; PREEMP FROM DOING ANYTHING, AND PREEMP WOULD
1896 ; PREVENT CLOCK FLAG FROM GETTING CLEARED IF IT WAS
1897 ; TESTED BEFORE CLOCK.
1899 ; MOVEI J,APRCHN ;DO NOT TAKE THESE OUT WITHOUT SEEING RG!!!!
1902 AOS CHSPUR+APRCHN ;COUNT SPURIOUS INT
1903 JRST SCHED ;(MIGHT HAVE BEEN RUNNING NULL JOB)
1911 CLKB2: CONSZ 2000 ;NXM
1913 CONSZ 1040 ;POWER FAIL OR I/O PAGE FAIL
1914 BUG HALT,[KL: POWER FAIL OR I/O PAGE FAIL]
1915 CONSZ 300 ;CACHE DIR OR PT DIR PAR ERR.
1916 BUG HALT,[KL: CACHE OR MAP DIR PAR ERR]
1917 CONSO 4400 ;SBUS ERR OR MB PAR ERR
1918 JRST SCHED ;CALLED MEMHNG, AND NOTHING ELSE => SCHEDULE.
1919 SETOM PARRSN ;TEL PAR ERR SCANNER THIS IS AN INTERRUPT, NOT A PG FAIL.
1920 RDERA PARERA ;STORE ADDR OF PAR ERR.
1925 CLKBKS: CONSZ 7600 ; Any bad guys? (8080 -> KS is 20, Interval is 40,
1926 JRST CLKKS1 ; Memory ECC is 100.)
1927 CONO 020020+APRCHN ; 8080 wants service. Clear the bit.
1928 MOVEI I,NFKSTY ; TTY # (fancy name for 0)
1929 CONO PI,TTYOFF ; Pretend this is TTY interrupt level.
1930 SKIPN A,8CTYIN ; Any input from 8080?
1932 SETZM 8CTYIN ; Yes: Make room for more.
1933 PUSHJ P,NTYI1 ; Stuff it into the tty.
1934 MOVEI I,NFKSTY ; Just in case...
1935 CLKKS2: SKIPN 8CTYOT ; Room for output yet?
1936 PUSHJ P,TYPSC ; Yes: Get some now.
1937 CONO PI,TTYON ; No: 8080 will wake us up later.
1938 JRST SCHED ; Null job might have been running.
1940 CLKKS1: CONSZ 1000 ;Power failure
1941 BUG HALT,[KS: POWER FAIL]
1942 CONSZ 6000 ;KS -> 8080 or Flag 24
1943 BUG HALT,[KS: KS->8080 FLAG OR FLAG 24 SET]
1946 CONSO 200 ;Bad memory data
1954 CLUFLS: CONO PI,CLKON ;FROM UFLS
1962 ;CLOCK QUEUE SERVICE
1963 CLQBRK: SKIPG U,CLROOT ;GET POINTER TO CURRENT BLOCK
1964 BUG ;CLK QUEUE SCREWED
1965 SKIPG T,1(U) ;GET POINTER TO NEXT BLOCK
1966 BUG ;CLK QUEUE SCREWED
1967 MOVEM T,CLROOT ;SET UP POINTER FOR NEXT BLOCK
1968 SETOM 1(U) ;INDICATE CURRENT BLOCK IDLE
1969 XCT 2(U) ;EXECUTE REQUEST (PROBABLY A JRST)
1970 ;FALL THROUGH IF SINGLE INST RQ
1971 CLQRET: ;RETURN FROM REQUEST
1972 SKIPN @CLROOT ;SKIP IF TIME TILL NEXT RQ NONZERO
1973 JRST CLQBRK ;ZERO TIME DELTA, DO NEXT RQ
1974 JRST CLQBRT ;RETURN TO CLOCK ROUTINE
1976 CLQTTR: JUMPE TT,CLQRET ;COMMON RETURN FOR TT IDLE FLAG
1977 CLQREE: MOVEI E,CLQRET ;RE ENTER RQ
1979 ;CLOCK OFF OR IN PROGRESS LEVEL ADD TO CLOCK QUEUE, CALL BY JSP E,
1980 ; T HAS TIME TILL RQ IN 60'THS
1981 ; C POINTS TO THREE WORD BLOCK, RQ'ED INST IS IN THIRD
1982 CLQPUT: MOVEI B,CLROOT-1
1983 CLQPU2: MOVE A,B ;REPLACE POINTER TO PREV BLOCK WITH CURRENT
1984 SKIPG B,1(B) ;GET LINK TO NEXT BLOCK
1985 BUG ;CLK QUEUE SCREWED
1986 SUB T,(B) ;SUBTRACT TIME DELTA FOR NEXT BLOCK
1987 JUMPG T,CLQPU2 ;JUMP IF RQ LATER THAN CURRENT BLOCK
1988 JUMPE T,CLQPU6 ;JUMP IF RQ SAME AS " " (COULD USE PU2 BUT THIS FASTER)
1989 ADD T,(B) ;RQ EARLIER, ADD BACK
1990 MOVEM T,(C) ;SET DELTA OF BLOCK BEING ADDED
1991 SUB T,(B) ;COMPUTE NEG OF DELTA FOR NEXT BLOCK
1992 MOVNM T,(B) ;SET TIME DELTA FOR NEXT BLOCK
1993 MOVEM B,1(C) ;SET LINK OF NEW BLOCK TO NEXT
1994 MOVEM C,1(A) ;SET LINK OF PREV BLOCK TO NEW
1997 CLQPU6: SETZM (C) ;SET TIME DELTA OF NEW BLOCK TO ZERO
1998 MOVE A,1(B) ;GET POINTER TO NEXT BLOCK
1999 MOVEM A,1(C) ;SET POINTER OF NEW TO NEXT BLOCK
2000 MOVEM C,1(B) ;SET POINT OF CURRENT TO NEW BLOCK
2003 ;MAIN PROG LEVEL ADD TO CLOCK QUEUE
2004 ;CALL BY PUSHJ P,CLQADD
2005 ;WITH POINTER TO BLOCK IN NEXT WORD AND TIME TILL RQ IN T IN 60'THS
2006 ;POINTER TO BLOCK SHOULD NOT BE INDEXED BY C
2008 CLQAD1: MOVEI T,1 ;RQ IN ONE TICK
2010 MOVE C,@-1(P) ;GET BLOCK POINTER
2012 SKIPL 1(C) ;SKIP IF IDLE
2013 JRST POPCJ1 ;IGNORE THIS RQ, BLOCK ALREADY ACTIVE
2017 SKIPN (C) ;DELTA WORD OF IDLE BLOCK SHOULD BE ZERO
2018 SKIPG T ;TIME SHOULD BE NON-ZERO
2019 BUG ;CLK QUEUE SCREWED
2021 JSP E,CLQPUT ;ADD RQ
2022 CLQDE4: CONO PI,CLKON
2028 ;DELETE CLOCK QUEUE ENTRY
2029 ;CALL BY PUSHJ P,CLQDEL WITH POINTER TO BLOCK IN NEXT WORD
2031 MOVE C,@-1(P) ;GET BLOCK POINTER
2034 SKIPGE 1(C) ;IGNORE RQ TO DELETE IF IDLE
2042 CLQCLR: MOVEI B,CLROOT-1 ;CLOCK OFF OR IN PROGRESS VERSION
2044 SKIPG B,1(B) ;GET POINTER TO NEXT BLOCK
2045 BUG ;CLK QUEUE SCREWED
2046 CAME B,C ;SKIP IF FOUND BLOCK TO DELETE
2048 SKIPG B,1(B) ;GET POINTER TO BLOCK AFTER ONE TO DELETE
2049 BUG ;CLK QUEUE SCREWED
2050 MOVEM B,1(A) ;PATCH AROUND DELETED BLOCK
2052 ADDM A,(B) ;ADD DELTA OF DELETED BLOCK TO NEXT
2053 SETZM (C) ;CLEAR DEL
2054 SETOM 1(C) ;MARK IDLE
2057 OVHMTR PGF ;PAGE FAULT
2061 PFAILU: 0 ;SAVED U AS OF A PAGE FAILURE
2062 PFINST: 0 ;PF INSTRUCTION IF XCT
2063 PFOPC1: 0 ;SAVE PFOPC WHILE SWITCHING TO CLK LEVEL (PROTECT AGAINST XCTRI)
2066 ;PAGE FAULTS COME HERE, WITH PC IN PFOPC, AND PI SYSTEM TURNED OFF.
2068 PFAIL: MOVEM U,PFAILU
2070 ANDI U,%PFCOD ;GET THE PFAIL CODE FROM THE PFW
2073 JRST PFA2 ;IT'S A PAR ERR; BYPASS XCTR HACKS
2077 LDB U,[331100,,(U)] ;GET OPCODE OF LOSING INSTRUCTION.
2078 ;ASSUME THAT IN EXEC MODE VIRTUAL
2079 ; AND PHYSICAL ADDRESSES ARE IDENTICAL
2080 ; FOR INSTRUCTION FETCHES. ALSO ASSUME
2081 ; THAT NOBODY DOES XCT OF XCT OF XCTR.
2082 PFA4: CAIE U,XCTRI_-33 ;SKIP IF "XCTR WITH INHIBIT"
2084 REPEAT 2, AOS PFOPC ;ONCE COMPENSATING FOR INSTR ABORT, AND ONCE TO SKIP
2086 JRST 17,@PFOPC ;KL-10 CROCK: JRST 17, TURNS ON PI SYSTEM
2088 PFA1: CAIE U,XCTR_-33 ;SKIP IF "XCTR WITH NO INHIBIT"
2090 PFA2: CONSO PI,77400 ;PI IN PROGRESS?
2091 CONSO PI,1 ;CHANNEL 7 ENABLED?
2092 BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS OR CLKOFF]
2094 BUG AWFUL,[PAGE FAULT IN NULL JOB]
2097 MOVE U,PFAILU ;RESTORE U SO CLKSAV CAN RE-SAVE IT
2098 TPFLT1: SETOM PFAILF
2099 CONO PI,CLKRQ ;CAUSE CLK BREAK AND PI SYSTEM ON
2100 JRST . ;TAKES A WHILE TO GO OFF
2102 ;COME BACK HERE PI IN PROGRESS ON CLK CHANNEL
2104 MOVEM T,CLKBRK ;SAVE PC AS OF PAGE FAULT AS PLACE INTERRUPTED FROM
2105 AOSN PFAILF ;IF INTERRUPTED FROM INTPFL,
2106 JRST PFA9 ; PC DOESN'T POINT TO FAULTING INSTRUCTION
2107 TLNE T,%PSUSR ;MAYBE SPURIOUS MPV ON IOT IN USER MODE?
2109 JRST PFA9 ;CAN'T BE, I/O IS LEGAL
2112 CAIE TT,%PFPNA ;CAN'T BE IF PAGE FAULT IS REALLY SOME OTHER RANDOM BREAK
2113 CAIN TT,%PFILW ;SUCH AS A PARITY ERROR
2117 ; MOVEM T,UPOPC(U) ;SOLELY FOR THE .OPC USER VARIABLE
2118 LDB E,[$PFPNO,,UPFW(U)] ;FAILING PAGE NO
2120 ANDI D,%PFCOD ;GET THE PAGE-FAULT CODE.
2121 MOVEI A,0 ;INIT USER INT BITS
2124 JRST PFA5 ;REAL PAGE FAULT OR RWF
2128 JRST PFA7 ;OTHER RANDOM BREAKS
2131 JRST PFA14 ;PARITY ERROR
2132 MOVSI D,SCLBPF ;UNKNOWN PFW, GET SYSTEM JOB TO BARF ABOUT IT
2134 BUG PAUSE,[BAD PAGE FAIL WORD ],OCT,BPFPFW ;LOSING IN REAL TIME
2142 JRST SCHED ;IGNORE THE FAULT (BUT DO A FULL SCHEDULE SO SYS JOB WAKES)
2144 PFA14: SETZM PARRSN ;SAY THIS IS PAR ERR TRAP, NOT PAR ERR INTERRUPT.
2146 MOVEM D,PARPFW ;SAVE PFW OF PAR ERR FOR ERROR MESSAGE
2147 AC7CTX ;SELECT AC BLOCK 7, USED BY UCODE.
2148 UMOVE D,0 ;SAVE THE AC THAT HOLDS THE BAD WORD
2150 SYSCTX ;AND RESET THE DATAO PAG TO NORMAL VALUE
2151 JRST CLKB1E ;GO SCAN FOR THE ERROR.
2153 PFA3: CAIE U,XCT_-33
2154 BUG HALT,[PAGE FAULT IN SYSTEM AT ],OCT,PFOPC ;BARF!
2155 MOVE U,@PFOPC ;QUUX! LET ONE LEVEL OF XCT WIN
2158 LDB U,[331100,,@PFINST]
2161 PFA11: XCTRI XR,[MOVE T,(T)] ;GET INSTRUCTION IN WHICH PAGE FAIL OCCURRED
2162 TLCA T,700000 ;AND CHECK HIGH THREE BITS OF OPCODE
2163 JRST PFA9 ;JUMP IF FAULT WAS ON INSTRUCTION FETCH
2165 JRST PFA12 ;JUMP IF INSTRUCTION NOT AN IOT
2166 PFA13: MOVSI TT,(HRRI T,)
2168 XCTRI XEA,TT ;COMPUTE ITS EFFECTIVE ADDRESS
2169 TLZA T,37 ;CLEAR @+XR, BUT LEAVE OPCODE AND AC
2170 JRST PFA9 ;JUMP IF FAULT ON INDIRECT WORD
2171 MOVEM T,MUUODP(U) ;IT WAS A SPURIOUS MPV, SO
2172 MOVE T,CLKBRK ; SIMULATE TRAPPING AS A UUO
2174 MOVEM T,XUUOH(U) ;STORE OLD PC
2176 MOVEM T,MUUOCX(U) ;AND OLD CONTEXT
2178 MOVEM T,CLKBRK ;GET NEW PC
2179 JRST CLKB5 ;AND RESTART USER AT UUOH0
2181 PFA12: TLNN T,700000 ;MAYBE AN INSTRUCTION OVERLAYED ON AN MUUO, E.G. LPMR
2182 TLNN T,040000 ;OPCODES 040-077 QUALIFY.
2185 TLNE T,777000 ;SKIP IF OPCODE WAS XCT
2189 ;Following instruction is suspected of not working (sometimes using wrong AC block)
2190 ; XCTRI XEA,T ;COMP EFFECTIVE ADDRESS OF XCT IN USER CONTEXT
2191 ;; JRST PFA11 ;AND GO PROCESS INSTRUCTION AT THAT ADDRESS
2192 ; JRST [ MOVEM T,TRMNAM(U) ;TEMPORARY FOR DEBUGGING
2194 ; JRST PFA9 ;HERE IF FAULT WAS IN INDIRECT CYCLE
2196 PFA15: DATAI PAG,TT ;HMM, SEE IF WRONG AC BLOCK SELECTED
2199 LDB TT,[220400,,T] ;CHECK FOR NEED TO SIMULATE INDEXING
2204 PFA16: TLNN T,(@) ;CHECK FOR NEED TO SIMULATE INDIRECT
2206 XCTRI XR,[MOVE T,(T)]
2207 JRST PFA15 ;PROCESS INDIRECT WORD
2208 JRST PFA9 ;TAKE FAULT ON INDIRECT WORD
2209 ;End replacement code.
2216 IRP I,,[1,2,3,4,5,6,7]
2217 PF!I!SVU: 0 ;Saved U at PI level I page fail
2218 PF!I!SVT: 0 ;Saved T at PI level I page fail
2219 PF!I!INS: 0 ;Instruction at PI level I page fail
2221 IFN .-PF1SVU-21., .ERR Wrong length PFXSVU block.
2225 IRP I,,[1,2,3,4,5,6,7]
2226 PF!I!AIL: ;;PI level I page fail comes here.
2227 MOVEM T,PF!I!SVT ;Save T
2228 MOVEM U,PF!I!SVU ;Save U
2229 JSP U,PIFAIL ;Set up U and join common code
2231 IFN .-PF1AIL-21., .ERR Wrong length PFXAIL block.
2232 PFXSVT==:0,,<PF7SVT-<PF7AIL+3>>
2233 PFXINS==:0,,<PF7INS-<PF7AIL+3>>
2234 PFXWRD==:0,,<EPTP7W-<PF7AIL+3>>
2235 PFXOPC==:0,,<EPTP7O-<PF7AIL+3>>
2237 PIFAIL: MOVE T,PFXWRD(U) ;Check page fail word
2239 BUG AWFUL,[NON-EX IO REG WITH PI IN PROGRESS ],OCT,PFXWRD(U),[PC=],OCT,PFXOPC(U)
2240 TLNE T,%PFNXM\%PFPAR
2241 BUG AWFUL,[NXM OR PARITY ERROR WITH PI IN PROGRESS]
2242 MOVE T,PFXOPC(U) ;Check for user mode.
2244 BUG AWFUL,[PAGE FAULT IN USER MODE WITH PI IN PROGRESS]
2245 SKIPA T,(T) ;We assume that it wasn't the instruction
2246 ;fetch itself that caused the fault.
2247 PIFL2: MOVEI U,PF7AIL-PF7XCT(U) ;Correct U on return from PFXXCT
2248 MOVEM T,PFXINS(U) ;Save instruction that caused fault
2249 LSH T,-33 ;Look at opcode
2250 CAIE T,XCTRI_-33 ;XCTRI gets special treatment:
2252 REPEAT 2, AOS PFXOPC(U) ;Arrange for it to skip.
2253 JRST PFXRET(U) ;And return.
2255 IRP I,,[1,2,3,4,5,6,7]
2257 MOVE T,PF!I!SVT ;Restore T
2258 MOVE U,PF!I!SVU ;Restore U
2259 JRST 2,@EPTP!I!O ;Return
2261 IFN .-PF1RET-21., .ERR Wrong length PFXRET block.
2262 PFXRET==:0,,<PF7RET-<PF7AIL+3>>
2264 ;;;Let XCT chains that end in XCTRI win. We assume that none of the
2265 ;;;fetches along the way to the XCTRI itself caused the fault.
2266 PIFL1: CAIE T,XCT_-33
2267 BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS]
2268 MOVE T,PFXSVT(U) ;Restore T
2269 JRST PFXXCT(U) ;Go pick up word XCT'ed
2271 IRP I,,[1,2,3,4,5,6,7]
2273 MOVE U,PF!I!SVU ;Restore U
2274 MOVE T,@PF!I!INS ;Pick up XCTed instruction
2275 JSP U,PIFL2 ;Set up U again and rejoin common code
2277 IFN .-PF1XCT-21., .ERR Wrong length PFXXCT block.
2278 PFXXCT==:0,,<PF7XCT-<PF7AIL+3>>
2282 PFLCLK: 0 ; Did page fault happen with CLKOFF?
2283 PFLSVU: 0 ; Saved U during page fail
2284 PFLSVT: 0 ; Saved T during page fail
2285 PFLINS: 0 ; Faulting instruction
2290 ;;; If we are swapped out while running with Exec mode PC between PFAIL and
2291 ;;; PFAILE inclusive, EPTPFO is saved as our PC. (There are actually only
2292 ;;; a few PC's for which this is possible given that we mostly run CLKOFF.)
2297 CONO PI,CLKOFF ; Don't bother me
2298 MOVEM U,PFLSVU ; Save U
2299 MOVEM T,PFLSVT ; Save T
2301 BUG AWFUL,[PAGE FAULT IN NULL JOB]
2302 MOVE T,EPTPFW ; Get the explanation
2303 MOVEM T,UPFW(U) ; Save it for others
2304 MOVE U,PFLSVU ; Restore U, only needed it for a moment.
2305 TLNE T,%PFNXM\%PFPAR ; Bad stuff should interrupt us, right?
2306 BUG AWFUL,[NXM OR PARITY ERROR DIDN'T INTERRUPT]
2308 TLNE T,%PSUSR ; In Exec mode?
2310 MOVE T,(T) ; We assume that it wasn't the instruction
2311 ; fetch itself that caused the fault.
2312 PFLOOP: MOVEM T,PFLINS ; Save instruction that caused fault.
2313 LSH T,-33 ; Check opcode for XCTRI
2314 CAIN T,XCTRI_-33 ; Should we skip?
2316 CAIN T,XCTR_-33 ; Touching user address?
2318 CAIE T,UMOVE_-33 ; These guys are just like XCTR
2321 ;; Let XCT chains win. We assume that none of the fetches along
2322 ;; the way caused the fault.
2324 BUG HALT,[PAGE FAULT IN SYSTEM AT],OCT,EPTPFO
2325 MOVE T,PFLSVT ; Restore T for a moment
2326 MOVE T,@PFLINS ; Pick up XCTed instruction
2329 ;;; Come here to cause faulting instruction to skip.
2330 PFLSKP: MOVE T,PFLSVT ; Restore T
2331 REPEAT 2, AOS EPTPFO
2332 SKIPL PFLCLK ; Unless clock was already off
2333 CONO PI,CLKON ; turn it back on
2334 PFAILE: JRST 2,@EPTPFO
2336 ;;; Come here on NXI error.
2339 ;;; We come here when the page fault is "soft" and it happened in user mode
2340 ;;; or while using XCTR, UMOVE, or UMOVEM.
2341 PFLUSR: MOVE T,EPTPFW
2342 TLNN T,%PFNXI ; Non-existent IO Register?
2345 TLNE T,%PSUSR ; NXI in User IOT mode is not fatal.
2347 BUG AWFUL,[NON-EX IO REG ],OCT,EPTPFW,[PC=],OCT,EPTPFO
2348 PFLU1: MOVE T,PFLSVT ; Restore T
2349 SKIPGE PFLCLK ; Check for lossage
2350 BUG AWFUL,[PAGE FAULT WITH CLKOFF AT],OCT,EPTPFO
2351 TPFLT1: SETOM PFAILF ; Cause CLK level to go to PFLU2
2352 CCLKRQ: CONO PI,CLKRQ
2353 JRST . ; Takes a while to go off...
2355 ;;;CLKBRK comes back here at CLK level.
2356 PFLU2: MOVE T,EPTPFO
2357 MOVEM T,CLKBRK ;Save PC of page fault as place interrupted
2359 LDB E,[$PFPNO,,UPFW(U)] ;E: Virtual page number
2361 ANDI D,%PFNXI\%PFWRT\%PF2.9\%PF2.8 ;D: Page fault code
2362 MOVEI A,0 ;A: User interrupt bits
2363 TRNE D,%PFNXI ;NXI in User IOT mode.
2366 ;Drops through into PFA5
2371 CLKB1: MOVE T,CLKBRK
2373 JRST CLKFO1 ;FLOATING OVERFLOW ENABLED
2374 CLKFO2: CONSZ 20 ;SKIP IF AR OV INT NOT ENABLED
2375 CONSO 10 ;OV ENABLED, SKIP IF OV
2376 CONSZ 270000 ;NOT OV, CHECK PDL OV, MEM PROTECT, NXM
2377 JRST CLKB1C ;PDL OV, NXM, ETC
2378 JRST CLKB1D ;ONLY CLOCK BREAK, AR OV JUST ENABLED
2380 CLKFO1: CONSO 100 ;SKIP ON FLOATING OVERFLOW
2381 JRST CLKFO2 ;NOT REALLY FLOATING OVERFLOW
2382 CLKB1C: JUMPL U,CNLJL ;NULL JOB LOST
2383 MOVEI A,0 ;SET UP INTERRUPT BITS FOR USER
2384 CONSZ 20 ;SKIP IF OV NOT ENABLED
2385 CONSO 10 ;OV ENABLED, SKIP ON OV
2386 JRST CLB1A ;NOT AROV
2388 CLB1A: CONSZ 200 ;SKIP IF FL OV NOT ENABLED
2389 CONSO 100 ;FL OV ENABLED, SKIP ON FL OV
2390 JRST CLB1B ;NOT FLOATING OVERFLOW
2392 CLB1B: CONSO 270000 ;SKIP IF PDL OV, NXM, OR MEM PROTECT
2394 CONSZ 10000 ;NON EX MEM
2398 TRO A,%PIPDL ;PDL OVFLO
2399 TLNN T,%PCUSR ;SKIP IF IN USER MODE
2400 BUG HALT,[PDL OVERFLOW IN EXEC MODE]
2401 CLKB1H: CONSO 20000 ;MEM PROTECT
2403 HLLZ D,UPQUAN(U) ;PICK UP FAULT BITS
2405 TLNN D,770 ;ALL CONDITIONS WHICH ABORT INSTRUCTION
2406 JRST CLKB1J ;(PLUS PAGE NXM FOR RANDOMNESS)
2407 TRZ A,%PIPDL ;INSTRUCTION ABORTED, DON'T SET PDL OV
2410 HRR T,UPOPC(U) ;FIX UP OPC
2411 MOVEM T,CLKBRK ;RESET PC FROM OPC
2413 HLRZ E,UPJPC(U) ;GET VIRTUAL PAGE # (LH OF JPC)
2416 ANDI E,377 ;FLUSH AGE ETC
2418 ;DROP THROUGH INTO PFA5
2426 TLNE D,320 ;SKIP IF REALLY PAGE FAULT
2427 JRST CFH4 ;OTHERWISE WRITE IN READ ONLY OR EXECUTING IMPURE PAGE
2431 ; A BITS FOR USER'S PIRQC
2432 ; D PAGE FAULT BITS OR CODE
2433 ; E VIRTUAL PAGE NUMBER OF PAGE FAILURE
2434 ; TT THE UMAPS SETTING
2435 ;THE MYSTERIES OF W:
2436 ; RH IS A USER INDEX
2437 ; LH 0 => NORMAL PAGE FAULT
2438 ; NON0 => SWAP IN REQUEST FOR OTHER REASON. D,TT SHOULD BE 0.
2440 ; 4.9 => DMA DEVICE SWAP-IN, SEE SWIRQB, SWPPIN
2441 ; 4.8 => FROM SCHEDULER, TO GIVE INTERRUPT (?) THIS IS NO LONGER USED,
2443 ; 4.7 => FROM CFHAHD, TO PAGE AHEAD. THIS IS ONE LEVEL OF RECURSIVE
2445 ; FOR A NORMAL PAGE FAULT, THE USER PC IS IN CLKBRK.
2447 CFHSW1: HRRZM E,CFHUVP ;USER'S VIRTUAL PAGE NUMBER
2450 MOVEI C,UPGCPH(W) ;VIRTUAL ADDRESS IN USER'S HIGH SEG
2451 TLNN TT,%UMMPU ;IS MY UPPER NORMAL?
2452 JRST CFH2 ;YES, USE MY UPPER CPB
2453 MOVEI C,UPGCPH(TT) ;NO, TRY HIS UPPER.
2454 TLNE TT,%UMUTL ;IS MY UPPER GOING TO HIS LOWER?
2455 MOVEI C,UPGCP(TT) ;YES, TRY HIS LOWER.
2458 CFH1: MOVEI C,UPGCP(W) ;VIRT ADDRESS IN USER'S LOW SEG
2460 JRST CFH2 ;MY LOWER DBR NOT HACKED
2462 TLNE TT,%UMLTU ;WAS MY LOWER HACKED TO POINT TO UPPER?
2463 MOVEI C,UPGCPH(TT) ;YES.
2469 MOVE T,C ;CALCULATE MAP ENTRY B.P. FROM CIRC PTR B.P.
2470 ADD T,[(200000-2000)UPGMP-UPGCP]
2471 LDB E,C ;CIRC MEM USE POINTER FOR PAGE FAULT
2472 JUMPE E,CFH4 ;ADDRESS IS IN REAL ILM
2474 JRST CFH4 ;ON REFERENCE TO ABS PAGE ALSO ILM
2475 IFN KL10P,[ CAIE D,%PFILW
2480 JRST CFH4 ;WRITE IN READ ONLY?
2481 JRST CFHRWF ;READ WRITE FIRST
2484 IFN KS10P,[ CAIN D,%PFWRT\%PF2.8 ;WRITE IN READ ONLY
2486 CAIN D,%PFWRT\%PF2.9 ;READ WRITE FIRST
2488 TRNE D,%PF2.8\%PF2.9 ;PAGE NOT IN MAP
2489 BUG HALT,[BOGUS PAGE FAIL CODE]
2495 ;REFERENCE TO PAGE WITH NO ACCESS IN MAP.
2496 CFHW1: SKIPGE RPCL(W)
2497 JUMPGE W,CFF1 ;BEING RPCLSRED?
2500 JRST CFH5 ;CIRPSW NOT AVAILABLE
2505 BUG ;MMP OUT OF RANGE
2506 MOVE C,E ;CIRC PNTR ALREADY POINTS TO MMP
2510 CFHSW3: PUSHJ P,UCPRL ;FIND MMP
2514 CFHSW4: LDB D,[410200,,(C)] ;TWO BITS OF MMP ENTRY GIVES DISPOSITION OF PAGE
2523 ;PAGE FAULT IN JOB BEING PCLSR'D.
2526 BUG ;BEING RPCLSRED IN USER MODE
2529 ANDCAM D,UPQUAN(W) ;CLR PG FLT
2531 CONO 470000+APRCHN ;CLR PDL OV + QT OV + MPV + NXM
2538 MOVE T,CLCX(W) ;RESTORE UPT BUT NOT ACS
2542 CONO PI,CLKOFF ;GO ALLOW SELF TO GET RPCLSRED
2543 JRST 10,UFL1 ;GO INTO UFLS WITH CLK OFF RATHER THAN
2546 CFHRWF: ;HANDLE "WRITE IN READ-WRITE-FIRST PAGE" PAGE FAULT.
2549 JRST CFHW1 ;SOMETIMES NO ACCESS SEEMS TO BE ON TOO
2552 BUG ;GOT "WRITE IN R-W-F PAGE" BUT PAGE ISN'T R-W-F.
2559 ;; EXIT FROM PAGE FAULT HANDLING FOR NON-ERROR FAULT.
2560 ;; C SHOULD CONTAIN 0 IF CAN CONTINUE NOW, OR A FLSINS TO WAIT WITH.
2561 ;; A SHOULD CONTAIN -1 IF FAULT HANDLED SUCCESFULLY (PAGE IN OR ON ITS WAY), ELSE 0.
2565 CFH5A: JUMPE C,CFHX1 ;IF NOT GOING TO WAIT, SKIP NPGWTU CODE
2567 IORM D,USWST(W) ;WAITING FOR PAGE
2568 AOS NPGWTU ;KEEP COUNT OF USERS WAITING FOR A PAGE
2574 IFN KA10P, MOVSI D,1770 ;CLEAR FAULT STATUS BITS
2578 ;; WAIT FOR CIRPSW TO BE AVAILABLE.
2581 MOVE C,[SKIPL CIRPSW]
2585 ;PAGE FAULT ON PAGE THAT'S REALLY IN CORE.
2586 CFHPI: PUSHJ P,CFHAHC ;SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2589 AOS NPGAHR ;COUNT NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2593 AOS NPGBHR ;COUNT NUMBER OF PAGES AGED BY PAGE-BEHIND WHICH WERE USED AGAIN.
2596 PUSH P,C ;SAVE MMP ENTRY ADDRESS FOR PPIUM.
2598 100000,,.+2 ;RETURN ON MEMPNT
2599 BUG ;NO MEMORY LINKED IN?
2600 SUB P,[4,,4] ;FIND MEMBLT INDEX
2602 TLNE D,MMPBAD ;WAS THIS PAGE RECENTLY A PAR ERR VICTIM?
2603 JRST CFHPB ;YES; READ IT BACK OFF THE DISK IF POSSIBLE.
2605 JUMPGE W,E.SBAR ;IF NOT CALLED FROM SWPPIN
2606 HRRZ H,DISUSR ;CHECK TO SEE IF SERVICING E&S
2607 CAIN H,(W) ;NOT DISPLAY, THEN SKIP
2608 PUSHJ P,E.SPGI ;ELSE TIE DOWN PAGE
2612 HLLZS MMSWP(A) ;CLEAR LENGTH OF CIRC LIST (BUT NOT EXEC PGS COUNT)
2615 PUSHJ P,PPIUM ;PUT PAGE INTO USERS' MAPS
2616 IFN E.SP,SETZM E.SPGH ; CLEAR QSWI1 FLAG
2621 ;COME HERE FOR PAGE WHICH SEEMS TO BE IN CORE, BUT HAD A PAR ERR RECENTLY.
2622 ;"SWAP IT OUT", SO IF IT'S PURE IT WILL JUST BE READ BACK FROM DISK.
2625 SETOM CIRPSW ;UNLOCK, SO SWPOPG CAN RE-LOCK.
2626 MOVE C,USER ;TELL SWPOPG WHICH JOB SHOULDN'T BE PCLSR'ED.
2627 PUSHJ P,SWPOPL ;"SWAP OUT" THE PAGE (EVEN IF LOCKED DOWN)
2628 JRST [ POP P,W ;FAILED TO GO OUT. COULD BE EXEC PAGE POINTING TO IT,
2629 SETZ A, ;OR A JOB THAT CAN'T BE PCLSRED RIGHT NOW.
2630 MOVSI C,(CAIA) ;WAIT A LITTLE AND TRY AGAIN (HOPE FOR THE BEST)
2633 AOSE CIRPSW ;SWPOPG UNLOCKS; RE-LOCK.
2634 JRST CFH5 ;OR ELSE GO INTO PAGE-WAIT TILL CIRPSW FREE.
2636 JRST CFHSW4 ;TRY AGAIN TO REFERENCE PAGE, SWAPPING IT BACK IN.
2638 ;ON A RANDOM PAGE FAULT, SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2639 ;ASSUMES W SET UP AS FOR CFHSW1, AND TT
2640 CFHAHC: MOVE D,CFHUVP ;GET USER'S VIRTUAL PAGE NUMBER.
2641 TLNN W,-1 ;PAGE AHEAD ONLY FOR NORMAL PAGE FAULT (SO PC IS IN CLKBRK).
2642 SKIPN PAGAHD(W) ;IS PAGE-AHEAD WANTED FOR THIS JOB?
2647 TDNE TT,T ;NO PAGE-AHEAD ON PAGE NOT MAPPED NORMALLY.
2651 CAML D,H ;IS PAGE IN RANGE FOR AUTOMATIC PAGE-AHEAD?
2652 CAML D,T ;IF SO, GO DO IT.
2659 ;AUTOMATIC PAGE-AHEAD AND PAGE-BEHIND.
2660 ;WHEN PAGE N IS PUT INTO THE MAP, PAGE N+1 IS SWAPPED IN
2661 ;AND PAGE N-1 IS SWAPPED OUT.
2662 ;(ACTUALLY, 1 IS A PARAMETER, IN THE PAGAHD VARIABLE)
2663 CFHAHD: PUSH P,CFHUVP
2664 ;LOOP, REQUESTING SWAP-IN FOR THE NEXT N PAGES. E HAS PAGE NUMBER TO SWAP IN.
2665 CFHAH1: MOVE E,CFHUVP
2669 CAMN A,E ;DETECT END OF LOOP.
2671 SKIPL T ;ELSE INCREMENT OR DECREMENT PAGE NUMBER.
2674 PUSHJ P,CFHRNG ;IS PAGE NUMBER IN RANGE FOR PAGE-AHEAD?
2677 HRLI W,500000 ;PAGE AHEAD THE PAGE. 100000 MEANS PAGE-AHEAD.
2679 SETOM CIRPSW ;ALLOW CFHSW1 TO LOCK CIRPSW.
2683 SETZM CIRPSW ;BUT REALLY IT'S ALREADY LOCKED SO KEEP IT SO.
2686 AOS NPGAH1 ;COUNT NUMBER OF TIMES AN ATTEMPT FAILS.
2689 ;NOW IT'S TIME FOR PAGE-BEHIND. E HAS PAGE NUMBER TO SWAP OUT.
2691 ;???? IS THERE ANY NEED TO PRESERVE U, EVER, INSIDE CFHSW1?
2693 HRRE A,PAGAHD(W) ;GET PAGE-BEHIND DISTANCE.
2695 ADDB A,E ;COMPUTE WHICH PAGE TO PAGE OUT.
2696 PUSHJ P,CFHRNG ;SKIP IF PAGE IS IN RANGE FOR PAGE-BEHIND.
2699 PUSHJ P,UPLC ;LOOK UP THE PAGE IN THE MAP.
2700 LDB D,Q ;D GETS CIRC PNTR
2701 JUMPE D,CFHAH4 ;NO PAGE THERE
2703 JRST CFHAH4 ;ABSOLUTE PAGE, DO NOTHING.
2705 TRO D,PMAGEM ;AGE THE PAGE, IF THE PAGE IS REALLY IN THE MAP,
2708 AOS NPGBHA ;COUNT PAGES AHED FOR PAGE-BEHIND.
2709 MOVE D,T ;SAVE B.P. TO PAGE MAP HALFWORD, FOR CFHAH6.
2710 MOVE C,Q ;STARTING FROM CIRC PTR, FIND MMP
2714 SUB P,[4,,4] ;FOUND MMP, C POINTS TO IT
2715 MOVE E,C ;SAVE ADDRESS OF MMP ENTRY
2716 MOVSI T,MMPTMP\MMPOUT ;IF PAGE IS IN TRANSIT OR OUT, DO NOTHING TO IT.
2720 TLNN T,%PCUSR ;IF JOB IN EXEC MODE, CAN'T SWAP OUT PAGE, SO JUST LEAVE AGED.
2723 SUB T,NCBCOM ;IF LOTS OF FREE MEM, DON'T SWAP OUT.
2727 PUSHJ P,UCPRL ;GET CORE PAGE NUMBER IN T.
2732 JUMPN A,CFHAH6 ;POINTED TO BY AN EXEC PAGE, E.G. 340, CAN'T SWAP OUT.
2736 MOVE A,T ;PHYSICAL PAGE # TO SWAP OUT
2737 HRRZ C,W ;DON'T PCLSR ME
2738 SETOM CIRPSW ;SWPOPG WILL WANT TO RE-LOCK CIRPSW.
2739 PUSHJ P,SWPOPG ;SWAP OUT
2740 JRST CFHAH5 ;CAN'T SWAP OUT => LEAVE JUST AGED.
2741 AOS NPGBHD ;COUNT PAGES SWAPPED OUT BY PAGE-BEHIND.
2747 AOS CIRPSW ;SWPOPG UNLOCKS; RE-LOCK.
2748 POPJ P, ;CAN'T GET LOCKED BY SOMEONE ELSE, WE ARE AT CLOCK LEVEL
2750 ;HERE FOR PAGE-BEHIND PAGE WHICH WE CAN'T OR DON'T WANT TO SWAP OUT.
2751 CFHAH6: MOVSI T,MMPPGB ;IT HAS ALREADY BEEN AGED. MARK IT FOR METERING PURPOSES.
2752 IORM T,(E) ;E POINTS TO MMP ENTRY.
2757 ;SKIP IF PAGE NUMBER IN E IS IN RANGE FOR PAGE-AHEAD OR PAGE-BEHIND.
2758 ;ASSUMES USER INDEX IN W. CLOBBERS T.
2771 CFHAHS: 20 ;IF LESS THAN THIS MUCH FREE MEM, PAGE-BEHIND SHOULD SWAP OUT.
2773 NPGAHD: 0 ;NUMBER OF PAGES WE ACTUALLY SWAPPED IN FOR PAGE-AHEAD.
2774 NPGAH1: 0 ;NUMBER OF TIMES WE WERE UNABLE TO PAGE AHEAD.
2775 NPGBHD: 0 ;NUMBER OF PAGES WE ACTUALLY SWAPPED OUT FOR PAGE-BEHIND.
2776 NPGBHA: 0 ;NUMBER OF PAGES WE DID PAGE-BEHIND.
2777 NPGAHR: 0 ;NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2778 NPGBHR: 0 ;NUMBER OF PAGES AGED FOR PAGE BEHIND AND USED AGAIN.
2782 ;REFERENCE TO SWAPPED OUT PAGE, MMP ADDRESS IN C. SWAP IN THE PAGE.
2783 ;W HAS THE USER INDEX AND FLAGS.
2784 CFHPO: PUSHJ P,CFHPOA
2785 JRST [ SETZ A, ;FAILED. RETURN CODE FOR FAILURE, IF THIS IS FOR DEVICE (W<0).
2787 TLNN W,100000 ;IF THIS IS A PAGE-AHEAD REQUEST,
2789 MOVSI A,MMPPGA ;MARK THE MMP ENTRY SO,
2791 AOS NPGAHD ;AND COUNT IT AS A SUCCESSFUL ATTEMPT TO PAGE AHEAD.
2792 CFHPOB: TLNN W,200000
2794 PUSHJ P,CFHAHC ;ORDINARY PG FAULT => MAYBE PAGE AHEAD.
2796 IFN SWPWSP,[ ;SWAPPING IN A PAGE FOR THIS GUY
2797 ANDCAM D,USWST(W) ;SO CLEAR BEST EFFORT MADE TO SWAP OUT BIT
2800 TDNN D,USWST(W) ;IF JOB IS BRINGING IN FIRST PAGE
2801 JRST CFHPO2 ; SINCE BEING SWAPPED OUT,
2802 ANDCAM D,USWST(W) ;CLEAR BEST EFFOR MADE TO SWAP OUT BIT
2803 EXCH U,W ;AND MAKE SWAP HISTORY TABLE ENTRY
2804 MOVSI T,0 ;FOR "BEGIN LOADING"
2810 CFHPO2: MOVNI A,1 ;SIGNAL "SUCCESS"
2813 MOVSI D,MMPTMP ;BIT ON IF PAGE "IN TRANSIT"
2815 MOVEM D,EPDL2(W) ;HANG USER UNTIL PAGE GETS WHERE IT'S GOING
2816 HRLI C,(TDNE T,) ;COMBINE WITH ADDRESS OF MMP
2820 ;SWAP IN PAGE. W HAS USER INDEX AND FLAGS. C HAS MMP ADDRESS.
2821 ;SKIPS IF SUCCESSFUL. OTHERWISE RETURNS FLSINS IN C.
2822 ;SIGN BIT IN W IS SET FOR SWAP IN FOR DEVICE OR FOR PAGE-AHEAD
2823 ;(THAT IS, NOT ONE WHICH A JOB MUST WAIT FOR)
2824 ;SO DON'T INCREMENT SOME COUNTERS AND DON'T BOTHER WITH FLSINS IN C.
2827 SKIPGE USWSCD(W) ;IF SWAP BLOCKED, EITHER UNBLOCK OR GIVE UP.
2832 MOVE E,USWST(W) ;IF SWAPPED OUT, WE ARE EITHER GOING TO ENTER
2833 TLNE E,%SWOUT ;THE LOADING STATE OR THE SWAP BLOCKED STATE
2840 JUMPN E,CFHPO5 ;INITIAL SWAPIN; GIVE UP AND WAIT NOW IF TUT IS LOCKED.
2841 CFHPO7: PUSHJ P,HMRQC ;GET PHYS MEM BLOCK, NUMBER IN A.
2842 JRST CFHPO1 ;MEM NOT AVAILABLE
2844 DPB B,[410200,,(C)] ;INDICATE COMING IN
2845 HRRZ B,(C) ;OLD CP OF MMP
2846 MOVEM B,MEMPNT(A) ;BECOMES LINK OUT OF CORE BLOCK
2847 HLRZ B,1(C) ;B := DISK ADDRESS
2848 LDB I,[$MMPUN,,(C)] ;I := DISK NUMBER
2851 HRLM B,MEMPNT(A) ;SET DISK ADDRESS CORE BLOCK COMING FROM
2858 SKIPE E ;IF INITIAL SWAP IN PAGE, SOS THE TUT NOW
2859 PUSHJ P,CFHPO8 ;SINCE WE ARE DISSOCIATING THE PAGE FROM THE DISK BLOCK.
2862 BUG ;SHOULDN'T HAVE TO SWAP IN THE SYSTEM
2863 CONO PI,UTCON-1 ;LEAVE CLKCHN OFF.
2865 AOS SWIPRQ ;TOTAL SWAP IN REQUESTS
2866 ;; MARK THE PHYSICAL MEMORY BLOCK AS BEING SWAPPED INTO BY THIS PAGE.
2868 DPB B,[MUR,,MEMBLT(A)]
2870 HRRM B,(C) ;MAKE CP OF MMP POINT TO MEMPNT
2873 DPB TT,[MMMPX,,MEMBLT(A)] ;STORE MMP INDEX IN MEMBLT
2875 ANDCAM TT,MEMBLT(A) ;SET END OF LIST IN THIS BLOCK
2876 ;; PUT THE TRANSFER ON THE SWAP IN LIST.
2878 HLRZ TT,SINLST(I) ;GET PREV BLOCK
2880 DPB A,[MLO,,MEMBLT(TT)] ;CHAIN TO PREV BLOCK
2882 MOVEM A,SINLST(I) ;OR TO HEADER IF FIRST
2883 HRLM A,SINLST(I) ;AND SET NEW LAST BLOCK
2884 AOS SILNG ;AOS NUMBER OF PENDING SWAP IN RQS.
2885 PUSHJ P,QSTRT1 ;WAKE UP DISK INTERRUPT LEVEL.
2887 ;; UPDATE SWAP HISTORY TABLE.
2889 IDIVI TT,LUBLK ;TT 3.1-3.8 GETS USER NUMBER, BASHES I
2901 MOVEM TT,PGIHTL-1(T)
2903 CAIL T,PGIHTB+PGIHTL
2908 JRST POPJ1 ;HANG USER UNTIL PAGE IN
2910 ;IF SWAPPNG IN "INITIAL SWAP IN" PAGE, CHECK TO SEE WHETHER TUT IS AVAILABLE.
2911 ;WE CAN'T SWAP THE PAGE IN IF NOT.
2912 CFHPO5: LDB I,[$MMPUN,,(C)] ;GET DSK #
2916 JRST CFHPO7 ;DISK TUT AVAIL
2919 JUMPL W,CPOPJ ;NO COUNTER AOS IF SWAPIN FOR DEVICE OR PAGE AHEAD.
2920 MOVE C,[SKIPGE QTUTO] ;ALSO MUSTN'T SMASH C
2925 ;LATER ON, COME HERE TO SOS THE TUT, AFTER GETTING THE MEM, WHEN WE CAN NO LONGER BLOCK.
2926 CFHPO8: ANDCAM E,(C) ;CLEAR INITIAL SWAPIN BIT
2932 HRRZS 1(C) ;CLEAR ASSIGNED TRACK NUMBER SO NEW SPACE ASSIGNED ON SWAPOUT
2935 ;HERE IF NO MEMORY TO SWAP PAGE INTO.
2936 CFHPO1: CONO PI,UTCON-1
2939 SKIPGE MEMFRZ ;IF BECAUSE MEMFRZ LOCKED, MAKE JOB WAIT FOR MEMFRZ.
2941 MOVE C,[SKIPL MEMFRZ]
2945 CFHPO4: MOVE C,[PUSHJ P,CFHPO3]
2947 SUB D,SWPOPR ;- # PGS GOING OUT
2948 ADDI D,10. ;MAKE SURE AT LEAST 10. GOING OUT
2957 CFHPO3: PUSH P,A ;FLSINS ROUTINE (NEEDED MEM)
2961 JRST POPAJ1 ;NEEDED MEM AVAILABLE
2965 JUMPGE A,POPAJ ;WILL EVENTUALLY WIN
2967 ADDM A,SWPOPR ;LOSING - SWAP SOME MORE STUFF OUT
2971 ;HERE IF TRYING TO SWAP IN A PAGE BUT SWAP BLOCKED
2972 CFBO1: MOVE E,MEMFR ;GUY SWAPPED BLOCKED
2977 JUMPGE E,CFBO3 ;SEEMS TO BE ROOM SO LET IT COME IN
2979 JUMPL W,CPOPJ ;HANG GUY UNTIL SWAP BLOCK GOES AWAY
2980 MOVE C,[SKIPGE USWSCD]
2990 OVHMTR WS ;WORKING-SET COMPUTATIONS
2993 ;HERE WHEN A SWAPPED OUT OR SWAP BLOCKED JOB TRIES TO SWAP IN A PAGE.
2994 ;JOB IN W, C -> MMP, USWST(W) IN E. RETURN TO CFSB1.
2995 ;WE DECIDE WHETHER ENOUGH CORE CAN BE GARNERED TO LET HIM IN, AND PUT
2996 ;HIM INTO THE LOADING STATE, OR ELSE PUT HIM INTO THE SWAP BLOCKED STATE.
2999 TLNN E,%SWSB ;ALREADY SWAP BLOCKED?
3000 PUSHJ P,WSRCM ;NO, RECOMPUTE WORKING SET
3002 MOVE B,USWPRI(W) ;FIND SUM OF WS'S OF SWAPPED IN GUY'S WITH BIGGER USWPRI
3004 MOVE D,USVWRK(W) ;COMPUTE AMT OF WS NOT ALREADY IN CORE
3007 CAML D,[TSYSM-100.,,]
3008 JRST .+3 ;WS > PHYSICAL MEM, ALLOW IN ANYWAY, FOO!
3010 CAMGE A,D ;WILL IT FIT IN AVAILABLE MEM?
3011 JRST CFSB2 ;NO, SWAP BLOCK
3012 PUSHJ P,CFELD ;YES, ENTER 'LOADING' STATE
3013 JRST CFSB1 ;AND GO AHEAD AND BRING IN THE PAGE
3015 CFSB2: TLNN W,200000 ;IF PAGE-AHEAD, JUST RETURN.
3018 MOVSI A,%SWSB ;ALREADY SWAP BLOCKED?
3021 IORM A,USWST(W) ;NO, ENTER SWAP BLOCKED STATE
3025 MOVSI T,3_16. ;MAKE SWAP HISTORY TABLE ENTRY FOR SWP BLK
3028 SUB T,USWTIM(W) ;HOW LONG SWAP BLOCKED
3029 CAIGE T,20.*30. ;IF LESS THAN 20 SECONDS,
3030 SKIPA T,[15.] ; SLEEP FOR 1/2 SECOND,
3031 MOVEI T,5*30. ; OTHERWISE SLEEP FOR 5 SECONDS
3035 MOVEI A,0 ;WILL THEN TAKE FAULT AGAIN AND
3036 MOVE C,[CAMLE T,TIME] ;CHECK AVAILABLE MEMORY AGAIN
3040 ;ROUTINE TO FIND MEMORY AVAILABLE TO A JOB WHOSE USWPRI IS IN B
3041 ;RETURNS IN LH(A) SUITABLE FOR COMPARING TO UWRKST. SMASHES T,TT,J
3043 WSAVL: MOVEI J,2*LUBLK ;DON'T LOOK AT SYS NOR CORE JOB
3044 MOVSI T,%SWOUT+%SWLOD ;IF THESE BITS CLEAR, JOB IS SWAPPED IN
3045 MOVE A,MEMFR ;FREE CORE
3046 SUB A,NCBCOM ;FUDGE FOR THINGS IN PROCESS
3049 ADD A,NLOOSP ;LOOSE PAGES ARE EVICTABLE
3050 SUB A,SWPOPR ;DON'T COUNT PAGES ALREADY COMMITTED TO EVICT
3051 HRLZI A,-4(A) ;ALIGN AS UWRKST AND ALLOW 4 PAGES OF SLOP
3052 SKIPA TT,TIME ;TO SEE IF PROTECTED AGAINST MEMORY PREEMPTION
3053 WSAVL1: ADDI J,LUBLK
3058 JRST WSAVL1 ;DOESN'T EXIST, OR NOT SWAPPED IN, OR LOADING
3061 JRST WSAVL1 ;HIGHER PRIORITY OR PROTECTED
3062 ADD A,UWRKST(J) ;THIS GUY'S WORKING SET IS PREEMPTABLE
3065 ;Routine to re-compute working set, also re sets up map
3066 ;to point to any pages which are swapped in but not mapped in.
3067 ;This is necessary in order to get the proper estimate of
3068 ;how much core is going to have to be swapped out to make
3069 ;this job fit. Called when a job leaves the swapped-out state,
3070 ;to enter either Loading or Swap-blocked.
3071 ;Job is in W, smashes A,B,C,D,E,T,TT,H,I,U.
3072 ;Call with CIRPSW locked and clk in progress.
3073 WSRCM: SETZM UWRKST(W)
3074 MOVEI E,UPGMP(W) ;SET UP SCAN OF USER'S MAP
3076 MOVEI C,UPGCP(W) ;AND OF CIRCULAR POINTERS
3078 LDB D,[121100,,HUSRAD(W)] ;# OF USER PAGES
3079 WSRCM1: ILDB A,E ;GET PAGE MAP ENTRY
3080 ILDB B,C ;AND CIRCULAR POINTER
3081 JUMPE A,WSRCM2 ;JUMP IF PAGE DOESN'T EXIST
3083 JRST WSRCM2 ;ABS PAGE, DON'T COUNT
3084 TRNN A,600000 ;ALREADY SWAPPED IN?
3085 JRST WSRCM3 ;NO, GO PONDER
3086 ANDI A,PMRCM ;GET PAGE MAPPED TO
3087 HRRZ B,MMSWP(A) ;GET # SHARERS
3088 MOVSI A,1 ;COMPUTE WS ADJUSTMENT
3091 WSRCM2: SOJG D,WSRCM1 ;LOOP
3094 WSRCM3: PUSH P,C ;PAGE NOT MAPPED, SEE IF IT'S IN
3096 100000,,WSRCM4 ;RETURN WITH 4 PUSHES IF MEMORY IN LOOP
3097 POP P,C ;NO MEMORY, LEAVE ALONE
3101 WSRCM4: SUB P,[4,,4] ;FOUND MEMORY, IN T
3103 MOVEI A,2 ;USE READ/WRITE/FIRST RATHER THAN READ/WRITE
3105 IORI A,PMCSHM(T) ;SET UP MAP
3107 AOS C,MMSWP(T) ;ONE MORE USER POINTING TO PAGE
3110 IDIVM A,B ;ADJUST WS AS IF WAS ALREADY POINTING TO PAGE
3111 ADDM B,UWRKST(W) ;ADDM DOES NOTHING IF THERE WAS DIVIDE BY ZERO
3112 IMULI C,-1(C) ;COMPUTE WS DECREASE DUE TO ADDITIONAL SHARING
3114 IDIV A,C ;IF DIVIDE BY ZERO, A GETS RIGHT THING!
3115 MOVE C,(P) ;ADJUST ALL SHARER'S WS'S
3122 WSRCM5: ADDM A,UWRKST(U)
3125 ;LEAVE LOADING STATE IF IN IT. JOB IN U, SMASH C,TT,T,I
3126 LVLOAD: MOVE C,USWST(U)
3128 POPJ P, ;NOT IN LOADING STATE
3129 LVLOA0: MOVEM C,USWST(U) ;TURN OFF LOADING STATE
3131 SUB T,USWTIM(U) ;TIME IT TOOK TO LOAD
3132 IMUL T,LODFCT ;COMPUTE PROTECT TIME
3136 MOVSI T,1_16. ;MAKE SWAP HISTORY TABLE ENTRY
3139 ;PUT JOB IN W INTO THE 'LOADING' STATE. CALL WITH D CONTAINING USVWRK-UWRKST.
3140 ;WSRCM MUST HAVE BEEN CALLED ALREADY ON THIS JOB. SMASHES A,D,T,TT,I
3142 CFELD: MOVE T,USWST(W)
3144 SOS NUSWB ;CEASES TO BE SWAP-BLOCKED
3145 TLZ T,%SWOUT+%SWSB+%SWDSO+%SWBEM
3148 MOVE T,TIME ;SAVE TIME STARTED TO LOAD
3151 MOVSI T,0 ;MAKE SWAP HISTORY TABLE ENTRY
3154 HLRZ D,D ;NUMBER OF PAGES GOING TO NEED, PROBABLY
3155 MOVE A,MEMFR ;FREE CORE
3156 SUB A,NCBCOM ;FUDGE FOR THINGS IN PROCESS
3159 SUB D,A ;NUMBER OF PAGES GOING TO HAVE TO SWAP OUT
3161 ADDM D,SWPOPR ;START THEM GOING OUT NOW
3165 OVHMTR FLT ;MISC FAULTS
3167 CFH4: TLNE W,100000 ;PAGE-AHEAD OF NON-EX PAGE: DO NOTHING.
3169 JUMPL W,SWIILM ;IF FROM DMA DEVICE, GIVE ERROR
3170 ;HERE FOR FAULTS WHICH ABORT THE INSTRUCTION.
3171 PFA7: MOVE T,OPTION(U) ;IF USER WANTS IT,
3172 TLNN T,%OPOPC ;GIVE HIM THE OPC RATHER THAN
3173 AOSA T,CLKBRK ;THE INCREMENTD PC.
3174 PFA7A: MOVE T,CLKBRK ;HERE FOR KL10 MAR BREAK AND KS10 NXI
3175 ;ERROR, ALWAYS GIVE ORIGINAL PC, INST
3179 MOVEI C,IOADCR ;FROM EXEC MODE SO RESET PC TO IOADCR
3181 HRRM C,LEXFDR(U) ;AND SAVE FAULT EXEC ADR FOR DEBUGGING
3182 CLEARM DLSRCH ;IN CASE IT WAS SET
3183 CLEARM UMAPS(U) ;RESTORE NORMAL MAP IN CASE RANDOM ONE WAS
3186 CLKB1J: HRLM D,LEXFDR(U) ;SAVE PF BITS FOR DEBUGGING PURPOSES
3188 IFN KS10P,[ TRNE D,%PFNXI ;Non-existent IO register in KS10 Unibus.
3192 IFN KS10P, TRNN D,%PFNXI\%PF2.9\%PF2.8
3193 IFN KA10P, TLZE D,210 ;NO ACCESS OR DBL
3194 IFN KL10P, CAIN D,%PFPNA
3198 IFN KA10P, TLZE D,20 ;PURE
3199 IFN KL10P, CAIN D,%PFPRO
3203 IFN KS10P, CAIN D,%PFWRT\%PF2.8
3204 IFN KA10P, TLZE D,100 ;W IN RD ONLY
3205 IFN KL10P, CAIN D,%PFILW
3208 TDNE A,[%PIMPV\%PIWRO\%PINXI]
3209 PUSHJ P,MPVMAS ;SAVE FAULT PAGE # FOR DEBUGGING
3211 ;;; NO ABORT-TYPE FAULTS, CHECK OTHERS:
3214 IFN KL10P, CAIN D,%PFMAR
3219 IFN KA10P,[ TLZE D,2000
3220 PUSHJ P,CPROC1 ;ONE PROCEED
3221 ANDCA D,UPQUAN(U) ;GET BITS FLUSHED BY TLZE'S
3226 ANDCMI D,-1 ;DON'T CLOBBER USER'S RUNTIME.
3227 TLZ D,4 ;DON'T CLOBBER EXEC PAGING FLAG.
3228 TLO D,1 ;IGNORE QUANTUM-TIMEOUT INT.
3231 CLKB1K: LPMR UPGML(U)
3232 CLKB1G: IFN KA10P, CONO 470000+APRCHN ;RESET
3233 CLB1X: MOVE T,CLKBRK ;PUT USER'S PC WHERE IT BELONGS
3236 IOR B,MSKST(U) ;GET OR OF ENABLED AND BAD BITS
3237 AND B,A ;GET AND WITH BITS ACTUALLY ON
3238 JUMPE B,CLB1XA ;NOT BAD OR ENABLED, FORGET ABOUT IT
3239 IORM B,PIRQC(U) ;GIVE INTERRUPT
3240 CAIN T,IOADCR ;READY TO BE INTERRUPTED?
3241 JRST CLKB5 ;NOT QUITE, RUN MOMENTARILY AND WILL UFLS
3242 IFN SCHBLN,SETZM SCHMNY ;DO FULL SCHEDULE TO DELIVER THE INTERRUPT
3245 CLB1XA: MOVSI T,%SWINT .SEE INTPFL ;IF PAGE FAULT DUE TO USER TRYING TO
3246 TDNN T,USWST(U) ;INTERRUPT, BETTER SCHED SO HE GETS THE INT.
3247 SKIPE FLSINS(U) ;ELSE PROCEED THE USER IF HE HAS GOT WHAT HE WANTED.
3248 JRST SCHED2 ;OR IF HE'S WAITING, GO SCHEDULE.
3251 IFN KA10P,[ ;NULL JOB LOST
3252 CNLJL: CONSZ 230220 ;SKIP ON JUST "ADDR BREAK" (QUANTUM OVERFLOW)
3253 BUG PAUSE,[KA: APR ERROR IN NULL JOB]
3257 CFHFPF: BUG PAUSE,[PAGE FAULT IN SYSTEM, PC=],OCT,CLKBRK,[PAGE=],OCT,E
3258 MOVSI D,1770 ;FALSE PAGE FAULT
3266 CONI RINTAP ;SAVE STATUS IN CASE SOMEONE DUMPS IT
3268 BUG AWFUL,[RANDOM INTERRUPT, APR ],OCT,RINTAP,[PI ],OCT,RINTPI
3269 JRST 12,@RINT ;YOU CAN TRY PROCEEDING
3272 RINTAP: 0 ;APR STATUS AT RINT
3273 RINTPI: 0 ;PI STATUS AT RINT
3275 IFN KS10P,[ ; On KS, all random interrupts are created equal.
3294 IFE KS10P,[ ;KS10 HAS NO MAR
3298 HLLZ B,UPOPC(U) ;FLAGS
3302 XOR T,CLKBRK ;DID PC CHANGE FROM START OF INST TO PLACE TRAPPED?
3303 TDNE T,[#<%PCFPD,,>]
3304 TLO B,(@) ;YES, INSTRUCTION COMPLETED, FLAG FOR USER
3305 ] ;KA10P ;LOSES FOR JSR .-1 WITH MAR AT .-1, BUT OTHERWISE OK
3307 MOVE B,CLKBRK ;PC OF FAULTING INST IF USER, OR IOADCR IF EXEC
3308 ; MOVEM B,UPOPC(U) ;SOLELY FOR .OPC USER VAR
3309 ;NOTE- ON KL10 THE INSTRUCTION IS NEVER COMPLETED, DON'T SET 3.5
3312 JRST PCMAR1 ;USR MODE, USE PC FROM PAGER
3313 MOVE B,UUOH ;EXEC MODE, USE USER PC (UUO)
3315 IFN KL10P,[ ;ON KL10 AVOID DOING AOS UUOH AT IOADCR
3320 PCMAR1: MOVEM B,UMARPC(U)
3323 IFN KA10P, DPB B,[220300,,UPMAR(U)] ;DISABLE MAR
3324 IFN KL10P, DPB B,[270400,,UPMAR(U)] ;DISABLE MAR
3330 CPROC1: MOVE T,CLKBRK
3331 TLNN T,%PCUSR ;SKIP IF FROM USER MODE
3333 TRO A,%PI1PR ;GIVE USER INTERRUPT
3336 CPRUUO: MOVE T,[JRST ONEPROC] ;ONE PROCEED INT. FROM EXEC. MODE
3337 MOVEM T,UEXIT ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
3342 JRST AROV2 ;NOT REALLY SET OR SET BY SYS
3344 SKIPE PICLR(U) ;SKIP IF INTERRUPTS TO USER NOT ENABLED
3345 TRO A,%PIARO ;GIVE USER INTERRUPT
3348 AROV2: MOVEM T,CLKBRK
3360 ;;; HANDLE PARITY ERRORS.
3362 CLKB1E: SETZM PARDIE ;AT FIRST ASSUME THE PAR ERR ISN'T FATAL.
3363 CONO PI,PIOFF ;TURN OFF WORLD
3364 IFN KA10P, CONO PI,240000 ;RESET
3365 IFN KL10P,[ ;CLEAR THE CACHE
3371 CLRCSH ;Clear the cache
3374 TDNE B,SUPCOR ;IF PREV ERROR NOT PRINTED, PRINT IT NOW AND PAUSE
3375 BUG PAUSE,[TOO MANY PARITY ERRORS. PREV STATUS=],DEC,PARCNT,OCT,PARAAN,OCT,PARAOR,OCT,PARAND,OCT,PARIOR
3376 IORM B,SUPCOR ;TELL SYS JOB TO PRINT OUR DATA WHEN WE FINISH.
3377 AOS PARERR ;COUNT # OF PAR ERRS SINCE SYSTEM STARTED.
3378 SETOM PARAND ;INIT LOGAND AND LOGOR OF ALL BAD DATA WORDS
3380 SETOM PARAAN ;AND SIMILAR FOR ADDRESSES OF PAR ERRS.
3385 MOVEM T,PARUSR ;REMEMBER WHICH JOB GOT THE PAR ERR.
3386 JUMPL T,PARSCJ ;PAR ERR IN NULL JOB? OR WHAT?
3388 SKIPE PARRSN ;PAR ERR IN WORD NOT REFERENCED
3389 JRST PARSCJ ; SHOULDN'T SCREW THE RUNNING JOB
3392 SETOM PARDIE ;PAR ERR IN A SUPERVISOR-MODE JOB IS HOPELESS.
3394 IORM TT,PIRQC(T) ;GIVE RUNNING USER A PARITY ERROR (CLASS 1 INT)
3397 PUSH P,PFNPC ;MAKE SURE THE PAR ERRS WE DETECT WHILE SCANNING DON'T
3398 MOVEI D,PARFX4 ;CALL US RECURSIVELY (ON KA, THAT'S DONE BY HAVING
3399 MOVEM D,PFNPC ;CLKCHN OFF)
3402 PUSH P,EPTP7N ;Same hack for the KS except page fails trap
3403 MOVEI D,PARFX4 ;as a function of current PI level.
3406 MOVEI D,0 ;POINTER TO ERROR BUFFER
3408 PUSHJ P,PARSCN ;SCAN MAIN MEM BLOCKS
3410 MOVE TT,[-LPDP6M,,PDP6BM_-10.] ;SCAN PDP6 MEM FOR PARITY ERRORS
3411 SKIPGE PDP6UP ;BUT NOT IF PDP6 IS DOWN.
3416 CONO 024400+APRCHN ;CLEAR PAR ERR FLAGS.
3420 CONO 020200+APRCHN ;CLEAR FLAG
3421 MOVSI A,%KEHLD+%KEREF ;CLEAR STATUS AND ERROR ADDR
3425 DPB A,[.PAREP+EXEUMP]
3426 LPMR PARPG ;SET UP MAP WITH PARPG SET TO MPV.
3427 MOVEM D,PARCNT ;SAVE AWAY COUNT OF ERRORS IN BUFFER
3429 BUG HALT,[PARITY ERROR IN SYSTEM MEMORY. CNT=],DEC,PARCNT,[ADR AND ],OCT,PARAAN,CR,0,[ ADR IOR ],OCT,PARAOR,[DATA AND ],OCT,PARAND,[DATA IOR ],OCT,PARIOR
3430 ;FATAL ERROR (DONT ALLOW CONTINUE SINCE ERR IS
3431 ;KNOWN TO BE A LOSER)
3432 CONO PI,PION ;TURN WORLD BACK ON
3436 PARFX3: HRRZ T,TT ;SCAN AOBJN POINTER IN TT
3439 LDB T,[MUR,,MEMBLT(TT)]
3441 JRST PARFX8 ;HOLE THERE
3442 PARFX7: MOVEI T,600000(TT) ;NOTE THAT WE ARE NOT ENABLING THE CACHE.
3443 DPB T,[.PAREP+EXEUMP] ;ON KL10 THIS WILL CAUSE A 1-WORD READ.
3444 LPMR PARPG ;SET UP TO CHECK PAGE # IN TT
3445 MOVEI B,0 ;ADDRESS WITHIN PAGE
3447 IFN KA10P, CONO PI,200000 ;CLEAR PAR ERR
3448 PARFX5: MOVE C,400000+PAREP*2000(B) ;REFERENCE EVERY MEMORY LOCATION
3450 ;;ON KA, MUST CHECK EXPLICITLY.
3451 ;;ON KL AND KS, PAR ERR WILL TRAP RIGHT TO PARFX4.
3452 CONSZ PI,200000 ;PARITY ERR?
3455 CAIGE B,1777 ;SKIP ON FINISHED WITH BLOCK
3457 PARFX8: AOBJN TT,PARFX3 ;CHECK NEXT PAGE
3460 PARFX4: ;HERE WHEN THE SCAN FINDS A WORD WITH BAD PARITY
3461 IFN KL10P, HRRZ T,PFOPC
3462 IFN KS10P, HRRZ T,EPTP7O
3464 ;;DID THIS TRAP COME FROM SCAN LOOP WHERE WE EXPECT THEM?
3468 UMOVE C,0 ;GET CONTENTS OF LOCATION WITH BAD PARITY
3471 SETO T, ;MAKE SURE T ISN'T ACCIDENTALLY 0 AT PARFX6.
3474 IOR E,B ;MAKE MEM ADR
3475 CAIGE E,20 ;PAR ERR IN SHADOW ACS ISN'T SERIOUS.
3477 ANDM E,PARAAN ;UPDATE ANDS AND ORS OF DATA AND ADRS
3483 SETOM PARDIE ;PARITY ERROR IN EXEC CORE
3487 LDB T,[MUR,,MEMBLT(TT)]
3497 SETOM PARDIE ;ERR IN CRITICAL MEMORY (DISK DIR, ETC)
3498 PARFX6: MOVEM C,400000+PAREP*2000(B) ;FIX UP MEMORY AS BEST WE CAN
3499 MOVEM C,PARCON(D) ;SAVE LOSING CONTENTS
3500 MOVEM E,PARADR(D) ;SAVE LOSING ADDRESS
3501 CAIL D,MXPARS-1 ;OVERFLOWING BUFFER?
3502 SOS D ;JUST DON'T CLOBBER STUFF. AT LEAST PARAND, ETC. WILL BE VALID.
3504 PUSH P,D ;PAR. ERR IN USER MEMORY,
3508 PUSHJ P,UCPRL4 ;HAS ANY JOB WRITTEN IN THIS PAGE?
3510 JUMPL D,PARFXB ;SOMEONE HAS; JUST GIVE EVERYONE AN INTERRUPT.
3511 PUSHJ P,UCPRL4 ;DOES MMP SAY PAGE WAS WRITTEN? IF SO, SET SIGN(D);
3512 200000,,PARFU2 ;OTHERWISE, SET MMPBAD, CAUSING PAGE TO BE RELOADED FROM DISK.
3514 PARFXB: PUSHJ P,UCPRL4 ;PAGE HAS BEEN WRITTEN SINCE LAST ON DISK, SO WE CAN'T ESCAPE
3515 400000,,PARFU3 ;GIVING EVERY JOB AN INTERRUPT.
3517 PARFX9: AOS B ;INCREMENT B HERE SO YOU DON'T HACK THE SAME
3518 ; WORD AGAIN. IF THAT WORD WAS SOLIDLY BAD,
3519 ; THIS CODE WOULD LOOP
3520 CAIG B,1777 ;MIGHT BE DONE WITH PAGE
3524 PARFU1: CAIG U,LUBLK
3525 SETOM PARDIE ;SYS JOB OR CORE JOB HAS PAGE
3527 MOVE A,I ;FIND PAGE-MAP HALFWORD FOR THIS PAGE
3532 CAIE A,1 ;MAP SET UP TO A PAGE, AND IN READ-ONLY MODE?
3534 DPB A,T ;YES, UNMAP IT SO THAT NEXT ACCESS WILL TRAP AND GO TO CFHPB
3535 SOS MMSWP(D) ; IN CASE WE WILL SET MMPBAD.
3536 ;NOTE, THIS MAY CRASH THE SYSTEM IF THE JOB WAS RUNNING IN A UUO,
3537 ;HAD CHECKED ACCESS TO THE PAGE, AND WAS ASSUMING IT COULD ACCESS
3538 ;IT AGAIN SAFELY. USUALLY THIS ONLY HAPPENS WHEN WRITING, HOWEVER.
3539 IFN SWPWSP, ;DON'T BOTHER ADJUSTING WORKING SET. WILL BE FIXED ON NEXT SWAPIN.
3541 PARFU4: TLO D,400000 ;IF THIS JOB HAS WRITTEN THE PAGE, SET SIGN (D)
3542 POPJ P, ;TO SIGNAL THAT SETTING MMPBAD IS NO USE.
3544 PARFU2: MOVE T,(C) ;C HAS ADDR OF MMP ENTRY; HAS PAGE BEEN WRITTEN BY A JOB
3545 TLNN T,MMPWRT ;THAT NO LONGER HAS IT IN MAP?
3546 TLNN T,MMPWOD ;OR HAS IT NEVER BEEN ON DISK?
3547 JRST PARFU4 ;IF SO, AVOID SETTING MMPBAD, AND INTERRUPT EVERYONE.
3549 JUMPE T,PARFU4 ;DITTO IF THERE IS NO DISK SPACE ASSIGNED.
3554 PARFU3: MOVSI T,(%PIPAR)
3560 LDB B,[221100,,UPJPC(U)] ;FAULT ADDR
3561 TRZN B,400 ;SKIP IF REFERENCE WAS VIA USER MAP
3566 HRLI C,PMLCAD ;POINTER TO CORE ADR FIELD OF LH PAGE IN MAP WD
3568 HRLI C,PMRCAD ;RH MAP WD
3569 LDB C,B ;C GETS PAGE #
3570 CAIGE C,<PDP6BM_-10.>+LPDP6M
3575 JRST MEMHN3 ;USER MODE PDP6 NXM
3576 MOVEI B,IOCER3 ;PDP6 MEM
3582 ; JRST 4,.+1 ;COMMENTED OUT SINCE NXM STOP SHOULD ALWAYS BE SET.
3584 IFN KA10P,CONO 10000+APRCHN ;CLEAR NON EX MEM AFTER HALT TO RESET MEMORY
3585 IFN KL10P,CONO 22000+APRCHN
3587 CONO 20400+APRCHN ;Clear APR flag
3588 MOVSI B,%KEHLD+%KEREF ;Clear saved error address
3592 TDNE B,SUPCOR ;Haven't printed previous error?
3593 BUG PAUSE,[TOO MANY NXM ERRORS.]
3603 MEMHN3: MOVSI B,%PIMPV ;PDP6 NXM GIVE MPV INTERRUPT
3607 \fSUBTTL SLOW CLOCK SERVICE ROUTINE
3609 OVHMTR SLW ;SLOW CLOCK
3611 SSLCK: SKIPGE SHUTDN ;SYSTEM "DEAD" =>
3612 PUSHJ P,COFFIN ;GO TO DDT AFTER RIGOR MORTIS SETS IN.
3613 SETCMB A,SCKPHS ;CHECK SYSTEM CHECKSUMS EVERY OTHER SLOW CLOCK TICK
3614 MOVE T,SUPCOP ;WHICH IS ONCE PER SECOND.
3618 CONSO 100 ; Check for memory ECC corrected errors
3620 IORD A,[KSECCS] ; A: status and error addr
3621 MOVEM A,ECCERA ; Remember most recent one
3622 AOS ECCERR ; Also count 'em
3623 CONO 20100+APRCHN ; Clear memory ECC APR flag
3624 MOVSI T,%KEHLD+%KEREF ; Clear status and error addr
3627 AND A,ECCAND ; A: AND of previous errors
3628 IOR T,ECCIOR ; T: IOR of previous errors
3629 CAMN A,ECCAND ; If either changes, this is news.
3631 BUG INFO,[MEMORY: ECC CORRECTED ERROR],OCT,ECCERA
3634 SSLCK0: ] ;IFN KS10P
3635 IFN NETP,PUSHJ P,NETCLK ; Run 1/2 sec clock routines for various net stuff
3636 IFN NETYS, SETOM DTECHK ;TELL 11 WE'RE ALIVE
3639 CONO DPK,TTYCHN ;CROCK - IF DPK LOSES ITS PIA, GIVE IT BACK.
3644 SETOM UTBFLF ;SIGNAL CORE JOB TO FLUSH UTAPE BUFFERS
3646 SSLCK2: SKIPE UTTYCT ;SKIP IF NO NEW USERS
3647 SKIPL TREESW ;SKIP UNLESS SOMEBODY'S MUNGING THE TREE STRUCTURE.
3649 PUSHJ P,USTART ;NEW USER TO START
3654 MOVEM T,DWDS ;RESET DISPLAY RATE COUNTER
3656 CONO PI,UTCOFF ;UTC OFF WHILE HACKING UTAPE, MTAPE, DISK, ETC.
3664 AOSN UIDLE ;SKIP IF DEC TAPE NOT IDLE
3665 JRST [MOVEM T,LUTOTM ? JRST SSLCK1] ;DEC TAPE IDLE
3666 SUB T,LUTOTM ;SUBTRACT LAST UTC OPERATION TIME
3668 CAIGE T,MXOPT*SCLKI ;SKIP IF DEC TAPE HUNG TOO LONG ON ONE OPERATION
3670 SETOM UTHERR ;SET UTC HUNG ERR FLAG
3671 SSLCK1: CONO UTC,CUINT ;CAUSE DEC TAPE INTERRUPT ROUTINE TO RUN
3677 JRST [MOVEM T,LUTOTM ? JRST SSLCK1]
3686 SKIPL QSDU ;IF DISK TRANSFER IN PROGRESS
3687 JRST [ MOVE T,LQTM ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3690 PUSHJ P,QHUNG ;YES, UNHANG THE DISK
3693 SKIPL QSDU1 ;IF TRANSFER IN PROGRESS ON OTHER CONTROLLER
3694 JRST [ MOVE T,LQTM1 ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3697 PUSHJ P,QHUNG1 ;YES, UNHANG THE DISK
3700 IFN DC10P, PUSHJ P,QRCTMO ;RECALIBRATE TIMEOUT
3702 PUSHJ P,QSTRTR ;WAKE UP DISK ROUTINES
3703 IFN NMTCS, PUSHJ P,MSTRTR ;WAKE UP MAG TAPE ROUTINES (MUST BE SEPARATE INTR)
3707 IFG NMTYS,[ ;TRY TO UNHANG MORTON TTY CARDS
3708 MOVE I,[-NMTYS,,NFMTY]
3710 SUBI T,60. ;IF HAVEN'T TYPED FOR 2 SECONDS
3711 SSLCM1: SKIPL TTYOAC(I) ;YET SUPPOSED TO BE TYPING
3715 CONO MTY,@TTYLT(I) ;SELECT THE LINE
3716 DATAO MTY,[0] ;AND BANG ON IT
3717 CONO PI,TTYON-1 ;MAYBE IF WE'RE LUCKY ITS DONE FLAG WILL COME ON
3718 SSLCM2: AOBJN I,SSLCM1
3721 IFN KAIMP, CONI IMP,IMPCNI ;KEEPS HOST READY ON
3723 ;KS doesn't drop interrupts, I hope
3724 PUSHJ P,IMPOST ;START UP OUTPUT
3728 PUSHJ P,IMPCCL ;CLOSE NETWORK CHANNELS
3730 PUSHJ P,IMPAAA ;WAKE UP STYS THAT NEED IT
3732 SKIPGE IMPTCU ;IF IMP IS TRYING TO COME UP
3733 AOSE IMPUCT ;AND UP-COMING TIMEOUT EXHAUSTED
3735 BUG INFO,[NET: TIMED OUT TRYING TO COME UP]
3736 MOVEI A,1 ;THEN MAKE IT STAY DOWN
3737 MOVEM A,IMPUP ;IF THIS IS ML-KA THE IMP CABLE PROBABLY BROKE AGAIN
3742 CONO DSDEV,DSDCHN ;ENABLE INTERRUPTS FROM 6
3748 BUG CHECK,[TTY: TIMEOUT ON OUTPUT XFER TO DTE, DTEBBY],OCT,DTEBBY
3752 ;SEE IF THE TV PDP11 WANTS TO GO DOWN.
3753 SKIPN TEN11F ;PROVIDED THE PDP11 IS THERE,
3754 SKIPN TT11P ;AND WE'RE TRYING TO USE IT,
3756 LDB A,[061600,,TT11HA] ;DOES 11 WANT WHO LINES UPDATED?
3757 CAIL A,2000*NTTPG ;RANGE CHECK SO CLOBBERED 11 MEMORY DOESN'T CAUSE ILL MEM REF
3758 BUG HALT,[GARBAGE POINTER IN TV-11 MEMORY]
3759 SKIPGE 1+400000+TTPG0*2000(A)
3760 JRST [ MOVEI T,SCRWHO ;YES
3762 CLEARM 1+400000+TTPG0*2000(A)
3764 SKIPE TT11DN ;IF IT IS REQUESTING TO GO DOWN,
3766 SETZM TT11P ;DON'T USE IT & WAIT FOR IT TO RE-INIT,
3768 MOVEM T,TT11DN ;GIVE IT OUR PERMISSION TO GO DOWN.
3769 MOVEI T,SCR11D ;CAUSE "11 DOWN" MESSAGE
3771 SSLCK5: SKIPN TEN11F
3772 SKIPG TT11P ;WAITING FOR 11 TO BE UP?
3774 SKIPN TT11UP ;SKIP ON 11 UP
3777 IORM T,SUPCOR ;INIT THE TTYS
3780 SKIPLE T,AGERTE ;IF IT'S ENABLED, AGE SOME PAGES
3788 SETOM DL10UP ;COULD ALSO CHECK WHETHER PDP11 IS INCREMENTING THIS.
3790 TRNE A,20 ;SEE IF PDP11 HALTED.
3792 BUG INFO,[I/O PDP11 WENT DOWN]
3800 AOS QACTTM ;Bump this for benefit of QSK dir writers.
3801 SKIPN SWPOPR ;If there is a request to swap out pages
3802 SKIPE SOLNG ; or if there are pages now going out
3803 JRST SSKQ2 ; do not bother with LMEMFR, warnings.
3804 MOVN A,LMEMFR ;See how many free low-memory pages.
3806 JUMPLE A,SSRCK ;Okay
3807 AOS NCORRQ ;Wake up core job to do some shuffling
3809 ADD A,LMEMFR ;Core wanted minus high free
3811 ADDM A,SWPOPR ;Swap out to make room.
3812 ;Check to see if we are running out of various resources.
3813 ;RSWTIM is a timestamp of last warning, initialized by DATIM6 and PDDCHK.
3814 SSRCK: MOVE A,RSWTIM ;Get time we last checked.
3816 CAML A,TIMOFF ;If we checked less then 30 secs ago
3817 JRST SSKQ2 ; don't deluge the console.
3818 MOVE A,TIMOFF ;Else remember that we are cheking now.
3820 MOVEI A,5 ;There should be at least 5 free low pages.
3821 CAMLE A,LMEMFR ;If there are not, print warning.
3822 BUG INFO,[Warning: Just ],DEC,LMEMFR,[ free pages in low core.]
3823 SKIPN QFCHN ;Check disk channels.
3824 BUG INFO,[Warning: No free qsk channels.]
3825 MOVN A,USRHI ;Check job slots.
3829 BUG INFO,[Warning: System full - no job slots.]
3833 PUSHJ P,DISCHK ;CHECK FOR 340 DEATH
3835 PUSHJ P,PDCCHK ;CHECK ON REAL-TIME HACKS
3837 PUSHJ P,PTRCHK ;CHECK ON PAPER TAPE READER
3838 PUSHJ P,PTPCHK ;CHECK ON PAPER TAPE PUNCH
3840 IFE KS10P,[ ; Silly KS10 doesn't have devices...
3845 SCDCK1: SKIPGE A,DCHNTC(I)
3853 SCDCK2: AOBJN I,SCDCK1
3854 SCDCK3:; JSP E,CHECK ;CHECK FOR CLOBBERED DEVICES
3858 MOVE A,NLPTBR ;IF LPT OUTPUT BUFFER NOT EMPTY
3860 JRST [ CONSZ NLPT,100 ;AND LPT IS READY
3861 CONSZ NLPT,7 ;BUT HAS NO PIA
3863 CONO NLPT,LPTCHN ;THEN IT LOST AGAIN
3864 AOS NTNLPL ;COUNT NUMBER OF TIMES NEW LPT LOST
3869 ;THIS ASSUMES THAT THE PDP-10/XBUS ADDRESS OFFSET IS ZERO
3870 ECCLOG: MOVE B,400000+ECCPG*2000+1760
3872 CAMN B,ECCIDX ;DID ECC HISTORY POINTER ADVANCE?
3874 AOS A,ECCIDX ;YES, GET NEXT WORD FROM ECC HISTORY
3875 MOVE B,400000+ECCPG*2000+1760-1(A)
3876 ANDI A,17 ;ADVANCE OUR COPY OF POINTER
3878 LDB A,[240700,,B] ;SYNDROME BITS
3879 TLZ B,777774 ;REDUCE B TO ADDRESS BITS
3880 BUG INFO,[MEM: ECC ERROR, ADDRESS ],OCT,B,[SYNDROME],OCT,A
3881 JRST ECCLOG ;LOOK FOR MORE HISTORY
3885 PUSHJ P,GPDTIM ;WHAT CALENDAR TIME IS IT?
3887 EXCH A,LPDTIM ;REMEMBER IT FOR NEXT CLOCK TICK.
3888 JUMPL A,ALCR0 ;TIME NOT KNOWN THIS AND/OR LAST TICK => DO NOTHING
3889 SUB A,LPDTIM ;ELSE HOW LONG HAS IT BEEN SINCE PREVIOUS TICK?
3890 CAML A,[-5*PDUPS] ;MORE THAN 5 SECONDS? SHOULD ONLY BE 1/60
3891 JRST ALCR0 ;ONLY EXPLANATION IS ITS WAS STOPPED AND CONTINUED.
3892 SKIPL SYSDBG ;SO UNLESS THAT'S NORMALLY EXPECTED
3893 PUSHJ P,DEATHM ;TELL THE WORLD "ITS REVIVED"
3894 MOVE T,TIME ;REMEMBER WHEN THIS LAST HAPPENED
3900 ;DECAY VARIOUS EXPONENTIAL AVERAGES. ON KA10, RUN IN ACS SINCE IT'S FASTER.
3901 ;ON KL10, DON'T, SINCE IT'S SLOWER. ON KS10, DON'T, BECAUSE IT IS
3902 ;JUST AS FAST TO RUN IN THE ACS BUT IT WASTES TIME TO MOVE THE CODE
3912 ALCR1: MOVN T,USRRCE(U) ;A ;DECAY USRRCE AVERAGES
3915 CAMLE T,SLOADU ;D ;AND SET SLOADU TO HIGHEST USRRCE
3921 IFE KA10P, AOBJN U,ALCR1
3924 ASH T,-4-2 ;DISOWNED JOBS (DECAY SLOWER)
3926 IMULI T,1999. ;MAKE COMMENSURATE WITH REGULAR USRRCE'S
3927 ASH T,-13. ; (You might think that you could just
3928 ; divide by 4, but in fact the ratio
3929 ; between the two decay rates is
3930 ; ln(64/63)/ln(16/15) = .24401474)
3931 ADDM T,SLOADU ;DISOWNED TIME COULD HAVE BEEN USED BY REAL
3934 ASH T,-4+1 ;SYS, CORE, AND SOME DAEMON JOBS (DECAY FASTER)
3936 IRPS RCE,,LOSRCE IDLRCE
3937 MOVN T,RCE ;LOST TIME AND IDLE TIME
3941 ADDM T,SLOADU ;IDLE TIME COULD HAVE BEEN USED BY USERS
3943 IFE KS10P, MOVE A,[193682794.] ; = 100. * 250000. * .5 / ln(16/15)
3944 ; (100% of 250000. four usec ticks per second,
3945 ; decaying by 16/15 every .5 second.)
3946 IFN KS10P, MOVE A,[198524864.] ; = 100. * 256250. * .5 / ln(16/15)
3947 ; (256250. 3.9 usec ticks per second.)
3949 ; MOVE A,[100.*15.*125000.] ;100% DIVIDED BY MAXIMUM SINGLE TREE %
3950 ADD A,LOSRCE ;WITH FUDGE FACTOR FOR LOST TIME
3951 IDIVM A,SLOADU ;GIVES EFFECTIVE # OF COMPETITORS FOR MACHINE.
3952 ; It is possible for SLOADU to drop below 100. (giving a fair share greater
3953 ; than 100%). This happens because the decay rate for disowned jobs is
3954 ; less than the decay rate for consoles. If the load switches abruptly
3955 ; from the disowned jobs to some console, the resource word for the console
3956 ; fills up quicker than the disowned resource word decays, causing their
3957 ; sum to briefly exceed the maximum. This would be hard to fix without
3958 ; introducing additional resource words just for better maintaining SLOADU.
3960 ; An additional odd effect: If only disowned jobs are running, and a
3961 ; network server starts up, the fair share drops almost to zero. This is
3962 ; because when such jobs are created, their resource word is zeroed to
3963 ; given them an initial priority boost.
3972 ALCR4: MOVN H,JTMU(T) ;A
3985 IFE KA10P, JRST ALCR4
3990 SUBI U,LUBLK ;ACCOUNT FOR I/O WAIT TIME IN USWPRI
3991 MOVSI T,%SWOUT+%SWPGW
3997 ALCR5: SKIPE UNAME(U) ;A ;IGNORE JOBS WHICH DON'T EXIST OR
3998 TDNE T,USWST(U) ;B ;ARE SWAPPED-OUT OR IN PAGE-WAIT
3999 IFN KA10P, JRST I ;C
4000 IFE KA10P, JRST ALCR6
4001 SKIPN USTP(U) ;D ;CHARGE JOBS WHICH ARE STOPPED
4002 SKIPE FLSINS(U) ;E ;OR BLOCKED
4004 ALCR6: SUBI U,LUBLK ;I ;NEXT JOB
4009 IFE KA10P, JUMPG U,ALCR5
4011 SKIPGE 37 ;CHECK FOR PLANNED SYSTEM DEATH
4012 PUSHJ P,DEATH ;ABOUT TO START DYING
4014 IRPS 4US,,[IDLTM1 LOSTM1 USRTM1 NULTM1]SEC,,[IDLTIM LOSTIM USRTIM NULTM3]
4015 MOVE A,4US ;KEEP SYSTEM WIDE USAGES AS TWO WORDS
4016 IDIVI A,250000. ;ONE IN 4.069 USEC UNITS
4017 ADDM A,SEC ;AND ONE IN SECONDS
4018 MOVEM B,4US ;SO NO OVERFLOW
4020 IMULI A,60. ;CONVERT TO 60THS
4021 ADDM A,NULTIM ;ADD TO 60THS USED (OBSOLETE)
4024 JRST CLQREE ;RE-ENTER RQ FOR SLOW CLOCK BREAK
4026 IFN SWPWSP,[ ;JOB IN U NEEDS TO BE CHARGED FOR MEMORY USED WHILE BLOCKED OR STOPPED
4027 ALCR7: HLLO W,UWRKST(U)
4028 JFFO W,.+1 ;H GETS 19 - LOG(WORKING SET SIZE + 1/2)
4030 IMUL H,[-125000.] ;CHARGE FOR 1/2 SECOND OF MEMORY USAGE
4033 IFE KA10P, JRST ALCR6
4036 ;SYSTEM IN FINAL THROES OF COMING DOWN, SEE IF IT'S OVER YET
4038 COFFIN: MOVE T,NLOOSP ;MUST SWAP OUT ALL LOOSE PAGES
4040 JUMPN T,CPOPJ ;SWAPPAGE OUT STILL GOING ON
4041 MOVEI T,NQCHN+1+NQS-1
4044 SKIPL QSGL(T) ;NOT OVER IF ANY DISK CHANNELS ARE ACTIVE
4047 MOVE TT,QACTB ;SEE IF DISK STUFF NOT OUT YET
4049 POPJ P, ;MFD NOT OUT
4051 COFFI8: TDNE T,QTUTO(A)
4052 JRST COFFI9 ;TUT NEVER CAME IN
4054 POPJ P, ;TUT NOT OUT
4055 COFFI9: AOBJN A,COFFI8
4057 COFFI1: SKIPN QSNUD(A)
4060 POPJ P, ;UFD NOT WRITTEN
4061 COFFI2: AOBJN A,COFFI1
4066 POPJ P, ;TAPE STILL FLAPPING
4070 ADDI A,15.*30. ;DON'T WAIT FOR CONSOLES MORE THAN 15 SECONDS
4071 CAMGE A,TIME ;BECAUSE %TCHNG ISN'T NECESSARILY SET
4073 MOVEI A,NFSTTY-1 ;CHECK FOR REAL CONSOLES STILL TYPING OUT
4074 MOVSI T,%TCHNG ;AND NOT HUNG (NEVER GOING TO FINISH TYPING OUT)
4078 JUMPGE A,CPOPJ ;A CONSOLE IS STILL TYPING, DON'T GO DOWN YET
4079 COFFI3: SKIPL A,SYSCN
4082 POPJ P, ;SYSTEM CONSOLE HAS A LOT OF TYPING TO DO
4084 COFFI7: CAML A,USRHI
4087 POPJ P, ;JOBS STILL EXIST
4091 ;SYSTEM FULLY DOWN; GO TO DDT.
4092 COFFI4: BUG DDT,[SHUTDOWN COMPLETE]
4093 SETZM SHUTDN ;IF USER PROCEEDS, BRING SYSTEM BACK UP
4094 SETZM DEDTIM ;ARRANGE TO RELOAD ATSIGN DRAGON
4095 SETZM FLSINS ;BY RESTARTING SYS JOB WHERE IT DOES THAT
4100 ;ROUTINE TO AGE SOME PAGES. THIS ROUTINE SLOWLY CIRCULATES THROUGH
4101 ;CORE. IF IT TOUCHES A PAGE TWICE, AND NO USER HAS TOUCHED IT,
4102 ;THE PAGE GETS SWAPPED OUT. ALSO FLUSHES PAGES NOT IN ANY USER'S MAP.
4103 ;ENTER WITH VALUE OF AGERTE IN T.
4107 POPJ P, ;NO MEMORY COMPETITION, DON'T BOTHER
4108 ADD T,AGEREQ ;INCREASE NUMBER OF PAGES NEEDING TO BE AGED
4109 CAIGE T,100 ; BUT DON'T LET IT GET INFINITELY HUGE
4110 MOVEM T,AGEREQ ; IF CIRPSW IS LOCKED FOR A LONG TIME
4111 SKIPN DLSRCH ;IF MUSTN'T PCLSR ANYONE, OR
4112 SKIPL CIRPSW ; IF CIRPSW LOCKED, HAVE TO WAIT UNTIL NEXT SLOW CLOCK
4114 LDB W,[121000,,HUSRAD] ;DON'T AGE SYSTEM JOB (CIRC PNTRS NOT CONNECTED)
4115 MOVE A,AGEPOS ;CONTINUE AGEING FROM WHERE LEFT OFF LAST TIME
4116 SKIPGE U,USER ;CHECK FOR NULJOB
4118 MOVE T,CLKBRK ;PC FOR USER WHO MAY GET PCLSR'D
4119 MOVEM T,UPC(U) .SEE SWOP2
4120 LPMR UPGML(U) ;DON'T LEAVE SWAPPED OUT PAGES IN ASSOC MEM
4125 JRST [ MOVEM A,AGEPOS ? SETZM AGEREQ ? POPJ P, ]
4127 LDB T,[MUR,,MEMBLT(A)]
4133 MOVNI C,1 ;NO USERS ACTIVELY USING THIS PAGE, SWAP IT OUT
4138 AGE1: MOVEI C,UPGMP(U)
4139 MOVE T,I ;DON'T CLOBBER I
4145 LDB T,C ;GET PAGE MAP WORD
4147 POPJ P, ;USER NOT CONNECTED TO THIS PAGE
4149 POPJ P, ;HASN'T TOUCHED THIS PAGE SINCE AGE BITS LAST SET
4150 DPB T,C ;HAS TOUCHED PAGE, TURN AGE BITS BACK ON
4151 SUB P,[4,,4] ;AND BACK OUT OF UCPRL
4156 DISCHK: SKIPGE DISOFF
4163 DISZAP: MOVE T,[JSR DBLKPB]
4165 MOVEI T,DIS300-1 ;CAUSE 340 TO STOP AND INTERRUPT SOON
4168 CONO DIS,5100+SDCHN_3+DISCHN
4174 SETZM 37 ;CLEAR START DYING FLAG
4175 MOVEI T,60.*5.*60. ;5 MIN
4182 DEATHX: SKIPN T,DEDTIM
4190 DEATHY: MOVEM TT,DEDTIM
4194 DEATHM: MOVEI A,%PIDWN
4195 PUSHJ P,INTALL ;TELL THE WORLD
4196 MOVSI T,SCLSHD ;CAUSE TYPE OUT ON UNLOGGED-IN CONSOLES
4197 SUPSET: IORM T,SUPCOR
4200 VSSLCK: MOVSI T,SCLVSK
4201 IORM T,SUPCOR ;CAUSE VERY SLOW CLOCK TO RUN
4207 RCCLK: DATAI 374,T ;HACK CHESS CLOCK
4217 WHOSET: MOVEI T,SCRWHO ;CAUSE SYS TO UPDATE WHO LINES
4219 MOVEI T,5.*60.-5 ;5 SECONDS MINUS A LITTLE SO DOESN'T SYNC WITH OTHER CLOCKS
4224 SUBTTL SWAP SCHEDULER
4226 OVHMTR SWS ;SWAP SCHEDULER
4230 IFN IMPP, PUSHJ P,IMRSTO ;RESET CONTROL LINK RFNM WAIT FOR LOSING IMP.
4232 ;RECOMPUTE SWAP BLOCK DATA.
4233 ;DECAY SWAP PRIORITIES (USWPRI AND SWRCE)
4234 ;RESET BEST-EFFORT-HAS-BEEN-MADE TO SWAP OUT BITS
4236 MOVSI B,%SWBEM ;SET UP TO CLEAR "BEST EFFORT TO SWAP OUT BIT"
4237 SETOM SBEFLG ;NOT YET DESPERATE ENOUGH TO TRY USERS WHOSE BEST EFFORT BITS ARE SET
4239 CLEARB T,NUSWB ;# USERS LOCKED OUT
4240 SETOM BUSR ;SMALLEST SWAPPED BLOCKED USER
4241 MOVE D,[37777,,777777]
4242 MOVEM D,BUSIZ ;SIZE OF SMALLEST SWAP-BLOCKED USER.
4243 CLEARM ASBUM ;REAL MEM OCC BY ACTIVE SWAPPED BLOCKED LOSERS
4244 MOVSI D,400000 ;TO CLEAR SWAPPED BLOCKED BIT
4246 .ELSE MOVEI T,LUBLK*2
4253 ADDM C,USWPRI(T) ;DECAY JOB SWAP PRI'S
4257 SUBI C,1 ;COMPENSATE FOR PAGE ZERO ALWAYS IN
4259 CAMLE C,NSWPGS(T) ;SKIP ON NOT COMPLETELY OUT
4260 ANDCAM B,USWST(T) .SEE %SWBEM
4263 JRST 15S4 ;CLEAR SWAPPED BLOCK BIT AND MAYBE ADD TO AUSOPG AND TRUMM (IF HE WAS HUNG ON IT)
4271 PUSHJ P,SWSCD ;SWAP BLOCK LOSERS IF NECESSARY
4274 15S5: MOVN C,SWRCE(T) ;DECAY TREE SWAP PRI'S
4283 15S4: ANDCAM D,USWSCD(T) ;CLEAR SWAP BLOCK BIT
4284 SKIPN TT,FLSINS(T) ;WAS HE HUNG TESTING IT
4287 CAME TT,[SKIPGE USWSCD]
4288 JRST 15S3 ;HE WASN'T HUNG ON THIS
4289 CLEARM FLSINS(T) ;HE WAS SO NOW HES ACTIVE
4292 SOS NPGWTU ;FLSINS WAS SET BY PAGE FAULT, SO CONSIDERED
4293 TLZ TT,%SWBEM ;TO BE WAITING FOR A PAGE
4296 ADDM TT,TRUMM ;GUY IS NOW RUNNABLE
4297 SUB TT,NSWPGS(T) ;ANY PAGES HE MAY HAVE IN MEM NO LONGER BELONG TO A BLOCKED USER
4302 MOVE TT,NSWPGS(T) ;ANY SWAPPED OUT PAGES BELONG TO AN ACTIVE USER
4309 PRVCLK: SKIPN ENPVCL
4314 SETOM PRVUSR ;TURN OFF CURRENT PRIVILEDGED USER
4316 PRVCK1: CAML J,USRHI
4320 MOVE B,UTRNTM(J) ;GET USER RUN TIME
4324 IMUL A,[NPVSEC*125000.] ;1/2 NUMBER OF 4 MICROSECOND INTERVALS IN THE PRIV INTERVAL
4328 LSH B,-1 ;DIVIDE LAST VALUE BY TWO
4330 MOVEM A,UPGSEC(J) ; LAST/2 + CURRENT
4334 MOVEM A,LSIPRQ(J) ;SAVE OLD VARIABLES
4335 PRVCK3: ADDI J,LUBLK
4338 PRVCK2: PUSHJ P,NPRVUS ;GET NEXT PRIV USR
4339 PRVCK4: MOVEI T,NPVSEC*60.
4343 NPRVUS: MOVEI J,2*LUBLK
4345 MOVNI T,30.*2 ;DON'T LET A BLOCKED OR STOPPED PERSON BE PRIVILEDGED
4349 NPVUS1: CAML J,USRHI
4351 CAMGE T,LUBTM(J) ;BLOCKED TOO LONG?
4359 NPVUS3: ADDI J,LUBLK
4362 NPVUS2: MOVEM U,PRVUSR
4373 IFNDEF MEMSYS,MEMSYS==50 ;GUESS AT AMOUNT OF MEM SYSTEM NEEDS
4374 IFNDEF MEMSY1,MEMSY1==50 ;AMOUNT OF MEM ANY ONE USER MUST LEAVE TO "FIT".
4376 SWSCD: MOVE E,TRUMM ;SEE IF NECESSARY TO SWAP BLOCK SOMEONE
4377 CAIGE E,TSYSM-SYSB-MEMSYS
4378 POPJ P, ;NO SHOULD FIT
4384 ADD E,BUMPGS ;WILL SWAP OUT BLOCKED USERS FIRST
4387 JUMPGE E,CPOPJ ;SHOULD HAVE ROOM FOR EVERYBODY
4388 MOVMM E,SWSCT1 ;SAVE # PGS REQ
4389 MOVNI E,1 ;NEED TO GRONK USER (MAYBE)
4390 CLEARB T,TT ;TT SWP PRI OF PROCESS
4391 MOVEI R,0 ;R SWP PRI OF TREE
4392 SWSCP1: CAML T,USRHI
4398 JRST SWSCP7 ;GUY ALREADY LOCKED OUT
4400 JRST SWSCP4 ;SEE IF REALLY BLOCKED OR JUST PAGE WAIT
4401 SWSCP5: MOVE B,UTMPTR(T)
4402 CAML R,SWRCE-USRRCE(B)
4404 JRST SWSCP6 ;THIS GUY A BIGGER LOSER THAT PREV BIGGEST
4405 SWSCP7: ADDI T,LUBLK
4409 MOVE R,SWRCE-USRRCE(B)
4411 JRST SWSCP7 ;GUY REALLY BLOCKED
4413 SWSCP4: MOVE B,USWST(T)
4419 SWSCP2: JUMPL E,CPOPJ ;NO VICTIM
4421 CAIGE B,TSYSM-SYSB-MEMSY1
4422 JRST SWSCP9 ;"SMALL LOSER"
4424 CAMLE B,SWSCT1 ;SKIP ON WILL STILL NEED TO BLOCK MORE LOSERS
4426 SWSCP9: MOVSI B,400000
4427 IORM B,USWSCD(E) ;SWAP BLOCK LOSER
4435 SWSCP8: SUB TT,NSWPGS(E)
4438 ADDM TT,ASBUM ;THIS GUY SWAPPED BLOCKED
4440 ADDM TT,TRUMM ;DOESNT COUNT ANY MORE
4444 ADDM TT,AUSOPG ;NOT REALLY ACTIVE ANY MORE
4445 JRST SWSCD ;SEE IF THATS ENUF
4450 ;PUT PAGE INTO USERS' MAPS (OF ALL USERS THAT ARE CONNECTED VIA CIRCULAR POINTERS)
4451 ;ALSO UPDATES THE WORKING SETS.
4452 ;CALL WITH PAGE NUMBER IN A, STARTING BYTE POINTER IN C, AND TDNE T,MMP IN D.
4453 ;SMASHES T,H,I,U,E,TT,C
4456 MOVEI E,0 ;COUNT USERS OF THE PAGE
4458 400000,,[AOJA E,CPOPJ]
4459 HRRM E,MMSWP(A) ;ALL THESE SHARERS WILL BE CONNECTED TO THE PAGE
4460 MOVSI T,1 ;COMPUTE WORKING SET ADJUSTMENT
4461 IDIVM T,E ;I.E. 1 OVER NUMBER OF SHARERS
4463 PUSHJ P,UCPRL ;GIVE PAGE TO ALL USERS WAITING FOR IT
4467 ;SET UP MAP TO MEMBLT INDEX IN A
4470 BUG ;SYS JOB OR CORE JOB
4479 JUMPE I,[JRST 4,.] ;DOESN'T REALLY EXIST?
4480 MOVSI T,MMPPGA ;DON'T REALLY PUT IN MAP IF PAGE-AHEAD PAGE.
4481 TDNE T,(D) ;JUST PRE-EMPT.
4483 TRNE I,600000 ;DO NOTHING IF ALREADY IN MAP.
4485 JRST QSWI2 ;ALREADY IN MAP, POSSIBLE AS A RESULT OF RIDICULOUS TIMING ERROR
4488 JRST E.SPGJ ; CHECK E&S WANTS READ/WRITE FIRST FIX
4490 SOS NSWPGS(U) ; NUMBER OF SWAPPED-OUT PAGES
4491 SOS SNSWPG ;DECR CNT OF SWAPPED OUT FOR SYS
4492 SKIPN (P) ;DON'T SET UP PG 0 AS R-W-F.
4495 MOVEI I,2 ;SET READ/WRITE TO READ/WRITE/FIRST
4497 IORI I,PMCSHM(A);BRING IN ADDRESS AND CACHE BITS
4501 AOS MMSWP(A) ;INCREMENT COUNT OF USERS IN RING
4504 ADDM E,UWRKST(U) ;ADJUST WORKING SET
4508 ;IF THIS USER IS WAITING FOR THIS PAGE, MAKE HIM RUNNABLE BY PUTTING
4509 ;HIM ON THE SCHMNY LIST, AND PRE-EMPT THE CURRENTLY-RUNNING USER.
4510 ;THE IDEAS ARE TO START THIS USER'S NEXT PAGE READ AS SOON AS POSSIBLE,
4511 ;AND TO ELIMINATE THE SCHEDULING THAT WOULD OTHERWISE BE NECESSARY TO RUN THIS GUY.
4513 CONSZ PI,200_-APRCHN ;CAN'T PREEMPT IF CLKOFF
4514 CONSZ PI,100000_-APRCHN ;OR IN PROGRESS, BECAUSE
4515 JRST POPIJ ;MIGHT ZERO FLSINS WHILE SCHEDULER
4516 ;IS EXECUTING IT & SIMILAR NASTIES
4518 CAME D,FLSINS(U) ;IF JOB THAT JUST GOT PAGE IS WAITING FOR IT
4521 SETZM FLSINS(U) ;THEN THAT JOB PREEMPTS CURRENT ONE
4524 SOS NPGWTU ;FLSINS WAS DUE TO PAGE FAULT (MIGHT BE IN .CALL CORBLK)
4529 CONO PI,CLKRQ ;REQUEST INT TO SCHEDULER
4544 E.SPGJ: SKIPE E.SPGH ; FLAG FROM E.SPGI
4546 JRST QSWI2 ; LEAVE AS IS
4550 JRST QSWI3 ; GO MAKE READ/WRITE
4551 ; DON'T SOS NSWPGS, SINCE PAGE IS ALREADY HERE
4554 SUBTTL USER SCHEDULER
4556 OVHMTR SC1 ;SCHEDULER 1 - ENTRY
4558 IFN KL10P, IFNDEF SCCOST, SCCOST==250. ;CHARGE 1 MILLISEC FOR SCHEDULING
4559 IFN KA10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4560 IFN KS10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4562 SCHED: SKIPGE U,USER
4566 ;; If user is swapped out while running in the page fail code, then
4567 ;; EPTPFO is used as the PC. Either he is on his way in, in which
4568 ;; case he will come back when restarted, or he is on his way out,
4569 ;; in which case this just pushes him on his way.
4573 CAIL T,PFAIL ; First instruction inclusive
4574 CAILE T,PFAILE ; Last instruction inclusive
4577 SCHED0: ] ;IFN KS10P
4579 IFN SCHBLN,SETZM SCHMNY ;ENTERED FROM QUANTUM RUNOUT, TIME TO CHECK ALL USERS
4580 SCHED2: ;ENTERED FROM UFLS OR PAGE FAULT, CHECK FOR AUXIL PERSON TO RUN
4581 ;IF SCHMNY IS STILL -1
4583 MOVSI T,UEXIT ;GET HERE FROM CLUFLS
4588 XCTR XR,[HRRZ A,13] ;GCSTBR
4589 XCTR XR,[HRL A,14] ;STBR
4592 SKIPL MTRUSR ;SKIP IF PERF COUNTER AVAILABLE
4593 JRST [ DMOVE A,MBOXCT(U) ;COMPUTE EQV CPU TIME FROM MBOX+EBOX ACCT
4594 DSUB A,STMBOX ;AS INCREMENTAL RUNTIME
4602 DSUB A,STPERF ;USER RUN TIME IN 80 NS UNITS LEFT 12
4603 DIVI A,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS IN A
4606 IFN KS10P, LDB A,[044000,,UPQUAN(U)] ;GET TIME USED IN 3.9 USEC UNITS
4607 IFN KA10P, LDB A,[022100,,UPQUAN(U)] ;GET TIME USED IN 4.069 USEC UNITS
4608 ADDM A,USRTM1 ;SYSTEM TOTAL USER RUN TIME
4609 ADDM A,UTRNTM(U) ;INCREASE RUN TIME
4610 ADDM A,JTMU(U) ;DECREASE PROCEDURE PRIORITY
4611 MOVEI B,SCCOST(A) ;ACCOUNT FOR OVERHEAD IN STARTING UP
4612 ADDM B,@UTMPTR(U) ;DECREASE PROCEDURE TREE PRIORITY
4614 MOVE T,NMPGS(U) ;USWPRI IS PAGES IN CORE X CPU TIME
4618 HLLO B,UWRKST(U) ;USWPRI IS LOG(WORKING SET SIZE) X (CPU TIME + IO WAIT TIME)
4619 JFFO B,.+1 ;C GETS 19 - LOG(WORKING SET SIZE + 1/2)
4625 ADDM T,USWPRI(U) ;CHARGE AGAINST SWAPPINNG PRI
4626 ADDM T,SWRCE-USRRCE(Q) ;AND FOR TREE
4628 LSH B,-7 ;GET RUNTIME IN 512 USEC UNITS
4630 MOVEI B,777 ;TO FIT IN SCHEDULER HISTORY TBL
4635 TRO B,1000 ;BLOCKAGE DUE TO PAGE FAULT
4637 CAML A,LODQNT ;CHECK FOR LEAVING LOADING STATE
4638 SCHED8: TLZN C,%SWLOD ;DUE TO RUNNING FOR MORE THAN LODQNT BETWEEN PAGE FAULTS
4639 JRST .+2 ;OR DUE TO BLOCKAGE FOR REASON OTHER THAN A PAGE FAULT
4640 PUSHJ P,LVLOA0 ;LEAVE LOADING STATE
4643 DPB B,[311200,,@SCHHP] ;COMPLETE SCHEDULER HISTORY TBL ENTRY
4644 SKIPL Q,RTIMER(U) ;SKIP UNLESS RUNTIME INT ACTIVE
4646 SCHED3: SKIPGE DLSRCH
4647 JRST SEAREP ;DELETE SEARCH, EXIT
4649 SKIPE PREEMP ;PRE-EMPT?
4650 JRST SCHEDP ;YES, AVOID DOING FULL SCHEDULE
4653 SKIPN SCHMNY ;IF NOT YET TIME TO DO A FULL SCHEDULE,
4655 SCHED4: HLRZ U,UREALT ;THEN CHECK LIST OF JOBS SCHEDULED BEFORE
4656 JUMPE U,SEARL0 ;ALWAYS SCHEDULE IF HIGH PRIORITY REAL TIME USER ACTIVE
4657 PUSHJ P,SCHGB ;POP NEXT JOB OFF LIST
4658 JUMPL U,SEARL0 ;EMPTY
4660 JRST SCHED4 ;JOB CEASED TO BE RUNNABLE
4661 AOS NSSKED ;OK, RUN THIS ONE
4668 MOVSI T,(%PIRUN) ;GIVE RUNTIME INTERRUPT
4672 ; HERE TO DO A FULL SCHEDULE (LOOK AT ALL JOBS)
4675 OVHMTR SC2 ;SCHEDULER 2 - SEARCH
4677 SEARL0: AOS NRSKED ;1 MORE REAL SCHED (ACTUALLY SEARCHES JOBS)
4678 CLEARM TRUMM ;TOTAL RUNNABLE USER MEM
4679 CLEARM AUSOPG ;ACTIVE USER SWAPPED OUT PAGES
4680 CLEARM BUMPGS ;PAGES IN REAL CORE BELONGING TO BLOCKED USERS
4681 IFE SWPWSP, CLEARM ASBUM ;PGS IN REAL MEM OCC BY SWAPPED BLOCKED LOSERS
4684 PUSHJ P,SWPON ;SWAP OUT STUFF
4687 PUSHJ P,SWPPIN ;SERVICE SWAPPING REQUESTS FROM OTHER PROCESSORS (DISPLAY)
4689 SETZB U,J ;JOB BEING SCHEDULED
4690 SETZM RNABLU ;NUM RUNABLE USERS
4692 SETZM SCHBNJ ;GOT NO RUNNABLE JOBS YET
4693 SETOM SCHMNY ;ALLOW ALL THE RUNNABLES WE FIND TO RUN
4695 .ELSE SETOM I ;BEST USER SO FAR
4697 MOVEM T,SCHFLG ;DONT SCHED AGAIN FOR 1/7.5 SEC
4700 ;HERE IF NULL JOB HAD BEEN RUNNING
4702 SCHED9: AOS NNSKED ;1 MORE TIME NULL JOB WAS RUN
4703 IFN KA10P, LDB C,[022100,,UPQUAN] ;GET TIME NULL JOB RAN IN 4.069 USEC UNITS
4704 IFN KS10P, LDB C,[044000,,UPQUAN] ;GET TIME NULL JOB RAN IN 3.9 USEC UNITS
4706 CAMN U,MTRJOB ;IF METERING ONLY NULL JOB, STOP METERS NOW
4709 CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1
4710 REBOXC A ;COMPUTE NULL JOB'S EQUIVALENT RUNTIME IN 4 USEC UNITS
4714 DMUL C,KLMBCC ;CONVERT MBOX COUNT TO EBOX COUNTER UNITS,
4715 DADD A,D ;ADD TO EBOX COUNT
4716 DMUL A,KLEBCC ;CONVERT TO 4 USEC UNITS.
4718 JRST [ RPERFC C ;PERFORMANCE METER AVAILABLE, USE IT INSTEAD
4720 DIVI C,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS
4723 ADDM C,NULTM1 ;ACCUMULATE TOTAL NULL TIME IN 4 USEC UNITS
4724 SKIPE NPGWTU ;IF SOMEONE WOULD HAVE BEEN RUNNING IF THEY
4725 ADDM C,LOSTM1 ; WEREN'T WAITING FOR A PAGE, THIS WAS LOST TIME
4726 SKIPN NPGWTU ;BUT OTHERWISE
4727 ADDM C,IDLTM1 ;IT WAS COMPLETE IDLE TIME
4728 SKIPE NPGWTU ;NOW COMPUTE % TIME IDLE AND LOST
4732 IFN PAGPRE,SKIPN PREEMP ;CHECK FOR PRE-EMPT
4733 JRST SEARL0 ;NOW GO DO A FULL SCHEDULE
4735 SCHEDP: SETZM PREEMP
4737 PUSHJ P,SCHGB ;U GETS USER TO PRE-EMPT THIS ONE (LAST INTO SCHMNY LIST)
4738 JUMPL U,SCHDP1 ;NO ONE TO PRE-EMPT, RUN SAME USER AGAIN
4739 PUSHJ P,SCHACK ;MAKE SURE PRE-EMPTING JOB IS RUNNABLE
4740 JRST SCHEDP ;AFRAID NOT
4741 AOS NPREEM ;OK, RUN THIS ONE
4743 PUSHJ P,SCHSB ;PRE-EMPTED JOB IS STILL A CANDIDATE FOR RUNNING
4746 SCHDP1: SKIPGE U,USER ;TRY TO RUN SAME USER AGAIN
4747 JRST SCHED1 ;RUN NULL JOB AGAIN
4748 PUSHJ P,SCHACK ;MAKE SURE THIS JOB IS STILL RUNNABLE (COULD HAVE UFLSED)
4749 JRST SEARL0 ;FOO, BETTER DO A FULL SCHEDULE
4750 JRST SCHED6 ;OK, RUN THIS GUY
4753 ;MAIN SEARCH LOOP, RETURN HERE TO EXAMINE NEXT PROCEDURE
4754 SEARL: MOVEI U,LUBLK ;LENGTH OF USER VAR BLOCK
4755 ADDB U,J ;STEP TO NEXT USER
4756 CAML U,USRHI ;SKIP IF EXISTS
4757 JRST SEAREN ;ALL PROCEDURES HAVE BEEN EXAMINED
4758 SEARL1: SKIPE T,USTP(U)
4759 JRST SEARS1 ;EMPTY OR STOPPED JOB SLOT
4761 JRST SEAR2A ;FIRST WORD INTERRUPT PENDING
4762 SEARL2: SKIPE B,IFPIR(U)
4763 JRST INTWD2 ;SECOND WORD INTERRUPT PENDING
4764 SEARL3: SKIPN FLSINS(U)
4765 JRST SEARC ;NOT BLOCKED
4766 SEARL4: MOVE T,EPDL2(U)
4767 XCT FLSINS(U) ;TEST BLOCKING CONDITION (MAY SKIP ONCE OR TWICE)
4768 JRST SEARLB ;UNRUNABLE
4769 JRST SEARC ;LOW PRIORITY UNBLOCK
4770 SKIPA Q,[-1] ;HIGH PRIORITY UNBLOCK
4771 MOVEI Q,3 ;EXTRA LOW PRIORITY
4774 SEARC: SETZM Q ;SET TO NORMAL PRIORITY
4775 PUSHJ P,UPRIVL ;COMPUTE PRIVELEGE LEVEL (MAY SKIP ONCE OR TWICE)
4776 SOJA Q,SEARC2 ;HIGH-PRIORITY
4779 ADDI Q,2 ;DISOWNED JOB IN USER MODE
4780 SEARC2: AOS RNABLU ;ANOTHER RUNABLE USER
4782 MOVEM T,LUBTM(U) ;RECORD LAST TIME UNBLOCKED
4785 JRST SEARC7 ;HE'S SWAPPED BLOCKED SO HE DOESNT COUNT
4787 JUMPE U,SEARC4 ;DON'T FIGURE SYSTEM JOB.
4789 ANDCAM T,USWST(U) ;RUNNABLE SO NOT DESIRED OUT
4791 ADDM T,TRUMM ;TOTAL RUNNABLE USER MEM
4793 ADDM T,AUSOPG ;TOTAL PAGES OF RUNNABLE USERS SWAPPED OUT
4794 SEARC4: CAMN U,UREALT ;IF THIS IS REAL TIME USER IN HIGH PRIORITY
4795 JRST [ MOVEI A,0 ; PHASE, SCHEDULE WITH INFINITE PRIORITY
4797 SKIPLE T,URTIME(U) ;NON SKIP IF POSSIBLE REAL TIME BLOCK
4798 TLNN T,1 ;SKIP IF REAL TIME BLOCK UNLESS PI IN PROGRESS
4800 SKIPGE PICLR(U) ;SKIP IF PI IN PROGRESS
4801 JRST SEARL ;REAL TIME BLOCKED
4802 SEARC6: MOVE A,@UTMPTR(U) ;GET AMOUNT OF MACHINE TIME USED RECENTLY BY TREE PROCEDURE IS IN
4803 LSH A,3 ;COMBINE WITH TIME FOR JUST THIS PROCEDURE
4804 ADD A,JTMU(U) ;TO GET PRIORITY FIGURE (SMALLER NUMBER IS HIGHER PRI)
4805 LSH A,(Q) ;ADJUST PRIORITY BY MULTIPLICATIVE FACTOR IN Q
4806 ;THE EFFECT OF THIS PRIORITY COMPUTATION IS THAT JOBS IN THE SAME TREE
4807 ;ARE COMPARED BY JTMU, WHILE JOBS IN DIFFERENT TREES ARE COMPARED MAINLY
4808 ;BY USRRCE, ALTHOUGH A MUCH SMALLER JTMU CAN OVERRIDE A SOMEWHAT LARGER
4809 ;USRRCE. THIS IS SOMEWHAT DIFFERENT THAN THE COMPUTATION THAT WAS HERE
4810 ;BEFORE MAY 1980, BUT THAT COMPUTATION'S RESULTS EVEN DEPENDED ON THE
4811 ;ORDER THAT JOBS HAPPENED TO BE INSPECTED, AND ALLOWED A TREE WITH
4812 ;A LARGE NUMBER OF RUNNING JOBS TO GET AN UNFAIR SHARE OF THE MACHINE.
4814 IFN SCHBLN, PUSHJ P,SCHSJB ;INSERT JOB INTO PRIORITY-SORTED LIST
4815 .ELSE [ JUMPL I,SEARP5
4816 CAML A,U0P ;SKIP IF IS BETTER THAN BEST SO FAR
4818 SEARP5: MOVEM U,I ;I GETS NEW BEST USER SO FAR
4819 MOVEM A,U0P ;U0P GETS PRIORITY OF THAT USER
4821 JRST SEARL ;TRY NEXT
4824 SEARC7: MOVE T,NMPGS(U) ;RUNNABLE AND SWAPPED BLOCKED
4831 ;JOB IS NOT RUNNABLE
4832 SEARLB: JUMPE U,SEARL ;DON'T FIGURE SYSTEM JOB
4834 IFE SWPWSP, SKIPL USWSCD(U) ;IF LOCKED OUT, DONT COUNT
4835 IFN SWPWSP, TLNN T,%SWSB
4837 JRST SEARB1 ;NOT WAITING FOR PAGE
4838 MOVE T,NMPGS(U) ;USER IS WAITING FOR PAGE SO COUNT FOR ACTIVE
4844 SEARB1: TLNE T,%SWBEM
4845 JRST SEARL ;HAVE MADE BEST SWAPOUT EFFORT
4849 ADDM T,BUMPGS ;REAL MEM PGS BELONGING TO BLOCKED USERS
4852 SEARS1: SKIPN UNAME(U)
4854 MOVE T,USWST(U) ;GUY STOPPED, DOES HE HAVE PAGES IN REAL MEM?
4856 JRST SEARL ;HAVE TRIED BEST EFFORT TO SWAP OUT
4863 ;TEST ALL THINGS THAT MAKE A PERSON UNRUNNABLE, OR AT LEAST
4864 ;REQUIRE THE ATTENTION OF THE SCHEDULER
4865 ;SKIP-RETURN IF JOB IS RUNNABLE, BASHES T, A
4866 SCHACK: CAMGE U,USRHI ;NON-EXISTENT
4867 SKIPE USTP(U) ;STOPPED
4870 JRST [ TDNE T,[BADBTS]
4871 JRST SCHACI ;NON-DEFERRABLE
4873 JRST .+3 ;ALL INTERRUPTS DEFERRED
4879 JRST [ SKIPN PICLR(U)
4880 JRST .+1 ;ALL INTERRUPTS DEFERRED
4885 SKIPE FLSINS(U) ;FLUSH INSTRUCTION NOT SATISFIED
4886 JRST [ MOVE T,EPDL2(U)
4887 XCT FLSINS(U) ;IT MAY BE SATISFIED BUT NOT CLEARED YET
4888 POPJ P, ;STILL BLOCKED
4889 JRST .+1 ;CAN SKIP VARIOUS RANDOM NUMBERS OF TIMES
4892 SCHAC1: SKIPLE T,URTIME(U) ;REAL-TIME BLOCKED
4899 SCHACI: MOVE T,UPC(U) ;TRYING TO INTERRUPT, NEEDS SCHEDULER
4900 TLNN T,%PCUSR ;ATTENTION UNLESS RUNNING IN EXEC MODE
4901 SKIPE FLSINS(U) ;IN WHICH CASE NEED TO LET IT FINISH
4902 POPJ P, ;SO IT CAN BE PCLSRED
4905 ;PUT JOB IN U, PRIORITY IN A, INTO STACK IN PRIORITY ORDER. BASH T,TT,B.
4906 SCHSJB: SKIPG T,SCHBNJ ;FIRST SEARCH FOR SLOT IN WHICH TO INSERT
4907 JRST SCHSJ1 ;BUFFER NOW EMPTY, SKIP SEARCH
4910 SOJG T,.-1 ;LOOP TERMINATES WITH T SLOT WHERE IT BELONGS
4912 SOJA T,SCHSJ3 ;BUFFER FULL, WORK DIFFERENTLY
4913 SCHSJ0: MOVE B,SCHBTB-1(TT) ;MOVE STUFF UP TO ADD ANOTHER ENTRY
4920 SCHSJ5: MOVEM U,SCHBTB(T)
4924 SCHSJ3: AOS NSCHOV ;BUFFER NOT BIG ENOUGH FOR ALL RUNNABLE JOBS
4925 JUMPL T,CPOPJ ;THIS JOB IS LOWEST PRIORITY, FORGET IT
4926 JUMPE T,SCHSJ5 ;THIS JOB IS SECOND-LOWEST PRIORITY, FORGET LOWEST
4927 MOVE TT,[SCHBTB+1,,SCHBTB]
4928 BLT TT,SCHBTB-1(T) ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4929 MOVE TT,[SCHBPR+1,,SCHBPR]
4933 ;PUSH JOB IN I ONTO STACK OF RUNNABLE JOBS
4936 JRST [ SOS SCHBNJ ;BUFFER OVERFLOW
4937 AOS NSCHOV ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4938 MOVE T,[SCHBTB+1,,SCHBTB]
4939 BLT T,SCHBTB+SCHBLN-2
4940 MOVEM I,SCHBTB+SCHBLN-1
4945 ;POP STACK OF RUNNABLE JOBS INTO U (RETURNS -1 IF STACK EMPTY)
4946 SCHGB: SOSL U,SCHBNJ
4948 SETZM SCHBNJ ;BUFFER EMPTY, U HAS -1
4966 ;DETERMINES USER PRIVILEGE LEVEL FOR SCHEDULING AND SWAPPING
4967 UPRIVL: SKIPN RPCL(U) ;BEING RPCLSR'ED?
4968 CAMN U,UMASTER ;MASTER?
4969 POPJ P, ;HIGHLY PRIVILEGED
4970 AOS (P) ;SKIP AT LEAST ONCE
4971 IFN 340P\E.SP, ALTSKP DISUSR
4972 IFN VIDP, ALTSKP NVDUSR
4973 IFN TABP, ALTSKP TABUSR
4974 IFN ARMP, ALTSKP ARMUSR
4975 IFN LPTP, ALTSKP LPTUSR
4976 IFG LPTP-1, ALTSKP OLPUSR
4977 IFN PLTP, ALTSKP PLTUSR
4980 POPJ P, ;DON'T FIGURE DISOWNED IF USING ABOVE DEVICES
4987 OVHMTR SC3 ;SCHEDULER 3 - EXIT
4993 PUSHJ P,SSWC1 ;SEE IF ENUF CORE TO UNBLOCK A SWAPPED BLOCKED LOSER
4996 SKIPGE U,I ;SKIP IF NON-NULL JOB BEST
5003 PUSHJ P,SCHGB ;GET HIGHEST-PRIORITY JOB
5004 JUMPL U,SCHED1 ;NONE, RUN NULL JOB
5006 SCHED6: SKIPE FLSINS(U)
5009 JUMPL U,SCHDN ;JUMP IF SWITCHING FROM NULL JOB
5010 CAMN U,USER ;SKIP UNLESS RUNNING SAME JOB AGAIN
5011 JRST SEAREP ;JUMP ON SAME JOB
5013 CAMN U,MTRJOB ;IF LEAVING JOB BEING METERED, STOP METER AND
5016 CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1
5018 ;SWAP OUT THE OLD JOB'S CONSOLE REGISTER, AND CLEAR ITS BLINKER.
5022 JRST SSTVR1 ;DONT HACK 11
5023 SKIPL TVCREG(U) ;DO WE WANT TO SAVE TV CONSOLE REG FOR THIS GUY?
5024 SKIPN T,400000+TTR10*2000 ;0 IS NOT A (VERY) LEGITIMATE CONSOLE REG FCN
5025 JRST SSTVR2 ;SO ASSUME 11 STOPPED, DONT CLOBBER PREV THING
5027 SSTVR2: SKIPGE T,TVVBN(U) ;DID WE SET RUNNING BLINKER FOR THIS GUY?
5029 MOVEM T,400000+TTR10*2000 ;SET TO VIDEO BUFFER WE SET IT IN
5030 MOVE A,TVBLAD ;ADDR IN VIDEO BUFFER WE FLASHED
5031 CLEARM 400000+TTR0*2000(A) ;CLEAR IT
5035 MOVEM T,SV40(U) ;SAVE LAST UUO EXECUTED FOR THIS USER
5036 MOVE T,UPC(U) ;IF USER HAS JUST TRAPPED TO 60,
5044 ADDM T,UPC(U) ;THEN MOVE HIM INTO UUOH INSTEAD
5045 MOVE T,60 ;AND MOVE 60H'S VARIABLES INTO UUOH'S VARS
5046 MOVEM T,SV40(U) ;(THAT'S ALL 60H DOES ANYWAY).
5052 ;COME HERE TO SET UP A JOB THAT WASN'T ALREADY RUNNING.
5056 JRST SCHDN2 ;JUMP IF SWITCHING TO NULL JOB
5058 MOVE T,SV40(U) ;LOAD NEW KRUFT
5062 SKIPGE TT11P ;DONT HACK 11 IF ITS DOWN (MOSTLY IN CASE ITS BEING HACKED
5065 JRST SLTVR1 ;DONT HACK 11
5066 SKIPGE T,TVVBN(U) ;BLINK RUNNING FROB?
5068 MOVEM T,400000+TTR10*2000
5071 MOVEM T,400000+TTR0*2000(A)
5073 SLTVR2: MOVSI T,12_<8+4+16.-18.> ;ALU NOP
5076 MOVEM T,400000+TTR10*2000
5079 CAMN U,MTRJOB ;IF THIS JOB'S BEING METERED, TURN ON METER AND TIME BASE.
5082 CONO MTR,2001 ;TIME-BASE ON, INTERVAL PIA=1
5084 SOS NRESKED ;COMPENSATE FOR EXTRA AOS ON NEXT PAGE
5088 ;COME HERE TO START UP A JOB EVEN IF IT WAS ALREADY RUNNING BEFORE THIS SCHEDULE.
5093 ANDCAM T,UPQUAN(U) ;RESET QUANTUM TIMER
5096 RPERFC STPERF ;SAVE PERF METERS FOR LATER USE
5097 DMOVE A,EBOXCT(U) ;COMPUTING RUN TIME EFFECTIVELY RESETS
5098 DMOVEM A,STEBOX ;QUANTUM TIMER
5102 IFN KS10P, SETZM UPQUAN(U) ;RESET QUANTUM TIMER
5108 IFE KS10P,[ ; KS has no lights.
5112 DATAO LIGHTS,B ;LIGHTS HAVE ONE BIT, SHOWING WHICH JOB IS RUNNING.
5114 MOVN B,A ;GET JOB'S NUMBER IN B
5115 MOVE T,UPC(U) ;USER'S PC WORD
5117 AOS A,SCHHP ;SET UP SCHEDULER HISTORY TBL
5121 HRRM T,(A) ;STORE PC
5124 HRLM B,(A) ;STORE USER INDEX AND USER BIT
5127 BLT T,UEXND-1 ;BLT IN UEXIT BLOCK
5131 XCTR XW,[HRRZM T,13] ;GCSTBR
5132 XCTR XW,[HLRZM T,14] ;STBR
5133 ] ;KL10P ;CONTEXT WILL BE RESTORED AT CLKB5 BELOW
5134 IFN KA10P, CONO @APRC(U)
5137 ; THIS IS THE ONE PLACE WHERE CLOCK LEVEL RETURNS TO THE USER JOB
5140 IFE KA10P, DATAO PAG,@CLCXSV ;RESTORE CONTEXT
5142 MOVSI U,AC0S(U) ;RESTORE AC BLOCK 0
5144 JRST 12,@CLKBRK ;RESTORE PC, FLAGS, AND PI
5146 ;HERE WHEN STARTING A USER WHO HAD BEEN FLSING
5148 SCHED5: MOVE T,USWST(U)
5150 TLNN T,%SWPGW ;PAGE WAITS DON'T COUNT AS BLOCKING
5151 TLNN T,%SWOUT ;IF SWAPPED-OUT, UNBLOCKING BUMPS SWAP-IN PRIORITY
5153 MOVE TT,USWPRI(U) ; (A SOMEWHAT QUESTIONABLE FEATURE)
5159 JRST SCHED7 ;JUMP IF PAGES SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5161 SOS NPGWTU ;NOT WAITING FOR A PAGE ANY MORE
5162 MOVSI T,%SWPGW+%SWRUN+%SWINT ;NOT WAITING FOR PAGE,NOT UNBLOCKED SWAPOUT,
5163 ANDCAM T,USWST(U) ;NOT WAITING FOR INTERRUPT PAGE
5164 SETZM FLSINS(U) ;NOT WAITING FOR ANYTHING
5167 SCHED7: PUSHJ P,PCLSR ;PAGES WERE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5168 BUG ;SO PCLSR JOB SINCE IT MIGHT BE COUNTING ON THOSE PAGES
5169 JRST SCHED1 ;PCLSR MUST SUCCEED. JOB WAS BLOCKED WITH EMPTY LSWPR.
5172 ;COME HERE TO RUN THE NULL JOB.
5174 SCHDN2: SKIPL A ;WERE RUNNING IT ALREADY?
5175 AOS NNULBK ;NO, INCREMENT # CONSECUTIVE BLOCKS OF NULLTIME.
5177 MOVEM T,CLUSAV ;AVOID LOSSAGE AT CLKBRK+1 NEXT CLOCK INT
5178 IFE KA10P, MOVEM T,CLCXSV
5179 IFE KS10P,[ ; KS has no lights.
5181 DATAO LIGHTS,[0] ;LOAD LIGHTS WITH JOB RUNNING (NONE)
5191 CONO MTR,2001 ;TIME-BASE ON, INTERVAL PIA=1
5196 IFN KS10P, SETZM UPQUAN
5197 CLEARM SCHFLG ;RESCHEDULE ON NEXT CLK INT
5199 JRST 12,@[%PSPCU,,NULJOB] ;DISMISS INT AND GO TO NULL JOB
5201 NULJOB: MOVSI (JRST 4,)
5202 MOVEI 17,1 ;SET ACS 0 TO 16 TO JRST 4,0
5203 BLT 17,16 ;TO CATCH SPURIOUS TRANFERS TO ACS
5204 MOVE 17,[AOJA 17] ;RUNS IN ACS TO FREE MEMORY FOR OTHER PROCESSORS
5205 JRST 2,@[%PCUSR,,17] ;RUNS IN USER MODE FOR SAKE OF RANDOMNESS
5208 OVHMTR SC4 ;SCHEDULER 4 - UNSWAPBLOCKER
5210 ;SEE IF THERE IS ENOUGH CORE TO UNBLOCK A SWAP-BLOCKED JOB.
5211 SSWC1: SKIPGE U,BUSR
5222 POPJ P, ;THERE ISN'T ENOUGH ROOM.
5224 ANDCAM T,USWSCD(U) ;CLEAR SWAP BLOCKED
5227 MOVEM D,BUSIZ ;SIZE OF SMALLEST SWAP-BLOCKED USER.
5234 SSWSC4: CAML U,USRHI
5243 SSWSC5: ADDI U,LUBLK
5246 SSWSC6: MOVEM R,BUSR ;STORE NEW SMALLEST SWAPPED BLOCKED LOSER
5250 SSWSC3: JUMPL I,SEARL0 ;MAYBE CAN RUN THIS GUY NOW
5254 OVHMTR SWU ;SWAP USER
5256 ;SWAP OUT N PAGES (N IS IN SWPOPR)
5258 SKIPGE CIRPSW ;CAN'T DO ANYTHING WITHOUT CIRPSW
5260 POPJ P, ;ALREADY STUFF ON WAY OUT
5261 SKIPL U,PSWOUS ;SEE IF CONTINUING TO SWAP OUT A USER
5265 SKIPE LSWPR(U) ;PREFER NOT TO SWAP OUT
5266 JRST SWPON1 ;USER WHO HAS SWITCHES LOCKED
5267 SKIPE UNAME(U) ;SKIP ON USER KILLED
5268 SKIPL USWST(U) .SEE %SWDSO ;OR NOT DESIRED OUT ANY MORE
5269 SWPON1: PUSHJ P,SWPON2 ;FIND NEW USER TO FLUSH
5271 SWPON6: MOVSI A,%SWDSO ;THIS USER NOW DESIRED OUT
5277 JRST SWPU1 ;OK TO SWAP USER
5278 SKIPN LSWPR(U) ;PCLSR IF HAS LOCKS, OR AT JBFLS,
5279 SKIPN FLSINS(U) ;OR IF NOT BLOCKED
5281 MOVSI T,%SWPCL ;OTHERWISE, DON'T PCLSR NOW, BUT
5282 IORM T,USWST(U) ;WHEN IT UNBLOCKS
5283 JRST SWPU1 ;AND START SWAPPING OUT ITS PAGES
5285 SWPON8: PUSHJ P,PCLSR ;GET OUT OF SYS BEFORE SWAPPING OUT
5289 ;FOUND NO USER TO SWAP OUT
5291 JRST SWOL1 ;SWAP OUT SOME LOOSE PAGES
5292 AOSE SBEFLG ;HAVE WE COME HERE TWICE?
5293 JRST SWUP6 ;YES, GIVE UP
5294 MOVSI B,%SWBEM ;NO, TURN OFF EVERYONE'S BEST EFFORT BIT
5295 MOVEI J,2*LUBLK ;AND LOOK AT EVERYONE AGAIN SINCE WE'RE DESPERATE
5296 SWUP9: CAML J,USRHI ;TO FIND A PAGE TO SWAP OUT
5302 SWUP7: PUSHJ P,SWPON2 ;HAVING TURNED OFF %SWBEM, FIND A USER TO SWAP OUT
5303 JUMPG U,SWPON6 ;GO SOMEONE, GO DO
5304 SWUP6: SETZM SWPOPR ;CAN'T FIND ANYONE TO SWAP OUT, GIVE UP
5308 SWOL1: SKIPN A,FLOOSP ;SWAP OUT SOME LOOSE PAGES
5309 BUG ;NLOOSP WAS TOO HIGH?
5312 BUG ;CIRPSW, EXEC PAGE COUNT ALREADY CHECKED
5313 SETOM SBEFLG ;WE FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5315 SOSLE SWPOPR ;ENOUGH
5316 CAIL C,20. ;ENOUGH FOR NOW
5318 SKIPE NLOOSP ;SWAP OUT MORE PAGES
5321 \f;START SWAPPING OUT THIS USER'S PAGES
5325 IORM A,USWST(U) ;INDICATE USER WAS RUNNABLE AT TIME OF SWAP OUT
5330 MOVE T,UPC(U) ;CALCULATE WHAT PAGE HIS PC IS ON
5331 LDB C,[121000,,UPC(U)]
5334 MOVE A,[222200,,(C)]
5340 ANDI A,PMRCM ;MASK TO REAL CORE ADR BITS
5341 SKIPN USTP(U) ;ONLY IF RUNNING
5342 TLNN T,%PCUSR ;AND IN USR MODE
5344 MOVEM A,SWUPC ;THEN DON'T ALLOW UPC PAGE TO BE SWAPPED OUT
5349 JRST SWPU3A ;PICK UP FROM WHERE LEFT OFF
5354 MOVEI C,UPGMP(U) ;ADDRESS OF PAGE MAP (START FROM PG 0)
5356 HRLI C,442200 ;CNVRT TO BYTE PNTR TO MAP
5360 LDB B,[121100,,HUSRAD(U)] ;DO ALL PAGES THAT MIGHT EXIST
5361 SWPU2: ILDB D,SWPCBP ;CIRC PNTR ENTRY
5362 ILDB A,SWPMBP ;PAGE MAP ENTRY
5364 JUMPE D,SWPU3A ;DOESN'T HAVE PAGE
5367 SKIPE USTP(U) ;DON'T SWAP OUT PAGE 0 IF NOT STOPPED
5368 CAIN D,-1 ;PAGE IS ABSOLUTE
5370 TRNN A,600000 ;NO ACCESS
5374 TRON A,PMAGEM ;HAS PAGE BEEN REFERENCED? (AGE MASK)
5378 SWPU2A: ANDI A,PMRCM ;MASK TO REAL CORE PAGE #
5379 CAMN A,SWUPC ;DON'T SWAP OUT PAGE WHERE PC IS IF RUNNING
5382 IFN SWPWSP,[ ;I DOUBT THAT MOST OF THAT NONSENSE DOES ANYTHING
5383 TRNE A,600000 ;NO ACCESS
5384 CAIN D,-1 ;OR PAGE IS ABSOLUTE
5385 JRST SWPU3A ;MEANS DON'T SWAP OUT
5386 ANDI A,PMRCM ;MASK TO REAL CORE PAGE #
5388 HRRZ D,MMSWP(A) ;NUMBER OF USERS WHO HAVE THIS PAGE MAPPED
5389 SOJN D,SWPU4 ;PAGE IS SHARED
5390 SWPU6: MOVEM B,PSWLC ;SAVE HOW FAR SWAP-OUT SCAN GOT
5392 PUSHJ P,SWPOPG ;SWAP OUT THIS PAGE
5394 SETOM SBEFLG ;FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5396 SOSLE SWPOPR ;ENOUGH
5397 CAIL C,20. ;ENOUGH FOR NOW
5401 SWPU3A: SOJG B,SWPU2
5404 IORM B,USWST(U) ;SET BEST EFFORT BIT
5406 SKIPL APRC(U) ;IF DISOWNED,
5408 MOVE B,USWPRI(U) ;DECREASE PRIORITY TO COME BACK IN
5413 \f;TRYING TO SWAP OUT A SHARED PAGE
5414 SWPU4: MOVEM B,PSWLC ;SAVE HOW FAR SWAP-OUT SCAN GOT
5416 BUG ;CIRPSW LOCKED IN SWAP OUT CODE
5417 MOVE C,[2200,,MEMPNT(A)]
5420 400000,,SWPU5 ;CONSULT THE OTHER USERS OF THE PAGE
5423 JRST SWPU6 ;OK TO SWAP IT OUT
5425 SWPU5: SKIPGE TT,USWST(U) .SEE %SWDSO
5426 POPJ P, ;USER DESIRED OUT, CAN'T HOLD PAGE IN
5427 IFN SWPWSP, TLNN TT,%SWLOD ;IF USER IS LOADING, HOLDS PAGE IN
5437 TRNE TT,600000 ;SKIP IF NO ACCESS, IGNORE AGE
5438 TRNE TT,PMAGEM ;HAS SHE USED THIS PAGE?
5439 POPJ P, ;NO, CAN'T HOLD PAGE IN
5440 SWPU5A: SUB P,[4,,4]
5441 SETOM CIRPSW ;SHARED W/USER WHO IS WANTED IN CORE
5442 AOS NSHRAB ;SO DON'T SWAP IT OUT
5445 ;COME HERE WITH BEST USER TO SWAP OUT IN U, CLASS IN C
5446 SWPONX: JUMPL U,CPOPJ ;NO SWAP OUTTABLE LOSER
5451 SETO U, ;WOULD RATHER SWAP OUT LOOSE PAGES
5454 SWPNX2: MOVSI T,%SWOUT ;MAKE USER SWAPPED OUT
5456 JRST SWPNX3 ;ALREADY IS?
5461 MOVEM T,USWTIM(U) ;DROPS INTO SWPNX3
5467 JRST [ SETO U, ? POPJ P, ] ;WOULD RATHER SWAP OUT LOOSE PAGES
5469 JRST SWPNX3 ;HE'S ALREADY SWAP BLOCKED
5470 TLNN B,%SWPGW ;IS HE RUNNABLE?
5474 MOVE B,NMPGS(U) ;HE'S RUNNABLE
5475 CAIGE B,TSYSM-SYSB-MEMSY1
5476 JRST SWPNX1 ;SMALL, NO THRASH
5483 JUMPG B,SWPNX3 ;LET THIS GUY THRASH
5484 SWPNX1: SKIPN ENSWBK
5486 MOVSI B,(SETZ) ;SWAP BLOCK THIS LOSER
5490 MOVE B,NMPGS(U) ;SMALLEST SWAP BLOCKED LOSER?
5494 MOVEM B,BUSIZ ;DROP INTO SWPNX3
5496 ;HAVING DECIDED TO SWAP OUT JOB IN U, MAKE SWAP HISTORY TABLE ENTRY
5497 SWPNX3: MOVSI T,2_16.
5498 ;GENERAL SWAP HISTORY TABLE KEEPER. ENTER WITH JOB IN U, EVENT IN T, BASHES TT,I,T
5500 IDIVI TT,LUBLK ;TT 3.1-3.8 GETS JOB NUMBER, BASHES I
5503 IFN SWPWSP, HLRZ T,UWRKST(U)
5513 MOVEM TT,SWPHTL-1(T)
5515 CAIL T,SWPHTB+SWPHTL
5519 OVHMTR SWF ;SWAP FIND USER
5521 ;FIND A USER TO SWAP OUT, RETURN IN U, -1 IF NONE
5522 SWPON2: SETOM PSWSFL ;START FROM BEG OF USER
5525 PUSHJ P,CKPRUS ;MAKE SURE PRIV USER EXISTS AND HAS NOT BEEN BLOCKED FOR A LONG TIME
5528 ADD T,TIME ;A MINUTE AGO
5531 MOVEI C,NSSCDC ;# SWAP OUT CLASSES
5532 SWPON4: CAML J,USRHI ;C HAS INDEX OF MAX CLASS INTERESTED IN
5533 JRST SWPONX ;LOOKED AT ALL USERS, GO PONDER RESULTS
5534 SKIPE UNAME(J) ;SEE IF FOR REAL
5535 SKIPN NMPGS(J) ;DON'T BOTHER IF HAS NO MEMORY
5539 TLNE B,%SWBEM+%SWLOD ;DON'T SWAP OUT IF BEST EFFORT ALREADY MADE,
5540 JRST SWPON3 ; OR STILL LOADING IN
5543 CAMLE TT,TIME ;IF PROTECT TIME HASN'T ELAPSED YET, GETS HIGHER PRIORITY
5544 JRST SWPTK ;TO PREVENT THRASHING
5549 JRST SWPON3 ;BEST EFFORT ALREADY MADE
5552 JRST SWPON7 ;PREFER NOT TO SWAP OUT LOSER WITH SWITCHES LOCKED
5555 JRST SWPON5 ;FLSINS IS WAITING FOR A PAGE (NOT REALLY BLOCKED)
5557 SOJA I,SWPTK ;BLOCKED FOR A LONG TIME (CLASS 0)
5559 SWPON5: SKIPE USTP(J)
5560 JRST SWPTK ;CLASS 1 (BLOCKED)
5563 JRST [ MOVEI I,7 ;CLASS 7 (PRIV USER)
5566 JUMPL B,[AOJA I,SWPTK] .SEE %SWDSO ;DESIRED OUT (CLASS 2)
5569 SOJA I,SWPTK ;DISOWNED (CLASS 3)
5572 JRST SWPTK ;SWAP BLOCKED (CLASS 4)
5575 AOJA I,SWPTK ;DOESNT HAVE TTY (CLASS 5)
5576 SWPON7: MOVEI I,6 ;OTHERWISE....
5579 JRST SWPON3 ;THIS GUY IN MORE WINNING CLASS
5584 .ELSE MOVE A,UWRKST(J)
5587 XCT SWPTT(C) ;IN SAME CLASS, COMPARE CLASS-DEPENDENT PRIORITY MEASURES
5589 SWPTK2: MOVE E,@SWPTT(I) ;MAKE THIS GUY BEST VICTIM
5592 SWPON3: ADDI J,LUBLK
5595 ;SKIP IF THIS GUY (J) IS BETTER LOSER TO FLUSH THAN PREV BEST (IN E)
5596 SWPTT: CAMG E,LUBTM(J) ;BLOCKED FOR A LONG TIME (0) - LATER LUBTM WINS
5597 CAMG E,LUBTM(J) ;BLOCKED (1) - LATER LUBTM WINS
5598 CAML E,A ;DESIRED OUT (2) - SMALLER WORKING SET WINS
5599 CAML E,A ;DISOWNED (3) - SMALLER WORKING SET WINS
5600 CAML E,A ;RUNNABLE, SWAP BLOCK SET (4) - SMALLER WORKING SET WINS
5601 CAML E,USWPRI(J) ;RUNNABLE, W/O TTY (5) - GO BY PRIORITY
5602 CAML E,USWPRI(J) ;OTHERWISE (6) - GO BY PRIORITY
5603 IFE SWPWSP, BUG ;PRIVELEGED USER (7) - SHOULD ONLY BE ONE
5604 IFN SWPWSP, CAMG E,USWTIM(J);PROTECTED (7) - LATER UNPROTECT TIME WINS
5608 CKPRUS: MOVSI B,%SWPRV
5610 ANDCAM B,USWST(U) ;TURN OFF PRIV USER BIT
5612 ADD TT,TIME ;TWO SECONDS AGO
5623 OVHMTR UUO ;RANDOM UUOS
5625 ;AC: A.9 =>1 SWAP OUT USER
5627 ;4.7=1 => LOOP FOR A WHILE
5628 ;3.9-3.1 USER # SELF IF 0
5629 ;RH => USER VIRTUAL PG #
5630 ;OR 4.9=0, 4.8=0, 4.7=0 SWAP OUT RH # OF PAGES
5631 ;IF 4.9=0, 4.8=1 AND 4.7=0, HACK PCLSR TEST FEATURE ON CURRENT USER
5632 ;RH =0 LEAVE PCLSR TEST MODE =1 ENTER IN ADVANCE MODE =-1 ENTER IN HOLD MODE
5633 ; =2 ENTER IN ADVANCE BUT DON'T ^Z
5642 JRST ASWPCL ;PC LSR TEST MODE.
5643 HRRZM A,SWPOPR ;CLOBBER CLOBBER
5647 ANDI B,777 .SEE MAXJ ;FIELD SHOULD BE BIG ENOUGH
5666 ASWAP2: PUSHJ P,CWAIT ;RETURNS WITH CLKOFF AND CIRPSW AVAILABLE
5668 HRRZS A ;A HAS VIRTUAL PAGE #
5669 PUSHJ P,UPLC ;RETURN POINTERS IN T AND Q
5670 LDB A,T ;GET MAP ENTRY
5671 LDB C,Q ;GET CIRC PNTR
5672 CAIE C,-1 ;DON'T SWAP OUT ABS PAGE
5674 POPJ P, ;ALREADY OUT OR DOESN'T HAVE PAGE
5675 ANDI A,PMRCM ;MASK TO REAL CORE PAGE #
5681 ASWAP3: MOVE B,[1250000.]
5686 ASWPCL: MOVEM U,PCLUSR
5696 ; ARG 2 - PAGE NUMBER IN <JOB>'S ADDRESS SPACE
5697 ;IF ONLY ONE ARGUMENT IS GIVEN, IT IS ARG 2, AND ARG 1 DEFAULTS TO CURRENT USER
5699 ;THE PAGE IS SWAPPED OUT. THE CALL DOESN'T RETURN UNTIL THE SWAP IS COMPLETED.
5700 ; THIS ALLOWS USER TO BE SURE THAT THE COPY ON DISK IS UP TO DATE.
5701 ;CONTROL BIT 1.1 => RETURN IMMEDIATELY, NO WAITING. TO WAIT LATER, JUST DO
5702 ; ANOTHER PGWRIT WITHOUT SETTING 1.1.
5703 ;CONTROL BIT 1.2 => UNLOCK PAGE. IF YOU CALL THIS ON A LOCKED PAGE,
5704 ; WITHOUT SETTING BIT 1.2, THE PAGE WILL BE SWAPPED OUT, BUT THE NEXT
5705 ; TIME IT IS SWAPPED IN IT WILL BE LOCKED AGAIN. THIS IS USEFUL FOR
5706 ; CONTROLLING EXACTLY WHEN A DATA BASE PAGE GETS WRITTEN TO DISK.
5709 JRST [ MOVE J,U ? JRST NPGWR1 ]
5711 JSP T,NCORUI ;DECODE THE JOB SPEC
5713 JSP T,NCORWR ;WHICH MUST BE WRITABLE
5718 JRST OPNL34 ;CAN'T HACK PDP6
5720 MOVE A,B ;NOTE: SWPOPG TAKES CARE OF THE PCLSR'ING
5721 PUSHJ P,NPGWR1 ;CALL MAIN ROUTINE
5722 POPJ P, ;LOST, OPNL CLEARED LSWPR
5723 JRST LSWPJ1 ;WON, UNLOCK DIELOK
5725 ;USER INDEX IN J, PAGE NUMBER IN A
5726 NPGWR1: TDNE A,[-1,,-400]
5727 JRST OPNL32 ;PAGE NUMBER NOT VALID
5728 PUSHJ P,CWAIT ;DON'T ALLOW PAGE MAPS TO CHANGE, AND TURN CLK OFF
5729 SKIPL CIRPSW ;DON'T NEED UTCOFF BECAUSE UTC LEVEL CAN ONLY PUT PAGES INTO MAPS
5733 LDB D,Q ;D GETS CIRC PNTR
5734 JUMPE D,OPNL32 ;NO PAGE THERE
5736 JRST OPNL12 ;ABSOLUTE PAGE
5738 MOVE C,Q ;STARTING FROM UPGCP, FIND MMP
5742 SUB P,[4,,4] ;FOUND MMP, C POINTS TO IT
5743 MOVSI T,MMPTMP ;IF PAGE IS IN TRANSIT
5746 TDNE T,(C) ;AWAIT COMPLETION
5748 JRST NPGWR1 ] ;THEN TRY AGAIN
5749 MOVE E,C ;SAVE ADDRESS OF MMP ENTRY
5750 PUSHJ P,UCPRL ;SEE IF PAGE IS IN MEMORY
5752 POP P,U ;NOT SWAPPED IN, BYPASS SWAP-OUT CODE
5755 NPGWR3: SUB P,[4,,4] ;IT'S SWAPPED-IN TO CORE PAGE IN T
5758 JUMPN D,OPNL12 ;POINTED TO BY AN EXEC PAGE, E.G. 340, SHOULDN'T MESS.
5759 PUSH P,A ;SAVE USER'S VIRTUAL PAGE #
5760 PUSH P,J ;SAVE WHAT JOB THAT IS
5761 PUSH P,E ;SAVE ADDRESS OF MMP ENTRY
5762 MOVE A,T ;PHYSICAL PAGE # TO SWAP OUT
5763 MOVE C,USER ;DON'T PCLSR ME
5764 PUSHJ P,SWPOPL ;SWAP OUT, EVEN IF LOCKED
5765 JRST NPGWR4 ;NO DISK SPACE, OR SOME JOB NOT PCLSRABLE
5769 NPGWR2: MOVE T,CTLBTS(U)
5771 TRNE T,2 ;CONTROL BIT 1.2 UNLOCKS
5773 TRNE T,1 ;CONTROL BIT 1.1 INHIBITS WAITING FOR SWAP TO FINISH.
5775 MOVSI T,MMPTMP ;PAGE IN TRANSIT BIT
5776 TDNE T,(E) ;WAIT FOR BIT TO TURN OFF
5780 ;COULDN'T SWAP OUT, WAIT A WHILE AND TRY AGAIN
5781 NPGWR4: PUSHJ P,UDELAY ;UDELAY TURNS CLKON
5791 IFN 340P\E.SP, DISSWI: -1 ;USER
5792 IFN VIDP, VIDSWI: -1
5793 IFN IMXP, POTSWI: -1
5794 IFN NSWPV-.+SWIRQB,.ERR NSWPV ERR
5797 IFN 340P\E.SP, DISSPG: 0 ;VIRTUAL PAGE NUMBER
5801 SWPNTB: ;SIGNAL BITS IN LH OF W TO CFHSW1
5802 IFN 340P\E.SP, 400000 ;DISPLAY
5803 IFN VIDP, 400000 ;VID
5804 IFN IMXP, 400000 ;POTS
5806 SWILMT: ;PIRQC BIT TO SET ON ILM
5807 IFN 340P\E.SP, %PIDIS
5811 PSWOUS: -1 ;INDEX OF PARTIALLY SWAPPED OUT USER
5812 PSWCLS: 0 ;CLASS OF PARTIALLY SWAPPED OUT USER
5813 PSWSFL: 0 ;-1 START FROM BEG OF USER, ELSE PICK UP WHERE LEFT OFF
5814 SWPMBP: 0 ;PNTR TO MAP
5815 SWPCBP: 0 ;PNTR TO CIRC DESC SPACE
5816 PSWLC: 0 ;LOOP COUNT
5817 SBEFLG: -1 ;0 => ALREADY ONCE WANTED TO CLEAR ALL "BEST EFFORT" BITS.
5818 SWPOPR: 0 ;NUMBER OF PAGES DESIRED TO BE SWAPPED OUT
5819 SWPOPB: 0 ;SWAP OUT REQUEST BUT ONLY SWAP OUT NON-RUNNING USERS TO MEET (UNUSED?)
5820 SILNG: 0 ;TOTAL LENGTH OF SWAP IN LISTS
5821 SOLNG: 0 ;TOTAL LENGTH OF SWAP OUT LISTS
5822 ;SINLST AND SOUTLS ARE IN DISK CODE. VARIATION ON QBFP.
5823 SWODSK: NQS-1 ;UNIT TO SWAP OUT ON NEXT
5824 SWOBK: 0 ;MEMBLT BEING SWAPPED OUT
5825 SWOMMP: 0 ;MMP ADDRESS (NOT INDEX)
5826 SPGNMF: 0 ;-1 => PAGE NOT MODIFIED
5827 CFHAS: 0 ;TEMP FOR A AT CFH
5828 SWPIQS: 0 ;SAVE Q AT SWPPIN
5829 CFHUVP: 0 ;USER'S VIRTUAL PAGE NUMBER TOOK FAULT ON
5830 LUMPS: 0 ;UMAPS USED FOR CURRENT USER, MAY DIFFER FROM
5831 ;UMAPS(U) IF TOOK FAULT TRYING TO CAUSE INTERRUPT
5832 TRUMM: 0 ;TOTAL USER MEM ACTIVE USERS
5833 NPGSWO: 0 ;NUMBER OF CURRENTLY SWAPPED OUT PAGES
5834 AUSOPG: 0 ;ACTIVE USER SWAPPED OUT PAGES
5835 BUMPGS: 0 ;REAL CORE PAGES OCC BY BLOCKED + STOPPED LOSERS
5836 NUSWB: 0 ;# LOSERS SWAP BLOCKED
5837 SWPOPU: 0 ;USER PG "BELONGS" TO (IE NOT NECC TO PCLSR THIS GUY,
5838 ;BUT PCLSR ANYONE ELSE LINKED TO PG.)
5839 AGEREQ: 0 ;NUMBER OF PAGES BEING AGED AT SLOW CLOCK
5840 AGEPOS: 0 ;LAST PAGE # AGED
5843 PRVUSR: -1 ;PRIV USR
5844 PRVCUT: 1500 ;CUT OFF FOR PRIV USR
5845 SWUPC: 0 ;ABSOLUTE PAGE NUMBER OF USER MODE PC DURNING SWAP OUT
5846 SWPP0F: -1 ;-1 IF CONSIDERING PAGE 0
5847 ASBUM: 0 ;REAL MEM OCC BY ACTIVE "SWAPPED BLOCKED" LOSERS
5848 SWSCT1: 0 ;TEM AT SWSCD
5849 BUSR: 0 ;INDEX OF SMALLEST SWAP BLOCKED LOSER
5850 BUSIZ: 0 ;SIZE OF BUSR
5854 PREEMP: 0 ;IF NON-ZERO, A PRE-EMPT IS IN PROGRESS (WHEN WE NEXT GET TO CLK LVL)
5855 NPREEL: 0 ;NUMBER OF LOOPS AT SCHEDP (ATTEMPTED PREEMPTS)
5856 NPREEM: 0 ;NUMBER OF SUCCESSFULL PREEMPTS
5857 NPREE1: 0 ;NUMBER OF TIMES A PAGE CAME IN AND WE STARTED TO THINK ABOUT PREEMPTION
5858 NPREE2: 0 ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE OF CLKOFF OR IN PROGRESS
5859 NPREE3: 0 ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE FLSINS WAS WRONG
5862 ;COUNTS OF REASONS FOR ENTRY TO SCHED
5863 ;THESE METERS MAY BE TEMPORARY - SOME OF THEM ARE REDUNDANT
5864 ;REASONS NOT COUNTED - VARIOUS PARITY, NXM, AND OTHER ERROR CASES
5865 NLPPRE: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PREEMPT
5866 NLPCLK: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO CLOCK
5867 NLPUFL: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO UFLS
5868 NLPPAG: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE-IN
5869 NLPPGT: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND TUT LOCKED
5870 NLPPGC: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CIRPSW LOCKED
5871 NLPPGM: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND MEMFRZ LOCKED
5872 NLPPG3: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CALLED CFHPO3 (NO MEM)
5873 NLPPGB: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND SWAP-BLOCKED
5874 NPPIUM: 0 ;NUMBER OF TIMES PAGE PUT INTO BUNCHA USERS' MAPS
5875 NPPIU1: 0 ;NUMBER OF USERS PAGES PUT INTO MAPS OF (RATIO OF THESE 2 IS SHARING)
5878 LODQNT: ;RUN TIME IN 4-USEC UNITS BETWEEN PG FAULTS TO LEAVE
5880 IFN KL10P, 3000. ;12 MS
5881 IFN KA10P, 9000. ;36 MS
5882 IFN KS10P, 3000. .ERR Guessed LODQNT on KS10?
5883 LODFCT: 3,,0 ;MULTIPLY LOADING TIME BY THIS TO GET PROTECT TIME (INT,,FRAC)
5884 NUPTAW: 0 .SEE SWOP6 ;NUMBER OF USERS PAGE TAKEN AWAY FROM
5888 NPLBLJ: 0 ;NUMBER OF PAGE LOADS BY LOADING JOBS
5889 NPLBNL: 0 ;NUMBER OF PAGE LOADS BY NON-LOADING JOBS
5892 ; 1-, 5-, 15- minute average population of each state,
5893 ; also avg of NPGWTU and RNABLU (for load avg)
5894 ; avg of core occupied by jobs in each state,
5895 ; i.e. UWRKST for load, pro, sw in.
5896 ; Relationship of sum of UWRKST's of loading and swapped in
5897 ; versus total core occupied by user pages.
5898 ; Average time spent in each state before moving on,
5899 ; versus size of job. Maybe cpu time as well as
5906 OVHMTR SWP ;SWAP PAGE
5908 ;SWAP OUT PAGE WHOSE MEMBLT INDEX IS IN A
5910 ;C IS USER WHO DOESN'T NEED TO BE PCLSRED BEFORE HIS PAGES CAN BE SWAPPED.
5911 SWPOPL: TDZA B,B ;THIS ENTRY IGNORES LOCK BIT
5912 SWPOPG: MOVSI B,MMPLOK ;THIS ENTRY RESPECTS LOCK BIT
5917 BUG ;DON'T SWAP OUT PART OF SYSTEM
5920 LDB C,[MMMPX,,MEMBLT(A)]
5922 HRRZM C,SWOMMP ;STORE ADDRESS OF FIRST WORD OF MMP ENTRY
5923 TDNE B,(C) .SEE MMPLOK ;LOCKED IN CORE?
5924 JRST [ CAIGE A,256. ;IF SO, DON'T SWAP OUT UNLESS IN "LOW" MEMORY
5925 CAIGE A,LIOBLK ;IN WHICH CASE MUST GO OUT TO AVOID SYSTEM DEADLOCK
5926 JRST SCRPSJ ;SEE CODE AT CIMEMR
5929 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES
5933 SOS CIRPSW ;RELEASE SWITCH
5935 JUMPN B,SWOP1 ;JUMP IF DISK SPACE ALREADY ASSIGNED
5936 SWODF3: MOVSI B,-NQS
5937 SWODF6: AOS I,SWODSK
5939 SUBI I,NQS ;WRAP AROUND
5940 MOVEM I,SWODSK ;CURRENT SWAPPING DSK
5941 CONO PI,UTCOFF-1 ;DON'T CHANGE STATE OF CLOCK CHNL.
5942 SKIPGE QTUTO(I) ;TUT LOCKED
5945 SKIPG QSFTS(I) ;DSK FULL IN SWAPPING AREA
5949 CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL.
5950 MOVEI A,NQCHN+1(I) ;QMFTP(A) CONTAINS TRACK TO START FROM
5951 PUSHJ P,QGTK4 ; RETURNS TRACK IN D
5953 SWODF5: MOVSI A,(SETZ)
5956 HRLM D,1(A) ;STORE DISK ADDRESS IN MMP ENTRY
5960 SWODF7: AOBJN B,SWODF6 ;TRY NEXT DSK FOR SWAPPING AREA
5961 CONO PI,UTCON-1 ;NON FOUND FIND FILE SPACE
5965 SWODF2: SKIPL QTUTO(E) ;FIND WHICH DISK HAS MOST FREE SPACE
5972 SWODF4: AOBJN E,SWODF2
5973 JUMPL I,CPOPJ ;NO DSK SPACE AVAIL
5974 HRRZM I,SWODSK ;LAST DSK HACKED
5975 JUMPLE D,CPOPJ ; NO ROOM ANYWHERE
5978 JRST UTCNJ ;TUT LOCKED
5982 MOVEI D,NBLKS/2 ;STARTING POINT
5983 MOVEI A,NQCHN+1(I) ;DISK CHANNEL
5985 PUSHJ P,QGTK4 ;RETURNS TRACK IN D
5987 MOVEM E,QMFTP(A);DON'T LEAVE SWAPPING CHNL POINTING INTO FILE SPACE
5991 SCRPSJ: SETOM CIRPSW
5998 ;COME HERE FROM SWPOPG AND MMPRTN TO SWAP OUT A PAGE.
5999 ;CLOCK OFF OR IN PROGRESS AND ARGUMENTS IN SWOBK AND SWOMMP.
6000 ;PUTS BLOCK ON SWAPOUT LIST IF DISK COPY NEEDS TO BE UPDATED, ELSE
6001 ;JUST DELETES MEMORY. IF NO USERS ARE USING THE PAGE,
6002 ;RETURNS THE MMP ENTRY OR ARRANGES FOR THE DISK ROUTINES TO.
6004 SWOP1A: CONO PI,UTCOFF-1 ;DON'T CHANGE STATE OF CLOCK CHNL.
6005 MOVE A,SWOBK ;CORE BLOCK # CONTAINING PAGE TO BE SWAPPED OUT
6006 HLRZ C,MMSWP(A) ;NUMBER OF EXEC PAGES POINTING TO THIS PAGE
6007 JUMPN C,SWOP5 ;POINTED TO BY EXEC PAGE, CAN'T SWAP OUT
6010 SWOPT2: LDB I,DPEP(C)
6013 ANDI I,PMRCM ;MASK TO REAL CORE PAGE #
6015 BUG ;DISPLAY STILL SET UP TO PAGE BEING SWAPPED OUT
6016 SWOPT1: AOBJN C,SWOPT2
6021 IORM C,MEMBLT(A) ;PREVENT NEW EXEC PAGES FROM BEING SET UP POINTING HERE
6023 MOVE C,[2200,,MEMPNT]
6025 SETOB B,SPGNMF ;INITIALIZE PAGE NOT MODIFIED FLAG, AND COUNT USERS IN B
6030 MOVSI D,-1 ;COMPUTE WORKING SET CONTRIBUTION TO BE TAKEN AWAY
6031 IDIV D,MMSWP(A) ;LH(MMSWP) KNOWN TO BE ZERO!
6032 PUSHJ P,UCPRL ;CHECK ALL USERS, TAKE PAGE AWAY FROM SOME
6033 400000,,SWOP6 ;ALSO COUNTS USERS IN B
6035 AOJE B,SWOP7 ;JUMP IF NO USERS USING PAGE, RETURN MMP ENTRY
6036 CAMN B,NUPTAW ;ANY USERS STILL MAPPED TO PAGE?
6037 JRST SWOP8 ;NO, GO SWAP IT OUT
6038 MOVSI D,1 ;YES, COMPUTE WORKING SET ADJUSTMENT
6039 IDIV D,MMSWP(A) ;TO BE ADDED BACK IN TO THEM
6040 PUSHJ P,UCPRL ;GO BACK AND FIX WORKING SETS
6042 JRST SWOP6E ;ABORT SWAP OUT
6046 PUSH P,I ;NOTE: CAN BACK OUT OF THIS PUSH AT SWOP2B
6048 400000,,SWOP2 ;RETURN ON USERS (CAN BACK OUT AT SWOP2B)
6052 SWOP7: MOVSI B,MMPGON ;NO USERS USING PAGE, SO MMP ENTRY WILL BE RETURNED
6053 IORM B,@SWOMMP ;FLAG THAT MMP ENTRY WILL SOON GO AWAY
6054 MOVEI A,0 ;REMOVE FROM LOOSE PAGE LIST
6056 SWOP7A: MOVE B,A ;B PREDECESSOR
6057 SKIPN A,T ;T SUCCESSOR
6059 LDB T,[MLO,,MEMBLT(A)]
6062 SKIPE B ;FOUND, PATCH OUT OF LIST
6063 DPB T,[MLO,,MEMBLT(B)]
6070 BUG ;NLOOSP TOO LOW.
6074 ;THIS UCPRL ROUTINE SCANS ALL USERS, COUNTS THEM IN B,
6075 ;USES D TO ADJUST WORKING SETS OF USERS WHICH ARE MAPPED TO
6076 ;THE PAGE, AND TAKES THE PAGE AWAY FROM ANY USERS IT CAN,
6077 ;COUNTING THEM IN NUPTAW.
6078 SWOP6: AOS B ;COUNT USERS OF THIS PAGE
6080 BUG ;SYS JOB OR CORE JOB?
6082 MOVEI C,UPGMP(U) ;MAKE C POINT TO UPGMP ENTRY (PTW)
6092 ADDM D,UWRKST(U) ;IS MAPPED TO PAGE, ADJUST WORKING SET
6094 JRST SWOP6A ;DON'T CONSIDER PCLSRING SWPOPU
6098 SKIPN LSWPR(U) ;PCLSR IF HAS SWITCHES LOCKED
6101 MOVSI T,%SWPCL ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6108 PUSHJ P,PCLSR ;BETTER NOT CLOBBER U OR H OR A
6115 ;WHEN WE GET HERE, THIS JOB CAN'T HOLD THIS PAGE IN
6116 SWOP6A: TRNN I,600000
6117 JRST SWOP6C ;NOT SET UP SINCE PREV SWAPPED OUT
6118 AOS NUPTAW ;TAKE IT AWAY
6119 LSH I,-16. ;SAVE ACCESS MODE IN LOW ADR BITS
6120 CAILE I,2 ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6121 CLEARM SPGNMF ;PAGE HAS BEEN MODIFIED
6122 CAIN I,2 ;FLUSH R.W.F.
6124 DPB I,C ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6125 AOS NSWPGS(U) ;INCR COUNT OF SWAPPED OUT PGS OF USER
6126 AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS
6127 SOS MMSWP(A) ;DECR COUNT OF PAGE SHARERS
6129 CAMN U,DISUSR ;IF USER OF E&S
6130 PUSHJ P,E.SLPM ;LOAD ITS MAP
6135 SWOP6F: CAMN U,-4(P) ;DON'T LOOK AT USER TAKING PAGE AWAY FROM
6136 POPJ P, ;ELSE DROP INTO SWOP6B
6137 ;THIS UCPRL ROUTINE ADJUSTS WORKING SETS OF JOBS THAT
6138 ;ARE MAPPED TO THE PAGE USING D.
6140 MOVEI C,UPGMP(U) ;MAKE C POINT TO UPGMP ENTRY (PTW)
6150 ADDM D,UWRKST(U) ;IS MAPPED TO PAGE, ADJUST WORKING SET
6156 ;COME HERE VIA UCPRL FOR ALL USERS OF PAGE BEING SWAPPED OUT
6158 SWOP2: AOS B ;COUNT USERS OF THIS PAGE
6160 BUG ;SYS JOB OR CORE JOB?
6167 SKIPN LSWPR(U) ;PCLSR IF HAS SWITCHES LOCKED
6170 MOVSI T,%SWPCL ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6174 SWOP2D: PUSHJ P,PCLSR
6176 SWOP2A: MOVEI C,UPGMP(U)
6186 JRST SWOP2C ;NOT SET UP SINCE PREV SWAPPED OUT
6187 LSH I,-16. ;SAVE ACCESS MODE IN LOW ADR BITS
6188 CAILE I,2 ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6189 CLEARM SPGNMF ;PAGE HAS BEEN MODIFIED
6190 CAIN I,2 ;FLUSH R.W.F.
6192 DPB I,C ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6193 AOS NSWPGS(U) ;INCR COUNT OF SWAPPED OUT PGS OF USER
6194 AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS
6196 SOS MMSWP(I) ;KEEP ACCURATE COUNT OF UPGMP'S POINTING AT THIS PAGE
6198 CAMN U,DISUSR ;IF USER OF E&S
6199 PUSHJ P,E.SLPM ;LOAD ITS MAP
6204 SWOP2B: SUB P,[6,,6] ;2 PUSHES OF I AND 4 FOR UCPRL
6206 SWOP6E: MOVE A,SWOBK ;ABORT SWAP-OUT
6212 SWOP8: DPB I,C ;DELINK MEMPNT
6213 MOVEI I,3 .SEE MMPOUT .SEE MMPTMP
6214 DPB I,[410200,,@SWOMMP] ;INDICATE ON THE WAY OUT
6222 TLNN C,MMPGON ;UNLESS PAGE WILL BE FORGOTTEN AFTER SWAP OUT,
6223 AOS NPGSWO ; KEEP COUNT OF PAGES CURRENTLY SWAPPED OUT
6224 TLNE C,MMPWRT ;IF WAS WRITTEN BY USER WHO LATER DELETED IT,
6226 SKIPGE SPGNMF ;OR IF PAGE MODIFIED,
6228 JRST SWOP3 ;OR IF HASN'T BEEN WRITTEN TO DISK, MUST WRITE OUT.
6229 MOVEI I,2 ;NO NEED TO WRITE OUT. INDICATE OUT.
6230 DPB I,[410200,,@SWOMMP]
6231 PUSHJ P,IMEMR ;RETURN THE MEMORY
6234 PUSHJ P,RETMMP ;ALSO RETURN THE MMP ENTRY IF NECESSARY
6238 UTCNJ: CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL
6241 SWOP3: CAIGE A,TSYSM ;HAVE TO WRITE THIS PAGE OUT
6247 BUG ;DISK NUMBER NOT LEGITIMATE
6249 ANDCAM C,MEMBLT(A) ;SET END OF LIST IN THIS BLOCK
6250 HLRZ C,SOUTLS(I) ;GET PREV BLOCK
6252 DPB A,[MLO,,MEMBLT(C)] ;CHAIN TO PREV BLOCK
6254 MOVEM A,SOUTLS(I) ;OR TO HEADER IF FIRST
6255 HRLM A,SOUTLS(I) ;AND SET NEW LAST BLOCK
6258 HRLM C,MEMPNT(A) ;STORE DISK ADDRESS
6260 DPB B,[MUR,,MEMBLT(A)]
6263 UTCNJ1: CONO PI,UTCON-1
6267 SWPPIN: MOVSI Q,-NSWPV ;# OF DEVICES THAT CAN SWAP IN PAGES
6268 SWPPI4: SKIPGE W,SWIRQB(Q) ;USER INDEX
6270 MOVE E,SWIVPN(Q) ;VIRTUAL PAGE NUMBER
6277 SWPPI6: AOBJN Q,SWPPI4
6283 TRNN Q,-1 ; IS DEVICE DIS? (E&S IS INDEX 0 IN SWIRQB)
6284 SETZM E.SPGW ; IF SO, CLEAR PAGE WAIT.
6292 SUBTTL LOAD USER PAGE MAP
6294 OVHMTR UUO ;RANDOM UUOS (WELL, SOME MINOR SCHED STUFF, TOO)
6296 ;SET PAGE MAP AT M.P. LEVEL, ASSUMING UMAPS HAS BEEN ALTERED.
6297 ;UMAPS EXISTS SO SCHEDULER CAN RESTORE THE MAP AFTER OTHER JOBS RUN.
6298 ;FORMAT OF A MAP SPECIFICATION IS:
6300 %UMMPL==200000 ;1 => MAP LOWER HALF TO SPEC'D JOB'S; 0 => USE LOWER OF JOB IN U.
6301 %UMMPU==100000 ;1 => MAP UPPER HALF TO SPEC'D JOB'S; 0 => USE UPPER OF JOB IN U.
6302 %UMALL==300000 ;SET => SELECT WHOLE MAP OF SPEC'D JOB.
6303 %UMUTL==40000 ;IGNORED IF %UMMPU=0. IF %UMMPU=1, MEANS USE SPEC'D JOB'S LOWER
6304 ;INSTEAD OF ITS UPPER, AS OUR UPPER HALF. READ "%UM UPPER-TO-LOWER".
6305 %UMLTU==20000 ;"%UM-LOWER-TO-UPPER". WITH %UMMPL, MAKES LOWER -> SPEC'D JOB'S UPPER.
6306 %UMSOA==4000 ;1 => USE AC0S AS THE USER'S ACS, INSTEAD OF UUOACS.
6307 ;NOTE IF %UMLTU=1, OR IF LOWER -> PDP6, THE GARBAGS ACS ARE USED.
6308 ;ELSE, THE ACS COME FROM THE JOB WHICH OUR LOWER HALF COMES FROM.
6309 ;RH ;JOB INDEX OF THE "SPECIFIED JOB". -1 => PDP6.
6310 ;NOT NEEDED IF %UMMPL=%UMMPU=0.
6312 PGLDU: MOVE R,UMAPS(U)
6313 ;SET PAGE MAP AT INT. LEVEL, NOT CLOBBERING JOB'S UMAPS. ARG IN R.
6314 PGLD: MOVEM R,LUMPS ;LAST UMAPS ACTUALLY USED
6315 AOS NPGLD ;COUNT # CALLS TO PGLD
6316 PUSH P,A ;R HAS UMAPS CODE
6320 IFN KA10P, MOVSI B,NUVPG/2 ;SET UP NORMAL DBL, MIGHT BE CHANGED IF PDP6
6321 IFE KA10P, MOVSI B,0 ;ONLY KA10 HAS DBL
6323 JRST PGLD3A ;USE NORMAL LOW SEG
6326 JRST PGLD3B ;USE PNTR TO PDP6
6329 TLNE R,%UMLTU ;SKIP ON USE HIS LOWER
6330 JRST PGLD3D ;USE HIS UPPER
6331 PGLD3A: HRRI B,UDBR1A(C)
6333 JRST PGLD3G ;MAKE AC'S POINT AT SWAP OUT AC'S
6335 PGLD3F: MOVEM B,UPDBR1(U)
6336 IFN KA10P, DPB A,[2300,,UPACP(U)] ;STORE AC PNTR
6338 CAMN A,AC1PTR ;IF CHANGING AC BLOCK 1
6340 EXCH A,AC1PTR ;STORE OLD BLOCK 1
6342 XCTR XBR,[BLT B,17(A)]
6343 MOVS A,AC1PTR ;AND LOAD NEW BLOCK 1
6345 PGLD3H: ] ;IFE KA10P
6346 IFN KA10P, MOVSI B,NUVPG/2 ;SET UP DBL FOR DBR2
6347 IFE KA10P, MOVSI B,0
6350 JRST PGLD6 ;USE NORMAL UPPER SEG
6358 PGLD6: MOVEM B,UPDBR2(U)
6359 PGLDR1: LPMR UPGML(U)
6365 IFN PDP6P, PGLD3B: SKIPA B,PDP6MP
6366 PGLD3D: HRRI B,UDBR2A(R)
6370 PGLD3G: MOVEI A,AC0S(C)
6373 GACS: BLOCK 20 ;GARBAGE AC'S POINTED TO BY ACPNTR WHEN ITS REALLY POINTING
6374 ;AT UPPER PAGES OR PDP6 SHOULD HOPEFULLY NEVER GET REFERENCED
6376 ;MAIN PROGRAM MAP-SETTING ROUTINES.
6378 MP6LD: SKIPA J,[%UMMPU,,-1] ;LOAD UPPER DBR TO PNT TO 6
6380 MPLDZ: MOVEI J,0 ;SET NORMAL MAP - OUR OWN CORE.
6381 MPLD1: CAMN J,UMAPS(U) ;SET UMAPS AS SPEC'D
6384 MPLD: CONO PI,CLKOFF
6388 ;SET MAP TO JOB # IN J; MIGHT OR MIGHT NOT BE THE CURRENT JOB. SAVES RH(J)
6390 TLOA J,%UMSOA+%UMALL ;OTHER JOB'S ACS ARE IN ITS AC0S.
6391 TLO J,%UMALL ;THIS JOB => WANT UUOACS.
6394 ;SIMILAR ROUTINES, BUT FOR USE WHEN CLKCHN IS OFF AND SHOULD STAY OFF.
6396 PLD6: SKIPA J,[%UMMPU,,-1] ;MAKE UPPER DBR POINT TO PDP6.
6398 PLDZ: MOVEI J,0 ;NORMAL MAP
6399 PLD1: MOVEM J,UMAPS(U)
6400 PLD: SPM UPGML(U) ;IF ANY INHIBITED FAULT PRESENT, CAUSE IT TO GET STORED AWAY
6402 PUSHJ P,PGLDU ;CAUSE ACTUAL PG LOAD TO HAPPEN
6406 SUBTTL GIVING THE USER INTERRUPTS
6408 SEAR2E: MOVE A,PIRQC(U)
6410 ;ROUTINE TO HANDLE FIRST WORD (PIRQC) INTS
6411 SEAR2A: JUMPL A,SEAR2B ;REQUEST TO PCLSR
6413 JRST SEAR2C ;PI IN PROG, ONLY LOOK FOR FATAL INTS.
6415 AND Q,MSKST(U) ;ENABLED UNDEFERRED INTS.
6416 TDNN A,Q ;ANY OF THOSE PENDING,
6417 TDNE A,[BADBTS] ;OR ANY CLASS 1 OR 2 => INTERRUPT.
6420 ANDCA Q,A ;GET DISABLED OR DEFERRED PENDING INTS.
6421 TDNN Q,[BADBTS] ;ANY CLASS 1 OR 2 DISABLED OR DEFERRED
6422 JRST INTWD1 ;NO, INT. THIS JOB.
6423 JRST SEAR2D ;YES, INT. SUPERIOR.
6425 SEAR2C: TDNN A,[BADBTS] ;PI IN PROG: ANY CLASS 1 OR 2 ?
6426 JRST SEARL2 ;NO, NOTHING TO DO.
6427 SEAR2D: PUSHJ P,PCLSR ;INT. THE SUPERIOR: PCLSR FIRST.
6428 JRST SEARC ;CAN'T STOP THIS JOB IN EXEC MODE.
6429 SETZ B, ;OK, HANDLE FATAL 1ST WORD INTS IN A, AND NO 2ND WORD INTS.
6431 ;HANDLE A FATAL INTERRUPT BY INTERRUPTING THE SUPERIOR.
6432 ;FATAL 1ST WORD INTERRUPTS IN A, FATAL 2ND WORD INTS IN B.
6433 INTSUP: MOVEM A,SRN4(U) ;.FTL1
6434 MOVEM B,SRN5(U) ;.FTL2 ;PUT THE FATAL INTERRUPTS WHERE SUPERIOR CAN READ THEM.
6436 IORM T,USTP(U) ;STOP INFERIOR
6437 IFN SWPWSP, PUSHJ P,LVLOAD
6438 MOVSI T,BULGOS ;IF LOST TRYING TO LOG OUT, ABORT LOGOUT
6440 MOVE Q,U ;SAVE USER INTERRUPTING
6441 SKIPGE U,SUPPRO(U) ;SKIP UNLESS TOP LEVEL
6442 JRST INTTOP ;REALLY TOP LEVEL
6443 HLLZ T,U ;GET INT BIT
6444 IORM T,IFPIR(U) ;TURN ON INTERRUPT BIT IN SUPERIOR
6445 HRRZS U ;CLEAR LEFT HALF OF U
6446 CAIL J,(U) ;SKIP IF SUPERIOR HAS NOT YET BEEN SCHEDULED
6447 JRST SEARL1 ;RESCHEDULE SUPERIOR
6448 JRST SEARL ;HAVEN'T GOT TO HIM YET SO CONTINUE
6450 INTTOP: MOVEI T,SCRDET
6451 SKIPL APRC(Q) ;IF JOB ISN'T ALREADY DISOWNED
6452 IORM T,SUPCOR ;SAY SOMEONE WANTS TO BE DETACHED.
6453 JRST SEARL ;LEAVE STOPPED, SYS JOB WILL DETACH SOMEDAY.
6455 SEAR2B: PUSHJ P,PCLSR ;PCLSR THE JOB, E.G. SO IT CAN GET AN IOC ERROR
6456 JRST SEARC ;RUNNING IN EXEC MODE, GO RUN IT
6457 MOVSI A,(SETZ) ;CLEAR REQUEST
6459 JRST SEARL1 ;INSPECT THIS JOB AGAIN
6461 ;IFPIR IS NONZERO BUT PIRQC IS ZERO.
6462 INTWD2: SKIPN PICLR(U)
6463 JRST SEARL3 ;IGNORE 2ND WD INTS IF PI IN PROG.
6465 ANDCM B,IDF2(U) ;GET ENABLED UNDEFERRED INTS.
6466 JUMPE B,SEARL3 ;ALL DISABLED OR DEFERRED.
6467 JSP T,INTPAG ;MAKE SURE NOT WAITING FOR PAGE NEEDED FOR INT.
6468 PUSHJ P,PCLSR ;DON'T INT. EXCEPT IN USER MODE.
6470 SETZ A, ;1ST WD INTS TO GIVE = 0.
6471 JRST INTSRC ;2ND WD INTS TO GIVE ALREADY IN B.
6473 ;PIRQC WAS NONZERO BUT NO FATAL INTS.
6474 INTWD1: JSP T,INTPAG ;IF TRIED BEFORE & WENT TO INTPFL, WAIT FOR PAGE.
6475 PUSHJ P,PCLSR ;CAN INT. ONLY IN USER MODE.
6478 AND B,MSKST2(U) ;GET PENDING ENABLED UNDEFERRED 2ND WD INTS IN B.
6481 ANDCM A,IDF1(U) ;PENDING ENABLED UNDEFERRED 1ST WD INTS IN A.
6482 INTSRC: AOS NAUINT ;ELSE 1 MORE ATTEMPT TO INTERRUPT.
6483 MOVSI R,%UMSOA ;LOAD ORDINARY MAP FOR THIS USER.
6484 PUSHJ P,PGLD ;BUT ACS -> SWAP OUT ACS.
6485 HRRZ T,40ADDR(U) ;GET ADDR OF USER'S LOCATION "40"
6486 XCTRI XR,[MOVE T,2(T)] ;TRY TO GET CONTENTS OF "42" (..I SO STOP ON EXEC PG FAULT DOESNT)
6488 JRST INTPFL ;PAGE FAULT IN XCTR, GIVE UP & WAIT FOR PAGE.
6490 JUMPE R,INTBAD ;42 POINTS TO 0 => BADPI ERROR.
6492 TLNN TT,%OPINT ;NEW STYLE INTERRUPTS?
6493 JRST INTOLD ;NO, OLD STYLE.
6494 XCTRI XR,[MOVE R,(R)] ;GET ADDR OF HIS INT PDL PTR.
6498 CAMGE T,[-72.*5-1,,]
6500 XCTRI XR,[MOVE H,(R)] ;GET CONTENTS OF INT PDL PTR.
6501 JRST INTSR2 ;ADVANCE T PAST INT PDL PTR ADDR.
6504 INTSR0: XCTRI XR,[MOVE C,(T)] ;GET THE INTS NEXT INT TABLE ENTRY
6506 JRST INTPFL ;APPLIES TO.
6507 XCTRI XR,[AND D,1(T)]
6510 AND C,A ;WHICH OF THEM ARE WE TRYING TO GIVE?
6512 JUMPE D,INTSR1 ;NOT GIVING ANY OF THEM, TRY NEXT ENTRY.
6513 MOVE Q,IDF1(U) ;GET CURRENT SETTINGS OF DEFER WORDS.
6514 XCTRI XW,[MOVEM Q,3(H)]
6515 SKIPA Q,IDF2(U) ;AND PUT INTO NEXT INT PDL FRAME.
6517 XCTRI XW,[MOVEM Q,4(H)]
6518 SKIPA Q,UPC(U) ;ALSO PUT CURRENT PC IN FRAME.
6520 XCTRI XW,[MOVEM Q,5(H)]
6523 XCTRI XR,[MOVE E,2(T)] ;NOW SEE WHICH DEFER BITS TO TURN ON NOW.
6526 XCTRI XR,[MOVE TT,3(T)]
6529 XCTRI XR,[MOVE Q,4(T)] ;AND THE NEW PC.
6534 TLO Q,%PCUIO ;DON'T CHANGE HIS IOTLSR STATUS.
6535 XCTRI XW,[MOVEM C,1(H)]
6536 CAIA ;PUT INTS BEING GIVEN IN
6537 JRST INTPFL ;INT. PDL FRAME.
6538 XCTRI XW,[MOVEM D,2(H)]
6541 MOVE W,H ;REMEMBER PDL PTR BEFORE INCREMENT, FOR PDL OV TESTING
6543 LDB J,[220500,,R] ;HOW MANY ACS SHOULD WE SAVE?
6544 JUMPE J,INTSR5 ;NONE?
6546 ADD H,J ;ADVANCE THE PDL PTR OVER WHERE THEY'LL GO.
6547 SUBM H,J ;GET BACK THE OLD UN-ADVANCED PDL PTR IN J.
6549 HRLI J,(R) ;PUT 3.7-4.1 OF R INTO LH(J) CIRCUITOUSLY
6552 AOS J ;MAKE J POINT AT 1ST UNUSED PDL WORD.
6553 XCTRI XBRW,[BLT J,(H)]
6556 INTSR5: JUMPGE R,INTSR4 ;SAVE DEBUGGING INFO ON INT PDL IF USER WISHES
6558 XCTRI XW,[MOVEM J,1(H)]
6561 XCTRI XW,[MOVEM J,2(H)]
6564 XCTRI XW,[MOVEM J,3(H)]
6568 INTSR4: MOVE J,U ;MAYBE? SCHED LOOP WANTS USER IDX IN J?
6569 XCTRI XW,[MOVEM H,(R)] ;STORE BACK THE PDL POINTER, THUS FINALIZING ALL
6570 TDZA A,C ;INTS HAVE BEEN GIVEN; NOW WE CAN CHANGE THE USER VARS.
6574 IORM E,IDF1(U) ;SET THE DEFER BITS SPEC'D IN TABLE ENTRY.
6576 MOVEM Q,UPC(U) ;START USER AT INT HANDLER.
6577 JUMPL H,INTSR3 ;NOW CHECK FOR INT PDL OVFLO.
6579 MOVEI TT,%PIPDL ;THERE WAS OVFLO, SET PDL OV INT
6580 TDNN TT,MSKST(U) ;IF ENABLED.
6583 JRST SEAR2E ;RE-TRY THE INTERRUPT.
6585 INTSR3: JUMPN A,SEAR2E ;MORE INTS TO GIVE => RETRY.
6587 INTSRX: AOS NUINT ;1 MORE INT GIVEN SUCESSFULLY.
6589 JRST SEARC ;SCHEDULE.
6591 INTSR1: ADD T,[4,,4] ;NO INTS GIVEN, TRY NEXT ENTRY.
6592 INTSR2: AOBJN T,INTSR0
6593 JRST INTSUP ;ENABLED INTS BUT NO ENTRIES FOR THEM.
6595 ;GIVE INTS THE OLD WAY.
6596 INTOLD: SKIPN C,A ;GIVE INTS OF 1 WD AT A TIME.
6597 SKIPA C,B ;(NO 1ST WD, GIVE ALL 2ND WD)
6598 TDZA B,B ;(SOME 1ST WD INTS, GIVE NO 2ND WD INTS)
6599 TLO C,4^5 ;(GIVING 2ND WD, SET SIGN TO SAY SO)
6600 XCTRI XW,[MOVEM C,(T)]
6601 SKIPA Q,UPC(U) ;STORE INTS BEING GIVEN,
6603 MOVEI T,2(T) ;ADVANCE -> PLACE TO START USER.
6604 XCTRI XW,[MOVEM Q,-1(T)]
6605 TLOA T,%PCUSR ;OLD PC STORED, SET UP NEW.
6607 ANDCAM A,PIRQC(U) ;SAY THESE INTS NOW GIVEN.
6611 MOVEM T,UPC(U) ;SET HIS PC -> TSINT+2
6615 ;IF WE ARE WAITING FOR A PAGE NEEDED FOR TAKING AN INTERRUPT,
6616 ;GIVE UP ON TRYING TO TAKE TE INT. UNLESS PAGE HAS COME IN SINCE LAST TRY.
6617 INTPAG: MOVSI E,%SWPGW
6620 JRST (T) ;JOB NOT WAITING FOR PAGE
6623 JRST (T) ;NOT WAITING FOR INTERRUPT PAGE
6627 JRST SEARL ;PAGE NOT IN
6628 MOVSI T,%SWPGW+%SWINT ;PAGE IN
6634 ;COME HERE WHEN AN XCTRI TAKES FAULT WHILE TRYING TO STORE AN INTERRUPT.
6635 INTPFL: MOVE J,U ;MAYBE? SCHED MAIN LOOP WANTS USR IDX IN J.
6636 SPM UPGML(U) ;STORE MAP IN INTERRUPTING STATE
6637 IFN KA10P, LDB T,[221000,,UPJPC(U)] ;FAULT ADDRESS
6638 IFN KL10P, LDB T,[$PFPNO,,UPFW(U)]
6639 IFN KS10P, LDB T,[$PFPNO,,EPTP7W] ; Fault happened at PI level 7.
6646 JUMPE E,INTBAD ;DON'T HAVE PAGE
6650 JRST INTBAB ;WRITE IN RD ONLY
6651 INTBAC: HLLZ T,UPC(U) ;SIMULATE SETUP OF OPC
6654 MOVEM T,UPOPC(U) ;FAULT STATUS
6656 IORM T,UPQUAN(U) ;BIT NOT SET BY XCTRI
6658 IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATT
6659 LPMRI UPGML(U) ;SET MPV FLAG, WILL CAUSE INT. LATER LPMR'S WON'T
6661 JRST SCHED6 ;"RUN" USER, TAKING PAGE FAULT IMMEDIATELY
6663 INTBAB: TLNE T,50 ;NO ACCESS OR W IN RWF
6664 JRST INTBAC ;PAGING BOX BUG? IGNORE RD ONLY
6665 JRST INTBAD ;REALLY IS READ-ONLY.
6677 JRST INTBAD ;REAL VIOLATION
6680 ;KL10P ;PF OR RWF, TAKE THE FAULT, READ IN THE PAGE, THEN TRY TO INTERRUPT AGAIN
6682 INTBAB: MOVSI T,%SWINT
6683 IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATTEMPT
6684 SETOM DLSRCH ;DON'T INTERRUPT AT INTBA1, SCHEDULE, TRY TO PCLSR
6687 EXCH T,UPC(U) ;HACK USER'S PC
6689 JRST SCHED6 ;RUN USER, RETURNING IMMEDIATELY TO INTBA1
6691 INTBA1: CONO PI,PIOFF
6693 MOVEM U,PFAILU ;SIMULATE A PAGE FAULT ON THE INTERRUPT WORD
6696 MOVEM U,PFOPC1 ;RESTORE USER'S PC
6698 MOVEM U,PFAILF ;FLAG FAULT FROM INTPFL
6699 MOVE U,PFAILU ;RESTORE U SO CLKSAV CAN RE-SAVE IT
6700 CONO PI,CLKRQ ;TURN PI SYSTEM ON AND CAUSE CLOCK BREAK
6701 JRST . ;TAKES A WHILE TO GO OFF
6705 TLNE T,%PF2.8 ; Write in read only?
6706 JRST INTBAD ; Yes: %PIB42
6707 MOVEM T,UPFW(U) ; No: Set up for a simulated fault
6709 IORM T,USWST(U) ; Signal fault as result of interrupt attempt
6710 SETOM PFAILF ; Cause CLK level to go to PFLU2 at
6711 ; first opportunity.
6712 MOVEI T,CCLKRQ ; Make sure that happens real fast
6713 EXCH T,UPC(U) ; by setting his PC thusly.
6714 MOVEM T,EPTPFO ; Save old PC as location of fault.
6715 JRST SCHED6 ; Go run this user.
6718 INTBAD: MOVEI A,%PIB42 ;TURN ON BAD PI LOC INT BIT
6719 IORB A,PIRQC(U) ;GIVE USER INTERRUPT(MUST IORM TO AVOID TIMING ERR)
6720 JRST SEAR2A ;RE-PERFORM ACTIONS FOR NON-ZERO PIRQC
6721 ;WILL CAUSE AN INTERRUPT TO SUPERIOR
6723 ;INTERRUPT ALL USERS THAT WANT IT
6724 ; C(A) IS BIT IN PIRQC TO TURN ON
6725 DBGINT: MOVSI A,(%PIDBG) ;"SYS BEING DEBUGGED" INT
6726 INTALL: MOVEI U,0 ;ENTRY INITIALIZE
6727 INTA2: ADDI U,LUBLK ;ADVANCE TO NEXT BLOCK OF USER VARIABLES
6728 CAML U,USRHI ;SKIP UNLESS AT END
6729 POPJ P, ;THROUGH, RETURN
6730 SKIPN UNAME(U) ;SKIP IF BLOCK IN USE
6731 JRST INTA2 ;IDLE, IGNORE
6732 LDB T,[410100,,USTP(U)] ;GET BUCSTP OF USERS STOP WORD
6733 JUMPN T,INTA2 ;IF USER CONTROL STOPPED, JUMP TO IGNORE
6734 MOVE B,MSKST(U) ;PICK UP INTERRUPT MASK
6735 AND B,A ;MASK C(B) TO APPROPRIATE BIT
6736 IORM B,PIRQC(U) ;GIVE INT TO USER
6739 SUBTTL PCLSR ROUTINES
6741 ; PUT PC OF USER WHOSE INDEX IS IN U IN USER MODE
6742 ; (CALL ONLY WITH CLOCK OFF OR CLOCK BREAK IN PROGRESS)
6743 ;SKIPS IF SUCCESSFUL, FAILS IF USER RUNNING IN EXEC CODE OR HAS TO BE FINALIZED
6747 BUG ;PCLSR'ING NULL, SYS OR CORE JOB?
6751 CAMN T,U ;IS U REALLY A MULTIPLE OF LUBLK?
6752 SKIPN UNAME(U) ;SHOULD NOT HAPPEN TO NONEXTANT JOB
6755 JRST POPJ1 ;USER STOPPED (MUST ALREADY BE IN USER MODE)
6758 JRST PCLSR2 ;LOSER IS RPCLSR'ING SOMEONE
6759 PCLSR3: MOVE T,SUEXIT(U)
6761 CAME T,[JRST 2,@XUUOH]
6762 JRST PCLSR5 ;EXIT ALREADY CLOBBERED
6763 MOVE T,UPC(U) ;PICK UP PROGRAM COUNTER (FLAGS IN L.H.)
6764 TLNN T,%PCUSR ;SKIP IF USER MODE ON
6765 JRST PCLSR8 ;JOB CURRENTLY IN EXEC MODE
6766 SOS NEPCLS ;WAS WRONGLY AOS'ED
6767 CLEARM FLSINS(U) ;IN CASE HE WAS WAITING FOR A PAGE OR CIRPSW
6771 MOVSI T,%SWPGW+%SWRUN+%SWINT
6776 PCLSR8: SKIPE FLSINS(U) ;SKIP IF UNBLOCKED
6777 JRST PCLSR1 ;HUNG, TRY TO BACK UP TO UUO
6778 PCLSR4: MOVE T,[JRST ONEFLS]
6779 MOVEM T,SUEXIT(U) ;MUNG EXIT OF UUO, COME BACK LATER
6783 PCLSR2: SETZM RPCL(U) ;CLEAR OUT POINTERS IN BOTH DIRECTIONS
6787 PCLSR5: SKIPN FLSINS(U)
6788 JRST PCLSRF ;NOT HUNG, LET RUN TO COMPLETION
6789 IFN KA10P,[ ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6790 CAME T,[JRST ONEPROC] ;SKIP IF ONE PROCEEDING A SYS CALL
6793 IORM T,SUUOH(U) ;RESET SINGLE INSTRUCTION PROCEED
6795 IFN KS10P,[ ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6796 CAME T,[JRST ONEPR4] ;SKIP IF ONE PROCEEDING A SYS CALL
6799 IORM T,XUUOH(U) ;RESET SINGLE INSTRUCTION PROCEED
6804 IFN KA10P, MOVE T,[JRST 2,@UUOH]
6809 MOVEM T,SUEXIT(U) ;UNCLOBBER EXIT
6810 PCLSR1: HLRZ T,LSPCL(U) ;SAVE LAST TWO DISTINCT LOCS PCLSR'ED FROM
6815 PCLSR9: SOS T,SUUOH(U) ;GET USER LOCATION OF HIS CURRENT UUO
6819 TLCN T,%PS1PR-%PSINH
6820 TLO T,%PSINH ;ONE PROCEEDING AND INSTR NOT COMPLETE
6822 MOVEM T,UPC(U) ;SET USERS PROGRAM COUNTER
6824 MOVSI T,701100 ;RESTORE PAGE-CONTEXT TO USER MODE
6827 CLEARM UMAPS(U) ;RESTORE TO NORMAL MAP
6828 SETZM FLSINS(U) ;CLEAR OUT ANY BLOCKING CONDITION
6832 MOVSI T,%SWPGW+%SWRUN+%SWPCL+%SWINT ;NOT BLOCKED ON PAGE, NOT UNBLOCKED SWAPOUT,
6833 ANDCAM T,USWST(U) ; NOT INTERRUPT PAGE, NOT SWAPPED OUT WHILE BLOCKED
6835 JRST LSWZAP ;REQUIRED TO UNLOCK SWITCHES
6838 MOVEI T,UUOACS(U) ;IF JOB U'S ACS ARE IN HARDWARE AC BLOCK 1,
6839 CAMN T,AC1PTR ;COPY THEM INTO UUOACS WHERE THEY BELONG.
6840 XCTR XBR,[BLT T,UUOACS+17(U)]
6845 JRST POPJ1 ;EXIT AFTER BACKING UP TO UUO
6847 ; AOS USTP OF USER IN A
6849 NJRPCL: CAIE A,-1 ;ENTRY TO IGNORE IF NULL JOB
6850 RPCLSR: CAMN A,USER ;NORMAL ENTRY
6851 POPJ P, ;TRYING TO RPCLSR SELF OR NULL JOB
6854 MOVE U,A ;GET INDEX OF RPCLSRED JOB IN U
6855 MOVE A,USER ;GET RPCLSRING USER INDEX IN A
6856 CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
6857 PUSHJ P,PCLSR ;PUT USER IN USER MODE
6858 JRST RPCLOS ;JUMP IF CAN'T DO IT RIGHT NOW
6859 AOS USTP(U) ;WIN,STOP USER
6860 CONO PI,CLKON ;RE-ENABLE CLOCK BREAKS
6861 RPCLS1: MOVE A,U ;RESTORE A
6865 RPCLOS: SKIPE RPCL(U) ;SKIP IF ZERO RPCL FOR USER BEING RPCLSRED
6866 JRST RPCLS2 ;SOMEONE GOT THERE FIRST
6867 SKIPE RPCL(A) ;SKIP IF ZERO RPCL FOR RPCSRING USER
6868 JRST UDELAY ;YOU ARE BEING RPCLSR'ED, SURRENDER
6869 HRROM A,RPCL(U) ;SET UP RPCL IN VARS OF RPCLSRED USER
6870 HRRM U,RPCL(A) ;" OF RPCLSRING USER
6872 SKIPE RPCL(A) ;WILL NOT SKIP AT FIRST
6873 PUSHJ P,UFLS ;WAIT FOR PERSON BEING RPCLSRED TO GET TO ONEFL2
6876 RPCLS2: MOVE A,U ;RESTORE A AND U
6879 SKIPE RPCL(A) ;WAIT FOR OTHER GUY TO WIN
6881 JRST RPCLSR ;THEN TRY AGAIN
6886 NJUPCL: CAIE A,-1 ;ENTRY TO IGNORE IF NULL JOB
6887 UPCLSR: CAMN A,USER ;REGULAR ENTRY
6888 POPJ P, ;TRYING TO UPCLSR SELF OR NULL JOB
6895 ; RETURN FROM SYSTEM CALL IN ONE PROCEED MODE
6897 ONEPROC:CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
6898 MOVE U,USER ;BE SURE U HAS RUNNING USER INDEX IN IT
6900 IORM T,PIRQC(U) ;GIVE USER INTERRUPT
6904 SUBTTL KS-10 ONE-PROCEED
6907 ONEPRO: SYSCTX ;SWITCH TO SYSTEM AC BLOCK
6909 BUG AWFUL,[ONE-PROCEED IN NULL JOB]
6910 MOVE T,1PROPC(U) ;PC OF NEXT INSTRUCTION TO EXECUTE
6911 TLNE T,%PSUSR ;NORMALLY USER MODE IS EXPECTED
6913 HRRZ T,T ;SEE IF IT'S FIRST INSTRUCTION OF EXEC ENTRY
6916 SKIPA TT,[JRST ONEPR4]
6917 BUG AWFUL,[ONE-PROCEED IN EXEC MODE],OCT,1PROPC(U)
6918 MOVEM TT,UEXIT ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
6919 CAIE T,UUOH0 ;AND RESUME PROCESSING UUO
6925 ONEPR3: MOVEM T,UUOH ;PUT USER PC WHERE ONEFLS WANTS IT
6926 ONEPR4: SYSCTX ;COME HERE WHEN ONE-PROC'D UUO FINISHES
6927 MOVE U,USER ;BE SURE U HAS RUNNING USER INDEX IN IT
6929 IORM T,PIRQC(U) ;GIVE USER INTERRUPT
6933 SUBTTL USER START ROUTINES
6935 ; CALLED EVERY SLOW CLOCK TICK WHEN TTY WANTING TOP PROCEDURE LOADED
6938 USTRT1: SKIPL T,@UTTYO ;GET TTY TO BE STARTED
6939 JRST [ MOVE U,MMPFR ;WHEN STARTING A HACTRN, MAKE SURE CORE IS AVAILABLE
6941 JRST USTRTL ;IT'S NOT, SAY SYSTEM FULL
6942 JRST .+2 ] ;T HAS INITIAL TTYTBL
6943 MOVSI T,%TBNOT+%TBDTY+%TBNVR ;NOT A REAL TTY, INITIALIZE TTYTBL TO NO TTY
6944 PUSHJ P,USTRA ;CREATE NEW USER SLOT ENTRY
6945 JRST USTSC1 ;LOSE, HAVE TO WAIT
6946 SKIPGE T,@UTTYO ;SKIP IF REALLY A TTY
6947 JRST USTRTS ;DONT LOAD A HACTRN
6948 MOVE T,[SIXBIT /HACTRN/] ;LOAD HACKTRN
6949 USTRT2: MOVEM T,JNAME(U) ;SET JOB NAME
6959 SETZM @UTMPTR(U) ;GIVE TEMPORARY HIGH PRIORITY
6960 SETZM USTP(U) ;START UP
6961 USTSC2: AOS T,UTTYO ;AOS RING BUFF
6966 JRST USTRT1 ;MORE JOBS TO SET UP
6969 USTRTS: MOVEM U,1(T) ;STORE USER'S INDEX IN SECOND WORD
6970 MOVE T,(T) ;GET JNAME FROM FIRST WORD (POINTED TO BY RH OF @UTTYO)
6972 CAME T,[SIXBIT /LDRDEM/]
6973 CAMN T,[SIXBIT /UNSPOO/]
6974 AOS UTMPTR(U) ;LOADER, UNSPOOLER -> SYSTEM TREE
6978 USTSC1: MOVE U,USRHI ;IF A USER IS ^Z'ING AND THERE IS NO POSSIBILITY
6979 SKIPL T,@UTTYO ;OF GETTING MORE JOB SLOTS,
6982 USTRTL: MOVSI U,%TANJS ;THEN MARK THE TTY AS IN NEED OF A "SYSTEM FULL" MESSAGE
6984 MOVEI U,SCRCFM ;AND WAKE UP THE SYS JOB.
6986 JRST USTSC2 ;REMOVE THIS TTY FROM LIST OF THOSE NEEDING A ^Z.
6988 ;GOBBLE NEW USER SLOT, RESET VARIABLES (SKIPS IF IT WINS)
6989 ;RETURNS INDEX IN U. IF FAILS, CLOBBERS U!
6992 JRST USTR1 ;ASSIGN MORE CORE TO USER STORAGE
6994 JRST USTR2 ;HAVE FOUND FREE USER SLOT (IN U)
6999 POPJ P, ;SYSTEM JOB FLUSHING CORE, WAIT UNTIL IT STABILIZES
7000 MOVEI U,LUBLK ;MOVE UP USRHI IF SYS HAS ENOUGH CORE
7003 MOVE T,HUSRAD ;LENGTH OF SYS
7005 JRST MORCOR ;SYS NEEDS MORE CORE FOR USER VARIABLES
7007 USSINI: SETOM USTP-LUBLK(U) ;SYS INITIALIZATION ENTRY
7009 USTR2: PUSHJ P,USTR4 ;RESET USER VARIABLES
7015 BLT T,IOCHNM+17(U) ;CLEAR ALL I/O CHANNELS
7016 USRST4: HRLI T,AC0S(U)
7019 BLT T,AC17S(U) ;CLEAR AC'S & RETURN HAPPY
7022 MORCOR: SUB P,[1,,1]
7024 ANDCAM T,SUPCOR ;CLEAR ANY SYS CORE DECREASE REQ
7026 JRST SUPSET ;REQUEST MORE CORE FROM SYS JOB
7028 ; INITIALIZE A SET OF USER VARIABLES
7029 ; T HAS INITIAL TTYTBL, POSITIVE IT IS TTY # ELSE NO TTY
7030 USTR4: MOVEM T,TTYTBL(U)
7033 HRRM U,TTYSTS(T) ;TELL TTY IT NOW BELONGS TO NEW JOB,
7034 MOVSI U,%TSCNS ;AND IS NOW A CONSOLE.
7037 ANDCAM U,TTYSTS(T) ;AND IS NO LONGER FREE
7038 MOVSI U,%TACFM+%TACTZ
7039 ANDCAM U,TTYSTA(T) ;AND WILL NEED CONSOLE FREE MESSAGE
7042 USTR4A: MOVEM T,UTMPTR(U)
7049 DPB T,[000300,,UNAME(U)]
7051 DPB T,[060300,,UNAME(U)]
7053 DPB T,[140300,,UNAME(U)]
7067 ADDI T,2*30. ;PROTECT FROM SWAPOUT FOR 2 SECONDS (RANDOMLY)
7072 SETOM JBI(U) ;NOT JOB DEVICE HANDLER (NOT YET, ANYWAY)
7075 SETOM TRNLST(U) ;INIT TRANSL LISTS TO NIL
7078 JUMPE U,.+5 ;SYSTEM JOB DOESN'T HAVE A MAP
7082 BLT T,UPGCP+NUVPG/2-1(U)
7087 MOVSI T,(DATAI PAG,)
7097 MOVSI T,(CAI) ;INITIALLY IGNORE TRAPS 1 AND 2
7100 IFE KS10P,MOVEI T,%PI1PR ;TRAP 3 IS IGNORED TOO ON KS
7101 MOVEM T,TR3INS(U) ;TRAP 3 GIVES ONE-PROCEED INTERRUPT ON KL
7105 MOVSI T,MUUOKN ;UUO NEW PC'S ARE SAME AS SYS JOB'S,
7106 HRRI T,MUUOKN(U) ; EXCEPT THAT UUO IN EXEC MODE IS AN ERROR
7112 MOVE T,[%PSPCU,,MUUOEX]
7113 MOVEM T,MUUOKN(U) ; UUO in Exec mode is an error
7114 MOVEM T,MUUOKT(U) ; (either case)
7116 MOVEM T,MUUOCN(U) ; Normal UUO
7118 MOVEM T,MUUOCT(U) ; UUO as trap instruction
7120 MOVEM T,1PRNPC(U) ; One-proceed jumps to ONEPRO
7123 MOVE T,[JRST 2,@UUOH]
7131 MOVE T,[JRST UREALB]
7133 CLEARM UPGML(U) ;CLEAR USER PG MAP VARIABS
7138 MOVSI T,1+EXPGNG ;DONT ENABLE QUAN COUNTER FOR NOW (BUT SET
7142 MOVEM T,UPDBR3(U) ;SET UP EXEC DBR
7143 MOVSI T,IFN MCOND DM,[1040] .ELSE [0] ;ON DM, B+C MEMORIES DON'T WORK
7144 MOVEM T,UPACP(U) ;SET UP B+C MEMORY PTRS
7146 IFN KS10P, SETZM UPQUAN(U) ; Clear quantum counter.
7150 ;DROPS THROUGH, AND .RESET OF USR DEVICE COMES HERE.
7151 USRST2: MOVE T,UNAME(U)
7152 MOVEM T,USYSNM(U) ;CLOCK MUST BE OFF OR PI IN PROG ON 7
7153 MOVE T,TIME ;DON'T SWAP JOB OUT RIGHT AWAY
7169 SETZM NVDBA(U) ;0 VIDEO BUFFERS ASSIGNED BY JOB.
7216 MOVSI T,%OPOJB ;USR RESET DOESN'T CLEAR OJB OPTION BIT
7221 USTR4B: MOVEI T,USRRCE+NCT
7225 ;SET UP THE BLINKER FOR THE JOB IN U.
7226 USTTV0: SKIPN TEN11F
7232 MOVE A,TT11HD ;11 HEADER ADR
7234 LDB B,[141000,,1(A)] ;VIDEO BUFFER #
7235 TRO B,17_8 ;CSET ALU FCTN
7236 LSH B,4+16. ;INTO POSITION FOR MOVEMING INTO CONSOLE REG
7250 .UII,,(SIXBIT/SYS/) ;7
7260 USTCDR: SYSCTX ;GOT HERE FROM ULEAVE WHICH SELECTED THE USER ACS,
7261 MOVE U,USER ; SELECT SYSTEM ACS INSTEAD.
7262 MOVEI A,USTCDR+1 ;COME BACK HERE IN CASE OF PCLSR
7275 SUBTTL USER KILL ROUTINES
7278 ; CLOSE ALL DEVICES AND INFERIOR PROCEDURES OF A JOB (INDEX IN U)
7280 IODCL: MOVNI I,1 ;SET TO STOP
7281 PUSHJ P,IODCL3 ;STOP ALL INFERIOR JOBS (RECURSIVE)
7282 MOVEI I,0 ;THEN KILL.
7285 TLNE A,%OPLOK ;IF USER HAS ENABLED THE SWITCH-UNLOCK FEATURE,
7286 PUSHJ P,IODCSW ;UNLOCK HIS LOCKED SWITCHES.
7287 IFN 340P\E.SP, PUSHJ P,ADCLOSE ;FLUSH DISPLAY
7288 IFN IMXP, PUSHJ P,POTCLS ;DISCONNECT HIS POTS
7291 PUSHJ P,SCNSTP ;KILL SCANNER IF HIS
7293 IFN ARMP, PUSHJ P,AARMOFF ;FLUSH ARM
7294 IFN DEMON, PUSHJ P,DEMOUT ;FLUSH EXISTANCE (CURRENT OR FORMER) AS DAEMON.
7297 PUSHJ P,VBDFLS ;DEASSIGN ALL VIDEO BUFFERS.
7300 CAMN U,MTRUSR ;DEASSIGN THE PERFORMANCE COUNTER
7303 PUSHJ P,CLQDEL ;RELEASE AND STOP CLOCK QUEUE BLOCK
7307 SETOM UREALT ;UN REAL TIME
7308 CAMN U,UMASTER ;UNMASTER
7310 PUSHJ P,AIOPDL ;POP UP ALL OF IO PDL (CLOSING CHNLS POPPED INTO)
7312 IODCL1: PUSHJ P,CCLOSE ;CLOSE ALL CHANNELS
7313 CAIGE R,IOCHNM+NIOCHN-1(U)
7316 SKIPGE T,JBI(U) ;IF THIS JOB IS A JOB-DEVICE,
7318 HRROS JBCJUI(T) ;TELL THE JOB CHANNEL THAT THE HANDLER IS GONE.
7320 SKIPGE JBCG(T) ;IF OUR CREATOR STILL HAS A JOB CHANNEL,
7322 MOVE A,JBCUI(T) ;FLUSH THE CREATOR'S JOB CHANNELS,
7324 PUSHJ P,RPCLSR ;STOPPING THE CREATOR IN CASE HE'S USING THEM NOW.
7325 MOVE T,JBI(U) ;RPCLSR CLOBBERS T.
7335 PUSHJ P,UPCLSR ;ALLOW THE CREATOR TO CONTINUE AND GET IOC ERROR OR RETRY OPEN
7336 IODCL6: CONO PI,CLKON
7337 SETOM JBCUI(T) ;FLUSH THE JOB-DEVICE SLOT.
7338 SETOM JBI(U) ;SAY THIS JOB NO LONGER A JOB-DEVICE.
7341 IODCL3: PUSH P,I ;I=0 KILL I=-1 STOP I=1 JUST CLOSE CHANNELS.
7344 IODCL4: HRRZ E,SUPPRO(A)
7345 SKIPE UNAME(A) ;SKIP IF VARIABLES BLOCK IDLE
7346 CAIE E,(U) ;SKIP ONLY IF IT IS A DIRECT INF.
7347 JRST IODCL5 ;TRY NEXT SET OF VARS
7350 PUSHJ P,1USTOP ;STOP (WITH BUSRC BIT)
7356 PUSHJ P,IODCLA ;KILL OR CLOSE CHNLS, RECURSE
7358 SKIPE -2(P) ;KILLING?
7359 JRST IODCL7 ;JUST CLOSING CHNLS.
7360 MOVE A,U ;KILLING; WAIT TILL NO OTHER JOB
7361 PUSHJ P,AUCL3 ;IS LOOKING AT THE ONE THAT WE'RE KILLING.
7362 PUSHJ P,UBLST2 ;FLUSH CORE
7364 PUSHJ P,ZUSLOG ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
7368 IODCL5: ADDI A,LUBLK
7370 JRST IODCL4 ;LOOP FOR ALL SETS OF USER VARIABLES
7375 IODCL8: PUSHJ P,IODCL3
7378 ;SYSTEM CALL UNLOCK. 1 ARG, A JOB SPEC.
7379 ;THAT JOB'S LOCKS ARE ALL UNLOCKED.
7382 JSP T,NCORUI ;DECODE THE JOB SPEC.
7383 JRST NUNLO1 ;WE'RE CERTAINLY ALLOWED TO WRITE THIS JOB.
7384 JUMPE U,NUNLO1 ;SYSTEM JOB CAN DO IT TO ANYBODY
7385 JSP T,NCORWR ;NOT SURE, SO CHECK.
7386 JRST OPNL31 ;NO, NOT ALLOWED.
7392 ;THE CALL IS ALLOWED, SO UNLOCK THAT JOB'S LOCKS
7395 MOVE A,J ; If not self,
7396 PUSHJ P,RPCLSR ; assure a User mode PC
7401 NUNLO2: MOVE A,UUOH ; If we are asked to unlock
7402 SUBI A,1 ; our own locks, put our PC in
7403 MOVEM A,SRN3(U) ; SRN3 where IODCSW will look for it
7406 TLNE A,%OPLOK ; Provided it is using locks at all...
7409 PUSHJ P,LSWPOP ; USTP
7410 JRST LSWPJ1 ; DIELOK
7411 ; Returns with U clobbered, which seems to be OK for .CALL's?
7414 ;CALL HERE TO UNLOCK THE SWITCHES A JOB HAS LOCKED (USER IDX IN U).
7415 ;LOCATION 43 (ACTUALLY, 3+C(40ADDR)) HAS THE LIST POINTER. 0 IS NIL.
7416 ;ANYTHING ELSE POINTS TO 2-WORD BLOCK; THE 1ST WORD IS THE SWITCH OR THE
7417 ;ADDRESS OF THE SWITCH. THE RH OF THE SECOND IS THE CDR OF THE LIST.
7418 ;THE LH OF THE SECOND IS THE UNLOCK INTRUCTION. THE INDEX FIELD IS IGNORED,
7419 ;ONE LEVEL OF INDIRECTION IS PERMITTED, AND THE INSN MUST BE EITHER
7420 ;AOS OR SOS WITH 0 IN AC FLD, A LOGICAL INSTRUCTION (TOP 3 BITS = 4),
7421 ;A HALFWORD INSTRUCTION, OR A MOVE,MOVN,MOVS,MOVN,ADD OR SUB SERIES INSN,
7422 ;OR 0 WHICH MEANS SETOM. ONLY INSNS THAT MODIFY MEMORY ARE USEFUL.
7423 ;44 IS AN AOBJN POINTER TO THE CRITICAL RTNS TABLE, OF 2-WORDS ENTRIES.
7424 ;THE 1ST WORD EACH IS <BEGINNING OF RANGE>,,<END OF RANGE>+1.
7425 ;THE SECOND IS THE UNLOCK INSTRUCTION, WITH THE ADDRESS OF THE SWITCH
7426 ;IN THE RH (AGAIN, 1 LEVEL OF INDIRECTION IS PERMITTED).
7427 ;IF THE PC IS IN THAT RANGE, THE UNLOCK INSN IS EXECUTED.
7428 ;43 AND 44 ARE UPDATED DURING PROCESSING TO PREVENT PCLSR LOSSAGE.
7429 ;SEE .INFO.;ITS LOCKS
7432 ;MACRO TO DO XCTR, OR POPJ IF THAT WOULD CAUSE INTERRUPT.
7437 ; IODCSW: Unlock locks for user in U
7438 ; User should be stopped so that he is in user mode.
7439 ; The only exception is if we are unlocking the locks of the running job,
7440 ; in which case the contents of SRN3 will be used as our PC.
7441 ; Clobbers just about everything except U.
7443 PUSHJ P,IODCS0 ; Do actual work, if any...
7444 MOVE U,USER ; But be sure to always
7445 PUSHJ P,MPLDZ ; restore normal page map of running user.
7449 MOVE U,USER ;SET UP MAP TO USER BEING HACKED (IDX IN J).
7450 PUSHJ P,MPLDJ ;LH(J) CLOBBERED, RH SAVED.
7451 HRRZ U,J ;U HAS WHAT IT HAD AT CALL (USR BEING HACKED).
7452 MOVEI C,1000 ;COUNT LENGTH OF LIST SO CIRCULAR LISTS DON'T HANG US UP.
7454 XCTRIJ XRW,[MOVES B,3(E)] ;GET HIS "43" (AND MAKE SURE IT'S WRITABLE)
7455 IODCS1: JUMPE B,IODCS2 ;REACHED END OF LOCKED SWITCH LIST, MAYBE?
7456 XCTRIJ XR,[HLL B,1(B)] ;MERGE LOCK INSN WITH ADDR OF SWITCH.
7457 PUSHJ P,IODCDO ;EXECUTE THE UNLOCK INSN
7458 POPJ P, ;IODCDO DETECTED MPV OR PUR INTERRUPT.
7459 XCTR XR,[HRRZ B,1(B)] ;REPLACE LIST BY ITS CDR.
7463 IODCS2: XCTRIJ XRW,[MOVES E,4(E)] ;GET JOB'S "44", AND MAKE SURE IT'S WRITEABLE.
7464 HRRZ C,UPC(U) ;GET ITS PC, FOR COMPARISON.
7465 CAMN U,USER ; Except if this is us,
7466 HRRZ C,SRN3(U) ; then unlock PC is in SRN3
7467 JUMPGE E,CPOPJ ;THERE ARE NO PROTECTED RANGES => DONE.
7468 IODCS3: XCTRIJ XR,[MOVS B,(E)] ;GET BOUNDS OF NEXT PROTECTED RANGE.
7469 CAIGE C,(B) ;IS PC ABOVE LOWER BOUND?
7472 CAIL C,(B) ;IS IT BELOW UPPER?
7474 XCTRIJ XR,[MOVE B,1(E)] ;PC IS IN THIS RANGE; GET UNLOCK INSN
7475 PUSHJ P,IODCDO ;EXECUTE IT
7476 POPJ P, ;NO SKIP => MPV OR PUR INTERRUPT DETECTED.
7477 IODCS4: ADD E,[2,,2] ;CHECK ALL ENTRIES IN CRITICAL RTN TABLE, 1 BY 1.
7478 HRRZ B,40ADDR(U) ;UPDATE 44 SO ENTRIES ALREADY PROCESSED ARE
7479 UMOVEM E,4(B) ;ACTUALLY IN THE TABLE. THIS IS IN CASE PCLSR.
7483 ;PRECEDE AN XCTR WITH JSP TT,IODCXC TO POPJ IF THE XCTR WOULD
7484 ;CAUSE AN INTERRUPT (MPV OR PUR). CLOBBERS A,T,Q.
7485 IODCXC: MOVEI A,@(TT) ;GET EFFECTIVE ADDR OF XCTR.
7486 MOVEI A,@(A) ;GET EFFECTIVE ADDR OF XCTR'ED INSN.
7487 LSH A,-10. ;GET PAGE # BEING REFERENCED.
7488 PUSHJ P,UPLC ;SET T = B.P. TO PAGE MAP HALFWORD. CLOBBERS Q.
7490 TRNE T,600000 ;IF PAGE IS SWAPPED IN, PUT ACCESS BITS IN
7491 LSH T,-20 ;SAME PLACE THEY ARE WHEN SWAPPED OUT (LOW 2 BITS).
7492 ;FOLLOWING CODE COMMENTED OUT BECAUSE IT DOESN'T WORK ON THE KL10 XCTR
7493 ; TRNE T,2 ;CHANGE CODE 2 (READ-WRITE, NOT WRITTEN) TO 3 (READ-WRITE).
7495 ; LSH T,27 ;PUT ACCESS CODE IN AC FIELD, AND TEST
7496 ; ANDCA T,(TT) ;AGAINST WHAT THE XCTR WILL TRY TO DO.
7497 ; TLNN T,(0 3,) ;ALL DESIRED ACCESS AVAILABLE =>
7498 ; JRST (TT) ;WE WIN.
7499 ; POPJ P, ;ELSE QUIT OUT OF CALLING ROUTINE.
7501 ;FOLLOWING CODE INSERTED INSTEAD. THIS RELIES ON THE FACT
7502 ;THAT ONLY THE FOLLOWING INSTRUCTIONS ARE XCTRIJ'ED:
7503 ; BOOLE,HWT,MOVXX,ADDX,SUBX,AOSX,SOSX
7504 MOVE A,@(TT) ;GET INSTRUCTION XCTR'ED
7506 TLCE A,300000 ;SKIP IF AOS OR SOS
7507 TLNE A,002000 ;SKIP IF DOESN'T WRITE IN MEMORY
7508 TRNE T,2 ;INSTRUCTION WRITES, SKIP IF RW OR RWF ACCESS NOT PRESENT
7509 TRNN T,3 ;INSTRUCTION READS, SKIP IF ANY ACCESS PRESENT
7510 POPJ P, ;INSUFFICIENT ACCESS, QUIT OUT OF CALLING ROUTINE
7511 JRST (TT) ;WINNING, GO DO THE XCTR
7513 ;PUSHJ P,IODCDO WITH INSN IN B TO XCTRIJ IT, CHECKING FOR LEGALITY
7514 ;AND PERFORMING ONE LEVEL OF INDIRECTION IF THE @ BIT IS SET.
7515 ;(WE CAN'T AFFORD AN INFINITE LOOP WHILE KILLING A JOB EVEN IF IT IS
7517 ;INDEX FIELD IS IGNORED. IF THE OPCODE IS 0, SETOM IS USED INSTEAD.
7518 ;SKIPS IF INSN IS LEGAL AND DOESN'T CAUSE MPV OR PUR INTERRUPT.
7519 ;CLOBBERS A,D,J,T,TT,Q
7520 IODCDO: MOVE J,B ;B IS NOT CLOBBERED.
7523 XCTRIJ XR,[HRR J,(J)] ;INDIRECTION IS WANTED; DO IT.
7524 IODCD1: TLNN J,-1 ;IF LH IS 0, REPLACE BY (SETOM)
7527 CAIE A,AOS_-27 ;AOS AND SOS ARE LEGAL WITH 0 IN AC FIELD.
7531 CAIE A,4 ;ALL INSNS WITH 4 IN TOP 3 BITS (LOGICAL INSNS) ARE OK.
7532 CAIN A,5 ;HALFWORD INSTRUCTIONS ALSO OK.
7535 CAIE A,MOVE_-36 ;ALL FORMS OF MOVE, MOVS, MOVN AND MOVM OK
7538 CAIE A,ADD_-36 ;ADD & SUB OK. (OF COURSE, ONLY TO-MEMORY INSNS MAKE SENSE)
7540 IODCD3: LDB A,[270400,,J] ;AC FIELD NEED NOT BE 0, SO GET CONTENTS OF SPEC'D AC,
7543 DPB A,[270400,,J] ;AND MAKE THE INSN USE AC D, WHERE THE VALUE IS.
7545 XCTRIJ XRW,J ;EXECUTE INSN, CHECKING FOR INTERRUPTS.
7549 ; FLUSH LAST VESTIGES OF USER
7550 ; ELIMINATES ALL POINTERS TO USER & FREES USER VARIABLES (CLOBBERS U TO "USER")
7551 ; R, IF NON-ZERO, IS ADDRESS OF CHANNEL NOT TO BE CLOSED UNTIL LAST MINUTE
7552 ; (IN CASE PCLSR OUT OF .UCLOSE)
7554 ZUSER: MOVEI A,(U) ;CLEAR BOTH TRANSLATION LISTS
7555 HRLI A,300000 ;FOR THIS JOB.
7558 MOVEI A,0 ;AND GET RID OF EXISTING FOREIGN-USER CHANNELS.
7559 ZUSER2: SKIPE UNAME(A)
7560 PUSHJ P,ZUSES ;SEE IF THIS USER HAS ANY POINTERS TO BE FLUSHED
7561 CAMN U,SERVER(A) ; If we were a server for this guy,
7562 SETOM SERVER(A) ; clear it out.
7565 JRST ZUSER2 ;LOOP FOR ALL SETS OF USER VARIABLES
7569 SKIPE NMPGS(U) ;USER SHOULD HAVE NO MEMORY BY NOW
7571 SETZM UNAME(U) ;ONLY PLACE THAT UNAME IS ZEROED
7572 SETOM USTP(U) ;SET USTP TO SPEED SEARCH
7573 MOVE A,U ;USER FLUSHED
7576 IORM T,SUPCOR ;CAUSE USER VARIABLE BLOCKS DECREASE PROGRAM TO RUN
7577 POPJ P, ;RETURN WITH CLOCK OFF
7580 ;CALLED BY ADISOWN, NATTACH, NDETACH, ETC.
7581 ZUSES: MOVEI D,%CLSU\%CLSFU\%CLSJI\%CLSJO ;CLSTB BITS FOR CHANNELS TO CLOSE
7586 SETZM B ;CLEAR STOPPED PROC FLAG
7587 PUSHJ P,CHSCAA ;EXECUTE FOLLOWING INST FOR EACH CHANNEL AND I/O PDL SLOT
7591 SKIPE B ;SKIP UNLESSS YOU STOPPED THE PROC
7592 PUSHJ P,UPCLSR ;RESTART USER
7595 ZACHEK: HLRZ T,(R) ;CHECK FOR CHANNEL TO ZAP
7601 POPJ P, ;IS IT EITHER TYPE OF USER CHANNEL? OR JOB CHNL?
7603 PUSHJ P,RPCLSR ;STOP USER
7606 TRNN T,%CLSFU ;IS IT A FOREIGN USR CHNL?
7607 JRST ZACHK2 ;NO, SUPERIOR OR JOB CHNL.
7608 JUMPG R,ZACHK1 ;IOPDL CHANNEL
7609 MOVEI T,LUBLK ;SEE IF A HAS BEEN CLOBBERED
7610 IDIVM A,T ;(AT LEAST MAKE SURE IT'S A VALID USER INDEX)
7615 HRRZ T,R ;NORMAL CHANNEL, INTERRUPT ON IT.
7620 ZACHK2: CAIE C,(R) ;UNLESS THE ONE NOT TO BE CLOSED UNTIL LAST MINUTE,
7621 SETZM (R) ;FOR ANY KIND OF CHANNEL, CLEAR IT OUT.
7624 ZACHK1: MOVEI T,IIOPOP ;FOREIGN USR IN IOPDL SLOT: INTERRUPT WHEN IOPOPPED.
7628 ZUSLOG: PUSH P,[ZUSER] ;DO LOGUSE THEN ZUSER
7630 ;LOG RUNTIME AND SWAPIN REQUESTS USED BY JOB IN U
7631 ;JOB CALLED FOR SHOULD NOT BE CURRENT OR ABLE TO RUN DURING CALL
7632 ;JOB SHOULD NOT BE TOP LEVEL EXCEPT WHEN DMNPLO CALLS
7633 ; HERE JUST BEFORE SENDING THE USAGE TO THE DEMON
7636 LOGUSE: MOVN TT,UTRNTM(U)
7638 EXCH TT,TRUNTM(U) ;AVOID CHARGING FOR THIS USAGE TWICE
7640 SUB TT,TRUNTM(U) ;COMPUTE TOTAL USAGE NOT YET CHARGED
7642 SKIPGE I,SUPPRO(U) ;FIND HIGHEST JOB IN TREE
7643 POPJ P, ;BUT IF TOP LEVEL RETURN WITH USAGE IN TT, T
7644 ;THIS IS TO FIND A BUG. -- CStacy, 4/30/82
7645 CAME I,U ;IS THIS JOB ITS OWN SUPERIOR?
7647 BUG PAUSE,[SOME JOB IS ITS OWN SUPERIOR, U AND I=],OCT,U
7648 LOGUS1: SKIPL SUPPRO(I)
7649 JRST [ MOVE I,SUPPRO(I) ? JRST .-1 ]
7650 ADDM TT,TRUNTM(I) ;ADD CHARGES TO TREE'S ACCOUNT
7654 ;DO LOGOUT FOR TREE HEADED BY JOB IN U
7655 ;CALLER SHOULD THEN PUSHJ P,DMNPLI TO LOG JOB BACK IN
7656 ;THIS IS USED TO KEEP ACCOUNTING STRAIGHT WHEN DETACH, CHUNAME, RELOAD (SIGH)
7657 ;IF JOB IS CURRENTLY RUNNING, TIME USED IN CURRENT QUANTUM
7658 ;WON'T GET CHARGED THIS TIME AROUND. TOO BAD.
7659 ;CLOBBERS T,TT,I,J,D. CALL WITH CLKOFF OR IN PROGRESS.
7664 LOGUP1: ADDI U,LUBLK
7667 CAMN J,UTMPTR(U) ;SKIP JOBS IN OTHER TREES (FOR SPEED)
7668 SKIPGE SUPPRO(U) ;AND SKIP TOP LEVEL JOBS
7670 SKIPE UNAME(U) ;DON'T GET CONFUSED BY EMPTY SLOTS
7671 PUSHJ P,LOGUSE ;PROBABLY AN INFERIOR IN TREE LOGGING OUT, UPDATE ACCT
7675 JRST DMNPLO ;TELL DEMON ABOUT TREE'S USAGE
7677 SUBTTL USER UUO WAIT (HANG UP) ROUTINE
7678 ; DOES NOT WORK FOR XCT T OR FOR X (T)
7679 ; THE INSTRUCTION BEFORE THE PUSHJ P,UFLS GETS EXECUTED WITH AN
7680 ; ARGUMENT PASSED IN T AND ITS USER INDEX IN U. I BELIEVE IT
7681 ; IS ONLY ALLOWED TO BASH T AND A.
7683 UFLS: CONSZ PI,77400
7684 BUG HALT,[UFLS WITH PI IN PROGRESS]
7685 CONO PI,CLKOFF ;DOES NOT ALLOW CLOCK INTS
7687 SKIPGE U,USER ;GET INDEX OF USER BEING BLOCKED
7688 JRST 4,. ;NULL JOB SHOULD NOT GET BLOCKED
7689 MOVEM T,EPDL2(U) ;SAVE C(T) FOR FLSINS AT PCLSR
7690 MOVEM T,AC16S(U) ;SAVE IN SWAP OUT AC ALSO
7691 POP P,UPC(U) ;WORK FOR INST INDEX OF P
7693 BLT T,AC15S(U) ;STORE REST OF ACS
7694 MOVE T,UPC(U) ;GET PC AT CALL (=CALL+1 ; =SKIP +2)
7695 SKIPA T,-2(T) ;GET POINTER TO SKIP
7696 UFL3: MOVE T,(T) ;GET CONTENTS OF E (WAS AN XCT)
7697 MOVE U,AC17S(U) ;WIN FOR INSNS INDEX OF U.
7698 HRRI T,@T ;CALCULATE E
7699 TLZ T,37 ;CLEAR OUT @ AND INDEX BITS
7701 MOVEM T,FLSINS(U) ;STORE AS BLOCKING CONDITION
7704 JRST UFL3 ;JUMP IF INSTRUCTION WAS XCT
7705 CONO PI,UTCON-1 ;TURN ON ALL PIS EXCEPT CLOCK
7706 MOVSI T,%SWPGW+%SWINT
7707 ANDCAM T,USWST(U) ;CLEAR WAITING FOR PAGE TYPE FLSINS
7708 SKIPGE RPCL(U) ;SKIP IF NOT BEING RPCLSRED
7709 JRST UFL1 ;LOSER IS BEING RPCLSRED
7710 UFL6: MOVE U,AC17S(U) ;FOR CLUSAV TO STORE
7712 CONO PI,CLKRQ ;CAUSE INTERRUPT TRANSFERING TO CLOCK ROUTINE PI IN
7714 IFE KA10P, JRST . ;ON KL AND KS SEEMS TO TAKE A WHILE TO GO OFF ("I
7715 ; CAN WAIT FOREVER, YOU KNOW")
7716 IFN KA10P, JRST 4,. ;ON KA SHOULD GO OFF RIGHT AWAY
7718 UFL1: MOVE P,CPDLP ;MUST NOT USE USR PDL SINCE THAT CAN
7719 ;GET CLOBBERED BY LSWDIS VIA UFL5
7720 ;CLOCK IS OFF, SO CPDLP IS OK
7722 MOVE T,UEXIT ;PICK UP EXIT INSTR
7723 CAME T,[JRST ONEPROC] ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7725 JRST UFL1A ;NOT ONE PROCEEDING
7726 MOVSI T,%PC1PR ;GET ONE PROCEED BIT
7727 IORM T,UUOH ;TURN IT ON IN PC
7730 MOVE T,UEXIT ;PICK UP EXIT INSTR
7731 CAME T,[JRST ONEPR4] ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7733 JRST UFL1A ;NOT ONE PROCEEDING
7734 MOVSI T,OIPBIT ;GET ONE PROCEED BIT
7735 IORM T,UUOH ;TURN IT ON IN PC
7737 SOS T,UUOH ;UUOH HAS REAL PC IF UFL5 SKIPS. WILL GET SET BY ONEPR1
7738 PUSHJ P,UFL5 ;BACK UP TO UUO
7739 JRST UFL6 ;FINALIZATION REQUIRED
7743 SUBTTL VARIOUS WAIT & LOCK-SWITCH ROUTINES
7745 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH UTCCHN OFF
7747 LWAIT1: CONO PI,UTCON ;TURN INTERRUPTS ON
7749 XCT @(P) ;ENTRY, EXECUTE INSTRUCTION
7750 PUSHJ P,UFLS ;HANG TILL INSTRUCTION SKIPS
7751 CONO PI,UTCOFF ;TURN INTERRUPTS OFF
7754 JRST POPJ1 ;WIN, RETURN SKIPPING OVER ARG
7756 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE -1 AND SEIZE IT
7760 HRLM T,(P) ;MAKE PC STORED ON PDL INDIRECT
7761 SKIPGE @(P) ;SKIP IF ALREADY LOCKED
7762 JRST SWTL1 ;NOT LOCKED SO TRY TO GRAB IT
7763 MOVEI T,@(P) ;ADDRESS OF SWITCH
7764 HLRZ T,1(T) ;USER THAT HAS SWITCH
7767 CAMN T,USER ;SKIP IF THIS USER DOESN'T HAVE IT
7768 BUG ;THIS USER ALREADY HAS THAT SWITCH
7769 SWTL1: SKIPL @(P) ;(DO NOT CHANGE TO AOSE)
7770 PUSHJ P,UFLS ;HANG TILL NEGATIVE
7789 ;IF LOCK ALREADY SEIZED, JUST SET UP POINTERS
7794 SWTAD: PCLT ;TRY TO LOCK SWITCH (@NEXT LOCN). IF SUCEED, SKIP EXTRA TIME.
7795 MOVE T,@(P) ;IF FAIL, DO N LSWPOPS (AS SPEC IN 4.6-4.1 OF NEXT WORD)
7796 SKIPGE (T) ;AND WAIT FOR SWITCH TO SEEM TO BE AVAILABLE.
7797 JRST SWTAD1 ;THEN RETURN (NOTE: NOT LOCKING IT).
7798 SWTAD2: TLNN T,77000
7810 SWTAD1: CONO PI,CLKOFF
7812 JRST [ CONO PI,CLKON
7814 AOS (P) ;SKIP OVER FAILURE RETURN
7818 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH CLKCHN OFF
7819 CWAIT1: CONO PI,CLKON ;TURN CLOCK ON
7821 XCT @(P) ;ENTRY, EXECUTE INSTRUCTION
7822 PUSHJ P,UFLS ;HANG TILL INSTRUCTION SKIPS
7823 CONO PI,CLKOFF ;TURN CLOCK OFF
7826 JRST POPJ1 ;WIN, RETURN SKIPPING OVER ARG
7829 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE NON-NEGATIVE AND SEIZE IT
7831 MOVEI T,(@) ;IF 4.9 OF NEXT LOCN =1, RETURN WITH UTCOFF
7847 ;SWITCH LIST LOCK, DOES NOT WORK FOR SWITCHES POINTED TO INDEX OF A, B, OR D
7848 ;FOLLOW BY LIST OF SWITCHES
7849 ;4.9-4.4=0 4.3-4.1 0 AOSE SWITCH 1 SIGN SWITCH
7855 BLT T,AC0S+17(U) ;FOR SLWAIT FIRST TIME
7856 SLUGH1: HRRZ T,-3(P) ;POINTER TO SWITCH LIST
7860 SLUGH2: MOVE A,(T) ;TRY TO LOCK LIST
7862 JRST SLUWIN ;REACHED END OF LIST
7863 LDB B,[220400,,A] ;INDEX
7872 AOBJP T,SLUGH2 ;LH COUNTS SWITCHES SUCCESSFULLY SEIZED
7873 ;SHOULD NVERE FALL THROUGH
7877 LDB B,[220400,,A] ;INDEX
7878 LDB D,[330300,,A] ;TYPE CODE
7886 AOJA T,SLWAIT ;THAT SWITCH OK, TRY OTHERS
7888 SLWATT: SKIPL (A) ;WAIT FOR NEG (AOSE SW)
7889 SKIPGE (A) ;WAIT FOR POS (SIGN SW)
7894 SUB P,[1,,1] ;"RETURN" BUT NOT INCREMENTED
7897 SLLOCK: PUSHJ P,SWTLX
7901 SLULO2: JUMPE A,SLUGH1 ;NONE SEIZED TRY AGAIN
7902 PUSHJ P,LSWPOP ;RELEASE THOSE SEIZED
7905 SWTLX: CONO PI,CLKOFF ;DON'T GO OFF HALF-LOCKED
7914 LSWTLX: CONO PI,UTCOFF
7927 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING SWITCH
7933 ;SET UP ROUTINE TO BE CALLED ON PCLSR'ING OUT
7943 ;SET UP ROUTINE TO AOS VARIABLE UPON UNLOCKING SWITCH
7948 ;SET UP ROUTINE TO SOS VARIABLE UPON UNLOCKING SWITCH
7953 ;SET UP ROUTINE TO SOS LH UPON UNLOCKING SWITCH
7954 ;HALT IF SWITCH'S LH EVER BECOMES NEGATIVE
7959 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING SWITCH
7960 ;THAT ROUTINE MAY ONLY CLOBBER A AND T!! IT GETS CALLED
7961 ;WITH USER IN U, AND THE JOB'S ACS IN AC0S(U)-AC17S(U)
7970 ;SET UP ROUTINE TO CLEAR SIGN BIT OF VARIABLE UPON UNLOCKING SWITCH
7975 ;SET UP ROUTINE TO DO NOTHING UPON UNLOCKING SWITCH
7982 ;ROUTINE TO ADD THIS PROCEDURE TO A LIST POINTED TO
7983 ;BY THE WORD AFTER THE CALL. UNLOCKING REMOVES IT FROM THE LIST
7984 LSTSET: PUSH P,TT ;LEAVES CLKON
7998 BUG ;NOT ENOUGH BLOCKS
7999 LSTST2: MOVE T,@-4(P) ;ADDRESS OF HEAD OF LIST
8001 PUSH P,(T) ;PUSH HEAD OF LIST
8002 POP P,(Q) ;POP INTO LSWB BLOCK
8012 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING OF SWITCH
8013 ;BY OTHER THAN PCLSRING OUT
8018 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING OF SWITCH
8019 ;BY OTHER THAN PCLSRING OUT
8033 ;SET USER LOCK SWITCH BLOCK, WD1 IN T, MODE IN TT
8038 REPEAT NULBLK,[IFN .RPCNT,ADDI Q,2
8042 BUG ;NOT ENOUGH BLOCKS
8054 LSWCJ1: AOS (P) ;EXIT TO DO LSWCLR AND SKIP-RETURN.
8056 ;UNLOCK ALL SWITCHES, CALLED BY OPENL, ADISOWN, IOADCR
8059 ;TEMPORARY CODE ADDED 1/22/80 TO SEE IF THERE ARE ANY MORE OF
8064 SKIPN T,LSWPR(U) ;MUST HAVE USER IN U
8072 TLO U,400000 ;SIGNAL NOT PCLSR
8089 LSWZAP: PUSH P,U ;FROM PCLSR
8103 TLZN U,200000 ;HAS PC BEEN CLOBBERED? ;THIS IS ONLY FOR FINSET R.I.P.
8106 SETZM LSUUO(U) ;INDICATE OCCURRENCE OF FINSET (WILL MEAN WE HAVEN'T MISSED MARK)
8107 JRST PCLSR4 ;REQUIRED TO START UP ROUTINE
8109 ;-1(P) HAS POINTER TO SWITCH BLOCK TO UNDO.
8110 ;A HAS SECOND WORD OF THAT BLOCK.
8111 ; 4.9=1 => PERFORM FUNCTION ON PCLSR
8112 ; 4.8=1 => PERFORM FUNCTION ON ANY LSWPOP OTHER THAN PCLSR
8113 ; 4.1-4.3 => FUNCTION
8114 ; 3.1-3.9 USER # LAST LOCKED BY
8115 ; 1.1-2.9 LSWPR THREAD
8117 LSWDIS: LDB T,[330300,,A] ;FUNCTION
8118 TLNE A,400000 ;SKIP IF NOT FOR PCLSR
8119 JUMPGE U,LSWDS1 ;PCLSRED AND 4.9=1
8120 TLNN A,200000 ;NOT FOR PCLSR OR FOR PCLSR BUT NOT PCLSRED
8121 POPJ P, ;NOT FOR EITHER LSWPOP
8122 JUMPGE U,CPOPJ ;FOR OTHER LSWPOP BUT PCLSRED
8123 LSWDS1: JRST LSWTAB(T)
8125 LSWTAB: JRST UNSWTL ;0 (AOSE) ALSO USED FOR QUSR
8126 JRST UNLSWT ;1 (SIGN)
8127 JRST ULROUT ;2 (GO TO ROUTINE)
8128 JRST ULAOS ;3 (AOS, SOS)
8129 JRST UNLST ;4 (UNLOCK FROM LIST)
8130 JRST ULSOS ;5 (SOS, AOS)
8131 JRST ULSTM ;6 (SETOM)
8132 JRST ULAOSL ;7 (AOS,SOS LEFT HALF)
8134 UNSWTL: MOVE T,-1(P)
8138 ULSTM: MOVE T,@-1(P)
8142 UNLSWT: MOVE T,@-1(P)
8147 ULAOSL: MOVE T,@-1(P)
8153 ULAOS: MOVE T,@-1(P)
8166 ULSOS: MOVE T,@-1(P)
8170 ULROUT: MOVE T,@-1(P)
8172 JRST ULROU1 ;A LOSSET - MAY CLOBBER A OR T; USR INDEX IN U
8173 HRRZM T,UPC(U) ;IT'S A FINSET, EXPECTS THE OLD METHOD OF CALL.
8177 MOVSI T,%PSPCU ;IT MIGHT TRY AN XCTR
8180 TLOE U,200000 ;SIGNAL PC CLOBBERED
8181 BUG ;PC TRIED TO BE CLOBBERED TWICE
8184 ULROU1: JUMPGE U,(T) ;IF LOSSET, AND LSWPOPPING,
8186 ADDI A,(U) ;PUT THE ACS IN THE AC0S, SINCE
8187 BLT A,AC0S+H(U) ;THAT'S WHERE THEY'LL BE IF CALL LOSSET ROUTINE WHILE PCLSRING.
8190 ;FIND SWITCH POINTED TO BY WORD AFTER
8191 ;PUSHJ P,LSWREM AND UNLOCK IT
8212 LSWDEL: PUSH P,U ;REMOVE SWITCH FROM HEAD OF LIST
8213 MOVE U,USER ;DO NOT ATTEMPT TO UNLOCK IT
8228 ;POP C(T)'TH FROB BACK
8229 LSWPON: PUSHJ P,LSWBAK
8233 ;DELETE C(T)'TH FROB BACK
8234 LSWDLN: PUSHJ P,LSWBAK
8240 TLO U,400000 ;SIGNAL NOT PCLSR IN CASE OF LSWPPP
8244 SOJE Q,LSWBA3 ;UNLOCKING FIRST FROB
8249 PUSH P,LSWPR(U) ;DON'T WORRY, YOU CAN'T GET PCLSR'ED JUST BELOW
8256 LSWBA3: MOVE T,LSWPR(U)
8260 SUBTTL VARIOUS RETURNS
8306 CKOCJ1: CONO PI,CLKON
8310 CLKONJ: CONO PI,CLKON
8314 CLKOPJ: CONO PI,CLKON
8318 OMXONJ: CONO PI,OMXON
8323 TTYONJ: CONO PI,TTYON
8326 IFN PTRP, PTRONJ:: PTPONJ::
8327 LPTONJ: CONO PI,LPTON
8334 UTCONJ: CONO PI,UTCON
8360 SUBTTL UUO PROCESSOR
8368 .STATUS=UUOMIN+6_27.
8369 .ACCESS=UUOMIN+7_27.
8378 ;REPEAT OVER USET NAMES FROM 0 TO 77.
8380 IRPS X,,[UPC VAL TTY FLS UNAME JNAME MASK USTP
8381 PIRQC INTB MEMT SV40 IPIRQ APIRQ SNAME PICLR
8382 MARA MARPC UUOH UIND RUNT MSK2 IFPIR APRC
8383 CNSL UTRP IIFPI AIFPI IMASK AMASK IMSK2 AMSK2
8384 JPC OPC RTMR HSNAME BCHN MPVA IDF1 ADF1
8385 IDF2 ADF2 DF1 DF2 OPTION 40ADDR TVCREG
8386 TTST TTS1 TTS2 WHO1 WHO2 WHO3 SUPPRO TR1INS
8387 TR2INS MBOX MBO1 EBOX EBO1 XUNAME XJNAME FTL1 FTL2]
8392 ;REPEAT OVER USET NAMES 600 AND UP.
8394 IRPS X,,[PAGRAN PAGAHD SERVER]
8398 ;NOTE: OPER'S BELOW ARE 8 PER LINE
8399 ; USE UP ILUUO'S BEFORE ADDING TO END
8400 ; THE FOLLOWING SHOULD GO AWAY EVENTUALLY
8408 IRPS X,,[ITYI LISTEN SLEEP SETMSK SETM2 DEMON CLOSE
8409 UCLOSE ATTY DTTY IOPUSH IOPOP DCLOSE DSTOP RDTIME
8410 RDSW GUN UDISMT GETSYS IPDP GETLOC SETLOC DISOWN
8411 DWORD DSTEP GENSYM LOGOUT REALT WSNAME UPISET RESET
8412 ARMOVE DCONTIN CBLK ASSIGN DESIGN RTIME RDATE HANG
8413 EOFC IOTLSR RSYSI SUPSET PDTIME ARMRS UBLAT IOPDL
8414 ITYIC MASTER VSTST NETAC NETS REVIVE DIETIM SHUTDN
8415 ARMOFF NDIS FEED EVAL REDEF IFSET UTNAM UINIT
8416 RYEAR RLPDTM RDATIM RCHST RBTC DMPCH SWAP MTAPE
8423 IRPS X,,[DISMIS LOSE TRANAD VALUE UTRAN CORE TRAND
8424 DSTART FDELE DSTRTL SUSET LTPEN VSCAN POTSET]
8427 ;THESE ARE THE SYMBOLS USED BY MIDAS AND DDT. THEY ALSO
8428 ;EXIST IN SYS:ITS DEFS.
8429 ;SYMBOLS SHOULD BE LEFT IN CURRENT ORDER OR DDT WILL LOSE
8430 SYSYMB: USTIRP [SQUOZE 44,.R!X
8440 USTIR1 [SQUOZE 44,.R!X
8442 USTIRP [SQUOZE 44,.S!X
8444 USTIR1 [SQUOZE 44,.S!X
8447 GLOSYM [IOT,OPEN,OPER]
8461 OPRIRP [IFSN X,ILUUO,[.!X=.OPER ZZ
8473 .!X=.CALL .IRPCNT+1,
8478 GLOSYM [USET,BREAK,STATUS,ACCESS]
8481 ;THESE SYMBOLS ARE USED BY DDT, SO THE USER CAN OPEN .PIRQC, ETC.
8482 ;BEGINNING FOR .GETSYS (USYMS)
8500 SYSUSE==.-1 ;END FOR .GETSYS (USYMS)
8502 ;SIXBIT NAME TABLES FOR WHO LINE GENERATION.
8503 ;ALSO USED BY PEEK FOR PRINTING OUT JOBS' STATUS.
8505 OPRSXB: SIXBIT/OPER/
8510 CALSXB: SIXBIT/CALL/
8517 IRPS X,,IOT OPEN OPER CALL USET BREAK STATUS ACCESS
8522 ;MACRO TO SAVE ACS AS APPROPRIATE FOR OUR CPU, LOAD UP U,
8523 ;CHECK VARIOUS ERROR CONDITIONS.
8527 BUG AWFUL,[UUO WITH PI IN PROGRESS]
8529 UMOVEM U,17 ;SAVE 17
8530 SKIPGE U,USER ;LOAD CURRENT USERS INDEX,
8531 BUG AWFUL,[UUO IN NULL JOB]
8532 UMOVEM T,16 ;SAVE LOC 16 FOR USER
8534 XCTR XBW,[BLT T,15] ;SAVE REST OF ACS IN USERS SHADOW 0-15
8539 BUG AWFUL,[UUO IN NULL JOB]
8540 LDB T,[330300,,MUUOCX(U)]
8542 BUG AWFUL,[UUO WHILE IN AC BLK ],DEC,T
8546 ; UUO AND ILLOP TRAP HANDLER
8548 ;EITHER DISPATCHES TO APPROPRIATE UUO ROUTINE,
8549 ; RETURNS CONTROL TO USERS UUO ROUTINE, GOES TO ILLOP, USRTRP, OR USRIOT.
8550 ;CODE ON THIS PAGE IS INTERRUPTABLE AT ANY POINT
8552 ;COME HERE TO RETURN A UUO TO THE USER. RESTORES USER ACS W THROUGH U ONLY.
8553 USRUUO: CAIG U,LUBLK
8554 BUG AWFUL,[RETURNABLE UUO FROM SYS OR CORE JOB,PC=],OCT,UUOH
8557 BUG AWFUL,[RETURNABLE UUO FROM EXEC MODE,PC=],OCT,UUOH
8559 MOVE P,USRPDL(U) ;IN CASE AN XCTR FAULTS.
8560 XCTR XR,[HLRZ H,1(W)]
8561 CAIE H,(JSR) ;ELSE OK ONLY IF OPCODE IN 41 IS 0 OR JSR.
8562 JUMPN H,ILUUO ;THIS IS IN CASE USER IS HANDLING USER-UUO'S WITH PUSHJ
8563 ;AND HIS UUOH ISN'T ABLE TO BE JSR'D TO.
8564 XCTR XR,[HRRZ H,1(W)]
8565 JUMPE H,ILUUO ;0 ISN'T ACCEPTABLE AS UUOH ADDRESS.
8567 UMOVEM T,(W) ;ALL IS LEGAL; PLANT UUO INTO USERS "40".
8568 MOVE T,UUOH ;SIMULATE A JSR AT USER'S "41"
8571 HRRM H,UUOH ;SET TO RETURN TO USER AT FIRST INSTRUCTION OF UUO HANDLER
8576 ULEAVE: USRCTX ;SELECT USER MODE AC BLOCK IF NEC.
8580 ;THE FOLLOWING BLOCK OF LOCATIONS IS SWITCHED WITH SOME USER VARS
8582 UEXIT: JRST 2,@XUUOH ;EXIT FROM UUO (FOR KL-10, POINTS TO APPROPRIATE
8585 CLUSAV: MOVEM U,AC17S ;CLOCK SAVE OF U
8588 CLCXSV: DATAI PAG,CLCX ;CLOCK LEVEL CONTEXT SAVE
8592 XUUOH: 0 ;UUO AND ILLOP TRAP GETS HERE - UUOH0 MUST BE . + 1.
8595 UEXND:: ;END OF SWAPPED UEXIT BLOCK.
8600 MUUOT1: SKIPGE UTRAPM(U) ;IF SUPERIOR WANTS TO CATCH UUOS, THIS IS FATAL INT.
8602 SKIPGE T,FORTY ;PICK UP THE UUO OR ILLOP
8606 JRST USRUUO ;NOT A SYSTEM CALL, GIVE TO USER
8609 ;HERE WITH UUO TO BE HANDLED BY SYSTEM IN T
8610 ILLOP1: JUMPN U,UUOH1
8611 MOVEI Q,0 ;SAVE SYS JOB EXEC MODE LSWPR PNTR
8614 UUOH1: SKIPE LSWPR(U)
8616 MOVEM T,LSUUO(U) ;SAVE UUO FOR DEBUGGING PURPOSES
8617 LSH T,-27. ;RIGHT JUSTIFY OP CODE
8618 SKIPL UUODSP-UUOMIN_-27.(T)
8623 UUOTR3: SETZM SYSCVL(U) ;DIDN'T GET INTO SYSTEM VIA .CALL
8624 MOVE P,USRPDL(U) ;SET UP USER PDL
8625 HRRZ C,FORTY ;PICK UP EFFECTIVE ADDRESS OF UUO
8626 LDB R,[270400,,FORTY] ;PICK UP AC FIELD OF UUO
8627 MOVEM R,UUAC(U) ;SAVE AC FLD
8628 PUSHJ P,@UUODSP-UUOMIN_-27.(T) ;DISPATCH ON UUO TYPE
8629 JRST URET ;NORMAL RETURN (NON SKIP)
8631 IFE KA10P, MOVE U,USER ;(SINCE UUOH IS IN THE USER VARIABLES)
8632 AOS UUOH ;UUO ROUTINE SKIPPED, AOS USER RETURN POINT
8634 MOVE A,PIRQC(U) ;CHECK FOR RETURNING TO USER WITH PCLSR'ING FATAL
8636 TDNE A,[BADBTS&#<%PIC.Z\%PIDIS>] ;A FEW BITS ARE FATAL BUT SET
8638 JRST [ HRRZ A,UEXIT ;INT SET, MAKE SURE UEXIT IS CLOBBERED
8639 IFN KA10P, CAIE A,ONEPRO ;TO A LOCATION WHICH WILL CHECK PIRQC.
8640 IFN KS10P, CAIE A,ONEPR4
8651 URET2: SKIPE LSWPR(U)
8654 MOVEI T,0 ;RESTORE SYS JOB EXEC LSWPR
8658 BUG ;RETURNING TO USER MODE WITH CLOCK OFF
8661 XCTR XBR,[BLT U,U] ;RESTORE USERS ACS FROM USERS SHADOW 0-17
8665 URETC: REPEAT NULBLK/2,[
8666 SKIPN CONC LSWB,\<2*.RPCNT>,+1(U)
8667 SKIPE CONC LSWB,\<2*.RPCNT+1>,+1(U)
8671 SKIPE CONC LSWB,\<NULBLK-1>,+1(U)
8676 URPCL1: SKIPN LSUUO(U)
8677 JRST URET2 ;DIDN'T REALLY MISS MARK (DUE TO FINSET)
8678 SETOM PCLNXT ;MISSED MARK, REINITIALIZE
8683 UUOTRO: MOVE T,FORTY
8686 USRIOT: MOVSI T,(UIOT) ;I/O INST TURNS INTO PSEUDO UUO TO DISPATCH ON
8691 ;HANDLE UUOS EXECUTED FOR TRAPS (PDL OV, ARITH OV, ONE PROCEED).
8692 ;MOST ARE AS USUAL, BUT OPCODE 0 IORM'S ADDRESS INTO PIRQC.
8693 ;NOTE: LOSER IS NOT PERMITTED TO USE OPCODE 0 - SEE USTR1I, ETC.
8698 JRST MUUOT1 ;IF OPCODE ISN'T 0, TREAT UUO NORMALLY (STARTING A
8700 MOVSI A,%PSTR1+%PSTR2
8701 ANDCAB A,UUOH ;TURN OFF TRAP FLAGS, GET PC
8704 TLNE A,%PCFOV ;DISTINGUISH FIXED AND FLOATING OVERFLOW.
8706 MUUOT2: MOVE A,MSKST(U)
8708 AND T,A ;INTS SETTING WHICH AREN'T DISABLED
8713 IOR A,[BADBTS] ;MASK FOR INTS WHICH AREN'T DEFERRED
8715 JRST ONEPR1 ;TAKE INT
8716 JRST URET ;IGNORE INT
8718 MUUOEX: BUG AWFUL,[MUUO IN EXEC MODE, PC=],OCT,EPT+425
8719 ;UUO IN EXEC MODE NOT IN SYS JOB
8722 BUG AWFUL,[LUUO IN EXEC MODE,PC=],OCT,LUUOEX
8725 BUG AWFUL,[TRAP IN EXEC MODE,PC=],OCT,ILLTRP
8730 60H: 0 ;TRAPS FROM 60
8732 60H0: UUOSAV ;IF WE LOSE PROCESSOR HERE, 60 GETS COPIED INTO 40,
8733 ; 60H IS COPIED INTO UUOH, AND UPC GETS MOVED INTO
8735 60HE: CONO PI,CLKOFF
8744 ;COME HERE FROM UEXIT WHEN USER IS BEING PCLSR'ED
8745 ; KA10 - ALL USER ACS ARE IN MACHINE ACS AND IN UUOACS
8746 ; KL10 & KS10 - ALL USERS ACS ARE IN AC BLOCK 1
8748 ONEFLS: CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
8750 MOVE U,USER ;GET INDEX OF CURRENT USER
8751 ONEPR2: SKIPE T,RPCL(U) ;SKIP IF NO RPCLSRING OCCURING
8752 JRST ONEFL2 ;RPCLSRING GOING ON
8753 ONEPR1: MOVE U,USER ;GET INDEX OF CURRENT USER
8754 CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
8757 MOVEI T,AC0S(U) ;PUT USER ACS INTO SWAP OUT ACS
8758 XCTR XBR,[BLT T,AC17S(U)]
8760 MOVEM T,UPC(U) ;SIMULATE JRST 2,@UUOH
8761 IFN KA10P, MOVE T,[JRST 2,@UUOH]
8766 MOVEM T,UEXIT ;RESTORE UEXIT
8768 MOVE U,USER ;AS IF HAD RETURNED TO USER THEN CLKBRK
8769 ;EXCEPT THAT AC'S ARE ALREADY STORED IN AC0S
8770 JRST UFL6 ;RESCHEDULE, ETC
8772 ONEFL2: JUMPG T,[JRST 4,.] ;LOSEY LOSEY (SHOULD NOT TRY TO EXIT WHILE TRYING TO RPCLSR SOMEONE)
8773 MOVE A,FLSINS(T) ;GET FLSINS OF USER SUPPOSEDLY RPCLSRING YOU
8774 SUBI A,RPCL(T) ;HIS FLSINS SHOULD BE A SKIPE OF HIS RPCL
8775 CAME A,[SKIPE] ;SKIP IF HE HAS THE RIGHT FLSINS
8776 JRST 4,. ;LOSEY LOSEY
8777 CLEARM FLSINS(T) ;ASSURE NO INTERRUPT
8778 SETZM RPCL(U) ;ACS IN UUO ACS CLOCK OFF
8779 AOS USTP(U) ;STOP SELF
8780 SETZM RPCL(T) ;UNHANG LOSER RPCLSR'ING YOU
8783 ;ROUTINES TO GIVE THE RUNNING JOB AN INTERRUPT AND ABORT THE CURRENT INSTRUCTION
8785 TTYLOS: SKIPA T,[%PITTY] ;JOB WHOSE %TBINT IS SET TRIED TO USE ITS TTY WHEN DIDN'T OWN IT
8786 IOADC: MOVEI T,%PIMPV ;I/O UUO MEMORY PROTECT VIOLATION
8789 ABREAK: MOVEI T,%PIBRK ;.BREAK - INTERRUPT TO SUPERIOR
8790 ILLOP4: IORM T,PIRQC(U)
8794 IOCERF: ;ADDRESS OF FIRST IO CHANNEL ERROR
8797 REPEAT ZZ,CONC IOCER,\.RPCNT+MIOTER,: JSP T,IOCERX
8798 IFG NIOTER-9,[REPEAT NIOTER-9,CONC IOCR,\.RPCNT+MIOTER+9,: JSP T,IOCERX
8800 IFN 0, IOCER1: IOCER2: IOCER3: IOCER4: IOCER5: IOCER6: IOCER7: ;FOR @
8801 .ALSO IOCER8: IOCER9: IOCR10: IOCR11: IOCR12: IOCR13: IOCR14:
8804 IOCERX: CONSZ PI,77400
8805 JRST 4,. ;ERR WITH PI IN PROGRESS
8809 DPB TT,[BCHPTR] ;STORE LAST CHNL IN ERROR
8811 DPB T,[330600,,IOCHST(TT)]
8812 IOCERR: MOVEI T,%PIIOC
8816 ILUUO: SKIPA T,[%PIILO] ;ILLEGAL SYSTEM UUO
8817 TRPDEV: ;ATTEMPTED USE OF TRAP DEVICE
8818 USRTRP: MOVSI T,(%PITRP) ;SYSTEM UUO IN TRAP MODE
8821 IORM T,PIRQC(U) ;GIVE USER INT BIT
8823 MOVE T,OPTION(U);PC CLOBBERED TO HERE IF MPV IN EXEC MODE - INTR OUT OF UUO
8824 TLNN T,%OPOPC ;UNLESS USER HAS SAID NOT TO,
8825 AOS UUOH ;UNDO SOS THAT PCLSR'ING WILL DO; PC SHOULD END UP -> AFTER UUO.
8826 UUOER2: CONO PI,CLKON ;THERE HAD BETTER BE A CLASS 1 OR 2 INT. PENDING.
8828 SETZM SCHMNY ;CAUSE FULL SCHEDULE SO INTERRUPT WILL BE SEEN
8829 JFCL ; (IT'S A CROCK TO HAVE TO DO THIS, BUT HARD TO FIX)
8830 PUSHJ P,UFLS ;LET THE INTERRUPT PCLSR US.
8833 UUOER1: MOVE U,USER ;UUOERR ASSUMING %OPOPC
8838 ILEXPF: CONO PI,CLKOFF ;GET HERE AFTER EXEC PAGE FAULT TAKEN ON XCTRI
8840 MOVSI A,1770 ;CLEAR FAULT REASON BITS
8845 IFE KA10P, ILEXPF==ILUUO ;NO CLEANUP NECESSARY
8849 ;AT DISPATCH TIME, P HAS UPDL, C HAS RH OF 40
8850 ;R HAS AC FIELD OF UUO, U HAS USER INDEX
8852 UUODSP: SETZ AIOT ;SETZ FLAGS UUO'S TO REFLECT TO USER WHEN %OPDEC OPTIONS
8853 SETZ AOPEN ;IN EFFECT. THEY ARE THE UUOS WHICH OVERLAP DEC
8861 IF2,IFN <UIOT-UUOMIN>_-27.+UUODSP-.+1,.ERR LOSE AT UUODSP
8864 NIOT: CAIL W,3 ;SET IOTBTS TO USER'S 3RD ARG, OR TO 0.
8867 HRRZ C,B ;ADDRESS OF 2ND ARG
8869 SKIPA C,[SETZ] ;USING OUTPUT ARG INSTEAD OF INPUT, FOR UNIT INPUT MODE
8871 AOSA (P) ;GOING TO SUCCEED NOW
8872 JRST OPNL30 ;NOT ENOUGH ARGS
8876 AIOT: SETZM CTLBTS(U)
8878 ADDI R,IOCHNM(U) ;GET IOCHNM WD ADDR IN R.
8883 HLRZ A,(R) ;PICK UP LEFT HALF (DEVICE DEPENDENT)
8884 HRRZ B,(R) ;PICK UP RIGHT HALF (INDEX INTO IOTTB, ETC.)
8885 MOVE D,IOTTB(B) ;GO TO ROUTINE FOR PARTICULAR DEV AND MODE
8886 TLNE D,%IOTOT+%IOTBK+%IOTSP ;BUT FOR "NORMAL" UNIT MODE INPUT, SPECIAL:
8888 XCTR XRW,[MOVES (C)] ;MAKE SURE XCTR XW, BELOW WON'T PCLSR.
8890 PUSHJ P,(D) ;CALL IOT ROUTINE, EXPECTING VALUE IN W.
8891 AIOT3: JRST AIOT2 ;NOTE AIOT3 MAY BE CHECKED FOR ON PDL.
8896 SKIPA A,W ;RETURNING IN NEW SYSTEM-CALL STYLE
8902 AACCES: HRRZ A,UUAC(U)
8905 MOVEM T,LSCALL(U) ;IN CASE PASSED TO JOB DEVICE
8908 JRST IOCER8 ;FOR .ACCESS, SIGNAL FAILURE WITH IOC ERROR.
8909 POPJ P, ;ONLY POSSIBLE FAILURE IS CHANNEL NOT OPEN.
8911 NACCES: MOVEI T,AIOCAL ;GET <CLSTB BITS>,,<IOCHNM WD ADDR> IN R
8915 NACCE1: TLNN R,%CLSQ\%CLSU\%CLSFU
8917 HRRM B,IOCHST-IOCHNM(R) ;STORE USR .ACCESS POINTER
8919 JRST POPJ1 ;NOT DISK
8921 MOVEM B,QRADAD(I) ;STORE ACCESS POINTER FOR DSK
8923 IORM D,QSRAC(I) ;SET ADR HAS BEEN HACKED FLAG
8926 ;SIOT SYMBOLIC SYSTEM CALL - IOT A STRING.
8927 ; 1ST ARG CHANNEL NUMBER.
8928 ; 2ND ARG BYTE POINTER
8929 ; 3RD ARG STRING LENGTH
8930 ; 4TH (OPTIONAL) ARG DEVICE-INDEPENDENT CONTROL BITS
8931 ; CTLBTS DEVICE DEPENDENT CONTROL BITS
8933 NSIOT: TLNN B,1000 ;OBJECT IF B.P. OR COUNT IS IMMEDIATE.
8940 TLNE D,%IOTBK+%IOTSP ;SIOT ALLOWED ONLY ON UNIT MODE CHANNELS.
8941 JRST OPNL12 ;"MODE NOT AVAILABLE".
8942 XCTR XRW,[MOVES A,(B)] ;ENSURE BYTE POINTER WRITABLE
8943 TLNE A,(@) ;CAN'T HACK BYTE POINTER WITH INDIRECT ADDRESSING
8944 JRST OPNL33 ;MEANINGLESS ARGS
8946 PUSHJ P,NSIOT9 ;HACK INDEXING
8947 XCTR XRW,[MOVES A,(C)] ;ENSURE BYTE COUNT WRITABLE
8948 JUMPLE A,POPAJ1 ;0 BYTES TO BE XFERED => SUCCEED IMMEDIATELY.
8950 MOVE TT,B ;IN CASE SPECIAL ROUTINE WANTS TO CALL SIOKT
8951 TLNE D,%IOTBP ;IF THERE'S A SPECIAL DEVICE ROUTINE FOR SIOT,
8952 JRST -1(D) ;GO TO IT.
8953 ;THIS CALL IS LEGAL AND ORDINARY. LOOP, CALLING THE UNIT MODE ROUTINE.
8957 PUSH P,D ;PUT ALL IMPORTANT INFO ON STACK FOR MAIN LOOP
8958 HRRZS (P) ;TO LOOK AT.
8961 JRST NSIOIL ;INPUT AND OUTPUT PART HERE
8962 NSIOOL: UMOVE A,@-3(P)
8963 IBP A ;THIS HAIR IS TO AVOID INCREMENTING THE USER'S COPY
8964 UMOVE D,(A) ;OF THE BYTE POINTER BEFORE THE BYTE HAS BEEN
8965 HRRI A,D ;FINALLY TAKEN WITH NO POSSIBILITY OF PCLSR'ING OUT.
8966 LDB D,A ;CAN'T USE XCTR XR,[LDB D,A] BECAUSE ON THE KA10
8967 MOVE C,[SETZ D] ;THAT WOULD USE THE LOSER'S AC A.
8969 MOVE A,-4(P) ;SET UP ARGS FOR IOT ROUTINE; C HAS ADDR OF VALUE.
8970 PUSHJ P,@-1(P) ;CALL THE IOT ROUTINE.
8971 XCTR XRW,[IBP @-3(P)] ;NOW STEP THE B.P. AND COUNT.
8972 XCTR XRW,[SOS A,@-2(P)]
8976 NSIOIL: UMOVE A,@-3(P)
8977 IBP A ;MAKE SURE NO FAULT IDPB'ING THE BYTE
8978 XCTR XRW,[MOVES (A)]
8979 MOVE R,(P) ;NOW GET THE ARGS FOR THE IOT ROUTINE,
8981 PUSHJ P,@-1(P) ;AND CALL IT, WITH VALUE COMING IN W.
8982 JRST NSIOI3 ;NO SKIP => WE WIN.
8983 JRST NSIOTX ;1 SKIP => THERE'S NO INPUT; RETURN WITHOUT STEPPING B.P.
8984 ;2 SKIPS => THIS BYTE IS THE LAST ONE AVAILABLE.
8985 XCTR XBYTE,[IDPB W,@-3(P)]
8986 XCTR XRW,[SOS @-2(P)]
8989 NSIOI3: XCTR XBYTE,[IDPB W,@-3(P)]
8990 XCTR XRW,[SOS A,@-2(P)]
8992 NSIOTX: SUB P,[5,,5]
8995 NSIOT9: EXCH A,R ;INDEXED BYTE POINTER, EVAL INDEX ONCE AND WRITE BACK
9001 ; ROUTINES TO SIMULATE SOME I/O INSTRUCTIONS WHEN EXECUTED BY USER
9003 IFE KS10P,[ ; KS10 will never have any devices so we might as well punt
9004 ; this sham right from the start.
9006 AUIOT: MOVE I,FORTY ;GET I/O INST
9007 ANDI R,7 ;GET IOT TYPE FIELD
9008 LDB J,[320700,,FORTY]
9009 LDB D,[420200,,IOTTYP(R)]
9010 JRST @IOTTYP(R) ;DISPATCH ON TYPE
9012 IOTTYP: 000000,,IOTTY3 ;BLKI
9013 000000,,IOTTY2 ;DATAI
9014 200000,,IOTTY3 ;BLKO
9015 200000,,IOTTY2 ;DATAO
9016 600000,,IOTTY2 ;CONO
9017 400000,,IOTTY2 ;CONI
9018 400000,,IOTTY1 ;CONSZ
9019 400000,,IOTTY1 ;CONSO
9021 IOTTY1: CAIN J,177 ;IF EQ INST WAS 7777XX,,XXXXXX
9022 JRST ILUUO ;USER HAS EXECUTED A SMALL NEGATIVE NUMBER
9029 JRST IOTTY2 ;SPECIAL BLKI THAT IS TREATED LIKE DATAI
9031 TLO I,40 ;BLOCK TYPE, TURN ON BIT TO CONVERT TO UNIT
9032 UMOVE C,(I) ;GET BLOCK POINTER
9033 ADD C,[1,,1] ;ADVANCE
9034 TLNE C,-1 ;SKIP IF OVERFLOW
9035 AOS (P) ;CAUSE RETURN TO SKIP
9036 UMOVEM C,(I) ;STORE BACK
9037 HRR I,C ;MODIFY INST ADR TO RH OF BLOCK POINTER
9038 IOTTY2: SKIPL C,DCHNTB(J)
9043 IOTTYB: XCTR XRW,I ;DO IOT
9044 POPJ P, ;NORMAL RETURN
9045 JRST POPJ1 ;IOT SKIPPED RETURN
9047 IOTTYA: SKIPGE DCHNTC(J)
9048 JRST ILUUO ;SUSPICIOUS DEVICE
9053 IFN KS10P, AUIOT==:ILUUO ; For now.
9055 IFN 0,[ ; Simple IO instruction simulating for the KS should look
9056 ; like this. Unfortunately XCTR XRW,[APRID 100] clobbers
9057 ; exec location 100. Further investigation is needed
9058 ; before figuring out how to deal with this.
9060 AUIOT: LDB R,[271500,,FORTY] ; Get opcode and AC.
9061 CAIE R,APRID_-27 ; For now this is the only instruction we
9062 ; simulate on the KS
9064 XCTR XRW,FORTY ; Do it
9065 POPJ P, ; Return normally
9066 JRST POPJ1 ; It skipped (well APRID can't, but perhaps
9067 ; someday something else will)
9070 SUBTTL .SUSET, .USET, .CALL USRVAR
9072 ;COMMON CODE FOR USRVAR, TTYVAR, ETC. SYMBOLIC SYSTEM CALLS
9073 ;PUSHJ P,VARCAL WITH FIRST ARG DECODED INTO H,I,J,R; B,C,W,U SET UP AS IN .CALL
9074 ;NOTE B IS A POINTER TO THE SECOND ARG (IN BLOCK MODE IS WRITTEN BACK)
9075 ;POPJS (OR PUSHJS IN THE CASE OF BLOCK MODE) BACK WITH E CONTAINING
9076 ;VARIABLE SPEC, D INPUT DATA, W INSTRUCTION TO HACK IT (0 TO READ INTO A,
9077 ;OTHERWISE OP D, WITH RH CLEAR WHERE OP IS MOVEM, ANDCAM, ADDM, ETC.)
9079 VARCAL: HRRZ E,B ;USE 2ND ARG AND NUM OF ARGS TO DETERMINE TYPE OF OPERATION
9081 JRST VARCA1 ;IMMEDIATE 2ND ARG
9082 UMOVE E,(B) ;GET VALUE OF 2ND ARG
9085 JRST VARCBL ;BLOCK MODE (2ND ARG LOOKS LIKE AOBJN POINTER)
9086 VARCA1: EXCH D,C ;D GETS 3RD ARG, INPUT DATA
9088 JRST VARCA2 ;JUMP IF IMMEDIATE INSTRUCTION MODE
9089 CAIGE W,3 ;SKIP IF WRITING
9090 TDZA W,W ;W 0 FOR READING
9091 MOVSI W,(MOVEM D,) ;SIMPLE CASE OF WRITING (SEE VARCBL FOR HAIR)
9092 POPJ P, ;CALLER WILL DO OPERATION AND POPJ1 OR OPEN-LOSS
9094 VARCA2: ADD P,[2,,2] ;IMMEDIATE INSTRUCTION MODE. MAKE STACK SAME AS AT VARCAL.
9095 TLNN C,-1 ;E HAS VARIABLE SPEC
9096 MOVSS C ;C GETS INSTRUCTION
9097 PUSHJ P,VARCA3 ;PERFORM THE INSTRUCTION
9098 JRST POP3J1 ;TAKE GOOD RETURN FROM THE CALL
9100 VARCBL: PUSH P,J ;BLOCK MODE. SAVE J WHICH SOME SUSETS CLOBBER
9101 PUSH P,B ;SAVE POINTER TO AOBJN POINTER TO SPEC,INSN PAIR LIST
9102 XCTR XRW,[MOVES B,@(P)] ;GET AOBJN POINTER, TEST WRITEABILITY
9103 VARCB1: UMOVE E,(B) ;GET VARIABLE SPEC
9104 UMOVE C,1(B) ;GET "INSTRUCTION"
9105 MOVE J,-1(P) ;GET DECODED FIRST ARG OR WHATEVER (SOME USRVAR ROUTINES CLOBBER J)
9106 PUSHJ P,VARCA3 ;PERFORM THE INSTRUCTION
9108 XCTR XRW,[ADDB B,@(P)] ;ADVANCE AOBJN POINTER
9109 JUMPL B,VARCB1 ;MORE STUFF TO DO
9110 JRST POP3J1 ;POINTER COUNTED OUT, POP B, J, PUSHJ TO VARCAL
9112 VARCA3: EXCH C,R ;HERE TO PERFORM INSTRUCTION IN C
9114 PUSHJ P,ASCIND ;EVALUATE INSTRUCTION'S EFFECTIVE ADDRESS
9116 LDB B,[410300,,C] ;GET MAJOR PDP10 OPCODE CLASS
9118 VARCBE ;0 UUO ILLEGAL
9119 VARCBE ;1 FP/BYTE ILLEGAL
9120 VARCB2 ;2 MOVE/ADD/SUB
9121 VARCBE ;3 CAM ETC. RESERVED FOR .HANGING IN THE FUTURE
9123 VARCBE ;5 HWT ILLEGAL
9125 VARCBE ;7 IOT ILLEGAL
9127 VARCBE: SUB P,[4,,4] ;POP PUSHJ TO VARCA3, B, J, PUSHJ TO VARCAL
9128 JRST OPNL33 ;BAD ARG
9130 VARCB6: TLNE C,006000 ;TEST INSTRUCTION - SKIP IF NO SKIP
9131 JRST VARCBE ;SKIPPING TESTS RESERVED FOR FUTURE .HANGS
9132 TLNE C,010000 ;SKIP IF IMMEDIATE
9133 XCTR XR,[SKIPA D,(C)]
9135 TLNE C,001000 ;SKIP IF TDX OR TRX
9137 LDB C,[370200,,C] ;GET MODIFICATION TYPE
9138 XCT (C)[JRST VARCBE ;NO MODIFICATION OBVIOUSLY AN ERROR
9139 MOVSI W,(ANDCAM D,) ;TXZ
9140 MOVSI W,(XORM D,) ;TXC
9141 MOVSI W,(IORM D,)] ;TXO
9144 VARCB4: TLNE C,002000 ;BOOLEAN INSTRUCTION - OK IF RESULT TO AC
9146 TLNN C,001000 ;SKIP IF IMMEDIATE
9147 XCTR XR,[SKIPA D,(C)]
9149 HLLZ W,C ;SET UP OPCODE TO HAVE A+M EXCHANGED
9150 TLZ W,003777 ;AND RESULT TO BE SENT TO MEMORY
9154 TLO W,(<002000,,> D,)
9157 VARCB2: SETZB W,D ;MOVE/ADD/SUB GROUP
9160 JRST VARCBB ;SIMPLY READING
9162 JRST VARCBE ;RESULT MUST BE TO AC
9163 TLZ C,(0 17,) ;CHANGE AC FIELD TO D
9165 TLNE C,060000 ;SKIP IF MOVE GROUP
9167 XCTR XR,C ;FETCH OPERAND, DO MODIFICATION IF CALLED FOR (MOVN)
9168 MOVSI W,(MOVEM D,) ;OPERATION WILL BE SIMPLE STORE
9171 VARCB5: TLC C,070000
9173 JRST VARCBE ;NOT ADD/SUB
9174 XCTR XR,C ;ADD TO/SUBTRACT FROM ZERO IN D
9175 MOVSI W,(ADDM D,) ;DROP INTO VARCBA
9177 ;HERE WITH E, W, D ALL SET UP FOR WRITING.
9178 VARCBA: PUSHJ P,@-3(P) ;CALL BACK TO CALLER OF VARCAL
9179 JRST POP4J ;LOST, POP PUSHJ TO VARCA3, B, J, VARCAL, TAKE ERR RETURN
9180 POPJ P, ;WON, RETURN FROM VARCA3
9182 ;HERE WITH E AND W SET UP FOR READING.
9183 VARCBB: PUSH P,C ;SAVE ADDRESS TO BE READ INTO
9184 XCTR XRW,[MOVES (C)] ;NO FAULT. INSURANCE OF WRITEABILITY.
9185 PUSHJ P,@-4(P) ;GET VALUE OF VARIABLE INTO A
9186 JRST POP5J ;LOST POP C, VARCA3, B, J, VARCAL, TAKE ERR RETURN TO USER
9187 POP P,C ;WON, STORE RESULT INTO USER
9189 POPJ P, ;AND RETURN FROM VARCA3
9191 USETBT: 420200,,USETL(E) ;BYTE POINTER TO UENTRY FIELD A
9192 400200,,USETL(E) ; " B
9193 200200,,USETL(E) ; " C
9194 160200,,USETL(E) ; " D
9196 USETRL: 221600,,USETL(E) ;BYTE POINTER TO UENTRY FIELD E
9197 001600,,USETL(E) ; " F
9199 ;IN EACH UENTRY ENTRY: A IS THE METHOD FOR USET READ
9200 ; B IS THE METHOD FOR SUSET READ
9201 ; C IS THE METHOD FOR USET SET
9202 ; D IS THE METHOD FOR SUSET SET
9203 ; E & F ARE USED BY THE METHODS AS LISTED BELOW
9204 ;METHOD 0 = ILLEGAL MODE
9205 ;METHOD 1 = USE F AS RELATIVE LOC OF VAR
9206 ;METHOD 2 = USE E AS ROUTINE TO TRANSFER TO
9207 ;METHOD 3 = USE F AS ROUTINE TO TRANSFER TO
9209 DEFINE UENTRY A,B,C,D,E,F
9211 A_20+B_16+E,,C_20+D_16+F
9213 IFN 777774&<A\B\C\D>,[PRINTX /UENTRY A,B,C,D TOO BIG
9214 /] IFN 740000&<E\F>,[PRINTX /UENTRY E,F TOO BIG
9215 /] IFSE [E!F],[PRINTX /UENTRY E,F NULL
9220 USETL: UENTRY 1,1,2,0,UPCSET,UPC-USRSTG ;.UPC
9221 UENTRY 1,1,1,1,,VALUE-USRSTG ;.VAL
9222 UENTRY 3,3,2,2,USTTY,URTTY ;.TTY
9223 UENTRY 1,1,0,0,,FLSINS-USRSTG ;.FLS
9224 UENTRY 1,1,0,2,UUNAME,UNAME-USRSTG ;.UNAME
9225 UENTRY 1,1,2,2,UJNAME,JNAME-USRSTG ;.JNAME
9226 UENTRY 1,1,2,2,USMASK,MSKST-USRSTG ;.MASK
9227 UENTRY 1,1,2,0,USTOP,USTP-USRSTG ;.USTP
9229 UENTRY 1,1,2,2,USPIRQ,PIRQC-USRSTG ;.PIRQC
9230 UENTRY 2,2,0,0,UGSUPR, ;.INTB
9231 UENTRY 1,1,2,2,USMEMT,HUSRAD-USRSTG ;.MEMT
9232 UENTRY 1,1,0,0,,SV40-USRSTG ;.SV40
9233 REPEAT 2,UENTRY 1,1,2,2,IAPIRQ,PIRQC-USRSTG ;.IPIRQ/.APIRQ
9234 UENTRY 1,1,2,2,USYNST,USYSNM-USRSTG ;.SNAME
9235 UENTRY 1,1,2,2,UPISET,PICLR-USRSTG ;.PICLR
9237 UENTRY 2,2,3,3,URMAR,USMAR ;.MARA
9238 UENTRY 1,1,1,1,,UMARPC-USRSTG ;.MARPC
9239 UENTRY 1,1,0,0,,SUUOH-USRSTG ;.UUOH
9240 UENTRY 2,2,0,0,UINDEX, ;.UIND
9241 UENTRY 1,2,0,0,UTRNTR,UTRNTM-USRSTG ;.RUNT
9242 UENTRY 1,1,2,2,USMSK2,MSKST2-USRSTG ;.MSK2
9243 UENTRY 1,1,2,2,USIFPI,IFPIR-USRSTG ;.IFPIR
9244 UENTRY 1,1,0,0,,APRC-USRSTG ;.APRC
9246 UENTRY 3,3,0,0,,URCNSL ;.CNSL
9247 UENTRY 2,0,3,0,RUTRAP,SUTRAP ;.UTRP
9248 REPEAT 2,UENTRY 1,1,2,2,IAIFPI,IFPIR-USRSTG ;.IIFPI/.AIFPI
9249 REPEAT 2,UENTRY 1,1,2,2,IAMASK,MSKST-USRSTG ;.IMASK/.AMASK
9250 REPEAT 2,UENTRY 1,1,2,2,IAMSK2,MSKST2-USRSTG ;.IMSK2/.AMSK2
9252 UENTRY 3,3,2,2,UJPCS,UJPCR, ;.JPC
9253 UENTRY 2,2,0,0,UROPC, ;.OPC
9254 UENTRY 1,1,1,1,,RTIMER-USRSTG ;.RTMR
9255 UENTRY 1,1,1,1,,HSNAME-USRSTG ;.HSNAME
9256 ;IFN KL10P,UENTRY 1,1,1,1,,ULSPBR-USRSTG ;.LSPBR
9257 ;.ELSE UENTRY 1,1,1,1,,SRN3-USRSTG
9258 UENTRY 2,2,3,3,RUBCHN,SUBCHN, ;.BCHN
9259 UENTRY 2,2,0,0,MPVARD ;.MPVA
9260 REPEAT 2,UENTRY 1,1,2,2,IADF1,IDF1-USRSTG ;.IDF1, .ADF1
9262 REPEAT 2,UENTRY 1,1,2,2,IADF2,IDF2-USRSTG ;.IDF2, .ADF2
9263 UENTRY 1,1,2,2,USDF1,IDF1-USRSTG ;.DF1
9264 UENTRY 1,1,2,2,USDF2,IDF2-USRSTG ;.DF2
9265 UENTRY 1,1,1,1,,OPTION-USRSTG ;.OPTION
9266 UENTRY 1,1,1,1,,40ADDR-USRSTG ;.40ADDR
9267 IFE N11TYS, UENTRY 1,1,1,1,,SRN3-USRSTG ;.TVCREG - JOB'S CONSOLE REGISTER CONTENTS
9268 IFN N11TYS, UENTRY 1,1,1,2,STVCRG,TVCREG-USRSTG
9269 UENTRY 1,1,1,1,,TTSTSV+2-USRSTG ;.TTST
9271 UENTRY 1,1,1,1,,TTSTSV-USRSTG ;.TTS1
9272 UENTRY 1,1,1,1,,TTSTSV+1-USRSTG ;.TTS2
9273 UENTRY 1,1,1,1,,UWHO1-USRSTG ;.WHO1
9274 UENTRY 1,1,1,1,,UWHO2-USRSTG ;.WHO2
9275 UENTRY 1,1,1,1,,UWHO3-USRSTG ;.WHO3
9276 UENTRY 3,3,0,0,,RUSUPP ;.SUPPRO
9277 IFN KA10P, UENTRY 2,2,0,0,URTR1I ;.TR1INS
9278 IFE KA10P, UENTRY 1,1,1,1,,TR1INS-USRSTG
9279 IFN KA10P, UENTRY 2,2,0,0,URTR2I ;.TR2INS
9280 IFE KA10P, UENTRY 1,1,1,1,,TR2INS-USRSTG
9283 REPEAT 4,UENTRY 1,1,0,0,,SRN3-USRSTG
9286 UENTRY 1,0,0,0,,MBOXCT-USRSTG ;.MBOX
9287 UENTRY 1,0,0,0,,MBOXCT+1-USRSTG ;.MBO1
9288 UENTRY 1,0,0,0,,EBOXCT-USRSTG ;.EBOX
9289 UENTRY 1,0,0,0,,EBOXCT+1-USRSTG ;.EBO1
9291 UENTRY 1,1,1,1,,XUNAME-USRSTG ;.XUNAME (USER'S REAL NAME)
9292 UENTRY 1,1,1,1,,XJNAME-USRSTG ;.XJNAME
9293 UENTRY 1,1,1,1,,SRN4-USRSTG ;.FTL1
9294 UENTRY 1,1,1,1,,SRN5-USRSTG ;.FTL2
9295 UENTRY 1,1,1,1,,PAGRAN-USRSTG ;.PAGRANGE
9296 UENTRY 1,1,1,1,,PAGAHD-USRSTG ;.PAGAHEAD
9297 UENTRY 2,2,3,3,URSERV,USSERV ;.SERVER
9299 EXPUNGE UENTRY ;NO MORE UENTRY'S
9301 MXVAL2==.RADIX 2,CONC [.LENGTH/]\MXVAL-1,/ ;BASE 2 LOG OF TABLE SIZE
9303 ;SIXBIT TABLE OF USER VARIABLE NAMES. MUST BE IN CORRECT ORDER,
9306 USETTB: SIXBIT/ADF1/
9373 IFN .-USETTB-MXVAL, .ERR USETTB INCONSISTENT WITH USETL
9374 REPEAT 1_<MXVAL2>-<MXVAL-1>-1, <SETZ>-1 ;PAD TO POWER OF 2 WITH PLUS INFINITY
9376 ;THE FOLLOWING TABLE IS PARALLEL TO USETTB AND GIVES THE NUMERIC USET CODE
9377 ;WHICH SHOULD BE IN THE RANGE 0 - 77 OR 600 AND UP.
9445 IFN .-USETBN-MXVAL, .ERR USETBN INCONSISTENT WITH USETL
9447 ;.CALL USRVAR HACK USER VARIABLES.
9449 ;ARG 2 - AOBJN PNTR FOR BLOCK MODE OR 0,,USER-VAR-NUMBER OR SIXBIT/USER-VAR-NAME/
9450 ;ARG 3 - DATA IF WRITING AND NOT IN BLOCK MODE. (OPTIONAL)
9451 ;ARG 4 - IMMEDIATE INSTRUCTION, OVERRIDES ARG 3. (OPTIONAL)
9452 ;VAL 1 - DATA IF READING AND NOT IN BLOCK MODE
9454 NUSRVA: MOVE J,A ;DECODE FIRST ARG
9455 JSP T,NCORUI ;GET JOB AND LOCK ITS DIELOK
9456 JRST NUSRV0 ;DEFINITELY WRITEABLE
9457 JSP T,NCORWR ;NOT SURE, CHECK FURTHER
9458 TLO J,(SETZ) ;SET WRITE PROTECT BIT
9464 PUSHJ P,NUSRV5 ;DO IT
9466 JRST LSWPJ1 ;WON, UNLOCK DIELOK AND TAKE SUCCESS RETURN
9468 NUSRV5: PUSHJ P,VARCAL ;DECODE ARGS, HACK BLOCK MODE, SET E, W, D.
9469 NUSRV3: SETZB B,I ;ENTER HERE FROM .USET AND .SUSET
9470 TLNN E,-1 ;NOW DECODE USER VARIABLE SPEC
9471 JRST NUSRV1 ;JUMP IF OLD STYLE NUMERIC SPEC
9472 REPEAT MXVAL2,[ ;SIXBIT SPEC LOOK UP IN TABLE
9473 CAML E,USETTB+1_<MXVAL2-.RPCNT-1>(B)
9474 ADDI B,1_<MXVAL2-.RPCNT-1>
9478 JRST OPNL11 ;ILLEGAL USER VARIABLE NAME
9479 MOVE E,USETBN(B) ;TRANSLATE TO NUMERIC SPEC
9480 NUSRV1: JUMPE W,NUSRV2 ;READING
9481 JUMPL J,OPNL31 ;WRITING AND WRITE PROTECTED
9482 MOVEI I,2 ;MAGIC INDEX 1.2=R/W 1.1=OTHER/SELF
9487 AOJE B,PDPPMT ;USER IS PDP6
9493 JRST AUSET2 ;100 TO 577 ARE .IOC, .IOS, .IOP, .PMAP VARS.
9494 NUSRV4: CAIL E,MXVAL ;DETECT USET CODE BEYOND 6XX MAXIMUM.
9496 LDB B,USETBT(I) ;GET METHOD BITS
9497 SOJL B,OPNL12 ;VARIABLE NOT AVAILABLE THIS MODE (WRITE PROTECT?)
9498 SOJL B,AUSVAR ;SIMPLE VARIABLE
9499 LDB B,USETRL(B) ;GET ADDRESS OF ROUTINE TO CALL
9500 HRRZ A,J ;SOME ROUTINES WANT USER INDEX IN A
9504 PUSH P,D ;READ/ALTER/REWRITE
9509 TRZ I,2 ;FIRST READ IT
9512 JRST POP5J ;READ LOST
9519 XCT W ;MODIFY THE VALUE IN A
9522 JRST NUSRV4 ;THEN WRITE IT BACK
9525 ; .SUSET [N,,LOC] ;SAME AS .USET (SEE BELOW) BUT REFERS TO SELF
9527 ASUSET: HRRZ J,U ;JOB TO BE HACKED IS SELF
9528 SETZM UUAC(U) ;IF ERROR, RETURN LOSS IN .IOS+0
9531 ; ;IF N&200000=1, BLOCK MODE
9532 ; .USET CH,[N,,LOC] ;IF N&400000=0, READS USER VAR SPECIFIED BY REST OF N
9533 ; FOR INFERIOR OR FOREIGN USER OPEN ON CHANNEL CH
9534 ; INTO USER LOCATION LOC
9535 ;IF N&400000.NE.0, SETS USER VAR SPECIFIED BY REST OF N
9536 ; FOR DIRECTLY INFERIOR USER OPEN ON CHANNEL CH
9537 ; FROM USER LOCATION LOC
9538 AUSET: MOVE J,R ;DECODE AC FIELD AS CHANNEL NUMBER
9540 JRST IOCER7 ;USR OP CHNL DOES NOT HAVE USR OPEN
9541 AUSET0: XCTR XR,[HRRZ B,(C)] ;GET ADDRESS READING INTO OR WRITING FROM
9542 XCTR XR,[HLRZ E,(C)] ;GET VARIABLE AND DIRECTION
9544 JRST ABUSET ;BLOCK MODE
9546 JRST AUSET1 ;JUMP IF READING
9547 JUMPL J,IOCER7 ;WRITE PROTECT VIOLATION
9548 MOVSI W,(MOVEM D,) ;FLAG WRITING
9549 UMOVE D,(B) ;GET DATA TO WRITE
9550 PUSHJ P,NUSRV3 ;DO THE WRITE
9555 ABUSET: TRNE E,400000
9556 TLOE J,(MOVE) ;SET BLOCK BIT
9557 JRST ILUUO ;BLOCK IN BLOCK LOSES
9558 UMOVE Q,(C) ;GET AOBJN PTR AGAIN
9559 ABUST2: UMOVEM Q,(C) ;STORE AWAY UPDATED POINTER
9570 AUSET1: MOVEI W,0 ;FLAG READING
9571 XCTR XRW,[MOVES (B)] ;ENSURE WRITEABILITY
9573 PUSHJ P,NUSRV3 ;GET VALUE OF VARIABLE INTO A
9576 APTUAJ: UMOVEM A,(J)
9579 ;DECODE ARG FOR USET
9580 AUSETJ: JSP T,NCRUI2
9586 AUSVAR: LDB C,USETRL+1 ;GET ADDRESS OF VARIABLE
9595 PDPPMT: MOVEI A,%JSSIX#%JSNUM ;PDP6 HAS ONLY A FEW VARIABLES, WHICH ARE READ-ONLY
9598 MOVEI A,LPDP6M*2000 ;FIXED MEM BOUND FOR PDP-6
9601 JRST POPJ1 ;IGNORE OTHER VARIABLES
9604 ;VARIABLES 100 - 577 (.IOC, .IOS, .IOP, .PMAP)
9605 AUSET2: JUMPN W,OPNL31 ;JUMP IF TRYING TO WRITE
9608 JRST AUSET4 ;>140=>.RIOP+M
9610 JRST AUSET3 ;117<E<140=>.RIOS+M
9611 ADDI E,IOCHNM(J) ;77<E<120=>.RIOC+M
9612 AUSETX: MOVE A,(E) ;GET VAR
9615 AUSET3: MOVE R,J ;INFERIOR USER INDEX
9616 ADDI R,IOCHNM(E) ;GET CHANNEL POINTER
9618 JRST NSTATUS ;DO A .CALL STATUS
9620 AUSET4: CAIL E,40+LUIOP ;COMPARE AGAINST LAST IO PDL LOC
9621 JRST AUSET5 ;READ MAP ENTRY
9622 ADDI E,SIOCHN-40(J) ;MAKE UP POINTER TO VAR
9625 ;USET VARIABLE 200+N -- READ MAP VARIABLE FOR PAGE N.
9626 ; (0 <= N < 400) E CONTAINS N+100.
9628 ;VALUE OF MAP WORD READ:
9630 ;4.9 - PAGE WRITEABLE.
9631 ;4.8 - PAGE EXISTS (IF THIS OFF, WHOLE WORD IS 0)
9632 ;4.7 - PAGE IS IN CORE.
9633 ;4.6 - PAGE IS PUBLIC (ANYONE CAN WRITE IT)
9635 ;3.1 - 3.9 - # TIMES PAGE SHARED (LIKE CORTYP'S 4TH VALUE'S RH)
9636 ;2.1 - 2.9 - ABS PAGE # OR PAGE # IN NEXT SHARER
9637 ; (LIKE CORTYP'S 3RD VALUE)
9638 ;1.1 - 1.9 - 0 => ABS PAGE (OR NO PAGE, OF COURSE)
9639 ; -1 => UNSHARED PAGE,
9640 ; ELSE USR NUM. OF NEXT SHARER.
9645 CIRPSW ;DON'T LET PAGE TABLES CHANGE.
9646 MOVEI A,-100(E) ;PAGE NUMBER IN JOB.
9648 PUSHJ P,NCORT0 ;PUT CORTYP'S VALUES IN A THRU D.
9650 PUSHJ P,LSWPOP ;FREE CIRPSW.
9651 ANDI B,777 ;CORTYP'S 2ND VALUE IN 1.1 - 1.9
9652 DPB C,[111100,,B] ;3RD VALUE IN 2.1 - 2.9
9653 TLO B,(D) ;4TH VALUE RH INTO 3.1-3.9
9655 TLO B,(D) ;4TH VAL BITS 4.8-4.9 INTO 4.6-4.7
9656 IOR A,B ;TOGETHER WITH 1ST VALUE'S 4.8, 4.9.
9659 USTOP: AOS (P) ;GOING TO WIN
9660 JUMPN D,1USTOP ;NONZERO VALUE => STOP THE JOB.
9661 MOVE B,APRC(A) ;ZERO => START.
9662 TLNE B,BULGOS ;BUT DON'T EVER START A JOB THAT'S BEING KILLED.
9666 1USTOP: MOVNI D,1 ;SET TO STOP
9667 1USTRT: PUSHJ P,RPCLSR ;STOP USER IN A
9668 DPB D,[.BP BUSRC_22,USTP(A)] ;BUSRC
9677 UPCSET: PUSHJ P,RPCLSR ;STOP USER IN USER MODE
9678 TLO D,%PCUSR ;BE SURE USER MODE IS ON IN NEW PC
9679 TLZ D,BADPC ;BE SURE PRIVILEGED BITS ARE OFF
9680 SKIPGE IOTLSR(A) ;SKIP UNLESS USER IS SUPPOSED TO BE IN IOT-USER MODE
9681 TLO D,%PCUIO ;TURN ON IOT-USER MODE
9682 MOVEM D,UPC(A) ;SET PC
9683 PUSHJ P,UPCLSR ;RESTART
9686 UJPCS: CAIN U,(A) ;SET .JPC, WITH CARE IF SETTING OWN
9693 UJPCR: CAIN U,(A) ;READ .JPC:
9694 SPM UPGML(U) ;IF READING ONE'S OWN, MAKE SURE IT'S UP TO DATE.
9699 UROPC: HLLZ A,UPOPC(J)
9704 IFE KA10P, UROPC: JRST OPNL12 ;.OPC NOT SUPPORTED ON KL AND KS ((CAN'T
9705 ; USE == DUE TO FWD REF))
9707 IFN N11TYS,[ ;SET OWN TV CONSOLE REGISTER
9708 STVCRG: MOVEM D,TVCREG(U) ;ENABLE TVCREG TO BE SWAPPED IN AND OUT OF HARDWARE
9709 JUMPL D,POPJ1 ;IF TURNING ON; OR, IF TURNING OFF, ALL DONE
9710 SKIPGE TT11P ;ALLOWED TO TOUCH HARDWARE?
9713 MOVEM D,400000+TTR10*2000 ;UPDATE REG IN HARDWARE
9714 MOVEM D,TVCREG(U) ;AND UPDATE AGAIN IN SOFTWARE IN CASE CLOBBERED AT SSTVR2
9718 IFE KS10P,[ ; KS10 doesn't have a MAR and it never will...
9721 URMAR: MOVE A,UPMAR(J)
9722 IFN KA10P, TLZ A,777770
9723 IFN KL10P, LDB B,[270400,,A]
9724 IFN KL10P, HRL A,MARPTB(B)
9728 USMAR: CONO PI,CLKOFF ;TURN OFF CLOCK INTERRUPTS
9730 SPM UPGML(J) ;STORE PG VARIABLES IF HACKING CURRENT USER
9733 TLO D,4 ;SET USER MODE
9741 LPMR UPGML(J) ;USE LPMR BECAUSE KL10 DOESN'T HAVE VANILLA LPM
9744 IFN KL10P,[ ;MAR PERMUTATION TABLE. MAYBE CAN DO BETTER???? *****
9746 MARPTB: 0 1, 0 ;OFF ;NONE (EXEC)
9747 0 11, 0 ;FETCH ;NONE (USER)
9748 0 3, 2 ;WRITE ;WRITE(EXEC)
9749 0 17, 6 ;ANY ;WRITE (USER)
9750 0 1, 10 ;OFF ;READ (EXEC)
9751 0 11, 14 ;FETCH ;READ (USER)
9752 0 3, 12 ;WRITE ;NOT FETCH (EXEC)
9753 0 17, 16 ;ANY ;NOT FETCH (USER)
9754 0 5, 1 ;READ ;FETCH (EXEC)
9755 0 15, 5 ;READ+FETCH ;FETCH (USER)
9756 0 7, 13 ;NOT FETCH ;NOT READ (EXEC)
9757 0 13, 17 ;NOT READ ;NOT READ (USER)
9758 0 5, 11 ;READ ;READ+FETCH (EXEC)
9759 0 15, 15 ;READ+FETCH ;READ+FETCH (USER)
9760 0 7, 3 ;NOT FETCH ;ANY (EXEC)
9761 0 13, 7 ;NOT READ ;ANY (USER)
9770 RUSUPP: HRRE A,SUPPRO(J) ;READ SUPERIOR'S USER INDEX
9771 JUMPL A,POPJ1 ;-1 => TOP LEVEL
9772 UINDEX: IDIVI A,LUBLK ;GET INDEX NUMBER
9773 JRST POPJ1 ;GIVE TO USER
9776 UTRNTR: CONO PI,CLKOFF
9779 LDB A,[2300,,UPQUAN(U)]
9780 LSH A,-2 ;SIMULATE 4.069 USEC CLOCK
9783 SKIPL MTRUSR ;SKIP IF PERFORMANCE METER AVAILABLE
9784 JRST [ RMBOXC A ;REQUIRES AC ORDER - A,B,C,D,E
9786 DMUL A,KLMBCC ;BECAUSE DMUL PRODUCES FOUR WORD RESULT
9800 LDB A,[400400,,UPQUAN(U)] ; 3.9 USEC CLOCK
9805 ;SET JOB'S TTYTBL (.TTY VARIABLE).
9806 USTTY: CONO PI,CLKOFF ;PREVENT TIMING ERROR.
9807 HLLZ E,TTYTBL(J) ;GET CURRENT VALUE
9808 XOR E,D ;GET WHICH BITS USER WANTS TO CHANGE
9809 AND E,[%TBNVR+%TBINT+%TBWAT+%TBOUT+%TBINF+%TBIIN+%TBOIG,,] ;GET BITS USER IS ALLOWED TO CHANGE
9811 TLZ E,%TBWAT ;THESE BITS CAN BE ALTERED ONLY BY THE SUPERIOR
9812 XORM E,TTYTBL(J) ;ALTER THE USER-CONTROLLED BITS WITHOUT WRITING THE OTHERS.
9815 ;READ JOB'S TTYTBL (.TTY) VARIABLE
9816 URTTY: CONO PI,CLKOFF
9823 ;READ JOB'S .CNSL VARIABLE - TTY# OF TREE'S CONSOLE
9824 URCNSL: MOVE A,UTMPTR(J)
9827 SUBI A,NCT+2 ;DISOWNED -1 SYS -2
9830 UJNAME: JUMPE D,OPNL33 ;SET INFERIOR'S JNAME
9831 CAME D,[SIXBIT/PDP6/]
9832 CAMN D,[SIXBIT/PDP10/]
9833 JRST OPNL33 ;CHANGING TO ILLEGAL NAME
9837 PUSHJ P,UJNAMU ;IS NEW JNAME UNIQUE?
9839 MOVEM D,JNAME(A) ;YES
9844 UJNAMU: MOVE B,UNAME(A)
9847 UJNAM1: CAME B,UNAME(E)
9851 UJNAMF: ADDI E,LUBLK
9856 UJNAMG: PUSHJ P,UPCLSR
9858 JRST OPNL13 ;DUPLICATE NAME
9859 JRST CLKOJ1 ;WASN'T REALLY CHANGING THE NAME
9861 UUNAME: HLRE I,D ;SET OWN UNAME
9862 AOJE I,OPNL33 ;CHECK FOR ILLEGAL ___nnn UNAME
9864 UJNAMS: SETO I, ;SET OWN JNAME
9865 JUMPE D,OPNL33 ;CHECK FOR EVIL NAMES
9867 BUG ;SOMETHING SCREWED
9869 JRST OPNL40 ;MUST BE TOP LEVEL
9870 CONO PI,CLKOFF ;TURN CLOCK OFF NOW SO WE DON'T GET REOWNED OR SOMETHING
9872 SKIPA C,JNAME(U) ;CHANGING UNAME, KEEPING JNAME
9873 SKIPA C,UNAME(U) ;VICE VERSA
9874 EXCH D,C ;NOW C=UNAME, D=JNAME
9875 MOVEI E,0 ;CHECK FOR DUPLICATE NAMES
9876 UUNAM0: SKIPE UNAME(E)
9877 CAMN E,U ;ALLOW SETTING TO SAME NAME AS BEFORE
9882 CAMN A,I ;JOB CAN'T HAVE INFERIORS IF SETTING UNAME
9883 JRST OPNL13 ;OR DUPLICATE U-JNAME IF SETTING EITHER
9884 UUNAM1: ADDI E,LUBLK
9889 SKIPA A,D ;D GETS CLOBBERED
9890 JRST CLKOJ1 ;THE NAMES WEREN'T ACTUALLY CHANGED! (SYNCOM DOES IT).
9891 CAME C,UNAME(U) ;IF NOT LOGGED IN, AND CHANGING UNAME,
9892 SKIPGE TTYTBL(U) ; AND CONSOLE-CONTROLLED,
9896 AOS SUSRS ;DISGUST! SHOULD BE USING LOGIN
9897 UUNAM2: HRRZ T,TTYTBL(U)
9898 HRLI T,[ASCIZ / CHUNAM /]
9899 PUSHJ P,SGWAIT ;REQUEST SYSTEM JOB TO PRINT OUR MSG
9900 MOVEM C,SLGIV+2 ;INCLUDE NEW UNAME AS SECOND NAME
9901 UUNAM3: PUSHJ P,LOGUPD ;CHARGE OLD NAME FOR USAGE SO FAR
9902 MOVEM C,UNAME(U) ;THEN SWITCH NAMES
9904 PUSHJ P,DMNPLI ;LOG BACK IN UNDER NEW NAMES
9907 ;WAIT FOR SLGIV VARIABLES TO BECOME FREE, AND REQUEST THE
9908 ;SYSTEM JOB TO PROCESS THEM. TAKES STRING,,TTY IN T, AND
9909 ;PLACES UNAME(U) IN SLGIV, AND T INTO SLGIV+1. THE CALLER
9910 ;IS RESPONSIBLE FOR FILLING IN SLGIV+2
9913 MOVSI T,SCLLGI ;SOMEBODY ELSE IS USING THOSE VARIABLES
9914 PUSHJ P,CWAIT ;WAIT FOR THE SYSTEM JOB TO FINISH WITH
9915 TDNE T,SUPCOR ;THEM.
9916 IORM T,SUPCOR ;REQUEST THE SYSTEM JOB TO PRINT OUR MSG
9917 POP P,SLGIV+1 ;STRING,,TTY #
9918 MOVE T,UNAME(U) ;STORE AWAY THE UNAME
9922 RUTRAP: LDB A,[430100,,UTRAPM(J)] ;GET SPECIAL TRAP MODE INDICATOR
9925 SUTRAP: DPB D,[430100,,UTRAPM(J)] ;SET " " " "
9929 URTR1I: SKIPA A,[0,,%PIARO] ;READ "TRAP 1 INSTRUCTION" FOR KA-10
9930 URTR2I: MOVEI A,%PIPDL ;TRAP 2
9944 MOVEM A,SRN5(U) ;ARGUMENT TO NCORFS
9946 NCORFS ;CLEARS BSSTP IN USTP(A).
9953 ;SET SYSTEM NAME (ZERO IGNORED)
9958 ;SET INFERIOR'S INTERRUPT MASK
9959 USMASK: SKIPA E,[2] ;MOVEM
9960 IAMASK: ANDI E,1 ;ANDCAM OR IORM
9961 ANDCM D,[VBDBTS] ;BITS FOR CLASS 1 INTS CAN'T BE CHANGED.
9962 XCT (E)[ IORB D,MSKST(A)
9966 MOVEI B,440+APRCHN ;NOW UPDATE JOB'S APRC VARIABLE.
9975 IFE KA10P, PUSHJ P,TRINST
9979 ;SET THE AROV AND PDLOV TRAP INSNS ACCORDING TO WHETHER THE
9980 ;INTERRUPTS ARE ENABLED; BUT DON'T OVERRIDE AN EXPLICIT SPECIFICATION
9981 ;BY THE USER, WHICH IS ANYTHING OTHER THAN 0 OR (CAI) IN THE LH.
9983 TRINST: MOVE D,MSKST(A)
9984 MOVSI B,(CAI) ;CAI IS FASTER THAN JFCL - NO AC DECODE
9985 TDNE D,[%PIFOV+%PIARO] ;AND OVERFLOW GOES OFF A LOT
9991 ; MOVSI B,(CAI) ;THESE LINES COMMENTED OUT TO MAKE
9992 ; TRNE D,%PIPDL ; PDL OVERFLOW CLASS 2 INSTEAD OF CLASS 3
10001 ;SET INFERIOR'S PI IN PROGRESS FLAG
10002 UPISET: ASH D,-35. ;SHIFT SIGN BIT TO BOTTOM BIT
10003 MOVEM D,PICLR(A) ;SET VARIABLE
10004 ;COME HERE WHEN ANY INTERRUPT VARIABLE'S VALUE IS CHANGED
10005 ;BY A .USET OR .SUSET; TAKE ANY INTS THAT ARE NOW PENDING.
10006 UPISE1: HRRZ A,J ;IAMASK, ETC. MODIFY A. RESTORE IT.
10007 AOS (P) ;GOING TO WIN
10008 TRNN I,1 ;SKIP IF A SUSET
10010 JRST APISE1 ;SEE IF SHOULD REINTERRUPT
10012 IAMSK2: ADDI A,MSKST2-IDF1
10013 IADF1: ADDI A,IDF1-IDF2
10014 IADF2: ADDI A,IDF2-PIRQC ;IORM OR ANDCAM INTO IDF2.
10015 IAPIRQ: ADDI A,PIRQC-IFPIR
10016 IAIFPI: ANDI E,1 ;GET USET PARITY (0=IORM, 1=ANDCAM)
10017 XCT IAINS(E) ;DO APPRO OP
10020 IAINS: IORB D,IFPIR(A) ;SET BITS
10021 ANDCAB D,IFPIR(A) ;FLUSH BITS
10023 USMSK2: ADDI A,MSKST2-IDF1 ;SET .MSK2, ETC.
10024 USDF1: ADDI A,IDF1-IDF2
10025 USDF2: ADDI A,IDF2-PIRQC
10026 USPIRQ: ADDI A,PIRQC-IFPIR
10027 USIFPI: MOVEM D,IFPIR(A)
10030 ;.RBCHN, .SBCHN READ/SET NUMBER OF LAST CHANNEL ON WHICH ERROR OCCURRED
10031 RUBCHN: LDB A,[BCHPTR#(A#U)]
10034 SUBCHN: DPB D,[BCHPTR#(A#U)]
10038 UGSUPR: HLLZ A,SUPPRO(J)
10041 ;SAVE AWAY MA (HIGH BITS) ON LAST MPV OR WIRO
10042 ;CALLED FROM CLKBRK, DONT CLOBBER A OR D
10047 LSH T,10. ;HIGH BITS ONLY ON KA
10049 IFE KA10P, HRRZ T,UPFW(U)
10053 ;.RMPVA READ VIRTURAL PAGE # (8 BITS) OF LAST MPV OR WIRO
10055 MPVARD: HRRZ A,IOTLSR(J)
10058 ;.RSERVER Read server user number, or -1 if none.
10059 URSERV: SKIPL A,SERVER(J)
10063 ;.SSERVER Set server user number, or clear if negative.
10064 ; (To prevent timing screws, you should really use the SSERVE call to set
10065 ; this variable, but for debugging convenience...)
10066 USSERV: IMULI D,LUBLK
10072 SUBTTL USER INSTRUCTION HANG ROUTINE (.HANG)
10074 ; .HANG was rewritten by Alan Feb 87:
10076 ; The general theory is that .HANG should behave -exactly- like JRST .-1 as
10077 ; much as possible. Thus, it is considered to make sense to put any
10078 ; skipping or jumping instruction before a .HANG. We are always careful to
10079 ; return from the .HANG by jumping to the previous instruction, so any side
10080 ; effects (such as clearing bits or incrementing accumulators or memory) are
10081 ; always performed, and jumps will be correctly taken.
10083 ; There are two ways to leave a .HANG, either the job can get PCLSR'ed, or
10084 ; the awaited condition can become true. We arrange for -both- cases to
10085 ; return the job to the previous instruction by SOSing UUOH -once- before
10086 ; calling UFLS, and once more if UFLS returns.
10088 ; As an additional feature, .HANG with a non-zero accumulator behaves like
10089 ; the disjunction of ordinary .HANG and .SLEEP, allowing the user to do a
10090 ; timeout. The accumulator should initially contain an argument, as for
10091 ; .SLEEP, that indicates when .HANG should timeout. In that case only,
10092 ; .HANG returns to the following instruction and the designated accumulator
10093 ; will contain zero. If such a .HANG is interrupted, or if it returns
10094 ; because the awaited condition is now true, that accumulator will contain
10095 ; the correct negative number indicating the absolute time it would have
10098 ; Accepted instructions are:
10099 ; Any CAI, CAM, JUMP, SKIP, AOJ, AOS, SOJ, or SOS class instruction.
10100 ; Any test instruction.
10102 ; JFCL with 0 in the AC field.
10103 ; Or an XCT that eventually fetches one of the above.
10105 ; As special cases SKIPA 0, and CAIA 0, are taken to request a schedule,
10106 ; and JFCL 0, and SKIP 0, set %SWDSO.
10108 ; As before, it is a limitation that changes to memory referenced by .HANG
10109 ; when computing effective addresses and fetching XCT'ed instructions will
10110 ; not cause the job to wake up. But how could it be otherwise? Changes to
10111 ; the accumulators will of course cause the job to be PCLSR'ed.
10114 UMOVE R,-2(R) ; Get user's flush instruction
10115 HRLOI A,377777 ; A: most positive fixnum
10116 JUMPE J,AHANG2 ; No AC => timeout when hell freezes over
10117 XCTR XR,[MOVN A,(J)] ; A: argument as for .SLEEP
10118 JUMPG A,AHANG2 ; 'twas already neg., so wait 'til then
10119 SUB A,TIME ; else compute time
10120 UMOVEM A,(J) ; store back negative for PCLSRing
10121 MOVN A,A ; A: time to wait for
10122 AHANG2: PUSHJ P,ASCIND ; Compute E for instruction
10123 HLRZ C,R ; C: Opcode and AC
10126 JRST AHANGI ; User might be waiting for a while
10129 JRST AHANGF ; User is just trying to cause a schedule
10130 LSH C,-9 ; C: 9-bit opcode
10132 JRST AHANG1 ; XCT - Go loop
10134 JRST AHANGO ; JFFO is like JUMPN
10135 LSH C,-6 ; C: First 3 bits of opcode
10137 JRST AHANGC ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS
10140 IFN KS10P, JRST ILUUO
10142 ;CODE TO ALLOW CONSO, CONSZ AS .HANG INSTRUCTIONS
10143 HLRZ C,R ;CHECK FOR CONSO, CONSZ
10145 LDB B,[320700,,R] ;GET DEVICE CODE/4
10148 CAIE C,(CONSZ\CONSO)
10149 JRST ILUUO ;UNRECOGNIZED INSTRUCTION, OR USER CONI NOT
10158 AHANG9: XCT EPDL(U)
10166 AHANG1: PUSHJ P,OPBRK ; Don't let "XCT ." hang you up
10167 UMOVE R,(R) ; Get new instruction
10168 JRST AHANG2 ; And start over
10170 ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS ? .HANG
10171 AHANGC: TLNN R,040000
10172 JRST AHANG3 ; CAI, CAM, JUMP, SKIP
10174 JRST AHANGJ ; AOJ, SOJ
10176 SKIPA T,[-1] ; AOS: Compare with -1
10177 MOVEI T,1 ; SOS: Compare with 1
10178 TLZ R,770777 ; Clear all but last 3 bits of opcode
10179 TLO R,(CAM T,) ; Build a CAM instruction
10180 TLNE R,001000 ; With the opposite sense
10184 AHANG3: TLNN R,020000
10185 JRST AHANG4 ; CAI, CAM
10188 TLZ R,(0 17,) ; SKIP
10192 AHANGO: TLC R,(JFFO#JUMPN)
10193 AHANGJ: HRRI R,AHANGX
10196 ; SKIPA ? .HANG -- just flush once (ignores timeout)
10202 ; JFCL ? .HANG -- hang infinitely (or until timeout)
10203 AHANGI: MOVE B,TIME
10204 ADDI B,60.*30. ; If sleeping for more than a minute
10205 MOVSI C,%SWDSO ; Desire swap out
10206 CAML A,B ; (just like .SLEEP)
10215 AHANGT: TLZ R,060000 ; Make opcode be TRN or TDN series
10216 TLNE R,010000 ; If TRN, only AC matters
10217 JRST AHANGB ; TDN: Both AC and memory matter
10218 ; Wait for something that only references the user's accumulators.
10219 ; (Instruction in R might be some kind of jump to AHANGX.)
10220 AHANGA: PUSHJ P,AHANGG ; Get contents of user's AC into T
10222 XCT R ; Must try it once to prevent timing screw
10223 JRST AHANG5 ; OK, wait forever for PCLSR
10226 AHANG4: TLNN R,010000 ; If CAM, both AC and memory matter
10227 JRST AHANGA ; CAI: Only AC matters
10228 ; Wait for something that references memory.
10229 ; (Instruction in R better not be a jump!)
10230 AHANGB: PUSHJ P,AHANGG ; Get contents of user's AC into T
10231 AHANGM: MOVEM R,EPDL(U)
10233 TRNE R,-20 ; Memory reference really only AC?
10234 JRST AHANG6 ; No, real memory, go wait
10235 XCTR XRW,R ; Must try it once to prevent timing screw
10236 JRST AHANG5 ; OK, wait forever for PCLSR
10240 AHANG6: PUSHJ P,UFLS
10241 AHANGX: ;; Everyone exits here after SOSing UUOH once (before hanging).
10242 ;; Thus we always exit to the previous instruction (just like being
10243 ;; PCLSRed), unless we timeout instead.
10244 CAMGE A,TIME ; Timeout?
10249 AHANGY: XCTR XW,[SETZM (J)] ; Let user know we timed out
10250 AOS UUOH ; And fall through instead of backing out
10253 ;.HANG flush instruction routine, called with PUSHJ only on clock level
10256 MOVEI TT,0 ; Save MAR word
10257 EXCH TT,UPMAR(U) ; so will not MAR
10259 MOVEM TT,UPMAR(U) ; Restore MAR
10261 IFN KS10P, LPMR UPGML(U)
10265 AOS (P) ; Might be because location swapped out or
10266 POPJ P, ; missing, but that's OK because we always
10267 ; exit to the previous instruction!
10269 ; Kind of like ASCIND for the accumulators...
10270 AHANGG: LDB T,[270400,,R]
10271 UMOVE T,(T) ; Get contents of AC from user
10272 TLZ R,(0 17,) ; Clear out AC field in instruction
10273 TLO R,(0 T,) ; Replace AC field with T
10276 ; Allow interrupt if being PCLSRed
10279 CAMN T,[JRST ONEFLS]
10284 SUBTTL .OPEN AND FRIENDS
10287 ;.FDELE FILBLK ;DELETE OR RENAME FILE SPECIFIED AT FILBLK
10289 AFDELE: SETZM UUAC(U)
10290 UMOVE A,(C) ;GET DEVICE
10292 DPB W,[OPNCOM,,A] ;SET OP TO SPECIFY AN .FDELE
10295 ;OPEN SET UP AND DISPATCH
10296 ;3.1=0 => INPUT =1 OUTPUT
10297 ;3.2=0 => UNITS =1 BLOCK
10298 ;3.3=0 => ASCII =1 IMAGE
10299 ;4.9-4.7 OPERATION FIELD
10300 ; 0=> NORMAL READ OR WRITE
10301 ; 1=> WRITE OVER MODE
10303 ; 4=> DELETE OR RENAME (INTERNAL)
10305 ;.OPEN CH,FILBLK ;OPEN FILE SPECIFIED AT FILBLK ON LOGICAL CHANNEL CH
10307 AOPEN: ;C HAS EFF ADR OF UUO AND R ITS AC FIELD
10308 ADDI R,IOCHNM(U) ;MAKE R POINT TO SPECIFIED I/O CHANNEL WORD
10310 PUSHJ P,ACLOSE ;CLOSE PREV
10312 UMOVE A,(C) ;GET DEV AND MODE BITS
10315 JRST OPNL23 ;BARF IF TRY TO DELETE WITH .OPEN
10316 AFDEL1: MOVEI TT,SRN3(U) ;MOVE 4TH-6HT ARGS
10317 HRLI TT,3(C) ;TO SRN3 THRU SRN5
10319 XCTR XBR,[BLT TT,-1(Q)]
10320 UMOVE B,1(C) ;GET 2ND, 3RG ARGS (FILENAMES)
10322 MOVE D,USYSNM(U) ;USE DEFAULT SNAME.
10323 HLRZ E,A ;GET MODE BITS.
10324 HRLZI A,(A) ;LEFT-JUSTIFY DEVICE NAME.
10327 NOPNE: CAIN W,4 ;SKIP ON NOT .FDELE (ENTRY FOR NCALL TYPE OPEN, ETC COMMANDS)
10328 SKIPN SRN3(U) ;SKIP ON RENAME
10329 JRST AOPEN3 ;JUMP IF A .OPEN OR DELETING .FDELE
10330 JUMPN B,AOPEN3 ;JUMP UNLESS RENAME WHILE OPEN.
10331 MOVE TT,C ;GET CH ON WHICH FILE IS SUPPOSIDLY OPEN
10332 TDNE TT,[-NIOCHN] ;SKIP IF CH LOGICALLY LESS THAN 20
10333 JRST OPNL14 ;BAD CHANNEL NUM
10334 ADDI TT,IOCHNM(U) ;RELOCATE TO POINT TO CH WORD FOR USER
10335 MOVE Q,(TT) ;GET CH WORD
10336 JUMPE Q,OPNL44 ;CHNL NOT OPEN
10337 HLRZ Q,CLSTB(Q) ;GET LEFT HALF OF CLOSE TABLE ENTRY FOR INDEX IN I/O CH WORD
10338 TRNE Q,%CLSJI\%CLSJO
10339 JRST JFDEL4 ;JOB DEVICE CHNL
10340 TRNN Q,%CLSDO\%CLSQ ;SKIP IF A DIRECTORY DEVICE
10341 JRST POPJ1 ;JUMP IF NOT DIRECTORY DEVICE
10342 HLRZ J,(TT) ;PICK UP DEV CHNL NO
10343 EXCH A,B ;PUT FN1, FN2 IN A, B.
10346 TRNN Q,%CLSDO ;SKIP IF DEC TAPE
10348 MOVSI C,'UT0 ;GET DUMMY UT DEV NAME.
10349 HRRZ I,UTTNO(J) ;GET POSSIBLE (?) TAPE NUM
10350 TLO C,(I) ;STORE IN DEV NAME
10351 MOVE TT,DVAUT ;WILL EXIT TO UTAPE OPEN RTN.
10355 MOVSI C,'DSK ;NOT UT, MUST BE DSK.
10356 MOVE TT,DVAQSK ;NOBODY ELSE HANDLES RENAME WHILE OPEN.
10359 AOPEN3: PUSHJ P,TRAN ;PERFORM I/O TRANSLATIONS
10360 JRST OPNL3 ;TOO MANY TRANSLATIONS.
10361 MOVEM D,USYSN1(U);SAVE TRAN'D SNAME FOR OPEN RTN.
10362 PUSH P,A ;PUT NAMES ON STACK.
10365 MOVSI B,-NDEVS ;LOAD LENGTH OF FIRST DEV NAME TABLE
10366 CAME A,DEVTAB(B);SEARCH FIRST DEV NAME TABLE
10367 AOBJN B,.-1 ;LOOP TILL FOUND OR COUNTED OUT
10368 JUMPG B,OPEN1 ;JUMP IF NOT FOUND
10369 OPEN2: MOVE TT,DEVADR(B) ;LOAD BITS,,OPEN-ROUTINE-ADDRESS
10370 OPEN21: POP P,B ;UNSAVE SECOND FILE NAME
10371 POP P,A ;UNSAVE FIRST FILE NAME
10372 POP P,C ;UNSAVE DEVICE NAME
10374 JRST [ TLNN TT,%DVDEL
10375 JRST OPNL34 ;DEVICE DOES NOT ALLOW DELETE
10378 JRST [ TLNN TT,%DVLNK
10379 JRST OPNL34 ;DEVICE DOES NOT ALLOW LINK
10381 OPEN2B: HRRZ D,E ;MODE BITS
10382 EXCH E,C ;SAVE DEVICE IN E
10383 HLL C,E ;SET UP OLD-STYLE C: MODE,,DEV
10386 ;AT THIS POINT: A & B HAVE FILE NAMES, C HAS MAPPED DEV AND MODE BITS, D HAS MODE BITS,
10387 ;W HAS OPEN COMMAND, E HAS DEVICE NAME, TT HAS DEVADR WORD (BITS,,ROUTINE)
10389 ROT D,-1 ;ROTATE IN/OUT BIT TO SIGN
10390 CAIN W,4 ;SKIP IF NOT A .FDELE
10391 TDZ D,[400000,,7] ;A .FDELE, MAKE LOOK LIKE OPEN FOR READ
10393 JRST OPEN2D ;NORMAL OPEN
10394 JUMPL D,OPNL2 ;WRITING DIRECTORY?
10395 JUMPN W,OPNL12 ;DELETING, RENAMING, LINKING, WRITING OVER DIRECTORY?
10397 JRST (TT) ;OPEN DEVICE FOR DIRECTORY
10398 ;ASKING FOR DIR OF DEVICE SYSTEM DOESN'T HAVE DIR ROUTINE FOR.
10399 ;PASS IT OFF TO THE UNKNOWN-DEVICE HANDLER.
10400 PUSH P,E ;PUSH DEVICE NAME
10403 HLRZ E,C ;GET MODE BITS
10404 JRST OPEN22 ;PASS TO UNKNOWN DEVICE JOB
10406 OPEN2D: TLNE TT,%DVIN
10407 JUMPGE D,(TT) ;OPENING FOR INPUT AND DEVICE CAN DO INPUT
10409 JUMPL D,(TT) ;OPENING FOR OUTPUT AND DEVICE CAN DO OUTPUT
10410 JRST OPNL2 ;DEVICE DOESN'T GO THAT DIRECTION
10412 ;CHECK FOR NUMBERED DEV
10413 OPEN1: MOVE B,[-NDV1,,DVT1-DEVTAB] ;LOAD AOBJN POINTER WITH COUNT FOR 2ND DEV TABLE
10414 OPEN1A: MOVEI I,0 ;INITIALIZE NUMBERED DEV NUM TO ZERO
10415 MOVE D,[440600,,-2(P)] ;GET BYTE POINTER INTO DEV REQUESTED
10416 MOVE C,[440600,,DEVTAB(B)] ;GET BYTE POINTER INTO CURRENT TABLE ENTRY
10417 OPENA1: ILDB A,C ;GET CHAR FROM TABLE
10418 ILDB J,D ;GET CHAR FROM DEV
10419 JUMPE A,OPEN1B ;JUMP ON SPACE IN TABLE, "MATCHES" DIGIT IN DEV
10420 CAIN A,(J) ;SKIP IF CHAR DIFFER
10421 JRST OPEN1C ;SAME, TRY FOR NEXT CHAR
10422 OPENZ1: AOBJN B,OPEN1A ;LOOP TO NEXT TABLE ENTRY OR COUNT OUT
10423 ;CHECK FOR NAMED SECONDARY PACK
10424 ;FIND THE ONE WITH THIS NAME AND THE BIGGEST QSFT.
10425 ;ASSUME THAT BY THE TIME WE GET HERE TUTS HAVE BEEN READ IN AND SO FORTH
10426 SKIPE A,-2(P) ;GET DEVICE NAME AGAIN
10427 CAMN A,[-1] ;0 OR -1 ARE NOT LEGAL PACK NAMES
10429 MOVEI C,NQS-1 ;SEARCH NAMES OF SECONDARY PACKS
10430 SETOB TT,I ;I BEST DRIVE SO FAR, TT BEST QSFT SO FAR
10431 OPENZ2: CAMN A,QRESRV(C)
10432 JRST [ CAML TT,QSFT(C)
10438 MOVE TT,[%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,,QSKOB]
10441 ;"UNKNOWN DEVICE" HANDLER. FOO DEVICE IS LOADED BY
10442 ;SYS;ATSIGN DEVICE FROM FILE DEVICE;JOBDEV FOO
10444 OPEN22: POP P,EPDLT2(U) ;WHEN WE USE SYS:ATSIGN DEVICE AS A JOB DEVICE,
10445 POP P,EPDLT1(U) ;SET UP THE "NAMES BEFORE LAST TRANSLATION" TO BE
10446 POP P,EPDLT4(U) ;THE NAMES BEING USED, INCLUDING "FOO" AS THE DEVICE.
10450 MOVE TT,DVAJOB ;DEVADR ENTRY FOR JOB:
10457 OPEN1B: JUMPE J,OPEN1C ;JUMP IF DEV ARG EXHAUSTED
10458 SUBI J,'0 ;CONVERT SIXBIT DIGIT TO NUMBER
10459 JUMPL J,OPENZ1 ;JUMP IF TOO SMALL, NOT A DIGIT
10460 CAILE J,9 ;SKIP IF LESS THAN 10.
10461 JRST OPENZ1 ;LOSE, TRY NEXT
10462 ASH I,3 ;MULTIPLY NUM SO FAR BY 8
10463 ADD I,J ;ADD NEW DIGIT
10464 OPEN1C: TLNE C,770000 ;SKIP IF ALL SIX CHAR POSITIONS COMPARED
10465 JRST OPENA1 ;GO TO NEXT POSITION
10468 NSOPEN: HRRZ R,A ;Args: 1 mode (LH) chnl (RH), 2 BP or aobjn -> block of BPs.
10472 PUSH P,A ;Save channel number.
10473 PUSH P,B ;Save BP or BP block ptr.
10475 POP P,R ;Get back the BP or aobjn pointer.
10476 MOVEM R,EPDL(U) ;Save where job device can get it.
10477 PUSHJ P,FNPRS ;Parse into DEV, FN1, FN2, SNM in A, B, C, D.
10478 MOVEM D,SRN3(U) ;Make symbolic open of network win using 5th arg as foreign host.
10479 POP P,R ;Pop back channel number argument.
10487 JRST OPNL12 ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10491 ;Given in R a BP into user memory, or an aobjn -> of BPs block in user memory,
10492 ;parse filenames into A, B, C, D. Clobbers Q, T, R, H, I.
10493 FNPRS: SETZ Q, ;Guess that it is a BP, not a block of them.
10494 SETZ A, ;Clear out the old-fashioned filename words.
10498 SETCM T,R ;Is our "BP" realy an aobjn pointer to fewer than 64 things?
10499 TLNE R,-1 ;If LH is 0, treat as BP and replace with 440700 later.
10502 MOVE Q,R ;Put the aobjn pointer in Q and get the first BP in R.
10504 FNPRS8: PUSHJ P,ASCIND
10505 FNPRS7: PUSHJ P,FNPRS4 ; Read a sixbit word
10506 JUMPL I,FNPRS9 ; Nothing there at all!
10507 CAIN H,"; ; Directory?
10508 JRST FNPRS0 ; Go do special hack
10509 MOVEI I,B ; assume FN1
10510 SKIPE B ; unless we already have a FN1
10511 MOVEI I,C ; in which case assume FN2
10513 MOVEI I,A ; unless it was a device
10514 SKIPN (I) ;Put it there, unless already something there.
10516 JUMPN H,FNPRS7 ;H=0 means end of last arg string.
10517 FNPRS9: ;; Supply default values for all components except FN1.
10519 MOVSI A,(SIXBIT /DSK/)
10523 MOVSI C,(SIXBIT />/)
10536 ;;; Extract in T the next SIXBIT word from user memory off bp in R,
10537 ;;; clobbering I (test 4.9 to see if there was no word read at all).
10538 ;;; Terminating character returned in H (0 means we got to the end of the
10539 ;;; string). Q should be an aobjn pointer to a block in user memory of
10540 ;;; additional BPs.
10543 FNPRS6: PUSHJ P,FNPRS3
10544 JUMPE H,CPOPJ ; that was the end of the string
10547 JRST FNPRS5 ; done?
10549 JRST FNPRS5 ; done?
10559 FNPRS5: JUMPL I,FNPRS6 ; keep looking if we haven't seen anything yet.
10562 ;Extract in H the next character from user memory off the byte pointer in R.
10563 ;Q should be an aobjn pointer to a block of further BPs
10564 ;(in user memory) to use after this one is exhausted.
10568 UMOVE H,(R) ;Fetch the word the BP points to.
10570 HRRI R,H ;Change the BP to point to H.
10571 LDB H,R ;Extract the desired byte.
10574 AOBJP Q,CPOPJ ;When one BP is exhausted, go to the next (if any).
10579 NOPEN: HRRZ R,A ;ARGS 1 MODE (LH) CHNL (RH) 2-5 LIKE NOPEN1 1-4
10591 SOS W ;STRIP OF FIRST ARG
10592 POP P,D ;B-E POPPED INTO A-D
10596 POP P,R ;A POPPED INTO R
10601 JRST OPNL12 ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10603 MOVEM D,SRN3(U) ;MAKE SYMBOLIC OPEN OF NETWORK WIN USING 5TH ARG AS FOREIGN HOST.
10604 NDEL1: CLEARM SRN4(U)
10605 NRN2: CLEARM SRN5(U)
10606 NOPENX: TRNE R,-NIOCHN
10608 HRRZM R,UUAC(U) ;CHNL # (MAYBE ONLY FOR ERRS) IN R
10613 ;DEFAULT THE ARGS FOR .CALL OPEN, ETC,; PUT MODE IN E.
10614 NOPEN1: SETZM EPDL(U)
10617 MOVSI B,(SIXBIT /@/)
10619 MOVSI C,(SIXBIT /@/)
10621 MOVE D,USYSNM(U) ;SYSTEM NAME
10622 HLRZ E,R ;GET MODE BITS FOR TRAN.
10625 ;MAKE LINK 1-4 AS NOPEN1, 5 SNAME 2 6,7 FN1,2(2)
10626 NMLINK: MOVSI R,200000
10627 CAIN W,2 ;Only 2 args are BPs.
10628 JRST [ PUSHJ P,2FNPRS
10630 CAIGE W,7 ;Otherwise, must be seven word of sixbit.
10638 NDEL: SETZM SRN3(U)
10641 CAIN W,1 ;If it's just a BP (or block of them),
10642 JRST [ MOVE R,A ;Parse it into filenames in A-D.
10647 MOVSI R,400000 ;DELETE, ARGS AS NOPEN1
10651 NRNAM: MOVSI R,400000
10652 CAIN W,2 ;Only 2 args are BPs.
10653 JRST [ PUSHJ P,2FNPRS
10655 CAIGE W,6 ;Otherwise, must be six word of sixbit.
10659 MOVSI R,400000 ;RENAME 1-4 AS NOPEN1 5,6 NEW FN1,2
10663 ;Parse two BPs (or aobjn pointers to blocks of BPs) into user memory
10664 ;into filenames. The second bunch go in SRN3 - SRN5; the first in A - D.
10665 ;The two args are saved in EPDL and EPDL3. Clears E, preserves R.
10667 MOVEM A,EPDL(U) ;Save two BPs for job device.
10669 PUSH P,A ;Decode the second BP first, to get the new names.
10672 MOVEM B,SRN3(U) ;Stick them where RENAME looks.
10675 POP P,R ;Parse the first BP, to get the old file filenames.
10681 ;Takes either channel, FN1 (sixbit) and FN2 (sixbit)
10682 ;or channel and BP (or aobjn -> block of BPs).
10683 NRNWO: SETZM EPDL(U)
10687 PUSHJ P,[MOVE R,B ;If channel and BP, parse the BP into filenames.
10688 MOVEM R,EPDL3(U) ;But also save it for job device.
10690 MOVEM B,SRN3(U) ;PUT AWAY NEW NAMES.
10693 ANDI C,-1 ;We call "RENAME" with old fn2 = channel number.
10696 MOVSI R,400000 ;OPNCOM IS .FDELE .
10700 SUBTTL HACKS FOR OPENS THAT LOSE
10703 IFN 0,[ ;THESE "DEFNS" EXIST ONLY SO @ WILL CREF THEM
10704 OPNL1: OPNL2: OPNL3: OPNL4: OPNL5: OPNL6: OPNL7:
10705 OPNL10: OPNL11: OPNL12: OPNL13: OPNL14: OPNL15: OPNL16: OPNL17:
10706 OPNL20: OPNL21: OPNL22: OPNL23: OPNL24: OPNL25: OPNL26: OPNL27:
10707 OPNL30: OPNL31: OPNL32: OPNL33: OPNL34: OPNL35: OPNL36: OPNL37:
10708 OPNL40: OPNL41: OPNL42: OPNL43: OPNL44: OPNL45: OPNL46: OPNL47:
10709 OPNL50: OPNL51: OPNL52: OPNL53: OPNL54: OPNL55: OPNL56: OPNL57:
10710 OPNL60: OPNL61: OPNL62: OPNL63: OPNL64: OPNL65: OPNL66: OPNL67:
10711 OPNL70: OPNL71: OPNL72: OPNL73: OPNL74: OPNL75: OPNL76: OPNL77:
10714 ;HERE ARE THE REAL DEFNS
10715 REPEAT NOPNLS,CONC OPNL,\.RPCNT+1,: JSP D,OPENL
10717 OPENL: CONSZ PI,77400
10718 BUG ;ERROR WITH PI IN PROGRESS
10719 MOVE U,USER ;BE SURE U=CURRENT USER'S INDEX
10720 MOVEI D,-OPNL1(D) ;GET LOSSAGE NUMBER
10721 MOVE R,SYSCVL(U);POSSIBLY RETURN IN ERROR-CODE ARG TO .CALL
10724 HRRZ R,UUAC(U) ;GET CH NUM
10727 PUSHJ P,LSWCLR ;UNLOCK SWITCHES
10728 DPB R,[BCHPTR] ;SAVE AS MOST RECENT CHANNEL IN ERR
10729 ADD R,U ;RELOCATE TO POINT TO USER VARS
10730 DPB D,[220600,,IOCHST(R)] ;STORE IN STATUS WORD
10733 SUBTTL RCHST, STATUS, RFNAME, RFPNTR, WHYINT CALLS
10736 ;1ST ARG IS A <JOB>, WHOSE CHANNEL IS TO BE LOOKED AT.
10737 ;2ND ARG IS A CHANNEL NUMBER.
10738 ;3RD ARG IS BP TO STORE ASCIZ FILENAME STRING THROUGH.
10739 ;4TH ARG IS MAXIMUM NUMBER OF CHARACTERS TO STORE (DEFAULTS TO 1,,0).
10740 ;ONLY 1 ARG => IT IS CHANNEL #, AND JOB IS "SELF".
10741 ;FIRST 4 VALUES ARE THE DEVICE, FN1, FN2 AND SNAME
10742 ; AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10743 ;FIFTH VALUE IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN
10745 NRFNAM: MOVE J,A ;FIRST ARG IS JOB SPEC
10747 SKIPA A,B ;GET CHANNEL # INTO A IN EITHER CASE
10748 MOVEI J,%JSELF ;IF ONLY ONE ARG, JOB SPEC IS SELF
10749 MOVE Q,C ;SAVE BP FOR STORING ASCIZ FILENAME STRING - IF ANY.
10754 JSP T,NCORUI ;DECODE JOB SPEC
10758 JRST OPNL34 ;PDP6 DOESN'T HAVE CHANNELS
10763 MOVE U,J ;LOOK IN THAT JOB'S CHANNELS
10764 PUSHJ P,NRFNM1 ;GET THE CRUFT
10766 PUSHJ P,LSWPOP ;UNSOS DIELOK.
10769 POP P,I ;I GETS 4TH ARG: MAX NUMBER OF CHARS TO STORE IN STRING.
10770 JUMPE T,POPJ1 ;IF DEVICE ROUTINE HAS CLEARED Q, IT HAS STORED THE STRING.
10771 ;NOTE NETRCH PUTS AN EXTRA VALUE FOR .RCHST (GARBAGE, TO US) IN Q!
10772 JUMPE Q,POPJ1 ;IF BP ARG WAS 0, CALLER DOESN'T WANT A STRING.
10776 MOVE J,A ;IF SO, STORE ALL 4 FILENAMES DOWN IT, ONE BY ONE.
10790 ;STORE THE SIXBIT WORD IN J FOLLOWED BY THE ASCII CHAR IN T
10791 ;INTO USER ADDRESS SPACE DOWN THE BP IN Q.
10792 NRFNS1: JUMPE J,CPOPJ ;OUTPUT NOTHING AT ALL IF THE SIXBIT WORD IS EMPTY.
10793 CAIGE I,4 ;GIVE UP NOW IF TOO CLOSE TO END OF ALLOCATED SPACE.
10796 ROTC J,6 ;ELSE GET NEXT CHAR IN R, AND CONVERT TO ASCII AND STORE.
10799 CAIE R,": ;PRECEDE ANY SPECIAL CHARACTERS WITH ^Q.
10813 PUSHJ P,NRFNSB ;IF NAME FINISHED BUT NOT EMPTY, FOLLOW BY TERMINATOR.
10818 PUSHJ P,NRFNSB ;IF TERMINATOR IS : OR ;, FOLLOW IT WITH A SPACE.
10821 ;STORE A BYTE IN TT DOWN BP IN Q TO USER SPACE, INCREMENTING FIRST.
10822 ;XCTR XBYTE LOSES BECUSE IT GETS THE BP FROM USER SPACE.
10834 ;GET THE FILENAMES FOR THE CHANNEL IN A OF JOB IN U INTO A THRU D.
10835 ;IF Q IS NONZERO, IT IS A BP TO STORE AN ASCIZ STRING, AND W IS THE
10836 ;MAX NUMBER OF CHARACTERS TO STORE.
10837 ;THE DEVICE DEPENDENT ROUTINE CAN STORE THE STRING ITSELF
10838 ;AND SET Q TO ZERO SO THAT IT WILL NOT BE STORED THE STANDARD WAY.
10839 NRFNM1: MOVE T,[4,,NRFNM2]
10840 JRST CHNDCD ;R GETS ADDR OF IOCHNM WD, H GETS CONTENTS.
10841 NRFNM2: HLRZ A,H ;PUT LH(IOCHNM WD) WHERE DEVICE RTN LOOKS
10843 JUMPG J,[ ;IF 6-LETTER DEVICE NAME, LH IS POSITIVE ADDRESS
10844 HLRZS J ;OF FULL NAME. NOTE THERE BETTER BE NO
10845 MOVE J,(J) ;3-CHAR DEVICES WHOSE NAME DOES NOT START
10846 JRST .+1 ] ;WITH A LETTER.
10847 PUSH P,J ;SAVE THE PROBABLE VALUE OF DEVICE NAME
10848 LDB J,[1400,,DCHSTB(H)]
10849 HLRZ J,DRFNTB(J) ;GET RFNAME ROUTINE POINTER
10850 SETZB B,C ;FN1, FN2 ARE 0 FOR NON-DIR-DEV
10851 SETZ D, ;SNAME IS 0 FOR NON-MULTI-DIR-DEV
10852 LDB E,[.BP (%IOTOM),IOTTB(H)] ;PROBABLE VALUE OF MODE
10853 PUSHJ P,(J) ;CALL DEVICE-SPECIFIC ROUTINE
10854 SKIPA A,(P) ;NO SKIP => USE DEVICE NAME FROM DCHSTB
10855 MOVE A,J ;SKIP => USE DEVICE NAME RETURNED IN J
10859 ;ARG 1 - CHANNEL NUMBER
10860 ;VAL 1 - ACCESS POINTER OF CHANNEL
10861 ;VAL 2 - BYTE SIZE OF CHANNEL.
10862 ;FAILS IF NOT A RANDOM-ACCESS DEVICE
10864 NRFPNT: HLRZ A,H ;CHANNEL ALREADY DECODED, SET UP LH(IOCHNM) FOR DEV RTN
10865 LDB J,[1400,,DCHSTB(H)]
10866 HRRZ J,DRFNTB(J) ;GET RFPNTR ROUTINE POINTER
10867 JRST (J) ;IT SHOULD PUT POINTER IN A AND POPJ1, OR OPNL34
10869 ;SYMBOLIC CALL "RCHST"
10870 ;1ST ARG IS A CHANNEL NUMBER.
10871 ;6 OR MORE VALUES. THE FIRST 4 ARE THE DEVICE, FN1, FN2 AND SNAME
10872 ; AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10873 ;THE 5TH IS THE ACCESS POINTER, OR -1 IF NOT RANDOM ACCESS.
10874 ;THE 6TH IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN.
10875 ;MORE VALUES ARE RETURNED ONLY FOR NET:, AT THE MOMENT.
10876 ;THE DEV SUBROUTINE MAY PUT EXTRA RESULTS IN TT, I, AND Q, AND PUT # RESULTS INTO W
10878 NRCHST: SETO I, ;DEFAULT POSSIBLE EXTRA RESULTS
10879 SETO TT, ;DEFAULT ACCESS POINTER TO -1
10880 MOVEI W,6 ;NORMAL NUMBER OF RESULTS IS 6
10882 PUSHJ P,NRFNM1 ;GET RESULTS 1 THROUGH 4 AND 6, AND SET UP R AND H
10883 POPJ P, ;CHANNEL NUMBER MUST HAVE BEEN BAD
10885 PUSH P,B ;SAVE THE AC THAT RFPNTR CLOBBERS.
10886 HLRZ A,H ;GET ROUTINE TO GET ACCESS POINTER
10887 LDB J,[1400,,DCHSTB(H)]
10888 HRRZ J,DRFNTB(J) ;ROUTINE BETTER PRESERVE B,C,D,E,TT,I,Q
10889 CAIL J,OPENL ;KLUDGILY SKIP IF WOULD OPEN-LOSS
10890 PUSHJ P,(J) ;GET ACCESS POINTER IN A, ALWAYS SKIPS
10891 MOVE A,TT ;NOT RANDOM ACESS, USE DEFAULT VALUE
10892 MOVE TT,E ;OPEN MODE IS 6TH RESULT
10893 MOVE E,A ;ACCESS POINTER IS 5TH RESULT
10896 ;.RCHST AC, WITH AC/ CH,,ADDR
10897 ;RETURNS, IN THE 5 OR MORE WORDS STARTING AT ADDR,
10898 ;THE RESULTS OF A SYMBOLIC RCHST ON CHANNEL CH.
10899 ;EXCEPTION - THE DEVICE NAME IS RETURNED IN THE RH
10900 ;OF THE FIRST WORD , SO IT IS TRUNCATED TO 18 BITS.
10901 ;EXCEPTION - THE OPEN MODE VALUE IS NOT RETURNED. LATER VALUES
10902 ;ARE SHIFTED DOWN ONE WORD.
10905 ARCHST: UMOVE J,(J) ;GET CONTENTS OF AC
10908 JRST ILUUO ;BAD CHANNEL NUMBER
10910 PUSHJ P,NRCHST ;DO THE REAL WORK.
10911 BUG ;ONLY ERROR RETURN SHOULD BE BAD CHANNEL NUMBER
10912 HLRZS A ;PUT DEV NAME IN RH FOR HISTORY'S SAKE
10913 POP P,J ;RH(J) HAS PLACE TO STORE DATA
10915 MOVE I,Q ;SHIFT DOWN LAST 2 VALS OVER THE OPEN MODE.
10917 ADDI W,-2(J) ;W HAD 1+ # VALS, NOW HAS PLACE TO PUT LAST ONE
10918 XCTR XBW,[BLT J,(W)]
10921 ;.STATUS CH,LOC ;STORE IN LOC THE STATUS OF CHANNEL CH
10922 ;AND OF THE DEV OPEN ON IT IF ANY
10923 ;1.1-1.6 SYS PERIPHERAL DEVICE CODE
10924 ;1.7-2.9 DEVICE DEPENDENT
10925 ;3.1-4.9 LH(IOCHST)
10927 ASTATUS:ADDI R,IOCHNM(U) ;SET UP AC'S LIKE CHNDCD
10928 ASTAT1: MOVE H,(R) ;ENTER HERE FROM .USET [.RIOS,,]
10930 PUSHJ P,NSTATUS ;CALL NEW SYSTEM CALL VERSION
10932 UMOVEM A,(C) ;GIVE TO USER
10936 ;ARG 1 - CHANNEL NUMBER
10937 ;VAL 1 - SAME AS .STATUS
10939 NSTATUS:HLRZ A,H ;SET UP LH(IOCHNM)
10940 LDB D,[140600,,DCHSTB(H)] ;GET SYS PERIPHERAL DEVICE CODE
10941 LDB J,[340300,,IOTTB(H)] ;GET I/O CHANNEL MODE FROM 4.5-4.2
10942 DPB J,[060300,,D] ;RETURN IN BITS 1.9-1.7
10943 LDB J,[1400,,DCHSTB(H)]
10944 HLRZ J,DSTSTB(J) ;GET STATUS ROUTINE POINTER
10945 PUSHJ P,(J) ;ROUTINE FILLS OUT STATUS WORD IN D
10946 HLL D,IOCHST-IOCHNM(R) ;FILL IN LEFT HALF FROM IOCHST
10947 TLZ D,740000 ;CLEAR BITS USED FOR CHANNEL NUM ON IO PDL
10948 MOVE A,D ;RETURN VALUE IN A
10949 JRST POPJ1 ;THIS CALL ALWAYS SUCCEEDS
10952 ;ARG 1 - CHANNEL NUMBER
10953 ;VAL 1 - %WY CODE FOR TYPE OF DEVICE
10954 ;ADDITIONAL VALUES DEVICE-DEPENDENT
10955 ;THIS IS THE USUAL CALL TO GIVE IN RESPONSE TO A SECOND WORD INTERRUPT
10957 NWHYINT:HLRZ A,H ;SET UP LH(IOCHNM)
10958 LDB J,[1400,,DCHSTB(H)]
10959 HRRZ J,DSTSTB(J) ;GET WHYINT ROUTINE POINTER
10962 ;DEVICE-SPECIFIC RFNAME/RCHST ROUTINES
10963 ;CALLED WITH STANDARD CHNDCD STUFF IN H AND R, LH(IOCHNM) IN A
10964 ;MUST PRESERVE H AND R; CAN CLOBBER W TO INDICATE EXTRA STUFF FOR RCHST
10966 RCHUSR: MOVE B,UNAME(A) ;GET UNAME
10967 MOVE C,JNAME(A) ;GET JNAME
10970 IFN NUNITS,[ ;UTAPE .RCHST
10971 RCHUTP: HRRZ C,UTTNO(A)
10972 MOVSI J,'UT0(C) ;GET REAL DEV NAME "UTN" IN J
10973 AOS (P) ;SKIP TO RETURN CHANGED DEV NAME
10974 MOVE D,UTASS(C) ;THE "SNAME" IS THE USER TAPE IS ASSIGNED TO.
10977 MOVE B,UTN1(A) ;OUTPUT, GET FN1
10978 MOVE C,UTN2(A) ;NOW FN2
10981 ;UTAPE INPUT .RCHST
10982 RCHUTI: LDB T,[220500,,UTDBC(A)] ;GET FILE NUMBER
10984 LSH T,1 ;TURN INTO INDEX INTO DIRECTORY
10986 ADD T,UDIRO(C) ;GET POINTER TO FILE NAMES
10987 MOVE B,(T) ;GET FN1
10988 MOVE C,(T) ;GET FN2
10992 ;RCHST ROUTINE FOR TTY
10994 ANDI J,#%TICNS#(.BM $TIIDX)
10995 IOR E,J ;MERGE TTY OPEN MODE BITS WITH THE GENERAL ONES.
11004 HRLZS J ;J NOW HAS SIXBIT/TNM/, NM = TTY #.
11005 JRST POPJ1 ;SKIP TO SAY DEV NAME IS IN J.
11007 ;RCHST ROUTINE FOR STY
11008 RCHSTY: MOVE J,TTYOPT(A)
11010 IORI E,4 ;STY BIT 1.3 => TTY IS HALF-DUPLEX.
11011 MOVE J,STYSTS-NFSTTY(A)
11013 IORI E,20 ;BIT 1.5 => WANT TO RECEIVE %TDORS ON .RESET OF TYOC,
11014 TRNN E,1 ;FIND THE DON'T-HANG-BIT FOR THIS DIRECTION.
11015 TLZA J,#%SSOHG ;AND FLUSH THE ONE FOR THE OTHER DIRECTION.
11017 TLNE J,-1 ;THEN TESTING BOTH TESTS ONLY THE RELEVANT ONE.
11026 RCHDRH: HRRZ A,IOCHST-IOCHNM(R) ;TRACK NUMBER
11027 IMULI A,LMNBLK ;DIRHNG DEVICE RFNAME
11028 ADDI A,2000-LMNBLK*NUDSL
11033 ;RCHST ROUTINE FOR DIRECTORY CHANNELS AND THE ERR DEVICE.
11034 RCHDIR: MOVE T,DSKLST(A) ;GET THE TYPE OF DIRECTORY CODE.
11035 SKIPE J,UDUSR(A) ;IF DEVICE # IS NONZERO, ADD IT TO DEV NAME
11036 HRLZS J ;(ONLY HAPPENS FOR UTAPE)
11037 ADD J,RCHDRD-1(T) ;DETERMINE DEV NAME FROM DIRECTORY TYPE
11038 MOVE B,RCHDR1-1(T) ;SAME FOR FN1
11039 SKIPN C,RCHDR2-1(T) ;AND FN2, EXCEPT 0 FOR ERR DEVICES
11040 MOVE C,UUDPP(A) ; SO WE WILL GET THE STATUS WORD BEING DECODED.
11042 MOVE D,UDSYSN(A) ;FOR DISK UFD'S, GET THE SNAME
11043 JRST POPJ1 ;RETURN, SAYING WE HAVE SPEC'D THE DEVICE NAME.
11045 .SEE UDT ;THESE TABLES ARE IN PARALLEL WITH UDT
11046 RCHDRD: 'UT0,, ? 'CLU,, ? 'DSK,, ? 'DSK,,
11047 'ERR,, ? 'TTY,, ? 'COR,,
11048 IF2 IFN .-UDTLN-RCHDRD,.ERR RCHDRD WRONG LENGTH
11050 RCHDR1: '.FILE. ? '.FILE. ? '.FILE. ? 'M.F.D.
11051 3 ? '.FILE. ? '.FILE.
11052 IF2 IFN .-UDTLN-RCHDR1,.ERR RCHDR1 WRONG LENGTH
11054 RCHDR2: SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(FILE)/
11055 0 ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/
11056 IF2 IFN .-UDTLN-RCHDR2,.ERR RCHDR2 WRONG LENGTH
11060 ;CORE LINK .RCHST ROUTINE
11062 RCHCLO: CONO PI,CLKOFF
11063 MOVE B,CLN1(A) ;GET FN1
11064 MOVE C,CLN2(A) ;GET FN2
11065 MOVE D,CLSYN(A) ;GET SYSTEM NAME
11068 ;RFNAME ROUTINE FOR DSK
11070 RCHQSK: MOVE H,QUDPR(A) ;FILE STATUS FOR DISK PICKUP USER DIR POINTER
11071 PUSHJ P,QUDLK ;LOCK DIRECTORY
11072 MOVE C,QSNLCN(H) ;LOCATION OF DIRECTORY
11074 ADD C,QUDFPR(A) ;ADD LOCN OF FILE WITHIN DIRECTORY
11075 MOVE B,(C) ;GET FIRST FILE NAME
11076 MOVE C,1(C) ;GET SECOND FILE NAME
11080 TRO E,20 ;LINK MODE
11081 MOVE H,(R) ;PRESERVE H
11084 ;RFNAME ROUTINE FOR BOJ:
11086 RCHBOJ: CONO PI,CLKOFF ;BOJ DEVICE .RCHST ROUTINE
11087 MOVE T,JBCUI(A) ;RETURNS CREATOR'S NAME
11091 SETZB B,C ;CREATOR GONE, RETURN BLANK NAMES
11094 ;RFNAME ROUTINE FOR JOB:
11106 ;COPY THE BOJ JOB'S ASCIZ FILENAME STRING INTO OUR CALLER'S STRING.
11107 ;THE CALLER'S BP IS IN Q, AND HIS MAX CHARS TO STORE IS IN W.
11108 RFNJ1: SKIPN B,JBFNP(A)
11113 AOS DIELOK(J) ;PREVENT THE JOB FROM DIEING.
11120 ;D HAS BP TO FETCH WITH, POINTING INTO C, WHICH CONTAINS WORD FETCHED FROM BOJ JOB.
11121 ;RH(B) HAS ADDR OF NEXT WORD TO FETCH FROM THE BOJ JOB.
11122 ;TT CONTAINS THE PREVIOUS CHARACTER TRANSFERRED, OR 1
11123 ;IF THE PREVIOUS CHARACTER WAS QUOTED WITH A ^Q.
11125 TRNN D,#C ;IF THE BP IN D ADVANCES PAST C,
11127 PUSHJ P,RFNJ3 ;FETCH ANOTHER WORD INTO C, MAKE D POINT THERE AGAIN,
11128 LDB E,D ;AND FETCH THE SAME BYTE OVER AGAIN.
11129 RFNJ4: SOJL W,RFNJ5
11131 PUSHJ P,NRFNSB ;STORE BYTE INTO CALLER, UNLESS HIS STRING IS FULL.
11133 CAIN TT,^Q ;A QUOTED CHAR DOES NOT TERMINATE AND DOES NOT QUOTE.
11136 JUMPN E,RFNJ2 ;STOP STORING AFTER A NULL WHICH ISN'T QUOTED.
11142 ;READ THE NEXT WORD (ADDR IN B) FROM THE BOJ JOB.
11149 PUSHJ P,UPLC ;LOOK UP THE BOJ JOB'S PAGE.
11153 LDB J,T ;IF IT DOESN'T EXIST, LOAD A ZERO,
11154 JUMPE J,RFNJ6 ;AVOID GETTING MPV.
11163 RFPUSR: HRRZ A,IOCHST-IOCHNM(R) ;GET THE ACCESS PTR
11164 MOVEI B,36. ;BYTE SIZE IS ALWAYS FULL WORD.
11169 RFPQSK: LDB B,[QSBSIZ(A)] ;GET FILE BYTE SIZE
11171 TDNN T,QSRAC(A) ;IF .ACCESS WAS DONE AND NOT HANDLED,
11173 MOVE A,QRADAD(A) ;GET WHAT THE .ACCESS SPECIFIED.
11176 RFPQS1: MOVE J,QFBLNO(A) ;GET BYTE # OF STRAT OF CURRENT BLOCK.
11177 SKIPGE QSMDN(A) ;SKIP ON A BUFFER ACTIVE
11178 JRST RFPQS2 ;NONE ACTIVE => QFBLNO POINTS TO NEXT BLOCK TO BE READ.
11179 ADD J,QMPBSZ(A) ;ELSE CORRECT FOR THE NUMBER OF BYTES WE'VE PROCESSED
11180 SUB J,QSMPRC(A) ;IN THE ACTIVE BLOCK (QFBLNO -> 1ST WD OF BLOCK).
11184 SUBTTL RESET,IOPUSH,IOPOP,IOPDL,FORCE,FLUSH .CALLS
11186 ;.RESET CH, ;RESET BUFFERED INFO ON CHANNEL CH
11187 ;NOT IMPLEMENTED FOR MANY DEVICES
11188 ;HAS SPECIAL EFFECTS ON "USR" DEVICE
11190 ;ARG 1 - CHANNEL NUMBER
11194 ARESET: HRRZ A,(R) ;PICK UP INDEX FROM I/O CH WORD
11195 SKIPA T,[HRRZ T,RSTB1(A)] ;.RESET USES RH OF TABLE
11196 AIOPP1: MOVE T,[HLRZ T,RSTB1(A)] ;.IOPUSH, .IOPOP USE LH OF TABLE
11197 IDIVI A,7 ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11198 ADD A,[440500,,RSTB]
11201 LDB A,A ;GET BYTE FROM TABLE
11202 XCT T ;GET REAL TABLE ENTRY IN T
11205 ;IO CHANNEL PUSH DOWN LIST ROUTINES
11206 ;C(I) =0 AT DSP => IOPUSH =1 => IOPOP
11209 AIOPUSH:MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11210 CAML T,[LUIOP-1,,0] ;LUIOP-2,,<ptr> is OK, leaves room for 1 more.
11211 JRST IOCER6 ;OVER PUSH ERROR
11212 PUSH T,(R) ;PUSH CURRENT IOCHNM
11213 PUSH T,IOCHST-IOCHNM(R) ;&IOCHST
11216 DPB J,[400400,,(T)] ;STORE CHANNEL NUM FOR POSSIBLE USE BY AIOPDL
11217 MOVEM T,SIOCP(U) ;STORE BACK PDL POINTER
11218 MOVEI I,0 ;INDICATE IOPUSH
11220 PUSHJ P,AIOPP1 ;CALL DEVICE'S IOPDL HANDLER. SHOULD NOT HANG
11222 SETZM (R) ;CLEAR OUT IOCHNM
11223 SETZM IOCHST-IOCHNM(R) ;&IOCHST
11227 AIOPOP: PUSHJ P,ACLOSE ;CLOSE WHATEVER MAY BE OPEN ON CHANNEL POPPING INTO
11228 MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11230 JRST IOCER5 ;OVER POP ERROR
11231 POP T,IOCHST-IOCHNM(R) ;POP BACK IOCHST
11234 SETZM 1(T) ;CLEAR OUT PDL WORD TO AVOID CONFUSION IN
11235 ;ROUTINES THAT GROVEL OVER I/O PDL
11236 MOVEM T,SIOCP(U) ;STORE BACK PDL POINTER
11237 MOVEI I,1 ;INDICATE IOPOP
11238 JRST AIOPP1 ;CALL DEVICE'S IOPDL HANDLER
11240 AIOPDL: MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11241 TLNN T,-1 ;SKIP UNLESS IO PDL EMPTY
11243 LDB R,[400400,,(T)] ;FIND OUT WHAT CHNL TOP ENTRY WAS PUSHED FROM
11245 PUSHJ P,AIOPOP ;POP BACK INTO CHNL PUSHED FROM
11248 IIOPPR: JUMPE I,[JRST 4,CPOPJ] ;IOPUSH
11249 SETZM (R) ;CLOSE CHANNEL
11250 SUBI R,IOCHNM(U) ;GET CHANNEL NUMBER
11251 MOVE R,CHNBIT(R) ;SECOND WORD INTERRUPT BIT
11252 IORM R,IFPIR(U) ;GIVE TO USER
11256 ;ARG 1 - CHANNEL NUMBER
11257 ;IF ANY OUTPUT IS BUFFERED UP, CAUSES IT TO BE SENT TO THE DEVICE
11258 ;(IF FORCE WAS NOT DONE, IT MIGHT NOT BE SENT UNTIL A COMPLETE
11259 ;BUFFERFULL HAD BEEN OUTPUT BY THE USER.)
11261 NFORCE: SKIPA T,[HLRZ T,DFRCTB(D)] ;FORCE USES LH OF TABLE
11262 NFINI1: MOVE T,[HRRZ T,DFRCTB(D)] ;FINISH USES RH OF TABLE
11263 HLRZ A,(R) ;PASS LH(IOCHNM) TO DEVICE ROUTINES
11264 HRRZ D,(R) ;USE RH(IOCHNM) AS BYTE INDEX INTO RSTB
11265 IDIVI D,7 ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11266 ADD D,[440500,,RSTB]
11269 LDB D,D ;GET BYTE FROM TABLE
11270 XCT T ;GET REAL TABLE ENTRY IN T
11274 ;ARG 1 - CHANNEL NUMBER
11275 ;FIRST DOES A FORCE, THEN WAITS FOR ALL OUTPUT TO GET TO THE DEVICE
11277 NFINIS: PUSHJ P,NFORCE ;CALL DEV ROUTINE FOR FORCING
11279 JRST NFINI1 ;THEN CALL DEV ROUTINE FOR WAITING
11281 ;.NETS CH, - UUO VERSION OF .CALL FORCE.
11282 ANETS: PUSHJ P,NFORCE
11283 JRST IOCER1 ;ILLEGAL HARDWARE OPERATION
11286 SUBTTL I/O DEVICE DISPATCH TABLES
11289 This page tries to document the ITS I/O device dispatch tables and
11290 dispatch environment. It is not completed yet.
11292 The tables use several different indices, which are:
11293 opnidx - result of device name lookup in DEVTAB
11294 ioidx - result of OPEN; has symbolic values. This is the index
11295 stored in RH of IOCHNM (per-job channel table)
11296 sidx - secondary index from DCHSTB(ioidx)
11297 ridx - secondary index from RSTB(ioidx)
11299 The following system calls are dispatched through these tables.
11300 There are 11 dispatch routines that each device must specify.
11301 The format is "CALL [table name(index-used) -> device-routine]"
11303 OPEN [DEVADR(opnidx) -> devO]
11304 "opnidx" is looked up from DEVTAB which holds the device names.
11305 The device's OPEN routine is in the RH of DEVADR.
11306 It must set up the user's IOCHNM word for the channel,
11307 by setting the RH to the right "ioidx" and the LH to whatever
11312 CLOSE [CLSTB(ioidx) -> devCLS]
11313 The device's CLOSE routine is in the RH of CLSTB.
11314 It must zero the user's IOCHNM word for the channel.
11318 IOT, SIOT [IOTTB(ioidx) -> devVarious]
11319 These routines do I/O transfers. The main reason "ioidx"
11320 has so many possible values (causing IOTTB to be large) is
11321 because lots of devices specify different ioidx's for different
11322 modes - input/output, block/unit, image/ascii, etc - in order
11323 to speed up actual I/O transfers, which are probably the most
11324 common device-related system calls.
11328 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 CHAOSP,CHAIDN:: REPEAT 2, CHACLS ;CHAOS NET
11386 DNUACII:: REPEAT 3,[
11387 %CLSDI,,UTICL ;UTAPE.
11390 IFN OLPTP,LPTDN:: REPEAT 2, LPTCLS ;LPT
11395 IFN GLPTP,GLPTDN:: REPEAT 2, GLPCLS
11396 DIRCHN:: REPEAT 4, UTDCLS ;DIRECTORY DEVICE
11397 IFN VIDP,NVIDOP:: REPEAT 2, NVDCLS ;NVIDI
11398 IFN PLTP,PLTDN:: REPEAT 2, %CLSNR,,PLTUSR ;PLOTTER
11400 PTPI:: REPEAT 5, %CLSNR,,PTPUSR ;PAPER TAPE PUNCH
11402 IFN IMXP,IMPXDN:: REPEAT 4, IMPXCL ;IMX
11403 IFN OMXP,OMPXDN:: REPEAT 4, OMPXCL ;OMX
11404 DCLUAI:: %CLSCL,,CLCLRA ;CORE LINK
11411 REDUAI:: REPEAT 5, PTRCLS ;PAPER TAPE READER
11414 DN340B:: REPEAT 4, ADCL1 ;340
11418 CODDN:: REPEAT 2, CODCLS ;CODE DEV
11420 DQUAI:: %CLSQ ,,QICL ;DISK
11426 IFN VIDP,DNVDIU:: REPEAT 4, TVCCLS ;TVC
11427 IFN PDP6P,PDPUIO:: REPEAT 4, %CLS6 ,,PDPCLS ;USR IN PDP10 MODE
11428 IFN TABP,DTABUI:: REPEAT 2, %CLSNR,,TABUSR ;TABLET
11430 MTUAIX:: REPEAT 3, MTICL ;MAG TAPE
11434 %CLSJI,,JOBCLS ;JOB DEVICE
11437 BDUAI:: REPEAT 6, %CLSBJ,,CPOPJ ;BOJ
11438 IIOPOP:: [JRST 4,CPOPJ] ;INTERRUPT ON IOPOP DEVICE
11440 STYDUI:: REPEAT 2,[ ;PSEUDO TTY
11444 IFN NCPP,NETDUI:: REPEAT 4, NETCLS ; Arpanet NCP
11445 IFN TCPP,TCPDUI:: REPEAT 4, TCPCLS ; Internet TCP
11446 IFN INETP,IPQDN:: IPQCLS ; Internet Queue
11447 IFN MSPP,MSPIO:: MSCLOS ;MESS SWITCHER (DM)
11448 IFN STKP,STKDP:: STKCLS ;STANFORD KEYBOARD
11449 IFN NTYP,NTYIT:: REPEAT 4, NTYCLS ;A KLUDGE ON THE NTY
11451 IF2,IFN .-CLSTB-LIOTTB,.ERR BARF AT CLSTB
11453 ;DISPATCH TABLE FOR .IOT UUO
11454 ;TRANSFERED THROUGH USING RIGHT HALF OF I/O CHANNEL WORD AS AN INDEX
11456 %IOTBK==400000 ;4.9 = 1 => BLOCK = 0 => UNIT
11457 %IOTOT==200000 ;4.8 = 1 => OUTPUT = 0 => INPUT "
11458 %IOTBP==100000 ;4.7 = 1 => THERE IS A SPECIAL ROUTINE FOR SIOT,
11459 ;AND ITS ADDRESS IS -1 + RH(IOTTB WORD).
11460 %IOTSP==40000 ;4.6 => THIS DEVICE IS FUNNY. SIOT ISN'T ALLOWED,
11461 ;AND IOT LETS THE DEVICE RTN DO ALL THE WORK.
11462 ;PRESENT ONLY FOR UNIT INPUT MODES.
11463 %IOT10==20000 ;4.5 => THIS CHANNEL WAS OPENED WITH BIT 1.4 SET IN MODE
11464 %IOTIM==10000 ;4.4 => THIS CHANNEL WAS OPENED WITH BIT 1.3 (IMAGE MODE) SET IN MODE
11465 ; 4000 ;4.3 COPIES %IOTBK. THUS, BITS 4.5-4.2 REFLECT THE BOTTOM 4 BITS
11466 ; 2000 ;4.2 COPIES %IOTOT. OF THE OPEN-MODE.
11467 %IOTOM==36000 ;BITS 4.5 - 4.2
11469 %IOTBO==606000 ;BLOCK OUTPUT.
11470 %IOTBI==404000 ;BLOCK INPUT.
11471 %IOTUO==202000 ;UNIT OUTPUT.
11472 %IOTUI==000000 ;UNIT INPUT.
11476 TYIDN:: %IOTUI,,TYI ;TTY ENTRIES MUST BE COMPACT
11477 TYIBN:: %IOTBI,,TTYBI
11478 TYODN:: %IOTUO,,TYO (%IOTBP)
11479 TYOBN:: %IOTBO,,TTYBO ;LAST TTY DEVICE
11480 NLIDN:: %IOTUI,,NULI
11481 NLBIDN:: %IOTBI,,NULBI
11482 NLODN:: %IOTUO,,CPOPJ
11483 NLBDN:: %IOTBO,,NULBOD
11484 UWIDN:: %IOTUI,,UWI (%IOTIM)
11485 UBIDN:: %IOTBI,,UBI
11486 UWODN:: %IOTUO,,UWO (%IOTIM)
11487 UBODN:: %IOTBO,,UBO
11488 FUWIDN:: %IOTUI,,UWI (%IOT10)
11489 FUBIDN:: %IOTBI,,UBI (%IOT10)
11490 DNDIRH:: %IOTUI,,IOCR10
11492 DNLCK:: %IOTUO,,IOCR10
11494 CHAIDN:: %IOTUI+%IOTBP,,CHAUI
11495 CHAODN:: %IOTUO+%IOTBP,,CHAUO
11498 DNUACII:: %IOTUI,,UASCII
11499 DNUACCO:: %IOTUO,,UASCCO
11500 DNUBKI:: %IOTBI,,UBLKI
11501 DNUBKO:: %IOTBO,,UBLKO
11502 DNUDTI:: %IOTUI,,UDATAI (%IOTIM)
11503 DNUDTO:: %IOTUO,,UDATAO (%IOTIM)
11506 LPTDN:: %IOTUO,,PILPT1
11507 LPTBN:: %IOTBO,,BLPTO
11510 NLPTDN:: %IOTUO,,NLPT1
11511 NLPTBN:: %IOTBO,,BNLPTO
11514 GLPTDN:: %IOTUO,,GLPTDO (%IOTBP)
11515 GLPTBN:: %IOTBO,,GLPTBO
11517 DIRCHN:: %IOTUI,,DIRCH
11518 DIRBN:: %IOTBI,,DIRB
11519 NDATAI:: %IOTUI,,DDATAI (%IOTIM+%IOTBP)
11520 NBLKI:: %IOTBI,,DBLKI (%IOTIM)
11522 NVIDOP:: %IOTUI,,NVIDIT (%IOTSP)
11523 BNVIDO:: %IOTBI,,BNVIDI
11526 PLTDN:: %IOTUO,,PLOT
11527 PLTBN:: %IOTBO,,BPLOT
11530 PTPI:: %IOTUO,,PIPUN (%IOT10)
11531 PTPA:: %IOTUO,,APIPUN
11532 PTPB:: %IOTBO,,BPIPUN
11533 PTPWA:: %IOTUO,,WAPIPN (%IOTIM)
11534 PTPWB:: %IOTBO,,WBPIPN (%IOTIM)
11537 IMPXDN:: %IOTUI,,IMPXS (%IOTSP)
11538 IMXDN:: %IOTUI,,IMPXS1 (%IOTSP)
11539 BIMXDN:: %IOTBI,,BIMXS1 (%IOTSP)
11540 BIMPXD:: %IOTBI,,BIMPXS (%IOTSP)
11543 OMPXDN:: %IOTUO,,OMPXS (%IOTSP)
11544 OMXDN:: %IOTUO,,OMXDS (%IOTSP)
11545 BOMXDN:: %IOTBO,,BOMXDS (%IOTSP)
11546 BOMPXD:: %IOTBO,,BOMPXS (%IOTSP)
11548 DCLUAI:: %IOTUI,,CLUAI
11549 DCLUAO:: %IOTUO,,CLUAO
11550 DCLBI:: %IOTBI,,CLBI
11551 DCLBO:: %IOTBO,,CLBO
11552 DCLUBI:: %IOTUI,,CLUBI (%IOTIM)
11553 DCLUBO:: %IOTUO,,CLUBO (%IOTIM)
11555 REDUAI:: %IOTUI,,PTRUAI
11556 REDBAI:: %IOTBI,,PTRBAI
11557 REDUII:: %IOTUI,,PTRUII (%IOTIM)
11558 REDBII:: %IOTBI,,PTRBII (%IOTIM)
11559 REDUTI:: %IOTUI,,PTRUTI (%IOT10)
11562 DN340B:: %IOTBO,,340B ;340 ENTRIES MUST BE COMPACT; BLOCK FIRST, THEN UNIT
11563 DN340W:: %IOTUO,,340W (%IOTSP)
11564 DN340C:: %IOTUO,,340C (%IOTSP)
11565 DN340H:: %IOTUO,,340H (%IOTSP)
11566 ;DN340I:: %IOTUO,,340I (%IOTSP)
11567 DN340L:: ;LAST 340 DEVICE ENTRY
11570 CODDN:: %IOTUO,,SEND
11571 CODBN:: %IOTBO,,BSEND
11573 DQUAI:: %IOTUI,,QUAI (%IOTBP)
11574 DQUAO:: %IOTUO,,QUAO (%IOTBP)
11577 DQUII:: %IOTUI,,QUII (%IOTIM %IOTBP)
11578 DQUIO:: %IOTUO,,QUIO (%IOTIM %IOTBP)
11580 DNVDIU:: %IOTUI,,RNVDIU (%IOTSP)
11581 DNVDIB:: %IOTBI,,RNVDIB (%IOTSP)
11582 DNVDOU:: %IOTUO,,RNVDOU (%IOTSP)
11583 DNVDOB:: %IOTBO,,RNVDOB (%IOTSP)
11586 PDPUIO:: %IOTUO,,UWO ;BUT JOB WILL BE -1 TO INDICATE PDP6
11587 PDPBIO:: %IOTBO,,UBO
11588 PDPUII:: %IOTUI,,UWI
11589 PDPBII:: %IOTBI,,UBI
11592 DTABUI:: %IOTUI,,UTABI
11593 DTABBI:: %IOTBI,,BTABI
11596 MTUAIX:: %IOTUI,,MTUAI (%IOTBP) ;MAGTAPE
11597 MTUIIX:: %IOTUI,,MTUII (%IOTIM %IOTBP)
11598 MTBIX:: %IOTBI,,MTBI
11599 MTUAOX:: %IOTUO,,MTUAO (%IOTBP)
11600 MTUIOX:: %IOTUO,,MTUIO (%IOTIM %IOTBP)
11601 MTBOX:: %IOTBO,,MTBO
11603 JDUAI:: %IOTUI,,JBUI(%IOTBP)
11604 JDUAO:: %IOTUO,,JBUI(%IOTBP)
11605 JDBI:: %IOTBI,,JBBI
11606 JDBO:: %IOTBO,,JBBI
11607 JDUII:: %IOTUI,,JBUI (%IOTBP %IOTIM)
11608 JDUIO:: %IOTUO,,JBUI (%IOTBP %IOTIM)
11609 BDUAI:: %IOTUI,,BJUI
11610 BDUAO:: %IOTUO,,BJUO
11611 BDBI:: %IOTBI,,BJBI
11612 BDBO:: %IOTBO,,BJBO
11613 BDUII:: %IOTUI,,BJUI (%IOTIM)
11614 BDUIO:: %IOTUO,,BJUO (%IOTIM)
11615 IIOPOP:: [JRST 4,CPOPJ] ;INTERRUPT ON IOPOP DEVICE
11616 ISPY:: %IOTUI,,SPYI
11617 STYDUI:: %IOTUI,,STTYI ;PSEUDO TTY
11618 STYDUO:: %IOTUO,,STTYW
11619 STYDBI:: %IOTBI,,STTBI
11620 STYDBO:: %IOTBO,,STTBO
11622 NETDUI:: %IOTUI,,NETI
11623 NETDUO:: %IOTUO,,NETW (%IOTBP)
11624 NETDBI:: %IOTBI,,NETBI
11625 NETDBO:: %IOTBO,,NETBO
11628 TCPDUI:: %IOTUI,,TCPI (%IOTBP)
11629 TCPDUO:: %IOTUO,,TCPW (%IOTBP)
11630 TCPDBI:: %IOTBI,,TCPBI
11631 TCPDBO:: %IOTBO,,TCPBO
11634 IPQDN:: IPQIO ; No I/O calls used on this dev!
11643 NTYIT:: %IOTUI,,NTYTI ;KLUDGE FOR FAST, LARGE BUFFER ON NTY
11644 NTYOT:: %IOTUO,,NTYTO
11645 NTYBIT:: %IOTBI,,NTYBI
11646 NTYBOT:: %IOTBO,,NTYBO
11651 ;TABLES FOR VARIOUS CHANNEL STATUS CALLS
11653 ;DCHSTB - INDEXED BY IOTTB INDEX (RH OF IOCHNM)
11654 ;LH SIXBIT MAIN DEVICE NAME
11655 ;1.1-2.3 INDEX INTO THE NEXT TWO TABLES
11656 ;2.4-2.9 SYSTEM PERIPHERAL DEVICE CODE (FOR .STATUS)
11657 .SEE DCHSTB ;ASSEMBLED SECOND TO GET VALUES OF THE TEMPORARY %%dev SYMBOLS.
11659 ;DSTSTB - INDEX FROM DCHSTB
11660 ;LH STATUS ROUTINE, RH WHYINT ROUTINE (OPNL34 IF DEVICE DOESN'T GIVE 2ND WD INTS)
11662 DSTSTB: CPOPJ,,OPNL44 ;0 CHANNEL NOT OPEN
11663 STDSTA,,OPNL34 ;1 RANDOM DEVICE
11664 CPOPJ,,OPNL34 ;2 OTHER KIND OF RANDOM DEVICE
11665 STATYI,,TYIWHY ;3 TTY INPUT
11666 STATYO,,TYOWHY ;4 TTY OUTPUT
11667 CPOPJ,,OPNL34 ;5 USR DEVICE
11668 CPOPJ,,OPNL34 ;6 DIR "DEVICE"
11669 CLISTA,,OPNL34 ;7 CORE LINK INPUT
11670 STDSTA,,OPNL34 ;10 CORE LINK OUTPUT
11671 CPOPJ,,OPNL34 ;11 DISK
11672 JBSTAT,,OPNL22 ;12 JOB DEVICES (WHYINT SHOULDN'T GET HERE)
11673 CPOPJ,,OPNL34 ;13 BOJ DEVICE
11674 STASTI,,STIWHY ;14 STY INPUT
11675 STASTO,,STOWHY ;15 STY OUTPUT
11676 CPOPJ,,TRPDEV ;16 TRAP DEVICE
11677 CPOPJ,,OPNL34 ;17 DIRHNG DEVICE
11678 CPOPJ,,OPNL34 ;20 SPY DEVICE
11679 CPOPJ,,OPNL34 ;21 LOCK DEVICE
11680 OFFSET -DSTSTB ;BEGIN OPTIONAL DEVICES
11681 IFN NMTCS, %%MT:: STAMTC,,OPNL34
11682 IFN NUNITS,%%UTP:: CPOPJ,,OPNL34
11683 IFN OLPTP, %%OLP:: STALPT,,OPNL34
11684 IFN NCPP, %%NET:: STANET,,NETWHY
11685 IFN TCPP, %%TCP:: TCPSTA,,TCPWHY
11686 IFN INETP, %%IPQ:: IPQSTA,,IPQWHY
11687 IFN CHAOSP,%%CHA:: CPOPJ,,CHAWHY
11690 ;DRFNTB - INDEX FROM DCHSTB
11691 ;LH RFNAME ROUTINE, RH RFPNTR ROUTINE OR OPNL34 IF NOT RANDOM ACCESS
11693 DRFNTB: CPOPJ,,OPNL44 ;0 CHNL NOT OPEN
11694 CPOPJ,,OPNL34 ;1 RANDOM DEVICE
11695 CPOPJ,,OPNL34 ;2 OTHER KIND OF RANDOM DEVICE
11696 RCHTTY,,OPNL34 ;3 TTY INPUT
11697 RCHTTY,,OPNL34 ;4 TTY OUTPUT
11698 RCHUSR,,RFPUSR ;5 USR DEVICE
11699 RCHDIR,,OPNL34 ;6 DIR "DEVICE"
11700 RCHCLO,,OPNL34 ;7 CORE LINK INPUT
11701 RCHCLO,,OPNL34 ;10 CORE LINK OUTPUT
11702 RCHQSK,,RFPQSK ;11 DISK
11703 RFNJOB,,RFPJOB ;12 JOB DEVICES
11704 RCHBOJ,,OPNL34 ;13 BOJ DEVICE
11705 RCHSTY,,OPNL34 ;14 STY INPUT
11706 RCHSTY,,OPNL34 ;15 STY OUTPUT
11707 CPOPJ,,CPOPJ ;16 TRAP DEVICE
11708 RCHDRH,,OPNL34 ;17 DIRHNG DEVICE
11709 SPYRCH,,OPNL34 ;20 SPY DEVICE
11710 LCKRCH,,OPNL34 ;21 LOCK DEVICE
11711 OFFSET -DRFNTB ;BEGIN OPTIONAL DEVICES
11712 IFN NMTCS, %%MT:: RCHMGT,,OPNL34
11713 IFN NUNITS,%%UTP:: RCHUTP,,OPNL34
11714 IFN OLPTP, %%OLP:: CPOPJ,,OPNL34
11715 IFN NCPP, %%NET:: NETRCH,,OPNL34
11716 IFN TCPP, %%TCP:: TCPRCH,,TCPRFP
11717 IFN INETP, %%IPQ:: IPQRCH,,IPQRFP
11718 IFN CHAOSP,%%CHA:: CHARCH,,OPNL34
11720 IFN <.-DRFNTB>-<DRFNTB-DSTSTB>, .ERR DRFNTB & DSTSTB NOT SAME LENGTH
11722 DEFINE XX NTIMES,DEVNAM,DN,SNXXX,IDX
11723 IFNB DN, DN==:.-DCHSTB ;CHECK THAT DCHSTB IS IN SAME ORDER AS IOTTB
11724 IFG SIXBIT/DEVNAM/, ZZ==[SIXBIT/DEVNAM/] ;DECIDE WHETHER FITS IN LH
11726 IFE SIXBIT/DEVNAM/&777777, ZZ==(SIXBIT/DEVNAM/)
11727 .ELSE ZZ==[SIXBIT/DEVNAM/]
11729 REPEAT NTIMES, ZZ,,SNXXX_14+IDX
11732 DCHSTB: XX 1,,,,0 ;CHNL NOT OPEN
11733 XX 2,TTY,TYIDN,,3 ;TTY INPUT
11734 XX 2,TTY,TYODN,,4 ;TTY OUTPUT
11735 XX 4,NUL,NLIDN,SNNUL,1 ;NUL DEVICE
11736 XX 4,USR,UWIDN,SNUSR,5 ;USR DEVICE
11737 XX 2,USR,FUWIDN,SNFUSR,5 ;FOREIGN USR
11738 XX 1,DIRHNG,DNDIRH,SNDIRH,17 ;DIRHNG
11739 XX 1,TRAP,DNTRAP,SNTRAP,16 ;TRAP
11740 XX 1,LOCK,DNLCK,SNLCK,21 ;LOCK
11741 IFN CHAOSP, XX 2,CHAOS,CHAIDN,SNCHA,%%CHA ;CHAOS NET
11742 IFN NUNITS, XX 6,UT,DNUACII,SNUTC,%%UTP ;MICRO TAPE
11743 IFG LPTP-1, XX 2,OLP,LPTDN,SNLPD,%%OLP ;DATA PRODUCTS LPT IN 2-LPT SYSTEM
11744 .ELSE IFN OLPTP, XX 2,LPT,LPTDN,SNLPD,%%OLP ;DATA PRODUCTS LPT
11745 IFN NLPTP, XX 2,LPT,NLPTDN,SNLPV,1 ;"VOGUE" LPT (ACTUALLY ODEC)
11746 IFN GLPTP, XX 2,LPT,GLPTDN,SNLPV,1 ;GOULD LPT
11747 XX 4,DIR,DIRCHN,SNDIR,6 ;DIR "DEVICE"
11748 IFN VIDP, XX 2,NVD,NVIDOP,SNBAT,2 ;VIDISSECTOR
11749 IFN PLTP, XX 2,PLT,PLTDN,SNPLT,1 ;PLOTTER
11750 IFN PTRP, XX 5,PTP,PTPI,SNPTP,1 ;PAPER TAPE PUNCH
11751 IFN IMXP, XX 4,IMX,IMPXDN,SNIMPX,1 ;INPUT A/D MULTIPLEXOR
11752 IFN OMXP, XX 4,OMX,OMPXDN,SNOMPX,1 ;OUTPUT A/D MULTIPLEXOR
11753 XX 3,CLO,DCLUAI,SNCLK,7 ;CORE LINK INPUT
11754 XX 3,CLO,DCLBO,SNCLK,10 ;CORE LINK OUTPUT
11755 IFN PTRP, XX 5,PTR,REDUAI,SNPTR,1 ;PAPER TAPE READER
11756 IFN 340P, XX 4,DIS,DN340B,SN340,2 ;340 DISPLAY
11757 ;IFN 340P, XX 1,IDS,DN340I,SN340I,2 ;340 INTERPRETIVE DISPLAY
11758 IFN CODP, XX 2,COD,CODDN,SNCOD,1 ;CODE
11759 XX 6,DSK,DQUAI,SN2311,11 ;DISK
11760 IFN VIDP, XX 4,TVC,DNVDIU,SNBAT,2 ;TV CAMERA
11761 IFN PDP6P, XX 4,PDP,PDPUIO,SNPDP,5 ;PDP-6 DEVICE
11762 IFN TABP, XX 2,TAB,DTABUI,SNTAB,2 ;TABLET
11763 IFN NMTCS, XX 6,MT0,MTUAIX,SNMTC,%%MT ;MAGTAPE
11764 XX 6,JOB,JDUAI,SNJOB,12 ;JOB DEVICES
11765 XX 6,BOJ,BDUAI,SNBOJ,13 ;BOJ DEVICE
11766 XX 1,IIP,IIOPOP,0,2 ;INTERRUPT-ON-IOPOP DEVICE
11767 XX 1,SPY,ISPY,SNSPY,20 ;SPY
11769 XX 1,STY,,SNSTY,14 ;STY INPUT
11770 XX 1,STY,,SNSTY,15 ;STY OUTPUT
11772 IFN NCPP, XX 4,NET,NETDUI,SNNET,%%NET ; Arpanet NCP
11773 IFN TCPP, XX 4,TCP,TCPDUI,SNTCP,%%TCP ; Internet TCP
11774 IFN INETP, XX 1,IPQ,IPQDN,SNIPQ,%%IPQ ; Internet Queue
11775 IFN MSPP, XX 1,MSP,MSPIO,SNMSP,2 ;MS SWITCH HACK
11776 IFN STKP, XX 1,STK,STKDP,SNSTK,2 ;STANFORD KEYBOARD
11777 IFN NTYP, XX 4,NTY,NTYIT,SNNUL,2 ;NTY 11 KLUDGE
11779 IFN .-DCHSTB-LIOTTB,.ERR BARF AT DCHSTB
11780 EXPUNGE XX,%%MT,%%UTP,%%OLP,%%NET,%%TCP,%%CHA,%%IPQ
11782 DCHSTE==.-1 ;END FOR GETSYS (CHDEVS)
11784 ;RSTB - INDEXED BY IOTTB INDEX FROM RH(IOCHNM)
11785 ;THIS TABLE IS IN 5-BIT BYTES; THE VALUES ARE THE INDICES
11786 ;INTO THE RSTB1 AND DFRCTB TABLES.
11787 .SEE RSTB ;ASSEMBLED SECOND TO GET VALUES OF TEMPORARY %%dev SYMBOLS.
11789 ;RSTB1 - INDEX FROM RSTB (BELOW)
11790 ;LH IOPUSH/POP ROUTINE, RH RESET ROUTINE
11791 RSTB1: CPOPJ,,CPOPJ ;0 RANDOM DEVICE
11792 TYIIOP,,TYIRS ;1 TTY INPUT
11793 TYOIOP,,TYORS ;2 TTY OUTPUT
11794 CPOPJ,,USRST ;3 USR DEVICE
11795 CPOPJ,,JBIRS ;4 JOB INPUT
11796 CPOPJ,,JBORS ;5 JOB OUTPUT
11797 IIOPPR,,[JRST 4,CPOPJ] ;6 INTERRUPT ON IOPOP DEVICE
11798 STYIIP,,STYIRS ;7 STY INPUT
11799 STYOIP,,STYORS ;10 STY OUTPUT
11800 CPOPJ,,CPOPJ ;11 DISK OUTPUT
11801 DIRHIP,,CPOPJ ;12 DIRHNG
11802 CPOPJ,,TRPDEV ;13 TRAP
11803 OFFSET -RSTB1 ;OPTIONAL DEVICES BEGIN HERE
11804 IFN OLPTP, %%LPT:: CPOPJ,,LPTRS
11805 IFN NLPTP, %%NLP:: CPOPJ,,NLPTRS
11806 IFN PLTP, %%PLT:: CPOPJ,,PLTRS
11807 IFN PTRP, %%PTR:: CPOPJ,,PTRRS
11808 IFN PTRP, %%PTP:: CPOPJ,,PUNCLR
11809 IFN IMXP, %%IMX:: CPOPJ,,IMPXRS
11810 IFN 340P, %%340:: CPOPJ,,DSIZAP
11811 IFN CODP, %%COD:: CODIOP,,CODRS
11812 IFN PDP6P, %%PDP:: PDPIOP,,PDPRST
11813 IFN TABP, %%TAB:: CPOPJ,,TABCLR
11814 IFN NCPP, %%NET:: NETIOP,,NETRS
11815 IFN TCPP, %%TCP:: TCPIOP,,TCPRST
11816 IFN INETP, %%IPQ:: IPQIOP,,IPQRST
11817 IFN STKP, %%STK:: CPOPJ,,STKRS
11818 IFN CHAOSP,%%CHA:: CHAIOP,,CPOPJ
11821 ;DFRCTB - INDEX FROM RSTB (BELOW)
11822 ;LH FORCE ROUTINE, RH FINISH ROUTINE
11823 DFRCTB: OPNL34,,OPNL34 ;0 RANDOM DEVICE
11824 OPNL2,,OPNL2 ;1 TTY INPUT (ILLEGAL)
11825 POPJ1,,TTYFIN ;2 TTY OUTPUT
11826 OPNL34,,OPNL34 ;3 USR
11827 OPNL2,,OPNL2 ;4 JOB (SHOULDN'T GET HERE?)
11828 OPNL22,,OPNL22 ;5 JOB (SHOULDN'T GET HERE?)
11829 OPNL22,,OPNL22 ;6 IIP (SHOULDN'T GET HERE)
11830 OPNL2,,OPNL2 ;7 STY INPUT (ILLEGAL)
11831 POPJ1,,STYFIN ;10 STY OUTPUT
11832 QSKFRC,,QSKFIN ;11 DISK OUTPUT
11833 OPNL34,,OPNL34 ;12 DIRHNG
11834 TRPDEV,,TRPDEV ;13 TRAP
11835 OFFSET -DFRCTB ;OPTIONAL DEVICES BEGIN HERE
11836 IFN OLPTP, %%LPT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11837 IFN NLPTP, %%NLP:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11838 IFN PLTP, %%PLT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11839 IFN PTRP, %%PTR:: OPNL34,,OPNL34
11840 IFN PTRP, %%PTP:: POPJ1,,PUNFIN
11841 IFN IMXP, %%IMX:: OPNL34,,OPNL34
11842 IFN 340P, %%340:: OPNL34,,OPNL34
11843 IFN CODP, %%COD:: POPJ1,,CODFIN
11844 IFN PDP6P, %%PDP:: OPNL34,,OPNL34
11845 IFN TABP, %%TAB:: OPNL34,,OPNL34
11846 IFN NCPP, %%NET:: NETFRC,,NETFIN
11847 IFN TCPP, %%TCP:: TCPFRC,,TCPFIN
11848 IFN INETP, %%IPQ:: IPQFRC,,IPQFIN
11849 IFN STKP, %%STK:: OPNL34,,OPNL34
11850 IFN CHAOSP,%%CHA:: CHAFRC,,CHAFIN
11853 ;TABLE OF INDICES INTO THE RSTB1, DFRCTB TABLES ON THE PRECEDING PAGE
11854 ;THESE INDICES ARE UNRELATED TO THE INDICES IN DCHSTB A COUPLE PAGES BACK.
11855 ;NOTE THAT THE %% SYMBOLS ARE PURELY TEMPORARY AND EXPUNGED AT THE BOTTOM OF THIS PAGE.
11860 REPEAT 2,1 ;TTY INPUT
11861 REPEAT 2,2 ;TTY OUTPUT
11862 REPEAT 4,0 ;NUL DEVICE
11863 REPEAT 4,3 ;USR DEVICE
11864 REPEAT 2,0 ;FOREIGN USR
11868 IFN CHAOSP, REPEAT 2,%%CHA
11869 IFN NUNITS, REPEAT 6,0 ;DEC TAPE
11870 IFN OLPTP, REPEAT 2,%%LPT
11871 IFN NLPTP, REPEAT 2,%%NLP
11872 IFN GLPTP, REPEAT 2,0
11873 REPEAT 4,0 ;DIR "DEVICE"
11874 IFN VIDP, REPEAT 2,0
11875 IFN PLTP, REPEAT 2,%%PLT
11876 IFN PTRP, REPEAT 5,%%PTP
11877 IFN IMXP, REPEAT 4,%%IMX
11878 IFN OMXP, REPEAT 4,0
11879 REPEAT 6,0 ;CORE LINK.
11880 IFN PTRP, REPEAT 5,%%PTR
11881 IFN 340P, REPEAT 4,%%340
11883 IFN CODP, REPEAT 2,%%COD ;CODE
11884 REPEAT 3, 0 ? 11 ;DISK IN, DISK OUT
11885 IFN VIDP, REPEAT 4,0
11886 IFN PDP6P, REPEAT 4,%%PDP ;PDP-6 DEVICE
11887 IFN TABP, REPEAT 2,%%TAB
11888 IFN NMTCS, REPEAT 6,0 ;MAGTAPE
11892 REPEAT 3,[0 ;BOJ INPUT
11895 6 ;INTERRUPT ON IOPOP DEVICE
11897 7 ? 10 ? 7 ? 10 ;PSEUDO-TTY
11898 IFN NCPP, REPEAT 4,%%NET ;NET RESET INR/INS
11899 IFN TCPP, REPEAT 4,%%TCP ; TCP RESET
11900 IFN INETP, %%IPQ ; Internet Queue
11901 IFN MSPP, 0 ;MS SWITCH HACK
11902 IFN STKP, %%STK ;STANFORD KEYBOARD
11903 IFN NTYP, REPEAT 4,0 ;NTY 11 KLUDGE
11905 IFN LIOTTB-.BYTC,.ERR BARF AT RSTB
11907 EXPUNGE %%LPT,%%NLP,%%PLT,%%PTR,%%PTP,%%IMX,%%340,%%COD,%%PDP,%%TAB,%%NET,%%TCP,%%STK,%%CHA,%%IPQ
11912 DEFINE DV NAME,OPNRTE,BITS,TAG
11914 DVHR [DEFINE DVHR X,Y
11915 X!][TAG BITS,,OPNRTE
11919 ;DEVICE TABLES FOR AOPEN
11921 ;DEVTAB SIXBIT NAME
11923 %DVIN==400000 ;4.9 DEVICE CAN DO INPUT
11924 %DVOUT==200000 ;4.8 DEVICE CAN DO OUTPUT
11925 %DVDIR==100000 ;4.7 DEVICE CAN GIVE DIRECTORY
11926 %DVDEL==40000 ;4.6 ALLOW DELETE/RENAME
11927 %DVLNK==20000 ;4.5 ALLOW MLINK
11928 ;RIGHT HALF, OPEN ROUTINE ADDRESS
11929 %DV==1,,520000 ;BIT TYPEOUT MASK
11932 IFN NLPTP, DV LPT,NLPTO,%DVOUT
11933 IFG OLPTP-NLPTP,DV LPT,LPTO,%DVOUT
11934 IFG LPTP-1, DV OLP,LPTO,%DVOUT
11935 IFN GLPTP, DV LPT,GLPTO,%DVOUT
11936 IFN TTLPTP, DV LPT,LPTO,%DVOUT
11938 DV DSK,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAQSK:
11939 DV COM,COMO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11940 MNAME [ DV ],QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;"AI:" ON
11942 IFE MCOND MC,[ ; When MC and MX swap names, these names will stay
11943 IFN KL10P, DV KL,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11944 IFN KS10P, DV KS,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11947 IFN KL10P, DV KL,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11948 IFN KS10P, DV KS,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11950 DV SYS,SYSO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11951 DV DNRF,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11952 DV DNR,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11953 DV DIRHNG,DIRHO,%DVIN
11954 DV TRAP,TRPDEV,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11955 DV LOCK,LCKO,%DVOUT
11956 DV TTY,TTYO1,%DVIN+%DVOUT+%DVDIR
11957 DV NUL,NULO,%DVIN+%DVOUT
11958 DV USR,USRO,%DVIN+%DVOUT
11959 IFN VIDP, DV NVD,NVIDI,%DVIN+%DVOUT
11960 IFN CHAOSP, DV CHAOS,CHASO,%DVIN+%DVOUT
11961 IFN NCPP, DV NET,NETO,%DVIN+%DVOUT
11962 IFN TCPP, DV TCP,TCPO,%DVIN+%DVOUT
11963 IFN INETP, DV IPQ,IPQO,%DVIN+%DVOUT
11964 IFN MSPP, DV IPC,IPCO,%DVIN+%DVOUT
11965 DV STY,STTYO,%DVIN+%DVOUT
11966 DV JOB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAJOB:
11967 DV BOJ,BOJO,%DVIN+%DVOUT
11968 DV OJB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11969 IFN STKP, DV STK,STKO,%DVIN
11970 IFN PLTP, DV PLT,PLOTO,%DVOUT
11971 IFN PLTP, DV IPL,IPLO,%DVOUT ;INTERPRETED PLOTTER
11972 IFN XGP, DV XPL,XPLO,%DVOUT
11973 IFN IMXP, DV IMX,IMPXO,%DVIN
11974 IFN OMXP, DV OMX,OMPXO,%DVOUT
11975 IFN PTRP, DV PTR,PTRO,%DVIN
11976 IFN PTPP, DV PTP,PTPO,%DVOUT
11977 IFN 340P, DV DIS,DISO,%DVOUT ;340 AS OUTPUT DEVICE
11978 ;IFN 340P, DV IDS,IDISO,%DVOUT ;340 AS INTERPRETED DISPLAY
11979 DV CLU,CLUO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11980 DV CLO,CLOO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11981 DV CLI,CLIO,%DVOUT+%DVDIR+%DVDEL
11982 DV CLA,CLAO,%DVIN+%DVDIR+%DVDEL
11983 IFN CODP, DV COD,CODO,%DVOUT
11984 IFN VIDP, DV TVC,TVCO,%DVIN+%DVOUT
11986 IFN TPLP+TTLPTP&DEMON, DV TPL,TPLO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11987 IFN TABP, DV TAB,TABO,%DVIN
11989 DV COR,CORO,%DVDIR ;DIR=LAST LINE OF TTY^F
11990 IFN NTYP, DV NTY,NTYOPN,%DVIN+%DVOUT ;NTY 11 KLUDGE
11994 DVT1: DV TTY,TTYO,%DVIN+%DVOUT+%DVDIR
11995 DV TY,TTYO,%DVIN+%DVOUT+%DVDIR
11996 DV T,TTYO,%DVIN+%DVOUT+%DVDIR
11997 IFN NUNITS, DV UT,UTO,%DVIN+%DVOUT+%DVDIR+%DVDEL,DVAUT:
11998 DV STY,STTYOA,%DVIN+%DVOUT
11999 DV ST,STTYOA,%DVIN+%DVOUT
12000 DV S,STTYOA,%DVIN+%DVOUT
12001 DV DSK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR UNIT
12002 DV DK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR UNIT
12003 DV PK,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR PACK
12004 DV P,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR PACK
12005 IFN NMTCS, DV MT,MAGTO,%DVIN+%DVOUT ;MAGTAPE
12008 EDEVS==.-1 ;END FOR GETSYS (DEVS)
12011 IFN .-DEVADR-NDEVS-NDV1,.ERR DVHR LOST
12013 SUBTTL .OPER, .CALL DISPATCH
12015 AOPER: MOVE J,R ;AC FIELD OF UUO
12016 ADDI R,IOCHNM(U) ;SET UP IO CHANNEL REFERENCE POINTER
12017 CAIL C,MXOPR ;SKIP IF UUO E FIELD IS LESS THAN MAX OPR
12018 JRST ILUUO ;ILLEGAL OPER
12019 JRST @OPRDSP(C) ;LEGAL OPER-- DISPATCH ON E FIELD OF UUO
12022 OPRIRP A!X ;AITYI,ALISTEN,ASLEEP,ETC.
12027 ACALL: MOVE B,C ;SET UP COPY OF ERR ADR NOT TO BE RELOCATED
12028 JRST @CALDIS(R) ;DISPATCH INDEX OF UUO'S AC FIELD
12045 REPEAT 20-.+CALDIS,ILUUO
12047 SUBTTL MISCELLANEOUS UUO'S
12051 ASHUTD: UMOVE C,(J) ;Arg is time to down in thirtieths.
12052 JUMPL C,AREVIV ;Negative time means REVIVE.
12053 CAMG C,[43200.*30.*60.] ;If time is longer than thirty days
12054 CAIGE C,5*60.*30. ; or less than five minutes
12055 POPJ P, ; Fail (prevent clock delta-T from losing).
12056 ADD C,TIME ;Interval+now is when we will die.
12057 PUSHJ P,SWTL ;Seize shutdown lock.
12059 SKIPGE SHUTDN ;Already down?
12061 PUSHJ P,CLQDEL ;Flush obsolete clock queue entry, if any.
12063 MOVEM C,SHUTDN ;Remember time we will die.
12064 SUB C,TIME ;Interval until death.
12065 LSH C,1 ;Time till death after next clock-queue int.
12066 MOVEM C,DEDTIM ;Remember time until death.
12067 PUSHJ P,DEATHX ;Make DEATH entry on clock queue.
12068 BUG ; DEDTIM says time to die already?
12069 JRST LSWPJ1 ;Unlock shutdowns.
12071 ;READ TIME TILL SYSTEM DOWN
12073 ADIETI: XCTR XW,[SETOM (J)] ;READ -1 IF NOT GOING DOWN
12077 JRST APTUAJ ;GIVE TO USER
12081 AREVIV: PUSHJ P,SWTL
12084 JRST LSWPOP ;NOT DYING
12092 ;FROM CLOCK QUEUE BLOCK
12094 DEATHZ: PUSHJ P,DEATHX
12098 PUSHJ P,SUPSET ;DIE
12102 ;GET VARIOUS SYS STATUS
12104 ASSTAT: CONO PI,CLKOFF
12108 SUBI A,1 ;TIME TILL DOWN IF > 0, -1 IF UP, -2 IF DOWN
12115 MOVE TT,[ITSMCH] ;SIXBIT NAME OF THIS MACHINE.
12117 MOVN Q,USRHI ;Q GETS NUMBER OF FREE JOB SLOTS
12121 ASSTT1: SUBI J,LUBLK
12127 SUBTTL SYMBOLIC SYSTEM CALL HANDLER
12129 ;IN ORDER @A...Z[\]^_ !".../0...9:;,=.? (THAT IS IN NUMERICAL ORDER)
12131 SYSCTB: SIXBIT /ACCESS/ ;IOCHNL, ADR
12134 SIXBIT /CALL/ ;SIXBIT /<NEXT CALL>/
12139 SIXBIT /CLOSE/ ;IOCHNL
12140 SIXBIT /CNSGET/ ;GET SEMIPERMANENT TTY INFO
12141 SIXBIT /CNSSET/ ;SET SEMIPERMANENT INFO (TCMXH, TCTYP, TTYOPT, TTYCOM, ETC)
12142 SIXBIT /CORBLK/ ;HACK PAGE MAP
12143 SIXBIT /CORTYP/ ;READ STATUS OF PAGE.
12144 SIXBIT /DELETE/ ;FILE DELETE
12145 SIXBIT /DELEWO/ ;DELETE FILE OPEN ON SPEC'D CHANNEL
12146 IFN DEMON,SIXBIT /DEMSIG/ ;SIGNAL DAEMON
12147 SIXBIT /DETACH/ ;DISOWN ENTIRE TREE
12150 SIXBIT /DISOWN/ ;DISOWN AN INFERIOR JOB
12151 IFN DL10P, SIXBIT /DL10MP/
12152 SIXBIT /DSKUPD/ ;SIMULATE REFERENCE OF FILE
12153 SIXBIT /ECHOIN/ ;ECHO-NEGOTIATE
12154 SIXBIT /FILBLK/ ; READ NAME AREA OF FILE
12155 SIXBIT /FILLEN/ ;READ FILE LENGTH
12157 SIXBIT /FLAP/ ;TAPE #
12158 SIXBIT /FLUSH/ ;OLD NAME FOR FINISH, EVENTUALLY "
12162 SIXBIT /IOT/ ;IOCHNL, QUAN OR BLK POINTER
12163 IFN INETP,SIXBIT /IPKIOT/
12165 SIXBIT /JOBCAL/ ;GENERAL JOBGET
12166 SIXBIT /JOBGET/ ;JOB CHNL
12167 SIXBIT /JOBINT/ ;JOB CHNL
12169 SIXBIT /JOBRET/ ;JOB CHNL
12171 SIXBIT /JOBSTS/ ;SET JOB CHNL STATUS
12172 IFN KL10P,SIXBIT /KLPERF/ ;ACTIVATE & CONTROL PERFORMANCE METER
12173 SIXBIT /LISTEN/ ;IOCHNL, ADR
12174 SIXBIT /LNKEDP/ ;DISK CH. RETURNS NONZERO IF LINKS WERE TRACED TO OPEN IT.
12175 SIXBIT /LOAD/ ;USER CH, I/O CH, VARBLK
12176 SIXBIT /LOGIN/ ;SIXBIT /<NAME>/
12177 SIXBIT /LOGOUT/ ;. . .
12179 SIXBIT /MLINK/ ;MAKE LINK
12180 IFN NCPP, SIXBIT /NETAC/
12181 SIXBIT /NETBLK/ ;HANG ON NCP STATE
12183 SIXBIT /NETHST/ ;GETS STATUS OF HOST
12184 SIXBIT /NETIMP/ ;GETS STATUS OF IMP
12186 IFN NCPP, SIXBIT /NETINT/
12187 IFN INETP,[ ; A temporary cond, should become permanent.
12188 SIXBIT /NETRFC/ ; Get pending request for connection
12190 SIXBIT /OPEN/ ;FILE OPEN
12191 SIXBIT /PDUMP/ ;USER CH, I/O CH, VARBLK
12192 SIXBIT /PGDUMP/ ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12193 SIXBIT /PGWRIT/ ;DUMP PAGE OUT OF CORE
12194 IFN CHAOSP, SIXBIT /PKTIOT/
12195 IFN QAUTHP, SIXBIT /RAUTH/ ;READ AUTHOR OF FILE
12196 SIXBIT /RCHST/ ;READ OPENED FILENAMES & ACCESS POINTER
12197 SIXBIT /RCPOS/ ;READ CURSOR POS
12198 IFN DEMON,SIXBIT /RDDMST/ ;READ DEAMON STATUS
12199 SIXBIT /RDMPBT/ ;READ FILE DUMPED BIT IOCHN, ADR
12201 SIXBIT /RENAME/ ;FILE RENAME
12202 SIXBIT /RENMWO/ ;RENAME WHILE OPEN
12205 SIXBIT /RESRDT/ ;RESTORE REFERENCE DATE
12206 SIXBIT /RFDATE/ ;READ TIME OF CREATION OF FILE IOCHN, ADR
12207 SIXBIT /RFNAME/ ;READ FILE NAME AND MODE CHANNEL OPEN TO
12208 SIXBIT /RFPNTR/ ;READ ACCESS POINTER
12209 SIXBIT /RQDATE/ ;READ DSK DATE
12210 SIXBIT /RSSIZE/ ;READ SCREEN SIZE
12211 IFN QAUTHP, SIXBIT /SAUTH/ ;SET AUTHOR OF FILE
12212 SIXBIT /SCML/ ;SET # COMMAND LINES
12213 SIXBIT /SCPOS/ ;SET TTY CURSOR POSITION
12214 SIXBIT /SDMPBT/ ;SET FILE DUMPED BIT IOCHN, ADR
12215 SIXBIT /SETIOC/ ;CAUSE IO CHANNEL ERROR IN JOB/BOJ CHANNEL
12216 SIXBIT /SFDATE/ ;SET TIME OF CREATION OF FILE IOCHN, ADR
12217 SIXBIT /SIOT/ ;IOT A STRING GIVEN B.P. AND LENGTH
12218 SIXBIT /SOPEN/ ;OPEN, TAKING MODE,,CHNL AND BP.
12219 SIXBIT /SRDATE/ ;SET REFERENCE DATE
12220 SIXBIT /SREAPB/ ;SET THE DO NOT REAP BIT
12221 SIXBIT /SSERVE/ ;Set .SERVER without timing errors
12222 SIXBIT /SSTATU/ ;READS VARIOUS SYSTEM STATUS
12224 IFN DEMON,SIXBIT /STDMST/ ;SET DEAMON STATUS
12225 SIXBIT /STLGET/ ;GET INFO ON SERVER TELNET CONTROLLING A STY
12226 SIXBIT /STYGET/ ;GET INFO ABOUT SPECIFIED STY
12227 IFN NETP,SIXBIT /STYNET/ ;CONNECT STY TO NETWORK SOCKETS, FOR TELNET SERVERS.
12228 SIXBIT /T11MP/ ;TEMP ? TEN11 HACKER
12229 IFN TCPP,SIXBIT /TCPOPN/ ; Open TCP Internet connection
12230 SIXBIT /TRANAD/ ;CREATE TRANSLATION ENTRY
12231 SIXBIT /TRANCL/ ;CLEAR TRANSL. LIST(S) FOR A JOB.
12232 SIXBIT /TRANDL/ ;DELETE A TRANSL. ENTRY.
12233 SIXBIT /TRANEX/ ;READ A JOB'S TRANSL. LIST.
12234 SIXBIT /TRANS/ ;TRANSLATE A FILENAME.
12235 SIXBIT /TRPOPN/ ;OPEN TRAP DEVICE FOR AN INFERIOR
12236 SIXBIT /TTYESC/ ;SIMULATE TYPING OF ^_
12237 SIXBIT /TTYFLS/ ;FLUSH ITYIC'ED INPUT
12238 SIXBIT /TTYGET/ ;SUPPLY TTY CH, RETURNS THREE WORDS OF TTY STATUS
12239 SIXBIT /TTYSET/ ;SUPPLY TTY CH AND THREE WORDS OF TTY STATUS
12240 SIXBIT /TTYVAR/ ;HACK TTY VARIABLES
12242 SIXBIT /UNLOCK/ ;UNLOCK A SPEC'D JOBS LOCKS.
12243 SIXBIT /USRMEM/ ;READ OR WRITE A JOB'S MEMORY.
12244 SIXBIT /USRVAR/ ;HACK USER VARIABLES
12245 SIXBIT /VIDBUF/ ;ASSIGN/DEASSIGN VIDEO BUFFER.
12246 SIXBIT /VIDSW/ ;SET VIDEO SWITCH.
12247 SIXBIT /WHOLIN/ ;GET OR SET WHO-LINE MODE AND JOB.
12248 SIXBIT /WHYINT/ ;FIND OUT WHY AN I/O CHANNEL INTERRUPTED
12249 SIXBIT /XGPIM/ ;OUTPUT TO XGP IN IMAGE MODE
12254 ZZ2==CONC [.LENGTH /]\ZZ,/
12256 REPEAT 1_<ZZ2>-ZZ-1,377777,,-1
12257 ;4.X BIT IMPLIES SUPPLY ROUTINE WITH POINTER TO X'TH ARG, NOT ARG ITSELF
12258 ;3.9-3.7 = MINIMUM NUMBER OF ARGS
12259 ;3.1 => DECODE 1ST ARG AS IO CHNL, LEAVING IOCHNM WD ADDR IN RH(R),
12260 ; IOCHNM WD CONTENTS IN H, CLSTB ENTRY'S LH IN LH(R).
12261 ;3.2 => NEVER PASS TO SPECIAL CHECKER FOR JOB CHNL
12262 ;3.3 => DON'T BARF IF CHNL NOT OPEN, CALLED ROUTINE WILL HANDLE IT
12264 ;# ARGS ACTUALLY SUPPLIED IN W WHEN DISPATCHING THRU SYSCTD, ARGS IN A...J
12265 SYSCTD: 200,,NACCES
12280 IFN DEMON,100,,ADEMSIG
12285 IFN DL10P, 100,,DL10MP
12291 IFN NUNITS, 100,,NFLAP
12292 IFE NUNITS, 100,,OPNL1
12293 100,,NFINIS(1) ;OLD NAME FOR FINISH, EVENTUALLY FLUSH
12297 2100,,NIOT(7) ;(7) FOR CHNL NOT OPEN TO BE IOC ERROR, (3) TO BE OPEN LOSS
12298 IFN INETP, 100,,IPKIOT(1) ; Requires at least 1 arg
12315 IFN NCPP, 100,,ANETAC(1)
12317 IFE CHAOSP, 4200,,ANETBLK(1)
12318 IFN CHAOSP, 4200,,CHANBK(1)
12320 IFN INETP, 4200,,NETBLK(1) ; Block (.hang) on net I/O channel
12325 IFN NCPP, 100,,NNETINT(1)
12326 IFN INETP, 100,,NETRFC
12329 100,,NPGWRT ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12331 IFN CHAOSP, 200,,PKTIOT(1)
12332 IFN QAUTHP, 100,,ARAUTH(1)
12335 IFN DEMON,100,,ARDDMST
12348 IFN QAUTHP, 200,,ASAUTH(1)
12354 6300,,NSIOT(7) ;(7) FOR IOC ERROR IF CHNL NOT OPEN, (3) FOR OPEN LOSS
12361 IFN DEMON,100,,ASTDMST
12364 IFN NETP,200,,NSTYNT(3)
12366 IFN TCPP,500,,TCPOPN
12388 IFN .-SYSCTD-1-ZZ,.ERR NEW SYS CALL DISPATCH LOSES!!!
12390 REPEAT 1_<ZZ2>-ZZ-1,ILUUO
12392 ;.CALL ADR1 SKIPS UNLESS SOMETHING WRONG
12394 ; SIXBIT /<CALL NAME>/
12395 ; REPEAT #ARGS,BITS,, <ADDRESS OF ARGUMENT>
12396 ; BITS= 4.9 => LAST ARG
12397 ; 4.3 - 4.1 0 = NORMAL ARG
12400 ; 3 = RETURN THE FAILURE CODE IF FAIL
12401 ; 4 = WORD OF CONTROL BITS
12402 ; 5 = IMMEDIATE CONTROL BITS
12404 ASYSC: PUSHJ P,ASCGRG ;B HAS E OF UUO
12405 JRST OPNL43 ;CALL NAME UNKNOWN.
12406 JRST OPNL15 ;MORE THAN 8 ARGS
12407 JRST OPNL30 ;TOO FEW ARGS
12408 PUSHJ P,ASYSC1 ;DISPATCH TO ROUTINE.
12409 POPJ P, ;NO SKIP - OPENL HAS ALREADY BEEN CALLED.
12410 AOS (P) ;SKIP - PROPAGATE THE SKIP UP THE PDL
12412 MOVE R,SYSCVL(U);SUCCESS RETURN, ZERO ERROR CODE ARG IF ANY
12414 XCTR XW,[SETZM (R)]
12415 JUMPGE R,CPOPJ ;JUMP IF NO OUTPUT VALUES WANTED
12416 SYSCPT: HRRZ W,FORTY ;VALUES WANTED, PUT INTO USER MEMORY FROM ACS
12419 SYSCP2: UMOVE R,(W)
12427 SYSCP3: JUMPL R,CPOPJ
12430 ASYSC1: MOVE T,SYSCTD(H)
12431 TLNN T,1 ;DECODE 1ST ARG AS IO CHNL?
12432 JRST (T) ;NO, DISPATCH TO CALL.
12433 TLNE T,2 ;OK TO GIVE TO JOB CHNL CHECKER?
12434 JRST CHNDCD ;NO - GO DECODE CHANNEL
12435 HRL J,T ;SAVE DISPATCH ADDR
12436 HRRI T,AIOCAL ;MAKE DECODER RETURN TO CHECK FOR JOB DEVICE
12442 SETZM A+7 ;MAX 8 ARGS, 1 USED FOR NAME
12446 MOVEI J,ASYSC+2 ;LOOK LIKE PUSHJ'ED FROM ASYSC
12448 LDB J,[331000,,SYSCTD(H)]
12451 JRST NCALL3 ;HE WANTS POINTERS, WE HAVE JUST VALUES.
12452 ;MUST GET ARGS AGAIN
12455 REPEAT ZZ2,[CAML T,SYSCTB+1_<ZZ2-.RPCNT-1>(H)
12456 ADDI H,1_<ZZ2-.RPCNT-1>
12462 ;JSP T,HERE TO DECODE IO CHNL IN A, MODIFIERS IN 3.1-3.3 OF T.
12463 ;IF RH(T) = AIOCAL, LH(J) IS REAL RETURN ADDRESS.
12464 ;RETURNS IOCHNM ADDR IN RH(R), IOCHNM WD CONTENTS IN H, CLSTB BITS IN LH(R)
12465 ;CAN POPJ OUT FOR INVALID CHANNEL.
12467 CHNDCD: TRNE A,-NIOCHN ;IS 1ST ARG A LEGAL CHNL NUM?
12470 HRROM A,UUAC(U);REMEMBER CHNL # FOR IOC ERRORS, ETC.
12472 ADDI R,IOCHNM(U) ;YES, COMPUTE IOCHNM WD ADDR
12473 MOVE H,(R) ;RETURN CONTENTS IN H.
12474 HLL R,CLSTB(H) ;RETURN CLSTB BITS IN LH(R).
12476 JRST [ CAME U,USER ;TRAP DEVICE
12477 JRST .+1 ;IF CHANNEL BELONGS TO THIS USER, TRAP
12478 JRST TRPDEV ] ;OTHERWISE, IS PROBABLY RFNAME, LET IT THROUGH
12479 TRNN H,-1 ;IF CHNL NOT OPEN
12480 TLNE T,4 ;AND NOT SPECIALLY OK FOR THIS SYSTEM CALL
12482 JRST OPNL44 ;THEN BARF
12484 ;JOB DEVICE CHECKER - PUT AIOCAL IN RH(T), JRST CHNDCD
12486 AIOCAL: HLRZ T,J ;GET DISPATCH ADR BACK
12487 TLNN R,%CLSJ ;IS CHANNEL JOB DEVICE?
12488 JRST (T) ;NO - DISPATCH
12489 HLRZS H ;ISOLATE JOB DEVICE INDEX
12490 DPB W,[230400,,JBSTS(H)] ;SAVE ARG COUNT
12493 HRRI W,1 ;NOW HAVE AOBJN PNTR TO DATA
12494 MOVE T,(W) ;COPY ARGS TO JOB AC TABLES
12495 MOVEM T,@JBACTB-1(W)
12497 MOVEI W,10 ;SET NON-STANDARD OP-CODE
12499 MOVE E,H ;PUT JOB INDEX IN E FOR JBWT
12501 AIOCA1: PUSHJ P,JBWT ;WAIT FOR JOB TO ANSWER
12502 MOVE H,E ;GET JOB INDEX BACK IN H (FOR JBACTB)
12503 MOVE W,[-8,,1] ;LOAD ANSWERS INTO ACS
12504 MOVE T,@JBACTB-1(W)
12507 LDB T,[350400,,JBSTS(H)] ;GET SKIP COUNT
12508 JUMPN T,POPJ1 ;SKIP COUNT NOT ZERO - SKIP
12509 LDB C,[270600,,JBSTS(H)] ;GET OPEN LOSS CODE
12510 SKIPE C ;MAKE SURE IN BOUNDS
12513 JRST OPNL1-1(C) ;GO REPORT LOSSAGE AND DON'T SKIP
12515 ;SYSTEM CALL GET ARGS
12516 ASCGRG: UMOVE T,(B)
12522 POPJ P, ;CALL NAME UNRECOGNIZED.
12524 LDB J,[331000,,SYSCTD(H)] ;GET BITS CORRESP TO ARGS WHICH SAY SUPPLY PNTR TO NTH ONE
12525 NCALL3: MOVEI W,2(B)
12528 ASYSC2: UMOVE R,(W)
12530 PUSHJ P,ASCIND ;CALC EFFECTIVE ADDRESS
12532 JRST ASYSC3 ;OUTPUT OR ERRORCODE ARG
12534 JRST ASYSC5 ;CONTROL BITS
12537 JUMPL J,ASYSC7 ;J IF WANT ADDRESS, NOT VALUE
12539 TLZA R,-1 ;IMMEDIATE, GET 0,,ADR
12540 UMOVE R,(R) ;ELSE GET WORD POINTED TO
12541 ASYSC7: MOVEM R,-1(T) ;PUT INTO AC
12544 ASYSC5: TLNE R,1000 ;CTL BITS
12545 TLZA R,-1 ;IMMEDIATE, GET 0,,ADR
12546 XCTR XR,[HRRZ R,(R)] ;ELSE WORD ADDRESS
12547 XORM R,CTLBTS(U) ;XOR ALL THESE ARGS TOGETHER
12548 ASYSC4: XCTR XR,[SKIPL (W)] ;SKIP IF TERMINATE BIT ON
12551 ADDI W,9 ;COMPUTE NUMBER OF ARGUMENTS SUPPLIED
12552 NCALL2: LDB T,[300300,,SYSCTD(H)]
12554 JUMPG T,POPJ1 ;NOT ENOUGH ARGS
12557 ASYSC3: TLNE R,1000
12558 JRST ASYSC8 ;ERROR CODE ARG
12559 XCTR XRW,[MOVES (R)] ;OUTPUT ARG, JUST MAKE SURE IT'S THERE
12560 MOVSI R,%SCVOT ;AND FLAG PRESENCE
12561 ASYSC9: IORM R,SYSCVL(U)
12564 ASYSC8: HRLI R,%SCVER ;ERROR-CODE ARG
12565 TDNE R,SYSCVL(U);CAN'T HAVE MORE THAN ONE ERRORCODE ARG
12566 JRST CPOPJ ;SAY "TOO MANY ARGS"
12567 XCTR XRW,[MOVES (R)] ;MAKE SURE IT'S THERE; MUSTN'T PCLSR OUT OF OPENL
12570 ;PERFORM INDEXING AND INDIRECTION ON ADDRESS WORD IN R.
12571 ;DON'T CLOBBER BITS 3.6 - 4.9. SET BITS 3.1 - 3.5 TO ZERO
12578 XCTR XR,[HRRZ R,(R)]
12580 HLL R,(P) ;GET ORIG @, MAY HAVE BEEN CARRIED INTO BY -1(17)
12588 PUSHJ P,OPBRK ;ALLOW PCLSR
12591 TPFLT: CONO PI,CLKOFF ;PREVENT INTERRUPT AFTER IORM SPM ING BACK
12592 ; ON TOP OF 1000 BIT
12599 LPMRI UPGML(U) ;TAKE TRAP, MAYBE DONT COME BACK
12603 POP P,PFOPC1 ;IF RESTART FAULT, RETURN FROM TPFLT
12604 JRST TPFLT1 ;JOIN REGULAR PAGE FAIL CODE
12607 POP P,EPTPFO ; If fault returns, just return from TPFLT
12613 ;`PDUMP' SYMBOLIC SYSTEM CALL
12614 ; ARG 1 - JOB SPEC FOR JOB TO BE DUMPED
12615 ; ARG 2 - DISK CHANNEL TO DUMP ONTO
12616 ; ARG 3 - STATE WORD (MODIFIED) INITIALLY 0, THEN 4.9 + PAGE # ABOUT TO DUMP
12619 JSP T,NCRUI2 ;DECODE JOB SPEC (1ST ARG)
12622 JUMPL J,OPNL31 ;CAN'T PDUMP THE PDP6.
12624 JSP T,PDUMDC ;DECODE 2ND ARG, B-> IOCHNM WORD.
12626 JRST OPNL34 ;NOT DISK WRITE CHANNEL.
12627 HRRZM D,UUAC(U) ;SO SET IN CASE OF ERROR
12629 MOVEM D,SRN3(U) ;REMEMBER DISK CHANNEL NUMBER FOR LATER.
12631 XCTR XRW,[MOVES D,(C)]
12632 MOVEM C,SRN4(U) ;REMEMBER STATE WORD ADDRESS FOR LATER
12633 MOVEM A,EPDL(U) ;USER INDEX
12634 PDUMA: CAIN A,(U) ;IF PDUMP'ING SELF, MUSTN'T PCLSR,
12635 PUSHJ P,NULSET ;SO DO A NULSET INSTEAD OF THE SOSSET
12637 JRST PDUMP9 ;SO THAT A LSWPOP CAN BE DEON AT THE END IN EITHER CASE.
12638 PUSHJ P,RPCLSR ;HACKING ANOTHER JOB: STOP IT.
12641 PDUMP9: MOVE A,SRN3(U) ;GET DISK CHANNEL NUMBER
12643 UMOVE D,(C) ;PICK UP STATE WORD
12644 JUMPN D,PDUMP5 ;JUMP IF ALREADY WROTE MAP PAGE
12645 PUSHJ P,PDBWG ;GET BUFFER AND COMMIT DISK TRACK FOR MAP PAGE
12646 SETZM (E) ;CLEAR FIRST WORD OF MAP
12647 ;AND DROP INTO PDUMP4
12648 ;HANDLE THE NEXT PAGE.
12649 PDUMP4: PUSHJ P,PUPLC ;GET BYTE POINTERS
12650 LDB W,Q ;CIRC POINTER ENTRY
12651 LDB R,T ;PAGE MAP ENTRY
12652 ANDCMI R,PMAGEM ;CLEAR AGE BITS
12654 TLO R,(SETZ) ;ABS PAGE
12656 MOVEI R,0 ;PAGE NON-EXISTANT
12658 LSH R,16. ;SWAPPED OUT
12659 MOVE W,D ;VIRTUAL PAGE NUMBER
12660 ADDI W,1(E) ;ADDRESS OF ENTRY IN BLOCK
12661 MOVEM R,(W) ;STORE ENTRY
12669 MOVEI W,1000(E) ;1000-1017 ACS
12671 JRST [ XCTR XBR,.+2
12676 SETZM QSMPRC(A) ;SO NEXT IOT GETS A NEW BUFFER
12677 MOVSI D,(SETZ) ;SET STATE WORD TO `DUMPING PAGE 0'
12681 PDUMP5: MOVE C,SRN4(U) ;STORE BACK STATE WORD
12683 PDUMP8: PUSHJ P,PUPLC
12687 AOJA D,PDUMP6 ;PAGE ABSOLUTE OR NONEXISTANT
12688 PDUMP3: PUSHJ P,PDBWG ;GET BUFFER AND COMMIT DISK TRACK TO DUMP THIS PAGE INTO
12689 MOVE J,EPDL(U) ;SET UP MAP TO POINT TO USER BEING DUMPED
12691 HRLZ J,D ;GET VIRTUAL ADDRESS OF PAGE BEING DUMPED
12693 HRR J,E ;BLT POINTER TO COPY THE PAGE
12694 XCTR XBR,[BLT J,1777(E)] ;COPY PAGE INTO DISK BUFFER
12695 PUSHJ P,MPLDZ ;RESTORE TO NORMAL MAP
12697 PUSHJ P,QSBWW ;WRITE OUT THE COPIED PAGE
12698 SETZM QSMPRC(A) ;SO NEXT IOT GETS NEW BUFFER
12700 AOS D ;DONE WITH THIS PAGE
12701 PDUMP6: TRNN D,400 ;SKIP IF FINISHED WHOLE ADDRESS SPACE
12703 JRST LSWPJ1 ;UNSTOP USER AND POPJ1
12705 ;ROUTINE TO GET DISK BUFFER AND COMMIT TRACK (FOR PDUMP)
12706 ;RETURNS BUFFER ADDRESS IN E. PRESERVES D.
12708 PDBWG: SKIPL E,QSMDN(A) ;GET CORE BLOCK # OF DISK BUFFER
12709 JRST [ LSH E,10. ;CONVERT TO ADDRESS
12711 MOVE E,[444400,,1] ;NO BUFFER, GET ONE
12714 PUSHJ P,UDELAY ;CAN'T GET MEMORY, WAIT A WHILE
12717 ;ROUTINE TO LOOK UP PAGE (FOR PDUMP AND PURE LOAD)
12718 ;PAGE# IN RH(D), USER# IN EPDL(U). RESULTS FROM UPLC IN Q AND T.
12729 ;DECODE 2ND ARG TO PDUMP & LOAD.
12730 ;B GETS IOCHNM WORD ADDR, LH OF J GETS LH OF CLSTB ENTRY, RH GETS LH(IOCHNM).
12732 PDUMDC: TRNE B,-NIOCHN
12740 SUBTTL PURE AND SBLK LOAD
12742 ;`LOAD' SYMBOLIC SYSTEM CALL
12743 ; ARG 1 - JOB SPEC FOR JOB TO BE LOADED
12744 ; ARG 2 - DISK CHANNEL TO LOAD FROM
12745 ; ARG 3 - (OPTIONAL) FIRST ADDR,,LAST ADDR TO BE LOADED
12746 ; OR ZERO => LOAD ONLY PURE PAGES
12747 ; WHEN LOADING A PDUMPED FILE, FIRST,,LAST ROUNDED OFF TO PAGES
12748 ; DEFAULT 3RD ARG IS 0,,-1 NORMALLY, 20,,-1 LOADING SELF, 20,,37777 LOADING PDP6
12751 ;4.9=1 ABSOLUTE, 1.1-2.9 = PTW
12752 ;4.8=1 SHARED WITH OTHER PAGES AT LEAST ONE OF WHICH IS WRITE
12753 ;4.7=1 LINK WITH VIRT PG IN RH 1.8-1.1
12754 ;2.9-2.8 0 NXM, 1 RD ONLY, 2 OR 3 READ/WRITE
12755 ;2.7=1 WORD ALREADY PROCESSED
12758 JSP T,NCORUI ;DECODE THE JOB SPEC.
12759 JRST NLOAD6 ;JOB GUARANTEED WRITEABLE.
12760 JSP T,NCORWR ;ELSE CHECK IF WRITEABLE.
12761 CAIN J,-1 ;BUT CAN WRITE PDP6.
12763 JRST OPNL31 ;NOT WRITEABLE.
12764 NLOAD6: HRREI A,(J) ;MAKE SURE EXTEND SIGN IF PDP6.
12765 JSP T,PDUMDC ;DECODE 2ND ARG.
12768 JRST OPNL34 ;NOT DISK READ CHANNEL.
12771 JRST OPNL12 ;"MODE NOT AVAILABLE" IF CHANNEL NOT 36-BIT BYTES.
12772 MOVE R,B ;IOCHNM ADDRESS IN CASE WE GET TO QICL
12773 JUMPL A,NLOADE ;DONT STOP THE 6
12775 JRST NLOADA ;DONT STOP IF LOADING INTO SELF
12777 PUSHJ P,LSWPOP ;SOS JOB'S DIELOK - IT CAN'T DIE WHILE STOPPED.
12778 MOVSI T,BSSTP ;STOPPING WITH BSSTP INSTEAD OF RH OF USTP
12779 IORM T,USTP(A) ;AVOIDS DEADLY EMBRACE WITH CORE JOB (SEE CUSTOP)
12781 PUSHJ P,LOSSET ;ARRANGE TO CLEAR BSSTP ON PCLSR.
12784 HRLOI C,0 ;DEFAULT 3RD ARG
12787 NLOADA: PUSHJ P,LSWPOP ;DIELOK
12789 HRLOI C,20 ;DEFAULT 3RD ARG
12790 NLOADE: MOVEM A,SRN3(U) ;SAVE USER INDEX (-1 => PDP6)
12792 JUMPL A,[HLRZ A,C ;PDP6, ENSURE LIMITS SMALL ENOUGH
12794 HRLI C,20 ;ACS NOT ACCESSIBLE
12795 MOVEI A,LPDP6M*2000-1
12797 HRR C,A ;HAS ONLY 16K MEMORY
12801 MOVEM A,SRN4(U) ;SAVE # OF DISK CHANNEL
12802 SETZM SRN5(U) ;START LOADING AT VIR PG #0
12803 MOVEM C,EPDLT1(U) ;SAVE LOAD LIMITS
12806 JRST OPNL33 ;FIRST > LAST
12811 JRST NLDSBB ;(COMING BACK AFTER PCLSR)
12815 ;GET FIRST BLOCK OF FILE BEING LOADED
12816 NLOADD: CAMN U,PCLUSR
12822 PUSHJ P,UFLS ;HANG UNTIL A BLOCK IS READ IN
12824 TLNE Q,%QAACC+%QAMPU+%QAPAR
12825 JRST OPNL7 ;LOST ONE WAY OR ANOTHER
12828 PUSHJ P,QSBGB ;SET UP CHNL AREA. TT ADDR OF FIRST WORD OF BLOCK
12830 JRST NLOADC ;QSBGB SKIPS FOR NORMAL RETURN
12831 JRST OPNL46 ;SKIPPED TWICE => EOF
12833 NLOADB: MOVE J,QMPBSZ(A)
12835 NLOADC: SKIPE (TT) ;SKIP IF PURE DUMPED FILE
12838 JRST OPNL34 ;TRYING TO PURE LOAD PDP6
12839 MOVSI Q,%QAACC ;WILL GO RANDOM ACCESSING THROUGH FILE
12840 IORM Q,QSRAC(A) ;THIS ALSO INHIBITS ACTIVATION AT PI LEVEL
12841 HLRZ H,EPDLT1(U);LOW LOAD BOUNDARY
12844 JRST NLOADH ;ACS NOT BE LOADED
12845 MOVSI Q,1000(TT);ADDRESS OF DUMPED ACS
12848 HRRZ H,EPDLT1(U);HIGH LOAD BOUNDARY
12851 HRRZ J,SRN3(U) ;JOB TO BE LOADED
12853 XCTR XBW,[BLT Q,(H)] ;LOAD UP HIS ACS
12855 NLOADH: MOVEI R,1(TT) ;ADDRESS OF FIRST WORD OF DUMPED MAP
12856 MOVEM R,EPDL3(U) ;SAVE
12858 PUSHJ P,QFNTR ;FIND DISK ADDRESS OF SECOND BLOCK
12859 JRST OPNL46 ;OFF END OF FILE
12860 SOS QSBI(A) ;UNDO QFNTR HACK
12862 PUSHJ P,QUDULK ;UNLOCK USER DIRECTORY
12863 PUSHJ P,SWTL ;LOCK CIRPSW
12867 ;HERE TO DO NEXT PAGE (WHEN LOADING PDUMPED FILE)
12868 NLOAD0: PUSHJ P,OPBRK
12870 TRNE A,600000 ;SKIP IF NO ACCESS (IGNORE)
12872 JRST NLD14 ;THIS PAGE ALREADY DONE OR NO ACCESS
12874 TRNE A,400000 ;SKIP IF READ ONLY
12875 JUMPE Q,NLD14 ;IMPURE NOT BE LOADED
12876 MOVE A,SRN5(U) ;VIRTUAL PAGE NUMBER
12878 AND Q,[-2000,,-2000]
12879 LSH Q,-10. ;FIRST PAGE,,LAST PAGE
12883 JRST NLD14 ;PAGE OUTSIDE OF RANGE TO BE LOADED
12884 NLD16: MOVE U,SRN3(U) ;USER INDEX
12886 LDB R,Q ;LOOK IN CIRCULAR POINTER ENTRY FOR THIS PAGE
12887 JUMPE R,NLOAD1 ;DOESN'T ALREADY HAVE THIS VIRTUAL PAGE
12888 PUSH P,T ;SAVE BYTE POINTER TO PAGE MAP FOR THIS VIRTUAL PAGE
12889 PUSH P,Q ;SAVE BYTE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12890 PUSHJ P,PAGERT ;FLUSH THE ALREADY EXISTING VIRTUAL PAGE
12893 NLOAD1: MOVE U,USER
12894 MOVE R,@EPDL3(U) ;PICK UP DUMPED PAGE MAP WORD
12895 ANDCMI R,PMAGEM ;CLEAR AGE BITS (WOULD LOSE AT NLOAD4+4)
12896 JUMPGE R,NLOAD3 ;NOT ABSOLUTE PAGE
12897 ANDI R,PMRCM ;ABS PG #
12899 IFE PDP6P, JRST OPNL32
12901 JRST [ CAIGE R,<PDP6BM_-10.+LPDP6M>
12902 CAIGE R,<PDP6BM_-10.>
12904 HRRZ R,@EPDL3(U) ;ALLOW USER TO LOAD WRITABLE PDP6 PAGES.
12905 ANDCMI R,PMAGEM\PMUNSD ;GIVE HIM WHATEVER ACCESS HE RQ'S.
12907 ;IFN TEN11P,[ ;NOT NECESSARY SINCE 10-11 PAGES ABOVE TSYSM NOW
12910 ; MOVE E,T11MP-400(R)
12911 ; AOJN E,NLOAD2 ;DONT ALLOW PAGE TO POINT TO TEN11
12914 LDB E,[MUR,,MEMBLT(R)]
12916 TDZA R,R ;IF PAGE NXM TODAY, DON'T ACTUALLY GIVE ACCESS
12918 NLOAD5: TRO R,200000 ;RD ONLY
12919 DPB R,T ;STORE ENTRY IN PAGE MAP
12921 DPB R,Q ;STORE -1 IN CIRCULAR POINTER
12922 NLOAD2: MOVE E,SRN5(U) ;VIRTUAL PAGE NUMBER
12923 MOVE U,SRN3(U) ;USER INDEX LOADING INTO
12924 PUSHJ P,GHUSRA ;RECOMPUTE HUSRAD
12927 IORB R,@EPDL3(U) ;MARK DUMPED PAGE WORD AS ALREADY DONE
12928 MOVE A,SRN4(U) ;DISK CHANNEL
12929 TLNN R,500000 ;SKIP IF NO CORRESPONDING BLOCK IN FILE
12930 TRNN R,600000 ;SKIP IF MUST ADVANCE ONE BLOCK
12931 JRST .+3 ;DON'T ADVANCE FILE POINTER
12932 PUSHJ P,QFNTN ;ADVANCE TO NEXT DISK ADDRESS
12933 JRST OPNL46 ;PREMATURE EOF
12934 AOS R,SRN5(U) ;NEXT VIRTUAL PAGE
12937 AOS EPDL3(U) ;NEXT MAP WORD
12940 PUSHJ P,LSWPOP ;RELEASE CIRPSW
12941 MOVE B,SRN3(U) ;USER INDEX LOADING INTO
12942 CAME B,U ;SKIP IF LOADING INTO SELF
12943 PUSHJ P,LSWPOP ;UNSTOP USER
12949 NLOAD3: TLNN R,100000 ;SKIP IF LINK WITH PAGE IN RH OF R
12951 PUSH P,T ;SAVE BYTE POINTER TO MAP ENTRY FOR THIS VIRTUAL PAGE
12952 PUSH P,Q ;SAVE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12953 LDB A,[1700,,R] ;VIRTUAL PAGE NUMBER BEING LINKED TO
12955 JRST NLOAD8 ;BAD VIRT PAGE #
12956 MOVE E,SRN5(U) ;VIRTUAL PAGE NUMBER OF PAGE BEING LINKED
12957 MOVE U,SRN3(U) ;USER INDEX LOADING INTO
12959 LDB W,Q ;CIRCULAR POINTER OF OTHER ENTRY
12960 JUMPE W,NLOAD8 ;DIDN'T EXIST
12962 JRST NLOAD8 ;POINTS TO AN ABSOLUTE PAGE
12966 BUG ;L DOESN'T DIVIDE U
12967 LSH C,10 ;USER NUMBER _ 8
12969 BUG ;USER INDEX WAS TOO LARGE
12970 IOR C,E ;NEW CIRCULAR POINTER
12971 POP P,D ;NEW CIRCULAR POINTER BYTE POINTER
12972 DPB W,D ;STORE OTHER ENTRY AS NEW CIRCULAR POINTER ENTRY
12973 DPB C,Q ;MAKE OTHER CIRCULAR POINTER ENTRY POINT TO NEW ONE
12974 LDB E,T ;OTHER MAP ENTRY
12975 POP P,T ;POINTER TO NEW MAP ENTRY
12976 ANDI R,600000 ;PROTECTION BITS
12983 NLOAD9: AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS
12984 AOSA NSWPGS(U) ;USER LOADING INTO HAS ONE MORE SWAPPED OUT PAGE
12986 NLD13: AOS NMPGS(U) ;USER HAS ONE MORE PAGE
12987 AOS SNMPGS ;SYSTEM HAS 1 MORE PAGE
12989 JRST NLOAD2 ;RECOMPUTE HUSRAD AND LOOP
12991 NLOAD4: MOVE A,SRN4(U) ;DISK CHANNEL
12992 MOVEI TT,(R) ;PUT DESIRED ACCESS IN RH(TT),
12994 TDNE R,[200000,,400000]
12995 IORI TT,%CBCPY ;ALONG WITH INITIAL-SWAPIN BIT IF NEC.
12996 PUSHJ P,NCORQ7 ;FIND OR CREATE MMP ENTRY.
12997 JRST OPNL37 ;MMP FULL
12998 MOVE E,SRN5(U) ;GET PAGE # IN JOB BEING LOADED
12999 MOVE U,SRN3(U) ;TARGET USER.
13000 PUSHJ P,NCORR1 ;INSERT THE PAGE.
13003 NLOAD8: SUB P,[2,,2]
13006 NLOADZ: PUSHJ P,LSWPOP ;FREE CIRPSW
13012 POPSM2: SOS (P) ;RETURN TO LOCN BEFORE PUSHJ
13016 ;QTAOS: PUSHJ P,QTLOCK ;LOCK TUT
13017 QTAOS1: MOVE D,QSLGL(A) ;DISK TRACK
13020 BUG ;NOT PART OF ANY FILE
13023 DPB B,D ;ADD ONE TO TUT ENTRY FOR THIS TRACK
13026 NLUPCL: MOVSI T,BSSTP ;THIS IS THE LOSSET ROUTINE TO CLEAR BSSTP.
13032 NLDSBB: HRRZ J,SRN3(U) ; (COMING BACK AFTER PCLSRING OUT) A HAS DSK CHNL #)
13033 PUSHJ P,MPLDJ ;LOAD MAP (ALSO CLOBBER UMAPS)
13042 NLDSBH: HRRZ B,QPCLSR(A)
13045 NLDSB: SKIPN EPDLT1(U)
13046 JRST OPNL12 ;LOAD ONLY PURE FROM SBLK FILE LOSES
13049 MOVEM B,QPCLSR(A) ;RESTART POINT IN CASE OF PCLSR
13053 PUSHJ P,MPLDJ ;LOAD MAP (ALSO CLOBBER UMAPS)
13058 NLDSB1: HRROI I,EPDL3(U)
13059 MOVEM I,SRN4(U) ;SET UP AOBJN PTR TO READ INTO EPDL3
13060 NLDSBD: MOVEI C,SRN4(U) ;SET C UP TO POINT TO AOBJN PTR
13061 HRLI C,(TRN) ;INDICATE EXEC MODE ADR
13064 JRST NLDSB9 ;PREMATURE EOF
13067 JRST NLDSB1 ;IGNORE INITIAL STUFF UNTIL JRST 1
13068 NLDSBK: MOVEI B,NLDSBE
13070 NLDSBE: HRROI I,QLDPTR(A)
13074 PUSHJ P,QBI ;GET AN AOBJN POINTER
13076 JRST NLDSB9 ;PREMATURE EOF
13078 JRST NLDSB6 ;NOT AN AOBJN POINTER
13079 HLRZ C,EPDLT1(U);FIRST ADDRESS TO BE LOADED
13082 HLROS B ;SKIP # WDS IN C
13083 ADD B,C ;-# WDS REMAINING IN BLOCK
13085 SUB C,B ;FLUSH WHOLE BLOCK
13086 LDB D,[1200,,QSMPRP(A)]
13090 ADD D,C ;ADVANCE ACC PTR TO SKIP PART OR ALL OF BLOCK
13094 JUMPGE B,[AOS QRADAD(A) ;SKIPPING WHOLE BLOCK, ALSO SKIP CHECKSUM
13095 JRST NLDSBK] ;AND GO READ NEXT BLOCK
13097 ADDM C,QLDPTR(A) ;UPDATE AOBJN POINTER
13098 NLDSB3: MOVEI B,NLDSBF ;MAYBE FLUSH EXISTING MEMORY AND GET NEW
13100 NLDSBF: HRRZ E,QLDPTR(A) ;START ADR OF BLOCK
13101 HLRE C,QLDPTR(A) ;-LENGTH OF BLOCK
13102 SUB E,C ;DON'T COMBINE THIS INSN WITH NEXT, MIGHT BE MOBY BLOCK
13103 SUBI E,1 ;GET END ADR OF BLOCK
13104 HRRZ T,EPDLT1(U);HIGH LOAD LIMIT
13105 SUBM E,T ;NUMBER OF WORDS OF EXCESS IN BLOCK
13106 MOVEM T,EPDLT2(U) ;SAVE FOR LATER USE
13107 JUMPLE T,NLDSB7 ;JUMP IF BLOCK HAS NO EXCESS
13108 SUB E,T ;ADJUST END ADDRESS
13110 ADDM T,QLDPTR(A);DECREASE COUNT IN AOBJN POINTER
13111 NLDSB7: LSH E,-10. ;LAST PAGE NEEDED
13113 PUSH P,R ;R HAS IOCHNM WD, NEEDED IF REACH QICL VIA QBI.
13114 PUSH P,E ;PAGE NO. OF LAST PAGE NEEDED
13117 JRST NLDSB5 ;ALREADY HAVE NEEDED PAGES
13120 MOVE U,SRN3(U) ;LOOK UP THIS PAGE IN MAP OF USER WE'RE HACKING.
13121 PUSHJ P,UPLC ;IF THERES A WRITABLE PAGE
13123 LDB A,T ;IN THE SLOT ALREADY, KEEP IT.
13128 CAME U,SRN3(U) ;IF NOT HACKING SELF, NCORLL WILL LSWPOP
13129 PUSHJ P,NULSET ;WHAT IT THINKS IS A LOSSET LIKE NLUPCL
13132 MOVEI R,%JSNEW ;GET FRESH PAGE
13133 MOVE TT,SRN3(U) ;INTO THE JOB WE'RE HACKING.
13134 MOVE C,SRN5(U) ;PAGE # TO GIVE IT.
13135 MOVSI A,%CBRED+%CBWRT+%CBNDW ;WANT WRITE ACCESS.
13136 PUSHJ P,NCORL ;UNDOES NULSET AND SWTL.
13137 JRST NLSBPL ;COULDNT GET PAGE (CALLED LSWCLR)
13138 NLDSBM: AOS SRN5(U)
13139 JRST NLDSB4 ;CHECK WHETHER WE NEED MORE PAGES.
13141 NLDSB5: SUB P,[1,,1] ;NOW WE HAVE ALL PAGES NEEDED TO LOAD THIS BLOCK.
13144 NLDSBQ: MOVEI B,NLDSBC
13146 NLDSBC: HRRZI C,QLDPTR(A)
13148 PUSHJ P,QBI ;DO A BLOCK IOT, USING THAT AOBJN POINTER.
13149 AOSG B,EPDLT2(U);SKIP RESIDUE OF BLOCK AND CHECKSUM
13150 MOVEI B,1 ;NO RESIDUE, JUST SKIP CHECKSUM
13151 LDB D,[1200,,QSMPRP(A)]
13161 NLDSB6: LDB D,[1200,,QSMPRP(A)]
13169 NLDSB8: CAME U,SRN3(U) ;UNLESS HACKING SELF OR PDP6, WE HAVE A SOSSET OF USTP TO POP.
13174 NLDSB9: PUSHJ P,OPNL46 ;LOAD FILE NOT IN VALID SBLK FORMAT
13175 NLSBP1: PUSHJ P,MPLDZ
13179 NLSBPL: SUB P,[2,,2] ;FLUSH PUSHES OF E AND R.
13183 SUBTTL .GUN, .LOGOUT
13185 ;DESTROY PROCEDURE TREE WHOSE TOP INDEX SUPPLIED BY USER
13186 AGUN: XCTR XR,[SKIPG A,(J)]
13187 POPJ P, ;LOSE, NEG OR SYSTEM JOB
13190 CAMGE A,USRHI ;USER INDEX UNREASONABLE => LOSE.
13195 ALOGOU: SKIPL SUPPRO(U)
13196 JUMPN J,ABREAK ;.LOGOUT N, TURNS INTO .BREAK N,33 IF NOT TOP LEVEL
13197 MOVE A,U ;.LOGOUT, AND STY CLOSE.
13199 ;A HAS JOB BEING LOGGED OUT; U HAS JOB THAT'S DOING IT.
13200 ;.GUN AND .LOGOUT ACT BY PUTTING THE JOB IN SUCH A STATE THAT
13201 ;IT CAN DO NOTHING BUT TRY TO DISAPPEAR. IF THE JOB IS ALREADY
13202 ;IN THAT STATE, THIS ROUTINE DOES NOTHING. THAT PREVENTS
13203 ;RECURSION LOOPS WHEN KILLING CYCLIC STRUCTURES INVOLVING STY'S.
13204 ;EXCEPTION: IF THE JOB TO BE LOGGED OUT IS THE RUNNING JOB,
13205 ;WE DO THE REAL WORK BY GOING TO ALOGO1.
13206 ALOGO6: SKIPE UNAME(A) ;JOB TO BE LOGGED OUT IS GONE.
13207 SKIPL SUPPRO(A) ;CAN'T LOG OUT UNLESS TOP LEVEL.
13210 AOS (P) ;IF .GUN GETS THIS FAR, IT HAS "SUCCEEDED".
13211 MOVSI T,BULGOS+BULGO
13212 TDNE T,APRC(A) ;IF JOB IS ALREADY LOGGING OUT,
13213 JRST ALOGO7 ; SEE IF IT IS THE RUNNING JOB
13219 MOVEM A,SRN3(U) ;AUCL4 FINDS USR IDX TO HACK HERE.
13221 AUCL4 ;CLEAR BULGOS IF AUCL3 PCLSR'S
13222 PUSHJ P,AUCL3 ;SET BULGOS AND WAIT FOR DIELOK TO CLEAR.
13226 EXCH B,UPC(A) ;SET HIM UP TO LOG OUT.
13227 ALOGO4: MOVEM B,SRN3(A) ; Remember old PC for unlocking locks.
13228 MOVE B,[.LOGOUT] ;PUT THE FOLLOWING ROUTINE IN JOB'S AC'S:
13229 MOVEM B,AC0S(A) ; 0/ .LOGOUT
13230 CAMN A,USER ; 1/ .VALUE
13231 UMOVEM B,0 ; 2/ JRST 0
13241 IORM B,APRC(A) ;SAY HE'S DIEING SO NO-ONE WILL HACK HIM.
13242 MOVEM U,EPDL(A) ;RECORD WHO IS KILLING HIM.
13247 SETZM PICLR(A) ;PREVENT INTERRUPTS.
13251 ANDCAM B,USTP(A) ;MAKE SURE HE CAN RUN - ELSE HE WOULDN'T LOG OUT.
13252 ALOGO7: CONO PI,CLKON
13255 JRST ALOGO1 ;IF JOB IS RUNNING JOB, MUST HACK AROUND
13257 ALOGO5: EXCH B,UUOH ;LOGGING OUT SELF - MAKE OUR PC LOOK
13258 SOJA B,ALOGO4 ; AS IF WE HAD EXECUTED THE .LOGOUT IN AC 0
13260 ;COME HERE IF LOGGING OUT ONESELF (A=USER).
13262 PUSHJ P,AUCL3 ;WAIT TILL NO-ONE IS LOOKING AT ME,
13263 PUSHJ P,UBLAM ;CLOSE MY CHANNELS AND KILL MY INFERIORS AND CORE.
13265 CONO PI,CLKOFF ;DON'T SCHEDULE WHILE GOING AWAY
13267 IORM T,APRC(A) ;SYS JOB KILLS ANY TREES WITH BULGO SET.
13269 IORM T,SUPCOR ;TELL SYS JOB TO LOOK AROUND FOR TREES TO KILL.
13270 MOVSI T,BUSRC ;SUICIDE: MAKE SURE WE DON'T RUN ANY MORE.
13272 JRST UDELAY ;CAUSE A SCHEDULE
13274 ;COME WITH JOB INDEX IN A. INDICATE THAT JOB IS ABOUT TO DIE,
13275 ;THEN WAIT TILL IT'S SAFE TO KILL IT.
13277 AUCL3: MOVSI T,BULGOS
13278 IORM T,APRC(A) ;SAY THIS JOB STARTING TO GO AWAY.
13279 CONO PI,CLKON ;NOONE CAN START HACKING US NOW; SAFE.
13280 CAME A,USER ;IF NOT LOGGING OUT RUNNING USER,
13281 PUSHJ P,1USTOP ;STOP THE JOB BEING KILLED.
13282 SKIPE DIELOK(A) ;WAIT TILL NO-ONE IS LOOKING AT THAT JOB.
13284 HRLOI T,#BUSRC ;AND NO-ONE ELSE HAS HIM PCLSR'ED.
13287 POPJ P, ;WE SUCCEEDED, BUT CALLER HAS WORK TO DO.
13289 SUBTTL REAL TIME USER FEATURE
13291 ;.REALT AC, SKIPS ONLY IF REAL TIME FACILITY REQUESTED AND SEIZED
13292 ;AC= 4.9=>TURN OFF OLD CLOCK RATE, FLUSHING REAL TIME FACILITY AND
13293 ; REMAINDER OF CURRENT TICK AND ZEROING TICK COUNT
13294 ; 4.8=>TURN ON NEW CLOCK RATE
13295 ; 4.7=>TRY TO SEIZE REAL TIME USER FACILITY
13296 ; 4.6=>DON'T SETTLE FOR PSEUDO-REAL TIME STATUS
13297 ; 4.5 =>ONLY WANT PSEUDO
13298 ; 4.4=>PROGRAM TO BE BLOCKED EXCEPT FOR HIGH PRIORITY PHASE OR INT. LEVEL
13299 ; 4.3=>READ INTO WD3+4 AS DESCRIBED BELOW (BEFORE ANY OTHER BITS INTERPRETED)
13300 ; 3.1-4.2=RESERVED FOR EXPANSION, SHOULD BE ZERO
13301 ; 1.1-2.9=RH=POINTER TO 4 WORD BLOCK
13302 ; WD1=FRAME TIME IN 60'THS (MUST BE <2**18.)
13303 ; WD2=PRIORITY TIME IN 60'THS (MUST BE <7 AND <WD1/2)
13304 ; WD3= IF 4.3 ON, SET RH TO FRAME TIME, LH TO TICKS SINCE EXAMINED
13305 ; WD4= IF 4.3 ON, SET RH TO HIGH PRIORITY TIME, LH TO 0 IF CURRENTLY LOW
13306 ;PRIORITY OR -1 IF CURRENTLY HIGH PRIORITY
13308 AREALT: UMOVE A,(J)
13317 AREAL1: TLNN A,700000
13325 PUSHJ P,CLQDEL ;TURN OFF OLD INTS
13327 SETZM UTIME(U) ;ZERO TICK COUNT
13328 AREAL2: TLNN A,200000
13330 XCTR XR,[SKIPG T,(A)]
13333 AREAL4: TLNN A,100000
13335 XCTR XR,[SKIPLE T,1(A)]
13354 AREAL7: MOVEM U,UREALT
13356 AREAL5: CONO PI,CLKON
13357 AREAL6: SKIPN T,UTIME(U)
13367 ;CLOCK LEVEL ROUTINE
13368 UREALB: SUBI U,UCLBLK ;SET INDEX TO QUEUE BLOCK
13371 URLTB1: MOVSI T,(%PIRLT)
13378 URLTBX: SETZM SCHFLG ;CAUSE SCHEDULE THIS CLOCK BREAK
13399 SUBTTL MISCELLANEOUS SYSTEM CALLS
13401 $INSRT TIME ;ROUTINES HAVING TO DO WITH CLOCKS AND THINGS
13404 ;.CLOSE CH, ;CLOSE ANY I/O TRANSACTION OPEN ON CHANNEL CH
13406 CCLOSE: HRREI C,-IOCHNM(R) ;CLOSE CALLED INTERNALLY
13409 BUG ;R WAS NOT AN IOCHNM WORD ADDRESS.
13410 HRRZM C,UUAC(U) ;SOME CLOSE ROUTINES LOOK AT UUAC
13414 ACLOSE: HLRZ A,(R) ;SET UP A WITH L.H. OF I/O CH WORD
13415 HRRZ B,(R) ;SET UP B WITH R.H. "
13416 MOVE C,CLSTB(B) ;GET CLOSE TABLE ENTRY
13417 TLNE C,%CLSNRM ;SKIP IF NOT STANDARD CLOSE
13418 JRST STDCLS ;JUMP TO STANDARD CLOSE
13420 PUSHJ P,(C) ;CALL CLOSE ROUTINE
13422 STDCLX: SETZM (R) ;CLEAR I/O CHANNEL WORD
13423 SETZM IOCHST-IOCHNM(R) ;CLEAR I/O CHNL STATUS WORD
13426 STDCLS: CONO PI,CLKOFF ;INHIBIT CLOCK BREAKS
13427 SOSGE 1(C) ;DECREMENT USE COUNTER, SKIP IF STILL IN USE AT LEAST ONCE
13428 SETOM (C) ;NO LONGER IN USER, FREE BY SETOM'ING "XXXUSR" VARIABLE
13429 CONO PI,CLKON ;ENABLE CLOCK BREAKS
13432 AVALRET:UMOVE A,(B) ;CALL 4,
13437 AUTRAN: UMOVE C,(B)
13439 CONO PI,CLKOFF ;Don't let USRHI change or anything like that
13441 UTRNL: SUBI A,LUBLK
13452 ;RETURN WITH LOSER IN A IN LOSER MODE AND CLOCK OFF
13454 RPCCK: PUSHJ P,RPCLSR ;STOP USER (ALSO PUTS HIM IN USER MODE)
13455 CONO PI,CLKOFF ;TURN OFF CLOCK
13456 JRST UPCLSR ;"RESTART USER" (HE CAN'T RUN TILL CLOCK BACK ON)
13458 ;.LOSE X <=> .CALL [SETZ ? SIXBIT/LOSE/ ? 401000,,X ]
13461 ; USED TO REPORT LOSSAGE TO SUPERIOR PROCEDURE
13462 ;ARG 1 - LOSING INSTRUCTION ADDR,,LOSSAGE CODE (CODES DEFINED BY DDT)
13463 ;ARG 2 - NEW PC (DEFAULT = PC-2 SO CAN USE AS A NON-SKIP-RETURN HANDLER)
13464 ;CTL 1.1 - DEFAULT ARG 2 TO PC INSTEAD OF PC-2
13465 ;CTL 1.2 - SETZM @.40ADDR
13466 ;CTL 1.3 - DON'T USE THE NEW PC AS THE LOSING INSTRUCTION ADDR
13468 ALOSE: HRRZ A,FORTY ;ARG 1 = EFF ADDR OF UUO
13471 NLOSE: MOVE T,CTLBTS(U)
13474 XCTR XRW,[MOVES (D)]
13475 TLZ B,BADPC ;COMPUTE NEW PC FROM ARG 2 OR UUOH
13486 HRRI B,1(B) ;PCLSR'ING WILL SOS
13487 MOVEM A,VALUE(U) ;PASS TO SUPERIOR
13490 XCTR XW,[SETZM (D)]
13496 MOVE A,(R) ;OPER 10
13507 PUSHJ P,AUCL3 ;STOP JOB, AND WAIT TILL SAFE TO KILL IT
13516 PUSHJ P,ZUSLOG ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
13523 AUCL4: HRRZ A,SRN3(U)
13528 AUCL2: HLRZ A,(R) ;GUY BEING CLOSED
13530 LDB TT,[.BP (%CLSFU),CLSTB(B)]
13531 JUMPN TT,OPNL31 ;FOREIGN JOB => .UCLOSE ISCAN'T MODIFY JOB
13532 SKIPL CLSTB(B) .SEE %CLSU
13533 JRST OPNL34 ;NOT A JOB AT ALL?
13536 JUMPGE TT,AUCL1 ;HAVE TTY NOW
13537 TLNN TT,%TBDTY ;NOT GIVING IT AWAY.
13538 CAIE A,(TT) ;SKIP IF GAVE IT TO GUY WE'RE KILLING
13540 PUSHJ P,SDTTY ;TAKE IT BACK FROM HIM.
13545 ;DISMIS SYSTEM CALL. 1ST ARG INT PDL PTR (WILL BE DECREMENTED
13546 ;IF NOT AN IMMEDIATE ARG)
13547 ;2ND ARG OPTIONAL PC TO DISMIS TO (OVERRIDES THAT IN INT PDL)
13548 ;3RD ARG OPTIONAL NEW .DF1 VALUE " " " "
13549 ;4TH ARG OPTIONAL NEW .DF2 VALUE ...
13550 ;5TH ARG OPTIONAL ERROR CODE AS IN LOSE. IF PRESENT WILL LOSE RIGHT AFTER DISMISSING.
13551 ;IF 4 ARGS GIVEN, 1ST IGNORED EXCEPT FOR POSSIBLY DECREMENTING, OR POPPING OF ACS.
13552 ;CTL BITS (SAME FORMAT AS LH OF 1ST WORD OF INTERRUPT DISPATCH TABLE)
13553 ;SPECIFY POPPING OF SAME EXTRA INFO THAT INTERRUPTS CAN PUSH.
13557 MOVE E,A ;GET IN E THE INT PDL PTR.
13558 TLNN E,1000 ;IF 1ST ARG IMMEDIATE, IT IS PTR,
13559 UMOVE E,(A) ;ELSE IT PTS TO PTR.
13560 MOVE H,E ;SAVE UNPOPPED PDL POINTER FOR PDL OV CHECKING.
13561 TLNE A,1000 ;IF PDL PTR ISN'T IMMEDIATE, POP IT ACC. TO CTL BITS.
13565 SUB E,[3,,3] ;POP OFF DEBUGGING INFO IF IT WAS PUSHED.
13567 JUMPE TT,NDISM2 ;IF ACS WERE PUSHED, POP THEM TOO.
13569 SUB E,TT ;DECREMENT THE PDL POINTER ENOUGH
13571 HRLI I,1(E) ;AND COPY FROM THE PDL TO THE ACS.
13573 XCTR XBRW,[BLT I,(TT)]
13574 NDISM2: CAIGE W,2 ;IF NO 2ND ARG, GET PC FROM INT PDL
13576 CAIGE W,3 ;IF NO 3RD ARG, GET .DF1 FROM INT PDL
13578 CAIGE W,4 ;IF NO 4TH ARG GET .DF2 FROM INT PDL
13580 TLNE A,1000 ;IF 1ST ARG NOT IMMED, DECREMENT IT
13584 JUMPGE E,NDISM3 ;AND CHECK FOR PDL OVFLO.
13586 PUSHJ P,NDISMP ;PDL OVFLO, SET INT BIT IF INT ENABLED.
13587 NDISM3: MOVEM C,IDF1(U) ;RESTORE THE PC, .DF1, .DF2
13594 NDISMP: MOVEI TT,%PIPDL ;PDL OV INT BIT.
13599 ;OLD-STYLE DISMISS JOINS HERE
13600 ADISMIS:UMOVE B,(B) ;CALL 1,
13601 NDISM1: TLO B,%PCUSR
13606 SETCM A,UUOH ;IF ONE-PROCEEDING THE .DISMISS
13607 TLNN A,%PS1PR-%PSINH
13608 TLO B,%PS1PR-%PSINH ;TRAP IMMEDIATELY AT THE NEW PC
13613 ;CHECK FOR PENDING INTERRUPTS AND TAKE THEM RIGHT AWAY
13617 CONO DSDEV,DSDCHN ;ENABLE INTERRUPT FROM 6
13620 PUSHJ P,APISE6 ;SEE IF ANY DEVICES WANT TO RE-INTERRUPT.
13624 IOR D,IDF1(U) ;FIND ALL DISABLED OR DEFERRED
13625 SKIPN PICLR(U) ;(ALL ARE DEFERRED WHEN PI IS OFF).
13627 AND D,[BADBTS] ;BAD
13628 TDNE C,D ;PENDING INTERRUPTS
13629 JRST ADISM7 ;IF THERE ARE ANY, LET THEM HAPPEN.
13632 JUMPN C,ADISM7 ;1ST WD INT. PENDING.
13636 JUMPE C,CPOPJ ;JUMP IF NO 2ND WORD INT PENDING.
13637 ADISM7: MOVE C,[JRST ONEFLS]
13641 APISE6: MOVE D,MSKST(A) ;IF INTERRUPT FROM CONSOLE ENDBLED,
13644 SKIPL T,TTYTBL(A) ;IF THIS JOB HAS ITS CONSOLE
13645 SKIPN TINTC(T) ;AND THE CONSOLE HAS INT. CHARS,
13647 MOVEI D,%PITYI ;GENERATE AN INTERRUPT.
13649 APISE7: MOVE D,MSKST2(A) ;LOOK AT HIS ENABLED IO CHANNELS.
13651 APISE0: JFFO D,APISE9 ;CHECK EACH ONE.
13652 JRST APISE8 ;ALL CHECKED.
13654 APISE9: MOVNS E ;CHECK ONE IO CHNL THAT'S ENABLED TO INT.
13655 ANDCM D,CHNBIT+35.(E) ;MARK THIS CHNL AS HANDLED.
13656 ADDI E,35.+IOCHNM(A) ;GET ADDR OF IOCHNM WD FOR CHANNEL.
13657 HRRZ T,(E) ;IS IT A TTY INPUT CHANNEL?
13661 LDB T,[$TIIDX,,(E)] ;YES, GET THE TTY NUMBER.
13663 CAIE T,%TINON ;IF IT ISN'T A DISOWNED TY CHANNEL,
13664 CAIE C,(A) ;AND THE TTY BELONGS TO THIS JOB,
13666 SKIPN TINTC(T) ;AND IT HAS AN INT. CHAR WAITING,
13669 APISE4: AND C,MSKST2(A) ;GIVE AN INT. ON ONE OF THE CHANNELS IT'S OPEN ON.
13675 APISE2: CAIN T,STYDUI ;NOT A TTY CHNL. IS IT A STY CHNL?
13679 APISE3: LDB T,[$TIIDX,,(E)] ;YES, GET TTY #.
13680 SKIPL C,STYSTS-NFSTTY(T) ;STY IN USE BY THIS JOB?
13683 SKIPGE TTYOAC(T) ;TTY OUTPUT PENDING?
13685 MOVE C,STYMSK-NFSTTY(T) ;YES, INT. ON ONE CHANNEL.
13700 ;.SLEEP AC, ;IF C(AC) + OR ZERO: ;BECOME DORMANT FOR C(AC) 1/30'THS OF A SEC
13701 ;IF C(AC) -: ;BECOME DORMANT TILL MAGNITUDE OF C(AC) > C(TIME)
13702 ASLEEP: XCTR XR,[MOVN T,(J)] ;PICK UP NEGATIVE OF C(AC)
13703 JUMPGE T,ASLP1 ;JUMP IF C(AC) WAS NEG
13704 SUB T,TIME ;COMPUTE NEG OF TIME SLEEP SHOULD RUN OUT
13705 UMOVEM T,(J) ;STORE BACK SO YOU WILL WIN IF PCLSR'ED OUT
13706 ASLP1: MOVMS A,T ;MAKE POSITIVE
13707 SUBI A,60.*30. ;IF SLEEPING FOR MORE THAN A MINUTE
13710 IORM B,USWST(U) ;PUT RIP VAN WINKLE ON ICE
13712 JRST ASLP2 ;ALWAYS GO TO UFLS AT LEAST ONCE
13714 CAMLE T,TIME ;HANG TILL C(T) LESS THAN C(TIME)
13715 ASLP2: PUSHJ P,UFLS
13716 XCTR XW,[SETZM (J)] ;CLEAR OUT ARG (FOR COMPATIBILITY WITH WHEN AC WAS COUNTED OUT)
13717 JRST CLKONJ ;MAKE SURE CLKCHN ON IN CASE SLEEP WAS 0 & SKIPPED UFLS ENTIRELY
13719 ;RELOAD CALL - IGNORE ARGS
13720 ;MUST BE FROM TOP LEVEL NON-DISOWNED JOB
13721 ;RELOADS AND STARTS SYS: ATSIGN WHATEVER
13723 NRELOAD:SKIPGE SUPPRO(U)
13725 JRST OPNL40 ;NOT TOP LEVEL
13727 PUSHJ P,LOGUPD ;LOG OUT
13728 PUSHJ P,DMNPLI ;AND IN AGAIN
13729 PUSHJ P,USRST2 ;RESET USER VARS
13731 SETZM @UTMPTR(U) ;TEMPORARY HIGH PRIORITY
13732 JRST USTCDR ;LOAD FILE AND START IT
13734 AMASTER:UMOVE J,(J)
13735 CONO PI,CLKOFF ;OPER 61
13739 AMAST1: HRRZM U,UMASTER
13748 AMAST3: JUMPGE J,CLKOJ1
13756 ;.CALL SSERVE - Set .SERVER variable without timing screw.
13757 ; ARG1: <job>, the client whose .SERVER variable is to be munged
13758 ; ARG2: <job>, the server to be stored in the variable
13759 ; If one arg is given, it is the server and the client defaults to %JSELF
13765 JSP T,NCORUI ; Decode client and AOS his DIELOK
13766 JRST NSSRV1 ; OK to write
13767 JSP T,NCORWR ; Check further
13768 JRST OPNL31 ; CAN'T MODIFY JOB
13772 JRST OPNL34 ; WRONG TYPE DEVICE
13774 EXCH J,A ; A: client J: server
13775 JSP T,NCORUI ; Decode server and AOS his DIELOK
13776 JFCL ; Don't give a damn about writability
13779 JRST OPNL34 ; WRONG TYPE DEVICE
13781 MOVEM J,SERVER(A) ; Safe to set it now
13782 PUSHJ P,LSWPOP ; Server's DIELOK
13783 JRST LSWPJ1 ; Client's DIELOK
13786 SUBTTL LOGIN/ATTACH/DETACH/DISOWN CODE
13788 ;SYMBOLIC CALL LOGIN: LOG A TREE IN. MUST BE GIVEN BY TOP-LEVEL NON-LOGGED-IN JOB
13789 ;WITH NO INFERIORS.
13790 ;ARG 1 - DESIRED UNAME
13791 ;ARG 2 - "TERMINAL NAME", PUT IN TRMNAM USER VARIABLE AND PRINTED AS SIXBIT ON SYSCON.
13792 ;ARG 3 - DESIRED XUNAME, FOR DEMON TO KNOW WHO TO ACCOUNT.
13794 NLOGIN: HLRE T,UNAME(U)
13795 AOJN T,OPNL31 ;JUMP ON ALREADY LOGGED IN
13797 JRST OPNL40 ;CAN'T LOG IN IF NOT TOP LEVEL
13800 AOJE T,OPNL11 ;BAD NAME
13802 MOVE C,A ;IF XUNAME (ARG 3) MISSING, DEFAULT TO UNAME.
13805 ALOG2: SKIPN UNAME(D)
13811 JRST OPNL13 ;CONSOLE CONTROLLED TREE ALREADY LOGGED IN THAT NAME
13813 ALOG3: HRRZ T,SUPPRO(D)
13814 CAMN T,U ;CAN'T LOGIN IF HAVE INFERIOR. RESTRICTION IMPOSED HERE
13815 JRST OPNL12 ;SINCE WE NO CODE HERE TO SET INFERIOR'S UNAME.
13816 ALOG4: ADDI D,LUBLK
13818 JRST ALOG2 ;LOOP FOR ALL SETS OF PROCEDURE VARIABLES
13820 HRLI T,[ASCIZ / LOGIN /]
13821 PUSHJ P,SGWAIT ;ASK THE SYSTEM JOB TO PRINT OUT THE RELEVANT INFO
13822 SKIPL TTYTBL(U) ;SKIP IF NOT CONSOLE CONTROLLED
13823 AOS SUSRS ;INCREMENT COUNT OF LOGGED IN CONSOLE CONTROLLED TREES
13824 MOVEM A,UNAME(U) ;SET UNAME TO WHAT LOGGED IN AS
13826 MOVEM A,USYSNM(U) ;SET SNAME "
13827 MOVEM A,HSNAME(U) ;SET HOME SNAME "
13828 MOVEM C,XUNAME(U) ;SET XUNAME " " (USER MAY MUNG LATER)
13830 MOVEM B,SLGIV+2 ;INCLUDE TRMNAM AS SECOND NAME PRINTED
13831 PUSHJ P,DMNPLI ;GIVE INFO TO DEMON
13832 JRST CLKOJ1 ;TURN CLK ON AND SKIP RETURN
13834 ASETM2: UMOVE A,1(J) ;.OPER 5
13836 ASETMSK: UMOVE D,(J) ;OPER 4
13839 SOS (P) ;WILL SKIP RETURN
13840 JRST USMASK ;ACT LIKE .SUSET.
13842 ARSYSI: SKIPA A,[ITSVRS] ;OPER 52
13843 ARDTIME:MOVE A,TIME ;OPER 17
13846 IFE KS10P,[ ; On the KS10 they made DATAI 0, a UUO!
13847 ARDSW: DATAI A ;OPER 20
13850 IFN KS10P, ARDSW==:ILUUO
13852 ASUPSET:MOVEI C,003777 ;OPER 53
13853 XCTR XR,[AND C,(J)]
13854 MOVE D,SUPCOR ;SAVE OLD CONTENTS
13866 ; SETZ [<JOB SPEC>] ;SEE NCORUI
13868 ;DISOWN JOB'S ENTIRE TREE AND FREE CONSOLE. IF TREE HAS NO
13869 ;CONSOLE, JUST MAKES IT DISOWNED. NO ARG => THIS JOB'S TREE
13870 ;ALWAYS SKIPS IF THE JOB SPEC IS REASONABLE.
13872 ;CTL BIT 1.1 => DON'T SET SIGN OF APRC (DON'T MAKE TREE "DISOWNED").
13873 ;CTL BIT 1.2 => USE SYSTEM TREE'S RESOURCE WORD
13874 ;CTL BIT 1.4 => KILL TREE AN HOUR FROM NOW IF IT ISN'T REOWNED
13875 ;CTL BIT 1.5 => SUPPRESS THE CONSOLE-FREE MESSAGE ON THE TTY
13877 NDETAC: HLRZ B,A ;XOR LH OF 1ST ARG INTO CTL BITS
13879 PUSHJ P,SWTL ;MAKE SURE NOBODY ELSE IS REARRANGING TREES.
13881 MOVEI J,(U) ;DEFAULT TO OUR TREE
13882 JUMPE W,NDETA0 ;JUMP IF NO ARGS SUPPLIED
13884 JSP T,NCORUI ;DECODE ARG, GET USER INDEX IN J
13885 JFCL ;IGNORE INFO ON WRITEABILITY
13886 CAIG J,LUBLK ;DONT DETACH SYSJOB OR CORE JOB
13888 NDETA0: SKIPL T,SUPPRO(J) ;FIND TOP LEVEL JOB OF TREE (IN J)
13891 HRRZ A,J ;TOP OF TREE
13893 JRST LSWCJ1 ;TREE IS ALREADY DISOWNED.
13895 PUSHJ P,IFPLUP ;STOP ALL BUT THIS JOB
13896 PUSHJ P,NDETA7 ;DO THE WORK
13897 JRST LSWCJ1 ;UNSTOP THE TREE
13899 NDETA7: PUSH P,U ;US
13900 PUSH P,A ;TOP LEVEL
13903 PUSHJ P,LOGUPD ;FOR ACCOUNTING PURPOSES, THIS IS LIKE A LOGOUT
13905 NDETA1: MOVEI U,(A) ;GET IN U USER INDEX OF OWNER OF TTY
13906 MOVE A,TTYTBL(U) ;GET IN A TTY NUMBER
13907 TLNE A,%TBDTY ;TREE HAS NO TTY =>
13908 JRST [ POP P,A ;JUST MAKE IT DISOWNED.
13911 JUMPL A,NDETA1 ;GAVE TTY AWAY
13912 MOVE T,(P) ;TOP-LEVEL JOB OF TREE SAVES USER TTY OPTIONS IN
13913 MOVE B,TTYOPT(A) ;HIS STTYOP VARIABLE
13914 AND B,[%TOUSR,,%TPUSR]
13916 LDB B,[.BP (%TCRFS+%TCQRY),TTYCOM(A)]
13917 IORI B,4 ;MAKE STTYOP NON-ZERO TO SHOW IT WAS STORED
13918 DPB B,[170300,,STTYOP(T)] ;OVERLAPS PADLF FIELD
13920 PUSH P,TTYSTS(A) ;SAVE THIS TTY INFO
13921 PUSH P,TTYST1(A) ;WILL PUT INTO TTY OWNER'S USER VARS
13922 PUSH P,TTYST2(A) ;AFTER SUCCEED IN FREEING THE TTY
13925 MOVN B,TPVB+TPLEN(B)
13928 MOVSI B,%TCDET ;IF TREE DETACHED DUE TO TOP LVL INT,
13929 SKIPN USER ;THE CONSOLE FREE MESSAGE SHOULD SAY SO.
13930 IORM B,TTYCOM(A) .SEE SYSCFM
13931 ;THIS ALSO HAPPENS IF DIALUP LINE HUNG UP, OS'ERS BEWARE!
13936 PUSHJ P,TVBNCL ;CLEAR VIDEO BUFFER #
13939 MOVE B,-5(P) ;GET BACK IDX OF RUNNING JOB
13942 TRNE B,20 ;CTL BIT 1.5 => MARK THE TTY AS NOT NEEDING CNSL FREE MSG.
13944 PUSHJ P,TTYLO1 ;NOW MAKE CONSOLE FREE.
13945 POP P,B ;CAN'T PCLSR AFTER THIS POINT
13946 DPB B,[$TBECL,,TTYTBL(U)]
13947 POP P,TTSTSV+1(U) ;STORE INTO TTY'S OLD OWNER
13948 POP P,TTSTSV(U) ;OLD TTY VARS FROM BEFORE FREEING IT
13950 MOVEM B,TTSTSV+2(U)
13951 SKIPA A,(P) ;TOP LEVEL JOB
13953 SKIPGE T,TTYTBL(A) ;SKIP IF HE HAS IT
13954 JRST NDETAA ;NOW DO GUY HE GAVE IT TO
13956 BUG ;BUT. BUT. BUT.
13957 MOVSI B,%TBNOT+%TBDTY ;TAKEN FROM --ME-- AND DOESN'T HAVE IT
13963 AOSE B ;IF DETACHED TREE WAS LOGGED IN
13964 SOS SUSRS ;ONE LESS CONSOLE CONTROLLED TREE
13965 NDETA5: MOVSI B,BUMRTL ;IF REQUESTED, MARK TREE AS DUE TO DIE
13966 MOVE D,CTLBTS(U) ;IN AN HOUR.
13970 CONO PI,CLKOFF ;PERFORM ACCOUNTING FOR THIS USER AS IF HE WERE LOGGING OUT.
13974 MOVE D,JNAME(A) ;IF TOP LEVEL JOB ...
13975 CAME D,[SIXBIT /HACTRN/] ;IS A HACTRN,
13977 NDETA2: AOS D ;AOS ITS NAME LEVEL UNTIL ...
13978 PUSHJ P,UJNAMU ;IT IS UNIQUE
13979 JRST NDETA2 ;(UJNAMU TURNS OFF CLOCK)
13982 PUSHJ P,DMNPLI ;LOG BACK IN, NAME MAY HAVE CHANGED FROM HACTRN TO HACTRO
13985 MOVEI Q,NDETA9 ;NOW SAY ALL JOBS IN TREE
13986 JRST IFPLUP ;ARE DISOWNED
13988 NDETA8: CAIE A,(U) ;IF JOB ISN'T SELF, STOP IT
13992 ;"ATTACH" SYSTEM CALL:
13993 ;1ST ARG - JOB SPEC -> OUR INFERIOR, OR TOP OF A DISOWNED TREE.
13994 ;2ND ARG - TTY SPEC (OF A TTY WHICH MUST BE FREE)
13995 ;2ND ARG ABSENT => USE OUR CONSOLE, AND GUN OUR TREE
13996 ;CONTROL BIT 400000 => CHANGE JOB'S NAME TO HACTRN (IF 2 ARGS)
13997 ; 4 => START JOB AFTER ATTACHING (JUST LIKE DETACH)
13999 ;CONNECTS THE SPECIFIED JOB TO THE SPECIFIED TTY, AS A CONSOLE CONTROLLED TREE.
14000 ;IF THE TTY IS OUR CONSOLE, WE ARE LOGGED OUT.
14001 ;IF THE JOB IS OUR INFERIOR, IT IS FIRST DISOWNED.
14003 NATTAC: PUSHJ P,SWTL
14006 EXCH A,B ;2ND ARG => IT IS TTY SPEC, SO DECODE IT.
14009 MOVE B,I ;AND PUT IT IN B.
14012 NATTAN: SKIPL B,SUPPRO(U) ;NO 2ND ARG => WE MUST BE TOP LEVEL, SINCE WE'LL HAVE
14013 JRST OPNL40 ;TO LOG OUT. B GETS NEGATIVE.
14015 JSP T,NCRUI2 ;DECODE 1ST ARG, GET USR IDX IN J.
14018 JRST NATTA5 ;JOB SPEC'D MUST BE EITHER
14019 CAIE U,(A) ;OUR INFERIOR, OR
14023 NATTA5: SKIPL APRC(J) ;THE TOP OF A DISOWNED TREE.
14025 ;NOW IF TTY IS OUR CONSOLE, B IS NEGATIVE; OTHERWISE, B HAS TTY #.
14026 NATTA7: PUSH P,CTLBTS(U)
14027 SETZM CTLBTS(U) ;DON'T GET FAKED OUT AT NATTA1, NATTA2, DSWNTY.
14030 MOVEI Q,NDETA8 ;STOP SPEC'D JOB AND ITS INFERIORS.
14033 NATTAM: CONO PI,TTYOFF
14034 SKIPL T,TTYSTA(B) ;SEE IF TTY IS FREE
14036 MOVSI T,(SETZ) ;IT IS, GRAB IT
14037 ANDCAM T,TTYSTA(B) .SEE %TACFM
14038 ANDCAM T,TTYSTS(B) .SEE %TSFRE
14040 JRST NATTA8 ;SINCE NO PCLSR POSSIBLE, DON'T BOTHER WITH A LOSSET OF THESE
14042 NATTAL: HRRE Q,TTYSTS(B)
14044 SKIPG Q ;IF TTY IS IN USE
14045 TLNE T,%TACTZ ;OR BEING ^Z'ED, DEVICE NOT AVAIL
14046 JRST [ SUB P,[2,,2] ? JRST OPNL10 ]
14047 MOVSI T,%TACFM+%TACTZ ;OTHERWISE JUST WAIT FOR CONSOLE FREE
14048 TDNN T,TTYSTA(B) ;MESSAGE TO FINISH COMING OUT
14052 NATTAG: MOVE A,U ;IF HACKING OUR CONSOLE, MUST STOP OUR WHOLE TREE
14053 MOVEI Q,NDETA8 ;(EXCEPT US, OF COURSE - NDETA8 CHECKS THAT).
14056 NATTA4: MOVE B,TTYTBL(B) ;FIND THE TTY'S NUMBER.
14058 JRST NATTAL ;THIS TREE HAS NO TTY?
14059 JUMPL B,NATTA4 .SEE %TBNOT
14060 PUSHJ P,SDTTY ;GET TTY BACK TO TOP OF TREE FOR AGBLT3 LATER.
14063 ;I BELIEVE THAT NOTHING CAN PCLSR BEYOND THIS POINT.
14064 ;RH OF B HAS TTY #; SIGN IS SET IF TTY IS OUR CONSOLE.
14065 NATTA8: AOS TTNTO(B) ;KEEP DSWNTZ FROM HALTING (WILL UNDO THIS LATER)
14066 PUSH P,B ;PUSH <CONSOLE-FLAG>,,<TTY #>
14067 HRRZ A,-1(P) ;LEGALITY OF CALL FULLY CHECKED; CAN START ALTERING.
14068 SKIPGE APRC(A) ;IF SPEC'D JOB IS OUR INFERIOR, DISOWN IT.
14071 TLNE B,%TBDTY ;IF THE INFERIOR HAS THE TTY, TAKE IT AWAY.
14075 NATTAF: HRRZ A,-1(P)
14076 MOVEI Q,DSWNTY ;JUST LIKE .DISOWN, BUT KNOW JOBS ARE ALREADY STOPPED.
14079 NATTA9: MOVEI Q,NATTA2
14081 SKIPGE (P) ;IF HACKING OUR CONSOLE, DISOWN OUR TREE SO IT IS FREE.
14083 ;OUR TTY NOW IN INCONSISTENT STATE SINCE WE ARE DISOWNED
14084 ;BUT TTY STILL BELONGS TO US. AGBLT3 FIXES THAT.
14088 MOVE TT,-1(P) ;NOW "RE-OWN" THE SPEC'D JOB
14089 MOVE A,UNAME(TT);NOT CHANGING ITS UNAME
14090 HRRZ J,B ;TO THE DESIRED TTY, WITH APPRO. RESOURCE WORD.
14092 TLO D,400000 ;TELLS UFN2A THE TREE SHOULD BECOME UN-DISOWNED.
14093 SETZ B, ;NO INTERRUPT BIT NEEDED.
14094 SETOM DLSRCH ;INHIBIT SCHEDULING (UFN2A UNDOES THIS)
14100 NATTAH: MOVE C,D ;FIND THE JOB IN THE TREE BEING ATTACHED
14102 TLNN D,%TBDTY ;THAT IS SUPPOSED TO GET CONTROL OF THE TTY.
14104 SETOM SUPPRO(A) ;BUT DON'T LEAVE IT THINKING IT IS OUR INFERIOR.
14107 HLRE B,UNAME(A) ;ATTACHING JOB TO FREE TTY:
14109 AOS SUSRS ;THIS MAY MEAN 1 MORE LOGGED IN CONSOLE-CTL'ED TREE.
14111 PUSHJ P,TTYINI ;INIT TTYOPT, ECHO AREA, TTYCOM, TTYSTA.
14112 MOVSI B,%TSFRE ;NOW MAKE TTY'S TTYSTS HAPPY
14117 CONO PI,TTYON#1 ;TTYCHN ON, BUT NOT CLKCHN.
14119 PUSH P,I ;IF THE JOB BEING ATTACHED IS LOGGED IN,
14120 MOVE U,-3(P) ;PERFORM ACCOUNTING FOR IT.
14131 MOVE B,-2(P) ;SAVED CTLBTS(U) AT ENTRY
14134 NATTAI: MOVE B,-2(P) ;CTLBTS
14135 MOVSI D,%USTSP ;BUSRC
14137 ANDCAM D,USTP(A) ;START JOB BEING ATTACHED, IF REQUESTED TO
14139 HRRZ U,C ;GET USR IDX GIVING TTY TO IN U,
14141 HRRZ T,I ;TTY # IN T FOR USTTV0
14142 PUSHJ P,USTTV0 ;GIVE THE JOB A BLINKER IF IT DESERVES ONE.
14145 POP P,A ;USR IDX TAKING TTY FROM (BUT NOT REALLY TAKING). I AND U STILL SET.
14146 PUSHJ P,AGBLT4 ;MOVE HIS PER-JOB VARIABLES INTO THE TTY'S VARIABLES, ETC.
14147 JRST NATTAE ;CLOCK IS NOW BACK ON.
14149 NATTAD: CONO PI,CLKOFF
14150 MOVE J,JNAME(U) ;ATTACHING OUR TTY TO JOB:
14151 MOVEM J,JNAME(A) ;GIVE JOB OUR JNAME ALONG WITH OUR TTY.
14154 PUSHJ P,AGBLT6 ;TRANSFER TTY TO HIM, SAVING OUR TTY STATE AND LOADING HIS.
14157 EXCH U,(P) ;U := USER INDEX OF TOP OF TREE BEING ATTACHED
14158 MOVSI T,BUMRTL ;SINCE TREE HAS BEEN ATTACHED, IT SHOULDN'T
14159 ANDCAM T,APRC(U) ;DIE AN HOUR AFTER IT WAS DETACHED.
14160 SKIPN STTYOP(U) ;RESTORE SAVED TTY OPTIONS, IF ANY
14162 LDB T,[170200,,STTYOP(U)]
14163 DPB T,[.BP (%TCRFS+%TCQRY),TTYCOM(I)]
14164 MOVE T,[%TOUSR,,%TPUSR]
14168 NATTAP: HLRE T,UNAME(U)
14171 PUSHJ P,DMNPLI ;LOG HIM IN
14174 SUB P,[1,,1] ;FLUSH SAVED CTLBTS
14175 PUSHJ P,LSWCLR ;UNSTOP THE JOBS AND FREE TREESW
14176 JUMPGE B,POPJ1 ;RETURN IF WE DIDN'T GIVE AWAY OUR CONSOLE.
14177 SETOM TTYTBL(U) ;DON'T WANT ALOGOU TO TYPE LOGOUT MESSAGE.
14178 JRST ALOGOUT ;LOG THIS JOB OUT.
14181 ; RH OF ARG IS JOB SPEC, OF OUR INFERIOR.
14182 ; LH OF ARG XOR CONTROL BITS:
14183 ; 1.1 => RETAIN PRIORITY (DON'T SET APRC)
14184 ; 1.2 => USE SYSTEM RESOURCE
14185 ; 1.3 => CLEAR .USTP AFTER DISOWNING (THUS AVOIDING TIMING ERROR)
14186 ; 1.4 => SET BUMRTL SO THAT JOB WILL BE GUNNED IF IT IS STOPPED FOR A WHOLE HOUR
14187 ; AND NOT REOWNED OR ATTACHED.
14190 XORM J,CTLBTS(U) ;XOR LH OF 1ST ARG INTO CTL BITS.
14192 JSP T,NCRUI2 ;DECODE JOB SPEC; DON'T SET DIELOK.
14195 JRST OPNL31 ;PDP6 NO GOOD.
14197 ADD R,A ; R GETS ADDR OF IOCHNM WORD IF ARG WAS CHANNEL #,
14198 TRNE A,400000 ;GET S0 IF ARG WAS OTHER SORT OF JOB SPEC.
14203 JRST OPNL31 ;NO GOOD IF NOT OUR INFERIOR.
14204 JRST NDISO1 ;JOIN OLD-STYLE DISOWN
14206 ;.DISOWN CH, ;MAKES DIRECTLY INFERIOR PROCEDURE OPEN ON CHANNEL CH
14207 ;THE TOP LEVEL JOB OF A DISOWNED JOB
14209 ADISOWN:HRRZ B,(R) ;PICK UP CH TYPE INDEX
14210 SKIPL CLSTB(B) .SEE %CLSU ;SKIP IF AN INF. USER CHANNEL
14211 JRST IOCER7 ;OTHER TYPE, GIVE IOC ERROR
14212 HLRZ A,(R) ;PICK UP INF.'S INDEX
14214 NDISO1: PUSHJ P,SWTL
14218 TLNE B,%TBDTY ;SKIP IF TTY TAKEN AWAY
14221 PUSH P,A ;JOB TO BE DISOWNED HAS THE TTY: TAKE IT AWAY.
14226 ADISO1: MOVEI Q,DSWNTY
14227 PUSHJ P,IFPHAK ;HACK INFERIORS
14230 PUSHJ P,NATTA1 ;FLUSH OUR POINTERS TO INFERIOR, AND SET FLAGS
14233 JRST LSWCJ1 ;UNSTOP HIS TREE AND FREE TREESW
14235 ;FLUSH INFERIOR-JOB CHANNELS FROM JOB IN U TO JOB IN A
14236 ;CANNOT PCLSR BECAUSE JOB IS CURRENT OR STOPPED ALREADY
14237 NATTA1: MOVEI R,0 ;NO PROTECTED CHANNEL
14240 PUSHJ P,ZUSES1 ;FLUSH POINTERS TO INFERIOR
14242 SETOM SUPPRO(A) ;MARK AS TOP LEVEL
14244 MOVSI TT,BUSRC ;CLEAR .USTP IF REQUESTED
14252 DSWNTY: SKIPL TTYTBL(A)
14253 BUG ;CHECKED AT HIGHER LEVEL, DATA INCONSISTENT
14254 NATTA2: TDZA T,T ;DO SOS TTNTO OF CONSOLE TTY.
14255 NDETA9: SETO T, ;DON'T.
14256 PUSHJ P,CHSCAA ;LOOK AT ALL CNHLS
14257 PUSHJ P,DSWNTZ ;BLESSING CONSOLE TTY CHNLS
14258 MOVEI TT,SYSRCE ;SET RESOURCE POINTER TO SYSTEM OR DISOWNED
14259 MOVE W,CTLBTS(U);DEPENDING ON CTLBTS
14261 MOVEI TT,USRRCE+NCT
14265 IORM T,APRC(A) ;MARK AS DISOWNED
14268 ;BLESS CONSOLE TTY CHANNELS. IF T NONZERO, DON'T SOS TTNTO.
14269 DSWNTZ: HLRZ B,(R) ;GET LH OF IOCHNM WORD
14270 HRRZ J,(R) ;GET DEV TYPE INDEX
14271 CAIL J,TYIDN ;SKIP IF LESS THAN LEAST TTY INDEX
14272 CAILE J,TYOBN ;SKIP UNLESS .LTEQ. HIGHEST
14273 POPJ P, ;NOT A TTY CHANNEL
14274 TRZ B,#%TICNS#(.BM $TIIDX)
14275 TRZE B,%TICNS ;SKIP IF NOT A CONSOLE TTY
14276 CAIN B,%TINON ;DO NOTHING TO "DISOWNED" TTY CHNLS
14278 MOVEI J,%TINON ;CHANGE OTHER TTY CHNLS TO DISOWNED
14279 DPB J,[$TIIDX,,(R)] ;CHNLS.
14280 JUMPN T,CPOPJ ;IN NDETAC, TTNTO ALREADY SETZM'D.
14281 SOSLE TTNTO(B) ;DECREMENT OPEN COUNT
14283 BUG ;SHOULD BE OPEN AT HIGHER LEVELS
14285 ;ROUTINE TO SCAN ALL I/O CHANNEL AND I/O PDL SLOTS OF A PROCEDURE
14286 ;R 4.9=1 => REGULAR CHANNEL 4.9=0 => IOPUSHED CHANNEL
14287 CHSCAA: MOVEI R,IOCHNM(A)
14291 HRLI R,-<LUIOP/2>+400000
14297 ;IFPHAK AND IFPLUP TAKE A USER INDEX IN A AND THE ADDRESS OF A ROUTINE
14298 ; IN Q. THEY CALL THE ROUTINE FOR THE PROCEDURE AND ALL OF ITS
14299 ; INFERIORS BUT IFPHAK ALSO STOPS THE SPECIFIED PROCEDURE AND
14300 ; ALL ITS INFERIORS STRINGING THEIR USTP'S INTO THE CURRENT USER'S
14305 MOVE U,USER ;MADE SURE YOU USE THE RIGHT LSWPR
14306 MOVEI Q,IFSTOP ;SET UP TO STOP
14310 IFPLUP: PUSH P,E ;SAVE E
14313 IFPLU5: MOVE A,E ;RECURSE
14316 PUSHJ P,(Q) ;CALL ROUTINE
14319 MOVEI E,LUBLK*2 ;INITIALIZE TO INDEX OF JOB AFTER CORE JOB
14320 IFPLU2: SKIPN UNAME(E)
14325 IFPLU3: ADDI E,LUBLK ;STEP TO NEXT VAR BLOCK
14326 CAMGE E,USRHI ;SKIP IF ALL EXAMINED
14327 JRST IFPLU2 ;NOT ALL, CONTINUE
14328 CAME H,A ;ALL, SKIP IF BACK TO TOP LEVEL
14329 JRST IFPLU4 ;NOT AT TOP LEVEL, POP UP
14332 POPJ P, ;RETURN FROM CALL TO IFPLUP
14334 IFPLU4: MOVE E,A ;POP
14335 HRRZ A,SUPPRO(A) ;UP
14336 JRST IFPLU3 ;AND CONTINE
14338 IFSTOP: PUSHJ P,RPCLSR ;STOP ROUTINE WHOSE INDEX IS IN A
14342 JRST UPCLSR ;HAVE ALREADY HACKED THIS GUY
14343 IFSTP1: MOVEI T,USTP(A) ;GET LOC OF USTP (WAS AOSED BY RPCLSR)
14344 MOVEI H,LSWB0(A) ;GET LOC OF A LOCKED SWITCH BLOCK OF PROC STOPPED
14345 MOVEM T,(H) ;SET WD1
14351 IORI T,603000 ;SOS WHEN UNLOCKED
14353 MOVEM H,LSWPR(U) ;ADD TO LOCKED SWITCH LIST OF USER
14356 UBLAM: SKIPL APRC(U) ;SKIP IF DISOWNED
14357 PUSHJ P,SDTTY ;GET TTY UP TO THIS LEVEL
14359 UBLAST: PUSHJ P,IODCL ;CLOSE IO DEVICES ETC
14361 PUSH P,U ;DO NOT USE THIS ROUTINE FOR CORING UP.
14366 SETOM BUSR ;SWAP-BLOCKED NO MORE
14369 ANDCAM TT,USWSCD(U)
14371 UBLST4: MOVE U,USER
14372 PUSHJ P,ACRF1 ;CORE DOWN TO NUM OF BLOCKS IN B
14374 MOVE U,USER ;;CHECK FOR ALLEGED BUG SOMEPLACE IN ACRF1
14376 BUG ;;NOT SUPPOSED TO RETURN UNTIL CORE REQUEST SATISFIED
14379 BUG ;;THUS GUY'S CORE SHOULD BE GONE BY NOW
14384 LDB B,[400,,B] ;OPER 50
14389 IFN NUNITS, TLNE A,%CLSDI
14390 .ALSO SKIPA A,UTEOF(A)
14394 ;OPER TO REQUEST OR FLUSH RUNNING IN IOT USER MODE
14395 AIOTLS: MOVSI A,400000
14397 XCTR XR,[SKIPGE (J)]
14398 JRST AIOTL1 ;JUMP IF WANT TO ENTER IOTLSR MODE
14403 AIOTL1: SKIPGE IOTLSR(U)
14404 JRST AIOTL2 ;ALREADY IN IOTLSR, JUST TURN THE BIT ON AGAIN FOR HIM
14405 BUG INFO,SIXBIT,UNAME(U),SIXBIT,JNAME(U),[IOTLSR]
14406 MOVEI T,SCRMSG ;WAIT FOR IT TO BE PRINTED (HA HA WHAT ABOUT BUFFERING?)
14410 AIOTL2: IORM B,UUOH
14413 SUBTTL FILENAME TRANSLATION
14415 ;ROUTINE TO TRANSLATE A FILENAME.
14416 ;WANTS DEV, FN1, FN2, SNAME IN A, B, C, D RESP. LEFT-JUST.
14417 ;WANTS MODE IN RH OF E.
14418 ;RETURNS TRANSLATED NAMES IN SAME PLACE.
14419 TRAN: SKIPN D ;MAYBE DEFAULT THE SNAME.
14420 TRAN6: MOVE D,USYSNM(U)
14425 SKIPN TRNCNT ;IF NO TRANSL. ENTRIES IN USE,
14426 JRST POPJ1 ;SHORT CUT.
14427 PUSHJ P,TRANRF ;GET READ ACCESS TO TRANSL LISTS.
14428 LDB I,[100,,E] ;GET INPUT/OUTPUT BIT.
14429 MOVEI H,10 ;MAX. NUM. TRANSLS ALLOWED.
14430 TRAN0: HRROI Q,(U) ;1ST TRY THIS JOB'S TRNLST.
14433 TRAN1: SKIPGE Q,SUPPRO(Q) ;MOVE UP TREE TO TRNLS1.
14434 SETZ Q, ;AFTER TOP OF TREE, USE SYS.
14435 TRAN2: MOVE J,TRNLS1(Q) ;USE THIS GUY'S TRNLS1.
14436 MOVEI Q,(Q) ;INDICATE THAT FACT IN SIGN.
14438 TRAN3: CAME B,TRANI1(J) ;ENTRY'S FN1 MATCHES
14439 SKIPN TRANI1(J) ;OR IS NULL?
14440 SKIPA TT,TRANI2(J) ;YES, GET FN2.
14441 JRST TRAN4 ;NO, TRY NEXT ENTRY.
14442 CAME TT,C ;FN2 MTCHES OR NULL.
14444 CAME D,TRANIS(J) ;SNAME ?
14446 SKIPA TT,TRANID(J) ;YES, GET DEV.
14449 JUMPN TT,TRAN4 ;TEST DEV.
14450 HLRZ TT,TRANLK(J) ;GET ENTRY'S MODE BITS.
14451 TRNN TT,1(I) ;TRANSLATE OUR MODE?
14457 IRPS X,,OD O1 O2 OS
14459 MOVE A+.IRPCN,TRAN!X(J)
14460 TERMIN ;REPLACE NAMES FROM ENTRY.
14461 TRNE TT,400000 ;ATOMIC?
14462 JRST TRANX3 ;YES, EXIT.
14463 SOJG H,TRAN0 ;ELSE RETRANSL.
14464 JRST TRANX2 ;IF TOO MANY TRANSL., DON'T SKIP.
14466 TRAN4: HRRE J,TRANLK(J) ;CDR DOWN LIST.
14467 TRAN5: JUMPGE J,TRAN3 ;TRY NEXT UNLESS AT END.
14468 JUMPL Q,TRAN2 ;IF DID TRNLST, DO SAME JOB'S TRNLS1.
14469 JUMPN Q,TRAN1 ;ELSE DO SUPPRO'S TRNLS1.
14470 TRANX3: AOS (P) ;EXIT IF DID SYS.
14471 TRANX2: SOS TRNREF ;NO LONGER USING TRANSL. LISTS.
14474 TRANRF: AOS TRNREF ;SAY USING TRANSL. LISTS.
14476 POPJ P, ;OK IF NOT BEING CHANGED.
14477 SOS TRNREF ;NOT REFERENCING AFTER ALL.
14478 SKIPL TRANSW ;WAIT TILL FREE.
14480 JRST TRANRF ;TRY AGAIN.
14481 \f;TRANS SYSTEM CALL.
14482 NTRNS: JSP T,DEFARG ;DEFAULT 5 ARGS TO 0.
14484 XOR E,CTLBTS(U) ;XOR CTL BITS WITH ARG S
14485 PUSHJ P,TRAN ;TRANSLATE NAME.
14486 JRST OPNL3 ;FAIL IF TOO MANY TRANSL.
14487 JRST POPJ1 ;ELSE GIVE BACK TRANSL'D NAMES.
14490 DEFARG: CAML W,(T) ;IF NOT ALL SPEC'D,
14492 SETZM A(W) ;DEFAULT ONE AND RETRY.
14495 ;LOCK TRANSW, AND SET UP 1ST ARG FOR NTRNAD, NTRNDL, NTRNCL.
14496 ;RH OF A HAS JOB SPEC; CONTROL BIT ARGS XOR'D INTO LH.
14497 ;THE 4.8 BIT, IF SET, INDICATES TRNLS1 RATHER THAN TRNLST.
14498 ;OTHER LH BITS IGNORED,, NOT CHANGED BY NTRNUI.
14499 ;ON RETURN, A'S LH IS UNCHANGED, RH IS SUCH THAT
14500 ; TRANLK(A) IS THE ADDR OF THE SPECIFIED TRNLS VAR.
14501 NTRNUI: PUSHJ P,SWTL
14505 JSP T,NCRUI2 ;DECODE THE JOB-SPEC.
14506 JRST NTRNU1 ;JOB GUARANTEED WRITEABLE.
14507 JUMPE J,NTRNU1 ;ALLOW JOBS TO MUNG THE SYSTEM TRANSLATION LIST.
14508 JSP T,NCORWR ;ELSE CHECK.
14509 JRST OPNL31 ;NOT WRITEABLE.
14511 JRST OPNL34 ;PDP6??
14512 HRRI A,TRNLST-TRANLK(J)
14513 TLNE A,200000 ;4.8 BIT SAYS WHICH TRNLS TO USE.
14514 ADDI A,TRNLS1-TRNLST
14517 ;GET UP TO 4 ARGS INTO D ... D+3, FROM AOBJN PTR IN B.
14518 NTRNGA: MOVSI H,-4 ;UP TO 4 ARGS.
14520 NTRNG0: UMOVE J,(B)
14521 JUMPGE W,NTRNG2 ;W IS -1 FOR .TRANA, .TRAND;
14522 TRNN H,-1 ;IN THAT CASE LEFT-JUST. DEV. (1ST ARG)
14524 NTRNG2: CAMN J,[SIXBIT/*/]
14525 MOVEI J,0 ;REPLACE * BY BLANK.
14526 MOVEM J,D(H) ;STORE AWAY.
14527 AOBJP H,CPOPJ ;DONE AFTER 4TH ARG.
14528 AOBJN B,NTRNG0 ;ELSE GET NEXT.
14529 NTRNG3: SETZM D(H) ;ZERO REMAINING ARGS.
14532 \f;TRANEX CALL -- READ IN A JOB'S TRANSL LIST.
14533 ;1ST ARG RH - JOB SPEC. BIT 4.8 - IF SET, TRNLS1 NOT TRNLST.
14534 ;2ND ARG AOBJN -> PLACE TO STORE LIST INTO.
14535 ;UPDATED AOBJN PTR IS OUTPUT ARG.
14536 ;SKIPS IF ENTIRE LIST FIT IN BUFFER.
14537 ;EACH ENTRY TAKES 9 WDS OF SPACE: MODE,, IN 1ST,
14538 ;INPUT DEV, FN1, FN2, SNAME; THEN OUTPUT DEV, FN1, FN2, SNAME.
14539 NTRNEX: PUSHJ P,TRANRF ;GET READ ACCESS TO TRANSL LISTS.
14540 PUSHJ P,SOSSET ;RELINQUISH IF BLOCKED.
14544 JSP T,NCRUI2 ;DECODE THE JOB SPEC.
14545 JFCL ;NOT TRYING TO WRITE.
14546 HRRI A,TRNLST-TRANLK(J)
14547 TLNE A,200000 ;MAKE TRANLK(A) BE TRNLS VAR.
14548 ADDI A,TRNLS1-TRNLST
14549 SUB B,[1,,1] ;SINCE WE AOBJ BEFORE ACTING.
14550 NTRNE1: HRRE T,TRANLK(A) ;AT END -> RETURN SKIPPING.
14552 HLLZ D,TRANLK(T) ;RETURN LH ONLY OF 1ST WD.
14554 NTRNE2: MOVE D,TRANLK(T) ;ALL OF OTHER 8 WDS.
14555 AOBJP B,[ PUSHJ P,OPNL37
14560 AOBJN T,NTRNE2 ;STORE ALL 9.
14561 MOVEI A,-9*SIOMT(T) ;GO TO NEXT.
14565 AOBJP B,.+1 ;COMPENSATE FOR SUB .
14566 PUSHJ P,LSWPOP ;RELEASE READ ACCESS.
14568 JRST SYSCPT ;RETURN AOBJN PTR.
14569 \f;TRANDL CALL -- DELETE ENTRY FROM TRANSL LIST.
14570 ;1ST ARG RH JOB SPEC. OF JOB WHICH IS OK TO MODIFY.
14571 ;1ST ARG LH MODE BITS AS FOR .TRANAD, ALSO 4.8 BIT SAYS TRNLS1
14572 ; (SPEC'D JOB AND INFS, RATHER THAN JUST SPEC'D JOB)
14573 ;2ND ARG AOBJN -> INPUT DEV, FN1, FN2, SNAME. (ONLY DEV NEC.).
14574 ;SKIPS IF SOMETHING WAS DELETED.
14575 NTRNDL: JSP Q,NTRNUI ;PROCESS 1ST ARG., LOCK TRANSW.
14576 NTRND: PUSHJ P,NTRNDA ;ACTUALLY DELETE.
14577 JRST OPNL4 ;NOTHING TO DELETE => FILE NOT FOUND
14578 JRST LSWPJ1 ;SKIP IF NTRNDA DID.
14580 NTRNDA: TLZ A,-1#400003
14581 PUSHJ P,NTRNGA ;ELSE GET INPUT NAMES.
14584 HRRZS (P) ;CLEAR SKIP FLAG.
14586 NTRND2: MOVEI T,(H) ;CDR DOWN BOTH PTRS.
14587 NTRND0: HRRE H,TRANLK(T) ;LOOK AT NEXT ENTRY.
14588 JUMPL H,NTRNDX ;EXIT IF END.
14589 CAMN D,TRANID(H) ;ALL 4 INPUT NAMES MUST MATCH.
14591 JRST NTRND2 ;ELSE NOT TO BE DELETED.
14595 HLLZ R,A ;GET MODE FROM ARG.
14596 TLZ R,400000 ;DONT CLOBBER ATOM BIT
14597 ANDCA R,TRANLK(H) ;TURN OFF IN MODE FROM ENTRY.
14598 CAME R,TRANLK(H) ;IF DELETED ONE, CALL WILL SKIP.
14601 TLNE R,3 ;IF NEITHER DIRECTION LEFT, SPLICE OUT.
14603 SKIPE TRNREF ;WAIT TILL NOONE READING TRANSL LISTS.
14605 SOS TRNCNT ;ONE LESS ENTRY IN USE.
14606 HRRZ R,TRANFL ;MAKE LINK -> CURRENT FREE LIST.
14608 HRRM R,TRANLK(T) ;REST OF TRNLS INTO PREDECESSOR'S LINK.
14609 HRRZM H,TRANFL ;ADD THIS ONE TO FREE LIST.
14612 NTRNDX: HRRES TRANLK(A) ;IN CASE DELETED 1ST ENTRY.
14614 AOS (P) ;SKIP IF SET FLAG.
14616 \f;TRANAD CALL. -- ADD AN ENTRY TO A TRANSL LIST.
14617 ;1ST 2 ARGS AS FOR TRANDL.
14618 ;3RD ARG LIKE 2ND BUT GIVES OUTPUT NAMES.
14619 ;SKIPS UNLESS ALL ENTRIES WERE IN USE.
14620 NTRNAD: JSP Q,NTRNUI
14621 NTRNA: TLNN A,3 ;IF RELLY NOTHING WOULD BE TRANSL'D,
14622 JRST LSWPJ1 ;DON'T BOTHER ADDING..
14623 PUSHJ P,NTRNDA ;DELETE ANY EXISTING TRANSL. FOR THESE INPUT NAMES.
14624 JFCL ;IF WERE NONE.
14626 JRST OPNL5 ;NO FREE ENTRIES - DIRECTORY FULL.
14627 AOS TRNCNT ;1 MORE ENTRY IN USE.
14628 IRPS X,,ID I1 I2 IS
14629 MOVEM D+.IRPCN,TRAN!X(T)
14630 TERMIN ;PUT INPUT NAMES INTO ENTRY.
14632 PUSHJ P,NTRNGA ;GET OUTPUT NAMES.
14633 IRPS X,,OD O1 O2 OS
14634 MOVEM D+.IRPCN,TRAN!X(T)
14635 TERMIN ;STORE OUTPUT NAMES.
14636 MOVE H,TRANLK(A) ;PUT CURRENT TRNLS INTO LINK.
14638 HRREM H,TRANFL ;STORE BACK REST OF FREE LIST.
14639 MOVEM T,TRANLK(A) ;TRNLS NOW STARTS WITH THSI ONE.
14640 HLLM A,TRANLK(T) ;STORE MODE BITS.
14642 \f;TRANCL CALL -- RESET A ONE OR BOTH TRANSL LISTS FOR A JOB.
14643 ;1ST ARG RH HAS JOB SPEC OF MODIFYABLE JOB.
14644 ; BIT 4.8 CLEAR TRNLS1 VAR. (TRANSL FOR THIS JOB & INFS).
14645 ; BIT 4.7 CLEAR TRNLST VAR. (TRANSL FOR THIS JOB ONLY).
14646 ; ALWAYS SKIPS IF VALID.
14647 NTRNCL: JSP Q,NTRNUI ;RH(A) -> TRNLST OR TRNLS1 VAR.
14649 SUBI A,TRNLS1-TRNLST ;MAKE -> TRNLST VAR.
14650 SUBI A,TRNLST-TRANLK
14653 NTRNCA: SUBI A,TRNLST-TRANLK ;MAKE HOLD USR IDX.
14654 NTRNC: PUSHJ P,SWTL ;GET WRITE ACCESS.
14657 SKIPE TRNREF ;WAIT FOR READ REFS TO FINISH.
14659 TLNN A,100000 ;IF 4.7, HANDLE TRNLST.
14662 SETOM TRNLST(A) ;SET LIST TO NIL.
14663 JUMPGE T,NTRNC1 ;IF WASN'T NIL, FREE ENTRIES ON IT.
14664 NTRNC0: TLZN A,200000 ;MAYBE HANDLE TRNLS1.
14668 JUMPL T,LSWPOP ;NOTHING TO DO IF ALREADY NIL.
14669 NTRNC1: MOVEI C,(T) ;SAVE START OF LIST.
14670 NTRNC2: SOS TRNCNT ;UPDATE NUM ENTRIES IN USE.
14672 JUMPL H,NTRNC3 ;AT END, SPLICE INTO FREELIST.
14673 MOVEI T,(H) ;ELSE CDR DOWN.
14675 NTRNC3: EXCH C,TRANFL
14677 JRST NTRNC0 ;MAYBE CONSIDER THE OTHER LIST.
14678 \f;.TRANA, .TRAND CALLS.
14679 ATRANA: UMOVE E,(B)
14680 JSP T,ATRNDT ;SET UP ARGS FOR NTRNA .
14681 PUSHJ P,SWTL ;GET WRITE ACCESS.
14686 ATRAND: XCTR XR,[SKIPN E,(B)]
14687 JRST ATRND0 ;ZERO UNAME -> TRANCL .
14688 JSP T,ATRNDT ;SET UP ARGS.
14689 PUSHJ P,SWTL ;GET WRITE ACCESS.
14693 ATRND0: JSP T,ATRNDT
14694 TLO A,300000 ;SAY CLEAR BOTH LISTS.
14696 SUBI A,TRNLS1-TRNLST ;NAKE SURE -> TRNLST VAR.
14699 ATRNDT: MOVE C,JNAME(U)
14700 MOVEM C,ATRNJN ;WHO THE HELL'S USING THESE?
14701 CAME E,UNAME(U) ;UNAME MUST BE 0 OR THSI JOB'S.
14702 JUMPN E,CPOPJ ;ELSE MAKE UUO FAIL.
14703 MOVNI W,1 ;SIGNAL TO NTRNGA.
14704 MOVEI C,5(B) ;SET UP 2 AOBJN PTRS
14706 HRLI C,-3 ;-> INPUT NAMES (B), OUTPUT NAMES (C).
14708 XCTR XR,[HLL A,(B)] ;GET MODE BITS.
14710 JUMPE D,CPOPJ ;JNAME MUSTN'T BE 0.
14711 CAME D,[SIXBIT/*/] ;IF *, USE THIS JOB'S TRNLS1.
14713 HRRI A,TRNLS1-TRANLK(U)
14716 ATRND2: MOVEI H,0 ;ELSE FIND JOB WITH THAT JNAME.
14717 MOVE E,UNAME(U) ;THIS JOB'S UNAME.
14718 ATRND1: CAMN E,UNAME(H)
14720 JRST ATRND3 ;NOT THE ONE WE'RE LOOKING FOR.
14722 CAIE U,(E) ;IS THIS OUR INF.
14723 CAIN U,(H) ;IS IT THE CURRENT JOB?
14725 POPJ P, ;NO, CAN'T SET ITS TRANSL LIST.
14726 HRRI A,TRNLST-TRANLK(H)
14727 JRST (T) ;OK, SET ITS TRNLST VAR.
14728 ATRND3: ADDI H,LUBLK
14729 CAMGE H,USRHI ;LOOK AT ALL JOBS.
14731 POPJ P, ;CAN'D TRANAD NON EX JOB.
14733 SUBTTL JOB, BOJ DEVICE ROUTINES
14736 JBMN==10 ;MAXIMUM NUMBER OF JOBS ON JOB DEVICE
14738 JBCUI: REPEAT JBMN,-1 ;-1 => CHNL FREE, ELSE (IF JBCG POSITIVE) CREATOR'S USR IDX.
14739 JBCG: BLOCK JBMN ;-1 IF CREATOR GONE AWAY
14740 JBWST: REPEAT JBMN,SNJOB ;CREATED JOB'S WAIT STATUS (CREATED JOB=HANDLER JOB)
14742 %JBWIN==400000 ;4.9 => CREATED JOB HAS DONE A SUCCESSFUL JOBRET
14743 %JBREU==200000 ;4.8 => JOB CLOSED AND MADE ITSELF AVAILABLE FOR REUSE
14744 %JBVAL==020000 ;4.5 => VALID BIT (CREATOR CAME IN, NO JOBRET YET)
14745 %JBSTR==010000 ;4.4 => STORED BIT (CREATOR CAME IN, NO JOBGET YET)
14746 %JBUNH==004000 ;4.3 => BOJ BLK UNHANG BIT
14747 %JBSIO==001000 ;4.1 => IF DOING AN IOT, THIS BITS SAYS ITS REALLY A SIOT
14748 %JBLOS==000400 ;3.9 => CREATED JOB WAS CLOSED AND KNOWS IT, SO DON'T REUSE
14749 ;1.1-2.9 => LAST STATUS SET BY BOJ
14751 JBDEV: BLOCK JBMN ;DEVICE NAME, USER-SETTABLE (MOSTLY FOR PEEK AND WHO LINES)
14752 JBFN1: BLOCK JBMN ;FN1
14753 JBFN2: BLOCK JBMN ;FN2
14754 JBSYS: BLOCK JBMN ;SYSNAME
14755 JBOPNM: BLOCK JBMN ;OPEN MODE
14756 JBFNP: BLOCK JBMN ;BP TO ASCIZ FILENAME STRING IN USER ADDRESS SPACE (OR 0 IF NONE).
14757 JBCJUI: BLOCK JBMN ;RH = CREATED JOB'S USER INDEX.
14758 ;LH = -1 IFF CREATED JOB GOING AWAY. JOB MUST EXIST
14759 ;SINCE WHEN IT DIES IT FLUSHES THE JOB CHANNEL
14760 ;AND ITS CREATOR'S CHANNELS.
14761 JBSTS: BLOCK JBMN ;STATUS OF JOB-BOJ INTERACTIONS
14762 ;4.9=1 => IMAGE =0 => ASCII
14763 ;4.8=1 => BLOCK =0 => UNIT
14764 ;4.7=1 => WRITE =0 => READ
14765 ;4.6-4.3 => NUMBER OF TIMES TO SKIP
14766 ;4.2-3.6 => OPEN LOSS
14767 ;3.5-3.2 => # OF ARGS ON LAST .CALL
14768 ;1.4 => SYSTEM CALL OTHER THAN THOSE BELOW.
14769 ;1.3-1.1 => SYSTEM CALL
14776 ;6 FDELE (DELETE OR RENAME)
14777 ;7 FDELE (RENAME WHILE OPEN)
14779 JBST2: BLOCK JBMN ;SECOND WORD OF JOBGET INFO
14781 ;FOR SIOT, THE BYTE COUNT
14782 ;FOR BLOCK IOT, THE BLOCK POINTER
14783 ;NEW FN1 FOR RENAME, MLINK.
14784 JBOFN1: BLOCK JBMN ;FN1 BEFORE LAST TRANS
14785 JBOFN2: BLOCK JBMN ;FN2 "" ""
14786 JBOSYN: BLOCK JBMN ;SYSNAM ""
14787 JBODEV: BLOCK JBMN ;DEV " "
14788 JBNFN2: BLOCK JBMN ;NEW FN2 FOR FDELE.
14789 JBAC7: BLOCK JBMN ;7TH ARG TO .CALL, NEW SNAME FOR MLINK.
14790 JBAC10: BLOCK JBMN ;TABLE FOR .CALL ARG 10, FIRST BP ARG TO SOPEN/RENAME/MLINK/DELETE.
14791 JBAC11: BLOCK JBMN ;TABLE FOR .CALL ARG 11, SECOND BP ARG TO RENAME, MLINK OR RENMWO.
14793 JBACTB: JBST2(H) ;TABLE OF POINTERS TO .CALL ARG TABLES
14803 JBIOCJ: BLOCK JBMN ;IO CHNL ERROR WORD. 4.9 => IOCER ON NEXT JOB IOT
14806 JBSW: -1 ;LOCK ON ASSIGNMENT OF INDEX IN ABOVE TABLES
14810 ;OPEN ON BOJ: DEVICE
14812 ;3.5 = 1 => UNHANG ON BLK IOT AFTER EACH XFER OF MAXIMAL SIZE
14813 BOJO: JUMPN W,OPNL12 ;NO SUCH MODE
14814 SKIPGE E,JBI(U) ;JOB CHANNEL INDEX
14815 JRST [ MOVE E,OPTION(U) ;IF THIS JOB ISN'T A JOB DEVICE,
14816 TLNN E,%OPOJB ;IF IT'S EXPECTING TO BE AN OJB DEVICE, OK.
14817 JRST OPNL10 ;OTHERWISE IT CAN'T WIN.
14818 SKIPGE JBI(U) ;IF IT CAN WIN, WAIT TILL IT HAS.
14820 JRST BOJO] ;THEN TRY AGAIN.
14822 BUG ;JOB CHANNEL INDEX TOO BIG
14836 ;OPEN ON JOB: DEVICE
14838 ;3.1-3.3 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
14839 ;A,B HAVE FILENAMES, RH(C) HAS DEVICE (JOB OR OJB)
14840 ;RH(D) AND LH(C) BOTH HAVE OPEN-MODE.
14842 JOBO: PUSHJ P,FLDRCK
14844 JRST OPNL11 ;ILLEGAL FILE NAME
14845 JOBO3: CAMN A,[SIXBIT /M.F.D./]
14846 CAME B,[SIXBIT /(FILE)/]
14848 JRST OPNL11 ;ILLEGAL FILE NAME
14849 JOBO2: MOVEI J,0 ;SET J TO JOBGET "COMMAND" NUMBER
14851 MOVEI J,2 ;MLINK, MOSTLY JUST LIKE FDELE, BUT SEE JOBOF3
14856 PUSHJ P,SWTL ;LOCK JOB CHNL ASSIGN SWITCH
14858 JOBO5: SKIPGE TT,JBCUI(Q) ;SKIP IF NOT FREE
14862 JRST JOBORU ;JUMP IF THIS IS FIRST ATTEMPT TO OPEN
14866 SKIPGE JBCG(Q) ;LOOK FOR CHANNEL ON WHICH THIS USER
14867 CAIE TT,(U) ;PREVIOUSLY ATTEMPTED TO OPEN, BUT PCLSRED
14873 JRST JOBO6 ;NOT OPENING SAME FILE
14878 JRST JOBO6 ;NOT FOR SAME FILE
14884 JRST JOBO6 ;NOT FOR SAME OPEN TYPE AND MODE
14886 TLNE TT,%JBLOS+%JBWIN+%JBREU
14887 JRST JOBO6 ;HANDLER JOB NOT IN CORRECT STATE
14888 HRRZ E,Q ;REUSE SAME HANDLER JOB AS IN PREVIOUS ATTEMPT TO OPEN
14889 SETZM JBCG(E) ;I'M BACK
14890 PUSHJ P,LSWPOP ;FREE JBSW
14892 MOVEM TT,JBWST(E) ;RE-GIVE OPEN COMMAND STILL SITTING IN JBSTS ETC.
14893 HRLI E,400000 ;OPEN-TYPE WAIT
14894 PUSHJ P,JBWT2 ;WAIT FOR HANDLER JOB TO PROCESS IT
14895 JRST JOBO8 ;FINISH OFF THEN OPEN
14897 ;FIRST ATTEMPT TO OPEN, CHECK FOR REUSEABLE HANDLER JOBS BEFORE CREATING NEW
14898 JOBORU: CONO PI,CLKOFF
14902 JRST JOBO6 ;IN USE ALREADY OR NOT WILLING TO BE REUSED
14905 JRST JOBOR1 ;IF SAME SIMULATED DEVICE, OK TO SIEZE
14908 JRST JOBO6 ;DIFFERENT HANDLER NAME
14911 JRST JOBO6 ;DIFFERENT HANDLER NAME
14912 JOBOR1: MOVEM TT,JBWST(Q) ;THIS ONE OK, SIEZE IT
14918 PUSHJ P,LSWPOP ;FREE JBSW
14921 JOBO4: HRRZ E,Q ;REMEMBER FREE JOB CHNL IN CASE NEEDED
14922 JOBO6: CONO PI,CLKON
14923 AOBJN Q,JOBO5 ;SCAN REST OF JOB CHANNELS
14924 JUMPL E,OPNL6 ;DEVICE FULL
14925 MOVEM U,JBCUI(E);STORE CREATOR'S USER INDEX
14926 PUSHJ P,LSWPOP ;FREE JOBSW
14927 PUSHJ P,STMSET ;SETOM JBCUI(E) ON LOSSAGE
14934 MOVEI T,SNJOB ;INITIALIZE STATUS
14943 ANDI C,-1 ;FOR OJB DEVICE, LOOK FOR EXISTING JOB.
14946 MOVE A,UNAME(U) ;FOR JOB DEVICE, CREATE NEW JOB.
14951 ADD B,[SIXBIT /JOB./] ;CREATE JNAME = 'JOB.MN'
14952 MOVE C,[7,,(SIXBIT /USR/)]
14954 PUSHJ P,USROJ ;GENERATE USER(CAN ONLY PCLSR BEFORE CREATING INFERIOR)
14955 JRST POP7J ;USER OPEN FAILED, MUST HAVE GONE TO OPNL ALREADY
14961 MOVE T,[JBSTCD,,AC0S]
14966 MOVEM A,AC0S+10(TT)
14967 MOVEM B,AC0S+11(TT)
14969 MOVEM T,USYSNM(TT) ;SET CREATED JOB'S SYS NAME TO OURS
14970 SETZM USTP(TT) ;START JOB AS SOON AS CLK BACK ON
14973 ;OJB: DEVICE, LOOK FOR JOB WHOSE NAMES ARE THE FILENAMES SPECIFIED IN THE OJB OPEN.
14974 JOBO6B: MOVE C,[7+UBPFJ,,'USR] ;DON'T EVER CREATE JOB FOR OJB.
14975 MOVE D,[SETZ 3+UBPFJ_<-1>]
14980 ;TT HAS USER IDX OF JOB TO BE USED; CAN'T PCLSR AFTER THIS POINT.
14981 JOBO6C: PUSHJ P,LSWDEL ;SETOM JBCUI(E)
14988 JOBO7: CONO PI,CLKOFF
15005 JUMPN J,[PUSHJ P,JFDEL5 ;DELETE/RENAME/MLINK
15007 LDB TT,[000300,,JBOPNM(E)]
15010 HRRZ C,JBOPNM(E) ;GET ALL OF OPEN MODE
15011 MOVEM C,JBNFN2(E) ;GIVE IT
15012 JOBO9: PUSHJ P,JBWT1 ;STORE STUFF AND HANG
15013 JOBO8: LDB TT,[350400,,JBSTS(E)]
15014 JUMPE TT,JOBOPL ;OPEN LOST
15015 LDB C,[000400,,JBSTS(E)]
15016 JUMPN C,[ SETOM JBCG(E) ;DELETE/RENAME/MLINK
15019 SETZM IOCHST-IOCHNM(R)
15027 JOBOPL: LDB C,[270600,,JBSTS(E)]
15034 ;RENAME WHILE OPEN ON JOB CHNL
15035 JFDEL4: HLRZ E,(TT) ;JOB CHNL INDEX
15037 PUSHJ P,JFDEL5 ;DO "FDELE"
15038 MOVE TT,EPDL3(U) ;PASS ALONG THE BP ARG IF THERE WAS ONE.
15041 JRST AIOCA1 ;GET RESULTS
15043 ;FDELE/RENMWO/MLINK ON JOB CHANNEL
15044 JFDEL5: MOVEM J,JBSTS(E)
15045 MOVE TT,SRN3(U) ;REMEMBER NAMES TO RENAME AS
15046 MOVEM TT,JBST2(E) ;FOR JOBGET TO RETURN.
15049 MOVE TT,SRN5(U) ;IN CASE THIS IS MLINK, MAKE SURE THE "TO" SNAME
15050 MOVEM TT,JBAC7(E) ;IS GIVEN TO JOBGET.
15054 ;GIVE AN INTERRUPT TO THE JOB DEVICE HANDLER.
15055 ;JOB CHNL INDEX IN E, CLOBBERS TT,J,Q,H
15058 JBINT: HRRZ TT,JBCJUI(E)
15063 TDNN H,CLSTB(Q) ;SKIP IF BOJ
15064 JBINT2: AOBJN J,JBINT1
15072 ;THIS IS THE CODE PUT IN THE ACS TO LOAD IN THE JOB DEVICE HANDLER
15074 JBSTCD: .OPEN 1,7 ;0
15081 4,,(SIXBIT /DSK/) ;7
15088 -1 ;16 (LOAD INTO SELF)
15091 ;HAND THE JOB DEVICE HANDLER A SYSTEM CALL AND WAIT FOR IT TO BE HANDLED.
15092 ;CALL WITH CLOCK OFF, JOB CHNL IN E
15093 JBWT1: TLOA E,400000 ;OPEN/FDELE/MLINK, CLOSE CHANNEL IF PCLSR
15094 JBWT: TLZ E,400000 ;NORMAL ENTRY POINT, DON'T CLOSE IF PCLSR
15096 JBWTI: HRLI E,200000 ;ENTER HERE TO INHIBIT SETTING %PCFPD IF PCLSR
15097 MOVSI TT,%JBVAL+%JBSTR
15098 IORM TT,JBWST(E) ;TURN ON VALID AND STORED
15099 JBWT2: PUSHJ P,JBINT ;GIVE INT
15101 JBPCL ;CLEAR VALID AND STORED IF PCLSR
15102 MOVE T,E ;CAUSES EPDL2 TO HAVE JOB INDEX
15105 PUSHJ P,UFLS ;AWAIT RESULTS FROM HANDLER JOB
15107 ANDCAM TT,UUOH ;NOW WE KNOW WE'LL RETURN TO USER WITHOUT PCLSRING FIRST
15110 JBPCL: MOVE A,AC0S+E(U) ;HERE IF PCLSR OUT
15111 SKIPL JBCJUI(A) ;UNLESS HANDLER GOING AWAY
15112 TLNE A,200000 ;OR THIS SYSTEM CALL DOESN'T WANT IT,
15114 MOVSI T,%PCFPD ;SET FIRST PART DONE FLAG
15115 IORM T,UPC(U) ;NOTE PCLSR HAS ALREADY MOVED UUOH INTO UPC
15116 JBPCL1: MOVSI T,%JBVAL+%JBSTR ;NOT VALID, NOT STORED
15119 SETOM JBCG(A) ;SAY THE CREATOR HAS CLOSED IT
15123 MOVE E,A ;AND GIVE THE HANDLER AN INTERRUPT
15130 ;JOB DEVICE BLOCK MODE IOT EITHER DIRECTION
15131 JBBI: XCTR XRW,[MOVES D,(C)] ;REFERENCE POINTER
15137 HRRZ T,D ;-> FIRST WORD TO TRANSFER
15138 HLROS D ;MINUS WORD COUNT
15139 IORI D,700000 ;FLUSH CHAR COUNT
15140 SUBM T,D ;D -> LAST WORD + 1 TO TRANSFER
15141 JRST JBIPG ;SWAP IN BUFFER THEN DO IOT
15143 ;JOB DEVICE UNIT MODE IOT EITHER DIRECTION
15145 JBUI: MOVSI T,%JBSIOT
15149 UMOVE W,(C) ;FOR UNIT OUTPUT
15150 JBIOT1: HRRZ TT,JBOPNM(A)
15153 HRRZ E,A ;JOB CHNL INDEX
15155 MOVEM C,SRN3(U) ;MAY BE ADDRESS OF BLOCK IOT POINTER
15158 JRST JBWTI ;GO SIGNAL HANDLER JOB
15159 SETZM JBIOCJ(E) ;TAKE IOC ERROR INSTEAD
15160 JRST IOCERF-MIOTER(TT)
15162 ;JOB DEVICE SIOT EITHER DIRECTION
15163 JBSI: AOS (P) ;SIOT SHOULD SKIP RETURN
15166 XCTR XRW,[MOVES T,(B)] ;BYTE PNTR ARG
15167 LDB E,[300600,,T] ;BYTE SIZE
15169 IDIVM D,E ;E := # BYTES PER WORD
15170 XCTR XRW,[MOVES D,(C)] ;BYTE COUNT ARG
15172 IDIV D,E ;D := WORD COUNT, E := EXCESS BYTES
15173 IBP T ;-> FIRST WORD TO TRANSFER
15178 JBIPG: HRRZS D ;-> LAST WORD TO TRANSFER + 1
15179 ANDI T,-2000 ;-> FIRST PAGE INVOLVED IN TRANSFER
15180 LDB E,[.BP .UII#.UIO,JBOPNM(A)] ;0 INPUT 1 OUTPUT
15181 JBIPG1: SKIPE E ;SWAP IN THE NECESSARY PAGES
15182 XCTR XR,[SKIPA 20(T)]
15183 XCTR XRW,[MOVES 20(T)]
15189 ;FLSINS ROUTINE TO WAIT FOR CREATOR TO BE HUNG AT JBFLS
15190 ;4.9 OF SRN3 = 1 => WAIT FOR WRITE 0 => READ
15191 ;1.1-1.4 => CODE OF UUO TO WAIT FOR
15193 BJWAIT: SKIPE B,FLSINS(T)
15195 POPJ P, ;NOT HUNG AT JBFLS
15196 HRRZ B,EPDL2(T) ;JOB INDEX THAT CREATOR IS HACKING
15197 HLRZ E,T ;JOB INDEX OF BOJ USER
15199 POPJ P, ;CREATOR HACKING JOB DEVICE ON SOME OTHER CHANNEL
15201 LSH TT,2 ;4.9 => READ/WRITE BIT NOW
15202 EQV TT,SRN3(U) ;4.9 OF SRN3 => WHAT TO LOOK FOR
15203 JUMPGE TT,CPOPJ ;DOESN'T MATCH
15204 MOVE TT,JBSTS(B) ;INSN CREATOR IS DOING
15205 XOR TT,SRN3(U) ;INSN LOOKING FOR
15207 AOS (P) ;THEY MATCH, AWAKEN BOJ JOB
15210 ;BOJ DEVICE UNIT MODE OUTPUT
15214 MOVEI B,1 ;WAIT FOR INPUT IOT
15216 HRLZ T,A ;JOB INDEX
15217 HRR T,JBCUI(A) ;CREATOR'S USER INDEX
15218 PUSHJ P,CWAIT ;WAIT FOR CREATOR TO BE IN IOT, RETURN WITH CLK OFF
15223 BJUO1: MOVE TT,JBSTS(A)
15225 JRST BJUOB ;BLOCK MODE CREATOR IOT
15226 LDB D,[.BP (%JBSIOT),JBWST(A)]
15227 JUMPN D,BJUOS ;CREATOR SIOT
15229 BJIUNH: MOVSI D,%JBWIN
15230 IORM D,JBWST(A) ;SET SUCCESSFUL JOBRET BIT
15231 MOVSI D,%JBVAL+%JBSTR
15234 DPB D,[350400,,JBSTS(A)] ;DON'T SKIP
15235 EXCH D,FLSINS(T) ;RESTART CREATOR
15238 BUG ;HE WASNT WHERE HE BELONGED
15239 POPJ P, ;NEED NOT CLKON, CALLER WILL TURN IT ON
15241 ;BOJ UNIT OUTPUT TO JOB SIOT
15242 BJUOS: PUSHJ P,BJBINI
15243 XCTRI XBYTE,[IDPB H,(B)]
15246 XCTR XRW,[SOSG (C)]
15250 BJBINI: HRLI T,%UMALL
15254 XCTRI XRW,[MOVE D,(B)]
15258 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT
15259 BJUOB: PUSHJ P,BJBINI
15262 XCTRI XW,[MOVEM H,(D)]
15266 XCTRI XW,[MOVEM D,(B)]
15272 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT, ASCII MODE
15273 BJUOBA: LDB E,[410300,,D] ;CHAR COUNT
15276 XCTRI XR,[MOVE W,(D)]
15277 SKIPA E,BTOCHT-3(E)
15280 XCTRI XW,[MOVEM W,(D)]
15286 XCTRI XW,[MOVEM D,(B)]
15291 BJIUNP: PUSHJ P,BJIUNH ;UNHANG CREATOR
15294 ;BOJ DEVICE BLOCK OUTPUT
15295 BJBO: SKIPGE JBCG(A)
15297 XCTR XRW,[MOVES D,(C)] ;D GETS IOT POINTER
15302 IORI B,700000 ;FLUSH CHAR CNT
15306 JRST IOADC ;DON'T WRAP AROUND (WHY NOT?)
15307 UMOVE H,(D) ;H GETS FIRST WORD
15309 PUSHJ P,BJBWT ;WAIT FOR JOB INPUT IOT, COME BACK WITH CLK OFF.
15310 JRST CLKONJ ;UNHANG
15311 MOVEI I,1 ;FOR BJBB
15314 JRST BJBB ;CREATOR IOT IS IN BLOCK MODE
15315 JUMPGE TT,BJBOA ;CREATOR IOT IS ASCII
15322 XCTRI XW,[MOVEM D,(C)]
15325 BJBEX: TLNN D,700000
15326 JRST CLKONJ ;BOJ BLOCK POINTER EXHAUSTED
15329 TLNN E,%JBVAL ;SKIP IF JOB IOT STILL WAITING FOR MORE
15331 JRST (T) ;TRANSFER MORE
15332 POPJ P, ;UNHANG BOJ IOT PREMATURELY
15334 ;BOJ BLOCK ASCII OUTPUT FETCH CHARACTER
15335 BJBOA: MOVE E,BTOCHT-3(E)
15343 ;BOJ BLOCK IOT WAIT. AWAITS JOB IOT, UNLESS UNHANGING.
15344 ;TURNS CLKOFF. SKIPS UNLESS SUPPOSED TO UNHANG.
15345 BJBWT: MOVEM B,SRN3(U) ;SAVE WHAT JOB UUO TO WAIT FOR
15346 HRLZ T,A ;SET UP ARG FOR BJWAIT FLSINS
15348 MOVE TT,JBWST(A) ;CHECK FOR DON'T HANG MODE
15351 PUSHJ P,CWAIT ;WAIT FOR JOB IOT
15355 BJBWT1: CONO PI,CLKOFF ;IF NOT ALREADY IN JOB IOT, DON'T WAIT
15356 JRST BJWAIT ;TEST CREATOR STATUS, POPJ OR POPJ1
15358 ;BOJ DEVICE UNIT MODE INPUT
15359 BJUI: MOVE B,[SETZ 1] ;WAIT FOR OUTPUT IOT
15361 HRLZ T,A ;JOB INDEX
15362 HRR T,JBCUI(A) ;CREATOR'S USER INDEX
15363 PUSHJ P,CWAIT ;WAIT FOR CREATOR TO IOT, RETURN WITH CLKOFF
15368 BJUI1: MOVE TT,JBSTS(A)
15370 JRST BJUIB ;BLOCK MODE CREATOR IOT
15371 LDB D,[.BP (%JBSIOT),JBWST(A)]
15374 JRST BJIUNH ;SUCCESSFUL
15376 ;BOJ UNIT INPUT FROM JOB SIOT
15377 BJUIS: PUSHJ P,BJBINI
15378 XCTRI XBYTE,[ILDB W,(B)]
15381 XCTR XRW,[SOSG (C)]
15385 ;BOJ UNIT INPUT FROM JOB BLOCK IOT
15386 BJUIB: PUSHJ P,BJBINI
15389 XCTRI XR,[MOVE W,(D)]
15393 XCTRI XW,[MOVEM D,(B)]
15399 ;BOJ UNIT INPUT FROM JOB BLOCK IOT, ASCII MODE
15400 BJUIBA: LDB E,[410300,,D] ;CHAR COUNT
15404 XCTRI XR,[MOVE W,(B)]
15405 SKIPA E,BTOCHT-3(E)
15411 XCTRI XW,[MOVEM D,(B)]
15418 ;BOJ DEVICE BLOCK MODE INPUT
15419 BJBI: SKIPGE JBCG(A)
15421 XCTR XRW,[MOVES D,(C)] ;D GETS IOT POINTER
15426 IORI E,700000 ;FLUSH CHAR CNT
15430 JRST IOADC ;DON'T WRAP AROUND
15432 PUSHJ P,BJBWT ;WAIT FOR JOB OUTPUT IOT, COME BACK WITH CLK OFF
15433 JRST CLKONJ ;UNHANG
15434 MOVEI I,0 ;FOR BJBB
15437 JRST BJBB ;CREATOR IOT IS IN BLOCK MODE
15440 PUSHJ P,BJUI1 ;GET DATA OUT OF CREATOR UNIT MODE IOT
15445 JUMPGE TT,BJBIA ;ASCII
15446 XCTRI XW,[MOVEM H,(D)]
15452 ;BOJ BLOCK ASCII INPUT STORE CHAR
15453 BJBIA: LDB E,[410300,,D]
15456 XCTRI XR,[MOVE W,(D)]
15457 SKIPA E,BTOCHT-3(E)
15460 XCTRI XW,[MOVEM W,(D)]
15466 BJBIX: MOVEI T,BJBI
15467 XCTRI XW,[MOVEM D,(C)]
15474 ;BOJ BLOCK IOT TO/FROM JOB BLOCK IOT
15476 HRLI J,%UMALL ;UMAPS FOR PURELY CREATOR IOT
15478 BJBBL: MOVE J,SRN4(U)
15481 XCTRI XRW,[MOVES H,(E)]
15482 CAIA ;H HAS JOB BLOCK IOT POINTER
15485 XCTRI XRW,[MOVES D,(C)]
15486 CAIA ;D HAS BOJ BLOCK IOT POINTER
15488 JUMPGE H,[PUSHJ P,BJIUNH
15494 HLRE B,D ;CHOOSE SMALLER OF TWO BLOCK SIZES
15495 MOVNS B ;COUNT TO BE XFERRED
15496 HRLZ E,H ;JOB ADDRESS
15497 HRR E,D ;JOB,,BOJ (FROM,,TO FOR BOJ INPUT)
15498 HLRZ Q,E ;JOB ADDRESS
15500 JRST BJBB1 ;JOB ADDR IS AN AC
15501 HRRZ J,T ;SET UP UMAPS (JOB USER INDEX IN RH)
15503 TLOA J,%UMMPL ;TO HI PG, HACK OUR LO PAGE
15504 TLO J,%UMMPU ;TO LO PG, HACK OUR HI PAGE
15506 TLOA J,%UMLTU ;TO POINT TO HIS UPPER
15507 TLO J,%UMUTL ;TO POINT TO HIS LOWER
15508 TLNN J,%UMMPU+%UMUTL ;MAPPING HIS UPPER FROM OUR LOWER?
15509 JRST BJBB3 ;YES. MAKE SURE NOT SCREWED BY AC PNTR
15510 BJBB3A: PUSHJ P,PLD1
15512 MOVNS Q ;LIMIT SIZE OF XFER TO MIN OF
15513 ADDI Q,400000 ;DIST OF TO ADR FROM SEG BOUNDARY
15514 CAMLE B,Q ;AND DIST OF FROM ADR FROM SEG BOUNDARY
15516 MOVNI Q,(E) ; - BOJ ADDR
15520 TLNN J,%UMMPL ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
15521 TLOA E,400000 ;SET JOB ADDR TO HI SEG
15522 TRO E,400000 ;SET BOJ ADDR TO HI SEG
15524 MOVSS E ;XFER OTHER DIRECTION
15525 MOVE Q,E ;SAVE COPY OF BLT POINTER
15526 ADDI B,(E) ;GET LA + 1
15527 XCTRI XBRW,[BLT E,-1(B)] ;XFER DATA
15528 HRRZS E,B ;NO FAULT. SIMULATE STORE BACK OF POINTER (CAN BE 1,,0)
15532 BJBB2: HRLS Q ;NUMBER OF WORDS ACTUALLY XFERRED IN BOTH HALVES
15533 XCTRI XRW,[ADDM Q,(C)] ;UPDATE BOJ BLK PNTR
15537 PUSHJ P,PLD1 ;MAP TO CREATOR
15540 XCTRI XRW,[ADDM Q,(W)] ;UPDATE JOB BLK PNTR
15544 JRST BJBBL ;NO FAULT, LOOP BACK
15545 PUSHJ P,PLD1 ;RESTORE TO FROB AT TIME OF FAULT
15546 BJBBF: PUSHJ P,TPFLT ;TAKE FAULT (TURNS CLK ON)
15547 PUSHJ P,MPLDZ ;RESTORE NORMAL MAP
15548 JRST @BJOV(I) ;RESTART THE IOT
15551 BJBB1: ADDI Q,UUOACS(T)
15553 MOVE B,(Q) ;READ JOB WORD
15554 BJBB3C: XCTRI XW,[MOVEM B,(E)]
15557 BJBB2A: MOVEI Q,1 ;1 WORD XFERRED
15558 HRRZ B,E ;FAKE OUT FAULT TEST
15562 BJBB1A: XCTRI XR,[MOVE B,(E)]
15568 BJBB3: TLNE E,777760 ;SKIP ON XFERRING FROM AC AREA, HI TO HI
15569 JRST BJBB3A ;NO. OK TO DO BLT
15571 HRLI J,%UMALL ;HACK OUR HI TO POINT TO HIS HI
15573 XCTRI XR,[MOVE B,(Q)]
15577 HRRZ E,D ;TO ADDRESS
15580 BJBB3B: XCTRI XR,[MOVE B,(D)]
15584 PUSHJ P,PLD1 ;HACK OUR HI TO POINT TO HIS HI
15585 XCTRI XW,[MOVEM B,(Q)]
15593 ;UP TO SIX WDS RETURNED
15596 ;4.9-4.7 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
15597 ; 4.9-4.7 SHOULDN'T BE USED, SINCE THE FULL MODE IS IN WD7 ON AN OPEN
15598 %JGCLS==40000 ;4.6 => CLOSE (NOTE 4.5 USED TO BE A CLS BIT ALSO)
15599 %JGSIO==1000 ;4.1 => SIOT (ONLY IF OPCODE = 1)
15600 %JGFPD==200 ;3.8 => THIS CALL WAS PCLSRED AND IS RESTARTING
15601 ;1.4-1.1 => TYPE OF OPERATION
15604 %JOIOT==1 ;IOT/SIOT
15609 %JORNM==6 ;FDELE (DELETE OR RENAME)
15610 %JORWO==7 ;FDELE (RENAME WHILE OPEN)
15611 %JOCAL==10 ;SYMBOLIC .CALL
15613 ;WD2 SET ONLY FOR BLOCK IOT POINTER, ACCESS POINTER, NEW FN1 FOR FDELE
15617 ;WD6 LEFT ADJUSTED DEVICE NAME
15618 ;WD7 NEW FN2 FOR FDELE.
15619 ;IGNORE ALL RETURNED INFO ON AN ERROR RETURN
15620 ;IF 4.5 OR 4.6 IS SET THEN ALL ELSE IS MEANINGLESS
15622 NJBGT: SETZM T ;INDICATE JOBGET, NOT JOBCAL
15623 NJBCL0: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15624 TLNN R,%CLSBJ ;NOT A BOJ CHANNEL => WRONG TYPE DEVICE
15629 JRST NJBGTE ;FAIL IF VALID NOT SET
15631 MOVEM C,JBWST(E) ;CLEAR STORED BIT
15636 TLZ A,077777 ;FLUSH RANDOM BITS FROM LH
15641 JUMPN T,NJBCL1 ;BRANCH IF JOBCAL
15642 NJBGT0: MOVE B,JBST2(E)
15651 NJBGTE: SKIPL JBCG(E) ;HAS CREATOR GONE AWAY?
15652 JRST OPNL36 ;NO, VALID CLEAR
15653 CONO PI,CLKON ;YES, GIVE CLOSE
15656 MOVSI A,%JGCLS ;GIVE CLOSE BITS
15657 JRST POPJ1 ;DON'T GIVE ANYTHING ELSE WHETHER JOBGET OR JOBCAL
15666 ; [-N,,ADR OF DATA BUFFER] ;OPTIONAL
15668 ; OPCODE WILL BE THE SAME AS RETURNED IN WD1 BY JOBGET
15669 ; IF OPCODE<10 THEN WD2-WD7 OF JOBGET WILL BE WRITTEN INTO DATA BUFFER
15670 ; FOLLOWED BY JOB'S EPDL AND EPDL3 (THE BPS FOR BP-STYLE OPENS, ETC).
15671 ;IF OPCODE=10 THEN JOB'S LAST .CALL WILL BE DESCRIBED:
15672 ; WORD 1 OF DATA BUFFER => SIXBIT OF OPERATION (I.E. THE NAME
15674 ; WORD 2 OF DATA BUFFER => FLAG BITS OF .CALL
15675 ; WORD 3 OF DATA BUFFER => # OF ARGS TO .CALL
15676 ; WORDS 4-12 => INPUT ARGS TO .CALL
15678 NJBCL: CAIL W,2 ;DID CALLER SUPPLY AOBJN POINTER?
15679 SKIPN T,B ;IF SO AND NON-ZERO USE IT
15680 MOVEI T,1 ;OTHERWISE SET T NONZERO
15681 JRST NJBCL0 ;GO JOIN JOBGET CODE FOR ERROR CHECKING
15683 NJBCL1: JUMPGE T,POPJ1 ;BACK FROM JOBGET - ANY AOBJN PNTR?
15684 MOVEI C,9 ;YES - OPCODE 10?
15686 JRST NJBCL2 ;NO - JUST COPY 9 STANDARD ARGS
15687 HLRE D,T ;GET LENGTH OF USERS DATA BUFFER
15688 MOVE B,JBCUI(E) ;GET JOB'S USER INDEX
15689 MOVE C,LSCALL(B) ;GET NAME OF JOB'S LAST CALL
15690 UMOVEM C,(T) ;PUT INTO CALLERS BUFFER
15691 AOJE D,POPJ1 ;IF NO MORE ROOM - DONE
15692 MOVE C,CTLBTS(B) ;GET USER'S .CALL FLAG BITS
15695 LDB C,[230400,,JBSTS(E)] ;GET # OF ARGS
15697 JUMPE C,POPJ1 ;ANY ARGS TO PASS?
15698 ADD T,[3,,3] ;YES - COPY INTO BUFFER
15699 NJBCL2: JUMPGE T,POPJ1 ;ANY ROOM LEFT?
15700 MOVNS C ;GET SMALLEST WORD COUNT
15703 HRL T,C ;MAKE AOBJN PNTR AS SMALL AS POSSIBLE
15704 MOVE H,E ;JOB INDEX IN H FOR USING JBACTB
15705 MOVEI B,JBACTB ;GET PNTR TO ARG TABLES
15706 NJBCL3: MOVE C,@(B) ;GET NEXT ARG
15707 UMOVEM C,(T) ;GIVE TO CALLER
15710 JRST POPJ1 ;DONE - GO SKIP
15719 ; [OPEN LOSS #(IF RH = 0),,# TIMES FOR CREATING JOB TO SKIP]
15720 ; SETZ [-N,,ADR OF DATA BUFFER]
15722 ;RETURN DATA (E.G. RETURN TO RCHST,STATUS OR THE RETURN ARGS TO A .CALL)
15723 ;WILL BE COPIED FROM THE CALLER'S DATA BUFFER
15725 NJBRT: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15726 TLNN R,%CLSBJ ;NOT BOJ CHNL => WRONG TYPE DEVICE.
15728 CAIGE W,3 ;RETURN ARGS PROVIDED?
15729 SETZM C ;NO - ZERO IT
15730 JUMPGE C,NJBRT1 ;DO NOTHING IF NO RETURNS OR NO AOBJN
15731 HLRE D,C ;GET LENGTH OF BUFFER
15732 CAMGE D,[-8.] ;MAKE SURE AREA AT MOST 8 LONG
15733 MOVNI D,8 ;OVER 8 - USE 8
15734 HRL C,D ;FIX AOBJN PNTR
15736 ADDI D,-1(C) ;GET ADDRESS OF LAST WORD NEEDED
15737 XCTR XR,[SKIP (C)] ;MAKE SURE PAGES ARE IN
15739 NJBRT1: CONO PI,CLKOFF ;NOW OK TO TURN CLOCK OFF
15743 JRST OPNL36 ;FAIL IF STORED IS SET OR IF VALID IS CLEARED
15751 TLZ A,%JBVAL+%JBSTR
15752 MOVEM A,JBWST(E) ;SET SUCCESSFUL JOBRET BIT, CLEAR VALID AND STORED
15753 DPB B,[350400,,JBSTS(E)] ;NUMBER OF TIMES TO SKIP
15755 DPB B,[270600,,JBSTS(E)] ;OPEN LOSS
15756 MOVSI B,-6 ;DEFAULT # WDS TO RETURN FOR .RCHST IS 6.
15758 JUMPGE C,NJBRT3 ;ANY RETURN ARGS?
15759 MOVEM C,JBAC11(E) ;REMEMBER HOW MANY, FOR .RCHST TO RETURN THAT MANY.
15760 MOVE H,E ;YES - COPY THEM
15762 NJBRT2: XCTRI XR,[MOVE B,(C)] ;GET IT
15764 BUG ;PAGE IS TIED - NO?
15765 MOVEM B,@-1(D) ;PUT INTO ARG TABLE
15767 NJBRT3: SETZM FLSINS(TT) ;RESTART CREATOR
15770 ;JOB DEVICE CLOSE ROUTINE
15771 JOBCLS: SETOM JBCG(A)
15774 PUSHJ P,JBINT ;INTERRUPT POOR BOJ GUY
15775 JRST CLKONJ ;SINCE HE HAS NO CREATOR
15777 ; ROUTINES FOR JOB ACCESS, RFPNTR, RESET, AND STATUS
15779 RFPJOB: MOVEI J,4 ;USE OLD .RCHST OPERATION, OPCODE 4
15783 PUSHJ P,JBWT ;SIGNAL JOB, WAIT FOR ANSWER
15784 HLRE TT,JBAC11(E) ;GET # VALUES RETURNED
15787 SKIPA A,JBODEV(E) ;GET ACCESS POINTER RETURNED
15788 SETO A, ;NO ACCESS POINTER RETURNED, USE -1
15789 CAIL TT,6 ;UP TO TWO MORE EXTRA RCHST RESULTS MIGHT BE RETURNED
15794 MOVEI W,1(TT) ;# RESULTS FOR RCHST
15795 MOVEI B,36. ;ALWAYS RETURN 36. AS BYTE SIZE UNTIL MORE WINNING
15796 JRST POPJ1 ;CONVENTIONS EXIST.
15798 JBSTAT: HLRZ A,(R) ;GET JOB INDEX
15799 HRRZ D,JBWST(A) ;GET MOST RECENT STATUS
15803 JBIRS: MOVEI D,3 ;RESET IS OPCODE 3
15808 PUSHJ P,JBWT ;WAIT FOR IT TO GET PROCESSED
15811 JBACCS: MOVEI D,5 ;ACCESS IS OPCODE 5
15820 ;.CALL JOBIOC (OLD NAME SETIOC STILL WORKS)
15821 ;ARG1: CHANNEL BOJ DEVICE IS OPEN ON
15822 ;ARG2: TYPE OF IOCER TO CAUSE
15824 ;THIS CALL CAUSES THE NEXT IOT EXECUTED BY THE
15825 ;PROCEDURE ON THE OTHER END OF THE CHANNEL TO GET
15826 ;THE SPECIFIED IO CHANNEL ERROR
15828 NSTIOC: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD.
15831 JRST OPNL33 ;BAD ARG. (NOT LEGAL IOCER)
15832 TLO B,(SETZ) ;IN CASE IOCER 0 EVER EXISTS
15834 JRST OPNL34 ;NOT BOJ CHANNEL
15836 MOVE A,JBCUI(E) ;PREPARE TO STOP CREATOR.
15838 JRST OPNL41 ;CREATOR WENT AWAY
15841 JRST OPNL41 ;HE'S BEING KILLED NOW.
15842 PUSHJ P,RPCLSR ;STOP
15849 ;ARG1 - CHANNEL BOJ IS OPEN ON - REMAINING ARGS ARE OPTIONAL -
15850 ;ARG2 - NEW STATUS (RIGHT HALF OF STATUS WORD ONLY - I.E. DEVICE DEPENDENT STUFF)
15851 ;ARG3 - NEW DEVICE NAME FOR PEEK, WHO-LINE STATUS, RFNAME/RCHST
15852 ;ARG4 - NEW FN1 FOR ..
15853 ;ARG5 - NEW FN2 FOR ..
15854 ;ARG6 - NEW SNAME FOR ..
15855 ;ARG7 - NEW OPEN MODE FOR ..
15856 ;ARG8 - BP TO ASCIZ STRING IN USER ADDRESS SPACE CONTAINING FULL FILENAMES.
15858 NJBSTS: TLNN R,%CLSBJ
15860 HLRZ A,(R) ;GET JOB INDEX
15861 CAIGE W,2 ;DID HE SUPPLY STATUS?
15862 MOVEI B,SNJOB ;NO - RESET TO INITIAL
15863 HRRM B,JBWST(A) ;REMEMBER WHAT HE SAYS
15866 JUMPGE B,.+1(B) ;STORE WHATEVER ADDITIONAL ARGS WERE GIVEN
15869 MOVEM TT,JBSYS(A) ;6
15870 MOVEM E,JBFN2(A) ;5
15871 MOVEM D,JBFN1(A) ;4
15872 MOVEM C,JBDEV(A) ;3
15874 JRST POPJ1 ;1 (DON'T TAKE THIS INSN OUT)
15876 NJBST1: XOR I,JBOPNM(A)
15878 JRST OPNL12 ;NOT ALLOWED TO CHANGE BLOCK VS UNIT, IN VS OUT
15882 NJBST2: MOVE R,Q ;STORE BP IN Q INTO JBFNP WORD,
15883 PUSHJ P,ASCIND ;AFTER DOING INDEXING AND INDIRECT.
15887 ; .CALL ADR ;SKIPS UNLESS JOB END OF CHNL NOT THERE
15893 ;GIVE CREATOR A SECOND WORD INT ON CHANNEL CORRESP TO BOJCH
15895 NJBINT: TLNN R,%CLSBJ ;ERROR IF NOT BOJ CHNL.
15905 PUSHJ P,[HRRZ B,(R)
15906 SKIPGE R ;IOPDL CHNLS DON'T INTERRUPT
15914 JUMPE C,OPNL41 ;I CAN'T
15916 AND C,B ;INT ONLY ONCE, ON HIGHEST NUMBERED CHANNEL
15922 ;ARG 1 - SIMULATED DEVICE NAME
15925 ;ARG 4 - SNAME OF FILE WHICH HANDLER LOADED FROM
15926 ;ARG 5 - AMOUNT OF TIME TO SLEEP WAITING FOR SOMEONE TO OPEN
15928 ;THIS CALL, WHEN EXECUTED BY A JOB DEVICE HANDLER JOB, MAKES
15929 ;THE HANDLER AVAILABLE FOR RE-USE. TAKES SUCCESS RETURN IF
15930 ;SOMEONE REUSES YOU; YOU SHOULD THEN DO THE "INITIAL JOBGET"
15932 NJBREU: SKIPGE H,JBI(U)
15933 JRST OPNL10 ;NOT A BOJ HANDLER JOB
15935 PUSHJ P,UFLS ;WAIT FOR CLOSE TO FINISH HAPPENING
15941 JRST [ MOVNI E,(E) ;IMMEDIATE TIME, LOSE ON PCLSR
15942 SUB E,TIME ;BUT ACCEPT ANYWAY SINCE NETBLK DOES
15945 UMOVE E,(TT) ;GET TIME ARGUMENT
15949 UMOVEM E,(TT) ;POS REL TIME GIVEN, MAKE NEG ABS AND WRITE BACK
15950 NJBRU1: MOVSI TT,%JBREU ;E NOW HAS NEGATIVE TIME TO SLEEP UNTIL
15953 NJBRUL ;TURN OFF %JBREU WHEN CALL EXITED FOR WHATEVER REASON
15958 JRST OPNL41 ;TIMED OUT
15961 ;FLSINS ROUTINE TO WAIT UNTIL TIMED OUT OR OPENED BY SOMEONE
15962 NJBRUW: MOVN A,AC0S+E(U)
15968 ;LOSSET ROUTINE TO LEAVE AWAITING-REUSE STATE
15969 NJBRUL: MOVSI A,%JBREU
15974 SUBTTL PERIPHERAL DEVICE ROUTINES IN SEPARATE FILES
15990 IFN NETP,[ ; General ITS network code, includes specific nets
16007 .BYTE 0 ;RECORD THE SYMS .EVAL'ED BY USER PROGRAMS
16011 SUBTTL DM DAEMON UUO'S
16013 IFE DEMON,ADEMON==ILUUO
16016 ADEMON: JUMPE J,[AOJA J,.+2] ;IF J = 0 THEN SUBTRACT ONE
16017 UMOVE J,(J) ;GET VALUE HERE
16020 PUSHJ P,DEMUSR ;FIND CURRENT USER IN DEMON TABLE
16021 JRST UTOLKJ ;FAIL, JUST RETURN, NOT DEMON
16022 HRRE TT,DMTTBL+2(B)
16024 HRRM TT,DMTTBL+2(B) ;PUT NEW COUNT IN DEMON TABLE
16027 UTOLKJ: CONO PI,UTCON
16031 CONO PI,CLKOFF ;DON'T LET SYS JOB LOOK TILL WE'RE READY.
16032 MOVSI T,SCLDMN ;TELL IT TO LOOK FOR US, AFTER UFLS TURNS CLOCK ON.
16034 SETZB T,SRN3(U) ;SYS JOB WILL SETOM SRN3 TO RESTART US
16035 SKIPN SRN3(U) ;WITH 0 IN T => FILE EXISTS, OR OPNL CODE.
16036 PUSHJ P,UFLS ;SYS JOB DETECTS US BY PC=ADEMS1.
16037 ;DEMON NAME IS EXPECTED TO BE IN A.
16038 ADEMS1: JUMPN T,OPNL1-1(T)
16039 CAIGE W,2 ;NO SECOND ARG, JST SIGNAL
16041 JUMPL D,NUDMTB ;IF 2ND ARG < MERELY CALL NUJBST, NO DEMON ENTRY
16042 TDZA TT,TT ;ZERO OUT TT
16043 ADEMS3: SETOM TT ;SET FLAG
16044 PUSHJ P,LSWTL ;SIEZE SWITCH
16047 JRST LSWPOP ;SIGNAL FAILED
16048 SKIPN TT ;FLAG NOT SET
16049 HRLM D,DMTTBL +2(B) ;SET TIME RQ
16050 JRST CKOPJ1 ;RELEASE SWITCH
16053 PUSHJ P,DMBLK1 ;WAIT TILL DEMON BLOCK IS CLEARED
16056 MOVEM A,DMBLK ;SAVE IN BLOCK NOW
16058 JRST NUDMTB ;IF FAILURE AFTER WAIT LOOP BACK
16059 JRST POPJ1 ;SUCCESS
16061 DMBLK1: SKIPGE DMBLK+1 ;FOR DEMON BLOCK TEST
16062 POPJ P, ;RETURN, NOT FINISHED LOADING
16064 CAIGE T,MXCZS ;ROOM IN RING BUFFER
16066 POPJ P, ;SKIP IF ROOM
16067 \f;UTILITY ROUTINES FOR DEAMONS
16069 DEMSIG: PUSHJ P,DEMNAM ;LOOK FOR NAME
16070 JRST DEMSG2 ;HAVE TO MAKE NEW ENTRY
16072 HLLZ E,DMTTBL+2(B) ;18 BITS 2'S COMPLEMENT
16074 HLLM E,DMTTBL+2(B) ;MUST DO THIS WAY TO FIT ABOVE
16075 SKIPE DMTTBL+1(B) ;DOWN, WANT SYS JOB TO LOOK AT
16079 AOS REQCNT ;ONLY SIGNAL IF NECESSARY
16082 DEMSG2: SOSGE DEMCNT ;IF NO ROOM FLUSH
16085 MOVEI A,DMTLL ;BUMP POINTER
16087 IDIVI A,DMLNG ;TRUNCATE TO LENGNTH OF TABLE
16089 JRST .-4 ;SEARCH FOR NEW ENTRY
16090 POP P,DMTTBL(B) ;SET NAME IN TABLE
16093 ;ROUTINES TO FIND ENTRY IN TABLE.
16094 ;DEMNAM TAKES NAME IN A, DEMUSR TAKES USER INDEX IN U
16095 ;THEY SKIP RETURN IF SUCCESSFUL, RETURN OTHERWISE
16096 ;IF SUCCESSFUL DEMON TABLE INDEX IS IN B
16098 DEMUSR: JUMPL U,CPOPJ
16102 ADD B,[DMTLL,,DMTLL]
16106 DEMNAM: MOVSI B,-DMLNG ;SEARCH BY NAME
16109 ADD B,[DMTLL,,DMTLL]
16113 DEMOUT: PUSHJ P,LSWTL ;CALLED BY KILLING JOB (IN CASE OWNED)
16117 SETZM DMTTBL+1(B) ;MARK AS DOWN,SYSTEM JOB DECIDES WHAT TO DO
16123 DEMMRV: SETZM DMTTBL+2(B) ;CALL WITH UTCOFF (SYS JOB) REMOVES ENTRY FROM TBL
16124 SETZM DMTTBL+3(B) ;WITH INDEX OF DEMON IN B
16132 ;DEAMON READ AND SET STATUS ROUTINES
16134 ARDDMST: PUSHJ P,LSWTL ;READ DEAMON STATUS
16137 JRST RDDMS1 ;LOST TRY USER INDEX
16140 IDIVM C,A ;DIVIDE BY L, DON'T CLOBBER B
16141 RDDMS2: MOVE C,DMTTBL+3(B)
16148 PUSHJ P,DEMUSR ;BAD USER
16156 ASTDMST: PUSHJ P,LSWTL ;SET DEAMON STATUS
16161 STDMS2: JUMPL D,STDMS4
16163 MOVEM D,DMTTBL+2(B)
16165 MOVEM C,DMTTBL+3(B)
16173 STDMS4: SKIPGE DMTTBL+1(B) ;REMOVE FROM TABLE IF POSSIBLE
16174 JRST UTOLKJ ;CAN'T DELETE, LOADING
16175 SETZM DMTTBL+1(B) ;DOWN
16176 SETZM DMTTBL+2(B) ;REMOVE REQUESTS
16177 AOS REQCNT ;SIGNAL SYS JOB
16188 ;.GETSYS AC, ;TRANSFERS SYSTEM AREA SPECIFIED BY C(AC+1)
16189 ;TO USER AREA STARTING AT R.H. C(AC) OF LENGTH MINUS L.H. C(AC)
16192 ; Alan 4/2/86: Took this out because people don't use .GETSYS this way
16194 ; PUSHJ P,UDELAY ;CAUSE A SCHEDULE TO STOP GETSYSER FROM
16195 ; ; MONOPOLIZING SYSTEM
16196 MOVSI A,-LGSNAM ;NEGATIVE OF TABLE LENGTH
16197 UMOVE B,1(J) ;LOOK AT USERS AC+1, THE 6BIT NAME
16198 CAME B,GSNAME(A) ;CYCLE THROUGH TABLE
16199 AOBJN A,.-1 ;OF NAMES, POINTER IN RIGHT HALF OF A
16200 JUMPGE A,AGETSL ;JUMP IF NOT IN TABLE
16201 UMOVE B,(J) ;GET POINTER TO USERS RECEPTACLE BLOCK
16202 AGETS1: HLRZ C,GSYS1(A) ;GET LOW END OF BLOCK
16203 HRRZS A ;CLEAR COUNT IN L.H. OF A
16204 CAIGE A,NUTCFN ;SKIP IF UTC OFF NOT REQUIRD
16205 CONO PI,UTCOFF ;TURN OFF ALL CHANNELS BUT CH 1
16206 skipn c ; If LH contains 0, RH is routine to call.
16207 jrst @gsys1(a) ; (JUMPE C,@GSYS1(A) generates spurious
16208 ; page faults, so don't "fix" this.)
16209 HRRZ D,GSYS1(A) ;GET HIGH END OF BLOCK
16210 ;AT THIS POINT: ;B USER'S POINTER (UNRELOCATED)
16211 ;C BEGINNING OF AREA IN SYS
16213 agets2: SUBI D,-1(C) ;BLOCK LENGTH TO BE SENT
16214 HLRZ E,B ;GET NEG BLK LENGTH FROM USERS PNTR
16215 ADDI E,-1(D) ;-1 CAUSES CARRY BIT IF .GT.
16216 TLNE E,-1 ;CARRY INDICATES LOSS
16217 JRST AGETS5 ;MORE THAN USER WANTS
16218 HRLS D ;BLOCK LENGTH IN BOTH HALVES
16219 HRRZ E,B ;FIRST WORD (UNRELOCATED)
16220 HRL E,C ;SOURCE ADDRESS FOR BLT
16221 HRRZ C,E ;DESTINATION INTO C
16222 ADD C,D ;FINAL ADDRESS +1
16223 AGETS7: XCTRI XBW,[BLT E,-1(C)] ;BLT IT TO HIM
16224 AOSA (P) ;INCREMENT RETURN, INDICATE SUCCESS
16228 UMOVEM B,(J) ;TELL USER HOW MUCH HE GOT
16231 AGETSL: XCTR XW,[SETZM 1(J)] ;INDICATE BAD SIXBIT
16234 AGETS5: MOVNS D ;TELL USER HOW MUCH HE NEEDS
16235 CONO PI,UTCON ;NEGATIVE OF RIGHT BLOCK LENGTH
16236 XCTR XRW,[HRLM D,(J)] ;SET UP PROPER BLOCK LENGTH IN HIS AC
16239 AGETS6: CONO PI,UTCON ;ONE PAGE WASN'T THERE
16240 XCTR XRW,[MOVES (E)] ;SO TOUCH IT (TAKE MPV INTERRUPT IF REAL MPV)
16241 JRST AGETS1 ;AND TRY AGAIN (BLT WILL GET FARTHER THIS TIME)
16242 ;HAD TO RETRY FROM BEGINNING SINCE THIS MAY BE
16243 ;ONE THAT HAS TO BE TRANSFERRED INTACT WITH UTCOFF
16245 GSNAME: SIXBIT /MEMORY/
16246 IFN NUNITS,SIXBIT /UTAPE/
16247 IFN NCPP,[SIXBIT /NCPSM/
16251 NUTCFN==.-GSNAME ;NUMBER TO GET WITH UTCOFF (same as NETOFF)
16257 IFN IMXP, SIXBIT /IMPX/
16260 SIXBIT /USYMS/ ;.UPC, .VAL, .TTY, ETC.
16268 ;ENTRIES ARE: BOTTOM,,TOP OF AREA TO BE TRANSMITTED OR INST TO EXECUTE
16269 GSYS1: IOBFTL,,EMEMTL ;lh zero => jrst to THIS ENTRY
16270 IFN NUNITS, UTCHNT,,UTCHE ;UTAPE
16271 IFN NCPP,[IMSOKB,,IMSOKE ;NCP SOCKET MAP
16272 IMPBPQ-1,,IMPEPQ ;NCP PENDING RFC QUEUE
16273 IMPHTB,,IMPHTB+255. ;NCP HOST TABLE
16277 GSNAME,,GSNAME+LGSNAM-1 ;GETS
16278 DEVTAB,,EDEVS ;DEVS
16279 SYSYMB,,SYSYME ;CALLS
16280 IFN IMXP, IMXTBB,,IMXTBE ;IMPX
16281 CLVBEG,,CLVEND ;CLINK
16283 SYSUSB,,SYSUSE ;USYMS
16284 DCHSTB,,DCHSTE ;CHDEVS
16285 SYSCTB,,SYSCTB+LSYSCT-1 ;NCALLS
16286 TYVTAB,,TYVTAB+LTYVTA-1 ;TTYVAR
16287 USETTB,,USETTB+MXVAL-1 ;USRVAR
16288 ITSNMS,,ITSNMS+LITSNM-1 ;ITSNMS
16289 IFN LGSNAM-<.-GSYS1>, .ERR GSNAME and GSYS1 don't match.
16296 0 ; Make it easy to add more.
16298 USRSV: MOVEI C,USRSTG
16303 USR1V: UMOVE C,2(J)
16312 USR1VL: XCTR XW,[SETOM 2(J)]
16315 DSYMS: HRRZ C,DDT-2
16317 SETCMM D ;OFFSET BY ONE
16321 SUBTTL .GETLOC, .EVAL, ETC.
16323 ;GET AN ABSOLUTE LOCATION ;.GETLOC AC, ;C(A)=FROM(ABS),,TO(RELATIVE)
16325 AGETLOC:UMOVE A,(J) ;GET TO ADDRESS
16326 HLRZ B,A ;GET FROM ADDRESS
16329 JRST ILEXPF ;ILLEGAL EXEC PAGE FAULT
16330 UMOVEM C,(A) ;GIVE TO USER
16333 ;SET AN ABSOLUTE LOCATION ;.SETLOC AC, ;C(AC)=FROM(RELATIVE),,TO(ABS)
16335 ASETLOC:TDZA D,D ;CLEAR COND FLAG, SKIP
16337 ;SET AN ABSOLUTE LOCATION ONLY IF C(ABS)=C(TEST) & SKIP IF SUCCESSFUL
16338 ;.IFSET AC, ;C(AC)=<POINTER TO 2 WORD BLOCK>,,TO ADR(ABS)
16339 ;WORD 1=TEST ;WORD 2=NEW C(ABS)
16341 AIFSET: MOVNI D,1 ;SET COND FLAG
16342 XCTR XR,[HRRZ A,(J)] ;GET TO ADDRESS (ABSOLUTE)
16343 XCTR XR,[HLRZ B,(J)]
16344 UMOVE C,(B) ;GET WORD
16348 JUMPE D,ASPST1 ;NORMAL SETLOC
16349 UMOVE D,1(B) ;GET NEW VALUE
16350 CONO PI,CLKOFF ;PREVENT INTERRUPTS
16351 CAME C,(A) ;CHECK WORD AGAINST TEST WORD
16352 JRST CLKONJ ;NOT EQUAL => IGNORE
16354 AOS (P) ;CAUSE RETURN TO SKIP
16355 CAIG A,SYSB_10. ;CHECK IF IN SYS
16356 JRST ASPST1 ;YES SO DO REG SETLOC
16357 EXCH D,(A) ;NO SO DO NOW BEFORE SHUFFLE & GET OLD
16359 HRROS A ;LET SYS JOB KNOW ALREADY DONE
16360 ASPST1: CAMN C,(A) ;SKIP IF DIFFERENT FROM C(TO ADR)
16362 MOVE D,SYSITM ;IF SYSTEM JOB HAS BEEN HUNG OR LOOPING FOR 30 SEC,
16365 JUMPGE A,ASPST3 ;GO DO THE WORK OURSELVES (BUT DON'T DO IT TWICE).
16366 ASPST4: MOVE D,UNAME(U) ;GET UNAME OF SETLOCER
16368 PUSHJ P,CWAIT ;WAIT TILL VARIABLES TO COMMUNICATE WITH SYS JOB ARE FREE
16369 TDNE T,SUPCOR ;ARG TO CALL IN .-1
16370 MOVEM A,SETSLC ;REMEMBER ABS LOCATION
16371 MOVEM C,SETSLQ ; " NEW CONTENTS (OR OLD IF LH(SETSLC)=-1)
16372 MOVEM D,SETSU ; " USER
16373 CSPST: IORM T,SUPCOR ;TELL SYS JOB TO DO IT
16376 ASPST3: HRRZ D,UPC ;SYS JOB HAS BEEN HANGING FOR 30 SEC.
16377 CAIN D,SCOR1 ;WHY? JUST SLEEPING?
16378 JRST ASPST4 ;YES => SIGNAL IT TO DO THE WORK
16379 MOVEM C,(A) ;ELSE GIVE UP ON IT AND DO IT NOW
16382 ;LOOK UP ITS SYMBOL ;.EVAL AC, ;C(AC)=SQUOZE SYMBOL
16383 ;REPLACES SYMBOL BY VALUE & SKIPS IF SUCCESSFUL
16384 ;IF YOU WANT TO .EVAL A SYMBOL IN A PROGRAM HABITUALLY AND IMPLICITLY,
16385 ;AND WANT IT TO CONTINUE TO WORK, YOU HAD BETTER ADD AN ENTRY TO THE FILE
16386 ;AI:SYSTEM;EVSYMS > SAYING WHAT PROGRAM AND WHAT SYMBOL. THEN, ITS HACKERS
16387 ;CAN AVOID SCREWING YOU WITHOUT WARNING.
16389 AEVAL: PUSHJ P,SWTL
16391 UMOVE B,(J) ;GET SYM
16392 PUSHJ P,SYMLK ;LOOK UP
16393 JRST LSWPOP ;NOT FOUND
16394 MOVE A,(C) ;GET VALUE
16396 AOS (P) ;CAUSE UUO TO SKIP
16397 JRST APTUAJ ;RETURN VALUE
16399 ;REDEFINE ITS SYMBOL ;.REDEF AC, ;C(AC)=POINTER TO 2 WORD BLOCK
16400 ;WORD 1 = SYMBOL ;WORD 2 = VALUE
16401 ;DELETE SYM IF ALL 4 FLAG BITS SET
16402 ; OTHERWISE SET SYMBOL FLAGS TO THOSE SPECIFIED, EXCEPT REJECT ANY ATTEMPT TO
16403 ; ADD A PROGRAM NAME
16404 ;ADD SYM IF NOT FOUND ;FAIL ONLY IF NOT ENOUGH ROOM
16405 ;SKIPS IF SUCCESSFUL
16407 AREDEF: PUSHJ P,SWTL
16409 XCTR XR,[HRRZ D,(J)] ;GET POINTER FROM AC
16410 UMOVE B,(D) ;GET SYMBOL
16411 PUSHJ P,SYMLK ;LOOK UP
16412 JRST ARDF2 ;NOT FOUND, CREATE
16413 XCTR XR,[SETCM A,(D)] ;GET SYM (COMPLEMENTED)
16414 TLNN A,740000 ;SKIP IF ANY FLAGS NOT SET
16415 JRST ARDF3 ;ALL SET => DELETE
16420 UMOVE A,1(D) ;GET VALUE
16421 MOVEM A,(C) ;STORE IN SYMTAB
16422 JRST ARDF4 ;SORT AND SKIP-RETURN.
16424 ARDF2: MOVE C,DDT-2 ;GET POINTER
16425 SUB C,[2,,2] ;DECREMENT FOR NEW ENTRY
16426 MOVEI A,-1(C) ;FUDGE FOR BLOCK CALC
16427 LSH A,-10. ;CONVERT TO # OF BLOCKS UP TO SYMTAB -1
16428 UMOVE B,(D) ;GET SYM
16431 TLNE B,740000 ;LOSE IF PROG NAME
16432 CAMLE A,T ;CHECK FOR LOSSAGE
16433 JRST LSWPOP ;DON'T OVERWRITE ITS
16434 EXCH B,2(C) ;STORE OVER GLOBAL BLOCK HEADER,
16435 MOVEM B,(C) ;MOVE THAT HEADER DOWN 2 WDS.
16436 UMOVE A,1(D) ;GET VALUE
16438 ADD A,[-2,,] ;1 MORE SYM IN GLOBAL BLOCK.
16439 MOVEM A,1(C) ;STORE
16440 MOVEM C,DDT-2 ;UPDATE POINTER
16441 JRST ARDF4 ;GO SORT AND SKIP-RETURN.
16443 ARDF3: MOVE B,DDT-2 ;GET POINTER
16444 MOVE A,(B) ;MOVE THE GLOBAL HEADER
16445 EXCH A,2(B) ;UP OVER 1ST SYM
16446 MOVEM A,-1(C) ;WHICH GOES INTO FREE SLOT.
16448 ADD A,[2,,] ;GLOBAL BLOCK 1 SYM SHORTER.
16452 ADDM A,DDT-2 ;UPDATE POINTER
16453 ARDF4: MOVSI E,(SETZ) ;TELL DDT ITS SYMTAB WAS ALTERED.
16455 PUSHJ P,SBUBL ;DO 1 BUBBLE-SORT UP AND 1 DOWN.
16456 JRST LSWPJ1 ;FREE ARDFSW AND EXIT.
16458 ;DO ONE BUBBLE SORT PASS UP, ONE DOWN; LEAVE J <0 IFF DID AN EXCHANGE.
16460 SBUBL: MOVE E,DDT-2
16462 ADD E,[2,,2] ;AOBJN -> SYMS IN GLOBAL BLOCK.
16464 MOVE B,[2,,2] ;INCREMENT FOR UPWARD PASS.
16465 MOVE C,[JUMPL A,SBUBL1]
16466 SUBI E,2 ;(WILL INCREMENT BEFORE ACTING)
16469 MOVNS B ;DECREMENT FOR DOWNWARD PASS.
16473 SBUBL1: MOVE D,1(A) ;CHECK NEXT PAIR OF ENTRIES.
16475 JRST SBUBL2 ;IN CORRECT ORDER.
16477 MOVEM D,1(A) ;WRONG ORDER, EXCHANGE.
16481 SETO J, ;SAY DID AN EXCHANGE.
16482 SBUBL2: ADD A,B ;MOVE TO NEXT ENTRY.
16483 XCT C ;TEST IF FINISHED.
16485 JRST SBUBL1 ;(NOT FINISHED)
16487 ;LOOK UP SYMBOL IN B IN ITS SYMBOL TABLE (CLOBBERS A,B,C)
16488 ;RETURN WITH POINTER TO VALUE WORD IN C
16489 ;SKIPS IF SUCCESSFUL
16491 SYMLK: TLZ B,740000 ;FLUSH FLAGS
16492 MOVE C,774000-2 ;PICK UP AOBJN POINTER TO SYMTAB FROM EXEC DDT
16493 SYMLK2: MOVE A,(C) ;GET SYM
16494 AOBJP C,[JRST 4,.+1] ;INCREMENT POINTER
16495 TLNE C,376 ;GO THROUGH HAIR EVERY 200 SYMS
16496 JRST SYMLK3 ;NOT THIS TIME
16498 SYMLK3: TLNN A,200000 ;SKIP IF DELETE INPUT (FLAG PREVENTS MATCH)
16499 TLZE A,740000 ;FLUSH FLAGS & CAUSE LOSS IF ALL 0 (PROG NAME)
16501 AOBJN C,SYMLK2 ;LOSS, TRY ANOTHER
16502 JUMPL C,POPJ1 ;SKIP RETURN IF FOUND
16503 POPJ P, ;NOT SO IF LOSS
16505 AWSNAME:XCTR XR,[SKIPE B,(J)] ;OPER 35
16509 AUPISET:UMOVE B,(J) ;OPER 36
16517 ;GENERATE A UNIQUE SYM ;.GENSYM AC, ;LOADS AC WITH SYM
16519 AGENSYM:PUSHJ P,SWTL ;WAIT TILL INTERLOCK FREE THEN SEIZE IT
16522 PUSHJ P,SIXAOS ;INCREMENT SYM
16523 MOVE A,IGNSYM ;GET SYM
16524 PUSHJ P,LSWPOP ;UNLOCK FOR NEXT USER
16525 JRST APTUAJ ;GIVE USER GENERATED SYMBOL
16527 ;GENERATE A UNIQUE NUM ;.GENNUM AC, ;LOADS AC WITH NUMBER
16529 AGENNUM:AOS A,IGNNUM ;INCREMENT NUMBER
16530 JRST APTUAJ ;AND GIVE IT TO USER
16536 IGNSYM: SIXBIT /SYS/
16544 AOS (TT) ;INCREMENT SYM
16545 MOVE I,[440600,,(TT)] ;GET POINTER TO FIRST CHAR
16546 SIXAS2: ILDB J,I ;GET FIRST (NEXT) CHAR
16547 SKIPN J ;SKIP IF NOT ZERO
16548 MOVEI J,1 ;REPLACE EMBEDDED SPACE WITH "!"
16550 CAME I,[60600,,(TT)] ;SKIP IF FIRST FIVE CHARS HAVE BEEN EXAMINED
16551 JRST SIXAS2 ;GO TO NEXT CHAR
16558 SUBTTL KL10 PERFORMANCE COUNTER
16560 ;KLPERF SYMBOLIC SYSTEM CALL
16561 ;ARG 1: <JOB> TO MEASURE PERFORMANCE DURING;
16562 ;-3 => NULL JOB, -4 => ALL JOBS
16563 ;ARG 2: P.A. ENABLES WORD (SEE NON-EXISTENT KL10 SYS REF MAN)
16564 ;0 => FREE THE FACILITY, ELSE TRIES TO GRAB IT
16565 ;NO ARGS => JUST READS THE VALUES WITHOUT CHANGING THE ENABLING CONDITIONS.
16566 ;IN THAT CASE, IT IS OK IF FACILITY IS OWNED BY SOMEONE ELSE
16567 ;VAL 1: PREVIOUS <JOB> SETTING
16568 ;VAL 2: PREVIOUS P.A. ENABLE WORD
16569 ;VAL 3: TIME BASE HIGH WORD
16570 ;VAL 4: TIME BASE LOW WORD
16571 ;VAL 5: PERF CTR HIGH WORD
16572 ;VAL 6: PERF CTR LOW WORD
16574 KLPERF: CONO PI,CLKOFF
16576 KLPER0: MOVE J,MTRJOB ;NO ARGS => DONT CHANGE SETTINGS,
16577 MOVE B,PAEON ;JUST RETURN CURRENT COUNT.
16580 KLPER1: JUMPN B,KLPER2 ;TRYING TO TURN IT ON?
16582 JRST KLPER0 ;FREEING THE FACILITY WHEN DON'T OWN IT?
16583 PUSHJ P,PRFOFF ;NO, TRYING TO FREE IT - DO SO.
16587 KLPER2: SKIPGE MTRUSR ;IF FACILITY IS FREE, SIEZE IT.
16590 JRST OPNL10 ;ALREADY BELONGS TO SOME OTHER JOB.
16592 CAIN J,-2 ;ALL JOBS?
16594 CAIN J,-1 ;NULL JOB?
16597 JSP T,NCRUI2 ;ELSE DECODE JOB SPEC; OBJECT TO PDP6
16601 ;TRYING TO TURN ON FOR SELF OR ALL JOBS - IT OUGHT TO BE ON RIGHT NOW!
16602 KLPER4: CONO MTR,2001 ;TURN ON TIME BASE, INTERVAL PIA=1
16603 WRPAE B ;SET ENABLES
16604 KLPER3: EXCH B,PAEON
16606 TRZA A,2 ;UN CONVERT -1 => -3, -2 => -4
16607 LSH A,-9 ;IDIVI A,LUBLK
16608 IF2 IFN LUBLK-1000,.ERR NO DIVIDE
16610 RCCL C ;C,D GET TIME BASE
16611 RPERFC E ;E,TT GET PERFC
16614 ;TURN OFF THE PERFORMANCE COUNTER. PUT BACK IN RUN-TIME MEASURING MODE
16615 PRFOFF: MOVNI A,2 ;NOT ATTACHED TO ANY JOB
16617 WRPAE [1576,,1200] ;MEASURE MAIN-PROGRAM TIME IN 80 NS UNITS (MODEL A)
16618 CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1
16619 RPERFC STPERF ;START-OF-QUANTUM TIME IS NOW
16620 RPERFC NULPRF ;ALSO FOR NULL-JOB
16621 SETOM MTRUSR ;NO LONGER IN USE
16625 $INSRT CORE ;CORE JOB AND MEMORY MANAGEMENT ROUTINES
16628 ; IMMEDIATE EOF ON INPUT, HAS NO EFFECT ON OUTPUT
16630 NULO: HLRS A,C ;REMEMBER MODE FOR .STATUS
16631 JSP Q,OPSLC3 ;SET UP IOCHNM WORD AND EXIT
16635 ;UNIT NULL DEVICE INPUT
16638 ;BLOCK NULL DEVICE INPUT
16641 ;BLOCK NULL DEVICE OUTPUT ENTRY
16642 ;ADVANCE BLOCK MODE .IOT POINTER
16643 NULBOD: XCTR XR,[HLRE A,(C)] ;GET NEG LENGTH FROM LEFT HALF
16644 MOVNS A ;GET POSITIVE LENGTH
16645 XCTR XR,[ADD A,(C)] ;ADD STARTING LOC (R.H.)
16646 XCTR XW,[HRRZM A,(C)] ;STORE BACK "COUNTED OUT" POINTER
16649 ;STANDARD DEVICE .STATUS ROUTINE
16650 STDSTA: DPB A,[60300,,D] ;A HAS LH OF IOC WORD
16651 TRO D,1_9 ;SYS BUF CAP FULL
16652 TRNE D,1_6 ;SKIP IF INPUT
16653 TRC D,3_9 ;TURN OFF SYS BUF CAP FULL, SET EMPTY
16658 UBPFJ==10 ;DEMAND FOREIGN JOB (BIT IN LH (DEV) FOR .OPEN (USR))
16660 USROJ: TDZA J,J ;ENTRY FROM JOB DEVICE DONT GET CORE.
16661 USRO: MOVNI J,1 ;INDICATE NOT FROM JOB OPEN
16663 USROOJ: MOVEI J,1 ;OJB DEVICE; EXISTING JOB OK ONLY IF %OPOJB BIT SET.
16666 PUSHJ P,UFLS ;PREVENT ATTEMPT TO CORE, PCLSR OUT, AND THINK YOU'VE WON AT SETBF1, ETC
16669 JUMPE B,USRO4 ;JNAME = 0 => UNAME IS JOB SPEC.
16670 SKIPN A ;IF UNAME=0
16671 MOVE A,UNAME(U) ;MAKE IT THIS JOB'S UNAME
16672 CAME A,UNAME(U) ;SKIP IF FIRST FILE NAME IS UNAME OF OPENER
16674 CAME B,[SIXBIT /PDP10/] ;SKIP IF SECOND FILE NAME IS "PDP10"
16675 CAMN B,[SIXBIT /PDP6/] ;OR PDP6
16676 IFN PDP6P,JRST PDPO
16678 USROA: CONO PI,CLKOFF
16679 PUSHJ P,LSWPOP ;TREESW
16681 USRO3: CAME A,UNAME(TT)
16684 JRST UFN1 ;FOUND UNAME JNAME PAIR
16685 AGIN: ADDI TT,LUBLK
16688 TLNE C,UBPFJ ;JOB MUST EXIST TO WIN IF UBPFJ SET
16690 CAME A,UNAME(U) ;INFERIOR PROCEDURE MUST HAVE SAME UNAME
16693 TCORS: MOVSI T,%TBNOT+%TBDTY ;DOESN'T HAVE TTY, ISN'T GIVING IT AWAY
16695 JRST TCORS1 ;USTRA FAILED - SEE WHY, MAYBE RETRY (U CLOBBERED)
16708 PUSHJ P,USRST5 ;SET UP TTY STUFF
16711 IORM A,APRC(TT) ;NEW INFERIOR IS DISOWNED IF CREATOR IS.
16712 JUMPE J,CLKOJ1 ;RETURN HERE FOR JOB DEVICE (INDEX IN TT)
16713 PUSHJ P,ULUP1 ;FIND AN INTERRUPT BIT FOR THE JOB.
16714 JRST NOGO1 ;NONE => GO KILL THE JOB AND RETURN FAILURE.
16715 CONO PI,CLKON ;NOW CAN'T FAIL TO CREATE THE JOB FOR GOOD.
16720 PUSHJ P,UFOUND ;SET UP THE OPENER'S CHANNEL.
16724 PUSHJ P,ACORE1 ;MAY PCLSR OUT, BUT CORE JOB WILL DO WORK ANYWAY.
16725 SKIPA R,UUAC(U);NO CORE AVAILABLE, KILL THE JOB
16726 JRST POPJ1 ;SUCCESS
16729 JRST OPNL37 ;NO CORE AVAILABLE
16732 ULUP: HRRZ E,SUPPRO(T)
16733 SKIPN UNAME(T) ;SKIP IF VARIABLE BLOCK IN USE
16735 CAIN E,(U) ;SKIP IF NOT AN INFERIOR
16736 IOR A,SUPPRO(T) ;IOR IN INTERRUPT BIT OF INFERIOR
16737 ULUP2: ADDI T,LUBLK ;ADVANCE TO NEXT BLOCK
16738 CAMGE T,USRHI ;SKIP IF ALL EXAMINED
16740 UFIN: MOVEI B,1 ;SELECT INT BIT
16748 NOGO1: MOVSI T,BULGO+BULGOS
16749 IORM T,APRC(TT) ;TELL THE SYS JOB TO KILL THE JOB WE JUST GOT
16752 JRST OPNL5 ;DIREC FULL (TOO MANY LOSERS)
16754 NOGO4: SUB P,[1,,1]
16757 TCORS1: PCLT ;COME HERE FROM TCORS IF ATTEMPT TO FIND FREE JOB SLOT FAILED.
16758 SKIPGE SJCFF ;IF THIS IS NEGATIVE, USTRA DIDN'T EVEN REQUEST MORE
16759 JRST [ SKIPGE SJCFF
16764 JRST NOGO4 ;USER MEM EXPANDED TO MAX
16765 SKIPGE SUPCOR .SEE SCLEX ;PRESUMABLY USTRA ASKED SYS JOB FOR MORE JOB SLOTS
16766 PUSHJ P,UFLS ;SO WAIT TILL SYS JOB ANSWERS THE REQUEST
16767 TCORS2: CONO PI,CLKOFF ;AND SEE IF THERE ARE NOW ENOUGH SLOTS.
16770 USRO4: EXCH J,A ;USR: OPEN WITH JNAME=0: USE UNAME AS JOB SPEC.
16774 CAIN J,-1 ;SPEC'D JOB IS PDP6 => OK,
16778 PUSHJ P,LSWPOP ;SOS DIELOK(J)
16779 PUSHJ P,LSWPOP ;TREESW
16782 ;COME HERE WHEN JOB ALREADY EXISTS, WITH CLOCK OFF AND USR IDX IN TT.
16783 ;A, B, C STILL HAVE UNAME, JNAME AND OPEN MODE.
16784 UFN1: JUMPE J,[ADDI B,10000 ;OPENING JOB-DEVICE AND JOB EXISTS??
16785 JRST USROB] ;KEEP CHANGING JNAME UNTIL WE CREATE A JOB.
16787 JUMPL J,UFNDF ;SKIP SOME CHECKS ON SYS & CORE
16788 JUMPG J,[MOVSI T,%OPOJB ;OJB DEVICE OPEN; IF JOB DOESN'T HAVE %OPOJB SET,
16789 TDNE T,OPTION(TT) ;THEN IT HASN'T GIVEN PERMISSION TO BE HACKED.
16790 SKIPL JBI(TT) ;IF IT'S ALREADY A JOB DEVICE DON'T HACK IT.
16791 JRST [CONO PI,CLKON ;IN EITHER CASE, WAIT TILL ALL'S OK,
16796 JRST USROOJ] ;THEN RE-TRY THE OPEN.
16797 LDB T,[.BP BULGOS_22,APRC(TT)]
16799 JRST CLKOJ1] ;RETURN SUCCESS TO JOBO6C.
16801 JRST UFNDF ;USER WANTS IT AS FOREIGN JOB
16804 JRST UFN1C ;OPENING UP INFERIOR
16806 SKIPL SUPPRO(TT) ;UNLESS IT'S A TOP-LEVEL DISOWNED JOB,
16807 JRST UFNDF ;THEN FOREIGN JOB
16808 PUSHJ P,UFN2B ;REOWN DISOWNED TREE
16812 UFN1C: MOVE U,TT ;OPENING PROCEDURE IMMEDIATE SUPERIOR OF PROCEDURE BEING OPENED
16816 ; REOWN A DISOWNED PROCEDURE TREE
16819 NREOWN: TLNN R,%CLSFU ;MUST BE A FOREIGN USER CHANNEL
16825 JRST OPNL31 ;TO A TOP-LEVEL DISOWNED JOB
16827 PUSHJ P,UFN2B ;REOWN THE JOB (TURNS CLOCK ON)
16829 HLRZ R,(P) ;TURN THE CHANNEL INTO AN INFERIOR CHANNEL.
16830 MOVNI T,FUWIDN-UWIDN
16834 ;REOWN JOB TT POINTS TO, ITS APRC IS IN T. SKIPS IF SUCCESSFUL.
16835 ;CALL WITH CLKOFF, WILL TURN IT ON.
16836 UFN2B: TLNE T,BULGOS
16837 JRST OPNL42 ;CAN'T REOWN JOB WHICH IS LOGGING OUT.
16838 SKIPGE APRC(U) ;IF REOWNING JOB IS DISOWNED, PROHIBIT SO THAT
16839 JRST OPNL31 ;IT DOESN'T REOWN ITSELF AND SCREW THINGS UP
16840 PUSHJ P,ULUP1 ;FIND AN INTERRUPT BIT FOR IT. (IN B)
16841 JRST OPNL5 ;WE HAVE 8 INFERIORS ALREADY.
16842 AOS (P) ;GOING TO WIN
16843 SETOM DLSRCH ;INHIBIT SCHEDULING
16844 CONO PI,CLKON ;TURN CLOCK BACK ON, THIS MAY TAKE A WHILE
16845 MOVSI A,BUMRTL ;DOOMED DETACHED JOBS ARE RESCUED BY REOWNING.
16847 MOVE A,UNAME(U) ;PICK UP NEW UNAME
16849 TLZ D,#400000 ;SIGN OF D SET IFF REOWNER ISN'T DISOWNED.
16850 MOVE J,UTMPTR(U) ;PICK UP NEW USER RESOURCE POINTER
16852 SUBI J,USRRCE ;GET NEW CONSOLE #
16853 CAIL J,NCT ;IF NEW TREE STILL HAS NO TTY,
16854 MOVEI J,%TINON ;"DISOWNED" TTY CHNLS SHOULD REMAIN SUCH
16855 ;HERE, A HAS UNAME, D HAS <SIGN IFF MAKING NON-DISOWNED>,,UTMPTR, J HAS CONSOLE # OR %TINON,
16856 ;U HAS REOWNER, TT HAS JOB BEING REOWNED.
16857 UFN2A: PUSH P,B ;SAVE INTERRUPT BIT
16858 UFN3: MOVEM A,UNAME(TT) ;SET TO NEW UNAME
16859 HRRZM D,UTMPTR(TT) ;SET TO NEW USER RESOURCE POINTER
16863 HLLZ T,D ;LH(D) HAS 0 IF REOWNER DISOWNED, ELSE 400000
16864 ANDCAM T,APRC(TT) ;MARK AS NOT DISOWNED IF REOWNER ISN'T DISOWNED.
16865 UFNL3: MOVE B,JNAME(TT) ;PICK UP CURRENT JNAME
16866 MOVEI E,0 ;LOOP ON ALL USERS
16867 UFNL1: CAMN A,UNAME(E) ;SKIP ON NOT SAME UNAME
16868 CAME B,JNAME(E) ;SKIP ON SAME UNAME-JNAME
16869 JRST UFNL2 ;NOT SAME NAME AND/OR VAR BLK NOT IN USE
16870 JRST UFN7 ;NAME CONFLICT, RESOLVE
16871 UFNL2: ADDI E,LUBLK
16874 MOVEI E,0 ;INITIALIZE FOR LOOP TO LOOK FOR INFERIORS AND DUPLICATE NAMES
16875 UFN4: SKIPN UNAME(E) ;SKIP IF VAR BLOCK IN USE
16876 JRST UFN5 ;TRY NEXT
16877 HRRZ I,SUPPRO(E) ;PICK UP SUPERIOR POINTER OF BLOCK BEING EXAMINED
16878 CAIN I,(TT) ;SKIP IF NOT INFERIOR
16879 JRST UFN6 ;INFERIOR, PSEUDO-RECURSE
16880 UFN5: ADDI E,LUBLK ;ADVANCE TO NEXT BLOCK
16881 CAMGE E,USRHI ;SKIP IF ALL EXAMINED
16883 SKIPGE SUPPRO(TT) ;SKIP IF NOT BACK TO TOP
16884 JRST UFNX ;BACK TO TOP LEVEL
16885 MOVE E,TT ;POP BACK UP
16886 HRRZ TT,SUPPRO(E) ;TO PREVIOUS LEVEL
16887 MOVE B,JNAME(TT) ;RESTORE B
16888 JRST UFN5 ;PROCEED AT PREVIOUS LEVEL
16892 HRRM U,SUPPRO(TT) ;SET UP SUPERIOR POINTER IN TO LEVEL DISOWNED
16893 SETZM DLSRCH ;RE-ENABLE SCHEDULING
16897 UFN6: MOVE TT,E ;PSEUDO-RECURSE
16898 JRST UFN3 ;START UP ON LOWER LEVEL
16900 UFN7: CAMN E,TT ;SKIP UNLESS FOUND SELF
16902 ADDI TT,JNAME ;SET UP ARG TO SIXAOS
16903 PUSHJ P,SIXAOS ;INCREMENT JNAME
16904 SUBI TT,JNAME ;RESTORE TT
16905 JRST UFNL3 ;RESTART LOOP
16907 ;RESUSCITATE TTY CHNLS
16911 POPJ P, ;NOT A TTY CH
16914 POPJ P, ;NOT CONSOLE
16917 DPB J,[$TIIDX,,(R)]
16920 UFOUND: HLRZS C ;U HAS INF PROC
16924 ADDI R,IOCHNM(U) ;CLOBBERED BY CORE
16930 JRST OPNL12 ;ATTEMPTED OUTPUT
16931 LDB A,[.BP BULGOS_22,APRC(TT)]
16932 JUMPN A,OPNL42 ;USER GOING AWAY
16937 USRST: PUSHJ P,AUCL2 ;.RESET SIMULATES CLOSING AND REOPENING
16941 EXCH U,A ;BUT WITH LESS OVERHEAD
16944 MOVEI B,BULGOS ;WE'RE NOT REALLY TRYING TO KILL THE INFERIOR,
16945 ANDCAM B,APRC(U) ;SO DON'T LET OTHERS THINK HE'S BEING KILLED.
16949 PUSHJ P,ACRF1 ;FLUSH ALL OF CORE
16953 PUSHJ P,ACRF1 ;THEN GET 1 PAGE
16954 JRST [ PUSHJ P,UDELAY
16957 MOVSI T,%TBNOT+%TBDTY
16964 XCTR XBRW,[BLT T,1777]
16971 PUSHJ P,USRST4 ;SHOULD SKIP
16976 USRST5: MOVE A,TTSTSV(U) ;INITIALIZE SAVED TTYSET OF NEW JOB EQUAL TO CREATOR'S.
16977 SKIPL B,TTYTBL(U) ;NOTE THAT THE WHEREABOUTS OF THE CREATOR'S TTYSET
16978 MOVE A,TTYST1(B) ;DEPENDS ON WHETHER HE HAS THE TTY NOW.
16983 MOVEM A,TTSTSV+1(TT)
16984 MOVEI A,(TT) ;RH OF NEW JOB'S SAVED TTYSTS IS HIS INDEX.
16985 HRLI A,%TSCNS ;NOW CONSTRUCT THE LH.
16986 MOVE B,UTMPTR(TT) ;TO DO THAT, FIND THE TREE'S TTY NUMBER
16987 MOVE B,TTYOPT-USRRCE(B) ;TO FIND THE TTY'S TTYOPT WORD,
16988 TLNE B,%TOROL ;WHICH TELLS HOW TO INIT THE BITS IN THE TTYSTS.
16994 MOVEM A,TTSTSV+2(TT)
16998 ; ARG 1 JOB WHOSE MEMORY SHOULD BE READ OR WRITTEN
16999 ; ARG 2 ADDRESS TO READ OR WRITE
17000 ; ARGS 3,4 LIKE USRVAR, TTYVAR
17001 ; VAL 1 PREVIOUS CONTENTS OF LOCATION
17002 ; VAL 2 NEW CONTENTS OF LOCATION (SAME AS PREVIOUS IF NOT WRITING).
17003 ; (NOT VALID IN BLOCK MODE)
17005 ; BIT 1.1 IF SET, THEN IF PAGE ISN'T READABLE OR WRITEABLE, GIVE AN MPV
17006 ; OR PURE INTERRUPT TO THE JOB BEING REFERENCED.
17007 ; BIT 2.9 IF SET, ALLOWS US TO WRITE IN ANY JOB.
17012 JRST NUSRM1 ;WE CAN SURELY WRITE.
17014 CAIGE W,3 ;ELSE, IF WE WANT TO WRITE,
17015 TRNE H,1 ;OR WANT TO GIVE THE REFERENCED JOB INTERRUPTS,
17016 TRNE H,400000 ;THEN UNLESS WE ARE FORCING IT,
17018 JSP T,NCORWR ;SEE IF IT IS A JOB WE ARE ALLOWED TO WRITE IN.
17020 NUSRM1: MOVE H,CTLBTS(U)
17022 CAIG J,LUBLK ;CAN'T GIVE SYS OR CORE JOBS INTERRUPTS, OR PDP6.
17033 MOVE A,J ;IF TARGET JOB ISN'T SELF OR PDP6
17034 PUSHJ P,RPCLSR ; OR SYS OR CORE, STOP IT.
17037 NUSRMS: PUSHJ P,NUSRM2 ;DO THE WORK
17038 POPJ P, ;LOST, OPNL HAS LSWCLR'ED
17039 JRST LSWCJ1 ;POSSIBLY UNLOCK USTP, DIELOK AND TAKE SUCCESS RETURN
17041 NUSRM2: PUSHJ P,VARCAL ;E:=ADDR, D:=DATA, W:=INSTRUCTION
17044 JRST NUSRM6 ;ACS ALWAYS SWAPPED-IN AND ACCESSIBLE
17047 LDB A,[121000,,E] ;GET PAGE # IN A AND REF'D JOB IN U.
17048 IFE PDP6P, PUSHJ P,UPLC
17050 PUSHJ P,[ CAIE J,-1 ;SKIP IF PDP6
17051 JRST UPLC ;DECODE THEM FOR ORDINARY JOB.
17053 TDZA T,T ;FOR PDP6, MOST PAGES DON'T EXIST,
17054 MOVE T,[002200,,[600000]] ;AND THE REST ARE WRITABLE.
17058 LDB A,T ;GET PAGE ACCESS HALFWORD.
17059 TRNN A,600000 ;IF PAGE SWAPPED OUT, PUT ACCESS BITS IN PLACE THEY WOULD BE
17060 LSH A,16. ; FOR AN IN-CORE PAGE.
17061 JUMPE A,NUSRM9 ;LOSE IF NO PAGE THERE
17062 TRNN A,400000 ;OR IF WE ARE TRYING TO WRITE THE WORD AND PAGE IS READ-ONLY.
17064 NUSRM6: PUSHJ P,MPLDJ ;NOW LOAD MAP OF JOB IN J
17065 HRLI E,(SKIP) ;GET ACCESS TO DATA WORD, SWAP IN PAGE
17068 NUSRM4: CONO PI,CLKOFF ;CLK OFF SO ONCE IN CAN'T SWAP OUT AGAIN
17069 XCTRI XRW,E ;NOT GETTING BENEFIT OF USUAL PCLSR BEFORE
17070 JRST NUSRM5 ;SWAP OUT FEATURE SINCE IT'S ANOTHER JOB
17074 NUSRM5: UMOVE B,(E) ;NOW THAT PAGE IS IN, GET OLD CONTENTS
17075 MOVE A,B ;IN A AND B
17077 HRRI W,B ;IF WRITING,
17078 XCT W ;EXECUTE USER'S INSN., MODIFYING 2ND VALUE IN B,
17079 TRNN J,-1 ;SYSTEM JOB?
17080 JRST OPNL31 ;******* WRITING SYS, TURN INTO .SETLOC *******
17081 UMOVEM B,(E) ;AND STORE IT BACK INTO REF'D JOB.
17082 NUSRM3: PUSHJ P,MPLDZ ;RESTORE NORMAL PAGE MAP, TURN CLKON.
17083 JRST POPJ1 ;SUCCESS
17085 NUSRM8: SKIPA T,[%PIWRO] ;HERE IF TRYING TO WRITE IN READ ONLY PAGE.
17086 NUSRM9: MOVEI T,%PIMPV ;HERE IF ACCESSING NONEXISTENT PAGE.
17087 TRNN H,1 ;SKIP IF TO GIVE INTERRUPT
17090 JRST UUOERR ;INTERRUPT TO SELF
17091 IORM T,PIRQC(J) ;INTERRUPT OTHER USER
17092 JRST OPNL32 ;CAN'T GET THAT ACCESS TO PAGE.
17094 ;COMMENTS BELOW APPLY TO UBI IN MANY CASES. FOR UBO, TRANSFER GOES THE
17100 UBI: MOVEI I,0 ;SIGNAL UBI
17103 XCTR XRW,[MOVES TT,(C)] ;MAKE SURE WRITE CYCLES WILL WIN
17104 UBIB: TRNE A,200000 ;SKIP UNLESS 6
17105 MOVNI A,1 ;SO CAILE BELOW WILL SKIP OVER SUSTPR AMONG OTHER REASONS
17106 CAILE A,LUBLK ;SKIP ON SYS JOB, CORE JOB, PDP6 OR JOB ALREADY STOPPED
17107 PUSHJ P,SUSTPR ;RANDOM JOB STOP
17108 JUMPGE TT,UBI4 ;THRU
17109 TLO A,400000 ;INDICATE ALREADY STOPPED SO WONT TRY IT AGAIN
17111 MOVNS B ;COUNT TO BE XFERRED
17112 HRLZ E,IOCHST-IOCHNM(R) ;EXAMINED USER ADDRESS
17113 HRR E,TT ;FROM,,TO (INFERIOR ADR,,SUPERIOR ADR)
17117 UBI5: CAIGE Q,20 ;INF ADR IN Q
17119 HRRZ J,A ;SET UP UMAPS WORD
17121 TLOA J,%UMMPL ;TO HI PG, HACK OUR LOW PG
17122 TLO J,%UMMPU ;TO LOW PG, HACK OUR HI PG
17124 TLOA J,%UMLTU ;TO POINT TO HIS UPPER
17125 TLO J,%UMUTL ;TO POINT TO HIS LOWER
17126 TLNN J,%UMMPU+%UMUTL ;MAPPING HIS UPPER WITH OUR LOWER?
17127 JRST UBI3A ;YES MAKE SURE NOT SCREWED BY AC PNTR
17128 UBI3B: PUSHJ P,MPLD1
17130 MOVNS Q ;LIMIT SIZE OF XFER TO MIN OF DESIRED
17131 ADDI Q,400000 ;DIST OF TO ADR FROM SEG BOUNDARY
17134 MOVNI Q,(E) ;AND DIST OF FROM ADR FROM SEQ BOUNDARY
17138 TLNN J,%UMMPL ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
17139 TLOA E,400000 ;SET FROM ADR TO HI PG
17140 TRO E,400000 ;SET TO ADR TO HI PG
17141 SKIPE I ;SKIP ON UBI
17142 MOVSS E ;UBO, XFERR OTHER DIRECTION
17143 MOVE Q,E ;SAVE COPY OF BLT PNTR
17144 ADDI B,(E) ;GET LA +1
17145 UBI3H: XCTRI XBRW,[BLT E,-1(B)] ;XFERR DATA
17146 UBI3K: MOVEI E,(B) ;NO FAULT, SIMULATE STORE BACK OF BLT PNTR AFTER COMP OF BLT (RH ANYWAY)
17148 PUSHJ P,MPLDZ ;RETURN TO NORMAL MAP TO STORE BACK USER PNTR
17149 POP P,J ;SAVE PREV MAP FOR EVENTUAL USE
17150 SUBM E,Q ;FIGURE OUT HOW MANY WDS ACTUALLY XFERRED
17152 UBI3E: HRLS Q ;# WDS TRANSFERRED,,SAME
17153 JUMPL C,UBIC ;UPDATE USER PNTR
17154 XCTRI XRW,[ADDM Q,(C)]
17156 BUG ;SHOULD HAVE ALREADY CHECKED THIS
17157 UBID: ADD Q,IOCHST-IOCHNM(R) ;UPDATE INFERIOR PNTR
17158 HRRM Q,IOCHST-IOCHNM(R) ;WRAPPING AROUND IF PASS 1,,0
17160 CAIN B,(E) ;WAS THERE A FAULT?
17161 JRST UBIL ;NO, LOOP
17162 PUSHJ P,UBI4 ;UNSTOP THE JOB.
17163 PUSHJ P,MPLD1 ;RESTORE TO FROB AT TIME OF FAULT
17164 UBI3C: PUSHJ P,TPFLT
17168 UBI4: TLNN A,200000 ;SKIP ON REALLY PDP6
17169 TLZ A,400000 ;FLUSH RANDOM BIT SO COMPARE WILL WORK
17174 UBMCK1: PUSHJ P,UBI4
17177 UBIA: TRNE C,777760
17182 UBIC: TRNE C,777760
17187 UBI5A: CAIL Q,400000
17195 UWI: SETO I, ;0 FOR OUTPUT, -1 FOR INPUT.
17197 MOVNI A,1 ;-1 MEANS PDP6.
17199 HRLI A,-1 ;DON'T STOP SELF
17201 JRST UWI1 ;SYS, CORE, SELF, OR PDP6
17203 PUSHJ P,SOSSET ;MIGHT TAKE PAGE FAULT AND GET PCLSRED
17205 UWI1: HRRZ E,IOCHST-IOCHNM(R)
17207 PUSHJ P,MPLDJ ;MAP JOB BEING IOT'ED FROM.
17208 XCTR XRW,[ MOVE W,(E)
17210 AOS IOCHST-IOCHNM(R) ;ADVANCE ACCESS POINTER
17215 UBI3A: TLNE E,777760 ;SKIP ON XFERRING FROM AC AREA, HI TO HI
17219 XCTRI XR,[MOVE B,(Q)] ;PICK UP WD
17221 JRST UBI3C ;TAKE FAULT
17222 PUSHJ P,MPLDZ ;BACK TO NORMAL MAP
17226 ;USR DEV IOT STOP ROUTINE
17227 USUSTP: SOS USTP(A)
17228 SUSTPR: MOVSI T,BCSTOP+BUCSTP
17229 TDNE T,USTP(A) ;WAIT TILL NOT BEING SHUFFLED
17231 PUSHJ P,RPCLSR ;AOS'ES USTP
17232 MOVSI T,BCSTOP+BUCSTP
17237 UBI3: ADDI Q,AC0S(A)
17240 TDZA B,B ;READ PDP6 AC
17241 MOVE B,(Q) ;READ NORMAL AC
17242 UBI3D: XCTRI XW,[MOVEM B,(E)]
17244 JRST UBI3C ;TAKE FAULT
17245 UBI3G: MOVEI Q,1 ;1 WD XFERRED
17246 HRRZ B,E ;FAKE OUT FAULT TEST
17249 UBO3: TLNE A,200000
17250 JRST UBI3G ;TRYING TO WRITE PDP6 AC IGNORE
17251 XCTRI XR,[MOVE B,(E)]
17258 UBO3A: XCTRI XR,[MOVE B,(TT)]
17260 JRST UBI3C ;TAKE FAULT
17261 PUSHJ P,MPLDJ ;MAP HIM.
17262 XCTRI XW,[MOVEM B,(Q)]
17265 PUSHJ P,MPLDZ ;BACK TO NORMAL
17268 SUBTTL CORE LINK DEVICE
17272 CLSYN: BLOCK NCLCH ;SYSTEM NAME ;0=>VARIABLES FREE
17273 CLN1: BLOCK NCLCH ;FN1
17274 CLN2: BLOCK NCLCH ;FN2
17275 CLUSR: REPEAT NCLCH,-1 ;LH=WRITING USER ;RH=READING USER ;-1=>NOT OPEN THAT HALF
17276 CLRAC: BLOCK NCLCH ;4.9=LOCKED BY CORE ALLOCATOR
17277 ;4.8=VERY SLOW CLOCK ROUTINE CONSIDERING FLUSHING THIS BUFFER
17278 %CAFLS==100000 ;4.7=INPUT CLOSED, TURN OUTPUT INTO NUL DEVICE
17279 %CA==1,,500000 ;RH=UT BUFFER NUMBER (IOBFT ADR)
17281 CLOSW: -1 ;USER LOCK TO STOP MORE THAN ONE PERSON FROM SIMULTANEOUSLY MODIFYING
17282 0 ;THE CORE LINK VARIABLES
17286 ;FORMAT OF CORE LINK 200 WORD BUFFER
17290 CLBEOF==<CLBCHS+4>/5
17291 IFG CLBVSP+CLBCHS+CLBEOF-128.,.ERR CLBXXX LOSSAGE
17294 ;0: CHARACTER COUNT
17295 ;1&2: READ AND WRITE CHARACTER OR WORD POINTERS
17296 ;3&4: READ AND WRITE EOF POINTERS
17297 ;CLBVSP TO CLBVSP+CLBCHS-1: CHARACTERS OR WORDS
17298 ;CLBVSP+CLBCHS UP: EOF BITS STORED AS SEVEN FIVE BIT BYTES PER WORD,
17299 ; EACH BIT CORRESPONDING TO A CHARACTER POSITION.
17301 CLAO: SKIPA J,[2] ;CLA .OPEN (TO ANSWER A CLI INTERRUPT)
17302 CLIO: MOVNI J,1 ;CLI .OPEN (INTERRUPTS USER SPECIFIED BY FILE NAME)
17305 CLUO: TDZA J,J ;CLU .OPEN
17306 CLOO: MOVEI J,1 ;CLO .OPEN
17307 CLI2: JUMPL C,CLFDEL ;JUMP IF AN .FDELE
17309 JRST CLO1 ;NOT FILE DIRECTORY
17314 CLO1: PUSHJ P,SWTL ;SEIZE SWITCH TO STOP VARIABLES FROM CHANGING UNDER YOU
17316 LDB H,[220100,,C] ;DIRECTION BIT
17318 CLOO5B: MOVE Q,USYSN1(U) ;PICK UP SNAME
17320 CAIN J,2 ;SKIP UNLESS CLA
17321 JRST CLO1A ;JUMP IF CLA .OPEN
17323 CLO1A1: MOVE Q,[SIXBIT/_CLI_/]
17324 CLOL: CAMN Q,CLSYN(I) ;LOOK FOR SNAME, FN1, & FN2
17329 JUMPL J,OPNL23 ;"FILE LOCKED" IF ALREADY EXISTS, FOR CLI:.
17330 CAIN J,3 ;SKIP UNLESS DELETE
17331 JRST CLO1D ;FOUND FILE TO DELETE
17332 CLO1A6: LDB TT,CLOOT1(H)
17334 JRST OPNL23 ;ALREADY OPEN THIS DIRECTION (FILE LOCKED)
17336 LDB Q,[IOSA,,IOBFT(TT)]
17338 CLOX: DPB U,CLOOT1(H) ;STORE USER INDEX
17340 ANDCAM TT,CLRAC(I) ;CLEAR VERY SLOW CLOCK BIT
17341 PUSHJ P,LSWPOP ;RELEASE SWITCH
17345 PUSHJ P,CLOX1 ;FOR CLI:, PUT OUR UNAME AND JNAME INTO BUFFER.
17348 MOVEI TT,7 ;UNIT ASCII
17349 ADD Q,H ;OFFSET FOR DIRECTION
17350 DPB TT,[300600,,1(Q)] ;SET UP ITEM POINTER
17353 MOVEI TT,1 ;UNIT ASCII
17354 DPB TT,[300600,,3(Q)] ;SETUP EOF POINTER
17355 JSP Q,OPSLC7 ;SET UP IOCHNM OF USER
17356 DCLUAI,,DCLUAO ;UNIT ASCII INPUT ;UNIT ASCII OUTPUT
17357 DCLBI,,DCLBO ;BLOCK INPUT ;BLOCK OUTPUT
17358 DCLUBI,,DCLUBO ;UNIT BINARY INPUT ;UNIT BINARY OUTPUT
17361 CLOX1: MOVEI TT,44 ;CHANGE OUTPUT BYTE SIZE TO 36.
17362 DPB TT,[300600,,2(Q)]
17363 MOVEI TT,5 ;WHICH INVOLVES STORING 5 CHARACTERS OF EOF BITS AT ONCE.
17364 DPB TT,[300600,,4(Q)]
17368 PUSHJ P,CLOXO ;NOW WE CAN IOT WORDS OUT, EVEN IF CHANNEL IS ASCII MODE.
17372 SOJA Q,POPCJ ;NOW RETURN, AND SET UP THE CORRECT BYTE SIZES.
17374 CLOO1: AOBJN I,CLOL ;LOOP FOR ALL SETS OF CORE LINK VARIABLES
17376 JUMPGE J,OPNL4 ;CLA, CLU DELETE LOSE
17378 CLOO3: SKIPN CLSYN(I) ;LOOK FOR FREE VARIABLES TO CREATE FILE
17381 JRST OPNL5 ;GIVE DIREC FULL ERROR
17383 CLOOT1: 2200,,CLUSR(I) ;READING
17384 222200,,CLUSR(I) ;WRITING
17386 CLOO2: MOVEM A,CLN1(I) ;SET UP VARIABLES
17388 MOVEI D,SCNCLO(I) ;SYS CHNL NO
17389 PUSHJ P,TCALL ;GET 200 WORD BUFFER
17391 JRST CLOO4 ;NO MEM AVAIL
17392 MOVEM Q,CLSYN(I) ;DONT SET UP SYS UNTIL MEM AVAIL
17394 LDB Q,[IOSA,,IOBFT(A)] ;SET UP BUFFER
17396 SETZM (Q) ;CHAR COUNT
17398 ADDI TT,CLBVSP ;SET UP BUF POINTERS
17402 ADDI TT,CLBCHS ;SET UP EOF POINTERS
17407 ;NO MEMORY AVAILABLE FOR 200-WD BUFFERS
17408 CLOO4: AOS SWPOPR ;MAYBE SWAPPING SOMETHING OUT WILL HELP
17409 PUSHJ P,LSWPOP ;UNLOCK CLOSW
17410 PUSHJ P,UDELAY ;WAIT A WHILE
17411 JRST CLO1 ;TRY AGAIN
17413 CLOO5: CONO PI,CLKOFF ;TURN OFF CLOCK TO STOP U&J NAMES FROM CHANGING
17415 CLOO5A: CAMN A,UNAME(Q) ;LOOK FOR USER WHOSE NAMES MATCH THE SPECIFIED FILE NAMES
17418 MOVEI T,%PICLI ;IF GET TO HERE, HAVE FOUND USER WITH RIGHT NAMES
17419 TDNN T,MSKST(Q) ;SKIP IF HE HAS CLI INT DISABLED
17421 IORM T,PIRQC(Q) ;GIVE USER INT
17425 CLOO6: ADDI Q,LUBLK ;GO TO NEXT USER SLOT
17426 CAMGE Q,USRHI ;SKIP IF ALL EXAMINED
17430 CLO1D: MOVE T,CLUSR(I)
17431 AOJN T,OPNL23 ;FILE LOCKED
17434 PUSHJ P,CLIOTB ;NO TIMING ERROR SINCE CORE JOB WILL PCLSR USR ON
17435 SKIPN B,SRN3(U) ;CORE LINK BEFORE MOVING BUFFER
17442 CLO1A: MOVE A,UNAME(U)
17446 ;CORE LINK .IOT SET UP ROUTINE
17448 CLIOTB: SKIPGE CLRAC(A) ;WAIT IF BUFFER LOCKED BY CORE ALLOCATOR
17449 PUSHJ P,UFLS ;(DO NOT CHANGE ABOVE TO "SKIPGE TT,CLRAC(A)")
17451 LDB Q,[IOSA,,IOBFT(TT)] ;GET POINTER TO BUFFER
17456 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII INPUT
17458 CLUAI: PUSHJ P,CLIOTB ;SETUP
17462 SKIPN (Q) ;WAIT TILL CHAR COUNT NON-ZERO
17464 CLUAI1: MOVE J,3(Q)
17465 ILDB I,J ;GET EOF BIT
17467 CLUAIE: ILDB W,1(Q) ;GET CHARACTER
17468 SOS (Q) ;DECREMENT BUF COUNT
17469 CLFAXP: LDB TT,[700,,1(Q)] ;FIX UP POINTERS
17470 CAIN TT,CLBVSP+CLBCHS-1
17471 PUSHJ P,CLFAX2 ;MAYBE TIME TO RING BUFFER
17472 HLRZ TT,J ;GET BYTE POSITION AND SIZE
17473 CAIN TT,010100 ;IF TO END OF 35-BIT WORD, ADVANCE
17474 IBP J ;TO NEXT WORD (5-BIT BYTES 1 BIT AT A TIME)
17478 UNIEOF: HRROI W,EOFCH
17481 CLFAX2: LDB TT,[370500,,1(Q)] ;PICK UP TOP 5 BITS OF BYTE POSITION
17482 JUMPN TT,CPOPJ ;NOT QUITE YET
17483 CLFBX2: MOVEI TT,CLBVSP ;J HAS NEW EOF PNTR
17484 DPB TT,[700,,1(Q)] ;RING CHAR POINTER
17487 DPB J,[360600,,1(Q)]
17488 MOVEI TT,CLBVSP+CLBCHS
17489 DPB TT,[700,,3(Q)] ;RING EOF POINTER
17490 DPB J,[360600,,3(Q)]
17494 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII OUTPUT
17496 CLUAO: MOVE T,CLRAC(A)
17499 PUSHJ P,CLIOTB ;SETUP
17500 MOVEI T,CLBCHS*5-11.
17501 CAMGE T,(Q) ;WAIT TILL THERE IS SPACE IN BUF
17505 SKIPA B,(C) ;GET CHAR FROM EXEC
17506 UMOVE B,(C) ;GET CHAR FROM USER
17508 IDPB TT,J ;INDICATE NOT AN EOF
17509 IDPB B,2(Q) ;STORE IN BUF
17510 MOVEI TT,1 ;GET MASK FOR LOW ORDER BIT
17511 ANDCAM TT,@2(Q) ;FLUSH IN CURRENT WORD
17512 CLCWU2: AOS (Q) ;INCREMENT BUF COUNT
17513 MOVEI I,0 ;FAKE OUT EOF TEST
17514 AOJA Q,CLFAXP ;FAKE OUT CLFAXP AND FIX UP POINTERS
17517 CLBI: JSP W,WRDBTI ;BLOCK INPUT.
17519 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY INPUT
17521 CLUBI: PUSHJ P,CLIOTB ;SETUP
17526 CAMLE T,(Q) ;WAIT TILL A WORD IS AVAILABLE
17528 CLUBI1: MOVE J,3(Q)
17529 ILDB I,J ;GET EOF BITS
17530 JUMPN I,CLUBIF ;JUMP ON EOF
17531 CLUBIE: ILDB W,1(Q) ;GET WORD
17533 ADDB T,(Q) ;DECREMENT COUNT
17535 SETZM (Q) ;CAME FROM CLCLRL WITH PARTIAL WORD IN BUFFER
17536 CLFBXP: JRST CLFAXP
17538 CLUBIF: TROE I,20 ;SKIP IF EOF NOT ON FIRST CHAR OF WORD
17540 DPB I,J ;SET EOF ON FIRST CHAR
17542 ILDB W,J ;PICK UP WORD WITH EOF IN MIDDLE
17545 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY OUTPUT
17547 CLUBO: MOVE T,CLRAC(A)
17550 PUSHJ P,CLIOTB ;SETUP
17551 ;CLI: OPEN CALLS HERE TO OUTPUT UNAME AND JNAME.
17552 CLOXO: MOVEI T,CLBCHS*5-11.
17553 CAMGE T,(Q) ;WAIT TILL THERE IS SPACE FOR A WORD
17557 SKIPA B,(C) ;GET WORD FROM EXEC
17558 UMOVE B,(C) ;GET WORD FROM USER
17560 IDPB TT,J ;INDICATE NOT AN EOF
17561 IDPB B,2(Q) ;STORE IN BUF
17563 ADDM TT,(Q) ;INCREMENT COUNT
17564 AOJA Q,CLFAXP ;FAKE OUT CLFBXP AND FIX UP POINTERS
17567 ;CORE LINK .IOT ROUTINE FOR BLOCK OUTPUT
17569 CLBO: MOVE I,C ;SAVE A POINTER TO USERS BLKO POINTER
17570 XCTR XR,[SKIPL H,(I)] ;PICKUP BLKO POINTER
17572 SKIPA E,H ;SECOND COPY, ALSO FLAG TO CLBIN
17573 CLBI2: UMOVEM E,(I) ;TO INFORM USER & IN CASE YOU ARE PCLSR'ED
17575 PUSHJ P,CLUBO ;TRANSFER ONE WORD
17576 AOBJN E,CLBI2 ;TRY FOR NEXT
17577 CLBI3: UMOVEM E,(I) ;COUNT EXHAUSTED OR EOF
17580 ;CORE LINK .CLOSE ROUTINE FOR BINARY OR BLOCK OUTPUT
17582 CLCLWB: PUSHJ P,CLCWC ;STORE EOF BITS FOR WORD
17583 JRST CLCWU6 ;NO ROOM SO LAST MUST HAVE BEEN EOF HACK SO FLUSH
17584 IBP 2(Q) ;KEEP WORD POINTER IN STEP
17585 PUSHJ P,CLCWB2 ;FIX UP COUNT AND POINTERS
17587 DPB B,[222200,,CLUSR(A)] ;OBLITERATE USER INDEX
17590 JRST LSWPOP ;RELEASE SWITCH
17592 ;CORE LINK .CLOSE ROUTINE FOR UNIT ASCII OUTPUT
17594 CLCLWU: PUSHJ P,CLCWC ;STORE EOF BIT FOR CHAR
17597 IDPB TT,2(Q) ;STORE AN EOF CHAR
17598 PUSHJ P,CLCWU2 ;FIX UP COUNT AND POINTERS
17599 SOS Q ;CLCWU2 AOJAS
17600 LDB TT,[360600,,2(Q)]
17601 SOJE TT,CLCWU6 ;JUST FILLED A WHOLE WORD => STOP PADDING.
17602 PUSHJ P,LSWPOP ;ELSE PAD ONCE MORE.
17606 ;COMMON SUBROUTINE FOR CORE LINK OUTPUT .CLOSE ROUTINES
17608 CLCWC: PUSHJ P,SWTL ;LOCK SWITCH (IF SIGN OF CLRAC IS EVER REALLY USED,
17609 CLOSW ;THIS MIGHT CAUSE A DEADLY EMBRACE).
17610 PUSHJ P,CLIOTB ;SETUP
17611 MOVEI T,CLBCHS*5-5.
17612 CAMGE T,(Q) ;WAIT FOR THERE TO BE ROOM
17616 IDPB TT,J ;SET EOF BIT(S)
17619 ;CORE LINK .CLOSE ROUTINE FOR INPUT
17621 CLO1D2: SETZM CLSYN(A) ;FREE VARIABLES
17622 HRRZS A,CLRAC(A) ;CORE LINK NO LONGER IN USE
17623 PUSHJ P,BRTN ;RETURN BUFFER TO FREE STATE
17626 CLISTA: PUSHJ P,CLIOTB ;CORE LINK INPUT STATUS
17628 TRO D,1_10. ;SYS BUF CAP EMPTY
17630 TRO D,1_9 ;SYS BUF CAP EMPTY
17633 CLCLRA: TDZA C,C ;UNIT ASCII
17634 CLCLRB: MOVNI C,1 ;IMAGE OR BLOCK (I.E. WORDS)
17638 ;FLUSH ALL REAL DATA
17639 CLCLRL: SKIPN (Q) ;SKIP IF BUFFER CONTAINS DATA, READ IT UNTIL EOF
17641 PUSHJ P,[JUMPE C,CLUAI1 ? JRST CLUBI1]
17643 CLCLR2: MOVE J,3(Q) ;FOUND AN EOF, FLUSH THE EOF WORD
17645 PUSHJ P,[JUMPE C,CLUAIE ? JRST CLUBIE]
17648 JRST CLCLR2 ;NOT YET TO WORD BOUNDARY
17651 CLCLR1: MOVSI B,%CAFLS
17660 CLCLR3: HLLOS B,CLUSR(A) ;NO LONGER OPEN FOR INPUT
17661 SKIPN (Q) ;IF NO DATA IN BUFFER
17662 AOJE B,CLO1D2 ;AND NOT OPEN FOR OUTPUT, GO FREE THE BUFFER AND VARS
17667 NLCKCH==:8 ; Should be enough.
17671 LCKNAM: REPEAT NLCKCH, 0 ; 0 => free lock channel, else contains
17672 ; name of lock held by this channel.
17673 LCKUSR: REPEAT NLCKCH, 0 ; Job that holds the lock. Nothing looks
17674 ; at this currently.
17675 LCKSW: -1 ? 0 ; Prevent more than one user from trying to
17676 ; lock a lock at the same time.
17679 ; LCKO is .OPEN routine for LOCK device. First filename is name of lock to
17680 ; seize. 0 is illegal. Only opens for output are permitted (some day we
17681 ; might allow multiple opens for input).
17683 ; Bit 1.4 controls what happens if lock is already held:
17684 ; 0 => error: %ENAFL
17685 ; 1 => Hang until you can seize it
17686 LCKO1: PUSHJ P,LSWPOP ; We lose this time
17687 TLNN C,10 ; 1.4 => HANG MODE
17688 JRST OPNL23 ; FILE LOCKED
17690 CAMN T,LCKNAM(I) ; Wait for unlock, then try again
17692 LCKO: JUMPE A,OPNL11 ; ILLEGAL FILE NAME
17693 PUSHJ P,SWTL ; One potential locker at a time
17695 MOVSI I,-NLCKCH ; Check if it is already locked
17698 JUMPL I,LCKO1 ; Already held
17699 MOVSI I,-NLCKCH ; Search for free lock channel
17702 JUMPGE I,OPNL6 ; DEVICE FULL
17707 MOVEM T,(R) ; Set up channel
17708 JRST LSWPJ1 ; And return
17710 ; .CALL RFNAME returns name of lock:
17711 LCKRCH: MOVE B,LCKNAM(A)
17714 ; .CLOSE releases the lock:
17715 LCKCL: SETZM LCKNAM(A)
17718 SUBTTL COMMON I/O ROUTINES
17720 ;STANDARD DEVICE OPEN
17722 STDOP1: MOVEI R,R ;ENTRY TO NOT CLOBBER IOCHNM
17723 STDOPN: HLRZ A,(Q) ;LH MASK ON 4.9-3.2 OF LH OPEN WRD
17724 AND D,A ;RH POINTER TO ..USR,..USE PAIR
17725 ROT D,-1 ;FOLLOWING WORDS CONTAIN LIST FOR ALL MASKED STATES
17726 ADDI D,(Q) ;LH MSKED STATE =0, RH =1, IOTTB ENTRY NUMBERS
17730 JUMPE A,OPNL12 ;MODE NOT AVAIL
17736 JRST OPNL10 ;DEVICE NOT AVAIL
17741 OPSLD1: ANDI D,1 ;ENTRY TO USE BOTTOM BIT OF AC D
17742 OPSLD3: ANDI D,3 ;ENTRY TO USE BOTTOM TWO BIT OF AC D
17744 OPSLC3: ANDI C,3 ;ENTRY TO USE BOTTOM TWO BITS OF AC C
17745 OPSLC7: ANDI C,7 ;ENTRY TO USE BOTTOM THREE BITS OF AC C
17751 OPNSLT: MOVEM A,(R) ;SET USERS IOCHNM
17754 ;BLOCK OUTPUT TO CHARACTER DEVICE
17755 ;ADR OF CHR ROUTINE IN E
17756 ; THAT ROUTINE MUST NOT CLOBBER C, D, E, OR TT
17757 ;C POINTS TO AOBJN POINTER IN USER SPACE
17758 ;MUSTN'T CLOBBER J (TTY OUTPUT ASSUMES).
17760 NBTOCH: XCTR XRW,[MOVES D,(C)] ;CHECK WRITEABILITY OF AOBJN PTR
17761 LDB TT,[410300,,D] ;USE HIGH 3 BITS OF USER PNTR AS CHR CNT
17763 POPJ P, ;USER TRYING TO XFER >32K FLUSH
17764 SKIPA TT,BTOCHT-3(TT) ;PICK UP APPROPRIATE BYTE PTR (WORD IN W)
17765 NBTO1: UMOVEM D,(C) ;UPDATE USER'S AOBJN PTR
17766 UMOVE W,(D) ;FETCH CURRENT WORD FROM USER
17767 ILDB A,TT ;FETCH CURRENT CHARACTER
17768 PUSHJ P,(E) ;SEND TO DEVICE
17769 ADD D,[700000,,] ;UPDATE PTR
17771 JRST NBTO1 ;GO TO NEXT CHR
17773 ADD D,[500001,,1] ;INCR TO NEXT WORD
17775 UMOVEM D,(C) ;COUNTED OUT, UPDATE FINAL TIME & RETURN
17778 BTOCHT: REPEAT 5,<44-<4-.RPCNT>*7>_14+700,,W
17780 ;BLOCK INPUT FROM CHARACTER DEVICE
17781 ;E AND C SET UP LIKE NBTOCH
17782 ;INTERNALLY LH OF E USED FOR FLAGS:
17783 ; 4.9 EOF FLAG (SIGN)
17784 ; 4.8 => JUST RETURN WITHOUT ERROR IF AT BEGINNING OF WORD,
17785 ; OTHERWISE IGNORE BIT.
17786 ; 4.7 => RETURN WITHOUT ERROR EVEN IF NOT AT BEGINNING OF WORD.
17788 INBTCH: HRRZS E ;CLEAR GARBAGE IN LH
17789 XCTR XRW,[MOVES D,(C)] ;SET UP LIKE NBTOCH
17793 SKIPA TT,BTOCHT-3(TT)
17794 INBTO1: UMOVEM D,(C)
17795 XCTR XRW,[MOVES (D)] ;CHECK WRITABILITY OF CURRENT WORD
17796 JUMPL E,INBTO2 ;JUMP IF EOF
17802 PUSHJ P,(E) ;RETN CHR IN W
17813 CAIN W,7 ;SKIP IF NOT AT 1ST CHAR.
17818 INBTO3: UMOVE W,(D) ;PICK UP CURRENT WORD
17819 IDPB I,TT ;INSERT CHARACTER
17820 UMOVEM W,(D) ;PUT WORD BACK
17823 JRST INBTO1 ;DO ANOTHER CHR THIS WORD
17825 ADD D,[500001,,1] ;INCR TO NEXT WD
17826 SKIPL E ;SKIP IF EOF
17828 UMOVEM D,(C) ;DONE, UPDATE POINTER AND RETURN
17831 INBTO2: MOVEI I,EOFCH ;EOF, STORE EOF CHARACTER
17834 ;BLOCK IO TO WORD DEVICE
17835 ;C POINTS TO AOBJN POINTER IN USER SPACE
17836 ;Q POINTS TO WORD HANDLING ROUTINE (POINTER WILL BE IN C)
17837 ;MUST NOT CLOBBER Q OR H (PTR ROUTINES DO POPJ2 SOMETIMES)
17838 ;WRDBRT CHECKED FOR ON PDL BY TVC ROUTINES
17841 UMOVE C,(H) ;FETCH USER'S AOBJN POINTER
17845 WRDBT2: PUSHJ P,OPBRK
17848 WRDBRT: JRST WRDBT5 ;NO SKIP - WORD XFERRED
17849 SKIPA C,[1,,1] ;1 SKIP - LAST WORD XFERRED
17850 POPJ P, ;2 SKIPS - EOF, NO WORD XFERRED
17851 XCTR XRW,[ADDM C,(H)]
17854 WRDBT5: MOVE C,[1,,1]
17855 XCTR XRW,[ADDB C,(H)]
17859 ;JSP W,WRDBTI TO DO WRDBT FOR A UNIT MODE INPUT ROUTINE SATISFYING NEW
17860 ;CALLING CONVENTION FOR THOSE.
17861 WRDBTI: JSP Q,WRDBT
17862 XCTR XRW,[MOVES (C)]
17868 WRDBT4: UMOVEM W,(C)
17873 ;CHANGED CONVENTIONS:
17874 ;1) EOF IS NO LONGER CHECKED FOR CHARACTER BY CHARACTER.
17875 ; INSTEAD, THE GET-BUFFER ROUTINE SHOULD SET UP THE BYTE COUNT
17876 ; TO A SMALLER VALUE THAN USUAL.
17877 ; AN ATTEMPT TO GET ANOTHER BUFFER AFTER REACHING EOF
17878 ; SHOULD CAUSE THE GET-BUFFER ROUTINE TO SKIP TWICE.
17879 ;2) THE THE BUFFER POINTER IS NOW A B.P. EVEN IN IMAGE MODE.
17880 ; ALSO, THE L.H. OF THE B.P. IS NOT INITTED HERE.
17881 ; IT MUST BE SET UP BY THE OPEN ROUTINE. ALSO, ACCESS ROUTINES
17882 ; FOR DSK MUST KNOW HOW TO SET IT UP.
17883 ; ALSO, THE BUFFER GET ROUTINE SHOULD SET IT UP,
17884 ; INSTEAD OF RETURNING THE BUFFER ADDRESS IN TT.
17885 ;3) THE BYTE SIZE THE FILE IS OPEN ON IS PASSED AS AN ARGUMENT.
17886 ; THIS ROUTINE WORKS FOR ANY CHANNEL BYTE SIZE WITH ANY
17890 ;RH OF E HAS # BYTES/WORD OF FILE BYTE SIZE. LH OF E HAS B.P. 44NN00.
17891 ;RH(C) = ADDR OF COUNT, IN USER MEMORY
17892 ;RH(TT) = ADDR OF USER'S B.P.
17894 ;0(B) ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
17895 ;1(B) ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
17896 ;2(B) ROUTINE TO GET NEXT BUFFER. NO SKIP IF NO MEMORY
17897 ; OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
17898 ; AND BUFFER BYTE POINTER ALREADY SET UP.
17899 ; 2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
17900 ; WHEN THIS ROUTINE IS CALLED, E CONTAINS THE
17901 ; NUMBER OF BYTES/WORD (GOOD FOR DETERMINING CHANNEL MODE).
17902 ;3(B) ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
17903 ; MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO,
17904 ; IN WHICH CASE IT SHOULD CONTAIN THE NEW NUMBER OF BYTES.
17906 ;5(B) IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
17907 ; IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
17909 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
17910 ;SIOKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
17919 SIOKNB: PUSHJ P,@3(B) ;"DISCARD" BUFFER
17920 SKIPE J,@1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME
17921 JRST SIOKT1 ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
17922 SKIPG 5(B) ;NEED TO WAIT FOR DEVICE?
17924 SIOKN1: SKIPG 5(B) ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
17925 JRST SIOKW1 ;DEVICE CAN'T WAIT SO UDELAY
17926 XCT 5(B) ;DEVICE WAIT
17927 SIOKF: PUSHJ P,UFLS
17929 SIOKF1: PUSHJ P,@2(B) ;NOW GET NEXT BUFFER
17930 JRST SIOKN1 ;HMM, HAVE TO WAIT
17931 JRST SIOKT1 ;BUFFER HAS BEEN GOT.
17932 JRST POP3J1 ;EOF, TRANSFER IS COMPLETE
17934 SIOKT1: UMOVE TT,@(P) ;GET COUNT OF BYTES TO TRANSFER
17935 JUMPLE TT,POP3J1 ;COUNT DECREMENTED TO 0; TRANSFER DONE.
17936 SKIPG D,@1(B) ;CHECK AMOUNT LEFT IN BUFFER
17937 JRST SIOKNB ;NEW BUFFER NEEDED
17938 CAMLE TT,D ;AMT OF ROOM LEFT IN CURRENT BUFFER
17939 MOVE TT,D ;TRANSFER ONLY AMT LEFT IN BUFFER
17944 IBP C ;TO TRANSFER WORD-WISE, BOTH B.P.'S MUST
17947 CAIE C,(D) ;HAVE SAME BYTE SIZE,
17954 CAIGE TT,@-2(P) ;THERE MUST BE AT LEAST 1 WORD TO TRANSFER,
17956 CAIE C,44 ;AND MUST BE ABOUT TO START THE NEXT WORD.
17959 IDIVI TT,@-3(P) ;GET # WDS TO BLT
17962 MOVSS J ;WRITING, SWAP BLT POINTER
17964 ADDI TT,(D) ;1+LAST WORD TO BLT INTO
17966 JRST SIOKN6 ;JUMP IF WRITING
17967 XCTRI XBW,[BLT D,-1(TT)] ;READING
17968 SIOKN7: MOVEI D,(TT) ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
17970 HRRZS J ;# WDS ACTUALLY XFERRED
17971 ADDM J,@(B) ;INCR BUFFER PNTR
17972 XCTR XRW,[ADDM J,@-1(P)]
17975 XCTR XRW,[ADDM J,@(P)]
17976 ADDM J,@1(B) ;DECREMENT COUNT LEFT IN BUFFER
17977 CAIE D,(TT) ;SKIP IF TRANSFERRED ALL WE COULD
17978 PUSHJ P,TPFLT ;TAKE FAULT
17979 SIOKN3: SKIPN @1(B)
17980 PUSHJ P,@3(B) ;BUFFER EXHAUSTED, DISCARD (MAY COME BACK TO LIFE).
17981 JRST SIOKT1 ;TRY AGAIN TO TRANSFER.
17983 SIOKW1: PUSHJ P,UDELAY
17986 SIOKN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
17990 ;COME HERE FOR SLOW (BYTE AT A TIME) SIOT TO BLOCK MODE DEVICE.
17991 ;TT HAS NUMBER OF BYTES TO TRANSFER - IT IS KNOWN THAT THE DEVICE
17992 ;CAN SUPPLY THAT MANY FROM ITS CURRENT BUFFER.
17993 SIOKSL: SUBM C,D ;D GETS SIZE; C HAS # BITS REMAINING TO BE HANDLED
17994 IDIV C,D ;C GETS # BYTES TO XFER TILL REACH WORD BOUNDARY.
17995 MOVE TT,C ;XFER THAT MANY, THEN TRY AGAIN, SO WILL USE FAST MODE.
17997 JRST SIOKSI ;INPUT AND OUTPUT PART HERE
17998 LDB D,[300600,,@(B)] ;BYTE SIZE IN THE BUFFER
18000 IDIV C,D ;D := # EXTRA BITS AT RIGHT END OF WORD
18003 SOS J ;J := MASK FOR THEM
18004 UMOVE C,@-1(P) ;GET COPY OF USER'S B.P. FOR SWAPPING IN PAGES.
18005 SIOKS3: IBP C ;IF NOT FOR THESE 2 INSNS, ILDB MIGHT GET PAGE FAULT
18006 UMOVE (C) ;WHICH WOULD CAUSE EXTRA INCREMENTING OF B.P.
18007 XCTR XBYTE,[ILDB D,@-1(P)] ;FETCH NEXT BYTE,
18010 ANDCAM J,(D) ;TURN OFF EXTRA BITS IN THIS WORD OF BUFFER
18012 XCTR XRW,[SOS @(P)]
18016 SIOKSI: UMOVE C,@-1(P) ;GET COPY OF USER'S B.P., FOR WRITEABILITY TESTING.
18018 XCTR XRW,[MOVES (C)] ;MAKE SURE WE CAN WRITE IN NEXT BYTE.
18019 ILDB D,@(B) ;GET NEXT BYTE FROM DEVICE BUFFER
18020 XCTR XBYTE,[IDPB D,@-1(P)];GIVE IT TO USER.
18021 XCTR XRW,[SOS @(P)] ;UPDATE USER'S COUNT
18022 SOS @1(B) ;AND THE SYSTEM'S COUNT.
18026 ;CONVENIENT EXIT ROUTINE FOR BUFFER-GET ROUTINES.
18027 ;ASSUMES ADDR OF START OF BUFFER IN TT,
18028 ;SIZE (IN WORDS) OF DATA AREA IN J.
18029 ;E SHOULD HAVE WHAT IT HAD WHEN SIOKT WAS CALLED.
18030 SIOBGX: IMULI J,(E)
18032 SIOBG2: MOVEM TT,@(B)
18036 ;BYTE AT A TIME I/O TO BLOCK MODE DEVICE
18037 ;SEE PRECEDING PAGE (SIOKT) FOR COMMENTS ON CALLING SEQUENCE
18038 ;EXCEPT: ON INPUT, VALUE RETURNED IN W, AND C,D HAVE NO SIGNIFICANCE;
18039 ;ON OUTPUT, RH(C) HAS ADDRESS OF ARG, SIGN(C) SET IFF ADDRESS IS EXEC-MODE,
18040 ; AND D HAS NO SIGNIFICANCE.
18043 JRST CHRKTO ;WRITING
18044 JRST CHRKTI ;READING
18046 CHRKTI: SOSGE @1(B) ;DECREMENT ACTIVE CHAR COUNT
18047 JRST CHRKT1 ;GET NEW BUFFER
18048 ILDB W,@(B) ;READ - GET NEXT CHAR
18051 CHRKTO: SKIPGE C ;USED WHEN FILLING OUT BLOCK AT CLOSE, AND ELSEWHERE.
18053 UMOVE J,(C) ;GET CHAR. FROM USER
18054 SOSGE @1(B) ;DECREMENT ACTIVE CHAR COUNT
18055 JRST CHRKT1 ;GET NEW BUFFER
18056 IDPB J,@(B) ;DEPOSIT IN BUFFER
18057 CAIE E,5 ;SKIP IF ASCII
18061 ANDCAM J,(D) ;CLEAR EXTRA BIT
18064 CHRKT1: AOS @1(B) ;COMPENSATE FOR OVER-SOS
18065 PUSHJ P,@3(B) ;GET RID OF THIS BUFFER
18066 SKIPLE J,@1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME
18067 JRST CHRKT ;SPRUNG BACK TO LIFE (LAST BLOCK OF FILE WRITE OVER)
18068 SKIPG 5(B) ;NEED TO WAIT FOR DEVICE?
18070 CHRKN1: SKIPG 5(B) ;HAVE TO WAIT
18071 JRST [ PUSHJ P,UDELAY
18073 XCT 5(B) ;DEVICE WAIT
18076 CHRKF1: PUSHJ P,@2(B) ;GOBBLE NEW BLOCK
18077 JRST CHRKN1 ;NOT READY, WAIT
18080 JRST UNIEOF ;READING PAST EOF IN ASCII MODE.
18081 JRST IOCER2 ;READING PAST EOF IN IMAGE MODE.
18084 ;E HAS BPLH,,# BYTES/WORD OF FILE BYTE SIZE - MUST BE 444400,,1
18085 ;RH(C) = ADDR OF AOBJN POINTER
18086 ; AND 4.9 => AOBJN PTR IS IN EXEC ADDRESS SPACE,
18087 ; 4.8 => BLOCK IT POINTS TO IS IN EXEC ADDRESS SPACE. (INPUT ONLY)
18089 ;0(B) ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
18090 ;1(B) ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
18091 ;2(B) ROUTINE TO GET NEXT BUFFER. NO SKIP IF NO MEMORY
18092 ; OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
18093 ; AND BUFFER B.P. IN @(B) ALREADY SET UP.
18094 ; 2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
18095 ;3(B) ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
18096 ; MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO.
18098 ;5(B) IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
18099 ; IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
18101 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
18102 ;BLKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
18104 ;CODE IS ON NEXT PAGE
18106 BLKT: CAME E,[444400,,1]
18107 BUG ;BLKT CALLED ON UNIT ASCII MODE CHANNEL??
18108 SKIPL C ;SKIP IF POINTER IN USER SPACE
18109 XCTR XRW,[MOVES (C)] ;USER SPACE, MAKE SURE WRITE CYCLE WILL WIN
18114 BLKTNB: PUSHJ P,@3(B) ;"DISCARD" BUFFER
18115 SKIPE @1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME
18116 JRST BLKT1 ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
18117 SKIPG 5(B) ;NEED TO WAIT FOR DEVICE?
18119 BLKTN1: SKIPG 5(B) ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
18120 JRST BLKTW1 ;DEVICE CAN'T WAIT SO UDELAY
18121 XCT 5(B) ;DEVICE WAIT
18122 BLKTF: PUSHJ P,UFLS
18124 BLKTF1: PUSHJ P,@2(B) ;NOW GET NEXT BUFFER
18125 JRST BLKTN1 ;HMM, HAVE TO WAIT
18127 POPJ P, ;EOF, TRANSFER FINISHED
18129 BLKT1: SKIPGE C ;SET UP FOR TRANSFER
18130 SKIPA J,(C) ;GET EXEC MODE BLOCK .IOT (AOBJN) POINTER
18131 UMOVE J,(C) ;GET USER MODE AOBJN POINTER
18132 JUMPGE J,CPOPJ ;POINTER COUNTED OUT, TRANSFER DONE
18133 SKIPG D,@1(B) ;CHECK AMOUNT LEFT IN BUFFER
18134 JRST BLKTNB ;NEW BUFFER NEEDED
18136 MOVNS TT ;DESIRED SIZE OF BLOCK
18137 CAMLE TT,D ;AMT OF ROOM LEFT IN CURRENT BUFFER
18138 MOVE TT,D ;TRANSFER ONLY AMT LEFT IN BUFFER
18139 MOVE D,@(B) ;CANONICALIZE THE BUFFER B.P. SO RH => NEXT WORD TO XFER
18141 HRL J,D ;MERGE WITH USER'S BLOCK ADDR TO GET BLT AC.
18143 MOVSS J ;WRITING, SWAP BLT POINTER
18145 ADDI TT,(D) ;1+LAST WORD TO BLT INTO
18147 JRST BLKTN9 ;JUMP IF EXEC AOBJN POINTER
18149 JRST BLKTN6 ;JUMP IF WRITING
18150 XCTRI XBW,[BLT D,-1(TT)] ;READING
18151 BLKTN7: MOVEI D,(TT) ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
18153 HRRZS J ;# WDS ACTUALLY XFERRED
18154 ADDM J,@(B) ;INCR BUFFER PNTR
18155 HRLS J ;PUT # WDS IN BOTH HALVES
18156 JUMPL C,BLKTN3 ;UPDATE AOBJN PTR IN EXEC SPACE
18157 XCTRI XRW,[ADDM J,(C)] ;UPDATE AOBJN PTR IN USER SPACE
18159 BUG ;MUMBLE. THIS WAS SUPPOSED TO BE THERE.
18161 BLKTN4: MOVNI J,(J)
18162 ADDM J,@1(B) ;DECREMENT COUNT LEFT IN BUFFER
18163 CAIE D,(TT) ;SKIP IF TRANSFERRED ALL WE COULD
18164 PUSHJ P,TPFLT ;TAKE FAULT IF ANY
18166 PUSHJ P,@3(B) ;BUFFER EXHAUSTED, "DISCARD"
18167 JRST BLKT1 ;GO TRANSFER ANOTHER CHUNK
18169 BLKTN3: ADDM J,(C) ;UPDATE EXEC AOBJN POINTER
18172 BLKTW1: PUSHJ P,UDELAY
18175 BLKTN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
18179 BLKTN9: BLT D,-1(TT) ;READING INTO EXEC SPACE
18182 SUBTTL DIRECTORY AND ERR DEVICES
18184 QMLSTF: MOVEI J,4 ;ENTRY TO GET MASTER 2314 DIRECTORY
18187 QLISTF: MOVEI J,3 ;ENTRY FOR 2314 USER DIRECTORY
18189 LISTFE: PUSHJ P,SWTL ;ENTER HERE FOR ALL KINDS OF DIRECTORIES.
18192 UD1: SKIPGE UDUSR(TT)
18196 PUSHJ P,UDELAY ;DIRECTORY NOT AVAILABLE NOW, WAIT
18199 UD2: MOVEM J,DSKLST(TT)
18205 JUMPG J,UDIF ;JUMP IF NOT UTAPE DIR.
18206 IFE NUNITS, BUG ;HOW DID UTAPE GET HERE?
18214 JRST UDBIN ;IMAGE MODE UTAPE DIR
18215 MOVEI Q,LISTF ;ASCII MODE UTAPE DIR
18217 UDIF1: MOVEM Q,DIRPC(TT)
18222 UDIF: HLRZ Q,UDT-1(J) ;INITIAL COROUTINE PC
18223 HRRZ T,UDT-1(J) ;PLACE TO FINISH OPENING - USUALLY UDIF1.
18226 UQL1: HRRZM H,UUDPP(TT) ;2314 MFD (FROM UDIF)
18232 UQL1A: PUSHJ P,STMSET ;DISK UFD (FROM UDIF). WE CAN STILL PCLSR,
18233 UDUSR(TT) ;ARRANGE TO GIVE BACK THE DIRECTORY CHANNEL.
18236 PUSHJ P,TCALL ;GET A LOW-HALF PAGE TO COPY UFD INTO.
18237 JRST IOMQ ;GET LOW HALF PAGE
18238 JRST UQL1W ;NOT AVAIL NOW
18240 DPB T,[MUR,,MEMBLT(A)] ;MARK THE PAGE AS A UFD COPY.
18246 BLT A,-1(T) ;COPY UFD
18248 PUSHJ P,LSWDEL ;STMSET OF UDUSR.
18250 BUG ;WE ALWAYS GET OUR MAN
18251 PUSHJ P,LSWPOP ;SOS QSNNR
18258 UQL1W: PUSHJ P,QUDULK
18263 ;LH INITIAL PC RH DISP ADR AT OPEN TIME
18264 UDT: NDLF,,UDIF1 ;NON DIR DEVICE
18265 UCL1,,UDIF1 ;CORE LINK
18266 UQL2,,UQL1A ;2314 UFD
18267 QMLS1,,UQL1 ;2314 MFD
18268 ERR1,,ERR2 ;ERR DEVICE
18269 TTYFLD,,UDIF1 ;TTY DIR
18270 TTYF99,,UDIF1 ;COR DIR (LAST LINE OF TTY DIR)
18273 QUDBIN: HRRZ T,QMDRO
18275 UDBIN: MOVEM J,NUM(TT) ;DOESN'T USE DIRPC THIS PC
18283 UTDCLS: MOVE B,DSKLST(A)
18286 UTDCLX: SETOM UDUSR(A)
18296 ;UNIT MODE IOT ON DIR DEVICE COMES HERE (RETURN CHAR IN W)
18297 DIRCH: SETOM SRN3(U) ;SAY WE WANT ONLY 1 CHARACTER.
18304 ;BLOCK MODE IOT ON DIR DEVICE.
18305 DIRB: JSP Q,WRDBT ;PUSHJ'S TO .+1 FOR EACH WORD.
18306 DIRB1: XCTR XRW,[MOVES (C)] ;MAKE SURE WE CAN WRITE.
18309 SETZM SRN3(U) ;SAY WE WANT A WHOLE WORD OF CHARS.
18313 LDB Q,[350700,,SRN3(U)]
18314 CAIN Q,^C ;IF THE WORD STARTS WITH ^C,
18315 JRST POPJ2 ;IT IS EOF; DON'T RETURN IT, UNHANG IOT.
18318 MOVEI Q,DIRB1 ;FASTER THAN PUSHING AND POPPING Q.
18319 POPJ P, ;RETURN INTO WRDBT
18322 DDATAI: MOVEI T,CHRKTI ;UNIT IMAGE INPUT FROM DIRECTORY.
18324 DBLKI: MOVEI T,BLKT ;BLOCK IMAGE INPUT FROM DIRECTORY
18326 JSP B,(T) ;TO BLKT, SIOKT, OR CHRKTI
18329 POPJ2 ;EOF IF TRY TO GET ANOTHER BUFFER
18330 CPOPJ ;BUFFER DISCARD ROUTINE
18334 ;ERR DEVICE AND ERROR MESSAGE TABLES
18335 ; ERR DEVICE WORKS MUCH LIKE DIR DEVICE
18340 ERR2: SOJE A,ERR21 ;LAST ERRONEOUS CHANNEL
18341 SOJE A,ERR22 ;CHANNEL SPECIFIED IN B
18342 SOJE A,ERR23 ;STATUS WORD IN B
18343 SOJE A,ERR24 ;.CALL ERROR ARG IN B
18347 ERR21: LDB B,[BCHPTR]
18352 ERR23: MOVEM B,UUDPP(TT)
18355 CORO: PUSHJ P,FLDRCK
18360 ERR1: SKIPN I,UUDPP(A)
18362 LDB B,[220600,,UUDPP(A)] ;OPEN LOSS FIELD
18366 MOVE TT,ERMST1-1(B)
18368 ERR1B: LDB B,[300300,,UUDPP(A)] ;IDS ERROR FIELD
18370 MOVE TT,ERMST2-1(B)
18372 ERR1C: LDB B,[330400,,UUDPP(A)] ;IOCERR FIELD
18375 CAIL B,NERM1+MIOTER
18376 MOVEI B,NERM1+MIOTER
18377 MOVE TT,ERMST3-MIOTER(B)
18381 ERR3: MOVEI TT,[ASCIZ /ISE0
18386 ;LISP ASSUMES THAT NO "ERR" DEVICE MESSAGE WILL EVER CONTAIN
18387 ; !, #, ^, OR LOWER CASE LETTERS. PLEASE MAINTAIN THIS STATE
18390 ERMST1: [ASCIZ /NO SUCH DEVICE
18392 [ASCIZ /WRONG DIRECTION
18394 [ASCIZ /TOO MANY TRANSLATIONS
18396 [ASCIZ /FILE NOT FOUND
18398 [ASCIZ /DIRECTORY FULL
18400 [ASCIZ /DEVICE FULL
18402 [ASCIZ /DEVICE NOT READY
18404 [ASCIZ /DEVICE NOT AVAILABLE
18406 [ASCIZ /ILLEGAL FILE NAME
18408 [ASCIZ /MODE NOT AVAILABLE
18410 [ASCIZ /FILE ALREADY EXISTS
18412 [ASCIZ /BAD CHANNEL NUMBER
18414 [ASCIZ /TOO MANY ARGUMENTS (CALL)
18416 [ASCIZ /PACK NOT MOUNTED
18418 [ASCIZ /DIRECTORY NOT AVAIL
18420 [ASCIZ /NON-EXISTENT DIRECTORY
18422 [ASCIZ /LOCAL DEVICE ONLY
18424 [ASCIZ /SELF-CONTRADICTORY OPEN
18426 [ASCIZ /FILE LOCKED
18428 [ASCIZ /M.F.D. FULL
18430 [ASCIZ /DEVICE NOT ASSIGNABLE TO THIS PROCESSOR
18432 [ASCIZ /DEVICE WRITE-LOCKED
18434 [ASCIZ /LINK DEPTH EXCEEDED
18436 [ASCIZ /TOO FEW ARGUMENTS (CALL)
18438 [ASCIZ /CAN'T MODIFY JOB
18440 [ASCIZ /CAN'T GET THAT ACCESS TO PAGE
18442 [ASCIZ /MEANINGLESS ARGS
18444 [ASCIZ /WRONG TYPE DEVICE
18446 [ASCIZ /NO SUCH JOB
18448 [ASCIZ /VALID CLEAR OR STORED SET
18450 [ASCIZ /NO CORE AVAILABLE
18452 [ASCIZ /NOT TOP LEVEL
18454 [ASCIZ /OTHER END OF PIPELINE GONE OR NOT OPEN
18456 [ASCIZ /JOB GONE OR GOING AWAY
18458 [ASCIZ /ILLEGAL SYSTEM CALL NAME
18460 [ASCIZ /CHANNEL NOT OPEN
18462 [ASCIZ /INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18464 [ASCIZ /UNRECOGNIZABLE FILE
18466 [ASCIZ /LINK TO NON-EXISTENT FILE
18468 IFN .-ERMST1-NOPNLS,.ERR WRONG TABLE LENGTH
18469 ;ADD NEW MESSAGES HERE
18471 IFN 0,[ A CLASSIFICATION OF OPEN-LOSS MESSAGES
18473 FULL - NO CORE (MMP FULL)
18474 DIR NOT AVAIL (DIR CHNL TABLE FULL)
18478 INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18480 NO SUCH - DEVICE, FILE, JOB, DIRECTORY, PAGE (CAN'T GET ACCESS)
18481 ILLEGAL SYSTEM CALL NAME
18483 ALREADY ONE SUCH - FILE (FILE ALREADY EXISTS - RENAME)
18485 WRITING - CAN'T MODIFY JOB
18486 DEVICE WRITE-LOCKED
18489 CAN'T GET ACCESS TO PAGE
18491 ARGS (THE PARAMETERS ARE RIDICULOUS) -
18492 SELF-CONTRADICTORY OPEN COMMAND
18500 NOT AVAILABLE (IT EXISTS BUT YOU CAN'T USE IT) -
18502 DEVICE NOT AVAILABLE
18503 NOT ASSIGNABLE TO THIS PROCESSOR
18507 OTHER END OF PIPELINE GONE
18508 JOB GONE OR GOING AWAY
18510 DEPTH - LINK DEPTH EXCEEDED
18511 TOO MANY TRANSLATIONS
18513 OTHER - NOT TOP LEVEL
18514 VALID CLEAR OR STORED SET
18518 [ASCIZ /OPEN TYPE NOT DETERMINED
18521 ERMST2: [ASCIZ /IDS ILLEGAL SCOPE MODE
18523 [ASCIZ /IDS SCOPE HUNG
18525 [ASCIZ /MORE THAN 1K SCOPE BUFFER
18527 [ASCIZ /IDS MEM PROTECT
18529 [ASCIZ /IDS ILLEGAL SCOPE OP
18531 [ASCIZ /IDS MEM PROTECT ON PDL PNTR
18533 [ASCIZ /IDS ILLEGAL PARAMETER SET
18536 ERMST3: [ASCIZ /DEVICE HUNG OR REPORTING NON-DATA ERROR
18538 [ASCIZ /END OF FILE
18540 [ASCIZ /NON-RECOVERABLE DATA ERROR
18542 [ASCIZ /NON-EXISTENT SUB DEVICE
18546 [ASCIZ /OVER IOPUSH
18548 [ASCIZ /USR OP CHNL DOES NOT HAVE USR OPEN
18550 [ASCIZ /CHNL NOT OPEN
18552 [ASCIZ /DEVICE FULL
18554 [ASCIZ /CHNL IN ILLEGAL MODE ON IOT
18556 [ASCIZ /ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY
18558 [ASCIZ /DIRECTORY FULL
18560 [ASCIZ /DIRECTORY'S ALLOCATION EXHAUSTED
18562 ;INSERT NEW MESSAGES HERE
18564 [ASCIZ /IOT OR OPR TYPE NOT DETERMINED
18567 ;DIRECTORY LISTING ROUTINES
18569 UQL3C: SKIPA I,["*]
18574 UQL2: MOVEI TT,[MNAME ASCIZ /, /] ;GENERATE USER DIRECTORY
18578 JSP B,SIXTYC ;SEND DIRECTORY NAME
18583 UQL2A: SKIPGE QACT(E)
18584 JRST UQL3 ;UNIT NOT ENGAGED
18587 JRST UQL3C ;TUT FOR UNIT NOT IN
18595 JSP B,GDPT ;AND # FREE TRACKS
18596 UQL3A: PUSHJ P,OUTCS
18607 UQLP: ADDI Q,2 ;MOVE PNTR TO 3RD WRD OF FILE DESC
18609 MOVEI TT,[ASCIZ /* /] ;DELETED OR BEING WITTEN
18611 MOVEI TT,[ASCIZ / /]
18616 LDB TT,[UNPKN+@DIRPT(A)]
18617 JSP B,GDPT ;PRINT PACK #
18618 LDB TT,[UNPKN+@DIRPT(A)]
18620 UQLL2: PUSHJ P,OUTCS
18622 SUBI Q,2 ;BACK TO FIRST WD
18623 JSP B,SIXTYA ;SEND FIRST FILE NAME
18624 JSP B,SIXTYB ;AND SECOND (AOSES Q)
18626 AOS Q ;SET Q TO POINT TO FILE DESC PNTR
18627 LDB E,[UNDSCP+@DIRPT(A)] ;PICK UP FILE DESC PNTR
18629 ADDI E,UDDESC ;COMPUTE WORD ADDRESS
18630 MOVE I,@DIRPT(A) ;SAVE STATUS WORD
18631 EXCH E,Q ;MOVE INTO PNTR
18634 HLLM TT,DIRPT(A) ;SET UP DIRPT TO POINT TO FILE DESC
18638 UQL5: JSP B,UQL5R ;CHECK IF ABOUT TO INCREMENT OFF WORD
18640 JUMPE I,UQL5A ;STOP
18650 QLL1: CLEARM ENDT(A) ;CNTS TO 3 FOR USER NAME AND 2 FILE NAMES
18651 QLL3: CLEARM NUM(A) ;CHR CNTR
18652 QLLIST: JSP B,UQL5R
18664 QLL2: PUSHJ P,OUTCS
18669 MOVEI Q,3(E) ;ADVANCE Q
18676 UQL5R: MOVE I,DIRPT(A) ;CHECK IF ABOUT TO ILDB OFF WORD
18679 MOVEI I,440600+Q ;YES INCREMENT Q INSTEAD
18683 UQL5B: CAIGE I,UDWPH ;PLACE HOLDER
18684 AOJA TT,UQL5 ;SKIP AND TAKE
18687 REPEAT NXLBYT,[JSP B,UQL5R
18690 AOJA TT,UQL5 ;SPACE OVER 2ND HALF OF LOAD ADDRESS
18692 UQL5A: JSP B,GDPT ;TYPE OUT # BLOCKS
18694 MOVE Q,E ;FILE POINTER
18696 SKIPGE B,@DIRPT(A) ;SKIP ON NOT DUMPED
18698 PUSHJ P,OUTC ;HAS NOT BEEN BACKED UP
18700 TLNN B,UNREAP ;SKIP ON DON'T-REAP
18704 LDB E,[1200,,DIRPT(A)]
18707 AOJE TT,UQL5C ;DATE NOT KNOWN
18708 LDB TT,[UNMON+@DIRPT(A)]
18709 JSP B,GDPT ;TYPE MONTH
18712 LDB TT,[UNDAY+@DIRPT(A)]
18713 JSP B,GDPT ;TYPE DAY
18716 LDB TT,[UNYRB+@DIRPT(A)]
18717 JSP B,GDPT ;TYPE YEAR
18734 UQL5D: JSP B,MESPCR
18735 ADDI Q,2 ;ADVANCE Q
18742 ;GENERATE MFD LISTING
18743 QMLS1: CONO PI,CLKOFF
18755 QMLS3: ADDI Q,LMNBLK
18758 ;DIRECTORY LISTING ROUTINES FOR UTAPE
18761 LISTF: MOVEI Q,220600+Q
18767 LISTF1: MOVEI TT,[ASCIZ /
18772 LISTF4: SKIPE @DIRPT(A)
18777 LISTF8: AOBJN Q,LISTF4
18779 MOVEI TT,[ASCIZ / FREE BLOCKS /]
18783 LISTD2: JSP B,MESPCR
18785 LISTF2: MOVEI I,440600+Q
18789 LISTF6: PUSHJ P,OUTCS
18795 LISTD4: JSP B,MESPCR
18796 LISTF3: AOBJN Q,LISTF2
18799 UCL7: MOVEI I,14 ;END DIR WITH FORMFEED AND EOF CHARS
18804 IFN NUNITS, LISTF5: AOJA Q,LISTF3
18806 ; DIRECTORY LISTING ROUTINES FOR MISC. DEVICES + CORE LINK
18808 NDLF: MOVEI TT,[ASCIZ /
18809 NON-DIRECTORY DEVICE/]
18813 ;DIRECTORY OF CORE LINK DEVICE
18814 UCL1: MOVSI Q,-NCLCH
18815 UCL6: SKIPN CLSYN(Q)
18831 UCL3: MOVEI TT,[ASCIZ /->/]
18842 UCL5A: AOBJN Q,UCL6
18848 MOVEI J,[SIXBIT /CLOSED/]
18849 SIXTYC: HRLI J,440600
18854 ; DIRECTORY LISTING ROUTINES FOR TTY
18856 TTYFLD: MOVEI TT,[ASCIZ /
18857 TTY UNAME JNAME CORE TOTAL IDX
18861 TTYF1: HRRE E,TTYSTS(Q)
18862 AOJE E,TTYF5 ;JUMP IF NOT IN USE
18866 MOVEI I,"D ;"DEVICE"
18871 TTYF11: MOVEI J,UNAME(E)
18883 TTYF3: SKIPE UNAME(B)
18887 TTYF4: ADDI B,LUBLK
18895 JRST [ HRRZ TT,SUPPRO(TT) ? JRST .-1 ]
18899 TTYF5: AOBJN Q,TTYF1
18900 TTYF99: MOVEI TT,[ASCIZ /FREE CORE /]
18905 MOVEI TT,[ASCIZ / OUT /]
18913 SIXTYA: PUSHJ P,OUTCS
18917 SIXTYP: ILDB I,DIRPT(A)
18925 MESP3S: SKIPA TT,[[ASCIZ / /]]
18926 MESPCR: MOVEI TT,[ASCIZ /
18928 MESPNT: HRLI TT,440700
18936 OUTC: SKIPL TT,SRN3(U) ;IF WANT 1 CHAR, RETURN WITH IT, SAVING ACS.
18937 JRST OUTC1 ;IF WANT WHOLE WORD, SEE IF WORD IS FULL.
18938 OUTC2: MOVEM E,SAVE(A)
18945 ADDI TT,(I) ;MERGE THIS CHAR (IN I) INTO WORD BEING ACCUMULATED.
18948 TLNE TT,774000 ;IF THE WORD IS FULL, RETURN TO DIRB.
18950 POPJ P, ;ELSE POPJ FROM OUTC, TO GET MORE CHARS.
18952 ;NUMERIC PRINTOUT ROUTINES FOR FILE DIRECTORIES.
18953 ;ALL CALLED WITH JSP B,. ALL TAKE ARG IN TT.
18955 ;PRINT NUMBER IN TT IN DECIMAL, RIGHT-ADJUSTED IN FOUR COLUMNS.
18956 G4SDPT: CAIL TT,1000.
18957 JRST GDPT ;IF IT NEEDS 4 DIGITS, JUST PRINT IT.
18959 CAIL TT,100. ;ELSE FIGURE OUT HOW MANY LEADING SPACES ARE NEEDED
18963 PUSHJ P,OUTCS ;AND PRINT THAT MANY.
18964 G4SDP2: PUSHJ P,OUTCS
18965 G4SDP1: PUSHJ P,OUTCS
18969 ;PRINT CONTENTS OF TT AS TWO OCTAL DIGITS.
18973 ;PRINT CONTENTS OF TT AS THREE DECIMAL DIGITS.
18974 G3DPT: IDIVI TT,100.
18979 G2DPT: IDIVI TT,10.
18980 G2DPT2: MOVEM I,NUM(A)
18988 ;PRINT ARG IN TT IN DECIMAL USING AS MANY DIGITS AS IT NEEDS.
18992 ;PRINT ARG IN TT IN OCTAL USING AS MANY DIGITS AS NECESSARY.
19012 ;ROUTINE TO CALL A DIRECTORY COROUTINE
19013 DIRCHR: MOVE E,SAVE(A)
19019 BLKPNA: MOVEI J,1(I)
19026 BLKPN2: MOVEI E,440500+I
19028 BLKPN1: ILDB E,DIRPT(A)
19037 BLKPN3: JUMPE J,GDPT
19039 BLKPN4: MOVE E,@DIRPT(A)
19048 UDUSR: REPEAT NUDCH,-1 ;-1 => FREE, ELSE UTAPE # IF UTAPE DIR, ELSE 0.
19049 UDUIND: BLOCK NUDCH ;IF DIR CHANNEL IN USE, HOLDS JOB # OF JOB USING IT.
19051 IRPS X,,DIRPC:DIRPT:NUM:ENDT:SAVB:SAVQ:UDSYSN:UUDPP:SAVE:
19057 DSKLST: BLOCK NUDCH ;0 LISTING UTAPE 1 NON-DIR DEVICE
19058 ;2 CORE LINK 3 2311
19059 ;NO BBLK SINCE VARIABLES ON NEXT PAGE
19061 SUBTTL UTC LEVEL INTERRUPT
19063 ;NO EBLK SINCE VARIABLES ON PREVIOUS PAGE
19065 UTCPDP: -LUTCP,,UTCP-1 ;UTC-LEVEL PDL
19067 UTACS: BLOCK 20 ;UTC-LEVEL AC SAVE
19069 IFE KS10P,[ ; On the KS10 we can take advantage of the Unibus interrupt
19070 ; vectoring scheme to dispatch quicker, so this code was
19071 ; reorganized somewhat.
19075 CONSO PI,1_<7-UTCCHN>
19076 JRST 4,. ;HARDWARE BUG ALLEGEDLY FIXED
19085 JRST PIPOS ;HAS CHNL >1
19093 IFN IMPP,[ ; See if it's an IMP interface interrupt
19099 TRNE TT,IMPLW+IMPHER+IMPERR+IMPOD+IMPID
19103 TRNN TT,70 ;CHECK PIA
19104 JRST UTCB2 ;DO NOT PROCESS IF NO PIA
19105 TRNE TT,FILW+FIDOWN+FIWASD+FIOD+FIID
19115 IFE KA10P, CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS
19123 TRNN TT,10 ;IF BIT IS ON IT IS INTERRUPTING - LET QINT HAVE IT
19129 TRNN TT,%HIDON+%HIATN ;INTERRUPTING HARDWARILY
19130 SKIPGE QGTBZY ;INTERRUPTING SOFTWARILY
19139 TRNN C,100 ;IF NOT JOB DONE
19140 TRZ C,30000 ; THEN DON'T BELIEVE PAR ERR OF EOF
19141 TRNN A,400 ;IF NEXT UNIT NOT ENABLED
19142 TRZ C,2 ;THEN TURN OFF NEXT UNIT FLAG
19143 TRNE C,440302 ; UNIT HUNG, ILLEGAL, BAD TAPE (UGH), LOAD NEXT UNIT, JOB DONE
19145 UTCBK2: SKIPN MGTBZY ; SOFT WARE CALL
19148 IFN NUNITS, JRST UTCB0
19157 MGEX: MOVSI U,UTACS
19165 UTCBRK: 0 ; Still EBLK'ed from previous page...
19171 CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS
19173 AOSN IMPBZY ;-1 if IMP wants a jump-start
19186 DSKEX: MOVSI U,UTACS
19190 ;;; Interrupt routines that are directly dispatched to by the KS10/Unibus
19191 ;;; interrupt kludge should do JSR UTCSAV as their very first instruction.
19192 ;;; The word before the JSR is expected to contain the interrupted PC.
19193 ;;; They should then exit through DSKEX just like everybody else.
19209 $INSRT SYSJOB ;SYSTEM JOB AND RELATED STUFF
19212 SUBTTL DCHNTB AND DCHNTC
19215 CHSPUR: BLOCK 8 ;NUM OF SPURIOUS INTS PER CH (ZERO = DCHK)
19218 IFE KS10P,[ ; KS10 doesn't even pretend to have devices.
19220 ;***** DCHNTB *****
19221 ;4.9 = KNOWN DEVICE
19223 ;4.7-4.4 PIA 2 SHIFT
19224 ;4.3-4.1 PIA 2 ACTIVE VALUE
19225 ;3.9 = PIA 2 MAY BE ZERO
19227 ;3.7-3.4 PIA 1 SHIFT
19228 ;3.3-3.1 PIA 1 ACTIVE VALUE
19229 ;2.9 = PIA 1 MAY BE ZERO
19230 ;2.8 = ALLOW USER DATAI, BLKI
19232 ;2.6 CONI, CONSO, CONSZ
19234 ;2.4 SPECIAL KL10 DEVICE, BLKI/BLKO ARE DATAI/DATAO TO A SECOND DEVICE REGISTER
19235 ;1.6-1.1=N, IF NON ZERO: IGNORE DEV UNLESS CONI BIT N-1 IS ON
19236 ;(IF DSDEV PRESENT)
19238 ;***** DCHNTC *****
19239 ;4.9 = SUSPICIOUS DEVICE
19240 ;4.8 = FOUND CLOBBERED
19241 ;4.7 = SUSPECTED OF CAUSING SPURIOUS INTS
19242 ;4.6-4.4 = CHANNEL CAUSING INTS ON
19243 ;3.9-3.1 = SUSPICION COUNT
19248 400200+APRCHN,,240000 ;0 APR
19252 400200+APRCHN,,250000 ;0 APR (ALLOW DATAI, "BLKI", CONI)
19253 SETZ 010000 ;4 PI (ALLOW NOTHING)
19262 DCHENT PAG,SETZ 240000 ;ALLOW DATAI, CONI, BUT NOT "BLKI"
19263 DCHENT CCA,SETZ ;ALLOW NOTHING
19264 ;XCTR of some of the instructions for these devices fails to relocate
19265 ;the address to user space, due to bugs in the hardware. Flush 'em.
19266 ; DCHENT TIM,SETZ 250000 ;ALLOW DATAI, "BLKI", CONI
19267 ; DCHENT MTR,[400201,,250000] ;INTERVAL TIMER PIA=1. ALLOW DI,BI,CI
19268 DCHENT TIM,SETZ ;20 ALLOW NOTHING
19269 DCHENT MTR,SETZ ;24 ALLOW NOTHING
19270 DCHENT 30,SETZ ;30 RESERVED
19272 IFN DSDP, DCHENT DSDEV,[REPEAT 2,400200+DSDCHN,,440000] ;20,24
19273 IFN DL10P,[ DCHENT DLB,SETZ 240000 ;60 DL10
19274 DCHENT DLC,[400200+TTYCHN,,240000] ;64 DL10
19276 IFN STKP, DCHENT STK,[400200+LPTCHN,,440000] ;70 STK
19277 IFN PTRP, DCHENT PTP,[400200+PCHCHN,,440000] ;100 PTP
19278 IFN PTRP, DCHENT PTR,[400200+PTRCHN,,440000] ;104 PTR
19279 IFN NOTYS, DCHENT TTY,[400200+TTYCHN,,40000] ;120 TTY
19280 IFN OLPTP, DCHENT OLPT,[400200+LPTCHN,,440000] ;124 OLPT
19281 IFN 340P, DCHENT DIS,[630600+DISCHN+SDCHN_9,,440001] ;130 DIS
19282 IFN E.SP, DCHENT DIS,[400200+DISCHN,,440000] ;130 E&S
19283 IFN KL10P, DCHENT DTE,[400200+IFE PDCLKP,[APRCHN].ELSE [TTYCHN],,240000] ;200 DTE20
19284 IFN RP10P, DCHENT DPC,[400200+DSKCHN,,440000] ;250 DPC
19285 IFN RH10P, DCHENT DSK,[400200+DSKCHN,,040000] ;270 RH10
19288 DCHENT DC,[400000,,440000] ;200 DC
19289 DCHENT UTC,[400200+UTCCHN,,440000] ;210 UTC
19290 DCHENT UTS,[SETZ 40000] ;214 UTS
19293 DCHENT DTC,[630600+UTCCHN+DCCHN_9.,,440000] ;320
19294 DCHENT DTS,[SETZ 40000] ;324
19296 ] ;END OF IFN NUNITS
19298 DCHENT MTC,[400230+MTCCHN,,440001] ;340 MTC
19299 DCHENT MTS,[SETZ 40001] ;344 MTS
19301 IFN MTYP, DCHENT MTY,[400200+TTYCHN,,40000] ;400 MORTON BOX
19302 ;420 SPACEWAR CONSOLES
19303 IFN DMIMP, DCHENT FI,[400230+NETCHN,,400000] ;424 DM IMP HARDWARE
19304 IFN NDAP, DCHENT 454,[400200,,760000] ;454 D/A
19305 IFN KAIMP, DCHENT IMP,[400000,,400001] ;460 AI-KA/ML-KA/MC-KL IMP
19306 ; HARDWARE THIS SAYS IMP
19307 ; HAS NO PIA BECAUSE IT
19309 IFN NLPTP, DCHENT NLPT,[400200+LPTCHN,,440000] ;464 NEW LPT
19310 IFN CH10P, DCHENT CHX,[400200+CHXCHN,,040000] ;470 CHAOSNET
19311 IFE KL10P, DCHENT 500,[400000,,240000] ;500 ML-KA, DM CALENDAR; AI-KA R CLK
19312 IFN KL10P&PDCLKP,DCHENT 500,[400200+APRCHN,,240000] ;500 MC-KL F CLK
19313 IFN ARMP, DCHENT TIPDEV,[400200+TIPBCH,,440000] ;504 ARM TIP BREAK
19314 IFE MCOND AIKA, DCHENT 510,[400000,,360000] ;510 ANOTHER D/A??
19315 ;DOES ANYONE KNOW WHAT DEVICE 510 IS??
19316 IFN RBTCP, DCHENT RBTCON,[400200+TABCHN,,440001] ;514 ROBOT CONSOLE
19317 IFN ARMP, DCHENT 564,[400200,,440000] ;564 ARM TACTILE SENSE
19318 IFN OMXP, DCHENT OMPX,[400200+OMPCHN,,440001] ;570 OMX
19319 IFN IMXP, DCHENT MPX,[SETZ 40001] ;574 IMX
19320 ;Comment this out since the AI-KA one is no longer on the bus
19321 ;IFN TK10P, DCHENT NTY,[400200+TTYCHN,,40000] ;600 NTY
19322 IFN NTYP, DCHENT NTY,[400200+NTYCHN,,40000] ; NTY FOR 11 KLUDGE
19323 IFN DPKPP, DCHENT DPK,[400200+TTYCHN,,40000] ;604 DATAPOINT KLUDGE
19325 DCHENT DC0,[400200+DSKCHN,,40000] ;610 DC0
19326 DCHENT DC1,[400000,,] ;614 DC1
19328 IFN VIDP, DCHENT NVDX,[REPEAT 4,400200+NVDCHN,,440001] ;620-634 BAT
19329 IFN PLTP, DCHENT PLT,[400200+PLTCHN,,440000] ;654 PLT
19330 DCHENT 704,[400000,,440000] ;704 ???
19332 DCHENT CLK1,[400200,,240000] ;710 CLK1
19333 DCHENT CLK2,[SETZ 40000] ;714 CLK2
19338 DCACS: BLOCK 20 ;SAVE ACS
19339 CCSDEV: 0 ;+ => SOME SUSPICIOUS DEVICES
19342 DCHK: 0 ;TO CALL FROM DDT
19354 ;CHECK FOR CLOBBERED DEVS, CALL WITH JSP E,
19355 CHECK: JSP H,DCSTUP
19356 CHECK1: SKIPL TT,DCHNTB(I)
19357 JRST CHECK4 ;UNKNOWN DEVICE
19367 CHECK2: JSP H,DCCONI
19368 TLNN TT,200 ;SKIP IF PI TO TEST
19370 LDB T,[250400,,TT] ;GET SKIP
19374 LDB Q,[220300,,TT] ;GET CHANNEL
19378 CHECK3: LSH TT,-9 ;SHIFT TO PIA2
19381 CHECK5: JUMPN B,CHECKL ;JUMP IF NONZERO AND WRONG
19382 TRNE TT,400000 ;SKIP IF CAN NOT BE ZERO
19383 JRST CHECK3 ;ZERO OK
19386 CHECK4: ADD A,[400,,] ;INCREMENT DEVICE CODE
19389 BUG PAUSE,[BITS ],OCT,C,[MAY BE STUCK ON IN I/O BUS]
19391 SKIPE W ;SKIP IF NO TROUBLE DETECTED
19395 DCSTUP: MOVE A,[CONI B] ;SET UP
19403 SKIPL DCHNTC(I) ;SKIP IF DEVICE ALREADY SUSPICIOUS,SAVES FIRST SUSPICIOUS
19404 HRRM B,DCHNTC(I) ;STORE AWAY CONI
19407 CHECKL: JSP H,DCSAOS
19408 MOVSI T,600000 ;CLOB
19412 DCSAOS: MOVE D,A ;MAKE A CONO
19414 SKIPL T,DCHNTB(I) ;SKIP IF KNOWN DEV
19415 JRST DCSAS2 ;JUST RESET UNKNOWN TO ZERO
19416 TLNE T,200000 ;SKIP IF NO PIA2
19417 TLNE T,400 ;SKIP IF PIA2 CAN NOT BE ZERO
19419 LDB TT,[330300,,T] ;GET PIA2
19420 LDB T,[360400,,T] ;GET PIA2 SHIFT
19422 IOR D,TT ;ADD CORRECT CANNEL TO CONO
19423 MOVE T,DCHNTB(I) ;SKIP IF NO PIA1
19424 DCSAS1: TLNE T,200 ;SKIP IF PIA1 CANNOT BE ZERO
19427 LDB TT,[220300,,T] ;GET P1A 1
19428 LDB T,[250400,,T] ;GET PIA 1 SHIFT
19429 LSH TT,(T) ;OR IN PIA 1
19434 AOS W ;THIS MAY BE THE CAUSE OF OUR TROUBLES
19439 SOJA T,[JRST 4,.+1] ;LOSEY LOSEY
19440 DPB T,[221100,,DCHNTC(I)]
19443 ;CHANNEL IN J SPURIOUS INTERRUPT ON, CALL WITH JSP E,
19452 SPUR2: SKIPGE TT,DCHNTB(I)
19459 DPB J,[360300,,DCHNTC(I)]
19460 SPUR4: ADD A,[400,,]
19470 DEFINE UBINT VEC,-REST
19472 IFN .VEC.&3, .ERR Bogus interrupt vector: VEC
19476 IFG .VEC.-.MAX., .MAX.==.VEC.
19477 IFL .VEC.-.MIN., .ERR Unibus interrupt table lossage.
19481 ;;; Interrupt table for Unibus Q.
19484 .MIN.==53 ; Guess smallest interrupt vector on Unibus Q
19489 UBINT PHVEC, JSR DSKBRK ; RH11 FOR DISK
19494 ;;; Interrupt table for Unibus I.
19497 .MIN.==45 ; Guess smallest interrupt vector on Unibus I
19503 UBINT %TMVEC, JSR MGHBRK ;RH11 FOR TAPE
19508 UBINT 340+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,RB ; DZ receive
19509 UBINT 344+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,XB ; DZ transmit
19513 UBINT %LHVEC, JSR IMPIBK ;IMP Input side break
19514 UBINT %LHVEC+4, JSR IMPOBK ;IMP output side break
19518 UBINT 270, JSR CHXBKH ; Usual Chaosnet vector
19519 UBINT 230, JSR CHXBKH ; Except some interrupt here instead
19524 ;;; Assignment of pages in Unibus pager for DMA devices.
19525 ;;; Note that these pages are 2000 PDP-10 words long (ITS sized) rather
19526 ;;; than 1000 (DEC sized). Each page here thus occupies -two- locations in
19527 ;;; the Unibus pager. There are 32. such pages on each Unibus.
19530 QUBPG==:5 ; Chosen at random.
19534 IUTPG==:5 ;Magtape IO page. well, 5 worked last time
19538 IUIMPG==:6 ;IMP Data transfer page
19543 SUBTTL OVERHEAD METERING ROUTINE
19548 ;TABLE OF OVERHEAD REGIONS. ENTRY IS SIXBITNAME,,PC ? COUNT
19549 0 ;COUNTS STUFF BEFORE FIRST OVHMTR MACRO
19552 0 ;COUNTS USER-MODE PC'S
19555 ;COME HERE ON PI CHANNEL 1 EVERY 39 MILLISECONDS
19560 CONO TIM,060000+3900. ;CLEAR DONE
19561 EXCH T,OVHBRK ;GET PC INTERRUPTED OUT OF
19562 TLNE T,%PSUSR ;ONLY METER IF EXEC MODE
19567 OVHBR1: HRRZ B,OVHTBL(A)
19568 AOBJN A,.+1 ;2-WORD ENTRIES
19569 CAIG B,(T) ;SKIP IF PC LIES IN PREVIOUS REGION
19571 SKIPGE A ;IN CASE T = 777777
19572 AOS OVHTBL-2(A) ;AOS PREVIOUS REGION'S COUNT
19575 OVHBRX: AOS OVHTBL+LOVHTB-1 ;AOS COUNT OF USER-MODE PC's
19581 RDPCST=DATAI 14, ;INSTRUCTIONS FOR PC SAMPLING TABLE
19584 ;TABLE OF OVERHEAD REGIONS. ENTRY IS PC,,SIXBITNAME
19585 OVHTB1: 0,,'LOW ;LOWER FENCE
19587 377777,,'USR ;UPPER FENCE
19589 REPEAT <1_<36.-<.LZ <LOVHTB-1>>>>-LOVHTB, 377777,,-1 ;PAD TO POWER OF TWO SIZE
19593 OVHTB2: BLOCK LOVHTB ;CORRESPONDING COUNTS (LAST IS FOR USER MODE)
19595 OVHCNT: 28. ;COUNTER TO SLOW THINGS DOWN TO CUT OVERHEAD
19597 LOVHPC==100 ;64 SAMPLES SHOULD BE ENOUGH
19598 OVHPCS: BLOCK LOVHPC
19602 ;CALCULATE OVERHEAD USING PC SAMPLE TABLE
19604 OVHCLK: SOSL OVHCNT ;TIME TO DO IT YET?
19605 JRST OVHCL9 ;NO, IGNORE THESE SAMPLES
19606 MOVEI A,28. ;SEE ONLY ONE SAMPLE OUT OF EVERY 29 ON AVERAGE
19607 MOVEM A,OVHCNT ;SO TIME SPENT IN THIS ROUTINE IS NOT EXCESSIVE
19608 RDPCST C ;SEE HOW FULL THE PC SAMPLING TABLE IS
19609 HRLOI C,-OVHPCS-1(C)
19610 EQVI C,OVHPCS ;AOBJN POINTER TO SAMPLES ACTUALLY TAKEN
19611 JUMPGE C,OVHCL9 ;NONE
19612 CAMGE C,[-LOVHPC,,OVHPCS]
19613 JRST OVHCL9 ;BOGUS AOBJN POINTER, MAYBE PCST NOT TURNED ON
19614 OVHCL1: MOVE A,(C) ;NEXT SAMPLED PC
19615 TLNE A,%PSUSR ;ONLY SEARCH TABLE IF EXEC MODE
19616 JRST OVHCL8 ;ALL USER MODE PC'S ARE COUNTED IN LAST BUCKET
19617 HRLO A,A ;-1 IN RH IS GREATER THAN ANY SIXBIT
19618 MOVEI B,1_<35.-<.LZ <LOVHTB-1>>> ;HALF THE SIZE OF THE TABLE
19619 REPEAT <36.-<.LZ <LOVHTB-1>>>,[ ;LOG SEARCH
19620 CAMG A,OVHTB1(B) ;NOT CAMGE BECAUSE OF PADDING AT END
19621 SUBI B,1_<35.-.RPCNT-<.LZ <LOVHTB-1>>>
19622 ADDI B,1_<34.-.RPCNT-<.LZ <LOVHTB-1>>>
19624 LOC .-1 ;OPTIMIZE OUT ADDI B,0
19626 OVHCL8: AOS OVHTB2+LOVHTB-1
19628 OVHCL9: WRPCST [-LOVHPC,,OVHPCS] ;TURN ON / RESTART PC SAMPLING
19632 ;HERE IS A TABLE OF REGISTERED 3-LETTER OVERHEAD REGION CODES
19634 ;ALC - ALLOCATE CORE PAGE FRAME
19635 ;CHx - CHAOSNET STUFF (VARIOUS VALUES OF x)
19636 ;FLT - MISCELLANEOUS FAULTS
19637 ;IMP - ARPANET INTERRUPT (NOT STYNET)
19638 ;LOW - LOW CORE, BEFORE FIRST OVHMTR MACRO & PCS IN UPPER HALF OF EXEC SPACE
19639 ;NET - ALL NETWORKS, ALL PI LEVELS, NOT OTHERWISE ACCOUNTED FOR
19642 ;QIN - DISK INTERRUPT LOW LEVEL
19643 ;QSC - DISK INTERRUPT HIGH LEVEL, DISK SCHEDULER
19644 ;SC1 - SCHEDULER 1 - ENTRY
19645 ;SC2 - SCHEDULER 2 - SEARCH
19646 ;SC3 - SCHEDULER 3 - EXIT
19647 ;SC4 - SCHEDULER 4 - UNSWAPBLOCK
19649 ;SWF - SWAP FIND NEW USER (SWAPOUT SCHEDULER)
19651 ;SWS - SWAP SCHEDULER
19653 ;TTI - TTY INPUT INTERRUPT LEVEL
19654 ;TTO - TTY OUTPUT INTERRUPT LEVEL
19655 ;TTY - MISC TTY CODE
19657 ;UUO - UUO LEVEL, MISCELLANEOUS ROUTINES, AND TOTAL MISCELLANY
19658 ;WS - WORKING SET & SWAP-BLOCK ENTRY CODE
19660 SUBTTL PC LSR TEST FEATURE
19662 ;CALLED BY PCLT MACRO
19673 PCLX: CAIA ;PATCH IN OTHER CHECKS (SHOULD JRST POPUJ TO IGNORE)
19674 MOVE U,USER ;PATCH ROUTINE MAY CLOBBER U
19676 JRST PCLT1 ;FOUND PLACE, CAUSE PCLSR
19679 JRST POPUJ ;NOT MARK (NOT AT RIGHT LOCN)
19680 HRRO U,USER ;4.9 U FLAG
19681 PCLT1: PUSH P,A ;COMPUTE HASH ADR OF RETURNS ON PDL
19685 JUMPL A,PCLT1A ;SYS JOB'S PDL?
19688 MOVEI A,USRPDL(A) ;GET START OF USERS PDL IN A
19700 PCLT2: CAIGE A,-2-3(P)
19702 MOVE A,PCLHT ;COMPUTED HASH
19703 JUMPGE U,PCLT4 ;GOING TO PCLSR HERE, STORE HASH AS MARK FOR NEXT TIME
19707 JRST PCLT6 ;IN HOLD MODE, PCLSR HERE
19708 SETOM PCLNXT ;FOUND MARK, PCLSR NEXT TIME
19714 PCLT4: MOVEM A,PCLHSH ;STORE HASH FOR NEXT TIME
19717 PCLT6: CONO PI,CLKOFF
19720 CAIN B,1 ;DON'T ^Z.
19729 PCLME: PUSHJ P,UFLS
19732 PCLME1: PUSHJ P,PCLSR
19738 JRST 4,. ;TEMP MODIFY END CHECK IF WANT TO WIN FOR SYS JOB
19740 SUBTTL ILLUO NON-RELEVANT SYSTEM CALLS
19782 ANETIM==OPNL1 ;NO SUCH DEVICE ERROR FOR SYMBOLIC SYSTEM CALLS.
19787 ANETAC==CPOPJ ;MAKE OLD UUOS FAIL
19800 ;Here generate the table for the BUG macro. Note that entries for
19801 ;bugs in the initialization code will appear here also! That's
19802 ;why we have the kludgey add 10
19803 BUGTAB: BLOCK LBUGTB+10
19805 0 ;Marks end of table
19808 HSYSCD:: ;HIGHEST SYSTEM CODE
19810 SUBTTL RANDOM STORAGE
19813 SCHHP: SCHHB ;PNTR TO SCHED HIST BUFFER
19814 SCHHB: BLOCK SSCHDB ;SCHED HIST BUFFER
19816 ;4.8 =1 QUANT TERMINATED BY PG FAULT
19817 ;4.7-3.8 LENGTH OF RUN TIME IN 512 USEC UNITS
19818 ; MUST ACCOMODATE 150 MILLISECOND QUANTA
19819 ;3.7-3.1 USER ("NUMERIC INDEX)
19820 ;RH PC QUANT STARTED AT
19823 SWPHTB: BLOCK SWPHTL ;SWAPPING HISTORY TABLE
19824 ;4.9-4.8 EVENT: 0=START LOADING, 1=FINISH LOADING,
19825 ; 2=SWAP OUT, 3=SWAP BLOCK
19826 ;4.7-3.9 WORKING SET SIZE MINUS ONE (0=0)
19827 ;3.8-3.1 USER NUMBER
19829 BLOCK SWPHTL ;CORRESPONDING UTRNTM
19833 PGIHTB: BLOCK PGIHTL ;PAGE-IN HISTORY TABLE
19834 ;4.9 1 IF JOB WAS LOADING
19835 ;4.7-3.9 USER VIRTUAL PAGE NUMBER
19836 ;3.8-3.1 USER NUMBER
19838 BLOCK PGIHTL ;CORRESPONDING UTRNTM
19841 SCHMNY: 0 ;0 DO FULL SCHEDULE, -1 NEXT "SCHEDULE" SHOULD LOOK IN SCHBTB
19842 SCHBNJ: 0 ;NUMBER OF VALID ENTRIES IN SCHBTB
19843 SCHBTB: BLOCK SCHBLN ;RUNNABLE JOB BUFFER
19844 SCHBPR: BLOCK SCHBLN ;PRIORITIES OF THOSE
19845 NSCHOV: 0 ;COUNT OF BUFFER OVERFLOWS
19847 ;TRANSLATION ENTRY _ T
19848 ;TRANLK(T) IS MODE,,NEXT ENTRY
19849 ;MODE IS 0 IF ENTRY ON FREE LIST, ELSE NOT 0, AND
19850 ;BITS 3.1 => INPUT, 3.2 => OUTPUT, 4.9 => ATOMIC TRANSLATION (DON'T RETRANSLATE)
19851 ;NEXT-ENTRY IS -1 FOR NIL, ELSE IDX REL TRAN!X
19852 ;TRANID(T) THRU TRANIS(T) - FROM-NAMES
19853 ;TRANOD(T) THRU TRANOS(T) - TO-NAMES
19855 TRANLK: REPEAT SIOMT,,,.RPCNT-1 ;GENERATE 1ST WDS, LINKED TOGETHER.
19856 TRANID: BLOCK SIOMT
19857 TRANI1: BLOCK SIOMT
19858 TRANI2: BLOCK SIOMT
19859 TRANIS: BLOCK SIOMT
19860 TRANOD: BLOCK SIOMT
19861 TRANO1: BLOCK SIOMT
19862 TRANO2: BLOCK SIOMT
19863 TRANOS: BLOCK SIOMT
19865 TRANFL: SIOMT-1 ;TRANSL ENTRY FREE LIST.
19866 TRNCNT: 0 ;NUM ENTRIES IN USE.
19867 TRNREF: 0 ;NUM. READ-ONLY ACCESSES TO TRANSL LISTS.
19868 TRANSW: -1 ;SWITCH FOR WRITE REF.
19871 IFE SCHBLN, U0P: 0 ;PRIORITY OF BEST USER SO FAR
19873 USER: -1 ;USER # OF CURRENT LOSER
19875 LITM: 0 ;LAST TIME SYS INCREASED CORE
19877 SLGIV: BLOCK 3 ;LOGIN
19879 SETSLC: 0 ;SETLOC VARIABLES
19883 SWUNAM: 0 ;SYS WRITE VARIABLES
19890 DMON: SIXBIT /DRAGON/
19891 -1 ;USER INDEX OF DEMON JOB
19893 NQMFWR: 0 ;COUNT OF FILES WRITTEN ON .MAIL. - FOR MAILER DEMON TO HANG ON.
19895 NXGPFW: 0 ;COUNT OF FILES WRITTEN ON .XGPR. - FOR XGPSPL
19899 ;VARIABLES FOR DEAMON CODE HACK
19902 IFN TTLPTP,TPLFLG: 1 ;FLAG FOR TPL
19904 DMTLL==4 ;LEGNTH OF DEAMON TABLE SLOT
19905 NODEAM==20. ;NUMBER OF SLOTS
19906 DMLNG==NODEAM*DMTLL
19909 0 ;MAIN PROG SWITCH FOR DEMON
19910 REQCNT: 1 ;COUNT OF REQUEST'S FOR SYS JOB
19911 DMTPTR: 0 ;POINTER FOR DEMSIG TO DEM TBL, AN INDEX INTO IT, TAKEN MODULO DMLNG
19912 DMLSEX: -DMLNG,,0 ;POINTER TO DEAMON TABLE AOBJN
19913 DEMCNT: <NODEAM.-1> ;AMOUNT OF SLOTS REMAINING IN THE TABLE
19916 0 ;SLOT FOR NON DEAMON LOAD VIA NUJBST
19918 DMOBLK: SIXBIT / SYS/
19920 0 ;BLOCK USED BY SYSTEM JOB TO CHECK OPEN
19922 ;DEAMON TABLE--CONSISTS OF SLOTS OF FOUR WORDS FOR EACH DEMON
19923 ;WORD 1 CONTAINS ITS SIXIT NAME
19924 ;WORD 2 CONTAINS THE USER INDEX,-1 IF LOADING, 0 IF DOWN
19925 ;WORD 3 2 QUANTITIES IN 18 BIT 2'S COMPLEMENT--
19926 ;LH ALWAYS > = 0, IF 0 ONLY TAKES EXPLICIT REQUESTS IN > 0 A REQUEST
19927 ;RH CONTAINS THE NUMBER OF REQUESTS PENDING FOR THE DEAMON
19928 ;FOR THE DEAMON WILL BE GENERATED EVERY 2 MINUTES
19929 ;WORD 4 CONTAINS THE TIME TILL THE NEXT IMPLICIT REQUEST WILL BE GENERATED.
19932 DMTTBL: SIXBIT /DEMSTR/
19937 BLOCK <NODEAM-1>*DMTLL
19939 TIMOFF: -1 ;TIME SINCE MIDNIGHT IN HALF SECONDS ("TIME IN DSK FORMAT").
19940 QDATE: -1 ;DISK FORMAT DATE: -1 => SYSTEM DOESN'T KNOW DATE, ELSE
19941 ;BITS 3.1-3.5 HAVE DAY OF MONTH, 3.6-3.9 HAVE MONTH OF YEAR,
19942 ;4.1-4.7 HAVE YEAR MOD 100. .
19943 QDATEI: -1 ;-1 => SYSTEM DOESN'T KNOW DATE, ELSE
19944 ;DATE AND TIME THE DATE AND TIME WERE FIRST DETERMINED, IN DSK FORMAT.
19945 PDYTIM: -1 ;TIME SINCE BEGINNING OF YEAR IN HALF-SECONDS (BACKUP TO PDCLK)
19946 FYEAR: 0 ;YEAR (E.G. 1969.)
19947 PDTIME: 0 ;NON-ZERO => OFFSET FOR PDCLK
19948 ;WHEN SUBTRACTED FROM PDCLK DATAI GIVES # PD-UNITS SINCE
19949 ; BEGINNING OF YEAR
19950 ;ONE SECOND = 60. PD-UNITS
19951 ; Also contains similar offset for KS-10 clock in 60ths.
19952 LPDTIM: -1 ;LAST PD CLK TIME, -1 IF PD CLK NOT RUNNING OR JUST PDSET'ED
19954 SUPCOR: 0 ;CONTROLS SYS JOB, SEE SYSDTB, SCOR, ETC
19955 ;EACH BIT REQUESTS ONE FUNCTION IF SET.
19956 SUPCOP: SCLDAT+IFN DEMON,[SCLDMN],,SCRCKS
19957 ;THIS WORD OR'D INTO SUPCOR EVERY SECOND.
19958 SCKPHS: 0 ;USED FOR COUNTING EVERY SECOND 1/2 SECOND CLOCK
19959 ;TO SET SUPCOP BITS EVERY SECOND
19960 SYSITM: 0 ;TIME SYS JOB LAST STARTED WAITING ON SUPCOR
19961 LNETIM: 0 ;TIME AT WHICH NETWORK WAS LAST BROUGHT UP
19962 RSWTIM: 1 ;Time (in DSK format) when last checked system resources.
19964 MXPARS==10. ;MAX # PAR ERRS TO PRINT OUT
19965 PARPG: BLOCK 8 ;STORAGE OF PAGE MAP WHILE HACKING PARITY ERROR CHECK
19966 PARCNT: 0 ;# OF PAR ERROR ENTRIES IN TABLE
19967 PARCON: BLOCK MXPARS ;CONTENTS OF BAD PARITY LOCATIONS
19968 PARADR: BLOCK MXPARS ;ADDRESSES OF BAD PARITY LOCATIONS
19969 PARAND: -1 ;QND OF ALL BAD WORDS
19970 PARIOR: 0 ;IOR OF ALL BAD WORDS
19971 PARAAN: -1 ;AND F ALL BAD ADDRS
19972 PARAOR: 0 ;IOR OF ALL BAD ADDRS
19974 PARPFW: 0 ;PAGE FAIL WORD
19975 PARERA: 0 ;ADDRESS OF PAR ERR
19976 PARWRD: 0 ;BAD DATA
19979 PARRSN: 0 ;0 => PAR ERR PAGE FAULT IN PROG
19980 ;-1 => PAR ERR INTERRUPT; NEEDN'T STOP
19983 PARDIE: 0 ;-1 => FATAL PARITY ERROR
19984 TPLSWP: 0 ;-1 => USE OLP FOR TPL
19986 PDP6UP: 0 ;0 => PDP6 IS DOWN. (AS USUAL)
19990 ECCADR: 1,,777760 ;ECC HISTORY STARTS HERE
19991 ECCLEN==16. ;16 LOCATIONS OF ECC HISTORY
19992 ECCIDX: 0 ;LAST LOCATION ACCESSED
19995 TEN11F: 0 ;0 -> NORMAL
19996 ;-1 -> COMPLETELY IGNORE 10-11 INTERFACE
19997 ; 1 -> RESET 10-11 INTERFACE, OTHERWISE IGNORE
19998 T11ERC: 0 ;COUNT OF CONTROL PAGE RAM ERRORS
19999 T11CCN: 0 ;CORRECT CONTENTS
20000 T11WCN: 0 ;WRONG CONTENTS
20001 T11PG: 0 ;PAGE # INVOLVED
20004 TVBLAD: 17742 ;VIDEO BUFFER TO FLASH WHEN JOB RUNNING (PDP10 VIDEO BUFFER ADDR)
20007 DL10F: -1 ;-1 NORMAL, 0 => 11 DOWN
20008 DL10HC: 0 .SEE TTDLBRK ;NUMBER OF LOOPS WHEN HUNG UP WAITING FOR 11 TO GOBBLE BUFFER
20011 DLSRCH: 0 ;-1 => DON'T RUN ANY USER BUT THE ONE ALREADY RUNNING
20012 ;(UNLESS WE TAKE A PAGE FAULT).
20013 CPDLP: -CPDLL,,LCPDL-1 ;CLOCK PDL POINTER
20014 LCPDL: BLOCK CPDLL ;CLOCK INT LEVEL PDL
20016 CLKBSW: 0 ;READ SWITCHES INTO HERE TO DECIDE WHETHER TO GO TO DDT.
20018 CLROOT: SSLCKB ;CLOCK QUEUE ROOT
20020 SSLCKB: SCLKI ;SLOW CLOCK RQ BLOCK
20021 .+2 .SEE CHA5CK ;OR 15SCLB
20025 CHA5CK: 5*60.-SCLKI ;5-SECOND CLOCK FOR CHAOS NET
20026 15SCLB ;NOTE INITIAL TRIGGERING OF CLOCKS BELOW DELAYED AN EXTRA 5 SECONDS
20030 15SCLB: 15.*60.-SCLKI
20031 .+2 .SEE PRVCLB ;OR VSLCKB
20035 PRVCLB: NPVSEC*60.-15.*60.-SCLKI ;PRIVILEDGED USER VARIABLE CHECK
20040 VSLCKB: 0 ;VERY SLOW CLOCK BLOCK
20041 CLINFB ;CAUSE SLOW CLOCK TICK SOON AFTER SYS COMES UP
20044 CLINFB: 377777,,-1 ;ABOUT 15 YEARS
20049 CCLKB: 0 ;FOR CHESS CLOCK HACK
20056 IINTIC==60. ;# TWO-MINUTE TICKS PER VERY VERY SLOW CLOCK TICK (2 HOURS)
20057 IINCNT: 0 ;# TWO-MINUTE TICKS REMAINING UNTIL NEXT VERY VERY SLOW CLOCK TICK
20061 WHOCLB: 0 ;WHO LINE TIMER
20066 UTTYS: BLOCK MXCZS ;RING BUFFER FOR JOBS TO BE STARTED
20071 PCLDBM: 0 ;.NE. 0 ACTIVATE PC LSR DEBUG MODE
20072 ;1 => ADVANCE PLACE WHERE PCLSR
20073 ;2 => ADVANCE BUT DON'T ^Z.
20075 PCLUSR: -1 ;USER PCLSR MODE ACTIVE FOR
20076 PCLL: 0 ;PLACE WHERE LAST PCLSR TESTED
20077 PCLHSH: 0 ;HASH OF RETURNS ON PDL AT LAST PLACE TRAPPED OUT OF
20078 PCLNXT: -1 ;-1 => FROB NEXT TIME IN ADVANCE MODE
20080 PCLIDX: 0 ;INITIALIZE PCLT TO THIS (SET TO LOOP COUNT IF NECESSARY)
20082 CORRNR: 0 ;LAST USER TO RUN CORE
20083 SJSPG: 0 ;-1 => LAST FREE PG RESERVED FOR SYS JOB; DON'T GIVE IT TO ANYONE ELSE.
20084 UTBFLF: 0 ;-1 SIGNAL TO TRY TO FLUSH I/O BLOCKS
20085 UFDFLF: 0 ;-1 SIGNAL TO TRY TO FLUSH 2311 UFDS
20087 UFLSF: 0 ;FLAG FROM UFLS TO CLKBRK
20088 CLKFL1: 0 ;FLAG COUNTER TO CONTROL CLOCK LEVEL
20089 SCHFLG: 0 ;SCHEDULE TIMER (DIVIDES 60 CPS)
20090 27FCLK: 0 ;-1 IF FAST CLOCK SHOULD CALL TYP27S
20091 SCITM: 0 ;SEE SYSEX, SYSDEC
20093 SYSCKP: -LTSTB,,TSTB ;SYSTEM CHECKSUMS CHECKER POINTER
20094 SYSPDP: -LSYSP,,SYSPDL-1 ;PDL POINTER FOR SYSTEM JOB
20095 SYSPDL: BLOCK LSYSP ;PDL FOR SYS JOB
20096 IFN TPLP,TPLBUF: BLOCK TPLBSZ ;PSEUDO LPT BUFFER - MUST BE ABOVE SUACS
20097 IFN TPLP\DEMON,TPLFNO: SIXBIT /!/ ;UNIQUE TPL FIRST FILE NAME
20098 SJCFF: 0 ;-1 WHEN SYS JOB IN PROCESS OF FLUSHING CORE
20099 ;AVOIDS TIMING ERROR DUE TO HUSRAD NOT REALLY REFLECTING WHAT ITS GOING TO BE
20100 SLSWPR: 0 ;STORE SYS JOB'S LSWPR WHILE HACKING UUOS
20104 IFN TPLP, TPLFN: 2,,(SIXBIT /TPL/)
20106 KLEBCC: 0 ? <1_23.>/<4*25./2> ;EBOX COUNTER CONVERSION TO 4 USEC CONSTANT (FOR 25 MHZ)
20107 ;RESULT IS IN AC+2 AFTER DMUL AC,KLEBCC
20108 KLMBCC:; 1 ? 110000,, ;FOR CONVERTING AN MBOX COUNT TO THE TIME (IN EBOX UNITS)
20109 ;IT SUPPOSEDLY AMOUNTS TO.
20110 ;WE ASSUME 102.5 NANOSEC OD WAITING TIME PER MBOX CYCLE
20111 ;THIS NUMBER IS 102.5/80.
20112 ;DMUL AC,KLMBCC PUTS ANSWER IN AC+1, AC+2
20113 ;WITH BINARY POINT BETWEEN THE WORDS.
20114 0 ? 0 ;M8538 MODIFIED SO EBOX COUNTER CONTINUES TO COUNT
20115 ;DURING MBOX WAIT TIME, SO SET KLMBCC = ZERO.
20118 MTRUSR: -1 ;USER TO WHOM PERF CTR IS ASSIGNED
20119 MTRJOB: -2 ;USER BEING MEASURED BY PERF CTR,
20120 ;OR -1 => NULL JOB, OR -2 => ALL JOBS.
20122 PAEON: 0 ;SELECTED PERF CTR ENABLE WORD
20123 PAEOFF: 0 ;DISABLE THE PERF CTR (WHEN WRONG JOB IS RUNNING)
20124 STPERF: 0 ? 0 ;VALUE OF PERF COUNTER AT START OF QUANTUM
20125 STEBOX: 0 ? 0 ;VALUE OF EBOX COUNTER AT START OF QUANTUM
20126 STMBOX: 0 ? 0 ;VALUE OF MBOX COUNTER AT START OF QUANTUM
20134 IFN NLPTP, NTNLPL: 0 ;NUMBER OF TIMES NLPT LOST PIA
20138 TSTB: REPEAT CKNUM,CONC CK,\.RPCNT,
20141 CKSUMS: BLOCK CKNUM
20142 CKXORS: BLOCK 36. ;XOR OF ALL ADRS IN PURE AREAS IN SYS WITH CORRESP
20144 TCKXOR: BLOCK 36. ;TEST XORS
20147 SYSCLB==SSYSCL_-10.+IFN 1777&SSYSCL,1
20150 AC1PTR: UUOACS ;-> WHERE AC BLOCK 1 IS CURRENTLY LOADED FROM
20153 USRHI: 0 ;HIGHEST LOC USED FOR USER STORAGE
20155 SUBTTL LOCATIONS TO PATCH WHEN DEBUGGING
20157 SYSDBG: 0 ;0 NORMAL TIMESHARING
20158 ;+ GIVE "ITS BEING DEBUGGED" MESSAGE
20159 ;-N ALSO ALLOW ONLY CONSOLE #N AND T00 TO CTRL/Z.
20160 ;-512.*N => ALLOW ONLY HOST N TO TELNET IN.
20161 ;-512.*N+M => ALLOW HOST N AND TTY M.
20162 DMLLDF: -1 ;-1 => START DAEMONS AUTOMATICALLY, 0 DON'T.
20163 IFN DEMON,DMNFLG: 1 ;1 => START DM-STYLE DAEMONS, 0 DON'T.
20165 IFN NETP,NETUSW: 0 ;-1 => DON'T START UP A JOB IN ANSWER TO A CONNECT REQUEST
20166 ;FROM A HOST OTHER THAN OURSELVES
20168 SYSCN: SYSCON ;NUMBER OF TTY TO RECEIVE SYSTEM CONSOLE OUTPUT.
20169 ;-1 TO THROW IT AWAY. YOU CAN CHANGE THIS ANY TIME.
20171 SUPPLG: 0 ;-1 => SUPPRESS LOGIN/LOGOUT MESSAGES ON SYSTEM CONSOLE.
20173 IFE KS10P,[ ; KS has no lights.
20174 MIPGDS: 0 ;-1 => DON'T LIGHT LIGHTS (KA HAS HARDWARE SWITCH, KL NEEDS
20179 USFHLT: 0 ;-1 => HALT ON DISK UNSAFES AND OTHER BAD ERRORS
20180 ;0 => RETRY. NOTE SET POSITIVE FOR 1/2 SECOND AFTER
20181 ; A RETRY TO AVOID LOOPING, DETECT SOLID ERRORS.
20184 .SEE USEHM ;NONZERO => USE HIGH MOBY, ELSE ONLY 256K
20186 .SEE USEMDM ;NONZERO => USE MEDIUM MEMORY AS ADDITIONAL "LOW HALF" PAGES
20189 TT11P: 1 ;0 => PDP11-TTYS ARE NOT IN USE
20190 ;1 => SYSTEM SHOULD INITIALIZE THEM
20191 ;-1 => INITIALIZED AND IN USE
20192 ;TO BRING THE TV'S DOWN, ZEROING TT11P ISN'T ENOUGH
20193 ;EITHER DO WHAT TT11LS DOES, OR JUST SET SCR11D IN SUPCOR
20194 ;(THE LATTER MAY NOT TAKE EFFECT INSTANTLY, HOWEVER)
20195 ;TO BRING THE TV'S UP, JUST SET TT11P TO 1 AND WAIT 2 SECONDS
20198 .SEE IMPUP ;0 UP, -1 DOWN, 1 DOWN AND DON'T TRY TO BRING BACK UP
20200 .SEE TEN11F ;0 UP, -1 TOTALLY DOWN, 1 RESET PLEASE
20202 .SEE DL10F ;0 PDP11 DOWN, -1 UP
20204 .SEE PDP6UP ;0 PDP6 DOWN, -1 UP
20206 .SEE LASTGC ;NAME OF LAST DISK DIRECTORY GARBAGE COLLECTED
20209 SUBTTL SWAPPING ALGORITHM CONTROL SWITCHES
20211 IFE SWPWSP,[ ;THESE AREN'T LOOKED AT IN SWPWSP SYSTEM
20212 ENSWSC: SWBLK ;ENABLE CALLING OF SWSCD FROM 15 SEC CLOCK
20213 ENUPC: 1-SWBLK ;ENABLE USER-PC PAGE OF RUNNING USER NOT BE SWAPPED OUT
20214 ENPZRO: SWBLK ;ENABLE PAGE-ZERO OF RUNNING USER NOT BE SWAPPED OUT
20215 ENSWBK: SWBLK ;ENABLE SWPNX1 TO SWAP BLOCK A USER
20216 ENPVCL: 1-SWBLK ;ENABLE PRVCLK ROUTINE
20217 ENPREE: 1-SWBLK ;ENABLE PREEMPTION ON PAGE SWAP IN (SEE QSWI1)
20218 ENAGE: 1-SWBLK ;ENABLE AGE BITS TO ABORT SWAP OUT IF PAGE IS USED
20220 AGERTE: 8 ;NUMBER OF PAGES TO AGE EACH 1/2 SECOND.
20221 ;IN A 512K SYSTEM, LAP TIME IS ABOUT 200/AGERTE SECONDS.
20223 SUBTTL SYSTEM LOCKS
20225 CIRPSW: -1 ;CIRCULAR POINTER SWITCH
20228 MEMFRZ: -1 ;MEMORY FROZE
20231 CASW: -1 ;CORE ALLOCATE INTERLOCK SWITCH (REQUESTS TO CORE JOB)
20234 SHUTLK: -1 ;LOCK VAR FOR SHUTDN
20235 0 ;USED TO TELL WHO CAUSED SYS DOWN
20237 TREESW: -1 ;LOCK MANIPULATION OF JOB TREE STRUCTURE
20238 0 ;ATTACH, DETACH, DISOWN, REOWN ALL LOCK.
20240 CUSER: -1 ;CORE ALLOCATOR USER
20241 0 ;DUMMY CORE ALOC USE VAR
20243 ARDFSW: -1 ;LOCK VAR FOR .REDEF
20247 DISUSR: -1 ;340 USER
20248 0 ;DUMMY 340 USE VAR
20252 CODUSR: -1 ;CODE SENDER
20257 PLTUSR: -1 ;PLOTTER USER
20262 LPTUSR: -1 ;LINE PRINTER USER
20302 PDPUSR: -1 ;PDP-6 USER
20304 PDPISR: -1 ;PDP6 AS INFERIOR (INTS ON IO CHANNEL)
20305 PDPISE: -1 ;PDP6 USE VAR
20309 TABUSR: -1 ;TABLET USER
20318 TIME: 0 ;TIME SINCE SYSTEM START IN 1/30'THS
20319 SUSRS: 0 ;NUMBER USERS ON SYS
20320 RVVTIM: 0 ;VALUE OF TIME WHEN SYSTEM WAS LAST REVIVED FROM A CRASH
20321 USRRCE: BLOCK NCT+1 ;USER RESOURCE +1 FOR DISOWNED JOBS
20322 SYSRCE: 0 ;SYS JOB RESOURCE
20323 SLOADU: 0 ;100. * <EFFECTIVE # OF COMPETING USERS>, IN FIXED POINT.
20324 RNABLU: 0 ;RUNNABLE USERS
20325 NPGWTU: 0 ;NUMBER OF JOBS CURRENTLY WAITING FOR A PAGE
20326 LOUTIM: 0 ;TOTAL TIME USED BY LOGGED OUT USERS
20327 UMASTER: -1 ;INDEX OF MASTER USER
20328 SWRCE: BLOCK NCT+2 ;SWAP SCHED RESOURCE
20329 SWIPRQ: 0 ;TOTAL # SWAP IN REQUESTS
20330 SHUTDN: 0 ;"TIME" SYS WILL DIE, 0 IF NOT DYING, -1 IF DEAD
20331 DEDTIM: 0 ;TIME TILL DEATH AFTER NEXT CLK QUEUE INT
20332 ; < 0 => SYSTEM ACTUALLY DOWN (CHECKED BY ^Z, NUJBST, %OPLIV JOBS)
20333 DTHTIM: 0 ;TIME SYSTEM DIED
20338 ATRNJN: 0 ;JNAME OF LAST JOB TO DO A .TRANAD OR .TRANDL
20339 ;(SO I CAN SEE IF THEY'RE USED AT ALL).
20342 DZXSPR: 0 ;Count of spurious DZ-11 transmitter interrupts.
20343 DZRSPR: 0 ;Count of spurious DZ-11 receiver interrupts.
20346 NCORRQ: 0 ;NUMBER CORE RQS HERE SO TRANSFERRED TO PEEK
20347 NCBCOM: 0 ;NUMBER CORE BLOCKS COMMITTED TO CORGP
20349 NQDE: BLOCK NQS ;NUMBER OF 2314 DATA ERRORS
20350 NQHE: BLOCK NQS ;NUMBER OF 2314 HARDWARE ERRORS
20351 BLOCK 1 ;NQSE-1 COUNTS SPUR INTS WHILE NO XFER (QSDU -1)
20352 NQSE: BLOCK NQS ;NUMBER OF SPURIOUS 2314 ERROR INTERRUPTS
20353 NQCMPE: BLOCK NQS ;NUMBER OF 2314 READ/COMPARE ERRORS
20354 NQWDE: BLOCK NQS ;# DATA ERRS ON WRITE
20355 NQRDE: BLOCK NQS ;# DATA ERRS ON READS
20356 NIRSWE: 0 ;# IRRCV ERRS ON SWAPPING XFERS
20357 QIRRCV: 0 ;IRRECOVERABLE DISK ERRORS
20358 QIRCBK: 0 ;BLOCK # W/ IRRCV ERROR
20359 QIRUNT: 0 ;UNIT OF ABOVE
20360 NQWRE: 0 ;# WRITE ERRS RCC OK
20361 NQWIRE: 0 ;# WRITE ERRS RCC LOST
20362 NWXFR: 0 ;NUMBER WRITE TRANSFERS (FILE, DIR, ETC.)
20363 NRXFR: 0 ;NUMBER READ
20364 NSWXFR: 0 ;NUMBER WRITE SWAPS
20365 NSRXFR: 0 ;NUMBER READ SWAPS
20367 ;DON'T CHANGE ORDER .SEE MEMTYP
20368 PARERR: 0 ;COUNT OF CORE PARITY ERRORS
20369 NXMERR: 0 ;COUNT OF NXMS
20370 IFE KA10P, BPFERR: 0 ;COUNT OF BAD PAGE FAILS
20371 PARPC: 0 ;PC ON CORE PARITY INTERRUPT
20372 NXMPC: 0 ;PC ON NXM
20373 IFE KA10P, BPFPC: 0 ;PC ON BAD PAGE FAIL
20374 PARUSR: -1 ;USER ON PAR ERR
20375 NXMUSR: -1 ;USER ON NXM
20376 IFE KA10P, BPFUSR: -1 ;USER ON BAD PAGE FAIL
20377 IFE KA10P, BPFPFW: 0 ;PFW ON BAD PAGE FAIL
20380 ECCERR: 0 ;COUNT OF ECC CORRECTED ERRORS LOGGED
20381 ECCERA: 0 ;MEMORY STATUS AND ADDRESS OF MOST RECENT
20382 ECCAND: -1 ;AND OF ALL ERRORS
20383 ECCIOR: 0 ;IOR OF ALL ERRORS
20386 IFN DPKPP, NDPKPE: 0 ;# PARITY ERRS FROM DATAPOINT KLUDGE
20388 SNMPGS: 0 ;SYSTEM, NUMBER OF VIRTUAL USER PAGES
20389 SNSWPG: 0 ;SYS, NUM OF SWAPPED OUT VIR. PGS
20391 USRTM1: 0 ;4USEC TICKS USED BY USERS SINCE LAST (1/2 SEC) UPDATE TO USRTIM
20392 USRTIM: 0 ;TIME USED BY ALL USERS 1 SEC UNITS
20393 NULTM1: 0 ;4USEC TICKS USED BY NULJOB SINCE LAST (1/2 SEC) UPDATE TO NULTM3
20394 NULTM3: 0 ;NUMBER OF SECONDS USED BY NULJOB
20395 NULTIM: 0 ;TIME USED BY NULL JOB (60'THS) - OBSOLETE BUT STILL MAINTAINED
20397 NULEBC: 0 ? 0 ;EBOX COUNT WHEN NULL JOB ENTERED
20398 NULMBC: 0 ? 0 ;MBOX COUNT WHEN NULL JOB ENTERED
20399 NULPRF: 0 ? 0 ;PERF COUNT WHEN NULL JOB ENTERED
20402 PFAILF: 0 ; KL: -1 => ENTRY TO CLOCK LEVEL WAS VIA PFAIL
20404 ; KS: -1 => BOTH CASES
20406 LOSTM1: 0 ;4USEC TICKS LOST SINCE LAST (1/2 SEC) UPDATE TO LOSTIM
20407 LOSTIM: 0 ;SECONDS OF LOST TIME (ALL OTHERWISE RUNNABLE JOBS WAITING FOR PAGES)
20408 IDLTM1: 0 ;4 USEC TICKS IDLE SINCE LAST (1/2 SEC) UPDATE TO IDLTIM
20409 IDLTIM: 0 ;SECONDS OF IDLE TIME (NO JOBS WANT TO RUN)
20410 LOSRCE: 0 ;USRRCE WORD FOR LOST TIME
20411 IDLRCE: 0 ;USRRCE WORD FOR IDLE TIME
20413 UREALT: -1 ;RH=INDEX OF THE REAL TIME USER
20414 ;LH=0=> THIS USER HAS HIGHEST PRIORITY
20415 ;LH>0=> USER NOT IN HIGH PRIORITY PHASE
20416 ;LH<0=> FACILITY IDLE
20417 INFORM [HIGHEST USED]\<.-1>
20418 \fSUBTTL USER VARIABLES
20420 ;ONE COPY FOR EACH PROCEDURE
20421 ;FOR KL AND KS, THIS IS THE UPT
20424 DEFINE KLUPT N,NAME/ ;CHECKS "HARD-WIRED" UPT LOCATIONS
20426 .ERR "NAME" LOST IN UPT
20433 DEFINE KLUPT N,NAME/
20437 IFN KL10P, LOC <.+777>&-1000 ;KL UPT MUST START AT HARDWARE PAGE BOUNDARY
20439 IFN KS10P, LOC <.+7>&-10 ; KS UPT must be 0 mod 8 (see UUOPCW)
20441 USRSTG:: KLUPT 0,;USER PAGE MAP
20443 UPGMP: BLOCK NUVPG/2 ;PAGE MAP STORAGE (PROGRAMS UP TO NUVPG LONG)
20444 ; 2.9-2.8 ACCESS RIGHTS
20445 ; 00 NO ACCESS (BY SOFTWARE CONVENTION, 1.2-1.1
20446 ; HAVE THE "REAL" ACCESS BITS, WHICH MAY BE 00,
20447 ; BUT MAY NOT, E.G. FOR A SWAPPED OUT PAGE).
20449 ; 10 READ/WRITE/FIRST
20451 .SEE PMCSHM ;CACHE BIT
20452 .SEE PMAGEM ;AGE BITS
20453 .SEE PMRCM ;LOW N BITS ARE PHYSICAL CORE PAGE NUMBER (IN 1K PAGES)
20454 UPGCP: BLOCK NUVPG/2 ;CIRCULAR POINTERS (CORRESPONDS 1-1 WITH UPGMP)
20455 ; IF -1, ABSOLUTE PAGE, NOT LINKED. OTHERWISE:
20457 ; 2.8-1.9 USER INDEX
20458 ; 1.8-1.1 PAGE NUMBER IN THAT USER'S UPGCP
20461 ; 2.7-1.1 LINK TO MMP TABLE
20463 ; 2.7-1.1 LINK TO MEM PNT TABLE
20464 UMAPS: 0 ;USER MAP STATUS
20466 UDBR1A==UPGMP ;ADDRESS TO PUT IN DBR1
20467 UDBR2A==UPGMP+<NUVPG/4> ;ADDR FOR DBR2
20468 UPGCPH==UPGCP+<NUVPG/4> ;ADDR OF HIGH HALF OF CIRC PNTRS
20470 TTYTBL: 0 ;TTY ASSIGNED THIS USER OR INDICATION THAT THERE IS NONE
20471 %TBNOT==400000 ;4.9 DOES NOT HAVE TTY NOW
20472 %TBNVR==200000 ;4.8 IF JOB DOESN'T HAVE TTY, OPENS SHOULD FAIL.
20473 %TBINT==100000 ;4.7 IF JOB DOESN'T HAVE TTY, ATTEMPT TO USE TTY SHOULD INTERRUPT.
20474 ;JOB CAN SET BITS 4.8 AND 4.7.
20475 %TBWAT==40000 ;4.6 IF 1, %TBINT AND %TBNVR ARE OVERRIDDEN AND TTY USE ATTEMPTS
20476 ; ALWAYS HANG. SET BY DDT FOR $P, CLEARED BY ^P. ONLY SUPERIOR CAN SET.
20477 %TBDTY==010000 ;4.4 TTY TAKEN FROM --ME--. WHEN GIVEN BACK,
20478 ;DON'T PASS IT ON TO MY INFERIOR.
20479 %TBOUT==004000 ;4.3 ALLOW THIS JOB TO OUTPUT WHETHER OWNS TTY OR NOT
20480 %TBINF==002000 ;4.2 ALLOW MY INFERIORS TO OUTPUT IF THEY HAVE %TBOUT.
20481 %TBOIG==001000 ;4.1 IGNORE MY OUTPUT
20482 %TBIIN==000400 ;3.9 INTERRUPT IF I TRY TO DO INPUT
20483 $TBECL==220600 ;3-6-3.1 # ECHO LINES IF I DONT HAVE DISPLAY
20484 ;RH USER NUM GAVE TTY AWAY TO OR TTY NUM IF HAS IT
20485 %TBCLR==410077 ;CLEAR THESE BITS IN TTYTBL OF A JOB RECEIVING THE TTY
20487 TTSTSV: BLOCK 3 ;JOB'S SAVED TTYST1,TTYST2,TTYSTS, WHEN JOB DOESN'T HAVE THE TTY.
20489 NMPGS: 0 ;NUMBER OF NON-ABSOLUTE PAGES (INCLUDES PURE)
20490 NSWPGS: 0 ;NUMBER SWAPPED OUT PAGES (AOSED FOR EACH USER OF SHARED PAGE SWAPPED OUT)
20491 HUSRAD: 0 ;MEM ADR OF PAGE ABOVE HIGHEST THAT EXISTS (MAX 1,,0)
20492 UPC: 0 ;USER PC STORAGE
20493 LUBTM: 0 ;TIME LAST UNBLOCKED (FOR IDENTIFYING INACTIVE JOBS)
20494 JBI: -1 ;JOB DEVICE INDEX. IF NOT -1, THIS JOB IS A JOB-DEVICE,
20495 ;AND JBI HAS INDEX INTO JOB DEVICE TABLES.
20497 UPGML: ;USER PAGE MAP LOAD (EIGHT WORDS FOR LPM AND SPM INSTRUCTIONS)
20498 IFE KS10P,[ ; KS10 version given below.
20499 UPJPC: 0 ;JPC. KA HAS FAULT ADDRESS IN LH.
20500 IFE KL10P, UPOPC: 0 ;OLD PC FLAGS,,OPC (UNUSED ON KL-10)
20501 UPMAR: 0,,0 ;MAR ADDRESS AND CONDITION
20503 ; 3.3 0=EXEC, 1=USER
20504 ; 3.2-3.1 MAR CONDITION:
20509 ; 2.9-1.1 VIRTUAL ADDRESS
20511 ; 3.9-3.7 ADDRESS BREAK CONDITIONS:
20515 ; 3.6 0=EXEC, 1=USER
20516 ; 3.5-1.1 VIRTUAL ADDRESS
20517 IFE KL10P, UPQUAN: EXPGNG+1,,0 ;F.S. QUAN AND FAULT BITS
20518 IFN KL10P, UPFW: 0 ;PAGE FAIL WORD
20519 IFE KL10P,DBL==100_1
20521 UPDBR1: DBL,,UPGMP ;DBR1
20522 UPDBR2: DBL,,UPGMP+100 ;DBR2
20523 IFE KL10P, UPDBR3: DBL,,EXEUMP ;DBR3
20524 IFE KL10P, UPACP: 1040,,UUOACS ;B KEY,C KEY,,AC POINTER
20528 UPDBR1: UPGMP ; DBR1
20529 UPDBR2: UPGMP+100 ; DBR2
20530 UPQUAN: 0 ; Runtime counter
20531 UPJPC: 0 ; User mode JPC if microcode supports
20532 UPEJPC: 0 ; Exec mode JPC if microcode supports
20535 UPGMLE:: ;END OF PAGE MAP (+1)
20538 KLUPT 420, ;RESERVED UPT 420
20540 KLUPT 421, ;TRAP 1 INSN ;ARITHMETIC OVERFLOW
20541 TR1INS: JSR ILLTRP ;FOR ITS-STYLE INTERRUPT, CONTAINS 0,,%PIARO
20542 KLUPT 422, ;TRAP 2 INSN ;PDL OVERFLOW
20543 TR2INS: JSR ILLTRP ;SYS JOB SHOULDN'T OVERFLOW ;FOR ITS-STYLE, 0,,%PIPDL
20544 KLUPT 423, ;TRAP 3 INSN ;USED FOR ONE-PROCEED
20545 TR3INS: JSR ILLTRP ;SYS JOB SHOULDN'T ONE-PROCEED ;FOR ITS-STYLE, 0,,%PI1PR
20546 KLUPT 424, ;MUUO DEPOSIT LOCATION
20548 MUUODP: 0 .SEE FORTY
20549 KLUPT 425, ;MUUO OLD PC STORAGE
20552 KLUPT 426, ;MUUO PAGING AND CONTEXT WORD
20554 KLUPT 427, ;RESERVED UPT 427
20556 KLUPT 430, ;MUUO NEW PC WORDS
20557 MUUOKN: %PSPCU,,UUOH0 ;FOR OTHER JOBS, MUUOEX (A JRST 4,).
20558 MUUOKT: %PSPCU,,MUUOEX ;NO JOB SHOULD EVER TRAP IN EXEC MODE.
20559 MUUOSN: %PSPCU,,MUUOEX ;NO JOB SHOULD EVER RUN IN SUPERV. STATE.
20560 MUUOST: %PSPCU,,MUUOEX ;..
20561 MUUOCN: %PSPCU,,UUOH0 ;NORMAL UUOS
20562 MUUOCT: %PSPCU,,MUUOTR ;UUOS AS TRAP INSN
20563 MUUOPN: %PSPCU,,UUOH0 ;PUBLIC MODE IDENTICAL TO CONCEALED MODE,
20564 MUUOPT: %PSPCU,,MUUOTR ; ALTHOUGH IT'S A SCREW FOR A LOSER TO BECOME PUBLIC
20565 ] ;END OF IFN KL10P
20568 DEFINE KSUPT UPTNAM
20569 IFN .-USRSTG-<UPTNAM>,[
20570 .ERR UPTNAM lost in UPT
20571 LOC USRSTG+<UPTNAM>
20575 UPFW: 0 ; Saved page fail word from last fault. Copied from EPTPFW
20576 ; at time of fault usually.
20602 MUUOKN: %PSPCU,,UUOH0 ;UUO in Exec mode new PC
20603 ;For other jobs: %PSPCU,,MUUOEX
20605 MUUOKT: %PSPCU,,MUUOEX ;UUO as trap instruction in Exec mode new PC
20607 KSUPT UPT1PO ;PC saved here after one-proceed
20610 KSUPT UPT1PN ;One-proceed sets PC to this
20611 1PRNPC: %PSPCU,,ONEPRO
20614 MUUOCN: %PSPCU,,UUOH0 ;Normal UUO new PC
20617 MUUOCT: %PSPCU,,MUUOTR ;UUO as trap instruction new PC
20624 AC0S: BLOCK 15 ;SWAP OUT AC S
20630 ;KLUPT 500, ;PAGE FAIL WORD STORAGE ;MICROCODE MOD PUTS
20631 ;KLUPT 501, ;PAGE FAIL OLD PC STORAGE ; THESE LOCATIONS IN
20632 ;KLUPT 502, ;PAGE FAIL NEW PC ; THE EPT FOR ITS
20633 ] ;END OF IFN KL10P
20635 UUO:: ;THE FOLLOWING LOCATIONS (UP TO SUEXND) ARE SWAPPED IN & OUT OF
20636 ;UEXIT ETC. WITH THE USER
20637 SUEXIT: JRST 2,@XUUOH ;USER UUO EXIT INS
20638 SCLUSV: MOVEM U,AC17S ;CLOCK U SAVE
20641 SUUOH: 0 ;C(@41) (ABSOLUTE)
20644 SV40: 0 ;C(40) WHEN USER OUT (SEE SWITCH)
20648 SCLCXS: DATAI PAG,CLCX ;CLOCK SAVE OF CONTEXT
20652 IFN <SUEXND-UUO>-<UEXND-UEXIT>, .ERR SUEXIT BLOCK LOST
20655 CLCX: 0 ;SAVED CONTEXT (DATAI PAG,) AT CLKBRK AND PFAIL
20659 KLUPT 504, ;EBOX COUNT
20660 EBOXCT: 0 ? 0 ;NUMBER OF EBOX TICKS (25 MHZ) OVER 2 LEFT 12. THAT EBOX
20662 KLUPT 506, ;CACHE COUNT
20663 MBOXCT: 0 ? 0 ;NUMBER OF MBOX CYCLES REQUESTED BY EBOX FOR THIS USER LEFT 12.
20668 UTIME: 0 ;RH=CLOCK INTERVAL IN 60'THS, LH=COUNT OF TICKS SINCE READ
20669 UTRNTM: 0 ;TOTAL RUN TIME IN 4 MICROSEC UNITS
20670 USIPRQ: 0 ;# SWAPIN REQUESTS
20672 USWST: 0 ;SWAPPING STATUS BITS.
20673 %SW==525252(1) ;IN THE LEFT HALF
20674 %SWDSO==400000 ;4.9 => DESIRED TO BE SWAPPED OUT (MUST BE SIGN BIT).
20675 %SWPGW==200000 ;4.8 => FLSINS IS WAITING FOR A PAGE
20676 %SWBEM==100000 ;4.7 => BEST EFFORT MADE TO SWAP OUT, DON'T LOOK AT JOB AGAIN
20677 %SWRUN==040000 ;4.6 => SWAPPED OUT WHILE RUNNABLE, SO CONSIDER MEM STATUS BEFORE REACTIVATION
20678 ; THIS BIT IS NEVER LOOKED AT.
20679 %SWPCL==020000 ;4.5 => PAGE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
20680 ; SO WHEN FLSINS SKIPS DON'T CLEAR IT BUT PCLSR INSTEAD.
20681 %SWINT==010000 ;4.4 => IF WAITING FOR PAGE, NEED IT TO INTERRUPT
20682 %SWPRV==004000 ;4.3 => "PRIVELEGED USER"
20685 %SWOUT==000400 ;3.9 => JOB IS SWAPPED OUT OR SWAP BLOCKED
20686 %SWSB== 000200 ;3.8 => JOB IS SWAP BLOCKED
20687 %SWLOD==000100 ;3.7 => JOB IS LOADING
20688 ;VALID STATES OF ABOVE 3 BITS: 0=SWAPPED IN, 1=LOADING, 4=SWAPPED OUT, 6=SWAP BLOCKED
20690 UWRKST: 0 ;WORKING SET. 2**18 TIMES SUM(ALL THIS JOB'S PAGES) 1 OVER # SHARERS
20691 ;INCREMENTALLY MAINTAINED WHILE JOB IS LOADING OR SWAPPED IN.
20692 ;NOTE # SHARERS IS IN RH(MMSWP)
20693 USVWRK: 0 ;SAVES UWRKST AS OF LAST TIME SWAPPED IN
20694 USWTIM: 0 ;TIME ENTERED LOADING, SWAPPED OUT, OR SWAP BLOCKED STATE.
20695 ;WHILE SWAPPED IN, HAS THE TIME AT WHICH IT CEASES TO BE PROTECTED
20696 ;AGAINST MEMORY PREEMPTION.
20698 USWPRI: 0 ;JOB SWAP PRIORITY. LOWER NUMBER MEANS MORE LIKELY TO STAY IN
20699 ; AND MORE LIKELY TO COME IN. SEE ALSO SWRCE, WHICH IS SIMILAR.
20700 IFE SWPWSP, ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE PRODUCT
20701 ;OF THE WORKING SET TIMES THE FRACTION OF CPU USED
20702 ;WHICH IS A MEASURE OF MEMORY USE WITH INTERACTIVE JOBS GIVEN AN ADVANTAGE.
20703 IFN SWPWSP, ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE "ADJUSTED
20704 ;MEMORY USAGE", WHICH IS THE (LOGARITHM OF THE WORKING SET SIZE)
20705 ;MULTIPLIED BY THE SUM OF CPU TIME AND I/O WAIT TIME. ALSO, WHEN
20706 ;A DISOWNED JOB IS SWAPPED OUT, USWPRI IS MULTIPLIED BY 4 TO PREVENT
20707 ;IT FROM COMING BACK IN FOR A WHILE UNLESS THERE IS REALLY NO
20708 ;COMPETITION FOR MEMORY. ALSO, WHEN A SWAPPED-OUT JOB WAKES UP FROM
20709 ;AN I/O WAIT, USWPRI IS DIVIDED BY 2 TO GIVE INTERACTIVE JOBS AN
20710 ;ADVANTAGE. THE SWPWSP SYSTEM DOES NOT CURRENTLY LOOK AT SWRCE.
20712 USWSCD: 0 ;SWAP SCHEDULING WORD 4.9=1 SWAPIN INHIBITED THIS JOB (SWAP BLOCKED)
20713 LTRNTM: 0 ;SAVED RUN TIME FOR PRIV USR
20714 LSIPRQ: 0 ;SAVED SWAP IN REQ FOR PRIV USER
20715 UPGSEC: 0 ;NUMBER OF PAGE FAULTS PER <NPVSEC> RUN TIME SECONDS
20716 LPRVTM: 0 ;LAST TIME PRIV USER
20718 PAGRAN: 0 ;.PAGRANGE. 1ST PG #,,LAST PG # INCLUSIVE RANGE OF PAGES TO BE PAGED AHEAD.
20719 PAGAHD: 0 ;.PAGAHEAD. 0, OR PAGE-AHEAD-DISTANCE,,PAGE-BEHIND-DISTANCE
20721 TRUNTM: 0 ;IF NOT TOP LEVEL, MINUS RUNTIME (4.069 US) ALREADY SENT TO SUPERIOR
20722 ;IF TOP LEVEL, RUNTIME USED BY SUBTREE MINUS TIME SENT TO DEMON ALREADY
20723 TSIPRQ: 0 ;DITTO FOR SWAPIN REQUESTS
20724 UTMPTR: SYSRCE ;POINTER TO RESOURCE WORD FOR THIS LOSER (JTMU FOR TREE)
20725 JTMU: 0 ;REDUCED BY 1/16 EVERY 1/2 SEC
20726 ;INCREMENTED BY TIME RUN IN 4 USEC
20727 ;MAX EQV VAL 1000000/8-1/16X=0
20729 ;AMONG JOBS WITH EQUAL RESOURSE
20730 ;LOWEST JTMU HAS HIGHEST PRIORITY
20732 IOCHNM: REPEAT NIOCHN,0 ;IO CHANNEL ASSIGNMENT
20733 ;RH INDEX INTO IOTTB AND CLSTB
20734 ;LH DEV CHNL AND/OR OTHER
20735 SIOCHN: BLOCK LUIOP ;MUST FOLLOW IOCHNM
20737 SIOCP: SIOCHN-1 ;POINTER INTO I/O CHANNEL PDL
20738 IOCHST: BLOCK NIOCHN ;I/O CHANNEL STATUS FOR CH'S AT IOCHNM
20740 ;1.1-2.9 .ACCESS POINTER
20742 CORRQ: -1 ;RQ TO CORE JOB
20744 ;4.8=0 OLD TYPE RQ,1.1-1.9 # BLKS,3.1-3.8=USR NUMBER RQ'ED FOR
20746 ;4.3 ADD FRESH BLOCK (IGNORE 4.2,4.1)
20747 ;4.1=1=> ADDING ABSOLUTE BLOCK
20748 ;3.9=1=>REQUEST WRITE ABILITY
20749 ;2.9=1 INSERT, =0 DELETE ONLY IGNORE 4.1-4.3
20750 ;2.1-2.8 VIRTUAL PAGE AFFECTED
20751 ;1.1-1.9 USER RQ IS FOR
20753 APRC: APRCHN ;R.H. CONO TO APR WHEN USER STARTS (HAS AR OV ENABLE, ETC.)
20754 ;4.9=1=> PROCEDURE IS IN A DISOWNED TREE
20755 BUMRTL==100000 ;4.7 => GUN TREE IF HASN'T RUN FOR AN HOUR
20756 ;(MEANINGFUL ONLY IN TOP LEVEL JOB).
20757 ;CLEARED BY REOWNING OR ATTACHING.
20758 BUSRCR==40000 ;4.6 CORE RQ PENDING ON THIS JOB
20759 BULGO==20000 .SEE SYSGUN ;USER IS DISABLED, WAITING TO BE FLUSHED BY SYS JOB.
20760 BCHPTR==330400,,APRC(U) ;4.1-4.4 LAST CH ON WHICH AN ERR OCCURED (SEE ERR DEV)
20761 BULGOS==400 ;AN ATTEMPT IS BEING MADE TO DELETE OR LOG OUT THIS JOB
20762 ;SO NO-ONE ELSE SHOULD START TO. THIS BIT ALSO LOCKS OUT
20763 ;MOST WAYS OF HACKING THE JOB (INCL. THOSE THAT SET DIELOK).
20764 ;3.1-3.5 MUST BE ZERO
20766 DIELOK: 0 ;NUMBER OF JOBS LOOKING AT OR HACKING THIS JOB.
20767 ;BEFORE KILLING A JOB, WAIT FOR ITS DIELOK TO BECOME 0.
20769 USTP: 0 ;0 RUNNABLE, (IS SET NON ZERO FOR IDLE SETS OF VARS TO SPEED SEARCH)
20771 %USTCM==400000 ;CORE BEING SHUFFLED (SHOULD ACTUALLY BE OBSOLETE).
20772 %USTCJ==200000 ;CORE BEING GIVEN BY CORE JOB.
20773 %USTSP==100000 ;STOPPED BY SUPERIOR
20774 %USTCG==40000 ;STOPPED BY SUPERIOR TO GIVE IT CORE (CORBLK, OR .USET OF .MEMT).
20776 BCSTOP==400000 ;BIT IN USTP FOR CORE MOVAGE
20777 BUCSTP==200000 ;CORE STOPPING LOSER TO GIVE MORE CORE RQSTED BY ANOTHER LOSER
20778 BUSRC==100000 ;USER CONTROL BIT, SET & CLEARED BY SUPERIOR PROCEDURE
20779 BSSTP==40000 ;SET BY SUPERIOR WHEN HACKING MEM BOUND AT URMEMT OR UMEMEX
20780 ;1.1-2.9 ;USED BY UBO AND FRIENDS INHIBITS RELOCATION BY CORE ALLOCATOR
20781 ;MUST BE MODIFIED WITH CLKOFF MUST NOT BE SET IF CSTOP IS SET
20782 ;IS A COUNTER OF TRANSIENT REASONS FOR PROCEDURE BEING STOPPED
20784 PIRQC: 0 ;INT REQ AWAITING SERVICE (SOFTWARE INTS EFFECTED BY SEARCH)
20785 MSKST: 0 ;INT MASK REGISTER FOR BITS IN PIRQC
20786 IFPIR: 0 ;SECOND WORD OF INTERRUPT REQUESTS
20787 ;3.8-3.1 INF PROC INT
20788 ;2.7-1.1 IO CHANNEL INT
20790 MSKST2: 0 ;INT MASK FOR IFPIR
20791 IDF1: 0 ;DEFER BITS FOR 1ST WD INTERRUPTS.
20792 IDF2: 0 ;FOR 2ND WORD INTERRUPTS.
20793 ;IF AN INTERRUPT IS DEFERRED, IT IS TREATED AS
20794 ;IF THE JOB'S PICLR VAR HELD 0.
20795 PICLR: 0 ;INT IN PROGRESS FLAG, -1=>ENABLED, 0=>IN PROGRESS
20797 SUPPRO: 0 ;-1 => TOP LEVEL PROCEDURE
20798 ;OTHERWISE: INT BIT,,PNTR TO SUPERIOR PROCEDURE
20800 FLSINS: 0 ;USER BLOCKING INSTRUCTION; STATE:
20801 ; 0 => RUNABLE (UNLESS USTP .NE. 0)
20802 ; OTHERWISE HUNG, IF NO SKIP SAFE TO RESTART AT UUO (UNLESS UFINAL .NE. 0)
20803 RPCL: 0 ;0,,N RPCLSR'ING N
20804 ;-1,,N BEING RPCLSR'ED BY N
20806 UNAME: 0 ;USER NAME
20807 ;THIS WORD FOR EACH PROCEDURE IS COPIED FROM THE UNAME OF THE PROCEDURE
20808 ;THAT CREATES IT (SEE USR DEV). FOR AN INITIAL TOP LEVEL PROCEDURE IT
20809 ;IS INITIALLY -1 BUT IS MODIFIED BY ALOGIN. IT IS THE SAME FOR ALL
20810 ;PROCEDURES IN A TREE.
20812 ;EACH LOGGED IN PROCEDURE HAS A UNIQUE UNAME, JNAME PAIR. THE JNAME
20813 ;OF AN INITIAL TOP LEVEL JOB IS "HACTRN". FOR OTHER JOBS IT IS THE SECOND
20814 ;FILE NAME SPECIFIED IN THE .OPEN ON THE USR DEVICE THAT CREATES THEM.
20815 USYSNM: 0 ;USER SYSTEM NAME
20816 ;THIS VARIABLE IS INITIALLY SET TO THE SAME VALUE AS UNAME FOR
20817 ;A PROCEDURE. IT CAN BE READ OR WRITTEN BY THE PROCEDURE (ASUSET)
20818 ;OR BY ITS SUPERIOR (AUSET). ITS ONLY USE IS AS THE DEFAULT THIRD FILE NAME ON
20819 ;USER SHARED DEVICES (2311'S (SEE QSKO), AND CORE
20821 USYSN1: 0 ;3RD NAME FOR QSKO, CLOO (AFTER DEFAULTING AND TRANSLATION)
20822 HSNAME: 0 ;HOME SNAME
20824 IOTLSR: 0 ;4.9 IOT USER MOD (=1 ENABLES USER TO DO DIRECT I/O
20826 ;RH VIRTUAL PAGE # OF LAST MPV, WIRO OR NXI (SHIFTED TO
20828 UMARPC: 0 ;PC AT MAR INTERRUPT
20829 LSWPR: 0 ;LOCKED SWITCH POINTER
20830 UCLBLK: 0 ;CLOCK QUEUE BLOCK
20833 URTIME: 0 ;LH=0=>LOW PRIORITY PHASE 1=> LOW PRIORITY WITH BLOCKING
20834 ;LH=-1=>HIGH PRIORITY PHASE 2=> HIGH PRIORITY WITH BLOCKING
20835 ;RH=LENGTH OF HIGH PRIOITY IN 60'THS
20836 RTIMER: -1 ;POSITIVE => MICROSEC RUNTIME TILL RUNTIME INT
20838 LSPCL: 0 ;UPC AT LAST PCLSR,,DIFFERENT UPC AT PREVIOUS PCLSR
20839 LEXFDR: 0 ;DEBUGGING INFO FOR PAGE FAULTS WHICH SIGNAL AN INTERRUPT
20841 ;LH FAULT BITS OF LAST SUCH FAULT
20842 ;RH PC OF LAST SUCH FAULT THAT WAS FROM EXEC MODE (WENT TO
20844 ;PAGE FAULTS WHICH JUST SWAP IN A PAGE DON'T SET THIS.
20845 LSUUO: 0 ;LAST SYS UUO (FOR DEBUGGING PURPOSE)
20846 LSCALL: 0 ;SIXBIT NAME OF LAST .CALL 0, (FOR PEEK)
20847 CTLBTS: 0 ;CTL BITS TO .CALL 0, XORED TOGETHER IN HERE (RIGHT HALF)
20848 SYSCVL: 0 ;CONTROLS OUTPUT ARGS FROM SYSTEM .CALL
20850 %SCVOT==400000 ;4.9 CALL HAS OUTPUT ARGS FLAG (TO SAVE TIME)
20851 %SCVER==200000 ;4.8 CALL HAS ERROR CODE ARG FLAG
20852 ;3.6-4.7 UNUSED 3.1-3.5 MUST BE ZERO
20853 ;1.1-2.9 ADDRESS OF ERROR CODE ARG
20854 IOTBTS: 0 ;DEVICE-INDEPENDENT IOT CONTROL BITS GO HERE, IN IOT AND SIOT
20855 USTYN: 0 ;TTY NO OF THE STY WHICH THIS JOB KNOWS AS "STY:" (WITHOUT
20857 UUAC: 0 ;AC FLD OF LAST UUO OR DESIRED CHANNEL IN CASE OF NOPEN ETC
20858 ;SELECTS CHNL FOR ALL IOTS, OPENS ETC
20859 ;LH -1 IF STORED BY CHNDCD, ELSE ZERO (SEE WHO LINE ROUTINES)
20860 TRMNAM: 0 ;TERMINAL IDENTIFICATION
20861 TRNLST: 0 ;TRANSL LIST FOR THIS JOB. -1 => NIL, OR IDX INTO TRAN!X
20862 TRNLS1: 0 ;TRANSL LIST FOR THIS JOB & INFERS.
20863 UTRAPM:: ;SIGN BIT OF OPTIONS IS UUO-TRAP-TO-SUPERIOR MODE
20864 OPTION: 0 ;OPTIONS WORD, SETTABLE BY USER
20865 ;EACH BIT CONTROLS SOME SYSTEM ACTION FOR THIS JOB
20867 XUNAME: 0 ;"WHO I REALLY AM" AS OPPOSED TO "WHO I AM LOGGED IN AS"
20868 XJNAME: 0 ;JOB NAME USER SPEC'ED AS OPPOSED TO UNIQUIZED VERSION
20870 40ADDR: 20,,40 ;RH=ADDRESS OF USER'S 6-WORD BLOCK FOR UUO'S, INTS, SWITCHES, LOCKING.
20871 ;LH=ADDRESS OF USER'S 20-WORD BLOCK FOR SUPERIOR'S USE. 0=20.
20873 TVCREG: -1 ;TV CONSOLE REG FOR THIS USER OF -1 NONE
20874 TVVBN: -1 ;-1 OR CONSOLE REG FOR RUN BLINKING
20875 NVDBA: 0 ;# VIDEO BUFFERS ASSIGNED (WITH NVDBA SYSTEM CALL).
20877 UWHO1: 0 ;WHOLINE FLAGS
20878 UWHO2: 0 ;TWO HALFWORDS, PRINTING CONTROLLED BY UWHO1 4.9-3.3
20879 UWHO3: 0 ;TWO MORE HALF WORDS, CONTROLLED BY UWHO1 3.2-1.5
20881 ULSPBR: 0 ;STBR,,GCSTBR FOR SPECIAL LISP INSTRUCTIONS
20883 SERVER: -1 ;User index of server job who is allowed write access to
20884 ; this job to implement some oddball protocol. -1 if none.
20885 ;INSERT NEW USER VARIABLES HERE^
20887 USRPDL: -LUPDL,,UPDL-1 ;USER PDL
20888 UPDL: BLOCK LUPDL-1
20889 EPDL2: 0 ;SAVES C(T) FOR FLSINS
20891 VALUE:: ;PROCEDURE "VALUE" RETURN
20892 SRN3: 0 ;SAVED N3, N4 FOR RENAMES AT AOPEN ALSO USER INDEX AT NLOAD
20893 ;SRN3, SRN4 USED BY CORBLK .CALL
20894 .SEE IODCS2 ;SRN3 contains saved user mode PC for unlocking own locks.
20895 .SEE ALOGO4 ;NO CLOSE ROUTINE MAY USE SRN4 OR SRN5
20896 SRN4: 0 ;ALSO DEVICE CHNL IOCHNM POINTER AT NLOAD
20897 SRN5: 0 ;SAVED N5 FOR LINK ALSO VIRTUAL PAGE NUMBER AT NLOAD
20898 EPDL3: 0 ;USED BY 2311 ROUTINES (QFNG) ALSO QSMDN ADDR AT NLOAD ALSO BY TYOW2
20899 .SEE ALOGO4 ;NO CLOSE ROUTINE MAY USE EPDL
20900 ;FOR BP-STYLE RENAME, RENMWO AND MLINK,
20901 ;HOLDS BP (OR BP BLK PTR) TO NAMES TO RENAME OR LINK TO.
20902 EPDL: 0 ;USED BY 2311 ROUTINES.
20903 ;FOR SOPEN AND BP-STYLE RENAME, DELETE, HOLDS BP OR BP BLOCK PTR.
20904 EPDLT1: 0 ;FN1 BEFORE LAST TRANSLATION, USED BY NLOAD
20905 EPDLT2: 0 ;FN2 " " " , USED BY NLOAD
20906 EPDLT3: 0 ;SYS NAME " " "
20907 EPDLT4: 0 ;LEFT ADJ DEVICE NAME " " "
20909 STTYOP: 0 ;IN THE TOP OF A DETACHED TREE, THIS CONTAINS THE SAVED USER TTY
20910 ; OPTIONS. 2.9=1 IF IT IS VALID, 2.7-2.8 ARE QUERY AND REFUSE MODE,
20911 ; THE REST ARE TTYOPT BITS.
20913 IFN 0,[ ;FAKE OUT @
20917 CONC LSWB,\.RPCNT,: BLOCK 2
20918 ] ;SWITCH BLOCK FORMAT
20919 ;WD1 ASSOCIATED ADDRESS OR QUANTITY
20920 ;3.6-3.1 USER NUMBER OF SWITCH HOLDER
20921 ;2.9-1.1 PNTR TO NEXT SWITCH ON LIST OR 0 IF NONE
20922 ;FOR REMAINDER OF FORMAT SEE LSWDIS
20925 IFGE USRSTG+1000-., INFORM SPACE LEFT IN UPT,\1000-<.-USRSTG>
20926 IFL USRSTG+1000-., .ERR USER VARS TOO BIG FOR UPT!
20927 .ELSE LOC USRSTG+1000
20930 IFN KS10P, LOC <.+7>&-10 ; KS UPT must be 0 mod 8 (see UUOPCW)
20934 INFORM [STORAGE PER LOSER]\LUBLK
20935 BLOCK LUBLK ;USER VARIABLES FOR CORE JOB
20936 SYSB==<1777+.>_-10.
20937 MXC==SYSUSB-SYSB ;AVAIL BLOCKS AFTER SYS+DDT
20939 \fSUBTTL TSS INITIALIZATION
20940 ;NEXT LINE COMMENTED OUT BECAUSE IT CAUSES MORE TROUBLE THAN IT SAVES
20941 ;.HKALL==1 ;(THE FOLLOWING CODE IS WIPED OUT AT ICLR)
20942 EXEUMP=UPGMP+100 ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S PAGE TABLE
20943 ;SYMBOL IS DEFINED HERE SINCE UPGMP WAS JUST DEFINED 6 PGS AGO
20945 BEG: SKIPN SALV ;SEE IF LOSER FORGOT TO LOAD SALV WHEN BUILDING SYSTEM,
20946 ;OR SALV MEM IS NXM. EVIL! EVIL!
20947 BUG AWFUL,[HEY! WHERE'S THE SALVAGER?]
20948 JSR SALV+1 ;CALL NO-QUESTIONS-ASKED SALVAGER
20951 JFCL 1,[JRST 4,.] ;SYSTEM WONT RUN ON 6
20954 SWPIA ;IF CACHE OFF, FLUSH CRUFT THAT MAY BE IN IT
20956 SWPUA ;IF CACHE ON, UPDATE CORE SO DDT IS GOOD
20959 SPCCTX 0,1,USRSTG,DISABLE ;SET UP UPT ADDR, BUT NO ACCTING TILL
20960 MOVEI T,0 ;MORE INIT IS DONE.
20961 XCTR XBW,[BLT T,17] ;CLEAR BLK 1 TO AVOID RANDOM PARITY
20965 CONO 20700+APRCHN ; Clear memory related APR flags
20967 MOVSI TT,%KEHLD+%KEREF+%KEPWR
20968 IOWR TT,[KSECCS] ; Reset memory status register.
20969 MOVEI TT,%UBTIM+%UBBAD+%UBPAR+%UBNXD+%UBINI
20970 IOWRQ TT,UBASTA ; Reset both Unibus's and both adaptors.
20972 MOVEI TT,DSKCHN_3 ; Set PI level for RH11. (No, you can't do
20973 IOWRQ TT,UBASTA ; this at the same time you reset the Unibus.)
20974 MOVEI TT,MTCCHN_3+TTYCHN ; PI for Tape, for Chaos and TTYs.
20976 WRHSB [HSB] ; Set halt status block location.
20977 CLRCSH ; Reset cache once for good measure.
20978 SPCCTX 0,1,USRSTG ; Set up UPT and AC blocks.
20981 MOVEI TT,600000+<T11CPA_-10.>
20984 DPB TT,[.T11CP+EXEUMP]
20985 SETOM T11MP+<T11CPA&777777>_-10. ;DONT USE MAP PAGE AS 10-11 PAGE
20986 ;IFN PDP6P,[ ;THESE ARE IN SEPARATE MOBIES NOW
20987 ; MOVE TT,[-LPDP6M,,<PDP6BM&777777>_-10.]
20988 ; SETOM T11MP(TT) ;CONFLICTS WITH PDP-6 MEM
20992 ; MOVSI TT,-TSYSM+256.
20993 ; SETOM T11MP(TT) ;CONFLICT PAGES
20999 ;INIT THE EXEC PAGE MAP'S DDT PAGES.
21000 HRRZ A,DDT-2 ;LOWEST ADDR IN SYMBOL TABLE
21001 SUBI A,100 ;LEAVE ROOM FOR EXTRA SYMS, 340 ROUTINES' LOSSAGE, ETC.
21002 LSH A,-10. ;GET PAGE SYMTAB STARTS IN
21004 MOVEI Q,NQS-1 ;PUT THE TUTS JUST BELOW THE DDT PAGES
21005 BEGTT1: SKIPE QACT(Q)
21006 JRST BEGTT3 ;UNIT NOT IN USE
21007 MOVE T,NTBL(Q) ;NUMBER OF PAGES IN THIS TUT
21009 MOVE B,[MU23TT_<.TZ .BM <MUR>>]
21011 DPB Q,[MNUMB,,MEMBLT(A)]
21017 BEGTT3: SOJGE Q,BEGTT1
21019 ;NOW MAKE SURE ALL THOSE PAGES ARE MAPPED
21020 MOVEI B,-200(A) ;ASSUMING TSYSM AT LEAST 128K
21021 LSH B,-1 ;GET A B.P. TO IDPB MAP HWD OF 1ST DDT PAGE
21022 ADD B,[442200,,EXEUMP]
21025 MOVEI C,600000+PMCSHM(A) ;COMPUTE CONTENTS OF THAT MAP WORD.
21026 MOVE D,[MUDDT_<.TZ .BM <MUR>>]
21027 BEG3: CAML A,FDDTPG
21029 IFG TSYSM-128., IDPB C,B
21031 IFG TSYSM-400, CAIE A,400
21032 .ELSE CAIE A,TSYSM ;STORE THAT MAP WORD AND ALL REST THERE ARE.
21035 ;INITIALIZE REST OF EXEC PAGE MAP
21037 MOVE Q,[222200,,EXEUMP]
21039 SKIPE USEMDM ;MAKE MEDIUM MEM NXM IF DIRMAP NOT TURNED ON
21040 MOVEI B,600200+PMCSHM ;THIS MAY BE USEFUL FOR DEBUGGING
21042 SUBI T,201 ;STOP AT 1ST TUT PAGE.
21043 BEG2: CAIL A,NEXPGS
21053 ;SET UP EXEC LOWER MAP (EVEN ON KA, WILL BE LOOKED AT BY .CALL CORBLK)
21054 MOVE A,[600000,,600001+PMCSHM] ;PAGE 0 IS NOT CACHED
21061 ;SET UP SYS JOB'S CIRCULAR POINTERS SO ALL THE PAGES IT HAS ARE ABSOLUTE
21063 MOVE A,[442200,,UPGMP]
21064 MOVE B,[442200,,UPGCP]
21069 CAIL D,200+MMP0 ;ALLOW USERS TO COPY MMP EXEC PGS
21071 MOVEI E,0 ;PG IT DOESN'T HAVE, AND NOT COPYABLE EXEC PG
21076 ;EXEC MAP PREPARED, NOW TURN ON PAGING
21083 CONO 67760 ; Disable and Clear all flags
21084 CONO 127660 ; Enable and Clear all flags except memory ECC
21087 BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21088 LDBR3 EXEUMP ; Load exec DBRs.
21091 SPCCTX 1,1,USRSTG ; Select AC blocks and set UBR.
21092 WREBR 020000+<EPT/1000> ; Paging on and set EBR.
21095 CONO 327740 ;ENABLE AND CLEAR ALL FLAGS EXCEPT SWEEP DONE
21098 BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21099 SPCCTX 6,6 ;LOAD MICROCODE CONSTANTS NEEDED BY PAGEING INTO
21101 MOVEI 3,EXEUMP ;DBR3
21102 MOVEI 4,EXELMP ;DBR4
21103 MOVSI 5,PMAGEM ;LH.AGE
21104 MOVEI 6,PMAGEM ;RH.AGE
21105 MOVEI 7,1000 ;CN1000
21106 MOVEI 10,100 ;CN100
21107 CONO PAG,660000+<EPT/1000> ;CACHE ON, ITS PAGER, TRAP ENB, EPT ADDR
21108 SPCCTX 1,1,USRSTG,DISABLE
21113 ;INITIALIZE FREE LISTS IN MEMBLT
21115 MOVEI A,1 ;A PG NO - NOTE: DON'T DO PAGE ZERO
21116 BEGF0: CAML A,FTUTPG ;IF THIS ISN'T A DDT OR TUT PAGE, THEN
21118 PUSHJ P,CIMEMR ;PUT THIS PAGE ON THE RIGHT FREE LIST
21124 MOVSI A,-256. ;CLEAR THE INTERFACE'S "VALID" BITS.
21125 SETZM 400000+T11CP*2000(A)
21131 MOVE A,[600000+<XGP11_8>,,1777]
21133 BUG ;NO 10-11 PAGES AVAILABLE?
21134 MOVEI TT,600000+<<T11CPA_-18.>_8>(B) ;GET CORRESP EXEC MAP PG SETUP
21135 DPB TT,[.XGPC+EXEUMP]
21136 MOVEI TT,600000+<<T11CPA_-18.>_8>+XGPTP
21137 DPB TT,[.XGPB+EXEUMP] ;SETUP PAGE FOR PDP-11 BUFFER
21140 ;CHECK AVAIL MEM FOR EXISTANCE
21143 LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21144 IORI TT,200000 ;GRANT READ ACCESS
21145 DPB TT,[.ECCPG+EXEUMP]
21147 MOVE A,400000+ECCPG*2000+1760 ;GET CURRENT HISTORY POINTER
21152 CKML: MOVEI TT,600000(A)
21153 DPB TT,[.PAREP+EXEUMP]
21156 LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21157 CAMN A,TT ;THIS PAGE?
21158 JRST CKML1A ;YES, TREAT AS IF OFFLINE, THOUGH WILL ACCESS IT
21159 ; DIRECTLY FROM TIME TO TIME
21167 JUMPL T,CKML1A ;THIS BLOCK KNOWN TO BE LOSING
21171 JRST CKML1A ;HIGH MOBY NOT TO BE USED
21173 MOVEI TT,CKML1 ;KL10 CAN GET PARITY FAULT ON REFERENCE TO NXM
21175 HRRM TT,MUUOKN ;IT CAN ALSO GET A UUO
21181 CAIL A,256. ;IF NOT IN BOTTOM 256K, DON'T ASSUME GOOD DATA
21182 SETZM 400000+PAREP*2000+20 ;STORE ZERO SO DON'T GET PARITY ERROR
21183 MOVE 0,400000+PAREP*2000+20 ;IF THIS NXMS, MEM THE SYS THINKS
21184 ; IT HAS IS NON EXISTANT
21187 JRST CKML1 ;THAT MEM NXM
21195 JRST CKML1 ;THAT MEM NXM
21201 JRST 4,. ; This can't happen, right? (If we got a NXM, we
21202 ; would have trapped to CKML1 already.)
21205 JRST CKML6 ;THUS ENDING BLOCK OF LOSERS
21206 CKML2: SOJGE A,CKML
21207 AOSN CKMFLG ;ANY MEM OFF UNEXPECTEDLY?
21210 IS THIS OK? /] ;YES, MAKE SURE SOMEBODY KNOWS ABOUT IT. MAY BE SERIOUS SCREW.
21218 PUSHJ P,T00ASZ ;CRLF
21221 CONO 26400 ;CLEAR ANY NXM AND PARITY INTERRUPTS
21224 BUG PAUSE,[TAPE DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21227 BUG PAUSE,[DISK DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21229 IFN KS10P, CONO 20400 ; Clear NXM flag
21235 TLNN A,NOWRIH ;CHECK FOR FORMAT SWITCH ON RP10
21236 BUG PAUSE,[RP-10 WRITE HEADERS ENABLED, PLEASE FLIP THE SWITCH]
21239 IFE <MCOND MLKA,>&<MCOND DM,>,[ ;CHECK FOR LOSING SWITCHES ON MEMORY ON ML-KA AND DM
21241 MOVSI D,(DWRITC) ;MAKE COMMAND FOR VERY LAST BLOCK ON DISK
21242 MOVEI A,NCYLS+XCYLS-1
21243 DATAO DPC,[DNOOPC] ;DETERMINE TYPE OF DRIVE 0
21246 MOVEI A,MCYLS+XCYLS-1 ;RP03
21254 SUB D,[DWRITC-DREADC]
21256 SUB D,[DREADC-DSEEKC]
21259 CKMS1: LDB TT,[MUR,,MEMBLT(A)] ;MEM EXIST?
21260 CAIE TT,MUFR ;AND NOT DDT?
21263 DPB B,[.PAREP+EXEUMP]
21265 CAIGE A,CKMSZZ ;MEM LOADED?
21267 MOVSI B,'FOO ;NO, LOAD IT
21269 MOVE B,[CKMSBF,,CKMSBF+1]
21273 HRRM A,CKMSBF+6 ;MAKE DIFF FROM OTHER SUCH PAGES
21276 LSH B,-4 ;16K BLOCK # IN B
21277 LSH C,(B) ;GET UNIQUE BIT SO PARITY ERR IF TWO AT SAME ADDR
21279 MOVE B,[CKMSBF,,400000+PAREP*2000]
21280 BLT B,400000+PAREP*2000+177
21281 CKMS3: MOVE B,A ;MAKE IOWD
21285 LDB C,[100300,,A] ;MA 15-17
21291 DATAO DPC,CKMSSC ;POSITION HEADS
21294 DATAO DPC,CKMSWC ;WRITE OUT SECTOR
21299 JRST CKMS4 ;CHANNEL ERROR MEM LOSING
21301 JRST CKMS2 ;FOO, DISK LOSING
21302 MOVE B,[-200,,CKMSBF-1] ;READ IT BACK
21312 JRST CKMS2 ;MEM LOSS IN CKMSBF?
21314 JRST CKMS2 ;FOO, DISK LOSING
21315 MOVSI B,-200 ;COMPARE
21317 CAME C,400000+PAREP*2000(B)
21318 JRST CKMS4 ;NOT SAME SWITCHES LOSING
21321 IFE MCOND DM, ADDI A,16. ;MA10'S !!
21322 IFE MCOND MLKA, ADDI A,32. ;ML-KA MEM IS IN 32K MODULES
21325 CONO DPC,175700 ;RESET THE DISK CONTROL
21326 DATAO DPC,[DEASEC+776] ;AT EASE!
21327 CONO PI,20000 ;TURN OFF IOB PI REQ LIGHT
21328 JRST CKMSX ;DONE WITH THIS, CONTINUE INITIALIZATION
21332 CKMS4: MOVEI TT,[ASCIZ/MEM ADDR SWITCHES DISAGREE CPU VS DSK AT LOC /]
21335 MOVEI TT,[ASCIZ/0000/]
21339 CKMSZZ==./2000+2 ;ABOVE HIGHEST CODE
21342 ] ;END IFE MCOND MLKA & DM
21345 DPB TT,[.PAREP+EXEUMP]
21347 IFN KA10P, CONO PI,240000+11577+IFN C1MXP,20000
21348 IFE KA10P, CONO PI,11577
21349 IFN NOTYS, CONO TTY,TTYCHN
21351 SETOM DTEODN ;CAN GET SET ON WHILE LOADING, BUT INTR GETS LOST
21352 IFE PDCLKP, CONO DTE,1170+APRCHN ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21353 IFN PDCLKP, CONO DTE,1170+TTYCHN ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21354 ] ;END OF IFN NETYS
21356 CONO DIS,515330 ;RESET E&S
21358 MOVEM TT,34 ;SET PAGER LOC (USED BY DSKDUMP)
21362 MOVEM TT,MICWA ;SETUP LOC FOR MEM CHAN TAPE
21366 MOVEM TT,QICWA ;SETUP FOR DEC DISK CHANNEL
21368 IFN ARMP, DATAO 760,[0] ;RESET LITE ON ARM
21369 IFN DSDP, CONO DSDEV,10 ;RESET INT RQ FROM PDP10
21370 IFN RBTCP, CONO RBTCON,0 ;RESET TABLET
21372 MOVE A,DDT-2 ;PUT GLOBAL BLOCK HEADER AT BEGINNING
21373 MOVE B,[SQUOZE 0,GLOBAL]
21374 CAME B,(A) ;SEARCH FOR GLOBAL BLOCKS
21375 AOBJN A,[ AOBJN A,.-1
21379 SUBI D,(A) ;GET ,,-#WDS BEFORE GLOBAL BLOCK
21381 ADDM D,1(A) ;GLOBAL BLOCK NOW LARGER
21382 EXCH B,(C) ;EXCHANGE IT WITH FIRST SYM
21387 BEGS1: PUSHJ P,SBUBL
21388 JUMPL J,BEGS1 ;KEEP SORTING UNTIL SYMS IN ORDER
21392 ; SORT THE UUO/SUSET/BIT SYMBOL TABLE BY VALUE
21394 MOVE E,[SYSYMB-SYSYME-1,,SYSYMB]
21398 MOVE A,[-LTSTB,,TSTB]
21403 MOVEM C,CKSUMS-TSTB(A)
21407 IFL .RPCNT-18., TLNE C,400000_<-.RPCNT>
21408 .ELSE TRNE C,400000_<18.-.RPCNT>
21409 XORM B,CKXORS+.RPCNT
21413 HRRZS 37 ;MAKE SURE SYS DOESNT IMMEDIATELY COME DOWN
21418 QSETUP: MOVE B,DCHBT(A)
21423 IFN DC10P, CONO DC0,DCCSET+DCDENB+DSKCHN ;RESET 2314 AND SET DATA ERROR ENABL
21424 IFN 340P, CONO DIS,100
21425 IFN TK10P, CONO NTY,TTYCHN
21426 IFN MTYP, CONO MTY,TTYCHN
21431 CONO DPK,400070+TTYCHN ;INITIALIZE DP KLUDGE
21432 DATAO DPK,[4,,DPKBAS]
21433 MOVE T,[-NDPTYS,,NFDPTY]
21435 DPIL: LDB A,[$TTOSP,,TTYTYP(T)] ;OUTPUT SPEED
21436 MOVE A,DPSP(A) ;MAP TO DPK SPEED CODE
21437 DPB B,[140400,,A] ;LINE #
21438 CONO DPK,500+TTYCHN(A) ;LOAD OUT SPEED
21439 LDB A,[$TTISP,,TTYTYP(T)] ;INPUT SPEED
21440 MOVE A,DPSP(A) ;MAP TO DPK SPEED CODE
21442 CONO DPK,700+TTYCHN(A) ;LOAD IN SPEED
21452 MOVSI R,-NTTPG-NTVBP+1
21453 MOVE T,[.TTPG0+EXEUMP]
21454 BEG9: MOVEI A,(R) ;SET UP 1 MORE TEN-11 MAP ENTRY
21456 IORI A,1777 ;A FULL PAGE
21457 TLO A,600000+TT11NM*400
21460 ADDI B,600000+<<T11CPA_-18.>_8> ;READ-WRITE, IN HIGH MOBY.
21464 MOVE A,[(600000+TT11NM*400)TT11CR_8] ;POINTER TO CONSOLE REG
21467 ADDI B,600000+<<T11CPA_-18.>_8>
21470 SKIPE TT11P ;IF WE'RE SUPPOSED TO USE THE TV 11,
21471 SETZM TT11UP ;REQUEST IT TO RE-INIT.
21472 ;IF TT11UP BECOMES NONZERO, THE 11 IS UP.
21473 BEG5: ];END IFN N11TYS
21475 XCTRI [IORDI A,CAIMYN]
21477 BUG HALT,[CHAOSNET INTERFACE NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS)]
21479 IFN CHAOSP,[ IFN T11CHP,[
21480 SKIPE TEN11F ;SET UP TEN-11 CHAOS NET INTERFACE PAGE
21482 MOVE A,[(600000+CH11NM*400)1004_8+1777]
21485 ADDI B,600000+<<T11CPA_-18.>_8>
21486 DPB B,[.CHSPG+EXEUMP]
21487 BEG8: ]] ;CHAOSP, T11CHP
21488 IFN DL10P,[ ;INITIALIZE DL10
21489 CONO DLC,400000 ;MR CLR
21490 CONO DLB,1 ;TURN OFF EXCESS LIGHTS
21493 CONO DLB,DL10AR ;64 WORDS FOR PDP11 #0 AT DL10AR
21494 DATAO DLC,[200001,,] ;KA INTERRUPT MODE
21496 CONO DLC,100020+TTYCHN ;ENB PDP11 PORT #0 AND ENB INTR
21500 SKIPGE T ;IF THE 11 DIDN'T SAY IT WAS UP,
21501 SETZM DL10F ;MARK IT NON-FUNCTIONAL.
21504 CONO TIM,460000+3900. ;SET INTERVAL TIMER TO 39 MILLISECONDS FOR OVHMTR
21505 CONO MTR,433001 ;TIME BASE ON, ACCOUNT FOR USER + EXEC NO PI, INTERVAL PIA=1
21506 PUSHJ P,PRFOFF ;INIT PERFORMANCE COUNTER
21510 MOVSI T,%TBNOT+%TBDTY+%TBNVR ;SYS JOB HAS NO CONSOLE ALL TO ITSELF
21512 PUSHJ P,USSINI ;INITIALIZE SYS JOB VARIABLES BLOCK
21516 MOVEI T,UUOH0 ;CLOBBERED BY USSINI
21520 HLLM T,UPGMP ;GIVE PG 0 TO SYS JOB
21525 MOVEI T,SYSRCE ;SET SYS JOB RESOURCE POINTER
21527 MOVSI A,(SIXBIT /SYS/) ;""" NAMES
21534 MOVSI T,%TBNOT+%TBDTY+%TBNVR ;CORE JOB HAS NO CONSOLE
21536 PUSHJ P,USSINI ;SET UP CORE JOB VARIABLES BLOCK
21538 MOVE A,[SIXBIT /CORE/]
21542 MOVSI A,(SIXBIT /JOB/)
21546 MOVEM T,UTMPTR+LUBLK
21549 IFE KA10P, HRLI A,%PSPCU ;DOES CORE JOB XCTR?
21552 MOVE T,[JSR ILLTRP] ;SYS AND CORE JOBS SHOULDN'T TRAP
21553 MOVEM T,TR1INS ;THESE WON'T BE USED ANYWAY UNLESS
21554 MOVEM T,TR2INS ;SOMEDAY THEY SHOULD RUN IN USED MODE
21560 MOVEI A,SYSB+2 ;GIVE SYSTEM CORE TO SYS JOB, WITH A COUPLE
21561 MOVEM A,CORRQ ; SPARE JOB SLOTS
21566 CONO PI,100+UTCON-1 ;ALL EXCEPT 7
21567 IFN KA10P, CONO 3000+APRCHN
21569 IFN PDCLKP, CONO CLK,APRCHN
21570 .ELSE [ MOVEI A,%DTCLN ;TURN ON 60-CYCLE CLOCK
21577 CONO APRCHN ;ENABLE APR FAULT INTERRUPTS
21578 SWPUA ;UPDATE MEMORY AGAIN TO MAKE SURE DDT + SYMBOL
21579 ; TABLE OUT OF CACHE
21584 WRINT [KSFREQ] ; 60 cycle clock.
21585 CONO APRCHN ; Enable APR faults and clock ints.
21586 CLRCSH ; Is this necessary? What the heck...
21589 CONI CHX,T ;CHECK CHAOS ADDRESS SWITCHES
21592 JRST [ MOVEI TT,[ASCIZ/CHAOSNET ADDRESS SWITCHES ARE SET WRONG/]
21595 CONO CHX,@CHXCNO ;ENABLE INTERRUPTS
21599 CKML1: ;MEM NON-EXISTANT PATCH OUT
21600 IFN KA10P, CONO 10000 ;TURN OFF NXM FLAG
21614 MOVEM A,CKMBLK ;HIGHEST IN BLOCK OF LOSERS
21615 CKML1A: LDB TT,[MUR,,MEMBLT(A)]
21619 JRST 4,. ;SYS MEM NON EX? (BUG PROBABLY WON'T WORK)
21620 PUSHJ P,MPOUT2 ;FLUSH THAT BLOCK
21622 DPB TT,[MUR,,MEMBLT(A)]
21623 CAIL A,400 ;IF NXM IN LOW MOBY
21631 DPB U,T ;PATCH THIS BLOCK OUT OF EXEC MAP
21635 ; REPORT A BLOCK OF LOSING MEMORY
21638 MOVEI TT,[ASCIZ/MEM OFF /]
21641 ADDI A,1 ;LOWEST LOSER = HIGHEST WINNER + 1 PAGE
21653 USEHM: -1 ;-1 => USE MEM IN HIGH MOBY (IF PRESET)
21655 CKMBLK: -1 ;IF + HIGHEST LOSING BLOCK IN CONTIG RANGE
21656 CKMFLG: -1 ;IF + PRINTED MESSAGE ALREADY
21657 CKMSWC: 0 ;WRITE CMD
21658 CKMSRC: 0 ;READ CMD.
21659 CKMSSC: 0 ;SEEK CMD.
21660 ;UP TO 8 RANGES OF ADDRESSES THAT SHOULD NOT BE USED BECAUSE THEY
21661 ;DON'T WORK BUT AREN'T NXM.
21662 MEMLZL: BLOCK 8 ;LOWEST LOC
21663 MEMLZH: BLOCK 8 ;HIGHEST LOC+1
21664 FTUTPG: 0 ;FIRST PAGE USED FOR TUTS
21666 ;INPUT CHAR FROM CONSOLE TTY AND ECHO
21691 ; TYPE CHAR IN A ON CONSOLE TTY
21720 ; TYPE BLOCK NO IN A AS HIGH 3 OCTAL DIGITS OF ADDR
21721 ; (ALL MEMORIES MULTIPLE OF 4K. MAX MEMORY 2M WORDS.)
21734 ; TYPE ASCIZ IN TT ON T00
21743 IFN DPKPP,[ ;MAP SYSTEM SPEED CODES TO DATAPOINT KLUDGE CODES
21753 REPEAT 20-<.-DPSP>, 7_9 ;FAST *
21762 ; Define location known as start of SALV disk salvager. If system overruns
21763 ; this address, must either reduce system size or increase the SALV start
21764 ; address. If SALV is changed, the SALV program must also be changed to
21765 ; start at the right place. There is a limit to how high it can go,
21767 IFN KL10P, SALV==:105*2000 ; MC-KL is getting huge
21768 .ELSE SALV==:100*2000
21769 IFG IEND-SALV,.FATAL System overruns SALV start addr!
21771 IFGE TSYSM-256.,DDT=774000
21772 .ELSE DDT=TSYSM*2000-4000
21775 IFG LBUGTB-LBUGT2,[
21776 .ERR MAKE THE BUGTAB BIGGER
21777 INFORM LBUGTB-LBUGT2,\LBUGTB-LBUGT2
21778 .FATAL FATAL ERROR, RUNNING THIS WOULD CAUSE TOTALLY WEIRD BUGS
21781 IF2 EXPUNGE FOO,ZZZQ,FNM,ZCHR,ZZ,ZZZ,BUGB,BUGF,BUGN,BUGNN
21783 END BEG ;START AT BEG TO SALVAGE AND RUN ITS, START AT GO TO JUST ITS