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
39 ;THE FILE "CONFIG" HAS ASSEMBLY SWITCHES AS A FUNCTION OF MACHINE.
42 IFN ASCII/A/&ASCII/ /,.FATAL USE UPPER CASE!
43 DEFINE MCOND X ;0 IFF THIS IS MACHINE X.
45 DEFINE MNAME X ;USED TO SUBSTITUTE IN THIS MACHINE'S NAME.
47 FOO==.TTYFLG ;MAKE ERR FILE LOOK NICE
54 IFNDEF PCLSW,PCLSW==1 ;1 => ASSEMBLE PCLSR TEST FEATURE
55 IFNDEF TT11BY,TT11BY==8 ;PDP11-TV OUTPUT BUFFER BYTE SIZE.
56 .MLLIT==1 ;MULTI-LINE LITERAL MODE
57 ASTIME==.OP .OPER+@,0,.RTIME ;GET ASSEMBLY TIME AND DATE IN SIXBIT.
58 ASDATE==.OP .OPER+@,0,.RDATE ;RH OF INSN MUST BE 0, SO MIDAS WILL PUT IN PROPER AC FLD.
74 P=15 ;DO NOT CHANGE! ;PDL POINTER
78 .XCREF A,B,C,D,E,TT,I,Q,J,R,W,H,P,T,U
80 IF1 EXPUNGE APR,OCT,DEC ;FOR NEW CALENDAR HACK
82 NULBLK==4 ;NUMBER OF LOCKED SWITCH BLKS IN USR VARIABLES
83 ;USES 2 WDS OF USER VAR PER
85 NPVSEC==30. ;NUMBER OF SECONDS A USER IS ALLOWED TO BE IN THE PRIVILEDGED SWAPPING CLASS
86 IF2 LIOBLK==<USRSTG+LUBLK*MAXJ+1777>_-10. ;LOWEST BLOCK NEVER TO BE SHUFFLED
87 ;ALSO MAX # OF BLOCKS SYS JOB MAY HAVE
88 IF2 MAXJ==<LIOBLK_10.-USRSTG>/LUBLK ;ROUND UP TO ACTUAL MAX #JOBS
90 DIRMAP==1 ;ENABLE DIRECT MAPPING OF HIGH HALF
91 ;I DON'T THINK IT WORKS TO TURN THIS OFF.
92 NIOCHN==20 ;NUMBER OF I/O CHANNELS PER USER
94 DEFINE $INSRT $%$%$% ;PRINTX MESSAGE WHEN FILE GETS INSERTED
96 PRINTX \ ==> INSERTED: \
104 ;;; CONFIG uses this macro...
108 $INSRT CONFIG ;CONFIGURATION SWITCHES FOR ALL KNOWN MACHINES
110 $INSRT BITS ;DEFINITIONS OF MANY BIT NAMES
112 ;IN BADBTS => CLASS 2 OR 1 INTERRUPT ;IN VBDBTS=> CLASS 1 INTERRUPT
113 VBDBTS==%PIB42\%PIVAL\%PIBRK\%PIC.Z\%PI1PR\%PITRP\%PIDCL
114 BADBTS==VBDBTS\%PIMPV\%PIIOC\%PIILO\%PIMAR\%PIDIS\%PIOOB\%PILOS\%PIFET\%PIWRO\%PIPAR\%PITTY\%PIPDL\%PINXI
116 UUOMIN==40000,, ;SMALLEST NUM THAT COULD BE A SYSTEM CALL
117 UUOMAX==50000,, ;ONE GREATER THAN LARGEST NUM "
118 UIOT=UUOMAX ;USE FOR USER I/O INST TRAP
120 ;MAX DYN ALLOC ALLOC IO BUFFERS
121 MXIOB==100 ;MAX POSSIBLE
123 SIOMT==50 ;MAX SIZE TRANSLATION TABLE
125 LUPDL==50 ;LENGTH USER PDL MUST BE >= 40 FOR 2311 GC
126 LUIOP==20 ;LENGTH OF USER IO PDL
127 CPDLL==40 ;LENGTH CLOCK CHANNEL PDL
128 LUTCP==40 ;LENGTH UTC PDL (NETWORKS AND DISKS)
129 LSYSP==100 ;SYSTEM JOB PDL
130 LTTYP==40 ;LENGTH OF TTY (INTERRUPT LEVEL) PDL
132 DMNSZ==20 ;# ENTRIES IN DEMON BUFFER (DMNBF)
134 MXCZS==5 ;MAX NUMBER ^Z'S PER CLOCK BREAK
136 SCLKI==30. ;60'THS PER SLOW CLOCK
137 VSCLKI==2*60.*60. ;60'THS PER VERY SLOW CLOCK TICK
138 MXOPT==8. ;SLOW CLOCK MAX UT OP CAN TAKE
139 NINFP==8. .SEE UFIN ;MAX # OF DIRECT INFERIORS A PROCEDURE MAY HAVE
141 SSCHDB==100 ;LENGTH OF SCHEDULER HISTORY BUFFER
143 SPD==60.*60.*24. ;# SECS IN A DAY (FITS IN A HALFWORD)
144 PDUPS==60. ;# PDCLK INCREMENTS/SEC
146 OPNCOM==410300 ;COMMAND FIELD IN LH OF FIRST OPEN WORD
148 IFN 340P,N340PB==10. ;# EXEC PGS USED FOR 340 DATA MUST BE EVEN
150 NTTPG==6 ;# EXEC PGS FOR PDP11 TV TTYS.
151 NTVBP==11 ;THESE PAGES ADDRESS THE WHOLE VIDEO BUFFER MEMORY ADDRESS
152 ;SPACE OF THE TV 11. THE LAST OF THESE ADDRESSES THE
155 NUVPG==256. ;NUMBER OF VIRTUAL PAGES PER USER. SIZE OF PAGE TABLE VARS.
156 ;DON'T TRY TO CHANGE THIS.
157 ;CIRCULAR PAGE LINK FORM
162 ;2.8=0 2.7-1.1 LINK TO MMP TABLE
163 ;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE
164 ;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED
166 SUBTTL GOBBLE TTYTYP FILE
168 IFN XGP\N11TYS,[IFE TEN11P,[
169 .ERR XGP OR N11TYS WITHOUT TEN11P
174 IFNDEF UNSPLP,UNSPLP==<TTLPTP+OLPTP+NLPTP>*DEMON*<1-TPLP>
175 ;1 IF THE "UNSPOO" PROGRAM DOES LPT SPOOLING.
178 MNAME PRINTX \NO PARAMS KNOWN FOR , MACHINE.
184 ;TTY LINES DEFINITIONS
186 ;MACRO WHICH RETURNS THE %TY BIT FOR THE CONTROLLER ACCORDING TO THE LINE NUMBER
189 IRPS F,,[0 NFKSTY NFETY NFNTY NFNVTY NFDZTY NFDPTY NFMTY NFDLTY NFSTTY NF11TY
190 ]NT,,[NOTYS NKSTYS NETYS NNTYS NNVTTS NDZTYS NDPTYS NMTYS NDLTYS NSTTYS N11TYS
191 ]FG,,[%TYOTY %TYKST %TYETY %TYNTY %TYNVA %TYDZT %TYDPK %TYMTY %TYDL %TYSTY %TY11T]
192 IFGE <N>-F,[IFL <N>-<F+NT>,[FG]]TERMIN TERMIN
194 ;MACRO WHICH RETURNS $TTISP, $TTOSP BITS GIVEN BAUD RATES
196 DEFINE SPEEDC <IBAUD,OBAUD>
197 <IFB IBAUD,[SPEED1 OBAUD]IFNB IBAUD,[SPEED1 IBAUD]>*%TTISP+<SPEED1 OBAUD>*%TTOSP!TERMIN
200 IRPS BD,,[0 600 110 150 300 1200 1800 2400 4800 9600 25K 40K 50K 80K
201 ]CD,,[0 1 2 3 4 5 6 7 10 11 12 13 14 15 ]
202 IFSE BAUD,BD,[CD] TERMIN TERMIN
204 ;KEYWORD PARAMETERS TO TTY DEFINITION MACROS
205 ; FOR OVER-RIDING DEFAULTS
206 ;SPEED NUMBER OF BAUDS OUTPUT
207 ;ISPEED NUMBER OF BAUDS INPUT IF DIFFERENT
208 ;TT LH(TTTYP) IN ADDITION TO SPEED CODE
209 ;TY RH(TTYTYP) IN ADDITION TO CONTROLLER BIT
210 ;TO LH(TTYOPT) IN ADDITION TO USUAL CODES FOR TERMINAL TYPE
211 ;TP RH(TTYOPT) IN ADDITION TO PAD CODES
215 ;ROL LINES PER GLITCH WHEN SCROLLING
217 ;DEFINE TTY AS PRINTING.
218 ;IF SPEED IS 110, ASSUME TTY IS TELETYPE,
219 ;MEANING CAN'T BS, STANDARDIZE ALTMODES.
220 ;IF KA10 CONSOLE TTY OR TK10 TTY, NEED PARITY
221 DEFINE TTDPRT N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNPRT,SMARTS=0
223 T!N!$HOR==80.-IFE 110-SPEED,8
225 T!N!$OPT==TO+%TOOVR+%TOALT+IFN 110-SPEED,[%TOMVB+%TOLWR-%TOALT],,<1+IFE 300-SPEED,[IFE TY&<%TYDIL\%TYRLM>,[3]]>*%TPPCR+TP
226 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>\<IFE N,[IFN NOTYS,[%TTPAR]]>\<IFGE N-NFNTY,[IFL N-<NFNTY+NNTYS>,[%TTPAR]]>,,TY+<CNTRLR N>
231 ;DEFINE TTY AS MEMOREX
232 DEFINE TTDMRX N,+SPEED=600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0
236 T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,4*%TPPLF+6*%TPPCR+TP
237 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
242 ;DEFINE TTY AS TERMINET.
243 DEFINE TTDTRM N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=120.,SMARTS=0
247 T!N!$OPT==TO+%TOOVR+%TOMVB+%TOLWR,,5*%TPPLF+TP
248 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
253 ;DEFINE TTY AS A LPT.
254 DEFINE TTDLPT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=0,HOR=200.,TCT=%TNPRT,SMARTS=0
258 T!N!$OPT==TO+%TOMVB+%TOOVR,,TP
259 T!N!$TYP==%TTDDI+TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
264 ;DEFINE TTY AS AN LA36 DECWRITER.
265 DEFINE TTDLA36 N,+SPEED=300,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=132.,TCT=%TNPRT,SMARTS=0
269 T!N!$OPT==TO+%TOMVB+%TOOVR+%TOLWR,,TP
270 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
275 ;DEFINE TTY AS IMLAC. (RUNNING SOFTWARE-TTY PROGRAM)
276 DEFINE TTDIML N,+SPEED=50K,ISPEED=25K,TT=0,TY=0,TO=0,TP=0,HOR=90.,VER=44.,TCT=%TNSFW,ROL=10.,SMARTS=%TQIM1
280 T!N!$OPT==TO+%TOOVR+%TOLWR+%TOMVB+%TOMVU+%TOERS+%TOLID+%TOCID,,TP
281 T!N!$TYP==%TTDDI+TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
287 DEFINE TTDVT N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNESC,ROL=1,SMARTS=0
291 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS,,TP+%TPPTB*<IFE SPEED-9600,[1] .ELSE [3]>
292 ;DIRECT POSITIONING LOSES AT 9600
293 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
299 DEFINE TTDH19 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,VER=24.,TCT=%TNH19,ROL=1,SMARTS=0
303 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3
304 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
310 DEFINE TTDAAA N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS+%TPMTA,HOR=80.,VER=48.,TCT=%TNAAA,ROL=1,SMARTS=0
314 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*2
315 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
321 DEFINE TTDC100 N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=79.,VER=24.,TCT=%TNHDS,ROL=1,SMARTS=0
325 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOLWR+%TOERS+%TOLID+%TOCID,,TP+%TPPTB*3+<IFG SPEED-1200,%TPPCR>
326 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
331 ;DEFINE TTY AS TEKTRONIX.
332 DEFINE TTDTEK N,+SPEED=1200,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNTEK,HOR=73.,VER=35.,SMARTS=0
336 T!N!$OPT==TO+%TOMVU+%TOOVR+%TOMVB+%TOLWR+%TOMOR,,TP
337 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
342 ;DEFINE TTY AS A LOSING DATAPOINT
343 DEFINE TTDLSR N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,SMARTS=0
346 T!N!$HOR==71.-IFN MCOND AIKA,1 ;OTHER DATAPOINTS HAVE SHORTER SCREENS.
348 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP
349 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
353 ;DEFINE TTY AS DATAPOINT.
354 DEFINE TTDDPT N,+SPEED=2400,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=[72.-IFN MCOND AIKA,[1]],SMARTS=0
357 T!N!$HOR==HOR ;OTHER DATAPOINTS HAVE SHORTER SCREENS.
359 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS,,4*%TPPCR+TP
360 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
364 ;DEFINE TTY AS A TELERAY 1061
365 DEFINE TTDRAY N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,HOR=80.,SMARTS=0
370 T!N!$OPT==TO+%TOMVU+%TOMVB+%TOERS+%TOLWR+%TOLID+%TOCID,,3*%TPPTB+TP
371 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
375 ;DEFINE A TTY THAT IS A GT40.
376 DEFINE TTDGT40 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS,TCT=%TNDP,HOR=72.,VER=32.,ROL=1,SMARTS=0
380 T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOOVR+%TOLWR,,TP
381 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
386 ;DEFINE A TTY THAT IS A LINE TO A PDP11.
387 DEFINE TTD11 N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=0,TCT=%TNPRT,HOR=72.,VER=MOVE,ROL=1,SMARTS=0
391 T!N!$OPT==TO+%TOMVB+%TOOVR+%TOALT,,TP
392 T!N!$TYP==TT+%TTDDI+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
397 ;DEFINE A TTY THAT IS RANDOM.
398 DEFINE TTDRAN N,+SPEED=FOO.,ISPEED=,TT=0,TY=0,TO=FOO.,TP=FOO.,TCT=FOO.,HOR=FOO.,VER=FOO.,ROL=FOO.,SMARTS=0
403 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
409 DEFINE TTDDTM N,+SPEED=4800,ISPEED=,TT=0,TY=0,TO=0,TP=%TPORS+3*%TPPCR,HOR=80.,VER=24.
413 T!N!$OPT==TO+%TOMVB+%TOERS+%TOMVU+%TOLWR+%TOLID+%TOCID,,TP
414 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
419 ;DEFINE A PDP11 TV COMMUNICATING VIA TEN-11 INTERFACE. NO OPTIONS.
421 T!N!$SMT==%TQGRF+%TQVIR+%TQREC+%TQXOR+<.DPB 14,<.BP %TQHGT>>+<.DPB 6,<.BP %TQWID>>,,%TRSCN
424 T!N!$OPT==%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI+%TOLID+%TOCID,,%TP11T+%TPRSC
425 T!N!$TYP==%TTLCL+<SPEEDC 9600,9600>,,%TY11T
430 ;DEFINE A PDP11 TV COMMUNICATING AS A SOFTWARE TTY. TYPICALLY A GRINNELL (512x512).
431 DEFINE TTDGRN N,+SPEED=9600,ISPEED=,TT=0,TY=0,TO=0,TP=%TPCBS+%TPORS,HOR=86.,VER=50.,TCT=%TNSFW,ROL=0,SMARTS=0
435 T!N!$OPT==TO+%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI,,TP
436 T!N!$TYP==TT+<SPEEDC ISPEED,SPEED>,,TY+<CNTRLR N>
441 ;DEFINE AN STY LINE. NO OPTIONS.
446 T!N!$OPT==%TOMVB+%TOOVR+%TOLWR+%TORAW,,%TPORS
453 IFE MCOND MCHN,TERMIN
455 ;;; THE NEXT TWO MACROS CAUSE TTYTYP FILE TO BE INSERTABLE BY BOTH
456 ;;; PDP-10 AND PDP-11 PROGRAMS.
467 EXPUNGE TTDPRT,TTDTRM,TTDDPT,TTDMRX,TTDGT40,TTD11,TTDRAN,TTDGRN,TTDVT,TTDTEK
468 EXPUNGE TTDTV,TTD2741,TTDSTY,TTDLPT,TTDIML,TTDLA36,TTDLSR
469 EXPUNGE SPEEDC,SPEED1,CNTRLR,MCONDX,.ENDC,.ENDR
474 ;Macro for reporting a bug or other interesting condition
475 ;Use this in place of JRST 4, especially when condition is automatically
476 ;recoverable or wants explanation typed out for benefit of loser.
478 ;First argument is one of the following symbols:
479 ; INFO - just print on the system console
480 ; CHECK - same as INFO unless SYSDBG non-zero or buffer full, then same as PAUSE
481 ; PAUSE - print message, go to DDT, allow alt-P
482 ; HALT - print message, go to DDT, do not allow alt-P
483 ; DDT - PAUSE but not because of a bug (shorter message), allow alt-P
484 ; AWFUL - same as HALT but usable when there is no pdl in P
485 ; Should there be a combination of AWFUL and PAUSE?
486 ; That would require restoring P upon attempt to continue
487 ;Arguments after the first are either strings to be printed
488 ;(enclose in brackets), or format,value pairs. Value is any
489 ;address; indexing and indirection are allowed, however registers
490 ;P and TT may not be referenced.
491 ;A format is one of the following symbols:
492 ; OCT - octal number, with ,, if bits on in the left halt
493 ; DEC - decimal number
494 ; THOU - decimal number with commas every three digits
495 ; CR - print a carriage return (unfortunately swallows and ignores an arg)
496 ; SIXBIT - sixbit word
497 ; ASCIZ - asciz string
498 ;Undefined formats will be taken as strings to be printed.
499 ;The maximum number of value arguments is 6
500 ;A space is printed after each formatted value. A space is also
501 ;printed after the last string and before any additional formatted values.
503 ;With no arguments, BUG may be used in place of JRST 4,.
504 ;It uses the same amount of storage but has the advantage of going
505 ;straight to DDT. In this case there won't be a specific message
506 ;about what the bug was, of course.
508 ;Note that the BUG macro always generates one word of code, and hence
509 ;may be skipped over.
510 ;All registers are preserved.
511 ;P must point at a valid PDL.
513 ;Due to Midas inadequacy, the BUG macro may not be used from inside
514 ;a literal. You will get an error (label inside brackets) if you try it.
517 ; BUG PAUSE,[DSK: DRIVE NUMBER ],OCT,Q,[IS OFF-LINE.]
519 DEFINE BUG FLAVOR,ARGS/
521 ;Make sure we are not in a literal, since cannot get value of "."
522 BUGBUG: EXPUNGE BUGBUG
523 ;Generate call to appropriate flavour of subroutine
525 IRPS FLA,,[INFO,CHECK,PAUSE,HALT,DDT]SUB,,[BUGINF,BUGCHK,BUGPSE,BUGHLT,BUGDDT]
530 IFSE [FLAVOR]AWFUL, JSR BUGAWF
531 .ELSE IFE ZZ, .ERR "FLAVOR" UNKNOWN FLAVOUR OF BUG
533 BUGB==0 ;Initialize formatting bits
535 ;Initialize remote macros
536 DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003*
537 ZZ001!ZZ002!ZZ003!TERMIN
543 BUGN==0 ;number of accumulated arguments
544 BUGNN==0 ;total number of arguments
545 BUGF==0 ;next thing not argument
548 IFN BUGF,[ ;Address of word to print
554 .ELSE [ ;Name of format in which to print?
555 IRPS FMT,,OCT DEC THOU CR UNUSED5 SIXBIT ASCIZ
558 BUGB==BUGB+<<.IRPCNT+1>_<<5-BUGNN>*3>>
561 IFE BUGF,[ ;Just a string to be printed
562 IFN BUGN,[ ;Say to output some arguments before this string
569 IFG BUGNN-6, .ERR MORE THAN 6 WORDS TO BE PRINTED IN BUG MACRO
570 ;Make bug table entry: length,,pc ? bits,,string ? args
571 IF1, BUGMC1 'ZZ==[ASCIZ|',,'|]'
576 BUGMC1 'BUGB,,[ASCIZ|',,'|]'
580 LBUGTB==LBUGTB+BUGNN+2
585 LBUGTB==0 ;Initialize length of bug table
587 ;This support macro appends a string to the middle argument of BUGMC1
589 BUGMC1 //,[DEFINE BUGMC1 *ZZ001*ZZ002*ZZ003*
590 ZZ001!ZZ002!]//,STRING!!ZZ003!TERMIN
593 ;This support macro appends a character, given by number, to the middle
595 ;Only for characters 0 through 7
597 IRPC C,,.QUOTE/
\0\ 1\ 2\ 3\ 4\ 5\ 6\a/
604 ;This one is a simple remote macro
606 BUGMC4 [DEFINE BUGMC4 ZZ001
611 SUBTTL DEFINE PI CHANNELS
613 LPTP==OLPTP+NLPTP+GLPTP ;ANY KIND OF LPT EXCEPT A TTY LPT
614 IFE NMTCS,[ ;IF NO MAG TAPES AT ALL
615 TM10A==0 ; CAN'T HAVE ANY KIND!
619 TM10P==TM10A+TM10B ;SOME KIND OF A TM10 MAGTAPE PRESENT
620 IFN TABP,TABCLK==0 ;1=>PUT TABLET ON CLOCK CHNL
622 ;PRIORITY INTERRUPT CHANNEL ASSIGNMENTS
624 DCLOC=40+2*DCCHN ;DC INTERRUPT LOCATION
625 IFN IMPP, IMPCHN==1 ;IMP STUFF
626 IFN NETP, NETCHN==2 ;SOFTWARE ACTIVATED...
627 UTCCHN==2 ;UTC CHANNEL
628 DSKCHN==UTCCHN ;2314 CHANNEL
629 MTCCHN==UTCCHN ;MAG TAPE CONTROL CHANNEL
630 LPTCHN==4 ;LINE PRINTER, PAPER TAPE, ETC. CHANNEL
631 TTYCHN==3 ;TTY CHANNEL
632 IFN PLTP, PLTCHN==4 ;PLOTTER CHANNEL
633 IFN PTRP, PCHCHN==4 ;PTP CHANNEL
634 IFN PTRP, PTRCHN==4 ;PAPER TAPE READER CHANNEL
635 IFN NTYP, NTYCHN==4 ;NTY 11 KLUDGE
636 IFN 340P, SDCHN==4 ;DISPLAY SPECIAL CHANNEL
637 IFN DSDP, DSDCHN==4 ;INTERRUPT FROM OTHER PROCESSOR
638 IFN ARMP, TIPBCH==5 ;ARM TIP BREAK CHNL
639 IFN OMXP, OMPCHN==5 ;OUTPUT MULTIPLEXOR
640 IFN VIDP, NVDCHN==5 ;NEW VIDI
641 IFN TABP, IFE TABCLK, TABCHN==5 ;TABLET
642 IFN 340P\E.SP, DISCHN==6 ;DISPLAY DATA CHNL
643 IFN CH10P, CHXCHN==5 ;CHAOSNET
644 ;WOULD BE 6 BUT PI 6 BROKEN IN ML-KA TTLIOB
645 IFN CH11P, CHXCHN==6 ;UNIBUS CHAOSNET PACKET COPYING
646 IFN TABP, IFN TABCLK, TABCHN==7 ;TABLET
647 APRCHN==7 ;DO NOT CHANGE
649 PIOFF==400 ;TURN OFF PI SYSTEM
650 PION==200 ;TURN ON PI SYSTEM
651 PICOFF==1200 ;TURN OFF PI CHANNEL
652 PICON==2200 ;TURN ON PI CHANNEL
653 PICIRQ==4200 ;REQUEST INTERRUPT ON PI CHANNEL
654 CLKON==2201 ;ABSOLUTE
656 IFN OMXP, OMXON==CLKON\<400_-OMPCHN-1>
657 IFN OMXP, OMXOFF==CLKOFF\<400_-OMPCHN-1>
658 LPTON==CLKON\<400_-LPTCHN-1>
659 LPTOFF==CLKOFF\<400_-LPTCHN-1>
660 IFN PTRP, PTPON==CLKON\<400_-PCHCHN-1>
661 IFN PTRP, PTROFF==CLKOFF\<400_-PCHCHN-1>
662 IFN PTRP, PTRON==CLKON\<400_-PTRCHN-1>
663 IFN PTRP, PTROFF==CLKOFF\<400_-PTRCHN-1>
664 TTYON==CLKON\<400_-TTYCHN-1>
665 TTYOFF==CLKOFF\<400_-TTYCHN-1>
666 UTCON==CLKON\<400_-UTCCHN-1>
667 UTCOFF==CLKOFF\<400_-UTCCHN-1>
668 IFN NETP, NETON==UTCON
669 IFN NETP, NETOFF==UTCOFF
670 IFN KL10P, DTEON==CLKON
671 IFN KL10P, DTEOFF==CLKOFF
673 DSKRQ==PICIRQ\PICON\<200_-DSKCHN> ;RQ INT + TURN ON FOR SAKE OF KL
674 MTCRQ==PICIRQ\PICON\<200_-MTCCHN>
675 UTCRQ==PICIRQ\PICON\<200_-UTCCHN>
676 TTYRQ==PICIRQ\PICON\<200_-TTYCHN>
677 CLKRQ==PICIRQ\PICON\<200_-APRCHN>
678 IFN NETP,NETRQ==PICIRQ\PION\<200_-NETCHN>
679 IFN CH11P,CHXRQ==PICIRQ\PICON\<200_-CHXCHN>
687 TABON==CLKON\<400_-TABCHN-1>
688 TABOFF==CLKOFF\<400_-TABCHN-1>
692 IFN NUNITS, IFE NEWDTP, CUINT==5000+UTCCHN ;CONO TO UTC TO ACTIVATE UTAPE INTERRUPT
694 PMLCAD==(.BP <PMRCM,,>) ;BYTE POINTER TO L.H. REAL CORE ADR
695 PMRCAD==(.BP PMRCM) ;BYTE POINTER TO R.H. REAL CORE ADR
697 SUBTTL DEFINE DEVICE CODES, IOBFT CHNL NUMBERS
699 IFN STKP, STK==70 ;STANFORD KEYBOARD
700 IFN OLPTP, OLPT==124 ;LINE PRINTER
702 IFN TM10P, MTC==340 ;MAG TAPE CONTROL
703 IFN TM10P, MTS==344 ;MAG TAPE STATUS
704 IFN VIDP, NVDX==620 ;NEW VIDI X
705 IFN VIDP, NVDY==624 ;NEW VIDI Y
706 IFN VIDP, NVDT==630 ;NEW VIDI T (DEFLECTION DELAY)
707 IFN PLTP, PLT==654 ;CAL COMP PLOTTER
708 IFN HCLKP, CLK1==710 ;HOLLOWAY CLOCK
709 IFN HCLKP, CLK2==714 ; "
710 IFN IMXP, MPX==574 ;INPUT MULTIPLEXOR
711 IFN OMXP, OMPX==570 ;OUTPUT MULTIPLEXOR
712 IFN TK10P\NTYP, NTY==600 ;KNIGHT TTY KLUDGE
714 IFN DL10P, DLB==60 ;DL10 BASE
715 .ALSO DLC==64 ;DL10 CONTROL
716 IFN PDCLKP, PDCLK==500 ;DE-CORIOLIS CLOCK (FOR ML-KA AND DM, CALENDAR CLOCK)
717 IFN DSDP, DSDEV==20 ;DE SELECTION AND INTER COM DEVICE
718 IFN DSDP, DSDEVN==24 ;DE SELECTION DEV (FOR DEVICES YOU DATAO DEV CODE TO DSDEVN)
719 IFN ARMP, TIPDEV==504 ;TIP BREAK DEVICE
720 IFN RBTCP, RBTCON==514 ;ROBOT CONSOLE
721 IFN DPKPP, DPK==604 ;DATA POINT KLUDGE
722 IFN DC10P, DC0==610 ;2314 DISK CONTROL
723 IFN DC10P, DC1==614 ;2314 DISK CONTROL
724 IFN RP10P, DPC==250 ;RP10 DISK CONTROL
725 IFN RH10P, DSK==270 ;RH10 DISK CONTROL
726 IFN KAIMP, IMP==460 ; AI-KA/ML-KA/MC-KL IMP interface
727 IFN DMIMP, FI==424 ; DM IMP hardware
736 ;IOBFT CHANNEL NUMBERS - 77 MEANS "FREE"
738 IFN NUNITS, NUTIC==8 ;NUMBER UT IN CHNLS
740 IFN NUNITS, NUTOC==8 ;NUMBER UT OUT CHNLS
742 NFCLC==NUTIC+NUTOC+1 ;# OF FIRST CORE LINK CHNL
743 NCLCH==14 ;NUMBER CORE LINK CHNLS
744 NFNETC==NFCLC+NCLCH ;# OF FIRST NCP NET CHNL (if any)
745 ;NNETCH DEFINED IN CONFIG
746 IFG NFNETC+NNETCH-77, .ERR TOO MANY IOBFT CHANNELS
748 SUBTTL RANDOM DEFINITIONS FOR I/O DEVICES
750 IFN DSDP, IFN VIDP, DSNVID==200000,, ;DEASSIGN BIT FOR NVD
751 IFN DSDP, IFN 340P, DSNDIS==4000,, ;DEASSIGN BIT FOR DIS
752 IFN DSDP, IFN NMTCS, DSMTC==1,, ;DEASSIGN BIT FOR MAG TAPE
754 IFN RBTCP, RLTSWC==17 ;ROBOT CONSOLE SELECT FOR LIGHTS AND SWITCHES
755 IFN RBTCP, IFN TABP, RTABC==16 ;ROBOT CONSOLE SELECT FOR TABLET
757 IFN IMXP, LCHN==177 ;MULTIPLEXOR LIMIT ON READ IN
759 NUDCH==14 ;NUMBER DIRECTORY CHNLS
760 IFN IMXP, NPOTCH==20. ;NUMBER POT CHANNELS
761 IFG NQCHN+1+NQS-77, .ERR MORE THAN 6 BITS OF DISK CHANNEL NUMBER
763 IFN CODP, CODBFL==5 ;CODE BUFFER
764 IFN PTRP, PUNSIZ==20 ;PTP BUF SIZ
765 IFN PTRP, REDSIZ==200 ;PTR BUF SIZ
766 IFN PLTP, LPLBUF==200 ;PLT BUF SIZ
767 IFN LPTP, LPTBSZ==1000 ;LPT BUF SIZ
768 IFN VIDP, NVDLNG==340 ;NVD BUF SIZE
769 IFN TPLP, TPLBSZ==100 ;TPL BUFFER SIZE IN SYS JOB
770 IFN TABP, LTABBF==100 ;TABLET BUFFER
771 IFN N11TYS, TT11CR==764044 ;UNIBUS ADR OF TV11 CONSOLE REG
773 EOFCH==3 ;SYSTEM END OF FILE CHR
774 EOFWRD=REPEAT 5,[EOFCH_<.RPCNT*7+1>\]0 ;WORD OF EOFCH'S
776 IFN 340P, DVEF==4000 ;DISPLAY VERTICAL EDGE FLAG
777 IFN 340P, DHEF==1000 ;DISPLAY HOR EDGE FLAG
779 IFN 340P, EWRT==400./12. ;EQIV "COST" IN DISPLAY WRDS FOR TRIP THRU RECYC
780 IFN 340P, MDISWD=70000 ;MAX # WDS SENT TO SCOPE IN 1/2 SEC
782 NSWPV==E.SP\340P+VIDP+IMXP ;# OF DEVICES THAT CAN SWAPIN PAGES
785 IFN NMTCS, MAGLOC==76 ;INTERRUPT LOCS FOR MAGTAPE
786 IFN NUNITS, DCMLOC==74 ;" " FOR DC
787 IFN IMXP, IMXLC==66 ;" " IMX
789 IMPILC==70 ;INPUT FROM IMP
790 IMPOLC==72 ;OUTPUT TO IMP
795 IFN NMTCS, MAGLOC==42
796 IFN NUNITS, DCMLOC==42
799 ;PLOTTER CONTROL BITS
811 SUBTTL STUFF PECULIAR TO KA-10 PROCESSOR
813 ;;;PAGING BOX INSTRUCTIONS
815 LPM=102000,, ;LOAD PG MEM STATE VECTOR DONT CLR ASSOC MEM
816 LPMR= LPM 2, ;CLEAR ASSOC MEM AND LOAD
817 SPM= LPM 1, ;STORE PG MEM STATE VECTOR
818 LPMRI=LPM 6, ;LOAD PM, CLEAR ASSOC REG, AND CAUSE INTERRUPT
819 EXPGNG==4 .SEE UPQUAN ;4 TO TURN ON EXEC PAGING
820 XCTR=103000,, ;EXECUTE INSTRUCTION WITH MAPPING CONTROLLED BY AC FIELD
821 ;VIOLATION CAUSES USER MEM PROTECT INTERRUPT UNLESS INHIBITED
822 ;VIOLATION ALSO SKIPS BUT THIS IS OF NO CONSEQUENCE UNLESS
823 ;INTERRUPT IS INHIBITED SINCE PC WILL BE RESET FROM OPC
824 XCTRI= XCTR 4, ;XCTR WITH PAGE FAULT INHIBITED (SKIPS ON FAULT)
825 ; AC FIELD VALUES FOR XCTR AND XCTRI
826 XR==1 ;MAP READ MAIN OPERAND OF SIMPLE INSTRUCTION (MOVE, SKIPL, HLL)
827 XW==2 ;MAP WRITE MAIN OPERAND OF SIMPLE INSTRUCTION (MOVEM)
828 XRW==3 ;MAP READ/WRITE OPERAND OF SIMPLE INSTRUCTION (E.G. IORM)
829 XBYTE==3;MAP BYTE DATA AND BYTE POINTER (ILDB, IDPB)
831 XBW==2 ;MAP BLT WRITE
832 XBRW==3 ;MAP BOTH OPERANDS OF BLT
833 ;KA10 PAGING BOX GOES BY WHETHER IT'S A READ OR WRITE (OR RW) CYCLE
834 ;KL10 PAGING BOX WORKS DIFFERENTLY (SEE BELOW)
835 ;DO NOT USE MULTI-OPERAND INSTRUCTIONS (DMOVE, PUSH, ETC.) WITH XCTR
837 DEFINE CLRPGM U ;CLEAR PAGER ASSOCIATIVE MEMORY. ARG IS USUALLY "(U)".
838 SPM UPGML!U ;STORE SO DON'T LOSE QUANTUM TIMER
842 ;;; MISCELLANEOUS BUILTIN I/O DEVICES
844 PI==4 ;INTERRUPT SYSTEM
845 LIGHTS==PI ;DEVICE CODE FOR DATAO THAT SETS CONSOLE LIGHTS.
846 CLK==0 ;DEVICE CODE FOR 60 HZ CLOCK INTERRUPT (APR)
847 CLKINT==1000 ;CONI CLK, BIT FOR INTERRUPT. ALSO CONO BIT TO CLEAR.
848 PTR==104 ;PAPER TAPE READER
849 PTP==100 ;PAPER TAPE PUNCH
850 TTY==120 ;CONSOLE TTY
851 DTC==320 ;DECTAPE CONTROL
852 IFN 340P, DIS==130 ;340 DISPLAY
854 PI0LOC==40 ;INTERRUPT VECTOR BASE
856 OIPBIT==%PC1PR ;PC BITS FOR 1-PROCEED.
857 BADPC==%PCUIO+%PCSPC+37 ;BITS IN PC USER NOT ALLOWED TO TURN ON
859 DEFINE UUOH ;UUO HANDLER LOCATIONMS ARE REFERENCED THROUGH THESE MACROS
865 DEFINE SYSCTX ;SET UUO LEVEL AC BLOCKS
868 DEFINE USRCTX ;SET USER-MODE AC BLOCKS
871 DEFINE OVHMTR NAME ;OVERHEAD METERING DOESN'T WORK ON KA'S
876 SUBTTL STUFF PECULIAR TO KL-10 PROCESSOR
878 ;;;PAGING BOX INSTRUCTIONS
880 XCTR=074000,, ;EXECUTE INSTRUCTION WITH MAPPING, PAGE FAILS ENABLED
881 XCTRI=075000,, ;SAME BUT SKIPS IF THERE IS PAGE FAIL (DONE SNEAKILY BY SOFTWARE)
882 LPMR=076000,, ;LOAD PAGER MEMORY (JPC, DBRS) AND CLEAR PT DIR
883 SPM=077000,, ;STORE PAGER MEMORY
884 ;AC FIELD VALUES FOR XCTR AND XCTRI
885 XR==4 ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING)
886 XW==4 ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR WRITING)
887 XRW==4 ;MAP MAIN OPERAND OF SIMPLE INSTRUCTION (FOR READING AND WRITING)
888 XBYTE==5;MAP BYTE DATA AND BYTE POINTER
889 XBR==1 ;MAP BLT SOURCE
890 XBW==4 ;MAP BLT DESTINATION
891 XBRW==5 ;MAP BOTH BLT OPERANDS
892 XEA==16 ;MAP EFFECTIVE ADDRESS COMPUTATION
893 ;IN KL10 BITS ARE: 14 INDIRECT WORDS
894 ; 10 XR UNDER SOME RANDOM WIERD CONDITIONS (?)
895 ; 4 MAIN OPERAND " " " ALSO BYTE WRITE
896 ; 2 INDEX REGISTER, @ AND XR IN BYTE PTRS
897 ; 1 2ND OPND - BLT SOURCE, BYTE READ, STACK DATA
899 DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS. ARG IS USUALLY "(U)".
900 CONO PAG,660000+<EPT/1000>
903 ;;; INTERNAL "I/O" DEVICES
905 PI==4 ;INTERRUPT SYSTEM
906 PAG==10 ;CONO, DATAO PAG SET UP PAGING
908 CCA==14 ;CACHE OPERATIONS
909 TIM==20 ;TIMER DEVICE
910 MTR==24 ;METERS DEVICE
912 IFN PDCLKP,[ ;IF THIS KL-10 HAS FREEMAN KL-UDGE BOARD,
913 LIGHTS==500 ;DATAO LIGHTS, SETS CONSOLE LIGHTS.
914 CLK==500 ;60 HZ CLOCK INTERRUPT (ON KL-UDGE BOARD)
915 CLKINT==10 ;CONI CLK, BIT FOR INTERRUPT. ALSO CONO BIT TO CLEAR.
916 ;ALSO DATAI 500, IS THE DECORIOLIS CLOCK.
917 ;AND CONO 500,400000 TURNS CLOCK BACK ON AFTER POWER FAIL.
920 OIPBIT==%PS1PR ;1-PROCEED BITS IN THE PC.
921 BADPC==%PSUIO+37 ;%PSPUB IS OK?
923 ;;; SPECIAL INSTRUCTIONS
925 SWPIA=DATAI CCA, ;INVALIDATE WHOLE CACHE
926 SWPIO=CONI CCA, ;INVALIDATE ONE PAGE OF CACHE
927 SWPUO=CONSO CCA, ;UNLOAD ONE PAGE OF CACHE
928 SWPUA=DATAO CCA, ;UNLOAD WHOLE CACHE
929 WRPAE=702100,, ;WRITE PERFORMANCE-COUNTER ENABLES
930 APRID==BLKI ;READ CPU SERIAL NUMBER AND OPTIONS
931 RDERA=BLKI PI, ;READ ERROR ADDRESS
932 RCCL=DATAI TIM, ;READ CALENDAR CLOCK (DOUBLE WORD)
933 RPERFC=BLKI TIM, ;READ PERFORMANCE COUNTER (DOUBLE WORD)
934 REBOXC=DATAI MTR, ;READ EBOX CYCLE COUNTER (DOUBLE WORD)
935 RMBOXC=BLKI MTR, ;READ MBOX CYCLE COUNTER (DOUBLE WORD)
941 ;;;PAGE FAIL WORD - UPFW(U)
944 %PFUSR==400000 ;USER PAGE
945 %PFCOD==370000 ;FAILURE CODE:
946 %PFPRO==210000 ;PROPRIETARY VIOLATION
947 %PFMAR==230000 ;MAR BREAK
948 %PFILW==240000 ;ILLEGAL WRITE IN READ ONLY
949 %PFPNA==330000 ;PAGE NO ACCESS
950 %PFPTP==250000 ;PAGE TABLE PARITY
951 %PFPAR==360000 ;PARITY ERROR, DATA IN AR
952 %PFPRX==370000 ;PARITY ERROR, DATA IN ARX
953 %PFPUB==4000 ;PUBLIC PAGE
956 $PFPNO==121000 ;VIRTUAL PAGE NUMBER
957 ;1.1-3.5 VIRTUAL ADDRESS
959 DEFINE UUOH ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS
965 ;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR) OLDACS,
966 ; UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME FOR UPT.
967 ; DISABLE, IF NONBLANK, CAUSES ACCOUNTING UPDATING NOT TO BE DONE EVEN THOUGH
969 DEFINE SPCCTX CURACS,OLDACS,UPT,DISABLE
970 DATAO PAG,[IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+2^13+CURACS_33+OLDACS_30+UPT/1000+400000-IFNB UPT,[IFB DISABLE,[400000]]]
973 SYSCTX=SPCCTX 0,1 ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1.
974 USRCTX=SPCCTX 1,1 ;USERS RUN IN BLOCK 1.
976 AC!N!CTX=SPCCTX 0,N ;CUR AC 0, PREV N. USE XCTR TO ACCESS SPECIAL ACS
980 ; 0 ACCUMULATORS FOR SYSTEM (AT UUO LEVEL)
981 ; 1 ACCUMULATORS FOR USER
982 ; 2 USED TEMPORARILY BY TTY INPUT INTERRUPTS
984 ; BLOCKS 2 & 3 ARE USED BY THE UNFINISHED MUSIC MICROCODE
985 ; BLOCKS 4 & 5 ARE USED BY THE UNFINISHED JPC RING FEATURE
986 ; 6-7 USED BY MICROCODE
990 SUBTTL STUFF PECULIAR TO THE KS-10 PROCESSOR
992 EPT==:0 ; This MUST agree with the Salvager!
996 DEFINE CLRPGM U ;CLEAR PT DIR WITHOUT SWITCHING USERS. ARG IS USUALLY "(U)".
997 WREBR 20000+<EPT/1000>
1000 OIPBIT==1000 ;BIT 8 (SYMBOLIC NAME %PSINH)
1001 BADPC==%PSUIO+37 ;BITS IN PC THAT USER CANNOT TURN ON
1003 DEFINE UUOH ;UUO HANDLER LOCATIONS REFERENCED THROUGH THESE MACROS
1009 ;SET SPECIAL CONTEXT: CURRENT AC BLOCK CURACS, PREVIOUS BLOCK (FOR XCTR)
1010 ; OLDACS, UPT AS SPECIFIED. IF NO ACS SPECIFIED, THEY DON'T CHANGE; SAME
1012 DEFINE SPCCTX CURACS,OLDACS,UPT
1013 WRUBR [IFNB CURACS OLDACS,[SETZ]+IFNB UPT,[1^13]+CURACS_33+OLDACS_30+UPT]
1016 SYSCTX=SPCCTX 0,1 ;UUO LEVEL CONTEXT: CURRENT AC BLOCK 0, PREVIOUS = 1.
1017 USRCTX=SPCCTX 1,1 ;USERS RUN IN BLOCK 1.
1019 AC!N!CTX=SPCCTX 0,N ;CUR AC 0, PREV N. USE XCTR TO ACCESS SPECIAL ACS
1023 ; 0 ACCUMULATORS FOR SYSTEM (AT UUO LEVEL)
1024 ; 1 ACCUMULATORS FOR USER
1025 ; 2 USED TEMPORARILY BY TTY INPUT INTERRUPTS
1027 ; 7 USED BY MICROCODE (AC0 GETS BAD DATA WHEN MEMORY ERROR OCCURS, THIS
1028 ; COULD BE FIXED IF ANYONE THINKS IT IS WORTH IT...)
1031 IFE KS10P,[ ; For the benefit of processors without UMOVE and UMOVEM.
1033 DEFINE UMOVE (AC,ADDR)
1034 XCTR XR,[MOVE AC,ADDR]
1037 DEFINE UMOVEM (AC,ADDR)
1038 XCTR XW,[MOVEM AC,ADDR]
1043 SUBTTL SYS IOC STATUS WORD FORMAT
1045 ;RIGHT HALF WORD DEVICE STATUS
1046 ;1.1-1.6 SYS PHYSICAL DEVICE CODE
1048 ;2.1 SYS BUFF CAP FULL
1050 ;2.9-2.3 DEVICE DEPENDANT
1052 ;LEFT HALF WORD CHANNEL STATUS
1053 ;3.6-3.1 SET BY OPENS THAT DONT SKIP
1054 ;4.5-3.7 SET BY IOC ERRORS (INTERRUPTS) AT IOT OR OPER TIME
1055 ;3.9-3.7 ARE FOR 340 OR E&S ERRORS
1056 ;4.5-4.1 ARE FOR OTHER DEVICES
1057 ;A LIST OF ERROR CODES FOR OPEN FAILURES ARE IN THE FILE BITS.
1059 NDOPL==7 ;NUM OF DIS OPNL
1061 ;4.5-3.7 SET BY IOC ERRORS AT IOT OR OPER TIME
1063 ;3.9-3.7 SET BY 340 ROUTINES
1064 ;1 ILLEGAL SCOPE MODE
1066 ;3 MORE THAN 1K SYS SCOPE BUF
1069 ;6 MEMORY PROTECT ON PDL POINTER
1070 ;7 ILLEGAL PARAMETER SET
1074 ;13 DIRECTORY'S ALLOCATION EXHAUSTED
1076 ;11 ILLEGAL CHR AFTER ^P ON TTY DISPLAY
1077 ;10 CHNL IN ILLEGAL MODE WHEN .IOT ATTEMPTED
1080 ;7 USR OP CHNL DOES NOT HAVE USR OPEN
1081 ;6 ATTEMPT TO OVER IOPUSH
1082 ;5 ATTEMPT TO OVER IOPOP
1083 ;4 NON-EXISTANT SUB DEVICE
1084 ;3 NON-RECOVERABLE DATA ERROR ;NON-EX-MEM ON PDP6 REF
1086 ;1 DEVICE HUNG OR REPORTING NON-DATA ERROR
1088 MIOTER==1 ;LOWEST IOCERR CODE USED
1089 NIOTER==13. ;NUMBER " "
1091 ;4.9-4.5 ALWAYS ZERO (USED BY IOPUSH FOR CHNL NUM)
1093 ;SYS PERIPHERAL DEVICE CODES
1095 ;1.6 INDICATES DIRECTORY DEVICE
1096 ;1.5 INDICATES NON PHYSICAL DEVICE
1099 SNTDS==2 ;TERMINAL DISPLAY
1100 SNLPD==3 ;DATA PRODUCTS LPT
1108 SN340==13 ;340 AS ASCII DEVICE
1109 ;SN340I==14 ;INTERPRETED DISPLAY ON 340
1111 SNCOD==16 ;CODE DEVICE
1118 SNNET==26 ; Arpanet NCP
1119 SNLPV==27 ;VOGUE LPT
1120 SNSTK==30 ;STANFORD KEYBOARD
1121 SNMSP==31 ;CROCK "IPC" FOR NOW
1122 IFN CHAOSP,SNCHA==32 ;CHAOS NET
1123 IFN TCPP,SNTCP==33 ; Internet TCP/IP network device
1124 SNTRAP==34 ;TRAP "DEVICE"
1125 IFN INETP,SNIPQ==35 ; Internet Queue
1130 SNCLK==62 ;CLO, CLU, & CLI
1133 SNDIRH==65 ;DIRHNG "DEVICE"
1135 SUBTTL SYSTEM VERSION NUMBER & MISC MACROS
1137 ITSMCH==:<MNAME SIXBIT/,/> ; Define SIXBIT machine name symbol
1138 ITSVRS==:.FNAM2 ; Preserve SIXBIT symbol value of ITS version #
1139 FNM==ITSVRS ;SRI GETS VERSION NUMBER
1140 ;WORKS FOR DECIMAL IGNORES LOW ORDER NON-NUMERIC CHRS
1144 IFGE ZZZQ-'0,IFLE ZZZQ-'9,.GO BAR
1165 ZZZ==10 ;SAVE OLD RADIX
1167 MOVEI I,[MNAME [.ASCII ?
1172 ;"MONTHS OF THE YEAR" MACRO
1175 IRPS M,,[JAN:FEB:MAR:APR:
1177 SEP:OCT:NOV:DEC:]L,,[31. 29. 31. 30.
1184 FOO==-1 ;ACCUMULATED VALUE FOR FOLLOWING DEFINITION:
1187 FOO==FOO+L] ;JAN=-1, FEB=30., MAR=59., ETC.
1198 SSYS==0 ;LENGTH OF SYS CODE
1201 IFN CKPAR,.ERR LOSS AT EBLK
1203 IFE .-CKZZ,.STOP ;NO WORDS BETWEEN BBLK AND EBLK
1204 CONC CK,\CKNUM,==CKZZ-.,,CKZZ
1211 IFE CKPAR,.ERR LOSS AT BBLK
1219 ;INSERT CALL TO THIS MACRO AT ANY PLACE IT IS POSSIBLE TO PCLSR
1220 ;(IF IT IS DESIRED FOR PCLSR TEST FEATURE TO TEST THAT SECTION)
1242 JRST 4,. ;PI 2 NOT OFF AND NOT IN PROGRESS
1245 SUBTTL DEFINE EXEC PAGES
1254 .!X==220000*ZZQ+2200,,ZZQQ
1257 ;EXEC MAP ASSIGNMENTS
1259 EXECPG 340P1, ;USED TO FETCH + TRACE 340 PNTRS
1261 REPEAT N340PB,CONC [EXECPG DPG]\.RPCNT,; ;DATA AREA PNTRS FOR 340 DATA
1263 EXECPG CORJF, ;CORE JOB FROM PAGE
1264 EXECPG CORJT, ;CORE JOB TO PAGE
1266 EXECPG VSB1, ;.VSCAN B1
1267 EXECPG VSB2, ;.VSCAN B2
1270 EXECPG T11CP, ;TEN11 CONTROL PAGE
1272 EXECPG PAREP, ;USED BY SYSTEM IN ITS DILIGENT EFFORTS TO FIX PARITY ERRORS
1274 IFN ECCMEM, EXECPG ECCPG, ;PAGE USED TO ACCESS ECC HISTORY
1277 EXECPG XGPC, ;LOW 2K OF XGP PDP-11 (USED TO TRACE BUFF POINTERS)
1278 EXECPG XGPB, ;2K BUFFER IN PDP-11 (CHANGES LOCATION)
1279 EXECPG XGPUB, ;XGP USER CORE EXEC PG SETUP TO POINT TO USER CORE DURING XGPIM SYSTEM CALL
1282 REPEAT NTTPG,[CONC [EXECPG TTPG]\.RPCNT,
1284 REPEAT NTVBP,[CONC [EXECPG TTR]\.RPCNT,
1286 IFN CHAOSP,[ IFN T11CHP,[
1287 EXECPG CHSPG ;CHAOS NET 10-11 COMMUNICATION PAGE
1288 T11CHS=400000+CHSPG*2000
1290 ;^ INSERT NEW EXEC PAGES HERE
1291 ;EXEC PAGES BELOW THIS POINT WILL BE COPYABLE BY USERS
1292 REPEAT NMMP,CONC [EXECPG MMP]\.RPCNT,; ;MMP TABLE
1293 MMP=MMP0*2000+400000 ;VIRTUAL ADDRESS OF MMP
1295 NEXPGS==EXPGN ;# EXEC PGS USED
1299 .YSTGWD ;STORAGE WORDS OKAY NOW
1301 IFN KL10P, LOC EPT+1000 ;KL needs a full DEC page for EPT
1303 IFE KSIMP, LOC EPT+1000 ;KS needs a full DEC page, too,
1304 IFN KSIMP, LOC EPT+2000 ; unless you are losing even worse.
1312 LOC 30 ; 8080 communications area
1321 IFE RP10P+RH10P,BBLK
1336 E.SPM ;POINTER , NEVER CHANGES
1345 IFN KA10P, JSR UUOH ;UUO TRAP
1346 IFE KA10P, JSR LUUOEX ;USER UUO IN EXEC MODE (ERROR)
1350 REPEAT 6*2, JSR RINT ;INITIALIZE ANY UNUSED PI LOCNS
1353 IFN KA10P, JSR 60H ;60 TRAP
1354 IFN C1MXP, REPEAT 2*7., JSR RINT1 ;INITIALIZE C1MPX LOCNS
1357 JSR CLKBRK ;PROCESSOR OR CLOCK INTERRUPT
1361 JSR LPTBRK ;LPT,DISPLAY,PTP,PTR,OTHER PROCESSOR
1362 IFN 340P, JSR DRECYC ;HACK HACK
1365 JSR TTYBRK ;TTY,DATAPOINT KLUDGE
1369 JSR UTCBRK ;MICRO TAPE OR DISK (S)
1379 JSR DIGNOR ;340 DISPLAY BLKO GETS PATCHED IN HERE
1380 CONO PI,4000+200_<-SDCHN> ;HACK HACK
1390 JSR OMPXBK ;OUTPUT MPXR, NVID, ETC.
1406 PFOPC: 0 ;PAGE FAIL OLD PC STORED HERE
1407 PFNPC: PFAIL ;WHERE TO GO FOR PAGE FAIL
1410 EPTDIA: JRST SALV ;STD COMMAND START ADDRESS ("DIAGNOSTIC")
1411 EPTDDT: JRST DDT ;DDT COMMAND START ADDRESS
1412 EPTSTL: JRST DSKDMP ;STL COMMAND START ADDRESS ("LOADER")
1413 EPTITS: JRST BEG ;STM COMMAND START ADDRESS ("MONITOR")
1416 EPTTR1: CAI ;ARITH OVERFLOW EXEC MODE IGNORED
1417 EPTTR2: JSR ILLTRP ;PDL OVERFLOW EXEC MODE IS AN ERROR
1418 EPTTR3: JSR ILLTRP ;ONE PROC CODE?
1421 DTEBPO: 0 ;BYTE TRANSFER NOT USED
1422 DTEBPI: 0 ;BYTE TRANSFER NOT USED
1423 DTELOC: ;INTERRUPT FROM CONSOLE 11
1424 IFE PDCLKP, JSR DTEBRK ;IF USING 11 FOR CLOCK, FIRST CHECK FOR CLOCK INTR
1425 .ELSE JSR TTYBRK ;OTHERWISE JUST USING 11 FOR TTYS.
1427 DTEPRO: 0 ;NO PROTECTED EXAMINES
1429 DTEPRI: 0 ;NOR PROTECTED DEPOSITS
1433 REPEAT 8,MUUOEX ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1436 EPTEBC: 0 ? 0 ;EBOX COUNT FOR PROC BRK ROUTINES AND NULL JOB
1437 EPTMBC: 0 ? 0 ;MBOX DITTO
1440 JSR OVHBRK ;INTERVAL TIMER INTERRUPT, EVERY 39 MILLISEC ON CHANNEL 1
1442 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1443 ;ON KL10 OVHBRK CHECKS WHERE THE PC IS IF IT IS IN EXEC MODE.
1445 DEFINE OVHMTR NAME ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1446 OVHMT1 NAME,\. ;EVALUATE "." AT THIS POINT IN TIME
1450 DEFINE OVHMT1 NAME,POINT
1451 OVHTAB [DEFINE OVHTAB FOO
1452 FOO] <(SIXBIT/NAME/)>,,POINT ? 0
1456 ;THIS IS THE CORRESPONDING REMOTE MACRO
1465 UBAQIB ; Pointer to interrupt table for Unibus Q (dsk)
1468 UBAIIB ; Pointer to interrupt table for Unibus I (other)
1471 EPTPFW: 0 ; Page fail word
1472 EPTPFO: 0 ; Page fail old PC
1473 EPTPFN: PFAIL ; Page fail new PC
1475 IRP I,,[1,2,3,4,5,6,7]
1477 EPTP!I!W: 0 ; Page fail word
1478 EPTP!I!O: 0 ; Page fail old PC
1479 EPTP!I!N: PF!I!AIL ; Page fail new PC at PI level I
1483 EPTTR1: CAI ;ARITH OVERFLOW EXEC MODE IGNORED
1484 EPTTR2: JSR ILLTRP ;PDL OVERFLOW EXEC MODE IS AN ERROR
1485 EPTTR3: JSR ILLTRP ;TRAP 3 SHOULD NOT HAPPEN
1488 EPT1PO: 0 ;ONE-PROCEED OLD-PC
1489 EPT1PN: MUUOEX ;ONE-PROCEED SHOULD NOT HAPPEN IN UPT=EPT MODE
1492 EPTUEN: MUUOEX ;HALT IF UUO IN PROCESSOR BREAK ROUTINES
1499 ;Here because with EPT at 0, this is the second half of physical
1500 ; page 0, which is uncached, which we want, and otherwise unused.
1502 LOC EPT+1000 ; IMP data reformatting buffers
1508 ;OVHMTR MACRO IS USED TO CONSTRUCT TABLE OF AREAS OF EXEC CORE TO BE METERED
1509 ;ON KS10 PC SAMPLING FACILITY IS USED, 60-CYCLE CLOCK COLLECTS THAT DATA
1510 ;NOTE THAT THE TABLE FORMAT IS NOT THE SAME AS ON KL10, FOR SPEED REASONS
1512 DEFINE OVHMTR NAME ;NAME IS 3 CHARACTERS NAMING THE REGION THAT BEGINS HERE
1513 OVHMT1 NAME,\. ;EVALUATE "." AT THIS POINT IN TIME
1517 DEFINE OVHMT1 NAME,POINT
1518 OVHTAB [DEFINE OVHTAB FOO
1519 FOO] POINT,,<(SIXBIT/NAME/)>
1523 ;THIS IS THE CORRESPONDING REMOTE MACRO
1529 IFN DL10P,[ ;DL10 COMMUNICATIONS AREA IN NON-ENCACHED LOW CORE
1530 IFN KL10P, LOC 500 ;500-777 RESERVED FOR DL10 AREA AND BUFFERS
1531 IFN KA10P, LOC 100 ;IF KA10, PUT DL10 AREA JUST BELOW START OF SYSTEM
1532 IFN KS10P, .ERR DL10 on KS10 system?
1534 DL10AR: JSR TTYBRK ;INTERRUPT INSTRUCTION (NOT ACTUALLY USED)
1536 ;FOLLOWING LOCATIONS MUST AGREE WITH IOELEVEN PROGRAM
1538 DL10VR: NDLTYS_8+NFDLTY ;"I/O VERSION NUMBER"
1539 DL10UP: 0 ;INCREMENTED BY -11 EVERY 1/60 SECOND.
1540 ;SETOM'ED BY 10 EVERY 1/2 SECOND. DETECTS UP/DOWNNESS.
1542 DL10SO: 0 ;LINE # TO SET OUTPUT DONE FOR, SET BY -10, CLEARED BY -11.
1544 DL10IL: 0 ;LINE # WITH INPUT AVAILABLE. CLEARED BY -10 AFTER CHAR READ.
1545 DL10IC: 0 ;CHARACTER RECEIVED FROM THAT LINE.
1547 DL10OD: 0 ;LINE # WITH OUTPUT DONE. CLEARED BY -10 WHEN PROCESSED.
1548 DL10BS: 0 ;BUFFER SIZE FOR THAT LINE.
1550 DL10BP: 0 ;WIERD DL10 BYTE POINTER TO TTY OUTPUT BUFFER.
1551 DL10CC: 0 ;NUMBER OF CHARACTERS BEING OUTPUT TO TTY.
1552 DL10LN: 0 ;LINE # OUTPUT BEING SENT TO. CLEARED BY -11 WHEN GOBBLED.
1554 DL10CL: 0 ;DIALUP LINE CONNECT OR DISCONNECT INFO. SET BY 11, 0'D BY 10.
1555 ;0000NN => LINE # NN DISCONNECTED.
1556 ;01RTNN => LINE # NN CONNECTED, %TTISP=R, %TTOSP=T.
1558 DL10PL: 0 ;LINE # TO SET PARAMETERS OF. CLEARED BY -11 WHEN PROCESSED.
1559 DL10PR: 0 ;VALUE OF DH11 LPR REGISTER.
1560 DL10PS: 0 ;NUMBER OF BYTES OF OUTPUT BUFFERING DESIRED.
1562 DL10XD: 0 ;1=EXAMINE -11 CORE, 2=DEPOSIT. CLEARED BY -11 WHEN DONE.
1563 DL10XA: 0 ;EXAMINE/DEPOSIT ADDRESS
1564 DL10XW: 0 ;EXAMINE/DEPOSIT WORD
1566 GLPTBP: 0 ;BYTE POINTER TO BUFFER FOR GOULD LPT
1567 GLPTBC: 0 ;BYTE COUNT " " - IF NONZERO BUFFER IS ACTIVE BY PDP11.
1568 GLPTER: 0 ;NONZERO => PDP11 CLAIMS PRINTER IS BROKEN.
1569 GLPGRF: 0 ;NONZERO => GRAPHICS MODE (SET BY 10).
1571 ;CHAOS NET SHARED VARIABLES
1572 DLCINI: 1 ;THE COMMENTS ARE IN THE CHAOS FILE
1584 DLXEND:: ;END OF ASSIGNED DL10 AREA
1586 IFG .-DL10AR-100, .ERR DL-10 AREA TOO BIG, CHANGE CONO IN TSS INITIALIZATION
1587 LOC DL10AR+100 ;SKIP OVER 11-ACCESSIBLE AREA
1589 DL10BF: BLOCK <261.+3>/4 ;OUTPUT BUFFER, 8-BIT BYTES. HAS TO BE NON-ENCACHED.
1592 GLPBSZ==255. ;BUFFER SIZE IN WORDS. MAXIMUM POSSIBLE WITHOUT MODIFYING (ELIMINATING)
1593 ;"WORD COUNT" HARDWARE IN DL-10.
1594 GLPMPP: 0 ;MAIN PROGRAM POINTER - IF NONZERO BUFFER IS ACTIVE BY M.P. LEVEL (PDP10)
1595 GLPMPC: 0 ;MAIN PROGRAM COUNTER
1596 GLPTBF: BLOCK GLPBSZ ;ONE BUFFER FOR NOW
1599 IFN KL10P, IFG .-1000,.ERR DL10 STORAGE TOO BIG, DOESN'T FIT IN UNENCACHED PAGE
1600 IFN KA10P, PATB=. ;MOVE ORIGIN OF SYSTEM UP
1603 IFN NETYS,[ ;ASSEMBLE DTE20 CONTROL AREA
1604 IFE KL10P, .ERR DTE20 WITHOUT KL10?
1607 DTEVER: NETYS_8+NFETY ;400 I/O VERSION NUMBER, SET BY 10, CHECKED BY 11
1609 DTECHK: 0 ;401 INCREMENTED BY 11 60 TIMES PER SECOND
1610 ;SETOMED BY 10 EVERY HALF SECOND.
1611 ;USED TO TELL 11 THAT 10 IS UP.
1613 DTEINP: -1 ;402 -1 IF IDLE, ELSE INPUT REQUEST FROM 10 TO 11
1614 ;SETUP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING THIS.
1615 ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES HERE
1616 DTEOUT: -1 ;403 -1 IF IDLE, ELSE OUTPUT REQUEST FROM 10 TO 11
1617 ;SETUP DTEBPO IN EPT BEFORE SETTING THIS.
1618 ;CONTENTS OF DTEINP AND DTEOUT ARE DESCRIBED BELOW.
1619 ;THESE ARE SET BY THE 10, SETOMED BY 11 WHEN TRANSFER STARTS.
1620 ;RH # BYTES EXPECTED. LH COMMAND+LINE#. COMMANDS ARE:
1621 %DCTYO==1000 ;TELETYPE OUTPUT (NOTE 4.1=0 INPUT, =1 OUTPUT)
1622 %DCETI==2000 ;ETHERNET INPUT (N.Y.I.)
1623 %DCETO==3000 ;ETHERNET OUTPUT (N.Y.I.)
1625 DTELSP: -1 ;404 LINE # WHOSE SPEED IS TO BE SET, SET BY 10, SETOMED BY 11
1626 DTELPR: -1 ;405 CORRESPONDING DH11 LINE PARAMETER REGISTER,,BUFFER SIZE
1628 DTEOST: -1 ;406 LINE# TO START OUTPUT ON (SET OUTPUT DONE).
1629 ;SET BY 10, SETOMED BY 11
1631 BLOCK 1 ;407 NOT USED
1633 DTETYI: -1 ;410 TELETYPE INPUT. SET BY 11, SETOMED BY 10.
1634 ;LH LINE#,,RH CHAR RCVED.
1636 DTEODN: -1 ;411 TELETYPE OUTPUT DONE. SET BY 11, SETOMED BY 10.
1637 ;LH LINE#,,RH BUFFER SIZE.
1639 DTEHNG: -1 ;412 HANGUP/DIALIN WORD. SET BY 11, SETOMED BY 10.
1640 ;0000NN LINE # NN HUNG UP.
1641 ;01RTNN LINE # NN HAS SPEED RCV=R, XMT=T (CODES AS IN TTYTYP)
1643 ;^ ADD MORE LOCATIONS HERE, NOT TO EXCEED 437
1645 ;LOCATIONS 440-457 ARE KNOWN ABOUT BY BOTH IOELEV AND KLDCP,
1646 ;USED MOSTLY FOR NON-TIMESHARING PROGRAMS.
1651 ;FOR VARIABLES (MONITORABLE WITH KEYS)
1652 NSKED: 0 ;# TIMES NON-NULL JOB IS RUN
1653 NNSKED: 0 ;# TIMES NULL JOB IS RUN
1654 NRSKED: 0 ;# OF FULL SCHEDULES (MUST SCAN ALL JOBS)
1655 NSSKED: 0 ;# OF SCHEDULES SAVED BY SCHBLN FEATURE.
1656 NRESKED:0 ;# TIMES A JOB SCHEDULED JUST AFTER IT RAN.
1657 NSCHDU: 0 ;TOTAL NUMBER OF JOBS FOUND RUNNABLE IN FULL SCHEDULES
1658 NNULBK: 0 ;# OF CONSECUTIVE BLOCKS OF NULLTIME.
1659 NUINT: 0 ;# TIMES USER GIVEN INTERRUPT
1660 NAUINT: 0 ;# ATTEMPTED USER INT (POSSIBLY UNSUCCESSFUL DUE TO PG FAULT)
1661 NPCLSR: 0 ;# ATT TO PCLSR
1662 NEPCLS: 0 ;# PCLSRS WHERE JOB WAS IN EXEC MODE
1663 NFPCLS: 0 ;# OF PCLSRS THAT FAILED (JOB WAS IN EXEC MODE AND NOT BLOCKED)
1664 NSOUSR: 0 ;# ATT TO SWAP OUT USR
1665 NSOPGS: 0 ;# TIMES THRU LOOP LOOKING FOR PG TO SWAP OUT
1666 NPGSO: 0 ;# TIMES AT SWOPG
1667 NAGEAB: 0 ;# TIMES SWAP OUT ABORTED BY AGE BITS
1668 NSHRAB: 0 ;# TIMES SWAP OUT ABORTED BY SHARING
1669 NPGFLT: 0 ;# PAGE FAULT (ALL CAUSES)
1670 NCLKI: 0 ;# CHNL 7 INTS (ALL CAUSES)
1671 NPGLD: 0 ;# TIMES AT PGLDU
1672 NUFLS: 0 ;# TIMES AT UFLS
1673 NTUSB: 0 ;# TIMES USER SWAP BLOCKED
1674 NTSBUP: 0 ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND LET IN
1675 NTSBUB: 0 ;# TIMES SWAP BLOCKED USER TOOK PAGE FAULT AND BLOCKED
1676 NTSBUU: 0 ;# TIMES SWAP BLOCKED USER UNBLOCKED BEFORE TIME (MEM APPARENTLY AVAIL)
1677 NAGES: 0 ;# TIMES AROUND PAGE-AGEING LOOP
1679 ;THE FOLLOWING FOUR MUST BE CONSECUTIVE
1680 NRPI: 0 ;# REFS TO PAGE IN (BUT MAP WAS NOT SET UP, ETC)
1681 NRPCI: 0 ;# PAGE FAULTS REFS TO PAGE COMMING IN
1682 NRPO: 0 ;# REFS TO PAGE OUT
1683 NRPGO: 0 ;# TO PAGES GOING OUT
1684 CLKBRS: 0 ;CLKBRK COPIED INTO HERE (SINCE CLKBRK GETS CHANGED)
1686 PAT: IFG .-PATB-40,.ERR PAT TOO HIGH
1692 PATCH: BLOCK 140 ;PATCH SPACE CODE AND CONSTANTS
1698 BLOCK 40 ;PATCH SPACE VARIABLES
1700 SUBTTL PROCESSOR BREAK ROUTINES
1702 DEFINE CLKSAV BRK=CLKBRK
1703 IFE KA10P, XCT CLCXSV ;DATAI PAG,CLCX(U)
1704 XCT CLUSAV ;STORE U IN AC17S FOR CURRENT USER (UNLESS NULL JOB)
1705 MOVE U,BRK ;SAVE AWAY BRK
1707 IFSN BRK,CLKBRK, MOVEM U,CLKBRK ;SAVE IN CLKBRK IF NOT CLKBRK
1711 DEFINE CLKLEV ;ENTER CLOCK-LEVEL CONTEXT
1712 SPCCTX 0,1,EPT ;UPT = EPT; CLOCK LEVEL CONTEXT.
1714 JRST 2,@.+1 ;MAKE XCTR WORK RIGHT
1726 IFN KL10P,[ ;CODE USED IF GETTING 60-CYCLE CLOCK FROM PDP11 (IN CASE MAIN CLOCK DOWN)
1730 ;THE TTY CODE ASSUMES, SINCE THE DTE20 IS USED BY ITS SOLELY AS
1731 ;THE INTERFACE TO THE CONSOLE TTY AND THE LINE-FREQUENCY CLOCK,
1732 ;THAT IT MAY FREELY GIVE THE "MONITOR TTY OUTPUT" COMMAND WHEN
1733 ;THE "MONITOR TTY OUTPUT DONE" INTERRUPT IS RECEIVED. ANY CODE
1734 ;WHICH HACKS THE DTE OTHER THAN AT PI LEVEL OR IN ITS INITIALIZATION
1735 ;MUST THEREFORE OBSERVE THE FOLLOWING PROTOCOL:
1737 ; SKIPN DTEFLG ;WAIT FOR MONITOR TTY OUTPUT TO GO THROUGH
1742 ; SKIPN DTEFLG ;WAIT FOR THIS COMMAND TO GO THROUGH
1749 CONSO PI,1_<7-APRCHN> ;TEMPORARY (I HOPE) HARDWARE BUG IN KL10 PI HARDWARE
1750 JRST 4,. ;ALLEGEDLY FIXED
1751 CONO PI,TTYRQ ;REALLY WANTED TO INTERRUPT ON TTY CHANNEL,
1752 JFCL ; BUT HAVE TO DO IT THIS WAY DUE TO
1753 JFCL ; MISFEATURES IN THE PI HARDWARE
1754 SKIPN DTECLK ;DON'T TAKE OUT THE JFCLS!!
1756 CLKSAV DTEBRK ;TAKE CLOCK INTERRUPT
1761 CLKBRK: 0 ;PC SAVED HERE BY JSR FOR CLOCK INT.
1765 CONSO PI,1_<7-APRCHN> ;HARDWARE BUG IN KL10 PI SYSTEM
1766 JRST 4,. ;ALLEGEDLY FIXED
1768 IFE KA10P, CONO PI,020000+200_<-APRCHN> ;BAG-BITING DEC LOSERS CHANGED
1769 ;FUNCTIONAL SPECIFICATION OF
1770 ;PROGRAMMED REQUESTS
1771 CLKBR2: CLKSAV ;SAVE AC BLK STATUS AND U.
1773 SKIPGE U,USER ;PICK UP INDEX OF CURRENT USER, SKIP UNLESS NULL JOB
1774 JRST [ SPM UPGML ;JUMP IF NULL JOB WAS RUNNING
1776 SPM UPGML(U) ;STORE PAGE MAP AWAY
1777 AOSN UFLSF ;SKIP UNLESS GOT HERE FROM UFL6
1779 MOVEM T,AC16S(U) ;STORE AWAY T
1781 BLT T,AC15S(U) ;STORE REST OF ACS
1782 CLKBKR: CLKLEV ;SET UP CROCK-LEVEL CONTEXT HARDWARE
1784 ;;; CHECK FOR THINGS OTHER THAN CLOCK TICKS (PAR ERR, PG FAULT, NXM, PDLOV,
1785 ;;; AROV AND ARFOV ARE POSSIBLE ON ONE MACHINE OR THE OTHER).
1788 CONSZ 270220 ;CHECK PDL OV, MEM PROTECT, NXM, FOV, AR OV
1789 JRST CLKB1 ;JUMP ON LOSSAGE
1790 CLKB1D: CONSZ PI,200000
1796 JRST PFA6 ;PAGE FAULT
1797 CONSZ 7740 ;This is all but the cache sweep done bit (=20).
1798 JRST CLKB2 ;APR ERROR INTERRUPT
1804 CONSZ 7620 ;This is all but the interval timer's bit (=40).
1805 JRST CLKBKS ; (Memory ECC (=100) doesn't interrupt)
1810 IFN PDCLKP\KA10P,[ ;IF 60 HZ CLOCK IS IN HARDWARE
1812 JRST CLK1F ;INTERRUPT NOT FROM CLOCK, MUST BE SPURIOUS (OR
1816 ;DROP THROUGH FOR PLAIN CLOCK-TICK.
1818 ; 60-CYCLE CLOCK INTERRUPT
1821 ;IFN 340P, DATAI CLK1,LQTIM
1822 SOSG @CLROOT ;COUNT DOWN, SKIP IF NOT YET TO NEXT REQUEST
1823 JRST CLQBRK ;SERVICE CLOCK QUEUE REQUEST
1825 IFN KS10P, CONO 020040+APRCHN ;Clear interval flag
1826 IFN PDCLKP\KA10P, CONO CLK,CLKINT+APRCHN ;Clear hardware clock flag
1827 IFE PDCLKP\KA10P\KS10P, SETZM DTECLK ;Clear software clock flag
1832 IFN KL10P, SKIPGE DTESWR
1833 IFN KS10P, SKIPE 8SWIT0
1834 BUG DDT,[SWITCH 0 IS UP]
1835 IFN KS10P, SETZM 8SWIT0 ; Allow hacker to <alt>P
1836 IFN CHAOSP, IFN T11CHP, PUSHJ P,T11WAK ;RUN TEN-11 CHAOS NET INTERFACE
1843 JRST DSTPD ;WAIT IF DTIME CLOBERED DUE TO RATE EXCEEDED
1851 CONO DIS,1100\SDCHN_3\DISCHN ;RESTART DISPLAY
1855 SKIPN T,E.SPGW ; E&S WAITING FOR PAGE
1857 HRRZM T,DISSPG ; SAVE FOR SWPPIN
1858 SKIPL T,DISUSR ; -1 IMPLIES NO USER
1859 MOVEM T,DISSWI ; USER INDEX FOR SWPPIN
1863 SKIPE @TT11HD ;ANY INPUT FROM PDP11?
1864 PUSHJ P,TT11IN ;YES, DO INPUT INT LVL STUFF FOR IT,.
1867 PUSHJ P,DZSCAN ;SCAN DZ'S FOR INPUT
1871 PUSHJ P,TTECH ;CHARACTERS TO BE ECHO ED
1873 SKIPE STYNTA ;IF THERE ARE STY'S CONNECTED TO NETWORK I/O,
1874 PUSHJ P,STYNTC ;XFER BETWEEN THEM.
1876 IFN KS10P, PUSHJ P,OVHCLK
1879 AOS TIME ;GET HERE EVERY THIRTIETH OF A SECOND
1881 SKIPE PREEMP ;CHECK FOR PRE-EMPTION INTERRUPT
1885 JRST CLKB5 ;TIME NOT UP
1887 JRST SCHED ;SCHEDULE
1891 SKIPE PREEMP ;CHECK FOR PRE-EMPTION INTERRUPT. THIS IS HERE
1892 JRST PRESCD ; BECAUSE OF SCREW CASE WHEREBY DLSRCH PREVENTS
1893 ; PREEMP FROM DOING ANYTHING, AND PREEMP WOULD
1894 ; PREVENT CLOCK FLAG FROM GETTING CLEARED IF IT WAS
1895 ; TESTED BEFORE CLOCK.
1897 ; MOVEI J,APRCHN ;DO NOT TAKE THESE OUT WITHOUT SEEING RG!!!!
1900 AOS CHSPUR+APRCHN ;COUNT SPURIOUS INT
1901 JRST SCHED ;(MIGHT HAVE BEEN RUNNING NULL JOB)
1909 CLKB2: CONSZ 2000 ;NXM
1911 CONSZ 1040 ;POWER FAIL OR I/O PAGE FAIL
1912 BUG HALT,[KL: POWER FAIL OR I/O PAGE FAIL]
1913 CONSZ 300 ;CACHE DIR OR PT DIR PAR ERR.
1914 BUG HALT,[KL: CACHE OR MAP DIR PAR ERR]
1915 CONSO 4400 ;SBUS ERR OR MB PAR ERR
1916 JRST SCHED ;CALLED MEMHNG, AND NOTHING ELSE => SCHEDULE.
1917 SETOM PARRSN ;TEL PAR ERR SCANNER THIS IS AN INTERRUPT, NOT A PG FAIL.
1918 RDERA PARERA ;STORE ADDR OF PAR ERR.
1923 CLKBKS: CONSZ 7600 ; Any bad guys? (8080 -> KS is 20, Interval is 40,
1924 JRST CLKKS1 ; Memory ECC is 100.)
1925 CONO 020020+APRCHN ; 8080 wants service. Clear the bit.
1926 MOVEI I,NFKSTY ; TTY # (fancy name for 0)
1927 CONO PI,TTYOFF ; Pretend this is TTY interrupt level.
1928 SKIPN A,8CTYIN ; Any input from 8080?
1930 SETZM 8CTYIN ; Yes: Make room for more.
1931 PUSHJ P,NTYI1 ; Stuff it into the tty.
1932 MOVEI I,NFKSTY ; Just in case...
1933 CLKKS2: SKIPN 8CTYOT ; Room for output yet?
1934 PUSHJ P,TYPSC ; Yes: Get some now.
1935 CONO PI,TTYON ; No: 8080 will wake us up later.
1936 JRST SCHED ; Null job might have been running.
1938 CLKKS1: CONSZ 1000 ;Power failure
1939 BUG HALT,[KS: POWER FAIL]
1940 CONSZ 6000 ;KS -> 8080 or Flag 24
1941 BUG HALT,[KS: KS->8080 FLAG OR FLAG 24 SET]
1944 CONSO 200 ;Bad memory data
1952 CLUFLS: CONO PI,CLKON ;FROM UFLS
1960 ;CLOCK QUEUE SERVICE
1961 CLQBRK: SKIPG U,CLROOT ;GET POINTER TO CURRENT BLOCK
1962 BUG ;CLK QUEUE SCREWED
1963 SKIPG T,1(U) ;GET POINTER TO NEXT BLOCK
1964 BUG ;CLK QUEUE SCREWED
1965 MOVEM T,CLROOT ;SET UP POINTER FOR NEXT BLOCK
1966 SETOM 1(U) ;INDICATE CURRENT BLOCK IDLE
1967 XCT 2(U) ;EXECUTE REQUEST (PROBABLY A JRST)
1968 ;FALL THROUGH IF SINGLE INST RQ
1969 CLQRET: ;RETURN FROM REQUEST
1970 SKIPN @CLROOT ;SKIP IF TIME TILL NEXT RQ NONZERO
1971 JRST CLQBRK ;ZERO TIME DELTA, DO NEXT RQ
1972 JRST CLQBRT ;RETURN TO CLOCK ROUTINE
1974 CLQTTR: JUMPE TT,CLQRET ;COMMON RETURN FOR TT IDLE FLAG
1975 CLQREE: MOVEI E,CLQRET ;RE ENTER RQ
1977 ;CLOCK OFF OR IN PROGRESS LEVEL ADD TO CLOCK QUEUE, CALL BY JSP E,
1978 ; T HAS TIME TILL RQ IN 60'THS
1979 ; C POINTS TO THREE WORD BLOCK, RQ'ED INST IS IN THIRD
1980 CLQPUT: MOVEI B,CLROOT-1
1981 CLQPU2: MOVE A,B ;REPLACE POINTER TO PREV BLOCK WITH CURRENT
1982 SKIPG B,1(B) ;GET LINK TO NEXT BLOCK
1983 BUG ;CLK QUEUE SCREWED
1984 SUB T,(B) ;SUBTRACT TIME DELTA FOR NEXT BLOCK
1985 JUMPG T,CLQPU2 ;JUMP IF RQ LATER THAN CURRENT BLOCK
1986 JUMPE T,CLQPU6 ;JUMP IF RQ SAME AS " " (COULD USE PU2 BUT THIS FASTER)
1987 ADD T,(B) ;RQ EARLIER, ADD BACK
1988 MOVEM T,(C) ;SET DELTA OF BLOCK BEING ADDED
1989 SUB T,(B) ;COMPUTE NEG OF DELTA FOR NEXT BLOCK
1990 MOVNM T,(B) ;SET TIME DELTA FOR NEXT BLOCK
1991 MOVEM B,1(C) ;SET LINK OF NEW BLOCK TO NEXT
1992 MOVEM C,1(A) ;SET LINK OF PREV BLOCK TO NEW
1995 CLQPU6: SETZM (C) ;SET TIME DELTA OF NEW BLOCK TO ZERO
1996 MOVE A,1(B) ;GET POINTER TO NEXT BLOCK
1997 MOVEM A,1(C) ;SET POINTER OF NEW TO NEXT BLOCK
1998 MOVEM C,1(B) ;SET POINT OF CURRENT TO NEW BLOCK
2001 ;MAIN PROG LEVEL ADD TO CLOCK QUEUE
2002 ;CALL BY PUSHJ P,CLQADD
2003 ;WITH POINTER TO BLOCK IN NEXT WORD AND TIME TILL RQ IN T IN 60'THS
2004 ;POINTER TO BLOCK SHOULD NOT BE INDEXED BY C
2006 CLQAD1: MOVEI T,1 ;RQ IN ONE TICK
2008 MOVE C,@-1(P) ;GET BLOCK POINTER
2010 SKIPL 1(C) ;SKIP IF IDLE
2011 JRST POPCJ1 ;IGNORE THIS RQ, BLOCK ALREADY ACTIVE
2015 SKIPN (C) ;DELTA WORD OF IDLE BLOCK SHOULD BE ZERO
2016 SKIPG T ;TIME SHOULD BE NON-ZERO
2017 BUG ;CLK QUEUE SCREWED
2019 JSP E,CLQPUT ;ADD RQ
2020 CLQDE4: CONO PI,CLKON
2026 ;DELETE CLOCK QUEUE ENTRY
2027 ;CALL BY PUSHJ P,CLQDEL WITH POINTER TO BLOCK IN NEXT WORD
2029 MOVE C,@-1(P) ;GET BLOCK POINTER
2032 SKIPGE 1(C) ;IGNORE RQ TO DELETE IF IDLE
2040 CLQCLR: MOVEI B,CLROOT-1 ;CLOCK OFF OR IN PROGRESS VERSION
2042 SKIPG B,1(B) ;GET POINTER TO NEXT BLOCK
2043 BUG ;CLK QUEUE SCREWED
2044 CAME B,C ;SKIP IF FOUND BLOCK TO DELETE
2046 SKIPG B,1(B) ;GET POINTER TO BLOCK AFTER ONE TO DELETE
2047 BUG ;CLK QUEUE SCREWED
2048 MOVEM B,1(A) ;PATCH AROUND DELETED BLOCK
2050 ADDM A,(B) ;ADD DELTA OF DELETED BLOCK TO NEXT
2051 SETZM (C) ;CLEAR DEL
2052 SETOM 1(C) ;MARK IDLE
2055 OVHMTR PGF ;PAGE FAULT
2059 PFAILU: 0 ;SAVED U AS OF A PAGE FAILURE
2060 PFINST: 0 ;PF INSTRUCTION IF XCT
2061 PFOPC1: 0 ;SAVE PFOPC WHILE SWITCHING TO CLK LEVEL (PROTECT AGAINST XCTRI)
2064 ;PAGE FAULTS COME HERE, WITH PC IN PFOPC, AND PI SYSTEM TURNED OFF.
2066 PFAIL: MOVEM U,PFAILU
2068 ANDI U,%PFCOD ;GET THE PFAIL CODE FROM THE PFW
2071 JRST PFA2 ;IT'S A PAR ERR; BYPASS XCTR HACKS
2075 LDB U,[331100,,(U)] ;GET OPCODE OF LOSING INSTRUCTION.
2076 ;ASSUME THAT IN EXEC MODE VIRTUAL
2077 ; AND PHYSICAL ADDRESSES ARE IDENTICAL
2078 ; FOR INSTRUCTION FETCHES. ALSO ASSUME
2079 ; THAT NOBODY DOES XCT OF XCT OF XCTR.
2080 PFA4: CAIE U,XCTRI_-33 ;SKIP IF "XCTR WITH INHIBIT"
2082 REPEAT 2, AOS PFOPC ;ONCE COMPENSATING FOR INSTR ABORT, AND ONCE TO SKIP
2084 JRST 17,@PFOPC ;KL-10 CROCK: JRST 17, TURNS ON PI SYSTEM
2086 PFA1: CAIE U,XCTR_-33 ;SKIP IF "XCTR WITH NO INHIBIT"
2088 PFA2: CONSO PI,77400 ;PI IN PROGRESS?
2089 CONSO PI,1 ;CHANNEL 7 ENABLED?
2090 BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS OR CLKOFF]
2092 BUG AWFUL,[PAGE FAULT IN NULL JOB]
2095 MOVE U,PFAILU ;RESTORE U SO CLKSAV CAN RE-SAVE IT
2096 TPFLT1: SETOM PFAILF
2097 CONO PI,CLKRQ ;CAUSE CLK BREAK AND PI SYSTEM ON
2098 JRST . ;TAKES A WHILE TO GO OFF
2100 ;COME BACK HERE PI IN PROGRESS ON CLK CHANNEL
2102 MOVEM T,CLKBRK ;SAVE PC AS OF PAGE FAULT AS PLACE INTERRUPTED FROM
2103 AOSN PFAILF ;IF INTERRUPTED FROM INTPFL,
2104 JRST PFA9 ; PC DOESN'T POINT TO FAULTING INSTRUCTION
2105 TLNE T,%PSUSR ;MAYBE SPURIOUS MPV ON IOT IN USER MODE?
2107 JRST PFA9 ;CAN'T BE, I/O IS LEGAL
2110 CAIE TT,%PFPNA ;CAN'T BE IF PAGE FAULT IS REALLY SOME OTHER RANDOM BREAK
2111 CAIN TT,%PFILW ;SUCH AS A PARITY ERROR
2115 ; MOVEM T,UPOPC(U) ;SOLELY FOR THE .OPC USER VARIABLE
2116 LDB E,[$PFPNO,,UPFW(U)] ;FAILING PAGE NO
2118 ANDI D,%PFCOD ;GET THE PAGE-FAULT CODE.
2119 MOVEI A,0 ;INIT USER INT BITS
2122 JRST PFA5 ;REAL PAGE FAULT OR RWF
2126 JRST PFA7 ;OTHER RANDOM BREAKS
2129 JRST PFA14 ;PARITY ERROR
2130 MOVSI D,SCLBPF ;UNKNOWN PFW, GET SYSTEM JOB TO BARF ABOUT IT
2132 BUG PAUSE,[BAD PAGE FAIL WORD ],OCT,BPFPFW ;LOSING IN REAL TIME
2140 JRST SCHED ;IGNORE THE FAULT (BUT DO A FULL SCHEDULE SO SYS JOB WAKES)
2142 PFA14: SETZM PARRSN ;SAY THIS IS PAR ERR TRAP, NOT PAR ERR INTERRUPT.
2144 MOVEM D,PARPFW ;SAVE PFW OF PAR ERR FOR ERROR MESSAGE
2145 AC7CTX ;SELECT AC BLOCK 7, USED BY UCODE.
2146 UMOVE D,0 ;SAVE THE AC THAT HOLDS THE BAD WORD
2148 SYSCTX ;AND RESET THE DATAO PAG TO NORMAL VALUE
2149 JRST CLKB1E ;GO SCAN FOR THE ERROR.
2151 PFA3: CAIE U,XCT_-33
2152 BUG HALT,[PAGE FAULT IN SYSTEM AT ],OCT,PFOPC ;BARF!
2153 MOVE U,@PFOPC ;QUUX! LET ONE LEVEL OF XCT WIN
2156 LDB U,[331100,,@PFINST]
2159 PFA11: XCTRI XR,[MOVE T,(T)] ;GET INSTRUCTION IN WHICH PAGE FAIL OCCURRED
2160 TLCA T,700000 ;AND CHECK HIGH THREE BITS OF OPCODE
2161 JRST PFA9 ;JUMP IF FAULT WAS ON INSTRUCTION FETCH
2163 JRST PFA12 ;JUMP IF INSTRUCTION NOT AN IOT
2164 PFA13: MOVSI TT,(HRRI T,)
2166 XCTRI XEA,TT ;COMPUTE ITS EFFECTIVE ADDRESS
2167 TLZA T,37 ;CLEAR @+XR, BUT LEAVE OPCODE AND AC
2168 JRST PFA9 ;JUMP IF FAULT ON INDIRECT WORD
2169 MOVEM T,MUUODP(U) ;IT WAS A SPURIOUS MPV, SO
2170 MOVE T,CLKBRK ; SIMULATE TRAPPING AS A UUO
2172 MOVEM T,XUUOH(U) ;STORE OLD PC
2174 MOVEM T,MUUOCX(U) ;AND OLD CONTEXT
2176 MOVEM T,CLKBRK ;GET NEW PC
2177 JRST CLKB5 ;AND RESTART USER AT UUOH0
2179 PFA12: TLNN T,700000 ;MAYBE AN INSTRUCTION OVERLAYED ON AN MUUO, E.G. LPMR
2180 TLNN T,040000 ;OPCODES 040-077 QUALIFY.
2183 TLNE T,777000 ;SKIP IF OPCODE WAS XCT
2187 ;Following instruction is suspected of not working (sometimes using wrong AC block)
2188 ; XCTRI XEA,T ;COMP EFFECTIVE ADDRESS OF XCT IN USER CONTEXT
2189 ;; JRST PFA11 ;AND GO PROCESS INSTRUCTION AT THAT ADDRESS
2190 ; JRST [ MOVEM T,TRMNAM(U) ;TEMPORARY FOR DEBUGGING
2192 ; JRST PFA9 ;HERE IF FAULT WAS IN INDIRECT CYCLE
2194 PFA15: DATAI PAG,TT ;HMM, SEE IF WRONG AC BLOCK SELECTED
2197 LDB TT,[220400,,T] ;CHECK FOR NEED TO SIMULATE INDEXING
2202 PFA16: TLNN T,(@) ;CHECK FOR NEED TO SIMULATE INDIRECT
2204 XCTRI XR,[MOVE T,(T)]
2205 JRST PFA15 ;PROCESS INDIRECT WORD
2206 JRST PFA9 ;TAKE FAULT ON INDIRECT WORD
2207 ;End replacement code.
2214 IRP I,,[1,2,3,4,5,6,7]
2215 PF!I!SVU: 0 ;Saved U at PI level I page fail
2216 PF!I!SVT: 0 ;Saved T at PI level I page fail
2217 PF!I!INS: 0 ;Instruction at PI level I page fail
2219 IFN .-PF1SVU-21., .ERR Wrong length PFXSVU block.
2223 IRP I,,[1,2,3,4,5,6,7]
2224 PF!I!AIL: ;;PI level I page fail comes here.
2225 MOVEM T,PF!I!SVT ;Save T
2226 MOVEM U,PF!I!SVU ;Save U
2227 JSP U,PIFAIL ;Set up U and join common code
2229 IFN .-PF1AIL-21., .ERR Wrong length PFXAIL block.
2230 PFXSVT==:0,,<PF7SVT-<PF7AIL+3>>
2231 PFXINS==:0,,<PF7INS-<PF7AIL+3>>
2232 PFXWRD==:0,,<EPTP7W-<PF7AIL+3>>
2233 PFXOPC==:0,,<EPTP7O-<PF7AIL+3>>
2235 PIFAIL: MOVE T,PFXWRD(U) ;Check page fail word
2237 BUG AWFUL,[NON-EX IO REG WITH PI IN PROGRESS ],OCT,PFXWRD(U),[PC=],OCT,PFXOPC(U)
2238 TLNE T,%PFNXM\%PFPAR
2239 BUG AWFUL,[NXM OR PARITY ERROR WITH PI IN PROGRESS]
2240 MOVE T,PFXOPC(U) ;Check for user mode.
2242 BUG AWFUL,[PAGE FAULT IN USER MODE WITH PI IN PROGRESS]
2243 SKIPA T,(T) ;We assume that it wasn't the instruction
2244 ;fetch itself that caused the fault.
2245 PIFL2: MOVEI U,PF7AIL-PF7XCT(U) ;Correct U on return from PFXXCT
2246 MOVEM T,PFXINS(U) ;Save instruction that caused fault
2247 LSH T,-33 ;Look at opcode
2248 CAIE T,XCTRI_-33 ;XCTRI gets special treatment:
2250 REPEAT 2, AOS PFXOPC(U) ;Arrange for it to skip.
2251 JRST PFXRET(U) ;And return.
2253 IRP I,,[1,2,3,4,5,6,7]
2255 MOVE T,PF!I!SVT ;Restore T
2256 MOVE U,PF!I!SVU ;Restore U
2257 JRST 2,@EPTP!I!O ;Return
2259 IFN .-PF1RET-21., .ERR Wrong length PFXRET block.
2260 PFXRET==:0,,<PF7RET-<PF7AIL+3>>
2262 ;;;Let XCT chains that end in XCTRI win. We assume that none of the
2263 ;;;fetches along the way to the XCTRI itself caused the fault.
2264 PIFL1: CAIE T,XCT_-33
2265 BUG AWFUL,[PAGE FAULT WITH PI IN PROGRESS]
2266 MOVE T,PFXSVT(U) ;Restore T
2267 JRST PFXXCT(U) ;Go pick up word XCT'ed
2269 IRP I,,[1,2,3,4,5,6,7]
2271 MOVE U,PF!I!SVU ;Restore U
2272 MOVE T,@PF!I!INS ;Pick up XCTed instruction
2273 JSP U,PIFL2 ;Set up U again and rejoin common code
2275 IFN .-PF1XCT-21., .ERR Wrong length PFXXCT block.
2276 PFXXCT==:0,,<PF7XCT-<PF7AIL+3>>
2280 PFLCLK: 0 ; Did page fault happen with CLKOFF?
2281 PFLSVU: 0 ; Saved U during page fail
2282 PFLSVT: 0 ; Saved T during page fail
2283 PFLINS: 0 ; Faulting instruction
2288 ;;; If we are swapped out while running with Exec mode PC between PFAIL and
2289 ;;; PFAILE inclusive, EPTPFO is saved as our PC. (There are actually only
2290 ;;; a few PC's for which this is possible given that we mostly run CLKOFF.)
2295 CONO PI,CLKOFF ; Don't bother me
2296 MOVEM U,PFLSVU ; Save U
2297 MOVEM T,PFLSVT ; Save T
2299 BUG AWFUL,[PAGE FAULT IN NULL JOB]
2300 MOVE T,EPTPFW ; Get the explanation
2301 MOVEM T,UPFW(U) ; Save it for others
2302 MOVE U,PFLSVU ; Restore U, only needed it for a moment.
2303 TLNE T,%PFNXM\%PFPAR ; Bad stuff should interrupt us, right?
2304 BUG AWFUL,[NXM OR PARITY ERROR DIDN'T INTERRUPT]
2306 TLNE T,%PSUSR ; In Exec mode?
2308 MOVE T,(T) ; We assume that it wasn't the instruction
2309 ; fetch itself that caused the fault.
2310 PFLOOP: MOVEM T,PFLINS ; Save instruction that caused fault.
2311 LSH T,-33 ; Check opcode for XCTRI
2312 CAIN T,XCTRI_-33 ; Should we skip?
2314 CAIN T,XCTR_-33 ; Touching user address?
2316 CAIE T,UMOVE_-33 ; These guys are just like XCTR
2319 ;; Let XCT chains win. We assume that none of the fetches along
2320 ;; the way caused the fault.
2322 BUG HALT,[PAGE FAULT IN SYSTEM AT],OCT,EPTPFO
2323 MOVE T,PFLSVT ; Restore T for a moment
2324 MOVE T,@PFLINS ; Pick up XCTed instruction
2327 ;;; Come here to cause faulting instruction to skip.
2328 PFLSKP: MOVE T,PFLSVT ; Restore T
2329 REPEAT 2, AOS EPTPFO
2330 SKIPL PFLCLK ; Unless clock was already off
2331 CONO PI,CLKON ; turn it back on
2332 PFAILE: JRST 2,@EPTPFO
2334 ;;; Come here on NXI error.
2337 ;;; We come here when the page fault is "soft" and it happened in user mode
2338 ;;; or while using XCTR, UMOVE, or UMOVEM.
2339 PFLUSR: MOVE T,EPTPFW
2340 TLNN T,%PFNXI ; Non-existent IO Register?
2343 TLNE T,%PSUSR ; NXI in User IOT mode is not fatal.
2345 BUG AWFUL,[NON-EX IO REG ],OCT,EPTPFW,[PC=],OCT,EPTPFO
2346 PFLU1: MOVE T,PFLSVT ; Restore T
2347 SKIPGE PFLCLK ; Check for lossage
2348 BUG AWFUL,[PAGE FAULT WITH CLKOFF AT],OCT,EPTPFO
2349 TPFLT1: SETOM PFAILF ; Cause CLK level to go to PFLU2
2350 CCLKRQ: CONO PI,CLKRQ
2351 JRST . ; Takes a while to go off...
2353 ;;;CLKBRK comes back here at CLK level.
2354 PFLU2: MOVE T,EPTPFO
2355 MOVEM T,CLKBRK ;Save PC of page fault as place interrupted
2357 LDB E,[$PFPNO,,UPFW(U)] ;E: Virtual page number
2359 ANDI D,%PFNXI\%PFWRT\%PF2.9\%PF2.8 ;D: Page fault code
2360 MOVEI A,0 ;A: User interrupt bits
2361 TRNE D,%PFNXI ;NXI in User IOT mode.
2364 ;Drops through into PFA5
2369 CLKB1: MOVE T,CLKBRK
2371 JRST CLKFO1 ;FLOATING OVERFLOW ENABLED
2372 CLKFO2: CONSZ 20 ;SKIP IF AR OV INT NOT ENABLED
2373 CONSO 10 ;OV ENABLED, SKIP IF OV
2374 CONSZ 270000 ;NOT OV, CHECK PDL OV, MEM PROTECT, NXM
2375 JRST CLKB1C ;PDL OV, NXM, ETC
2376 JRST CLKB1D ;ONLY CLOCK BREAK, AR OV JUST ENABLED
2378 CLKFO1: CONSO 100 ;SKIP ON FLOATING OVERFLOW
2379 JRST CLKFO2 ;NOT REALLY FLOATING OVERFLOW
2380 CLKB1C: JUMPL U,CNLJL ;NULL JOB LOST
2381 MOVEI A,0 ;SET UP INTERRUPT BITS FOR USER
2382 CONSZ 20 ;SKIP IF OV NOT ENABLED
2383 CONSO 10 ;OV ENABLED, SKIP ON OV
2384 JRST CLB1A ;NOT AROV
2386 CLB1A: CONSZ 200 ;SKIP IF FL OV NOT ENABLED
2387 CONSO 100 ;FL OV ENABLED, SKIP ON FL OV
2388 JRST CLB1B ;NOT FLOATING OVERFLOW
2390 CLB1B: CONSO 270000 ;SKIP IF PDL OV, NXM, OR MEM PROTECT
2392 CONSZ 10000 ;NON EX MEM
2396 TRO A,%PIPDL ;PDL OVFLO
2397 TLNN T,%PCUSR ;SKIP IF IN USER MODE
2398 BUG HALT,[PDL OVERFLOW IN EXEC MODE]
2399 CLKB1H: CONSO 20000 ;MEM PROTECT
2401 HLLZ D,UPQUAN(U) ;PICK UP FAULT BITS
2403 TLNN D,770 ;ALL CONDITIONS WHICH ABORT INSTRUCTION
2404 JRST CLKB1J ;(PLUS PAGE NXM FOR RANDOMNESS)
2405 TRZ A,%PIPDL ;INSTRUCTION ABORTED, DON'T SET PDL OV
2408 HRR T,UPOPC(U) ;FIX UP OPC
2409 MOVEM T,CLKBRK ;RESET PC FROM OPC
2411 HLRZ E,UPJPC(U) ;GET VIRTUAL PAGE # (LH OF JPC)
2414 ANDI E,377 ;FLUSH AGE ETC
2416 ;DROP THROUGH INTO PFA5
2424 TLNE D,320 ;SKIP IF REALLY PAGE FAULT
2425 JRST CFH4 ;OTHERWISE WRITE IN READ ONLY OR EXECUTING IMPURE PAGE
2429 ; A BITS FOR USER'S PIRQC
2430 ; D PAGE FAULT BITS OR CODE
2431 ; E VIRTUAL PAGE NUMBER OF PAGE FAILURE
2432 ; TT THE UMAPS SETTING
2433 ;THE MYSTERIES OF W:
2434 ; RH IS A USER INDEX
2435 ; LH 0 => NORMAL PAGE FAULT
2436 ; NON0 => SWAP IN REQUEST FOR OTHER REASON. D,TT SHOULD BE 0.
2438 ; 4.9 => DMA DEVICE SWAP-IN, SEE SWIRQB, SWPPIN
2439 ; 4.8 => FROM SCHEDULER, TO GIVE INTERRUPT (?) THIS IS NO LONGER USED,
2441 ; 4.7 => FROM CFHAHD, TO PAGE AHEAD. THIS IS ONE LEVEL OF RECURSIVE
2443 ; FOR A NORMAL PAGE FAULT, THE USER PC IS IN CLKBRK.
2445 CFHSW1: HRRZM E,CFHUVP ;USER'S VIRTUAL PAGE NUMBER
2448 MOVEI C,UPGCPH(W) ;VIRTUAL ADDRESS IN USER'S HIGH SEG
2449 TLNN TT,%UMMPU ;IS MY UPPER NORMAL?
2450 JRST CFH2 ;YES, USE MY UPPER CPB
2451 MOVEI C,UPGCPH(TT) ;NO, TRY HIS UPPER.
2452 TLNE TT,%UMUTL ;IS MY UPPER GOING TO HIS LOWER?
2453 MOVEI C,UPGCP(TT) ;YES, TRY HIS LOWER.
2456 CFH1: MOVEI C,UPGCP(W) ;VIRT ADDRESS IN USER'S LOW SEG
2458 JRST CFH2 ;MY LOWER DBR NOT HACKED
2460 TLNE TT,%UMLTU ;WAS MY LOWER HACKED TO POINT TO UPPER?
2461 MOVEI C,UPGCPH(TT) ;YES.
2467 MOVE T,C ;CALCULATE MAP ENTRY B.P. FROM CIRC PTR B.P.
2468 ADD T,[(200000-2000)UPGMP-UPGCP]
2469 LDB E,C ;CIRC MEM USE POINTER FOR PAGE FAULT
2470 JUMPE E,CFH4 ;ADDRESS IS IN REAL ILM
2472 JRST CFH4 ;ON REFERENCE TO ABS PAGE ALSO ILM
2473 IFN KL10P,[ CAIE D,%PFILW
2478 JRST CFH4 ;WRITE IN READ ONLY?
2479 JRST CFHRWF ;READ WRITE FIRST
2482 IFN KS10P,[ CAIN D,%PFWRT\%PF2.8 ;WRITE IN READ ONLY
2484 CAIN D,%PFWRT\%PF2.9 ;READ WRITE FIRST
2486 TRNE D,%PF2.8\%PF2.9 ;PAGE NOT IN MAP
2487 BUG HALT,[BOGUS PAGE FAIL CODE]
2493 ;REFERENCE TO PAGE WITH NO ACCESS IN MAP.
2494 CFHW1: SKIPGE RPCL(W)
2495 JUMPGE W,CFF1 ;BEING RPCLSRED?
2498 JRST CFH5 ;CIRPSW NOT AVAILABLE
2503 BUG ;MMP OUT OF RANGE
2504 MOVE C,E ;CIRC PNTR ALREADY POINTS TO MMP
2508 CFHSW3: PUSHJ P,UCPRL ;FIND MMP
2512 CFHSW4: LDB D,[410200,,(C)] ;TWO BITS OF MMP ENTRY GIVES DISPOSITION OF PAGE
2521 ;PAGE FAULT IN JOB BEING PCLSR'D.
2524 BUG ;BEING RPCLSRED IN USER MODE
2527 ANDCAM D,UPQUAN(W) ;CLR PG FLT
2529 CONO 470000+APRCHN ;CLR PDL OV + QT OV + MPV + NXM
2536 MOVE T,CLCX(W) ;RESTORE UPT BUT NOT ACS
2540 CONO PI,CLKOFF ;GO ALLOW SELF TO GET RPCLSRED
2541 JRST 10,UFL1 ;GO INTO UFLS WITH CLK OFF RATHER THAN
2544 CFHRWF: ;HANDLE "WRITE IN READ-WRITE-FIRST PAGE" PAGE FAULT.
2547 JRST CFHW1 ;SOMETIMES NO ACCESS SEEMS TO BE ON TOO
2550 BUG ;GOT "WRITE IN R-W-F PAGE" BUT PAGE ISN'T R-W-F.
2557 ;; EXIT FROM PAGE FAULT HANDLING FOR NON-ERROR FAULT.
2558 ;; C SHOULD CONTAIN 0 IF CAN CONTINUE NOW, OR A FLSINS TO WAIT WITH.
2559 ;; A SHOULD CONTAIN -1 IF FAULT HANDLED SUCCESFULLY (PAGE IN OR ON ITS WAY), ELSE 0.
2563 CFH5A: JUMPE C,CFHX1 ;IF NOT GOING TO WAIT, SKIP NPGWTU CODE
2565 IORM D,USWST(W) ;WAITING FOR PAGE
2566 AOS NPGWTU ;KEEP COUNT OF USERS WAITING FOR A PAGE
2572 IFN KA10P, MOVSI D,1770 ;CLEAR FAULT STATUS BITS
2576 ;; WAIT FOR CIRPSW TO BE AVAILABLE.
2579 MOVE C,[SKIPL CIRPSW]
2583 ;PAGE FAULT ON PAGE THAT'S REALLY IN CORE.
2584 CFHPI: PUSHJ P,CFHAHC ;SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2587 AOS NPGAHR ;COUNT NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2591 AOS NPGBHR ;COUNT NUMBER OF PAGES AGED BY PAGE-BEHIND WHICH WERE USED AGAIN.
2594 PUSH P,C ;SAVE MMP ENTRY ADDRESS FOR PPIUM.
2596 100000,,.+2 ;RETURN ON MEMPNT
2597 BUG ;NO MEMORY LINKED IN?
2598 SUB P,[4,,4] ;FIND MEMBLT INDEX
2600 TLNE D,MMPBAD ;WAS THIS PAGE RECENTLY A PAR ERR VICTIM?
2601 JRST CFHPB ;YES; READ IT BACK OFF THE DISK IF POSSIBLE.
2603 JUMPGE W,E.SBAR ;IF NOT CALLED FROM SWPPIN
2604 HRRZ H,DISUSR ;CHECK TO SEE IF SERVICING E&S
2605 CAIN H,(W) ;NOT DISPLAY, THEN SKIP
2606 PUSHJ P,E.SPGI ;ELSE TIE DOWN PAGE
2610 HLLZS MMSWP(A) ;CLEAR LENGTH OF CIRC LIST (BUT NOT EXEC PGS COUNT)
2613 PUSHJ P,PPIUM ;PUT PAGE INTO USERS' MAPS
2614 IFN E.SP,SETZM E.SPGH ; CLEAR QSWI1 FLAG
2619 ;COME HERE FOR PAGE WHICH SEEMS TO BE IN CORE, BUT HAD A PAR ERR RECENTLY.
2620 ;"SWAP IT OUT", SO IF IT'S PURE IT WILL JUST BE READ BACK FROM DISK.
2623 SETOM CIRPSW ;UNLOCK, SO SWPOPG CAN RE-LOCK.
2624 MOVE C,USER ;TELL SWPOPG WHICH JOB SHOULDN'T BE PCLSR'ED.
2625 PUSHJ P,SWPOPL ;"SWAP OUT" THE PAGE (EVEN IF LOCKED DOWN)
2626 JRST [ POP P,W ;FAILED TO GO OUT. COULD BE EXEC PAGE POINTING TO IT,
2627 SETZ A, ;OR A JOB THAT CAN'T BE PCLSRED RIGHT NOW.
2628 MOVSI C,(CAIA) ;WAIT A LITTLE AND TRY AGAIN (HOPE FOR THE BEST)
2631 AOSE CIRPSW ;SWPOPG UNLOCKS; RE-LOCK.
2632 JRST CFH5 ;OR ELSE GO INTO PAGE-WAIT TILL CIRPSW FREE.
2634 JRST CFHSW4 ;TRY AGAIN TO REFERENCE PAGE, SWAPPING IT BACK IN.
2636 ;ON A RANDOM PAGE FAULT, SEE IF WE WANT PAGE-AHEAD OR PAGE-BEHIND.
2637 ;ASSUMES W SET UP AS FOR CFHSW1, AND TT
2638 CFHAHC: MOVE D,CFHUVP ;GET USER'S VIRTUAL PAGE NUMBER.
2639 TLNN W,-1 ;PAGE AHEAD ONLY FOR NORMAL PAGE FAULT (SO PC IS IN CLKBRK).
2640 SKIPN PAGAHD(W) ;IS PAGE-AHEAD WANTED FOR THIS JOB?
2645 TDNE TT,T ;NO PAGE-AHEAD ON PAGE NOT MAPPED NORMALLY.
2649 CAML D,H ;IS PAGE IN RANGE FOR AUTOMATIC PAGE-AHEAD?
2650 CAML D,T ;IF SO, GO DO IT.
2657 ;AUTOMATIC PAGE-AHEAD AND PAGE-BEHIND.
2658 ;WHEN PAGE N IS PUT INTO THE MAP, PAGE N+1 IS SWAPPED IN
2659 ;AND PAGE N-1 IS SWAPPED OUT.
2660 ;(ACTUALLY, 1 IS A PARAMETER, IN THE PAGAHD VARIABLE)
2661 CFHAHD: PUSH P,CFHUVP
2662 ;LOOP, REQUESTING SWAP-IN FOR THE NEXT N PAGES. E HAS PAGE NUMBER TO SWAP IN.
2663 CFHAH1: MOVE E,CFHUVP
2667 CAMN A,E ;DETECT END OF LOOP.
2669 SKIPL T ;ELSE INCREMENT OR DECREMENT PAGE NUMBER.
2672 PUSHJ P,CFHRNG ;IS PAGE NUMBER IN RANGE FOR PAGE-AHEAD?
2675 HRLI W,500000 ;PAGE AHEAD THE PAGE. 100000 MEANS PAGE-AHEAD.
2677 SETOM CIRPSW ;ALLOW CFHSW1 TO LOCK CIRPSW.
2681 SETZM CIRPSW ;BUT REALLY IT'S ALREADY LOCKED SO KEEP IT SO.
2684 AOS NPGAH1 ;COUNT NUMBER OF TIMES AN ATTEMPT FAILS.
2687 ;NOW IT'S TIME FOR PAGE-BEHIND. E HAS PAGE NUMBER TO SWAP OUT.
2689 ;???? IS THERE ANY NEED TO PRESERVE U, EVER, INSIDE CFHSW1?
2691 HRRE A,PAGAHD(W) ;GET PAGE-BEHIND DISTANCE.
2693 ADDB A,E ;COMPUTE WHICH PAGE TO PAGE OUT.
2694 PUSHJ P,CFHRNG ;SKIP IF PAGE IS IN RANGE FOR PAGE-BEHIND.
2697 PUSHJ P,UPLC ;LOOK UP THE PAGE IN THE MAP.
2698 LDB D,Q ;D GETS CIRC PNTR
2699 JUMPE D,CFHAH4 ;NO PAGE THERE
2701 JRST CFHAH4 ;ABSOLUTE PAGE, DO NOTHING.
2703 TRO D,PMAGEM ;AGE THE PAGE, IF THE PAGE IS REALLY IN THE MAP,
2706 AOS NPGBHA ;COUNT PAGES AHED FOR PAGE-BEHIND.
2707 MOVE D,T ;SAVE B.P. TO PAGE MAP HALFWORD, FOR CFHAH6.
2708 MOVE C,Q ;STARTING FROM CIRC PTR, FIND MMP
2712 SUB P,[4,,4] ;FOUND MMP, C POINTS TO IT
2713 MOVE E,C ;SAVE ADDRESS OF MMP ENTRY
2714 MOVSI T,MMPTMP\MMPOUT ;IF PAGE IS IN TRANSIT OR OUT, DO NOTHING TO IT.
2718 TLNN T,%PCUSR ;IF JOB IN EXEC MODE, CAN'T SWAP OUT PAGE, SO JUST LEAVE AGED.
2721 SUB T,NCBCOM ;IF LOTS OF FREE MEM, DON'T SWAP OUT.
2725 PUSHJ P,UCPRL ;GET CORE PAGE NUMBER IN T.
2730 JUMPN A,CFHAH6 ;POINTED TO BY AN EXEC PAGE, E.G. 340, CAN'T SWAP OUT.
2734 MOVE A,T ;PHYSICAL PAGE # TO SWAP OUT
2735 HRRZ C,W ;DON'T PCLSR ME
2736 SETOM CIRPSW ;SWPOPG WILL WANT TO RE-LOCK CIRPSW.
2737 PUSHJ P,SWPOPG ;SWAP OUT
2738 JRST CFHAH5 ;CAN'T SWAP OUT => LEAVE JUST AGED.
2739 AOS NPGBHD ;COUNT PAGES SWAPPED OUT BY PAGE-BEHIND.
2745 AOS CIRPSW ;SWPOPG UNLOCKS; RE-LOCK.
2746 POPJ P, ;CAN'T GET LOCKED BY SOMEONE ELSE, WE ARE AT CLOCK LEVEL
2748 ;HERE FOR PAGE-BEHIND PAGE WHICH WE CAN'T OR DON'T WANT TO SWAP OUT.
2749 CFHAH6: MOVSI T,MMPPGB ;IT HAS ALREADY BEEN AGED. MARK IT FOR METERING PURPOSES.
2750 IORM T,(E) ;E POINTS TO MMP ENTRY.
2755 ;SKIP IF PAGE NUMBER IN E IS IN RANGE FOR PAGE-AHEAD OR PAGE-BEHIND.
2756 ;ASSUMES USER INDEX IN W. CLOBBERS T.
2769 CFHAHS: 20 ;IF LESS THAN THIS MUCH FREE MEM, PAGE-BEHIND SHOULD SWAP OUT.
2771 NPGAHD: 0 ;NUMBER OF PAGES WE ACTUALLY SWAPPED IN FOR PAGE-AHEAD.
2772 NPGAH1: 0 ;NUMBER OF TIMES WE WERE UNABLE TO PAGE AHEAD.
2773 NPGBHD: 0 ;NUMBER OF PAGES WE ACTUALLY SWAPPED OUT FOR PAGE-BEHIND.
2774 NPGBHA: 0 ;NUMBER OF PAGES WE DID PAGE-BEHIND.
2775 NPGAHR: 0 ;NUMBER OF PAGED-AHEAD PAGES ACTUALLY USED.
2776 NPGBHR: 0 ;NUMBER OF PAGES AGED FOR PAGE BEHIND AND USED AGAIN.
2780 ;REFERENCE TO SWAPPED OUT PAGE, MMP ADDRESS IN C. SWAP IN THE PAGE.
2781 ;W HAS THE USER INDEX AND FLAGS.
2782 CFHPO: PUSHJ P,CFHPOA
2783 JRST [ SETZ A, ;FAILED. RETURN CODE FOR FAILURE, IF THIS IS FOR DEVICE (W<0).
2785 TLNN W,100000 ;IF THIS IS A PAGE-AHEAD REQUEST,
2787 MOVSI A,MMPPGA ;MARK THE MMP ENTRY SO,
2789 AOS NPGAHD ;AND COUNT IT AS A SUCCESSFUL ATTEMPT TO PAGE AHEAD.
2790 CFHPOB: TLNN W,200000
2792 PUSHJ P,CFHAHC ;ORDINARY PG FAULT => MAYBE PAGE AHEAD.
2794 IFN SWPWSP,[ ;SWAPPING IN A PAGE FOR THIS GUY
2795 ANDCAM D,USWST(W) ;SO CLEAR BEST EFFORT MADE TO SWAP OUT BIT
2798 TDNN D,USWST(W) ;IF JOB IS BRINGING IN FIRST PAGE
2799 JRST CFHPO2 ; SINCE BEING SWAPPED OUT,
2800 ANDCAM D,USWST(W) ;CLEAR BEST EFFOR MADE TO SWAP OUT BIT
2801 EXCH U,W ;AND MAKE SWAP HISTORY TABLE ENTRY
2802 MOVSI T,0 ;FOR "BEGIN LOADING"
2808 CFHPO2: MOVNI A,1 ;SIGNAL "SUCCESS"
2811 MOVSI D,MMPTMP ;BIT ON IF PAGE "IN TRANSIT"
2813 MOVEM D,EPDL2(W) ;HANG USER UNTIL PAGE GETS WHERE IT'S GOING
2814 HRLI C,(TDNE T,) ;COMBINE WITH ADDRESS OF MMP
2818 ;SWAP IN PAGE. W HAS USER INDEX AND FLAGS. C HAS MMP ADDRESS.
2819 ;SKIPS IF SUCCESSFUL. OTHERWISE RETURNS FLSINS IN C.
2820 ;SIGN BIT IN W IS SET FOR SWAP IN FOR DEVICE OR FOR PAGE-AHEAD
2821 ;(THAT IS, NOT ONE WHICH A JOB MUST WAIT FOR)
2822 ;SO DON'T INCREMENT SOME COUNTERS AND DON'T BOTHER WITH FLSINS IN C.
2825 SKIPGE USWSCD(W) ;IF SWAP BLOCKED, EITHER UNBLOCK OR GIVE UP.
2830 MOVE E,USWST(W) ;IF SWAPPED OUT, WE ARE EITHER GOING TO ENTER
2831 TLNE E,%SWOUT ;THE LOADING STATE OR THE SWAP BLOCKED STATE
2838 JUMPN E,CFHPO5 ;INITIAL SWAPIN; GIVE UP AND WAIT NOW IF TUT IS LOCKED.
2839 CFHPO7: PUSHJ P,HMRQC ;GET PHYS MEM BLOCK, NUMBER IN A.
2840 JRST CFHPO1 ;MEM NOT AVAILABLE
2842 DPB B,[410200,,(C)] ;INDICATE COMING IN
2843 HRRZ B,(C) ;OLD CP OF MMP
2844 MOVEM B,MEMPNT(A) ;BECOMES LINK OUT OF CORE BLOCK
2845 HLRZ B,1(C) ;B := DISK ADDRESS
2846 LDB I,[$MMPUN,,(C)] ;I := DISK NUMBER
2849 HRLM B,MEMPNT(A) ;SET DISK ADDRESS CORE BLOCK COMING FROM
2856 SKIPE E ;IF INITIAL SWAP IN PAGE, SOS THE TUT NOW
2857 PUSHJ P,CFHPO8 ;SINCE WE ARE DISSOCIATING THE PAGE FROM THE DISK BLOCK.
2860 BUG ;SHOULDN'T HAVE TO SWAP IN THE SYSTEM
2861 CONO PI,UTCON-1 ;LEAVE CLKCHN OFF.
2863 AOS SWIPRQ ;TOTAL SWAP IN REQUESTS
2864 ;; MARK THE PHYSICAL MEMORY BLOCK AS BEING SWAPPED INTO BY THIS PAGE.
2866 DPB B,[MUR,,MEMBLT(A)]
2868 HRRM B,(C) ;MAKE CP OF MMP POINT TO MEMPNT
2871 DPB TT,[MMMPX,,MEMBLT(A)] ;STORE MMP INDEX IN MEMBLT
2873 ANDCAM TT,MEMBLT(A) ;SET END OF LIST IN THIS BLOCK
2874 ;; PUT THE TRANSFER ON THE SWAP IN LIST.
2876 HLRZ TT,SINLST(I) ;GET PREV BLOCK
2878 DPB A,[MLO,,MEMBLT(TT)] ;CHAIN TO PREV BLOCK
2880 MOVEM A,SINLST(I) ;OR TO HEADER IF FIRST
2881 HRLM A,SINLST(I) ;AND SET NEW LAST BLOCK
2882 AOS SILNG ;AOS NUMBER OF PENDING SWAP IN RQS.
2883 PUSHJ P,QSTRT1 ;WAKE UP DISK INTERRUPT LEVEL.
2885 ;; UPDATE SWAP HISTORY TABLE.
2887 IDIVI TT,LUBLK ;TT 3.1-3.8 GETS USER NUMBER, BASHES I
2899 MOVEM TT,PGIHTL-1(T)
2901 CAIL T,PGIHTB+PGIHTL
2906 JRST POPJ1 ;HANG USER UNTIL PAGE IN
2908 ;IF SWAPPNG IN "INITIAL SWAP IN" PAGE, CHECK TO SEE WHETHER TUT IS AVAILABLE.
2909 ;WE CAN'T SWAP THE PAGE IN IF NOT.
2910 CFHPO5: LDB I,[$MMPUN,,(C)] ;GET DSK #
2914 JRST CFHPO7 ;DISK TUT AVAIL
2917 JUMPL W,CPOPJ ;NO COUNTER AOS IF SWAPIN FOR DEVICE OR PAGE AHEAD.
2918 MOVE C,[SKIPGE QTUTO] ;ALSO MUSTN'T SMASH C
2923 ;LATER ON, COME HERE TO SOS THE TUT, AFTER GETTING THE MEM, WHEN WE CAN NO LONGER BLOCK.
2924 CFHPO8: ANDCAM E,(C) ;CLEAR INITIAL SWAPIN BIT
2930 HRRZS 1(C) ;CLEAR ASSIGNED TRACK NUMBER SO NEW SPACE ASSIGNED ON SWAPOUT
2933 ;HERE IF NO MEMORY TO SWAP PAGE INTO.
2934 CFHPO1: CONO PI,UTCON-1
2937 SKIPGE MEMFRZ ;IF BECAUSE MEMFRZ LOCKED, MAKE JOB WAIT FOR MEMFRZ.
2939 MOVE C,[SKIPL MEMFRZ]
2943 CFHPO4: MOVE C,[PUSHJ P,CFHPO3]
2945 SUB D,SWPOPR ;- # PGS GOING OUT
2946 ADDI D,10. ;MAKE SURE AT LEAST 10. GOING OUT
2955 CFHPO3: PUSH P,A ;FLSINS ROUTINE (NEEDED MEM)
2959 JRST POPAJ1 ;NEEDED MEM AVAILABLE
2963 JUMPGE A,POPAJ ;WILL EVENTUALLY WIN
2965 ADDM A,SWPOPR ;LOSING - SWAP SOME MORE STUFF OUT
2969 ;HERE IF TRYING TO SWAP IN A PAGE BUT SWAP BLOCKED
2970 CFBO1: MOVE E,MEMFR ;GUY SWAPPED BLOCKED
2975 JUMPGE E,CFBO3 ;SEEMS TO BE ROOM SO LET IT COME IN
2977 JUMPL W,CPOPJ ;HANG GUY UNTIL SWAP BLOCK GOES AWAY
2978 MOVE C,[SKIPGE USWSCD]
2988 OVHMTR WS ;WORKING-SET COMPUTATIONS
2991 ;HERE WHEN A SWAPPED OUT OR SWAP BLOCKED JOB TRIES TO SWAP IN A PAGE.
2992 ;JOB IN W, C -> MMP, USWST(W) IN E. RETURN TO CFSB1.
2993 ;WE DECIDE WHETHER ENOUGH CORE CAN BE GARNERED TO LET HIM IN, AND PUT
2994 ;HIM INTO THE LOADING STATE, OR ELSE PUT HIM INTO THE SWAP BLOCKED STATE.
2997 TLNN E,%SWSB ;ALREADY SWAP BLOCKED?
2998 PUSHJ P,WSRCM ;NO, RECOMPUTE WORKING SET
3000 MOVE B,USWPRI(W) ;FIND SUM OF WS'S OF SWAPPED IN GUY'S WITH BIGGER USWPRI
3002 MOVE D,USVWRK(W) ;COMPUTE AMT OF WS NOT ALREADY IN CORE
3005 CAML D,[TSYSM-100.,,]
3006 JRST .+3 ;WS > PHYSICAL MEM, ALLOW IN ANYWAY, FOO!
3008 CAMGE A,D ;WILL IT FIT IN AVAILABLE MEM?
3009 JRST CFSB2 ;NO, SWAP BLOCK
3010 PUSHJ P,CFELD ;YES, ENTER 'LOADING' STATE
3011 JRST CFSB1 ;AND GO AHEAD AND BRING IN THE PAGE
3013 CFSB2: TLNN W,200000 ;IF PAGE-AHEAD, JUST RETURN.
3016 MOVSI A,%SWSB ;ALREADY SWAP BLOCKED?
3019 IORM A,USWST(W) ;NO, ENTER SWAP BLOCKED STATE
3023 MOVSI T,3_16. ;MAKE SWAP HISTORY TABLE ENTRY FOR SWP BLK
3026 SUB T,USWTIM(W) ;HOW LONG SWAP BLOCKED
3027 CAIGE T,20.*30. ;IF LESS THAN 20 SECONDS,
3028 SKIPA T,[15.] ; SLEEP FOR 1/2 SECOND,
3029 MOVEI T,5*30. ; OTHERWISE SLEEP FOR 5 SECONDS
3033 MOVEI A,0 ;WILL THEN TAKE FAULT AGAIN AND
3034 MOVE C,[CAMLE T,TIME] ;CHECK AVAILABLE MEMORY AGAIN
3038 ;ROUTINE TO FIND MEMORY AVAILABLE TO A JOB WHOSE USWPRI IS IN B
3039 ;RETURNS IN LH(A) SUITABLE FOR COMPARING TO UWRKST. SMASHES T,TT,J
3041 WSAVL: MOVEI J,2*LUBLK ;DON'T LOOK AT SYS NOR CORE JOB
3042 MOVSI T,%SWOUT+%SWLOD ;IF THESE BITS CLEAR, JOB IS SWAPPED IN
3043 MOVE A,MEMFR ;FREE CORE
3044 SUB A,NCBCOM ;FUDGE FOR THINGS IN PROCESS
3047 ADD A,NLOOSP ;LOOSE PAGES ARE EVICTABLE
3048 SUB A,SWPOPR ;DON'T COUNT PAGES ALREADY COMMITTED TO EVICT
3049 HRLZI A,-4(A) ;ALIGN AS UWRKST AND ALLOW 4 PAGES OF SLOP
3050 SKIPA TT,TIME ;TO SEE IF PROTECTED AGAINST MEMORY PREEMPTION
3051 WSAVL1: ADDI J,LUBLK
3056 JRST WSAVL1 ;DOESN'T EXIST, OR NOT SWAPPED IN, OR LOADING
3059 JRST WSAVL1 ;HIGHER PRIORITY OR PROTECTED
3060 ADD A,UWRKST(J) ;THIS GUY'S WORKING SET IS PREEMPTABLE
3063 ;Routine to re-compute working set, also re sets up map
3064 ;to point to any pages which are swapped in but not mapped in.
3065 ;This is necessary in order to get the proper estimate of
3066 ;how much core is going to have to be swapped out to make
3067 ;this job fit. Called when a job leaves the swapped-out state,
3068 ;to enter either Loading or Swap-blocked.
3069 ;Job is in W, smashes A,B,C,D,E,T,TT,H,I,U.
3070 ;Call with CIRPSW locked and clk in progress.
3071 WSRCM: SETZM UWRKST(W)
3072 MOVEI E,UPGMP(W) ;SET UP SCAN OF USER'S MAP
3074 MOVEI C,UPGCP(W) ;AND OF CIRCULAR POINTERS
3076 LDB D,[121100,,HUSRAD(W)] ;# OF USER PAGES
3077 WSRCM1: ILDB A,E ;GET PAGE MAP ENTRY
3078 ILDB B,C ;AND CIRCULAR POINTER
3079 JUMPE A,WSRCM2 ;JUMP IF PAGE DOESN'T EXIST
3081 JRST WSRCM2 ;ABS PAGE, DON'T COUNT
3082 TRNN A,600000 ;ALREADY SWAPPED IN?
3083 JRST WSRCM3 ;NO, GO PONDER
3084 ANDI A,PMRCM ;GET PAGE MAPPED TO
3085 HRRZ B,MMSWP(A) ;GET # SHARERS
3086 MOVSI A,1 ;COMPUTE WS ADJUSTMENT
3089 WSRCM2: SOJG D,WSRCM1 ;LOOP
3092 WSRCM3: PUSH P,C ;PAGE NOT MAPPED, SEE IF IT'S IN
3094 100000,,WSRCM4 ;RETURN WITH 4 PUSHES IF MEMORY IN LOOP
3095 POP P,C ;NO MEMORY, LEAVE ALONE
3099 WSRCM4: SUB P,[4,,4] ;FOUND MEMORY, IN T
3101 MOVEI A,2 ;USE READ/WRITE/FIRST RATHER THAN READ/WRITE
3103 IORI A,PMCSHM(T) ;SET UP MAP
3105 AOS C,MMSWP(T) ;ONE MORE USER POINTING TO PAGE
3108 IDIVM A,B ;ADJUST WS AS IF WAS ALREADY POINTING TO PAGE
3109 ADDM B,UWRKST(W) ;ADDM DOES NOTHING IF THERE WAS DIVIDE BY ZERO
3110 IMULI C,-1(C) ;COMPUTE WS DECREASE DUE TO ADDITIONAL SHARING
3112 IDIV A,C ;IF DIVIDE BY ZERO, A GETS RIGHT THING!
3113 MOVE C,(P) ;ADJUST ALL SHARER'S WS'S
3120 WSRCM5: ADDM A,UWRKST(U)
3123 ;LEAVE LOADING STATE IF IN IT. JOB IN U, SMASH C,TT,T,I
3124 LVLOAD: MOVE C,USWST(U)
3126 POPJ P, ;NOT IN LOADING STATE
3127 LVLOA0: MOVEM C,USWST(U) ;TURN OFF LOADING STATE
3129 SUB T,USWTIM(U) ;TIME IT TOOK TO LOAD
3130 IMUL T,LODFCT ;COMPUTE PROTECT TIME
3134 MOVSI T,1_16. ;MAKE SWAP HISTORY TABLE ENTRY
3137 ;PUT JOB IN W INTO THE 'LOADING' STATE. CALL WITH D CONTAINING USVWRK-UWRKST.
3138 ;WSRCM MUST HAVE BEEN CALLED ALREADY ON THIS JOB. SMASHES A,D,T,TT,I
3140 CFELD: MOVE T,USWST(W)
3142 SOS NUSWB ;CEASES TO BE SWAP-BLOCKED
3143 TLZ T,%SWOUT+%SWSB+%SWDSO+%SWBEM
3146 MOVE T,TIME ;SAVE TIME STARTED TO LOAD
3149 MOVSI T,0 ;MAKE SWAP HISTORY TABLE ENTRY
3152 HLRZ D,D ;NUMBER OF PAGES GOING TO NEED, PROBABLY
3153 MOVE A,MEMFR ;FREE CORE
3154 SUB A,NCBCOM ;FUDGE FOR THINGS IN PROCESS
3157 SUB D,A ;NUMBER OF PAGES GOING TO HAVE TO SWAP OUT
3159 ADDM D,SWPOPR ;START THEM GOING OUT NOW
3163 OVHMTR FLT ;MISC FAULTS
3165 CFH4: TLNE W,100000 ;PAGE-AHEAD OF NON-EX PAGE: DO NOTHING.
3167 JUMPL W,SWIILM ;IF FROM DMA DEVICE, GIVE ERROR
3168 ;HERE FOR FAULTS WHICH ABORT THE INSTRUCTION.
3169 PFA7: MOVE T,OPTION(U) ;IF USER WANTS IT,
3170 TLNN T,%OPOPC ;GIVE HIM THE OPC RATHER THAN
3171 AOSA T,CLKBRK ;THE INCREMENTD PC.
3172 PFA7A: MOVE T,CLKBRK ;HERE FOR KL10 MAR BREAK AND KS10 NXI
3173 ;ERROR, ALWAYS GIVE ORIGINAL PC, INST
3177 MOVEI C,IOADCR ;FROM EXEC MODE SO RESET PC TO IOADCR
3179 HRRM C,LEXFDR(U) ;AND SAVE FAULT EXEC ADR FOR DEBUGGING
3180 CLEARM DLSRCH ;IN CASE IT WAS SET
3181 CLEARM UMAPS(U) ;RESTORE NORMAL MAP IN CASE RANDOM ONE WAS
3184 CLKB1J: HRLM D,LEXFDR(U) ;SAVE PF BITS FOR DEBUGGING PURPOSES
3186 IFN KS10P,[ TRNE D,%PFNXI ;Non-existent IO register in KS10 Unibus.
3190 IFN KS10P, TRNN D,%PFNXI\%PF2.9\%PF2.8
3191 IFN KA10P, TLZE D,210 ;NO ACCESS OR DBL
3192 IFN KL10P, CAIN D,%PFPNA
3196 IFN KA10P, TLZE D,20 ;PURE
3197 IFN KL10P, CAIN D,%PFPRO
3201 IFN KS10P, CAIN D,%PFWRT\%PF2.8
3202 IFN KA10P, TLZE D,100 ;W IN RD ONLY
3203 IFN KL10P, CAIN D,%PFILW
3206 TDNE A,[%PIMPV\%PIWRO\%PINXI]
3207 PUSHJ P,MPVMAS ;SAVE FAULT PAGE # FOR DEBUGGING
3209 ;;; NO ABORT-TYPE FAULTS, CHECK OTHERS:
3212 IFN KL10P, CAIN D,%PFMAR
3217 IFN KA10P,[ TLZE D,2000
3218 PUSHJ P,CPROC1 ;ONE PROCEED
3219 ANDCA D,UPQUAN(U) ;GET BITS FLUSHED BY TLZE'S
3224 ANDCMI D,-1 ;DON'T CLOBBER USER'S RUNTIME.
3225 TLZ D,4 ;DON'T CLOBBER EXEC PAGING FLAG.
3226 TLO D,1 ;IGNORE QUANTUM-TIMEOUT INT.
3229 CLKB1K: LPMR UPGML(U)
3230 CLKB1G: IFN KA10P, CONO 470000+APRCHN ;RESET
3231 CLB1X: MOVE T,CLKBRK ;PUT USER'S PC WHERE IT BELONGS
3234 IOR B,MSKST(U) ;GET OR OF ENABLED AND BAD BITS
3235 AND B,A ;GET AND WITH BITS ACTUALLY ON
3236 JUMPE B,CLB1XA ;NOT BAD OR ENABLED, FORGET ABOUT IT
3237 IORM B,PIRQC(U) ;GIVE INTERRUPT
3238 CAIN T,IOADCR ;READY TO BE INTERRUPTED?
3239 JRST CLKB5 ;NOT QUITE, RUN MOMENTARILY AND WILL UFLS
3240 IFN SCHBLN,SETZM SCHMNY ;DO FULL SCHEDULE TO DELIVER THE INTERRUPT
3243 CLB1XA: MOVSI T,%SWINT .SEE INTPFL ;IF PAGE FAULT DUE TO USER TRYING TO
3244 TDNN T,USWST(U) ;INTERRUPT, BETTER SCHED SO HE GETS THE INT.
3245 SKIPE FLSINS(U) ;ELSE PROCEED THE USER IF HE HAS GOT WHAT HE WANTED.
3246 JRST SCHED2 ;OR IF HE'S WAITING, GO SCHEDULE.
3249 IFN KA10P,[ ;NULL JOB LOST
3250 CNLJL: CONSZ 230220 ;SKIP ON JUST "ADDR BREAK" (QUANTUM OVERFLOW)
3251 BUG PAUSE,[KA: APR ERROR IN NULL JOB]
3255 CFHFPF: BUG PAUSE,[PAGE FAULT IN SYSTEM, PC=],OCT,CLKBRK,[PAGE=],OCT,E
3256 MOVSI D,1770 ;FALSE PAGE FAULT
3264 CONI RINTAP ;SAVE STATUS IN CASE SOMEONE DUMPS IT
3266 BUG AWFUL,[RANDOM INTERRUPT, APR ],OCT,RINTAP,[PI ],OCT,RINTPI
3267 JRST 12,@RINT ;YOU CAN TRY PROCEEDING
3270 RINTAP: 0 ;APR STATUS AT RINT
3271 RINTPI: 0 ;PI STATUS AT RINT
3273 IFN KS10P,[ ; On KS, all random interrupts are created equal.
3292 IFE KS10P,[ ;KS10 HAS NO MAR
3296 HLLZ B,UPOPC(U) ;FLAGS
3300 XOR T,CLKBRK ;DID PC CHANGE FROM START OF INST TO PLACE TRAPPED?
3301 TDNE T,[#<%PCFPD,,>]
3302 TLO B,(@) ;YES, INSTRUCTION COMPLETED, FLAG FOR USER
3303 ] ;KA10P ;LOSES FOR JSR .-1 WITH MAR AT .-1, BUT OTHERWISE OK
3305 MOVE B,CLKBRK ;PC OF FAULTING INST IF USER, OR IOADCR IF EXEC
3306 ; MOVEM B,UPOPC(U) ;SOLELY FOR .OPC USER VAR
3307 ;NOTE- ON KL10 THE INSTRUCTION IS NEVER COMPLETED, DON'T SET 3.5
3310 JRST PCMAR1 ;USR MODE, USE PC FROM PAGER
3311 MOVE B,UUOH ;EXEC MODE, USE USER PC (UUO)
3313 IFN KL10P,[ ;ON KL10 AVOID DOING AOS UUOH AT IOADCR
3318 PCMAR1: MOVEM B,UMARPC(U)
3321 IFN KA10P, DPB B,[220300,,UPMAR(U)] ;DISABLE MAR
3322 IFN KL10P, DPB B,[270400,,UPMAR(U)] ;DISABLE MAR
3328 CPROC1: MOVE T,CLKBRK
3329 TLNN T,%PCUSR ;SKIP IF FROM USER MODE
3331 TRO A,%PI1PR ;GIVE USER INTERRUPT
3334 CPRUUO: MOVE T,[JRST ONEPROC] ;ONE PROCEED INT. FROM EXEC. MODE
3335 MOVEM T,UEXIT ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
3340 JRST AROV2 ;NOT REALLY SET OR SET BY SYS
3342 SKIPE PICLR(U) ;SKIP IF INTERRUPTS TO USER NOT ENABLED
3343 TRO A,%PIARO ;GIVE USER INTERRUPT
3346 AROV2: MOVEM T,CLKBRK
3358 ;;; HANDLE PARITY ERRORS.
3360 CLKB1E: SETZM PARDIE ;AT FIRST ASSUME THE PAR ERR ISN'T FATAL.
3361 CONO PI,PIOFF ;TURN OFF WORLD
3362 IFN KA10P, CONO PI,240000 ;RESET
3363 IFN KL10P,[ ;CLEAR THE CACHE
3369 CLRCSH ;Clear the cache
3372 TDNE B,SUPCOR ;IF PREV ERROR NOT PRINTED, PRINT IT NOW AND PAUSE
3373 BUG PAUSE,[TOO MANY PARITY ERRORS. PREV STATUS=],DEC,PARCNT,OCT,PARAAN,OCT,PARAOR,OCT,PARAND,OCT,PARIOR
3374 IORM B,SUPCOR ;TELL SYS JOB TO PRINT OUR DATA WHEN WE FINISH.
3375 AOS PARERR ;COUNT # OF PAR ERRS SINCE SYSTEM STARTED.
3376 SETOM PARAND ;INIT LOGAND AND LOGOR OF ALL BAD DATA WORDS
3378 SETOM PARAAN ;AND SIMILAR FOR ADDRESSES OF PAR ERRS.
3383 MOVEM T,PARUSR ;REMEMBER WHICH JOB GOT THE PAR ERR.
3384 JUMPL T,PARSCJ ;PAR ERR IN NULL JOB? OR WHAT?
3386 SKIPE PARRSN ;PAR ERR IN WORD NOT REFERENCED
3387 JRST PARSCJ ; SHOULDN'T SCREW THE RUNNING JOB
3390 SETOM PARDIE ;PAR ERR IN A SUPERVISOR-MODE JOB IS HOPELESS.
3392 IORM TT,PIRQC(T) ;GIVE RUNNING USER A PARITY ERROR (CLASS 1 INT)
3395 PUSH P,PFNPC ;MAKE SURE THE PAR ERRS WE DETECT WHILE SCANNING DON'T
3396 MOVEI D,PARFX4 ;CALL US RECURSIVELY (ON KA, THAT'S DONE BY HAVING
3397 MOVEM D,PFNPC ;CLKCHN OFF)
3400 PUSH P,EPTP7N ;Same hack for the KS except page fails trap
3401 MOVEI D,PARFX4 ;as a function of current PI level.
3404 MOVEI D,0 ;POINTER TO ERROR BUFFER
3406 PUSHJ P,PARSCN ;SCAN MAIN MEM BLOCKS
3408 MOVE TT,[-LPDP6M,,PDP6BM_-10.] ;SCAN PDP6 MEM FOR PARITY ERRORS
3409 SKIPGE PDP6UP ;BUT NOT IF PDP6 IS DOWN.
3414 CONO 024400+APRCHN ;CLEAR PAR ERR FLAGS.
3418 CONO 020200+APRCHN ;CLEAR FLAG
3419 MOVSI A,%KEHLD+%KEREF ;CLEAR STATUS AND ERROR ADDR
3423 DPB A,[.PAREP+EXEUMP]
3424 LPMR PARPG ;SET UP MAP WITH PARPG SET TO MPV.
3425 MOVEM D,PARCNT ;SAVE AWAY COUNT OF ERRORS IN BUFFER
3427 BUG HALT,[PARITY ERROR IN SYSTEM MEMORY. CNT=],DEC,PARCNT,[ADR AND ],OCT,PARAAN,CR,0,[ ADR IOR ],OCT,PARAOR,[DATA AND ],OCT,PARAND,[DATA IOR ],OCT,PARIOR
3428 ;FATAL ERROR (DONT ALLOW CONTINUE SINCE ERR IS
3429 ;KNOWN TO BE A LOSER)
3430 CONO PI,PION ;TURN WORLD BACK ON
3434 PARFX3: HRRZ T,TT ;SCAN AOBJN POINTER IN TT
3437 LDB T,[MUR,,MEMBLT(TT)]
3439 JRST PARFX8 ;HOLE THERE
3440 PARFX7: MOVEI T,600000(TT) ;NOTE THAT WE ARE NOT ENABLING THE CACHE.
3441 DPB T,[.PAREP+EXEUMP] ;ON KL10 THIS WILL CAUSE A 1-WORD READ.
3442 LPMR PARPG ;SET UP TO CHECK PAGE # IN TT
3443 MOVEI B,0 ;ADDRESS WITHIN PAGE
3445 IFN KA10P, CONO PI,200000 ;CLEAR PAR ERR
3446 PARFX5: MOVE C,400000+PAREP*2000(B) ;REFERENCE EVERY MEMORY LOCATION
3448 ;;ON KA, MUST CHECK EXPLICITLY.
3449 ;;ON KL AND KS, PAR ERR WILL TRAP RIGHT TO PARFX4.
3450 CONSZ PI,200000 ;PARITY ERR?
3453 CAIGE B,1777 ;SKIP ON FINISHED WITH BLOCK
3455 PARFX8: AOBJN TT,PARFX3 ;CHECK NEXT PAGE
3458 PARFX4: ;HERE WHEN THE SCAN FINDS A WORD WITH BAD PARITY
3459 IFN KL10P, HRRZ T,PFOPC
3460 IFN KS10P, HRRZ T,EPTP7O
3462 ;;DID THIS TRAP COME FROM SCAN LOOP WHERE WE EXPECT THEM?
3466 UMOVE C,0 ;GET CONTENTS OF LOCATION WITH BAD PARITY
3469 SETO T, ;MAKE SURE T ISN'T ACCIDENTALLY 0 AT PARFX6.
3472 IOR E,B ;MAKE MEM ADR
3473 CAIGE E,20 ;PAR ERR IN SHADOW ACS ISN'T SERIOUS.
3475 ANDM E,PARAAN ;UPDATE ANDS AND ORS OF DATA AND ADRS
3481 SETOM PARDIE ;PARITY ERROR IN EXEC CORE
3485 LDB T,[MUR,,MEMBLT(TT)]
3495 SETOM PARDIE ;ERR IN CRITICAL MEMORY (DISK DIR, ETC)
3496 PARFX6: MOVEM C,400000+PAREP*2000(B) ;FIX UP MEMORY AS BEST WE CAN
3497 MOVEM C,PARCON(D) ;SAVE LOSING CONTENTS
3498 MOVEM E,PARADR(D) ;SAVE LOSING ADDRESS
3499 CAIL D,MXPARS-1 ;OVERFLOWING BUFFER?
3500 SOS D ;JUST DON'T CLOBBER STUFF. AT LEAST PARAND, ETC. WILL BE VALID.
3502 PUSH P,D ;PAR. ERR IN USER MEMORY,
3506 PUSHJ P,UCPRL4 ;HAS ANY JOB WRITTEN IN THIS PAGE?
3508 JUMPL D,PARFXB ;SOMEONE HAS; JUST GIVE EVERYONE AN INTERRUPT.
3509 PUSHJ P,UCPRL4 ;DOES MMP SAY PAGE WAS WRITTEN? IF SO, SET SIGN(D);
3510 200000,,PARFU2 ;OTHERWISE, SET MMPBAD, CAUSING PAGE TO BE RELOADED FROM DISK.
3512 PARFXB: PUSHJ P,UCPRL4 ;PAGE HAS BEEN WRITTEN SINCE LAST ON DISK, SO WE CAN'T ESCAPE
3513 400000,,PARFU3 ;GIVING EVERY JOB AN INTERRUPT.
3515 PARFX9: AOS B ;INCREMENT B HERE SO YOU DON'T HACK THE SAME
3516 ; WORD AGAIN. IF THAT WORD WAS SOLIDLY BAD,
3517 ; THIS CODE WOULD LOOP
3518 CAIG B,1777 ;MIGHT BE DONE WITH PAGE
3522 PARFU1: CAIG U,LUBLK
3523 SETOM PARDIE ;SYS JOB OR CORE JOB HAS PAGE
3525 MOVE A,I ;FIND PAGE-MAP HALFWORD FOR THIS PAGE
3530 CAIE A,1 ;MAP SET UP TO A PAGE, AND IN READ-ONLY MODE?
3532 DPB A,T ;YES, UNMAP IT SO THAT NEXT ACCESS WILL TRAP AND GO TO CFHPB
3533 SOS MMSWP(D) ; IN CASE WE WILL SET MMPBAD.
3534 ;NOTE, THIS MAY CRASH THE SYSTEM IF THE JOB WAS RUNNING IN A UUO,
3535 ;HAD CHECKED ACCESS TO THE PAGE, AND WAS ASSUMING IT COULD ACCESS
3536 ;IT AGAIN SAFELY. USUALLY THIS ONLY HAPPENS WHEN WRITING, HOWEVER.
3537 IFN SWPWSP, ;DON'T BOTHER ADJUSTING WORKING SET. WILL BE FIXED ON NEXT SWAPIN.
3539 PARFU4: TLO D,400000 ;IF THIS JOB HAS WRITTEN THE PAGE, SET SIGN (D)
3540 POPJ P, ;TO SIGNAL THAT SETTING MMPBAD IS NO USE.
3542 PARFU2: MOVE T,(C) ;C HAS ADDR OF MMP ENTRY; HAS PAGE BEEN WRITTEN BY A JOB
3543 TLNN T,MMPWRT ;THAT NO LONGER HAS IT IN MAP?
3544 TLNN T,MMPWOD ;OR HAS IT NEVER BEEN ON DISK?
3545 JRST PARFU4 ;IF SO, AVOID SETTING MMPBAD, AND INTERRUPT EVERYONE.
3547 JUMPE T,PARFU4 ;DITTO IF THERE IS NO DISK SPACE ASSIGNED.
3552 PARFU3: MOVSI T,(%PIPAR)
3558 LDB B,[221100,,UPJPC(U)] ;FAULT ADDR
3559 TRZN B,400 ;SKIP IF REFERENCE WAS VIA USER MAP
3564 HRLI C,PMLCAD ;POINTER TO CORE ADR FIELD OF LH PAGE IN MAP WD
3566 HRLI C,PMRCAD ;RH MAP WD
3567 LDB C,B ;C GETS PAGE #
3568 CAIGE C,<PDP6BM_-10.>+LPDP6M
3573 JRST MEMHN3 ;USER MODE PDP6 NXM
3574 MOVEI B,IOCER3 ;PDP6 MEM
3580 ; JRST 4,.+1 ;COMMENTED OUT SINCE NXM STOP SHOULD ALWAYS BE SET.
3582 IFN KA10P,CONO 10000+APRCHN ;CLEAR NON EX MEM AFTER HALT TO RESET MEMORY
3583 IFN KL10P,CONO 22000+APRCHN
3585 CONO 20400+APRCHN ;Clear APR flag
3586 MOVSI B,%KEHLD+%KEREF ;Clear saved error address
3590 TDNE B,SUPCOR ;Haven't printed previous error?
3591 BUG PAUSE,[TOO MANY NXM ERRORS.]
3601 MEMHN3: MOVSI B,%PIMPV ;PDP6 NXM GIVE MPV INTERRUPT
3605 \fSUBTTL SLOW CLOCK SERVICE ROUTINE
3607 OVHMTR SLW ;SLOW CLOCK
3609 SSLCK: SKIPGE SHUTDN ;SYSTEM "DEAD" =>
3610 PUSHJ P,COFFIN ;GO TO DDT AFTER RIGOR MORTIS SETS IN.
3611 SETCMB A,SCKPHS ;CHECK SYSTEM CHECKSUMS EVERY OTHER SLOW CLOCK TICK
3612 MOVE T,SUPCOP ;WHICH IS ONCE PER SECOND.
3616 CONSO 100 ; Check for memory ECC corrected errors
3618 IORD A,[KSECCS] ; A: status and error addr
3619 MOVEM A,ECCERA ; Remember most recent one
3620 AOS ECCERR ; Also count 'em
3621 CONO 20100+APRCHN ; Clear memory ECC APR flag
3622 MOVSI T,%KEHLD+%KEREF ; Clear status and error addr
3625 AND A,ECCAND ; A: AND of previous errors
3626 IOR T,ECCIOR ; T: IOR of previous errors
3627 CAMN A,ECCAND ; If either changes, this is news.
3629 BUG INFO,[MEMORY: ECC CORRECTED ERROR],OCT,ECCERA
3632 SSLCK0: ] ;IFN KS10P
3633 IFN NETP,PUSHJ P,NETCLK ; Run 1/2 sec clock routines for various net stuff
3634 IFN NETYS, SETOM DTECHK ;TELL 11 WE'RE ALIVE
3637 CONO DPK,TTYCHN ;CROCK - IF DPK LOSES ITS PIA, GIVE IT BACK.
3642 SETOM UTBFLF ;SIGNAL CORE JOB TO FLUSH UTAPE BUFFERS
3644 SSLCK2: SKIPE UTTYCT ;SKIP IF NO NEW USERS
3645 SKIPL TREESW ;SKIP UNLESS SOMEBODY'S MUNGING THE TREE STRUCTURE.
3647 PUSHJ P,USTART ;NEW USER TO START
3652 MOVEM T,DWDS ;RESET DISPLAY RATE COUNTER
3654 CONO PI,UTCOFF ;UTC OFF WHILE HACKING UTAPE, MTAPE, DISK, ETC.
3662 AOSN UIDLE ;SKIP IF DEC TAPE NOT IDLE
3663 JRST [MOVEM T,LUTOTM ? JRST SSLCK1] ;DEC TAPE IDLE
3664 SUB T,LUTOTM ;SUBTRACT LAST UTC OPERATION TIME
3666 CAIGE T,MXOPT*SCLKI ;SKIP IF DEC TAPE HUNG TOO LONG ON ONE OPERATION
3668 SETOM UTHERR ;SET UTC HUNG ERR FLAG
3669 SSLCK1: CONO UTC,CUINT ;CAUSE DEC TAPE INTERRUPT ROUTINE TO RUN
3675 JRST [MOVEM T,LUTOTM ? JRST SSLCK1]
3684 SKIPL QSDU ;IF DISK TRANSFER IN PROGRESS
3685 JRST [ MOVE T,LQTM ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3688 PUSHJ P,QHUNG ;YES, UNHANG THE DISK
3691 SKIPL QSDU1 ;IF TRANSFER IN PROGRESS ON OTHER CONTROLLER
3692 JRST [ MOVE T,LQTM1 ;SEE IF IT'S TAKING UNREASONABLY LONG TIME
3695 PUSHJ P,QHUNG1 ;YES, UNHANG THE DISK
3698 IFN DC10P, PUSHJ P,QRCTMO ;RECALIBRATE TIMEOUT
3700 PUSHJ P,QSTRTR ;WAKE UP DISK ROUTINES
3701 IFN NMTCS, PUSHJ P,MSTRTR ;WAKE UP MAG TAPE ROUTINES (MUST BE SEPARATE INTR)
3705 IFG NMTYS,[ ;TRY TO UNHANG MORTON TTY CARDS
3706 MOVE I,[-NMTYS,,NFMTY]
3708 SUBI T,60. ;IF HAVEN'T TYPED FOR 2 SECONDS
3709 SSLCM1: SKIPL TTYOAC(I) ;YET SUPPOSED TO BE TYPING
3713 CONO MTY,@TTYLT(I) ;SELECT THE LINE
3714 DATAO MTY,[0] ;AND BANG ON IT
3715 CONO PI,TTYON-1 ;MAYBE IF WE'RE LUCKY ITS DONE FLAG WILL COME ON
3716 SSLCM2: AOBJN I,SSLCM1
3719 IFN KAIMP, CONI IMP,IMPCNI ;KEEPS HOST READY ON
3721 ;KS doesn't drop interrupts, I hope
3722 PUSHJ P,IMPOST ;START UP OUTPUT
3726 PUSHJ P,IMPCCL ;CLOSE NETWORK CHANNELS
3728 PUSHJ P,IMPAAA ;WAKE UP STYS THAT NEED IT
3730 SKIPGE IMPTCU ;IF IMP IS TRYING TO COME UP
3731 AOSE IMPUCT ;AND UP-COMING TIMEOUT EXHAUSTED
3733 BUG INFO,[NET: TIMED OUT TRYING TO COME UP]
3734 MOVEI A,1 ;THEN MAKE IT STAY DOWN
3735 MOVEM A,IMPUP ;IF THIS IS ML-KA THE IMP CABLE PROBABLY BROKE AGAIN
3740 CONO DSDEV,DSDCHN ;ENABLE INTERRUPTS FROM 6
3746 BUG CHECK,[TTY: TIMEOUT ON OUTPUT XFER TO DTE, DTEBBY],OCT,DTEBBY
3750 ;SEE IF THE TV PDP11 WANTS TO GO DOWN.
3751 SKIPN TEN11F ;PROVIDED THE PDP11 IS THERE,
3752 SKIPN TT11P ;AND WE'RE TRYING TO USE IT,
3754 LDB A,[061600,,TT11HA] ;DOES 11 WANT WHO LINES UPDATED?
3755 CAIL A,2000*NTTPG ;RANGE CHECK SO CLOBBERED 11 MEMORY DOESN'T CAUSE ILL MEM REF
3756 BUG HALT,[GARBAGE POINTER IN TV-11 MEMORY]
3757 SKIPGE 1+400000+TTPG0*2000(A)
3758 JRST [ MOVEI T,SCRWHO ;YES
3760 CLEARM 1+400000+TTPG0*2000(A)
3762 SKIPE TT11DN ;IF IT IS REQUESTING TO GO DOWN,
3764 SETZM TT11P ;DON'T USE IT & WAIT FOR IT TO RE-INIT,
3766 MOVEM T,TT11DN ;GIVE IT OUR PERMISSION TO GO DOWN.
3767 MOVEI T,SCR11D ;CAUSE "11 DOWN" MESSAGE
3769 SSLCK5: SKIPN TEN11F
3770 SKIPG TT11P ;WAITING FOR 11 TO BE UP?
3772 SKIPN TT11UP ;SKIP ON 11 UP
3775 IORM T,SUPCOR ;INIT THE TTYS
3778 SKIPLE T,AGERTE ;IF IT'S ENABLED, AGE SOME PAGES
3786 SETOM DL10UP ;COULD ALSO CHECK WHETHER PDP11 IS INCREMENTING THIS.
3788 TRNE A,20 ;SEE IF PDP11 HALTED.
3790 BUG INFO,[I/O PDP11 WENT DOWN]
3798 AOS QACTTM ;Bump this for benefit of QSK dir writers.
3799 SKIPN SWPOPR ;If there is a request to swap out pages
3800 SKIPE SOLNG ; or if there are pages now going out
3801 JRST SSKQ2 ; do not bother with LMEMFR, warnings.
3802 MOVN A,LMEMFR ;See how many free low-memory pages.
3804 JUMPLE A,SSRCK ;Okay
3805 AOS NCORRQ ;Wake up core job to do some shuffling
3807 ADD A,LMEMFR ;Core wanted minus high free
3809 ADDM A,SWPOPR ;Swap out to make room.
3810 ;Check to see if we are running out of various resources.
3811 ;RSWTIM is a timestamp of last warning, initialized by DATIM6 and PDDCHK.
3812 SSRCK: MOVE A,RSWTIM ;Get time we last checked.
3814 CAML A,TIMOFF ;If we checked less then 30 secs ago
3815 JRST SSKQ2 ; don't deluge the console.
3816 MOVE A,TIMOFF ;Else remember that we are cheking now.
3818 MOVEI A,5 ;There should be at least 5 free low pages.
3819 CAMLE A,LMEMFR ;If there are not, print warning.
3820 BUG INFO,[Warning: Just ],DEC,LMEMFR,[ free pages in low core.]
3821 SKIPN QFCHN ;Check disk channels.
3822 BUG INFO,[Warning: No free qsk channels.]
3823 MOVN A,USRHI ;Check job slots.
3827 BUG INFO,[Warning: System full - no job slots.]
3831 PUSHJ P,DISCHK ;CHECK FOR 340 DEATH
3833 PUSHJ P,PDCCHK ;CHECK ON REAL-TIME HACKS
3835 PUSHJ P,PTRCHK ;CHECK ON PAPER TAPE READER
3836 PUSHJ P,PTPCHK ;CHECK ON PAPER TAPE PUNCH
3838 IFE KS10P,[ ; Silly KS10 doesn't have devices...
3843 SCDCK1: SKIPGE A,DCHNTC(I)
3851 SCDCK2: AOBJN I,SCDCK1
3852 SCDCK3:; JSP E,CHECK ;CHECK FOR CLOBBERED DEVICES
3856 MOVE A,NLPTBR ;IF LPT OUTPUT BUFFER NOT EMPTY
3858 JRST [ CONSZ NLPT,100 ;AND LPT IS READY
3859 CONSZ NLPT,7 ;BUT HAS NO PIA
3861 CONO NLPT,LPTCHN ;THEN IT LOST AGAIN
3862 AOS NTNLPL ;COUNT NUMBER OF TIMES NEW LPT LOST
3867 ;THIS ASSUMES THAT THE PDP-10/XBUS ADDRESS OFFSET IS ZERO
3868 ECCLOG: MOVE B,400000+ECCPG*2000+1760
3870 CAMN B,ECCIDX ;DID ECC HISTORY POINTER ADVANCE?
3872 AOS A,ECCIDX ;YES, GET NEXT WORD FROM ECC HISTORY
3873 MOVE B,400000+ECCPG*2000+1760-1(A)
3874 ANDI A,17 ;ADVANCE OUR COPY OF POINTER
3876 LDB A,[240700,,B] ;SYNDROME BITS
3877 TLZ B,777774 ;REDUCE B TO ADDRESS BITS
3878 BUG INFO,[MEM: ECC ERROR, ADDRESS ],OCT,B,[SYNDROME],OCT,A
3879 JRST ECCLOG ;LOOK FOR MORE HISTORY
3883 PUSHJ P,GPDTIM ;WHAT CALENDAR TIME IS IT?
3885 EXCH A,LPDTIM ;REMEMBER IT FOR NEXT CLOCK TICK.
3886 JUMPL A,ALCR0 ;TIME NOT KNOWN THIS AND/OR LAST TICK => DO NOTHING
3887 SUB A,LPDTIM ;ELSE HOW LONG HAS IT BEEN SINCE PREVIOUS TICK?
3888 CAML A,[-5*PDUPS] ;MORE THAN 5 SECONDS? SHOULD ONLY BE 1/60
3889 JRST ALCR0 ;ONLY EXPLANATION IS ITS WAS STOPPED AND CONTINUED.
3890 SKIPL SYSDBG ;SO UNLESS THAT'S NORMALLY EXPECTED
3891 PUSHJ P,DEATHM ;TELL THE WORLD "ITS REVIVED"
3892 MOVE T,TIME ;REMEMBER WHEN THIS LAST HAPPENED
3898 ;DECAY VARIOUS EXPONENTIAL AVERAGES. ON KA10, RUN IN ACS SINCE IT'S FASTER.
3899 ;ON KL10, DON'T, SINCE IT'S SLOWER. ON KS10, DON'T, BECAUSE IT IS
3900 ;JUST AS FAST TO RUN IN THE ACS BUT IT WASTES TIME TO MOVE THE CODE
3910 ALCR1: MOVN T,USRRCE(U) ;A ;DECAY USRRCE AVERAGES
3913 CAMLE T,SLOADU ;D ;AND SET SLOADU TO HIGHEST USRRCE
3919 IFE KA10P, AOBJN U,ALCR1
3922 ASH T,-4-2 ;DISOWNED JOBS (DECAY SLOWER)
3924 IMULI T,1999. ;MAKE COMMENSURATE WITH REGULAR USRRCE'S
3925 ASH T,-13. ; (You might think that you could just
3926 ; divide by 4, but in fact the ratio
3927 ; between the two decay rates is
3928 ; ln(64/63)/ln(16/15) = .24401474)
3929 ADDM T,SLOADU ;DISOWNED TIME COULD HAVE BEEN USED BY REAL
3932 ASH T,-4+1 ;SYS, CORE, AND SOME DAEMON JOBS (DECAY FASTER)
3934 IRPS RCE,,LOSRCE IDLRCE
3935 MOVN T,RCE ;LOST TIME AND IDLE TIME
3939 ADDM T,SLOADU ;IDLE TIME COULD HAVE BEEN USED BY USERS
3941 IFE KS10P, MOVE A,[193682794.] ; = 100. * 250000. * .5 / ln(16/15)
3942 ; (100% of 250000. four usec ticks per second,
3943 ; decaying by 16/15 every .5 second.)
3944 IFN KS10P, MOVE A,[198524864.] ; = 100. * 256250. * .5 / ln(16/15)
3945 ; (256250. 3.9 usec ticks per second.)
3947 ; MOVE A,[100.*15.*125000.] ;100% DIVIDED BY MAXIMUM SINGLE TREE %
3948 ADD A,LOSRCE ;WITH FUDGE FACTOR FOR LOST TIME
3949 IDIVM A,SLOADU ;GIVES EFFECTIVE # OF COMPETITORS FOR MACHINE.
3950 ; It is possible for SLOADU to drop below 100. (giving a fair share greater
3951 ; than 100%). This happens because the decay rate for disowned jobs is
3952 ; less than the decay rate for consoles. If the load switches abruptly
3953 ; from the disowned jobs to some console, the resource word for the console
3954 ; fills up quicker than the disowned resource word decays, causing their
3955 ; sum to briefly exceed the maximum. This would be hard to fix without
3956 ; introducing additional resource words just for better maintaining SLOADU.
3958 ; An additional odd effect: If only disowned jobs are running, and a
3959 ; network server starts up, the fair share drops almost to zero. This is
3960 ; because when such jobs are created, their resource word is zeroed to
3961 ; given them an initial priority boost.
3970 ALCR4: MOVN H,JTMU(T) ;A
3983 IFE KA10P, JRST ALCR4
3988 SUBI U,LUBLK ;ACCOUNT FOR I/O WAIT TIME IN USWPRI
3989 MOVSI T,%SWOUT+%SWPGW
3995 ALCR5: SKIPE UNAME(U) ;A ;IGNORE JOBS WHICH DON'T EXIST OR
3996 TDNE T,USWST(U) ;B ;ARE SWAPPED-OUT OR IN PAGE-WAIT
3997 IFN KA10P, JRST I ;C
3998 IFE KA10P, JRST ALCR6
3999 SKIPN USTP(U) ;D ;CHARGE JOBS WHICH ARE STOPPED
4000 SKIPE FLSINS(U) ;E ;OR BLOCKED
4002 ALCR6: SUBI U,LUBLK ;I ;NEXT JOB
4007 IFE KA10P, JUMPG U,ALCR5
4009 SKIPGE 37 ;CHECK FOR PLANNED SYSTEM DEATH
4010 PUSHJ P,DEATH ;ABOUT TO START DYING
4012 IRPS 4US,,[IDLTM1 LOSTM1 USRTM1 NULTM1]SEC,,[IDLTIM LOSTIM USRTIM NULTM3]
4013 MOVE A,4US ;KEEP SYSTEM WIDE USAGES AS TWO WORDS
4014 IDIVI A,250000. ;ONE IN 4.069 USEC UNITS
4015 ADDM A,SEC ;AND ONE IN SECONDS
4016 MOVEM B,4US ;SO NO OVERFLOW
4018 IMULI A,60. ;CONVERT TO 60THS
4019 ADDM A,NULTIM ;ADD TO 60THS USED (OBSOLETE)
4022 JRST CLQREE ;RE-ENTER RQ FOR SLOW CLOCK BREAK
4024 IFN SWPWSP,[ ;JOB IN U NEEDS TO BE CHARGED FOR MEMORY USED WHILE BLOCKED OR STOPPED
4025 ALCR7: HLLO W,UWRKST(U)
4026 JFFO W,.+1 ;H GETS 19 - LOG(WORKING SET SIZE + 1/2)
4028 IMUL H,[-125000.] ;CHARGE FOR 1/2 SECOND OF MEMORY USAGE
4031 IFE KA10P, JRST ALCR6
4034 ;SYSTEM IN FINAL THROES OF COMING DOWN, SEE IF IT'S OVER YET
4036 COFFIN: MOVE T,NLOOSP ;MUST SWAP OUT ALL LOOSE PAGES
4038 JUMPN T,CPOPJ ;SWAPPAGE OUT STILL GOING ON
4039 MOVEI T,NQCHN+1+NQS-1
4042 SKIPL QSGL(T) ;NOT OVER IF ANY DISK CHANNELS ARE ACTIVE
4045 MOVE TT,QACTB ;SEE IF DISK STUFF NOT OUT YET
4047 POPJ P, ;MFD NOT OUT
4049 COFFI8: TDNE T,QTUTO(A)
4050 JRST COFFI9 ;TUT NEVER CAME IN
4052 POPJ P, ;TUT NOT OUT
4053 COFFI9: AOBJN A,COFFI8
4055 COFFI1: SKIPN QSNUD(A)
4058 POPJ P, ;UFD NOT WRITTEN
4059 COFFI2: AOBJN A,COFFI1
4064 POPJ P, ;TAPE STILL FLAPPING
4068 ADDI A,15.*30. ;DON'T WAIT FOR CONSOLES MORE THAN 15 SECONDS
4069 CAMGE A,TIME ;BECAUSE %TCHNG ISN'T NECESSARILY SET
4071 MOVEI A,NFSTTY-1 ;CHECK FOR REAL CONSOLES STILL TYPING OUT
4072 MOVSI T,%TCHNG ;AND NOT HUNG (NEVER GOING TO FINISH TYPING OUT)
4076 JUMPGE A,CPOPJ ;A CONSOLE IS STILL TYPING, DON'T GO DOWN YET
4077 COFFI3: SKIPL A,SYSCN
4080 POPJ P, ;SYSTEM CONSOLE HAS A LOT OF TYPING TO DO
4082 COFFI7: CAML A,USRHI
4085 POPJ P, ;JOBS STILL EXIST
4089 ;SYSTEM FULLY DOWN; GO TO DDT.
4090 COFFI4: BUG DDT,[SHUTDOWN COMPLETE]
4091 SETZM SHUTDN ;IF USER PROCEEDS, BRING SYSTEM BACK UP
4092 SETZM DEDTIM ;ARRANGE TO RELOAD ATSIGN DRAGON
4093 SETZM FLSINS ;BY RESTARTING SYS JOB WHERE IT DOES THAT
4098 ;ROUTINE TO AGE SOME PAGES. THIS ROUTINE SLOWLY CIRCULATES THROUGH
4099 ;CORE. IF IT TOUCHES A PAGE TWICE, AND NO USER HAS TOUCHED IT,
4100 ;THE PAGE GETS SWAPPED OUT. ALSO FLUSHES PAGES NOT IN ANY USER'S MAP.
4101 ;ENTER WITH VALUE OF AGERTE IN T.
4105 POPJ P, ;NO MEMORY COMPETITION, DON'T BOTHER
4106 ADD T,AGEREQ ;INCREASE NUMBER OF PAGES NEEDING TO BE AGED
4107 CAIGE T,100 ; BUT DON'T LET IT GET INFINITELY HUGE
4108 MOVEM T,AGEREQ ; IF CIRPSW IS LOCKED FOR A LONG TIME
4109 SKIPN DLSRCH ;IF MUSTN'T PCLSR ANYONE, OR
4110 SKIPL CIRPSW ; IF CIRPSW LOCKED, HAVE TO WAIT UNTIL NEXT SLOW CLOCK
4112 LDB W,[121000,,HUSRAD] ;DON'T AGE SYSTEM JOB (CIRC PNTRS NOT CONNECTED)
4113 MOVE A,AGEPOS ;CONTINUE AGEING FROM WHERE LEFT OFF LAST TIME
4114 SKIPGE U,USER ;CHECK FOR NULJOB
4116 MOVE T,CLKBRK ;PC FOR USER WHO MAY GET PCLSR'D
4117 MOVEM T,UPC(U) .SEE SWOP2
4118 LPMR UPGML(U) ;DON'T LEAVE SWAPPED OUT PAGES IN ASSOC MEM
4123 JRST [ MOVEM A,AGEPOS ? SETZM AGEREQ ? POPJ P, ]
4125 LDB T,[MUR,,MEMBLT(A)]
4131 MOVNI C,1 ;NO USERS ACTIVELY USING THIS PAGE, SWAP IT OUT
4136 AGE1: MOVEI C,UPGMP(U)
4137 MOVE T,I ;DON'T CLOBBER I
4143 LDB T,C ;GET PAGE MAP WORD
4145 POPJ P, ;USER NOT CONNECTED TO THIS PAGE
4147 POPJ P, ;HASN'T TOUCHED THIS PAGE SINCE AGE BITS LAST SET
4148 DPB T,C ;HAS TOUCHED PAGE, TURN AGE BITS BACK ON
4149 SUB P,[4,,4] ;AND BACK OUT OF UCPRL
4154 DISCHK: SKIPGE DISOFF
4161 DISZAP: MOVE T,[JSR DBLKPB]
4163 MOVEI T,DIS300-1 ;CAUSE 340 TO STOP AND INTERRUPT SOON
4166 CONO DIS,5100+SDCHN_3+DISCHN
4172 SETZM 37 ;CLEAR START DYING FLAG
4173 MOVEI T,60.*5.*60. ;5 MIN
4180 DEATHX: SKIPN T,DEDTIM
4188 DEATHY: MOVEM TT,DEDTIM
4192 DEATHM: MOVEI A,%PIDWN
4193 PUSHJ P,INTALL ;TELL THE WORLD
4194 MOVSI T,SCLSHD ;CAUSE TYPE OUT ON UNLOGGED-IN CONSOLES
4195 SUPSET: IORM T,SUPCOR
4198 VSSLCK: MOVSI T,SCLVSK
4199 IORM T,SUPCOR ;CAUSE VERY SLOW CLOCK TO RUN
4205 RCCLK: DATAI 374,T ;HACK CHESS CLOCK
4215 WHOSET: MOVEI T,SCRWHO ;CAUSE SYS TO UPDATE WHO LINES
4217 MOVEI T,5.*60.-5 ;5 SECONDS MINUS A LITTLE SO DOESN'T SYNC WITH OTHER CLOCKS
4222 SUBTTL SWAP SCHEDULER
4224 OVHMTR SWS ;SWAP SCHEDULER
4228 IFN IMPP, PUSHJ P,IMRSTO ;RESET CONTROL LINK RFNM WAIT FOR LOSING IMP.
4230 ;RECOMPUTE SWAP BLOCK DATA.
4231 ;DECAY SWAP PRIORITIES (USWPRI AND SWRCE)
4232 ;RESET BEST-EFFORT-HAS-BEEN-MADE TO SWAP OUT BITS
4234 MOVSI B,%SWBEM ;SET UP TO CLEAR "BEST EFFORT TO SWAP OUT BIT"
4235 SETOM SBEFLG ;NOT YET DESPERATE ENOUGH TO TRY USERS WHOSE BEST EFFORT BITS ARE SET
4237 CLEARB T,NUSWB ;# USERS LOCKED OUT
4238 SETOM BUSR ;SMALLEST SWAPPED BLOCKED USER
4239 MOVE D,[37777,,777777]
4240 MOVEM D,BUSIZ ;SIZE OF SMALLEST SWAP-BLOCKED USER.
4241 CLEARM ASBUM ;REAL MEM OCC BY ACTIVE SWAPPED BLOCKED LOSERS
4242 MOVSI D,400000 ;TO CLEAR SWAPPED BLOCKED BIT
4244 .ELSE MOVEI T,LUBLK*2
4251 ADDM C,USWPRI(T) ;DECAY JOB SWAP PRI'S
4255 SUBI C,1 ;COMPENSATE FOR PAGE ZERO ALWAYS IN
4257 CAMLE C,NSWPGS(T) ;SKIP ON NOT COMPLETELY OUT
4258 ANDCAM B,USWST(T) .SEE %SWBEM
4261 JRST 15S4 ;CLEAR SWAPPED BLOCK BIT AND MAYBE ADD TO AUSOPG AND TRUMM (IF HE WAS HUNG ON IT)
4269 PUSHJ P,SWSCD ;SWAP BLOCK LOSERS IF NECESSARY
4272 15S5: MOVN C,SWRCE(T) ;DECAY TREE SWAP PRI'S
4281 15S4: ANDCAM D,USWSCD(T) ;CLEAR SWAP BLOCK BIT
4282 SKIPN TT,FLSINS(T) ;WAS HE HUNG TESTING IT
4285 CAME TT,[SKIPGE USWSCD]
4286 JRST 15S3 ;HE WASN'T HUNG ON THIS
4287 CLEARM FLSINS(T) ;HE WAS SO NOW HES ACTIVE
4290 SOS NPGWTU ;FLSINS WAS SET BY PAGE FAULT, SO CONSIDERED
4291 TLZ TT,%SWBEM ;TO BE WAITING FOR A PAGE
4294 ADDM TT,TRUMM ;GUY IS NOW RUNNABLE
4295 SUB TT,NSWPGS(T) ;ANY PAGES HE MAY HAVE IN MEM NO LONGER BELONG TO A BLOCKED USER
4300 MOVE TT,NSWPGS(T) ;ANY SWAPPED OUT PAGES BELONG TO AN ACTIVE USER
4307 PRVCLK: SKIPN ENPVCL
4312 SETOM PRVUSR ;TURN OFF CURRENT PRIVILEDGED USER
4314 PRVCK1: CAML J,USRHI
4318 MOVE B,UTRNTM(J) ;GET USER RUN TIME
4322 IMUL A,[NPVSEC*125000.] ;1/2 NUMBER OF 4 MICROSECOND INTERVALS IN THE PRIV INTERVAL
4326 LSH B,-1 ;DIVIDE LAST VALUE BY TWO
4328 MOVEM A,UPGSEC(J) ; LAST/2 + CURRENT
4332 MOVEM A,LSIPRQ(J) ;SAVE OLD VARIABLES
4333 PRVCK3: ADDI J,LUBLK
4336 PRVCK2: PUSHJ P,NPRVUS ;GET NEXT PRIV USR
4337 PRVCK4: MOVEI T,NPVSEC*60.
4341 NPRVUS: MOVEI J,2*LUBLK
4343 MOVNI T,30.*2 ;DON'T LET A BLOCKED OR STOPPED PERSON BE PRIVILEDGED
4347 NPVUS1: CAML J,USRHI
4349 CAMGE T,LUBTM(J) ;BLOCKED TOO LONG?
4357 NPVUS3: ADDI J,LUBLK
4360 NPVUS2: MOVEM U,PRVUSR
4371 IFNDEF MEMSYS,MEMSYS==50 ;GUESS AT AMOUNT OF MEM SYSTEM NEEDS
4372 IFNDEF MEMSY1,MEMSY1==50 ;AMOUNT OF MEM ANY ONE USER MUST LEAVE TO "FIT".
4374 SWSCD: MOVE E,TRUMM ;SEE IF NECESSARY TO SWAP BLOCK SOMEONE
4375 CAIGE E,TSYSM-SYSB-MEMSYS
4376 POPJ P, ;NO SHOULD FIT
4382 ADD E,BUMPGS ;WILL SWAP OUT BLOCKED USERS FIRST
4385 JUMPGE E,CPOPJ ;SHOULD HAVE ROOM FOR EVERYBODY
4386 MOVMM E,SWSCT1 ;SAVE # PGS REQ
4387 MOVNI E,1 ;NEED TO GRONK USER (MAYBE)
4388 CLEARB T,TT ;TT SWP PRI OF PROCESS
4389 MOVEI R,0 ;R SWP PRI OF TREE
4390 SWSCP1: CAML T,USRHI
4396 JRST SWSCP7 ;GUY ALREADY LOCKED OUT
4398 JRST SWSCP4 ;SEE IF REALLY BLOCKED OR JUST PAGE WAIT
4399 SWSCP5: MOVE B,UTMPTR(T)
4400 CAML R,SWRCE-USRRCE(B)
4402 JRST SWSCP6 ;THIS GUY A BIGGER LOSER THAT PREV BIGGEST
4403 SWSCP7: ADDI T,LUBLK
4407 MOVE R,SWRCE-USRRCE(B)
4409 JRST SWSCP7 ;GUY REALLY BLOCKED
4411 SWSCP4: MOVE B,USWST(T)
4417 SWSCP2: JUMPL E,CPOPJ ;NO VICTIM
4419 CAIGE B,TSYSM-SYSB-MEMSY1
4420 JRST SWSCP9 ;"SMALL LOSER"
4422 CAMLE B,SWSCT1 ;SKIP ON WILL STILL NEED TO BLOCK MORE LOSERS
4424 SWSCP9: MOVSI B,400000
4425 IORM B,USWSCD(E) ;SWAP BLOCK LOSER
4433 SWSCP8: SUB TT,NSWPGS(E)
4436 ADDM TT,ASBUM ;THIS GUY SWAPPED BLOCKED
4438 ADDM TT,TRUMM ;DOESNT COUNT ANY MORE
4442 ADDM TT,AUSOPG ;NOT REALLY ACTIVE ANY MORE
4443 JRST SWSCD ;SEE IF THATS ENUF
4448 ;PUT PAGE INTO USERS' MAPS (OF ALL USERS THAT ARE CONNECTED VIA CIRCULAR POINTERS)
4449 ;ALSO UPDATES THE WORKING SETS.
4450 ;CALL WITH PAGE NUMBER IN A, STARTING BYTE POINTER IN C, AND TDNE T,MMP IN D.
4451 ;SMASHES T,H,I,U,E,TT,C
4454 MOVEI E,0 ;COUNT USERS OF THE PAGE
4456 400000,,[AOJA E,CPOPJ]
4457 HRRM E,MMSWP(A) ;ALL THESE SHARERS WILL BE CONNECTED TO THE PAGE
4458 MOVSI T,1 ;COMPUTE WORKING SET ADJUSTMENT
4459 IDIVM T,E ;I.E. 1 OVER NUMBER OF SHARERS
4461 PUSHJ P,UCPRL ;GIVE PAGE TO ALL USERS WAITING FOR IT
4465 ;SET UP MAP TO MEMBLT INDEX IN A
4468 BUG ;SYS JOB OR CORE JOB
4477 JUMPE I,[JRST 4,.] ;DOESN'T REALLY EXIST?
4478 MOVSI T,MMPPGA ;DON'T REALLY PUT IN MAP IF PAGE-AHEAD PAGE.
4479 TDNE T,(D) ;JUST PRE-EMPT.
4481 TRNE I,600000 ;DO NOTHING IF ALREADY IN MAP.
4483 JRST QSWI2 ;ALREADY IN MAP, POSSIBLE AS A RESULT OF RIDICULOUS TIMING ERROR
4486 JRST E.SPGJ ; CHECK E&S WANTS READ/WRITE FIRST FIX
4488 SOS NSWPGS(U) ; NUMBER OF SWAPPED-OUT PAGES
4489 SOS SNSWPG ;DECR CNT OF SWAPPED OUT FOR SYS
4490 SKIPN (P) ;DON'T SET UP PG 0 AS R-W-F.
4493 MOVEI I,2 ;SET READ/WRITE TO READ/WRITE/FIRST
4495 IORI I,PMCSHM(A);BRING IN ADDRESS AND CACHE BITS
4499 AOS MMSWP(A) ;INCREMENT COUNT OF USERS IN RING
4502 ADDM E,UWRKST(U) ;ADJUST WORKING SET
4506 ;IF THIS USER IS WAITING FOR THIS PAGE, MAKE HIM RUNNABLE BY PUTTING
4507 ;HIM ON THE SCHMNY LIST, AND PRE-EMPT THE CURRENTLY-RUNNING USER.
4508 ;THE IDEAS ARE TO START THIS USER'S NEXT PAGE READ AS SOON AS POSSIBLE,
4509 ;AND TO ELIMINATE THE SCHEDULING THAT WOULD OTHERWISE BE NECESSARY TO RUN THIS GUY.
4511 CONSZ PI,200_-APRCHN ;CAN'T PREEMPT IF CLKOFF
4512 CONSZ PI,100000_-APRCHN ;OR IN PROGRESS, BECAUSE
4513 JRST POPIJ ;MIGHT ZERO FLSINS WHILE SCHEDULER
4514 ;IS EXECUTING IT & SIMILAR NASTIES
4516 CAME D,FLSINS(U) ;IF JOB THAT JUST GOT PAGE IS WAITING FOR IT
4519 SETZM FLSINS(U) ;THEN THAT JOB PREEMPTS CURRENT ONE
4522 SOS NPGWTU ;FLSINS WAS DUE TO PAGE FAULT (MIGHT BE IN .CALL CORBLK)
4527 CONO PI,CLKRQ ;REQUEST INT TO SCHEDULER
4542 E.SPGJ: SKIPE E.SPGH ; FLAG FROM E.SPGI
4544 JRST QSWI2 ; LEAVE AS IS
4548 JRST QSWI3 ; GO MAKE READ/WRITE
4549 ; DON'T SOS NSWPGS, SINCE PAGE IS ALREADY HERE
4552 SUBTTL USER SCHEDULER
4554 OVHMTR SC1 ;SCHEDULER 1 - ENTRY
4556 IFN KL10P, IFNDEF SCCOST, SCCOST==250. ;CHARGE 1 MILLISEC FOR SCHEDULING
4557 IFN KA10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4558 IFN KS10P, IFNDEF SCCOST, SCCOST==1000. ;CHARGE 4 MILLISEC FOR SCHEDULING
4560 SCHED: SKIPGE U,USER
4564 ;; If user is swapped out while running in the page fail code, then
4565 ;; EPTPFO is used as the PC. Either he is on his way in, in which
4566 ;; case he will come back when restarted, or he is on his way out,
4567 ;; in which case this just pushes him on his way.
4571 CAIL T,PFAIL ; First instruction inclusive
4572 CAILE T,PFAILE ; Last instruction inclusive
4575 SCHED0: ] ;IFN KS10P
4577 IFN SCHBLN,SETZM SCHMNY ;ENTERED FROM QUANTUM RUNOUT, TIME TO CHECK ALL USERS
4578 SCHED2: ;ENTERED FROM UFLS OR PAGE FAULT, CHECK FOR AUXIL PERSON TO RUN
4579 ;IF SCHMNY IS STILL -1
4581 MOVSI T,UEXIT ;GET HERE FROM CLUFLS
4586 XCTR XR,[HRRZ A,13] ;GCSTBR
4587 XCTR XR,[HRL A,14] ;STBR
4590 SKIPL MTRUSR ;SKIP IF PERF COUNTER AVAILABLE
4591 JRST [ DMOVE A,MBOXCT(U) ;COMPUTE EQV CPU TIME FROM MBOX+EBOX ACCT
4592 DSUB A,STMBOX ;AS INCREMENTAL RUNTIME
4600 DSUB A,STPERF ;USER RUN TIME IN 80 NS UNITS LEFT 12
4601 DIVI A,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS IN A
4604 IFN KS10P, LDB A,[044000,,UPQUAN(U)] ;GET TIME USED IN 3.9 USEC UNITS
4605 IFN KA10P, LDB A,[022100,,UPQUAN(U)] ;GET TIME USED IN 4.069 USEC UNITS
4606 ADDM A,USRTM1 ;SYSTEM TOTAL USER RUN TIME
4607 ADDM A,UTRNTM(U) ;INCREASE RUN TIME
4608 ADDM A,JTMU(U) ;DECREASE PROCEDURE PRIORITY
4609 MOVEI B,SCCOST(A) ;ACCOUNT FOR OVERHEAD IN STARTING UP
4610 ADDM B,@UTMPTR(U) ;DECREASE PROCEDURE TREE PRIORITY
4612 MOVE T,NMPGS(U) ;USWPRI IS PAGES IN CORE X CPU TIME
4616 HLLO B,UWRKST(U) ;USWPRI IS LOG(WORKING SET SIZE) X (CPU TIME + IO WAIT TIME)
4617 JFFO B,.+1 ;C GETS 19 - LOG(WORKING SET SIZE + 1/2)
4623 ADDM T,USWPRI(U) ;CHARGE AGAINST SWAPPINNG PRI
4624 ADDM T,SWRCE-USRRCE(Q) ;AND FOR TREE
4626 LSH B,-7 ;GET RUNTIME IN 512 USEC UNITS
4628 MOVEI B,777 ;TO FIT IN SCHEDULER HISTORY TBL
4633 TRO B,1000 ;BLOCKAGE DUE TO PAGE FAULT
4635 CAML A,LODQNT ;CHECK FOR LEAVING LOADING STATE
4636 SCHED8: TLZN C,%SWLOD ;DUE TO RUNNING FOR MORE THAN LODQNT BETWEEN PAGE FAULTS
4637 JRST .+2 ;OR DUE TO BLOCKAGE FOR REASON OTHER THAN A PAGE FAULT
4638 PUSHJ P,LVLOA0 ;LEAVE LOADING STATE
4641 DPB B,[311200,,@SCHHP] ;COMPLETE SCHEDULER HISTORY TBL ENTRY
4642 SKIPL Q,RTIMER(U) ;SKIP UNLESS RUNTIME INT ACTIVE
4644 SCHED3: SKIPGE DLSRCH
4645 JRST SEAREP ;DELETE SEARCH, EXIT
4647 SKIPE PREEMP ;PRE-EMPT?
4648 JRST SCHEDP ;YES, AVOID DOING FULL SCHEDULE
4651 SKIPN SCHMNY ;IF NOT YET TIME TO DO A FULL SCHEDULE,
4653 SCHED4: HLRZ U,UREALT ;THEN CHECK LIST OF JOBS SCHEDULED BEFORE
4654 JUMPE U,SEARL0 ;ALWAYS SCHEDULE IF HIGH PRIORITY REAL TIME USER ACTIVE
4655 PUSHJ P,SCHGB ;POP NEXT JOB OFF LIST
4656 JUMPL U,SEARL0 ;EMPTY
4658 JRST SCHED4 ;JOB CEASED TO BE RUNNABLE
4659 AOS NSSKED ;OK, RUN THIS ONE
4666 MOVSI T,(%PIRUN) ;GIVE RUNTIME INTERRUPT
4670 ; HERE TO DO A FULL SCHEDULE (LOOK AT ALL JOBS)
4673 OVHMTR SC2 ;SCHEDULER 2 - SEARCH
4675 SEARL0: AOS NRSKED ;1 MORE REAL SCHED (ACTUALLY SEARCHES JOBS)
4676 CLEARM TRUMM ;TOTAL RUNNABLE USER MEM
4677 CLEARM AUSOPG ;ACTIVE USER SWAPPED OUT PAGES
4678 CLEARM BUMPGS ;PAGES IN REAL CORE BELONGING TO BLOCKED USERS
4679 IFE SWPWSP, CLEARM ASBUM ;PGS IN REAL MEM OCC BY SWAPPED BLOCKED LOSERS
4682 PUSHJ P,SWPON ;SWAP OUT STUFF
4685 PUSHJ P,SWPPIN ;SERVICE SWAPPING REQUESTS FROM OTHER PROCESSORS (DISPLAY)
4687 SETZB U,J ;JOB BEING SCHEDULED
4688 SETZM RNABLU ;NUM RUNABLE USERS
4690 SETZM SCHBNJ ;GOT NO RUNNABLE JOBS YET
4691 SETOM SCHMNY ;ALLOW ALL THE RUNNABLES WE FIND TO RUN
4693 .ELSE SETOM I ;BEST USER SO FAR
4695 MOVEM T,SCHFLG ;DONT SCHED AGAIN FOR 1/7.5 SEC
4698 ;HERE IF NULL JOB HAD BEEN RUNNING
4700 SCHED9: AOS NNSKED ;1 MORE TIME NULL JOB WAS RUN
4701 IFN KA10P, LDB C,[022100,,UPQUAN] ;GET TIME NULL JOB RAN IN 4.069 USEC UNITS
4702 IFN KS10P, LDB C,[044000,,UPQUAN] ;GET TIME NULL JOB RAN IN 3.9 USEC UNITS
4704 CAMN U,MTRJOB ;IF METERING ONLY NULL JOB, STOP METERS NOW
4707 CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1
4708 REBOXC A ;COMPUTE NULL JOB'S EQUIVALENT RUNTIME IN 4 USEC UNITS
4712 DMUL C,KLMBCC ;CONVERT MBOX COUNT TO EBOX COUNTER UNITS,
4713 DADD A,D ;ADD TO EBOX COUNT
4714 DMUL A,KLEBCC ;CONVERT TO 4 USEC UNITS.
4716 JRST [ RPERFC C ;PERFORMANCE METER AVAILABLE, USE IT INSTEAD
4718 DIVI C,50.*4096. ;CONVERT TO 4 MICROSECOND UNITS
4721 ADDM C,NULTM1 ;ACCUMULATE TOTAL NULL TIME IN 4 USEC UNITS
4722 SKIPE NPGWTU ;IF SOMEONE WOULD HAVE BEEN RUNNING IF THEY
4723 ADDM C,LOSTM1 ; WEREN'T WAITING FOR A PAGE, THIS WAS LOST TIME
4724 SKIPN NPGWTU ;BUT OTHERWISE
4725 ADDM C,IDLTM1 ;IT WAS COMPLETE IDLE TIME
4726 SKIPE NPGWTU ;NOW COMPUTE % TIME IDLE AND LOST
4730 IFN PAGPRE,SKIPN PREEMP ;CHECK FOR PRE-EMPT
4731 JRST SEARL0 ;NOW GO DO A FULL SCHEDULE
4733 SCHEDP: SETZM PREEMP
4735 PUSHJ P,SCHGB ;U GETS USER TO PRE-EMPT THIS ONE (LAST INTO SCHMNY LIST)
4736 JUMPL U,SCHDP1 ;NO ONE TO PRE-EMPT, RUN SAME USER AGAIN
4737 PUSHJ P,SCHACK ;MAKE SURE PRE-EMPTING JOB IS RUNNABLE
4738 JRST SCHEDP ;AFRAID NOT
4739 AOS NPREEM ;OK, RUN THIS ONE
4741 PUSHJ P,SCHSB ;PRE-EMPTED JOB IS STILL A CANDIDATE FOR RUNNING
4744 SCHDP1: SKIPGE U,USER ;TRY TO RUN SAME USER AGAIN
4745 JRST SCHED1 ;RUN NULL JOB AGAIN
4746 PUSHJ P,SCHACK ;MAKE SURE THIS JOB IS STILL RUNNABLE (COULD HAVE UFLSED)
4747 JRST SEARL0 ;FOO, BETTER DO A FULL SCHEDULE
4748 JRST SCHED6 ;OK, RUN THIS GUY
4751 ;MAIN SEARCH LOOP, RETURN HERE TO EXAMINE NEXT PROCEDURE
4752 SEARL: MOVEI U,LUBLK ;LENGTH OF USER VAR BLOCK
4753 ADDB U,J ;STEP TO NEXT USER
4754 CAML U,USRHI ;SKIP IF EXISTS
4755 JRST SEAREN ;ALL PROCEDURES HAVE BEEN EXAMINED
4756 SEARL1: SKIPE T,USTP(U)
4757 JRST SEARS1 ;EMPTY OR STOPPED JOB SLOT
4759 JRST SEAR2A ;FIRST WORD INTERRUPT PENDING
4760 SEARL2: SKIPE B,IFPIR(U)
4761 JRST INTWD2 ;SECOND WORD INTERRUPT PENDING
4762 SEARL3: SKIPN FLSINS(U)
4763 JRST SEARC ;NOT BLOCKED
4764 SEARL4: MOVE T,EPDL2(U)
4765 XCT FLSINS(U) ;TEST BLOCKING CONDITION (MAY SKIP ONCE OR TWICE)
4766 JRST SEARLB ;UNRUNABLE
4767 JRST SEARC ;LOW PRIORITY UNBLOCK
4768 SKIPA Q,[-1] ;HIGH PRIORITY UNBLOCK
4769 MOVEI Q,3 ;EXTRA LOW PRIORITY
4772 SEARC: SETZM Q ;SET TO NORMAL PRIORITY
4773 PUSHJ P,UPRIVL ;COMPUTE PRIVELEGE LEVEL (MAY SKIP ONCE OR TWICE)
4774 SOJA Q,SEARC2 ;HIGH-PRIORITY
4777 ADDI Q,2 ;DISOWNED JOB IN USER MODE
4778 SEARC2: AOS RNABLU ;ANOTHER RUNABLE USER
4780 MOVEM T,LUBTM(U) ;RECORD LAST TIME UNBLOCKED
4783 JRST SEARC7 ;HE'S SWAPPED BLOCKED SO HE DOESNT COUNT
4785 JUMPE U,SEARC4 ;DON'T FIGURE SYSTEM JOB.
4787 ANDCAM T,USWST(U) ;RUNNABLE SO NOT DESIRED OUT
4789 ADDM T,TRUMM ;TOTAL RUNNABLE USER MEM
4791 ADDM T,AUSOPG ;TOTAL PAGES OF RUNNABLE USERS SWAPPED OUT
4792 SEARC4: CAMN U,UREALT ;IF THIS IS REAL TIME USER IN HIGH PRIORITY
4793 JRST [ MOVEI A,0 ; PHASE, SCHEDULE WITH INFINITE PRIORITY
4795 SKIPLE T,URTIME(U) ;NON SKIP IF POSSIBLE REAL TIME BLOCK
4796 TLNN T,1 ;SKIP IF REAL TIME BLOCK UNLESS PI IN PROGRESS
4798 SKIPGE PICLR(U) ;SKIP IF PI IN PROGRESS
4799 JRST SEARL ;REAL TIME BLOCKED
4800 SEARC6: MOVE A,@UTMPTR(U) ;GET AMOUNT OF MACHINE TIME USED RECENTLY BY TREE PROCEDURE IS IN
4801 LSH A,3 ;COMBINE WITH TIME FOR JUST THIS PROCEDURE
4802 ADD A,JTMU(U) ;TO GET PRIORITY FIGURE (SMALLER NUMBER IS HIGHER PRI)
4803 LSH A,(Q) ;ADJUST PRIORITY BY MULTIPLICATIVE FACTOR IN Q
4804 ;THE EFFECT OF THIS PRIORITY COMPUTATION IS THAT JOBS IN THE SAME TREE
4805 ;ARE COMPARED BY JTMU, WHILE JOBS IN DIFFERENT TREES ARE COMPARED MAINLY
4806 ;BY USRRCE, ALTHOUGH A MUCH SMALLER JTMU CAN OVERRIDE A SOMEWHAT LARGER
4807 ;USRRCE. THIS IS SOMEWHAT DIFFERENT THAN THE COMPUTATION THAT WAS HERE
4808 ;BEFORE MAY 1980, BUT THAT COMPUTATION'S RESULTS EVEN DEPENDED ON THE
4809 ;ORDER THAT JOBS HAPPENED TO BE INSPECTED, AND ALLOWED A TREE WITH
4810 ;A LARGE NUMBER OF RUNNING JOBS TO GET AN UNFAIR SHARE OF THE MACHINE.
4812 IFN SCHBLN, PUSHJ P,SCHSJB ;INSERT JOB INTO PRIORITY-SORTED LIST
4813 .ELSE [ JUMPL I,SEARP5
4814 CAML A,U0P ;SKIP IF IS BETTER THAN BEST SO FAR
4816 SEARP5: MOVEM U,I ;I GETS NEW BEST USER SO FAR
4817 MOVEM A,U0P ;U0P GETS PRIORITY OF THAT USER
4819 JRST SEARL ;TRY NEXT
4822 SEARC7: MOVE T,NMPGS(U) ;RUNNABLE AND SWAPPED BLOCKED
4829 ;JOB IS NOT RUNNABLE
4830 SEARLB: JUMPE U,SEARL ;DON'T FIGURE SYSTEM JOB
4832 IFE SWPWSP, SKIPL USWSCD(U) ;IF LOCKED OUT, DONT COUNT
4833 IFN SWPWSP, TLNN T,%SWSB
4835 JRST SEARB1 ;NOT WAITING FOR PAGE
4836 MOVE T,NMPGS(U) ;USER IS WAITING FOR PAGE SO COUNT FOR ACTIVE
4842 SEARB1: TLNE T,%SWBEM
4843 JRST SEARL ;HAVE MADE BEST SWAPOUT EFFORT
4847 ADDM T,BUMPGS ;REAL MEM PGS BELONGING TO BLOCKED USERS
4850 SEARS1: SKIPN UNAME(U)
4852 MOVE T,USWST(U) ;GUY STOPPED, DOES HE HAVE PAGES IN REAL MEM?
4854 JRST SEARL ;HAVE TRIED BEST EFFORT TO SWAP OUT
4861 ;TEST ALL THINGS THAT MAKE A PERSON UNRUNNABLE, OR AT LEAST
4862 ;REQUIRE THE ATTENTION OF THE SCHEDULER
4863 ;SKIP-RETURN IF JOB IS RUNNABLE, BASHES T, A
4864 SCHACK: CAMGE U,USRHI ;NON-EXISTENT
4865 SKIPE USTP(U) ;STOPPED
4868 JRST [ TDNE T,[BADBTS]
4869 JRST SCHACI ;NON-DEFERRABLE
4871 JRST .+3 ;ALL INTERRUPTS DEFERRED
4877 JRST [ SKIPN PICLR(U)
4878 JRST .+1 ;ALL INTERRUPTS DEFERRED
4883 SKIPE FLSINS(U) ;FLUSH INSTRUCTION NOT SATISFIED
4884 JRST [ MOVE T,EPDL2(U)
4885 XCT FLSINS(U) ;IT MAY BE SATISFIED BUT NOT CLEARED YET
4886 POPJ P, ;STILL BLOCKED
4887 JRST .+1 ;CAN SKIP VARIOUS RANDOM NUMBERS OF TIMES
4890 SCHAC1: SKIPLE T,URTIME(U) ;REAL-TIME BLOCKED
4897 SCHACI: MOVE T,UPC(U) ;TRYING TO INTERRUPT, NEEDS SCHEDULER
4898 TLNN T,%PCUSR ;ATTENTION UNLESS RUNNING IN EXEC MODE
4899 SKIPE FLSINS(U) ;IN WHICH CASE NEED TO LET IT FINISH
4900 POPJ P, ;SO IT CAN BE PCLSRED
4903 ;PUT JOB IN U, PRIORITY IN A, INTO STACK IN PRIORITY ORDER. BASH T,TT,B.
4904 SCHSJB: SKIPG T,SCHBNJ ;FIRST SEARCH FOR SLOT IN WHICH TO INSERT
4905 JRST SCHSJ1 ;BUFFER NOW EMPTY, SKIP SEARCH
4908 SOJG T,.-1 ;LOOP TERMINATES WITH T SLOT WHERE IT BELONGS
4910 SOJA T,SCHSJ3 ;BUFFER FULL, WORK DIFFERENTLY
4911 SCHSJ0: MOVE B,SCHBTB-1(TT) ;MOVE STUFF UP TO ADD ANOTHER ENTRY
4918 SCHSJ5: MOVEM U,SCHBTB(T)
4922 SCHSJ3: AOS NSCHOV ;BUFFER NOT BIG ENOUGH FOR ALL RUNNABLE JOBS
4923 JUMPL T,CPOPJ ;THIS JOB IS LOWEST PRIORITY, FORGET IT
4924 JUMPE T,SCHSJ5 ;THIS JOB IS SECOND-LOWEST PRIORITY, FORGET LOWEST
4925 MOVE TT,[SCHBTB+1,,SCHBTB]
4926 BLT TT,SCHBTB-1(T) ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4927 MOVE TT,[SCHBPR+1,,SCHBPR]
4931 ;PUSH JOB IN I ONTO STACK OF RUNNABLE JOBS
4934 JRST [ SOS SCHBNJ ;BUFFER OVERFLOW
4935 AOS NSCHOV ;MOVE LOWER PRIORITY JOBS DOWN, FORGET LOWEST
4936 MOVE T,[SCHBTB+1,,SCHBTB]
4937 BLT T,SCHBTB+SCHBLN-2
4938 MOVEM I,SCHBTB+SCHBLN-1
4943 ;POP STACK OF RUNNABLE JOBS INTO U (RETURNS -1 IF STACK EMPTY)
4944 SCHGB: SOSL U,SCHBNJ
4946 SETZM SCHBNJ ;BUFFER EMPTY, U HAS -1
4964 ;DETERMINES USER PRIVILEGE LEVEL FOR SCHEDULING AND SWAPPING
4965 UPRIVL: SKIPN RPCL(U) ;BEING RPCLSR'ED?
4966 CAMN U,UMASTER ;MASTER?
4967 POPJ P, ;HIGHLY PRIVILEGED
4968 AOS (P) ;SKIP AT LEAST ONCE
4969 IFN 340P\E.SP, ALTSKP DISUSR
4970 IFN VIDP, ALTSKP NVDUSR
4971 IFN TABP, ALTSKP TABUSR
4972 IFN ARMP, ALTSKP ARMUSR
4973 IFN LPTP, ALTSKP LPTUSR
4974 IFG LPTP-1, ALTSKP OLPUSR
4975 IFN PLTP, ALTSKP PLTUSR
4978 POPJ P, ;DON'T FIGURE DISOWNED IF USING ABOVE DEVICES
4985 OVHMTR SC3 ;SCHEDULER 3 - EXIT
4991 PUSHJ P,SSWC1 ;SEE IF ENUF CORE TO UNBLOCK A SWAPPED BLOCKED LOSER
4994 SKIPGE U,I ;SKIP IF NON-NULL JOB BEST
5001 PUSHJ P,SCHGB ;GET HIGHEST-PRIORITY JOB
5002 JUMPL U,SCHED1 ;NONE, RUN NULL JOB
5004 SCHED6: SKIPE FLSINS(U)
5007 JUMPL U,SCHDN ;JUMP IF SWITCHING FROM NULL JOB
5008 CAMN U,USER ;SKIP UNLESS RUNNING SAME JOB AGAIN
5009 JRST SEAREP ;JUMP ON SAME JOB
5011 CAMN U,MTRJOB ;IF LEAVING JOB BEING METERED, STOP METER AND
5014 CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1
5016 ;SWAP OUT THE OLD JOB'S CONSOLE REGISTER, AND CLEAR ITS BLINKER.
5020 JRST SSTVR1 ;DONT HACK 11
5021 SKIPL TVCREG(U) ;DO WE WANT TO SAVE TV CONSOLE REG FOR THIS GUY?
5022 SKIPN T,400000+TTR10*2000 ;0 IS NOT A (VERY) LEGITIMATE CONSOLE REG FCN
5023 JRST SSTVR2 ;SO ASSUME 11 STOPPED, DONT CLOBBER PREV THING
5025 SSTVR2: SKIPGE T,TVVBN(U) ;DID WE SET RUNNING BLINKER FOR THIS GUY?
5027 MOVEM T,400000+TTR10*2000 ;SET TO VIDEO BUFFER WE SET IT IN
5028 MOVE A,TVBLAD ;ADDR IN VIDEO BUFFER WE FLASHED
5029 CLEARM 400000+TTR0*2000(A) ;CLEAR IT
5033 MOVEM T,SV40(U) ;SAVE LAST UUO EXECUTED FOR THIS USER
5034 MOVE T,UPC(U) ;IF USER HAS JUST TRAPPED TO 60,
5042 ADDM T,UPC(U) ;THEN MOVE HIM INTO UUOH INSTEAD
5043 MOVE T,60 ;AND MOVE 60H'S VARIABLES INTO UUOH'S VARS
5044 MOVEM T,SV40(U) ;(THAT'S ALL 60H DOES ANYWAY).
5050 ;COME HERE TO SET UP A JOB THAT WASN'T ALREADY RUNNING.
5054 JRST SCHDN2 ;JUMP IF SWITCHING TO NULL JOB
5056 MOVE T,SV40(U) ;LOAD NEW KRUFT
5060 SKIPGE TT11P ;DONT HACK 11 IF ITS DOWN (MOSTLY IN CASE ITS BEING HACKED
5063 JRST SLTVR1 ;DONT HACK 11
5064 SKIPGE T,TVVBN(U) ;BLINK RUNNING FROB?
5066 MOVEM T,400000+TTR10*2000
5069 MOVEM T,400000+TTR0*2000(A)
5071 SLTVR2: MOVSI T,12_<8+4+16.-18.> ;ALU NOP
5074 MOVEM T,400000+TTR10*2000
5077 CAMN U,MTRJOB ;IF THIS JOB'S BEING METERED, TURN ON METER AND TIME BASE.
5080 CONO MTR,2001 ;TIME-BASE ON, INTERVAL PIA=1
5082 SOS NRESKED ;COMPENSATE FOR EXTRA AOS ON NEXT PAGE
5086 ;COME HERE TO START UP A JOB EVEN IF IT WAS ALREADY RUNNING BEFORE THIS SCHEDULE.
5091 ANDCAM T,UPQUAN(U) ;RESET QUANTUM TIMER
5094 RPERFC STPERF ;SAVE PERF METERS FOR LATER USE
5095 DMOVE A,EBOXCT(U) ;COMPUTING RUN TIME EFFECTIVELY RESETS
5096 DMOVEM A,STEBOX ;QUANTUM TIMER
5100 IFN KS10P, SETZM UPQUAN(U) ;RESET QUANTUM TIMER
5106 IFE KS10P,[ ; KS has no lights.
5110 DATAO LIGHTS,B ;LIGHTS HAVE ONE BIT, SHOWING WHICH JOB IS RUNNING.
5112 MOVN B,A ;GET JOB'S NUMBER IN B
5113 MOVE T,UPC(U) ;USER'S PC WORD
5115 AOS A,SCHHP ;SET UP SCHEDULER HISTORY TBL
5119 HRRM T,(A) ;STORE PC
5122 HRLM B,(A) ;STORE USER INDEX AND USER BIT
5125 BLT T,UEXND-1 ;BLT IN UEXIT BLOCK
5129 XCTR XW,[HRRZM T,13] ;GCSTBR
5130 XCTR XW,[HLRZM T,14] ;STBR
5131 ] ;KL10P ;CONTEXT WILL BE RESTORED AT CLKB5 BELOW
5132 IFN KA10P, CONO @APRC(U)
5135 ; THIS IS THE ONE PLACE WHERE CLOCK LEVEL RETURNS TO THE USER JOB
5138 IFE KA10P, DATAO PAG,@CLCXSV ;RESTORE CONTEXT
5140 MOVSI U,AC0S(U) ;RESTORE AC BLOCK 0
5142 JRST 12,@CLKBRK ;RESTORE PC, FLAGS, AND PI
5144 ;HERE WHEN STARTING A USER WHO HAD BEEN FLSING
5146 SCHED5: MOVE T,USWST(U)
5148 TLNN T,%SWPGW ;PAGE WAITS DON'T COUNT AS BLOCKING
5149 TLNN T,%SWOUT ;IF SWAPPED-OUT, UNBLOCKING BUMPS SWAP-IN PRIORITY
5151 MOVE TT,USWPRI(U) ; (A SOMEWHAT QUESTIONABLE FEATURE)
5157 JRST SCHED7 ;JUMP IF PAGES SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5159 SOS NPGWTU ;NOT WAITING FOR A PAGE ANY MORE
5160 MOVSI T,%SWPGW+%SWRUN+%SWINT ;NOT WAITING FOR PAGE,NOT UNBLOCKED SWAPOUT,
5161 ANDCAM T,USWST(U) ;NOT WAITING FOR INTERRUPT PAGE
5162 SETZM FLSINS(U) ;NOT WAITING FOR ANYTHING
5165 SCHED7: PUSHJ P,PCLSR ;PAGES WERE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
5166 BUG ;SO PCLSR JOB SINCE IT MIGHT BE COUNTING ON THOSE PAGES
5167 JRST SCHED1 ;PCLSR MUST SUCCEED. JOB WAS BLOCKED WITH EMPTY LSWPR.
5170 ;COME HERE TO RUN THE NULL JOB.
5172 SCHDN2: SKIPL A ;WERE RUNNING IT ALREADY?
5173 AOS NNULBK ;NO, INCREMENT # CONSECUTIVE BLOCKS OF NULLTIME.
5175 MOVEM T,CLUSAV ;AVOID LOSSAGE AT CLKBRK+1 NEXT CLOCK INT
5176 IFE KA10P, MOVEM T,CLCXSV
5177 IFE KS10P,[ ; KS has no lights.
5179 DATAO LIGHTS,[0] ;LOAD LIGHTS WITH JOB RUNNING (NONE)
5189 CONO MTR,2001 ;TIME-BASE ON, INTERVAL PIA=1
5194 IFN KS10P, SETZM UPQUAN
5195 CLEARM SCHFLG ;RESCHEDULE ON NEXT CLK INT
5197 JRST 12,@[%PSPCU,,NULJOB] ;DISMISS INT AND GO TO NULL JOB
5199 NULJOB: MOVSI (JRST 4,)
5200 MOVEI 17,1 ;SET ACS 0 TO 16 TO JRST 4,0
5201 BLT 17,16 ;TO CATCH SPURIOUS TRANFERS TO ACS
5202 MOVE 17,[AOJA 17] ;RUNS IN ACS TO FREE MEMORY FOR OTHER PROCESSORS
5203 JRST 2,@[%PCUSR,,17] ;RUNS IN USER MODE FOR SAKE OF RANDOMNESS
5206 OVHMTR SC4 ;SCHEDULER 4 - UNSWAPBLOCKER
5208 ;SEE IF THERE IS ENOUGH CORE TO UNBLOCK A SWAP-BLOCKED JOB.
5209 SSWC1: SKIPGE U,BUSR
5220 POPJ P, ;THERE ISN'T ENOUGH ROOM.
5222 ANDCAM T,USWSCD(U) ;CLEAR SWAP BLOCKED
5225 MOVEM D,BUSIZ ;SIZE OF SMALLEST SWAP-BLOCKED USER.
5232 SSWSC4: CAML U,USRHI
5241 SSWSC5: ADDI U,LUBLK
5244 SSWSC6: MOVEM R,BUSR ;STORE NEW SMALLEST SWAPPED BLOCKED LOSER
5248 SSWSC3: JUMPL I,SEARL0 ;MAYBE CAN RUN THIS GUY NOW
5252 OVHMTR SWU ;SWAP USER
5254 ;SWAP OUT N PAGES (N IS IN SWPOPR)
5256 SKIPGE CIRPSW ;CAN'T DO ANYTHING WITHOUT CIRPSW
5258 POPJ P, ;ALREADY STUFF ON WAY OUT
5259 SKIPL U,PSWOUS ;SEE IF CONTINUING TO SWAP OUT A USER
5263 SKIPE LSWPR(U) ;PREFER NOT TO SWAP OUT
5264 JRST SWPON1 ;USER WHO HAS SWITCHES LOCKED
5265 SKIPE UNAME(U) ;SKIP ON USER KILLED
5266 SKIPL USWST(U) .SEE %SWDSO ;OR NOT DESIRED OUT ANY MORE
5267 SWPON1: PUSHJ P,SWPON2 ;FIND NEW USER TO FLUSH
5269 SWPON6: MOVSI A,%SWDSO ;THIS USER NOW DESIRED OUT
5275 JRST SWPU1 ;OK TO SWAP USER
5276 SKIPN LSWPR(U) ;PCLSR IF HAS LOCKS, OR AT JBFLS,
5277 SKIPN FLSINS(U) ;OR IF NOT BLOCKED
5279 MOVSI T,%SWPCL ;OTHERWISE, DON'T PCLSR NOW, BUT
5280 IORM T,USWST(U) ;WHEN IT UNBLOCKS
5281 JRST SWPU1 ;AND START SWAPPING OUT ITS PAGES
5283 SWPON8: PUSHJ P,PCLSR ;GET OUT OF SYS BEFORE SWAPPING OUT
5287 ;FOUND NO USER TO SWAP OUT
5289 JRST SWOL1 ;SWAP OUT SOME LOOSE PAGES
5290 AOSE SBEFLG ;HAVE WE COME HERE TWICE?
5291 JRST SWUP6 ;YES, GIVE UP
5292 MOVSI B,%SWBEM ;NO, TURN OFF EVERYONE'S BEST EFFORT BIT
5293 MOVEI J,2*LUBLK ;AND LOOK AT EVERYONE AGAIN SINCE WE'RE DESPERATE
5294 SWUP9: CAML J,USRHI ;TO FIND A PAGE TO SWAP OUT
5300 SWUP7: PUSHJ P,SWPON2 ;HAVING TURNED OFF %SWBEM, FIND A USER TO SWAP OUT
5301 JUMPG U,SWPON6 ;GO SOMEONE, GO DO
5302 SWUP6: SETZM SWPOPR ;CAN'T FIND ANYONE TO SWAP OUT, GIVE UP
5306 SWOL1: SKIPN A,FLOOSP ;SWAP OUT SOME LOOSE PAGES
5307 BUG ;NLOOSP WAS TOO HIGH?
5310 BUG ;CIRPSW, EXEC PAGE COUNT ALREADY CHECKED
5311 SETOM SBEFLG ;WE FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5313 SOSLE SWPOPR ;ENOUGH
5314 CAIL C,20. ;ENOUGH FOR NOW
5316 SKIPE NLOOSP ;SWAP OUT MORE PAGES
5319 \f;START SWAPPING OUT THIS USER'S PAGES
5323 IORM A,USWST(U) ;INDICATE USER WAS RUNNABLE AT TIME OF SWAP OUT
5328 MOVE T,UPC(U) ;CALCULATE WHAT PAGE HIS PC IS ON
5329 LDB C,[121000,,UPC(U)]
5332 MOVE A,[222200,,(C)]
5338 ANDI A,PMRCM ;MASK TO REAL CORE ADR BITS
5339 SKIPN USTP(U) ;ONLY IF RUNNING
5340 TLNN T,%PCUSR ;AND IN USR MODE
5342 MOVEM A,SWUPC ;THEN DON'T ALLOW UPC PAGE TO BE SWAPPED OUT
5347 JRST SWPU3A ;PICK UP FROM WHERE LEFT OFF
5352 MOVEI C,UPGMP(U) ;ADDRESS OF PAGE MAP (START FROM PG 0)
5354 HRLI C,442200 ;CNVRT TO BYTE PNTR TO MAP
5358 LDB B,[121100,,HUSRAD(U)] ;DO ALL PAGES THAT MIGHT EXIST
5359 SWPU2: ILDB D,SWPCBP ;CIRC PNTR ENTRY
5360 ILDB A,SWPMBP ;PAGE MAP ENTRY
5362 JUMPE D,SWPU3A ;DOESN'T HAVE PAGE
5365 SKIPE USTP(U) ;DON'T SWAP OUT PAGE 0 IF NOT STOPPED
5366 CAIN D,-1 ;PAGE IS ABSOLUTE
5368 TRNN A,600000 ;NO ACCESS
5372 TRON A,PMAGEM ;HAS PAGE BEEN REFERENCED? (AGE MASK)
5376 SWPU2A: ANDI A,PMRCM ;MASK TO REAL CORE PAGE #
5377 CAMN A,SWUPC ;DON'T SWAP OUT PAGE WHERE PC IS IF RUNNING
5380 IFN SWPWSP,[ ;I DOUBT THAT MOST OF THAT NONSENSE DOES ANYTHING
5381 TRNE A,600000 ;NO ACCESS
5382 CAIN D,-1 ;OR PAGE IS ABSOLUTE
5383 JRST SWPU3A ;MEANS DON'T SWAP OUT
5384 ANDI A,PMRCM ;MASK TO REAL CORE PAGE #
5386 HRRZ D,MMSWP(A) ;NUMBER OF USERS WHO HAVE THIS PAGE MAPPED
5387 SOJN D,SWPU4 ;PAGE IS SHARED
5388 SWPU6: MOVEM B,PSWLC ;SAVE HOW FAR SWAP-OUT SCAN GOT
5390 PUSHJ P,SWPOPG ;SWAP OUT THIS PAGE
5392 SETOM SBEFLG ;FOUND A PAGE TO SWAP OUT, NOT DESPERATE
5394 SOSLE SWPOPR ;ENOUGH
5395 CAIL C,20. ;ENOUGH FOR NOW
5399 SWPU3A: SOJG B,SWPU2
5402 IORM B,USWST(U) ;SET BEST EFFORT BIT
5404 SKIPL APRC(U) ;IF DISOWNED,
5406 MOVE B,USWPRI(U) ;DECREASE PRIORITY TO COME BACK IN
5411 \f;TRYING TO SWAP OUT A SHARED PAGE
5412 SWPU4: MOVEM B,PSWLC ;SAVE HOW FAR SWAP-OUT SCAN GOT
5414 BUG ;CIRPSW LOCKED IN SWAP OUT CODE
5415 MOVE C,[2200,,MEMPNT(A)]
5418 400000,,SWPU5 ;CONSULT THE OTHER USERS OF THE PAGE
5421 JRST SWPU6 ;OK TO SWAP IT OUT
5423 SWPU5: SKIPGE TT,USWST(U) .SEE %SWDSO
5424 POPJ P, ;USER DESIRED OUT, CAN'T HOLD PAGE IN
5425 IFN SWPWSP, TLNN TT,%SWLOD ;IF USER IS LOADING, HOLDS PAGE IN
5435 TRNE TT,600000 ;SKIP IF NO ACCESS, IGNORE AGE
5436 TRNE TT,PMAGEM ;HAS SHE USED THIS PAGE?
5437 POPJ P, ;NO, CAN'T HOLD PAGE IN
5438 SWPU5A: SUB P,[4,,4]
5439 SETOM CIRPSW ;SHARED W/USER WHO IS WANTED IN CORE
5440 AOS NSHRAB ;SO DON'T SWAP IT OUT
5443 ;COME HERE WITH BEST USER TO SWAP OUT IN U, CLASS IN C
5444 SWPONX: JUMPL U,CPOPJ ;NO SWAP OUTTABLE LOSER
5449 SETO U, ;WOULD RATHER SWAP OUT LOOSE PAGES
5452 SWPNX2: MOVSI T,%SWOUT ;MAKE USER SWAPPED OUT
5454 JRST SWPNX3 ;ALREADY IS?
5459 MOVEM T,USWTIM(U) ;DROPS INTO SWPNX3
5465 JRST [ SETO U, ? POPJ P, ] ;WOULD RATHER SWAP OUT LOOSE PAGES
5467 JRST SWPNX3 ;HE'S ALREADY SWAP BLOCKED
5468 TLNN B,%SWPGW ;IS HE RUNNABLE?
5472 MOVE B,NMPGS(U) ;HE'S RUNNABLE
5473 CAIGE B,TSYSM-SYSB-MEMSY1
5474 JRST SWPNX1 ;SMALL, NO THRASH
5481 JUMPG B,SWPNX3 ;LET THIS GUY THRASH
5482 SWPNX1: SKIPN ENSWBK
5484 MOVSI B,(SETZ) ;SWAP BLOCK THIS LOSER
5488 MOVE B,NMPGS(U) ;SMALLEST SWAP BLOCKED LOSER?
5492 MOVEM B,BUSIZ ;DROP INTO SWPNX3
5494 ;HAVING DECIDED TO SWAP OUT JOB IN U, MAKE SWAP HISTORY TABLE ENTRY
5495 SWPNX3: MOVSI T,2_16.
5496 ;GENERAL SWAP HISTORY TABLE KEEPER. ENTER WITH JOB IN U, EVENT IN T, BASHES TT,I,T
5498 IDIVI TT,LUBLK ;TT 3.1-3.8 GETS JOB NUMBER, BASHES I
5501 IFN SWPWSP, HLRZ T,UWRKST(U)
5511 MOVEM TT,SWPHTL-1(T)
5513 CAIL T,SWPHTB+SWPHTL
5517 OVHMTR SWF ;SWAP FIND USER
5519 ;FIND A USER TO SWAP OUT, RETURN IN U, -1 IF NONE
5520 SWPON2: SETOM PSWSFL ;START FROM BEG OF USER
5523 PUSHJ P,CKPRUS ;MAKE SURE PRIV USER EXISTS AND HAS NOT BEEN BLOCKED FOR A LONG TIME
5526 ADD T,TIME ;A MINUTE AGO
5529 MOVEI C,NSSCDC ;# SWAP OUT CLASSES
5530 SWPON4: CAML J,USRHI ;C HAS INDEX OF MAX CLASS INTERESTED IN
5531 JRST SWPONX ;LOOKED AT ALL USERS, GO PONDER RESULTS
5532 SKIPE UNAME(J) ;SEE IF FOR REAL
5533 SKIPN NMPGS(J) ;DON'T BOTHER IF HAS NO MEMORY
5537 TLNE B,%SWBEM+%SWLOD ;DON'T SWAP OUT IF BEST EFFORT ALREADY MADE,
5538 JRST SWPON3 ; OR STILL LOADING IN
5541 CAMLE TT,TIME ;IF PROTECT TIME HASN'T ELAPSED YET, GETS HIGHER PRIORITY
5542 JRST SWPTK ;TO PREVENT THRASHING
5547 JRST SWPON3 ;BEST EFFORT ALREADY MADE
5550 JRST SWPON7 ;PREFER NOT TO SWAP OUT LOSER WITH SWITCHES LOCKED
5553 JRST SWPON5 ;FLSINS IS WAITING FOR A PAGE (NOT REALLY BLOCKED)
5555 SOJA I,SWPTK ;BLOCKED FOR A LONG TIME (CLASS 0)
5557 SWPON5: SKIPE USTP(J)
5558 JRST SWPTK ;CLASS 1 (BLOCKED)
5561 JRST [ MOVEI I,7 ;CLASS 7 (PRIV USER)
5564 JUMPL B,[AOJA I,SWPTK] .SEE %SWDSO ;DESIRED OUT (CLASS 2)
5567 SOJA I,SWPTK ;DISOWNED (CLASS 3)
5570 JRST SWPTK ;SWAP BLOCKED (CLASS 4)
5573 AOJA I,SWPTK ;DOESNT HAVE TTY (CLASS 5)
5574 SWPON7: MOVEI I,6 ;OTHERWISE....
5577 JRST SWPON3 ;THIS GUY IN MORE WINNING CLASS
5582 .ELSE MOVE A,UWRKST(J)
5585 XCT SWPTT(C) ;IN SAME CLASS, COMPARE CLASS-DEPENDENT PRIORITY MEASURES
5587 SWPTK2: MOVE E,@SWPTT(I) ;MAKE THIS GUY BEST VICTIM
5590 SWPON3: ADDI J,LUBLK
5593 ;SKIP IF THIS GUY (J) IS BETTER LOSER TO FLUSH THAN PREV BEST (IN E)
5594 SWPTT: CAMG E,LUBTM(J) ;BLOCKED FOR A LONG TIME (0) - LATER LUBTM WINS
5595 CAMG E,LUBTM(J) ;BLOCKED (1) - LATER LUBTM WINS
5596 CAML E,A ;DESIRED OUT (2) - SMALLER WORKING SET WINS
5597 CAML E,A ;DISOWNED (3) - SMALLER WORKING SET WINS
5598 CAML E,A ;RUNNABLE, SWAP BLOCK SET (4) - SMALLER WORKING SET WINS
5599 CAML E,USWPRI(J) ;RUNNABLE, W/O TTY (5) - GO BY PRIORITY
5600 CAML E,USWPRI(J) ;OTHERWISE (6) - GO BY PRIORITY
5601 IFE SWPWSP, BUG ;PRIVELEGED USER (7) - SHOULD ONLY BE ONE
5602 IFN SWPWSP, CAMG E,USWTIM(J);PROTECTED (7) - LATER UNPROTECT TIME WINS
5606 CKPRUS: MOVSI B,%SWPRV
5608 ANDCAM B,USWST(U) ;TURN OFF PRIV USER BIT
5610 ADD TT,TIME ;TWO SECONDS AGO
5621 OVHMTR UUO ;RANDOM UUOS
5623 ;AC: A.9 =>1 SWAP OUT USER
5625 ;4.7=1 => LOOP FOR A WHILE
5626 ;3.9-3.1 USER # SELF IF 0
5627 ;RH => USER VIRTUAL PG #
5628 ;OR 4.9=0, 4.8=0, 4.7=0 SWAP OUT RH # OF PAGES
5629 ;IF 4.9=0, 4.8=1 AND 4.7=0, HACK PCLSR TEST FEATURE ON CURRENT USER
5630 ;RH =0 LEAVE PCLSR TEST MODE =1 ENTER IN ADVANCE MODE =-1 ENTER IN HOLD MODE
5631 ; =2 ENTER IN ADVANCE BUT DON'T ^Z
5640 JRST ASWPCL ;PC LSR TEST MODE.
5641 HRRZM A,SWPOPR ;CLOBBER CLOBBER
5645 ANDI B,777 .SEE MAXJ ;FIELD SHOULD BE BIG ENOUGH
5664 ASWAP2: PUSHJ P,CWAIT ;RETURNS WITH CLKOFF AND CIRPSW AVAILABLE
5666 HRRZS A ;A HAS VIRTUAL PAGE #
5667 PUSHJ P,UPLC ;RETURN POINTERS IN T AND Q
5668 LDB A,T ;GET MAP ENTRY
5669 LDB C,Q ;GET CIRC PNTR
5670 CAIE C,-1 ;DON'T SWAP OUT ABS PAGE
5672 POPJ P, ;ALREADY OUT OR DOESN'T HAVE PAGE
5673 ANDI A,PMRCM ;MASK TO REAL CORE PAGE #
5679 ASWAP3: MOVE B,[1250000.]
5684 ASWPCL: MOVEM U,PCLUSR
5694 ; ARG 2 - PAGE NUMBER IN <JOB>'S ADDRESS SPACE
5695 ;IF ONLY ONE ARGUMENT IS GIVEN, IT IS ARG 2, AND ARG 1 DEFAULTS TO CURRENT USER
5697 ;THE PAGE IS SWAPPED OUT. THE CALL DOESN'T RETURN UNTIL THE SWAP IS COMPLETED.
5698 ; THIS ALLOWS USER TO BE SURE THAT THE COPY ON DISK IS UP TO DATE.
5699 ;CONTROL BIT 1.1 => RETURN IMMEDIATELY, NO WAITING. TO WAIT LATER, JUST DO
5700 ; ANOTHER PGWRIT WITHOUT SETTING 1.1.
5701 ;CONTROL BIT 1.2 => UNLOCK PAGE. IF YOU CALL THIS ON A LOCKED PAGE,
5702 ; WITHOUT SETTING BIT 1.2, THE PAGE WILL BE SWAPPED OUT, BUT THE NEXT
5703 ; TIME IT IS SWAPPED IN IT WILL BE LOCKED AGAIN. THIS IS USEFUL FOR
5704 ; CONTROLLING EXACTLY WHEN A DATA BASE PAGE GETS WRITTEN TO DISK.
5707 JRST [ MOVE J,U ? JRST NPGWR1 ]
5709 JSP T,NCORUI ;DECODE THE JOB SPEC
5711 JSP T,NCORWR ;WHICH MUST BE WRITABLE
5716 JRST OPNL34 ;CAN'T HACK PDP6
5718 MOVE A,B ;NOTE: SWPOPG TAKES CARE OF THE PCLSR'ING
5719 PUSHJ P,NPGWR1 ;CALL MAIN ROUTINE
5720 POPJ P, ;LOST, OPNL CLEARED LSWPR
5721 JRST LSWPJ1 ;WON, UNLOCK DIELOK
5723 ;USER INDEX IN J, PAGE NUMBER IN A
5724 NPGWR1: TDNE A,[-1,,-400]
5725 JRST OPNL32 ;PAGE NUMBER NOT VALID
5726 PUSHJ P,CWAIT ;DON'T ALLOW PAGE MAPS TO CHANGE, AND TURN CLK OFF
5727 SKIPL CIRPSW ;DON'T NEED UTCOFF BECAUSE UTC LEVEL CAN ONLY PUT PAGES INTO MAPS
5731 LDB D,Q ;D GETS CIRC PNTR
5732 JUMPE D,OPNL32 ;NO PAGE THERE
5734 JRST OPNL12 ;ABSOLUTE PAGE
5736 MOVE C,Q ;STARTING FROM UPGCP, FIND MMP
5740 SUB P,[4,,4] ;FOUND MMP, C POINTS TO IT
5741 MOVSI T,MMPTMP ;IF PAGE IS IN TRANSIT
5744 TDNE T,(C) ;AWAIT COMPLETION
5746 JRST NPGWR1 ] ;THEN TRY AGAIN
5747 MOVE E,C ;SAVE ADDRESS OF MMP ENTRY
5748 PUSHJ P,UCPRL ;SEE IF PAGE IS IN MEMORY
5750 POP P,U ;NOT SWAPPED IN, BYPASS SWAP-OUT CODE
5753 NPGWR3: SUB P,[4,,4] ;IT'S SWAPPED-IN TO CORE PAGE IN T
5756 JUMPN D,OPNL12 ;POINTED TO BY AN EXEC PAGE, E.G. 340, SHOULDN'T MESS.
5757 PUSH P,A ;SAVE USER'S VIRTUAL PAGE #
5758 PUSH P,J ;SAVE WHAT JOB THAT IS
5759 PUSH P,E ;SAVE ADDRESS OF MMP ENTRY
5760 MOVE A,T ;PHYSICAL PAGE # TO SWAP OUT
5761 MOVE C,USER ;DON'T PCLSR ME
5762 PUSHJ P,SWPOPL ;SWAP OUT, EVEN IF LOCKED
5763 JRST NPGWR4 ;NO DISK SPACE, OR SOME JOB NOT PCLSRABLE
5767 NPGWR2: MOVE T,CTLBTS(U)
5769 TRNE T,2 ;CONTROL BIT 1.2 UNLOCKS
5771 TRNE T,1 ;CONTROL BIT 1.1 INHIBITS WAITING FOR SWAP TO FINISH.
5773 MOVSI T,MMPTMP ;PAGE IN TRANSIT BIT
5774 TDNE T,(E) ;WAIT FOR BIT TO TURN OFF
5778 ;COULDN'T SWAP OUT, WAIT A WHILE AND TRY AGAIN
5779 NPGWR4: PUSHJ P,UDELAY ;UDELAY TURNS CLKON
5789 IFN 340P\E.SP, DISSWI: -1 ;USER
5790 IFN VIDP, VIDSWI: -1
5791 IFN IMXP, POTSWI: -1
5792 IFN NSWPV-.+SWIRQB,.ERR NSWPV ERR
5795 IFN 340P\E.SP, DISSPG: 0 ;VIRTUAL PAGE NUMBER
5799 SWPNTB: ;SIGNAL BITS IN LH OF W TO CFHSW1
5800 IFN 340P\E.SP, 400000 ;DISPLAY
5801 IFN VIDP, 400000 ;VID
5802 IFN IMXP, 400000 ;POTS
5804 SWILMT: ;PIRQC BIT TO SET ON ILM
5805 IFN 340P\E.SP, %PIDIS
5809 PSWOUS: -1 ;INDEX OF PARTIALLY SWAPPED OUT USER
5810 PSWCLS: 0 ;CLASS OF PARTIALLY SWAPPED OUT USER
5811 PSWSFL: 0 ;-1 START FROM BEG OF USER, ELSE PICK UP WHERE LEFT OFF
5812 SWPMBP: 0 ;PNTR TO MAP
5813 SWPCBP: 0 ;PNTR TO CIRC DESC SPACE
5814 PSWLC: 0 ;LOOP COUNT
5815 SBEFLG: -1 ;0 => ALREADY ONCE WANTED TO CLEAR ALL "BEST EFFORT" BITS.
5816 SWPOPR: 0 ;NUMBER OF PAGES DESIRED TO BE SWAPPED OUT
5817 SWPOPB: 0 ;SWAP OUT REQUEST BUT ONLY SWAP OUT NON-RUNNING USERS TO MEET (UNUSED?)
5818 SILNG: 0 ;TOTAL LENGTH OF SWAP IN LISTS
5819 SOLNG: 0 ;TOTAL LENGTH OF SWAP OUT LISTS
5820 ;SINLST AND SOUTLS ARE IN DISK CODE. VARIATION ON QBFP.
5821 SWODSK: NQS-1 ;UNIT TO SWAP OUT ON NEXT
5822 SWOBK: 0 ;MEMBLT BEING SWAPPED OUT
5823 SWOMMP: 0 ;MMP ADDRESS (NOT INDEX)
5824 SPGNMF: 0 ;-1 => PAGE NOT MODIFIED
5825 CFHAS: 0 ;TEMP FOR A AT CFH
5826 SWPIQS: 0 ;SAVE Q AT SWPPIN
5827 CFHUVP: 0 ;USER'S VIRTUAL PAGE NUMBER TOOK FAULT ON
5828 LUMPS: 0 ;UMAPS USED FOR CURRENT USER, MAY DIFFER FROM
5829 ;UMAPS(U) IF TOOK FAULT TRYING TO CAUSE INTERRUPT
5830 TRUMM: 0 ;TOTAL USER MEM ACTIVE USERS
5831 NPGSWO: 0 ;NUMBER OF CURRENTLY SWAPPED OUT PAGES
5832 AUSOPG: 0 ;ACTIVE USER SWAPPED OUT PAGES
5833 BUMPGS: 0 ;REAL CORE PAGES OCC BY BLOCKED + STOPPED LOSERS
5834 NUSWB: 0 ;# LOSERS SWAP BLOCKED
5835 SWPOPU: 0 ;USER PG "BELONGS" TO (IE NOT NECC TO PCLSR THIS GUY,
5836 ;BUT PCLSR ANYONE ELSE LINKED TO PG.)
5837 AGEREQ: 0 ;NUMBER OF PAGES BEING AGED AT SLOW CLOCK
5838 AGEPOS: 0 ;LAST PAGE # AGED
5841 PRVUSR: -1 ;PRIV USR
5842 PRVCUT: 1500 ;CUT OFF FOR PRIV USR
5843 SWUPC: 0 ;ABSOLUTE PAGE NUMBER OF USER MODE PC DURNING SWAP OUT
5844 SWPP0F: -1 ;-1 IF CONSIDERING PAGE 0
5845 ASBUM: 0 ;REAL MEM OCC BY ACTIVE "SWAPPED BLOCKED" LOSERS
5846 SWSCT1: 0 ;TEM AT SWSCD
5847 BUSR: 0 ;INDEX OF SMALLEST SWAP BLOCKED LOSER
5848 BUSIZ: 0 ;SIZE OF BUSR
5852 PREEMP: 0 ;IF NON-ZERO, A PRE-EMPT IS IN PROGRESS (WHEN WE NEXT GET TO CLK LVL)
5853 NPREEL: 0 ;NUMBER OF LOOPS AT SCHEDP (ATTEMPTED PREEMPTS)
5854 NPREEM: 0 ;NUMBER OF SUCCESSFULL PREEMPTS
5855 NPREE1: 0 ;NUMBER OF TIMES A PAGE CAME IN AND WE STARTED TO THINK ABOUT PREEMPTION
5856 NPREE2: 0 ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE OF CLKOFF OR IN PROGRESS
5857 NPREE3: 0 ;NUMBER OF TIMES WE DIDN'T PUNT BECAUSE FLSINS WAS WRONG
5860 ;COUNTS OF REASONS FOR ENTRY TO SCHED
5861 ;THESE METERS MAY BE TEMPORARY - SOME OF THEM ARE REDUNDANT
5862 ;REASONS NOT COUNTED - VARIOUS PARITY, NXM, AND OTHER ERROR CASES
5863 NLPPRE: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PREEMPT
5864 NLPCLK: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO CLOCK
5865 NLPUFL: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO UFLS
5866 NLPPAG: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE-IN
5867 NLPPGT: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND TUT LOCKED
5868 NLPPGC: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CIRPSW LOCKED
5869 NLPPGM: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND MEMFRZ LOCKED
5870 NLPPG3: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND CALLED CFHPO3 (NO MEM)
5871 NLPPGB: 0 ;NUMBER OF TIMES LOST PROCESSOR DUE TO PAGE FAULT AND SWAP-BLOCKED
5872 NPPIUM: 0 ;NUMBER OF TIMES PAGE PUT INTO BUNCHA USERS' MAPS
5873 NPPIU1: 0 ;NUMBER OF USERS PAGES PUT INTO MAPS OF (RATIO OF THESE 2 IS SHARING)
5876 LODQNT: ;RUN TIME IN 4-USEC UNITS BETWEEN PG FAULTS TO LEAVE
5878 IFN KL10P, 3000. ;12 MS
5879 IFN KA10P, 9000. ;36 MS
5880 IFN KS10P, 3000. .ERR Guessed LODQNT on KS10?
5881 LODFCT: 3,,0 ;MULTIPLY LOADING TIME BY THIS TO GET PROTECT TIME (INT,,FRAC)
5882 NUPTAW: 0 .SEE SWOP6 ;NUMBER OF USERS PAGE TAKEN AWAY FROM
5886 NPLBLJ: 0 ;NUMBER OF PAGE LOADS BY LOADING JOBS
5887 NPLBNL: 0 ;NUMBER OF PAGE LOADS BY NON-LOADING JOBS
5890 ; 1-, 5-, 15- minute average population of each state,
5891 ; also avg of NPGWTU and RNABLU (for load avg)
5892 ; avg of core occupied by jobs in each state,
5893 ; i.e. UWRKST for load, pro, sw in.
5894 ; Relationship of sum of UWRKST's of loading and swapped in
5895 ; versus total core occupied by user pages.
5896 ; Average time spent in each state before moving on,
5897 ; versus size of job. Maybe cpu time as well as
5904 OVHMTR SWP ;SWAP PAGE
5906 ;SWAP OUT PAGE WHOSE MEMBLT INDEX IS IN A
5908 ;C IS USER WHO DOESN'T NEED TO BE PCLSRED BEFORE HIS PAGES CAN BE SWAPPED.
5909 SWPOPL: TDZA B,B ;THIS ENTRY IGNORES LOCK BIT
5910 SWPOPG: MOVSI B,MMPLOK ;THIS ENTRY RESPECTS LOCK BIT
5915 BUG ;DON'T SWAP OUT PART OF SYSTEM
5918 LDB C,[MMMPX,,MEMBLT(A)]
5920 HRRZM C,SWOMMP ;STORE ADDRESS OF FIRST WORD OF MMP ENTRY
5921 TDNE B,(C) .SEE MMPLOK ;LOCKED IN CORE?
5922 JRST [ CAIGE A,256. ;IF SO, DON'T SWAP OUT UNLESS IN "LOW" MEMORY
5923 CAIGE A,LIOBLK ;IN WHICH CASE MUST GO OUT TO AVOID SYSTEM DEADLOCK
5924 JRST SCRPSJ ;SEE CODE AT CIMEMR
5927 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES
5931 SOS CIRPSW ;RELEASE SWITCH
5933 JUMPN B,SWOP1 ;JUMP IF DISK SPACE ALREADY ASSIGNED
5934 SWODF3: MOVSI B,-NQS
5935 SWODF6: AOS I,SWODSK
5937 SUBI I,NQS ;WRAP AROUND
5938 MOVEM I,SWODSK ;CURRENT SWAPPING DSK
5939 CONO PI,UTCOFF-1 ;DON'T CHANGE STATE OF CLOCK CHNL.
5940 SKIPGE QTUTO(I) ;TUT LOCKED
5943 SKIPG QSFTS(I) ;DSK FULL IN SWAPPING AREA
5947 CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL.
5948 MOVEI A,NQCHN+1(I) ;QMFTP(A) CONTAINS TRACK TO START FROM
5949 PUSHJ P,QGTK4 ; RETURNS TRACK IN D
5951 SWODF5: MOVSI A,(SETZ)
5954 HRLM D,1(A) ;STORE DISK ADDRESS IN MMP ENTRY
5958 SWODF7: AOBJN B,SWODF6 ;TRY NEXT DSK FOR SWAPPING AREA
5959 CONO PI,UTCON-1 ;NON FOUND FIND FILE SPACE
5963 SWODF2: SKIPL QTUTO(E) ;FIND WHICH DISK HAS MOST FREE SPACE
5970 SWODF4: AOBJN E,SWODF2
5971 JUMPL I,CPOPJ ;NO DSK SPACE AVAIL
5972 HRRZM I,SWODSK ;LAST DSK HACKED
5973 JUMPLE D,CPOPJ ; NO ROOM ANYWHERE
5976 JRST UTCNJ ;TUT LOCKED
5980 MOVEI D,NBLKS/2 ;STARTING POINT
5981 MOVEI A,NQCHN+1(I) ;DISK CHANNEL
5983 PUSHJ P,QGTK4 ;RETURNS TRACK IN D
5985 MOVEM E,QMFTP(A);DON'T LEAVE SWAPPING CHNL POINTING INTO FILE SPACE
5989 SCRPSJ: SETOM CIRPSW
5996 ;COME HERE FROM SWPOPG AND MMPRTN TO SWAP OUT A PAGE.
5997 ;CLOCK OFF OR IN PROGRESS AND ARGUMENTS IN SWOBK AND SWOMMP.
5998 ;PUTS BLOCK ON SWAPOUT LIST IF DISK COPY NEEDS TO BE UPDATED, ELSE
5999 ;JUST DELETES MEMORY. IF NO USERS ARE USING THE PAGE,
6000 ;RETURNS THE MMP ENTRY OR ARRANGES FOR THE DISK ROUTINES TO.
6002 SWOP1A: CONO PI,UTCOFF-1 ;DON'T CHANGE STATE OF CLOCK CHNL.
6003 MOVE A,SWOBK ;CORE BLOCK # CONTAINING PAGE TO BE SWAPPED OUT
6004 HLRZ C,MMSWP(A) ;NUMBER OF EXEC PAGES POINTING TO THIS PAGE
6005 JUMPN C,SWOP5 ;POINTED TO BY EXEC PAGE, CAN'T SWAP OUT
6008 SWOPT2: LDB I,DPEP(C)
6011 ANDI I,PMRCM ;MASK TO REAL CORE PAGE #
6013 BUG ;DISPLAY STILL SET UP TO PAGE BEING SWAPPED OUT
6014 SWOPT1: AOBJN C,SWOPT2
6019 IORM C,MEMBLT(A) ;PREVENT NEW EXEC PAGES FROM BEING SET UP POINTING HERE
6021 MOVE C,[2200,,MEMPNT]
6023 SETOB B,SPGNMF ;INITIALIZE PAGE NOT MODIFIED FLAG, AND COUNT USERS IN B
6028 MOVSI D,-1 ;COMPUTE WORKING SET CONTRIBUTION TO BE TAKEN AWAY
6029 IDIV D,MMSWP(A) ;LH(MMSWP) KNOWN TO BE ZERO!
6030 PUSHJ P,UCPRL ;CHECK ALL USERS, TAKE PAGE AWAY FROM SOME
6031 400000,,SWOP6 ;ALSO COUNTS USERS IN B
6033 AOJE B,SWOP7 ;JUMP IF NO USERS USING PAGE, RETURN MMP ENTRY
6034 CAMN B,NUPTAW ;ANY USERS STILL MAPPED TO PAGE?
6035 JRST SWOP8 ;NO, GO SWAP IT OUT
6036 MOVSI D,1 ;YES, COMPUTE WORKING SET ADJUSTMENT
6037 IDIV D,MMSWP(A) ;TO BE ADDED BACK IN TO THEM
6038 PUSHJ P,UCPRL ;GO BACK AND FIX WORKING SETS
6040 JRST SWOP6E ;ABORT SWAP OUT
6044 PUSH P,I ;NOTE: CAN BACK OUT OF THIS PUSH AT SWOP2B
6046 400000,,SWOP2 ;RETURN ON USERS (CAN BACK OUT AT SWOP2B)
6050 SWOP7: MOVSI B,MMPGON ;NO USERS USING PAGE, SO MMP ENTRY WILL BE RETURNED
6051 IORM B,@SWOMMP ;FLAG THAT MMP ENTRY WILL SOON GO AWAY
6052 MOVEI A,0 ;REMOVE FROM LOOSE PAGE LIST
6054 SWOP7A: MOVE B,A ;B PREDECESSOR
6055 SKIPN A,T ;T SUCCESSOR
6057 LDB T,[MLO,,MEMBLT(A)]
6060 SKIPE B ;FOUND, PATCH OUT OF LIST
6061 DPB T,[MLO,,MEMBLT(B)]
6068 BUG ;NLOOSP TOO LOW.
6072 ;THIS UCPRL ROUTINE SCANS ALL USERS, COUNTS THEM IN B,
6073 ;USES D TO ADJUST WORKING SETS OF USERS WHICH ARE MAPPED TO
6074 ;THE PAGE, AND TAKES THE PAGE AWAY FROM ANY USERS IT CAN,
6075 ;COUNTING THEM IN NUPTAW.
6076 SWOP6: AOS B ;COUNT USERS OF THIS PAGE
6078 BUG ;SYS JOB OR CORE JOB?
6080 MOVEI C,UPGMP(U) ;MAKE C POINT TO UPGMP ENTRY (PTW)
6090 ADDM D,UWRKST(U) ;IS MAPPED TO PAGE, ADJUST WORKING SET
6092 JRST SWOP6A ;DON'T CONSIDER PCLSRING SWPOPU
6096 SKIPN LSWPR(U) ;PCLSR IF HAS SWITCHES LOCKED
6099 MOVSI T,%SWPCL ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6106 PUSHJ P,PCLSR ;BETTER NOT CLOBBER U OR H OR A
6113 ;WHEN WE GET HERE, THIS JOB CAN'T HOLD THIS PAGE IN
6114 SWOP6A: TRNN I,600000
6115 JRST SWOP6C ;NOT SET UP SINCE PREV SWAPPED OUT
6116 AOS NUPTAW ;TAKE IT AWAY
6117 LSH I,-16. ;SAVE ACCESS MODE IN LOW ADR BITS
6118 CAILE I,2 ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6119 CLEARM SPGNMF ;PAGE HAS BEEN MODIFIED
6120 CAIN I,2 ;FLUSH R.W.F.
6122 DPB I,C ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6123 AOS NSWPGS(U) ;INCR COUNT OF SWAPPED OUT PGS OF USER
6124 AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS
6125 SOS MMSWP(A) ;DECR COUNT OF PAGE SHARERS
6127 CAMN U,DISUSR ;IF USER OF E&S
6128 PUSHJ P,E.SLPM ;LOAD ITS MAP
6133 SWOP6F: CAMN U,-4(P) ;DON'T LOOK AT USER TAKING PAGE AWAY FROM
6134 POPJ P, ;ELSE DROP INTO SWOP6B
6135 ;THIS UCPRL ROUTINE ADJUSTS WORKING SETS OF JOBS THAT
6136 ;ARE MAPPED TO THE PAGE USING D.
6138 MOVEI C,UPGMP(U) ;MAKE C POINT TO UPGMP ENTRY (PTW)
6148 ADDM D,UWRKST(U) ;IS MAPPED TO PAGE, ADJUST WORKING SET
6154 ;COME HERE VIA UCPRL FOR ALL USERS OF PAGE BEING SWAPPED OUT
6156 SWOP2: AOS B ;COUNT USERS OF THIS PAGE
6158 BUG ;SYS JOB OR CORE JOB?
6165 SKIPN LSWPR(U) ;PCLSR IF HAS SWITCHES LOCKED
6168 MOVSI T,%SWPCL ;DONT PCLSR NOW, BUT WHEN UNBLOCKS
6172 SWOP2D: PUSHJ P,PCLSR
6174 SWOP2A: MOVEI C,UPGMP(U)
6184 JRST SWOP2C ;NOT SET UP SINCE PREV SWAPPED OUT
6185 LSH I,-16. ;SAVE ACCESS MODE IN LOW ADR BITS
6186 CAILE I,2 ;SKIP ON READ ONLY OR READ/WRITE/FIRST
6187 CLEARM SPGNMF ;PAGE HAS BEEN MODIFIED
6188 CAIN I,2 ;FLUSH R.W.F.
6190 DPB I,C ;STORE PROTECTION BITS BACK IN LOWER TWO BITS OF ENTRY
6191 AOS NSWPGS(U) ;INCR COUNT OF SWAPPED OUT PGS OF USER
6192 AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS
6194 SOS MMSWP(I) ;KEEP ACCURATE COUNT OF UPGMP'S POINTING AT THIS PAGE
6196 CAMN U,DISUSR ;IF USER OF E&S
6197 PUSHJ P,E.SLPM ;LOAD ITS MAP
6202 SWOP2B: SUB P,[6,,6] ;2 PUSHES OF I AND 4 FOR UCPRL
6204 SWOP6E: MOVE A,SWOBK ;ABORT SWAP-OUT
6210 SWOP8: DPB I,C ;DELINK MEMPNT
6211 MOVEI I,3 .SEE MMPOUT .SEE MMPTMP
6212 DPB I,[410200,,@SWOMMP] ;INDICATE ON THE WAY OUT
6220 TLNN C,MMPGON ;UNLESS PAGE WILL BE FORGOTTEN AFTER SWAP OUT,
6221 AOS NPGSWO ; KEEP COUNT OF PAGES CURRENTLY SWAPPED OUT
6222 TLNE C,MMPWRT ;IF WAS WRITTEN BY USER WHO LATER DELETED IT,
6224 SKIPGE SPGNMF ;OR IF PAGE MODIFIED,
6226 JRST SWOP3 ;OR IF HASN'T BEEN WRITTEN TO DISK, MUST WRITE OUT.
6227 MOVEI I,2 ;NO NEED TO WRITE OUT. INDICATE OUT.
6228 DPB I,[410200,,@SWOMMP]
6229 PUSHJ P,IMEMR ;RETURN THE MEMORY
6232 PUSHJ P,RETMMP ;ALSO RETURN THE MMP ENTRY IF NECESSARY
6236 UTCNJ: CONO PI,UTCON-1 ;DON'T TURN ON CLOCK CHNL
6239 SWOP3: CAIGE A,TSYSM ;HAVE TO WRITE THIS PAGE OUT
6245 BUG ;DISK NUMBER NOT LEGITIMATE
6247 ANDCAM C,MEMBLT(A) ;SET END OF LIST IN THIS BLOCK
6248 HLRZ C,SOUTLS(I) ;GET PREV BLOCK
6250 DPB A,[MLO,,MEMBLT(C)] ;CHAIN TO PREV BLOCK
6252 MOVEM A,SOUTLS(I) ;OR TO HEADER IF FIRST
6253 HRLM A,SOUTLS(I) ;AND SET NEW LAST BLOCK
6256 HRLM C,MEMPNT(A) ;STORE DISK ADDRESS
6258 DPB B,[MUR,,MEMBLT(A)]
6261 UTCNJ1: CONO PI,UTCON-1
6265 SWPPIN: MOVSI Q,-NSWPV ;# OF DEVICES THAT CAN SWAP IN PAGES
6266 SWPPI4: SKIPGE W,SWIRQB(Q) ;USER INDEX
6268 MOVE E,SWIVPN(Q) ;VIRTUAL PAGE NUMBER
6275 SWPPI6: AOBJN Q,SWPPI4
6281 TRNN Q,-1 ; IS DEVICE DIS? (E&S IS INDEX 0 IN SWIRQB)
6282 SETZM E.SPGW ; IF SO, CLEAR PAGE WAIT.
6290 SUBTTL LOAD USER PAGE MAP
6292 OVHMTR UUO ;RANDOM UUOS (WELL, SOME MINOR SCHED STUFF, TOO)
6294 ;SET PAGE MAP AT M.P. LEVEL, ASSUMING UMAPS HAS BEEN ALTERED.
6295 ;UMAPS EXISTS SO SCHEDULER CAN RESTORE THE MAP AFTER OTHER JOBS RUN.
6296 ;FORMAT OF A MAP SPECIFICATION IS:
6298 %UMMPL==200000 ;1 => MAP LOWER HALF TO SPEC'D JOB'S; 0 => USE LOWER OF JOB IN U.
6299 %UMMPU==100000 ;1 => MAP UPPER HALF TO SPEC'D JOB'S; 0 => USE UPPER OF JOB IN U.
6300 %UMALL==300000 ;SET => SELECT WHOLE MAP OF SPEC'D JOB.
6301 %UMUTL==40000 ;IGNORED IF %UMMPU=0. IF %UMMPU=1, MEANS USE SPEC'D JOB'S LOWER
6302 ;INSTEAD OF ITS UPPER, AS OUR UPPER HALF. READ "%UM UPPER-TO-LOWER".
6303 %UMLTU==20000 ;"%UM-LOWER-TO-UPPER". WITH %UMMPL, MAKES LOWER -> SPEC'D JOB'S UPPER.
6304 %UMSOA==4000 ;1 => USE AC0S AS THE USER'S ACS, INSTEAD OF UUOACS.
6305 ;NOTE IF %UMLTU=1, OR IF LOWER -> PDP6, THE GARBAGS ACS ARE USED.
6306 ;ELSE, THE ACS COME FROM THE JOB WHICH OUR LOWER HALF COMES FROM.
6307 ;RH ;JOB INDEX OF THE "SPECIFIED JOB". -1 => PDP6.
6308 ;NOT NEEDED IF %UMMPL=%UMMPU=0.
6310 PGLDU: MOVE R,UMAPS(U)
6311 ;SET PAGE MAP AT INT. LEVEL, NOT CLOBBERING JOB'S UMAPS. ARG IN R.
6312 PGLD: MOVEM R,LUMPS ;LAST UMAPS ACTUALLY USED
6313 AOS NPGLD ;COUNT # CALLS TO PGLD
6314 PUSH P,A ;R HAS UMAPS CODE
6318 IFN KA10P, MOVSI B,NUVPG/2 ;SET UP NORMAL DBL, MIGHT BE CHANGED IF PDP6
6319 IFE KA10P, MOVSI B,0 ;ONLY KA10 HAS DBL
6321 JRST PGLD3A ;USE NORMAL LOW SEG
6324 JRST PGLD3B ;USE PNTR TO PDP6
6327 TLNE R,%UMLTU ;SKIP ON USE HIS LOWER
6328 JRST PGLD3D ;USE HIS UPPER
6329 PGLD3A: HRRI B,UDBR1A(C)
6331 JRST PGLD3G ;MAKE AC'S POINT AT SWAP OUT AC'S
6333 PGLD3F: MOVEM B,UPDBR1(U)
6334 IFN KA10P, DPB A,[2300,,UPACP(U)] ;STORE AC PNTR
6336 CAMN A,AC1PTR ;IF CHANGING AC BLOCK 1
6338 EXCH A,AC1PTR ;STORE OLD BLOCK 1
6340 XCTR XBR,[BLT B,17(A)]
6341 MOVS A,AC1PTR ;AND LOAD NEW BLOCK 1
6343 PGLD3H: ] ;IFE KA10P
6344 IFN KA10P, MOVSI B,NUVPG/2 ;SET UP DBL FOR DBR2
6345 IFE KA10P, MOVSI B,0
6348 JRST PGLD6 ;USE NORMAL UPPER SEG
6356 PGLD6: MOVEM B,UPDBR2(U)
6357 PGLDR1: LPMR UPGML(U)
6363 IFN PDP6P, PGLD3B: SKIPA B,PDP6MP
6364 PGLD3D: HRRI B,UDBR2A(R)
6368 PGLD3G: MOVEI A,AC0S(C)
6371 GACS: BLOCK 20 ;GARBAGE AC'S POINTED TO BY ACPNTR WHEN ITS REALLY POINTING
6372 ;AT UPPER PAGES OR PDP6 SHOULD HOPEFULLY NEVER GET REFERENCED
6374 ;MAIN PROGRAM MAP-SETTING ROUTINES.
6376 MP6LD: SKIPA J,[%UMMPU,,-1] ;LOAD UPPER DBR TO PNT TO 6
6378 MPLDZ: MOVEI J,0 ;SET NORMAL MAP - OUR OWN CORE.
6379 MPLD1: CAMN J,UMAPS(U) ;SET UMAPS AS SPEC'D
6382 MPLD: CONO PI,CLKOFF
6386 ;SET MAP TO JOB # IN J; MIGHT OR MIGHT NOT BE THE CURRENT JOB. SAVES RH(J)
6388 TLOA J,%UMSOA+%UMALL ;OTHER JOB'S ACS ARE IN ITS AC0S.
6389 TLO J,%UMALL ;THIS JOB => WANT UUOACS.
6392 ;SIMILAR ROUTINES, BUT FOR USE WHEN CLKCHN IS OFF AND SHOULD STAY OFF.
6394 PLD6: SKIPA J,[%UMMPU,,-1] ;MAKE UPPER DBR POINT TO PDP6.
6396 PLDZ: MOVEI J,0 ;NORMAL MAP
6397 PLD1: MOVEM J,UMAPS(U)
6398 PLD: SPM UPGML(U) ;IF ANY INHIBITED FAULT PRESENT, CAUSE IT TO GET STORED AWAY
6400 PUSHJ P,PGLDU ;CAUSE ACTUAL PG LOAD TO HAPPEN
6404 SUBTTL GIVING THE USER INTERRUPTS
6406 SEAR2E: MOVE A,PIRQC(U)
6408 ;ROUTINE TO HANDLE FIRST WORD (PIRQC) INTS
6409 SEAR2A: JUMPL A,SEAR2B ;REQUEST TO PCLSR
6411 JRST SEAR2C ;PI IN PROG, ONLY LOOK FOR FATAL INTS.
6413 AND Q,MSKST(U) ;ENABLED UNDEFERRED INTS.
6414 TDNN A,Q ;ANY OF THOSE PENDING,
6415 TDNE A,[BADBTS] ;OR ANY CLASS 1 OR 2 => INTERRUPT.
6418 ANDCA Q,A ;GET DISABLED OR DEFERRED PENDING INTS.
6419 TDNN Q,[BADBTS] ;ANY CLASS 1 OR 2 DISABLED OR DEFERRED
6420 JRST INTWD1 ;NO, INT. THIS JOB.
6421 JRST SEAR2D ;YES, INT. SUPERIOR.
6423 SEAR2C: TDNN A,[BADBTS] ;PI IN PROG: ANY CLASS 1 OR 2 ?
6424 JRST SEARL2 ;NO, NOTHING TO DO.
6425 SEAR2D: PUSHJ P,PCLSR ;INT. THE SUPERIOR: PCLSR FIRST.
6426 JRST SEARC ;CAN'T STOP THIS JOB IN EXEC MODE.
6427 SETZ B, ;OK, HANDLE FATAL 1ST WORD INTS IN A, AND NO 2ND WORD INTS.
6429 ;HANDLE A FATAL INTERRUPT BY INTERRUPTING THE SUPERIOR.
6430 ;FATAL 1ST WORD INTERRUPTS IN A, FATAL 2ND WORD INTS IN B.
6431 INTSUP: MOVEM A,SRN4(U) ;.FTL1
6432 MOVEM B,SRN5(U) ;.FTL2 ;PUT THE FATAL INTERRUPTS WHERE SUPERIOR CAN READ THEM.
6434 IORM T,USTP(U) ;STOP INFERIOR
6435 IFN SWPWSP, PUSHJ P,LVLOAD
6436 MOVSI T,BULGOS ;IF LOST TRYING TO LOG OUT, ABORT LOGOUT
6438 MOVE Q,U ;SAVE USER INTERRUPTING
6439 SKIPGE U,SUPPRO(U) ;SKIP UNLESS TOP LEVEL
6440 JRST INTTOP ;REALLY TOP LEVEL
6441 HLLZ T,U ;GET INT BIT
6442 IORM T,IFPIR(U) ;TURN ON INTERRUPT BIT IN SUPERIOR
6443 HRRZS U ;CLEAR LEFT HALF OF U
6444 CAIL J,(U) ;SKIP IF SUPERIOR HAS NOT YET BEEN SCHEDULED
6445 JRST SEARL1 ;RESCHEDULE SUPERIOR
6446 JRST SEARL ;HAVEN'T GOT TO HIM YET SO CONTINUE
6448 INTTOP: MOVEI T,SCRDET
6449 SKIPL APRC(Q) ;IF JOB ISN'T ALREADY DISOWNED
6450 IORM T,SUPCOR ;SAY SOMEONE WANTS TO BE DETACHED.
6451 JRST SEARL ;LEAVE STOPPED, SYS JOB WILL DETACH SOMEDAY.
6453 SEAR2B: PUSHJ P,PCLSR ;PCLSR THE JOB, E.G. SO IT CAN GET AN IOC ERROR
6454 JRST SEARC ;RUNNING IN EXEC MODE, GO RUN IT
6455 MOVSI A,(SETZ) ;CLEAR REQUEST
6457 JRST SEARL1 ;INSPECT THIS JOB AGAIN
6459 ;IFPIR IS NONZERO BUT PIRQC IS ZERO.
6460 INTWD2: SKIPN PICLR(U)
6461 JRST SEARL3 ;IGNORE 2ND WD INTS IF PI IN PROG.
6463 ANDCM B,IDF2(U) ;GET ENABLED UNDEFERRED INTS.
6464 JUMPE B,SEARL3 ;ALL DISABLED OR DEFERRED.
6465 JSP T,INTPAG ;MAKE SURE NOT WAITING FOR PAGE NEEDED FOR INT.
6466 PUSHJ P,PCLSR ;DON'T INT. EXCEPT IN USER MODE.
6468 SETZ A, ;1ST WD INTS TO GIVE = 0.
6469 JRST INTSRC ;2ND WD INTS TO GIVE ALREADY IN B.
6471 ;PIRQC WAS NONZERO BUT NO FATAL INTS.
6472 INTWD1: JSP T,INTPAG ;IF TRIED BEFORE & WENT TO INTPFL, WAIT FOR PAGE.
6473 PUSHJ P,PCLSR ;CAN INT. ONLY IN USER MODE.
6476 AND B,MSKST2(U) ;GET PENDING ENABLED UNDEFERRED 2ND WD INTS IN B.
6479 ANDCM A,IDF1(U) ;PENDING ENABLED UNDEFERRED 1ST WD INTS IN A.
6480 INTSRC: AOS NAUINT ;ELSE 1 MORE ATTEMPT TO INTERRUPT.
6481 MOVSI R,%UMSOA ;LOAD ORDINARY MAP FOR THIS USER.
6482 PUSHJ P,PGLD ;BUT ACS -> SWAP OUT ACS.
6483 HRRZ T,40ADDR(U) ;GET ADDR OF USER'S LOCATION "40"
6484 XCTRI XR,[MOVE T,2(T)] ;TRY TO GET CONTENTS OF "42" (..I SO STOP ON EXEC PG FAULT DOESNT)
6486 JRST INTPFL ;PAGE FAULT IN XCTR, GIVE UP & WAIT FOR PAGE.
6488 JUMPE R,INTBAD ;42 POINTS TO 0 => BADPI ERROR.
6490 TLNN TT,%OPINT ;NEW STYLE INTERRUPTS?
6491 JRST INTOLD ;NO, OLD STYLE.
6492 XCTRI XR,[MOVE R,(R)] ;GET ADDR OF HIS INT PDL PTR.
6496 CAMGE T,[-72.*5-1,,]
6498 XCTRI XR,[MOVE H,(R)] ;GET CONTENTS OF INT PDL PTR.
6499 JRST INTSR2 ;ADVANCE T PAST INT PDL PTR ADDR.
6502 INTSR0: XCTRI XR,[MOVE C,(T)] ;GET THE INTS NEXT INT TABLE ENTRY
6504 JRST INTPFL ;APPLIES TO.
6505 XCTRI XR,[AND D,1(T)]
6508 AND C,A ;WHICH OF THEM ARE WE TRYING TO GIVE?
6510 JUMPE D,INTSR1 ;NOT GIVING ANY OF THEM, TRY NEXT ENTRY.
6511 MOVE Q,IDF1(U) ;GET CURRENT SETTINGS OF DEFER WORDS.
6512 XCTRI XW,[MOVEM Q,3(H)]
6513 SKIPA Q,IDF2(U) ;AND PUT INTO NEXT INT PDL FRAME.
6515 XCTRI XW,[MOVEM Q,4(H)]
6516 SKIPA Q,UPC(U) ;ALSO PUT CURRENT PC IN FRAME.
6518 XCTRI XW,[MOVEM Q,5(H)]
6521 XCTRI XR,[MOVE E,2(T)] ;NOW SEE WHICH DEFER BITS TO TURN ON NOW.
6524 XCTRI XR,[MOVE TT,3(T)]
6527 XCTRI XR,[MOVE Q,4(T)] ;AND THE NEW PC.
6532 TLO Q,%PCUIO ;DON'T CHANGE HIS IOTLSR STATUS.
6533 XCTRI XW,[MOVEM C,1(H)]
6534 CAIA ;PUT INTS BEING GIVEN IN
6535 JRST INTPFL ;INT. PDL FRAME.
6536 XCTRI XW,[MOVEM D,2(H)]
6539 MOVE W,H ;REMEMBER PDL PTR BEFORE INCREMENT, FOR PDL OV TESTING
6541 LDB J,[220500,,R] ;HOW MANY ACS SHOULD WE SAVE?
6542 JUMPE J,INTSR5 ;NONE?
6544 ADD H,J ;ADVANCE THE PDL PTR OVER WHERE THEY'LL GO.
6545 SUBM H,J ;GET BACK THE OLD UN-ADVANCED PDL PTR IN J.
6547 HRLI J,(R) ;PUT 3.7-4.1 OF R INTO LH(J) CIRCUITOUSLY
6550 AOS J ;MAKE J POINT AT 1ST UNUSED PDL WORD.
6551 XCTRI XBRW,[BLT J,(H)]
6554 INTSR5: JUMPGE R,INTSR4 ;SAVE DEBUGGING INFO ON INT PDL IF USER WISHES
6556 XCTRI XW,[MOVEM J,1(H)]
6559 XCTRI XW,[MOVEM J,2(H)]
6562 XCTRI XW,[MOVEM J,3(H)]
6566 INTSR4: MOVE J,U ;MAYBE? SCHED LOOP WANTS USER IDX IN J?
6567 XCTRI XW,[MOVEM H,(R)] ;STORE BACK THE PDL POINTER, THUS FINALIZING ALL
6568 TDZA A,C ;INTS HAVE BEEN GIVEN; NOW WE CAN CHANGE THE USER VARS.
6572 IORM E,IDF1(U) ;SET THE DEFER BITS SPEC'D IN TABLE ENTRY.
6574 MOVEM Q,UPC(U) ;START USER AT INT HANDLER.
6575 JUMPL H,INTSR3 ;NOW CHECK FOR INT PDL OVFLO.
6577 MOVEI TT,%PIPDL ;THERE WAS OVFLO, SET PDL OV INT
6578 TDNN TT,MSKST(U) ;IF ENABLED.
6581 JRST SEAR2E ;RE-TRY THE INTERRUPT.
6583 INTSR3: JUMPN A,SEAR2E ;MORE INTS TO GIVE => RETRY.
6585 INTSRX: AOS NUINT ;1 MORE INT GIVEN SUCESSFULLY.
6587 JRST SEARC ;SCHEDULE.
6589 INTSR1: ADD T,[4,,4] ;NO INTS GIVEN, TRY NEXT ENTRY.
6590 INTSR2: AOBJN T,INTSR0
6591 JRST INTSUP ;ENABLED INTS BUT NO ENTRIES FOR THEM.
6593 ;GIVE INTS THE OLD WAY.
6594 INTOLD: SKIPN C,A ;GIVE INTS OF 1 WD AT A TIME.
6595 SKIPA C,B ;(NO 1ST WD, GIVE ALL 2ND WD)
6596 TDZA B,B ;(SOME 1ST WD INTS, GIVE NO 2ND WD INTS)
6597 TLO C,4^5 ;(GIVING 2ND WD, SET SIGN TO SAY SO)
6598 XCTRI XW,[MOVEM C,(T)]
6599 SKIPA Q,UPC(U) ;STORE INTS BEING GIVEN,
6601 MOVEI T,2(T) ;ADVANCE -> PLACE TO START USER.
6602 XCTRI XW,[MOVEM Q,-1(T)]
6603 TLOA T,%PCUSR ;OLD PC STORED, SET UP NEW.
6605 ANDCAM A,PIRQC(U) ;SAY THESE INTS NOW GIVEN.
6609 MOVEM T,UPC(U) ;SET HIS PC -> TSINT+2
6613 ;IF WE ARE WAITING FOR A PAGE NEEDED FOR TAKING AN INTERRUPT,
6614 ;GIVE UP ON TRYING TO TAKE TE INT. UNLESS PAGE HAS COME IN SINCE LAST TRY.
6615 INTPAG: MOVSI E,%SWPGW
6618 JRST (T) ;JOB NOT WAITING FOR PAGE
6621 JRST (T) ;NOT WAITING FOR INTERRUPT PAGE
6625 JRST SEARL ;PAGE NOT IN
6626 MOVSI T,%SWPGW+%SWINT ;PAGE IN
6632 ;COME HERE WHEN AN XCTRI TAKES FAULT WHILE TRYING TO STORE AN INTERRUPT.
6633 INTPFL: MOVE J,U ;MAYBE? SCHED MAIN LOOP WANTS USR IDX IN J.
6634 SPM UPGML(U) ;STORE MAP IN INTERRUPTING STATE
6635 IFN KA10P, LDB T,[221000,,UPJPC(U)] ;FAULT ADDRESS
6636 IFN KL10P, LDB T,[$PFPNO,,UPFW(U)]
6637 IFN KS10P, LDB T,[$PFPNO,,EPTP7W] ; Fault happened at PI level 7.
6644 JUMPE E,INTBAD ;DON'T HAVE PAGE
6648 JRST INTBAB ;WRITE IN RD ONLY
6649 INTBAC: HLLZ T,UPC(U) ;SIMULATE SETUP OF OPC
6652 MOVEM T,UPOPC(U) ;FAULT STATUS
6654 IORM T,UPQUAN(U) ;BIT NOT SET BY XCTRI
6656 IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATT
6657 LPMRI UPGML(U) ;SET MPV FLAG, WILL CAUSE INT. LATER LPMR'S WON'T
6659 JRST SCHED6 ;"RUN" USER, TAKING PAGE FAULT IMMEDIATELY
6661 INTBAB: TLNE T,50 ;NO ACCESS OR W IN RWF
6662 JRST INTBAC ;PAGING BOX BUG? IGNORE RD ONLY
6663 JRST INTBAD ;REALLY IS READ-ONLY.
6675 JRST INTBAD ;REAL VIOLATION
6678 ;KL10P ;PF OR RWF, TAKE THE FAULT, READ IN THE PAGE, THEN TRY TO INTERRUPT AGAIN
6680 INTBAB: MOVSI T,%SWINT
6681 IORM T,USWST(U) ;PAGE FAULT RESULT OF INTERRUPT ATTEMPT
6682 SETOM DLSRCH ;DON'T INTERRUPT AT INTBA1, SCHEDULE, TRY TO PCLSR
6685 EXCH T,UPC(U) ;HACK USER'S PC
6687 JRST SCHED6 ;RUN USER, RETURNING IMMEDIATELY TO INTBA1
6689 INTBA1: CONO PI,PIOFF
6691 MOVEM U,PFAILU ;SIMULATE A PAGE FAULT ON THE INTERRUPT WORD
6694 MOVEM U,PFOPC1 ;RESTORE USER'S PC
6696 MOVEM U,PFAILF ;FLAG FAULT FROM INTPFL
6697 MOVE U,PFAILU ;RESTORE U SO CLKSAV CAN RE-SAVE IT
6698 CONO PI,CLKRQ ;TURN PI SYSTEM ON AND CAUSE CLOCK BREAK
6699 JRST . ;TAKES A WHILE TO GO OFF
6703 TLNE T,%PF2.8 ; Write in read only?
6704 JRST INTBAD ; Yes: %PIB42
6705 MOVEM T,UPFW(U) ; No: Set up for a simulated fault
6707 IORM T,USWST(U) ; Signal fault as result of interrupt attempt
6708 SETOM PFAILF ; Cause CLK level to go to PFLU2 at
6709 ; first opportunity.
6710 MOVEI T,CCLKRQ ; Make sure that happens real fast
6711 EXCH T,UPC(U) ; by setting his PC thusly.
6712 MOVEM T,EPTPFO ; Save old PC as location of fault.
6713 JRST SCHED6 ; Go run this user.
6716 INTBAD: MOVEI A,%PIB42 ;TURN ON BAD PI LOC INT BIT
6717 IORB A,PIRQC(U) ;GIVE USER INTERRUPT(MUST IORM TO AVOID TIMING ERR)
6718 JRST SEAR2A ;RE-PERFORM ACTIONS FOR NON-ZERO PIRQC
6719 ;WILL CAUSE AN INTERRUPT TO SUPERIOR
6721 ;INTERRUPT ALL USERS THAT WANT IT
6722 ; C(A) IS BIT IN PIRQC TO TURN ON
6723 DBGINT: MOVSI A,(%PIDBG) ;"SYS BEING DEBUGGED" INT
6724 INTALL: MOVEI U,0 ;ENTRY INITIALIZE
6725 INTA2: ADDI U,LUBLK ;ADVANCE TO NEXT BLOCK OF USER VARIABLES
6726 CAML U,USRHI ;SKIP UNLESS AT END
6727 POPJ P, ;THROUGH, RETURN
6728 SKIPN UNAME(U) ;SKIP IF BLOCK IN USE
6729 JRST INTA2 ;IDLE, IGNORE
6730 LDB T,[410100,,USTP(U)] ;GET BUCSTP OF USERS STOP WORD
6731 JUMPN T,INTA2 ;IF USER CONTROL STOPPED, JUMP TO IGNORE
6732 MOVE B,MSKST(U) ;PICK UP INTERRUPT MASK
6733 AND B,A ;MASK C(B) TO APPROPRIATE BIT
6734 IORM B,PIRQC(U) ;GIVE INT TO USER
6737 SUBTTL PCLSR ROUTINES
6739 ; PUT PC OF USER WHOSE INDEX IS IN U IN USER MODE
6740 ; (CALL ONLY WITH CLOCK OFF OR CLOCK BREAK IN PROGRESS)
6741 ;SKIPS IF SUCCESSFUL, FAILS IF USER RUNNING IN EXEC CODE OR HAS TO BE FINALIZED
6745 BUG ;PCLSR'ING NULL, SYS OR CORE JOB?
6749 CAMN T,U ;IS U REALLY A MULTIPLE OF LUBLK?
6750 SKIPN UNAME(U) ;SHOULD NOT HAPPEN TO NONEXTANT JOB
6753 JRST POPJ1 ;USER STOPPED (MUST ALREADY BE IN USER MODE)
6756 JRST PCLSR2 ;LOSER IS RPCLSR'ING SOMEONE
6757 PCLSR3: MOVE T,SUEXIT(U)
6759 CAME T,[JRST 2,@XUUOH]
6760 JRST PCLSR5 ;EXIT ALREADY CLOBBERED
6761 MOVE T,UPC(U) ;PICK UP PROGRAM COUNTER (FLAGS IN L.H.)
6762 TLNN T,%PCUSR ;SKIP IF USER MODE ON
6763 JRST PCLSR8 ;JOB CURRENTLY IN EXEC MODE
6764 SOS NEPCLS ;WAS WRONGLY AOS'ED
6765 CLEARM FLSINS(U) ;IN CASE HE WAS WAITING FOR A PAGE OR CIRPSW
6769 MOVSI T,%SWPGW+%SWRUN+%SWINT
6774 PCLSR8: SKIPE FLSINS(U) ;SKIP IF UNBLOCKED
6775 JRST PCLSR1 ;HUNG, TRY TO BACK UP TO UUO
6776 PCLSR4: MOVE T,[JRST ONEFLS]
6777 MOVEM T,SUEXIT(U) ;MUNG EXIT OF UUO, COME BACK LATER
6781 PCLSR2: SETZM RPCL(U) ;CLEAR OUT POINTERS IN BOTH DIRECTIONS
6785 PCLSR5: SKIPN FLSINS(U)
6786 JRST PCLSRF ;NOT HUNG, LET RUN TO COMPLETION
6787 IFN KA10P,[ ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6788 CAME T,[JRST ONEPROC] ;SKIP IF ONE PROCEEDING A SYS CALL
6791 IORM T,SUUOH(U) ;RESET SINGLE INSTRUCTION PROCEED
6793 IFN KS10P,[ ;HUNG, UNCLOBBER EXIT AND BACK UP TO UUO
6794 CAME T,[JRST ONEPR4] ;SKIP IF ONE PROCEEDING A SYS CALL
6797 IORM T,XUUOH(U) ;RESET SINGLE INSTRUCTION PROCEED
6802 IFN KA10P, MOVE T,[JRST 2,@UUOH]
6807 MOVEM T,SUEXIT(U) ;UNCLOBBER EXIT
6808 PCLSR1: HLRZ T,LSPCL(U) ;SAVE LAST TWO DISTINCT LOCS PCLSR'ED FROM
6813 PCLSR9: SOS T,SUUOH(U) ;GET USER LOCATION OF HIS CURRENT UUO
6817 TLCN T,%PS1PR-%PSINH
6818 TLO T,%PSINH ;ONE PROCEEDING AND INSTR NOT COMPLETE
6820 MOVEM T,UPC(U) ;SET USERS PROGRAM COUNTER
6822 MOVSI T,701100 ;RESTORE PAGE-CONTEXT TO USER MODE
6825 CLEARM UMAPS(U) ;RESTORE TO NORMAL MAP
6826 SETZM FLSINS(U) ;CLEAR OUT ANY BLOCKING CONDITION
6830 MOVSI T,%SWPGW+%SWRUN+%SWPCL+%SWINT ;NOT BLOCKED ON PAGE, NOT UNBLOCKED SWAPOUT,
6831 ANDCAM T,USWST(U) ; NOT INTERRUPT PAGE, NOT SWAPPED OUT WHILE BLOCKED
6833 JRST LSWZAP ;REQUIRED TO UNLOCK SWITCHES
6836 MOVEI T,UUOACS(U) ;IF JOB U'S ACS ARE IN HARDWARE AC BLOCK 1,
6837 CAMN T,AC1PTR ;COPY THEM INTO UUOACS WHERE THEY BELONG.
6838 XCTR XBR,[BLT T,UUOACS+17(U)]
6843 JRST POPJ1 ;EXIT AFTER BACKING UP TO UUO
6845 ; AOS USTP OF USER IN A
6847 NJRPCL: CAIE A,-1 ;ENTRY TO IGNORE IF NULL JOB
6848 RPCLSR: CAMN A,USER ;NORMAL ENTRY
6849 POPJ P, ;TRYING TO RPCLSR SELF OR NULL JOB
6852 MOVE U,A ;GET INDEX OF RPCLSRED JOB IN U
6853 MOVE A,USER ;GET RPCLSRING USER INDEX IN A
6854 CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
6855 PUSHJ P,PCLSR ;PUT USER IN USER MODE
6856 JRST RPCLOS ;JUMP IF CAN'T DO IT RIGHT NOW
6857 AOS USTP(U) ;WIN,STOP USER
6858 CONO PI,CLKON ;RE-ENABLE CLOCK BREAKS
6859 RPCLS1: MOVE A,U ;RESTORE A
6863 RPCLOS: SKIPE RPCL(U) ;SKIP IF ZERO RPCL FOR USER BEING RPCLSRED
6864 JRST RPCLS2 ;SOMEONE GOT THERE FIRST
6865 SKIPE RPCL(A) ;SKIP IF ZERO RPCL FOR RPCSRING USER
6866 JRST UDELAY ;YOU ARE BEING RPCLSR'ED, SURRENDER
6867 HRROM A,RPCL(U) ;SET UP RPCL IN VARS OF RPCLSRED USER
6868 HRRM U,RPCL(A) ;" OF RPCLSRING USER
6870 SKIPE RPCL(A) ;WILL NOT SKIP AT FIRST
6871 PUSHJ P,UFLS ;WAIT FOR PERSON BEING RPCLSRED TO GET TO ONEFL2
6874 RPCLS2: MOVE A,U ;RESTORE A AND U
6877 SKIPE RPCL(A) ;WAIT FOR OTHER GUY TO WIN
6879 JRST RPCLSR ;THEN TRY AGAIN
6884 NJUPCL: CAIE A,-1 ;ENTRY TO IGNORE IF NULL JOB
6885 UPCLSR: CAMN A,USER ;REGULAR ENTRY
6886 POPJ P, ;TRYING TO UPCLSR SELF OR NULL JOB
6893 ; RETURN FROM SYSTEM CALL IN ONE PROCEED MODE
6895 ONEPROC:CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
6896 MOVE U,USER ;BE SURE U HAS RUNNING USER INDEX IN IT
6898 IORM T,PIRQC(U) ;GIVE USER INTERRUPT
6902 SUBTTL KS-10 ONE-PROCEED
6905 ONEPRO: SYSCTX ;SWITCH TO SYSTEM AC BLOCK
6907 BUG AWFUL,[ONE-PROCEED IN NULL JOB]
6908 MOVE T,1PROPC(U) ;PC OF NEXT INSTRUCTION TO EXECUTE
6909 TLNE T,%PSUSR ;NORMALLY USER MODE IS EXPECTED
6911 HRRZ T,T ;SEE IF IT'S FIRST INSTRUCTION OF EXEC ENTRY
6914 SKIPA TT,[JRST ONEPR4]
6915 BUG AWFUL,[ONE-PROCEED IN EXEC MODE],OCT,1PROPC(U)
6916 MOVEM TT,UEXIT ;CLOBBER EXIT TO RUN SYS CALL TO COMPLETION
6917 CAIE T,UUOH0 ;AND RESUME PROCESSING UUO
6923 ONEPR3: MOVEM T,UUOH ;PUT USER PC WHERE ONEFLS WANTS IT
6924 ONEPR4: SYSCTX ;COME HERE WHEN ONE-PROC'D UUO FINISHES
6925 MOVE U,USER ;BE SURE U HAS RUNNING USER INDEX IN IT
6927 IORM T,PIRQC(U) ;GIVE USER INTERRUPT
6931 SUBTTL USER START ROUTINES
6933 ; CALLED EVERY SLOW CLOCK TICK WHEN TTY WANTING TOP PROCEDURE LOADED
6936 USTRT1: SKIPL T,@UTTYO ;GET TTY TO BE STARTED
6937 JRST [ MOVE U,MMPFR ;WHEN STARTING A HACTRN, MAKE SURE CORE IS AVAILABLE
6939 JRST USTRTL ;IT'S NOT, SAY SYSTEM FULL
6940 JRST .+2 ] ;T HAS INITIAL TTYTBL
6941 MOVSI T,%TBNOT+%TBDTY+%TBNVR ;NOT A REAL TTY, INITIALIZE TTYTBL TO NO TTY
6942 PUSHJ P,USTRA ;CREATE NEW USER SLOT ENTRY
6943 JRST USTSC1 ;LOSE, HAVE TO WAIT
6944 SKIPGE T,@UTTYO ;SKIP IF REALLY A TTY
6945 JRST USTRTS ;DONT LOAD A HACTRN
6946 MOVE T,[SIXBIT /HACTRN/] ;LOAD HACKTRN
6947 USTRT2: MOVEM T,JNAME(U) ;SET JOB NAME
6957 SETZM @UTMPTR(U) ;GIVE TEMPORARY HIGH PRIORITY
6958 SETZM USTP(U) ;START UP
6959 USTSC2: AOS T,UTTYO ;AOS RING BUFF
6964 JRST USTRT1 ;MORE JOBS TO SET UP
6967 USTRTS: MOVEM U,1(T) ;STORE USER'S INDEX IN SECOND WORD
6968 MOVE T,(T) ;GET JNAME FROM FIRST WORD (POINTED TO BY RH OF @UTTYO)
6970 CAME T,[SIXBIT /LDRDEM/]
6971 CAMN T,[SIXBIT /UNSPOO/]
6972 AOS UTMPTR(U) ;LOADER, UNSPOOLER -> SYSTEM TREE
6976 USTSC1: MOVE U,USRHI ;IF A USER IS ^Z'ING AND THERE IS NO POSSIBILITY
6977 SKIPL T,@UTTYO ;OF GETTING MORE JOB SLOTS,
6980 USTRTL: MOVSI U,%TANJS ;THEN MARK THE TTY AS IN NEED OF A "SYSTEM FULL" MESSAGE
6982 MOVEI U,SCRCFM ;AND WAKE UP THE SYS JOB.
6984 JRST USTSC2 ;REMOVE THIS TTY FROM LIST OF THOSE NEEDING A ^Z.
6986 ;GOBBLE NEW USER SLOT, RESET VARIABLES (SKIPS IF IT WINS)
6987 ;RETURNS INDEX IN U. IF FAILS, CLOBBERS U!
6990 JRST USTR1 ;ASSIGN MORE CORE TO USER STORAGE
6992 JRST USTR2 ;HAVE FOUND FREE USER SLOT (IN U)
6997 POPJ P, ;SYSTEM JOB FLUSHING CORE, WAIT UNTIL IT STABILIZES
6998 MOVEI U,LUBLK ;MOVE UP USRHI IF SYS HAS ENOUGH CORE
7001 MOVE T,HUSRAD ;LENGTH OF SYS
7003 JRST MORCOR ;SYS NEEDS MORE CORE FOR USER VARIABLES
7005 USSINI: SETOM USTP-LUBLK(U) ;SYS INITIALIZATION ENTRY
7007 USTR2: PUSHJ P,USTR4 ;RESET USER VARIABLES
7013 BLT T,IOCHNM+17(U) ;CLEAR ALL I/O CHANNELS
7014 USRST4: HRLI T,AC0S(U)
7017 BLT T,AC17S(U) ;CLEAR AC'S & RETURN HAPPY
7020 MORCOR: SUB P,[1,,1]
7022 ANDCAM T,SUPCOR ;CLEAR ANY SYS CORE DECREASE REQ
7024 JRST SUPSET ;REQUEST MORE CORE FROM SYS JOB
7026 ; INITIALIZE A SET OF USER VARIABLES
7027 ; T HAS INITIAL TTYTBL, POSITIVE IT IS TTY # ELSE NO TTY
7028 USTR4: MOVEM T,TTYTBL(U)
7031 HRRM U,TTYSTS(T) ;TELL TTY IT NOW BELONGS TO NEW JOB,
7032 MOVSI U,%TSCNS ;AND IS NOW A CONSOLE.
7035 ANDCAM U,TTYSTS(T) ;AND IS NO LONGER FREE
7036 MOVSI U,%TACFM+%TACTZ
7037 ANDCAM U,TTYSTA(T) ;AND WILL NEED CONSOLE FREE MESSAGE
7040 USTR4A: MOVEM T,UTMPTR(U)
7047 DPB T,[000300,,UNAME(U)]
7049 DPB T,[060300,,UNAME(U)]
7051 DPB T,[140300,,UNAME(U)]
7065 ADDI T,2*30. ;PROTECT FROM SWAPOUT FOR 2 SECONDS (RANDOMLY)
7070 SETOM JBI(U) ;NOT JOB DEVICE HANDLER (NOT YET, ANYWAY)
7073 SETOM TRNLST(U) ;INIT TRANSL LISTS TO NIL
7076 JUMPE U,.+5 ;SYSTEM JOB DOESN'T HAVE A MAP
7080 BLT T,UPGCP+NUVPG/2-1(U)
7085 MOVSI T,(DATAI PAG,)
7095 MOVSI T,(CAI) ;INITIALLY IGNORE TRAPS 1 AND 2
7098 IFE KS10P,MOVEI T,%PI1PR ;TRAP 3 IS IGNORED TOO ON KS
7099 MOVEM T,TR3INS(U) ;TRAP 3 GIVES ONE-PROCEED INTERRUPT ON KL
7103 MOVSI T,MUUOKN ;UUO NEW PC'S ARE SAME AS SYS JOB'S,
7104 HRRI T,MUUOKN(U) ; EXCEPT THAT UUO IN EXEC MODE IS AN ERROR
7110 MOVE T,[%PSPCU,,MUUOEX]
7111 MOVEM T,MUUOKN(U) ; UUO in Exec mode is an error
7112 MOVEM T,MUUOKT(U) ; (either case)
7114 MOVEM T,MUUOCN(U) ; Normal UUO
7116 MOVEM T,MUUOCT(U) ; UUO as trap instruction
7118 MOVEM T,1PRNPC(U) ; One-proceed jumps to ONEPRO
7121 MOVE T,[JRST 2,@UUOH]
7129 MOVE T,[JRST UREALB]
7131 CLEARM UPGML(U) ;CLEAR USER PG MAP VARIABS
7136 MOVSI T,1+EXPGNG ;DONT ENABLE QUAN COUNTER FOR NOW (BUT SET
7140 MOVEM T,UPDBR3(U) ;SET UP EXEC DBR
7141 MOVSI T,IFN MCOND DM,[1040] .ELSE [0] ;ON DM, B+C MEMORIES DON'T WORK
7142 MOVEM T,UPACP(U) ;SET UP B+C MEMORY PTRS
7144 IFN KS10P, SETZM UPQUAN(U) ; Clear quantum counter.
7148 ;DROPS THROUGH, AND .RESET OF USR DEVICE COMES HERE.
7149 USRST2: MOVE T,UNAME(U)
7150 MOVEM T,USYSNM(U) ;CLOCK MUST BE OFF OR PI IN PROG ON 7
7151 MOVE T,TIME ;DON'T SWAP JOB OUT RIGHT AWAY
7167 SETZM NVDBA(U) ;0 VIDEO BUFFERS ASSIGNED BY JOB.
7214 MOVSI T,%OPOJB ;USR RESET DOESN'T CLEAR OJB OPTION BIT
7219 USTR4B: MOVEI T,USRRCE+NCT
7223 ;SET UP THE BLINKER FOR THE JOB IN U.
7224 USTTV0: SKIPN TEN11F
7230 MOVE A,TT11HD ;11 HEADER ADR
7232 LDB B,[141000,,1(A)] ;VIDEO BUFFER #
7233 TRO B,17_8 ;CSET ALU FCTN
7234 LSH B,4+16. ;INTO POSITION FOR MOVEMING INTO CONSOLE REG
7248 .UII,,(SIXBIT/SYS/) ;7
7258 USTCDR: SYSCTX ;GOT HERE FROM ULEAVE WHICH SELECTED THE USER ACS,
7259 MOVE U,USER ; SELECT SYSTEM ACS INSTEAD.
7260 MOVEI A,USTCDR+1 ;COME BACK HERE IN CASE OF PCLSR
7273 SUBTTL USER KILL ROUTINES
7276 ; CLOSE ALL DEVICES AND INFERIOR PROCEDURES OF A JOB (INDEX IN U)
7278 IODCL: MOVNI I,1 ;SET TO STOP
7279 PUSHJ P,IODCL3 ;STOP ALL INFERIOR JOBS (RECURSIVE)
7280 MOVEI I,0 ;THEN KILL.
7283 TLNE A,%OPLOK ;IF USER HAS ENABLED THE SWITCH-UNLOCK FEATURE,
7284 PUSHJ P,IODCSW ;UNLOCK HIS LOCKED SWITCHES.
7285 IFN 340P\E.SP, PUSHJ P,ADCLOSE ;FLUSH DISPLAY
7286 IFN IMXP, PUSHJ P,POTCLS ;DISCONNECT HIS POTS
7289 PUSHJ P,SCNSTP ;KILL SCANNER IF HIS
7291 IFN ARMP, PUSHJ P,AARMOFF ;FLUSH ARM
7292 IFN DEMON, PUSHJ P,DEMOUT ;FLUSH EXISTANCE (CURRENT OR FORMER) AS DAEMON.
7295 PUSHJ P,VBDFLS ;DEASSIGN ALL VIDEO BUFFERS.
7298 CAMN U,MTRUSR ;DEASSIGN THE PERFORMANCE COUNTER
7301 PUSHJ P,CLQDEL ;RELEASE AND STOP CLOCK QUEUE BLOCK
7305 SETOM UREALT ;UN REAL TIME
7306 CAMN U,UMASTER ;UNMASTER
7308 PUSHJ P,AIOPDL ;POP UP ALL OF IO PDL (CLOSING CHNLS POPPED INTO)
7310 IODCL1: PUSHJ P,CCLOSE ;CLOSE ALL CHANNELS
7311 CAIGE R,IOCHNM+NIOCHN-1(U)
7314 SKIPGE T,JBI(U) ;IF THIS JOB IS A JOB-DEVICE,
7316 HRROS JBCJUI(T) ;TELL THE JOB CHANNEL THAT THE HANDLER IS GONE.
7318 SKIPGE JBCG(T) ;IF OUR CREATOR STILL HAS A JOB CHANNEL,
7320 MOVE A,JBCUI(T) ;FLUSH THE CREATOR'S JOB CHANNELS,
7322 PUSHJ P,RPCLSR ;STOPPING THE CREATOR IN CASE HE'S USING THEM NOW.
7323 MOVE T,JBI(U) ;RPCLSR CLOBBERS T.
7333 PUSHJ P,UPCLSR ;ALLOW THE CREATOR TO CONTINUE AND GET IOC ERROR OR RETRY OPEN
7334 IODCL6: CONO PI,CLKON
7335 SETOM JBCUI(T) ;FLUSH THE JOB-DEVICE SLOT.
7336 SETOM JBI(U) ;SAY THIS JOB NO LONGER A JOB-DEVICE.
7339 IODCL3: PUSH P,I ;I=0 KILL I=-1 STOP I=1 JUST CLOSE CHANNELS.
7342 IODCL4: HRRZ E,SUPPRO(A)
7343 SKIPE UNAME(A) ;SKIP IF VARIABLES BLOCK IDLE
7344 CAIE E,(U) ;SKIP ONLY IF IT IS A DIRECT INF.
7345 JRST IODCL5 ;TRY NEXT SET OF VARS
7348 PUSHJ P,1USTOP ;STOP (WITH BUSRC BIT)
7354 PUSHJ P,IODCLA ;KILL OR CLOSE CHNLS, RECURSE
7356 SKIPE -2(P) ;KILLING?
7357 JRST IODCL7 ;JUST CLOSING CHNLS.
7358 MOVE A,U ;KILLING; WAIT TILL NO OTHER JOB
7359 PUSHJ P,AUCL3 ;IS LOOKING AT THE ONE THAT WE'RE KILLING.
7360 PUSHJ P,UBLST2 ;FLUSH CORE
7362 PUSHJ P,ZUSLOG ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
7366 IODCL5: ADDI A,LUBLK
7368 JRST IODCL4 ;LOOP FOR ALL SETS OF USER VARIABLES
7373 IODCL8: PUSHJ P,IODCL3
7376 ;SYSTEM CALL UNLOCK. 1 ARG, A JOB SPEC.
7377 ;THAT JOB'S LOCKS ARE ALL UNLOCKED.
7380 JSP T,NCORUI ;DECODE THE JOB SPEC.
7381 JRST NUNLO1 ;WE'RE CERTAINLY ALLOWED TO WRITE THIS JOB.
7382 JUMPE U,NUNLO1 ;SYSTEM JOB CAN DO IT TO ANYBODY
7383 JSP T,NCORWR ;NOT SURE, SO CHECK.
7384 JRST OPNL31 ;NO, NOT ALLOWED.
7390 ;THE CALL IS ALLOWED, SO UNLOCK THAT JOB'S LOCKS
7393 MOVE A,J ; If not self,
7394 PUSHJ P,RPCLSR ; assure a User mode PC
7399 NUNLO2: MOVE A,UUOH ; If we are asked to unlock
7400 SUBI A,1 ; our own locks, put our PC in
7401 MOVEM A,SRN3(U) ; SRN3 where IODCSW will look for it
7404 TLNE A,%OPLOK ; Provided it is using locks at all...
7407 PUSHJ P,LSWPOP ; USTP
7408 JRST LSWPJ1 ; DIELOK
7409 ; Returns with U clobbered, which seems to be OK for .CALL's?
7412 ;CALL HERE TO UNLOCK THE SWITCHES A JOB HAS LOCKED (USER IDX IN U).
7413 ;LOCATION 43 (ACTUALLY, 3+C(40ADDR)) HAS THE LIST POINTER. 0 IS NIL.
7414 ;ANYTHING ELSE POINTS TO 2-WORD BLOCK; THE 1ST WORD IS THE SWITCH OR THE
7415 ;ADDRESS OF THE SWITCH. THE RH OF THE SECOND IS THE CDR OF THE LIST.
7416 ;THE LH OF THE SECOND IS THE UNLOCK INTRUCTION. THE INDEX FIELD IS IGNORED,
7417 ;ONE LEVEL OF INDIRECTION IS PERMITTED, AND THE INSN MUST BE EITHER
7418 ;AOS OR SOS WITH 0 IN AC FLD, A LOGICAL INSTRUCTION (TOP 3 BITS = 4),
7419 ;A HALFWORD INSTRUCTION, OR A MOVE,MOVN,MOVS,MOVN,ADD OR SUB SERIES INSN,
7420 ;OR 0 WHICH MEANS SETOM. ONLY INSNS THAT MODIFY MEMORY ARE USEFUL.
7421 ;44 IS AN AOBJN POINTER TO THE CRITICAL RTNS TABLE, OF 2-WORDS ENTRIES.
7422 ;THE 1ST WORD EACH IS <BEGINNING OF RANGE>,,<END OF RANGE>+1.
7423 ;THE SECOND IS THE UNLOCK INSTRUCTION, WITH THE ADDRESS OF THE SWITCH
7424 ;IN THE RH (AGAIN, 1 LEVEL OF INDIRECTION IS PERMITTED).
7425 ;IF THE PC IS IN THAT RANGE, THE UNLOCK INSN IS EXECUTED.
7426 ;43 AND 44 ARE UPDATED DURING PROCESSING TO PREVENT PCLSR LOSSAGE.
7427 ;SEE .INFO.;ITS LOCKS
7430 ;MACRO TO DO XCTR, OR POPJ IF THAT WOULD CAUSE INTERRUPT.
7435 ; IODCSW: Unlock locks for user in U
7436 ; User should be stopped so that he is in user mode.
7437 ; The only exception is if we are unlocking the locks of the running job,
7438 ; in which case the contents of SRN3 will be used as our PC.
7439 ; Clobbers just about everything except U.
7441 PUSHJ P,IODCS0 ; Do actual work, if any...
7442 MOVE U,USER ; But be sure to always
7443 PUSHJ P,MPLDZ ; restore normal page map of running user.
7447 MOVE U,USER ;SET UP MAP TO USER BEING HACKED (IDX IN J).
7448 PUSHJ P,MPLDJ ;LH(J) CLOBBERED, RH SAVED.
7449 HRRZ U,J ;U HAS WHAT IT HAD AT CALL (USR BEING HACKED).
7450 MOVEI C,1000 ;COUNT LENGTH OF LIST SO CIRCULAR LISTS DON'T HANG US UP.
7452 XCTRIJ XRW,[MOVES B,3(E)] ;GET HIS "43" (AND MAKE SURE IT'S WRITABLE)
7453 IODCS1: JUMPE B,IODCS2 ;REACHED END OF LOCKED SWITCH LIST, MAYBE?
7454 XCTRIJ XR,[HLL B,1(B)] ;MERGE LOCK INSN WITH ADDR OF SWITCH.
7455 PUSHJ P,IODCDO ;EXECUTE THE UNLOCK INSN
7456 POPJ P, ;IODCDO DETECTED MPV OR PUR INTERRUPT.
7457 XCTR XR,[HRRZ B,1(B)] ;REPLACE LIST BY ITS CDR.
7461 IODCS2: XCTRIJ XRW,[MOVES E,4(E)] ;GET JOB'S "44", AND MAKE SURE IT'S WRITEABLE.
7462 HRRZ C,UPC(U) ;GET ITS PC, FOR COMPARISON.
7463 CAMN U,USER ; Except if this is us,
7464 HRRZ C,SRN3(U) ; then unlock PC is in SRN3
7465 JUMPGE E,CPOPJ ;THERE ARE NO PROTECTED RANGES => DONE.
7466 IODCS3: XCTRIJ XR,[MOVS B,(E)] ;GET BOUNDS OF NEXT PROTECTED RANGE.
7467 CAIGE C,(B) ;IS PC ABOVE LOWER BOUND?
7470 CAIL C,(B) ;IS IT BELOW UPPER?
7472 XCTRIJ XR,[MOVE B,1(E)] ;PC IS IN THIS RANGE; GET UNLOCK INSN
7473 PUSHJ P,IODCDO ;EXECUTE IT
7474 POPJ P, ;NO SKIP => MPV OR PUR INTERRUPT DETECTED.
7475 IODCS4: ADD E,[2,,2] ;CHECK ALL ENTRIES IN CRITICAL RTN TABLE, 1 BY 1.
7476 HRRZ B,40ADDR(U) ;UPDATE 44 SO ENTRIES ALREADY PROCESSED ARE
7477 UMOVEM E,4(B) ;ACTUALLY IN THE TABLE. THIS IS IN CASE PCLSR.
7481 ;PRECEDE AN XCTR WITH JSP TT,IODCXC TO POPJ IF THE XCTR WOULD
7482 ;CAUSE AN INTERRUPT (MPV OR PUR). CLOBBERS A,T,Q.
7483 IODCXC: MOVEI A,@(TT) ;GET EFFECTIVE ADDR OF XCTR.
7484 MOVEI A,@(A) ;GET EFFECTIVE ADDR OF XCTR'ED INSN.
7485 LSH A,-10. ;GET PAGE # BEING REFERENCED.
7486 PUSHJ P,UPLC ;SET T = B.P. TO PAGE MAP HALFWORD. CLOBBERS Q.
7488 TRNE T,600000 ;IF PAGE IS SWAPPED IN, PUT ACCESS BITS IN
7489 LSH T,-20 ;SAME PLACE THEY ARE WHEN SWAPPED OUT (LOW 2 BITS).
7490 ;FOLLOWING CODE COMMENTED OUT BECAUSE IT DOESN'T WORK ON THE KL10 XCTR
7491 ; TRNE T,2 ;CHANGE CODE 2 (READ-WRITE, NOT WRITTEN) TO 3 (READ-WRITE).
7493 ; LSH T,27 ;PUT ACCESS CODE IN AC FIELD, AND TEST
7494 ; ANDCA T,(TT) ;AGAINST WHAT THE XCTR WILL TRY TO DO.
7495 ; TLNN T,(0 3,) ;ALL DESIRED ACCESS AVAILABLE =>
7496 ; JRST (TT) ;WE WIN.
7497 ; POPJ P, ;ELSE QUIT OUT OF CALLING ROUTINE.
7499 ;FOLLOWING CODE INSERTED INSTEAD. THIS RELIES ON THE FACT
7500 ;THAT ONLY THE FOLLOWING INSTRUCTIONS ARE XCTRIJ'ED:
7501 ; BOOLE,HWT,MOVXX,ADDX,SUBX,AOSX,SOSX
7502 MOVE A,@(TT) ;GET INSTRUCTION XCTR'ED
7504 TLCE A,300000 ;SKIP IF AOS OR SOS
7505 TLNE A,002000 ;SKIP IF DOESN'T WRITE IN MEMORY
7506 TRNE T,2 ;INSTRUCTION WRITES, SKIP IF RW OR RWF ACCESS NOT PRESENT
7507 TRNN T,3 ;INSTRUCTION READS, SKIP IF ANY ACCESS PRESENT
7508 POPJ P, ;INSUFFICIENT ACCESS, QUIT OUT OF CALLING ROUTINE
7509 JRST (TT) ;WINNING, GO DO THE XCTR
7511 ;PUSHJ P,IODCDO WITH INSN IN B TO XCTRIJ IT, CHECKING FOR LEGALITY
7512 ;AND PERFORMING ONE LEVEL OF INDIRECTION IF THE @ BIT IS SET.
7513 ;(WE CAN'T AFFORD AN INFINITE LOOP WHILE KILLING A JOB EVEN IF IT IS
7515 ;INDEX FIELD IS IGNORED. IF THE OPCODE IS 0, SETOM IS USED INSTEAD.
7516 ;SKIPS IF INSN IS LEGAL AND DOESN'T CAUSE MPV OR PUR INTERRUPT.
7517 ;CLOBBERS A,D,J,T,TT,Q
7518 IODCDO: MOVE J,B ;B IS NOT CLOBBERED.
7521 XCTRIJ XR,[HRR J,(J)] ;INDIRECTION IS WANTED; DO IT.
7522 IODCD1: TLNN J,-1 ;IF LH IS 0, REPLACE BY (SETOM)
7525 CAIE A,AOS_-27 ;AOS AND SOS ARE LEGAL WITH 0 IN AC FIELD.
7529 CAIE A,4 ;ALL INSNS WITH 4 IN TOP 3 BITS (LOGICAL INSNS) ARE OK.
7530 CAIN A,5 ;HALFWORD INSTRUCTIONS ALSO OK.
7533 CAIE A,MOVE_-36 ;ALL FORMS OF MOVE, MOVS, MOVN AND MOVM OK
7536 CAIE A,ADD_-36 ;ADD & SUB OK. (OF COURSE, ONLY TO-MEMORY INSNS MAKE SENSE)
7538 IODCD3: LDB A,[270400,,J] ;AC FIELD NEED NOT BE 0, SO GET CONTENTS OF SPEC'D AC,
7541 DPB A,[270400,,J] ;AND MAKE THE INSN USE AC D, WHERE THE VALUE IS.
7543 XCTRIJ XRW,J ;EXECUTE INSN, CHECKING FOR INTERRUPTS.
7547 ; FLUSH LAST VESTIGES OF USER
7548 ; ELIMINATES ALL POINTERS TO USER & FREES USER VARIABLES (CLOBBERS U TO "USER")
7549 ; R, IF NON-ZERO, IS ADDRESS OF CHANNEL NOT TO BE CLOSED UNTIL LAST MINUTE
7550 ; (IN CASE PCLSR OUT OF .UCLOSE)
7552 ZUSER: MOVEI A,(U) ;CLEAR BOTH TRANSLATION LISTS
7553 HRLI A,300000 ;FOR THIS JOB.
7556 MOVEI A,0 ;AND GET RID OF EXISTING FOREIGN-USER CHANNELS.
7557 ZUSER2: SKIPE UNAME(A)
7558 PUSHJ P,ZUSES ;SEE IF THIS USER HAS ANY POINTERS TO BE FLUSHED
7559 CAMN U,SERVER(A) ; If we were a server for this guy,
7560 SETOM SERVER(A) ; clear it out.
7563 JRST ZUSER2 ;LOOP FOR ALL SETS OF USER VARIABLES
7567 SKIPE NMPGS(U) ;USER SHOULD HAVE NO MEMORY BY NOW
7569 SETZM UNAME(U) ;ONLY PLACE THAT UNAME IS ZEROED
7570 SETOM USTP(U) ;SET USTP TO SPEED SEARCH
7571 MOVE A,U ;USER FLUSHED
7574 IORM T,SUPCOR ;CAUSE USER VARIABLE BLOCKS DECREASE PROGRAM TO RUN
7575 POPJ P, ;RETURN WITH CLOCK OFF
7578 ;CALLED BY ADISOWN, NATTACH, NDETACH, ETC.
7579 ZUSES: MOVEI D,%CLSU\%CLSFU\%CLSJI\%CLSJO ;CLSTB BITS FOR CHANNELS TO CLOSE
7584 SETZM B ;CLEAR STOPPED PROC FLAG
7585 PUSHJ P,CHSCAA ;EXECUTE FOLLOWING INST FOR EACH CHANNEL AND I/O PDL SLOT
7589 SKIPE B ;SKIP UNLESSS YOU STOPPED THE PROC
7590 PUSHJ P,UPCLSR ;RESTART USER
7593 ZACHEK: HLRZ T,(R) ;CHECK FOR CHANNEL TO ZAP
7599 POPJ P, ;IS IT EITHER TYPE OF USER CHANNEL? OR JOB CHNL?
7601 PUSHJ P,RPCLSR ;STOP USER
7604 TRNN T,%CLSFU ;IS IT A FOREIGN USR CHNL?
7605 JRST ZACHK2 ;NO, SUPERIOR OR JOB CHNL.
7606 JUMPG R,ZACHK1 ;IOPDL CHANNEL
7607 MOVEI T,LUBLK ;SEE IF A HAS BEEN CLOBBERED
7608 IDIVM A,T ;(AT LEAST MAKE SURE IT'S A VALID USER INDEX)
7613 HRRZ T,R ;NORMAL CHANNEL, INTERRUPT ON IT.
7618 ZACHK2: CAIE C,(R) ;UNLESS THE ONE NOT TO BE CLOSED UNTIL LAST MINUTE,
7619 SETZM (R) ;FOR ANY KIND OF CHANNEL, CLEAR IT OUT.
7622 ZACHK1: MOVEI T,IIOPOP ;FOREIGN USR IN IOPDL SLOT: INTERRUPT WHEN IOPOPPED.
7626 ZUSLOG: PUSH P,[ZUSER] ;DO LOGUSE THEN ZUSER
7628 ;LOG RUNTIME AND SWAPIN REQUESTS USED BY JOB IN U
7629 ;JOB CALLED FOR SHOULD NOT BE CURRENT OR ABLE TO RUN DURING CALL
7630 ;JOB SHOULD NOT BE TOP LEVEL EXCEPT WHEN DMNPLO CALLS
7631 ; HERE JUST BEFORE SENDING THE USAGE TO THE DEMON
7634 LOGUSE: MOVN TT,UTRNTM(U)
7636 EXCH TT,TRUNTM(U) ;AVOID CHARGING FOR THIS USAGE TWICE
7638 SUB TT,TRUNTM(U) ;COMPUTE TOTAL USAGE NOT YET CHARGED
7640 SKIPGE I,SUPPRO(U) ;FIND HIGHEST JOB IN TREE
7641 POPJ P, ;BUT IF TOP LEVEL RETURN WITH USAGE IN TT, T
7642 ;THIS IS TO FIND A BUG. -- CStacy, 4/30/82
7643 CAME I,U ;IS THIS JOB ITS OWN SUPERIOR?
7645 BUG PAUSE,[SOME JOB IS ITS OWN SUPERIOR, U AND I=],OCT,U
7646 LOGUS1: SKIPL SUPPRO(I)
7647 JRST [ MOVE I,SUPPRO(I) ? JRST .-1 ]
7648 ADDM TT,TRUNTM(I) ;ADD CHARGES TO TREE'S ACCOUNT
7652 ;DO LOGOUT FOR TREE HEADED BY JOB IN U
7653 ;CALLER SHOULD THEN PUSHJ P,DMNPLI TO LOG JOB BACK IN
7654 ;THIS IS USED TO KEEP ACCOUNTING STRAIGHT WHEN DETACH, CHUNAME, RELOAD (SIGH)
7655 ;IF JOB IS CURRENTLY RUNNING, TIME USED IN CURRENT QUANTUM
7656 ;WON'T GET CHARGED THIS TIME AROUND. TOO BAD.
7657 ;CLOBBERS T,TT,I,J,D. CALL WITH CLKOFF OR IN PROGRESS.
7662 LOGUP1: ADDI U,LUBLK
7665 CAMN J,UTMPTR(U) ;SKIP JOBS IN OTHER TREES (FOR SPEED)
7666 SKIPGE SUPPRO(U) ;AND SKIP TOP LEVEL JOBS
7668 SKIPE UNAME(U) ;DON'T GET CONFUSED BY EMPTY SLOTS
7669 PUSHJ P,LOGUSE ;PROBABLY AN INFERIOR IN TREE LOGGING OUT, UPDATE ACCT
7673 JRST DMNPLO ;TELL DEMON ABOUT TREE'S USAGE
7675 SUBTTL USER UUO WAIT (HANG UP) ROUTINE
7676 ; DOES NOT WORK FOR XCT T OR FOR X (T)
7677 ; THE INSTRUCTION BEFORE THE PUSHJ P,UFLS GETS EXECUTED WITH AN
7678 ; ARGUMENT PASSED IN T AND ITS USER INDEX IN U. I BELIEVE IT
7679 ; IS ONLY ALLOWED TO BASH T AND A.
7681 UFLS: CONSZ PI,77400
7682 BUG HALT,[UFLS WITH PI IN PROGRESS]
7683 CONO PI,CLKOFF ;DOES NOT ALLOW CLOCK INTS
7685 SKIPGE U,USER ;GET INDEX OF USER BEING BLOCKED
7686 JRST 4,. ;NULL JOB SHOULD NOT GET BLOCKED
7687 MOVEM T,EPDL2(U) ;SAVE C(T) FOR FLSINS AT PCLSR
7688 MOVEM T,AC16S(U) ;SAVE IN SWAP OUT AC ALSO
7689 POP P,UPC(U) ;WORK FOR INST INDEX OF P
7691 BLT T,AC15S(U) ;STORE REST OF ACS
7692 MOVE T,UPC(U) ;GET PC AT CALL (=CALL+1 ; =SKIP +2)
7693 SKIPA T,-2(T) ;GET POINTER TO SKIP
7694 UFL3: MOVE T,(T) ;GET CONTENTS OF E (WAS AN XCT)
7695 MOVE U,AC17S(U) ;WIN FOR INSNS INDEX OF U.
7696 HRRI T,@T ;CALCULATE E
7697 TLZ T,37 ;CLEAR OUT @ AND INDEX BITS
7699 MOVEM T,FLSINS(U) ;STORE AS BLOCKING CONDITION
7702 JRST UFL3 ;JUMP IF INSTRUCTION WAS XCT
7703 CONO PI,UTCON-1 ;TURN ON ALL PIS EXCEPT CLOCK
7704 MOVSI T,%SWPGW+%SWINT
7705 ANDCAM T,USWST(U) ;CLEAR WAITING FOR PAGE TYPE FLSINS
7706 SKIPGE RPCL(U) ;SKIP IF NOT BEING RPCLSRED
7707 JRST UFL1 ;LOSER IS BEING RPCLSRED
7708 UFL6: MOVE U,AC17S(U) ;FOR CLUSAV TO STORE
7710 CONO PI,CLKRQ ;CAUSE INTERRUPT TRANSFERING TO CLOCK ROUTINE PI IN
7712 IFE KA10P, JRST . ;ON KL AND KS SEEMS TO TAKE A WHILE TO GO OFF ("I
7713 ; CAN WAIT FOREVER, YOU KNOW")
7714 IFN KA10P, JRST 4,. ;ON KA SHOULD GO OFF RIGHT AWAY
7716 UFL1: MOVE P,CPDLP ;MUST NOT USE USR PDL SINCE THAT CAN
7717 ;GET CLOBBERED BY LSWDIS VIA UFL5
7718 ;CLOCK IS OFF, SO CPDLP IS OK
7720 MOVE T,UEXIT ;PICK UP EXIT INSTR
7721 CAME T,[JRST ONEPROC] ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7723 JRST UFL1A ;NOT ONE PROCEEDING
7724 MOVSI T,%PC1PR ;GET ONE PROCEED BIT
7725 IORM T,UUOH ;TURN IT ON IN PC
7728 MOVE T,UEXIT ;PICK UP EXIT INSTR
7729 CAME T,[JRST ONEPR4] ;SKIP IF WAS TRYING TO ONE PROCEED THE UUO
7731 JRST UFL1A ;NOT ONE PROCEEDING
7732 MOVSI T,OIPBIT ;GET ONE PROCEED BIT
7733 IORM T,UUOH ;TURN IT ON IN PC
7735 SOS T,UUOH ;UUOH HAS REAL PC IF UFL5 SKIPS. WILL GET SET BY ONEPR1
7736 PUSHJ P,UFL5 ;BACK UP TO UUO
7737 JRST UFL6 ;FINALIZATION REQUIRED
7741 SUBTTL VARIOUS WAIT & LOCK-SWITCH ROUTINES
7743 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH UTCCHN OFF
7745 LWAIT1: CONO PI,UTCON ;TURN INTERRUPTS ON
7747 XCT @(P) ;ENTRY, EXECUTE INSTRUCTION
7748 PUSHJ P,UFLS ;HANG TILL INSTRUCTION SKIPS
7749 CONO PI,UTCOFF ;TURN INTERRUPTS OFF
7752 JRST POPJ1 ;WIN, RETURN SKIPPING OVER ARG
7754 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE -1 AND SEIZE IT
7758 HRLM T,(P) ;MAKE PC STORED ON PDL INDIRECT
7759 SKIPGE @(P) ;SKIP IF ALREADY LOCKED
7760 JRST SWTL1 ;NOT LOCKED SO TRY TO GRAB IT
7761 MOVEI T,@(P) ;ADDRESS OF SWITCH
7762 HLRZ T,1(T) ;USER THAT HAS SWITCH
7765 CAMN T,USER ;SKIP IF THIS USER DOESN'T HAVE IT
7766 BUG ;THIS USER ALREADY HAS THAT SWITCH
7767 SWTL1: SKIPL @(P) ;(DO NOT CHANGE TO AOSE)
7768 PUSHJ P,UFLS ;HANG TILL NEGATIVE
7787 ;IF LOCK ALREADY SEIZED, JUST SET UP POINTERS
7792 SWTAD: PCLT ;TRY TO LOCK SWITCH (@NEXT LOCN). IF SUCEED, SKIP EXTRA TIME.
7793 MOVE T,@(P) ;IF FAIL, DO N LSWPOPS (AS SPEC IN 4.6-4.1 OF NEXT WORD)
7794 SKIPGE (T) ;AND WAIT FOR SWITCH TO SEEM TO BE AVAILABLE.
7795 JRST SWTAD1 ;THEN RETURN (NOTE: NOT LOCKING IT).
7796 SWTAD2: TLNN T,77000
7808 SWTAD1: CONO PI,CLKOFF
7810 JRST [ CONO PI,CLKON
7812 AOS (P) ;SKIP OVER FAILURE RETURN
7816 ;WAIT FOR INSTRUCTION AFTER CALL TO SKIP WITH CLKCHN OFF
7817 CWAIT1: CONO PI,CLKON ;TURN CLOCK ON
7819 XCT @(P) ;ENTRY, EXECUTE INSTRUCTION
7820 PUSHJ P,UFLS ;HANG TILL INSTRUCTION SKIPS
7821 CONO PI,CLKOFF ;TURN CLOCK OFF
7824 JRST POPJ1 ;WIN, RETURN SKIPPING OVER ARG
7827 ;WAIT FOR LOCK VAR (@ NEXT LOC) TO BE NON-NEGATIVE AND SEIZE IT
7829 MOVEI T,(@) ;IF 4.9 OF NEXT LOCN =1, RETURN WITH UTCOFF
7845 ;SWITCH LIST LOCK, DOES NOT WORK FOR SWITCHES POINTED TO INDEX OF A, B, OR D
7846 ;FOLLOW BY LIST OF SWITCHES
7847 ;4.9-4.4=0 4.3-4.1 0 AOSE SWITCH 1 SIGN SWITCH
7853 BLT T,AC0S+17(U) ;FOR SLWAIT FIRST TIME
7854 SLUGH1: HRRZ T,-3(P) ;POINTER TO SWITCH LIST
7858 SLUGH2: MOVE A,(T) ;TRY TO LOCK LIST
7860 JRST SLUWIN ;REACHED END OF LIST
7861 LDB B,[220400,,A] ;INDEX
7870 AOBJP T,SLUGH2 ;LH COUNTS SWITCHES SUCCESSFULLY SEIZED
7871 ;SHOULD NVERE FALL THROUGH
7875 LDB B,[220400,,A] ;INDEX
7876 LDB D,[330300,,A] ;TYPE CODE
7884 AOJA T,SLWAIT ;THAT SWITCH OK, TRY OTHERS
7886 SLWATT: SKIPL (A) ;WAIT FOR NEG (AOSE SW)
7887 SKIPGE (A) ;WAIT FOR POS (SIGN SW)
7892 SUB P,[1,,1] ;"RETURN" BUT NOT INCREMENTED
7895 SLLOCK: PUSHJ P,SWTLX
7899 SLULO2: JUMPE A,SLUGH1 ;NONE SEIZED TRY AGAIN
7900 PUSHJ P,LSWPOP ;RELEASE THOSE SEIZED
7903 SWTLX: CONO PI,CLKOFF ;DON'T GO OFF HALF-LOCKED
7912 LSWTLX: CONO PI,UTCOFF
7925 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING SWITCH
7931 ;SET UP ROUTINE TO BE CALLED ON PCLSR'ING OUT
7941 ;SET UP ROUTINE TO AOS VARIABLE UPON UNLOCKING SWITCH
7946 ;SET UP ROUTINE TO SOS VARIABLE UPON UNLOCKING SWITCH
7951 ;SET UP ROUTINE TO SOS LH UPON UNLOCKING SWITCH
7952 ;HALT IF SWITCH'S LH EVER BECOMES NEGATIVE
7957 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING SWITCH
7958 ;THAT ROUTINE MAY ONLY CLOBBER A AND T!! IT GETS CALLED
7959 ;WITH USER IN U, AND THE JOB'S ACS IN AC0S(U)-AC17S(U)
7968 ;SET UP ROUTINE TO CLEAR SIGN BIT OF VARIABLE UPON UNLOCKING SWITCH
7973 ;SET UP ROUTINE TO DO NOTHING UPON UNLOCKING SWITCH
7980 ;ROUTINE TO ADD THIS PROCEDURE TO A LIST POINTED TO
7981 ;BY THE WORD AFTER THE CALL. UNLOCKING REMOVES IT FROM THE LIST
7982 LSTSET: PUSH P,TT ;LEAVES CLKON
7996 BUG ;NOT ENOUGH BLOCKS
7997 LSTST2: MOVE T,@-4(P) ;ADDRESS OF HEAD OF LIST
7999 PUSH P,(T) ;PUSH HEAD OF LIST
8000 POP P,(Q) ;POP INTO LSWB BLOCK
8010 ;SET UP ROUTINE TO SETOM VARIABLE UPON UNLOCKING OF SWITCH
8011 ;BY OTHER THAN PCLSRING OUT
8016 ;SET UP ROUTINE TO BE CALLED UPON UNLOCKING OF SWITCH
8017 ;BY OTHER THAN PCLSRING OUT
8031 ;SET USER LOCK SWITCH BLOCK, WD1 IN T, MODE IN TT
8036 REPEAT NULBLK,[IFN .RPCNT,ADDI Q,2
8040 BUG ;NOT ENOUGH BLOCKS
8052 LSWCJ1: AOS (P) ;EXIT TO DO LSWCLR AND SKIP-RETURN.
8054 ;UNLOCK ALL SWITCHES, CALLED BY OPENL, ADISOWN, IOADCR
8057 ;TEMPORARY CODE ADDED 1/22/80 TO SEE IF THERE ARE ANY MORE OF
8062 SKIPN T,LSWPR(U) ;MUST HAVE USER IN U
8070 TLO U,400000 ;SIGNAL NOT PCLSR
8087 LSWZAP: PUSH P,U ;FROM PCLSR
8101 TLZN U,200000 ;HAS PC BEEN CLOBBERED? ;THIS IS ONLY FOR FINSET R.I.P.
8104 SETZM LSUUO(U) ;INDICATE OCCURRENCE OF FINSET (WILL MEAN WE HAVEN'T MISSED MARK)
8105 JRST PCLSR4 ;REQUIRED TO START UP ROUTINE
8107 ;-1(P) HAS POINTER TO SWITCH BLOCK TO UNDO.
8108 ;A HAS SECOND WORD OF THAT BLOCK.
8109 ; 4.9=1 => PERFORM FUNCTION ON PCLSR
8110 ; 4.8=1 => PERFORM FUNCTION ON ANY LSWPOP OTHER THAN PCLSR
8111 ; 4.1-4.3 => FUNCTION
8112 ; 3.1-3.9 USER # LAST LOCKED BY
8113 ; 1.1-2.9 LSWPR THREAD
8115 LSWDIS: LDB T,[330300,,A] ;FUNCTION
8116 TLNE A,400000 ;SKIP IF NOT FOR PCLSR
8117 JUMPGE U,LSWDS1 ;PCLSRED AND 4.9=1
8118 TLNN A,200000 ;NOT FOR PCLSR OR FOR PCLSR BUT NOT PCLSRED
8119 POPJ P, ;NOT FOR EITHER LSWPOP
8120 JUMPGE U,CPOPJ ;FOR OTHER LSWPOP BUT PCLSRED
8121 LSWDS1: JRST LSWTAB(T)
8123 LSWTAB: JRST UNSWTL ;0 (AOSE) ALSO USED FOR QUSR
8124 JRST UNLSWT ;1 (SIGN)
8125 JRST ULROUT ;2 (GO TO ROUTINE)
8126 JRST ULAOS ;3 (AOS, SOS)
8127 JRST UNLST ;4 (UNLOCK FROM LIST)
8128 JRST ULSOS ;5 (SOS, AOS)
8129 JRST ULSTM ;6 (SETOM)
8130 JRST ULAOSL ;7 (AOS,SOS LEFT HALF)
8132 UNSWTL: MOVE T,-1(P)
8136 ULSTM: MOVE T,@-1(P)
8140 UNLSWT: MOVE T,@-1(P)
8145 ULAOSL: MOVE T,@-1(P)
8151 ULAOS: MOVE T,@-1(P)
8164 ULSOS: MOVE T,@-1(P)
8168 ULROUT: MOVE T,@-1(P)
8170 JRST ULROU1 ;A LOSSET - MAY CLOBBER A OR T; USR INDEX IN U
8171 HRRZM T,UPC(U) ;IT'S A FINSET, EXPECTS THE OLD METHOD OF CALL.
8175 MOVSI T,%PSPCU ;IT MIGHT TRY AN XCTR
8178 TLOE U,200000 ;SIGNAL PC CLOBBERED
8179 BUG ;PC TRIED TO BE CLOBBERED TWICE
8182 ULROU1: JUMPGE U,(T) ;IF LOSSET, AND LSWPOPPING,
8184 ADDI A,(U) ;PUT THE ACS IN THE AC0S, SINCE
8185 BLT A,AC0S+H(U) ;THAT'S WHERE THEY'LL BE IF CALL LOSSET ROUTINE WHILE PCLSRING.
8188 ;FIND SWITCH POINTED TO BY WORD AFTER
8189 ;PUSHJ P,LSWREM AND UNLOCK IT
8210 LSWDEL: PUSH P,U ;REMOVE SWITCH FROM HEAD OF LIST
8211 MOVE U,USER ;DO NOT ATTEMPT TO UNLOCK IT
8226 ;POP C(T)'TH FROB BACK
8227 LSWPON: PUSHJ P,LSWBAK
8231 ;DELETE C(T)'TH FROB BACK
8232 LSWDLN: PUSHJ P,LSWBAK
8238 TLO U,400000 ;SIGNAL NOT PCLSR IN CASE OF LSWPPP
8242 SOJE Q,LSWBA3 ;UNLOCKING FIRST FROB
8247 PUSH P,LSWPR(U) ;DON'T WORRY, YOU CAN'T GET PCLSR'ED JUST BELOW
8254 LSWBA3: MOVE T,LSWPR(U)
8258 SUBTTL VARIOUS RETURNS
8304 CKOCJ1: CONO PI,CLKON
8308 CLKONJ: CONO PI,CLKON
8312 CLKOPJ: CONO PI,CLKON
8316 OMXONJ: CONO PI,OMXON
8321 TTYONJ: CONO PI,TTYON
8324 IFN PTRP, PTRONJ:: PTPONJ::
8325 LPTONJ: CONO PI,LPTON
8332 UTCONJ: CONO PI,UTCON
8358 SUBTTL UUO PROCESSOR
8366 .STATUS=UUOMIN+6_27.
8367 .ACCESS=UUOMIN+7_27.
8376 ;REPEAT OVER USET NAMES FROM 0 TO 77.
8378 IRPS X,,[UPC VAL TTY FLS UNAME JNAME MASK USTP
8379 PIRQC INTB MEMT SV40 IPIRQ APIRQ SNAME PICLR
8380 MARA MARPC UUOH UIND RUNT MSK2 IFPIR APRC
8381 CNSL UTRP IIFPI AIFPI IMASK AMASK IMSK2 AMSK2
8382 JPC OPC RTMR HSNAME BCHN MPVA IDF1 ADF1
8383 IDF2 ADF2 DF1 DF2 OPTION 40ADDR TVCREG
8384 TTST TTS1 TTS2 WHO1 WHO2 WHO3 SUPPRO TR1INS
8385 TR2INS MBOX MBO1 EBOX EBO1 XUNAME XJNAME FTL1 FTL2]
8390 ;REPEAT OVER USET NAMES 600 AND UP.
8392 IRPS X,,[PAGRAN PAGAHD SERVER]
8396 ;NOTE: OPER'S BELOW ARE 8 PER LINE
8397 ; USE UP ILUUO'S BEFORE ADDING TO END
8398 ; THE FOLLOWING SHOULD GO AWAY EVENTUALLY
8406 IRPS X,,[ITYI LISTEN SLEEP SETMSK SETM2 DEMON CLOSE
8407 UCLOSE ATTY DTTY IOPUSH IOPOP DCLOSE DSTOP RDTIME
8408 RDSW GUN UDISMT GETSYS IPDP GETLOC SETLOC DISOWN
8409 DWORD DSTEP GENSYM LOGOUT REALT WSNAME UPISET RESET
8410 ARMOVE DCONTIN CBLK ASSIGN DESIGN RTIME RDATE HANG
8411 EOFC IOTLSR RSYSI SUPSET PDTIME ARMRS UBLAT IOPDL
8412 ITYIC MASTER VSTST NETAC NETS REVIVE DIETIM SHUTDN
8413 ARMOFF NDIS FEED EVAL REDEF IFSET UTNAM UINIT
8414 RYEAR RLPDTM RDATIM RCHST RBTC DMPCH SWAP MTAPE
8421 IRPS X,,[DISMIS LOSE TRANAD VALUE UTRAN CORE TRAND
8422 DSTART FDELE DSTRTL SUSET LTPEN VSCAN POTSET]
8425 ;THESE ARE THE SYMBOLS USED BY MIDAS AND DDT. THEY ALSO
8426 ;EXIST IN SYS:ITS DEFS.
8427 ;SYMBOLS SHOULD BE LEFT IN CURRENT ORDER OR DDT WILL LOSE
8428 SYSYMB: USTIRP [SQUOZE 44,.R!X
8438 USTIR1 [SQUOZE 44,.R!X
8440 USTIRP [SQUOZE 44,.S!X
8442 USTIR1 [SQUOZE 44,.S!X
8445 GLOSYM [IOT,OPEN,OPER]
8459 OPRIRP [IFSN X,ILUUO,[.!X=.OPER ZZ
8471 .!X=.CALL .IRPCNT+1,
8476 GLOSYM [USET,BREAK,STATUS,ACCESS]
8479 ;THESE SYMBOLS ARE USED BY DDT, SO THE USER CAN OPEN .PIRQC, ETC.
8480 ;BEGINNING FOR .GETSYS (USYMS)
8498 SYSUSE==.-1 ;END FOR .GETSYS (USYMS)
8500 ;SIXBIT NAME TABLES FOR WHO LINE GENERATION.
8501 ;ALSO USED BY PEEK FOR PRINTING OUT JOBS' STATUS.
8503 OPRSXB: SIXBIT/OPER/
8508 CALSXB: SIXBIT/CALL/
8515 IRPS X,,IOT OPEN OPER CALL USET BREAK STATUS ACCESS
8520 ;MACRO TO SAVE ACS AS APPROPRIATE FOR OUR CPU, LOAD UP U,
8521 ;CHECK VARIOUS ERROR CONDITIONS.
8525 BUG AWFUL,[UUO WITH PI IN PROGRESS]
8527 UMOVEM U,17 ;SAVE 17
8528 SKIPGE U,USER ;LOAD CURRENT USERS INDEX,
8529 BUG AWFUL,[UUO IN NULL JOB]
8530 UMOVEM T,16 ;SAVE LOC 16 FOR USER
8532 XCTR XBW,[BLT T,15] ;SAVE REST OF ACS IN USERS SHADOW 0-15
8537 BUG AWFUL,[UUO IN NULL JOB]
8538 LDB T,[330300,,MUUOCX(U)]
8540 BUG AWFUL,[UUO WHILE IN AC BLK ],DEC,T
8544 ; UUO AND ILLOP TRAP HANDLER
8546 ;EITHER DISPATCHES TO APPROPRIATE UUO ROUTINE,
8547 ; RETURNS CONTROL TO USERS UUO ROUTINE, GOES TO ILLOP, USRTRP, OR USRIOT.
8548 ;CODE ON THIS PAGE IS INTERRUPTABLE AT ANY POINT
8550 ;COME HERE TO RETURN A UUO TO THE USER. RESTORES USER ACS W THROUGH U ONLY.
8551 USRUUO: CAIG U,LUBLK
8552 BUG AWFUL,[RETURNABLE UUO FROM SYS OR CORE JOB,PC=],OCT,UUOH
8555 BUG AWFUL,[RETURNABLE UUO FROM EXEC MODE,PC=],OCT,UUOH
8557 MOVE P,USRPDL(U) ;IN CASE AN XCTR FAULTS.
8558 XCTR XR,[HLRZ H,1(W)]
8559 CAIE H,(JSR) ;ELSE OK ONLY IF OPCODE IN 41 IS 0 OR JSR.
8560 JUMPN H,ILUUO ;THIS IS IN CASE USER IS HANDLING USER-UUO'S WITH PUSHJ
8561 ;AND HIS UUOH ISN'T ABLE TO BE JSR'D TO.
8562 XCTR XR,[HRRZ H,1(W)]
8563 JUMPE H,ILUUO ;0 ISN'T ACCEPTABLE AS UUOH ADDRESS.
8565 UMOVEM T,(W) ;ALL IS LEGAL; PLANT UUO INTO USERS "40".
8566 MOVE T,UUOH ;SIMULATE A JSR AT USER'S "41"
8569 HRRM H,UUOH ;SET TO RETURN TO USER AT FIRST INSTRUCTION OF UUO HANDLER
8574 ULEAVE: USRCTX ;SELECT USER MODE AC BLOCK IF NEC.
8578 ;THE FOLLOWING BLOCK OF LOCATIONS IS SWITCHED WITH SOME USER VARS
8580 UEXIT: JRST 2,@XUUOH ;EXIT FROM UUO (FOR KL-10, POINTS TO APPROPRIATE
8583 CLUSAV: MOVEM U,AC17S ;CLOCK SAVE OF U
8586 CLCXSV: DATAI PAG,CLCX ;CLOCK LEVEL CONTEXT SAVE
8590 XUUOH: 0 ;UUO AND ILLOP TRAP GETS HERE - UUOH0 MUST BE . + 1.
8593 UEXND:: ;END OF SWAPPED UEXIT BLOCK.
8598 MUUOT1: SKIPGE UTRAPM(U) ;IF SUPERIOR WANTS TO CATCH UUOS, THIS IS FATAL INT.
8600 SKIPGE T,FORTY ;PICK UP THE UUO OR ILLOP
8604 JRST USRUUO ;NOT A SYSTEM CALL, GIVE TO USER
8607 ;HERE WITH UUO TO BE HANDLED BY SYSTEM IN T
8608 ILLOP1: JUMPN U,UUOH1
8609 MOVEI Q,0 ;SAVE SYS JOB EXEC MODE LSWPR PNTR
8612 UUOH1: SKIPE LSWPR(U)
8614 MOVEM T,LSUUO(U) ;SAVE UUO FOR DEBUGGING PURPOSES
8615 LSH T,-27. ;RIGHT JUSTIFY OP CODE
8616 SKIPL UUODSP-UUOMIN_-27.(T)
8621 UUOTR3: SETZM SYSCVL(U) ;DIDN'T GET INTO SYSTEM VIA .CALL
8622 MOVE P,USRPDL(U) ;SET UP USER PDL
8623 HRRZ C,FORTY ;PICK UP EFFECTIVE ADDRESS OF UUO
8624 LDB R,[270400,,FORTY] ;PICK UP AC FIELD OF UUO
8625 MOVEM R,UUAC(U) ;SAVE AC FLD
8626 PUSHJ P,@UUODSP-UUOMIN_-27.(T) ;DISPATCH ON UUO TYPE
8627 JRST URET ;NORMAL RETURN (NON SKIP)
8629 IFE KA10P, MOVE U,USER ;(SINCE UUOH IS IN THE USER VARIABLES)
8630 AOS UUOH ;UUO ROUTINE SKIPPED, AOS USER RETURN POINT
8632 MOVE A,PIRQC(U) ;CHECK FOR RETURNING TO USER WITH PCLSR'ING FATAL
8634 TDNE A,[BADBTS&#<%PIC.Z\%PIDIS>] ;A FEW BITS ARE FATAL BUT SET
8636 JRST [ HRRZ A,UEXIT ;INT SET, MAKE SURE UEXIT IS CLOBBERED
8637 IFN KA10P, CAIE A,ONEPRO ;TO A LOCATION WHICH WILL CHECK PIRQC.
8638 IFN KS10P, CAIE A,ONEPR4
8649 URET2: SKIPE LSWPR(U)
8652 MOVEI T,0 ;RESTORE SYS JOB EXEC LSWPR
8656 BUG ;RETURNING TO USER MODE WITH CLOCK OFF
8659 XCTR XBR,[BLT U,U] ;RESTORE USERS ACS FROM USERS SHADOW 0-17
8663 URETC: REPEAT NULBLK/2,[
8664 SKIPN CONC LSWB,\<2*.RPCNT>,+1(U)
8665 SKIPE CONC LSWB,\<2*.RPCNT+1>,+1(U)
8669 SKIPE CONC LSWB,\<NULBLK-1>,+1(U)
8674 URPCL1: SKIPN LSUUO(U)
8675 JRST URET2 ;DIDN'T REALLY MISS MARK (DUE TO FINSET)
8676 SETOM PCLNXT ;MISSED MARK, REINITIALIZE
8681 UUOTRO: MOVE T,FORTY
8684 USRIOT: MOVSI T,(UIOT) ;I/O INST TURNS INTO PSEUDO UUO TO DISPATCH ON
8689 ;HANDLE UUOS EXECUTED FOR TRAPS (PDL OV, ARITH OV, ONE PROCEED).
8690 ;MOST ARE AS USUAL, BUT OPCODE 0 IORM'S ADDRESS INTO PIRQC.
8691 ;NOTE: LOSER IS NOT PERMITTED TO USE OPCODE 0 - SEE USTR1I, ETC.
8696 JRST MUUOT1 ;IF OPCODE ISN'T 0, TREAT UUO NORMALLY (STARTING A
8698 MOVSI A,%PSTR1+%PSTR2
8699 ANDCAB A,UUOH ;TURN OFF TRAP FLAGS, GET PC
8702 TLNE A,%PCFOV ;DISTINGUISH FIXED AND FLOATING OVERFLOW.
8704 MUUOT2: MOVE A,MSKST(U)
8706 AND T,A ;INTS SETTING WHICH AREN'T DISABLED
8711 IOR A,[BADBTS] ;MASK FOR INTS WHICH AREN'T DEFERRED
8713 JRST ONEPR1 ;TAKE INT
8714 JRST URET ;IGNORE INT
8716 MUUOEX: BUG AWFUL,[MUUO IN EXEC MODE, PC=],OCT,EPT+425
8717 ;UUO IN EXEC MODE NOT IN SYS JOB
8720 BUG AWFUL,[LUUO IN EXEC MODE,PC=],OCT,LUUOEX
8723 BUG AWFUL,[TRAP IN EXEC MODE,PC=],OCT,ILLTRP
8728 60H: 0 ;TRAPS FROM 60
8730 60H0: UUOSAV ;IF WE LOSE PROCESSOR HERE, 60 GETS COPIED INTO 40,
8731 ; 60H IS COPIED INTO UUOH, AND UPC GETS MOVED INTO
8733 60HE: CONO PI,CLKOFF
8742 ;COME HERE FROM UEXIT WHEN USER IS BEING PCLSR'ED
8743 ; KA10 - ALL USER ACS ARE IN MACHINE ACS AND IN UUOACS
8744 ; KL10 & KS10 - ALL USERS ACS ARE IN AC BLOCK 1
8746 ONEFLS: CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
8748 MOVE U,USER ;GET INDEX OF CURRENT USER
8749 ONEPR2: SKIPE T,RPCL(U) ;SKIP IF NO RPCLSRING OCCURING
8750 JRST ONEFL2 ;RPCLSRING GOING ON
8751 ONEPR1: MOVE U,USER ;GET INDEX OF CURRENT USER
8752 CONO PI,CLKOFF ;TURN OFF CLOCK BREAKS
8755 MOVEI T,AC0S(U) ;PUT USER ACS INTO SWAP OUT ACS
8756 XCTR XBR,[BLT T,AC17S(U)]
8758 MOVEM T,UPC(U) ;SIMULATE JRST 2,@UUOH
8759 IFN KA10P, MOVE T,[JRST 2,@UUOH]
8764 MOVEM T,UEXIT ;RESTORE UEXIT
8766 MOVE U,USER ;AS IF HAD RETURNED TO USER THEN CLKBRK
8767 ;EXCEPT THAT AC'S ARE ALREADY STORED IN AC0S
8768 JRST UFL6 ;RESCHEDULE, ETC
8770 ONEFL2: JUMPG T,[JRST 4,.] ;LOSEY LOSEY (SHOULD NOT TRY TO EXIT WHILE TRYING TO RPCLSR SOMEONE)
8771 MOVE A,FLSINS(T) ;GET FLSINS OF USER SUPPOSEDLY RPCLSRING YOU
8772 SUBI A,RPCL(T) ;HIS FLSINS SHOULD BE A SKIPE OF HIS RPCL
8773 CAME A,[SKIPE] ;SKIP IF HE HAS THE RIGHT FLSINS
8774 JRST 4,. ;LOSEY LOSEY
8775 CLEARM FLSINS(T) ;ASSURE NO INTERRUPT
8776 SETZM RPCL(U) ;ACS IN UUO ACS CLOCK OFF
8777 AOS USTP(U) ;STOP SELF
8778 SETZM RPCL(T) ;UNHANG LOSER RPCLSR'ING YOU
8781 ;ROUTINES TO GIVE THE RUNNING JOB AN INTERRUPT AND ABORT THE CURRENT INSTRUCTION
8783 TTYLOS: SKIPA T,[%PITTY] ;JOB WHOSE %TBINT IS SET TRIED TO USE ITS TTY WHEN DIDN'T OWN IT
8784 IOADC: MOVEI T,%PIMPV ;I/O UUO MEMORY PROTECT VIOLATION
8787 ABREAK: MOVEI T,%PIBRK ;.BREAK - INTERRUPT TO SUPERIOR
8788 ILLOP4: IORM T,PIRQC(U)
8792 IOCERF: ;ADDRESS OF FIRST IO CHANNEL ERROR
8795 REPEAT ZZ,CONC IOCER,\.RPCNT+MIOTER,: JSP T,IOCERX
8796 IFG NIOTER-9,[REPEAT NIOTER-9,CONC IOCR,\.RPCNT+MIOTER+9,: JSP T,IOCERX
8798 IFN 0, IOCER1: IOCER2: IOCER3: IOCER4: IOCER5: IOCER6: IOCER7: ;FOR @
8799 .ALSO IOCER8: IOCER9: IOCR10: IOCR11: IOCR12: IOCR13: IOCR14:
8802 IOCERX: CONSZ PI,77400
8803 JRST 4,. ;ERR WITH PI IN PROGRESS
8807 DPB TT,[BCHPTR] ;STORE LAST CHNL IN ERROR
8809 DPB T,[330600,,IOCHST(TT)]
8810 IOCERR: MOVEI T,%PIIOC
8814 ILUUO: SKIPA T,[%PIILO] ;ILLEGAL SYSTEM UUO
8815 TRPDEV: ;ATTEMPTED USE OF TRAP DEVICE
8816 USRTRP: MOVSI T,(%PITRP) ;SYSTEM UUO IN TRAP MODE
8819 IORM T,PIRQC(U) ;GIVE USER INT BIT
8821 MOVE T,OPTION(U);PC CLOBBERED TO HERE IF MPV IN EXEC MODE - INTR OUT OF UUO
8822 TLNN T,%OPOPC ;UNLESS USER HAS SAID NOT TO,
8823 AOS UUOH ;UNDO SOS THAT PCLSR'ING WILL DO; PC SHOULD END UP -> AFTER UUO.
8824 UUOER2: CONO PI,CLKON ;THERE HAD BETTER BE A CLASS 1 OR 2 INT. PENDING.
8826 SETZM SCHMNY ;CAUSE FULL SCHEDULE SO INTERRUPT WILL BE SEEN
8827 JFCL ; (IT'S A CROCK TO HAVE TO DO THIS, BUT HARD TO FIX)
8828 PUSHJ P,UFLS ;LET THE INTERRUPT PCLSR US.
8831 UUOER1: MOVE U,USER ;UUOERR ASSUMING %OPOPC
8836 ILEXPF: CONO PI,CLKOFF ;GET HERE AFTER EXEC PAGE FAULT TAKEN ON XCTRI
8838 MOVSI A,1770 ;CLEAR FAULT REASON BITS
8843 IFE KA10P, ILEXPF==ILUUO ;NO CLEANUP NECESSARY
8847 ;AT DISPATCH TIME, P HAS UPDL, C HAS RH OF 40
8848 ;R HAS AC FIELD OF UUO, U HAS USER INDEX
8850 UUODSP: SETZ AIOT ;SETZ FLAGS UUO'S TO REFLECT TO USER WHEN %OPDEC OPTIONS
8851 SETZ AOPEN ;IN EFFECT. THEY ARE THE UUOS WHICH OVERLAP DEC
8859 IF2,IFN <UIOT-UUOMIN>_-27.+UUODSP-.+1,.ERR LOSE AT UUODSP
8862 NIOT: CAIL W,3 ;SET IOTBTS TO USER'S 3RD ARG, OR TO 0.
8865 HRRZ C,B ;ADDRESS OF 2ND ARG
8867 SKIPA C,[SETZ] ;USING OUTPUT ARG INSTEAD OF INPUT, FOR UNIT INPUT MODE
8869 AOSA (P) ;GOING TO SUCCEED NOW
8870 JRST OPNL30 ;NOT ENOUGH ARGS
8874 AIOT: SETZM CTLBTS(U)
8876 ADDI R,IOCHNM(U) ;GET IOCHNM WD ADDR IN R.
8881 HLRZ A,(R) ;PICK UP LEFT HALF (DEVICE DEPENDENT)
8882 HRRZ B,(R) ;PICK UP RIGHT HALF (INDEX INTO IOTTB, ETC.)
8883 MOVE D,IOTTB(B) ;GO TO ROUTINE FOR PARTICULAR DEV AND MODE
8884 TLNE D,%IOTOT+%IOTBK+%IOTSP ;BUT FOR "NORMAL" UNIT MODE INPUT, SPECIAL:
8886 XCTR XRW,[MOVES (C)] ;MAKE SURE XCTR XW, BELOW WON'T PCLSR.
8888 PUSHJ P,(D) ;CALL IOT ROUTINE, EXPECTING VALUE IN W.
8889 AIOT3: JRST AIOT2 ;NOTE AIOT3 MAY BE CHECKED FOR ON PDL.
8894 SKIPA A,W ;RETURNING IN NEW SYSTEM-CALL STYLE
8900 AACCES: HRRZ A,UUAC(U)
8903 MOVEM T,LSCALL(U) ;IN CASE PASSED TO JOB DEVICE
8906 JRST IOCER8 ;FOR .ACCESS, SIGNAL FAILURE WITH IOC ERROR.
8907 POPJ P, ;ONLY POSSIBLE FAILURE IS CHANNEL NOT OPEN.
8909 NACCES: MOVEI T,AIOCAL ;GET <CLSTB BITS>,,<IOCHNM WD ADDR> IN R
8913 NACCE1: TLNN R,%CLSQ\%CLSU\%CLSFU
8915 HRRM B,IOCHST-IOCHNM(R) ;STORE USR .ACCESS POINTER
8917 JRST POPJ1 ;NOT DISK
8919 MOVEM B,QRADAD(I) ;STORE ACCESS POINTER FOR DSK
8921 IORM D,QSRAC(I) ;SET ADR HAS BEEN HACKED FLAG
8924 ;SIOT SYMBOLIC SYSTEM CALL - IOT A STRING.
8925 ; 1ST ARG CHANNEL NUMBER.
8926 ; 2ND ARG BYTE POINTER
8927 ; 3RD ARG STRING LENGTH
8928 ; 4TH (OPTIONAL) ARG DEVICE-INDEPENDENT CONTROL BITS
8929 ; CTLBTS DEVICE DEPENDENT CONTROL BITS
8931 NSIOT: TLNN B,1000 ;OBJECT IF B.P. OR COUNT IS IMMEDIATE.
8938 TLNE D,%IOTBK+%IOTSP ;SIOT ALLOWED ONLY ON UNIT MODE CHANNELS.
8939 JRST OPNL12 ;"MODE NOT AVAILABLE".
8940 XCTR XRW,[MOVES A,(B)] ;ENSURE BYTE POINTER WRITABLE
8941 TLNE A,(@) ;CAN'T HACK BYTE POINTER WITH INDIRECT ADDRESSING
8942 JRST OPNL33 ;MEANINGLESS ARGS
8944 PUSHJ P,NSIOT9 ;HACK INDEXING
8945 XCTR XRW,[MOVES A,(C)] ;ENSURE BYTE COUNT WRITABLE
8946 JUMPLE A,POPAJ1 ;0 BYTES TO BE XFERED => SUCCEED IMMEDIATELY.
8948 MOVE TT,B ;IN CASE SPECIAL ROUTINE WANTS TO CALL SIOKT
8949 TLNE D,%IOTBP ;IF THERE'S A SPECIAL DEVICE ROUTINE FOR SIOT,
8950 JRST -1(D) ;GO TO IT.
8951 ;THIS CALL IS LEGAL AND ORDINARY. LOOP, CALLING THE UNIT MODE ROUTINE.
8955 PUSH P,D ;PUT ALL IMPORTANT INFO ON STACK FOR MAIN LOOP
8956 HRRZS (P) ;TO LOOK AT.
8959 JRST NSIOIL ;INPUT AND OUTPUT PART HERE
8960 NSIOOL: UMOVE A,@-3(P)
8961 IBP A ;THIS HAIR IS TO AVOID INCREMENTING THE USER'S COPY
8962 UMOVE D,(A) ;OF THE BYTE POINTER BEFORE THE BYTE HAS BEEN
8963 HRRI A,D ;FINALLY TAKEN WITH NO POSSIBILITY OF PCLSR'ING OUT.
8964 LDB D,A ;CAN'T USE XCTR XR,[LDB D,A] BECAUSE ON THE KA10
8965 MOVE C,[SETZ D] ;THAT WOULD USE THE LOSER'S AC A.
8967 MOVE A,-4(P) ;SET UP ARGS FOR IOT ROUTINE; C HAS ADDR OF VALUE.
8968 PUSHJ P,@-1(P) ;CALL THE IOT ROUTINE.
8969 XCTR XRW,[IBP @-3(P)] ;NOW STEP THE B.P. AND COUNT.
8970 XCTR XRW,[SOS A,@-2(P)]
8974 NSIOIL: UMOVE A,@-3(P)
8975 IBP A ;MAKE SURE NO FAULT IDPB'ING THE BYTE
8976 XCTR XRW,[MOVES (A)]
8977 MOVE R,(P) ;NOW GET THE ARGS FOR THE IOT ROUTINE,
8979 PUSHJ P,@-1(P) ;AND CALL IT, WITH VALUE COMING IN W.
8980 JRST NSIOI3 ;NO SKIP => WE WIN.
8981 JRST NSIOTX ;1 SKIP => THERE'S NO INPUT; RETURN WITHOUT STEPPING B.P.
8982 ;2 SKIPS => THIS BYTE IS THE LAST ONE AVAILABLE.
8983 XCTR XBYTE,[IDPB W,@-3(P)]
8984 XCTR XRW,[SOS @-2(P)]
8987 NSIOI3: XCTR XBYTE,[IDPB W,@-3(P)]
8988 XCTR XRW,[SOS A,@-2(P)]
8990 NSIOTX: SUB P,[5,,5]
8993 NSIOT9: EXCH A,R ;INDEXED BYTE POINTER, EVAL INDEX ONCE AND WRITE BACK
8999 ; ROUTINES TO SIMULATE SOME I/O INSTRUCTIONS WHEN EXECUTED BY USER
9001 IFE KS10P,[ ; KS10 will never have any devices so we might as well punt
9002 ; this sham right from the start.
9004 AUIOT: MOVE I,FORTY ;GET I/O INST
9005 ANDI R,7 ;GET IOT TYPE FIELD
9006 LDB J,[320700,,FORTY]
9007 LDB D,[420200,,IOTTYP(R)]
9008 JRST @IOTTYP(R) ;DISPATCH ON TYPE
9010 IOTTYP: 000000,,IOTTY3 ;BLKI
9011 000000,,IOTTY2 ;DATAI
9012 200000,,IOTTY3 ;BLKO
9013 200000,,IOTTY2 ;DATAO
9014 600000,,IOTTY2 ;CONO
9015 400000,,IOTTY2 ;CONI
9016 400000,,IOTTY1 ;CONSZ
9017 400000,,IOTTY1 ;CONSO
9019 IOTTY1: CAIN J,177 ;IF EQ INST WAS 7777XX,,XXXXXX
9020 JRST ILUUO ;USER HAS EXECUTED A SMALL NEGATIVE NUMBER
9027 JRST IOTTY2 ;SPECIAL BLKI THAT IS TREATED LIKE DATAI
9029 TLO I,40 ;BLOCK TYPE, TURN ON BIT TO CONVERT TO UNIT
9030 UMOVE C,(I) ;GET BLOCK POINTER
9031 ADD C,[1,,1] ;ADVANCE
9032 TLNE C,-1 ;SKIP IF OVERFLOW
9033 AOS (P) ;CAUSE RETURN TO SKIP
9034 UMOVEM C,(I) ;STORE BACK
9035 HRR I,C ;MODIFY INST ADR TO RH OF BLOCK POINTER
9036 IOTTY2: SKIPL C,DCHNTB(J)
9041 IOTTYB: XCTR XRW,I ;DO IOT
9042 POPJ P, ;NORMAL RETURN
9043 JRST POPJ1 ;IOT SKIPPED RETURN
9045 IOTTYA: SKIPGE DCHNTC(J)
9046 JRST ILUUO ;SUSPICIOUS DEVICE
9051 IFN KS10P, AUIOT==:ILUUO ; For now.
9053 IFN 0,[ ; Simple IO instruction simulating for the KS should look
9054 ; like this. Unfortunately XCTR XRW,[APRID 100] clobbers
9055 ; exec location 100. Further investigation is needed
9056 ; before figuring out how to deal with this.
9058 AUIOT: LDB R,[271500,,FORTY] ; Get opcode and AC.
9059 CAIE R,APRID_-27 ; For now this is the only instruction we
9060 ; simulate on the KS
9062 XCTR XRW,FORTY ; Do it
9063 POPJ P, ; Return normally
9064 JRST POPJ1 ; It skipped (well APRID can't, but perhaps
9065 ; someday something else will)
9068 SUBTTL .SUSET, .USET, .CALL USRVAR
9070 ;COMMON CODE FOR USRVAR, TTYVAR, ETC. SYMBOLIC SYSTEM CALLS
9071 ;PUSHJ P,VARCAL WITH FIRST ARG DECODED INTO H,I,J,R; B,C,W,U SET UP AS IN .CALL
9072 ;NOTE B IS A POINTER TO THE SECOND ARG (IN BLOCK MODE IS WRITTEN BACK)
9073 ;POPJS (OR PUSHJS IN THE CASE OF BLOCK MODE) BACK WITH E CONTAINING
9074 ;VARIABLE SPEC, D INPUT DATA, W INSTRUCTION TO HACK IT (0 TO READ INTO A,
9075 ;OTHERWISE OP D, WITH RH CLEAR WHERE OP IS MOVEM, ANDCAM, ADDM, ETC.)
9077 VARCAL: HRRZ E,B ;USE 2ND ARG AND NUM OF ARGS TO DETERMINE TYPE OF OPERATION
9079 JRST VARCA1 ;IMMEDIATE 2ND ARG
9080 UMOVE E,(B) ;GET VALUE OF 2ND ARG
9083 JRST VARCBL ;BLOCK MODE (2ND ARG LOOKS LIKE AOBJN POINTER)
9084 VARCA1: EXCH D,C ;D GETS 3RD ARG, INPUT DATA
9086 JRST VARCA2 ;JUMP IF IMMEDIATE INSTRUCTION MODE
9087 CAIGE W,3 ;SKIP IF WRITING
9088 TDZA W,W ;W 0 FOR READING
9089 MOVSI W,(MOVEM D,) ;SIMPLE CASE OF WRITING (SEE VARCBL FOR HAIR)
9090 POPJ P, ;CALLER WILL DO OPERATION AND POPJ1 OR OPEN-LOSS
9092 VARCA2: ADD P,[2,,2] ;IMMEDIATE INSTRUCTION MODE. MAKE STACK SAME AS AT VARCAL.
9093 TLNN C,-1 ;E HAS VARIABLE SPEC
9094 MOVSS C ;C GETS INSTRUCTION
9095 PUSHJ P,VARCA3 ;PERFORM THE INSTRUCTION
9096 JRST POP3J1 ;TAKE GOOD RETURN FROM THE CALL
9098 VARCBL: PUSH P,J ;BLOCK MODE. SAVE J WHICH SOME SUSETS CLOBBER
9099 PUSH P,B ;SAVE POINTER TO AOBJN POINTER TO SPEC,INSN PAIR LIST
9100 XCTR XRW,[MOVES B,@(P)] ;GET AOBJN POINTER, TEST WRITEABILITY
9101 VARCB1: UMOVE E,(B) ;GET VARIABLE SPEC
9102 UMOVE C,1(B) ;GET "INSTRUCTION"
9103 MOVE J,-1(P) ;GET DECODED FIRST ARG OR WHATEVER (SOME USRVAR ROUTINES CLOBBER J)
9104 PUSHJ P,VARCA3 ;PERFORM THE INSTRUCTION
9106 XCTR XRW,[ADDB B,@(P)] ;ADVANCE AOBJN POINTER
9107 JUMPL B,VARCB1 ;MORE STUFF TO DO
9108 JRST POP3J1 ;POINTER COUNTED OUT, POP B, J, PUSHJ TO VARCAL
9110 VARCA3: EXCH C,R ;HERE TO PERFORM INSTRUCTION IN C
9112 PUSHJ P,ASCIND ;EVALUATE INSTRUCTION'S EFFECTIVE ADDRESS
9114 LDB B,[410300,,C] ;GET MAJOR PDP10 OPCODE CLASS
9116 VARCBE ;0 UUO ILLEGAL
9117 VARCBE ;1 FP/BYTE ILLEGAL
9118 VARCB2 ;2 MOVE/ADD/SUB
9119 VARCBE ;3 CAM ETC. RESERVED FOR .HANGING IN THE FUTURE
9121 VARCBE ;5 HWT ILLEGAL
9123 VARCBE ;7 IOT ILLEGAL
9125 VARCBE: SUB P,[4,,4] ;POP PUSHJ TO VARCA3, B, J, PUSHJ TO VARCAL
9126 JRST OPNL33 ;BAD ARG
9128 VARCB6: TLNE C,006000 ;TEST INSTRUCTION - SKIP IF NO SKIP
9129 JRST VARCBE ;SKIPPING TESTS RESERVED FOR FUTURE .HANGS
9130 TLNE C,010000 ;SKIP IF IMMEDIATE
9131 XCTR XR,[SKIPA D,(C)]
9133 TLNE C,001000 ;SKIP IF TDX OR TRX
9135 LDB C,[370200,,C] ;GET MODIFICATION TYPE
9136 XCT (C)[JRST VARCBE ;NO MODIFICATION OBVIOUSLY AN ERROR
9137 MOVSI W,(ANDCAM D,) ;TXZ
9138 MOVSI W,(XORM D,) ;TXC
9139 MOVSI W,(IORM D,)] ;TXO
9142 VARCB4: TLNE C,002000 ;BOOLEAN INSTRUCTION - OK IF RESULT TO AC
9144 TLNN C,001000 ;SKIP IF IMMEDIATE
9145 XCTR XR,[SKIPA D,(C)]
9147 HLLZ W,C ;SET UP OPCODE TO HAVE A+M EXCHANGED
9148 TLZ W,003777 ;AND RESULT TO BE SENT TO MEMORY
9152 TLO W,(<002000,,> D,)
9155 VARCB2: SETZB W,D ;MOVE/ADD/SUB GROUP
9158 JRST VARCBB ;SIMPLY READING
9160 JRST VARCBE ;RESULT MUST BE TO AC
9161 TLZ C,(0 17,) ;CHANGE AC FIELD TO D
9163 TLNE C,060000 ;SKIP IF MOVE GROUP
9165 XCTR XR,C ;FETCH OPERAND, DO MODIFICATION IF CALLED FOR (MOVN)
9166 MOVSI W,(MOVEM D,) ;OPERATION WILL BE SIMPLE STORE
9169 VARCB5: TLC C,070000
9171 JRST VARCBE ;NOT ADD/SUB
9172 XCTR XR,C ;ADD TO/SUBTRACT FROM ZERO IN D
9173 MOVSI W,(ADDM D,) ;DROP INTO VARCBA
9175 ;HERE WITH E, W, D ALL SET UP FOR WRITING.
9176 VARCBA: PUSHJ P,@-3(P) ;CALL BACK TO CALLER OF VARCAL
9177 JRST POP4J ;LOST, POP PUSHJ TO VARCA3, B, J, VARCAL, TAKE ERR RETURN
9178 POPJ P, ;WON, RETURN FROM VARCA3
9180 ;HERE WITH E AND W SET UP FOR READING.
9181 VARCBB: PUSH P,C ;SAVE ADDRESS TO BE READ INTO
9182 XCTR XRW,[MOVES (C)] ;NO FAULT. INSURANCE OF WRITEABILITY.
9183 PUSHJ P,@-4(P) ;GET VALUE OF VARIABLE INTO A
9184 JRST POP5J ;LOST POP C, VARCA3, B, J, VARCAL, TAKE ERR RETURN TO USER
9185 POP P,C ;WON, STORE RESULT INTO USER
9187 POPJ P, ;AND RETURN FROM VARCA3
9189 USETBT: 420200,,USETL(E) ;BYTE POINTER TO UENTRY FIELD A
9190 400200,,USETL(E) ; " B
9191 200200,,USETL(E) ; " C
9192 160200,,USETL(E) ; " D
9194 USETRL: 221600,,USETL(E) ;BYTE POINTER TO UENTRY FIELD E
9195 001600,,USETL(E) ; " F
9197 ;IN EACH UENTRY ENTRY: A IS THE METHOD FOR USET READ
9198 ; B IS THE METHOD FOR SUSET READ
9199 ; C IS THE METHOD FOR USET SET
9200 ; D IS THE METHOD FOR SUSET SET
9201 ; E & F ARE USED BY THE METHODS AS LISTED BELOW
9202 ;METHOD 0 = ILLEGAL MODE
9203 ;METHOD 1 = USE F AS RELATIVE LOC OF VAR
9204 ;METHOD 2 = USE E AS ROUTINE TO TRANSFER TO
9205 ;METHOD 3 = USE F AS ROUTINE TO TRANSFER TO
9207 DEFINE UENTRY A,B,C,D,E,F
9209 A_20+B_16+E,,C_20+D_16+F
9211 IFN 777774&<A\B\C\D>,[PRINTX /UENTRY A,B,C,D TOO BIG
9212 /] IFN 740000&<E\F>,[PRINTX /UENTRY E,F TOO BIG
9213 /] IFSE [E!F],[PRINTX /UENTRY E,F NULL
9218 USETL: UENTRY 1,1,2,0,UPCSET,UPC-USRSTG ;.UPC
9219 UENTRY 1,1,1,1,,VALUE-USRSTG ;.VAL
9220 UENTRY 3,3,2,2,USTTY,URTTY ;.TTY
9221 UENTRY 1,1,0,0,,FLSINS-USRSTG ;.FLS
9222 UENTRY 1,1,0,2,UUNAME,UNAME-USRSTG ;.UNAME
9223 UENTRY 1,1,2,2,UJNAME,JNAME-USRSTG ;.JNAME
9224 UENTRY 1,1,2,2,USMASK,MSKST-USRSTG ;.MASK
9225 UENTRY 1,1,2,0,USTOP,USTP-USRSTG ;.USTP
9227 UENTRY 1,1,2,2,USPIRQ,PIRQC-USRSTG ;.PIRQC
9228 UENTRY 2,2,0,0,UGSUPR, ;.INTB
9229 UENTRY 1,1,2,2,USMEMT,HUSRAD-USRSTG ;.MEMT
9230 UENTRY 1,1,0,0,,SV40-USRSTG ;.SV40
9231 REPEAT 2,UENTRY 1,1,2,2,IAPIRQ,PIRQC-USRSTG ;.IPIRQ/.APIRQ
9232 UENTRY 1,1,2,2,USYNST,USYSNM-USRSTG ;.SNAME
9233 UENTRY 1,1,2,2,UPISET,PICLR-USRSTG ;.PICLR
9235 UENTRY 2,2,3,3,URMAR,USMAR ;.MARA
9236 UENTRY 1,1,1,1,,UMARPC-USRSTG ;.MARPC
9237 UENTRY 1,1,0,0,,SUUOH-USRSTG ;.UUOH
9238 UENTRY 2,2,0,0,UINDEX, ;.UIND
9239 UENTRY 1,2,0,0,UTRNTR,UTRNTM-USRSTG ;.RUNT
9240 UENTRY 1,1,2,2,USMSK2,MSKST2-USRSTG ;.MSK2
9241 UENTRY 1,1,2,2,USIFPI,IFPIR-USRSTG ;.IFPIR
9242 UENTRY 1,1,0,0,,APRC-USRSTG ;.APRC
9244 UENTRY 3,3,0,0,,URCNSL ;.CNSL
9245 UENTRY 2,0,3,0,RUTRAP,SUTRAP ;.UTRP
9246 REPEAT 2,UENTRY 1,1,2,2,IAIFPI,IFPIR-USRSTG ;.IIFPI/.AIFPI
9247 REPEAT 2,UENTRY 1,1,2,2,IAMASK,MSKST-USRSTG ;.IMASK/.AMASK
9248 REPEAT 2,UENTRY 1,1,2,2,IAMSK2,MSKST2-USRSTG ;.IMSK2/.AMSK2
9250 UENTRY 3,3,2,2,UJPCS,UJPCR, ;.JPC
9251 UENTRY 2,2,0,0,UROPC, ;.OPC
9252 UENTRY 1,1,1,1,,RTIMER-USRSTG ;.RTMR
9253 UENTRY 1,1,1,1,,HSNAME-USRSTG ;.HSNAME
9254 ;IFN KL10P,UENTRY 1,1,1,1,,ULSPBR-USRSTG ;.LSPBR
9255 ;.ELSE UENTRY 1,1,1,1,,SRN3-USRSTG
9256 UENTRY 2,2,3,3,RUBCHN,SUBCHN, ;.BCHN
9257 UENTRY 2,2,0,0,MPVARD ;.MPVA
9258 REPEAT 2,UENTRY 1,1,2,2,IADF1,IDF1-USRSTG ;.IDF1, .ADF1
9260 REPEAT 2,UENTRY 1,1,2,2,IADF2,IDF2-USRSTG ;.IDF2, .ADF2
9261 UENTRY 1,1,2,2,USDF1,IDF1-USRSTG ;.DF1
9262 UENTRY 1,1,2,2,USDF2,IDF2-USRSTG ;.DF2
9263 UENTRY 1,1,1,1,,OPTION-USRSTG ;.OPTION
9264 UENTRY 1,1,1,1,,40ADDR-USRSTG ;.40ADDR
9265 IFE N11TYS, UENTRY 1,1,1,1,,SRN3-USRSTG ;.TVCREG - JOB'S CONSOLE REGISTER CONTENTS
9266 IFN N11TYS, UENTRY 1,1,1,2,STVCRG,TVCREG-USRSTG
9267 UENTRY 1,1,1,1,,TTSTSV+2-USRSTG ;.TTST
9269 UENTRY 1,1,1,1,,TTSTSV-USRSTG ;.TTS1
9270 UENTRY 1,1,1,1,,TTSTSV+1-USRSTG ;.TTS2
9271 UENTRY 1,1,1,1,,UWHO1-USRSTG ;.WHO1
9272 UENTRY 1,1,1,1,,UWHO2-USRSTG ;.WHO2
9273 UENTRY 1,1,1,1,,UWHO3-USRSTG ;.WHO3
9274 UENTRY 3,3,0,0,,RUSUPP ;.SUPPRO
9275 IFN KA10P, UENTRY 2,2,0,0,URTR1I ;.TR1INS
9276 IFE KA10P, UENTRY 1,1,1,1,,TR1INS-USRSTG
9277 IFN KA10P, UENTRY 2,2,0,0,URTR2I ;.TR2INS
9278 IFE KA10P, UENTRY 1,1,1,1,,TR2INS-USRSTG
9281 REPEAT 4,UENTRY 1,1,0,0,,SRN3-USRSTG
9284 UENTRY 1,0,0,0,,MBOXCT-USRSTG ;.MBOX
9285 UENTRY 1,0,0,0,,MBOXCT+1-USRSTG ;.MBO1
9286 UENTRY 1,0,0,0,,EBOXCT-USRSTG ;.EBOX
9287 UENTRY 1,0,0,0,,EBOXCT+1-USRSTG ;.EBO1
9289 UENTRY 1,1,1,1,,XUNAME-USRSTG ;.XUNAME (USER'S REAL NAME)
9290 UENTRY 1,1,1,1,,XJNAME-USRSTG ;.XJNAME
9291 UENTRY 1,1,1,1,,SRN4-USRSTG ;.FTL1
9292 UENTRY 1,1,1,1,,SRN5-USRSTG ;.FTL2
9293 UENTRY 1,1,1,1,,PAGRAN-USRSTG ;.PAGRANGE
9294 UENTRY 1,1,1,1,,PAGAHD-USRSTG ;.PAGAHEAD
9295 UENTRY 2,2,3,3,URSERV,USSERV ;.SERVER
9297 EXPUNGE UENTRY ;NO MORE UENTRY'S
9299 MXVAL2==.RADIX 2,CONC [.LENGTH/]\MXVAL-1,/ ;BASE 2 LOG OF TABLE SIZE
9301 ;SIXBIT TABLE OF USER VARIABLE NAMES. MUST BE IN CORRECT ORDER,
9304 USETTB: SIXBIT/ADF1/
9371 IFN .-USETTB-MXVAL, .ERR USETTB INCONSISTENT WITH USETL
9372 REPEAT 1_<MXVAL2>-<MXVAL-1>-1, <SETZ>-1 ;PAD TO POWER OF 2 WITH PLUS INFINITY
9374 ;THE FOLLOWING TABLE IS PARALLEL TO USETTB AND GIVES THE NUMERIC USET CODE
9375 ;WHICH SHOULD BE IN THE RANGE 0 - 77 OR 600 AND UP.
9443 IFN .-USETBN-MXVAL, .ERR USETBN INCONSISTENT WITH USETL
9445 ;.CALL USRVAR HACK USER VARIABLES.
9447 ;ARG 2 - AOBJN PNTR FOR BLOCK MODE OR 0,,USER-VAR-NUMBER OR SIXBIT/USER-VAR-NAME/
9448 ;ARG 3 - DATA IF WRITING AND NOT IN BLOCK MODE. (OPTIONAL)
9449 ;ARG 4 - IMMEDIATE INSTRUCTION, OVERRIDES ARG 3. (OPTIONAL)
9450 ;VAL 1 - DATA IF READING AND NOT IN BLOCK MODE
9452 NUSRVA: MOVE J,A ;DECODE FIRST ARG
9453 JSP T,NCORUI ;GET JOB AND LOCK ITS DIELOK
9454 JRST NUSRV0 ;DEFINITELY WRITEABLE
9455 JSP T,NCORWR ;NOT SURE, CHECK FURTHER
9456 TLO J,(SETZ) ;SET WRITE PROTECT BIT
9462 PUSHJ P,NUSRV5 ;DO IT
9464 JRST LSWPJ1 ;WON, UNLOCK DIELOK AND TAKE SUCCESS RETURN
9466 NUSRV5: PUSHJ P,VARCAL ;DECODE ARGS, HACK BLOCK MODE, SET E, W, D.
9467 NUSRV3: SETZB B,I ;ENTER HERE FROM .USET AND .SUSET
9468 TLNN E,-1 ;NOW DECODE USER VARIABLE SPEC
9469 JRST NUSRV1 ;JUMP IF OLD STYLE NUMERIC SPEC
9470 REPEAT MXVAL2,[ ;SIXBIT SPEC LOOK UP IN TABLE
9471 CAML E,USETTB+1_<MXVAL2-.RPCNT-1>(B)
9472 ADDI B,1_<MXVAL2-.RPCNT-1>
9476 JRST OPNL11 ;ILLEGAL USER VARIABLE NAME
9477 MOVE E,USETBN(B) ;TRANSLATE TO NUMERIC SPEC
9478 NUSRV1: JUMPE W,NUSRV2 ;READING
9479 JUMPL J,OPNL31 ;WRITING AND WRITE PROTECTED
9480 MOVEI I,2 ;MAGIC INDEX 1.2=R/W 1.1=OTHER/SELF
9485 AOJE B,PDPPMT ;USER IS PDP6
9491 JRST AUSET2 ;100 TO 577 ARE .IOC, .IOS, .IOP, .PMAP VARS.
9492 NUSRV4: CAIL E,MXVAL ;DETECT USET CODE BEYOND 6XX MAXIMUM.
9494 LDB B,USETBT(I) ;GET METHOD BITS
9495 SOJL B,OPNL12 ;VARIABLE NOT AVAILABLE THIS MODE (WRITE PROTECT?)
9496 SOJL B,AUSVAR ;SIMPLE VARIABLE
9497 LDB B,USETRL(B) ;GET ADDRESS OF ROUTINE TO CALL
9498 HRRZ A,J ;SOME ROUTINES WANT USER INDEX IN A
9502 PUSH P,D ;READ/ALTER/REWRITE
9507 TRZ I,2 ;FIRST READ IT
9510 JRST POP5J ;READ LOST
9517 XCT W ;MODIFY THE VALUE IN A
9520 JRST NUSRV4 ;THEN WRITE IT BACK
9523 ; .SUSET [N,,LOC] ;SAME AS .USET (SEE BELOW) BUT REFERS TO SELF
9525 ASUSET: HRRZ J,U ;JOB TO BE HACKED IS SELF
9526 SETZM UUAC(U) ;IF ERROR, RETURN LOSS IN .IOS+0
9529 ; ;IF N&200000=1, BLOCK MODE
9530 ; .USET CH,[N,,LOC] ;IF N&400000=0, READS USER VAR SPECIFIED BY REST OF N
9531 ; FOR INFERIOR OR FOREIGN USER OPEN ON CHANNEL CH
9532 ; INTO USER LOCATION LOC
9533 ;IF N&400000.NE.0, SETS USER VAR SPECIFIED BY REST OF N
9534 ; FOR DIRECTLY INFERIOR USER OPEN ON CHANNEL CH
9535 ; FROM USER LOCATION LOC
9536 AUSET: MOVE J,R ;DECODE AC FIELD AS CHANNEL NUMBER
9538 JRST IOCER7 ;USR OP CHNL DOES NOT HAVE USR OPEN
9539 AUSET0: XCTR XR,[HRRZ B,(C)] ;GET ADDRESS READING INTO OR WRITING FROM
9540 XCTR XR,[HLRZ E,(C)] ;GET VARIABLE AND DIRECTION
9542 JRST ABUSET ;BLOCK MODE
9544 JRST AUSET1 ;JUMP IF READING
9545 JUMPL J,IOCER7 ;WRITE PROTECT VIOLATION
9546 MOVSI W,(MOVEM D,) ;FLAG WRITING
9547 UMOVE D,(B) ;GET DATA TO WRITE
9548 PUSHJ P,NUSRV3 ;DO THE WRITE
9553 ABUSET: TRNE E,400000
9554 TLOE J,(MOVE) ;SET BLOCK BIT
9555 JRST ILUUO ;BLOCK IN BLOCK LOSES
9556 UMOVE Q,(C) ;GET AOBJN PTR AGAIN
9557 ABUST2: UMOVEM Q,(C) ;STORE AWAY UPDATED POINTER
9568 AUSET1: MOVEI W,0 ;FLAG READING
9569 XCTR XRW,[MOVES (B)] ;ENSURE WRITEABILITY
9571 PUSHJ P,NUSRV3 ;GET VALUE OF VARIABLE INTO A
9574 APTUAJ: UMOVEM A,(J)
9577 ;DECODE ARG FOR USET
9578 AUSETJ: JSP T,NCRUI2
9584 AUSVAR: LDB C,USETRL+1 ;GET ADDRESS OF VARIABLE
9593 PDPPMT: MOVEI A,%JSSIX#%JSNUM ;PDP6 HAS ONLY A FEW VARIABLES, WHICH ARE READ-ONLY
9596 MOVEI A,LPDP6M*2000 ;FIXED MEM BOUND FOR PDP-6
9599 JRST POPJ1 ;IGNORE OTHER VARIABLES
9602 ;VARIABLES 100 - 577 (.IOC, .IOS, .IOP, .PMAP)
9603 AUSET2: JUMPN W,OPNL31 ;JUMP IF TRYING TO WRITE
9606 JRST AUSET4 ;>140=>.RIOP+M
9608 JRST AUSET3 ;117<E<140=>.RIOS+M
9609 ADDI E,IOCHNM(J) ;77<E<120=>.RIOC+M
9610 AUSETX: MOVE A,(E) ;GET VAR
9613 AUSET3: MOVE R,J ;INFERIOR USER INDEX
9614 ADDI R,IOCHNM(E) ;GET CHANNEL POINTER
9616 JRST NSTATUS ;DO A .CALL STATUS
9618 AUSET4: CAIL E,40+LUIOP ;COMPARE AGAINST LAST IO PDL LOC
9619 JRST AUSET5 ;READ MAP ENTRY
9620 ADDI E,SIOCHN-40(J) ;MAKE UP POINTER TO VAR
9623 ;USET VARIABLE 200+N -- READ MAP VARIABLE FOR PAGE N.
9624 ; (0 <= N < 400) E CONTAINS N+100.
9626 ;VALUE OF MAP WORD READ:
9628 ;4.9 - PAGE WRITEABLE.
9629 ;4.8 - PAGE EXISTS (IF THIS OFF, WHOLE WORD IS 0)
9630 ;4.7 - PAGE IS IN CORE.
9631 ;4.6 - PAGE IS PUBLIC (ANYONE CAN WRITE IT)
9633 ;3.1 - 3.9 - # TIMES PAGE SHARED (LIKE CORTYP'S 4TH VALUE'S RH)
9634 ;2.1 - 2.9 - ABS PAGE # OR PAGE # IN NEXT SHARER
9635 ; (LIKE CORTYP'S 3RD VALUE)
9636 ;1.1 - 1.9 - 0 => ABS PAGE (OR NO PAGE, OF COURSE)
9637 ; -1 => UNSHARED PAGE,
9638 ; ELSE USR NUM. OF NEXT SHARER.
9643 CIRPSW ;DON'T LET PAGE TABLES CHANGE.
9644 MOVEI A,-100(E) ;PAGE NUMBER IN JOB.
9646 PUSHJ P,NCORT0 ;PUT CORTYP'S VALUES IN A THRU D.
9648 PUSHJ P,LSWPOP ;FREE CIRPSW.
9649 ANDI B,777 ;CORTYP'S 2ND VALUE IN 1.1 - 1.9
9650 DPB C,[111100,,B] ;3RD VALUE IN 2.1 - 2.9
9651 TLO B,(D) ;4TH VALUE RH INTO 3.1-3.9
9653 TLO B,(D) ;4TH VAL BITS 4.8-4.9 INTO 4.6-4.7
9654 IOR A,B ;TOGETHER WITH 1ST VALUE'S 4.8, 4.9.
9657 USTOP: AOS (P) ;GOING TO WIN
9658 JUMPN D,1USTOP ;NONZERO VALUE => STOP THE JOB.
9659 MOVE B,APRC(A) ;ZERO => START.
9660 TLNE B,BULGOS ;BUT DON'T EVER START A JOB THAT'S BEING KILLED.
9664 1USTOP: MOVNI D,1 ;SET TO STOP
9665 1USTRT: PUSHJ P,RPCLSR ;STOP USER IN A
9666 DPB D,[.BP BUSRC_22,USTP(A)] ;BUSRC
9675 UPCSET: PUSHJ P,RPCLSR ;STOP USER IN USER MODE
9676 TLO D,%PCUSR ;BE SURE USER MODE IS ON IN NEW PC
9677 TLZ D,BADPC ;BE SURE PRIVILEGED BITS ARE OFF
9678 SKIPGE IOTLSR(A) ;SKIP UNLESS USER IS SUPPOSED TO BE IN IOT-USER MODE
9679 TLO D,%PCUIO ;TURN ON IOT-USER MODE
9680 MOVEM D,UPC(A) ;SET PC
9681 PUSHJ P,UPCLSR ;RESTART
9684 UJPCS: CAIN U,(A) ;SET .JPC, WITH CARE IF SETTING OWN
9691 UJPCR: CAIN U,(A) ;READ .JPC:
9692 SPM UPGML(U) ;IF READING ONE'S OWN, MAKE SURE IT'S UP TO DATE.
9697 UROPC: HLLZ A,UPOPC(J)
9702 IFE KA10P, UROPC: JRST OPNL12 ;.OPC NOT SUPPORTED ON KL AND KS ((CAN'T
9703 ; USE == DUE TO FWD REF))
9705 IFN N11TYS,[ ;SET OWN TV CONSOLE REGISTER
9706 STVCRG: MOVEM D,TVCREG(U) ;ENABLE TVCREG TO BE SWAPPED IN AND OUT OF HARDWARE
9707 JUMPL D,POPJ1 ;IF TURNING ON; OR, IF TURNING OFF, ALL DONE
9708 SKIPGE TT11P ;ALLOWED TO TOUCH HARDWARE?
9711 MOVEM D,400000+TTR10*2000 ;UPDATE REG IN HARDWARE
9712 MOVEM D,TVCREG(U) ;AND UPDATE AGAIN IN SOFTWARE IN CASE CLOBBERED AT SSTVR2
9716 IFE KS10P,[ ; KS10 doesn't have a MAR and it never will...
9719 URMAR: MOVE A,UPMAR(J)
9720 IFN KA10P, TLZ A,777770
9721 IFN KL10P, LDB B,[270400,,A]
9722 IFN KL10P, HRL A,MARPTB(B)
9726 USMAR: CONO PI,CLKOFF ;TURN OFF CLOCK INTERRUPTS
9728 SPM UPGML(J) ;STORE PG VARIABLES IF HACKING CURRENT USER
9731 TLO D,4 ;SET USER MODE
9739 LPMR UPGML(J) ;USE LPMR BECAUSE KL10 DOESN'T HAVE VANILLA LPM
9742 IFN KL10P,[ ;MAR PERMUTATION TABLE. MAYBE CAN DO BETTER???? *****
9744 MARPTB: 0 1, 0 ;OFF ;NONE (EXEC)
9745 0 11, 0 ;FETCH ;NONE (USER)
9746 0 3, 2 ;WRITE ;WRITE(EXEC)
9747 0 17, 6 ;ANY ;WRITE (USER)
9748 0 1, 10 ;OFF ;READ (EXEC)
9749 0 11, 14 ;FETCH ;READ (USER)
9750 0 3, 12 ;WRITE ;NOT FETCH (EXEC)
9751 0 17, 16 ;ANY ;NOT FETCH (USER)
9752 0 5, 1 ;READ ;FETCH (EXEC)
9753 0 15, 5 ;READ+FETCH ;FETCH (USER)
9754 0 7, 13 ;NOT FETCH ;NOT READ (EXEC)
9755 0 13, 17 ;NOT READ ;NOT READ (USER)
9756 0 5, 11 ;READ ;READ+FETCH (EXEC)
9757 0 15, 15 ;READ+FETCH ;READ+FETCH (USER)
9758 0 7, 3 ;NOT FETCH ;ANY (EXEC)
9759 0 13, 7 ;NOT READ ;ANY (USER)
9768 RUSUPP: HRRE A,SUPPRO(J) ;READ SUPERIOR'S USER INDEX
9769 JUMPL A,POPJ1 ;-1 => TOP LEVEL
9770 UINDEX: IDIVI A,LUBLK ;GET INDEX NUMBER
9771 JRST POPJ1 ;GIVE TO USER
9774 UTRNTR: CONO PI,CLKOFF
9777 LDB A,[2300,,UPQUAN(U)]
9778 LSH A,-2 ;SIMULATE 4.069 USEC CLOCK
9781 SKIPL MTRUSR ;SKIP IF PERFORMANCE METER AVAILABLE
9782 JRST [ RMBOXC A ;REQUIRES AC ORDER - A,B,C,D,E
9784 DMUL A,KLMBCC ;BECAUSE DMUL PRODUCES FOUR WORD RESULT
9798 LDB A,[400400,,UPQUAN(U)] ; 3.9 USEC CLOCK
9803 ;SET JOB'S TTYTBL (.TTY VARIABLE).
9804 USTTY: CONO PI,CLKOFF ;PREVENT TIMING ERROR.
9805 HLLZ E,TTYTBL(J) ;GET CURRENT VALUE
9806 XOR E,D ;GET WHICH BITS USER WANTS TO CHANGE
9807 AND E,[%TBNVR+%TBINT+%TBWAT+%TBOUT+%TBINF+%TBIIN+%TBOIG,,] ;GET BITS USER IS ALLOWED TO CHANGE
9809 TLZ E,%TBWAT ;THESE BITS CAN BE ALTERED ONLY BY THE SUPERIOR
9810 XORM E,TTYTBL(J) ;ALTER THE USER-CONTROLLED BITS WITHOUT WRITING THE OTHERS.
9813 ;READ JOB'S TTYTBL (.TTY) VARIABLE
9814 URTTY: CONO PI,CLKOFF
9821 ;READ JOB'S .CNSL VARIABLE - TTY# OF TREE'S CONSOLE
9822 URCNSL: MOVE A,UTMPTR(J)
9825 SUBI A,NCT+2 ;DISOWNED -1 SYS -2
9828 UJNAME: JUMPE D,OPNL33 ;SET INFERIOR'S JNAME
9829 CAME D,[SIXBIT/PDP6/]
9830 CAMN D,[SIXBIT/PDP10/]
9831 JRST OPNL33 ;CHANGING TO ILLEGAL NAME
9835 PUSHJ P,UJNAMU ;IS NEW JNAME UNIQUE?
9837 MOVEM D,JNAME(A) ;YES
9842 UJNAMU: MOVE B,UNAME(A)
9845 UJNAM1: CAME B,UNAME(E)
9849 UJNAMF: ADDI E,LUBLK
9854 UJNAMG: PUSHJ P,UPCLSR
9856 JRST OPNL13 ;DUPLICATE NAME
9857 JRST CLKOJ1 ;WASN'T REALLY CHANGING THE NAME
9859 UUNAME: HLRE I,D ;SET OWN UNAME
9860 AOJE I,OPNL33 ;CHECK FOR ILLEGAL ___nnn UNAME
9862 UJNAMS: SETO I, ;SET OWN JNAME
9863 JUMPE D,OPNL33 ;CHECK FOR EVIL NAMES
9865 BUG ;SOMETHING SCREWED
9867 JRST OPNL40 ;MUST BE TOP LEVEL
9868 CONO PI,CLKOFF ;TURN CLOCK OFF NOW SO WE DON'T GET REOWNED OR SOMETHING
9870 SKIPA C,JNAME(U) ;CHANGING UNAME, KEEPING JNAME
9871 SKIPA C,UNAME(U) ;VICE VERSA
9872 EXCH D,C ;NOW C=UNAME, D=JNAME
9873 MOVEI E,0 ;CHECK FOR DUPLICATE NAMES
9874 UUNAM0: SKIPE UNAME(E)
9875 CAMN E,U ;ALLOW SETTING TO SAME NAME AS BEFORE
9880 CAMN A,I ;JOB CAN'T HAVE INFERIORS IF SETTING UNAME
9881 JRST OPNL13 ;OR DUPLICATE U-JNAME IF SETTING EITHER
9882 UUNAM1: ADDI E,LUBLK
9887 SKIPA A,D ;D GETS CLOBBERED
9888 JRST CLKOJ1 ;THE NAMES WEREN'T ACTUALLY CHANGED! (SYNCOM DOES IT).
9889 CAME C,UNAME(U) ;IF NOT LOGGED IN, AND CHANGING UNAME,
9890 SKIPGE TTYTBL(U) ; AND CONSOLE-CONTROLLED,
9894 AOS SUSRS ;DISGUST! SHOULD BE USING LOGIN
9895 UUNAM2: HRRZ T,TTYTBL(U)
9896 HRLI T,[ASCIZ / CHUNAM /]
9897 PUSHJ P,SGWAIT ;REQUEST SYSTEM JOB TO PRINT OUR MSG
9898 MOVEM C,SLGIV+2 ;INCLUDE NEW UNAME AS SECOND NAME
9899 UUNAM3: PUSHJ P,LOGUPD ;CHARGE OLD NAME FOR USAGE SO FAR
9900 MOVEM C,UNAME(U) ;THEN SWITCH NAMES
9902 PUSHJ P,DMNPLI ;LOG BACK IN UNDER NEW NAMES
9905 ;WAIT FOR SLGIV VARIABLES TO BECOME FREE, AND REQUEST THE
9906 ;SYSTEM JOB TO PROCESS THEM. TAKES STRING,,TTY IN T, AND
9907 ;PLACES UNAME(U) IN SLGIV, AND T INTO SLGIV+1. THE CALLER
9908 ;IS RESPONSIBLE FOR FILLING IN SLGIV+2
9911 MOVSI T,SCLLGI ;SOMEBODY ELSE IS USING THOSE VARIABLES
9912 PUSHJ P,CWAIT ;WAIT FOR THE SYSTEM JOB TO FINISH WITH
9913 TDNE T,SUPCOR ;THEM.
9914 IORM T,SUPCOR ;REQUEST THE SYSTEM JOB TO PRINT OUR MSG
9915 POP P,SLGIV+1 ;STRING,,TTY #
9916 MOVE T,UNAME(U) ;STORE AWAY THE UNAME
9920 RUTRAP: LDB A,[430100,,UTRAPM(J)] ;GET SPECIAL TRAP MODE INDICATOR
9923 SUTRAP: DPB D,[430100,,UTRAPM(J)] ;SET " " " "
9927 URTR1I: SKIPA A,[0,,%PIARO] ;READ "TRAP 1 INSTRUCTION" FOR KA-10
9928 URTR2I: MOVEI A,%PIPDL ;TRAP 2
9942 MOVEM A,SRN5(U) ;ARGUMENT TO NCORFS
9944 NCORFS ;CLEARS BSSTP IN USTP(A).
9951 ;SET SYSTEM NAME (ZERO IGNORED)
9956 ;SET INFERIOR'S INTERRUPT MASK
9957 USMASK: SKIPA E,[2] ;MOVEM
9958 IAMASK: ANDI E,1 ;ANDCAM OR IORM
9959 ANDCM D,[VBDBTS] ;BITS FOR CLASS 1 INTS CAN'T BE CHANGED.
9960 XCT (E)[ IORB D,MSKST(A)
9964 MOVEI B,440+APRCHN ;NOW UPDATE JOB'S APRC VARIABLE.
9973 IFE KA10P, PUSHJ P,TRINST
9977 ;SET THE AROV AND PDLOV TRAP INSNS ACCORDING TO WHETHER THE
9978 ;INTERRUPTS ARE ENABLED; BUT DON'T OVERRIDE AN EXPLICIT SPECIFICATION
9979 ;BY THE USER, WHICH IS ANYTHING OTHER THAN 0 OR (CAI) IN THE LH.
9981 TRINST: MOVE D,MSKST(A)
9982 MOVSI B,(CAI) ;CAI IS FASTER THAN JFCL - NO AC DECODE
9983 TDNE D,[%PIFOV+%PIARO] ;AND OVERFLOW GOES OFF A LOT
9989 ; MOVSI B,(CAI) ;THESE LINES COMMENTED OUT TO MAKE
9990 ; TRNE D,%PIPDL ; PDL OVERFLOW CLASS 2 INSTEAD OF CLASS 3
9999 ;SET INFERIOR'S PI IN PROGRESS FLAG
10000 UPISET: ASH D,-35. ;SHIFT SIGN BIT TO BOTTOM BIT
10001 MOVEM D,PICLR(A) ;SET VARIABLE
10002 ;COME HERE WHEN ANY INTERRUPT VARIABLE'S VALUE IS CHANGED
10003 ;BY A .USET OR .SUSET; TAKE ANY INTS THAT ARE NOW PENDING.
10004 UPISE1: HRRZ A,J ;IAMASK, ETC. MODIFY A. RESTORE IT.
10005 AOS (P) ;GOING TO WIN
10006 TRNN I,1 ;SKIP IF A SUSET
10008 JRST APISE1 ;SEE IF SHOULD REINTERRUPT
10010 IAMSK2: ADDI A,MSKST2-IDF1
10011 IADF1: ADDI A,IDF1-IDF2
10012 IADF2: ADDI A,IDF2-PIRQC ;IORM OR ANDCAM INTO IDF2.
10013 IAPIRQ: ADDI A,PIRQC-IFPIR
10014 IAIFPI: ANDI E,1 ;GET USET PARITY (0=IORM, 1=ANDCAM)
10015 XCT IAINS(E) ;DO APPRO OP
10018 IAINS: IORB D,IFPIR(A) ;SET BITS
10019 ANDCAB D,IFPIR(A) ;FLUSH BITS
10021 USMSK2: ADDI A,MSKST2-IDF1 ;SET .MSK2, ETC.
10022 USDF1: ADDI A,IDF1-IDF2
10023 USDF2: ADDI A,IDF2-PIRQC
10024 USPIRQ: ADDI A,PIRQC-IFPIR
10025 USIFPI: MOVEM D,IFPIR(A)
10028 ;.RBCHN, .SBCHN READ/SET NUMBER OF LAST CHANNEL ON WHICH ERROR OCCURRED
10029 RUBCHN: LDB A,[BCHPTR#(A#U)]
10032 SUBCHN: DPB D,[BCHPTR#(A#U)]
10036 UGSUPR: HLLZ A,SUPPRO(J)
10039 ;SAVE AWAY MA (HIGH BITS) ON LAST MPV OR WIRO
10040 ;CALLED FROM CLKBRK, DONT CLOBBER A OR D
10045 LSH T,10. ;HIGH BITS ONLY ON KA
10047 IFE KA10P, HRRZ T,UPFW(U)
10051 ;.RMPVA READ VIRTURAL PAGE # (8 BITS) OF LAST MPV OR WIRO
10053 MPVARD: HRRZ A,IOTLSR(J)
10056 ;.RSERVER Read server user number, or -1 if none.
10057 URSERV: SKIPL A,SERVER(J)
10061 ;.SSERVER Set server user number, or clear if negative.
10062 ; (To prevent timing screws, you should really use the SSERVE call to set
10063 ; this variable, but for debugging convenience...)
10064 USSERV: IMULI D,LUBLK
10070 SUBTTL USER INSTRUCTION HANG ROUTINE (.HANG)
10072 ; .HANG was rewritten by Alan Feb 87:
10074 ; The general theory is that .HANG should behave -exactly- like JRST .-1 as
10075 ; much as possible. Thus, it is considered to make sense to put any
10076 ; skipping or jumping instruction before a .HANG. We are always careful to
10077 ; return from the .HANG by jumping to the previous instruction, so any side
10078 ; effects (such as clearing bits or incrementing accumulators or memory) are
10079 ; always performed, and jumps will be correctly taken.
10081 ; There are two ways to leave a .HANG, either the job can get PCLSR'ed, or
10082 ; the awaited condition can become true. We arrange for -both- cases to
10083 ; return the job to the previous instruction by SOSing UUOH -once- before
10084 ; calling UFLS, and once more if UFLS returns.
10086 ; As an additional feature, .HANG with a non-zero accumulator behaves like
10087 ; the disjunction of ordinary .HANG and .SLEEP, allowing the user to do a
10088 ; timeout. The accumulator should initially contain an argument, as for
10089 ; .SLEEP, that indicates when .HANG should timeout. In that case only,
10090 ; .HANG returns to the following instruction and the designated accumulator
10091 ; will contain zero. If such a .HANG is interrupted, or if it returns
10092 ; because the awaited condition is now true, that accumulator will contain
10093 ; the correct negative number indicating the absolute time it would have
10096 ; Accepted instructions are:
10097 ; Any CAI, CAM, JUMP, SKIP, AOJ, AOS, SOJ, or SOS class instruction.
10098 ; Any test instruction.
10100 ; JFCL with 0 in the AC field.
10101 ; Or an XCT that eventually fetches one of the above.
10103 ; As special cases SKIPA 0, and CAIA 0, are taken to request a schedule,
10104 ; and JFCL 0, and SKIP 0, set %SWDSO.
10106 ; As before, it is a limitation that changes to memory referenced by .HANG
10107 ; when computing effective addresses and fetching XCT'ed instructions will
10108 ; not cause the job to wake up. But how could it be otherwise? Changes to
10109 ; the accumulators will of course cause the job to be PCLSR'ed.
10112 UMOVE R,-2(R) ; Get user's flush instruction
10113 HRLOI A,377777 ; A: most positive fixnum
10114 JUMPE J,AHANG2 ; No AC => timeout when hell freezes over
10115 XCTR XR,[MOVN A,(J)] ; A: argument as for .SLEEP
10116 JUMPG A,AHANG2 ; 'twas already neg., so wait 'til then
10117 SUB A,TIME ; else compute time
10118 UMOVEM A,(J) ; store back negative for PCLSRing
10119 MOVN A,A ; A: time to wait for
10120 AHANG2: PUSHJ P,ASCIND ; Compute E for instruction
10121 HLRZ C,R ; C: Opcode and AC
10124 JRST AHANGI ; User might be waiting for a while
10127 JRST AHANGF ; User is just trying to cause a schedule
10128 LSH C,-9 ; C: 9-bit opcode
10130 JRST AHANG1 ; XCT - Go loop
10132 JRST AHANGO ; JFFO is like JUMPN
10133 LSH C,-6 ; C: First 3 bits of opcode
10135 JRST AHANGC ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS
10138 IFN KS10P, JRST ILUUO
10140 ;CODE TO ALLOW CONSO, CONSZ AS .HANG INSTRUCTIONS
10141 HLRZ C,R ;CHECK FOR CONSO, CONSZ
10143 LDB B,[320700,,R] ;GET DEVICE CODE/4
10146 CAIE C,(CONSZ\CONSO)
10147 JRST ILUUO ;UNRECOGNIZED INSTRUCTION, OR USER CONI NOT
10156 AHANG9: XCT EPDL(U)
10164 AHANG1: PUSHJ P,OPBRK ; Don't let "XCT ." hang you up
10165 UMOVE R,(R) ; Get new instruction
10166 JRST AHANG2 ; And start over
10168 ; CAI, CAM, JUMP, SKIP, AOJ, SOJ, AOS, SOS ? .HANG
10169 AHANGC: TLNN R,040000
10170 JRST AHANG3 ; CAI, CAM, JUMP, SKIP
10172 JRST AHANGJ ; AOJ, SOJ
10174 SKIPA T,[-1] ; AOS: Compare with -1
10175 MOVEI T,1 ; SOS: Compare with 1
10176 TLZ R,770777 ; Clear all but last 3 bits of opcode
10177 TLO R,(CAM T,) ; Build a CAM instruction
10178 TLNE R,001000 ; With the opposite sense
10182 AHANG3: TLNN R,020000
10183 JRST AHANG4 ; CAI, CAM
10186 TLZ R,(0 17,) ; SKIP
10190 AHANGO: TLC R,(JFFO#JUMPN)
10191 AHANGJ: HRRI R,AHANGX
10194 ; SKIPA ? .HANG -- just flush once (ignores timeout)
10200 ; JFCL ? .HANG -- hang infinitely (or until timeout)
10201 AHANGI: MOVE B,TIME
10202 ADDI B,60.*30. ; If sleeping for more than a minute
10203 MOVSI C,%SWDSO ; Desire swap out
10204 CAML A,B ; (just like .SLEEP)
10213 AHANGT: TLZ R,060000 ; Make opcode be TRN or TDN series
10214 TLNE R,010000 ; If TRN, only AC matters
10215 JRST AHANGB ; TDN: Both AC and memory matter
10216 ; Wait for something that only references the user's accumulators.
10217 ; (Instruction in R might be some kind of jump to AHANGX.)
10218 AHANGA: PUSHJ P,AHANGG ; Get contents of user's AC into T
10220 XCT R ; Must try it once to prevent timing screw
10221 JRST AHANG5 ; OK, wait forever for PCLSR
10224 AHANG4: TLNN R,010000 ; If CAM, both AC and memory matter
10225 JRST AHANGA ; CAI: Only AC matters
10226 ; Wait for something that references memory.
10227 ; (Instruction in R better not be a jump!)
10228 AHANGB: PUSHJ P,AHANGG ; Get contents of user's AC into T
10229 AHANGM: MOVEM R,EPDL(U)
10231 TRNE R,-20 ; Memory reference really only AC?
10232 JRST AHANG6 ; No, real memory, go wait
10233 XCTR XRW,R ; Must try it once to prevent timing screw
10234 JRST AHANG5 ; OK, wait forever for PCLSR
10238 AHANG6: PUSHJ P,UFLS
10239 AHANGX: ;; Everyone exits here after SOSing UUOH once (before hanging).
10240 ;; Thus we always exit to the previous instruction (just like being
10241 ;; PCLSRed), unless we timeout instead.
10242 CAMGE A,TIME ; Timeout?
10247 AHANGY: XCTR XW,[SETZM (J)] ; Let user know we timed out
10248 AOS UUOH ; And fall through instead of backing out
10251 ;.HANG flush instruction routine, called with PUSHJ only on clock level
10254 MOVEI TT,0 ; Save MAR word
10255 EXCH TT,UPMAR(U) ; so will not MAR
10257 MOVEM TT,UPMAR(U) ; Restore MAR
10259 IFN KS10P, LPMR UPGML(U)
10263 AOS (P) ; Might be because location swapped out or
10264 POPJ P, ; missing, but that's OK because we always
10265 ; exit to the previous instruction!
10267 ; Kind of like ASCIND for the accumulators...
10268 AHANGG: LDB T,[270400,,R]
10269 UMOVE T,(T) ; Get contents of AC from user
10270 TLZ R,(0 17,) ; Clear out AC field in instruction
10271 TLO R,(0 T,) ; Replace AC field with T
10274 ; Allow interrupt if being PCLSRed
10277 CAMN T,[JRST ONEFLS]
10282 SUBTTL .OPEN AND FRIENDS
10285 ;.FDELE FILBLK ;DELETE OR RENAME FILE SPECIFIED AT FILBLK
10287 AFDELE: SETZM UUAC(U)
10288 UMOVE A,(C) ;GET DEVICE
10290 DPB W,[OPNCOM,,A] ;SET OP TO SPECIFY AN .FDELE
10293 ;OPEN SET UP AND DISPATCH
10294 ;3.1=0 => INPUT =1 OUTPUT
10295 ;3.2=0 => UNITS =1 BLOCK
10296 ;3.3=0 => ASCII =1 IMAGE
10297 ;4.9-4.7 OPERATION FIELD
10298 ; 0=> NORMAL READ OR WRITE
10299 ; 1=> WRITE OVER MODE
10301 ; 4=> DELETE OR RENAME (INTERNAL)
10303 ;.OPEN CH,FILBLK ;OPEN FILE SPECIFIED AT FILBLK ON LOGICAL CHANNEL CH
10305 AOPEN: ;C HAS EFF ADR OF UUO AND R ITS AC FIELD
10306 ADDI R,IOCHNM(U) ;MAKE R POINT TO SPECIFIED I/O CHANNEL WORD
10308 PUSHJ P,ACLOSE ;CLOSE PREV
10310 UMOVE A,(C) ;GET DEV AND MODE BITS
10313 JRST OPNL23 ;BARF IF TRY TO DELETE WITH .OPEN
10314 AFDEL1: MOVEI TT,SRN3(U) ;MOVE 4TH-6HT ARGS
10315 HRLI TT,3(C) ;TO SRN3 THRU SRN5
10317 XCTR XBR,[BLT TT,-1(Q)]
10318 UMOVE B,1(C) ;GET 2ND, 3RG ARGS (FILENAMES)
10320 MOVE D,USYSNM(U) ;USE DEFAULT SNAME.
10321 HLRZ E,A ;GET MODE BITS.
10322 HRLZI A,(A) ;LEFT-JUSTIFY DEVICE NAME.
10325 NOPNE: CAIN W,4 ;SKIP ON NOT .FDELE (ENTRY FOR NCALL TYPE OPEN, ETC COMMANDS)
10326 SKIPN SRN3(U) ;SKIP ON RENAME
10327 JRST AOPEN3 ;JUMP IF A .OPEN OR DELETING .FDELE
10328 JUMPN B,AOPEN3 ;JUMP UNLESS RENAME WHILE OPEN.
10329 MOVE TT,C ;GET CH ON WHICH FILE IS SUPPOSIDLY OPEN
10330 TDNE TT,[-NIOCHN] ;SKIP IF CH LOGICALLY LESS THAN 20
10331 JRST OPNL14 ;BAD CHANNEL NUM
10332 ADDI TT,IOCHNM(U) ;RELOCATE TO POINT TO CH WORD FOR USER
10333 MOVE Q,(TT) ;GET CH WORD
10334 JUMPE Q,OPNL44 ;CHNL NOT OPEN
10335 HLRZ Q,CLSTB(Q) ;GET LEFT HALF OF CLOSE TABLE ENTRY FOR INDEX IN I/O CH WORD
10336 TRNE Q,%CLSJI\%CLSJO
10337 JRST JFDEL4 ;JOB DEVICE CHNL
10338 TRNN Q,%CLSDO\%CLSQ ;SKIP IF A DIRECTORY DEVICE
10339 JRST POPJ1 ;JUMP IF NOT DIRECTORY DEVICE
10340 HLRZ J,(TT) ;PICK UP DEV CHNL NO
10341 EXCH A,B ;PUT FN1, FN2 IN A, B.
10344 TRNN Q,%CLSDO ;SKIP IF DEC TAPE
10346 MOVSI C,'UT0 ;GET DUMMY UT DEV NAME.
10347 HRRZ I,UTTNO(J) ;GET POSSIBLE (?) TAPE NUM
10348 TLO C,(I) ;STORE IN DEV NAME
10349 MOVE TT,DVAUT ;WILL EXIT TO UTAPE OPEN RTN.
10353 MOVSI C,'DSK ;NOT UT, MUST BE DSK.
10354 MOVE TT,DVAQSK ;NOBODY ELSE HANDLES RENAME WHILE OPEN.
10357 AOPEN3: PUSHJ P,TRAN ;PERFORM I/O TRANSLATIONS
10358 JRST OPNL3 ;TOO MANY TRANSLATIONS.
10359 MOVEM D,USYSN1(U);SAVE TRAN'D SNAME FOR OPEN RTN.
10360 PUSH P,A ;PUT NAMES ON STACK.
10363 MOVSI B,-NDEVS ;LOAD LENGTH OF FIRST DEV NAME TABLE
10364 CAME A,DEVTAB(B);SEARCH FIRST DEV NAME TABLE
10365 AOBJN B,.-1 ;LOOP TILL FOUND OR COUNTED OUT
10366 JUMPG B,OPEN1 ;JUMP IF NOT FOUND
10367 OPEN2: MOVE TT,DEVADR(B) ;LOAD BITS,,OPEN-ROUTINE-ADDRESS
10368 OPEN21: POP P,B ;UNSAVE SECOND FILE NAME
10369 POP P,A ;UNSAVE FIRST FILE NAME
10370 POP P,C ;UNSAVE DEVICE NAME
10372 JRST [ TLNN TT,%DVDEL
10373 JRST OPNL34 ;DEVICE DOES NOT ALLOW DELETE
10376 JRST [ TLNN TT,%DVLNK
10377 JRST OPNL34 ;DEVICE DOES NOT ALLOW LINK
10379 OPEN2B: HRRZ D,E ;MODE BITS
10380 EXCH E,C ;SAVE DEVICE IN E
10381 HLL C,E ;SET UP OLD-STYLE C: MODE,,DEV
10384 ;AT THIS POINT: A & B HAVE FILE NAMES, C HAS MAPPED DEV AND MODE BITS, D HAS MODE BITS,
10385 ;W HAS OPEN COMMAND, E HAS DEVICE NAME, TT HAS DEVADR WORD (BITS,,ROUTINE)
10387 ROT D,-1 ;ROTATE IN/OUT BIT TO SIGN
10388 CAIN W,4 ;SKIP IF NOT A .FDELE
10389 TDZ D,[400000,,7] ;A .FDELE, MAKE LOOK LIKE OPEN FOR READ
10391 JRST OPEN2D ;NORMAL OPEN
10392 JUMPL D,OPNL2 ;WRITING DIRECTORY?
10393 JUMPN W,OPNL12 ;DELETING, RENAMING, LINKING, WRITING OVER DIRECTORY?
10395 JRST (TT) ;OPEN DEVICE FOR DIRECTORY
10396 ;ASKING FOR DIR OF DEVICE SYSTEM DOESN'T HAVE DIR ROUTINE FOR.
10397 ;PASS IT OFF TO THE UNKNOWN-DEVICE HANDLER.
10398 PUSH P,E ;PUSH DEVICE NAME
10401 HLRZ E,C ;GET MODE BITS
10402 JRST OPEN22 ;PASS TO UNKNOWN DEVICE JOB
10404 OPEN2D: TLNE TT,%DVIN
10405 JUMPGE D,(TT) ;OPENING FOR INPUT AND DEVICE CAN DO INPUT
10407 JUMPL D,(TT) ;OPENING FOR OUTPUT AND DEVICE CAN DO OUTPUT
10408 JRST OPNL2 ;DEVICE DOESN'T GO THAT DIRECTION
10410 ;CHECK FOR NUMBERED DEV
10411 OPEN1: MOVE B,[-NDV1,,DVT1-DEVTAB] ;LOAD AOBJN POINTER WITH COUNT FOR 2ND DEV TABLE
10412 OPEN1A: MOVEI I,0 ;INITIALIZE NUMBERED DEV NUM TO ZERO
10413 MOVE D,[440600,,-2(P)] ;GET BYTE POINTER INTO DEV REQUESTED
10414 MOVE C,[440600,,DEVTAB(B)] ;GET BYTE POINTER INTO CURRENT TABLE ENTRY
10415 OPENA1: ILDB A,C ;GET CHAR FROM TABLE
10416 ILDB J,D ;GET CHAR FROM DEV
10417 JUMPE A,OPEN1B ;JUMP ON SPACE IN TABLE, "MATCHES" DIGIT IN DEV
10418 CAIN A,(J) ;SKIP IF CHAR DIFFER
10419 JRST OPEN1C ;SAME, TRY FOR NEXT CHAR
10420 OPENZ1: AOBJN B,OPEN1A ;LOOP TO NEXT TABLE ENTRY OR COUNT OUT
10421 ;CHECK FOR NAMED SECONDARY PACK
10422 ;FIND THE ONE WITH THIS NAME AND THE BIGGEST QSFT.
10423 ;ASSUME THAT BY THE TIME WE GET HERE TUTS HAVE BEEN READ IN AND SO FORTH
10424 SKIPE A,-2(P) ;GET DEVICE NAME AGAIN
10425 CAMN A,[-1] ;0 OR -1 ARE NOT LEGAL PACK NAMES
10427 MOVEI C,NQS-1 ;SEARCH NAMES OF SECONDARY PACKS
10428 SETOB TT,I ;I BEST DRIVE SO FAR, TT BEST QSFT SO FAR
10429 OPENZ2: CAMN A,QRESRV(C)
10430 JRST [ CAML TT,QSFT(C)
10436 MOVE TT,[%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,,QSKOB]
10439 ;"UNKNOWN DEVICE" HANDLER. FOO DEVICE IS LOADED BY
10440 ;SYS;ATSIGN DEVICE FROM FILE DEVICE;JOBDEV FOO
10442 OPEN22: POP P,EPDLT2(U) ;WHEN WE USE SYS:ATSIGN DEVICE AS A JOB DEVICE,
10443 POP P,EPDLT1(U) ;SET UP THE "NAMES BEFORE LAST TRANSLATION" TO BE
10444 POP P,EPDLT4(U) ;THE NAMES BEING USED, INCLUDING "FOO" AS THE DEVICE.
10448 MOVE TT,DVAJOB ;DEVADR ENTRY FOR JOB:
10455 OPEN1B: JUMPE J,OPEN1C ;JUMP IF DEV ARG EXHAUSTED
10456 SUBI J,'0 ;CONVERT SIXBIT DIGIT TO NUMBER
10457 JUMPL J,OPENZ1 ;JUMP IF TOO SMALL, NOT A DIGIT
10458 CAILE J,9 ;SKIP IF LESS THAN 10.
10459 JRST OPENZ1 ;LOSE, TRY NEXT
10460 ASH I,3 ;MULTIPLY NUM SO FAR BY 8
10461 ADD I,J ;ADD NEW DIGIT
10462 OPEN1C: TLNE C,770000 ;SKIP IF ALL SIX CHAR POSITIONS COMPARED
10463 JRST OPENA1 ;GO TO NEXT POSITION
10466 NSOPEN: HRRZ R,A ;Args: 1 mode (LH) chnl (RH), 2 BP or aobjn -> block of BPs.
10470 PUSH P,A ;Save channel number.
10471 PUSH P,B ;Save BP or BP block ptr.
10473 POP P,R ;Get back the BP or aobjn pointer.
10474 MOVEM R,EPDL(U) ;Save where job device can get it.
10475 PUSHJ P,FNPRS ;Parse into DEV, FN1, FN2, SNM in A, B, C, D.
10476 MOVEM D,SRN3(U) ;Make symbolic open of network win using 5th arg as foreign host.
10477 POP P,R ;Pop back channel number argument.
10485 JRST OPNL12 ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10489 ;Given in R a BP into user memory, or an aobjn -> of BPs block in user memory,
10490 ;parse filenames into A, B, C, D. Clobbers Q, T, R, H, I.
10491 FNPRS: SETZ Q, ;Guess that it is a BP, not a block of them.
10492 SETZ A, ;Clear out the old-fashioned filename words.
10496 SETCM T,R ;Is our "BP" realy an aobjn pointer to fewer than 64 things?
10497 TLNE R,-1 ;If LH is 0, treat as BP and replace with 440700 later.
10500 MOVE Q,R ;Put the aobjn pointer in Q and get the first BP in R.
10502 FNPRS8: PUSHJ P,ASCIND
10503 FNPRS7: PUSHJ P,FNPRS4 ; Read a sixbit word
10504 JUMPL I,FNPRS9 ; Nothing there at all!
10505 CAIN H,"; ; Directory?
10506 JRST FNPRS0 ; Go do special hack
10507 MOVEI I,B ; assume FN1
10508 SKIPE B ; unless we already have a FN1
10509 MOVEI I,C ; in which case assume FN2
10511 MOVEI I,A ; unless it was a device
10512 SKIPN (I) ;Put it there, unless already something there.
10514 JUMPN H,FNPRS7 ;H=0 means end of last arg string.
10515 FNPRS9: ;; Supply default values for all components except FN1.
10517 MOVSI A,(SIXBIT /DSK/)
10521 MOVSI C,(SIXBIT />/)
10534 ;;; Extract in T the next SIXBIT word from user memory off bp in R,
10535 ;;; clobbering I (test 4.9 to see if there was no word read at all).
10536 ;;; Terminating character returned in H (0 means we got to the end of the
10537 ;;; string). Q should be an aobjn pointer to a block in user memory of
10538 ;;; additional BPs.
10541 FNPRS6: PUSHJ P,FNPRS3
10542 JUMPE H,CPOPJ ; that was the end of the string
10545 JRST FNPRS5 ; done?
10547 JRST FNPRS5 ; done?
10557 FNPRS5: JUMPL I,FNPRS6 ; keep looking if we haven't seen anything yet.
10560 ;Extract in H the next character from user memory off the byte pointer in R.
10561 ;Q should be an aobjn pointer to a block of further BPs
10562 ;(in user memory) to use after this one is exhausted.
10566 UMOVE H,(R) ;Fetch the word the BP points to.
10568 HRRI R,H ;Change the BP to point to H.
10569 LDB H,R ;Extract the desired byte.
10572 AOBJP Q,CPOPJ ;When one BP is exhausted, go to the next (if any).
10577 NOPEN: HRRZ R,A ;ARGS 1 MODE (LH) CHNL (RH) 2-5 LIKE NOPEN1 1-4
10589 SOS W ;STRIP OF FIRST ARG
10590 POP P,D ;B-E POPPED INTO A-D
10594 POP P,R ;A POPPED INTO R
10599 JRST OPNL12 ;COMMAND CANT BE LINK OR FDELE FOR "NEW" CALL
10601 MOVEM D,SRN3(U) ;MAKE SYMBOLIC OPEN OF NETWORK WIN USING 5TH ARG AS FOREIGN HOST.
10602 NDEL1: CLEARM SRN4(U)
10603 NRN2: CLEARM SRN5(U)
10604 NOPENX: TRNE R,-NIOCHN
10606 HRRZM R,UUAC(U) ;CHNL # (MAYBE ONLY FOR ERRS) IN R
10611 ;DEFAULT THE ARGS FOR .CALL OPEN, ETC,; PUT MODE IN E.
10612 NOPEN1: SETZM EPDL(U)
10615 MOVSI B,(SIXBIT /@/)
10617 MOVSI C,(SIXBIT /@/)
10619 MOVE D,USYSNM(U) ;SYSTEM NAME
10620 HLRZ E,R ;GET MODE BITS FOR TRAN.
10623 ;MAKE LINK 1-4 AS NOPEN1, 5 SNAME 2 6,7 FN1,2(2)
10624 NMLINK: MOVSI R,200000
10625 CAIN W,2 ;Only 2 args are BPs.
10626 JRST [ PUSHJ P,2FNPRS
10628 CAIGE W,7 ;Otherwise, must be seven word of sixbit.
10636 NDEL: SETZM SRN3(U)
10639 CAIN W,1 ;If it's just a BP (or block of them),
10640 JRST [ MOVE R,A ;Parse it into filenames in A-D.
10645 MOVSI R,400000 ;DELETE, ARGS AS NOPEN1
10649 NRNAM: MOVSI R,400000
10650 CAIN W,2 ;Only 2 args are BPs.
10651 JRST [ PUSHJ P,2FNPRS
10653 CAIGE W,6 ;Otherwise, must be six word of sixbit.
10657 MOVSI R,400000 ;RENAME 1-4 AS NOPEN1 5,6 NEW FN1,2
10661 ;Parse two BPs (or aobjn pointers to blocks of BPs) into user memory
10662 ;into filenames. The second bunch go in SRN3 - SRN5; the first in A - D.
10663 ;The two args are saved in EPDL and EPDL3. Clears E, preserves R.
10665 MOVEM A,EPDL(U) ;Save two BPs for job device.
10667 PUSH P,A ;Decode the second BP first, to get the new names.
10670 MOVEM B,SRN3(U) ;Stick them where RENAME looks.
10673 POP P,R ;Parse the first BP, to get the old file filenames.
10679 ;Takes either channel, FN1 (sixbit) and FN2 (sixbit)
10680 ;or channel and BP (or aobjn -> block of BPs).
10681 NRNWO: SETZM EPDL(U)
10685 PUSHJ P,[MOVE R,B ;If channel and BP, parse the BP into filenames.
10686 MOVEM R,EPDL3(U) ;But also save it for job device.
10688 MOVEM B,SRN3(U) ;PUT AWAY NEW NAMES.
10691 ANDI C,-1 ;We call "RENAME" with old fn2 = channel number.
10694 MOVSI R,400000 ;OPNCOM IS .FDELE .
10698 SUBTTL HACKS FOR OPENS THAT LOSE
10701 IFN 0,[ ;THESE "DEFNS" EXIST ONLY SO @ WILL CREF THEM
10702 OPNL1: OPNL2: OPNL3: OPNL4: OPNL5: OPNL6: OPNL7:
10703 OPNL10: OPNL11: OPNL12: OPNL13: OPNL14: OPNL15: OPNL16: OPNL17:
10704 OPNL20: OPNL21: OPNL22: OPNL23: OPNL24: OPNL25: OPNL26: OPNL27:
10705 OPNL30: OPNL31: OPNL32: OPNL33: OPNL34: OPNL35: OPNL36: OPNL37:
10706 OPNL40: OPNL41: OPNL42: OPNL43: OPNL44: OPNL45: OPNL46: OPNL47:
10707 OPNL50: OPNL51: OPNL52: OPNL53: OPNL54: OPNL55: OPNL56: OPNL57:
10708 OPNL60: OPNL61: OPNL62: OPNL63: OPNL64: OPNL65: OPNL66: OPNL67:
10709 OPNL70: OPNL71: OPNL72: OPNL73: OPNL74: OPNL75: OPNL76: OPNL77:
10712 ;HERE ARE THE REAL DEFNS
10713 REPEAT NOPNLS,CONC OPNL,\.RPCNT+1,: JSP D,OPENL
10715 OPENL: CONSZ PI,77400
10716 BUG ;ERROR WITH PI IN PROGRESS
10717 MOVE U,USER ;BE SURE U=CURRENT USER'S INDEX
10718 MOVEI D,-OPNL1(D) ;GET LOSSAGE NUMBER
10719 MOVE R,SYSCVL(U);POSSIBLY RETURN IN ERROR-CODE ARG TO .CALL
10722 HRRZ R,UUAC(U) ;GET CH NUM
10725 PUSHJ P,LSWCLR ;UNLOCK SWITCHES
10726 DPB R,[BCHPTR] ;SAVE AS MOST RECENT CHANNEL IN ERR
10727 ADD R,U ;RELOCATE TO POINT TO USER VARS
10728 DPB D,[220600,,IOCHST(R)] ;STORE IN STATUS WORD
10731 SUBTTL RCHST, STATUS, RFNAME, RFPNTR, WHYINT CALLS
10734 ;1ST ARG IS A <JOB>, WHOSE CHANNEL IS TO BE LOOKED AT.
10735 ;2ND ARG IS A CHANNEL NUMBER.
10736 ;3RD ARG IS BP TO STORE ASCIZ FILENAME STRING THROUGH.
10737 ;4TH ARG IS MAXIMUM NUMBER OF CHARACTERS TO STORE (DEFAULTS TO 1,,0).
10738 ;ONLY 1 ARG => IT IS CHANNEL #, AND JOB IS "SELF".
10739 ;FIRST 4 VALUES ARE THE DEVICE, FN1, FN2 AND SNAME
10740 ; AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10741 ;FIFTH VALUE IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN
10743 NRFNAM: MOVE J,A ;FIRST ARG IS JOB SPEC
10745 SKIPA A,B ;GET CHANNEL # INTO A IN EITHER CASE
10746 MOVEI J,%JSELF ;IF ONLY ONE ARG, JOB SPEC IS SELF
10747 MOVE Q,C ;SAVE BP FOR STORING ASCIZ FILENAME STRING - IF ANY.
10752 JSP T,NCORUI ;DECODE JOB SPEC
10756 JRST OPNL34 ;PDP6 DOESN'T HAVE CHANNELS
10761 MOVE U,J ;LOOK IN THAT JOB'S CHANNELS
10762 PUSHJ P,NRFNM1 ;GET THE CRUFT
10764 PUSHJ P,LSWPOP ;UNSOS DIELOK.
10767 POP P,I ;I GETS 4TH ARG: MAX NUMBER OF CHARS TO STORE IN STRING.
10768 JUMPE T,POPJ1 ;IF DEVICE ROUTINE HAS CLEARED Q, IT HAS STORED THE STRING.
10769 ;NOTE NETRCH PUTS AN EXTRA VALUE FOR .RCHST (GARBAGE, TO US) IN Q!
10770 JUMPE Q,POPJ1 ;IF BP ARG WAS 0, CALLER DOESN'T WANT A STRING.
10774 MOVE J,A ;IF SO, STORE ALL 4 FILENAMES DOWN IT, ONE BY ONE.
10788 ;STORE THE SIXBIT WORD IN J FOLLOWED BY THE ASCII CHAR IN T
10789 ;INTO USER ADDRESS SPACE DOWN THE BP IN Q.
10790 NRFNS1: JUMPE J,CPOPJ ;OUTPUT NOTHING AT ALL IF THE SIXBIT WORD IS EMPTY.
10791 CAIGE I,4 ;GIVE UP NOW IF TOO CLOSE TO END OF ALLOCATED SPACE.
10794 ROTC J,6 ;ELSE GET NEXT CHAR IN R, AND CONVERT TO ASCII AND STORE.
10797 CAIE R,": ;PRECEDE ANY SPECIAL CHARACTERS WITH ^Q.
10811 PUSHJ P,NRFNSB ;IF NAME FINISHED BUT NOT EMPTY, FOLLOW BY TERMINATOR.
10816 PUSHJ P,NRFNSB ;IF TERMINATOR IS : OR ;, FOLLOW IT WITH A SPACE.
10819 ;STORE A BYTE IN TT DOWN BP IN Q TO USER SPACE, INCREMENTING FIRST.
10820 ;XCTR XBYTE LOSES BECUSE IT GETS THE BP FROM USER SPACE.
10832 ;GET THE FILENAMES FOR THE CHANNEL IN A OF JOB IN U INTO A THRU D.
10833 ;IF Q IS NONZERO, IT IS A BP TO STORE AN ASCIZ STRING, AND W IS THE
10834 ;MAX NUMBER OF CHARACTERS TO STORE.
10835 ;THE DEVICE DEPENDENT ROUTINE CAN STORE THE STRING ITSELF
10836 ;AND SET Q TO ZERO SO THAT IT WILL NOT BE STORED THE STANDARD WAY.
10837 NRFNM1: MOVE T,[4,,NRFNM2]
10838 JRST CHNDCD ;R GETS ADDR OF IOCHNM WD, H GETS CONTENTS.
10839 NRFNM2: HLRZ A,H ;PUT LH(IOCHNM WD) WHERE DEVICE RTN LOOKS
10841 JUMPG J,[ ;IF 6-LETTER DEVICE NAME, LH IS POSITIVE ADDRESS
10842 HLRZS J ;OF FULL NAME. NOTE THERE BETTER BE NO
10843 MOVE J,(J) ;3-CHAR DEVICES WHOSE NAME DOES NOT START
10844 JRST .+1 ] ;WITH A LETTER.
10845 PUSH P,J ;SAVE THE PROBABLE VALUE OF DEVICE NAME
10846 LDB J,[1400,,DCHSTB(H)]
10847 HLRZ J,DRFNTB(J) ;GET RFNAME ROUTINE POINTER
10848 SETZB B,C ;FN1, FN2 ARE 0 FOR NON-DIR-DEV
10849 SETZ D, ;SNAME IS 0 FOR NON-MULTI-DIR-DEV
10850 LDB E,[.BP (%IOTOM),IOTTB(H)] ;PROBABLE VALUE OF MODE
10851 PUSHJ P,(J) ;CALL DEVICE-SPECIFIC ROUTINE
10852 SKIPA A,(P) ;NO SKIP => USE DEVICE NAME FROM DCHSTB
10853 MOVE A,J ;SKIP => USE DEVICE NAME RETURNED IN J
10857 ;ARG 1 - CHANNEL NUMBER
10858 ;VAL 1 - ACCESS POINTER OF CHANNEL
10859 ;VAL 2 - BYTE SIZE OF CHANNEL.
10860 ;FAILS IF NOT A RANDOM-ACCESS DEVICE
10862 NRFPNT: HLRZ A,H ;CHANNEL ALREADY DECODED, SET UP LH(IOCHNM) FOR DEV RTN
10863 LDB J,[1400,,DCHSTB(H)]
10864 HRRZ J,DRFNTB(J) ;GET RFPNTR ROUTINE POINTER
10865 JRST (J) ;IT SHOULD PUT POINTER IN A AND POPJ1, OR OPNL34
10867 ;SYMBOLIC CALL "RCHST"
10868 ;1ST ARG IS A CHANNEL NUMBER.
10869 ;6 OR MORE VALUES. THE FIRST 4 ARE THE DEVICE, FN1, FN2 AND SNAME
10870 ; AS LEFT-JUSTIFIED SIXBIT WHOLEWORDS.
10871 ;THE 5TH IS THE ACCESS POINTER, OR -1 IF NOT RANDOM ACCESS.
10872 ;THE 6TH IS THE MODE THE CHANNEL MIGHT BE RE-OPENED IN.
10873 ;MORE VALUES ARE RETURNED ONLY FOR NET:, AT THE MOMENT.
10874 ;THE DEV SUBROUTINE MAY PUT EXTRA RESULTS IN TT, I, AND Q, AND PUT # RESULTS INTO W
10876 NRCHST: SETO I, ;DEFAULT POSSIBLE EXTRA RESULTS
10877 SETO TT, ;DEFAULT ACCESS POINTER TO -1
10878 MOVEI W,6 ;NORMAL NUMBER OF RESULTS IS 6
10880 PUSHJ P,NRFNM1 ;GET RESULTS 1 THROUGH 4 AND 6, AND SET UP R AND H
10881 POPJ P, ;CHANNEL NUMBER MUST HAVE BEEN BAD
10883 PUSH P,B ;SAVE THE AC THAT RFPNTR CLOBBERS.
10884 HLRZ A,H ;GET ROUTINE TO GET ACCESS POINTER
10885 LDB J,[1400,,DCHSTB(H)]
10886 HRRZ J,DRFNTB(J) ;ROUTINE BETTER PRESERVE B,C,D,E,TT,I,Q
10887 CAIL J,OPENL ;KLUDGILY SKIP IF WOULD OPEN-LOSS
10888 PUSHJ P,(J) ;GET ACCESS POINTER IN A, ALWAYS SKIPS
10889 MOVE A,TT ;NOT RANDOM ACESS, USE DEFAULT VALUE
10890 MOVE TT,E ;OPEN MODE IS 6TH RESULT
10891 MOVE E,A ;ACCESS POINTER IS 5TH RESULT
10894 ;.RCHST AC, WITH AC/ CH,,ADDR
10895 ;RETURNS, IN THE 5 OR MORE WORDS STARTING AT ADDR,
10896 ;THE RESULTS OF A SYMBOLIC RCHST ON CHANNEL CH.
10897 ;EXCEPTION - THE DEVICE NAME IS RETURNED IN THE RH
10898 ;OF THE FIRST WORD , SO IT IS TRUNCATED TO 18 BITS.
10899 ;EXCEPTION - THE OPEN MODE VALUE IS NOT RETURNED. LATER VALUES
10900 ;ARE SHIFTED DOWN ONE WORD.
10903 ARCHST: UMOVE J,(J) ;GET CONTENTS OF AC
10906 JRST ILUUO ;BAD CHANNEL NUMBER
10908 PUSHJ P,NRCHST ;DO THE REAL WORK.
10909 BUG ;ONLY ERROR RETURN SHOULD BE BAD CHANNEL NUMBER
10910 HLRZS A ;PUT DEV NAME IN RH FOR HISTORY'S SAKE
10911 POP P,J ;RH(J) HAS PLACE TO STORE DATA
10913 MOVE I,Q ;SHIFT DOWN LAST 2 VALS OVER THE OPEN MODE.
10915 ADDI W,-2(J) ;W HAD 1+ # VALS, NOW HAS PLACE TO PUT LAST ONE
10916 XCTR XBW,[BLT J,(W)]
10919 ;.STATUS CH,LOC ;STORE IN LOC THE STATUS OF CHANNEL CH
10920 ;AND OF THE DEV OPEN ON IT IF ANY
10921 ;1.1-1.6 SYS PERIPHERAL DEVICE CODE
10922 ;1.7-2.9 DEVICE DEPENDENT
10923 ;3.1-4.9 LH(IOCHST)
10925 ASTATUS:ADDI R,IOCHNM(U) ;SET UP AC'S LIKE CHNDCD
10926 ASTAT1: MOVE H,(R) ;ENTER HERE FROM .USET [.RIOS,,]
10928 PUSHJ P,NSTATUS ;CALL NEW SYSTEM CALL VERSION
10930 UMOVEM A,(C) ;GIVE TO USER
10934 ;ARG 1 - CHANNEL NUMBER
10935 ;VAL 1 - SAME AS .STATUS
10937 NSTATUS:HLRZ A,H ;SET UP LH(IOCHNM)
10938 LDB D,[140600,,DCHSTB(H)] ;GET SYS PERIPHERAL DEVICE CODE
10939 LDB J,[340300,,IOTTB(H)] ;GET I/O CHANNEL MODE FROM 4.5-4.2
10940 DPB J,[060300,,D] ;RETURN IN BITS 1.9-1.7
10941 LDB J,[1400,,DCHSTB(H)]
10942 HLRZ J,DSTSTB(J) ;GET STATUS ROUTINE POINTER
10943 PUSHJ P,(J) ;ROUTINE FILLS OUT STATUS WORD IN D
10944 HLL D,IOCHST-IOCHNM(R) ;FILL IN LEFT HALF FROM IOCHST
10945 TLZ D,740000 ;CLEAR BITS USED FOR CHANNEL NUM ON IO PDL
10946 MOVE A,D ;RETURN VALUE IN A
10947 JRST POPJ1 ;THIS CALL ALWAYS SUCCEEDS
10950 ;ARG 1 - CHANNEL NUMBER
10951 ;VAL 1 - %WY CODE FOR TYPE OF DEVICE
10952 ;ADDITIONAL VALUES DEVICE-DEPENDENT
10953 ;THIS IS THE USUAL CALL TO GIVE IN RESPONSE TO A SECOND WORD INTERRUPT
10955 NWHYINT:HLRZ A,H ;SET UP LH(IOCHNM)
10956 LDB J,[1400,,DCHSTB(H)]
10957 HRRZ J,DSTSTB(J) ;GET WHYINT ROUTINE POINTER
10960 ;DEVICE-SPECIFIC RFNAME/RCHST ROUTINES
10961 ;CALLED WITH STANDARD CHNDCD STUFF IN H AND R, LH(IOCHNM) IN A
10962 ;MUST PRESERVE H AND R; CAN CLOBBER W TO INDICATE EXTRA STUFF FOR RCHST
10964 RCHUSR: MOVE B,UNAME(A) ;GET UNAME
10965 MOVE C,JNAME(A) ;GET JNAME
10968 IFN NUNITS,[ ;UTAPE .RCHST
10969 RCHUTP: HRRZ C,UTTNO(A)
10970 MOVSI J,'UT0(C) ;GET REAL DEV NAME "UTN" IN J
10971 AOS (P) ;SKIP TO RETURN CHANGED DEV NAME
10972 MOVE D,UTASS(C) ;THE "SNAME" IS THE USER TAPE IS ASSIGNED TO.
10975 MOVE B,UTN1(A) ;OUTPUT, GET FN1
10976 MOVE C,UTN2(A) ;NOW FN2
10979 ;UTAPE INPUT .RCHST
10980 RCHUTI: LDB T,[220500,,UTDBC(A)] ;GET FILE NUMBER
10982 LSH T,1 ;TURN INTO INDEX INTO DIRECTORY
10984 ADD T,UDIRO(C) ;GET POINTER TO FILE NAMES
10985 MOVE B,(T) ;GET FN1
10986 MOVE C,(T) ;GET FN2
10990 ;RCHST ROUTINE FOR TTY
10992 ANDI J,#%TICNS#(.BM $TIIDX)
10993 IOR E,J ;MERGE TTY OPEN MODE BITS WITH THE GENERAL ONES.
11002 HRLZS J ;J NOW HAS SIXBIT/TNM/, NM = TTY #.
11003 JRST POPJ1 ;SKIP TO SAY DEV NAME IS IN J.
11005 ;RCHST ROUTINE FOR STY
11006 RCHSTY: MOVE J,TTYOPT(A)
11008 IORI E,4 ;STY BIT 1.3 => TTY IS HALF-DUPLEX.
11009 MOVE J,STYSTS-NFSTTY(A)
11011 IORI E,20 ;BIT 1.5 => WANT TO RECEIVE %TDORS ON .RESET OF TYOC,
11012 TRNN E,1 ;FIND THE DON'T-HANG-BIT FOR THIS DIRECTION.
11013 TLZA J,#%SSOHG ;AND FLUSH THE ONE FOR THE OTHER DIRECTION.
11015 TLNE J,-1 ;THEN TESTING BOTH TESTS ONLY THE RELEVANT ONE.
11024 RCHDRH: HRRZ A,IOCHST-IOCHNM(R) ;TRACK NUMBER
11025 IMULI A,LMNBLK ;DIRHNG DEVICE RFNAME
11026 ADDI A,2000-LMNBLK*NUDSL
11031 ;RCHST ROUTINE FOR DIRECTORY CHANNELS AND THE ERR DEVICE.
11032 RCHDIR: MOVE T,DSKLST(A) ;GET THE TYPE OF DIRECTORY CODE.
11033 SKIPE J,UDUSR(A) ;IF DEVICE # IS NONZERO, ADD IT TO DEV NAME
11034 HRLZS J ;(ONLY HAPPENS FOR UTAPE)
11035 ADD J,RCHDRD-1(T) ;DETERMINE DEV NAME FROM DIRECTORY TYPE
11036 MOVE B,RCHDR1-1(T) ;SAME FOR FN1
11037 SKIPN C,RCHDR2-1(T) ;AND FN2, EXCEPT 0 FOR ERR DEVICES
11038 MOVE C,UUDPP(A) ; SO WE WILL GET THE STATUS WORD BEING DECODED.
11040 MOVE D,UDSYSN(A) ;FOR DISK UFD'S, GET THE SNAME
11041 JRST POPJ1 ;RETURN, SAYING WE HAVE SPEC'D THE DEVICE NAME.
11043 .SEE UDT ;THESE TABLES ARE IN PARALLEL WITH UDT
11044 RCHDRD: 'UT0,, ? 'CLU,, ? 'DSK,, ? 'DSK,,
11045 'ERR,, ? 'TTY,, ? 'COR,,
11046 IF2 IFN .-UDTLN-RCHDRD,.ERR RCHDRD WRONG LENGTH
11048 RCHDR1: '.FILE. ? '.FILE. ? '.FILE. ? 'M.F.D.
11049 3 ? '.FILE. ? '.FILE.
11050 IF2 IFN .-UDTLN-RCHDR1,.ERR RCHDR1 WRONG LENGTH
11052 RCHDR2: SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/ ? SIXBIT /(FILE)/
11053 0 ? SIXBIT /(DIR)/ ? SIXBIT /(DIR)/
11054 IF2 IFN .-UDTLN-RCHDR2,.ERR RCHDR2 WRONG LENGTH
11058 ;CORE LINK .RCHST ROUTINE
11060 RCHCLO: CONO PI,CLKOFF
11061 MOVE B,CLN1(A) ;GET FN1
11062 MOVE C,CLN2(A) ;GET FN2
11063 MOVE D,CLSYN(A) ;GET SYSTEM NAME
11066 ;RFNAME ROUTINE FOR DSK
11068 RCHQSK: MOVE H,QUDPR(A) ;FILE STATUS FOR DISK PICKUP USER DIR POINTER
11069 PUSHJ P,QUDLK ;LOCK DIRECTORY
11070 MOVE C,QSNLCN(H) ;LOCATION OF DIRECTORY
11072 ADD C,QUDFPR(A) ;ADD LOCN OF FILE WITHIN DIRECTORY
11073 MOVE B,(C) ;GET FIRST FILE NAME
11074 MOVE C,1(C) ;GET SECOND FILE NAME
11078 TRO E,20 ;LINK MODE
11079 MOVE H,(R) ;PRESERVE H
11082 ;RFNAME ROUTINE FOR BOJ:
11084 RCHBOJ: CONO PI,CLKOFF ;BOJ DEVICE .RCHST ROUTINE
11085 MOVE T,JBCUI(A) ;RETURNS CREATOR'S NAME
11089 SETZB B,C ;CREATOR GONE, RETURN BLANK NAMES
11092 ;RFNAME ROUTINE FOR JOB:
11104 ;COPY THE BOJ JOB'S ASCIZ FILENAME STRING INTO OUR CALLER'S STRING.
11105 ;THE CALLER'S BP IS IN Q, AND HIS MAX CHARS TO STORE IS IN W.
11106 RFNJ1: SKIPN B,JBFNP(A)
11111 AOS DIELOK(J) ;PREVENT THE JOB FROM DIEING.
11118 ;D HAS BP TO FETCH WITH, POINTING INTO C, WHICH CONTAINS WORD FETCHED FROM BOJ JOB.
11119 ;RH(B) HAS ADDR OF NEXT WORD TO FETCH FROM THE BOJ JOB.
11120 ;TT CONTAINS THE PREVIOUS CHARACTER TRANSFERRED, OR 1
11121 ;IF THE PREVIOUS CHARACTER WAS QUOTED WITH A ^Q.
11123 TRNN D,#C ;IF THE BP IN D ADVANCES PAST C,
11125 PUSHJ P,RFNJ3 ;FETCH ANOTHER WORD INTO C, MAKE D POINT THERE AGAIN,
11126 LDB E,D ;AND FETCH THE SAME BYTE OVER AGAIN.
11127 RFNJ4: SOJL W,RFNJ5
11129 PUSHJ P,NRFNSB ;STORE BYTE INTO CALLER, UNLESS HIS STRING IS FULL.
11131 CAIN TT,^Q ;A QUOTED CHAR DOES NOT TERMINATE AND DOES NOT QUOTE.
11134 JUMPN E,RFNJ2 ;STOP STORING AFTER A NULL WHICH ISN'T QUOTED.
11140 ;READ THE NEXT WORD (ADDR IN B) FROM THE BOJ JOB.
11147 PUSHJ P,UPLC ;LOOK UP THE BOJ JOB'S PAGE.
11151 LDB J,T ;IF IT DOESN'T EXIST, LOAD A ZERO,
11152 JUMPE J,RFNJ6 ;AVOID GETTING MPV.
11161 RFPUSR: HRRZ A,IOCHST-IOCHNM(R) ;GET THE ACCESS PTR
11162 MOVEI B,36. ;BYTE SIZE IS ALWAYS FULL WORD.
11167 RFPQSK: LDB B,[QSBSIZ(A)] ;GET FILE BYTE SIZE
11169 TDNN T,QSRAC(A) ;IF .ACCESS WAS DONE AND NOT HANDLED,
11171 MOVE A,QRADAD(A) ;GET WHAT THE .ACCESS SPECIFIED.
11174 RFPQS1: MOVE J,QFBLNO(A) ;GET BYTE # OF STRAT OF CURRENT BLOCK.
11175 SKIPGE QSMDN(A) ;SKIP ON A BUFFER ACTIVE
11176 JRST RFPQS2 ;NONE ACTIVE => QFBLNO POINTS TO NEXT BLOCK TO BE READ.
11177 ADD J,QMPBSZ(A) ;ELSE CORRECT FOR THE NUMBER OF BYTES WE'VE PROCESSED
11178 SUB J,QSMPRC(A) ;IN THE ACTIVE BLOCK (QFBLNO -> 1ST WD OF BLOCK).
11182 SUBTTL RESET,IOPUSH,IOPOP,IOPDL,FORCE,FLUSH .CALLS
11184 ;.RESET CH, ;RESET BUFFERED INFO ON CHANNEL CH
11185 ;NOT IMPLEMENTED FOR MANY DEVICES
11186 ;HAS SPECIAL EFFECTS ON "USR" DEVICE
11188 ;ARG 1 - CHANNEL NUMBER
11192 ARESET: HRRZ A,(R) ;PICK UP INDEX FROM I/O CH WORD
11193 SKIPA T,[HRRZ T,RSTB1(A)] ;.RESET USES RH OF TABLE
11194 AIOPP1: MOVE T,[HLRZ T,RSTB1(A)] ;.IOPUSH, .IOPOP USE LH OF TABLE
11195 IDIVI A,7 ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11196 ADD A,[440500,,RSTB]
11199 LDB A,A ;GET BYTE FROM TABLE
11200 XCT T ;GET REAL TABLE ENTRY IN T
11203 ;IO CHANNEL PUSH DOWN LIST ROUTINES
11204 ;C(I) =0 AT DSP => IOPUSH =1 => IOPOP
11207 AIOPUSH:MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11208 CAML T,[LUIOP-1,,0] ;LUIOP-2,,<ptr> is OK, leaves room for 1 more.
11209 JRST IOCER6 ;OVER PUSH ERROR
11210 PUSH T,(R) ;PUSH CURRENT IOCHNM
11211 PUSH T,IOCHST-IOCHNM(R) ;&IOCHST
11214 DPB J,[400400,,(T)] ;STORE CHANNEL NUM FOR POSSIBLE USE BY AIOPDL
11215 MOVEM T,SIOCP(U) ;STORE BACK PDL POINTER
11216 MOVEI I,0 ;INDICATE IOPUSH
11218 PUSHJ P,AIOPP1 ;CALL DEVICE'S IOPDL HANDLER. SHOULD NOT HANG
11220 SETZM (R) ;CLEAR OUT IOCHNM
11221 SETZM IOCHST-IOCHNM(R) ;&IOCHST
11225 AIOPOP: PUSHJ P,ACLOSE ;CLOSE WHATEVER MAY BE OPEN ON CHANNEL POPPING INTO
11226 MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11228 JRST IOCER5 ;OVER POP ERROR
11229 POP T,IOCHST-IOCHNM(R) ;POP BACK IOCHST
11232 SETZM 1(T) ;CLEAR OUT PDL WORD TO AVOID CONFUSION IN
11233 ;ROUTINES THAT GROVEL OVER I/O PDL
11234 MOVEM T,SIOCP(U) ;STORE BACK PDL POINTER
11235 MOVEI I,1 ;INDICATE IOPOP
11236 JRST AIOPP1 ;CALL DEVICE'S IOPDL HANDLER
11238 AIOPDL: MOVE T,SIOCP(U) ;PICK UP PDL POINTER
11239 TLNN T,-1 ;SKIP UNLESS IO PDL EMPTY
11241 LDB R,[400400,,(T)] ;FIND OUT WHAT CHNL TOP ENTRY WAS PUSHED FROM
11243 PUSHJ P,AIOPOP ;POP BACK INTO CHNL PUSHED FROM
11246 IIOPPR: JUMPE I,[JRST 4,CPOPJ] ;IOPUSH
11247 SETZM (R) ;CLOSE CHANNEL
11248 SUBI R,IOCHNM(U) ;GET CHANNEL NUMBER
11249 MOVE R,CHNBIT(R) ;SECOND WORD INTERRUPT BIT
11250 IORM R,IFPIR(U) ;GIVE TO USER
11254 ;ARG 1 - CHANNEL NUMBER
11255 ;IF ANY OUTPUT IS BUFFERED UP, CAUSES IT TO BE SENT TO THE DEVICE
11256 ;(IF FORCE WAS NOT DONE, IT MIGHT NOT BE SENT UNTIL A COMPLETE
11257 ;BUFFERFULL HAD BEEN OUTPUT BY THE USER.)
11259 NFORCE: SKIPA T,[HLRZ T,DFRCTB(D)] ;FORCE USES LH OF TABLE
11260 NFINI1: MOVE T,[HRRZ T,DFRCTB(D)] ;FINISH USES RH OF TABLE
11261 HLRZ A,(R) ;PASS LH(IOCHNM) TO DEVICE ROUTINES
11262 HRRZ D,(R) ;USE RH(IOCHNM) AS BYTE INDEX INTO RSTB
11263 IDIVI D,7 ;TABLE IS IN 5-BIT BYTES TO SAVE SPACE
11264 ADD D,[440500,,RSTB]
11267 LDB D,D ;GET BYTE FROM TABLE
11268 XCT T ;GET REAL TABLE ENTRY IN T
11272 ;ARG 1 - CHANNEL NUMBER
11273 ;FIRST DOES A FORCE, THEN WAITS FOR ALL OUTPUT TO GET TO THE DEVICE
11275 NFINIS: PUSHJ P,NFORCE ;CALL DEV ROUTINE FOR FORCING
11277 JRST NFINI1 ;THEN CALL DEV ROUTINE FOR WAITING
11279 ;.NETS CH, - UUO VERSION OF .CALL FORCE.
11280 ANETS: PUSHJ P,NFORCE
11281 JRST IOCER1 ;ILLEGAL HARDWARE OPERATION
11284 SUBTTL I/O DEVICE DISPATCH TABLES
11287 This page tries to document the ITS I/O device dispatch tables and
11288 dispatch environment. It is not completed yet.
11290 The tables use several different indices, which are:
11291 opnidx - result of device name lookup in DEVTAB
11292 ioidx - result of OPEN; has symbolic values. This is the index
11293 stored in RH of IOCHNM (per-job channel table)
11294 sidx - secondary index from DCHSTB(ioidx)
11295 ridx - secondary index from RSTB(ioidx)
11297 The following system calls are dispatched through these tables.
11298 There are 11 dispatch routines that each device must specify.
11299 The format is "CALL [table name(index-used) -> device-routine]"
11301 OPEN [DEVADR(opnidx) -> devO]
11302 "opnidx" is looked up from DEVTAB which holds the device names.
11303 The device's OPEN routine is in the RH of DEVADR.
11304 It must set up the user's IOCHNM word for the channel,
11305 by setting the RH to the right "ioidx" and the LH to whatever
11310 CLOSE [CLSTB(ioidx) -> devCLS]
11311 The device's CLOSE routine is in the RH of CLSTB.
11312 It must zero the user's IOCHNM word for the channel.
11316 IOT, SIOT [IOTTB(ioidx) -> devVarious]
11317 These routines do I/O transfers. The main reason "ioidx"
11318 has so many possible values (causing IOTTB to be large) is
11319 because lots of devices specify different ioidx's for different
11320 modes - input/output, block/unit, image/ascii, etc - in order
11321 to speed up actual I/O transfers, which are probably the most
11322 common device-related system calls.
11326 STATUS [LH(DTSTB(sidx)) -> devSTA]
11329 WHYINT [RH(DTSTB(sidx)) -> devWHY]
11331 RCHST, RFNAME [LH(DRFNTB(sidx)) -> devRCH]
11333 RFPNTR [RH(DRFNTB(sidx)) -> devRFP]
11335 IOPUSH, IOPOP [LH(RSTBI(ridx)) -> devIOP]
11337 RESET [RH(RSTBI(ridx)) -> devRST]
11339 FORCE [LH(DFRCTB(ridx)) -> devFRC]
11341 FINISH [RH(DFRCTB(ridx)) -> devFIN]
11345 ;DISPATCH TABLE FOR .CLOSE UUO
11346 ;TRANSFERED THROUGH USING RIGHT HALF OF IOCHNM WORD AS AN INDEX
11347 ;R HAS THE ADDRESS OF THE IOCHNM WORD.
11349 ;VARIOUS ROUTINES USE THE BITS IN THE L.H. TO DECIDE WHETHER
11350 ;A CHANNEL IS ACCEPTABLE FOR SOME OPERATION.
11352 %CLSU==400000 ;USR DEVICE (INFERIOR)
11353 %CLSDO==200000 ;DECTAPE OUTPUT
11354 %CLSJI==100000 ;JOB INPUT
11355 %CLSDI==40000 ;DECTAPE INPUT
11356 %CLSTI==20000 ;TTY INPUT
11357 %CLSCL==10000 ;CORE-LINK DEVICE
11358 %CLSBJ==4000 ;BOJ DEVICE
11359 %CLSQO==2000 ;DISK OUTPUT
11360 %CLSFU==1000 ;NON-INFERIOR USR
11361 %CLSNRM==400 ;STANDARD CLOSE ROUTINE USED FOR THIS DEVICE.
11362 ;RH SHOULD POINT, NOT AT THEROUTINE, BUT AT THE USR-USE PAIR
11365 %CLSJO==40 ;JOB OUTPUT
11366 %CLSST==20 ;STY DEVICE
11367 %CLST==10 ;TRAP DEVICE
11369 %CLSJ==%CLSJI\%CLSJO ;EITHER DIRECTION OF JOB DEVICE
11370 %CL1QO==%CLSQO\%CLSQ ;BOTH BITS FOR DISK OUTPUT
11374 TYIDN:: REPEAT 2, %CLSTI,,TYICLS ;TYI
11375 TYODN:: REPEAT 2, TYOCLS ;TYO
11376 NLIDN:: REPEAT 4, CPOPJ ;NULL
11377 UWIDN:: REPEAT 4, %CLSU ,,CPOPJ ;USER
11378 FUWIDN:: REPEAT 2, %CLSFU,,CPOPJ ;FOREIGN USER
11379 DNDIRH:: DIRHCL ;DIRHNG
11380 DNTRAP:: %CLST,,CPOPJ ;TRAP
11381 IFN CHAOSP,CHAIDN:: REPEAT 2, CHACLS ;CHAOS NET
11383 DNUACII:: REPEAT 3,[
11384 %CLSDI,,UTICL ;UTAPE.
11387 IFN OLPTP,LPTDN:: REPEAT 2, LPTCLS ;LPT
11392 IFN GLPTP,GLPTDN:: REPEAT 2, GLPCLS
11393 DIRCHN:: REPEAT 4, UTDCLS ;DIRECTORY DEVICE
11394 IFN VIDP,NVIDOP:: REPEAT 2, NVDCLS ;NVIDI
11395 IFN PLTP,PLTDN:: REPEAT 2, %CLSNR,,PLTUSR ;PLOTTER
11397 PTPI:: REPEAT 5, %CLSNR,,PTPUSR ;PAPER TAPE PUNCH
11399 IFN IMXP,IMPXDN:: REPEAT 4, IMPXCL ;IMX
11400 IFN OMXP,OMPXDN:: REPEAT 4, OMPXCL ;OMX
11401 DCLUAI:: %CLSCL,,CLCLRA ;CORE LINK
11408 REDUAI:: REPEAT 5, PTRCLS ;PAPER TAPE READER
11411 DN340B:: REPEAT 4, ADCL1 ;340
11415 CODDN:: REPEAT 2, CODCLS ;CODE DEV
11417 DQUAI:: %CLSQ ,,QICL ;DISK
11423 IFN VIDP,DNVDIU:: REPEAT 4, TVCCLS ;TVC
11424 IFN PDP6P,PDPUIO:: REPEAT 4, %CLS6 ,,PDPCLS ;USR IN PDP10 MODE
11425 IFN TABP,DTABUI:: REPEAT 2, %CLSNR,,TABUSR ;TABLET
11427 MTUAIX:: REPEAT 3, MTICL ;MAG TAPE
11431 %CLSJI,,JOBCLS ;JOB DEVICE
11434 BDUAI:: REPEAT 6, %CLSBJ,,CPOPJ ;BOJ
11435 IIOPOP:: [JRST 4,CPOPJ] ;INTERRUPT ON IOPOP DEVICE
11437 STYDUI:: REPEAT 2,[ ;PSEUDO TTY
11441 IFN NCPP,NETDUI:: REPEAT 4, NETCLS ; Arpanet NCP
11442 IFN TCPP,TCPDUI:: REPEAT 4, TCPCLS ; Internet TCP
11443 IFN INETP,IPQDN:: IPQCLS ; Internet Queue
11444 IFN MSPP,MSPIO:: MSCLOS ;MESS SWITCHER (DM)
11445 IFN STKP,STKDP:: STKCLS ;STANFORD KEYBOARD
11446 IFN NTYP,NTYIT:: REPEAT 4, NTYCLS ;A KLUDGE ON THE NTY
11448 IF2,IFN .-CLSTB-LIOTTB,.ERR BARF AT CLSTB
11450 ;DISPATCH TABLE FOR .IOT UUO
11451 ;TRANSFERED THROUGH USING RIGHT HALF OF I/O CHANNEL WORD AS AN INDEX
11453 %IOTBK==400000 ;4.9 = 1 => BLOCK = 0 => UNIT
11454 %IOTOT==200000 ;4.8 = 1 => OUTPUT = 0 => INPUT "
11455 %IOTBP==100000 ;4.7 = 1 => THERE IS A SPECIAL ROUTINE FOR SIOT,
11456 ;AND ITS ADDRESS IS -1 + RH(IOTTB WORD).
11457 %IOTSP==40000 ;4.6 => THIS DEVICE IS FUNNY. SIOT ISN'T ALLOWED,
11458 ;AND IOT LETS THE DEVICE RTN DO ALL THE WORK.
11459 ;PRESENT ONLY FOR UNIT INPUT MODES.
11460 %IOT10==20000 ;4.5 => THIS CHANNEL WAS OPENED WITH BIT 1.4 SET IN MODE
11461 %IOTIM==10000 ;4.4 => THIS CHANNEL WAS OPENED WITH BIT 1.3 (IMAGE MODE) SET IN MODE
11462 ; 4000 ;4.3 COPIES %IOTBK. THUS, BITS 4.5-4.2 REFLECT THE BOTTOM 4 BITS
11463 ; 2000 ;4.2 COPIES %IOTOT. OF THE OPEN-MODE.
11464 %IOTOM==36000 ;BITS 4.5 - 4.2
11466 %IOTBO==606000 ;BLOCK OUTPUT.
11467 %IOTBI==404000 ;BLOCK INPUT.
11468 %IOTUO==202000 ;UNIT OUTPUT.
11469 %IOTUI==000000 ;UNIT INPUT.
11473 TYIDN:: %IOTUI,,TYI ;TTY ENTRIES MUST BE COMPACT
11474 TYIBN:: %IOTBI,,TTYBI
11475 TYODN:: %IOTUO,,TYO (%IOTBP)
11476 TYOBN:: %IOTBO,,TTYBO ;LAST TTY DEVICE
11477 NLIDN:: %IOTUI,,NULI
11478 NLBIDN:: %IOTBI,,NULBI
11479 NLODN:: %IOTUO,,CPOPJ
11480 NLBDN:: %IOTBO,,NULBOD
11481 UWIDN:: %IOTUI,,UWI (%IOTIM)
11482 UBIDN:: %IOTBI,,UBI
11483 UWODN:: %IOTUO,,UWO (%IOTIM)
11484 UBODN:: %IOTBO,,UBO
11485 FUWIDN:: %IOTUI,,UWI (%IOT10)
11486 FUBIDN:: %IOTBI,,UBI (%IOT10)
11490 CHAIDN:: %IOTUI+%IOTBP,,CHAUI
11491 CHAODN:: %IOTUO+%IOTBP,,CHAUO
11494 DNUACII:: %IOTUI,,UASCII
11495 DNUACCO:: %IOTUO,,UASCCO
11496 DNUBKI:: %IOTBI,,UBLKI
11497 DNUBKO:: %IOTBO,,UBLKO
11498 DNUDTI:: %IOTUI,,UDATAI (%IOTIM)
11499 DNUDTO:: %IOTUO,,UDATAO (%IOTIM)
11502 LPTDN:: %IOTUO,,PILPT1
11503 LPTBN:: %IOTBO,,BLPTO
11506 NLPTDN:: %IOTUO,,NLPT1
11507 NLPTBN:: %IOTBO,,BNLPTO
11510 GLPTDN:: %IOTUO,,GLPTDO (%IOTBP)
11511 GLPTBN:: %IOTBO,,GLPTBO
11513 DIRCHN:: %IOTUI,,DIRCH
11514 DIRBN:: %IOTBI,,DIRB
11515 NDATAI:: %IOTUI,,DDATAI (%IOTIM+%IOTBP)
11516 NBLKI:: %IOTBI,,DBLKI (%IOTIM)
11518 NVIDOP:: %IOTUI,,NVIDIT (%IOTSP)
11519 BNVIDO:: %IOTBI,,BNVIDI
11522 PLTDN:: %IOTUO,,PLOT
11523 PLTBN:: %IOTBO,,BPLOT
11526 PTPI:: %IOTUO,,PIPUN (%IOT10)
11527 PTPA:: %IOTUO,,APIPUN
11528 PTPB:: %IOTBO,,BPIPUN
11529 PTPWA:: %IOTUO,,WAPIPN (%IOTIM)
11530 PTPWB:: %IOTBO,,WBPIPN (%IOTIM)
11533 IMPXDN:: %IOTUI,,IMPXS (%IOTSP)
11534 IMXDN:: %IOTUI,,IMPXS1 (%IOTSP)
11535 BIMXDN:: %IOTBI,,BIMXS1 (%IOTSP)
11536 BIMPXD:: %IOTBI,,BIMPXS (%IOTSP)
11539 OMPXDN:: %IOTUO,,OMPXS (%IOTSP)
11540 OMXDN:: %IOTUO,,OMXDS (%IOTSP)
11541 BOMXDN:: %IOTBO,,BOMXDS (%IOTSP)
11542 BOMPXD:: %IOTBO,,BOMPXS (%IOTSP)
11544 DCLUAI:: %IOTUI,,CLUAI
11545 DCLUAO:: %IOTUO,,CLUAO
11546 DCLBI:: %IOTBI,,CLBI
11547 DCLBO:: %IOTBO,,CLBO
11548 DCLUBI:: %IOTUI,,CLUBI (%IOTIM)
11549 DCLUBO:: %IOTUO,,CLUBO (%IOTIM)
11551 REDUAI:: %IOTUI,,PTRUAI
11552 REDBAI:: %IOTBI,,PTRBAI
11553 REDUII:: %IOTUI,,PTRUII (%IOTIM)
11554 REDBII:: %IOTBI,,PTRBII (%IOTIM)
11555 REDUTI:: %IOTUI,,PTRUTI (%IOT10)
11558 DN340B:: %IOTBO,,340B ;340 ENTRIES MUST BE COMPACT; BLOCK FIRST, THEN UNIT
11559 DN340W:: %IOTUO,,340W (%IOTSP)
11560 DN340C:: %IOTUO,,340C (%IOTSP)
11561 DN340H:: %IOTUO,,340H (%IOTSP)
11562 ;DN340I:: %IOTUO,,340I (%IOTSP)
11563 DN340L:: ;LAST 340 DEVICE ENTRY
11566 CODDN:: %IOTUO,,SEND
11567 CODBN:: %IOTBO,,BSEND
11569 DQUAI:: %IOTUI,,QUAI (%IOTBP)
11570 DQUAO:: %IOTUO,,QUAO (%IOTBP)
11573 DQUII:: %IOTUI,,QUII (%IOTIM %IOTBP)
11574 DQUIO:: %IOTUO,,QUIO (%IOTIM %IOTBP)
11576 DNVDIU:: %IOTUI,,RNVDIU (%IOTSP)
11577 DNVDIB:: %IOTBI,,RNVDIB (%IOTSP)
11578 DNVDOU:: %IOTUO,,RNVDOU (%IOTSP)
11579 DNVDOB:: %IOTBO,,RNVDOB (%IOTSP)
11582 PDPUIO:: %IOTUO,,UWO ;BUT JOB WILL BE -1 TO INDICATE PDP6
11583 PDPBIO:: %IOTBO,,UBO
11584 PDPUII:: %IOTUI,,UWI
11585 PDPBII:: %IOTBI,,UBI
11588 DTABUI:: %IOTUI,,UTABI
11589 DTABBI:: %IOTBI,,BTABI
11592 MTUAIX:: %IOTUI,,MTUAI (%IOTBP) ;MAGTAPE
11593 MTUIIX:: %IOTUI,,MTUII (%IOTIM %IOTBP)
11594 MTBIX:: %IOTBI,,MTBI
11595 MTUAOX:: %IOTUO,,MTUAO (%IOTBP)
11596 MTUIOX:: %IOTUO,,MTUIO (%IOTIM %IOTBP)
11597 MTBOX:: %IOTBO,,MTBO
11599 JDUAI:: %IOTUI,,JBUI(%IOTBP)
11600 JDUAO:: %IOTUO,,JBUI(%IOTBP)
11601 JDBI:: %IOTBI,,JBBI
11602 JDBO:: %IOTBO,,JBBI
11603 JDUII:: %IOTUI,,JBUI (%IOTBP %IOTIM)
11604 JDUIO:: %IOTUO,,JBUI (%IOTBP %IOTIM)
11605 BDUAI:: %IOTUI,,BJUI
11606 BDUAO:: %IOTUO,,BJUO
11607 BDBI:: %IOTBI,,BJBI
11608 BDBO:: %IOTBO,,BJBO
11609 BDUII:: %IOTUI,,BJUI (%IOTIM)
11610 BDUIO:: %IOTUO,,BJUO (%IOTIM)
11611 IIOPOP:: [JRST 4,CPOPJ] ;INTERRUPT ON IOPOP DEVICE
11612 ISPY:: %IOTUI,,SPYI
11613 STYDUI:: %IOTUI,,STTYI ;PSEUDO TTY
11614 STYDUO:: %IOTUO,,STTYW
11615 STYDBI:: %IOTBI,,STTBI
11616 STYDBO:: %IOTBO,,STTBO
11618 NETDUI:: %IOTUI,,NETI
11619 NETDUO:: %IOTUO,,NETW (%IOTBP)
11620 NETDBI:: %IOTBI,,NETBI
11621 NETDBO:: %IOTBO,,NETBO
11624 TCPDUI:: %IOTUI,,TCPI (%IOTBP)
11625 TCPDUO:: %IOTUO,,TCPW (%IOTBP)
11626 TCPDBI:: %IOTBI,,TCPBI
11627 TCPDBO:: %IOTBO,,TCPBO
11630 IPQDN:: IPQIO ; No I/O calls used on this dev!
11639 NTYIT:: %IOTUI,,NTYTI ;KLUDGE FOR FAST, LARGE BUFFER ON NTY
11640 NTYOT:: %IOTUO,,NTYTO
11641 NTYBIT:: %IOTBI,,NTYBI
11642 NTYBOT:: %IOTBO,,NTYBO
11647 ;TABLES FOR VARIOUS CHANNEL STATUS CALLS
11649 ;DCHSTB - INDEXED BY IOTTB INDEX (RH OF IOCHNM)
11650 ;LH SIXBIT MAIN DEVICE NAME
11651 ;1.1-2.3 INDEX INTO THE NEXT TWO TABLES
11652 ;2.4-2.9 SYSTEM PERIPHERAL DEVICE CODE (FOR .STATUS)
11653 .SEE DCHSTB ;ASSEMBLED SECOND TO GET VALUES OF THE TEMPORARY %%dev SYMBOLS.
11655 ;DSTSTB - INDEX FROM DCHSTB
11656 ;LH STATUS ROUTINE, RH WHYINT ROUTINE (OPNL34 IF DEVICE DOESN'T GIVE 2ND WD INTS)
11658 DSTSTB: CPOPJ,,OPNL44 ;0 CHANNEL NOT OPEN
11659 STDSTA,,OPNL34 ;1 RANDOM DEVICE
11660 CPOPJ,,OPNL34 ;2 OTHER KIND OF RANDOM DEVICE
11661 STATYI,,TYIWHY ;3 TTY INPUT
11662 STATYO,,TYOWHY ;4 TTY OUTPUT
11663 CPOPJ,,OPNL34 ;5 USR DEVICE
11664 CPOPJ,,OPNL34 ;6 DIR "DEVICE"
11665 CLISTA,,OPNL34 ;7 CORE LINK INPUT
11666 STDSTA,,OPNL34 ;10 CORE LINK OUTPUT
11667 CPOPJ,,OPNL34 ;11 DISK
11668 JBSTAT,,OPNL22 ;12 JOB DEVICES (WHYINT SHOULDN'T GET HERE)
11669 CPOPJ,,OPNL34 ;13 BOJ DEVICE
11670 STASTI,,STIWHY ;14 STY INPUT
11671 STASTO,,STOWHY ;15 STY OUTPUT
11672 CPOPJ,,TRPDEV ;16 TRAP DEVICE
11673 CPOPJ,,OPNL34 ;17 DIRHNG DEVICE
11674 CPOPJ,,OPNL34 ;20 SPY DEVICE
11675 OFFSET -DSTSTB ;BEGIN OPTIONAL DEVICES
11676 IFN NMTCS, %%MT:: STAMTC,,OPNL34
11677 IFN NUNITS,%%UTP:: CPOPJ,,OPNL34
11678 IFN OLPTP, %%OLP:: STALPT,,OPNL34
11679 IFN NCPP, %%NET:: STANET,,NETWHY
11680 IFN TCPP, %%TCP:: TCPSTA,,TCPWHY
11681 IFN INETP, %%IPQ:: IPQSTA,,IPQWHY
11682 IFN CHAOSP,%%CHA:: CPOPJ,,CHAWHY
11685 ;DRFNTB - INDEX FROM DCHSTB
11686 ;LH RFNAME ROUTINE, RH RFPNTR ROUTINE OR OPNL34 IF NOT RANDOM ACCESS
11688 DRFNTB: CPOPJ,,OPNL44 ;0 CHNL NOT OPEN
11689 CPOPJ,,OPNL34 ;1 RANDOM DEVICE
11690 CPOPJ,,OPNL34 ;2 OTHER KIND OF RANDOM DEVICE
11691 RCHTTY,,OPNL34 ;3 TTY INPUT
11692 RCHTTY,,OPNL34 ;4 TTY OUTPUT
11693 RCHUSR,,RFPUSR ;5 USR DEVICE
11694 RCHDIR,,OPNL34 ;6 DIR "DEVICE"
11695 RCHCLO,,OPNL34 ;7 CORE LINK INPUT
11696 RCHCLO,,OPNL34 ;10 CORE LINK OUTPUT
11697 RCHQSK,,RFPQSK ;11 DISK
11698 RFNJOB,,RFPJOB ;12 JOB DEVICES
11699 RCHBOJ,,OPNL34 ;13 BOJ DEVICE
11700 RCHSTY,,OPNL34 ;14 STY INPUT
11701 RCHSTY,,OPNL34 ;15 STY OUTPUT
11702 CPOPJ,,CPOPJ ;16 TRAP DEVICE
11703 RCHDRH,,OPNL34 ;17 DIRHNG DEVICE
11704 SPYRCH,,OPNL34 ;20 SPY DEVICE
11705 OFFSET -DRFNTB ;BEGIN OPTIONAL DEVICES
11706 IFN NMTCS, %%MT:: RCHMGT,,OPNL34
11707 IFN NUNITS,%%UTP:: RCHUTP,,OPNL34
11708 IFN OLPTP, %%OLP:: CPOPJ,,OPNL34
11709 IFN NCPP, %%NET:: NETRCH,,OPNL34
11710 IFN TCPP, %%TCP:: TCPRCH,,TCPRFP
11711 IFN INETP, %%IPQ:: IPQRCH,,IPQRFP
11712 IFN CHAOSP,%%CHA:: CHARCH,,OPNL34
11714 IFN <.-DRFNTB>-<DRFNTB-DSTSTB>, .ERR DRFNTB & DSTSTB NOT SAME LENGTH
11716 DEFINE XX NTIMES,DEVNAM,DN,SNXXX,IDX
11717 IFNB DN, DN==:.-DCHSTB ;CHECK THAT DCHSTB IS IN SAME ORDER AS IOTTB
11718 IFG SIXBIT/DEVNAM/, ZZ==[SIXBIT/DEVNAM/] ;DECIDE WHETHER FITS IN LH
11720 IFE SIXBIT/DEVNAM/&777777, ZZ==(SIXBIT/DEVNAM/)
11721 .ELSE ZZ==[SIXBIT/DEVNAM/]
11723 REPEAT NTIMES, ZZ,,SNXXX_14+IDX
11726 DCHSTB: XX 1,,,,0 ;CHNL NOT OPEN
11727 XX 2,TTY,TYIDN,,3 ;TTY INPUT
11728 XX 2,TTY,TYODN,,4 ;TTY OUTPUT
11729 XX 4,NUL,NLIDN,SNNUL,1 ;NUL DEVICE
11730 XX 4,USR,UWIDN,SNUSR,5 ;USR DEVICE
11731 XX 2,USR,FUWIDN,SNFUSR,5 ;FOREIGN USR
11732 XX 1,DIRHNG,DNDIRH,SNDIRH,17 ;DIRHNG
11733 XX 1,TRAP,DNTRAP,SNTRAP,16 ;TRAP
11734 IFN CHAOSP, XX 2,CHAOS,CHAIDN,SNCHA,%%CHA ;CHAOS NET
11735 IFN NUNITS, XX 6,UT,DNUACII,SNUTC,%%UTP ;MICRO TAPE
11736 IFG LPTP-1, XX 2,OLP,LPTDN,SNLPD,%%OLP ;DATA PRODUCTS LPT IN 2-LPT SYSTEM
11737 .ELSE IFN OLPTP, XX 2,LPT,LPTDN,SNLPD,%%OLP ;DATA PRODUCTS LPT
11738 IFN NLPTP, XX 2,LPT,NLPTDN,SNLPV,1 ;"VOGUE" LPT (ACTUALLY ODEC)
11739 IFN GLPTP, XX 2,LPT,GLPTDN,SNLPV,1 ;GOULD LPT
11740 XX 4,DIR,DIRCHN,SNDIR,6 ;DIR "DEVICE"
11741 IFN VIDP, XX 2,NVD,NVIDOP,SNBAT,2 ;VIDISSECTOR
11742 IFN PLTP, XX 2,PLT,PLTDN,SNPLT,1 ;PLOTTER
11743 IFN PTRP, XX 5,PTP,PTPI,SNPTP,1 ;PAPER TAPE PUNCH
11744 IFN IMXP, XX 4,IMX,IMPXDN,SNIMPX,1 ;INPUT A/D MULTIPLEXOR
11745 IFN OMXP, XX 4,OMX,OMPXDN,SNOMPX,1 ;OUTPUT A/D MULTIPLEXOR
11746 XX 3,CLO,DCLUAI,SNCLK,7 ;CORE LINK INPUT
11747 XX 3,CLO,DCLBO,SNCLK,10 ;CORE LINK OUTPUT
11748 IFN PTRP, XX 5,PTR,REDUAI,SNPTR,1 ;PAPER TAPE READER
11749 IFN 340P, XX 4,DIS,DN340B,SN340,2 ;340 DISPLAY
11750 ;IFN 340P, XX 1,IDS,DN340I,SN340I,2 ;340 INTERPRETIVE DISPLAY
11751 IFN CODP, XX 2,COD,CODDN,SNCOD,1 ;CODE
11752 XX 6,DSK,DQUAI,SN2311,11 ;DISK
11753 IFN VIDP, XX 4,TVC,DNVDIU,SNBAT,2 ;TV CAMERA
11754 IFN PDP6P, XX 4,PDP,PDPUIO,SNPDP,5 ;PDP-6 DEVICE
11755 IFN TABP, XX 2,TAB,DTABUI,SNTAB,2 ;TABLET
11756 IFN NMTCS, XX 6,MT0,MTUAIX,SNMTC,%%MT ;MAGTAPE
11757 XX 6,JOB,JDUAI,SNJOB,12 ;JOB DEVICES
11758 XX 6,BOJ,BDUAI,SNBOJ,13 ;BOJ DEVICE
11759 XX 1,IIP,IIOPOP,0,2 ;INTERRUPT-ON-IOPOP DEVICE
11760 XX 1,SPY,ISPY,SNSPY,20 ;SPY
11762 XX 1,STY,,SNSTY,14 ;STY INPUT
11763 XX 1,STY,,SNSTY,15 ;STY OUTPUT
11765 IFN NCPP, XX 4,NET,NETDUI,SNNET,%%NET ; Arpanet NCP
11766 IFN TCPP, XX 4,TCP,TCPDUI,SNTCP,%%TCP ; Internet TCP
11767 IFN INETP, XX 1,IPQ,IPQDN,SNIPQ,%%IPQ ; Internet Queue
11768 IFN MSPP, XX 1,MSP,MSPIO,SNMSP,2 ;MS SWITCH HACK
11769 IFN STKP, XX 1,STK,STKDP,SNSTK,2 ;STANFORD KEYBOARD
11770 IFN NTYP, XX 4,NTY,NTYIT,SNNUL,2 ;NTY 11 KLUDGE
11772 IFN .-DCHSTB-LIOTTB,.ERR BARF AT DCHSTB
11773 EXPUNGE XX,%%MT,%%UTP,%%OLP,%%NET,%%TCP,%%CHA,%%IPQ
11775 DCHSTE==.-1 ;END FOR GETSYS (CHDEVS)
11777 ;RSTB - INDEXED BY IOTTB INDEX FROM RH(IOCHNM)
11778 ;THIS TABLE IS IN 5-BIT BYTES; THE VALUES ARE THE INDICES
11779 ;INTO THE RSTB1 AND DFRCTB TABLES.
11780 .SEE RSTB ;ASSEMBLED SECOND TO GET VALUES OF TEMPORARY %%dev SYMBOLS.
11782 ;RSTB1 - INDEX FROM RSTB (BELOW)
11783 ;LH IOPUSH/POP ROUTINE, RH RESET ROUTINE
11784 RSTB1: CPOPJ,,CPOPJ ;0 RANDOM DEVICE
11785 TYIIOP,,TYIRS ;1 TTY INPUT
11786 TYOIOP,,TYORS ;2 TTY OUTPUT
11787 CPOPJ,,USRST ;3 USR DEVICE
11788 CPOPJ,,JBIRS ;4 JOB INPUT
11789 CPOPJ,,JBORS ;5 JOB OUTPUT
11790 IIOPPR,,[JRST 4,CPOPJ] ;6 INTERRUPT ON IOPOP DEVICE
11791 STYIIP,,STYIRS ;7 STY INPUT
11792 STYOIP,,STYORS ;10 STY OUTPUT
11793 CPOPJ,,CPOPJ ;11 DISK OUTPUT
11794 DIRHIP,,CPOPJ ;12 DIRHNG
11795 CPOPJ,,TRPDEV ;13 TRAP
11796 OFFSET -RSTB1 ;OPTIONAL DEVICES BEGIN HERE
11797 IFN OLPTP, %%LPT:: CPOPJ,,LPTRS
11798 IFN NLPTP, %%NLP:: CPOPJ,,NLPTRS
11799 IFN PLTP, %%PLT:: CPOPJ,,PLTRS
11800 IFN PTRP, %%PTR:: CPOPJ,,PTRRS
11801 IFN PTRP, %%PTP:: CPOPJ,,PUNCLR
11802 IFN IMXP, %%IMX:: CPOPJ,,IMPXRS
11803 IFN 340P, %%340:: CPOPJ,,DSIZAP
11804 IFN CODP, %%COD:: CODIOP,,CODRS
11805 IFN PDP6P, %%PDP:: PDPIOP,,PDPRST
11806 IFN TABP, %%TAB:: CPOPJ,,TABCLR
11807 IFN NCPP, %%NET:: NETIOP,,NETRS
11808 IFN TCPP, %%TCP:: TCPIOP,,TCPRST
11809 IFN INETP, %%IPQ:: IPQIOP,,IPQRST
11810 IFN STKP, %%STK:: CPOPJ,,STKRS
11811 IFN CHAOSP,%%CHA:: CHAIOP,,CPOPJ
11814 ;DFRCTB - INDEX FROM RSTB (BELOW)
11815 ;LH FORCE ROUTINE, RH FINISH ROUTINE
11816 DFRCTB: OPNL34,,OPNL34 ;0 RANDOM DEVICE
11817 OPNL2,,OPNL2 ;1 TTY INPUT (ILLEGAL)
11818 POPJ1,,TTYFIN ;2 TTY OUTPUT
11819 OPNL34,,OPNL34 ;3 USR
11820 OPNL2,,OPNL2 ;4 JOB (SHOULDN'T GET HERE?)
11821 OPNL22,,OPNL22 ;5 JOB (SHOULDN'T GET HERE?)
11822 OPNL22,,OPNL22 ;6 IIP (SHOULDN'T GET HERE)
11823 OPNL2,,OPNL2 ;7 STY INPUT (ILLEGAL)
11824 POPJ1,,STYFIN ;10 STY OUTPUT
11825 QSKFRC,,QSKFIN ;11 DISK OUTPUT
11826 OPNL34,,OPNL34 ;12 DIRHNG
11827 TRPDEV,,TRPDEV ;13 TRAP
11828 OFFSET -DFRCTB ;OPTIONAL DEVICES BEGIN HERE
11829 IFN OLPTP, %%LPT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11830 IFN NLPTP, %%NLP:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11831 IFN PLTP, %%PLT:: POPJ1,,POPJ1 ;NEED TO WRITE THESE
11832 IFN PTRP, %%PTR:: OPNL34,,OPNL34
11833 IFN PTRP, %%PTP:: POPJ1,,PUNFIN
11834 IFN IMXP, %%IMX:: OPNL34,,OPNL34
11835 IFN 340P, %%340:: OPNL34,,OPNL34
11836 IFN CODP, %%COD:: POPJ1,,CODFIN
11837 IFN PDP6P, %%PDP:: OPNL34,,OPNL34
11838 IFN TABP, %%TAB:: OPNL34,,OPNL34
11839 IFN NCPP, %%NET:: NETFRC,,NETFIN
11840 IFN TCPP, %%TCP:: TCPFRC,,TCPFIN
11841 IFN INETP, %%IPQ:: IPQFRC,,IPQFIN
11842 IFN STKP, %%STK:: OPNL34,,OPNL34
11843 IFN CHAOSP,%%CHA:: CHAFRC,,CHAFIN
11846 ;TABLE OF INDICES INTO THE RSTB1, DFRCTB TABLES ON THE PRECEDING PAGE
11847 ;THESE INDICES ARE UNRELATED TO THE INDICES IN DCHSTB A COUPLE PAGES BACK.
11848 ;NOTE THAT THE %% SYMBOLS ARE PURELY TEMPORARY AND EXPUNGED AT THE BOTTOM OF THIS PAGE.
11853 REPEAT 2,1 ;TTY INPUT
11854 REPEAT 2,2 ;TTY OUTPUT
11855 REPEAT 4,0 ;NUL DEVICE
11856 REPEAT 4,3 ;USR DEVICE
11857 REPEAT 2,0 ;FOREIGN USR
11860 IFN CHAOSP, REPEAT 2,%%CHA
11861 IFN NUNITS, REPEAT 6,0 ;DEC TAPE
11862 IFN OLPTP, REPEAT 2,%%LPT
11863 IFN NLPTP, REPEAT 2,%%NLP
11864 IFN GLPTP, REPEAT 2,0
11865 REPEAT 4,0 ;DIR "DEVICE"
11866 IFN VIDP, REPEAT 2,0
11867 IFN PLTP, REPEAT 2,%%PLT
11868 IFN PTRP, REPEAT 5,%%PTP
11869 IFN IMXP, REPEAT 4,%%IMX
11870 IFN OMXP, REPEAT 4,0
11871 REPEAT 6,0 ;CORE LINK.
11872 IFN PTRP, REPEAT 5,%%PTR
11873 IFN 340P, REPEAT 4,%%340
11875 IFN CODP, REPEAT 2,%%COD ;CODE
11876 REPEAT 3, 0 ? 11 ;DISK IN, DISK OUT
11877 IFN VIDP, REPEAT 4,0
11878 IFN PDP6P, REPEAT 4,%%PDP ;PDP-6 DEVICE
11879 IFN TABP, REPEAT 2,%%TAB
11880 IFN NMTCS, REPEAT 6,0 ;MAGTAPE
11884 REPEAT 3,[0 ;BOJ INPUT
11887 6 ;INTERRUPT ON IOPOP DEVICE
11889 7 ? 10 ? 7 ? 10 ;PSEUDO-TTY
11890 IFN NCPP, REPEAT 4,%%NET ;NET RESET INR/INS
11891 IFN TCPP, REPEAT 4,%%TCP ; TCP RESET
11892 IFN INETP, %%IPQ ; Internet Queue
11893 IFN MSPP, 0 ;MS SWITCH HACK
11894 IFN STKP, %%STK ;STANFORD KEYBOARD
11895 IFN NTYP, REPEAT 4,0 ;NTY 11 KLUDGE
11897 IFN LIOTTB-.BYTC,.ERR BARF AT RSTB
11899 EXPUNGE %%LPT,%%NLP,%%PLT,%%PTR,%%PTP,%%IMX,%%340,%%COD,%%PDP,%%TAB,%%NET,%%TCP,%%STK,%%CHA,%%IPQ
11904 DEFINE DV NAME,OPNRTE,BITS,TAG
11906 DVHR [DEFINE DVHR X,Y
11907 X!][TAG BITS,,OPNRTE
11911 ;DEVICE TABLES FOR AOPEN
11913 ;DEVTAB SIXBIT NAME
11915 %DVIN==400000 ;4.9 DEVICE CAN DO INPUT
11916 %DVOUT==200000 ;4.8 DEVICE CAN DO OUTPUT
11917 %DVDIR==100000 ;4.7 DEVICE CAN GIVE DIRECTORY
11918 %DVDEL==40000 ;4.6 ALLOW DELETE/RENAME
11919 %DVLNK==20000 ;4.5 ALLOW MLINK
11920 ;RIGHT HALF, OPEN ROUTINE ADDRESS
11921 %DV==1,,520000 ;BIT TYPEOUT MASK
11924 IFN NLPTP, DV LPT,NLPTO,%DVOUT
11925 IFG OLPTP-NLPTP,DV LPT,LPTO,%DVOUT
11926 IFG LPTP-1, DV OLP,LPTO,%DVOUT
11927 IFN GLPTP, DV LPT,GLPTO,%DVOUT
11928 IFN TTLPTP, DV LPT,LPTO,%DVOUT
11930 DV DSK,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAQSK:
11931 DV COM,COMO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11932 MNAME [ DV ],QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;"AI:" ON
11934 IFE MCOND MC,[ ; When MC and MX swap names, these names will stay
11935 IFN KL10P, DV KL,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11936 IFN KS10P, DV KS,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11939 IFN KL10P, DV KL,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11940 IFN KS10P, DV KS,QSKO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11942 DV SYS,SYSO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11943 DV DNRF,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11944 DV DNR,DNRFO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;DSK NO REF DATE
11945 DV DIRHNG,DIRHO,%DVIN+%DVDIR
11946 DV TRAP,TRPDEV,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11947 DV TTY,TTYO1,%DVIN+%DVOUT+%DVDIR
11948 DV NUL,NULO,%DVIN+%DVOUT
11949 DV USR,USRO,%DVIN+%DVOUT
11950 IFN VIDP, DV NVD,NVIDI,%DVIN+%DVOUT
11951 IFN CHAOSP, DV CHAOS,CHASO,%DVIN+%DVOUT
11952 IFN NCPP, DV NET,NETO,%DVIN+%DVOUT
11953 IFN TCPP, DV TCP,TCPO,%DVIN+%DVOUT
11954 IFN INETP, DV IPQ,IPQO,%DVIN+%DVOUT
11955 IFN MSPP, DV IPC,IPCO,%DVIN+%DVOUT
11956 DV STY,STTYO,%DVIN+%DVOUT
11957 DV JOB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK,DVAJOB:
11958 DV BOJ,BOJO,%DVIN+%DVOUT
11959 DV OJB,JOBO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11960 IFN STKP, DV STK,STKO,%DVIN
11961 IFN PLTP, DV PLT,PLOTO,%DVOUT
11962 IFN PLTP, DV IPL,IPLO,%DVOUT ;INTERPRETED PLOTTER
11963 IFN XGP, DV XPL,XPLO,%DVOUT
11964 IFN IMXP, DV IMX,IMPXO,%DVIN
11965 IFN OMXP, DV OMX,OMPXO,%DVOUT
11966 IFN PTRP, DV PTR,PTRO,%DVIN
11967 IFN PTPP, DV PTP,PTPO,%DVOUT
11968 IFN 340P, DV DIS,DISO,%DVOUT ;340 AS OUTPUT DEVICE
11969 ;IFN 340P, DV IDS,IDISO,%DVOUT ;340 AS INTERPRETED DISPLAY
11970 DV CLU,CLUO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11971 DV CLO,CLOO,%DVIN+%DVOUT+%DVDIR+%DVDEL
11972 DV CLI,CLIO,%DVOUT+%DVDIR+%DVDEL
11973 DV CLA,CLAO,%DVIN+%DVDIR+%DVDEL
11974 IFN CODP, DV COD,CODO,%DVOUT
11975 IFN VIDP, DV TVC,TVCO,%DVIN+%DVOUT
11977 IFN TPLP+TTLPTP&DEMON, DV TPL,TPLO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK
11978 IFN TABP, DV TAB,TABO,%DVIN
11980 DV COR,CORO,%DVDIR ;DIR=LAST LINE OF TTY^F
11981 IFN NTYP, DV NTY,NTYOPN,%DVIN+%DVOUT ;NTY 11 KLUDGE
11985 DVT1: DV TTY,TTYO,%DVIN+%DVOUT+%DVDIR
11986 DV TY,TTYO,%DVIN+%DVOUT+%DVDIR
11987 DV T,TTYO,%DVIN+%DVOUT+%DVDIR
11988 IFN NUNITS, DV UT,UTO,%DVIN+%DVOUT+%DVDIR+%DVDEL,DVAUT:
11989 DV STY,STTYOA,%DVIN+%DVOUT
11990 DV ST,STTYOA,%DVIN+%DVOUT
11991 DV S,STTYOA,%DVIN+%DVOUT
11992 DV DSK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR UNIT
11993 DV DK,QSKUO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR UNIT
11994 DV PK,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR PACK
11995 DV P,QSKPO,%DVIN+%DVOUT+%DVDIR+%DVDEL+%DVLNK ;PARTICULAR PACK
11996 IFN NMTCS, DV MT,MAGTO,%DVIN+%DVOUT ;MAGTAPE
11999 EDEVS==.-1 ;END FOR GETSYS (DEVS)
12002 IFN .-DEVADR-NDEVS-NDV1,.ERR DVHR LOST
12004 SUBTTL .OPER, .CALL DISPATCH
12006 AOPER: MOVE J,R ;AC FIELD OF UUO
12007 ADDI R,IOCHNM(U) ;SET UP IO CHANNEL REFERENCE POINTER
12008 CAIL C,MXOPR ;SKIP IF UUO E FIELD IS LESS THAN MAX OPR
12009 JRST ILUUO ;ILLEGAL OPER
12010 JRST @OPRDSP(C) ;LEGAL OPER-- DISPATCH ON E FIELD OF UUO
12013 OPRIRP A!X ;AITYI,ALISTEN,ASLEEP,ETC.
12018 ACALL: MOVE B,C ;SET UP COPY OF ERR ADR NOT TO BE RELOCATED
12019 JRST @CALDIS(R) ;DISPATCH INDEX OF UUO'S AC FIELD
12036 REPEAT 20-.+CALDIS,ILUUO
12038 SUBTTL MISCELLANEOUS UUO'S
12042 ASHUTD: UMOVE C,(J) ;Arg is time to down in thirtieths.
12043 JUMPL C,AREVIV ;Negative time means REVIVE.
12044 CAMG C,[43200.*30.*60.] ;If time is longer than thirty days
12045 CAIGE C,5*60.*30. ; or less than five minutes
12046 POPJ P, ; Fail (prevent clock delta-T from losing).
12047 ADD C,TIME ;Interval+now is when we will die.
12048 PUSHJ P,SWTL ;Seize shutdown lock.
12050 SKIPGE SHUTDN ;Already down?
12052 PUSHJ P,CLQDEL ;Flush obsolete clock queue entry, if any.
12054 MOVEM C,SHUTDN ;Remember time we will die.
12055 SUB C,TIME ;Interval until death.
12056 LSH C,1 ;Time till death after next clock-queue int.
12057 MOVEM C,DEDTIM ;Remember time until death.
12058 PUSHJ P,DEATHX ;Make DEATH entry on clock queue.
12059 BUG ; DEDTIM says time to die already?
12060 JRST LSWPJ1 ;Unlock shutdowns.
12062 ;READ TIME TILL SYSTEM DOWN
12064 ADIETI: XCTR XW,[SETOM (J)] ;READ -1 IF NOT GOING DOWN
12068 JRST APTUAJ ;GIVE TO USER
12072 AREVIV: PUSHJ P,SWTL
12075 JRST LSWPOP ;NOT DYING
12083 ;FROM CLOCK QUEUE BLOCK
12085 DEATHZ: PUSHJ P,DEATHX
12089 PUSHJ P,SUPSET ;DIE
12093 ;GET VARIOUS SYS STATUS
12095 ASSTAT: CONO PI,CLKOFF
12099 SUBI A,1 ;TIME TILL DOWN IF > 0, -1 IF UP, -2 IF DOWN
12106 MOVE TT,[ITSMCH] ;SIXBIT NAME OF THIS MACHINE.
12108 MOVN Q,USRHI ;Q GETS NUMBER OF FREE JOB SLOTS
12112 ASSTT1: SUBI J,LUBLK
12118 SUBTTL SYMBOLIC SYSTEM CALL HANDLER
12120 ;IN ORDER @A...Z[\]^_ !".../0...9:;,=.? (THAT IS IN NUMERICAL ORDER)
12122 SYSCTB: SIXBIT /ACCESS/ ;IOCHNL, ADR
12125 SIXBIT /CALL/ ;SIXBIT /<NEXT CALL>/
12130 SIXBIT /CLOSE/ ;IOCHNL
12131 SIXBIT /CNSGET/ ;GET SEMIPERMANENT TTY INFO
12132 SIXBIT /CNSSET/ ;SET SEMIPERMANENT INFO (TCMXH, TCTYP, TTYOPT, TTYCOM, ETC)
12133 SIXBIT /CORBLK/ ;HACK PAGE MAP
12134 SIXBIT /CORTYP/ ;READ STATUS OF PAGE.
12135 SIXBIT /DELETE/ ;FILE DELETE
12136 SIXBIT /DELEWO/ ;DELETE FILE OPEN ON SPEC'D CHANNEL
12137 IFN DEMON,SIXBIT /DEMSIG/ ;SIGNAL DAEMON
12138 SIXBIT /DETACH/ ;DISOWN ENTIRE TREE
12141 SIXBIT /DISOWN/ ;DISOWN AN INFERIOR JOB
12142 IFN DL10P, SIXBIT /DL10MP/
12143 SIXBIT /DSKUPD/ ;SIMULATE REFERENCE OF FILE
12144 SIXBIT /ECHOIN/ ;ECHO-NEGOTIATE
12145 SIXBIT /FILBLK/ ; READ NAME AREA OF FILE
12146 SIXBIT /FILLEN/ ;READ FILE LENGTH
12148 SIXBIT /FLAP/ ;TAPE #
12149 SIXBIT /FLUSH/ ;OLD NAME FOR FINISH, EVENTUALLY "
12153 SIXBIT /IOT/ ;IOCHNL, QUAN OR BLK POINTER
12154 IFN INETP,SIXBIT /IPKIOT/
12156 SIXBIT /JOBCAL/ ;GENERAL JOBGET
12157 SIXBIT /JOBGET/ ;JOB CHNL
12158 SIXBIT /JOBINT/ ;JOB CHNL
12160 SIXBIT /JOBRET/ ;JOB CHNL
12162 SIXBIT /JOBSTS/ ;SET JOB CHNL STATUS
12163 IFN KL10P,SIXBIT /KLPERF/ ;ACTIVATE & CONTROL PERFORMANCE METER
12164 SIXBIT /LISTEN/ ;IOCHNL, ADR
12165 SIXBIT /LNKEDP/ ;DISK CH. RETURNS NONZERO IF LINKS WERE TRACED TO OPEN IT.
12166 SIXBIT /LOAD/ ;USER CH, I/O CH, VARBLK
12167 SIXBIT /LOGIN/ ;SIXBIT /<NAME>/
12168 SIXBIT /LOGOUT/ ;. . .
12170 SIXBIT /MLINK/ ;MAKE LINK
12171 IFN NCPP, SIXBIT /NETAC/
12172 SIXBIT /NETBLK/ ;HANG ON NCP STATE
12174 SIXBIT /NETHST/ ;GETS STATUS OF HOST
12175 SIXBIT /NETIMP/ ;GETS STATUS OF IMP
12177 IFN NCPP, SIXBIT /NETINT/
12178 IFN INETP,[ ; A temporary cond, should become permanent.
12179 SIXBIT /NETRFC/ ; Get pending request for connection
12181 SIXBIT /OPEN/ ;FILE OPEN
12182 SIXBIT /PDUMP/ ;USER CH, I/O CH, VARBLK
12183 SIXBIT /PGDUMP/ ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12184 SIXBIT /PGWRIT/ ;DUMP PAGE OUT OF CORE
12185 IFN CHAOSP, SIXBIT /PKTIOT/
12186 IFN QAUTHP, SIXBIT /RAUTH/ ;READ AUTHOR OF FILE
12187 SIXBIT /RCHST/ ;READ OPENED FILENAMES & ACCESS POINTER
12188 SIXBIT /RCPOS/ ;READ CURSOR POS
12189 IFN DEMON,SIXBIT /RDDMST/ ;READ DEAMON STATUS
12190 SIXBIT /RDMPBT/ ;READ FILE DUMPED BIT IOCHN, ADR
12192 SIXBIT /RENAME/ ;FILE RENAME
12193 SIXBIT /RENMWO/ ;RENAME WHILE OPEN
12196 SIXBIT /RESRDT/ ;RESTORE REFERENCE DATE
12197 SIXBIT /RFDATE/ ;READ TIME OF CREATION OF FILE IOCHN, ADR
12198 SIXBIT /RFNAME/ ;READ FILE NAME AND MODE CHANNEL OPEN TO
12199 SIXBIT /RFPNTR/ ;READ ACCESS POINTER
12200 SIXBIT /RQDATE/ ;READ DSK DATE
12201 SIXBIT /RSSIZE/ ;READ SCREEN SIZE
12202 IFN QAUTHP, SIXBIT /SAUTH/ ;SET AUTHOR OF FILE
12203 SIXBIT /SCML/ ;SET # COMMAND LINES
12204 SIXBIT /SCPOS/ ;SET TTY CURSOR POSITION
12205 SIXBIT /SDMPBT/ ;SET FILE DUMPED BIT IOCHN, ADR
12206 SIXBIT /SETIOC/ ;CAUSE IO CHANNEL ERROR IN JOB/BOJ CHANNEL
12207 SIXBIT /SFDATE/ ;SET TIME OF CREATION OF FILE IOCHN, ADR
12208 SIXBIT /SIOT/ ;IOT A STRING GIVEN B.P. AND LENGTH
12209 SIXBIT /SOPEN/ ;OPEN, TAKING MODE,,CHNL AND BP.
12210 SIXBIT /SRDATE/ ;SET REFERENCE DATE
12211 SIXBIT /SREAPB/ ;SET THE DO NOT REAP BIT
12212 SIXBIT /SSERVE/ ;Set .SERVER without timing errors
12213 SIXBIT /SSTATU/ ;READS VARIOUS SYSTEM STATUS
12215 IFN DEMON,SIXBIT /STDMST/ ;SET DEAMON STATUS
12216 SIXBIT /STLGET/ ;GET INFO ON SERVER TELNET CONTROLLING A STY
12217 SIXBIT /STYGET/ ;GET INFO ABOUT SPECIFIED STY
12218 IFN NETP,SIXBIT /STYNET/ ;CONNECT STY TO NETWORK SOCKETS, FOR TELNET SERVERS.
12219 SIXBIT /T11MP/ ;TEMP ? TEN11 HACKER
12220 IFN TCPP,SIXBIT /TCPOPN/ ; Open TCP Internet connection
12221 SIXBIT /TRANAD/ ;CREATE TRANSLATION ENTRY
12222 SIXBIT /TRANCL/ ;CLEAR TRANSL. LIST(S) FOR A JOB.
12223 SIXBIT /TRANDL/ ;DELETE A TRANSL. ENTRY.
12224 SIXBIT /TRANEX/ ;READ A JOB'S TRANSL. LIST.
12225 SIXBIT /TRANS/ ;TRANSLATE A FILENAME.
12226 SIXBIT /TRPOPN/ ;OPEN TRAP DEVICE FOR AN INFERIOR
12227 SIXBIT /TTYESC/ ;SIMULATE TYPING OF ^_
12228 SIXBIT /TTYFLS/ ;FLUSH ITYIC'ED INPUT
12229 SIXBIT /TTYGET/ ;SUPPLY TTY CH, RETURNS THREE WORDS OF TTY STATUS
12230 SIXBIT /TTYSET/ ;SUPPLY TTY CH AND THREE WORDS OF TTY STATUS
12231 SIXBIT /TTYVAR/ ;HACK TTY VARIABLES
12233 SIXBIT /UNLOCK/ ;UNLOCK A SPEC'D JOBS LOCKS.
12234 SIXBIT /USRMEM/ ;READ OR WRITE A JOB'S MEMORY.
12235 SIXBIT /USRVAR/ ;HACK USER VARIABLES
12236 SIXBIT /VIDBUF/ ;ASSIGN/DEASSIGN VIDEO BUFFER.
12237 SIXBIT /VIDSW/ ;SET VIDEO SWITCH.
12238 SIXBIT /WHOLIN/ ;GET OR SET WHO-LINE MODE AND JOB.
12239 SIXBIT /WHYINT/ ;FIND OUT WHY AN I/O CHANNEL INTERRUPTED
12240 SIXBIT /XGPIM/ ;OUTPUT TO XGP IN IMAGE MODE
12245 ZZ2==CONC [.LENGTH /]\ZZ,/
12247 REPEAT 1_<ZZ2>-ZZ-1,377777,,-1
12248 ;4.X BIT IMPLIES SUPPLY ROUTINE WITH POINTER TO X'TH ARG, NOT ARG ITSELF
12249 ;3.9-3.7 = MINIMUM NUMBER OF ARGS
12250 ;3.1 => DECODE 1ST ARG AS IO CHNL, LEAVING IOCHNM WD ADDR IN RH(R),
12251 ; IOCHNM WD CONTENTS IN H, CLSTB ENTRY'S LH IN LH(R).
12252 ;3.2 => NEVER PASS TO SPECIAL CHECKER FOR JOB CHNL
12253 ;3.3 => DON'T BARF IF CHNL NOT OPEN, CALLED ROUTINE WILL HANDLE IT
12255 ;# ARGS ACTUALLY SUPPLIED IN W WHEN DISPATCHING THRU SYSCTD, ARGS IN A...J
12256 SYSCTD: 200,,NACCES
12271 IFN DEMON,100,,ADEMSIG
12276 IFN DL10P, 100,,DL10MP
12282 IFN NUNITS, 100,,NFLAP
12283 IFE NUNITS, 100,,OPNL1
12284 100,,NFINIS(1) ;OLD NAME FOR FINISH, EVENTUALLY FLUSH
12288 2100,,NIOT(7) ;(7) FOR CHNL NOT OPEN TO BE IOC ERROR, (3) TO BE OPEN LOSS
12289 IFN INETP, 100,,IPKIOT(1) ; Requires at least 1 arg
12306 IFN NCPP, 100,,ANETAC(1)
12308 IFE CHAOSP, 4200,,ANETBLK(1)
12309 IFN CHAOSP, 4200,,CHANBK(1)
12311 IFN INETP, 4200,,NETBLK(1) ; Block (.hang) on net I/O channel
12316 IFN NCPP, 100,,NNETINT(1)
12317 IFN INETP, 100,,NETRFC
12320 100,,NPGWRT ;OLD NAME FOR PGWRIT, EVENTUALLY DELETE
12322 IFN CHAOSP, 200,,PKTIOT(1)
12323 IFN QAUTHP, 100,,ARAUTH(1)
12326 IFN DEMON,100,,ARDDMST
12339 IFN QAUTHP, 200,,ASAUTH(1)
12345 6300,,NSIOT(7) ;(7) FOR IOC ERROR IF CHNL NOT OPEN, (3) FOR OPEN LOSS
12352 IFN DEMON,100,,ASTDMST
12355 IFN NETP,200,,NSTYNT(3)
12357 IFN TCPP,500,,TCPOPN
12379 IFN .-SYSCTD-1-ZZ,.ERR NEW SYS CALL DISPATCH LOSES!!!
12381 REPEAT 1_<ZZ2>-ZZ-1,ILUUO
12383 ;.CALL ADR1 SKIPS UNLESS SOMETHING WRONG
12385 ; SIXBIT /<CALL NAME>/
12386 ; REPEAT #ARGS,BITS,, <ADDRESS OF ARGUMENT>
12387 ; BITS= 4.9 => LAST ARG
12388 ; 4.3 - 4.1 0 = NORMAL ARG
12391 ; 3 = RETURN THE FAILURE CODE IF FAIL
12392 ; 4 = WORD OF CONTROL BITS
12393 ; 5 = IMMEDIATE CONTROL BITS
12395 ASYSC: PUSHJ P,ASCGRG ;B HAS E OF UUO
12396 JRST OPNL43 ;CALL NAME UNKNOWN.
12397 JRST OPNL15 ;MORE THAN 8 ARGS
12398 JRST OPNL30 ;TOO FEW ARGS
12399 PUSHJ P,ASYSC1 ;DISPATCH TO ROUTINE.
12400 POPJ P, ;NO SKIP - OPENL HAS ALREADY BEEN CALLED.
12401 AOS (P) ;SKIP - PROPAGATE THE SKIP UP THE PDL
12403 MOVE R,SYSCVL(U);SUCCESS RETURN, ZERO ERROR CODE ARG IF ANY
12405 XCTR XW,[SETZM (R)]
12406 JUMPGE R,CPOPJ ;JUMP IF NO OUTPUT VALUES WANTED
12407 SYSCPT: HRRZ W,FORTY ;VALUES WANTED, PUT INTO USER MEMORY FROM ACS
12410 SYSCP2: UMOVE R,(W)
12418 SYSCP3: JUMPL R,CPOPJ
12421 ASYSC1: MOVE T,SYSCTD(H)
12422 TLNN T,1 ;DECODE 1ST ARG AS IO CHNL?
12423 JRST (T) ;NO, DISPATCH TO CALL.
12424 TLNE T,2 ;OK TO GIVE TO JOB CHNL CHECKER?
12425 JRST CHNDCD ;NO - GO DECODE CHANNEL
12426 HRL J,T ;SAVE DISPATCH ADDR
12427 HRRI T,AIOCAL ;MAKE DECODER RETURN TO CHECK FOR JOB DEVICE
12433 SETZM A+7 ;MAX 8 ARGS, 1 USED FOR NAME
12437 MOVEI J,ASYSC+2 ;LOOK LIKE PUSHJ'ED FROM ASYSC
12439 LDB J,[331000,,SYSCTD(H)]
12442 JRST NCALL3 ;HE WANTS POINTERS, WE HAVE JUST VALUES.
12443 ;MUST GET ARGS AGAIN
12446 REPEAT ZZ2,[CAML T,SYSCTB+1_<ZZ2-.RPCNT-1>(H)
12447 ADDI H,1_<ZZ2-.RPCNT-1>
12453 ;JSP T,HERE TO DECODE IO CHNL IN A, MODIFIERS IN 3.1-3.3 OF T.
12454 ;IF RH(T) = AIOCAL, LH(J) IS REAL RETURN ADDRESS.
12455 ;RETURNS IOCHNM ADDR IN RH(R), IOCHNM WD CONTENTS IN H, CLSTB BITS IN LH(R)
12456 ;CAN POPJ OUT FOR INVALID CHANNEL.
12458 CHNDCD: TRNE A,-NIOCHN ;IS 1ST ARG A LEGAL CHNL NUM?
12461 HRROM A,UUAC(U);REMEMBER CHNL # FOR IOC ERRORS, ETC.
12463 ADDI R,IOCHNM(U) ;YES, COMPUTE IOCHNM WD ADDR
12464 MOVE H,(R) ;RETURN CONTENTS IN H.
12465 HLL R,CLSTB(H) ;RETURN CLSTB BITS IN LH(R).
12467 JRST [ CAME U,USER ;TRAP DEVICE
12468 JRST .+1 ;IF CHANNEL BELONGS TO THIS USER, TRAP
12469 JRST TRPDEV ] ;OTHERWISE, IS PROBABLY RFNAME, LET IT THROUGH
12470 TRNN H,-1 ;IF CHNL NOT OPEN
12471 TLNE T,4 ;AND NOT SPECIALLY OK FOR THIS SYSTEM CALL
12473 JRST OPNL44 ;THEN BARF
12475 ;JOB DEVICE CHECKER - PUT AIOCAL IN RH(T), JRST CHNDCD
12477 AIOCAL: HLRZ T,J ;GET DISPATCH ADR BACK
12478 TLNN R,%CLSJ ;IS CHANNEL JOB DEVICE?
12479 JRST (T) ;NO - DISPATCH
12480 HLRZS H ;ISOLATE JOB DEVICE INDEX
12481 DPB W,[230400,,JBSTS(H)] ;SAVE ARG COUNT
12484 HRRI W,1 ;NOW HAVE AOBJN PNTR TO DATA
12485 MOVE T,(W) ;COPY ARGS TO JOB AC TABLES
12486 MOVEM T,@JBACTB-1(W)
12488 MOVEI W,10 ;SET NON-STANDARD OP-CODE
12490 MOVE E,H ;PUT JOB INDEX IN E FOR JBWT
12492 AIOCA1: PUSHJ P,JBWT ;WAIT FOR JOB TO ANSWER
12493 MOVE H,E ;GET JOB INDEX BACK IN H (FOR JBACTB)
12494 MOVE W,[-8,,1] ;LOAD ANSWERS INTO ACS
12495 MOVE T,@JBACTB-1(W)
12498 LDB T,[350400,,JBSTS(H)] ;GET SKIP COUNT
12499 JUMPN T,POPJ1 ;SKIP COUNT NOT ZERO - SKIP
12500 LDB C,[270600,,JBSTS(H)] ;GET OPEN LOSS CODE
12501 SKIPE C ;MAKE SURE IN BOUNDS
12504 JRST OPNL1-1(C) ;GO REPORT LOSSAGE AND DON'T SKIP
12506 ;SYSTEM CALL GET ARGS
12507 ASCGRG: UMOVE T,(B)
12513 POPJ P, ;CALL NAME UNRECOGNIZED.
12515 LDB J,[331000,,SYSCTD(H)] ;GET BITS CORRESP TO ARGS WHICH SAY SUPPLY PNTR TO NTH ONE
12516 NCALL3: MOVEI W,2(B)
12519 ASYSC2: UMOVE R,(W)
12521 PUSHJ P,ASCIND ;CALC EFFECTIVE ADDRESS
12523 JRST ASYSC3 ;OUTPUT OR ERRORCODE ARG
12525 JRST ASYSC5 ;CONTROL BITS
12528 JUMPL J,ASYSC7 ;J IF WANT ADDRESS, NOT VALUE
12530 TLZA R,-1 ;IMMEDIATE, GET 0,,ADR
12531 UMOVE R,(R) ;ELSE GET WORD POINTED TO
12532 ASYSC7: MOVEM R,-1(T) ;PUT INTO AC
12535 ASYSC5: TLNE R,1000 ;CTL BITS
12536 TLZA R,-1 ;IMMEDIATE, GET 0,,ADR
12537 XCTR XR,[HRRZ R,(R)] ;ELSE WORD ADDRESS
12538 XORM R,CTLBTS(U) ;XOR ALL THESE ARGS TOGETHER
12539 ASYSC4: XCTR XR,[SKIPL (W)] ;SKIP IF TERMINATE BIT ON
12542 ADDI W,9 ;COMPUTE NUMBER OF ARGUMENTS SUPPLIED
12543 NCALL2: LDB T,[300300,,SYSCTD(H)]
12545 JUMPG T,POPJ1 ;NOT ENOUGH ARGS
12548 ASYSC3: TLNE R,1000
12549 JRST ASYSC8 ;ERROR CODE ARG
12550 XCTR XRW,[MOVES (R)] ;OUTPUT ARG, JUST MAKE SURE IT'S THERE
12551 MOVSI R,%SCVOT ;AND FLAG PRESENCE
12552 ASYSC9: IORM R,SYSCVL(U)
12555 ASYSC8: HRLI R,%SCVER ;ERROR-CODE ARG
12556 TDNE R,SYSCVL(U);CAN'T HAVE MORE THAN ONE ERRORCODE ARG
12557 JRST CPOPJ ;SAY "TOO MANY ARGS"
12558 XCTR XRW,[MOVES (R)] ;MAKE SURE IT'S THERE; MUSTN'T PCLSR OUT OF OPENL
12561 ;PERFORM INDEXING AND INDIRECTION ON ADDRESS WORD IN R.
12562 ;DON'T CLOBBER BITS 3.6 - 4.9. SET BITS 3.1 - 3.5 TO ZERO
12569 XCTR XR,[HRRZ R,(R)]
12571 HLL R,(P) ;GET ORIG @, MAY HAVE BEEN CARRIED INTO BY -1(17)
12579 PUSHJ P,OPBRK ;ALLOW PCLSR
12582 TPFLT: CONO PI,CLKOFF ;PREVENT INTERRUPT AFTER IORM SPM ING BACK
12583 ; ON TOP OF 1000 BIT
12590 LPMRI UPGML(U) ;TAKE TRAP, MAYBE DONT COME BACK
12594 POP P,PFOPC1 ;IF RESTART FAULT, RETURN FROM TPFLT
12595 JRST TPFLT1 ;JOIN REGULAR PAGE FAIL CODE
12598 POP P,EPTPFO ; If fault returns, just return from TPFLT
12604 ;`PDUMP' SYMBOLIC SYSTEM CALL
12605 ; ARG 1 - JOB SPEC FOR JOB TO BE DUMPED
12606 ; ARG 2 - DISK CHANNEL TO DUMP ONTO
12607 ; ARG 3 - STATE WORD (MODIFIED) INITIALLY 0, THEN 4.9 + PAGE # ABOUT TO DUMP
12610 JSP T,NCRUI2 ;DECODE JOB SPEC (1ST ARG)
12613 JUMPL J,OPNL31 ;CAN'T PDUMP THE PDP6.
12615 JSP T,PDUMDC ;DECODE 2ND ARG, B-> IOCHNM WORD.
12617 JRST OPNL34 ;NOT DISK WRITE CHANNEL.
12618 HRRZM D,UUAC(U) ;SO SET IN CASE OF ERROR
12620 MOVEM D,SRN3(U) ;REMEMBER DISK CHANNEL NUMBER FOR LATER.
12622 XCTR XRW,[MOVES D,(C)]
12623 MOVEM C,SRN4(U) ;REMEMBER STATE WORD ADDRESS FOR LATER
12624 MOVEM A,EPDL(U) ;USER INDEX
12625 PDUMA: CAIN A,(U) ;IF PDUMP'ING SELF, MUSTN'T PCLSR,
12626 PUSHJ P,NULSET ;SO DO A NULSET INSTEAD OF THE SOSSET
12628 JRST PDUMP9 ;SO THAT A LSWPOP CAN BE DEON AT THE END IN EITHER CASE.
12629 PUSHJ P,RPCLSR ;HACKING ANOTHER JOB: STOP IT.
12632 PDUMP9: MOVE A,SRN3(U) ;GET DISK CHANNEL NUMBER
12634 UMOVE D,(C) ;PICK UP STATE WORD
12635 JUMPN D,PDUMP5 ;JUMP IF ALREADY WROTE MAP PAGE
12636 PUSHJ P,PDBWG ;GET BUFFER AND COMMIT DISK TRACK FOR MAP PAGE
12637 SETZM (E) ;CLEAR FIRST WORD OF MAP
12638 ;AND DROP INTO PDUMP4
12639 ;HANDLE THE NEXT PAGE.
12640 PDUMP4: PUSHJ P,PUPLC ;GET BYTE POINTERS
12641 LDB W,Q ;CIRC POINTER ENTRY
12642 LDB R,T ;PAGE MAP ENTRY
12643 ANDCMI R,PMAGEM ;CLEAR AGE BITS
12645 TLO R,(SETZ) ;ABS PAGE
12647 MOVEI R,0 ;PAGE NON-EXISTANT
12649 LSH R,16. ;SWAPPED OUT
12650 MOVE W,D ;VIRTUAL PAGE NUMBER
12651 ADDI W,1(E) ;ADDRESS OF ENTRY IN BLOCK
12652 MOVEM R,(W) ;STORE ENTRY
12660 MOVEI W,1000(E) ;1000-1017 ACS
12662 JRST [ XCTR XBR,.+2
12667 SETZM QSMPRC(A) ;SO NEXT IOT GETS A NEW BUFFER
12668 MOVSI D,(SETZ) ;SET STATE WORD TO `DUMPING PAGE 0'
12672 PDUMP5: MOVE C,SRN4(U) ;STORE BACK STATE WORD
12674 PDUMP8: PUSHJ P,PUPLC
12678 AOJA D,PDUMP6 ;PAGE ABSOLUTE OR NONEXISTANT
12679 PDUMP3: PUSHJ P,PDBWG ;GET BUFFER AND COMMIT DISK TRACK TO DUMP THIS PAGE INTO
12680 MOVE J,EPDL(U) ;SET UP MAP TO POINT TO USER BEING DUMPED
12682 HRLZ J,D ;GET VIRTUAL ADDRESS OF PAGE BEING DUMPED
12684 HRR J,E ;BLT POINTER TO COPY THE PAGE
12685 XCTR XBR,[BLT J,1777(E)] ;COPY PAGE INTO DISK BUFFER
12686 PUSHJ P,MPLDZ ;RESTORE TO NORMAL MAP
12688 PUSHJ P,QSBWW ;WRITE OUT THE COPIED PAGE
12689 SETZM QSMPRC(A) ;SO NEXT IOT GETS NEW BUFFER
12691 AOS D ;DONE WITH THIS PAGE
12692 PDUMP6: TRNN D,400 ;SKIP IF FINISHED WHOLE ADDRESS SPACE
12694 JRST LSWPJ1 ;UNSTOP USER AND POPJ1
12696 ;ROUTINE TO GET DISK BUFFER AND COMMIT TRACK (FOR PDUMP)
12697 ;RETURNS BUFFER ADDRESS IN E. PRESERVES D.
12699 PDBWG: SKIPL E,QSMDN(A) ;GET CORE BLOCK # OF DISK BUFFER
12700 JRST [ LSH E,10. ;CONVERT TO ADDRESS
12702 MOVE E,[444400,,1] ;NO BUFFER, GET ONE
12705 PUSHJ P,UDELAY ;CAN'T GET MEMORY, WAIT A WHILE
12708 ;ROUTINE TO LOOK UP PAGE (FOR PDUMP AND PURE LOAD)
12709 ;PAGE# IN RH(D), USER# IN EPDL(U). RESULTS FROM UPLC IN Q AND T.
12720 ;DECODE 2ND ARG TO PDUMP & LOAD.
12721 ;B GETS IOCHNM WORD ADDR, LH OF J GETS LH OF CLSTB ENTRY, RH GETS LH(IOCHNM).
12723 PDUMDC: TRNE B,-NIOCHN
12731 SUBTTL PURE AND SBLK LOAD
12733 ;`LOAD' SYMBOLIC SYSTEM CALL
12734 ; ARG 1 - JOB SPEC FOR JOB TO BE LOADED
12735 ; ARG 2 - DISK CHANNEL TO LOAD FROM
12736 ; ARG 3 - (OPTIONAL) FIRST ADDR,,LAST ADDR TO BE LOADED
12737 ; OR ZERO => LOAD ONLY PURE PAGES
12738 ; WHEN LOADING A PDUMPED FILE, FIRST,,LAST ROUNDED OFF TO PAGES
12739 ; DEFAULT 3RD ARG IS 0,,-1 NORMALLY, 20,,-1 LOADING SELF, 20,,37777 LOADING PDP6
12742 ;4.9=1 ABSOLUTE, 1.1-2.9 = PTW
12743 ;4.8=1 SHARED WITH OTHER PAGES AT LEAST ONE OF WHICH IS WRITE
12744 ;4.7=1 LINK WITH VIRT PG IN RH 1.8-1.1
12745 ;2.9-2.8 0 NXM, 1 RD ONLY, 2 OR 3 READ/WRITE
12746 ;2.7=1 WORD ALREADY PROCESSED
12749 JSP T,NCORUI ;DECODE THE JOB SPEC.
12750 JRST NLOAD6 ;JOB GUARANTEED WRITEABLE.
12751 JSP T,NCORWR ;ELSE CHECK IF WRITEABLE.
12752 CAIN J,-1 ;BUT CAN WRITE PDP6.
12754 JRST OPNL31 ;NOT WRITEABLE.
12755 NLOAD6: HRREI A,(J) ;MAKE SURE EXTEND SIGN IF PDP6.
12756 JSP T,PDUMDC ;DECODE 2ND ARG.
12759 JRST OPNL34 ;NOT DISK READ CHANNEL.
12762 JRST OPNL12 ;"MODE NOT AVAILABLE" IF CHANNEL NOT 36-BIT BYTES.
12763 MOVE R,B ;IOCHNM ADDRESS IN CASE WE GET TO QICL
12764 JUMPL A,NLOADE ;DONT STOP THE 6
12766 JRST NLOADA ;DONT STOP IF LOADING INTO SELF
12768 PUSHJ P,LSWPOP ;SOS JOB'S DIELOK - IT CAN'T DIE WHILE STOPPED.
12769 MOVSI T,BSSTP ;STOPPING WITH BSSTP INSTEAD OF RH OF USTP
12770 IORM T,USTP(A) ;AVOIDS DEADLY EMBRACE WITH CORE JOB (SEE CUSTOP)
12772 PUSHJ P,LOSSET ;ARRANGE TO CLEAR BSSTP ON PCLSR.
12775 HRLOI C,0 ;DEFAULT 3RD ARG
12778 NLOADA: PUSHJ P,LSWPOP ;DIELOK
12780 HRLOI C,20 ;DEFAULT 3RD ARG
12781 NLOADE: MOVEM A,SRN3(U) ;SAVE USER INDEX (-1 => PDP6)
12783 JUMPL A,[HLRZ A,C ;PDP6, ENSURE LIMITS SMALL ENOUGH
12785 HRLI C,20 ;ACS NOT ACCESSIBLE
12786 MOVEI A,LPDP6M*2000-1
12788 HRR C,A ;HAS ONLY 16K MEMORY
12792 MOVEM A,SRN4(U) ;SAVE # OF DISK CHANNEL
12793 SETZM SRN5(U) ;START LOADING AT VIR PG #0
12794 MOVEM C,EPDLT1(U) ;SAVE LOAD LIMITS
12797 JRST OPNL33 ;FIRST > LAST
12802 JRST NLDSBB ;(COMING BACK AFTER PCLSR)
12806 ;GET FIRST BLOCK OF FILE BEING LOADED
12807 NLOADD: CAMN U,PCLUSR
12813 PUSHJ P,UFLS ;HANG UNTIL A BLOCK IS READ IN
12815 TLNE Q,%QAACC+%QAMPU+%QAPAR
12816 JRST OPNL7 ;LOST ONE WAY OR ANOTHER
12819 PUSHJ P,QSBGB ;SET UP CHNL AREA. TT ADDR OF FIRST WORD OF BLOCK
12821 JRST NLOADC ;QSBGB SKIPS FOR NORMAL RETURN
12822 JRST OPNL46 ;SKIPPED TWICE => EOF
12824 NLOADB: MOVE J,QMPBSZ(A)
12826 NLOADC: SKIPE (TT) ;SKIP IF PURE DUMPED FILE
12829 JRST OPNL34 ;TRYING TO PURE LOAD PDP6
12830 MOVSI Q,%QAACC ;WILL GO RANDOM ACCESSING THROUGH FILE
12831 IORM Q,QSRAC(A) ;THIS ALSO INHIBITS ACTIVATION AT PI LEVEL
12832 HLRZ H,EPDLT1(U);LOW LOAD BOUNDARY
12835 JRST NLOADH ;ACS NOT BE LOADED
12836 MOVSI Q,1000(TT);ADDRESS OF DUMPED ACS
12839 HRRZ H,EPDLT1(U);HIGH LOAD BOUNDARY
12842 HRRZ J,SRN3(U) ;JOB TO BE LOADED
12844 XCTR XBW,[BLT Q,(H)] ;LOAD UP HIS ACS
12846 NLOADH: MOVEI R,1(TT) ;ADDRESS OF FIRST WORD OF DUMPED MAP
12847 MOVEM R,EPDL3(U) ;SAVE
12849 PUSHJ P,QFNTR ;FIND DISK ADDRESS OF SECOND BLOCK
12850 JRST OPNL46 ;OFF END OF FILE
12851 SOS QSBI(A) ;UNDO QFNTR HACK
12853 PUSHJ P,QUDULK ;UNLOCK USER DIRECTORY
12854 PUSHJ P,SWTL ;LOCK CIRPSW
12858 ;HERE TO DO NEXT PAGE (WHEN LOADING PDUMPED FILE)
12859 NLOAD0: PUSHJ P,OPBRK
12861 TRNE A,600000 ;SKIP IF NO ACCESS (IGNORE)
12863 JRST NLD14 ;THIS PAGE ALREADY DONE OR NO ACCESS
12865 TRNE A,400000 ;SKIP IF READ ONLY
12866 JUMPE Q,NLD14 ;IMPURE NOT BE LOADED
12867 MOVE A,SRN5(U) ;VIRTUAL PAGE NUMBER
12869 AND Q,[-2000,,-2000]
12870 LSH Q,-10. ;FIRST PAGE,,LAST PAGE
12874 JRST NLD14 ;PAGE OUTSIDE OF RANGE TO BE LOADED
12875 NLD16: MOVE U,SRN3(U) ;USER INDEX
12877 LDB R,Q ;LOOK IN CIRCULAR POINTER ENTRY FOR THIS PAGE
12878 JUMPE R,NLOAD1 ;DOESN'T ALREADY HAVE THIS VIRTUAL PAGE
12879 PUSH P,T ;SAVE BYTE POINTER TO PAGE MAP FOR THIS VIRTUAL PAGE
12880 PUSH P,Q ;SAVE BYTE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12881 PUSHJ P,PAGERT ;FLUSH THE ALREADY EXISTING VIRTUAL PAGE
12884 NLOAD1: MOVE U,USER
12885 MOVE R,@EPDL3(U) ;PICK UP DUMPED PAGE MAP WORD
12886 ANDCMI R,PMAGEM ;CLEAR AGE BITS (WOULD LOSE AT NLOAD4+4)
12887 JUMPGE R,NLOAD3 ;NOT ABSOLUTE PAGE
12888 ANDI R,PMRCM ;ABS PG #
12890 IFE PDP6P, JRST OPNL32
12892 JRST [ CAIGE R,<PDP6BM_-10.+LPDP6M>
12893 CAIGE R,<PDP6BM_-10.>
12895 HRRZ R,@EPDL3(U) ;ALLOW USER TO LOAD WRITABLE PDP6 PAGES.
12896 ANDCMI R,PMAGEM\PMUNSD ;GIVE HIM WHATEVER ACCESS HE RQ'S.
12898 ;IFN TEN11P,[ ;NOT NECESSARY SINCE 10-11 PAGES ABOVE TSYSM NOW
12901 ; MOVE E,T11MP-400(R)
12902 ; AOJN E,NLOAD2 ;DONT ALLOW PAGE TO POINT TO TEN11
12905 LDB E,[MUR,,MEMBLT(R)]
12907 TDZA R,R ;IF PAGE NXM TODAY, DON'T ACTUALLY GIVE ACCESS
12909 NLOAD5: TRO R,200000 ;RD ONLY
12910 DPB R,T ;STORE ENTRY IN PAGE MAP
12912 DPB R,Q ;STORE -1 IN CIRCULAR POINTER
12913 NLOAD2: MOVE E,SRN5(U) ;VIRTUAL PAGE NUMBER
12914 MOVE U,SRN3(U) ;USER INDEX LOADING INTO
12915 PUSHJ P,GHUSRA ;RECOMPUTE HUSRAD
12918 IORB R,@EPDL3(U) ;MARK DUMPED PAGE WORD AS ALREADY DONE
12919 MOVE A,SRN4(U) ;DISK CHANNEL
12920 TLNN R,500000 ;SKIP IF NO CORRESPONDING BLOCK IN FILE
12921 TRNN R,600000 ;SKIP IF MUST ADVANCE ONE BLOCK
12922 JRST .+3 ;DON'T ADVANCE FILE POINTER
12923 PUSHJ P,QFNTN ;ADVANCE TO NEXT DISK ADDRESS
12924 JRST OPNL46 ;PREMATURE EOF
12925 AOS R,SRN5(U) ;NEXT VIRTUAL PAGE
12928 AOS EPDL3(U) ;NEXT MAP WORD
12931 PUSHJ P,LSWPOP ;RELEASE CIRPSW
12932 MOVE B,SRN3(U) ;USER INDEX LOADING INTO
12933 CAME B,U ;SKIP IF LOADING INTO SELF
12934 PUSHJ P,LSWPOP ;UNSTOP USER
12940 NLOAD3: TLNN R,100000 ;SKIP IF LINK WITH PAGE IN RH OF R
12942 PUSH P,T ;SAVE BYTE POINTER TO MAP ENTRY FOR THIS VIRTUAL PAGE
12943 PUSH P,Q ;SAVE POINTER TO CIRCULAR POINTER ENTRY FOR THIS PAGE
12944 LDB A,[1700,,R] ;VIRTUAL PAGE NUMBER BEING LINKED TO
12946 JRST NLOAD8 ;BAD VIRT PAGE #
12947 MOVE E,SRN5(U) ;VIRTUAL PAGE NUMBER OF PAGE BEING LINKED
12948 MOVE U,SRN3(U) ;USER INDEX LOADING INTO
12950 LDB W,Q ;CIRCULAR POINTER OF OTHER ENTRY
12951 JUMPE W,NLOAD8 ;DIDN'T EXIST
12953 JRST NLOAD8 ;POINTS TO AN ABSOLUTE PAGE
12957 BUG ;L DOESN'T DIVIDE U
12958 LSH C,10 ;USER NUMBER _ 8
12960 BUG ;USER INDEX WAS TOO LARGE
12961 IOR C,E ;NEW CIRCULAR POINTER
12962 POP P,D ;NEW CIRCULAR POINTER BYTE POINTER
12963 DPB W,D ;STORE OTHER ENTRY AS NEW CIRCULAR POINTER ENTRY
12964 DPB C,Q ;MAKE OTHER CIRCULAR POINTER ENTRY POINT TO NEW ONE
12965 LDB E,T ;OTHER MAP ENTRY
12966 POP P,T ;POINTER TO NEW MAP ENTRY
12967 ANDI R,600000 ;PROTECTION BITS
12974 NLOAD9: AOS SNSWPG ;INCR CNT OF SWAPPED OUT FOR SYS
12975 AOSA NSWPGS(U) ;USER LOADING INTO HAS ONE MORE SWAPPED OUT PAGE
12977 NLD13: AOS NMPGS(U) ;USER HAS ONE MORE PAGE
12978 AOS SNMPGS ;SYSTEM HAS 1 MORE PAGE
12980 JRST NLOAD2 ;RECOMPUTE HUSRAD AND LOOP
12982 NLOAD4: MOVE A,SRN4(U) ;DISK CHANNEL
12983 MOVEI TT,(R) ;PUT DESIRED ACCESS IN RH(TT),
12985 TDNE R,[200000,,400000]
12986 IORI TT,%CBCPY ;ALONG WITH INITIAL-SWAPIN BIT IF NEC.
12987 PUSHJ P,NCORQ7 ;FIND OR CREATE MMP ENTRY.
12988 JRST OPNL37 ;MMP FULL
12989 MOVE E,SRN5(U) ;GET PAGE # IN JOB BEING LOADED
12990 MOVE U,SRN3(U) ;TARGET USER.
12991 PUSHJ P,NCORR1 ;INSERT THE PAGE.
12994 NLOAD8: SUB P,[2,,2]
12997 NLOADZ: PUSHJ P,LSWPOP ;FREE CIRPSW
13003 POPSM2: SOS (P) ;RETURN TO LOCN BEFORE PUSHJ
13007 ;QTAOS: PUSHJ P,QTLOCK ;LOCK TUT
13008 QTAOS1: MOVE D,QSLGL(A) ;DISK TRACK
13011 BUG ;NOT PART OF ANY FILE
13014 DPB B,D ;ADD ONE TO TUT ENTRY FOR THIS TRACK
13017 NLUPCL: MOVSI T,BSSTP ;THIS IS THE LOSSET ROUTINE TO CLEAR BSSTP.
13023 NLDSBB: HRRZ J,SRN3(U) ; (COMING BACK AFTER PCLSRING OUT) A HAS DSK CHNL #)
13024 PUSHJ P,MPLDJ ;LOAD MAP (ALSO CLOBBER UMAPS)
13033 NLDSBH: HRRZ B,QPCLSR(A)
13036 NLDSB: SKIPN EPDLT1(U)
13037 JRST OPNL12 ;LOAD ONLY PURE FROM SBLK FILE LOSES
13040 MOVEM B,QPCLSR(A) ;RESTART POINT IN CASE OF PCLSR
13044 PUSHJ P,MPLDJ ;LOAD MAP (ALSO CLOBBER UMAPS)
13049 NLDSB1: HRROI I,EPDL3(U)
13050 MOVEM I,SRN4(U) ;SET UP AOBJN PTR TO READ INTO EPDL3
13051 NLDSBD: MOVEI C,SRN4(U) ;SET C UP TO POINT TO AOBJN PTR
13052 HRLI C,(TRN) ;INDICATE EXEC MODE ADR
13055 JRST NLDSB9 ;PREMATURE EOF
13058 JRST NLDSB1 ;IGNORE INITIAL STUFF UNTIL JRST 1
13059 NLDSBK: MOVEI B,NLDSBE
13061 NLDSBE: HRROI I,QLDPTR(A)
13065 PUSHJ P,QBI ;GET AN AOBJN POINTER
13067 JRST NLDSB9 ;PREMATURE EOF
13069 JRST NLDSB6 ;NOT AN AOBJN POINTER
13070 HLRZ C,EPDLT1(U);FIRST ADDRESS TO BE LOADED
13073 HLROS B ;SKIP # WDS IN C
13074 ADD B,C ;-# WDS REMAINING IN BLOCK
13076 SUB C,B ;FLUSH WHOLE BLOCK
13077 LDB D,[1200,,QSMPRP(A)]
13081 ADD D,C ;ADVANCE ACC PTR TO SKIP PART OR ALL OF BLOCK
13085 JUMPGE B,[AOS QRADAD(A) ;SKIPPING WHOLE BLOCK, ALSO SKIP CHECKSUM
13086 JRST NLDSBK] ;AND GO READ NEXT BLOCK
13088 ADDM C,QLDPTR(A) ;UPDATE AOBJN POINTER
13089 NLDSB3: MOVEI B,NLDSBF ;MAYBE FLUSH EXISTING MEMORY AND GET NEW
13091 NLDSBF: HRRZ E,QLDPTR(A) ;START ADR OF BLOCK
13092 HLRE C,QLDPTR(A) ;-LENGTH OF BLOCK
13093 SUB E,C ;DON'T COMBINE THIS INSN WITH NEXT, MIGHT BE MOBY BLOCK
13094 SUBI E,1 ;GET END ADR OF BLOCK
13095 HRRZ T,EPDLT1(U);HIGH LOAD LIMIT
13096 SUBM E,T ;NUMBER OF WORDS OF EXCESS IN BLOCK
13097 MOVEM T,EPDLT2(U) ;SAVE FOR LATER USE
13098 JUMPLE T,NLDSB7 ;JUMP IF BLOCK HAS NO EXCESS
13099 SUB E,T ;ADJUST END ADDRESS
13101 ADDM T,QLDPTR(A);DECREASE COUNT IN AOBJN POINTER
13102 NLDSB7: LSH E,-10. ;LAST PAGE NEEDED
13104 PUSH P,R ;R HAS IOCHNM WD, NEEDED IF REACH QICL VIA QBI.
13105 PUSH P,E ;PAGE NO. OF LAST PAGE NEEDED
13108 JRST NLDSB5 ;ALREADY HAVE NEEDED PAGES
13111 MOVE U,SRN3(U) ;LOOK UP THIS PAGE IN MAP OF USER WE'RE HACKING.
13112 PUSHJ P,UPLC ;IF THERES A WRITABLE PAGE
13114 LDB A,T ;IN THE SLOT ALREADY, KEEP IT.
13119 CAME U,SRN3(U) ;IF NOT HACKING SELF, NCORLL WILL LSWPOP
13120 PUSHJ P,NULSET ;WHAT IT THINKS IS A LOSSET LIKE NLUPCL
13123 MOVEI R,%JSNEW ;GET FRESH PAGE
13124 MOVE TT,SRN3(U) ;INTO THE JOB WE'RE HACKING.
13125 MOVE C,SRN5(U) ;PAGE # TO GIVE IT.
13126 MOVSI A,%CBRED+%CBWRT+%CBNDW ;WANT WRITE ACCESS.
13127 PUSHJ P,NCORL ;UNDOES NULSET AND SWTL.
13128 JRST NLSBPL ;COULDNT GET PAGE (CALLED LSWCLR)
13129 NLDSBM: AOS SRN5(U)
13130 JRST NLDSB4 ;CHECK WHETHER WE NEED MORE PAGES.
13132 NLDSB5: SUB P,[1,,1] ;NOW WE HAVE ALL PAGES NEEDED TO LOAD THIS BLOCK.
13135 NLDSBQ: MOVEI B,NLDSBC
13137 NLDSBC: HRRZI C,QLDPTR(A)
13139 PUSHJ P,QBI ;DO A BLOCK IOT, USING THAT AOBJN POINTER.
13140 AOSG B,EPDLT2(U);SKIP RESIDUE OF BLOCK AND CHECKSUM
13141 MOVEI B,1 ;NO RESIDUE, JUST SKIP CHECKSUM
13142 LDB D,[1200,,QSMPRP(A)]
13152 NLDSB6: LDB D,[1200,,QSMPRP(A)]
13160 NLDSB8: CAME U,SRN3(U) ;UNLESS HACKING SELF OR PDP6, WE HAVE A SOSSET OF USTP TO POP.
13165 NLDSB9: PUSHJ P,OPNL46 ;LOAD FILE NOT IN VALID SBLK FORMAT
13166 NLSBP1: PUSHJ P,MPLDZ
13170 NLSBPL: SUB P,[2,,2] ;FLUSH PUSHES OF E AND R.
13174 SUBTTL .GUN, .LOGOUT
13176 ;DESTROY PROCEDURE TREE WHOSE TOP INDEX SUPPLIED BY USER
13177 AGUN: XCTR XR,[SKIPG A,(J)]
13178 POPJ P, ;LOSE, NEG OR SYSTEM JOB
13181 CAMGE A,USRHI ;USER INDEX UNREASONABLE => LOSE.
13186 ALOGOU: SKIPL SUPPRO(U)
13187 JUMPN J,ABREAK ;.LOGOUT N, TURNS INTO .BREAK N,33 IF NOT TOP LEVEL
13188 MOVE A,U ;.LOGOUT, AND STY CLOSE.
13190 ;A HAS JOB BEING LOGGED OUT; U HAS JOB THAT'S DOING IT.
13191 ;.GUN AND .LOGOUT ACT BY PUTTING THE JOB IN SUCH A STATE THAT
13192 ;IT CAN DO NOTHING BUT TRY TO DISAPPEAR. IF THE JOB IS ALREADY
13193 ;IN THAT STATE, THIS ROUTINE DOES NOTHING. THAT PREVENTS
13194 ;RECURSION LOOPS WHEN KILLING CYCLIC STRUCTURES INVOLVING STY'S.
13195 ;EXCEPTION: IF THE JOB TO BE LOGGED OUT IS THE RUNNING JOB,
13196 ;WE DO THE REAL WORK BY GOING TO ALOGO1.
13197 ALOGO6: SKIPE UNAME(A) ;JOB TO BE LOGGED OUT IS GONE.
13198 SKIPL SUPPRO(A) ;CAN'T LOG OUT UNLESS TOP LEVEL.
13201 AOS (P) ;IF .GUN GETS THIS FAR, IT HAS "SUCCEEDED".
13202 MOVSI T,BULGOS+BULGO
13203 TDNE T,APRC(A) ;IF JOB IS ALREADY LOGGING OUT,
13204 JRST ALOGO7 ; SEE IF IT IS THE RUNNING JOB
13210 MOVEM A,SRN3(U) ;AUCL4 FINDS USR IDX TO HACK HERE.
13212 AUCL4 ;CLEAR BULGOS IF AUCL3 PCLSR'S
13213 PUSHJ P,AUCL3 ;SET BULGOS AND WAIT FOR DIELOK TO CLEAR.
13217 EXCH B,UPC(A) ;SET HIM UP TO LOG OUT.
13218 ALOGO4: MOVEM B,SRN3(A) ; Remember old PC for unlocking locks.
13219 MOVE B,[.LOGOUT] ;PUT THE FOLLOWING ROUTINE IN JOB'S AC'S:
13220 MOVEM B,AC0S(A) ; 0/ .LOGOUT
13221 CAMN A,USER ; 1/ .VALUE
13222 UMOVEM B,0 ; 2/ JRST 0
13232 IORM B,APRC(A) ;SAY HE'S DIEING SO NO-ONE WILL HACK HIM.
13233 MOVEM U,EPDL(A) ;RECORD WHO IS KILLING HIM.
13238 SETZM PICLR(A) ;PREVENT INTERRUPTS.
13242 ANDCAM B,USTP(A) ;MAKE SURE HE CAN RUN - ELSE HE WOULDN'T LOG OUT.
13243 ALOGO7: CONO PI,CLKON
13246 JRST ALOGO1 ;IF JOB IS RUNNING JOB, MUST HACK AROUND
13248 ALOGO5: EXCH B,UUOH ;LOGGING OUT SELF - MAKE OUR PC LOOK
13249 SOJA B,ALOGO4 ; AS IF WE HAD EXECUTED THE .LOGOUT IN AC 0
13251 ;COME HERE IF LOGGING OUT ONESELF (A=USER).
13253 PUSHJ P,AUCL3 ;WAIT TILL NO-ONE IS LOOKING AT ME,
13254 PUSHJ P,UBLAM ;CLOSE MY CHANNELS AND KILL MY INFERIORS AND CORE.
13256 CONO PI,CLKOFF ;DON'T SCHEDULE WHILE GOING AWAY
13258 IORM T,APRC(A) ;SYS JOB KILLS ANY TREES WITH BULGO SET.
13260 IORM T,SUPCOR ;TELL SYS JOB TO LOOK AROUND FOR TREES TO KILL.
13261 MOVSI T,BUSRC ;SUICIDE: MAKE SURE WE DON'T RUN ANY MORE.
13263 JRST UDELAY ;CAUSE A SCHEDULE
13265 ;COME WITH JOB INDEX IN A. INDICATE THAT JOB IS ABOUT TO DIE,
13266 ;THEN WAIT TILL IT'S SAFE TO KILL IT.
13268 AUCL3: MOVSI T,BULGOS
13269 IORM T,APRC(A) ;SAY THIS JOB STARTING TO GO AWAY.
13270 CONO PI,CLKON ;NOONE CAN START HACKING US NOW; SAFE.
13271 CAME A,USER ;IF NOT LOGGING OUT RUNNING USER,
13272 PUSHJ P,1USTOP ;STOP THE JOB BEING KILLED.
13273 SKIPE DIELOK(A) ;WAIT TILL NO-ONE IS LOOKING AT THAT JOB.
13275 HRLOI T,#BUSRC ;AND NO-ONE ELSE HAS HIM PCLSR'ED.
13278 POPJ P, ;WE SUCCEEDED, BUT CALLER HAS WORK TO DO.
13280 SUBTTL REAL TIME USER FEATURE
13282 ;.REALT AC, SKIPS ONLY IF REAL TIME FACILITY REQUESTED AND SEIZED
13283 ;AC= 4.9=>TURN OFF OLD CLOCK RATE, FLUSHING REAL TIME FACILITY AND
13284 ; REMAINDER OF CURRENT TICK AND ZEROING TICK COUNT
13285 ; 4.8=>TURN ON NEW CLOCK RATE
13286 ; 4.7=>TRY TO SEIZE REAL TIME USER FACILITY
13287 ; 4.6=>DON'T SETTLE FOR PSEUDO-REAL TIME STATUS
13288 ; 4.5 =>ONLY WANT PSEUDO
13289 ; 4.4=>PROGRAM TO BE BLOCKED EXCEPT FOR HIGH PRIORITY PHASE OR INT. LEVEL
13290 ; 4.3=>READ INTO WD3+4 AS DESCRIBED BELOW (BEFORE ANY OTHER BITS INTERPRETED)
13291 ; 3.1-4.2=RESERVED FOR EXPANSION, SHOULD BE ZERO
13292 ; 1.1-2.9=RH=POINTER TO 4 WORD BLOCK
13293 ; WD1=FRAME TIME IN 60'THS (MUST BE <2**18.)
13294 ; WD2=PRIORITY TIME IN 60'THS (MUST BE <7 AND <WD1/2)
13295 ; WD3= IF 4.3 ON, SET RH TO FRAME TIME, LH TO TICKS SINCE EXAMINED
13296 ; WD4= IF 4.3 ON, SET RH TO HIGH PRIORITY TIME, LH TO 0 IF CURRENTLY LOW
13297 ;PRIORITY OR -1 IF CURRENTLY HIGH PRIORITY
13299 AREALT: UMOVE A,(J)
13308 AREAL1: TLNN A,700000
13316 PUSHJ P,CLQDEL ;TURN OFF OLD INTS
13318 SETZM UTIME(U) ;ZERO TICK COUNT
13319 AREAL2: TLNN A,200000
13321 XCTR XR,[SKIPG T,(A)]
13324 AREAL4: TLNN A,100000
13326 XCTR XR,[SKIPLE T,1(A)]
13345 AREAL7: MOVEM U,UREALT
13347 AREAL5: CONO PI,CLKON
13348 AREAL6: SKIPN T,UTIME(U)
13358 ;CLOCK LEVEL ROUTINE
13359 UREALB: SUBI U,UCLBLK ;SET INDEX TO QUEUE BLOCK
13362 URLTB1: MOVSI T,(%PIRLT)
13369 URLTBX: SETZM SCHFLG ;CAUSE SCHEDULE THIS CLOCK BREAK
13390 SUBTTL MISCELLANEOUS SYSTEM CALLS
13392 $INSRT TIME ;ROUTINES HAVING TO DO WITH CLOCKS AND THINGS
13395 ;.CLOSE CH, ;CLOSE ANY I/O TRANSACTION OPEN ON CHANNEL CH
13397 CCLOSE: HRREI C,-IOCHNM(R) ;CLOSE CALLED INTERNALLY
13400 BUG ;R WAS NOT AN IOCHNM WORD ADDRESS.
13401 HRRZM C,UUAC(U) ;SOME CLOSE ROUTINES LOOK AT UUAC
13405 ACLOSE: HLRZ A,(R) ;SET UP A WITH L.H. OF I/O CH WORD
13406 HRRZ B,(R) ;SET UP B WITH R.H. "
13407 MOVE C,CLSTB(B) ;GET CLOSE TABLE ENTRY
13408 TLNE C,%CLSNRM ;SKIP IF NOT STANDARD CLOSE
13409 JRST STDCLS ;JUMP TO STANDARD CLOSE
13411 PUSHJ P,(C) ;CALL CLOSE ROUTINE
13413 STDCLX: SETZM (R) ;CLEAR I/O CHANNEL WORD
13414 SETZM IOCHST-IOCHNM(R) ;CLEAR I/O CHNL STATUS WORD
13417 STDCLS: CONO PI,CLKOFF ;INHIBIT CLOCK BREAKS
13418 SOSGE 1(C) ;DECREMENT USE COUNTER, SKIP IF STILL IN USE AT LEAST ONCE
13419 SETOM (C) ;NO LONGER IN USER, FREE BY SETOM'ING "XXXUSR" VARIABLE
13420 CONO PI,CLKON ;ENABLE CLOCK BREAKS
13423 AVALRET:UMOVE A,(B) ;CALL 4,
13428 AUTRAN: UMOVE C,(B)
13430 CONO PI,CLKOFF ;Don't let USRHI change or anything like that
13432 UTRNL: SUBI A,LUBLK
13443 ;RETURN WITH LOSER IN A IN LOSER MODE AND CLOCK OFF
13445 RPCCK: PUSHJ P,RPCLSR ;STOP USER (ALSO PUTS HIM IN USER MODE)
13446 CONO PI,CLKOFF ;TURN OFF CLOCK
13447 JRST UPCLSR ;"RESTART USER" (HE CAN'T RUN TILL CLOCK BACK ON)
13449 ;.LOSE X <=> .CALL [SETZ ? SIXBIT/LOSE/ ? 401000,,X ]
13452 ; USED TO REPORT LOSSAGE TO SUPERIOR PROCEDURE
13453 ;ARG 1 - LOSING INSTRUCTION ADDR,,LOSSAGE CODE (CODES DEFINED BY DDT)
13454 ;ARG 2 - NEW PC (DEFAULT = PC-2 SO CAN USE AS A NON-SKIP-RETURN HANDLER)
13455 ;CTL 1.1 - DEFAULT ARG 2 TO PC INSTEAD OF PC-2
13456 ;CTL 1.2 - SETZM @.40ADDR
13457 ;CTL 1.3 - DON'T USE THE NEW PC AS THE LOSING INSTRUCTION ADDR
13459 ALOSE: HRRZ A,FORTY ;ARG 1 = EFF ADDR OF UUO
13462 NLOSE: MOVE T,CTLBTS(U)
13465 XCTR XRW,[MOVES (D)]
13466 TLZ B,BADPC ;COMPUTE NEW PC FROM ARG 2 OR UUOH
13477 HRRI B,1(B) ;PCLSR'ING WILL SOS
13478 MOVEM A,VALUE(U) ;PASS TO SUPERIOR
13481 XCTR XW,[SETZM (D)]
13487 MOVE A,(R) ;OPER 10
13498 PUSHJ P,AUCL3 ;STOP JOB, AND WAIT TILL SAFE TO KILL IT
13507 PUSHJ P,ZUSLOG ;ACCOUNT FOR USAGE THEN FLUSH LAST VESTIGES
13514 AUCL4: HRRZ A,SRN3(U)
13519 AUCL2: HLRZ A,(R) ;GUY BEING CLOSED
13521 LDB TT,[.BP (%CLSFU),CLSTB(B)]
13522 JUMPN TT,OPNL31 ;FOREIGN JOB => .UCLOSE ISCAN'T MODIFY JOB
13523 SKIPL CLSTB(B) .SEE %CLSU
13524 JRST OPNL34 ;NOT A JOB AT ALL?
13527 JUMPGE TT,AUCL1 ;HAVE TTY NOW
13528 TLNN TT,%TBDTY ;NOT GIVING IT AWAY.
13529 CAIE A,(TT) ;SKIP IF GAVE IT TO GUY WE'RE KILLING
13531 PUSHJ P,SDTTY ;TAKE IT BACK FROM HIM.
13536 ;DISMIS SYSTEM CALL. 1ST ARG INT PDL PTR (WILL BE DECREMENTED
13537 ;IF NOT AN IMMEDIATE ARG)
13538 ;2ND ARG OPTIONAL PC TO DISMIS TO (OVERRIDES THAT IN INT PDL)
13539 ;3RD ARG OPTIONAL NEW .DF1 VALUE " " " "
13540 ;4TH ARG OPTIONAL NEW .DF2 VALUE ...
13541 ;5TH ARG OPTIONAL ERROR CODE AS IN LOSE. IF PRESENT WILL LOSE RIGHT AFTER DISMISSING.
13542 ;IF 4 ARGS GIVEN, 1ST IGNORED EXCEPT FOR POSSIBLY DECREMENTING, OR POPPING OF ACS.
13543 ;CTL BITS (SAME FORMAT AS LH OF 1ST WORD OF INTERRUPT DISPATCH TABLE)
13544 ;SPECIFY POPPING OF SAME EXTRA INFO THAT INTERRUPTS CAN PUSH.
13548 MOVE E,A ;GET IN E THE INT PDL PTR.
13549 TLNN E,1000 ;IF 1ST ARG IMMEDIATE, IT IS PTR,
13550 UMOVE E,(A) ;ELSE IT PTS TO PTR.
13551 MOVE H,E ;SAVE UNPOPPED PDL POINTER FOR PDL OV CHECKING.
13552 TLNE A,1000 ;IF PDL PTR ISN'T IMMEDIATE, POP IT ACC. TO CTL BITS.
13556 SUB E,[3,,3] ;POP OFF DEBUGGING INFO IF IT WAS PUSHED.
13558 JUMPE TT,NDISM2 ;IF ACS WERE PUSHED, POP THEM TOO.
13560 SUB E,TT ;DECREMENT THE PDL POINTER ENOUGH
13562 HRLI I,1(E) ;AND COPY FROM THE PDL TO THE ACS.
13564 XCTR XBRW,[BLT I,(TT)]
13565 NDISM2: CAIGE W,2 ;IF NO 2ND ARG, GET PC FROM INT PDL
13567 CAIGE W,3 ;IF NO 3RD ARG, GET .DF1 FROM INT PDL
13569 CAIGE W,4 ;IF NO 4TH ARG GET .DF2 FROM INT PDL
13571 TLNE A,1000 ;IF 1ST ARG NOT IMMED, DECREMENT IT
13575 JUMPGE E,NDISM3 ;AND CHECK FOR PDL OVFLO.
13577 PUSHJ P,NDISMP ;PDL OVFLO, SET INT BIT IF INT ENABLED.
13578 NDISM3: MOVEM C,IDF1(U) ;RESTORE THE PC, .DF1, .DF2
13585 NDISMP: MOVEI TT,%PIPDL ;PDL OV INT BIT.
13590 ;OLD-STYLE DISMISS JOINS HERE
13591 ADISMIS:UMOVE B,(B) ;CALL 1,
13592 NDISM1: TLO B,%PCUSR
13597 SETCM A,UUOH ;IF ONE-PROCEEDING THE .DISMISS
13598 TLNN A,%PS1PR-%PSINH
13599 TLO B,%PS1PR-%PSINH ;TRAP IMMEDIATELY AT THE NEW PC
13604 ;CHECK FOR PENDING INTERRUPTS AND TAKE THEM RIGHT AWAY
13608 CONO DSDEV,DSDCHN ;ENABLE INTERRUPT FROM 6
13611 PUSHJ P,APISE6 ;SEE IF ANY DEVICES WANT TO RE-INTERRUPT.
13615 IOR D,IDF1(U) ;FIND ALL DISABLED OR DEFERRED
13616 SKIPN PICLR(U) ;(ALL ARE DEFERRED WHEN PI IS OFF).
13618 AND D,[BADBTS] ;BAD
13619 TDNE C,D ;PENDING INTERRUPTS
13620 JRST ADISM7 ;IF THERE ARE ANY, LET THEM HAPPEN.
13623 JUMPN C,ADISM7 ;1ST WD INT. PENDING.
13627 JUMPE C,CPOPJ ;JUMP IF NO 2ND WORD INT PENDING.
13628 ADISM7: MOVE C,[JRST ONEFLS]
13632 APISE6: MOVE D,MSKST(A) ;IF INTERRUPT FROM CONSOLE ENDBLED,
13635 SKIPL T,TTYTBL(A) ;IF THIS JOB HAS ITS CONSOLE
13636 SKIPN TINTC(T) ;AND THE CONSOLE HAS INT. CHARS,
13638 MOVEI D,%PITYI ;GENERATE AN INTERRUPT.
13640 APISE7: MOVE D,MSKST2(A) ;LOOK AT HIS ENABLED IO CHANNELS.
13642 APISE0: JFFO D,APISE9 ;CHECK EACH ONE.
13643 JRST APISE8 ;ALL CHECKED.
13645 APISE9: MOVNS E ;CHECK ONE IO CHNL THAT'S ENABLED TO INT.
13646 ANDCM D,CHNBIT+35.(E) ;MARK THIS CHNL AS HANDLED.
13647 ADDI E,35.+IOCHNM(A) ;GET ADDR OF IOCHNM WD FOR CHANNEL.
13648 HRRZ T,(E) ;IS IT A TTY INPUT CHANNEL?
13652 LDB T,[$TIIDX,,(E)] ;YES, GET THE TTY NUMBER.
13654 CAIE T,%TINON ;IF IT ISN'T A DISOWNED TY CHANNEL,
13655 CAIE C,(A) ;AND THE TTY BELONGS TO THIS JOB,
13657 SKIPN TINTC(T) ;AND IT HAS AN INT. CHAR WAITING,
13660 APISE4: AND C,MSKST2(A) ;GIVE AN INT. ON ONE OF THE CHANNELS IT'S OPEN ON.
13666 APISE2: CAIN T,STYDUI ;NOT A TTY CHNL. IS IT A STY CHNL?
13670 APISE3: LDB T,[$TIIDX,,(E)] ;YES, GET TTY #.
13671 SKIPL C,STYSTS-NFSTTY(T) ;STY IN USE BY THIS JOB?
13674 SKIPGE TTYOAC(T) ;TTY OUTPUT PENDING?
13676 MOVE C,STYMSK-NFSTTY(T) ;YES, INT. ON ONE CHANNEL.
13691 ;.SLEEP AC, ;IF C(AC) + OR ZERO: ;BECOME DORMANT FOR C(AC) 1/30'THS OF A SEC
13692 ;IF C(AC) -: ;BECOME DORMANT TILL MAGNITUDE OF C(AC) > C(TIME)
13693 ASLEEP: XCTR XR,[MOVN T,(J)] ;PICK UP NEGATIVE OF C(AC)
13694 JUMPGE T,ASLP1 ;JUMP IF C(AC) WAS NEG
13695 SUB T,TIME ;COMPUTE NEG OF TIME SLEEP SHOULD RUN OUT
13696 UMOVEM T,(J) ;STORE BACK SO YOU WILL WIN IF PCLSR'ED OUT
13697 ASLP1: MOVMS A,T ;MAKE POSITIVE
13698 SUBI A,60.*30. ;IF SLEEPING FOR MORE THAN A MINUTE
13701 IORM B,USWST(U) ;PUT RIP VAN WINKLE ON ICE
13703 JRST ASLP2 ;ALWAYS GO TO UFLS AT LEAST ONCE
13705 CAMLE T,TIME ;HANG TILL C(T) LESS THAN C(TIME)
13706 ASLP2: PUSHJ P,UFLS
13707 XCTR XW,[SETZM (J)] ;CLEAR OUT ARG (FOR COMPATIBILITY WITH WHEN AC WAS COUNTED OUT)
13708 JRST CLKONJ ;MAKE SURE CLKCHN ON IN CASE SLEEP WAS 0 & SKIPPED UFLS ENTIRELY
13710 ;RELOAD CALL - IGNORE ARGS
13711 ;MUST BE FROM TOP LEVEL NON-DISOWNED JOB
13712 ;RELOADS AND STARTS SYS: ATSIGN WHATEVER
13714 NRELOAD:SKIPGE SUPPRO(U)
13716 JRST OPNL40 ;NOT TOP LEVEL
13718 PUSHJ P,LOGUPD ;LOG OUT
13719 PUSHJ P,DMNPLI ;AND IN AGAIN
13720 PUSHJ P,USRST2 ;RESET USER VARS
13722 SETZM @UTMPTR(U) ;TEMPORARY HIGH PRIORITY
13723 JRST USTCDR ;LOAD FILE AND START IT
13725 AMASTER:UMOVE J,(J)
13726 CONO PI,CLKOFF ;OPER 61
13730 AMAST1: HRRZM U,UMASTER
13739 AMAST3: JUMPGE J,CLKOJ1
13747 ;.CALL SSERVE - Set .SERVER variable without timing screw.
13748 ; ARG1: <job>, the client whose .SERVER variable is to be munged
13749 ; ARG2: <job>, the server to be stored in the variable
13750 ; If one arg is given, it is the server and the client defaults to %JSELF
13756 JSP T,NCORUI ; Decode client and AOS his DIELOK
13757 JRST NSSRV1 ; OK to write
13758 JSP T,NCORWR ; Check further
13759 JRST OPNL31 ; CAN'T MODIFY JOB
13763 JRST OPNL34 ; WRONG TYPE DEVICE
13765 EXCH J,A ; A: client J: server
13766 JSP T,NCORUI ; Decode server and AOS his DIELOK
13767 JFCL ; Don't give a damn about writability
13770 JRST OPNL34 ; WRONG TYPE DEVICE
13772 MOVEM J,SERVER(A) ; Safe to set it now
13773 PUSHJ P,LSWPOP ; Server's DIELOK
13774 JRST LSWPJ1 ; Client's DIELOK
13777 SUBTTL LOGIN/ATTACH/DETACH/DISOWN CODE
13779 ;SYMBOLIC CALL LOGIN: LOG A TREE IN. MUST BE GIVEN BY TOP-LEVEL NON-LOGGED-IN JOB
13780 ;WITH NO INFERIORS.
13781 ;ARG 1 - DESIRED UNAME
13782 ;ARG 2 - "TERMINAL NAME", PUT IN TRMNAM USER VARIABLE AND PRINTED AS SIXBIT ON SYSCON.
13783 ;ARG 3 - DESIRED XUNAME, FOR DEMON TO KNOW WHO TO ACCOUNT.
13785 NLOGIN: HLRE T,UNAME(U)
13786 AOJN T,OPNL31 ;JUMP ON ALREADY LOGGED IN
13788 JRST OPNL40 ;CAN'T LOG IN IF NOT TOP LEVEL
13791 AOJE T,OPNL11 ;BAD NAME
13793 MOVE C,A ;IF XUNAME (ARG 3) MISSING, DEFAULT TO UNAME.
13796 ALOG2: SKIPN UNAME(D)
13802 JRST OPNL13 ;CONSOLE CONTROLLED TREE ALREADY LOGGED IN THAT NAME
13804 ALOG3: HRRZ T,SUPPRO(D)
13805 CAMN T,U ;CAN'T LOGIN IF HAVE INFERIOR. RESTRICTION IMPOSED HERE
13806 JRST OPNL12 ;SINCE WE NO CODE HERE TO SET INFERIOR'S UNAME.
13807 ALOG4: ADDI D,LUBLK
13809 JRST ALOG2 ;LOOP FOR ALL SETS OF PROCEDURE VARIABLES
13811 HRLI T,[ASCIZ / LOGIN /]
13812 PUSHJ P,SGWAIT ;ASK THE SYSTEM JOB TO PRINT OUT THE RELEVANT INFO
13813 SKIPL TTYTBL(U) ;SKIP IF NOT CONSOLE CONTROLLED
13814 AOS SUSRS ;INCREMENT COUNT OF LOGGED IN CONSOLE CONTROLLED TREES
13815 MOVEM A,UNAME(U) ;SET UNAME TO WHAT LOGGED IN AS
13817 MOVEM A,USYSNM(U) ;SET SNAME "
13818 MOVEM A,HSNAME(U) ;SET HOME SNAME "
13819 MOVEM C,XUNAME(U) ;SET XUNAME " " (USER MAY MUNG LATER)
13821 MOVEM B,SLGIV+2 ;INCLUDE TRMNAM AS SECOND NAME PRINTED
13822 PUSHJ P,DMNPLI ;GIVE INFO TO DEMON
13823 JRST CLKOJ1 ;TURN CLK ON AND SKIP RETURN
13825 ASETM2: UMOVE A,1(J) ;.OPER 5
13827 ASETMSK: UMOVE D,(J) ;OPER 4
13830 SOS (P) ;WILL SKIP RETURN
13831 JRST USMASK ;ACT LIKE .SUSET.
13833 ARSYSI: SKIPA A,[ITSVRS] ;OPER 52
13834 ARDTIME:MOVE A,TIME ;OPER 17
13837 IFE KS10P,[ ; On the KS10 they made DATAI 0, a UUO!
13838 ARDSW: DATAI A ;OPER 20
13841 IFN KS10P, ARDSW==:ILUUO
13843 ASUPSET:MOVEI C,003777 ;OPER 53
13844 XCTR XR,[AND C,(J)]
13845 MOVE D,SUPCOR ;SAVE OLD CONTENTS
13857 ; SETZ [<JOB SPEC>] ;SEE NCORUI
13859 ;DISOWN JOB'S ENTIRE TREE AND FREE CONSOLE. IF TREE HAS NO
13860 ;CONSOLE, JUST MAKES IT DISOWNED. NO ARG => THIS JOB'S TREE
13861 ;ALWAYS SKIPS IF THE JOB SPEC IS REASONABLE.
13863 ;CTL BIT 1.1 => DON'T SET SIGN OF APRC (DON'T MAKE TREE "DISOWNED").
13864 ;CTL BIT 1.2 => USE SYSTEM TREE'S RESOURCE WORD
13865 ;CTL BIT 1.4 => KILL TREE AN HOUR FROM NOW IF IT ISN'T REOWNED
13866 ;CTL BIT 1.5 => SUPPRESS THE CONSOLE-FREE MESSAGE ON THE TTY
13868 NDETAC: HLRZ B,A ;XOR LH OF 1ST ARG INTO CTL BITS
13870 PUSHJ P,SWTL ;MAKE SURE NOBODY ELSE IS REARRANGING TREES.
13872 MOVEI J,(U) ;DEFAULT TO OUR TREE
13873 JUMPE W,NDETA0 ;JUMP IF NO ARGS SUPPLIED
13875 JSP T,NCORUI ;DECODE ARG, GET USER INDEX IN J
13876 JFCL ;IGNORE INFO ON WRITEABILITY
13877 CAIG J,LUBLK ;DONT DETACH SYSJOB OR CORE JOB
13879 NDETA0: SKIPL T,SUPPRO(J) ;FIND TOP LEVEL JOB OF TREE (IN J)
13882 HRRZ A,J ;TOP OF TREE
13884 JRST LSWCJ1 ;TREE IS ALREADY DISOWNED.
13886 PUSHJ P,IFPLUP ;STOP ALL BUT THIS JOB
13887 PUSHJ P,NDETA7 ;DO THE WORK
13888 JRST LSWCJ1 ;UNSTOP THE TREE
13890 NDETA7: PUSH P,U ;US
13891 PUSH P,A ;TOP LEVEL
13894 PUSHJ P,LOGUPD ;FOR ACCOUNTING PURPOSES, THIS IS LIKE A LOGOUT
13896 NDETA1: MOVEI U,(A) ;GET IN U USER INDEX OF OWNER OF TTY
13897 MOVE A,TTYTBL(U) ;GET IN A TTY NUMBER
13898 TLNE A,%TBDTY ;TREE HAS NO TTY =>
13899 JRST [ POP P,A ;JUST MAKE IT DISOWNED.
13902 JUMPL A,NDETA1 ;GAVE TTY AWAY
13903 MOVE T,(P) ;TOP-LEVEL JOB OF TREE SAVES USER TTY OPTIONS IN
13904 MOVE B,TTYOPT(A) ;HIS STTYOP VARIABLE
13905 AND B,[%TOUSR,,%TPUSR]
13907 LDB B,[.BP (%TCRFS+%TCQRY),TTYCOM(A)]
13908 IORI B,4 ;MAKE STTYOP NON-ZERO TO SHOW IT WAS STORED
13909 DPB B,[170300,,STTYOP(T)] ;OVERLAPS PADLF FIELD
13911 PUSH P,TTYSTS(A) ;SAVE THIS TTY INFO
13912 PUSH P,TTYST1(A) ;WILL PUT INTO TTY OWNER'S USER VARS
13913 PUSH P,TTYST2(A) ;AFTER SUCCEED IN FREEING THE TTY
13916 MOVN B,TPVB+TPLEN(B)
13919 MOVSI B,%TCDET ;IF TREE DETACHED DUE TO TOP LVL INT,
13920 SKIPN USER ;THE CONSOLE FREE MESSAGE SHOULD SAY SO.
13921 IORM B,TTYCOM(A) .SEE SYSCFM
13922 ;THIS ALSO HAPPENS IF DIALUP LINE HUNG UP, OS'ERS BEWARE!
13927 PUSHJ P,TVBNCL ;CLEAR VIDEO BUFFER #
13930 MOVE B,-5(P) ;GET BACK IDX OF RUNNING JOB
13933 TRNE B,20 ;CTL BIT 1.5 => MARK THE TTY AS NOT NEEDING CNSL FREE MSG.
13935 PUSHJ P,TTYLO1 ;NOW MAKE CONSOLE FREE.
13936 POP P,B ;CAN'T PCLSR AFTER THIS POINT
13937 DPB B,[$TBECL,,TTYTBL(U)]
13938 POP P,TTSTSV+1(U) ;STORE INTO TTY'S OLD OWNER
13939 POP P,TTSTSV(U) ;OLD TTY VARS FROM BEFORE FREEING IT
13941 MOVEM B,TTSTSV+2(U)
13942 SKIPA A,(P) ;TOP LEVEL JOB
13944 SKIPGE T,TTYTBL(A) ;SKIP IF HE HAS IT
13945 JRST NDETAA ;NOW DO GUY HE GAVE IT TO
13947 BUG ;BUT. BUT. BUT.
13948 MOVSI B,%TBNOT+%TBDTY ;TAKEN FROM --ME-- AND DOESN'T HAVE IT
13954 AOSE B ;IF DETACHED TREE WAS LOGGED IN
13955 SOS SUSRS ;ONE LESS CONSOLE CONTROLLED TREE
13956 NDETA5: MOVSI B,BUMRTL ;IF REQUESTED, MARK TREE AS DUE TO DIE
13957 MOVE D,CTLBTS(U) ;IN AN HOUR.
13961 CONO PI,CLKOFF ;PERFORM ACCOUNTING FOR THIS USER AS IF HE WERE LOGGING OUT.
13965 MOVE D,JNAME(A) ;IF TOP LEVEL JOB ...
13966 CAME D,[SIXBIT /HACTRN/] ;IS A HACTRN,
13968 NDETA2: AOS D ;AOS ITS NAME LEVEL UNTIL ...
13969 PUSHJ P,UJNAMU ;IT IS UNIQUE
13970 JRST NDETA2 ;(UJNAMU TURNS OFF CLOCK)
13973 PUSHJ P,DMNPLI ;LOG BACK IN, NAME MAY HAVE CHANGED FROM HACTRN TO HACTRO
13976 MOVEI Q,NDETA9 ;NOW SAY ALL JOBS IN TREE
13977 JRST IFPLUP ;ARE DISOWNED
13979 NDETA8: CAIE A,(U) ;IF JOB ISN'T SELF, STOP IT
13983 ;"ATTACH" SYSTEM CALL:
13984 ;1ST ARG - JOB SPEC -> OUR INFERIOR, OR TOP OF A DISOWNED TREE.
13985 ;2ND ARG - TTY SPEC (OF A TTY WHICH MUST BE FREE)
13986 ;2ND ARG ABSENT => USE OUR CONSOLE, AND GUN OUR TREE
13987 ;CONTROL BIT 400000 => CHANGE JOB'S NAME TO HACTRN (IF 2 ARGS)
13988 ; 4 => START JOB AFTER ATTACHING (JUST LIKE DETACH)
13990 ;CONNECTS THE SPECIFIED JOB TO THE SPECIFIED TTY, AS A CONSOLE CONTROLLED TREE.
13991 ;IF THE TTY IS OUR CONSOLE, WE ARE LOGGED OUT.
13992 ;IF THE JOB IS OUR INFERIOR, IT IS FIRST DISOWNED.
13994 NATTAC: PUSHJ P,SWTL
13997 EXCH A,B ;2ND ARG => IT IS TTY SPEC, SO DECODE IT.
14000 MOVE B,I ;AND PUT IT IN B.
14003 NATTAN: SKIPL B,SUPPRO(U) ;NO 2ND ARG => WE MUST BE TOP LEVEL, SINCE WE'LL HAVE
14004 JRST OPNL40 ;TO LOG OUT. B GETS NEGATIVE.
14006 JSP T,NCRUI2 ;DECODE 1ST ARG, GET USR IDX IN J.
14009 JRST NATTA5 ;JOB SPEC'D MUST BE EITHER
14010 CAIE U,(A) ;OUR INFERIOR, OR
14014 NATTA5: SKIPL APRC(J) ;THE TOP OF A DISOWNED TREE.
14016 ;NOW IF TTY IS OUR CONSOLE, B IS NEGATIVE; OTHERWISE, B HAS TTY #.
14017 NATTA7: PUSH P,CTLBTS(U)
14018 SETZM CTLBTS(U) ;DON'T GET FAKED OUT AT NATTA1, NATTA2, DSWNTY.
14021 MOVEI Q,NDETA8 ;STOP SPEC'D JOB AND ITS INFERIORS.
14024 NATTAM: CONO PI,TTYOFF
14025 SKIPL T,TTYSTA(B) ;SEE IF TTY IS FREE
14027 MOVSI T,(SETZ) ;IT IS, GRAB IT
14028 ANDCAM T,TTYSTA(B) .SEE %TACFM
14029 ANDCAM T,TTYSTS(B) .SEE %TSFRE
14031 JRST NATTA8 ;SINCE NO PCLSR POSSIBLE, DON'T BOTHER WITH A LOSSET OF THESE
14033 NATTAL: HRRE Q,TTYSTS(B)
14035 SKIPG Q ;IF TTY IS IN USE
14036 TLNE T,%TACTZ ;OR BEING ^Z'ED, DEVICE NOT AVAIL
14037 JRST [ SUB P,[2,,2] ? JRST OPNL10 ]
14038 MOVSI T,%TACFM+%TACTZ ;OTHERWISE JUST WAIT FOR CONSOLE FREE
14039 TDNN T,TTYSTA(B) ;MESSAGE TO FINISH COMING OUT
14043 NATTAG: MOVE A,U ;IF HACKING OUR CONSOLE, MUST STOP OUR WHOLE TREE
14044 MOVEI Q,NDETA8 ;(EXCEPT US, OF COURSE - NDETA8 CHECKS THAT).
14047 NATTA4: MOVE B,TTYTBL(B) ;FIND THE TTY'S NUMBER.
14049 JRST NATTAL ;THIS TREE HAS NO TTY?
14050 JUMPL B,NATTA4 .SEE %TBNOT
14051 PUSHJ P,SDTTY ;GET TTY BACK TO TOP OF TREE FOR AGBLT3 LATER.
14054 ;I BELIEVE THAT NOTHING CAN PCLSR BEYOND THIS POINT.
14055 ;RH OF B HAS TTY #; SIGN IS SET IF TTY IS OUR CONSOLE.
14056 NATTA8: AOS TTNTO(B) ;KEEP DSWNTZ FROM HALTING (WILL UNDO THIS LATER)
14057 PUSH P,B ;PUSH <CONSOLE-FLAG>,,<TTY #>
14058 HRRZ A,-1(P) ;LEGALITY OF CALL FULLY CHECKED; CAN START ALTERING.
14059 SKIPGE APRC(A) ;IF SPEC'D JOB IS OUR INFERIOR, DISOWN IT.
14062 TLNE B,%TBDTY ;IF THE INFERIOR HAS THE TTY, TAKE IT AWAY.
14066 NATTAF: HRRZ A,-1(P)
14067 MOVEI Q,DSWNTY ;JUST LIKE .DISOWN, BUT KNOW JOBS ARE ALREADY STOPPED.
14070 NATTA9: MOVEI Q,NATTA2
14072 SKIPGE (P) ;IF HACKING OUR CONSOLE, DISOWN OUR TREE SO IT IS FREE.
14074 ;OUR TTY NOW IN INCONSISTENT STATE SINCE WE ARE DISOWNED
14075 ;BUT TTY STILL BELONGS TO US. AGBLT3 FIXES THAT.
14079 MOVE TT,-1(P) ;NOW "RE-OWN" THE SPEC'D JOB
14080 MOVE A,UNAME(TT);NOT CHANGING ITS UNAME
14081 HRRZ J,B ;TO THE DESIRED TTY, WITH APPRO. RESOURCE WORD.
14083 TLO D,400000 ;TELLS UFN2A THE TREE SHOULD BECOME UN-DISOWNED.
14084 SETZ B, ;NO INTERRUPT BIT NEEDED.
14085 SETOM DLSRCH ;INHIBIT SCHEDULING (UFN2A UNDOES THIS)
14091 NATTAH: MOVE C,D ;FIND THE JOB IN THE TREE BEING ATTACHED
14093 TLNN D,%TBDTY ;THAT IS SUPPOSED TO GET CONTROL OF THE TTY.
14095 SETOM SUPPRO(A) ;BUT DON'T LEAVE IT THINKING IT IS OUR INFERIOR.
14098 HLRE B,UNAME(A) ;ATTACHING JOB TO FREE TTY:
14100 AOS SUSRS ;THIS MAY MEAN 1 MORE LOGGED IN CONSOLE-CTL'ED TREE.
14102 PUSHJ P,TTYINI ;INIT TTYOPT, ECHO AREA, TTYCOM, TTYSTA.
14103 MOVSI B,%TSFRE ;NOW MAKE TTY'S TTYSTS HAPPY
14108 CONO PI,TTYON#1 ;TTYCHN ON, BUT NOT CLKCHN.
14110 PUSH P,I ;IF THE JOB BEING ATTACHED IS LOGGED IN,
14111 MOVE U,-3(P) ;PERFORM ACCOUNTING FOR IT.
14122 MOVE B,-2(P) ;SAVED CTLBTS(U) AT ENTRY
14125 NATTAI: MOVE B,-2(P) ;CTLBTS
14126 MOVSI D,%USTSP ;BUSRC
14128 ANDCAM D,USTP(A) ;START JOB BEING ATTACHED, IF REQUESTED TO
14130 HRRZ U,C ;GET USR IDX GIVING TTY TO IN U,
14132 HRRZ T,I ;TTY # IN T FOR USTTV0
14133 PUSHJ P,USTTV0 ;GIVE THE JOB A BLINKER IF IT DESERVES ONE.
14136 POP P,A ;USR IDX TAKING TTY FROM (BUT NOT REALLY TAKING). I AND U STILL SET.
14137 PUSHJ P,AGBLT4 ;MOVE HIS PER-JOB VARIABLES INTO THE TTY'S VARIABLES, ETC.
14138 JRST NATTAE ;CLOCK IS NOW BACK ON.
14140 NATTAD: CONO PI,CLKOFF
14141 MOVE J,JNAME(U) ;ATTACHING OUR TTY TO JOB:
14142 MOVEM J,JNAME(A) ;GIVE JOB OUR JNAME ALONG WITH OUR TTY.
14145 PUSHJ P,AGBLT6 ;TRANSFER TTY TO HIM, SAVING OUR TTY STATE AND LOADING HIS.
14148 EXCH U,(P) ;U := USER INDEX OF TOP OF TREE BEING ATTACHED
14149 MOVSI T,BUMRTL ;SINCE TREE HAS BEEN ATTACHED, IT SHOULDN'T
14150 ANDCAM T,APRC(U) ;DIE AN HOUR AFTER IT WAS DETACHED.
14151 SKIPN STTYOP(U) ;RESTORE SAVED TTY OPTIONS, IF ANY
14153 LDB T,[170200,,STTYOP(U)]
14154 DPB T,[.BP (%TCRFS+%TCQRY),TTYCOM(I)]
14155 MOVE T,[%TOUSR,,%TPUSR]
14159 NATTAP: HLRE T,UNAME(U)
14162 PUSHJ P,DMNPLI ;LOG HIM IN
14165 SUB P,[1,,1] ;FLUSH SAVED CTLBTS
14166 PUSHJ P,LSWCLR ;UNSTOP THE JOBS AND FREE TREESW
14167 JUMPGE B,POPJ1 ;RETURN IF WE DIDN'T GIVE AWAY OUR CONSOLE.
14168 SETOM TTYTBL(U) ;DON'T WANT ALOGOU TO TYPE LOGOUT MESSAGE.
14169 JRST ALOGOUT ;LOG THIS JOB OUT.
14172 ; RH OF ARG IS JOB SPEC, OF OUR INFERIOR.
14173 ; LH OF ARG XOR CONTROL BITS:
14174 ; 1.1 => RETAIN PRIORITY (DON'T SET APRC)
14175 ; 1.2 => USE SYSTEM RESOURCE
14176 ; 1.3 => CLEAR .USTP AFTER DISOWNING (THUS AVOIDING TIMING ERROR)
14177 ; 1.4 => SET BUMRTL SO THAT JOB WILL BE GUNNED IF IT IS STOPPED FOR A WHOLE HOUR
14178 ; AND NOT REOWNED OR ATTACHED.
14181 XORM J,CTLBTS(U) ;XOR LH OF 1ST ARG INTO CTL BITS.
14183 JSP T,NCRUI2 ;DECODE JOB SPEC; DON'T SET DIELOK.
14186 JRST OPNL31 ;PDP6 NO GOOD.
14188 ADD R,A ; R GETS ADDR OF IOCHNM WORD IF ARG WAS CHANNEL #,
14189 TRNE A,400000 ;GET S0 IF ARG WAS OTHER SORT OF JOB SPEC.
14194 JRST OPNL31 ;NO GOOD IF NOT OUR INFERIOR.
14195 JRST NDISO1 ;JOIN OLD-STYLE DISOWN
14197 ;.DISOWN CH, ;MAKES DIRECTLY INFERIOR PROCEDURE OPEN ON CHANNEL CH
14198 ;THE TOP LEVEL JOB OF A DISOWNED JOB
14200 ADISOWN:HRRZ B,(R) ;PICK UP CH TYPE INDEX
14201 SKIPL CLSTB(B) .SEE %CLSU ;SKIP IF AN INF. USER CHANNEL
14202 JRST IOCER7 ;OTHER TYPE, GIVE IOC ERROR
14203 HLRZ A,(R) ;PICK UP INF.'S INDEX
14205 NDISO1: PUSHJ P,SWTL
14209 TLNE B,%TBDTY ;SKIP IF TTY TAKEN AWAY
14212 PUSH P,A ;JOB TO BE DISOWNED HAS THE TTY: TAKE IT AWAY.
14217 ADISO1: MOVEI Q,DSWNTY
14218 PUSHJ P,IFPHAK ;HACK INFERIORS
14221 PUSHJ P,NATTA1 ;FLUSH OUR POINTERS TO INFERIOR, AND SET FLAGS
14224 JRST LSWCJ1 ;UNSTOP HIS TREE AND FREE TREESW
14226 ;FLUSH INFERIOR-JOB CHANNELS FROM JOB IN U TO JOB IN A
14227 ;CANNOT PCLSR BECAUSE JOB IS CURRENT OR STOPPED ALREADY
14228 NATTA1: MOVEI R,0 ;NO PROTECTED CHANNEL
14231 PUSHJ P,ZUSES1 ;FLUSH POINTERS TO INFERIOR
14233 SETOM SUPPRO(A) ;MARK AS TOP LEVEL
14235 MOVSI TT,BUSRC ;CLEAR .USTP IF REQUESTED
14243 DSWNTY: SKIPL TTYTBL(A)
14244 BUG ;CHECKED AT HIGHER LEVEL, DATA INCONSISTENT
14245 NATTA2: TDZA T,T ;DO SOS TTNTO OF CONSOLE TTY.
14246 NDETA9: SETO T, ;DON'T.
14247 PUSHJ P,CHSCAA ;LOOK AT ALL CNHLS
14248 PUSHJ P,DSWNTZ ;BLESSING CONSOLE TTY CHNLS
14249 MOVEI TT,SYSRCE ;SET RESOURCE POINTER TO SYSTEM OR DISOWNED
14250 MOVE W,CTLBTS(U);DEPENDING ON CTLBTS
14252 MOVEI TT,USRRCE+NCT
14256 IORM T,APRC(A) ;MARK AS DISOWNED
14259 ;BLESS CONSOLE TTY CHANNELS. IF T NONZERO, DON'T SOS TTNTO.
14260 DSWNTZ: HLRZ B,(R) ;GET LH OF IOCHNM WORD
14261 HRRZ J,(R) ;GET DEV TYPE INDEX
14262 CAIL J,TYIDN ;SKIP IF LESS THAN LEAST TTY INDEX
14263 CAILE J,TYOBN ;SKIP UNLESS .LTEQ. HIGHEST
14264 POPJ P, ;NOT A TTY CHANNEL
14265 TRZ B,#%TICNS#(.BM $TIIDX)
14266 TRZE B,%TICNS ;SKIP IF NOT A CONSOLE TTY
14267 CAIN B,%TINON ;DO NOTHING TO "DISOWNED" TTY CHNLS
14269 MOVEI J,%TINON ;CHANGE OTHER TTY CHNLS TO DISOWNED
14270 DPB J,[$TIIDX,,(R)] ;CHNLS.
14271 JUMPN T,CPOPJ ;IN NDETAC, TTNTO ALREADY SETZM'D.
14272 SOSLE TTNTO(B) ;DECREMENT OPEN COUNT
14274 BUG ;SHOULD BE OPEN AT HIGHER LEVELS
14276 ;ROUTINE TO SCAN ALL I/O CHANNEL AND I/O PDL SLOTS OF A PROCEDURE
14277 ;R 4.9=1 => REGULAR CHANNEL 4.9=0 => IOPUSHED CHANNEL
14278 CHSCAA: MOVEI R,IOCHNM(A)
14282 HRLI R,-<LUIOP/2>+400000
14288 ;IFPHAK AND IFPLUP TAKE A USER INDEX IN A AND THE ADDRESS OF A ROUTINE
14289 ; IN Q. THEY CALL THE ROUTINE FOR THE PROCEDURE AND ALL OF ITS
14290 ; INFERIORS BUT IFPHAK ALSO STOPS THE SPECIFIED PROCEDURE AND
14291 ; ALL ITS INFERIORS STRINGING THEIR USTP'S INTO THE CURRENT USER'S
14296 MOVE U,USER ;MADE SURE YOU USE THE RIGHT LSWPR
14297 MOVEI Q,IFSTOP ;SET UP TO STOP
14301 IFPLUP: PUSH P,E ;SAVE E
14304 IFPLU5: MOVE A,E ;RECURSE
14307 PUSHJ P,(Q) ;CALL ROUTINE
14310 MOVEI E,LUBLK*2 ;INITIALIZE TO INDEX OF JOB AFTER CORE JOB
14311 IFPLU2: SKIPN UNAME(E)
14316 IFPLU3: ADDI E,LUBLK ;STEP TO NEXT VAR BLOCK
14317 CAMGE E,USRHI ;SKIP IF ALL EXAMINED
14318 JRST IFPLU2 ;NOT ALL, CONTINUE
14319 CAME H,A ;ALL, SKIP IF BACK TO TOP LEVEL
14320 JRST IFPLU4 ;NOT AT TOP LEVEL, POP UP
14323 POPJ P, ;RETURN FROM CALL TO IFPLUP
14325 IFPLU4: MOVE E,A ;POP
14326 HRRZ A,SUPPRO(A) ;UP
14327 JRST IFPLU3 ;AND CONTINE
14329 IFSTOP: PUSHJ P,RPCLSR ;STOP ROUTINE WHOSE INDEX IS IN A
14333 JRST UPCLSR ;HAVE ALREADY HACKED THIS GUY
14334 IFSTP1: MOVEI T,USTP(A) ;GET LOC OF USTP (WAS AOSED BY RPCLSR)
14335 MOVEI H,LSWB0(A) ;GET LOC OF A LOCKED SWITCH BLOCK OF PROC STOPPED
14336 MOVEM T,(H) ;SET WD1
14342 IORI T,603000 ;SOS WHEN UNLOCKED
14344 MOVEM H,LSWPR(U) ;ADD TO LOCKED SWITCH LIST OF USER
14347 UBLAM: SKIPL APRC(U) ;SKIP IF DISOWNED
14348 PUSHJ P,SDTTY ;GET TTY UP TO THIS LEVEL
14350 UBLAST: PUSHJ P,IODCL ;CLOSE IO DEVICES ETC
14352 PUSH P,U ;DO NOT USE THIS ROUTINE FOR CORING UP.
14357 SETOM BUSR ;SWAP-BLOCKED NO MORE
14360 ANDCAM TT,USWSCD(U)
14362 UBLST4: MOVE U,USER
14363 PUSHJ P,ACRF1 ;CORE DOWN TO NUM OF BLOCKS IN B
14365 MOVE U,USER ;;CHECK FOR ALLEGED BUG SOMEPLACE IN ACRF1
14367 BUG ;;NOT SUPPOSED TO RETURN UNTIL CORE REQUEST SATISFIED
14370 BUG ;;THUS GUY'S CORE SHOULD BE GONE BY NOW
14375 LDB B,[400,,B] ;OPER 50
14380 IFN NUNITS, TLNE A,%CLSDI
14381 .ALSO SKIPA A,UTEOF(A)
14385 ;OPER TO REQUEST OR FLUSH RUNNING IN IOT USER MODE
14386 AIOTLS: MOVSI A,400000
14388 XCTR XR,[SKIPGE (J)]
14389 JRST AIOTL1 ;JUMP IF WANT TO ENTER IOTLSR MODE
14394 AIOTL1: SKIPGE IOTLSR(U)
14395 JRST AIOTL2 ;ALREADY IN IOTLSR, JUST TURN THE BIT ON AGAIN FOR HIM
14396 BUG INFO,SIXBIT,UNAME(U),SIXBIT,JNAME(U),[IOTLSR]
14397 MOVEI T,SCRMSG ;WAIT FOR IT TO BE PRINTED (HA HA WHAT ABOUT BUFFERING?)
14401 AIOTL2: IORM B,UUOH
14404 SUBTTL FILENAME TRANSLATION
14406 ;ROUTINE TO TRANSLATE A FILENAME.
14407 ;WANTS DEV, FN1, FN2, SNAME IN A, B, C, D RESP. LEFT-JUST.
14408 ;WANTS MODE IN RH OF E.
14409 ;RETURNS TRANSLATED NAMES IN SAME PLACE.
14410 TRAN: SKIPN D ;MAYBE DEFAULT THE SNAME.
14411 TRAN6: MOVE D,USYSNM(U)
14416 SKIPN TRNCNT ;IF NO TRANSL. ENTRIES IN USE,
14417 JRST POPJ1 ;SHORT CUT.
14418 PUSHJ P,TRANRF ;GET READ ACCESS TO TRANSL LISTS.
14419 LDB I,[100,,E] ;GET INPUT/OUTPUT BIT.
14420 MOVEI H,10 ;MAX. NUM. TRANSLS ALLOWED.
14421 TRAN0: HRROI Q,(U) ;1ST TRY THIS JOB'S TRNLST.
14424 TRAN1: SKIPGE Q,SUPPRO(Q) ;MOVE UP TREE TO TRNLS1.
14425 SETZ Q, ;AFTER TOP OF TREE, USE SYS.
14426 TRAN2: MOVE J,TRNLS1(Q) ;USE THIS GUY'S TRNLS1.
14427 MOVEI Q,(Q) ;INDICATE THAT FACT IN SIGN.
14429 TRAN3: CAME B,TRANI1(J) ;ENTRY'S FN1 MATCHES
14430 SKIPN TRANI1(J) ;OR IS NULL?
14431 SKIPA TT,TRANI2(J) ;YES, GET FN2.
14432 JRST TRAN4 ;NO, TRY NEXT ENTRY.
14433 CAME TT,C ;FN2 MTCHES OR NULL.
14435 CAME D,TRANIS(J) ;SNAME ?
14437 SKIPA TT,TRANID(J) ;YES, GET DEV.
14440 JUMPN TT,TRAN4 ;TEST DEV.
14441 HLRZ TT,TRANLK(J) ;GET ENTRY'S MODE BITS.
14442 TRNN TT,1(I) ;TRANSLATE OUR MODE?
14448 IRPS X,,OD O1 O2 OS
14450 MOVE A+.IRPCN,TRAN!X(J)
14451 TERMIN ;REPLACE NAMES FROM ENTRY.
14452 TRNE TT,400000 ;ATOMIC?
14453 JRST TRANX3 ;YES, EXIT.
14454 SOJG H,TRAN0 ;ELSE RETRANSL.
14455 JRST TRANX2 ;IF TOO MANY TRANSL., DON'T SKIP.
14457 TRAN4: HRRE J,TRANLK(J) ;CDR DOWN LIST.
14458 TRAN5: JUMPGE J,TRAN3 ;TRY NEXT UNLESS AT END.
14459 JUMPL Q,TRAN2 ;IF DID TRNLST, DO SAME JOB'S TRNLS1.
14460 JUMPN Q,TRAN1 ;ELSE DO SUPPRO'S TRNLS1.
14461 TRANX3: AOS (P) ;EXIT IF DID SYS.
14462 TRANX2: SOS TRNREF ;NO LONGER USING TRANSL. LISTS.
14465 TRANRF: AOS TRNREF ;SAY USING TRANSL. LISTS.
14467 POPJ P, ;OK IF NOT BEING CHANGED.
14468 SOS TRNREF ;NOT REFERENCING AFTER ALL.
14469 SKIPL TRANSW ;WAIT TILL FREE.
14471 JRST TRANRF ;TRY AGAIN.
14472 \f;TRANS SYSTEM CALL.
14473 NTRNS: JSP T,DEFARG ;DEFAULT 5 ARGS TO 0.
14475 XOR E,CTLBTS(U) ;XOR CTL BITS WITH ARG S
14476 PUSHJ P,TRAN ;TRANSLATE NAME.
14477 JRST OPNL3 ;FAIL IF TOO MANY TRANSL.
14478 JRST POPJ1 ;ELSE GIVE BACK TRANSL'D NAMES.
14481 DEFARG: CAML W,(T) ;IF NOT ALL SPEC'D,
14483 SETZM A(W) ;DEFAULT ONE AND RETRY.
14486 ;LOCK TRANSW, AND SET UP 1ST ARG FOR NTRNAD, NTRNDL, NTRNCL.
14487 ;RH OF A HAS JOB SPEC; CONTROL BIT ARGS XOR'D INTO LH.
14488 ;THE 4.8 BIT, IF SET, INDICATES TRNLS1 RATHER THAN TRNLST.
14489 ;OTHER LH BITS IGNORED,, NOT CHANGED BY NTRNUI.
14490 ;ON RETURN, A'S LH IS UNCHANGED, RH IS SUCH THAT
14491 ; TRANLK(A) IS THE ADDR OF THE SPECIFIED TRNLS VAR.
14492 NTRNUI: PUSHJ P,SWTL
14496 JSP T,NCRUI2 ;DECODE THE JOB-SPEC.
14497 JRST NTRNU1 ;JOB GUARANTEED WRITEABLE.
14498 JUMPE J,NTRNU1 ;ALLOW JOBS TO MUNG THE SYSTEM TRANSLATION LIST.
14499 JSP T,NCORWR ;ELSE CHECK.
14500 JRST OPNL31 ;NOT WRITEABLE.
14502 JRST OPNL34 ;PDP6??
14503 HRRI A,TRNLST-TRANLK(J)
14504 TLNE A,200000 ;4.8 BIT SAYS WHICH TRNLS TO USE.
14505 ADDI A,TRNLS1-TRNLST
14508 ;GET UP TO 4 ARGS INTO D ... D+3, FROM AOBJN PTR IN B.
14509 NTRNGA: MOVSI H,-4 ;UP TO 4 ARGS.
14511 NTRNG0: UMOVE J,(B)
14512 JUMPGE W,NTRNG2 ;W IS -1 FOR .TRANA, .TRAND;
14513 TRNN H,-1 ;IN THAT CASE LEFT-JUST. DEV. (1ST ARG)
14515 NTRNG2: CAMN J,[SIXBIT/*/]
14516 MOVEI J,0 ;REPLACE * BY BLANK.
14517 MOVEM J,D(H) ;STORE AWAY.
14518 AOBJP H,CPOPJ ;DONE AFTER 4TH ARG.
14519 AOBJN B,NTRNG0 ;ELSE GET NEXT.
14520 NTRNG3: SETZM D(H) ;ZERO REMAINING ARGS.
14523 \f;TRANEX CALL -- READ IN A JOB'S TRANSL LIST.
14524 ;1ST ARG RH - JOB SPEC. BIT 4.8 - IF SET, TRNLS1 NOT TRNLST.
14525 ;2ND ARG AOBJN -> PLACE TO STORE LIST INTO.
14526 ;UPDATED AOBJN PTR IS OUTPUT ARG.
14527 ;SKIPS IF ENTIRE LIST FIT IN BUFFER.
14528 ;EACH ENTRY TAKES 9 WDS OF SPACE: MODE,, IN 1ST,
14529 ;INPUT DEV, FN1, FN2, SNAME; THEN OUTPUT DEV, FN1, FN2, SNAME.
14530 NTRNEX: PUSHJ P,TRANRF ;GET READ ACCESS TO TRANSL LISTS.
14531 PUSHJ P,SOSSET ;RELINQUISH IF BLOCKED.
14535 JSP T,NCRUI2 ;DECODE THE JOB SPEC.
14536 JFCL ;NOT TRYING TO WRITE.
14537 HRRI A,TRNLST-TRANLK(J)
14538 TLNE A,200000 ;MAKE TRANLK(A) BE TRNLS VAR.
14539 ADDI A,TRNLS1-TRNLST
14540 SUB B,[1,,1] ;SINCE WE AOBJ BEFORE ACTING.
14541 NTRNE1: HRRE T,TRANLK(A) ;AT END -> RETURN SKIPPING.
14543 HLLZ D,TRANLK(T) ;RETURN LH ONLY OF 1ST WD.
14545 NTRNE2: MOVE D,TRANLK(T) ;ALL OF OTHER 8 WDS.
14546 AOBJP B,[ PUSHJ P,OPNL37
14551 AOBJN T,NTRNE2 ;STORE ALL 9.
14552 MOVEI A,-9*SIOMT(T) ;GO TO NEXT.
14556 AOBJP B,.+1 ;COMPENSATE FOR SUB .
14557 PUSHJ P,LSWPOP ;RELEASE READ ACCESS.
14559 JRST SYSCPT ;RETURN AOBJN PTR.
14560 \f;TRANDL CALL -- DELETE ENTRY FROM TRANSL LIST.
14561 ;1ST ARG RH JOB SPEC. OF JOB WHICH IS OK TO MODIFY.
14562 ;1ST ARG LH MODE BITS AS FOR .TRANAD, ALSO 4.8 BIT SAYS TRNLS1
14563 ; (SPEC'D JOB AND INFS, RATHER THAN JUST SPEC'D JOB)
14564 ;2ND ARG AOBJN -> INPUT DEV, FN1, FN2, SNAME. (ONLY DEV NEC.).
14565 ;SKIPS IF SOMETHING WAS DELETED.
14566 NTRNDL: JSP Q,NTRNUI ;PROCESS 1ST ARG., LOCK TRANSW.
14567 NTRND: PUSHJ P,NTRNDA ;ACTUALLY DELETE.
14568 JRST OPNL4 ;NOTHING TO DELETE => FILE NOT FOUND
14569 JRST LSWPJ1 ;SKIP IF NTRNDA DID.
14571 NTRNDA: TLZ A,-1#400003
14572 PUSHJ P,NTRNGA ;ELSE GET INPUT NAMES.
14575 HRRZS (P) ;CLEAR SKIP FLAG.
14577 NTRND2: MOVEI T,(H) ;CDR DOWN BOTH PTRS.
14578 NTRND0: HRRE H,TRANLK(T) ;LOOK AT NEXT ENTRY.
14579 JUMPL H,NTRNDX ;EXIT IF END.
14580 CAMN D,TRANID(H) ;ALL 4 INPUT NAMES MUST MATCH.
14582 JRST NTRND2 ;ELSE NOT TO BE DELETED.
14586 HLLZ R,A ;GET MODE FROM ARG.
14587 TLZ R,400000 ;DONT CLOBBER ATOM BIT
14588 ANDCA R,TRANLK(H) ;TURN OFF IN MODE FROM ENTRY.
14589 CAME R,TRANLK(H) ;IF DELETED ONE, CALL WILL SKIP.
14592 TLNE R,3 ;IF NEITHER DIRECTION LEFT, SPLICE OUT.
14594 SKIPE TRNREF ;WAIT TILL NOONE READING TRANSL LISTS.
14596 SOS TRNCNT ;ONE LESS ENTRY IN USE.
14597 HRRZ R,TRANFL ;MAKE LINK -> CURRENT FREE LIST.
14599 HRRM R,TRANLK(T) ;REST OF TRNLS INTO PREDECESSOR'S LINK.
14600 HRRZM H,TRANFL ;ADD THIS ONE TO FREE LIST.
14603 NTRNDX: HRRES TRANLK(A) ;IN CASE DELETED 1ST ENTRY.
14605 AOS (P) ;SKIP IF SET FLAG.
14607 \f;TRANAD CALL. -- ADD AN ENTRY TO A TRANSL LIST.
14608 ;1ST 2 ARGS AS FOR TRANDL.
14609 ;3RD ARG LIKE 2ND BUT GIVES OUTPUT NAMES.
14610 ;SKIPS UNLESS ALL ENTRIES WERE IN USE.
14611 NTRNAD: JSP Q,NTRNUI
14612 NTRNA: TLNN A,3 ;IF RELLY NOTHING WOULD BE TRANSL'D,
14613 JRST LSWPJ1 ;DON'T BOTHER ADDING..
14614 PUSHJ P,NTRNDA ;DELETE ANY EXISTING TRANSL. FOR THESE INPUT NAMES.
14615 JFCL ;IF WERE NONE.
14617 JRST OPNL5 ;NO FREE ENTRIES - DIRECTORY FULL.
14618 AOS TRNCNT ;1 MORE ENTRY IN USE.
14619 IRPS X,,ID I1 I2 IS
14620 MOVEM D+.IRPCN,TRAN!X(T)
14621 TERMIN ;PUT INPUT NAMES INTO ENTRY.
14623 PUSHJ P,NTRNGA ;GET OUTPUT NAMES.
14624 IRPS X,,OD O1 O2 OS
14625 MOVEM D+.IRPCN,TRAN!X(T)
14626 TERMIN ;STORE OUTPUT NAMES.
14627 MOVE H,TRANLK(A) ;PUT CURRENT TRNLS INTO LINK.
14629 HRREM H,TRANFL ;STORE BACK REST OF FREE LIST.
14630 MOVEM T,TRANLK(A) ;TRNLS NOW STARTS WITH THSI ONE.
14631 HLLM A,TRANLK(T) ;STORE MODE BITS.
14633 \f;TRANCL CALL -- RESET A ONE OR BOTH TRANSL LISTS FOR A JOB.
14634 ;1ST ARG RH HAS JOB SPEC OF MODIFYABLE JOB.
14635 ; BIT 4.8 CLEAR TRNLS1 VAR. (TRANSL FOR THIS JOB & INFS).
14636 ; BIT 4.7 CLEAR TRNLST VAR. (TRANSL FOR THIS JOB ONLY).
14637 ; ALWAYS SKIPS IF VALID.
14638 NTRNCL: JSP Q,NTRNUI ;RH(A) -> TRNLST OR TRNLS1 VAR.
14640 SUBI A,TRNLS1-TRNLST ;MAKE -> TRNLST VAR.
14641 SUBI A,TRNLST-TRANLK
14644 NTRNCA: SUBI A,TRNLST-TRANLK ;MAKE HOLD USR IDX.
14645 NTRNC: PUSHJ P,SWTL ;GET WRITE ACCESS.
14648 SKIPE TRNREF ;WAIT FOR READ REFS TO FINISH.
14650 TLNN A,100000 ;IF 4.7, HANDLE TRNLST.
14653 SETOM TRNLST(A) ;SET LIST TO NIL.
14654 JUMPGE T,NTRNC1 ;IF WASN'T NIL, FREE ENTRIES ON IT.
14655 NTRNC0: TLZN A,200000 ;MAYBE HANDLE TRNLS1.
14659 JUMPL T,LSWPOP ;NOTHING TO DO IF ALREADY NIL.
14660 NTRNC1: MOVEI C,(T) ;SAVE START OF LIST.
14661 NTRNC2: SOS TRNCNT ;UPDATE NUM ENTRIES IN USE.
14663 JUMPL H,NTRNC3 ;AT END, SPLICE INTO FREELIST.
14664 MOVEI T,(H) ;ELSE CDR DOWN.
14666 NTRNC3: EXCH C,TRANFL
14668 JRST NTRNC0 ;MAYBE CONSIDER THE OTHER LIST.
14669 \f;.TRANA, .TRAND CALLS.
14670 ATRANA: UMOVE E,(B)
14671 JSP T,ATRNDT ;SET UP ARGS FOR NTRNA .
14672 PUSHJ P,SWTL ;GET WRITE ACCESS.
14677 ATRAND: XCTR XR,[SKIPN E,(B)]
14678 JRST ATRND0 ;ZERO UNAME -> TRANCL .
14679 JSP T,ATRNDT ;SET UP ARGS.
14680 PUSHJ P,SWTL ;GET WRITE ACCESS.
14684 ATRND0: JSP T,ATRNDT
14685 TLO A,300000 ;SAY CLEAR BOTH LISTS.
14687 SUBI A,TRNLS1-TRNLST ;NAKE SURE -> TRNLST VAR.
14690 ATRNDT: MOVE C,JNAME(U)
14691 MOVEM C,ATRNJN ;WHO THE HELL'S USING THESE?
14692 CAME E,UNAME(U) ;UNAME MUST BE 0 OR THSI JOB'S.
14693 JUMPN E,CPOPJ ;ELSE MAKE UUO FAIL.
14694 MOVNI W,1 ;SIGNAL TO NTRNGA.
14695 MOVEI C,5(B) ;SET UP 2 AOBJN PTRS
14697 HRLI C,-3 ;-> INPUT NAMES (B), OUTPUT NAMES (C).
14699 XCTR XR,[HLL A,(B)] ;GET MODE BITS.
14701 JUMPE D,CPOPJ ;JNAME MUSTN'T BE 0.
14702 CAME D,[SIXBIT/*/] ;IF *, USE THIS JOB'S TRNLS1.
14704 HRRI A,TRNLS1-TRANLK(U)
14707 ATRND2: MOVEI H,0 ;ELSE FIND JOB WITH THAT JNAME.
14708 MOVE E,UNAME(U) ;THIS JOB'S UNAME.
14709 ATRND1: CAMN E,UNAME(H)
14711 JRST ATRND3 ;NOT THE ONE WE'RE LOOKING FOR.
14713 CAIE U,(E) ;IS THIS OUR INF.
14714 CAIN U,(H) ;IS IT THE CURRENT JOB?
14716 POPJ P, ;NO, CAN'T SET ITS TRANSL LIST.
14717 HRRI A,TRNLST-TRANLK(H)
14718 JRST (T) ;OK, SET ITS TRNLST VAR.
14719 ATRND3: ADDI H,LUBLK
14720 CAMGE H,USRHI ;LOOK AT ALL JOBS.
14722 POPJ P, ;CAN'D TRANAD NON EX JOB.
14724 SUBTTL JOB, BOJ DEVICE ROUTINES
14727 JBMN==10 ;MAXIMUM NUMBER OF JOBS ON JOB DEVICE
14729 JBCUI: REPEAT JBMN,-1 ;-1 => CHNL FREE, ELSE (IF JBCG POSITIVE) CREATOR'S USR IDX.
14730 JBCG: BLOCK JBMN ;-1 IF CREATOR GONE AWAY
14731 JBWST: REPEAT JBMN,SNJOB ;CREATED JOB'S WAIT STATUS (CREATED JOB=HANDLER JOB)
14733 %JBWIN==400000 ;4.9 => CREATED JOB HAS DONE A SUCCESSFUL JOBRET
14734 %JBREU==200000 ;4.8 => JOB CLOSED AND MADE ITSELF AVAILABLE FOR REUSE
14735 %JBVAL==020000 ;4.5 => VALID BIT (CREATOR CAME IN, NO JOBRET YET)
14736 %JBSTR==010000 ;4.4 => STORED BIT (CREATOR CAME IN, NO JOBGET YET)
14737 %JBUNH==004000 ;4.3 => BOJ BLK UNHANG BIT
14738 %JBSIO==001000 ;4.1 => IF DOING AN IOT, THIS BITS SAYS ITS REALLY A SIOT
14739 %JBLOS==000400 ;3.9 => CREATED JOB WAS CLOSED AND KNOWS IT, SO DON'T REUSE
14740 ;1.1-2.9 => LAST STATUS SET BY BOJ
14742 JBDEV: BLOCK JBMN ;DEVICE NAME, USER-SETTABLE (MOSTLY FOR PEEK AND WHO LINES)
14743 JBFN1: BLOCK JBMN ;FN1
14744 JBFN2: BLOCK JBMN ;FN2
14745 JBSYS: BLOCK JBMN ;SYSNAME
14746 JBOPNM: BLOCK JBMN ;OPEN MODE
14747 JBFNP: BLOCK JBMN ;BP TO ASCIZ FILENAME STRING IN USER ADDRESS SPACE (OR 0 IF NONE).
14748 JBCJUI: BLOCK JBMN ;RH = CREATED JOB'S USER INDEX.
14749 ;LH = -1 IFF CREATED JOB GOING AWAY. JOB MUST EXIST
14750 ;SINCE WHEN IT DIES IT FLUSHES THE JOB CHANNEL
14751 ;AND ITS CREATOR'S CHANNELS.
14752 JBSTS: BLOCK JBMN ;STATUS OF JOB-BOJ INTERACTIONS
14753 ;4.9=1 => IMAGE =0 => ASCII
14754 ;4.8=1 => BLOCK =0 => UNIT
14755 ;4.7=1 => WRITE =0 => READ
14756 ;4.6-4.3 => NUMBER OF TIMES TO SKIP
14757 ;4.2-3.6 => OPEN LOSS
14758 ;3.5-3.2 => # OF ARGS ON LAST .CALL
14759 ;1.4 => SYSTEM CALL OTHER THAN THOSE BELOW.
14760 ;1.3-1.1 => SYSTEM CALL
14767 ;6 FDELE (DELETE OR RENAME)
14768 ;7 FDELE (RENAME WHILE OPEN)
14770 JBST2: BLOCK JBMN ;SECOND WORD OF JOBGET INFO
14772 ;FOR SIOT, THE BYTE COUNT
14773 ;FOR BLOCK IOT, THE BLOCK POINTER
14774 ;NEW FN1 FOR RENAME, MLINK.
14775 JBOFN1: BLOCK JBMN ;FN1 BEFORE LAST TRANS
14776 JBOFN2: BLOCK JBMN ;FN2 "" ""
14777 JBOSYN: BLOCK JBMN ;SYSNAM ""
14778 JBODEV: BLOCK JBMN ;DEV " "
14779 JBNFN2: BLOCK JBMN ;NEW FN2 FOR FDELE.
14780 JBAC7: BLOCK JBMN ;7TH ARG TO .CALL, NEW SNAME FOR MLINK.
14781 JBAC10: BLOCK JBMN ;TABLE FOR .CALL ARG 10, FIRST BP ARG TO SOPEN/RENAME/MLINK/DELETE.
14782 JBAC11: BLOCK JBMN ;TABLE FOR .CALL ARG 11, SECOND BP ARG TO RENAME, MLINK OR RENMWO.
14784 JBACTB: JBST2(H) ;TABLE OF POINTERS TO .CALL ARG TABLES
14794 JBIOCJ: BLOCK JBMN ;IO CHNL ERROR WORD. 4.9 => IOCER ON NEXT JOB IOT
14797 JBSW: -1 ;LOCK ON ASSIGNMENT OF INDEX IN ABOVE TABLES
14801 ;OPEN ON BOJ: DEVICE
14803 ;3.5 = 1 => UNHANG ON BLK IOT AFTER EACH XFER OF MAXIMAL SIZE
14804 BOJO: JUMPN W,OPNL12 ;NO SUCH MODE
14805 SKIPGE E,JBI(U) ;JOB CHANNEL INDEX
14806 JRST [ MOVE E,OPTION(U) ;IF THIS JOB ISN'T A JOB DEVICE,
14807 TLNN E,%OPOJB ;IF IT'S EXPECTING TO BE AN OJB DEVICE, OK.
14808 JRST OPNL10 ;OTHERWISE IT CAN'T WIN.
14809 SKIPGE JBI(U) ;IF IT CAN WIN, WAIT TILL IT HAS.
14811 JRST BOJO] ;THEN TRY AGAIN.
14813 BUG ;JOB CHANNEL INDEX TOO BIG
14827 ;OPEN ON JOB: DEVICE
14829 ;3.1-3.3 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
14830 ;A,B HAVE FILENAMES, RH(C) HAS DEVICE (JOB OR OJB)
14831 ;RH(D) AND LH(C) BOTH HAVE OPEN-MODE.
14833 JOBO: PUSHJ P,FLDRCK
14835 JRST OPNL11 ;ILLEGAL FILE NAME
14836 JOBO3: CAMN A,[SIXBIT /M.F.D./]
14837 CAME B,[SIXBIT /(FILE)/]
14839 JRST OPNL11 ;ILLEGAL FILE NAME
14840 JOBO2: MOVEI J,0 ;SET J TO JOBGET "COMMAND" NUMBER
14842 MOVEI J,2 ;MLINK, MOSTLY JUST LIKE FDELE, BUT SEE JOBOF3
14847 PUSHJ P,SWTL ;LOCK JOB CHNL ASSIGN SWITCH
14849 JOBO5: SKIPGE TT,JBCUI(Q) ;SKIP IF NOT FREE
14853 JRST JOBORU ;JUMP IF THIS IS FIRST ATTEMPT TO OPEN
14857 SKIPGE JBCG(Q) ;LOOK FOR CHANNEL ON WHICH THIS USER
14858 CAIE TT,(U) ;PREVIOUSLY ATTEMPTED TO OPEN, BUT PCLSRED
14864 JRST JOBO6 ;NOT OPENING SAME FILE
14869 JRST JOBO6 ;NOT FOR SAME FILE
14875 JRST JOBO6 ;NOT FOR SAME OPEN TYPE AND MODE
14877 TLNE TT,%JBLOS+%JBWIN+%JBREU
14878 JRST JOBO6 ;HANDLER JOB NOT IN CORRECT STATE
14879 HRRZ E,Q ;REUSE SAME HANDLER JOB AS IN PREVIOUS ATTEMPT TO OPEN
14880 SETZM JBCG(E) ;I'M BACK
14881 PUSHJ P,LSWPOP ;FREE JBSW
14883 MOVEM TT,JBWST(E) ;RE-GIVE OPEN COMMAND STILL SITTING IN JBSTS ETC.
14884 HRLI E,400000 ;OPEN-TYPE WAIT
14885 PUSHJ P,JBWT2 ;WAIT FOR HANDLER JOB TO PROCESS IT
14886 JRST JOBO8 ;FINISH OFF THEN OPEN
14888 ;FIRST ATTEMPT TO OPEN, CHECK FOR REUSEABLE HANDLER JOBS BEFORE CREATING NEW
14889 JOBORU: CONO PI,CLKOFF
14893 JRST JOBO6 ;IN USE ALREADY OR NOT WILLING TO BE REUSED
14896 JRST JOBOR1 ;IF SAME SIMULATED DEVICE, OK TO SIEZE
14899 JRST JOBO6 ;DIFFERENT HANDLER NAME
14902 JRST JOBO6 ;DIFFERENT HANDLER NAME
14903 JOBOR1: MOVEM TT,JBWST(Q) ;THIS ONE OK, SIEZE IT
14909 PUSHJ P,LSWPOP ;FREE JBSW
14912 JOBO4: HRRZ E,Q ;REMEMBER FREE JOB CHNL IN CASE NEEDED
14913 JOBO6: CONO PI,CLKON
14914 AOBJN Q,JOBO5 ;SCAN REST OF JOB CHANNELS
14915 JUMPL E,OPNL6 ;DEVICE FULL
14916 MOVEM U,JBCUI(E);STORE CREATOR'S USER INDEX
14917 PUSHJ P,LSWPOP ;FREE JOBSW
14918 PUSHJ P,STMSET ;SETOM JBCUI(E) ON LOSSAGE
14925 MOVEI T,SNJOB ;INITIALIZE STATUS
14934 ANDI C,-1 ;FOR OJB DEVICE, LOOK FOR EXISTING JOB.
14937 MOVE A,UNAME(U) ;FOR JOB DEVICE, CREATE NEW JOB.
14942 ADD B,[SIXBIT /JOB./] ;CREATE JNAME = 'JOB.MN'
14943 MOVE C,[7,,(SIXBIT /USR/)]
14945 PUSHJ P,USROJ ;GENERATE USER(CAN ONLY PCLSR BEFORE CREATING INFERIOR)
14946 JRST POP7J ;USER OPEN FAILED, MUST HAVE GONE TO OPNL ALREADY
14952 MOVE T,[JBSTCD,,AC0S]
14957 MOVEM A,AC0S+10(TT)
14958 MOVEM B,AC0S+11(TT)
14960 MOVEM T,USYSNM(TT) ;SET CREATED JOB'S SYS NAME TO OURS
14961 SETZM USTP(TT) ;START JOB AS SOON AS CLK BACK ON
14964 ;OJB: DEVICE, LOOK FOR JOB WHOSE NAMES ARE THE FILENAMES SPECIFIED IN THE OJB OPEN.
14965 JOBO6B: MOVE C,[7+UBPFJ,,'USR] ;DON'T EVER CREATE JOB FOR OJB.
14966 MOVE D,[SETZ 3+UBPFJ_<-1>]
14971 ;TT HAS USER IDX OF JOB TO BE USED; CAN'T PCLSR AFTER THIS POINT.
14972 JOBO6C: PUSHJ P,LSWDEL ;SETOM JBCUI(E)
14979 JOBO7: CONO PI,CLKOFF
14996 JUMPN J,[PUSHJ P,JFDEL5 ;DELETE/RENAME/MLINK
14998 LDB TT,[000300,,JBOPNM(E)]
15001 HRRZ C,JBOPNM(E) ;GET ALL OF OPEN MODE
15002 MOVEM C,JBNFN2(E) ;GIVE IT
15003 JOBO9: PUSHJ P,JBWT1 ;STORE STUFF AND HANG
15004 JOBO8: LDB TT,[350400,,JBSTS(E)]
15005 JUMPE TT,JOBOPL ;OPEN LOST
15006 LDB C,[000400,,JBSTS(E)]
15007 JUMPN C,[ SETOM JBCG(E) ;DELETE/RENAME/MLINK
15010 SETZM IOCHST-IOCHNM(R)
15018 JOBOPL: LDB C,[270600,,JBSTS(E)]
15025 ;RENAME WHILE OPEN ON JOB CHNL
15026 JFDEL4: HLRZ E,(TT) ;JOB CHNL INDEX
15028 PUSHJ P,JFDEL5 ;DO "FDELE"
15029 MOVE TT,EPDL3(U) ;PASS ALONG THE BP ARG IF THERE WAS ONE.
15032 JRST AIOCA1 ;GET RESULTS
15034 ;FDELE/RENMWO/MLINK ON JOB CHANNEL
15035 JFDEL5: MOVEM J,JBSTS(E)
15036 MOVE TT,SRN3(U) ;REMEMBER NAMES TO RENAME AS
15037 MOVEM TT,JBST2(E) ;FOR JOBGET TO RETURN.
15040 MOVE TT,SRN5(U) ;IN CASE THIS IS MLINK, MAKE SURE THE "TO" SNAME
15041 MOVEM TT,JBAC7(E) ;IS GIVEN TO JOBGET.
15045 ;GIVE AN INTERRUPT TO THE JOB DEVICE HANDLER.
15046 ;JOB CHNL INDEX IN E, CLOBBERS TT,J,Q,H
15049 JBINT: HRRZ TT,JBCJUI(E)
15054 TDNN H,CLSTB(Q) ;SKIP IF BOJ
15055 JBINT2: AOBJN J,JBINT1
15063 ;THIS IS THE CODE PUT IN THE ACS TO LOAD IN THE JOB DEVICE HANDLER
15065 JBSTCD: .OPEN 1,7 ;0
15072 4,,(SIXBIT /DSK/) ;7
15079 -1 ;16 (LOAD INTO SELF)
15082 ;HAND THE JOB DEVICE HANDLER A SYSTEM CALL AND WAIT FOR IT TO BE HANDLED.
15083 ;CALL WITH CLOCK OFF, JOB CHNL IN E
15084 JBWT1: TLOA E,400000 ;OPEN/FDELE/MLINK, CLOSE CHANNEL IF PCLSR
15085 JBWT: TLZ E,400000 ;NORMAL ENTRY POINT, DON'T CLOSE IF PCLSR
15087 JBWTI: HRLI E,200000 ;ENTER HERE TO INHIBIT SETTING %PCFPD IF PCLSR
15088 MOVSI TT,%JBVAL+%JBSTR
15089 IORM TT,JBWST(E) ;TURN ON VALID AND STORED
15090 JBWT2: PUSHJ P,JBINT ;GIVE INT
15092 JBPCL ;CLEAR VALID AND STORED IF PCLSR
15093 MOVE T,E ;CAUSES EPDL2 TO HAVE JOB INDEX
15096 PUSHJ P,UFLS ;AWAIT RESULTS FROM HANDLER JOB
15098 ANDCAM TT,UUOH ;NOW WE KNOW WE'LL RETURN TO USER WITHOUT PCLSRING FIRST
15101 JBPCL: MOVE A,AC0S+E(U) ;HERE IF PCLSR OUT
15102 SKIPL JBCJUI(A) ;UNLESS HANDLER GOING AWAY
15103 TLNE A,200000 ;OR THIS SYSTEM CALL DOESN'T WANT IT,
15105 MOVSI T,%PCFPD ;SET FIRST PART DONE FLAG
15106 IORM T,UPC(U) ;NOTE PCLSR HAS ALREADY MOVED UUOH INTO UPC
15107 JBPCL1: MOVSI T,%JBVAL+%JBSTR ;NOT VALID, NOT STORED
15110 SETOM JBCG(A) ;SAY THE CREATOR HAS CLOSED IT
15114 MOVE E,A ;AND GIVE THE HANDLER AN INTERRUPT
15121 ;JOB DEVICE BLOCK MODE IOT EITHER DIRECTION
15122 JBBI: XCTR XRW,[MOVES D,(C)] ;REFERENCE POINTER
15128 HRRZ T,D ;-> FIRST WORD TO TRANSFER
15129 HLROS D ;MINUS WORD COUNT
15130 IORI D,700000 ;FLUSH CHAR COUNT
15131 SUBM T,D ;D -> LAST WORD + 1 TO TRANSFER
15132 JRST JBIPG ;SWAP IN BUFFER THEN DO IOT
15134 ;JOB DEVICE UNIT MODE IOT EITHER DIRECTION
15136 JBUI: MOVSI T,%JBSIOT
15140 UMOVE W,(C) ;FOR UNIT OUTPUT
15141 JBIOT1: HRRZ TT,JBOPNM(A)
15144 HRRZ E,A ;JOB CHNL INDEX
15146 MOVEM C,SRN3(U) ;MAY BE ADDRESS OF BLOCK IOT POINTER
15149 JRST JBWTI ;GO SIGNAL HANDLER JOB
15150 SETZM JBIOCJ(E) ;TAKE IOC ERROR INSTEAD
15151 JRST IOCERF-MIOTER(TT)
15153 ;JOB DEVICE SIOT EITHER DIRECTION
15154 JBSI: AOS (P) ;SIOT SHOULD SKIP RETURN
15157 XCTR XRW,[MOVES T,(B)] ;BYTE PNTR ARG
15158 LDB E,[300600,,T] ;BYTE SIZE
15160 IDIVM D,E ;E := # BYTES PER WORD
15161 XCTR XRW,[MOVES D,(C)] ;BYTE COUNT ARG
15163 IDIV D,E ;D := WORD COUNT, E := EXCESS BYTES
15164 IBP T ;-> FIRST WORD TO TRANSFER
15169 JBIPG: HRRZS D ;-> LAST WORD TO TRANSFER + 1
15170 ANDI T,-2000 ;-> FIRST PAGE INVOLVED IN TRANSFER
15171 LDB E,[.BP .UII#.UIO,JBOPNM(A)] ;0 INPUT 1 OUTPUT
15172 JBIPG1: SKIPE E ;SWAP IN THE NECESSARY PAGES
15173 XCTR XR,[SKIPA 20(T)]
15174 XCTR XRW,[MOVES 20(T)]
15180 ;FLSINS ROUTINE TO WAIT FOR CREATOR TO BE HUNG AT JBFLS
15181 ;4.9 OF SRN3 = 1 => WAIT FOR WRITE 0 => READ
15182 ;1.1-1.4 => CODE OF UUO TO WAIT FOR
15184 BJWAIT: SKIPE B,FLSINS(T)
15186 POPJ P, ;NOT HUNG AT JBFLS
15187 HRRZ B,EPDL2(T) ;JOB INDEX THAT CREATOR IS HACKING
15188 HLRZ E,T ;JOB INDEX OF BOJ USER
15190 POPJ P, ;CREATOR HACKING JOB DEVICE ON SOME OTHER CHANNEL
15192 LSH TT,2 ;4.9 => READ/WRITE BIT NOW
15193 EQV TT,SRN3(U) ;4.9 OF SRN3 => WHAT TO LOOK FOR
15194 JUMPGE TT,CPOPJ ;DOESN'T MATCH
15195 MOVE TT,JBSTS(B) ;INSN CREATOR IS DOING
15196 XOR TT,SRN3(U) ;INSN LOOKING FOR
15198 AOS (P) ;THEY MATCH, AWAKEN BOJ JOB
15201 ;BOJ DEVICE UNIT MODE OUTPUT
15205 MOVEI B,1 ;WAIT FOR INPUT IOT
15207 HRLZ T,A ;JOB INDEX
15208 HRR T,JBCUI(A) ;CREATOR'S USER INDEX
15209 PUSHJ P,CWAIT ;WAIT FOR CREATOR TO BE IN IOT, RETURN WITH CLK OFF
15214 BJUO1: MOVE TT,JBSTS(A)
15216 JRST BJUOB ;BLOCK MODE CREATOR IOT
15217 LDB D,[.BP (%JBSIOT),JBWST(A)]
15218 JUMPN D,BJUOS ;CREATOR SIOT
15220 BJIUNH: MOVSI D,%JBWIN
15221 IORM D,JBWST(A) ;SET SUCCESSFUL JOBRET BIT
15222 MOVSI D,%JBVAL+%JBSTR
15225 DPB D,[350400,,JBSTS(A)] ;DON'T SKIP
15226 EXCH D,FLSINS(T) ;RESTART CREATOR
15229 BUG ;HE WASNT WHERE HE BELONGED
15230 POPJ P, ;NEED NOT CLKON, CALLER WILL TURN IT ON
15232 ;BOJ UNIT OUTPUT TO JOB SIOT
15233 BJUOS: PUSHJ P,BJBINI
15234 XCTRI XBYTE,[IDPB H,(B)]
15237 XCTR XRW,[SOSG (C)]
15241 BJBINI: HRLI T,%UMALL
15245 XCTRI XRW,[MOVE D,(B)]
15249 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT
15250 BJUOB: PUSHJ P,BJBINI
15253 XCTRI XW,[MOVEM H,(D)]
15257 XCTRI XW,[MOVEM D,(B)]
15263 ;BOJ UNIT OUTPUT TO JOB BLOCK IOT, ASCII MODE
15264 BJUOBA: LDB E,[410300,,D] ;CHAR COUNT
15267 XCTRI XR,[MOVE W,(D)]
15268 SKIPA E,BTOCHT-3(E)
15271 XCTRI XW,[MOVEM W,(D)]
15277 XCTRI XW,[MOVEM D,(B)]
15282 BJIUNP: PUSHJ P,BJIUNH ;UNHANG CREATOR
15285 ;BOJ DEVICE BLOCK OUTPUT
15286 BJBO: SKIPGE JBCG(A)
15288 XCTR XRW,[MOVES D,(C)] ;D GETS IOT POINTER
15293 IORI B,700000 ;FLUSH CHAR CNT
15297 JRST IOADC ;DON'T WRAP AROUND (WHY NOT?)
15298 UMOVE H,(D) ;H GETS FIRST WORD
15300 PUSHJ P,BJBWT ;WAIT FOR JOB INPUT IOT, COME BACK WITH CLK OFF.
15301 JRST CLKONJ ;UNHANG
15302 MOVEI I,1 ;FOR BJBB
15305 JRST BJBB ;CREATOR IOT IS IN BLOCK MODE
15306 JUMPGE TT,BJBOA ;CREATOR IOT IS ASCII
15313 XCTRI XW,[MOVEM D,(C)]
15316 BJBEX: TLNN D,700000
15317 JRST CLKONJ ;BOJ BLOCK POINTER EXHAUSTED
15320 TLNN E,%JBVAL ;SKIP IF JOB IOT STILL WAITING FOR MORE
15322 JRST (T) ;TRANSFER MORE
15323 POPJ P, ;UNHANG BOJ IOT PREMATURELY
15325 ;BOJ BLOCK ASCII OUTPUT FETCH CHARACTER
15326 BJBOA: MOVE E,BTOCHT-3(E)
15334 ;BOJ BLOCK IOT WAIT. AWAITS JOB IOT, UNLESS UNHANGING.
15335 ;TURNS CLKOFF. SKIPS UNLESS SUPPOSED TO UNHANG.
15336 BJBWT: MOVEM B,SRN3(U) ;SAVE WHAT JOB UUO TO WAIT FOR
15337 HRLZ T,A ;SET UP ARG FOR BJWAIT FLSINS
15339 MOVE TT,JBWST(A) ;CHECK FOR DON'T HANG MODE
15342 PUSHJ P,CWAIT ;WAIT FOR JOB IOT
15346 BJBWT1: CONO PI,CLKOFF ;IF NOT ALREADY IN JOB IOT, DON'T WAIT
15347 JRST BJWAIT ;TEST CREATOR STATUS, POPJ OR POPJ1
15349 ;BOJ DEVICE UNIT MODE INPUT
15350 BJUI: MOVE B,[SETZ 1] ;WAIT FOR OUTPUT IOT
15352 HRLZ T,A ;JOB INDEX
15353 HRR T,JBCUI(A) ;CREATOR'S USER INDEX
15354 PUSHJ P,CWAIT ;WAIT FOR CREATOR TO IOT, RETURN WITH CLKOFF
15359 BJUI1: MOVE TT,JBSTS(A)
15361 JRST BJUIB ;BLOCK MODE CREATOR IOT
15362 LDB D,[.BP (%JBSIOT),JBWST(A)]
15365 JRST BJIUNH ;SUCCESSFUL
15367 ;BOJ UNIT INPUT FROM JOB SIOT
15368 BJUIS: PUSHJ P,BJBINI
15369 XCTRI XBYTE,[ILDB W,(B)]
15372 XCTR XRW,[SOSG (C)]
15376 ;BOJ UNIT INPUT FROM JOB BLOCK IOT
15377 BJUIB: PUSHJ P,BJBINI
15380 XCTRI XR,[MOVE W,(D)]
15384 XCTRI XW,[MOVEM D,(B)]
15390 ;BOJ UNIT INPUT FROM JOB BLOCK IOT, ASCII MODE
15391 BJUIBA: LDB E,[410300,,D] ;CHAR COUNT
15395 XCTRI XR,[MOVE W,(B)]
15396 SKIPA E,BTOCHT-3(E)
15402 XCTRI XW,[MOVEM D,(B)]
15409 ;BOJ DEVICE BLOCK MODE INPUT
15410 BJBI: SKIPGE JBCG(A)
15412 XCTR XRW,[MOVES D,(C)] ;D GETS IOT POINTER
15417 IORI E,700000 ;FLUSH CHAR CNT
15421 JRST IOADC ;DON'T WRAP AROUND
15423 PUSHJ P,BJBWT ;WAIT FOR JOB OUTPUT IOT, COME BACK WITH CLK OFF
15424 JRST CLKONJ ;UNHANG
15425 MOVEI I,0 ;FOR BJBB
15428 JRST BJBB ;CREATOR IOT IS IN BLOCK MODE
15431 PUSHJ P,BJUI1 ;GET DATA OUT OF CREATOR UNIT MODE IOT
15436 JUMPGE TT,BJBIA ;ASCII
15437 XCTRI XW,[MOVEM H,(D)]
15443 ;BOJ BLOCK ASCII INPUT STORE CHAR
15444 BJBIA: LDB E,[410300,,D]
15447 XCTRI XR,[MOVE W,(D)]
15448 SKIPA E,BTOCHT-3(E)
15451 XCTRI XW,[MOVEM W,(D)]
15457 BJBIX: MOVEI T,BJBI
15458 XCTRI XW,[MOVEM D,(C)]
15465 ;BOJ BLOCK IOT TO/FROM JOB BLOCK IOT
15467 HRLI J,%UMALL ;UMAPS FOR PURELY CREATOR IOT
15469 BJBBL: MOVE J,SRN4(U)
15472 XCTRI XRW,[MOVES H,(E)]
15473 CAIA ;H HAS JOB BLOCK IOT POINTER
15476 XCTRI XRW,[MOVES D,(C)]
15477 CAIA ;D HAS BOJ BLOCK IOT POINTER
15479 JUMPGE H,[PUSHJ P,BJIUNH
15485 HLRE B,D ;CHOOSE SMALLER OF TWO BLOCK SIZES
15486 MOVNS B ;COUNT TO BE XFERRED
15487 HRLZ E,H ;JOB ADDRESS
15488 HRR E,D ;JOB,,BOJ (FROM,,TO FOR BOJ INPUT)
15489 HLRZ Q,E ;JOB ADDRESS
15491 JRST BJBB1 ;JOB ADDR IS AN AC
15492 HRRZ J,T ;SET UP UMAPS (JOB USER INDEX IN RH)
15494 TLOA J,%UMMPL ;TO HI PG, HACK OUR LO PAGE
15495 TLO J,%UMMPU ;TO LO PG, HACK OUR HI PAGE
15497 TLOA J,%UMLTU ;TO POINT TO HIS UPPER
15498 TLO J,%UMUTL ;TO POINT TO HIS LOWER
15499 TLNN J,%UMMPU+%UMUTL ;MAPPING HIS UPPER FROM OUR LOWER?
15500 JRST BJBB3 ;YES. MAKE SURE NOT SCREWED BY AC PNTR
15501 BJBB3A: PUSHJ P,PLD1
15503 MOVNS Q ;LIMIT SIZE OF XFER TO MIN OF
15504 ADDI Q,400000 ;DIST OF TO ADR FROM SEG BOUNDARY
15505 CAMLE B,Q ;AND DIST OF FROM ADR FROM SEG BOUNDARY
15507 MOVNI Q,(E) ; - BOJ ADDR
15511 TLNN J,%UMMPL ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
15512 TLOA E,400000 ;SET JOB ADDR TO HI SEG
15513 TRO E,400000 ;SET BOJ ADDR TO HI SEG
15515 MOVSS E ;XFER OTHER DIRECTION
15516 MOVE Q,E ;SAVE COPY OF BLT POINTER
15517 ADDI B,(E) ;GET LA + 1
15518 XCTRI XBRW,[BLT E,-1(B)] ;XFER DATA
15519 HRRZS E,B ;NO FAULT. SIMULATE STORE BACK OF POINTER (CAN BE 1,,0)
15523 BJBB2: HRLS Q ;NUMBER OF WORDS ACTUALLY XFERRED IN BOTH HALVES
15524 XCTRI XRW,[ADDM Q,(C)] ;UPDATE BOJ BLK PNTR
15528 PUSHJ P,PLD1 ;MAP TO CREATOR
15531 XCTRI XRW,[ADDM Q,(W)] ;UPDATE JOB BLK PNTR
15535 JRST BJBBL ;NO FAULT, LOOP BACK
15536 PUSHJ P,PLD1 ;RESTORE TO FROB AT TIME OF FAULT
15537 BJBBF: PUSHJ P,TPFLT ;TAKE FAULT (TURNS CLK ON)
15538 PUSHJ P,MPLDZ ;RESTORE NORMAL MAP
15539 JRST @BJOV(I) ;RESTART THE IOT
15542 BJBB1: ADDI Q,UUOACS(T)
15544 MOVE B,(Q) ;READ JOB WORD
15545 BJBB3C: XCTRI XW,[MOVEM B,(E)]
15548 BJBB2A: MOVEI Q,1 ;1 WORD XFERRED
15549 HRRZ B,E ;FAKE OUT FAULT TEST
15553 BJBB1A: XCTRI XR,[MOVE B,(E)]
15559 BJBB3: TLNE E,777760 ;SKIP ON XFERRING FROM AC AREA, HI TO HI
15560 JRST BJBB3A ;NO. OK TO DO BLT
15562 HRLI J,%UMALL ;HACK OUR HI TO POINT TO HIS HI
15564 XCTRI XR,[MOVE B,(Q)]
15568 HRRZ E,D ;TO ADDRESS
15571 BJBB3B: XCTRI XR,[MOVE B,(D)]
15575 PUSHJ P,PLD1 ;HACK OUR HI TO POINT TO HIS HI
15576 XCTRI XW,[MOVEM B,(Q)]
15584 ;UP TO SIX WDS RETURNED
15587 ;4.9-4.7 => IMAGE/ASCII, BLOCK/UNIT, OUTPUT/INPUT
15588 ; 4.9-4.7 SHOULDN'T BE USED, SINCE THE FULL MODE IS IN WD7 ON AN OPEN
15589 %JGCLS==40000 ;4.6 => CLOSE (NOTE 4.5 USED TO BE A CLS BIT ALSO)
15590 %JGSIO==1000 ;4.1 => SIOT (ONLY IF OPCODE = 1)
15591 %JGFPD==200 ;3.8 => THIS CALL WAS PCLSRED AND IS RESTARTING
15592 ;1.4-1.1 => TYPE OF OPERATION
15595 %JOIOT==1 ;IOT/SIOT
15600 %JORNM==6 ;FDELE (DELETE OR RENAME)
15601 %JORWO==7 ;FDELE (RENAME WHILE OPEN)
15602 %JOCAL==10 ;SYMBOLIC .CALL
15604 ;WD2 SET ONLY FOR BLOCK IOT POINTER, ACCESS POINTER, NEW FN1 FOR FDELE
15608 ;WD6 LEFT ADJUSTED DEVICE NAME
15609 ;WD7 NEW FN2 FOR FDELE.
15610 ;IGNORE ALL RETURNED INFO ON AN ERROR RETURN
15611 ;IF 4.5 OR 4.6 IS SET THEN ALL ELSE IS MEANINGLESS
15613 NJBGT: SETZM T ;INDICATE JOBGET, NOT JOBCAL
15614 NJBCL0: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15615 TLNN R,%CLSBJ ;NOT A BOJ CHANNEL => WRONG TYPE DEVICE
15620 JRST NJBGTE ;FAIL IF VALID NOT SET
15622 MOVEM C,JBWST(E) ;CLEAR STORED BIT
15627 TLZ A,077777 ;FLUSH RANDOM BITS FROM LH
15632 JUMPN T,NJBCL1 ;BRANCH IF JOBCAL
15633 NJBGT0: MOVE B,JBST2(E)
15642 NJBGTE: SKIPL JBCG(E) ;HAS CREATOR GONE AWAY?
15643 JRST OPNL36 ;NO, VALID CLEAR
15644 CONO PI,CLKON ;YES, GIVE CLOSE
15647 MOVSI A,%JGCLS ;GIVE CLOSE BITS
15648 JRST POPJ1 ;DON'T GIVE ANYTHING ELSE WHETHER JOBGET OR JOBCAL
15657 ; [-N,,ADR OF DATA BUFFER] ;OPTIONAL
15659 ; OPCODE WILL BE THE SAME AS RETURNED IN WD1 BY JOBGET
15660 ; IF OPCODE<10 THEN WD2-WD7 OF JOBGET WILL BE WRITTEN INTO DATA BUFFER
15661 ; FOLLOWED BY JOB'S EPDL AND EPDL3 (THE BPS FOR BP-STYLE OPENS, ETC).
15662 ;IF OPCODE=10 THEN JOB'S LAST .CALL WILL BE DESCRIBED:
15663 ; WORD 1 OF DATA BUFFER => SIXBIT OF OPERATION (I.E. THE NAME
15665 ; WORD 2 OF DATA BUFFER => FLAG BITS OF .CALL
15666 ; WORD 3 OF DATA BUFFER => # OF ARGS TO .CALL
15667 ; WORDS 4-12 => INPUT ARGS TO .CALL
15669 NJBCL: CAIL W,2 ;DID CALLER SUPPLY AOBJN POINTER?
15670 SKIPN T,B ;IF SO AND NON-ZERO USE IT
15671 MOVEI T,1 ;OTHERWISE SET T NONZERO
15672 JRST NJBCL0 ;GO JOIN JOBGET CODE FOR ERROR CHECKING
15674 NJBCL1: JUMPGE T,POPJ1 ;BACK FROM JOBGET - ANY AOBJN PNTR?
15675 MOVEI C,9 ;YES - OPCODE 10?
15677 JRST NJBCL2 ;NO - JUST COPY 9 STANDARD ARGS
15678 HLRE D,T ;GET LENGTH OF USERS DATA BUFFER
15679 MOVE B,JBCUI(E) ;GET JOB'S USER INDEX
15680 MOVE C,LSCALL(B) ;GET NAME OF JOB'S LAST CALL
15681 UMOVEM C,(T) ;PUT INTO CALLERS BUFFER
15682 AOJE D,POPJ1 ;IF NO MORE ROOM - DONE
15683 MOVE C,CTLBTS(B) ;GET USER'S .CALL FLAG BITS
15686 LDB C,[230400,,JBSTS(E)] ;GET # OF ARGS
15688 JUMPE C,POPJ1 ;ANY ARGS TO PASS?
15689 ADD T,[3,,3] ;YES - COPY INTO BUFFER
15690 NJBCL2: JUMPGE T,POPJ1 ;ANY ROOM LEFT?
15691 MOVNS C ;GET SMALLEST WORD COUNT
15694 HRL T,C ;MAKE AOBJN PNTR AS SMALL AS POSSIBLE
15695 MOVE H,E ;JOB INDEX IN H FOR USING JBACTB
15696 MOVEI B,JBACTB ;GET PNTR TO ARG TABLES
15697 NJBCL3: MOVE C,@(B) ;GET NEXT ARG
15698 UMOVEM C,(T) ;GIVE TO CALLER
15701 JRST POPJ1 ;DONE - GO SKIP
15710 ; [OPEN LOSS #(IF RH = 0),,# TIMES FOR CREATING JOB TO SKIP]
15711 ; SETZ [-N,,ADR OF DATA BUFFER]
15713 ;RETURN DATA (E.G. RETURN TO RCHST,STATUS OR THE RETURN ARGS TO A .CALL)
15714 ;WILL BE COPIED FROM THE CALLER'S DATA BUFFER
15716 NJBRT: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD
15717 TLNN R,%CLSBJ ;NOT BOJ CHNL => WRONG TYPE DEVICE.
15719 CAIGE W,3 ;RETURN ARGS PROVIDED?
15720 SETZM C ;NO - ZERO IT
15721 JUMPGE C,NJBRT1 ;DO NOTHING IF NO RETURNS OR NO AOBJN
15722 HLRE D,C ;GET LENGTH OF BUFFER
15723 CAMGE D,[-8.] ;MAKE SURE AREA AT MOST 8 LONG
15724 MOVNI D,8 ;OVER 8 - USE 8
15725 HRL C,D ;FIX AOBJN PNTR
15727 ADDI D,-1(C) ;GET ADDRESS OF LAST WORD NEEDED
15728 XCTR XR,[SKIP (C)] ;MAKE SURE PAGES ARE IN
15730 NJBRT1: CONO PI,CLKOFF ;NOW OK TO TURN CLOCK OFF
15734 JRST OPNL36 ;FAIL IF STORED IS SET OR IF VALID IS CLEARED
15742 TLZ A,%JBVAL+%JBSTR
15743 MOVEM A,JBWST(E) ;SET SUCCESSFUL JOBRET BIT, CLEAR VALID AND STORED
15744 DPB B,[350400,,JBSTS(E)] ;NUMBER OF TIMES TO SKIP
15746 DPB B,[270600,,JBSTS(E)] ;OPEN LOSS
15747 MOVSI B,-6 ;DEFAULT # WDS TO RETURN FOR .RCHST IS 6.
15749 JUMPGE C,NJBRT3 ;ANY RETURN ARGS?
15750 MOVEM C,JBAC11(E) ;REMEMBER HOW MANY, FOR .RCHST TO RETURN THAT MANY.
15751 MOVE H,E ;YES - COPY THEM
15753 NJBRT2: XCTRI XR,[MOVE B,(C)] ;GET IT
15755 BUG ;PAGE IS TIED - NO?
15756 MOVEM B,@-1(D) ;PUT INTO ARG TABLE
15758 NJBRT3: SETZM FLSINS(TT) ;RESTART CREATOR
15761 ;JOB DEVICE CLOSE ROUTINE
15762 JOBCLS: SETOM JBCG(A)
15765 PUSHJ P,JBINT ;INTERRUPT POOR BOJ GUY
15766 JRST CLKONJ ;SINCE HE HAS NO CREATOR
15768 ; ROUTINES FOR JOB ACCESS, RFPNTR, RESET, AND STATUS
15770 RFPJOB: MOVEI J,4 ;USE OLD .RCHST OPERATION, OPCODE 4
15774 PUSHJ P,JBWT ;SIGNAL JOB, WAIT FOR ANSWER
15775 HLRE TT,JBAC11(E) ;GET # VALUES RETURNED
15778 SKIPA A,JBODEV(E) ;GET ACCESS POINTER RETURNED
15779 SETO A, ;NO ACCESS POINTER RETURNED, USE -1
15780 CAIL TT,6 ;UP TO TWO MORE EXTRA RCHST RESULTS MIGHT BE RETURNED
15785 MOVEI W,1(TT) ;# RESULTS FOR RCHST
15786 MOVEI B,36. ;ALWAYS RETURN 36. AS BYTE SIZE UNTIL MORE WINNING
15787 JRST POPJ1 ;CONVENTIONS EXIST.
15789 JBSTAT: HLRZ A,(R) ;GET JOB INDEX
15790 HRRZ D,JBWST(A) ;GET MOST RECENT STATUS
15794 JBIRS: MOVEI D,3 ;RESET IS OPCODE 3
15799 PUSHJ P,JBWT ;WAIT FOR IT TO GET PROCESSED
15802 JBACCS: MOVEI D,5 ;ACCESS IS OPCODE 5
15811 ;.CALL JOBIOC (OLD NAME SETIOC STILL WORKS)
15812 ;ARG1: CHANNEL BOJ DEVICE IS OPEN ON
15813 ;ARG2: TYPE OF IOCER TO CAUSE
15815 ;THIS CALL CAUSES THE NEXT IOT EXECUTED BY THE
15816 ;PROCEDURE ON THE OTHER END OF THE CHANNEL TO GET
15817 ;THE SPECIFIED IO CHANNEL ERROR
15819 NSTIOC: HLRZ E,H ;GET JOB CHNL IDX FROM LH OF IOCHNM WD.
15822 JRST OPNL33 ;BAD ARG. (NOT LEGAL IOCER)
15823 TLO B,(SETZ) ;IN CASE IOCER 0 EVER EXISTS
15825 JRST OPNL34 ;NOT BOJ CHANNEL
15827 MOVE A,JBCUI(E) ;PREPARE TO STOP CREATOR.
15829 JRST OPNL41 ;CREATOR WENT AWAY
15832 JRST OPNL41 ;HE'S BEING KILLED NOW.
15833 PUSHJ P,RPCLSR ;STOP
15840 ;ARG1 - CHANNEL BOJ IS OPEN ON - REMAINING ARGS ARE OPTIONAL -
15841 ;ARG2 - NEW STATUS (RIGHT HALF OF STATUS WORD ONLY - I.E. DEVICE DEPENDENT STUFF)
15842 ;ARG3 - NEW DEVICE NAME FOR PEEK, WHO-LINE STATUS, RFNAME/RCHST
15843 ;ARG4 - NEW FN1 FOR ..
15844 ;ARG5 - NEW FN2 FOR ..
15845 ;ARG6 - NEW SNAME FOR ..
15846 ;ARG7 - NEW OPEN MODE FOR ..
15847 ;ARG8 - BP TO ASCIZ STRING IN USER ADDRESS SPACE CONTAINING FULL FILENAMES.
15849 NJBSTS: TLNN R,%CLSBJ
15851 HLRZ A,(R) ;GET JOB INDEX
15852 CAIGE W,2 ;DID HE SUPPLY STATUS?
15853 MOVEI B,SNJOB ;NO - RESET TO INITIAL
15854 HRRM B,JBWST(A) ;REMEMBER WHAT HE SAYS
15857 JUMPGE B,.+1(B) ;STORE WHATEVER ADDITIONAL ARGS WERE GIVEN
15860 MOVEM TT,JBSYS(A) ;6
15861 MOVEM E,JBFN2(A) ;5
15862 MOVEM D,JBFN1(A) ;4
15863 MOVEM C,JBDEV(A) ;3
15865 JRST POPJ1 ;1 (DON'T TAKE THIS INSN OUT)
15867 NJBST1: XOR I,JBOPNM(A)
15869 JRST OPNL12 ;NOT ALLOWED TO CHANGE BLOCK VS UNIT, IN VS OUT
15873 NJBST2: MOVE R,Q ;STORE BP IN Q INTO JBFNP WORD,
15874 PUSHJ P,ASCIND ;AFTER DOING INDEXING AND INDIRECT.
15878 ; .CALL ADR ;SKIPS UNLESS JOB END OF CHNL NOT THERE
15884 ;GIVE CREATOR A SECOND WORD INT ON CHANNEL CORRESP TO BOJCH
15886 NJBINT: TLNN R,%CLSBJ ;ERROR IF NOT BOJ CHNL.
15896 PUSHJ P,[HRRZ B,(R)
15897 SKIPGE R ;IOPDL CHNLS DON'T INTERRUPT
15905 JUMPE C,OPNL41 ;I CAN'T
15907 AND C,B ;INT ONLY ONCE, ON HIGHEST NUMBERED CHANNEL
15913 ;ARG 1 - SIMULATED DEVICE NAME
15916 ;ARG 4 - SNAME OF FILE WHICH HANDLER LOADED FROM
15917 ;ARG 5 - AMOUNT OF TIME TO SLEEP WAITING FOR SOMEONE TO OPEN
15919 ;THIS CALL, WHEN EXECUTED BY A JOB DEVICE HANDLER JOB, MAKES
15920 ;THE HANDLER AVAILABLE FOR RE-USE. TAKES SUCCESS RETURN IF
15921 ;SOMEONE REUSES YOU; YOU SHOULD THEN DO THE "INITIAL JOBGET"
15923 NJBREU: SKIPGE H,JBI(U)
15924 JRST OPNL10 ;NOT A BOJ HANDLER JOB
15926 PUSHJ P,UFLS ;WAIT FOR CLOSE TO FINISH HAPPENING
15932 JRST [ MOVNI E,(E) ;IMMEDIATE TIME, LOSE ON PCLSR
15933 SUB E,TIME ;BUT ACCEPT ANYWAY SINCE NETBLK DOES
15936 UMOVE E,(TT) ;GET TIME ARGUMENT
15940 UMOVEM E,(TT) ;POS REL TIME GIVEN, MAKE NEG ABS AND WRITE BACK
15941 NJBRU1: MOVSI TT,%JBREU ;E NOW HAS NEGATIVE TIME TO SLEEP UNTIL
15944 NJBRUL ;TURN OFF %JBREU WHEN CALL EXITED FOR WHATEVER REASON
15949 JRST OPNL41 ;TIMED OUT
15952 ;FLSINS ROUTINE TO WAIT UNTIL TIMED OUT OR OPENED BY SOMEONE
15953 NJBRUW: MOVN A,AC0S+E(U)
15959 ;LOSSET ROUTINE TO LEAVE AWAITING-REUSE STATE
15960 NJBRUL: MOVSI A,%JBREU
15965 SUBTTL PERIPHERAL DEVICE ROUTINES IN SEPARATE FILES
15981 IFN NETP,[ ; General ITS network code, includes specific nets
15998 .BYTE 0 ;RECORD THE SYMS .EVAL'ED BY USER PROGRAMS
16002 SUBTTL DM DAEMON UUO'S
16004 IFE DEMON,ADEMON==ILUUO
16007 ADEMON: JUMPE J,[AOJA J,.+2] ;IF J = 0 THEN SUBTRACT ONE
16008 UMOVE J,(J) ;GET VALUE HERE
16011 PUSHJ P,DEMUSR ;FIND CURRENT USER IN DEMON TABLE
16012 JRST UTOLKJ ;FAIL, JUST RETURN, NOT DEMON
16013 HRRE TT,DMTTBL+2(B)
16015 HRRM TT,DMTTBL+2(B) ;PUT NEW COUNT IN DEMON TABLE
16018 UTOLKJ: CONO PI,UTCON
16022 CONO PI,CLKOFF ;DON'T LET SYS JOB LOOK TILL WE'RE READY.
16023 MOVSI T,SCLDMN ;TELL IT TO LOOK FOR US, AFTER UFLS TURNS CLOCK ON.
16025 SETZB T,SRN3(U) ;SYS JOB WILL SETOM SRN3 TO RESTART US
16026 SKIPN SRN3(U) ;WITH 0 IN T => FILE EXISTS, OR OPNL CODE.
16027 PUSHJ P,UFLS ;SYS JOB DETECTS US BY PC=ADEMS1.
16028 ;DEMON NAME IS EXPECTED TO BE IN A.
16029 ADEMS1: JUMPN T,OPNL1-1(T)
16030 CAIGE W,2 ;NO SECOND ARG, JST SIGNAL
16032 JUMPL D,NUDMTB ;IF 2ND ARG < MERELY CALL NUJBST, NO DEMON ENTRY
16033 TDZA TT,TT ;ZERO OUT TT
16034 ADEMS3: SETOM TT ;SET FLAG
16035 PUSHJ P,LSWTL ;SIEZE SWITCH
16038 JRST LSWPOP ;SIGNAL FAILED
16039 SKIPN TT ;FLAG NOT SET
16040 HRLM D,DMTTBL +2(B) ;SET TIME RQ
16041 JRST CKOPJ1 ;RELEASE SWITCH
16044 PUSHJ P,DMBLK1 ;WAIT TILL DEMON BLOCK IS CLEARED
16047 MOVEM A,DMBLK ;SAVE IN BLOCK NOW
16049 JRST NUDMTB ;IF FAILURE AFTER WAIT LOOP BACK
16050 JRST POPJ1 ;SUCCESS
16052 DMBLK1: SKIPGE DMBLK+1 ;FOR DEMON BLOCK TEST
16053 POPJ P, ;RETURN, NOT FINISHED LOADING
16055 CAIGE T,MXCZS ;ROOM IN RING BUFFER
16057 POPJ P, ;SKIP IF ROOM
16058 \f;UTILITY ROUTINES FOR DEAMONS
16060 DEMSIG: PUSHJ P,DEMNAM ;LOOK FOR NAME
16061 JRST DEMSG2 ;HAVE TO MAKE NEW ENTRY
16063 HLLZ E,DMTTBL+2(B) ;18 BITS 2'S COMPLEMENT
16065 HLLM E,DMTTBL+2(B) ;MUST DO THIS WAY TO FIT ABOVE
16066 SKIPE DMTTBL+1(B) ;DOWN, WANT SYS JOB TO LOOK AT
16070 AOS REQCNT ;ONLY SIGNAL IF NECESSARY
16073 DEMSG2: SOSGE DEMCNT ;IF NO ROOM FLUSH
16076 MOVEI A,DMTLL ;BUMP POINTER
16078 IDIVI A,DMLNG ;TRUNCATE TO LENGNTH OF TABLE
16080 JRST .-4 ;SEARCH FOR NEW ENTRY
16081 POP P,DMTTBL(B) ;SET NAME IN TABLE
16084 ;ROUTINES TO FIND ENTRY IN TABLE.
16085 ;DEMNAM TAKES NAME IN A, DEMUSR TAKES USER INDEX IN U
16086 ;THEY SKIP RETURN IF SUCCESSFUL, RETURN OTHERWISE
16087 ;IF SUCCESSFUL DEMON TABLE INDEX IS IN B
16089 DEMUSR: JUMPL U,CPOPJ
16093 ADD B,[DMTLL,,DMTLL]
16097 DEMNAM: MOVSI B,-DMLNG ;SEARCH BY NAME
16100 ADD B,[DMTLL,,DMTLL]
16104 DEMOUT: PUSHJ P,LSWTL ;CALLED BY KILLING JOB (IN CASE OWNED)
16108 SETZM DMTTBL+1(B) ;MARK AS DOWN,SYSTEM JOB DECIDES WHAT TO DO
16114 DEMMRV: SETZM DMTTBL+2(B) ;CALL WITH UTCOFF (SYS JOB) REMOVES ENTRY FROM TBL
16115 SETZM DMTTBL+3(B) ;WITH INDEX OF DEMON IN B
16123 ;DEAMON READ AND SET STATUS ROUTINES
16125 ARDDMST: PUSHJ P,LSWTL ;READ DEAMON STATUS
16128 JRST RDDMS1 ;LOST TRY USER INDEX
16131 IDIVM C,A ;DIVIDE BY L, DON'T CLOBBER B
16132 RDDMS2: MOVE C,DMTTBL+3(B)
16139 PUSHJ P,DEMUSR ;BAD USER
16147 ASTDMST: PUSHJ P,LSWTL ;SET DEAMON STATUS
16152 STDMS2: JUMPL D,STDMS4
16154 MOVEM D,DMTTBL+2(B)
16156 MOVEM C,DMTTBL+3(B)
16164 STDMS4: SKIPGE DMTTBL+1(B) ;REMOVE FROM TABLE IF POSSIBLE
16165 JRST UTOLKJ ;CAN'T DELETE, LOADING
16166 SETZM DMTTBL+1(B) ;DOWN
16167 SETZM DMTTBL+2(B) ;REMOVE REQUESTS
16168 AOS REQCNT ;SIGNAL SYS JOB
16179 ;.GETSYS AC, ;TRANSFERS SYSTEM AREA SPECIFIED BY C(AC+1)
16180 ;TO USER AREA STARTING AT R.H. C(AC) OF LENGTH MINUS L.H. C(AC)
16183 ; Alan 4/2/86: Took this out because people don't use .GETSYS this way
16185 ; PUSHJ P,UDELAY ;CAUSE A SCHEDULE TO STOP GETSYSER FROM
16186 ; ; MONOPOLIZING SYSTEM
16187 MOVSI A,-LGSNAM ;NEGATIVE OF TABLE LENGTH
16188 UMOVE B,1(J) ;LOOK AT USERS AC+1, THE 6BIT NAME
16189 CAME B,GSNAME(A) ;CYCLE THROUGH TABLE
16190 AOBJN A,.-1 ;OF NAMES, POINTER IN RIGHT HALF OF A
16191 JUMPGE A,AGETSL ;JUMP IF NOT IN TABLE
16192 UMOVE B,(J) ;GET POINTER TO USERS RECEPTACLE BLOCK
16193 AGETS1: HLRZ C,GSYS1(A) ;GET LOW END OF BLOCK
16194 HRRZS A ;CLEAR COUNT IN L.H. OF A
16195 CAIGE A,NUTCFN ;SKIP IF UTC OFF NOT REQUIRD
16196 CONO PI,UTCOFF ;TURN OFF ALL CHANNELS BUT CH 1
16197 skipn c ; If LH contains 0, RH is routine to call.
16198 jrst @gsys1(a) ; (JUMPE C,@GSYS1(A) generates spurious
16199 ; page faults, so don't "fix" this.)
16200 HRRZ D,GSYS1(A) ;GET HIGH END OF BLOCK
16201 ;AT THIS POINT: ;B USER'S POINTER (UNRELOCATED)
16202 ;C BEGINNING OF AREA IN SYS
16204 agets2: SUBI D,-1(C) ;BLOCK LENGTH TO BE SENT
16205 HLRZ E,B ;GET NEG BLK LENGTH FROM USERS PNTR
16206 ADDI E,-1(D) ;-1 CAUSES CARRY BIT IF .GT.
16207 TLNE E,-1 ;CARRY INDICATES LOSS
16208 JRST AGETS5 ;MORE THAN USER WANTS
16209 HRLS D ;BLOCK LENGTH IN BOTH HALVES
16210 HRRZ E,B ;FIRST WORD (UNRELOCATED)
16211 HRL E,C ;SOURCE ADDRESS FOR BLT
16212 HRRZ C,E ;DESTINATION INTO C
16213 ADD C,D ;FINAL ADDRESS +1
16214 AGETS7: XCTRI XBW,[BLT E,-1(C)] ;BLT IT TO HIM
16215 AOSA (P) ;INCREMENT RETURN, INDICATE SUCCESS
16219 UMOVEM B,(J) ;TELL USER HOW MUCH HE GOT
16222 AGETSL: XCTR XW,[SETZM 1(J)] ;INDICATE BAD SIXBIT
16225 AGETS5: MOVNS D ;TELL USER HOW MUCH HE NEEDS
16226 CONO PI,UTCON ;NEGATIVE OF RIGHT BLOCK LENGTH
16227 XCTR XRW,[HRLM D,(J)] ;SET UP PROPER BLOCK LENGTH IN HIS AC
16230 AGETS6: CONO PI,UTCON ;ONE PAGE WASN'T THERE
16231 XCTR XRW,[MOVES (E)] ;SO TOUCH IT (TAKE MPV INTERRUPT IF REAL MPV)
16232 JRST AGETS1 ;AND TRY AGAIN (BLT WILL GET FARTHER THIS TIME)
16233 ;HAD TO RETRY FROM BEGINNING SINCE THIS MAY BE
16234 ;ONE THAT HAS TO BE TRANSFERRED INTACT WITH UTCOFF
16236 GSNAME: SIXBIT /MEMORY/
16237 IFN NUNITS,SIXBIT /UTAPE/
16238 IFN NCPP,[SIXBIT /NCPSM/
16242 NUTCFN==.-GSNAME ;NUMBER TO GET WITH UTCOFF (same as NETOFF)
16248 IFN IMXP, SIXBIT /IMPX/
16251 SIXBIT /USYMS/ ;.UPC, .VAL, .TTY, ETC.
16259 ;ENTRIES ARE: BOTTOM,,TOP OF AREA TO BE TRANSMITTED OR INST TO EXECUTE
16260 GSYS1: IOBFTL,,EMEMTL ;lh zero => jrst to THIS ENTRY
16261 IFN NUNITS, UTCHNT,,UTCHE ;UTAPE
16262 IFN NCPP,[IMSOKB,,IMSOKE ;NCP SOCKET MAP
16263 IMPBPQ-1,,IMPEPQ ;NCP PENDING RFC QUEUE
16264 IMPHTB,,IMPHTB+255. ;NCP HOST TABLE
16268 GSNAME,,GSNAME+LGSNAM-1 ;GETS
16269 DEVTAB,,EDEVS ;DEVS
16270 SYSYMB,,SYSYME ;CALLS
16271 IFN IMXP, IMXTBB,,IMXTBE ;IMPX
16272 CLVBEG,,CLVEND ;CLINK
16274 SYSUSB,,SYSUSE ;USYMS
16275 DCHSTB,,DCHSTE ;CHDEVS
16276 SYSCTB,,SYSCTB+LSYSCT-1 ;NCALLS
16277 TYVTAB,,TYVTAB+LTYVTA-1 ;TTYVAR
16278 USETTB,,USETTB+MXVAL-1 ;USRVAR
16279 ITSNMS,,ITSNMS+LITSNM-1 ;ITSNMS
16280 IFN LGSNAM-<.-GSYS1>, .ERR GSNAME and GSYS1 don't match.
16287 0 ; Make it easy to add more.
16289 USRSV: MOVEI C,USRSTG
16294 USR1V: UMOVE C,2(J)
16303 USR1VL: XCTR XW,[SETOM 2(J)]
16306 DSYMS: HRRZ C,DDT-2
16308 SETCMM D ;OFFSET BY ONE
16312 SUBTTL .GETLOC, .EVAL, ETC.
16314 ;GET AN ABSOLUTE LOCATION ;.GETLOC AC, ;C(A)=FROM(ABS),,TO(RELATIVE)
16316 AGETLOC:UMOVE A,(J) ;GET TO ADDRESS
16317 HLRZ B,A ;GET FROM ADDRESS
16320 JRST ILEXPF ;ILLEGAL EXEC PAGE FAULT
16321 UMOVEM C,(A) ;GIVE TO USER
16324 ;SET AN ABSOLUTE LOCATION ;.SETLOC AC, ;C(AC)=FROM(RELATIVE),,TO(ABS)
16326 ASETLOC:TDZA D,D ;CLEAR COND FLAG, SKIP
16328 ;SET AN ABSOLUTE LOCATION ONLY IF C(ABS)=C(TEST) & SKIP IF SUCCESSFUL
16329 ;.IFSET AC, ;C(AC)=<POINTER TO 2 WORD BLOCK>,,TO ADR(ABS)
16330 ;WORD 1=TEST ;WORD 2=NEW C(ABS)
16332 AIFSET: MOVNI D,1 ;SET COND FLAG
16333 XCTR XR,[HRRZ A,(J)] ;GET TO ADDRESS (ABSOLUTE)
16334 XCTR XR,[HLRZ B,(J)]
16335 UMOVE C,(B) ;GET WORD
16339 JUMPE D,ASPST1 ;NORMAL SETLOC
16340 UMOVE D,1(B) ;GET NEW VALUE
16341 CONO PI,CLKOFF ;PREVENT INTERRUPTS
16342 CAME C,(A) ;CHECK WORD AGAINST TEST WORD
16343 JRST CLKONJ ;NOT EQUAL => IGNORE
16345 AOS (P) ;CAUSE RETURN TO SKIP
16346 CAIG A,SYSB_10. ;CHECK IF IN SYS
16347 JRST ASPST1 ;YES SO DO REG SETLOC
16348 EXCH D,(A) ;NO SO DO NOW BEFORE SHUFFLE & GET OLD
16350 HRROS A ;LET SYS JOB KNOW ALREADY DONE
16351 ASPST1: CAMN C,(A) ;SKIP IF DIFFERENT FROM C(TO ADR)
16353 MOVE D,SYSITM ;IF SYSTEM JOB HAS BEEN HUNG OR LOOPING FOR 30 SEC,
16356 JUMPGE A,ASPST3 ;GO DO THE WORK OURSELVES (BUT DON'T DO IT TWICE).
16357 ASPST4: MOVE D,UNAME(U) ;GET UNAME OF SETLOCER
16359 PUSHJ P,CWAIT ;WAIT TILL VARIABLES TO COMMUNICATE WITH SYS JOB ARE FREE
16360 TDNE T,SUPCOR ;ARG TO CALL IN .-1
16361 MOVEM A,SETSLC ;REMEMBER ABS LOCATION
16362 MOVEM C,SETSLQ ; " NEW CONTENTS (OR OLD IF LH(SETSLC)=-1)
16363 MOVEM D,SETSU ; " USER
16364 CSPST: IORM T,SUPCOR ;TELL SYS JOB TO DO IT
16367 ASPST3: HRRZ D,UPC ;SYS JOB HAS BEEN HANGING FOR 30 SEC.
16368 CAIN D,SCOR1 ;WHY? JUST SLEEPING?
16369 JRST ASPST4 ;YES => SIGNAL IT TO DO THE WORK
16370 MOVEM C,(A) ;ELSE GIVE UP ON IT AND DO IT NOW
16373 ;LOOK UP ITS SYMBOL ;.EVAL AC, ;C(AC)=SQUOZE SYMBOL
16374 ;REPLACES SYMBOL BY VALUE & SKIPS IF SUCCESSFUL
16375 ;IF YOU WANT TO .EVAL A SYMBOL IN A PROGRAM HABITUALLY AND IMPLICITLY,
16376 ;AND WANT IT TO CONTINUE TO WORK, YOU HAD BETTER ADD AN ENTRY TO THE FILE
16377 ;AI:SYSTEM;EVSYMS > SAYING WHAT PROGRAM AND WHAT SYMBOL. THEN, ITS HACKERS
16378 ;CAN AVOID SCREWING YOU WITHOUT WARNING.
16380 AEVAL: PUSHJ P,SWTL
16382 UMOVE B,(J) ;GET SYM
16383 PUSHJ P,SYMLK ;LOOK UP
16384 JRST LSWPOP ;NOT FOUND
16385 MOVE A,(C) ;GET VALUE
16387 AOS (P) ;CAUSE UUO TO SKIP
16388 JRST APTUAJ ;RETURN VALUE
16390 ;REDEFINE ITS SYMBOL ;.REDEF AC, ;C(AC)=POINTER TO 2 WORD BLOCK
16391 ;WORD 1 = SYMBOL ;WORD 2 = VALUE
16392 ;DELETE SYM IF ALL 4 FLAG BITS SET
16393 ; OTHERWISE SET SYMBOL FLAGS TO THOSE SPECIFIED, EXCEPT REJECT ANY ATTEMPT TO
16394 ; ADD A PROGRAM NAME
16395 ;ADD SYM IF NOT FOUND ;FAIL ONLY IF NOT ENOUGH ROOM
16396 ;SKIPS IF SUCCESSFUL
16398 AREDEF: PUSHJ P,SWTL
16400 XCTR XR,[HRRZ D,(J)] ;GET POINTER FROM AC
16401 UMOVE B,(D) ;GET SYMBOL
16402 PUSHJ P,SYMLK ;LOOK UP
16403 JRST ARDF2 ;NOT FOUND, CREATE
16404 XCTR XR,[SETCM A,(D)] ;GET SYM (COMPLEMENTED)
16405 TLNN A,740000 ;SKIP IF ANY FLAGS NOT SET
16406 JRST ARDF3 ;ALL SET => DELETE
16411 UMOVE A,1(D) ;GET VALUE
16412 MOVEM A,(C) ;STORE IN SYMTAB
16413 JRST ARDF4 ;SORT AND SKIP-RETURN.
16415 ARDF2: MOVE C,DDT-2 ;GET POINTER
16416 SUB C,[2,,2] ;DECREMENT FOR NEW ENTRY
16417 MOVEI A,-1(C) ;FUDGE FOR BLOCK CALC
16418 LSH A,-10. ;CONVERT TO # OF BLOCKS UP TO SYMTAB -1
16419 UMOVE B,(D) ;GET SYM
16422 TLNE B,740000 ;LOSE IF PROG NAME
16423 CAMLE A,T ;CHECK FOR LOSSAGE
16424 JRST LSWPOP ;DON'T OVERWRITE ITS
16425 EXCH B,2(C) ;STORE OVER GLOBAL BLOCK HEADER,
16426 MOVEM B,(C) ;MOVE THAT HEADER DOWN 2 WDS.
16427 UMOVE A,1(D) ;GET VALUE
16429 ADD A,[-2,,] ;1 MORE SYM IN GLOBAL BLOCK.
16430 MOVEM A,1(C) ;STORE
16431 MOVEM C,DDT-2 ;UPDATE POINTER
16432 JRST ARDF4 ;GO SORT AND SKIP-RETURN.
16434 ARDF3: MOVE B,DDT-2 ;GET POINTER
16435 MOVE A,(B) ;MOVE THE GLOBAL HEADER
16436 EXCH A,2(B) ;UP OVER 1ST SYM
16437 MOVEM A,-1(C) ;WHICH GOES INTO FREE SLOT.
16439 ADD A,[2,,] ;GLOBAL BLOCK 1 SYM SHORTER.
16443 ADDM A,DDT-2 ;UPDATE POINTER
16444 ARDF4: MOVSI E,(SETZ) ;TELL DDT ITS SYMTAB WAS ALTERED.
16446 PUSHJ P,SBUBL ;DO 1 BUBBLE-SORT UP AND 1 DOWN.
16447 JRST LSWPJ1 ;FREE ARDFSW AND EXIT.
16449 ;DO ONE BUBBLE SORT PASS UP, ONE DOWN; LEAVE J <0 IFF DID AN EXCHANGE.
16451 SBUBL: MOVE E,DDT-2
16453 ADD E,[2,,2] ;AOBJN -> SYMS IN GLOBAL BLOCK.
16455 MOVE B,[2,,2] ;INCREMENT FOR UPWARD PASS.
16456 MOVE C,[JUMPL A,SBUBL1]
16457 SUBI E,2 ;(WILL INCREMENT BEFORE ACTING)
16460 MOVNS B ;DECREMENT FOR DOWNWARD PASS.
16464 SBUBL1: MOVE D,1(A) ;CHECK NEXT PAIR OF ENTRIES.
16466 JRST SBUBL2 ;IN CORRECT ORDER.
16468 MOVEM D,1(A) ;WRONG ORDER, EXCHANGE.
16472 SETO J, ;SAY DID AN EXCHANGE.
16473 SBUBL2: ADD A,B ;MOVE TO NEXT ENTRY.
16474 XCT C ;TEST IF FINISHED.
16476 JRST SBUBL1 ;(NOT FINISHED)
16478 ;LOOK UP SYMBOL IN B IN ITS SYMBOL TABLE (CLOBBERS A,B,C)
16479 ;RETURN WITH POINTER TO VALUE WORD IN C
16480 ;SKIPS IF SUCCESSFUL
16482 SYMLK: TLZ B,740000 ;FLUSH FLAGS
16483 MOVE C,774000-2 ;PICK UP AOBJN POINTER TO SYMTAB FROM EXEC DDT
16484 SYMLK2: MOVE A,(C) ;GET SYM
16485 AOBJP C,[JRST 4,.+1] ;INCREMENT POINTER
16486 TLNE C,376 ;GO THROUGH HAIR EVERY 200 SYMS
16487 JRST SYMLK3 ;NOT THIS TIME
16489 SYMLK3: TLNN A,200000 ;SKIP IF DELETE INPUT (FLAG PREVENTS MATCH)
16490 TLZE A,740000 ;FLUSH FLAGS & CAUSE LOSS IF ALL 0 (PROG NAME)
16492 AOBJN C,SYMLK2 ;LOSS, TRY ANOTHER
16493 JUMPL C,POPJ1 ;SKIP RETURN IF FOUND
16494 POPJ P, ;NOT SO IF LOSS
16496 AWSNAME:XCTR XR,[SKIPE B,(J)] ;OPER 35
16500 AUPISET:UMOVE B,(J) ;OPER 36
16508 ;GENERATE A UNIQUE SYM ;.GENSYM AC, ;LOADS AC WITH SYM
16510 AGENSYM:PUSHJ P,SWTL ;WAIT TILL INTERLOCK FREE THEN SEIZE IT
16513 PUSHJ P,SIXAOS ;INCREMENT SYM
16514 MOVE A,IGNSYM ;GET SYM
16515 PUSHJ P,LSWPOP ;UNLOCK FOR NEXT USER
16516 JRST APTUAJ ;GIVE USER GENERATED SYMBOL
16518 ;GENERATE A UNIQUE NUM ;.GENNUM AC, ;LOADS AC WITH NUMBER
16520 AGENNUM:AOS A,IGNNUM ;INCREMENT NUMBER
16521 JRST APTUAJ ;AND GIVE IT TO USER
16527 IGNSYM: SIXBIT /SYS/
16535 AOS (TT) ;INCREMENT SYM
16536 MOVE I,[440600,,(TT)] ;GET POINTER TO FIRST CHAR
16537 SIXAS2: ILDB J,I ;GET FIRST (NEXT) CHAR
16538 SKIPN J ;SKIP IF NOT ZERO
16539 MOVEI J,1 ;REPLACE EMBEDDED SPACE WITH "!"
16541 CAME I,[60600,,(TT)] ;SKIP IF FIRST FIVE CHARS HAVE BEEN EXAMINED
16542 JRST SIXAS2 ;GO TO NEXT CHAR
16549 SUBTTL KL10 PERFORMANCE COUNTER
16551 ;KLPERF SYMBOLIC SYSTEM CALL
16552 ;ARG 1: <JOB> TO MEASURE PERFORMANCE DURING;
16553 ;-3 => NULL JOB, -4 => ALL JOBS
16554 ;ARG 2: P.A. ENABLES WORD (SEE NON-EXISTENT KL10 SYS REF MAN)
16555 ;0 => FREE THE FACILITY, ELSE TRIES TO GRAB IT
16556 ;NO ARGS => JUST READS THE VALUES WITHOUT CHANGING THE ENABLING CONDITIONS.
16557 ;IN THAT CASE, IT IS OK IF FACILITY IS OWNED BY SOMEONE ELSE
16558 ;VAL 1: PREVIOUS <JOB> SETTING
16559 ;VAL 2: PREVIOUS P.A. ENABLE WORD
16560 ;VAL 3: TIME BASE HIGH WORD
16561 ;VAL 4: TIME BASE LOW WORD
16562 ;VAL 5: PERF CTR HIGH WORD
16563 ;VAL 6: PERF CTR LOW WORD
16565 KLPERF: CONO PI,CLKOFF
16567 KLPER0: MOVE J,MTRJOB ;NO ARGS => DONT CHANGE SETTINGS,
16568 MOVE B,PAEON ;JUST RETURN CURRENT COUNT.
16571 KLPER1: JUMPN B,KLPER2 ;TRYING TO TURN IT ON?
16573 JRST KLPER0 ;FREEING THE FACILITY WHEN DON'T OWN IT?
16574 PUSHJ P,PRFOFF ;NO, TRYING TO FREE IT - DO SO.
16578 KLPER2: SKIPGE MTRUSR ;IF FACILITY IS FREE, SIEZE IT.
16581 JRST OPNL10 ;ALREADY BELONGS TO SOME OTHER JOB.
16583 CAIN J,-2 ;ALL JOBS?
16585 CAIN J,-1 ;NULL JOB?
16588 JSP T,NCRUI2 ;ELSE DECODE JOB SPEC; OBJECT TO PDP6
16592 ;TRYING TO TURN ON FOR SELF OR ALL JOBS - IT OUGHT TO BE ON RIGHT NOW!
16593 KLPER4: CONO MTR,2001 ;TURN ON TIME BASE, INTERVAL PIA=1
16594 WRPAE B ;SET ENABLES
16595 KLPER3: EXCH B,PAEON
16597 TRZA A,2 ;UN CONVERT -1 => -3, -2 => -4
16598 LSH A,-9 ;IDIVI A,LUBLK
16599 IF2 IFN LUBLK-1000,.ERR NO DIVIDE
16601 RCCL C ;C,D GET TIME BASE
16602 RPERFC E ;E,TT GET PERFC
16605 ;TURN OFF THE PERFORMANCE COUNTER. PUT BACK IN RUN-TIME MEASURING MODE
16606 PRFOFF: MOVNI A,2 ;NOT ATTACHED TO ANY JOB
16608 WRPAE [1576,,1200] ;MEASURE MAIN-PROGRAM TIME IN 80 NS UNITS (MODEL A)
16609 CONO MTR,4001 ;TIME-BASE OFF, INTERVAL PIA=1
16610 RPERFC STPERF ;START-OF-QUANTUM TIME IS NOW
16611 RPERFC NULPRF ;ALSO FOR NULL-JOB
16612 SETOM MTRUSR ;NO LONGER IN USE
16616 $INSRT CORE ;CORE JOB AND MEMORY MANAGEMENT ROUTINES
16619 ; IMMEDIATE EOF ON INPUT, HAS NO EFFECT ON OUTPUT
16621 NULO: HLRS A,C ;REMEMBER MODE FOR .STATUS
16622 JSP Q,OPSLC3 ;SET UP IOCHNM WORD AND EXIT
16626 ;UNIT NULL DEVICE INPUT
16629 ;BLOCK NULL DEVICE INPUT
16632 ;BLOCK NULL DEVICE OUTPUT ENTRY
16633 ;ADVANCE BLOCK MODE .IOT POINTER
16634 NULBOD: XCTR XR,[HLRE A,(C)] ;GET NEG LENGTH FROM LEFT HALF
16635 MOVNS A ;GET POSITIVE LENGTH
16636 XCTR XR,[ADD A,(C)] ;ADD STARTING LOC (R.H.)
16637 XCTR XW,[HRRZM A,(C)] ;STORE BACK "COUNTED OUT" POINTER
16640 ;STANDARD DEVICE .STATUS ROUTINE
16641 STDSTA: DPB A,[60300,,D] ;A HAS LH OF IOC WORD
16642 TRO D,1_9 ;SYS BUF CAP FULL
16643 TRNE D,1_6 ;SKIP IF INPUT
16644 TRC D,3_9 ;TURN OFF SYS BUF CAP FULL, SET EMPTY
16649 UBPFJ==10 ;DEMAND FOREIGN JOB (BIT IN LH (DEV) FOR .OPEN (USR))
16651 USROJ: TDZA J,J ;ENTRY FROM JOB DEVICE DONT GET CORE.
16652 USRO: MOVNI J,1 ;INDICATE NOT FROM JOB OPEN
16654 USROOJ: MOVEI J,1 ;OJB DEVICE; EXISTING JOB OK ONLY IF %OPOJB BIT SET.
16657 PUSHJ P,UFLS ;PREVENT ATTEMPT TO CORE, PCLSR OUT, AND THINK YOU'VE WON AT SETBF1, ETC
16660 JUMPE B,USRO4 ;JNAME = 0 => UNAME IS JOB SPEC.
16661 SKIPN A ;IF UNAME=0
16662 MOVE A,UNAME(U) ;MAKE IT THIS JOB'S UNAME
16663 CAME A,UNAME(U) ;SKIP IF FIRST FILE NAME IS UNAME OF OPENER
16665 CAME B,[SIXBIT /PDP10/] ;SKIP IF SECOND FILE NAME IS "PDP10"
16666 CAMN B,[SIXBIT /PDP6/] ;OR PDP6
16667 IFN PDP6P,JRST PDPO
16669 USROA: CONO PI,CLKOFF
16670 PUSHJ P,LSWPOP ;TREESW
16672 USRO3: CAME A,UNAME(TT)
16675 JRST UFN1 ;FOUND UNAME JNAME PAIR
16676 AGIN: ADDI TT,LUBLK
16679 TLNE C,UBPFJ ;JOB MUST EXIST TO WIN IF UBPFJ SET
16681 CAME A,UNAME(U) ;INFERIOR PROCEDURE MUST HAVE SAME UNAME
16684 TCORS: MOVSI T,%TBNOT+%TBDTY ;DOESN'T HAVE TTY, ISN'T GIVING IT AWAY
16686 JRST TCORS1 ;USTRA FAILED - SEE WHY, MAYBE RETRY (U CLOBBERED)
16699 PUSHJ P,USRST5 ;SET UP TTY STUFF
16702 IORM A,APRC(TT) ;NEW INFERIOR IS DISOWNED IF CREATOR IS.
16703 JUMPE J,CLKOJ1 ;RETURN HERE FOR JOB DEVICE (INDEX IN TT)
16704 PUSHJ P,ULUP1 ;FIND AN INTERRUPT BIT FOR THE JOB.
16705 JRST NOGO1 ;NONE => GO KILL THE JOB AND RETURN FAILURE.
16706 CONO PI,CLKON ;NOW CAN'T FAIL TO CREATE THE JOB FOR GOOD.
16711 PUSHJ P,UFOUND ;SET UP THE OPENER'S CHANNEL.
16715 PUSHJ P,ACORE1 ;MAY PCLSR OUT, BUT CORE JOB WILL DO WORK ANYWAY.
16716 SKIPA R,UUAC(U);NO CORE AVAILABLE, KILL THE JOB
16717 JRST POPJ1 ;SUCCESS
16720 JRST OPNL37 ;NO CORE AVAILABLE
16723 ULUP: HRRZ E,SUPPRO(T)
16724 SKIPN UNAME(T) ;SKIP IF VARIABLE BLOCK IN USE
16726 CAIN E,(U) ;SKIP IF NOT AN INFERIOR
16727 IOR A,SUPPRO(T) ;IOR IN INTERRUPT BIT OF INFERIOR
16728 ULUP2: ADDI T,LUBLK ;ADVANCE TO NEXT BLOCK
16729 CAMGE T,USRHI ;SKIP IF ALL EXAMINED
16731 UFIN: MOVEI B,1 ;SELECT INT BIT
16739 NOGO1: MOVSI T,BULGO+BULGOS
16740 IORM T,APRC(TT) ;TELL THE SYS JOB TO KILL THE JOB WE JUST GOT
16743 JRST OPNL5 ;DIREC FULL (TOO MANY LOSERS)
16745 NOGO4: SUB P,[1,,1]
16748 TCORS1: PCLT ;COME HERE FROM TCORS IF ATTEMPT TO FIND FREE JOB SLOT FAILED.
16749 SKIPGE SJCFF ;IF THIS IS NEGATIVE, USTRA DIDN'T EVEN REQUEST MORE
16750 JRST [ SKIPGE SJCFF
16755 JRST NOGO4 ;USER MEM EXPANDED TO MAX
16756 SKIPGE SUPCOR .SEE SCLEX ;PRESUMABLY USTRA ASKED SYS JOB FOR MORE JOB SLOTS
16757 PUSHJ P,UFLS ;SO WAIT TILL SYS JOB ANSWERS THE REQUEST
16758 TCORS2: CONO PI,CLKOFF ;AND SEE IF THERE ARE NOW ENOUGH SLOTS.
16761 USRO4: EXCH J,A ;USR: OPEN WITH JNAME=0: USE UNAME AS JOB SPEC.
16765 CAIN J,-1 ;SPEC'D JOB IS PDP6 => OK,
16769 PUSHJ P,LSWPOP ;SOS DIELOK(J)
16770 PUSHJ P,LSWPOP ;TREESW
16773 ;COME HERE WHEN JOB ALREADY EXISTS, WITH CLOCK OFF AND USR IDX IN TT.
16774 ;A, B, C STILL HAVE UNAME, JNAME AND OPEN MODE.
16775 UFN1: JUMPE J,[ADDI B,10000 ;OPENING JOB-DEVICE AND JOB EXISTS??
16776 JRST USROB] ;KEEP CHANGING JNAME UNTIL WE CREATE A JOB.
16778 JUMPL J,UFNDF ;SKIP SOME CHECKS ON SYS & CORE
16779 JUMPG J,[MOVSI T,%OPOJB ;OJB DEVICE OPEN; IF JOB DOESN'T HAVE %OPOJB SET,
16780 TDNE T,OPTION(TT) ;THEN IT HASN'T GIVEN PERMISSION TO BE HACKED.
16781 SKIPL JBI(TT) ;IF IT'S ALREADY A JOB DEVICE DON'T HACK IT.
16782 JRST [CONO PI,CLKON ;IN EITHER CASE, WAIT TILL ALL'S OK,
16787 JRST USROOJ] ;THEN RE-TRY THE OPEN.
16788 LDB T,[.BP BULGOS_22,APRC(TT)]
16790 JRST CLKOJ1] ;RETURN SUCCESS TO JOBO6C.
16792 JRST UFNDF ;USER WANTS IT AS FOREIGN JOB
16795 JRST UFN1C ;OPENING UP INFERIOR
16797 SKIPL SUPPRO(TT) ;UNLESS IT'S A TOP-LEVEL DISOWNED JOB,
16798 JRST UFNDF ;THEN FOREIGN JOB
16799 PUSHJ P,UFN2B ;REOWN DISOWNED TREE
16803 UFN1C: MOVE U,TT ;OPENING PROCEDURE IMMEDIATE SUPERIOR OF PROCEDURE BEING OPENED
16807 ; REOWN A DISOWNED PROCEDURE TREE
16810 NREOWN: TLNN R,%CLSFU ;MUST BE A FOREIGN USER CHANNEL
16816 JRST OPNL31 ;TO A TOP-LEVEL DISOWNED JOB
16818 PUSHJ P,UFN2B ;REOWN THE JOB (TURNS CLOCK ON)
16820 HLRZ R,(P) ;TURN THE CHANNEL INTO AN INFERIOR CHANNEL.
16821 MOVNI T,FUWIDN-UWIDN
16825 ;REOWN JOB TT POINTS TO, ITS APRC IS IN T. SKIPS IF SUCCESSFUL.
16826 ;CALL WITH CLKOFF, WILL TURN IT ON.
16827 UFN2B: TLNE T,BULGOS
16828 JRST OPNL42 ;CAN'T REOWN JOB WHICH IS LOGGING OUT.
16829 SKIPGE APRC(U) ;IF REOWNING JOB IS DISOWNED, PROHIBIT SO THAT
16830 JRST OPNL31 ;IT DOESN'T REOWN ITSELF AND SCREW THINGS UP
16831 PUSHJ P,ULUP1 ;FIND AN INTERRUPT BIT FOR IT. (IN B)
16832 JRST OPNL5 ;WE HAVE 8 INFERIORS ALREADY.
16833 AOS (P) ;GOING TO WIN
16834 SETOM DLSRCH ;INHIBIT SCHEDULING
16835 CONO PI,CLKON ;TURN CLOCK BACK ON, THIS MAY TAKE A WHILE
16836 MOVSI A,BUMRTL ;DOOMED DETACHED JOBS ARE RESCUED BY REOWNING.
16838 MOVE A,UNAME(U) ;PICK UP NEW UNAME
16840 TLZ D,#400000 ;SIGN OF D SET IFF REOWNER ISN'T DISOWNED.
16841 MOVE J,UTMPTR(U) ;PICK UP NEW USER RESOURCE POINTER
16843 SUBI J,USRRCE ;GET NEW CONSOLE #
16844 CAIL J,NCT ;IF NEW TREE STILL HAS NO TTY,
16845 MOVEI J,%TINON ;"DISOWNED" TTY CHNLS SHOULD REMAIN SUCH
16846 ;HERE, A HAS UNAME, D HAS <SIGN IFF MAKING NON-DISOWNED>,,UTMPTR, J HAS CONSOLE # OR %TINON,
16847 ;U HAS REOWNER, TT HAS JOB BEING REOWNED.
16848 UFN2A: PUSH P,B ;SAVE INTERRUPT BIT
16849 UFN3: MOVEM A,UNAME(TT) ;SET TO NEW UNAME
16850 HRRZM D,UTMPTR(TT) ;SET TO NEW USER RESOURCE POINTER
16854 HLLZ T,D ;LH(D) HAS 0 IF REOWNER DISOWNED, ELSE 400000
16855 ANDCAM T,APRC(TT) ;MARK AS NOT DISOWNED IF REOWNER ISN'T DISOWNED.
16856 UFNL3: MOVE B,JNAME(TT) ;PICK UP CURRENT JNAME
16857 MOVEI E,0 ;LOOP ON ALL USERS
16858 UFNL1: CAMN A,UNAME(E) ;SKIP ON NOT SAME UNAME
16859 CAME B,JNAME(E) ;SKIP ON SAME UNAME-JNAME
16860 JRST UFNL2 ;NOT SAME NAME AND/OR VAR BLK NOT IN USE
16861 JRST UFN7 ;NAME CONFLICT, RESOLVE
16862 UFNL2: ADDI E,LUBLK
16865 MOVEI E,0 ;INITIALIZE FOR LOOP TO LOOK FOR INFERIORS AND DUPLICATE NAMES
16866 UFN4: SKIPN UNAME(E) ;SKIP IF VAR BLOCK IN USE
16867 JRST UFN5 ;TRY NEXT
16868 HRRZ I,SUPPRO(E) ;PICK UP SUPERIOR POINTER OF BLOCK BEING EXAMINED
16869 CAIN I,(TT) ;SKIP IF NOT INFERIOR
16870 JRST UFN6 ;INFERIOR, PSEUDO-RECURSE
16871 UFN5: ADDI E,LUBLK ;ADVANCE TO NEXT BLOCK
16872 CAMGE E,USRHI ;SKIP IF ALL EXAMINED
16874 SKIPGE SUPPRO(TT) ;SKIP IF NOT BACK TO TOP
16875 JRST UFNX ;BACK TO TOP LEVEL
16876 MOVE E,TT ;POP BACK UP
16877 HRRZ TT,SUPPRO(E) ;TO PREVIOUS LEVEL
16878 MOVE B,JNAME(TT) ;RESTORE B
16879 JRST UFN5 ;PROCEED AT PREVIOUS LEVEL
16883 HRRM U,SUPPRO(TT) ;SET UP SUPERIOR POINTER IN TO LEVEL DISOWNED
16884 SETZM DLSRCH ;RE-ENABLE SCHEDULING
16888 UFN6: MOVE TT,E ;PSEUDO-RECURSE
16889 JRST UFN3 ;START UP ON LOWER LEVEL
16891 UFN7: CAMN E,TT ;SKIP UNLESS FOUND SELF
16893 ADDI TT,JNAME ;SET UP ARG TO SIXAOS
16894 PUSHJ P,SIXAOS ;INCREMENT JNAME
16895 SUBI TT,JNAME ;RESTORE TT
16896 JRST UFNL3 ;RESTART LOOP
16898 ;RESUSCITATE TTY CHNLS
16902 POPJ P, ;NOT A TTY CH
16905 POPJ P, ;NOT CONSOLE
16908 DPB J,[$TIIDX,,(R)]
16911 UFOUND: HLRZS C ;U HAS INF PROC
16915 ADDI R,IOCHNM(U) ;CLOBBERED BY CORE
16921 JRST OPNL12 ;ATTEMPTED OUTPUT
16922 LDB A,[.BP BULGOS_22,APRC(TT)]
16923 JUMPN A,OPNL42 ;USER GOING AWAY
16928 USRST: PUSHJ P,AUCL2 ;.RESET SIMULATES CLOSING AND REOPENING
16932 EXCH U,A ;BUT WITH LESS OVERHEAD
16935 MOVEI B,BULGOS ;WE'RE NOT REALLY TRYING TO KILL THE INFERIOR,
16936 ANDCAM B,APRC(U) ;SO DON'T LET OTHERS THINK HE'S BEING KILLED.
16940 PUSHJ P,ACRF1 ;FLUSH ALL OF CORE
16944 PUSHJ P,ACRF1 ;THEN GET 1 PAGE
16945 JRST [ PUSHJ P,UDELAY
16948 MOVSI T,%TBNOT+%TBDTY
16955 XCTR XBRW,[BLT T,1777]
16962 PUSHJ P,USRST4 ;SHOULD SKIP
16967 USRST5: MOVE A,TTSTSV(U) ;INITIALIZE SAVED TTYSET OF NEW JOB EQUAL TO CREATOR'S.
16968 SKIPL B,TTYTBL(U) ;NOTE THAT THE WHEREABOUTS OF THE CREATOR'S TTYSET
16969 MOVE A,TTYST1(B) ;DEPENDS ON WHETHER HE HAS THE TTY NOW.
16974 MOVEM A,TTSTSV+1(TT)
16975 MOVEI A,(TT) ;RH OF NEW JOB'S SAVED TTYSTS IS HIS INDEX.
16976 HRLI A,%TSCNS ;NOW CONSTRUCT THE LH.
16977 MOVE B,UTMPTR(TT) ;TO DO THAT, FIND THE TREE'S TTY NUMBER
16978 MOVE B,TTYOPT-USRRCE(B) ;TO FIND THE TTY'S TTYOPT WORD,
16979 TLNE B,%TOROL ;WHICH TELLS HOW TO INIT THE BITS IN THE TTYSTS.
16985 MOVEM A,TTSTSV+2(TT)
16989 ; ARG 1 JOB WHOSE MEMORY SHOULD BE READ OR WRITTEN
16990 ; ARG 2 ADDRESS TO READ OR WRITE
16991 ; ARGS 3,4 LIKE USRVAR, TTYVAR
16992 ; VAL 1 PREVIOUS CONTENTS OF LOCATION
16993 ; VAL 2 NEW CONTENTS OF LOCATION (SAME AS PREVIOUS IF NOT WRITING).
16994 ; (NOT VALID IN BLOCK MODE)
16996 ; BIT 1.1 IF SET, THEN IF PAGE ISN'T READABLE OR WRITEABLE, GIVE AN MPV
16997 ; OR PURE INTERRUPT TO THE JOB BEING REFERENCED.
16998 ; BIT 2.9 IF SET, ALLOWS US TO WRITE IN ANY JOB.
17003 JRST NUSRM1 ;WE CAN SURELY WRITE.
17005 CAIGE W,3 ;ELSE, IF WE WANT TO WRITE,
17006 TRNE H,1 ;OR WANT TO GIVE THE REFERENCED JOB INTERRUPTS,
17007 TRNE H,400000 ;THEN UNLESS WE ARE FORCING IT,
17009 JSP T,NCORWR ;SEE IF IT IS A JOB WE ARE ALLOWED TO WRITE IN.
17011 NUSRM1: MOVE H,CTLBTS(U)
17013 CAIG J,LUBLK ;CAN'T GIVE SYS OR CORE JOBS INTERRUPTS, OR PDP6.
17024 MOVE A,J ;IF TARGET JOB ISN'T SELF OR PDP6
17025 PUSHJ P,RPCLSR ; OR SYS OR CORE, STOP IT.
17028 NUSRMS: PUSHJ P,NUSRM2 ;DO THE WORK
17029 POPJ P, ;LOST, OPNL HAS LSWCLR'ED
17030 JRST LSWCJ1 ;POSSIBLY UNLOCK USTP, DIELOK AND TAKE SUCCESS RETURN
17032 NUSRM2: PUSHJ P,VARCAL ;E:=ADDR, D:=DATA, W:=INSTRUCTION
17035 JRST NUSRM6 ;ACS ALWAYS SWAPPED-IN AND ACCESSIBLE
17038 LDB A,[121000,,E] ;GET PAGE # IN A AND REF'D JOB IN U.
17039 IFE PDP6P, PUSHJ P,UPLC
17041 PUSHJ P,[ CAIE J,-1 ;SKIP IF PDP6
17042 JRST UPLC ;DECODE THEM FOR ORDINARY JOB.
17044 TDZA T,T ;FOR PDP6, MOST PAGES DON'T EXIST,
17045 MOVE T,[002200,,[600000]] ;AND THE REST ARE WRITABLE.
17049 LDB A,T ;GET PAGE ACCESS HALFWORD.
17050 TRNN A,600000 ;IF PAGE SWAPPED OUT, PUT ACCESS BITS IN PLACE THEY WOULD BE
17051 LSH A,16. ; FOR AN IN-CORE PAGE.
17052 JUMPE A,NUSRM9 ;LOSE IF NO PAGE THERE
17053 TRNN A,400000 ;OR IF WE ARE TRYING TO WRITE THE WORD AND PAGE IS READ-ONLY.
17055 NUSRM6: PUSHJ P,MPLDJ ;NOW LOAD MAP OF JOB IN J
17056 HRLI E,(SKIP) ;GET ACCESS TO DATA WORD, SWAP IN PAGE
17059 NUSRM4: CONO PI,CLKOFF ;CLK OFF SO ONCE IN CAN'T SWAP OUT AGAIN
17060 XCTRI XRW,E ;NOT GETTING BENEFIT OF USUAL PCLSR BEFORE
17061 JRST NUSRM5 ;SWAP OUT FEATURE SINCE IT'S ANOTHER JOB
17065 NUSRM5: UMOVE B,(E) ;NOW THAT PAGE IS IN, GET OLD CONTENTS
17066 MOVE A,B ;IN A AND B
17068 HRRI W,B ;IF WRITING,
17069 XCT W ;EXECUTE USER'S INSN., MODIFYING 2ND VALUE IN B,
17070 TRNN J,-1 ;SYSTEM JOB?
17071 JRST OPNL31 ;******* WRITING SYS, TURN INTO .SETLOC *******
17072 UMOVEM B,(E) ;AND STORE IT BACK INTO REF'D JOB.
17073 NUSRM3: PUSHJ P,MPLDZ ;RESTORE NORMAL PAGE MAP, TURN CLKON.
17074 JRST POPJ1 ;SUCCESS
17076 NUSRM8: SKIPA T,[%PIWRO] ;HERE IF TRYING TO WRITE IN READ ONLY PAGE.
17077 NUSRM9: MOVEI T,%PIMPV ;HERE IF ACCESSING NONEXISTENT PAGE.
17078 TRNN H,1 ;SKIP IF TO GIVE INTERRUPT
17081 JRST UUOERR ;INTERRUPT TO SELF
17082 IORM T,PIRQC(J) ;INTERRUPT OTHER USER
17083 JRST OPNL32 ;CAN'T GET THAT ACCESS TO PAGE.
17085 ;COMMENTS BELOW APPLY TO UBI IN MANY CASES. FOR UBO, TRANSFER GOES THE
17091 UBI: MOVEI I,0 ;SIGNAL UBI
17094 XCTR XRW,[MOVES TT,(C)] ;MAKE SURE WRITE CYCLES WILL WIN
17095 UBIB: TRNE A,200000 ;SKIP UNLESS 6
17096 MOVNI A,1 ;SO CAILE BELOW WILL SKIP OVER SUSTPR AMONG OTHER REASONS
17097 CAILE A,LUBLK ;SKIP ON SYS JOB, CORE JOB, PDP6 OR JOB ALREADY STOPPED
17098 PUSHJ P,SUSTPR ;RANDOM JOB STOP
17099 JUMPGE TT,UBI4 ;THRU
17100 TLO A,400000 ;INDICATE ALREADY STOPPED SO WONT TRY IT AGAIN
17102 MOVNS B ;COUNT TO BE XFERRED
17103 HRLZ E,IOCHST-IOCHNM(R) ;EXAMINED USER ADDRESS
17104 HRR E,TT ;FROM,,TO (INFERIOR ADR,,SUPERIOR ADR)
17108 UBI5: CAIGE Q,20 ;INF ADR IN Q
17110 HRRZ J,A ;SET UP UMAPS WORD
17112 TLOA J,%UMMPL ;TO HI PG, HACK OUR LOW PG
17113 TLO J,%UMMPU ;TO LOW PG, HACK OUR HI PG
17115 TLOA J,%UMLTU ;TO POINT TO HIS UPPER
17116 TLO J,%UMUTL ;TO POINT TO HIS LOWER
17117 TLNN J,%UMMPU+%UMUTL ;MAPPING HIS UPPER WITH OUR LOWER?
17118 JRST UBI3A ;YES MAKE SURE NOT SCREWED BY AC PNTR
17119 UBI3B: PUSHJ P,MPLD1
17121 MOVNS Q ;LIMIT SIZE OF XFER TO MIN OF DESIRED
17122 ADDI Q,400000 ;DIST OF TO ADR FROM SEG BOUNDARY
17125 MOVNI Q,(E) ;AND DIST OF FROM ADR FROM SEQ BOUNDARY
17129 TLNN J,%UMMPL ;BUGGER ADDRESSES SO RIGHT DBRS WILL BE USED
17130 TLOA E,400000 ;SET FROM ADR TO HI PG
17131 TRO E,400000 ;SET TO ADR TO HI PG
17132 SKIPE I ;SKIP ON UBI
17133 MOVSS E ;UBO, XFERR OTHER DIRECTION
17134 MOVE Q,E ;SAVE COPY OF BLT PNTR
17135 ADDI B,(E) ;GET LA +1
17136 UBI3H: XCTRI XBRW,[BLT E,-1(B)] ;XFERR DATA
17137 UBI3K: MOVEI E,(B) ;NO FAULT, SIMULATE STORE BACK OF BLT PNTR AFTER COMP OF BLT (RH ANYWAY)
17139 PUSHJ P,MPLDZ ;RETURN TO NORMAL MAP TO STORE BACK USER PNTR
17140 POP P,J ;SAVE PREV MAP FOR EVENTUAL USE
17141 SUBM E,Q ;FIGURE OUT HOW MANY WDS ACTUALLY XFERRED
17143 UBI3E: HRLS Q ;# WDS TRANSFERRED,,SAME
17144 JUMPL C,UBIC ;UPDATE USER PNTR
17145 XCTRI XRW,[ADDM Q,(C)]
17147 BUG ;SHOULD HAVE ALREADY CHECKED THIS
17148 UBID: ADD Q,IOCHST-IOCHNM(R) ;UPDATE INFERIOR PNTR
17149 HRRM Q,IOCHST-IOCHNM(R) ;WRAPPING AROUND IF PASS 1,,0
17151 CAIN B,(E) ;WAS THERE A FAULT?
17152 JRST UBIL ;NO, LOOP
17153 PUSHJ P,UBI4 ;UNSTOP THE JOB.
17154 PUSHJ P,MPLD1 ;RESTORE TO FROB AT TIME OF FAULT
17155 UBI3C: PUSHJ P,TPFLT
17159 UBI4: TLNN A,200000 ;SKIP ON REALLY PDP6
17160 TLZ A,400000 ;FLUSH RANDOM BIT SO COMPARE WILL WORK
17165 UBMCK1: PUSHJ P,UBI4
17168 UBIA: TRNE C,777760
17173 UBIC: TRNE C,777760
17178 UBI5A: CAIL Q,400000
17186 UWI: SETO I, ;0 FOR OUTPUT, -1 FOR INPUT.
17188 MOVNI A,1 ;-1 MEANS PDP6.
17190 HRLI A,-1 ;DON'T STOP SELF
17192 JRST UWI1 ;SYS, CORE, SELF, OR PDP6
17194 PUSHJ P,SOSSET ;MIGHT TAKE PAGE FAULT AND GET PCLSRED
17196 UWI1: HRRZ E,IOCHST-IOCHNM(R)
17198 PUSHJ P,MPLDJ ;MAP JOB BEING IOT'ED FROM.
17199 XCTR XRW,[ MOVE W,(E)
17201 AOS IOCHST-IOCHNM(R) ;ADVANCE ACCESS POINTER
17206 UBI3A: TLNE E,777760 ;SKIP ON XFERRING FROM AC AREA, HI TO HI
17210 XCTRI XR,[MOVE B,(Q)] ;PICK UP WD
17212 JRST UBI3C ;TAKE FAULT
17213 PUSHJ P,MPLDZ ;BACK TO NORMAL MAP
17217 ;USR DEV IOT STOP ROUTINE
17218 USUSTP: SOS USTP(A)
17219 SUSTPR: MOVSI T,BCSTOP+BUCSTP
17220 TDNE T,USTP(A) ;WAIT TILL NOT BEING SHUFFLED
17222 PUSHJ P,RPCLSR ;AOS'ES USTP
17223 MOVSI T,BCSTOP+BUCSTP
17228 UBI3: ADDI Q,AC0S(A)
17231 TDZA B,B ;READ PDP6 AC
17232 MOVE B,(Q) ;READ NORMAL AC
17233 UBI3D: XCTRI XW,[MOVEM B,(E)]
17235 JRST UBI3C ;TAKE FAULT
17236 UBI3G: MOVEI Q,1 ;1 WD XFERRED
17237 HRRZ B,E ;FAKE OUT FAULT TEST
17240 UBO3: TLNE A,200000
17241 JRST UBI3G ;TRYING TO WRITE PDP6 AC IGNORE
17242 XCTRI XR,[MOVE B,(E)]
17249 UBO3A: XCTRI XR,[MOVE B,(TT)]
17251 JRST UBI3C ;TAKE FAULT
17252 PUSHJ P,MPLDJ ;MAP HIM.
17253 XCTRI XW,[MOVEM B,(Q)]
17256 PUSHJ P,MPLDZ ;BACK TO NORMAL
17259 SUBTTL CORE LINK DEVICE
17263 CLSYN: BLOCK NCLCH ;SYSTEM NAME ;0=>VARIABLES FREE
17264 CLN1: BLOCK NCLCH ;FN1
17265 CLN2: BLOCK NCLCH ;FN2
17266 CLUSR: REPEAT NCLCH,-1 ;LH=WRITING USER ;RH=READING USER ;-1=>NOT OPEN THAT HALF
17267 CLRAC: BLOCK NCLCH ;4.9=LOCKED BY CORE ALLOCATOR
17268 ;4.8=VERY SLOW CLOCK ROUTINE CONSIDERING FLUSHING THIS BUFFER
17269 %CAFLS==100000 ;4.7=INPUT CLOSED, TURN OUTPUT INTO NUL DEVICE
17270 %CA==1,,500000 ;RH=UT BUFFER NUMBER (IOBFT ADR)
17272 CLOSW: -1 ;USER LOCK TO STOP MORE THAN ONE PERSON FROM SIMULTANEOUSLY MODIFYING
17273 0 ;THE CORE LINK VARIABLES
17277 ;FORMAT OF CORE LINK 200 WORD BUFFER
17281 CLBEOF==<CLBCHS+4>/5
17282 IFG CLBVSP+CLBCHS+CLBEOF-128.,.ERR CLBXXX LOSSAGE
17285 ;0: CHARACTER COUNT
17286 ;1&2: READ AND WRITE CHARACTER OR WORD POINTERS
17287 ;3&4: READ AND WRITE EOF POINTERS
17288 ;CLBVSP TO CLBVSP+CLBCHS-1: CHARACTERS OR WORDS
17289 ;CLBVSP+CLBCHS UP: EOF BITS STORED AS SEVEN FIVE BIT BYTES PER WORD,
17290 ; EACH BIT CORRESPONDING TO A CHARACTER POSITION.
17292 CLAO: SKIPA J,[2] ;CLA .OPEN (TO ANSWER A CLI INTERRUPT)
17293 CLIO: MOVNI J,1 ;CLI .OPEN (INTERRUPTS USER SPECIFIED BY FILE NAME)
17296 CLUO: TDZA J,J ;CLU .OPEN
17297 CLOO: MOVEI J,1 ;CLO .OPEN
17298 CLI2: JUMPL C,CLFDEL ;JUMP IF AN .FDELE
17300 JRST CLO1 ;NOT FILE DIRECTORY
17305 CLO1: PUSHJ P,SWTL ;SEIZE SWITCH TO STOP VARIABLES FROM CHANGING UNDER YOU
17307 LDB H,[220100,,C] ;DIRECTION BIT
17309 CLOO5B: MOVE Q,USYSN1(U) ;PICK UP SNAME
17311 CAIN J,2 ;SKIP UNLESS CLA
17312 JRST CLO1A ;JUMP IF CLA .OPEN
17314 CLO1A1: MOVE Q,[SIXBIT/_CLI_/]
17315 CLOL: CAMN Q,CLSYN(I) ;LOOK FOR SNAME, FN1, & FN2
17320 JUMPL J,OPNL23 ;"FILE LOCKED" IF ALREADY EXISTS, FOR CLI:.
17321 CAIN J,3 ;SKIP UNLESS DELETE
17322 JRST CLO1D ;FOUND FILE TO DELETE
17323 CLO1A6: LDB TT,CLOOT1(H)
17325 JRST OPNL23 ;ALREADY OPEN THIS DIRECTION (FILE LOCKED)
17327 LDB Q,[IOSA,,IOBFT(TT)]
17329 CLOX: DPB U,CLOOT1(H) ;STORE USER INDEX
17331 ANDCAM TT,CLRAC(I) ;CLEAR VERY SLOW CLOCK BIT
17332 PUSHJ P,LSWPOP ;RELEASE SWITCH
17336 PUSHJ P,CLOX1 ;FOR CLI:, PUT OUR UNAME AND JNAME INTO BUFFER.
17339 MOVEI TT,7 ;UNIT ASCII
17340 ADD Q,H ;OFFSET FOR DIRECTION
17341 DPB TT,[300600,,1(Q)] ;SET UP ITEM POINTER
17344 MOVEI TT,1 ;UNIT ASCII
17345 DPB TT,[300600,,3(Q)] ;SETUP EOF POINTER
17346 JSP Q,OPSLC7 ;SET UP IOCHNM OF USER
17347 DCLUAI,,DCLUAO ;UNIT ASCII INPUT ;UNIT ASCII OUTPUT
17348 DCLBI,,DCLBO ;BLOCK INPUT ;BLOCK OUTPUT
17349 DCLUBI,,DCLUBO ;UNIT BINARY INPUT ;UNIT BINARY OUTPUT
17352 CLOX1: MOVEI TT,44 ;CHANGE OUTPUT BYTE SIZE TO 36.
17353 DPB TT,[300600,,2(Q)]
17354 MOVEI TT,5 ;WHICH INVOLVES STORING 5 CHARACTERS OF EOF BITS AT ONCE.
17355 DPB TT,[300600,,4(Q)]
17359 PUSHJ P,CLOXO ;NOW WE CAN IOT WORDS OUT, EVEN IF CHANNEL IS ASCII MODE.
17363 SOJA Q,POPCJ ;NOW RETURN, AND SET UP THE CORRECT BYTE SIZES.
17365 CLOO1: AOBJN I,CLOL ;LOOP FOR ALL SETS OF CORE LINK VARIABLES
17367 JUMPGE J,OPNL4 ;CLA, CLU DELETE LOSE
17369 CLOO3: SKIPN CLSYN(I) ;LOOK FOR FREE VARIABLES TO CREATE FILE
17372 JRST OPNL5 ;GIVE DIREC FULL ERROR
17374 CLOOT1: 2200,,CLUSR(I) ;READING
17375 222200,,CLUSR(I) ;WRITING
17377 CLOO2: MOVEM A,CLN1(I) ;SET UP VARIABLES
17379 MOVEI D,SCNCLO(I) ;SYS CHNL NO
17380 PUSHJ P,TCALL ;GET 200 WORD BUFFER
17382 JRST CLOO4 ;NO MEM AVAIL
17383 MOVEM Q,CLSYN(I) ;DONT SET UP SYS UNTIL MEM AVAIL
17385 LDB Q,[IOSA,,IOBFT(A)] ;SET UP BUFFER
17387 SETZM (Q) ;CHAR COUNT
17389 ADDI TT,CLBVSP ;SET UP BUF POINTERS
17393 ADDI TT,CLBCHS ;SET UP EOF POINTERS
17398 ;NO MEMORY AVAILABLE FOR 200-WD BUFFERS
17399 CLOO4: AOS SWPOPR ;MAYBE SWAPPING SOMETHING OUT WILL HELP
17400 PUSHJ P,LSWPOP ;UNLOCK CLOSW
17401 PUSHJ P,UDELAY ;WAIT A WHILE
17402 JRST CLO1 ;TRY AGAIN
17404 CLOO5: CONO PI,CLKOFF ;TURN OFF CLOCK TO STOP U&J NAMES FROM CHANGING
17406 CLOO5A: CAMN A,UNAME(Q) ;LOOK FOR USER WHOSE NAMES MATCH THE SPECIFIED FILE NAMES
17409 MOVEI T,%PICLI ;IF GET TO HERE, HAVE FOUND USER WITH RIGHT NAMES
17410 TDNN T,MSKST(Q) ;SKIP IF HE HAS CLI INT DISABLED
17412 IORM T,PIRQC(Q) ;GIVE USER INT
17416 CLOO6: ADDI Q,LUBLK ;GO TO NEXT USER SLOT
17417 CAMGE Q,USRHI ;SKIP IF ALL EXAMINED
17421 CLO1D: MOVE T,CLUSR(I)
17422 AOJN T,OPNL23 ;FILE LOCKED
17425 PUSHJ P,CLIOTB ;NO TIMING ERROR SINCE CORE JOB WILL PCLSR USR ON
17426 SKIPN B,SRN3(U) ;CORE LINK BEFORE MOVING BUFFER
17433 CLO1A: MOVE A,UNAME(U)
17437 ;CORE LINK .IOT SET UP ROUTINE
17439 CLIOTB: SKIPGE CLRAC(A) ;WAIT IF BUFFER LOCKED BY CORE ALLOCATOR
17440 PUSHJ P,UFLS ;(DO NOT CHANGE ABOVE TO "SKIPGE TT,CLRAC(A)")
17442 LDB Q,[IOSA,,IOBFT(TT)] ;GET POINTER TO BUFFER
17447 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII INPUT
17449 CLUAI: PUSHJ P,CLIOTB ;SETUP
17453 SKIPN (Q) ;WAIT TILL CHAR COUNT NON-ZERO
17455 CLUAI1: MOVE J,3(Q)
17456 ILDB I,J ;GET EOF BIT
17458 CLUAIE: ILDB W,1(Q) ;GET CHARACTER
17459 SOS (Q) ;DECREMENT BUF COUNT
17460 CLFAXP: LDB TT,[700,,1(Q)] ;FIX UP POINTERS
17461 CAIN TT,CLBVSP+CLBCHS-1
17462 PUSHJ P,CLFAX2 ;MAYBE TIME TO RING BUFFER
17463 HLRZ TT,J ;GET BYTE POSITION AND SIZE
17464 CAIN TT,010100 ;IF TO END OF 35-BIT WORD, ADVANCE
17465 IBP J ;TO NEXT WORD (5-BIT BYTES 1 BIT AT A TIME)
17469 UNIEOF: HRROI W,EOFCH
17472 CLFAX2: LDB TT,[370500,,1(Q)] ;PICK UP TOP 5 BITS OF BYTE POSITION
17473 JUMPN TT,CPOPJ ;NOT QUITE YET
17474 CLFBX2: MOVEI TT,CLBVSP ;J HAS NEW EOF PNTR
17475 DPB TT,[700,,1(Q)] ;RING CHAR POINTER
17478 DPB J,[360600,,1(Q)]
17479 MOVEI TT,CLBVSP+CLBCHS
17480 DPB TT,[700,,3(Q)] ;RING EOF POINTER
17481 DPB J,[360600,,3(Q)]
17485 ;CORE LINK .IOT ROUTINE FOR UNIT ASCII OUTPUT
17487 CLUAO: MOVE T,CLRAC(A)
17490 PUSHJ P,CLIOTB ;SETUP
17491 MOVEI T,CLBCHS*5-11.
17492 CAMGE T,(Q) ;WAIT TILL THERE IS SPACE IN BUF
17496 SKIPA B,(C) ;GET CHAR FROM EXEC
17497 UMOVE B,(C) ;GET CHAR FROM USER
17499 IDPB TT,J ;INDICATE NOT AN EOF
17500 IDPB B,2(Q) ;STORE IN BUF
17501 MOVEI TT,1 ;GET MASK FOR LOW ORDER BIT
17502 ANDCAM TT,@2(Q) ;FLUSH IN CURRENT WORD
17503 CLCWU2: AOS (Q) ;INCREMENT BUF COUNT
17504 MOVEI I,0 ;FAKE OUT EOF TEST
17505 AOJA Q,CLFAXP ;FAKE OUT CLFAXP AND FIX UP POINTERS
17508 CLBI: JSP W,WRDBTI ;BLOCK INPUT.
17510 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY INPUT
17512 CLUBI: PUSHJ P,CLIOTB ;SETUP
17517 CAMLE T,(Q) ;WAIT TILL A WORD IS AVAILABLE
17519 CLUBI1: MOVE J,3(Q)
17520 ILDB I,J ;GET EOF BITS
17521 JUMPN I,CLUBIF ;JUMP ON EOF
17522 CLUBIE: ILDB W,1(Q) ;GET WORD
17524 ADDB T,(Q) ;DECREMENT COUNT
17526 SETZM (Q) ;CAME FROM CLCLRL WITH PARTIAL WORD IN BUFFER
17527 CLFBXP: JRST CLFAXP
17529 CLUBIF: TROE I,20 ;SKIP IF EOF NOT ON FIRST CHAR OF WORD
17531 DPB I,J ;SET EOF ON FIRST CHAR
17533 ILDB W,J ;PICK UP WORD WITH EOF IN MIDDLE
17536 ;CORE LINK .IOT ROUTINE FOR UNIT BINARY OUTPUT
17538 CLUBO: MOVE T,CLRAC(A)
17541 PUSHJ P,CLIOTB ;SETUP
17542 ;CLI: OPEN CALLS HERE TO OUTPUT UNAME AND JNAME.
17543 CLOXO: MOVEI T,CLBCHS*5-11.
17544 CAMGE T,(Q) ;WAIT TILL THERE IS SPACE FOR A WORD
17548 SKIPA B,(C) ;GET WORD FROM EXEC
17549 UMOVE B,(C) ;GET WORD FROM USER
17551 IDPB TT,J ;INDICATE NOT AN EOF
17552 IDPB B,2(Q) ;STORE IN BUF
17554 ADDM TT,(Q) ;INCREMENT COUNT
17555 AOJA Q,CLFAXP ;FAKE OUT CLFBXP AND FIX UP POINTERS
17558 ;CORE LINK .IOT ROUTINE FOR BLOCK OUTPUT
17560 CLBO: MOVE I,C ;SAVE A POINTER TO USERS BLKO POINTER
17561 XCTR XR,[SKIPL H,(I)] ;PICKUP BLKO POINTER
17563 SKIPA E,H ;SECOND COPY, ALSO FLAG TO CLBIN
17564 CLBI2: UMOVEM E,(I) ;TO INFORM USER & IN CASE YOU ARE PCLSR'ED
17566 PUSHJ P,CLUBO ;TRANSFER ONE WORD
17567 AOBJN E,CLBI2 ;TRY FOR NEXT
17568 CLBI3: UMOVEM E,(I) ;COUNT EXHAUSTED OR EOF
17571 ;CORE LINK .CLOSE ROUTINE FOR BINARY OR BLOCK OUTPUT
17573 CLCLWB: PUSHJ P,CLCWC ;STORE EOF BITS FOR WORD
17574 JRST CLCWU6 ;NO ROOM SO LAST MUST HAVE BEEN EOF HACK SO FLUSH
17575 IBP 2(Q) ;KEEP WORD POINTER IN STEP
17576 PUSHJ P,CLCWB2 ;FIX UP COUNT AND POINTERS
17578 DPB B,[222200,,CLUSR(A)] ;OBLITERATE USER INDEX
17581 JRST LSWPOP ;RELEASE SWITCH
17583 ;CORE LINK .CLOSE ROUTINE FOR UNIT ASCII OUTPUT
17585 CLCLWU: PUSHJ P,CLCWC ;STORE EOF BIT FOR CHAR
17588 IDPB TT,2(Q) ;STORE AN EOF CHAR
17589 PUSHJ P,CLCWU2 ;FIX UP COUNT AND POINTERS
17590 SOS Q ;CLCWU2 AOJAS
17591 LDB TT,[360600,,2(Q)]
17592 SOJE TT,CLCWU6 ;JUST FILLED A WHOLE WORD => STOP PADDING.
17593 PUSHJ P,LSWPOP ;ELSE PAD ONCE MORE.
17597 ;COMMON SUBROUTINE FOR CORE LINK OUTPUT .CLOSE ROUTINES
17599 CLCWC: PUSHJ P,SWTL ;LOCK SWITCH (IF SIGN OF CLRAC IS EVER REALLY USED,
17600 CLOSW ;THIS MIGHT CAUSE A DEADLY EMBRACE).
17601 PUSHJ P,CLIOTB ;SETUP
17602 MOVEI T,CLBCHS*5-5.
17603 CAMGE T,(Q) ;WAIT FOR THERE TO BE ROOM
17607 IDPB TT,J ;SET EOF BIT(S)
17610 ;CORE LINK .CLOSE ROUTINE FOR INPUT
17612 CLO1D2: SETZM CLSYN(A) ;FREE VARIABLES
17613 HRRZS A,CLRAC(A) ;CORE LINK NO LONGER IN USE
17614 PUSHJ P,BRTN ;RETURN BUFFER TO FREE STATE
17617 CLISTA: PUSHJ P,CLIOTB ;CORE LINK INPUT STATUS
17619 TRO D,1_10. ;SYS BUF CAP EMPTY
17621 TRO D,1_9 ;SYS BUF CAP EMPTY
17624 CLCLRA: TDZA C,C ;UNIT ASCII
17625 CLCLRB: MOVNI C,1 ;IMAGE OR BLOCK (I.E. WORDS)
17629 ;FLUSH ALL REAL DATA
17630 CLCLRL: SKIPN (Q) ;SKIP IF BUFFER CONTAINS DATA, READ IT UNTIL EOF
17632 PUSHJ P,[JUMPE C,CLUAI1 ? JRST CLUBI1]
17634 CLCLR2: MOVE J,3(Q) ;FOUND AN EOF, FLUSH THE EOF WORD
17636 PUSHJ P,[JUMPE C,CLUAIE ? JRST CLUBIE]
17639 JRST CLCLR2 ;NOT YET TO WORD BOUNDARY
17642 CLCLR1: MOVSI B,%CAFLS
17651 CLCLR3: HLLOS B,CLUSR(A) ;NO LONGER OPEN FOR INPUT
17652 SKIPN (Q) ;IF NO DATA IN BUFFER
17653 AOJE B,CLO1D2 ;AND NOT OPEN FOR OUTPUT, GO FREE THE BUFFER AND VARS
17656 SUBTTL COMMON I/O ROUTINES
17658 ;STANDARD DEVICE OPEN
17660 STDOP1: MOVEI R,R ;ENTRY TO NOT CLOBBER IOCHNM
17661 STDOPN: HLRZ A,(Q) ;LH MASK ON 4.9-3.2 OF LH OPEN WRD
17662 AND D,A ;RH POINTER TO ..USR,..USE PAIR
17663 ROT D,-1 ;FOLLOWING WORDS CONTAIN LIST FOR ALL MASKED STATES
17664 ADDI D,(Q) ;LH MSKED STATE =0, RH =1, IOTTB ENTRY NUMBERS
17668 JUMPE A,OPNL12 ;MODE NOT AVAIL
17674 JRST OPNL10 ;DEVICE NOT AVAIL
17679 OPSLD1: ANDI D,1 ;ENTRY TO USE BOTTOM BIT OF AC D
17680 OPSLD3: ANDI D,3 ;ENTRY TO USE BOTTOM TWO BIT OF AC D
17682 OPSLC3: ANDI C,3 ;ENTRY TO USE BOTTOM TWO BITS OF AC C
17683 OPSLC7: ANDI C,7 ;ENTRY TO USE BOTTOM THREE BITS OF AC C
17689 OPNSLT: MOVEM A,(R) ;SET USERS IOCHNM
17692 ;BLOCK OUTPUT TO CHARACTER DEVICE
17693 ;ADR OF CHR ROUTINE IN E
17694 ; THAT ROUTINE MUST NOT CLOBBER C, D, E, OR TT
17695 ;C POINTS TO AOBJN POINTER IN USER SPACE
17696 ;MUSTN'T CLOBBER J (TTY OUTPUT ASSUMES).
17698 NBTOCH: XCTR XRW,[MOVES D,(C)] ;CHECK WRITEABILITY OF AOBJN PTR
17699 LDB TT,[410300,,D] ;USE HIGH 3 BITS OF USER PNTR AS CHR CNT
17701 POPJ P, ;USER TRYING TO XFER >32K FLUSH
17702 SKIPA TT,BTOCHT-3(TT) ;PICK UP APPROPRIATE BYTE PTR (WORD IN W)
17703 NBTO1: UMOVEM D,(C) ;UPDATE USER'S AOBJN PTR
17704 UMOVE W,(D) ;FETCH CURRENT WORD FROM USER
17705 ILDB A,TT ;FETCH CURRENT CHARACTER
17706 PUSHJ P,(E) ;SEND TO DEVICE
17707 ADD D,[700000,,] ;UPDATE PTR
17709 JRST NBTO1 ;GO TO NEXT CHR
17711 ADD D,[500001,,1] ;INCR TO NEXT WORD
17713 UMOVEM D,(C) ;COUNTED OUT, UPDATE FINAL TIME & RETURN
17716 BTOCHT: REPEAT 5,<44-<4-.RPCNT>*7>_14+700,,W
17718 ;BLOCK INPUT FROM CHARACTER DEVICE
17719 ;E AND C SET UP LIKE NBTOCH
17720 ;INTERNALLY LH OF E USED FOR FLAGS:
17721 ; 4.9 EOF FLAG (SIGN)
17722 ; 4.8 => JUST RETURN WITHOUT ERROR IF AT BEGINNING OF WORD,
17723 ; OTHERWISE IGNORE BIT.
17724 ; 4.7 => RETURN WITHOUT ERROR EVEN IF NOT AT BEGINNING OF WORD.
17726 INBTCH: HRRZS E ;CLEAR GARBAGE IN LH
17727 XCTR XRW,[MOVES D,(C)] ;SET UP LIKE NBTOCH
17731 SKIPA TT,BTOCHT-3(TT)
17732 INBTO1: UMOVEM D,(C)
17733 XCTR XRW,[MOVES (D)] ;CHECK WRITABILITY OF CURRENT WORD
17734 JUMPL E,INBTO2 ;JUMP IF EOF
17740 PUSHJ P,(E) ;RETN CHR IN W
17751 CAIN W,7 ;SKIP IF NOT AT 1ST CHAR.
17756 INBTO3: UMOVE W,(D) ;PICK UP CURRENT WORD
17757 IDPB I,TT ;INSERT CHARACTER
17758 UMOVEM W,(D) ;PUT WORD BACK
17761 JRST INBTO1 ;DO ANOTHER CHR THIS WORD
17763 ADD D,[500001,,1] ;INCR TO NEXT WD
17764 SKIPL E ;SKIP IF EOF
17766 UMOVEM D,(C) ;DONE, UPDATE POINTER AND RETURN
17769 INBTO2: MOVEI I,EOFCH ;EOF, STORE EOF CHARACTER
17772 ;BLOCK IO TO WORD DEVICE
17773 ;C POINTS TO AOBJN POINTER IN USER SPACE
17774 ;Q POINTS TO WORD HANDLING ROUTINE (POINTER WILL BE IN C)
17775 ;MUST NOT CLOBBER Q OR H (PTR ROUTINES DO POPJ2 SOMETIMES)
17776 ;WRDBRT CHECKED FOR ON PDL BY TVC ROUTINES
17779 UMOVE C,(H) ;FETCH USER'S AOBJN POINTER
17783 WRDBT2: PUSHJ P,OPBRK
17786 WRDBRT: JRST WRDBT5 ;NO SKIP - WORD XFERRED
17787 SKIPA C,[1,,1] ;1 SKIP - LAST WORD XFERRED
17788 POPJ P, ;2 SKIPS - EOF, NO WORD XFERRED
17789 XCTR XRW,[ADDM C,(H)]
17792 WRDBT5: MOVE C,[1,,1]
17793 XCTR XRW,[ADDB C,(H)]
17797 ;JSP W,WRDBTI TO DO WRDBT FOR A UNIT MODE INPUT ROUTINE SATISFYING NEW
17798 ;CALLING CONVENTION FOR THOSE.
17799 WRDBTI: JSP Q,WRDBT
17800 XCTR XRW,[MOVES (C)]
17806 WRDBT4: UMOVEM W,(C)
17811 ;CHANGED CONVENTIONS:
17812 ;1) EOF IS NO LONGER CHECKED FOR CHARACTER BY CHARACTER.
17813 ; INSTEAD, THE GET-BUFFER ROUTINE SHOULD SET UP THE BYTE COUNT
17814 ; TO A SMALLER VALUE THAN USUAL.
17815 ; AN ATTEMPT TO GET ANOTHER BUFFER AFTER REACHING EOF
17816 ; SHOULD CAUSE THE GET-BUFFER ROUTINE TO SKIP TWICE.
17817 ;2) THE THE BUFFER POINTER IS NOW A B.P. EVEN IN IMAGE MODE.
17818 ; ALSO, THE L.H. OF THE B.P. IS NOT INITTED HERE.
17819 ; IT MUST BE SET UP BY THE OPEN ROUTINE. ALSO, ACCESS ROUTINES
17820 ; FOR DSK MUST KNOW HOW TO SET IT UP.
17821 ; ALSO, THE BUFFER GET ROUTINE SHOULD SET IT UP,
17822 ; INSTEAD OF RETURNING THE BUFFER ADDRESS IN TT.
17823 ;3) THE BYTE SIZE THE FILE IS OPEN ON IS PASSED AS AN ARGUMENT.
17824 ; THIS ROUTINE WORKS FOR ANY CHANNEL BYTE SIZE WITH ANY
17828 ;RH OF E HAS # BYTES/WORD OF FILE BYTE SIZE. LH OF E HAS B.P. 44NN00.
17829 ;RH(C) = ADDR OF COUNT, IN USER MEMORY
17830 ;RH(TT) = ADDR OF USER'S B.P.
17832 ;0(B) ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
17833 ;1(B) ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
17834 ;2(B) ROUTINE TO GET NEXT BUFFER. NO SKIP IF NO MEMORY
17835 ; OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
17836 ; AND BUFFER BYTE POINTER ALREADY SET UP.
17837 ; 2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
17838 ; WHEN THIS ROUTINE IS CALLED, E CONTAINS THE
17839 ; NUMBER OF BYTES/WORD (GOOD FOR DETERMINING CHANNEL MODE).
17840 ;3(B) ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
17841 ; MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO,
17842 ; IN WHICH CASE IT SHOULD CONTAIN THE NEW NUMBER OF BYTES.
17844 ;5(B) IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
17845 ; IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
17847 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
17848 ;SIOKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
17857 SIOKNB: PUSHJ P,@3(B) ;"DISCARD" BUFFER
17858 SKIPE J,@1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME
17859 JRST SIOKT1 ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
17860 SKIPG 5(B) ;NEED TO WAIT FOR DEVICE?
17862 SIOKN1: SKIPG 5(B) ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
17863 JRST SIOKW1 ;DEVICE CAN'T WAIT SO UDELAY
17864 XCT 5(B) ;DEVICE WAIT
17865 SIOKF: PUSHJ P,UFLS
17867 SIOKF1: PUSHJ P,@2(B) ;NOW GET NEXT BUFFER
17868 JRST SIOKN1 ;HMM, HAVE TO WAIT
17869 JRST SIOKT1 ;BUFFER HAS BEEN GOT.
17870 JRST POP3J1 ;EOF, TRANSFER IS COMPLETE
17872 SIOKT1: UMOVE TT,@(P) ;GET COUNT OF BYTES TO TRANSFER
17873 JUMPLE TT,POP3J1 ;COUNT DECREMENTED TO 0; TRANSFER DONE.
17874 SKIPG D,@1(B) ;CHECK AMOUNT LEFT IN BUFFER
17875 JRST SIOKNB ;NEW BUFFER NEEDED
17876 CAMLE TT,D ;AMT OF ROOM LEFT IN CURRENT BUFFER
17877 MOVE TT,D ;TRANSFER ONLY AMT LEFT IN BUFFER
17882 IBP C ;TO TRANSFER WORD-WISE, BOTH B.P.'S MUST
17885 CAIE C,(D) ;HAVE SAME BYTE SIZE,
17892 CAIGE TT,@-2(P) ;THERE MUST BE AT LEAST 1 WORD TO TRANSFER,
17894 CAIE C,44 ;AND MUST BE ABOUT TO START THE NEXT WORD.
17897 IDIVI TT,@-3(P) ;GET # WDS TO BLT
17900 MOVSS J ;WRITING, SWAP BLT POINTER
17902 ADDI TT,(D) ;1+LAST WORD TO BLT INTO
17904 JRST SIOKN6 ;JUMP IF WRITING
17905 XCTRI XBW,[BLT D,-1(TT)] ;READING
17906 SIOKN7: MOVEI D,(TT) ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
17908 HRRZS J ;# WDS ACTUALLY XFERRED
17909 ADDM J,@(B) ;INCR BUFFER PNTR
17910 XCTR XRW,[ADDM J,@-1(P)]
17913 XCTR XRW,[ADDM J,@(P)]
17914 ADDM J,@1(B) ;DECREMENT COUNT LEFT IN BUFFER
17915 CAIE D,(TT) ;SKIP IF TRANSFERRED ALL WE COULD
17916 PUSHJ P,TPFLT ;TAKE FAULT
17917 SIOKN3: SKIPN @1(B)
17918 PUSHJ P,@3(B) ;BUFFER EXHAUSTED, DISCARD (MAY COME BACK TO LIFE).
17919 JRST SIOKT1 ;TRY AGAIN TO TRANSFER.
17921 SIOKW1: PUSHJ P,UDELAY
17924 SIOKN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
17928 ;COME HERE FOR SLOW (BYTE AT A TIME) SIOT TO BLOCK MODE DEVICE.
17929 ;TT HAS NUMBER OF BYTES TO TRANSFER - IT IS KNOWN THAT THE DEVICE
17930 ;CAN SUPPLY THAT MANY FROM ITS CURRENT BUFFER.
17931 SIOKSL: SUBM C,D ;D GETS SIZE; C HAS # BITS REMAINING TO BE HANDLED
17932 IDIV C,D ;C GETS # BYTES TO XFER TILL REACH WORD BOUNDARY.
17933 MOVE TT,C ;XFER THAT MANY, THEN TRY AGAIN, SO WILL USE FAST MODE.
17935 JRST SIOKSI ;INPUT AND OUTPUT PART HERE
17936 LDB D,[300600,,@(B)] ;BYTE SIZE IN THE BUFFER
17938 IDIV C,D ;D := # EXTRA BITS AT RIGHT END OF WORD
17941 SOS J ;J := MASK FOR THEM
17942 UMOVE C,@-1(P) ;GET COPY OF USER'S B.P. FOR SWAPPING IN PAGES.
17943 SIOKS3: IBP C ;IF NOT FOR THESE 2 INSNS, ILDB MIGHT GET PAGE FAULT
17944 UMOVE (C) ;WHICH WOULD CAUSE EXTRA INCREMENTING OF B.P.
17945 XCTR XBYTE,[ILDB D,@-1(P)] ;FETCH NEXT BYTE,
17948 ANDCAM J,(D) ;TURN OFF EXTRA BITS IN THIS WORD OF BUFFER
17950 XCTR XRW,[SOS @(P)]
17954 SIOKSI: UMOVE C,@-1(P) ;GET COPY OF USER'S B.P., FOR WRITEABILITY TESTING.
17956 XCTR XRW,[MOVES (C)] ;MAKE SURE WE CAN WRITE IN NEXT BYTE.
17957 ILDB D,@(B) ;GET NEXT BYTE FROM DEVICE BUFFER
17958 XCTR XBYTE,[IDPB D,@-1(P)];GIVE IT TO USER.
17959 XCTR XRW,[SOS @(P)] ;UPDATE USER'S COUNT
17960 SOS @1(B) ;AND THE SYSTEM'S COUNT.
17964 ;CONVENIENT EXIT ROUTINE FOR BUFFER-GET ROUTINES.
17965 ;ASSUMES ADDR OF START OF BUFFER IN TT,
17966 ;SIZE (IN WORDS) OF DATA AREA IN J.
17967 ;E SHOULD HAVE WHAT IT HAD WHEN SIOKT WAS CALLED.
17968 SIOBGX: IMULI J,(E)
17970 SIOBG2: MOVEM TT,@(B)
17974 ;BYTE AT A TIME I/O TO BLOCK MODE DEVICE
17975 ;SEE PRECEDING PAGE (SIOKT) FOR COMMENTS ON CALLING SEQUENCE
17976 ;EXCEPT: ON INPUT, VALUE RETURNED IN W, AND C,D HAVE NO SIGNIFICANCE;
17977 ;ON OUTPUT, RH(C) HAS ADDRESS OF ARG, SIGN(C) SET IFF ADDRESS IS EXEC-MODE,
17978 ; AND D HAS NO SIGNIFICANCE.
17981 JRST CHRKTO ;WRITING
17982 JRST CHRKTI ;READING
17984 CHRKTI: SOSGE @1(B) ;DECREMENT ACTIVE CHAR COUNT
17985 JRST CHRKT1 ;GET NEW BUFFER
17986 ILDB W,@(B) ;READ - GET NEXT CHAR
17989 CHRKTO: SKIPGE C ;USED WHEN FILLING OUT BLOCK AT CLOSE, AND ELSEWHERE.
17991 UMOVE J,(C) ;GET CHAR. FROM USER
17992 SOSGE @1(B) ;DECREMENT ACTIVE CHAR COUNT
17993 JRST CHRKT1 ;GET NEW BUFFER
17994 IDPB J,@(B) ;DEPOSIT IN BUFFER
17995 CAIE E,5 ;SKIP IF ASCII
17999 ANDCAM J,(D) ;CLEAR EXTRA BIT
18002 CHRKT1: AOS @1(B) ;COMPENSATE FOR OVER-SOS
18003 PUSHJ P,@3(B) ;GET RID OF THIS BUFFER
18004 SKIPLE J,@1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME
18005 JRST CHRKT ;SPRUNG BACK TO LIFE (LAST BLOCK OF FILE WRITE OVER)
18006 SKIPG 5(B) ;NEED TO WAIT FOR DEVICE?
18008 CHRKN1: SKIPG 5(B) ;HAVE TO WAIT
18009 JRST [ PUSHJ P,UDELAY
18011 XCT 5(B) ;DEVICE WAIT
18014 CHRKF1: PUSHJ P,@2(B) ;GOBBLE NEW BLOCK
18015 JRST CHRKN1 ;NOT READY, WAIT
18018 JRST UNIEOF ;READING PAST EOF IN ASCII MODE.
18019 JRST IOCER2 ;READING PAST EOF IN IMAGE MODE.
18022 ;E HAS BPLH,,# BYTES/WORD OF FILE BYTE SIZE - MUST BE 444400,,1
18023 ;RH(C) = ADDR OF AOBJN POINTER
18024 ; AND 4.9 => AOBJN PTR IS IN EXEC ADDRESS SPACE,
18025 ; 4.8 => BLOCK IT POINTS TO IS IN EXEC ADDRESS SPACE. (INPUT ONLY)
18027 ;0(B) ADDR OF ACTIVE BUFFER BYTE PTR, 4.9=0 => INPUT, =1 => OUTPUT
18028 ;1(B) ADDR OF COUNT OF BYTES REMAINING IN CURRENT BUFFER
18029 ;2(B) ROUTINE TO GET NEXT BUFFER. NO SKIP IF NO MEMORY
18030 ; OTHERWISE SKIP; BUFFER BYTE COUNT IN @1(B)
18031 ; AND BUFFER B.P. IN @(B) ALREADY SET UP.
18032 ; 2 SKIPS => THERE IS NO BUFFER, DUE TO EOF.
18033 ;3(B) ROUTINE TO PUT BUFFER (OUTPUT) OR DISCARD (INPUT)
18034 ; MAY REACTIVATE CURRENT BUFFER BY SETTING @1(B) TO NONZERO.
18036 ;5(B) IF POSITIVE, INSTRUCTION TO WAIT FOR I/O
18037 ; IF NEGATIVE, ROUTINE ASSUMES 2(B) AND 3(B) WILL WAIT
18039 ;RELOADING ROUTINES MUST NOT CLOBBER B,E,A,C,I
18040 ;BLKT CLOBBERS C,D,J,TT, AND WHATEVER THE RELOADING ROUTINES CLOBBER.
18042 ;CODE IS ON NEXT PAGE
18044 BLKT: CAME E,[444400,,1]
18045 BUG ;BLKT CALLED ON UNIT ASCII MODE CHANNEL??
18046 SKIPL C ;SKIP IF POINTER IN USER SPACE
18047 XCTR XRW,[MOVES (C)] ;USER SPACE, MAKE SURE WRITE CYCLE WILL WIN
18052 BLKTNB: PUSHJ P,@3(B) ;"DISCARD" BUFFER
18053 SKIPE @1(B) ;CHECK AMOUNT REMAINING ONE MORE TIME
18054 JRST BLKT1 ;IT SPRUNG BACK TO LIFE (WRITE OVER MODE LAST BLOCK OF FILE)
18055 SKIPG 5(B) ;NEED TO WAIT FOR DEVICE?
18057 BLKTN1: SKIPG 5(B) ;COME HERE IF MUST WAIT FOR SOME REASON OR OTHER
18058 JRST BLKTW1 ;DEVICE CAN'T WAIT SO UDELAY
18059 XCT 5(B) ;DEVICE WAIT
18060 BLKTF: PUSHJ P,UFLS
18062 BLKTF1: PUSHJ P,@2(B) ;NOW GET NEXT BUFFER
18063 JRST BLKTN1 ;HMM, HAVE TO WAIT
18065 POPJ P, ;EOF, TRANSFER FINISHED
18067 BLKT1: SKIPGE C ;SET UP FOR TRANSFER
18068 SKIPA J,(C) ;GET EXEC MODE BLOCK .IOT (AOBJN) POINTER
18069 UMOVE J,(C) ;GET USER MODE AOBJN POINTER
18070 JUMPGE J,CPOPJ ;POINTER COUNTED OUT, TRANSFER DONE
18071 SKIPG D,@1(B) ;CHECK AMOUNT LEFT IN BUFFER
18072 JRST BLKTNB ;NEW BUFFER NEEDED
18074 MOVNS TT ;DESIRED SIZE OF BLOCK
18075 CAMLE TT,D ;AMT OF ROOM LEFT IN CURRENT BUFFER
18076 MOVE TT,D ;TRANSFER ONLY AMT LEFT IN BUFFER
18077 MOVE D,@(B) ;CANONICALIZE THE BUFFER B.P. SO RH => NEXT WORD TO XFER
18079 HRL J,D ;MERGE WITH USER'S BLOCK ADDR TO GET BLT AC.
18081 MOVSS J ;WRITING, SWAP BLT POINTER
18083 ADDI TT,(D) ;1+LAST WORD TO BLT INTO
18085 JRST BLKTN9 ;JUMP IF EXEC AOBJN POINTER
18087 JRST BLKTN6 ;JUMP IF WRITING
18088 XCTRI XBW,[BLT D,-1(TT)] ;READING
18089 BLKTN7: MOVEI D,(TT) ;NO FAULT, UPDATE PTR TO LAST WORD + 1 (LIKE KL10)
18091 HRRZS J ;# WDS ACTUALLY XFERRED
18092 ADDM J,@(B) ;INCR BUFFER PNTR
18093 HRLS J ;PUT # WDS IN BOTH HALVES
18094 JUMPL C,BLKTN3 ;UPDATE AOBJN PTR IN EXEC SPACE
18095 XCTRI XRW,[ADDM J,(C)] ;UPDATE AOBJN PTR IN USER SPACE
18097 BUG ;MUMBLE. THIS WAS SUPPOSED TO BE THERE.
18099 BLKTN4: MOVNI J,(J)
18100 ADDM J,@1(B) ;DECREMENT COUNT LEFT IN BUFFER
18101 CAIE D,(TT) ;SKIP IF TRANSFERRED ALL WE COULD
18102 PUSHJ P,TPFLT ;TAKE FAULT IF ANY
18104 PUSHJ P,@3(B) ;BUFFER EXHAUSTED, "DISCARD"
18105 JRST BLKT1 ;GO TRANSFER ANOTHER CHUNK
18107 BLKTN3: ADDM J,(C) ;UPDATE EXEC AOBJN POINTER
18110 BLKTW1: PUSHJ P,UDELAY
18113 BLKTN6: XCTRI XBR,[BLT D,-1(TT)] ;WRITING TRANSFER
18117 BLKTN9: BLT D,-1(TT) ;READING INTO EXEC SPACE
18120 SUBTTL DIRECTORY AND ERR DEVICES
18122 QMLSTF: MOVEI J,4 ;ENTRY TO GET MASTER 2314 DIRECTORY
18125 QLISTF: MOVEI J,3 ;ENTRY FOR 2314 USER DIRECTORY
18127 LISTFE: PUSHJ P,SWTL ;ENTER HERE FOR ALL KINDS OF DIRECTORIES.
18130 UD1: SKIPGE UDUSR(TT)
18134 PUSHJ P,UDELAY ;DIRECTORY NOT AVAILABLE NOW, WAIT
18137 UD2: MOVEM J,DSKLST(TT)
18143 JUMPG J,UDIF ;JUMP IF NOT UTAPE DIR.
18144 IFE NUNITS, BUG ;HOW DID UTAPE GET HERE?
18152 JRST UDBIN ;IMAGE MODE UTAPE DIR
18153 MOVEI Q,LISTF ;ASCII MODE UTAPE DIR
18155 UDIF1: MOVEM Q,DIRPC(TT)
18160 UDIF: HLRZ Q,UDT-1(J) ;INITIAL COROUTINE PC
18161 HRRZ T,UDT-1(J) ;PLACE TO FINISH OPENING - USUALLY UDIF1.
18164 UQL1: HRRZM H,UUDPP(TT) ;2314 MFD (FROM UDIF)
18170 UQL1A: PUSHJ P,STMSET ;DISK UFD (FROM UDIF). WE CAN STILL PCLSR,
18171 UDUSR(TT) ;ARRANGE TO GIVE BACK THE DIRECTORY CHANNEL.
18174 PUSHJ P,TCALL ;GET A LOW-HALF PAGE TO COPY UFD INTO.
18175 JRST IOMQ ;GET LOW HALF PAGE
18176 JRST UQL1W ;NOT AVAIL NOW
18178 DPB T,[MUR,,MEMBLT(A)] ;MARK THE PAGE AS A UFD COPY.
18184 BLT A,-1(T) ;COPY UFD
18186 PUSHJ P,LSWDEL ;STMSET OF UDUSR.
18188 BUG ;WE ALWAYS GET OUR MAN
18189 PUSHJ P,LSWPOP ;SOS QSNNR
18196 UQL1W: PUSHJ P,QUDULK
18201 ;LH INITIAL PC RH DISP ADR AT OPEN TIME
18202 UDT: NDLF,,UDIF1 ;NON DIR DEVICE
18203 UCL1,,UDIF1 ;CORE LINK
18204 UQL2,,UQL1A ;2314 UFD
18205 QMLS1,,UQL1 ;2314 MFD
18206 ERR1,,ERR2 ;ERR DEVICE
18207 TTYFLD,,UDIF1 ;TTY DIR
18208 TTYF99,,UDIF1 ;COR DIR (LAST LINE OF TTY DIR)
18211 QUDBIN: HRRZ T,QMDRO
18213 UDBIN: MOVEM J,NUM(TT) ;DOESN'T USE DIRPC THIS PC
18221 UTDCLS: MOVE B,DSKLST(A)
18224 UTDCLX: SETOM UDUSR(A)
18234 ;UNIT MODE IOT ON DIR DEVICE COMES HERE (RETURN CHAR IN W)
18235 DIRCH: SETOM SRN3(U) ;SAY WE WANT ONLY 1 CHARACTER.
18242 ;BLOCK MODE IOT ON DIR DEVICE.
18243 DIRB: JSP Q,WRDBT ;PUSHJ'S TO .+1 FOR EACH WORD.
18244 DIRB1: XCTR XRW,[MOVES (C)] ;MAKE SURE WE CAN WRITE.
18247 SETZM SRN3(U) ;SAY WE WANT A WHOLE WORD OF CHARS.
18251 LDB Q,[350700,,SRN3(U)]
18252 CAIN Q,^C ;IF THE WORD STARTS WITH ^C,
18253 JRST POPJ2 ;IT IS EOF; DON'T RETURN IT, UNHANG IOT.
18256 MOVEI Q,DIRB1 ;FASTER THAN PUSHING AND POPPING Q.
18257 POPJ P, ;RETURN INTO WRDBT
18260 DDATAI: MOVEI T,CHRKTI ;UNIT IMAGE INPUT FROM DIRECTORY.
18262 DBLKI: MOVEI T,BLKT ;BLOCK IMAGE INPUT FROM DIRECTORY
18264 JSP B,(T) ;TO BLKT, SIOKT, OR CHRKTI
18267 POPJ2 ;EOF IF TRY TO GET ANOTHER BUFFER
18268 CPOPJ ;BUFFER DISCARD ROUTINE
18272 ;ERR DEVICE AND ERROR MESSAGE TABLES
18273 ; ERR DEVICE WORKS MUCH LIKE DIR DEVICE
18278 ERR2: SOJE A,ERR21 ;LAST ERRONEOUS CHANNEL
18279 SOJE A,ERR22 ;CHANNEL SPECIFIED IN B
18280 SOJE A,ERR23 ;STATUS WORD IN B
18281 SOJE A,ERR24 ;.CALL ERROR ARG IN B
18285 ERR21: LDB B,[BCHPTR]
18290 ERR23: MOVEM B,UUDPP(TT)
18293 CORO: PUSHJ P,FLDRCK
18298 ERR1: SKIPN I,UUDPP(A)
18300 LDB B,[220600,,UUDPP(A)] ;OPEN LOSS FIELD
18304 MOVE TT,ERMST1-1(B)
18306 ERR1B: LDB B,[300300,,UUDPP(A)] ;IDS ERROR FIELD
18308 MOVE TT,ERMST2-1(B)
18310 ERR1C: LDB B,[330400,,UUDPP(A)] ;IOCERR FIELD
18313 CAIL B,NERM1+MIOTER
18314 MOVEI B,NERM1+MIOTER
18315 MOVE TT,ERMST3-MIOTER(B)
18319 ERR3: MOVEI TT,[ASCIZ /ISE0
18324 ;LISP ASSUMES THAT NO "ERR" DEVICE MESSAGE WILL EVER CONTAIN
18325 ; !, #, ^, OR LOWER CASE LETTERS. PLEASE MAINTAIN THIS STATE
18328 ERMST1: [ASCIZ /NO SUCH DEVICE
18330 [ASCIZ /WRONG DIRECTION
18332 [ASCIZ /TOO MANY TRANSLATIONS
18334 [ASCIZ /FILE NOT FOUND
18336 [ASCIZ /DIRECTORY FULL
18338 [ASCIZ /DEVICE FULL
18340 [ASCIZ /DEVICE NOT READY
18342 [ASCIZ /DEVICE NOT AVAILABLE
18344 [ASCIZ /ILLEGAL FILE NAME
18346 [ASCIZ /MODE NOT AVAILABLE
18348 [ASCIZ /FILE ALREADY EXISTS
18350 [ASCIZ /BAD CHANNEL NUMBER
18352 [ASCIZ /TOO MANY ARGUMENTS (CALL)
18354 [ASCIZ /PACK NOT MOUNTED
18356 [ASCIZ /DIRECTORY NOT AVAIL
18358 [ASCIZ /NON-EXISTENT DIRECTORY
18360 [ASCIZ /LOCAL DEVICE ONLY
18362 [ASCIZ /SELF-CONTRADICTORY OPEN
18364 [ASCIZ /FILE LOCKED
18366 [ASCIZ /M.F.D. FULL
18368 [ASCIZ /DEVICE NOT ASSIGNABLE TO THIS PROCESSOR
18370 [ASCIZ /DEVICE WRITE-LOCKED
18372 [ASCIZ /LINK DEPTH EXCEEDED
18374 [ASCIZ /TOO FEW ARGUMENTS (CALL)
18376 [ASCIZ /CAN'T MODIFY JOB
18378 [ASCIZ /CAN'T GET THAT ACCESS TO PAGE
18380 [ASCIZ /MEANINGLESS ARGS
18382 [ASCIZ /WRONG TYPE DEVICE
18384 [ASCIZ /NO SUCH JOB
18386 [ASCIZ /VALID CLEAR OR STORED SET
18388 [ASCIZ /NO CORE AVAILABLE
18390 [ASCIZ /NOT TOP LEVEL
18392 [ASCIZ /OTHER END OF PIPELINE GONE OR NOT OPEN
18394 [ASCIZ /JOB GONE OR GOING AWAY
18396 [ASCIZ /ILLEGAL SYSTEM CALL NAME
18398 [ASCIZ /CHANNEL NOT OPEN
18400 [ASCIZ /INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18402 [ASCIZ /UNRECOGNIZABLE FILE
18404 [ASCIZ /LINK TO NON-EXISTENT FILE
18406 IFN .-ERMST1-NOPNLS,.ERR WRONG TABLE LENGTH
18407 ;ADD NEW MESSAGES HERE
18409 IFN 0,[ A CLASSIFICATION OF OPEN-LOSS MESSAGES
18411 FULL - NO CORE (MMP FULL)
18412 DIR NOT AVAIL (DIR CHNL TABLE FULL)
18416 INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
18418 NO SUCH - DEVICE, FILE, JOB, DIRECTORY, PAGE (CAN'T GET ACCESS)
18419 ILLEGAL SYSTEM CALL NAME
18421 ALREADY ONE SUCH - FILE (FILE ALREADY EXISTS - RENAME)
18423 WRITING - CAN'T MODIFY JOB
18424 DEVICE WRITE-LOCKED
18427 CAN'T GET ACCESS TO PAGE
18429 ARGS (THE PARAMETERS ARE RIDICULOUS) -
18430 SELF-CONTRADICTORY OPEN COMMAND
18438 NOT AVAILABLE (IT EXISTS BUT YOU CAN'T USE IT) -
18440 DEVICE NOT AVAILABLE
18441 NOT ASSIGNABLE TO THIS PROCESSOR
18445 OTHER END OF PIPELINE GONE
18446 JOB GONE OR GOING AWAY
18448 DEPTH - LINK DEPTH EXCEEDED
18449 TOO MANY TRANSLATIONS
18451 OTHER - NOT TOP LEVEL
18452 VALID CLEAR OR STORED SET
18456 [ASCIZ /OPEN TYPE NOT DETERMINED
18459 ERMST2: [ASCIZ /IDS ILLEGAL SCOPE MODE
18461 [ASCIZ /IDS SCOPE HUNG
18463 [ASCIZ /MORE THAN 1K SCOPE BUFFER
18465 [ASCIZ /IDS MEM PROTECT
18467 [ASCIZ /IDS ILLEGAL SCOPE OP
18469 [ASCIZ /IDS MEM PROTECT ON PDL PNTR
18471 [ASCIZ /IDS ILLEGAL PARAMETER SET
18474 ERMST3: [ASCIZ /DEVICE HUNG OR REPORTING NON-DATA ERROR
18476 [ASCIZ /END OF FILE
18478 [ASCIZ /NON-RECOVERABLE DATA ERROR
18480 [ASCIZ /NON-EXISTENT SUB DEVICE
18484 [ASCIZ /OVER IOPUSH
18486 [ASCIZ /USR OP CHNL DOES NOT HAVE USR OPEN
18488 [ASCIZ /CHNL NOT OPEN
18490 [ASCIZ /DEVICE FULL
18492 [ASCIZ /CHNL IN ILLEGAL MODE ON IOT
18494 [ASCIZ /ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY
18496 [ASCIZ /DIRECTORY FULL
18498 [ASCIZ /DIRECTORY'S ALLOCATION EXHAUSTED
18500 ;INSERT NEW MESSAGES HERE
18502 [ASCIZ /IOT OR OPR TYPE NOT DETERMINED
18505 ;DIRECTORY LISTING ROUTINES
18507 UQL3C: SKIPA I,["*]
18512 UQL2: MOVEI TT,[MNAME ASCIZ /, /] ;GENERATE USER DIRECTORY
18516 JSP B,SIXTYC ;SEND DIRECTORY NAME
18521 UQL2A: SKIPGE QACT(E)
18522 JRST UQL3 ;UNIT NOT ENGAGED
18525 JRST UQL3C ;TUT FOR UNIT NOT IN
18533 JSP B,GDPT ;AND # FREE TRACKS
18534 UQL3A: PUSHJ P,OUTCS
18545 UQLP: ADDI Q,2 ;MOVE PNTR TO 3RD WRD OF FILE DESC
18547 MOVEI TT,[ASCIZ /* /] ;DELETED OR BEING WITTEN
18549 MOVEI TT,[ASCIZ / /]
18554 LDB TT,[UNPKN+@DIRPT(A)]
18555 JSP B,GDPT ;PRINT PACK #
18556 LDB TT,[UNPKN+@DIRPT(A)]
18558 UQLL2: PUSHJ P,OUTCS
18560 SUBI Q,2 ;BACK TO FIRST WD
18561 JSP B,SIXTYA ;SEND FIRST FILE NAME
18562 JSP B,SIXTYB ;AND SECOND (AOSES Q)
18564 AOS Q ;SET Q TO POINT TO FILE DESC PNTR
18565 LDB E,[UNDSCP+@DIRPT(A)] ;PICK UP FILE DESC PNTR
18567 ADDI E,UDDESC ;COMPUTE WORD ADDRESS
18568 MOVE I,@DIRPT(A) ;SAVE STATUS WORD
18569 EXCH E,Q ;MOVE INTO PNTR
18572 HLLM TT,DIRPT(A) ;SET UP DIRPT TO POINT TO FILE DESC
18576 UQL5: JSP B,UQL5R ;CHECK IF ABOUT TO INCREMENT OFF WORD
18578 JUMPE I,UQL5A ;STOP
18588 QLL1: CLEARM ENDT(A) ;CNTS TO 3 FOR USER NAME AND 2 FILE NAMES
18589 QLL3: CLEARM NUM(A) ;CHR CNTR
18590 QLLIST: JSP B,UQL5R
18602 QLL2: PUSHJ P,OUTCS
18607 MOVEI Q,3(E) ;ADVANCE Q
18614 UQL5R: MOVE I,DIRPT(A) ;CHECK IF ABOUT TO ILDB OFF WORD
18617 MOVEI I,440600+Q ;YES INCREMENT Q INSTEAD
18621 UQL5B: CAIGE I,UDWPH ;PLACE HOLDER
18622 AOJA TT,UQL5 ;SKIP AND TAKE
18625 REPEAT NXLBYT,[JSP B,UQL5R
18628 AOJA TT,UQL5 ;SPACE OVER 2ND HALF OF LOAD ADDRESS
18630 UQL5A: JSP B,GDPT ;TYPE OUT # BLOCKS
18632 MOVE Q,E ;FILE POINTER
18634 SKIPGE B,@DIRPT(A) ;SKIP ON NOT DUMPED
18636 PUSHJ P,OUTC ;HAS NOT BEEN BACKED UP
18638 TLNN B,UNREAP ;SKIP ON DON'T-REAP
18642 LDB E,[1200,,DIRPT(A)]
18645 AOJE TT,UQL5C ;DATE NOT KNOWN
18646 LDB TT,[UNMON+@DIRPT(A)]
18647 JSP B,GDPT ;TYPE MONTH
18650 LDB TT,[UNDAY+@DIRPT(A)]
18651 JSP B,GDPT ;TYPE DAY
18654 LDB TT,[UNYRB+@DIRPT(A)]
18655 JSP B,GDPT ;TYPE YEAR
18672 UQL5D: JSP B,MESPCR
18673 ADDI Q,2 ;ADVANCE Q
18680 ;GENERATE MFD LISTING
18681 QMLS1: CONO PI,CLKOFF
18693 QMLS3: ADDI Q,LMNBLK
18696 ;DIRECTORY LISTING ROUTINES FOR UTAPE
18699 LISTF: MOVEI Q,220600+Q
18705 LISTF1: MOVEI TT,[ASCIZ /
18710 LISTF4: SKIPE @DIRPT(A)
18715 LISTF8: AOBJN Q,LISTF4
18717 MOVEI TT,[ASCIZ / FREE BLOCKS /]
18721 LISTD2: JSP B,MESPCR
18723 LISTF2: MOVEI I,440600+Q
18727 LISTF6: PUSHJ P,OUTCS
18733 LISTD4: JSP B,MESPCR
18734 LISTF3: AOBJN Q,LISTF2
18737 UCL7: MOVEI I,14 ;END DIR WITH FORMFEED AND EOF CHARS
18742 IFN NUNITS, LISTF5: AOJA Q,LISTF3
18744 ; DIRECTORY LISTING ROUTINES FOR MISC. DEVICES + CORE LINK
18746 NDLF: MOVEI TT,[ASCIZ /
18747 NON-DIRECTORY DEVICE/]
18751 ;DIRECTORY OF CORE LINK DEVICE
18752 UCL1: MOVSI Q,-NCLCH
18753 UCL6: SKIPN CLSYN(Q)
18769 UCL3: MOVEI TT,[ASCIZ /->/]
18780 UCL5A: AOBJN Q,UCL6
18786 MOVEI J,[SIXBIT /CLOSED/]
18787 SIXTYC: HRLI J,440600
18792 ; DIRECTORY LISTING ROUTINES FOR TTY
18794 TTYFLD: MOVEI TT,[ASCIZ /
18795 TTY UNAME JNAME CORE TOTAL IDX
18799 TTYF1: HRRE E,TTYSTS(Q)
18800 AOJE E,TTYF5 ;JUMP IF NOT IN USE
18804 MOVEI I,"D ;"DEVICE"
18809 TTYF11: MOVEI J,UNAME(E)
18821 TTYF3: SKIPE UNAME(B)
18825 TTYF4: ADDI B,LUBLK
18833 JRST [ HRRZ TT,SUPPRO(TT) ? JRST .-1 ]
18837 TTYF5: AOBJN Q,TTYF1
18838 TTYF99: MOVEI TT,[ASCIZ /FREE CORE /]
18843 MOVEI TT,[ASCIZ / OUT /]
18851 SIXTYA: PUSHJ P,OUTCS
18855 SIXTYP: ILDB I,DIRPT(A)
18863 MESP3S: SKIPA TT,[[ASCIZ / /]]
18864 MESPCR: MOVEI TT,[ASCIZ /
18866 MESPNT: HRLI TT,440700
18874 OUTC: SKIPL TT,SRN3(U) ;IF WANT 1 CHAR, RETURN WITH IT, SAVING ACS.
18875 JRST OUTC1 ;IF WANT WHOLE WORD, SEE IF WORD IS FULL.
18876 OUTC2: MOVEM E,SAVE(A)
18883 ADDI TT,(I) ;MERGE THIS CHAR (IN I) INTO WORD BEING ACCUMULATED.
18886 TLNE TT,774000 ;IF THE WORD IS FULL, RETURN TO DIRB.
18888 POPJ P, ;ELSE POPJ FROM OUTC, TO GET MORE CHARS.
18890 ;NUMERIC PRINTOUT ROUTINES FOR FILE DIRECTORIES.
18891 ;ALL CALLED WITH JSP B,. ALL TAKE ARG IN TT.
18893 ;PRINT NUMBER IN TT IN DECIMAL, RIGHT-ADJUSTED IN FOUR COLUMNS.
18894 G4SDPT: CAIL TT,1000.
18895 JRST GDPT ;IF IT NEEDS 4 DIGITS, JUST PRINT IT.
18897 CAIL TT,100. ;ELSE FIGURE OUT HOW MANY LEADING SPACES ARE NEEDED
18901 PUSHJ P,OUTCS ;AND PRINT THAT MANY.
18902 G4SDP2: PUSHJ P,OUTCS
18903 G4SDP1: PUSHJ P,OUTCS
18907 ;PRINT CONTENTS OF TT AS TWO OCTAL DIGITS.
18911 ;PRINT CONTENTS OF TT AS THREE DECIMAL DIGITS.
18912 G3DPT: IDIVI TT,100.
18917 G2DPT: IDIVI TT,10.
18918 G2DPT2: MOVEM I,NUM(A)
18926 ;PRINT ARG IN TT IN DECIMAL USING AS MANY DIGITS AS IT NEEDS.
18930 ;PRINT ARG IN TT IN OCTAL USING AS MANY DIGITS AS NECESSARY.
18950 ;ROUTINE TO CALL A DIRECTORY COROUTINE
18951 DIRCHR: MOVE E,SAVE(A)
18957 BLKPNA: MOVEI J,1(I)
18964 BLKPN2: MOVEI E,440500+I
18966 BLKPN1: ILDB E,DIRPT(A)
18975 BLKPN3: JUMPE J,GDPT
18977 BLKPN4: MOVE E,@DIRPT(A)
18986 UDUSR: REPEAT NUDCH,-1 ;-1 => FREE, ELSE UTAPE # IF UTAPE DIR, ELSE 0.
18987 UDUIND: BLOCK NUDCH ;IF DIR CHANNEL IN USE, HOLDS JOB # OF JOB USING IT.
18989 IRPS X,,DIRPC:DIRPT:NUM:ENDT:SAVB:SAVQ:UDSYSN:UUDPP:SAVE:
18995 DSKLST: BLOCK NUDCH ;0 LISTING UTAPE 1 NON-DIR DEVICE
18996 ;2 CORE LINK 3 2311
18997 ;NO BBLK SINCE VARIABLES ON NEXT PAGE
18999 SUBTTL UTC LEVEL INTERRUPT
19001 ;NO EBLK SINCE VARIABLES ON PREVIOUS PAGE
19003 UTCPDP: -LUTCP,,UTCP-1 ;UTC-LEVEL PDL
19005 UTACS: BLOCK 20 ;UTC-LEVEL AC SAVE
19007 IFE KS10P,[ ; On the KS10 we can take advantage of the Unibus interrupt
19008 ; vectoring scheme to dispatch quicker, so this code was
19009 ; reorganized somewhat.
19013 CONSO PI,1_<7-UTCCHN>
19014 JRST 4,. ;HARDWARE BUG ALLEGEDLY FIXED
19023 JRST PIPOS ;HAS CHNL >1
19031 IFN IMPP,[ ; See if it's an IMP interface interrupt
19037 TRNE TT,IMPLW+IMPHER+IMPERR+IMPOD+IMPID
19041 TRNN TT,70 ;CHECK PIA
19042 JRST UTCB2 ;DO NOT PROCESS IF NO PIA
19043 TRNE TT,FILW+FIDOWN+FIWASD+FIOD+FIID
19053 IFE KA10P, CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS
19061 TRNN TT,10 ;IF BIT IS ON IT IS INTERRUPTING - LET QINT HAVE IT
19067 TRNN TT,%HIDON+%HIATN ;INTERRUPTING HARDWARILY
19068 SKIPGE QGTBZY ;INTERRUPTING SOFTWARILY
19077 TRNN C,100 ;IF NOT JOB DONE
19078 TRZ C,30000 ; THEN DON'T BELIEVE PAR ERR OF EOF
19079 TRNN A,400 ;IF NEXT UNIT NOT ENABLED
19080 TRZ C,2 ;THEN TURN OFF NEXT UNIT FLAG
19081 TRNE C,440302 ; UNIT HUNG, ILLEGAL, BAD TAPE (UGH), LOAD NEXT UNIT, JOB DONE
19083 UTCBK2: SKIPN MGTBZY ; SOFT WARE CALL
19086 IFN NUNITS, JRST UTCB0
19095 MGEX: MOVSI U,UTACS
19103 UTCBRK: 0 ; Still EBLK'ed from previous page...
19109 CONO PI,020000+200_<-UTCCHN> ;BAG-BITING DEC LOSERS
19111 AOSN IMPBZY ;-1 if IMP wants a jump-start
19124 DSKEX: MOVSI U,UTACS
19128 ;;; Interrupt routines that are directly dispatched to by the KS10/Unibus
19129 ;;; interrupt kludge should do JSR UTCSAV as their very first instruction.
19130 ;;; The word before the JSR is expected to contain the interrupted PC.
19131 ;;; They should then exit through DSKEX just like everybody else.
19147 $INSRT SYSJOB ;SYSTEM JOB AND RELATED STUFF
19150 SUBTTL DCHNTB AND DCHNTC
19153 CHSPUR: BLOCK 8 ;NUM OF SPURIOUS INTS PER CH (ZERO = DCHK)
19156 IFE KS10P,[ ; KS10 doesn't even pretend to have devices.
19158 ;***** DCHNTB *****
19159 ;4.9 = KNOWN DEVICE
19161 ;4.7-4.4 PIA 2 SHIFT
19162 ;4.3-4.1 PIA 2 ACTIVE VALUE
19163 ;3.9 = PIA 2 MAY BE ZERO
19165 ;3.7-3.4 PIA 1 SHIFT
19166 ;3.3-3.1 PIA 1 ACTIVE VALUE
19167 ;2.9 = PIA 1 MAY BE ZERO
19168 ;2.8 = ALLOW USER DATAI, BLKI
19170 ;2.6 CONI, CONSO, CONSZ
19172 ;2.4 SPECIAL KL10 DEVICE, BLKI/BLKO ARE DATAI/DATAO TO A SECOND DEVICE REGISTER
19173 ;1.6-1.1=N, IF NON ZERO: IGNORE DEV UNLESS CONI BIT N-1 IS ON
19174 ;(IF DSDEV PRESENT)
19176 ;***** DCHNTC *****
19177 ;4.9 = SUSPICIOUS DEVICE
19178 ;4.8 = FOUND CLOBBERED
19179 ;4.7 = SUSPECTED OF CAUSING SPURIOUS INTS
19180 ;4.6-4.4 = CHANNEL CAUSING INTS ON
19181 ;3.9-3.1 = SUSPICION COUNT
19186 400200+APRCHN,,240000 ;0 APR
19190 400200+APRCHN,,250000 ;0 APR (ALLOW DATAI, "BLKI", CONI)
19191 SETZ 010000 ;4 PI (ALLOW NOTHING)
19200 DCHENT PAG,SETZ 240000 ;ALLOW DATAI, CONI, BUT NOT "BLKI"
19201 DCHENT CCA,SETZ ;ALLOW NOTHING
19202 ;XCTR of some of the instructions for these devices fails to relocate
19203 ;the address to user space, due to bugs in the hardware. Flush 'em.
19204 ; DCHENT TIM,SETZ 250000 ;ALLOW DATAI, "BLKI", CONI
19205 ; DCHENT MTR,[400201,,250000] ;INTERVAL TIMER PIA=1. ALLOW DI,BI,CI
19206 DCHENT TIM,SETZ ;20 ALLOW NOTHING
19207 DCHENT MTR,SETZ ;24 ALLOW NOTHING
19208 DCHENT 30,SETZ ;30 RESERVED
19210 IFN DSDP, DCHENT DSDEV,[REPEAT 2,400200+DSDCHN,,440000] ;20,24
19211 IFN DL10P,[ DCHENT DLB,SETZ 240000 ;60 DL10
19212 DCHENT DLC,[400200+TTYCHN,,240000] ;64 DL10
19214 IFN STKP, DCHENT STK,[400200+LPTCHN,,440000] ;70 STK
19215 IFN PTRP, DCHENT PTP,[400200+PCHCHN,,440000] ;100 PTP
19216 IFN PTRP, DCHENT PTR,[400200+PTRCHN,,440000] ;104 PTR
19217 IFN NOTYS, DCHENT TTY,[400200+TTYCHN,,40000] ;120 TTY
19218 IFN OLPTP, DCHENT OLPT,[400200+LPTCHN,,440000] ;124 OLPT
19219 IFN 340P, DCHENT DIS,[630600+DISCHN+SDCHN_9,,440001] ;130 DIS
19220 IFN E.SP, DCHENT DIS,[400200+DISCHN,,440000] ;130 E&S
19221 IFN KL10P, DCHENT DTE,[400200+IFE PDCLKP,[APRCHN].ELSE [TTYCHN],,240000] ;200 DTE20
19222 IFN RP10P, DCHENT DPC,[400200+DSKCHN,,440000] ;250 DPC
19223 IFN RH10P, DCHENT DSK,[400200+DSKCHN,,040000] ;270 RH10
19226 DCHENT DC,[400000,,440000] ;200 DC
19227 DCHENT UTC,[400200+UTCCHN,,440000] ;210 UTC
19228 DCHENT UTS,[SETZ 40000] ;214 UTS
19231 DCHENT DTC,[630600+UTCCHN+DCCHN_9.,,440000] ;320
19232 DCHENT DTS,[SETZ 40000] ;324
19234 ] ;END OF IFN NUNITS
19236 DCHENT MTC,[400230+MTCCHN,,440001] ;340 MTC
19237 DCHENT MTS,[SETZ 40001] ;344 MTS
19239 IFN MTYP, DCHENT MTY,[400200+TTYCHN,,40000] ;400 MORTON BOX
19240 ;420 SPACEWAR CONSOLES
19241 IFN DMIMP, DCHENT FI,[400230+NETCHN,,400000] ;424 DM IMP HARDWARE
19242 IFN NDAP, DCHENT 454,[400200,,760000] ;454 D/A
19243 IFN KAIMP, DCHENT IMP,[400000,,400001] ;460 AI-KA/ML-KA/MC-KL IMP
19244 ; HARDWARE THIS SAYS IMP
19245 ; HAS NO PIA BECAUSE IT
19247 IFN NLPTP, DCHENT NLPT,[400200+LPTCHN,,440000] ;464 NEW LPT
19248 IFN CH10P, DCHENT CHX,[400200+CHXCHN,,040000] ;470 CHAOSNET
19249 IFE KL10P, DCHENT 500,[400000,,240000] ;500 ML-KA, DM CALENDAR; AI-KA R CLK
19250 IFN KL10P&PDCLKP,DCHENT 500,[400200+APRCHN,,240000] ;500 MC-KL F CLK
19251 IFN ARMP, DCHENT TIPDEV,[400200+TIPBCH,,440000] ;504 ARM TIP BREAK
19252 IFE MCOND AIKA, DCHENT 510,[400000,,360000] ;510 ANOTHER D/A??
19253 ;DOES ANYONE KNOW WHAT DEVICE 510 IS??
19254 IFN RBTCP, DCHENT RBTCON,[400200+TABCHN,,440001] ;514 ROBOT CONSOLE
19255 IFN ARMP, DCHENT 564,[400200,,440000] ;564 ARM TACTILE SENSE
19256 IFN OMXP, DCHENT OMPX,[400200+OMPCHN,,440001] ;570 OMX
19257 IFN IMXP, DCHENT MPX,[SETZ 40001] ;574 IMX
19258 ;Comment this out since the AI-KA one is no longer on the bus
19259 ;IFN TK10P, DCHENT NTY,[400200+TTYCHN,,40000] ;600 NTY
19260 IFN NTYP, DCHENT NTY,[400200+NTYCHN,,40000] ; NTY FOR 11 KLUDGE
19261 IFN DPKPP, DCHENT DPK,[400200+TTYCHN,,40000] ;604 DATAPOINT KLUDGE
19263 DCHENT DC0,[400200+DSKCHN,,40000] ;610 DC0
19264 DCHENT DC1,[400000,,] ;614 DC1
19266 IFN VIDP, DCHENT NVDX,[REPEAT 4,400200+NVDCHN,,440001] ;620-634 BAT
19267 IFN PLTP, DCHENT PLT,[400200+PLTCHN,,440000] ;654 PLT
19268 DCHENT 704,[400000,,440000] ;704 ???
19270 DCHENT CLK1,[400200,,240000] ;710 CLK1
19271 DCHENT CLK2,[SETZ 40000] ;714 CLK2
19276 DCACS: BLOCK 20 ;SAVE ACS
19277 CCSDEV: 0 ;+ => SOME SUSPICIOUS DEVICES
19280 DCHK: 0 ;TO CALL FROM DDT
19292 ;CHECK FOR CLOBBERED DEVS, CALL WITH JSP E,
19293 CHECK: JSP H,DCSTUP
19294 CHECK1: SKIPL TT,DCHNTB(I)
19295 JRST CHECK4 ;UNKNOWN DEVICE
19305 CHECK2: JSP H,DCCONI
19306 TLNN TT,200 ;SKIP IF PI TO TEST
19308 LDB T,[250400,,TT] ;GET SKIP
19312 LDB Q,[220300,,TT] ;GET CHANNEL
19316 CHECK3: LSH TT,-9 ;SHIFT TO PIA2
19319 CHECK5: JUMPN B,CHECKL ;JUMP IF NONZERO AND WRONG
19320 TRNE TT,400000 ;SKIP IF CAN NOT BE ZERO
19321 JRST CHECK3 ;ZERO OK
19324 CHECK4: ADD A,[400,,] ;INCREMENT DEVICE CODE
19327 BUG PAUSE,[BITS ],OCT,C,[MAY BE STUCK ON IN I/O BUS]
19329 SKIPE W ;SKIP IF NO TROUBLE DETECTED
19333 DCSTUP: MOVE A,[CONI B] ;SET UP
19341 SKIPL DCHNTC(I) ;SKIP IF DEVICE ALREADY SUSPICIOUS,SAVES FIRST SUSPICIOUS
19342 HRRM B,DCHNTC(I) ;STORE AWAY CONI
19345 CHECKL: JSP H,DCSAOS
19346 MOVSI T,600000 ;CLOB
19350 DCSAOS: MOVE D,A ;MAKE A CONO
19352 SKIPL T,DCHNTB(I) ;SKIP IF KNOWN DEV
19353 JRST DCSAS2 ;JUST RESET UNKNOWN TO ZERO
19354 TLNE T,200000 ;SKIP IF NO PIA2
19355 TLNE T,400 ;SKIP IF PIA2 CAN NOT BE ZERO
19357 LDB TT,[330300,,T] ;GET PIA2
19358 LDB T,[360400,,T] ;GET PIA2 SHIFT
19360 IOR D,TT ;ADD CORRECT CANNEL TO CONO
19361 MOVE T,DCHNTB(I) ;SKIP IF NO PIA1
19362 DCSAS1: TLNE T,200 ;SKIP IF PIA1 CANNOT BE ZERO
19365 LDB TT,[220300,,T] ;GET P1A 1
19366 LDB T,[250400,,T] ;GET PIA 1 SHIFT
19367 LSH TT,(T) ;OR IN PIA 1
19372 AOS W ;THIS MAY BE THE CAUSE OF OUR TROUBLES
19377 SOJA T,[JRST 4,.+1] ;LOSEY LOSEY
19378 DPB T,[221100,,DCHNTC(I)]
19381 ;CHANNEL IN J SPURIOUS INTERRUPT ON, CALL WITH JSP E,
19390 SPUR2: SKIPGE TT,DCHNTB(I)
19397 DPB J,[360300,,DCHNTC(I)]
19398 SPUR4: ADD A,[400,,]
19408 DEFINE UBINT VEC,-REST
19410 IFN .VEC.&3, .ERR Bogus interrupt vector: VEC
19414 IFG .VEC.-.MAX., .MAX.==.VEC.
19415 IFL .VEC.-.MIN., .ERR Unibus interrupt table lossage.
19419 ;;; Interrupt table for Unibus Q.
19422 .MIN.==53 ; Guess smallest interrupt vector on Unibus Q
19427 UBINT PHVEC, JSR DSKBRK ; RH11 FOR DISK
19432 ;;; Interrupt table for Unibus I.
19435 .MIN.==45 ; Guess smallest interrupt vector on Unibus I
19441 UBINT %TMVEC, JSR MGHBRK ;RH11 FOR TAPE
19446 UBINT 340+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,RB ; DZ receive
19447 UBINT 344+<10*.RPCNT>, CONC JSR DZ,\.RPCNT,XB ; DZ transmit
19451 UBINT %LHVEC, JSR IMPIBK ;IMP Input side break
19452 UBINT %LHVEC+4, JSR IMPOBK ;IMP output side break
19456 UBINT 270, JSR CHXBKH ; Usual Chaosnet vector
19457 UBINT 230, JSR CHXBKH ; Except some interrupt here instead
19462 ;;; Assignment of pages in Unibus pager for DMA devices.
19463 ;;; Note that these pages are 2000 PDP-10 words long (ITS sized) rather
19464 ;;; than 1000 (DEC sized). Each page here thus occupies -two- locations in
19465 ;;; the Unibus pager. There are 32. such pages on each Unibus.
19468 QUBPG==:5 ; Chosen at random.
19472 IUTPG==:5 ;Magtape IO page. well, 5 worked last time
19476 IUIMPG==:6 ;IMP Data transfer page
19481 SUBTTL OVERHEAD METERING ROUTINE
19486 ;TABLE OF OVERHEAD REGIONS. ENTRY IS SIXBITNAME,,PC ? COUNT
19487 0 ;COUNTS STUFF BEFORE FIRST OVHMTR MACRO
19490 0 ;COUNTS USER-MODE PC'S
19493 ;COME HERE ON PI CHANNEL 1 EVERY 39 MILLISECONDS
19498 CONO TIM,060000+3900. ;CLEAR DONE
19499 EXCH T,OVHBRK ;GET PC INTERRUPTED OUT OF
19500 TLNE T,%PSUSR ;ONLY METER IF EXEC MODE
19505 OVHBR1: HRRZ B,OVHTBL(A)
19506 AOBJN A,.+1 ;2-WORD ENTRIES
19507 CAIG B,(T) ;SKIP IF PC LIES IN PREVIOUS REGION
19509 SKIPGE A ;IN CASE T = 777777
19510 AOS OVHTBL-2(A) ;AOS PREVIOUS REGION'S COUNT
19513 OVHBRX: AOS OVHTBL+LOVHTB-1 ;AOS COUNT OF USER-MODE PC's
19519 RDPCST=DATAI 14, ;INSTRUCTIONS FOR PC SAMPLING TABLE
19522 ;TABLE OF OVERHEAD REGIONS. ENTRY IS PC,,SIXBITNAME
19523 OVHTB1: 0,,'LOW ;LOWER FENCE
19525 377777,,'USR ;UPPER FENCE
19527 REPEAT <1_<36.-<.LZ <LOVHTB-1>>>>-LOVHTB, 377777,,-1 ;PAD TO POWER OF TWO SIZE
19531 OVHTB2: BLOCK LOVHTB ;CORRESPONDING COUNTS (LAST IS FOR USER MODE)
19533 OVHCNT: 28. ;COUNTER TO SLOW THINGS DOWN TO CUT OVERHEAD
19535 LOVHPC==100 ;64 SAMPLES SHOULD BE ENOUGH
19536 OVHPCS: BLOCK LOVHPC
19540 ;CALCULATE OVERHEAD USING PC SAMPLE TABLE
19542 OVHCLK: SOSL OVHCNT ;TIME TO DO IT YET?
19543 JRST OVHCL9 ;NO, IGNORE THESE SAMPLES
19544 MOVEI A,28. ;SEE ONLY ONE SAMPLE OUT OF EVERY 29 ON AVERAGE
19545 MOVEM A,OVHCNT ;SO TIME SPENT IN THIS ROUTINE IS NOT EXCESSIVE
19546 RDPCST C ;SEE HOW FULL THE PC SAMPLING TABLE IS
19547 HRLOI C,-OVHPCS-1(C)
19548 EQVI C,OVHPCS ;AOBJN POINTER TO SAMPLES ACTUALLY TAKEN
19549 JUMPGE C,OVHCL9 ;NONE
19550 CAMGE C,[-LOVHPC,,OVHPCS]
19551 JRST OVHCL9 ;BOGUS AOBJN POINTER, MAYBE PCST NOT TURNED ON
19552 OVHCL1: MOVE A,(C) ;NEXT SAMPLED PC
19553 TLNE A,%PSUSR ;ONLY SEARCH TABLE IF EXEC MODE
19554 JRST OVHCL8 ;ALL USER MODE PC'S ARE COUNTED IN LAST BUCKET
19555 HRLO A,A ;-1 IN RH IS GREATER THAN ANY SIXBIT
19556 MOVEI B,1_<35.-<.LZ <LOVHTB-1>>> ;HALF THE SIZE OF THE TABLE
19557 REPEAT <36.-<.LZ <LOVHTB-1>>>,[ ;LOG SEARCH
19558 CAMG A,OVHTB1(B) ;NOT CAMGE BECAUSE OF PADDING AT END
19559 SUBI B,1_<35.-.RPCNT-<.LZ <LOVHTB-1>>>
19560 ADDI B,1_<34.-.RPCNT-<.LZ <LOVHTB-1>>>
19562 LOC .-1 ;OPTIMIZE OUT ADDI B,0
19564 OVHCL8: AOS OVHTB2+LOVHTB-1
19566 OVHCL9: WRPCST [-LOVHPC,,OVHPCS] ;TURN ON / RESTART PC SAMPLING
19570 ;HERE IS A TABLE OF REGISTERED 3-LETTER OVERHEAD REGION CODES
19572 ;ALC - ALLOCATE CORE PAGE FRAME
19573 ;CHx - CHAOSNET STUFF (VARIOUS VALUES OF x)
19574 ;FLT - MISCELLANEOUS FAULTS
19575 ;IMP - ARPANET INTERRUPT (NOT STYNET)
19576 ;LOW - LOW CORE, BEFORE FIRST OVHMTR MACRO & PCS IN UPPER HALF OF EXEC SPACE
19577 ;NET - ALL NETWORKS, ALL PI LEVELS, NOT OTHERWISE ACCOUNTED FOR
19580 ;QIN - DISK INTERRUPT LOW LEVEL
19581 ;QSC - DISK INTERRUPT HIGH LEVEL, DISK SCHEDULER
19582 ;SC1 - SCHEDULER 1 - ENTRY
19583 ;SC2 - SCHEDULER 2 - SEARCH
19584 ;SC3 - SCHEDULER 3 - EXIT
19585 ;SC4 - SCHEDULER 4 - UNSWAPBLOCK
19587 ;SWF - SWAP FIND NEW USER (SWAPOUT SCHEDULER)
19589 ;SWS - SWAP SCHEDULER
19591 ;TTI - TTY INPUT INTERRUPT LEVEL
19592 ;TTO - TTY OUTPUT INTERRUPT LEVEL
19593 ;TTY - MISC TTY CODE
19595 ;UUO - UUO LEVEL, MISCELLANEOUS ROUTINES, AND TOTAL MISCELLANY
19596 ;WS - WORKING SET & SWAP-BLOCK ENTRY CODE
19598 SUBTTL PC LSR TEST FEATURE
19600 ;CALLED BY PCLT MACRO
19611 PCLX: CAIA ;PATCH IN OTHER CHECKS (SHOULD JRST POPUJ TO IGNORE)
19612 MOVE U,USER ;PATCH ROUTINE MAY CLOBBER U
19614 JRST PCLT1 ;FOUND PLACE, CAUSE PCLSR
19617 JRST POPUJ ;NOT MARK (NOT AT RIGHT LOCN)
19618 HRRO U,USER ;4.9 U FLAG
19619 PCLT1: PUSH P,A ;COMPUTE HASH ADR OF RETURNS ON PDL
19623 JUMPL A,PCLT1A ;SYS JOB'S PDL?
19626 MOVEI A,USRPDL(A) ;GET START OF USERS PDL IN A
19638 PCLT2: CAIGE A,-2-3(P)
19640 MOVE A,PCLHT ;COMPUTED HASH
19641 JUMPGE U,PCLT4 ;GOING TO PCLSR HERE, STORE HASH AS MARK FOR NEXT TIME
19645 JRST PCLT6 ;IN HOLD MODE, PCLSR HERE
19646 SETOM PCLNXT ;FOUND MARK, PCLSR NEXT TIME
19652 PCLT4: MOVEM A,PCLHSH ;STORE HASH FOR NEXT TIME
19655 PCLT6: CONO PI,CLKOFF
19658 CAIN B,1 ;DON'T ^Z.
19667 PCLME: PUSHJ P,UFLS
19670 PCLME1: PUSHJ P,PCLSR
19676 JRST 4,. ;TEMP MODIFY END CHECK IF WANT TO WIN FOR SYS JOB
19678 SUBTTL ILLUO NON-RELEVANT SYSTEM CALLS
19720 ANETIM==OPNL1 ;NO SUCH DEVICE ERROR FOR SYMBOLIC SYSTEM CALLS.
19725 ANETAC==CPOPJ ;MAKE OLD UUOS FAIL
19738 ;Here generate the table for the BUG macro. Note that entries for
19739 ;bugs in the initialization code will appear here also! That's
19740 ;why we have the kludgey add 10
19741 BUGTAB: BLOCK LBUGTB+10
19743 0 ;Marks end of table
19746 HSYSCD:: ;HIGHEST SYSTEM CODE
19748 SUBTTL RANDOM STORAGE
19751 SCHHP: SCHHB ;PNTR TO SCHED HIST BUFFER
19752 SCHHB: BLOCK SSCHDB ;SCHED HIST BUFFER
19754 ;4.8 =1 QUANT TERMINATED BY PG FAULT
19755 ;4.7-3.8 LENGTH OF RUN TIME IN 512 USEC UNITS
19756 ; MUST ACCOMODATE 150 MILLISECOND QUANTA
19757 ;3.7-3.1 USER ("NUMERIC INDEX)
19758 ;RH PC QUANT STARTED AT
19761 SWPHTB: BLOCK SWPHTL ;SWAPPING HISTORY TABLE
19762 ;4.9-4.8 EVENT: 0=START LOADING, 1=FINISH LOADING,
19763 ; 2=SWAP OUT, 3=SWAP BLOCK
19764 ;4.7-3.9 WORKING SET SIZE MINUS ONE (0=0)
19765 ;3.8-3.1 USER NUMBER
19767 BLOCK SWPHTL ;CORRESPONDING UTRNTM
19771 PGIHTB: BLOCK PGIHTL ;PAGE-IN HISTORY TABLE
19772 ;4.9 1 IF JOB WAS LOADING
19773 ;4.7-3.9 USER VIRTUAL PAGE NUMBER
19774 ;3.8-3.1 USER NUMBER
19776 BLOCK PGIHTL ;CORRESPONDING UTRNTM
19779 SCHMNY: 0 ;0 DO FULL SCHEDULE, -1 NEXT "SCHEDULE" SHOULD LOOK IN SCHBTB
19780 SCHBNJ: 0 ;NUMBER OF VALID ENTRIES IN SCHBTB
19781 SCHBTB: BLOCK SCHBLN ;RUNNABLE JOB BUFFER
19782 SCHBPR: BLOCK SCHBLN ;PRIORITIES OF THOSE
19783 NSCHOV: 0 ;COUNT OF BUFFER OVERFLOWS
19785 ;TRANSLATION ENTRY _ T
19786 ;TRANLK(T) IS MODE,,NEXT ENTRY
19787 ;MODE IS 0 IF ENTRY ON FREE LIST, ELSE NOT 0, AND
19788 ;BITS 3.1 => INPUT, 3.2 => OUTPUT, 4.9 => ATOMIC TRANSLATION (DON'T RETRANSLATE)
19789 ;NEXT-ENTRY IS -1 FOR NIL, ELSE IDX REL TRAN!X
19790 ;TRANID(T) THRU TRANIS(T) - FROM-NAMES
19791 ;TRANOD(T) THRU TRANOS(T) - TO-NAMES
19793 TRANLK: REPEAT SIOMT,,,.RPCNT-1 ;GENERATE 1ST WDS, LINKED TOGETHER.
19794 TRANID: BLOCK SIOMT
19795 TRANI1: BLOCK SIOMT
19796 TRANI2: BLOCK SIOMT
19797 TRANIS: BLOCK SIOMT
19798 TRANOD: BLOCK SIOMT
19799 TRANO1: BLOCK SIOMT
19800 TRANO2: BLOCK SIOMT
19801 TRANOS: BLOCK SIOMT
19803 TRANFL: SIOMT-1 ;TRANSL ENTRY FREE LIST.
19804 TRNCNT: 0 ;NUM ENTRIES IN USE.
19805 TRNREF: 0 ;NUM. READ-ONLY ACCESSES TO TRANSL LISTS.
19806 TRANSW: -1 ;SWITCH FOR WRITE REF.
19809 IFE SCHBLN, U0P: 0 ;PRIORITY OF BEST USER SO FAR
19811 USER: -1 ;USER # OF CURRENT LOSER
19813 LITM: 0 ;LAST TIME SYS INCREASED CORE
19815 SLGIV: BLOCK 3 ;LOGIN
19817 SETSLC: 0 ;SETLOC VARIABLES
19821 SWUNAM: 0 ;SYS WRITE VARIABLES
19828 DMON: SIXBIT /DRAGON/
19829 -1 ;USER INDEX OF DEMON JOB
19831 NQMFWR: 0 ;COUNT OF FILES WRITTEN ON .MAIL. - FOR MAILER DEMON TO HANG ON.
19833 NXGPFW: 0 ;COUNT OF FILES WRITTEN ON .XGPR. - FOR XGPSPL
19837 ;VARIABLES FOR DEAMON CODE HACK
19840 IFN TTLPTP,TPLFLG: 1 ;FLAG FOR TPL
19842 DMTLL==4 ;LEGNTH OF DEAMON TABLE SLOT
19843 NODEAM==20. ;NUMBER OF SLOTS
19844 DMLNG==NODEAM*DMTLL
19847 0 ;MAIN PROG SWITCH FOR DEMON
19848 REQCNT: 1 ;COUNT OF REQUEST'S FOR SYS JOB
19849 DMTPTR: 0 ;POINTER FOR DEMSIG TO DEM TBL, AN INDEX INTO IT, TAKEN MODULO DMLNG
19850 DMLSEX: -DMLNG,,0 ;POINTER TO DEAMON TABLE AOBJN
19851 DEMCNT: <NODEAM.-1> ;AMOUNT OF SLOTS REMAINING IN THE TABLE
19854 0 ;SLOT FOR NON DEAMON LOAD VIA NUJBST
19856 DMOBLK: SIXBIT / SYS/
19858 0 ;BLOCK USED BY SYSTEM JOB TO CHECK OPEN
19860 ;DEAMON TABLE--CONSISTS OF SLOTS OF FOUR WORDS FOR EACH DEMON
19861 ;WORD 1 CONTAINS ITS SIXIT NAME
19862 ;WORD 2 CONTAINS THE USER INDEX,-1 IF LOADING, 0 IF DOWN
19863 ;WORD 3 2 QUANTITIES IN 18 BIT 2'S COMPLEMENT--
19864 ;LH ALWAYS > = 0, IF 0 ONLY TAKES EXPLICIT REQUESTS IN > 0 A REQUEST
19865 ;RH CONTAINS THE NUMBER OF REQUESTS PENDING FOR THE DEAMON
19866 ;FOR THE DEAMON WILL BE GENERATED EVERY 2 MINUTES
19867 ;WORD 4 CONTAINS THE TIME TILL THE NEXT IMPLICIT REQUEST WILL BE GENERATED.
19870 DMTTBL: SIXBIT /DEMSTR/
19875 BLOCK <NODEAM-1>*DMTLL
19877 TIMOFF: -1 ;TIME SINCE MIDNIGHT IN HALF SECONDS ("TIME IN DSK FORMAT").
19878 QDATE: -1 ;DISK FORMAT DATE: -1 => SYSTEM DOESN'T KNOW DATE, ELSE
19879 ;BITS 3.1-3.5 HAVE DAY OF MONTH, 3.6-3.9 HAVE MONTH OF YEAR,
19880 ;4.1-4.7 HAVE YEAR MOD 100. .
19881 QDATEI: -1 ;-1 => SYSTEM DOESN'T KNOW DATE, ELSE
19882 ;DATE AND TIME THE DATE AND TIME WERE FIRST DETERMINED, IN DSK FORMAT.
19883 PDYTIM: -1 ;TIME SINCE BEGINNING OF YEAR IN HALF-SECONDS (BACKUP TO PDCLK)
19884 FYEAR: 0 ;YEAR (E.G. 1969.)
19885 PDTIME: 0 ;NON-ZERO => OFFSET FOR PDCLK
19886 ;WHEN SUBTRACTED FROM PDCLK DATAI GIVES # PD-UNITS SINCE
19887 ; BEGINNING OF YEAR
19888 ;ONE SECOND = 60. PD-UNITS
19889 ; Also contains similar offset for KS-10 clock in 60ths.
19890 LPDTIM: -1 ;LAST PD CLK TIME, -1 IF PD CLK NOT RUNNING OR JUST PDSET'ED
19892 SUPCOR: 0 ;CONTROLS SYS JOB, SEE SYSDTB, SCOR, ETC
19893 ;EACH BIT REQUESTS ONE FUNCTION IF SET.
19894 SUPCOP: SCLDAT+IFN DEMON,[SCLDMN],,SCRCKS
19895 ;THIS WORD OR'D INTO SUPCOR EVERY SECOND.
19896 SCKPHS: 0 ;USED FOR COUNTING EVERY SECOND 1/2 SECOND CLOCK
19897 ;TO SET SUPCOP BITS EVERY SECOND
19898 SYSITM: 0 ;TIME SYS JOB LAST STARTED WAITING ON SUPCOR
19899 LNETIM: 0 ;TIME AT WHICH NETWORK WAS LAST BROUGHT UP
19900 RSWTIM: 1 ;Time (in DSK format) when last checked system resources.
19902 MXPARS==10. ;MAX # PAR ERRS TO PRINT OUT
19903 PARPG: BLOCK 8 ;STORAGE OF PAGE MAP WHILE HACKING PARITY ERROR CHECK
19904 PARCNT: 0 ;# OF PAR ERROR ENTRIES IN TABLE
19905 PARCON: BLOCK MXPARS ;CONTENTS OF BAD PARITY LOCATIONS
19906 PARADR: BLOCK MXPARS ;ADDRESSES OF BAD PARITY LOCATIONS
19907 PARAND: -1 ;QND OF ALL BAD WORDS
19908 PARIOR: 0 ;IOR OF ALL BAD WORDS
19909 PARAAN: -1 ;AND F ALL BAD ADDRS
19910 PARAOR: 0 ;IOR OF ALL BAD ADDRS
19912 PARPFW: 0 ;PAGE FAIL WORD
19913 PARERA: 0 ;ADDRESS OF PAR ERR
19914 PARWRD: 0 ;BAD DATA
19917 PARRSN: 0 ;0 => PAR ERR PAGE FAULT IN PROG
19918 ;-1 => PAR ERR INTERRUPT; NEEDN'T STOP
19921 PARDIE: 0 ;-1 => FATAL PARITY ERROR
19922 TPLSWP: 0 ;-1 => USE OLP FOR TPL
19924 PDP6UP: 0 ;0 => PDP6 IS DOWN. (AS USUAL)
19928 ECCADR: 1,,777760 ;ECC HISTORY STARTS HERE
19929 ECCLEN==16. ;16 LOCATIONS OF ECC HISTORY
19930 ECCIDX: 0 ;LAST LOCATION ACCESSED
19933 TEN11F: 0 ;0 -> NORMAL
19934 ;-1 -> COMPLETELY IGNORE 10-11 INTERFACE
19935 ; 1 -> RESET 10-11 INTERFACE, OTHERWISE IGNORE
19936 T11ERC: 0 ;COUNT OF CONTROL PAGE RAM ERRORS
19937 T11CCN: 0 ;CORRECT CONTENTS
19938 T11WCN: 0 ;WRONG CONTENTS
19939 T11PG: 0 ;PAGE # INVOLVED
19942 TVBLAD: 17742 ;VIDEO BUFFER TO FLASH WHEN JOB RUNNING (PDP10 VIDEO BUFFER ADDR)
19945 DL10F: -1 ;-1 NORMAL, 0 => 11 DOWN
19946 DL10HC: 0 .SEE TTDLBRK ;NUMBER OF LOOPS WHEN HUNG UP WAITING FOR 11 TO GOBBLE BUFFER
19949 DLSRCH: 0 ;-1 => DON'T RUN ANY USER BUT THE ONE ALREADY RUNNING
19950 ;(UNLESS WE TAKE A PAGE FAULT).
19951 CPDLP: -CPDLL,,LCPDL-1 ;CLOCK PDL POINTER
19952 LCPDL: BLOCK CPDLL ;CLOCK INT LEVEL PDL
19954 CLKBSW: 0 ;READ SWITCHES INTO HERE TO DECIDE WHETHER TO GO TO DDT.
19956 CLROOT: SSLCKB ;CLOCK QUEUE ROOT
19958 SSLCKB: SCLKI ;SLOW CLOCK RQ BLOCK
19959 .+2 .SEE CHA5CK ;OR 15SCLB
19963 CHA5CK: 5*60.-SCLKI ;5-SECOND CLOCK FOR CHAOS NET
19964 15SCLB ;NOTE INITIAL TRIGGERING OF CLOCKS BELOW DELAYED AN EXTRA 5 SECONDS
19968 15SCLB: 15.*60.-SCLKI
19969 .+2 .SEE PRVCLB ;OR VSLCKB
19973 PRVCLB: NPVSEC*60.-15.*60.-SCLKI ;PRIVILEDGED USER VARIABLE CHECK
19978 VSLCKB: 0 ;VERY SLOW CLOCK BLOCK
19979 CLINFB ;CAUSE SLOW CLOCK TICK SOON AFTER SYS COMES UP
19982 CLINFB: 377777,,-1 ;ABOUT 15 YEARS
19987 CCLKB: 0 ;FOR CHESS CLOCK HACK
19994 IINTIC==60. ;# TWO-MINUTE TICKS PER VERY VERY SLOW CLOCK TICK (2 HOURS)
19995 IINCNT: 0 ;# TWO-MINUTE TICKS REMAINING UNTIL NEXT VERY VERY SLOW CLOCK TICK
19999 WHOCLB: 0 ;WHO LINE TIMER
20004 UTTYS: BLOCK MXCZS ;RING BUFFER FOR JOBS TO BE STARTED
20009 PCLDBM: 0 ;.NE. 0 ACTIVATE PC LSR DEBUG MODE
20010 ;1 => ADVANCE PLACE WHERE PCLSR
20011 ;2 => ADVANCE BUT DON'T ^Z.
20013 PCLUSR: -1 ;USER PCLSR MODE ACTIVE FOR
20014 PCLL: 0 ;PLACE WHERE LAST PCLSR TESTED
20015 PCLHSH: 0 ;HASH OF RETURNS ON PDL AT LAST PLACE TRAPPED OUT OF
20016 PCLNXT: -1 ;-1 => FROB NEXT TIME IN ADVANCE MODE
20018 PCLIDX: 0 ;INITIALIZE PCLT TO THIS (SET TO LOOP COUNT IF NECESSARY)
20020 CORRNR: 0 ;LAST USER TO RUN CORE
20021 SJSPG: 0 ;-1 => LAST FREE PG RESERVED FOR SYS JOB; DON'T GIVE IT TO ANYONE ELSE.
20022 UTBFLF: 0 ;-1 SIGNAL TO TRY TO FLUSH I/O BLOCKS
20023 UFDFLF: 0 ;-1 SIGNAL TO TRY TO FLUSH 2311 UFDS
20025 UFLSF: 0 ;FLAG FROM UFLS TO CLKBRK
20026 CLKFL1: 0 ;FLAG COUNTER TO CONTROL CLOCK LEVEL
20027 SCHFLG: 0 ;SCHEDULE TIMER (DIVIDES 60 CPS)
20028 27FCLK: 0 ;-1 IF FAST CLOCK SHOULD CALL TYP27S
20029 SCITM: 0 ;SEE SYSEX, SYSDEC
20031 SYSCKP: -LTSTB,,TSTB ;SYSTEM CHECKSUMS CHECKER POINTER
20032 SYSPDP: -LSYSP,,SYSPDL-1 ;PDL POINTER FOR SYSTEM JOB
20033 SYSPDL: BLOCK LSYSP ;PDL FOR SYS JOB
20034 IFN TPLP,TPLBUF: BLOCK TPLBSZ ;PSEUDO LPT BUFFER - MUST BE ABOVE SUACS
20035 IFN TPLP\DEMON,TPLFNO: SIXBIT /!/ ;UNIQUE TPL FIRST FILE NAME
20036 SJCFF: 0 ;-1 WHEN SYS JOB IN PROCESS OF FLUSHING CORE
20037 ;AVOIDS TIMING ERROR DUE TO HUSRAD NOT REALLY REFLECTING WHAT ITS GOING TO BE
20038 SLSWPR: 0 ;STORE SYS JOB'S LSWPR WHILE HACKING UUOS
20042 IFN TPLP, TPLFN: 2,,(SIXBIT /TPL/)
20044 KLEBCC: 0 ? <1_23.>/<4*25./2> ;EBOX COUNTER CONVERSION TO 4 USEC CONSTANT (FOR 25 MHZ)
20045 ;RESULT IS IN AC+2 AFTER DMUL AC,KLEBCC
20046 KLMBCC:; 1 ? 110000,, ;FOR CONVERTING AN MBOX COUNT TO THE TIME (IN EBOX UNITS)
20047 ;IT SUPPOSEDLY AMOUNTS TO.
20048 ;WE ASSUME 102.5 NANOSEC OD WAITING TIME PER MBOX CYCLE
20049 ;THIS NUMBER IS 102.5/80.
20050 ;DMUL AC,KLMBCC PUTS ANSWER IN AC+1, AC+2
20051 ;WITH BINARY POINT BETWEEN THE WORDS.
20052 0 ? 0 ;M8538 MODIFIED SO EBOX COUNTER CONTINUES TO COUNT
20053 ;DURING MBOX WAIT TIME, SO SET KLMBCC = ZERO.
20056 MTRUSR: -1 ;USER TO WHOM PERF CTR IS ASSIGNED
20057 MTRJOB: -2 ;USER BEING MEASURED BY PERF CTR,
20058 ;OR -1 => NULL JOB, OR -2 => ALL JOBS.
20060 PAEON: 0 ;SELECTED PERF CTR ENABLE WORD
20061 PAEOFF: 0 ;DISABLE THE PERF CTR (WHEN WRONG JOB IS RUNNING)
20062 STPERF: 0 ? 0 ;VALUE OF PERF COUNTER AT START OF QUANTUM
20063 STEBOX: 0 ? 0 ;VALUE OF EBOX COUNTER AT START OF QUANTUM
20064 STMBOX: 0 ? 0 ;VALUE OF MBOX COUNTER AT START OF QUANTUM
20072 IFN NLPTP, NTNLPL: 0 ;NUMBER OF TIMES NLPT LOST PIA
20076 TSTB: REPEAT CKNUM,CONC CK,\.RPCNT,
20079 CKSUMS: BLOCK CKNUM
20080 CKXORS: BLOCK 36. ;XOR OF ALL ADRS IN PURE AREAS IN SYS WITH CORRESP
20082 TCKXOR: BLOCK 36. ;TEST XORS
20085 SYSCLB==SSYSCL_-10.+IFN 1777&SSYSCL,1
20088 AC1PTR: UUOACS ;-> WHERE AC BLOCK 1 IS CURRENTLY LOADED FROM
20091 USRHI: 0 ;HIGHEST LOC USED FOR USER STORAGE
20093 SUBTTL LOCATIONS TO PATCH WHEN DEBUGGING
20095 SYSDBG: 0 ;0 NORMAL TIMESHARING
20096 ;+ GIVE "ITS BEING DEBUGGED" MESSAGE
20097 ;-N ALSO ALLOW ONLY CONSOLE #N AND T00 TO CTRL/Z.
20098 ;-512.*N => ALLOW ONLY HOST N TO TELNET IN.
20099 ;-512.*N+M => ALLOW HOST N AND TTY M.
20100 DMLLDF: -1 ;-1 => START DAEMONS AUTOMATICALLY, 0 DON'T.
20101 IFN DEMON,DMNFLG: 1 ;1 => START DM-STYLE DAEMONS, 0 DON'T.
20103 IFN NETP,NETUSW: 0 ;-1 => DON'T START UP A JOB IN ANSWER TO A CONNECT REQUEST
20104 ;FROM A HOST OTHER THAN OURSELVES
20106 SYSCN: SYSCON ;NUMBER OF TTY TO RECEIVE SYSTEM CONSOLE OUTPUT.
20107 ;-1 TO THROW IT AWAY. YOU CAN CHANGE THIS ANY TIME.
20109 SUPPLG: 0 ;-1 => SUPPRESS LOGIN/LOGOUT MESSAGES ON SYSTEM CONSOLE.
20111 IFE KS10P,[ ; KS has no lights.
20112 MIPGDS: 0 ;-1 => DON'T LIGHT LIGHTS (KA HAS HARDWARE SWITCH, KL NEEDS
20117 USFHLT: 0 ;-1 => HALT ON DISK UNSAFES AND OTHER BAD ERRORS
20118 ;0 => RETRY. NOTE SET POSITIVE FOR 1/2 SECOND AFTER
20119 ; A RETRY TO AVOID LOOPING, DETECT SOLID ERRORS.
20122 .SEE USEHM ;NONZERO => USE HIGH MOBY, ELSE ONLY 256K
20124 .SEE USEMDM ;NONZERO => USE MEDIUM MEMORY AS ADDITIONAL "LOW HALF" PAGES
20127 TT11P: 1 ;0 => PDP11-TTYS ARE NOT IN USE
20128 ;1 => SYSTEM SHOULD INITIALIZE THEM
20129 ;-1 => INITIALIZED AND IN USE
20130 ;TO BRING THE TV'S DOWN, ZEROING TT11P ISN'T ENOUGH
20131 ;EITHER DO WHAT TT11LS DOES, OR JUST SET SCR11D IN SUPCOR
20132 ;(THE LATTER MAY NOT TAKE EFFECT INSTANTLY, HOWEVER)
20133 ;TO BRING THE TV'S UP, JUST SET TT11P TO 1 AND WAIT 2 SECONDS
20136 .SEE IMPUP ;0 UP, -1 DOWN, 1 DOWN AND DON'T TRY TO BRING BACK UP
20138 .SEE TEN11F ;0 UP, -1 TOTALLY DOWN, 1 RESET PLEASE
20140 .SEE DL10F ;0 PDP11 DOWN, -1 UP
20142 .SEE PDP6UP ;0 PDP6 DOWN, -1 UP
20144 .SEE LASTGC ;NAME OF LAST DISK DIRECTORY GARBAGE COLLECTED
20147 SUBTTL SWAPPING ALGORITHM CONTROL SWITCHES
20149 IFE SWPWSP,[ ;THESE AREN'T LOOKED AT IN SWPWSP SYSTEM
20150 ENSWSC: SWBLK ;ENABLE CALLING OF SWSCD FROM 15 SEC CLOCK
20151 ENUPC: 1-SWBLK ;ENABLE USER-PC PAGE OF RUNNING USER NOT BE SWAPPED OUT
20152 ENPZRO: SWBLK ;ENABLE PAGE-ZERO OF RUNNING USER NOT BE SWAPPED OUT
20153 ENSWBK: SWBLK ;ENABLE SWPNX1 TO SWAP BLOCK A USER
20154 ENPVCL: 1-SWBLK ;ENABLE PRVCLK ROUTINE
20155 ENPREE: 1-SWBLK ;ENABLE PREEMPTION ON PAGE SWAP IN (SEE QSWI1)
20156 ENAGE: 1-SWBLK ;ENABLE AGE BITS TO ABORT SWAP OUT IF PAGE IS USED
20158 AGERTE: 8 ;NUMBER OF PAGES TO AGE EACH 1/2 SECOND.
20159 ;IN A 512K SYSTEM, LAP TIME IS ABOUT 200/AGERTE SECONDS.
20161 SUBTTL SYSTEM LOCKS
20163 CIRPSW: -1 ;CIRCULAR POINTER SWITCH
20166 MEMFRZ: -1 ;MEMORY FROZE
20169 CASW: -1 ;CORE ALLOCATE INTERLOCK SWITCH (REQUESTS TO CORE JOB)
20172 SHUTLK: -1 ;LOCK VAR FOR SHUTDN
20173 0 ;USED TO TELL WHO CAUSED SYS DOWN
20175 TREESW: -1 ;LOCK MANIPULATION OF JOB TREE STRUCTURE
20176 0 ;ATTACH, DETACH, DISOWN, REOWN ALL LOCK.
20178 CUSER: -1 ;CORE ALLOCATOR USER
20179 0 ;DUMMY CORE ALOC USE VAR
20181 ARDFSW: -1 ;LOCK VAR FOR .REDEF
20185 DISUSR: -1 ;340 USER
20186 0 ;DUMMY 340 USE VAR
20190 CODUSR: -1 ;CODE SENDER
20195 PLTUSR: -1 ;PLOTTER USER
20200 LPTUSR: -1 ;LINE PRINTER USER
20240 PDPUSR: -1 ;PDP-6 USER
20242 PDPISR: -1 ;PDP6 AS INFERIOR (INTS ON IO CHANNEL)
20243 PDPISE: -1 ;PDP6 USE VAR
20247 TABUSR: -1 ;TABLET USER
20256 TIME: 0 ;TIME SINCE SYSTEM START IN 1/30'THS
20257 SUSRS: 0 ;NUMBER USERS ON SYS
20258 RVVTIM: 0 ;VALUE OF TIME WHEN SYSTEM WAS LAST REVIVED FROM A CRASH
20259 USRRCE: BLOCK NCT+1 ;USER RESOURCE +1 FOR DISOWNED JOBS
20260 SYSRCE: 0 ;SYS JOB RESOURCE
20261 SLOADU: 0 ;100. * <EFFECTIVE # OF COMPETING USERS>, IN FIXED POINT.
20262 RNABLU: 0 ;RUNNABLE USERS
20263 NPGWTU: 0 ;NUMBER OF JOBS CURRENTLY WAITING FOR A PAGE
20264 LOUTIM: 0 ;TOTAL TIME USED BY LOGGED OUT USERS
20265 UMASTER: -1 ;INDEX OF MASTER USER
20266 SWRCE: BLOCK NCT+2 ;SWAP SCHED RESOURCE
20267 SWIPRQ: 0 ;TOTAL # SWAP IN REQUESTS
20268 SHUTDN: 0 ;"TIME" SYS WILL DIE, 0 IF NOT DYING, -1 IF DEAD
20269 DEDTIM: 0 ;TIME TILL DEATH AFTER NEXT CLK QUEUE INT
20270 ; < 0 => SYSTEM ACTUALLY DOWN (CHECKED BY ^Z, NUJBST, %OPLIV JOBS)
20271 DTHTIM: 0 ;TIME SYSTEM DIED
20276 ATRNJN: 0 ;JNAME OF LAST JOB TO DO A .TRANAD OR .TRANDL
20277 ;(SO I CAN SEE IF THEY'RE USED AT ALL).
20280 DZXSPR: 0 ;Count of spurious DZ-11 transmitter interrupts.
20281 DZRSPR: 0 ;Count of spurious DZ-11 receiver interrupts.
20284 NCORRQ: 0 ;NUMBER CORE RQS HERE SO TRANSFERRED TO PEEK
20285 NCBCOM: 0 ;NUMBER CORE BLOCKS COMMITTED TO CORGP
20287 NQDE: BLOCK NQS ;NUMBER OF 2314 DATA ERRORS
20288 NQHE: BLOCK NQS ;NUMBER OF 2314 HARDWARE ERRORS
20289 BLOCK 1 ;NQSE-1 COUNTS SPUR INTS WHILE NO XFER (QSDU -1)
20290 NQSE: BLOCK NQS ;NUMBER OF SPURIOUS 2314 ERROR INTERRUPTS
20291 NQCMPE: BLOCK NQS ;NUMBER OF 2314 READ/COMPARE ERRORS
20292 NQWDE: BLOCK NQS ;# DATA ERRS ON WRITE
20293 NQRDE: BLOCK NQS ;# DATA ERRS ON READS
20294 NIRSWE: 0 ;# IRRCV ERRS ON SWAPPING XFERS
20295 QIRRCV: 0 ;IRRECOVERABLE DISK ERRORS
20296 QIRCBK: 0 ;BLOCK # W/ IRRCV ERROR
20297 QIRUNT: 0 ;UNIT OF ABOVE
20298 NQWRE: 0 ;# WRITE ERRS RCC OK
20299 NQWIRE: 0 ;# WRITE ERRS RCC LOST
20300 NWXFR: 0 ;NUMBER WRITE TRANSFERS (FILE, DIR, ETC.)
20301 NRXFR: 0 ;NUMBER READ
20302 NSWXFR: 0 ;NUMBER WRITE SWAPS
20303 NSRXFR: 0 ;NUMBER READ SWAPS
20305 ;DON'T CHANGE ORDER .SEE MEMTYP
20306 PARERR: 0 ;COUNT OF CORE PARITY ERRORS
20307 NXMERR: 0 ;COUNT OF NXMS
20308 IFE KA10P, BPFERR: 0 ;COUNT OF BAD PAGE FAILS
20309 PARPC: 0 ;PC ON CORE PARITY INTERRUPT
20310 NXMPC: 0 ;PC ON NXM
20311 IFE KA10P, BPFPC: 0 ;PC ON BAD PAGE FAIL
20312 PARUSR: -1 ;USER ON PAR ERR
20313 NXMUSR: -1 ;USER ON NXM
20314 IFE KA10P, BPFUSR: -1 ;USER ON BAD PAGE FAIL
20315 IFE KA10P, BPFPFW: 0 ;PFW ON BAD PAGE FAIL
20318 ECCERR: 0 ;COUNT OF ECC CORRECTED ERRORS LOGGED
20319 ECCERA: 0 ;MEMORY STATUS AND ADDRESS OF MOST RECENT
20320 ECCAND: -1 ;AND OF ALL ERRORS
20321 ECCIOR: 0 ;IOR OF ALL ERRORS
20324 IFN DPKPP, NDPKPE: 0 ;# PARITY ERRS FROM DATAPOINT KLUDGE
20326 SNMPGS: 0 ;SYSTEM, NUMBER OF VIRTUAL USER PAGES
20327 SNSWPG: 0 ;SYS, NUM OF SWAPPED OUT VIR. PGS
20329 USRTM1: 0 ;4USEC TICKS USED BY USERS SINCE LAST (1/2 SEC) UPDATE TO USRTIM
20330 USRTIM: 0 ;TIME USED BY ALL USERS 1 SEC UNITS
20331 NULTM1: 0 ;4USEC TICKS USED BY NULJOB SINCE LAST (1/2 SEC) UPDATE TO NULTM3
20332 NULTM3: 0 ;NUMBER OF SECONDS USED BY NULJOB
20333 NULTIM: 0 ;TIME USED BY NULL JOB (60'THS) - OBSOLETE BUT STILL MAINTAINED
20335 NULEBC: 0 ? 0 ;EBOX COUNT WHEN NULL JOB ENTERED
20336 NULMBC: 0 ? 0 ;MBOX COUNT WHEN NULL JOB ENTERED
20337 NULPRF: 0 ? 0 ;PERF COUNT WHEN NULL JOB ENTERED
20340 PFAILF: 0 ; KL: -1 => ENTRY TO CLOCK LEVEL WAS VIA PFAIL
20342 ; KS: -1 => BOTH CASES
20344 LOSTM1: 0 ;4USEC TICKS LOST SINCE LAST (1/2 SEC) UPDATE TO LOSTIM
20345 LOSTIM: 0 ;SECONDS OF LOST TIME (ALL OTHERWISE RUNNABLE JOBS WAITING FOR PAGES)
20346 IDLTM1: 0 ;4 USEC TICKS IDLE SINCE LAST (1/2 SEC) UPDATE TO IDLTIM
20347 IDLTIM: 0 ;SECONDS OF IDLE TIME (NO JOBS WANT TO RUN)
20348 LOSRCE: 0 ;USRRCE WORD FOR LOST TIME
20349 IDLRCE: 0 ;USRRCE WORD FOR IDLE TIME
20351 UREALT: -1 ;RH=INDEX OF THE REAL TIME USER
20352 ;LH=0=> THIS USER HAS HIGHEST PRIORITY
20353 ;LH>0=> USER NOT IN HIGH PRIORITY PHASE
20354 ;LH<0=> FACILITY IDLE
20355 INFORM [HIGHEST USED]\<.-1>
20356 \fSUBTTL USER VARIABLES
20358 ;ONE COPY FOR EACH PROCEDURE
20359 ;FOR KL AND KS, THIS IS THE UPT
20362 DEFINE KLUPT N,NAME/ ;CHECKS "HARD-WIRED" UPT LOCATIONS
20364 .ERR "NAME" LOST IN UPT
20371 DEFINE KLUPT N,NAME/
20375 IFN KL10P, LOC <.+777>&-1000 ;KL UPT MUST START AT HARDWARE PAGE BOUNDARY
20377 IFN KS10P, LOC <.+7>&-10 ; KS UPT must be 0 mod 8 (see UUOPCW)
20379 USRSTG:: KLUPT 0,;USER PAGE MAP
20381 UPGMP: BLOCK NUVPG/2 ;PAGE MAP STORAGE (PROGRAMS UP TO NUVPG LONG)
20382 ; 2.9-2.8 ACCESS RIGHTS
20383 ; 00 NO ACCESS (BY SOFTWARE CONVENTION, 1.2-1.1
20384 ; HAVE THE "REAL" ACCESS BITS, WHICH MAY BE 00,
20385 ; BUT MAY NOT, E.G. FOR A SWAPPED OUT PAGE).
20387 ; 10 READ/WRITE/FIRST
20389 .SEE PMCSHM ;CACHE BIT
20390 .SEE PMAGEM ;AGE BITS
20391 .SEE PMRCM ;LOW N BITS ARE PHYSICAL CORE PAGE NUMBER (IN 1K PAGES)
20392 UPGCP: BLOCK NUVPG/2 ;CIRCULAR POINTERS (CORRESPONDS 1-1 WITH UPGMP)
20393 ; IF -1, ABSOLUTE PAGE, NOT LINKED. OTHERWISE:
20395 ; 2.8-1.9 USER INDEX
20396 ; 1.8-1.1 PAGE NUMBER IN THAT USER'S UPGCP
20399 ; 2.7-1.1 LINK TO MMP TABLE
20401 ; 2.7-1.1 LINK TO MEM PNT TABLE
20402 UMAPS: 0 ;USER MAP STATUS
20404 UDBR1A==UPGMP ;ADDRESS TO PUT IN DBR1
20405 UDBR2A==UPGMP+<NUVPG/4> ;ADDR FOR DBR2
20406 UPGCPH==UPGCP+<NUVPG/4> ;ADDR OF HIGH HALF OF CIRC PNTRS
20408 TTYTBL: 0 ;TTY ASSIGNED THIS USER OR INDICATION THAT THERE IS NONE
20409 %TBNOT==400000 ;4.9 DOES NOT HAVE TTY NOW
20410 %TBNVR==200000 ;4.8 IF JOB DOESN'T HAVE TTY, OPENS SHOULD FAIL.
20411 %TBINT==100000 ;4.7 IF JOB DOESN'T HAVE TTY, ATTEMPT TO USE TTY SHOULD INTERRUPT.
20412 ;JOB CAN SET BITS 4.8 AND 4.7.
20413 %TBWAT==40000 ;4.6 IF 1, %TBINT AND %TBNVR ARE OVERRIDDEN AND TTY USE ATTEMPTS
20414 ; ALWAYS HANG. SET BY DDT FOR $P, CLEARED BY ^P. ONLY SUPERIOR CAN SET.
20415 %TBDTY==010000 ;4.4 TTY TAKEN FROM --ME--. WHEN GIVEN BACK,
20416 ;DON'T PASS IT ON TO MY INFERIOR.
20417 %TBOUT==004000 ;4.3 ALLOW THIS JOB TO OUTPUT WHETHER OWNS TTY OR NOT
20418 %TBINF==002000 ;4.2 ALLOW MY INFERIORS TO OUTPUT IF THEY HAVE %TBOUT.
20419 %TBOIG==001000 ;4.1 IGNORE MY OUTPUT
20420 %TBIIN==000400 ;3.9 INTERRUPT IF I TRY TO DO INPUT
20421 $TBECL==220600 ;3-6-3.1 # ECHO LINES IF I DONT HAVE DISPLAY
20422 ;RH USER NUM GAVE TTY AWAY TO OR TTY NUM IF HAS IT
20423 %TBCLR==410077 ;CLEAR THESE BITS IN TTYTBL OF A JOB RECEIVING THE TTY
20425 TTSTSV: BLOCK 3 ;JOB'S SAVED TTYST1,TTYST2,TTYSTS, WHEN JOB DOESN'T HAVE THE TTY.
20427 NMPGS: 0 ;NUMBER OF NON-ABSOLUTE PAGES (INCLUDES PURE)
20428 NSWPGS: 0 ;NUMBER SWAPPED OUT PAGES (AOSED FOR EACH USER OF SHARED PAGE SWAPPED OUT)
20429 HUSRAD: 0 ;MEM ADR OF PAGE ABOVE HIGHEST THAT EXISTS (MAX 1,,0)
20430 UPC: 0 ;USER PC STORAGE
20431 LUBTM: 0 ;TIME LAST UNBLOCKED (FOR IDENTIFYING INACTIVE JOBS)
20432 JBI: -1 ;JOB DEVICE INDEX. IF NOT -1, THIS JOB IS A JOB-DEVICE,
20433 ;AND JBI HAS INDEX INTO JOB DEVICE TABLES.
20435 UPGML: ;USER PAGE MAP LOAD (EIGHT WORDS FOR LPM AND SPM INSTRUCTIONS)
20436 IFE KS10P,[ ; KS10 version given below.
20437 UPJPC: 0 ;JPC. KA HAS FAULT ADDRESS IN LH.
20438 IFE KL10P, UPOPC: 0 ;OLD PC FLAGS,,OPC (UNUSED ON KL-10)
20439 UPMAR: 0,,0 ;MAR ADDRESS AND CONDITION
20441 ; 3.3 0=EXEC, 1=USER
20442 ; 3.2-3.1 MAR CONDITION:
20447 ; 2.9-1.1 VIRTUAL ADDRESS
20449 ; 3.9-3.7 ADDRESS BREAK CONDITIONS:
20453 ; 3.6 0=EXEC, 1=USER
20454 ; 3.5-1.1 VIRTUAL ADDRESS
20455 IFE KL10P, UPQUAN: EXPGNG+1,,0 ;F.S. QUAN AND FAULT BITS
20456 IFN KL10P, UPFW: 0 ;PAGE FAIL WORD
20457 IFE KL10P,DBL==100_1
20459 UPDBR1: DBL,,UPGMP ;DBR1
20460 UPDBR2: DBL,,UPGMP+100 ;DBR2
20461 IFE KL10P, UPDBR3: DBL,,EXEUMP ;DBR3
20462 IFE KL10P, UPACP: 1040,,UUOACS ;B KEY,C KEY,,AC POINTER
20466 UPDBR1: UPGMP ; DBR1
20467 UPDBR2: UPGMP+100 ; DBR2
20468 UPQUAN: 0 ; Runtime counter
20469 UPJPC: 0 ; User mode JPC if microcode supports
20470 UPEJPC: 0 ; Exec mode JPC if microcode supports
20473 UPGMLE:: ;END OF PAGE MAP (+1)
20476 KLUPT 420, ;RESERVED UPT 420
20478 KLUPT 421, ;TRAP 1 INSN ;ARITHMETIC OVERFLOW
20479 TR1INS: JSR ILLTRP ;FOR ITS-STYLE INTERRUPT, CONTAINS 0,,%PIARO
20480 KLUPT 422, ;TRAP 2 INSN ;PDL OVERFLOW
20481 TR2INS: JSR ILLTRP ;SYS JOB SHOULDN'T OVERFLOW ;FOR ITS-STYLE, 0,,%PIPDL
20482 KLUPT 423, ;TRAP 3 INSN ;USED FOR ONE-PROCEED
20483 TR3INS: JSR ILLTRP ;SYS JOB SHOULDN'T ONE-PROCEED ;FOR ITS-STYLE, 0,,%PI1PR
20484 KLUPT 424, ;MUUO DEPOSIT LOCATION
20486 MUUODP: 0 .SEE FORTY
20487 KLUPT 425, ;MUUO OLD PC STORAGE
20490 KLUPT 426, ;MUUO PAGING AND CONTEXT WORD
20492 KLUPT 427, ;RESERVED UPT 427
20494 KLUPT 430, ;MUUO NEW PC WORDS
20495 MUUOKN: %PSPCU,,UUOH0 ;FOR OTHER JOBS, MUUOEX (A JRST 4,).
20496 MUUOKT: %PSPCU,,MUUOEX ;NO JOB SHOULD EVER TRAP IN EXEC MODE.
20497 MUUOSN: %PSPCU,,MUUOEX ;NO JOB SHOULD EVER RUN IN SUPERV. STATE.
20498 MUUOST: %PSPCU,,MUUOEX ;..
20499 MUUOCN: %PSPCU,,UUOH0 ;NORMAL UUOS
20500 MUUOCT: %PSPCU,,MUUOTR ;UUOS AS TRAP INSN
20501 MUUOPN: %PSPCU,,UUOH0 ;PUBLIC MODE IDENTICAL TO CONCEALED MODE,
20502 MUUOPT: %PSPCU,,MUUOTR ; ALTHOUGH IT'S A SCREW FOR A LOSER TO BECOME PUBLIC
20503 ] ;END OF IFN KL10P
20506 DEFINE KSUPT UPTNAM
20507 IFN .-USRSTG-<UPTNAM>,[
20508 .ERR UPTNAM lost in UPT
20509 LOC USRSTG+<UPTNAM>
20513 UPFW: 0 ; Saved page fail word from last fault. Copied from EPTPFW
20514 ; at time of fault usually.
20540 MUUOKN: %PSPCU,,UUOH0 ;UUO in Exec mode new PC
20541 ;For other jobs: %PSPCU,,MUUOEX
20543 MUUOKT: %PSPCU,,MUUOEX ;UUO as trap instruction in Exec mode new PC
20545 KSUPT UPT1PO ;PC saved here after one-proceed
20548 KSUPT UPT1PN ;One-proceed sets PC to this
20549 1PRNPC: %PSPCU,,ONEPRO
20552 MUUOCN: %PSPCU,,UUOH0 ;Normal UUO new PC
20555 MUUOCT: %PSPCU,,MUUOTR ;UUO as trap instruction new PC
20562 AC0S: BLOCK 15 ;SWAP OUT AC S
20568 ;KLUPT 500, ;PAGE FAIL WORD STORAGE ;MICROCODE MOD PUTS
20569 ;KLUPT 501, ;PAGE FAIL OLD PC STORAGE ; THESE LOCATIONS IN
20570 ;KLUPT 502, ;PAGE FAIL NEW PC ; THE EPT FOR ITS
20571 ] ;END OF IFN KL10P
20573 UUO:: ;THE FOLLOWING LOCATIONS (UP TO SUEXND) ARE SWAPPED IN & OUT OF
20574 ;UEXIT ETC. WITH THE USER
20575 SUEXIT: JRST 2,@XUUOH ;USER UUO EXIT INS
20576 SCLUSV: MOVEM U,AC17S ;CLOCK U SAVE
20579 SUUOH: 0 ;C(@41) (ABSOLUTE)
20582 SV40: 0 ;C(40) WHEN USER OUT (SEE SWITCH)
20586 SCLCXS: DATAI PAG,CLCX ;CLOCK SAVE OF CONTEXT
20590 IFN <SUEXND-UUO>-<UEXND-UEXIT>, .ERR SUEXIT BLOCK LOST
20593 CLCX: 0 ;SAVED CONTEXT (DATAI PAG,) AT CLKBRK AND PFAIL
20597 KLUPT 504, ;EBOX COUNT
20598 EBOXCT: 0 ? 0 ;NUMBER OF EBOX TICKS (25 MHZ) OVER 2 LEFT 12. THAT EBOX
20600 KLUPT 506, ;CACHE COUNT
20601 MBOXCT: 0 ? 0 ;NUMBER OF MBOX CYCLES REQUESTED BY EBOX FOR THIS USER LEFT 12.
20606 UTIME: 0 ;RH=CLOCK INTERVAL IN 60'THS, LH=COUNT OF TICKS SINCE READ
20607 UTRNTM: 0 ;TOTAL RUN TIME IN 4 MICROSEC UNITS
20608 USIPRQ: 0 ;# SWAPIN REQUESTS
20610 USWST: 0 ;SWAPPING STATUS BITS.
20611 %SW==525252(1) ;IN THE LEFT HALF
20612 %SWDSO==400000 ;4.9 => DESIRED TO BE SWAPPED OUT (MUST BE SIGN BIT).
20613 %SWPGW==200000 ;4.8 => FLSINS IS WAITING FOR A PAGE
20614 %SWBEM==100000 ;4.7 => BEST EFFORT MADE TO SWAP OUT, DON'T LOOK AT JOB AGAIN
20615 %SWRUN==040000 ;4.6 => SWAPPED OUT WHILE RUNNABLE, SO CONSIDER MEM STATUS BEFORE REACTIVATION
20616 ; THIS BIT IS NEVER LOOKED AT.
20617 %SWPCL==020000 ;4.5 => PAGE SWAPPED OUT WHILE BLOCKED IN EXEC MODE
20618 ; SO WHEN FLSINS SKIPS DON'T CLEAR IT BUT PCLSR INSTEAD.
20619 %SWINT==010000 ;4.4 => IF WAITING FOR PAGE, NEED IT TO INTERRUPT
20620 %SWPRV==004000 ;4.3 => "PRIVELEGED USER"
20623 %SWOUT==000400 ;3.9 => JOB IS SWAPPED OUT OR SWAP BLOCKED
20624 %SWSB== 000200 ;3.8 => JOB IS SWAP BLOCKED
20625 %SWLOD==000100 ;3.7 => JOB IS LOADING
20626 ;VALID STATES OF ABOVE 3 BITS: 0=SWAPPED IN, 1=LOADING, 4=SWAPPED OUT, 6=SWAP BLOCKED
20628 UWRKST: 0 ;WORKING SET. 2**18 TIMES SUM(ALL THIS JOB'S PAGES) 1 OVER # SHARERS
20629 ;INCREMENTALLY MAINTAINED WHILE JOB IS LOADING OR SWAPPED IN.
20630 ;NOTE # SHARERS IS IN RH(MMSWP)
20631 USVWRK: 0 ;SAVES UWRKST AS OF LAST TIME SWAPPED IN
20632 USWTIM: 0 ;TIME ENTERED LOADING, SWAPPED OUT, OR SWAP BLOCKED STATE.
20633 ;WHILE SWAPPED IN, HAS THE TIME AT WHICH IT CEASES TO BE PROTECTED
20634 ;AGAINST MEMORY PREEMPTION.
20636 USWPRI: 0 ;JOB SWAP PRIORITY. LOWER NUMBER MEANS MORE LIKELY TO STAY IN
20637 ; AND MORE LIKELY TO COME IN. SEE ALSO SWRCE, WHICH IS SIMILAR.
20638 IFE SWPWSP, ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE PRODUCT
20639 ;OF THE WORKING SET TIMES THE FRACTION OF CPU USED
20640 ;WHICH IS A MEASURE OF MEMORY USE WITH INTERACTIVE JOBS GIVEN AN ADVANTAGE.
20641 IFN SWPWSP, ;THIS IS THE AVERAGE (DECAYS BY 1/2 IN 30 SECONDS) OF THE "ADJUSTED
20642 ;MEMORY USAGE", WHICH IS THE (LOGARITHM OF THE WORKING SET SIZE)
20643 ;MULTIPLIED BY THE SUM OF CPU TIME AND I/O WAIT TIME. ALSO, WHEN
20644 ;A DISOWNED JOB IS SWAPPED OUT, USWPRI IS MULTIPLIED BY 4 TO PREVENT
20645 ;IT FROM COMING BACK IN FOR A WHILE UNLESS THERE IS REALLY NO
20646 ;COMPETITION FOR MEMORY. ALSO, WHEN A SWAPPED-OUT JOB WAKES UP FROM
20647 ;AN I/O WAIT, USWPRI IS DIVIDED BY 2 TO GIVE INTERACTIVE JOBS AN
20648 ;ADVANTAGE. THE SWPWSP SYSTEM DOES NOT CURRENTLY LOOK AT SWRCE.
20650 USWSCD: 0 ;SWAP SCHEDULING WORD 4.9=1 SWAPIN INHIBITED THIS JOB (SWAP BLOCKED)
20651 LTRNTM: 0 ;SAVED RUN TIME FOR PRIV USR
20652 LSIPRQ: 0 ;SAVED SWAP IN REQ FOR PRIV USER
20653 UPGSEC: 0 ;NUMBER OF PAGE FAULTS PER <NPVSEC> RUN TIME SECONDS
20654 LPRVTM: 0 ;LAST TIME PRIV USER
20656 PAGRAN: 0 ;.PAGRANGE. 1ST PG #,,LAST PG # INCLUSIVE RANGE OF PAGES TO BE PAGED AHEAD.
20657 PAGAHD: 0 ;.PAGAHEAD. 0, OR PAGE-AHEAD-DISTANCE,,PAGE-BEHIND-DISTANCE
20659 TRUNTM: 0 ;IF NOT TOP LEVEL, MINUS RUNTIME (4.069 US) ALREADY SENT TO SUPERIOR
20660 ;IF TOP LEVEL, RUNTIME USED BY SUBTREE MINUS TIME SENT TO DEMON ALREADY
20661 TSIPRQ: 0 ;DITTO FOR SWAPIN REQUESTS
20662 UTMPTR: SYSRCE ;POINTER TO RESOURCE WORD FOR THIS LOSER (JTMU FOR TREE)
20663 JTMU: 0 ;REDUCED BY 1/16 EVERY 1/2 SEC
20664 ;INCREMENTED BY TIME RUN IN 4 USEC
20665 ;MAX EQV VAL 1000000/8-1/16X=0
20667 ;AMONG JOBS WITH EQUAL RESOURSE
20668 ;LOWEST JTMU HAS HIGHEST PRIORITY
20670 IOCHNM: REPEAT NIOCHN,0 ;IO CHANNEL ASSIGNMENT
20671 ;RH INDEX INTO IOTTB AND CLSTB
20672 ;LH DEV CHNL AND/OR OTHER
20673 SIOCHN: BLOCK LUIOP ;MUST FOLLOW IOCHNM
20675 SIOCP: SIOCHN-1 ;POINTER INTO I/O CHANNEL PDL
20676 IOCHST: BLOCK NIOCHN ;I/O CHANNEL STATUS FOR CH'S AT IOCHNM
20678 ;1.1-2.9 .ACCESS POINTER
20680 CORRQ: -1 ;RQ TO CORE JOB
20682 ;4.8=0 OLD TYPE RQ,1.1-1.9 # BLKS,3.1-3.8=USR NUMBER RQ'ED FOR
20684 ;4.3 ADD FRESH BLOCK (IGNORE 4.2,4.1)
20685 ;4.1=1=> ADDING ABSOLUTE BLOCK
20686 ;3.9=1=>REQUEST WRITE ABILITY
20687 ;2.9=1 INSERT, =0 DELETE ONLY IGNORE 4.1-4.3
20688 ;2.1-2.8 VIRTUAL PAGE AFFECTED
20689 ;1.1-1.9 USER RQ IS FOR
20691 APRC: APRCHN ;R.H. CONO TO APR WHEN USER STARTS (HAS AR OV ENABLE, ETC.)
20692 ;4.9=1=> PROCEDURE IS IN A DISOWNED TREE
20693 BUMRTL==100000 ;4.7 => GUN TREE IF HASN'T RUN FOR AN HOUR
20694 ;(MEANINGFUL ONLY IN TOP LEVEL JOB).
20695 ;CLEARED BY REOWNING OR ATTACHING.
20696 BUSRCR==40000 ;4.6 CORE RQ PENDING ON THIS JOB
20697 BULGO==20000 .SEE SYSGUN ;USER IS DISABLED, WAITING TO BE FLUSHED BY SYS JOB.
20698 BCHPTR==330400,,APRC(U) ;4.1-4.4 LAST CH ON WHICH AN ERR OCCURED (SEE ERR DEV)
20699 BULGOS==400 ;AN ATTEMPT IS BEING MADE TO DELETE OR LOG OUT THIS JOB
20700 ;SO NO-ONE ELSE SHOULD START TO. THIS BIT ALSO LOCKS OUT
20701 ;MOST WAYS OF HACKING THE JOB (INCL. THOSE THAT SET DIELOK).
20702 ;3.1-3.5 MUST BE ZERO
20704 DIELOK: 0 ;NUMBER OF JOBS LOOKING AT OR HACKING THIS JOB.
20705 ;BEFORE KILLING A JOB, WAIT FOR ITS DIELOK TO BECOME 0.
20707 USTP: 0 ;0 RUNNABLE, (IS SET NON ZERO FOR IDLE SETS OF VARS TO SPEED SEARCH)
20709 %USTCM==400000 ;CORE BEING SHUFFLED (SHOULD ACTUALLY BE OBSOLETE).
20710 %USTCJ==200000 ;CORE BEING GIVEN BY CORE JOB.
20711 %USTSP==100000 ;STOPPED BY SUPERIOR
20712 %USTCG==40000 ;STOPPED BY SUPERIOR TO GIVE IT CORE (CORBLK, OR .USET OF .MEMT).
20714 BCSTOP==400000 ;BIT IN USTP FOR CORE MOVAGE
20715 BUCSTP==200000 ;CORE STOPPING LOSER TO GIVE MORE CORE RQSTED BY ANOTHER LOSER
20716 BUSRC==100000 ;USER CONTROL BIT, SET & CLEARED BY SUPERIOR PROCEDURE
20717 BSSTP==40000 ;SET BY SUPERIOR WHEN HACKING MEM BOUND AT URMEMT OR UMEMEX
20718 ;1.1-2.9 ;USED BY UBO AND FRIENDS INHIBITS RELOCATION BY CORE ALLOCATOR
20719 ;MUST BE MODIFIED WITH CLKOFF MUST NOT BE SET IF CSTOP IS SET
20720 ;IS A COUNTER OF TRANSIENT REASONS FOR PROCEDURE BEING STOPPED
20722 PIRQC: 0 ;INT REQ AWAITING SERVICE (SOFTWARE INTS EFFECTED BY SEARCH)
20723 MSKST: 0 ;INT MASK REGISTER FOR BITS IN PIRQC
20724 IFPIR: 0 ;SECOND WORD OF INTERRUPT REQUESTS
20725 ;3.8-3.1 INF PROC INT
20726 ;2.7-1.1 IO CHANNEL INT
20728 MSKST2: 0 ;INT MASK FOR IFPIR
20729 IDF1: 0 ;DEFER BITS FOR 1ST WD INTERRUPTS.
20730 IDF2: 0 ;FOR 2ND WORD INTERRUPTS.
20731 ;IF AN INTERRUPT IS DEFERRED, IT IS TREATED AS
20732 ;IF THE JOB'S PICLR VAR HELD 0.
20733 PICLR: 0 ;INT IN PROGRESS FLAG, -1=>ENABLED, 0=>IN PROGRESS
20735 SUPPRO: 0 ;-1 => TOP LEVEL PROCEDURE
20736 ;OTHERWISE: INT BIT,,PNTR TO SUPERIOR PROCEDURE
20738 FLSINS: 0 ;USER BLOCKING INSTRUCTION; STATE:
20739 ; 0 => RUNABLE (UNLESS USTP .NE. 0)
20740 ; OTHERWISE HUNG, IF NO SKIP SAFE TO RESTART AT UUO (UNLESS UFINAL .NE. 0)
20741 RPCL: 0 ;0,,N RPCLSR'ING N
20742 ;-1,,N BEING RPCLSR'ED BY N
20744 UNAME: 0 ;USER NAME
20745 ;THIS WORD FOR EACH PROCEDURE IS COPIED FROM THE UNAME OF THE PROCEDURE
20746 ;THAT CREATES IT (SEE USR DEV). FOR AN INITIAL TOP LEVEL PROCEDURE IT
20747 ;IS INITIALLY -1 BUT IS MODIFIED BY ALOGIN. IT IS THE SAME FOR ALL
20748 ;PROCEDURES IN A TREE.
20750 ;EACH LOGGED IN PROCEDURE HAS A UNIQUE UNAME, JNAME PAIR. THE JNAME
20751 ;OF AN INITIAL TOP LEVEL JOB IS "HACTRN". FOR OTHER JOBS IT IS THE SECOND
20752 ;FILE NAME SPECIFIED IN THE .OPEN ON THE USR DEVICE THAT CREATES THEM.
20753 USYSNM: 0 ;USER SYSTEM NAME
20754 ;THIS VARIABLE IS INITIALLY SET TO THE SAME VALUE AS UNAME FOR
20755 ;A PROCEDURE. IT CAN BE READ OR WRITTEN BY THE PROCEDURE (ASUSET)
20756 ;OR BY ITS SUPERIOR (AUSET). ITS ONLY USE IS AS THE DEFAULT THIRD FILE NAME ON
20757 ;USER SHARED DEVICES (2311'S (SEE QSKO), AND CORE
20759 USYSN1: 0 ;3RD NAME FOR QSKO, CLOO (AFTER DEFAULTING AND TRANSLATION)
20760 HSNAME: 0 ;HOME SNAME
20762 IOTLSR: 0 ;4.9 IOT USER MOD (=1 ENABLES USER TO DO DIRECT I/O
20764 ;RH VIRTUAL PAGE # OF LAST MPV, WIRO OR NXI (SHIFTED TO
20766 UMARPC: 0 ;PC AT MAR INTERRUPT
20767 LSWPR: 0 ;LOCKED SWITCH POINTER
20768 UCLBLK: 0 ;CLOCK QUEUE BLOCK
20771 URTIME: 0 ;LH=0=>LOW PRIORITY PHASE 1=> LOW PRIORITY WITH BLOCKING
20772 ;LH=-1=>HIGH PRIORITY PHASE 2=> HIGH PRIORITY WITH BLOCKING
20773 ;RH=LENGTH OF HIGH PRIOITY IN 60'THS
20774 RTIMER: -1 ;POSITIVE => MICROSEC RUNTIME TILL RUNTIME INT
20776 LSPCL: 0 ;UPC AT LAST PCLSR,,DIFFERENT UPC AT PREVIOUS PCLSR
20777 LEXFDR: 0 ;DEBUGGING INFO FOR PAGE FAULTS WHICH SIGNAL AN INTERRUPT
20779 ;LH FAULT BITS OF LAST SUCH FAULT
20780 ;RH PC OF LAST SUCH FAULT THAT WAS FROM EXEC MODE (WENT TO
20782 ;PAGE FAULTS WHICH JUST SWAP IN A PAGE DON'T SET THIS.
20783 LSUUO: 0 ;LAST SYS UUO (FOR DEBUGGING PURPOSE)
20784 LSCALL: 0 ;SIXBIT NAME OF LAST .CALL 0, (FOR PEEK)
20785 CTLBTS: 0 ;CTL BITS TO .CALL 0, XORED TOGETHER IN HERE (RIGHT HALF)
20786 SYSCVL: 0 ;CONTROLS OUTPUT ARGS FROM SYSTEM .CALL
20788 %SCVOT==400000 ;4.9 CALL HAS OUTPUT ARGS FLAG (TO SAVE TIME)
20789 %SCVER==200000 ;4.8 CALL HAS ERROR CODE ARG FLAG
20790 ;3.6-4.7 UNUSED 3.1-3.5 MUST BE ZERO
20791 ;1.1-2.9 ADDRESS OF ERROR CODE ARG
20792 IOTBTS: 0 ;DEVICE-INDEPENDENT IOT CONTROL BITS GO HERE, IN IOT AND SIOT
20793 USTYN: 0 ;TTY NO OF THE STY WHICH THIS JOB KNOWS AS "STY:" (WITHOUT
20795 UUAC: 0 ;AC FLD OF LAST UUO OR DESIRED CHANNEL IN CASE OF NOPEN ETC
20796 ;SELECTS CHNL FOR ALL IOTS, OPENS ETC
20797 ;LH -1 IF STORED BY CHNDCD, ELSE ZERO (SEE WHO LINE ROUTINES)
20798 TRMNAM: 0 ;TERMINAL IDENTIFICATION
20799 TRNLST: 0 ;TRANSL LIST FOR THIS JOB. -1 => NIL, OR IDX INTO TRAN!X
20800 TRNLS1: 0 ;TRANSL LIST FOR THIS JOB & INFERS.
20801 UTRAPM:: ;SIGN BIT OF OPTIONS IS UUO-TRAP-TO-SUPERIOR MODE
20802 OPTION: 0 ;OPTIONS WORD, SETTABLE BY USER
20803 ;EACH BIT CONTROLS SOME SYSTEM ACTION FOR THIS JOB
20805 XUNAME: 0 ;"WHO I REALLY AM" AS OPPOSED TO "WHO I AM LOGGED IN AS"
20806 XJNAME: 0 ;JOB NAME USER SPEC'ED AS OPPOSED TO UNIQUIZED VERSION
20808 40ADDR: 20,,40 ;RH=ADDRESS OF USER'S 6-WORD BLOCK FOR UUO'S, INTS, SWITCHES, LOCKING.
20809 ;LH=ADDRESS OF USER'S 20-WORD BLOCK FOR SUPERIOR'S USE. 0=20.
20811 TVCREG: -1 ;TV CONSOLE REG FOR THIS USER OF -1 NONE
20812 TVVBN: -1 ;-1 OR CONSOLE REG FOR RUN BLINKING
20813 NVDBA: 0 ;# VIDEO BUFFERS ASSIGNED (WITH NVDBA SYSTEM CALL).
20815 UWHO1: 0 ;WHOLINE FLAGS
20816 UWHO2: 0 ;TWO HALFWORDS, PRINTING CONTROLLED BY UWHO1 4.9-3.3
20817 UWHO3: 0 ;TWO MORE HALF WORDS, CONTROLLED BY UWHO1 3.2-1.5
20819 ULSPBR: 0 ;STBR,,GCSTBR FOR SPECIAL LISP INSTRUCTIONS
20821 SERVER: -1 ;User index of server job who is allowed write access to
20822 ; this job to implement some oddball protocol. -1 if none.
20823 ;INSERT NEW USER VARIABLES HERE^
20825 USRPDL: -LUPDL,,UPDL-1 ;USER PDL
20826 UPDL: BLOCK LUPDL-1
20827 EPDL2: 0 ;SAVES C(T) FOR FLSINS
20829 VALUE:: ;PROCEDURE "VALUE" RETURN
20830 SRN3: 0 ;SAVED N3, N4 FOR RENAMES AT AOPEN ALSO USER INDEX AT NLOAD
20831 ;SRN3, SRN4 USED BY CORBLK .CALL
20832 .SEE IODCS2 ;SRN3 contains saved user mode PC for unlocking own locks.
20833 .SEE ALOGO4 ;NO CLOSE ROUTINE MAY USE SRN4 OR SRN5
20834 SRN4: 0 ;ALSO DEVICE CHNL IOCHNM POINTER AT NLOAD
20835 SRN5: 0 ;SAVED N5 FOR LINK ALSO VIRTUAL PAGE NUMBER AT NLOAD
20836 EPDL3: 0 ;USED BY 2311 ROUTINES (QFNG) ALSO QSMDN ADDR AT NLOAD ALSO BY TYOW2
20837 .SEE ALOGO4 ;NO CLOSE ROUTINE MAY USE EPDL
20838 ;FOR BP-STYLE RENAME, RENMWO AND MLINK,
20839 ;HOLDS BP (OR BP BLK PTR) TO NAMES TO RENAME OR LINK TO.
20840 EPDL: 0 ;USED BY 2311 ROUTINES.
20841 ;FOR SOPEN AND BP-STYLE RENAME, DELETE, HOLDS BP OR BP BLOCK PTR.
20842 EPDLT1: 0 ;FN1 BEFORE LAST TRANSLATION, USED BY NLOAD
20843 EPDLT2: 0 ;FN2 " " " , USED BY NLOAD
20844 EPDLT3: 0 ;SYS NAME " " "
20845 EPDLT4: 0 ;LEFT ADJ DEVICE NAME " " "
20847 STTYOP: 0 ;IN THE TOP OF A DETACHED TREE, THIS CONTAINS THE SAVED USER TTY
20848 ; OPTIONS. 2.9=1 IF IT IS VALID, 2.7-2.8 ARE QUERY AND REFUSE MODE,
20849 ; THE REST ARE TTYOPT BITS.
20851 IFN 0,[ ;FAKE OUT @
20855 CONC LSWB,\.RPCNT,: BLOCK 2
20856 ] ;SWITCH BLOCK FORMAT
20857 ;WD1 ASSOCIATED ADDRESS OR QUANTITY
20858 ;3.6-3.1 USER NUMBER OF SWITCH HOLDER
20859 ;2.9-1.1 PNTR TO NEXT SWITCH ON LIST OR 0 IF NONE
20860 ;FOR REMAINDER OF FORMAT SEE LSWDIS
20863 IFGE USRSTG+1000-., INFORM SPACE LEFT IN UPT,\1000-<.-USRSTG>
20864 IFL USRSTG+1000-., .ERR USER VARS TOO BIG FOR UPT!
20865 .ELSE LOC USRSTG+1000
20868 IFN KS10P, LOC <.+7>&-10 ; KS UPT must be 0 mod 8 (see UUOPCW)
20872 INFORM [STORAGE PER LOSER]\LUBLK
20873 BLOCK LUBLK ;USER VARIABLES FOR CORE JOB
20874 SYSB==<1777+.>_-10.
20875 MXC==SYSUSB-SYSB ;AVAIL BLOCKS AFTER SYS+DDT
20877 \fSUBTTL TSS INITIALIZATION
20878 ;NEXT LINE COMMENTED OUT BECAUSE IT CAUSES MORE TROUBLE THAN IT SAVES
20879 ;.HKALL==1 ;(THE FOLLOWING CODE IS WIPED OUT AT ICLR)
20880 EXEUMP=UPGMP+100 ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S PAGE TABLE
20881 ;SYMBOL IS DEFINED HERE SINCE UPGMP WAS JUST DEFINED 6 PGS AGO
20883 BEG: SKIPN SALV ;SEE IF LOSER FORGOT TO LOAD SALV WHEN BUILDING SYSTEM,
20884 ;OR SALV MEM IS NXM. EVIL! EVIL!
20885 BUG AWFUL,[HEY! WHERE'S THE SALVAGER?]
20886 JSR SALV+1 ;CALL NO-QUESTIONS-ASKED SALVAGER
20889 JFCL 1,[JRST 4,.] ;SYSTEM WONT RUN ON 6
20892 SWPIA ;IF CACHE OFF, FLUSH CRUFT THAT MAY BE IN IT
20894 SWPUA ;IF CACHE ON, UPDATE CORE SO DDT IS GOOD
20897 SPCCTX 0,1,USRSTG,DISABLE ;SET UP UPT ADDR, BUT NO ACCTING TILL
20898 MOVEI T,0 ;MORE INIT IS DONE.
20899 XCTR XBW,[BLT T,17] ;CLEAR BLK 1 TO AVOID RANDOM PARITY
20903 CONO 20700+APRCHN ; Clear memory related APR flags
20905 MOVSI TT,%KEHLD+%KEREF+%KEPWR
20906 IOWR TT,[KSECCS] ; Reset memory status register.
20907 MOVEI TT,%UBTIM+%UBBAD+%UBPAR+%UBNXD+%UBINI
20908 IOWRQ TT,UBASTA ; Reset both Unibus's and both adaptors.
20910 MOVEI TT,DSKCHN_3 ; Set PI level for RH11. (No, you can't do
20911 IOWRQ TT,UBASTA ; this at the same time you reset the Unibus.)
20912 MOVEI TT,MTCCHN_3+TTYCHN ; PI for Tape, for Chaos and TTYs.
20914 WRHSB [HSB] ; Set halt status block location.
20915 CLRCSH ; Reset cache once for good measure.
20916 SPCCTX 0,1,USRSTG ; Set up UPT and AC blocks.
20919 MOVEI TT,600000+<T11CPA_-10.>
20922 DPB TT,[.T11CP+EXEUMP]
20923 SETOM T11MP+<T11CPA&777777>_-10. ;DONT USE MAP PAGE AS 10-11 PAGE
20924 ;IFN PDP6P,[ ;THESE ARE IN SEPARATE MOBIES NOW
20925 ; MOVE TT,[-LPDP6M,,<PDP6BM&777777>_-10.]
20926 ; SETOM T11MP(TT) ;CONFLICTS WITH PDP-6 MEM
20930 ; MOVSI TT,-TSYSM+256.
20931 ; SETOM T11MP(TT) ;CONFLICT PAGES
20937 ;INIT THE EXEC PAGE MAP'S DDT PAGES.
20938 HRRZ A,DDT-2 ;LOWEST ADDR IN SYMBOL TABLE
20939 SUBI A,100 ;LEAVE ROOM FOR EXTRA SYMS, 340 ROUTINES' LOSSAGE, ETC.
20940 LSH A,-10. ;GET PAGE SYMTAB STARTS IN
20942 MOVEI Q,NQS-1 ;PUT THE TUTS JUST BELOW THE DDT PAGES
20943 BEGTT1: SKIPE QACT(Q)
20944 JRST BEGTT3 ;UNIT NOT IN USE
20945 MOVE T,NTBL(Q) ;NUMBER OF PAGES IN THIS TUT
20947 MOVE B,[MU23TT_<.TZ .BM <MUR>>]
20949 DPB Q,[MNUMB,,MEMBLT(A)]
20955 BEGTT3: SOJGE Q,BEGTT1
20957 ;NOW MAKE SURE ALL THOSE PAGES ARE MAPPED
20958 MOVEI B,-200(A) ;ASSUMING TSYSM AT LEAST 128K
20959 LSH B,-1 ;GET A B.P. TO IDPB MAP HWD OF 1ST DDT PAGE
20960 ADD B,[442200,,EXEUMP]
20963 MOVEI C,600000+PMCSHM(A) ;COMPUTE CONTENTS OF THAT MAP WORD.
20964 MOVE D,[MUDDT_<.TZ .BM <MUR>>]
20965 BEG3: CAML A,FDDTPG
20967 IFG TSYSM-128., IDPB C,B
20969 IFG TSYSM-400, CAIE A,400
20970 .ELSE CAIE A,TSYSM ;STORE THAT MAP WORD AND ALL REST THERE ARE.
20973 ;INITIALIZE REST OF EXEC PAGE MAP
20975 MOVE Q,[222200,,EXEUMP]
20977 SKIPE USEMDM ;MAKE MEDIUM MEM NXM IF DIRMAP NOT TURNED ON
20978 MOVEI B,600200+PMCSHM ;THIS MAY BE USEFUL FOR DEBUGGING
20980 SUBI T,201 ;STOP AT 1ST TUT PAGE.
20981 BEG2: CAIL A,NEXPGS
20991 ;SET UP EXEC LOWER MAP (EVEN ON KA, WILL BE LOOKED AT BY .CALL CORBLK)
20992 MOVE A,[600000,,600001+PMCSHM] ;PAGE 0 IS NOT CACHED
20999 ;SET UP SYS JOB'S CIRCULAR POINTERS SO ALL THE PAGES IT HAS ARE ABSOLUTE
21001 MOVE A,[442200,,UPGMP]
21002 MOVE B,[442200,,UPGCP]
21007 CAIL D,200+MMP0 ;ALLOW USERS TO COPY MMP EXEC PGS
21009 MOVEI E,0 ;PG IT DOESN'T HAVE, AND NOT COPYABLE EXEC PG
21014 ;EXEC MAP PREPARED, NOW TURN ON PAGING
21021 CONO 67760 ; Disable and Clear all flags
21022 CONO 127660 ; Enable and Clear all flags except memory ECC
21025 BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21026 LDBR3 EXEUMP ; Load exec DBRs.
21029 SPCCTX 1,1,USRSTG ; Select AC blocks and set UBR.
21030 WREBR 020000+<EPT/1000> ; Paging on and set EBR.
21033 CONO 327740 ;ENABLE AND CLEAR ALL FLAGS EXCEPT SWEEP DONE
21036 BUG AWFUL,[ITS WON'T RUN WITH THE DEC MICROCODE]
21037 SPCCTX 6,6 ;LOAD MICROCODE CONSTANTS NEEDED BY PAGEING INTO
21039 MOVEI 3,EXEUMP ;DBR3
21040 MOVEI 4,EXELMP ;DBR4
21041 MOVSI 5,PMAGEM ;LH.AGE
21042 MOVEI 6,PMAGEM ;RH.AGE
21043 MOVEI 7,1000 ;CN1000
21044 MOVEI 10,100 ;CN100
21045 CONO PAG,660000+<EPT/1000> ;CACHE ON, ITS PAGER, TRAP ENB, EPT ADDR
21046 SPCCTX 1,1,USRSTG,DISABLE
21051 ;INITIALIZE FREE LISTS IN MEMBLT
21053 MOVEI A,1 ;A PG NO - NOTE: DON'T DO PAGE ZERO
21054 BEGF0: CAML A,FTUTPG ;IF THIS ISN'T A DDT OR TUT PAGE, THEN
21056 PUSHJ P,CIMEMR ;PUT THIS PAGE ON THE RIGHT FREE LIST
21062 MOVSI A,-256. ;CLEAR THE INTERFACE'S "VALID" BITS.
21063 SETZM 400000+T11CP*2000(A)
21069 MOVE A,[600000+<XGP11_8>,,1777]
21071 BUG ;NO 10-11 PAGES AVAILABLE?
21072 MOVEI TT,600000+<<T11CPA_-18.>_8>(B) ;GET CORRESP EXEC MAP PG SETUP
21073 DPB TT,[.XGPC+EXEUMP]
21074 MOVEI TT,600000+<<T11CPA_-18.>_8>+XGPTP
21075 DPB TT,[.XGPB+EXEUMP] ;SETUP PAGE FOR PDP-11 BUFFER
21078 ;CHECK AVAIL MEM FOR EXISTANCE
21081 LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21082 IORI TT,200000 ;GRANT READ ACCESS
21083 DPB TT,[.ECCPG+EXEUMP]
21085 MOVE A,400000+ECCPG*2000+1760 ;GET CURRENT HISTORY POINTER
21090 CKML: MOVEI TT,600000(A)
21091 DPB TT,[.PAREP+EXEUMP]
21094 LDB TT,[121200,,ECCADR] ;GET PAGE THAT ECC HISTORY IS ON
21095 CAMN A,TT ;THIS PAGE?
21096 JRST CKML1A ;YES, TREAT AS IF OFFLINE, THOUGH WILL ACCESS IT
21097 ; DIRECTLY FROM TIME TO TIME
21105 JUMPL T,CKML1A ;THIS BLOCK KNOWN TO BE LOSING
21109 JRST CKML1A ;HIGH MOBY NOT TO BE USED
21111 MOVEI TT,CKML1 ;KL10 CAN GET PARITY FAULT ON REFERENCE TO NXM
21113 HRRM TT,MUUOKN ;IT CAN ALSO GET A UUO
21119 CAIL A,256. ;IF NOT IN BOTTOM 256K, DON'T ASSUME GOOD DATA
21120 SETZM 400000+PAREP*2000+20 ;STORE ZERO SO DON'T GET PARITY ERROR
21121 MOVE 0,400000+PAREP*2000+20 ;IF THIS NXMS, MEM THE SYS THINKS
21122 ; IT HAS IS NON EXISTANT
21125 JRST CKML1 ;THAT MEM NXM
21133 JRST CKML1 ;THAT MEM NXM
21139 JRST 4,. ; This can't happen, right? (If we got a NXM, we
21140 ; would have trapped to CKML1 already.)
21143 JRST CKML6 ;THUS ENDING BLOCK OF LOSERS
21144 CKML2: SOJGE A,CKML
21145 AOSN CKMFLG ;ANY MEM OFF UNEXPECTEDLY?
21148 IS THIS OK? /] ;YES, MAKE SURE SOMEBODY KNOWS ABOUT IT. MAY BE SERIOUS SCREW.
21156 PUSHJ P,T00ASZ ;CRLF
21159 CONO 26400 ;CLEAR ANY NXM AND PARITY INTERRUPTS
21162 BUG PAUSE,[TAPE DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21165 BUG PAUSE,[DISK DF-10 IS IN KA MODE, PLEASE FLIP THE SWITCH]
21167 IFN KS10P, CONO 20400 ; Clear NXM flag
21173 TLNN A,NOWRIH ;CHECK FOR FORMAT SWITCH ON RP10
21174 BUG PAUSE,[RP-10 WRITE HEADERS ENABLED, PLEASE FLIP THE SWITCH]
21177 IFE <MCOND MLKA,>&<MCOND DM,>,[ ;CHECK FOR LOSING SWITCHES ON MEMORY ON ML-KA AND DM
21179 MOVSI D,(DWRITC) ;MAKE COMMAND FOR VERY LAST BLOCK ON DISK
21180 MOVEI A,NCYLS+XCYLS-1
21181 DATAO DPC,[DNOOPC] ;DETERMINE TYPE OF DRIVE 0
21184 MOVEI A,MCYLS+XCYLS-1 ;RP03
21192 SUB D,[DWRITC-DREADC]
21194 SUB D,[DREADC-DSEEKC]
21197 CKMS1: LDB TT,[MUR,,MEMBLT(A)] ;MEM EXIST?
21198 CAIE TT,MUFR ;AND NOT DDT?
21201 DPB B,[.PAREP+EXEUMP]
21203 CAIGE A,CKMSZZ ;MEM LOADED?
21205 MOVSI B,'FOO ;NO, LOAD IT
21207 MOVE B,[CKMSBF,,CKMSBF+1]
21211 HRRM A,CKMSBF+6 ;MAKE DIFF FROM OTHER SUCH PAGES
21214 LSH B,-4 ;16K BLOCK # IN B
21215 LSH C,(B) ;GET UNIQUE BIT SO PARITY ERR IF TWO AT SAME ADDR
21217 MOVE B,[CKMSBF,,400000+PAREP*2000]
21218 BLT B,400000+PAREP*2000+177
21219 CKMS3: MOVE B,A ;MAKE IOWD
21223 LDB C,[100300,,A] ;MA 15-17
21229 DATAO DPC,CKMSSC ;POSITION HEADS
21232 DATAO DPC,CKMSWC ;WRITE OUT SECTOR
21237 JRST CKMS4 ;CHANNEL ERROR MEM LOSING
21239 JRST CKMS2 ;FOO, DISK LOSING
21240 MOVE B,[-200,,CKMSBF-1] ;READ IT BACK
21250 JRST CKMS2 ;MEM LOSS IN CKMSBF?
21252 JRST CKMS2 ;FOO, DISK LOSING
21253 MOVSI B,-200 ;COMPARE
21255 CAME C,400000+PAREP*2000(B)
21256 JRST CKMS4 ;NOT SAME SWITCHES LOSING
21259 IFE MCOND DM, ADDI A,16. ;MA10'S !!
21260 IFE MCOND MLKA, ADDI A,32. ;ML-KA MEM IS IN 32K MODULES
21263 CONO DPC,175700 ;RESET THE DISK CONTROL
21264 DATAO DPC,[DEASEC+776] ;AT EASE!
21265 CONO PI,20000 ;TURN OFF IOB PI REQ LIGHT
21266 JRST CKMSX ;DONE WITH THIS, CONTINUE INITIALIZATION
21270 CKMS4: MOVEI TT,[ASCIZ/MEM ADDR SWITCHES DISAGREE CPU VS DSK AT LOC /]
21273 MOVEI TT,[ASCIZ/0000/]
21277 CKMSZZ==./2000+2 ;ABOVE HIGHEST CODE
21280 ] ;END IFE MCOND MLKA & DM
21283 DPB TT,[.PAREP+EXEUMP]
21285 IFN KA10P, CONO PI,240000+11577+IFN C1MXP,20000
21286 IFE KA10P, CONO PI,11577
21287 IFN NOTYS, CONO TTY,TTYCHN
21289 SETOM DTEODN ;CAN GET SET ON WHILE LOADING, BUT INTR GETS LOST
21290 IFE PDCLKP, CONO DTE,1170+APRCHN ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21291 IFN PDCLKP, CONO DTE,1170+TTYCHN ;CLEAR ALL FLAGS AND ASSIGN PI CHANNEL
21292 ] ;END OF IFN NETYS
21294 CONO DIS,515330 ;RESET E&S
21296 MOVEM TT,34 ;SET PAGER LOC (USED BY DSKDUMP)
21300 MOVEM TT,MICWA ;SETUP LOC FOR MEM CHAN TAPE
21304 MOVEM TT,QICWA ;SETUP FOR DEC DISK CHANNEL
21306 IFN ARMP, DATAO 760,[0] ;RESET LITE ON ARM
21307 IFN DSDP, CONO DSDEV,10 ;RESET INT RQ FROM PDP10
21308 IFN RBTCP, CONO RBTCON,0 ;RESET TABLET
21310 MOVE A,DDT-2 ;PUT GLOBAL BLOCK HEADER AT BEGINNING
21311 MOVE B,[SQUOZE 0,GLOBAL]
21312 CAME B,(A) ;SEARCH FOR GLOBAL BLOCKS
21313 AOBJN A,[ AOBJN A,.-1
21317 SUBI D,(A) ;GET ,,-#WDS BEFORE GLOBAL BLOCK
21319 ADDM D,1(A) ;GLOBAL BLOCK NOW LARGER
21320 EXCH B,(C) ;EXCHANGE IT WITH FIRST SYM
21325 BEGS1: PUSHJ P,SBUBL
21326 JUMPL J,BEGS1 ;KEEP SORTING UNTIL SYMS IN ORDER
21330 ; SORT THE UUO/SUSET/BIT SYMBOL TABLE BY VALUE
21332 MOVE E,[SYSYMB-SYSYME-1,,SYSYMB]
21336 MOVE A,[-LTSTB,,TSTB]
21341 MOVEM C,CKSUMS-TSTB(A)
21345 IFL .RPCNT-18., TLNE C,400000_<-.RPCNT>
21346 .ELSE TRNE C,400000_<18.-.RPCNT>
21347 XORM B,CKXORS+.RPCNT
21351 HRRZS 37 ;MAKE SURE SYS DOESNT IMMEDIATELY COME DOWN
21356 QSETUP: MOVE B,DCHBT(A)
21361 IFN DC10P, CONO DC0,DCCSET+DCDENB+DSKCHN ;RESET 2314 AND SET DATA ERROR ENABL
21362 IFN 340P, CONO DIS,100
21363 IFN TK10P, CONO NTY,TTYCHN
21364 IFN MTYP, CONO MTY,TTYCHN
21369 CONO DPK,400070+TTYCHN ;INITIALIZE DP KLUDGE
21370 DATAO DPK,[4,,DPKBAS]
21371 MOVE T,[-NDPTYS,,NFDPTY]
21373 DPIL: LDB A,[$TTOSP,,TTYTYP(T)] ;OUTPUT SPEED
21374 MOVE A,DPSP(A) ;MAP TO DPK SPEED CODE
21375 DPB B,[140400,,A] ;LINE #
21376 CONO DPK,500+TTYCHN(A) ;LOAD OUT SPEED
21377 LDB A,[$TTISP,,TTYTYP(T)] ;INPUT SPEED
21378 MOVE A,DPSP(A) ;MAP TO DPK SPEED CODE
21380 CONO DPK,700+TTYCHN(A) ;LOAD IN SPEED
21390 MOVSI R,-NTTPG-NTVBP+1
21391 MOVE T,[.TTPG0+EXEUMP]
21392 BEG9: MOVEI A,(R) ;SET UP 1 MORE TEN-11 MAP ENTRY
21394 IORI A,1777 ;A FULL PAGE
21395 TLO A,600000+TT11NM*400
21398 ADDI B,600000+<<T11CPA_-18.>_8> ;READ-WRITE, IN HIGH MOBY.
21402 MOVE A,[(600000+TT11NM*400)TT11CR_8] ;POINTER TO CONSOLE REG
21405 ADDI B,600000+<<T11CPA_-18.>_8>
21408 SKIPE TT11P ;IF WE'RE SUPPOSED TO USE THE TV 11,
21409 SETZM TT11UP ;REQUEST IT TO RE-INIT.
21410 ;IF TT11UP BECOMES NONZERO, THE 11 IS UP.
21411 BEG5: ];END IFN N11TYS
21413 XCTRI [IORDI A,CAIMYN]
21415 BUG HALT,[CHAOSNET INTERFACE NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS)]
21417 IFN CHAOSP,[ IFN T11CHP,[
21418 SKIPE TEN11F ;SET UP TEN-11 CHAOS NET INTERFACE PAGE
21420 MOVE A,[(600000+CH11NM*400)1004_8+1777]
21423 ADDI B,600000+<<T11CPA_-18.>_8>
21424 DPB B,[.CHSPG+EXEUMP]
21425 BEG8: ]] ;CHAOSP, T11CHP
21426 IFN DL10P,[ ;INITIALIZE DL10
21427 CONO DLC,400000 ;MR CLR
21428 CONO DLB,1 ;TURN OFF EXCESS LIGHTS
21431 CONO DLB,DL10AR ;64 WORDS FOR PDP11 #0 AT DL10AR
21432 DATAO DLC,[200001,,] ;KA INTERRUPT MODE
21434 CONO DLC,100020+TTYCHN ;ENB PDP11 PORT #0 AND ENB INTR
21438 SKIPGE T ;IF THE 11 DIDN'T SAY IT WAS UP,
21439 SETZM DL10F ;MARK IT NON-FUNCTIONAL.
21442 CONO TIM,460000+3900. ;SET INTERVAL TIMER TO 39 MILLISECONDS FOR OVHMTR
21443 CONO MTR,433001 ;TIME BASE ON, ACCOUNT FOR USER + EXEC NO PI, INTERVAL PIA=1
21444 PUSHJ P,PRFOFF ;INIT PERFORMANCE COUNTER
21448 MOVSI T,%TBNOT+%TBDTY+%TBNVR ;SYS JOB HAS NO CONSOLE ALL TO ITSELF
21450 PUSHJ P,USSINI ;INITIALIZE SYS JOB VARIABLES BLOCK
21454 MOVEI T,UUOH0 ;CLOBBERED BY USSINI
21458 HLLM T,UPGMP ;GIVE PG 0 TO SYS JOB
21463 MOVEI T,SYSRCE ;SET SYS JOB RESOURCE POINTER
21465 MOVSI A,(SIXBIT /SYS/) ;""" NAMES
21472 MOVSI T,%TBNOT+%TBDTY+%TBNVR ;CORE JOB HAS NO CONSOLE
21474 PUSHJ P,USSINI ;SET UP CORE JOB VARIABLES BLOCK
21476 MOVE A,[SIXBIT /CORE/]
21480 MOVSI A,(SIXBIT /JOB/)
21484 MOVEM T,UTMPTR+LUBLK
21487 IFE KA10P, HRLI A,%PSPCU ;DOES CORE JOB XCTR?
21490 MOVE T,[JSR ILLTRP] ;SYS AND CORE JOBS SHOULDN'T TRAP
21491 MOVEM T,TR1INS ;THESE WON'T BE USED ANYWAY UNLESS
21492 MOVEM T,TR2INS ;SOMEDAY THEY SHOULD RUN IN USED MODE
21498 MOVEI A,SYSB+2 ;GIVE SYSTEM CORE TO SYS JOB, WITH A COUPLE
21499 MOVEM A,CORRQ ; SPARE JOB SLOTS
21504 CONO PI,100+UTCON-1 ;ALL EXCEPT 7
21505 IFN KA10P, CONO 3000+APRCHN
21507 IFN PDCLKP, CONO CLK,APRCHN
21508 .ELSE [ MOVEI A,%DTCLN ;TURN ON 60-CYCLE CLOCK
21515 CONO APRCHN ;ENABLE APR FAULT INTERRUPTS
21516 SWPUA ;UPDATE MEMORY AGAIN TO MAKE SURE DDT + SYMBOL
21517 ; TABLE OUT OF CACHE
21522 WRINT [KSFREQ] ; 60 cycle clock.
21523 CONO APRCHN ; Enable APR faults and clock ints.
21524 CLRCSH ; Is this necessary? What the heck...
21527 CONI CHX,T ;CHECK CHAOS ADDRESS SWITCHES
21530 JRST [ MOVEI TT,[ASCIZ/CHAOSNET ADDRESS SWITCHES ARE SET WRONG/]
21533 CONO CHX,@CHXCNO ;ENABLE INTERRUPTS
21537 CKML1: ;MEM NON-EXISTANT PATCH OUT
21538 IFN KA10P, CONO 10000 ;TURN OFF NXM FLAG
21552 MOVEM A,CKMBLK ;HIGHEST IN BLOCK OF LOSERS
21553 CKML1A: LDB TT,[MUR,,MEMBLT(A)]
21557 JRST 4,. ;SYS MEM NON EX? (BUG PROBABLY WON'T WORK)
21558 PUSHJ P,MPOUT2 ;FLUSH THAT BLOCK
21560 DPB TT,[MUR,,MEMBLT(A)]
21561 CAIL A,400 ;IF NXM IN LOW MOBY
21569 DPB U,T ;PATCH THIS BLOCK OUT OF EXEC MAP
21573 ; REPORT A BLOCK OF LOSING MEMORY
21576 MOVEI TT,[ASCIZ/MEM OFF /]
21579 ADDI A,1 ;LOWEST LOSER = HIGHEST WINNER + 1 PAGE
21591 USEHM: -1 ;-1 => USE MEM IN HIGH MOBY (IF PRESET)
21593 CKMBLK: -1 ;IF + HIGHEST LOSING BLOCK IN CONTIG RANGE
21594 CKMFLG: -1 ;IF + PRINTED MESSAGE ALREADY
21595 CKMSWC: 0 ;WRITE CMD
21596 CKMSRC: 0 ;READ CMD.
21597 CKMSSC: 0 ;SEEK CMD.
21598 ;UP TO 8 RANGES OF ADDRESSES THAT SHOULD NOT BE USED BECAUSE THEY
21599 ;DON'T WORK BUT AREN'T NXM.
21600 MEMLZL: BLOCK 8 ;LOWEST LOC
21601 MEMLZH: BLOCK 8 ;HIGHEST LOC+1
21602 FTUTPG: 0 ;FIRST PAGE USED FOR TUTS
21604 ;INPUT CHAR FROM CONSOLE TTY AND ECHO
21629 ; TYPE CHAR IN A ON CONSOLE TTY
21658 ; TYPE BLOCK NO IN A AS HIGH 3 OCTAL DIGITS OF ADDR
21659 ; (ALL MEMORIES MULTIPLE OF 4K. MAX MEMORY 2M WORDS.)
21672 ; TYPE ASCIZ IN TT ON T00
21681 IFN DPKPP,[ ;MAP SYSTEM SPEED CODES TO DATAPOINT KLUDGE CODES
21691 REPEAT 20-<.-DPSP>, 7_9 ;FAST *
21700 ; Define location known as start of SALV disk salvager. If system overruns
21701 ; this address, must either reduce system size or increase the SALV start
21702 ; address. If SALV is changed, the SALV program must also be changed to
21703 ; start at the right place. There is a limit to how high it can go,
21705 IFN KL10P, SALV==:105*2000 ; MC-KL is getting huge
21706 .ELSE SALV==:100*2000
21707 IFG IEND-SALV,.FATAL System overruns SALV start addr!
21709 IFGE TSYSM-256.,DDT=774000
21710 .ELSE DDT=TSYSM*2000-4000
21713 IFG LBUGTB-LBUGT2,[
21714 .ERR MAKE THE BUGTAB BIGGER
21715 INFORM LBUGTB-LBUGT2,\LBUGTB-LBUGT2
21716 .FATAL FATAL ERROR, RUNNING THIS WOULD CAUSE TOTALLY WEIRD BUGS
21719 IF2 EXPUNGE FOO,ZZZQ,FNM,ZCHR,ZZ,ZZZ,BUGB,BUGF,BUGN,BUGNN
21721 END BEG ;START AT BEG TO SALVAGE AND RUN ITS, START AT GO TO JUST ITS