Consolidate license copies
[its.git] / system / core.82
1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
2 ;;;
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 3 of the
6 ;;; License, or (at your option) any later version.
7 ;;;
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 ;;; General Public License for more details.
12 ;;;
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16
17
18 ;;; CORE JOB
19
20 SUBTTL CORE ALLOCATOR - USER ROUTINES
21 ;
22 ;  USER ROUTINES (TO COMMUNICATE WITH CORE JOB)
23 ;
24 UACORE: ;U HAS INDEX CORE REQUEST IS FOR
25 ACORE:  CAILE B,400
26          POPJ P,
27         MOVE Q,U        ;USER TO MAKE CORE FOR
28 ACORE1: PUSH P,U
29         MOVE U,USER
30         PUSHJ P,ACRF1
31          SKIPA
32           AOS -1(P)
33         POP P,U
34         POPJ P,
35
36 ;EXCESSIVE CORE REQUEST CHECK
37 ACRTST: CAILE B,400
38          POPJ P,
39         JRST POPJ1
40 \f;CORTYP SYSTEM CALL.
41 ;IF 2 ARGS,1ST ARG IS JOB SPEC, LIKE CORBLK'S 2ND AND 4TH ARGS.
42 ;2ND ARG IS PAGE NUMBER IN THAT JOB.
43 ;IF ONLY 1 ARG, IT IS THE PAGE NUMBER IN THE EXECUTING JOB.
44 ;RETURNED VALUES:
45 ;1ST VALUE BITS:
46 ;       %CBWRT  ;4.9 PAGE IS WRITEABLE
47 ;       %CBRED  ;4.8 PAGE IS READABLE (EXISTS)
48 ;       %CBPUB  ;4.6 PAGE IS PUBLIC
49 ;       %CBLOK  ;4.2 PAGE IS LOCKED IN CORE
50 ;       %CBSLO  ;3.9 PAGE IS IN SLOW MEMORY
51 ;       FOR NON EX PAGE, ALL THE REST ARE 0.
52 ;2ND IS 0 => PAGE IS ABSOLUTE, -1 => UNSHARED,
53 ;       ELSE IS JOB NUMBER OF NEXT JOB IN CIRCULAR LIST.
54 ;3RD IF ABSOLUTE PAGE, HAS PAGE NUMBER.
55 ;       IF PAGE IS SHARED, HAS PAGE NUMBER IN THE JOB
56 ;       WHOSE NUMBER IS THE 2ND VALUE. ELSE, 0.
57 ;4TH BIT 4.9 => PAGE IS IN CORE.
58 ;    RH IS NUMBER OF TIMES PAGE IS SHARED
59 ;       (WILL BE 0 FOR ABS PAGE OR IF NO PAGE,
60 ;        OTHERWISE WILL BE >= 1)
61
62 NCORTY: PUSHJ P,SWTL    ;DON'T LET PAGE MAPS CHANGE.
63             CIRPSW
64         SOSG W          ;IF 1 ARG, USE -1 (SELF) FOR JOB SPEC.
65          SKIPA B,[-1]
66           EXCH A,B      ;ELSE 1ST ARG IS JOB SPEC.
67         MOVE J,B
68         JSP T,NCRUI2    ;DECODE THE JOB SPEC IN J,
69          JFCL           ;RETURNS USR IDX IN J.
70         TDNE A,[-400]
71          JRST OPNL33    ;BAD PAGE NUM.
72         PUSHJ P,NCORT0  ;DO THE ACTUAL WORK.
73         PUSHJ P,LSWPOP  ;UNLOCK CIRPSW,
74         JRST POPJ1      ;GIVE VALUES TO USER, SKIP.
75
76 ;CALL HERE FROM AUSET5  (ALWAYS COMES WITH CIRPSW LOCKED)
77 NCORT0: PUSH P,U
78 IFN PDP6P,[
79         CAIN J,-1
80          JRST [ SETZB B,D       ;DON'T CALL UPLC IF PDP6, WOULD CRASH SYSTEM
81                 MOVEI C,PDP6BM_-12(A)
82                 CAIL A,LPDP6M
83                  TDZA A,A
84                   MOVSI A,%CBRED+%CBWRT
85                 JRST POPUJ ]
86 ];PDP6P
87         MOVEI U,(J)     ;UPLC USES USER IN U.
88         PUSHJ P,UPLC    ;NOTE PAGE NUM IS IN A.
89         LDB J,T         ;GET PAGE'S HARDWARE HALFWD,
90         LDB C,Q         ;GET CIRC. LIST POINTER.
91         JUMPE C,NCORTE  ;J IF NO PAGE THERE.
92         MOVEI A,(J)
93         TRNE A,600000   ;GET ACCESS INTO A 1.1-1.2
94          LDB A,[200200,,A]
95         CAIN A,2        ;CHANGE READ-WRITE-FIRST TO READ-WRITE.
96          MOVEI A,3
97         ROT A,-2        ;SHIFT INTO 4.8-4.9
98         CAIN C,-1
99          JRST NCORTA    ;J IF ABSOLUTE PAGE(CIRC PTR -1)
100         PUSHJ P,CHACK   ;PG MUST HAVE REAL CIRC LIST, TRACE IT.
101         EXCH C,D        ;D HAD MMP IDX; C HAD IN-CORE,,LIST LENGTH.
102         ADD C,MMPEAD
103         SKIPGE C,(C)    .SEE MMPPUB
104          TLO A,%CBPUB
105         TLNE C,MMPLOK
106          TLO A,%CBLOK
107         TLNE C,MMPSLO
108          TLO A,%CBSLO
109         SUBI D,1        ;LIST LENGTH COUNTS THE MMP ENTRY,
110         SKIPGE D
111         SUBI D,1        ;COUNTS THE MEMBLT ENTRY IF PAGE IN CORE.
112         TRNN D,-2       ;RH NOW HAS # SHARERS,
113          JRST NCORTS    ;ONLY 1 => PAGE NOT SHARED.
114         MOVE C,Q
115         MOVE B,P
116         PUSHJ P,UCPRL   ;>1 SHARER => FIND NEXT SHARER,
117          400000,,.+1
118         MOVE P,B        ;UN-SCREW STACK (UCPRL PUSHJ'D BACK)
119         LDB B,[101100,,T]
120         MOVE C,I        ;2ND, 3RD VALUES USR NUM & PAGE NUM
121         JRST POPUJ      ;OF THE NEXT SHARER.
122
123 ;COME HERE IF NO PAGE WITH THAT PAGE NUM.
124 NCORTE: SETZB A,B
125         SETZB C,D       ;RETURN ALL ZEROS.
126         JRST POPUJ
127
128 ;COME HERE IF ABS PAGE, ACCESS ALREADY IN A.
129 NCORTA: SETZB B,D       ;JOB # 0 (SYS JOB) FOR ABS PAGE.
130         LDB C,[PMRCAD,,J]       ;GET ABS PAGE NUM FROM HARDWARE HALFWD.
131         JRST POPUJ
132
133 ;COME HERE IF UNSHARED NORMAL PAGE.
134 ;ACCESS ALREADY IN A, 4TH VALUE IN D.
135 NCORTS: SETO B,         ;2ND VALUE -1 FOR UNSHARED.
136         SETZ C,
137         JRST POPUJ
138 \f
139 ;CORBLK CALL
140 ;1ST ARG FLAG BITS: (RH XOR'D INTO LH BEFORE DECODING)
141
142 %CB==0,,525252
143 %CBWRT==400000  ; 4.9 GET WRITE ACCESS IF OK, DON'T FAIL IF NOT.
144 %CBRED==200000  ; 4.8 GET READ ACCESS
145 %CBNDW==100000  ; 4.7 GET WRITE ACCESS, FAIL IF CAN'T.
146 %CBPUB==40000   ; 4.6 MAKE PAGE PUBLIC
147 %CBPRV==20000   ; 4.5 MAKE IT PRIVATE (BOTH FAIL IF COULDN'T GET WRITE ACCESS)
148 %CBNDR==10000   ; 4.4 FAIL IF CAN'T GET READ ACCESS.(COPYING NONEXISTANT PAGE)
149 %CBCPY==4000    ; 4.3 MAKE COPY (CURRENTLY ONLY IMPLEMENTED FOR PAGE OF FILE)
150 %CBLOK==2000    ; 4.2 LOCK PAGE IN CORE.
151 %CBULK==1000    ; 4.1 UNLOCK PAGE (ALLOW SWAP-OUT)
152 %CBSLO==400     ; 3.9 MAY ONLY RESIDE IN SLOWEST MEMORY
153 %CBUSL==200     ; 3.8 ALLOWS USE OF ANY MEMORY.
154                 ;IF ALL 0, DELETE.
155
156 %CBNWP==563600  ;BITS THAT NEED WRITE-PERMISSION.
157
158 ;2ND ARG SPECIFIES JOB TO PUT PAGE IN
159 ;   IS EITHER CHNL NUM, -1 FOR SELF, OR 400000+USRNUM
160 ;JOB SPECIFIED MUST BE CURRENT JOB OR INFERIOR.
161
162 ;3RD ARG RH. IS PAGE NUM. IN IT.
163 ; LH. IF NEGATIVE, BLOCK MODE, REPEAT THAT MANY TIMES,
164 ;   INCREMENTING BOTH PAGE NUMS EACH TIME.
165 ;IN BLOCK MODE, REWRITES 3RD AND 5TH ARGS EACH TIME.
166
167 ;4TH ARG IS SOURCE OF PAGE,
168 ; A DISK CHANNEL NUMBER (GET N'TH PAGE IN FILE), OR
169 ; A <JOB> SPEC:
170 ;  A USR, JOB, BOJ, OR STY CHANNEL NUMBER
171 ;  OR ONE OF THE FOLLOWING SPECIAL CODES:
172 %JS==,-1
173 %JSNUM==400000  ;400000+JOB NUMBER => THAT JOB
174 %JSSUP==400377  ;CURRENT JOB'S SUPERIOR
175 %JSELF==,,-1    ;SELF
176 %JSTVB==,,-2    ;TV11 VIDEO BUFFER IN FIRST 8 PAGES, 1ST WD OF 9TH PG IS CONSOLE REG
177 %JSNUL==,,-3    ;NULL JOB (NOT VALID FOR CORBLK)
178 %JSALL==,,-4    ;ALL JOBS (NOT VALID FOR CORBLK)
179 %JSNEW==,,-5    ;FRESH PAGE
180 %JSABS==,,-6    ;ABSOLUTE PAGE (PHYSICAL MEMORY)
181 ;  JOB 0 = SYSTEM JOB = EXEC VIRTUAL ADDRESS SPACE
182 ;  JOB 1 = CORE JOB = FRESH PAGE (OBSOLESCENT, USE %JSNEW, EVENTUALLY WILL GO AWAY)
183 ;IF NO 4TH ARG, SAME AS 2ND
184
185 ;5TH ARG IS PAGE NUM IN SOURCE (IGNORED FOR FRESH PAGE)
186 ;IF NO 5TH ARG, SAME AS 3RD IF 4TH ARG SPECIFIES JOB.
187
188 ;IF 4TH ARG SPECS FILE, USE CURRENT ACCESS PNTR
189 ;IF INSERTING DISK PAGES, THE ACCESS PTR WILL BE
190 ;POSITIONED AT THE BEGINNING OF THE PAGE AFTER THE LAST PAGE INSERTED.
191
192 ;BITS IN REGS R AND I:
193 NCOR$P==400000  ;SOURCE USER ISN'T WRITEABLE. PAGES ARE, IFF PUBLIC.
194 NCOR$Q==200000  ;SOURCE IS A DISK FILE.
195 \f
196 ;CORBLK - COMMENTS ON PRECEDING PAGE.
197 NCORBL: TSC A,CTLBTS(U)
198         TLC A,(A)       ;WIN FOR IMMEDIATE FIRST ARG
199         HRRZM C,SRN3(U) ;SAVE PTRS TO 3RD, 5TH ARGS IN SRN3, SRN4 RESPECTIVELY
200         TLNE C,1000
201          TLZA C,-1
202         UMOVE C,(C)
203         SKIPGE C        ;IF WILL REWRITE,CHECK FOR PURE
204          XCTR XRW,[MOVES @SRN3(U)]
205         HRRZM E,SRN4(U)
206         CAIGE W,5       ;BUT IF NO 5TH ARG, SAY SO & USE 3RD.
207          JRST NCORB1    ;DEFAULT E TO C,SETOM SRN4
208         TLNN E,1000     ;IMMEDIATE 5TH ARG LEGAL
209          JRST NCORB8
210         JUMPGE C,NCORB7 ;ONLY IF WON'T HAVE TO REWRITE IT
211         JRST OPNL33
212
213 NCORB1: SETOM SRN4(U)
214         MOVE E,C
215         JRST NCORB7
216
217 NCORB8: UMOVE E,(E)
218         SKIPGE C
219          XCTR XRW,[MOVES @SRN4(U)]
220 NCORB7: ANDI E,-1
221         MOVE J,B
222         JSP T,NCRUI1    ;GET USER INDEX OF TARGET.
223          JRST NCORB0    ;IF DOESN'T SKIP, CAN CERTAINLY WRITE.
224         CAIE J,-1       ;CAN'T STICK PAGE IN 6.
225          JSP T,NCORWR   ;ELSE CHECK.
226           JRST OPNL31   ;CANT WRITE SO CANT STICK PAGE IN
227 NCORB0: MOVEI TT,(J)    ;SAVE DEST. USER IDX.
228         CAIN TT,(U)     ;IF NOT ACTING ON SELF, PCLSR TARGET JOB.
229          JRST NCORC1
230         EXCH A,TT
231         PUSHJ P,RPCLSR
232         PUSHJ P,LSWPOP  ;SOS DIELOK(A)
233         MOVEM A,SRN5(U)
234         MOVSI T,BSSTP   ;BUT LEAVE BSSTP SET INSTEAD OF RH
235         IORM T,USTP(A)
236         SOS USTP(A)     ;BECAUSE CORE JOB WANTS RH TO BE CLEAR
237         EXCH A,TT
238         PUSHJ P,LOSSET  ;UNDO SETTING OF BSSTP IF WE PCLSR OR FAIL
239             NCORFS
240         CAIA
241 NCORC1:  PUSHJ P,LSWPOP ;SOS DIELOK(TT)
242 ;DROPS THROUGH.
243 \f
244 ;DROPS THROUGH. ALSO COME HERE FROM ACBLK.
245 ;TARGET DECODED AND STOPPED IF NEC.; USER IDX IN TT.
246 ; NOW DECODE SOURCE IF NEC.
247 NCORB9: PUSHJ P,SWTL
248             CIRPSW
249         TLNE A,%CBNDW   ;FORCE WRITE => WRITE.
250          TLO A,%CBWRT
251         JUMPE A,NCORD   ;0 ACCESS WANTED => DELETE PAGES.
252         TLO A,%CBRED    ;NOT DELETE, WANT AT LEAST READ ACCESS.
253         CAIGE W,4       ;IF HAD 4TH ARG, DECODE,
254          JRST NCORC2    ;ELSE USE DECODED 2ND (STILL IN J).
255         HRRZ J,D
256         CAIE J,%JSNEW
257          CAIN J,%JSABS
258           JRST NCORC2   ;SPECIAL NON-JOB SOURCE, SKIP DECODE
259 IFN N11TYS,[
260         CAIN J,%JSTVB
261          JRST [ SKIPN TEN11F    ;TV11 SOURCE
262                  SKIPL TT11P
263                   JRST OPNL10   ;DEVICE NOT AVAIL
264                 JRST NCORC2]
265 ]
266         MOVE J,D
267         JSP T,NCRUI1    ;GET SOURCE USR IDX
268          JRST NCORB2
269           JRST NCORC0
270         TLNN H,%CLSQ    ;COME HERE IF ARG IS RANDOM IO CHANNEL.
271          JRST OPNL34    ;NOT DSK => NO GOOD.
272         MOVE R,J        ;2 SKIPS => DISK CHNL; PUT ITS # IN R.
273         TLO R,NCOR$Q    ;INDICATE DISK CHNL
274         MOVSI T,%QAACC
275         TDNE T,QSRAC(R) ;INSURE THAT %QAACC WILL BE ON IF OUR
276          JRST NCORQD
277         IORM T,QSRAC(R) ;CALL TO QFNTR FINDS EOF.
278         MOVE T,QFBLNO(R) ;IF %QAACC WAS 0, THEN QRADAD ISN'T SET UP.
279         MOVEM T,QRADAD(R)
280 NCORQD: SETOM NCORQC    ;1ST TIME THRU NCORL LOOP COMING UP.
281         CAIGE W,5
282          JRST NCORL
283         MOVE T,E        ;DON'T SMASH E, WILL BE WRITTEN BACK TO USER
284         LSH T,10.       ;5TH ARG GIVES PAGE ADDRESS IN FILE FOR DISK CHNL
285         IMULI T,@QSBYTE(R)
286         MOVEM T,QRADAD(R) ;SET ACCESS PTR OF DSK CHNL -> SPEC'D PAGE.
287         JRST NCORL
288
289 NCORC0: TLNN A,%CBNWP   ;IF REQUIRE ALTERATION,
290          JRST NCORB2
291         JSP T,NCORW1    ;IF CAN'T WRITE THAT JOB,
292         HRLI J,NCOR$P   ;SET FLAG TO CHECK FOR PUBLIC.
293 NCORB2: CAIE J,-1       ;IF NOT PDP6,
294          PUSHJ P,LSWPOP ;SOS DIELOK(J)
295         CAIN J,LUBLK    ;IF SOURCE IS CORE JOB  (EVENTUALLY DELETE THESE TWO LINES)
296          MOVEI J,%JSNEW ; THAT MEANS GET FRESH PAGE
297 NCORC2: MOVE R,J
298         CAIN R,%JSNEW   ;FRESH PAGE IMPLIES WRITING
299          TLO A,%CBNDW+%CBWRT
300
301 ;DROPS THROUGH
302 \f
303 ;DROPS IN
304
305 ;NOW HAVE TARGET IDX IN TT, SOURCE IN R (USER INDEX, -1 FOR
306 ; PDP6, %JSTVB, %JSNEW, OR %JSABS).
307 ;TARGET PAGNUM IN C; SOURCE IN E (MAYBE INVALID).
308 ;R 4.9 => WRITE REQUIRES PUBLIC PAGE.
309 ;R 4.8 => R HAS DISK CHNL (AND NCORQC IS -1 THE 1ST TIME AROUND)
310 ;DECIDE WHAT KIND PAGE WANTED AND FIND IT.
311 ;CIRPSW MUST BE ON TOP OF LSWPR. IT WILL BE
312 ;UNLOCKED EVENTUALLY (AND ALSO 1 MORE UNDERNEATH IT
313 ;IF THE TARGET JOB ISN'T US). FAILURE DOES A LSWCLR.
314 NCORL:  MOVEI I,(R)     ;I WILL HAVE USR IDX FOR ACTUAL PAGE.
315         HLRS A          ;RH OF A WILL GET ACCESS TO BE GRANTED.
316         TRNE C,-400     ;CHECK DEST PAGE NUM IN RANGE.
317          JRST OPNL33
318
319         PUSH P,U
320         PUSH P,C
321         TLNE R,NCOR$Q
322          JRST NCORQ1    ;DISK FILE
323 IFN PDP6P,[
324         CAIN I,-1
325          JRST NCORE4    ;-1 => PDP6 PAGE.
326 ]
327 IFN N11TYS,[
328         CAIN I,%JSTVB
329          JRST NCORV1    ;TV11
330 ]
331         CAIN I,%JSNEW
332          JRST NCORF0    ;FRESH PAGE.
333         CAIN I,%JSABS
334          JRST NCORE1    ;ABSOLUTE PAGE.
335         CAIL E,400
336          JRST NCORE7    ;ELSE SOURCE PAGNUM MUST BE < 400
337         MOVEI U,(R)     ;SOURCE IS A USER
338 NCORF2: EXCH E,A        ;GET SOURCE PAGNUM IN A
339         PUSHJ P,UPLC;(A,U)      ;FIND THE PAGE WANTED.
340         EXCH E,A
341         LDB J,Q         ;UPLC RETURNS IN T,Q.
342         JUMPE J,NCORE6  ;FAIL OR DELETE IF HE HAS NO PAGE THERE.
343         CAIN J,-1
344          JRST NCORE5    ;IF THAT PAGE IS ABS,CHANGE TO ABS REQ.
345         PUSHJ P,CHACK   ;A REAL PAGE, FIND MMP, PREV. PTR.
346         ADD D,MMPEAD
347         MOVE B,Q
348         MOVEI I,(R)     ;CHACK CLOBBERS I
349         TLNN A,%CBNDW+%CBWRT    ;IF WANTED ALTERATION, CHECK LEGAL.
350          JRST NCORB3
351         LDB J,T         ;1ST OF ALL, SOURCE MUST HAVE WRITE PERM.
352         TRNN J,600000
353          LSH J,20
354         TRNN J,400000
355          JRST NCORB5
356         CAIN R,%JSNEW
357          JRST NCORF3
358 NCORF4: CONO PI,UTCOFF  ;DSK XFER COULD COMPLETE, CHANGING INTRANSIT BIT
359         MOVE J,(D)      ; HE HAS WRITE PERM.; GET MMP IN J.
360         TLNE R,NCOR$P   ; CAN'T ALTER IF NEEDED PUBLIC BUT IT ISN'T.
361          JUMPGE J,[     CONO PI,UTCON   .SEE MMPPUB
362                         JRST NCORB5]
363         TLNE A,%CBPUB   ;WE CAN ALTER; CHANGE PUBLIC IF REQ.
364          TLO J,MMPPUB
365         TLNE A,%CBPRV
366          TLZ J,MMPPUB
367         TLNE A,%CBLOK
368          TLO J,MMPLOK
369         TLNE A,%CBULK
370          TLZ J,MMPLOK
371         TLNE A,%CBSLO
372          TLO J,MMPSLO
373         TLNE A,%CBUSL
374          TLZ J,MMPSLO
375         MOVEM J,(D)
376         CONO PI,UTCON
377         JRST NCORB3
378
379 NCORF0: MOVEI U,(TT)    ;WHEN CREATING A FRESH PAGE, HAVE TO RE-USE A PREVIOUSLY
380         MOVEI E,(C)     ;EXISTING PAGE IF POSSIBLE, BECAUSE AFTER THE FRESH PAGE
381         JRST NCORF2     ;IS GIVEN, USER WILL BE PCLSR'ED AND WILL COME IN AGAIN
382                         ;LOOKING FOR A FRESH PAGE.  CURRENTLY THIS CAUSES A BUG
383                         ;THAT A "FRESH PAGE" IS NOT ALWAYS ZERO.
384 \f
385 NCORF3: CAIE C,2        ;WANT FRESH PAGE
386          CAMN C,[SETZ 3]
387           JRST .+2
388            JRST NCORD0  ;SHARED PAGE CAN'T SERVE AS FRESH PAGE
389         MOVEI I,(TT)
390         JRST NCORF4
391
392 ;COME HERE IF REQ WRITE ON REAL PAGE BUT CAN'T GRANT.
393 NCORB5: CAIN R,%JSNEW
394          JRST NCORD0    ;JUST REPLACE WITH FRESH PAGE
395         TLNE A,%CBNDW+%CBPUB+%CBPRV+%CBSLO+%CBUSL+%CBLOK+%CBULK ;IF HE INSISTED, FAIL.
396          JRST NCORE0
397         TRZ A,%CBWRT    ;ELSE GIVE HIM ONLY READ PERM.
398 ;COME HERE IF PAGE EXISTS TO GIVE ACCESS AS IN A 2.8,2.9
399 NCORB3: HRRZ J,(P)
400         CAIN TT,(I)     ;ARE WE REPLACING PAGE BY ITSELF?
401          CAME E,J
402           JRST NCORD0   ;NO, DELETE OLD, INSERT NEW.
403         LDB J,T         ;REPLACING PG W/ SELF, SET ACCESS & EXIT.
404         TRNN J,600000
405          JRST NCORI1
406         TRNN J,400000   ;CHANGE READ TO RWF
407          TRC J,600000
408         TRNE A,%CBWRT
409          JRST NCORI2
410         MOVSI I,40000
411         TROE J,200000
412          ANDCAM I,(D)
413         TRZ J,400000
414         JRST NCORI2
415
416 NCORI1: MOVEI J,1
417         TRNE A,%CBWRT
418          TRO J,2
419 NCORI2: DPB J,T
420         POP P,C
421         POP P,U
422         JRST NCORX      ;TO END OF LOOP.
423
424 NCORQ1: PUSH P,A
425         PUSH P,TT
426         PUSH P,R
427         MOVEI A,(R)
428         AOSN NCORQC     ;THE 1ST TIME AROUND LOOP?
429          JRST NCORQ0    ;YES, ACCESS TO 1ST PAGE TO BE INSERTED.
430         PUSHJ P,QFNTN   ;NO, JUST MOVE FORWARD 1 PAGE
431          JRST NCORE8    ;REACHED EOF, CAN'T INSERT PAGE
432 NCORQF: POP P,R
433         POP P,TT
434         POP P,A
435         MOVE I,R        ;FOUND THE PAGE, GO INSERT IT.
436         JRST NCORD0
437
438 NCORQ0: MOVE Q,QRADAD(A)
439         PUSHJ P,QFNTR
440          JRST NCORE8
441         PUSHJ P,QUDULK  ;QFNTR LEAVES IT LOCKED
442         AOS QSLGL(A)    ;DON'T BE FOOLED BY QFNTR'S TRICK
443         SOS QSBI(A)     ;ON THE DISK PI RTNS.
444         JRST NCORQF
445
446 NCORE8: POP P,R
447         POP P,TT
448         POP P,A
449 NCORE6: CAIN R,%JSNEW   ;COPY NONEXISTANT PAGE
450          JRST NCORD0    ;JUST PUT IN A FRESH PAGE
451         HRRI A,0        ;CHANGE TO DELETE RQ.
452         TLNN A,%CBNDR+%CBNDW+%CBPUB+%CBPRV+%CBLOK+%CBULK+%CBSLO+%CBUSL
453          JRST NCORD0    ;IF INSIST ON ACCESS, FAIL.
454 NCORE0: PUSHJ P,OPNL32  ;CAN'T GRANT ACCESS OPNL.
455 POPCUJ: POP P,C         ;FAIL OUT OF CALL.
456         JRST POPUJ
457
458 IFN PDP6P,[
459 ;REQ FOR PDP6 PAGE.
460 NCORE4: CAIL E,LPDP6M
461          JRST NCORE7    ;OUT OF RANGE.
462         MOVEI B,PDP6BM_<-10.>(E)
463         JRST NCORE3     ;CONVERT TO ABS REQ, WRITE OK
464 ]
465 \f
466 IFN N11TYS,[
467 ;REQ FOR TV11 PAGE.
468 NCORV1: CAIL E,NTVBP
469          JRST NCORE7
470         SKIPL TVCREG(TT)        ;IF CONSOLE REGISTER NOT ALREADY SET UP
471          JRST NCORV2
472         MOVE B,TVVBN(TT)        ;INITIALIZE IT FROM BLINKER
473         MOVEM B,TVCREG(TT)
474         CAMN TT,USER
475          MOVEM B,400000+TTR10*2000      ;INITIALIZE HARDWARE CONSOLE REGISTER.
476 NCORV2: LDB B,TTCRT(E)  ;GET MAP ENTRY OUT OF EXEUMP
477         ANDI B,PMRCM    ;MASK TO PAGE #
478         JRST NCORE3     ;CONVERT TO ABS REQ, WRITE OK
479 ]
480 ;REQ FOR ABS PAGE.
481 NCORE1: MOVEI B,(E)
482         CAIGE B,TSYSM
483          JRST NCORE2    ;ACCESS AVAILABLE, READ ONLY
484         JRST NCORE6     ;CAN'T GET ACCESS TO PAGE.
485
486 NCORE7: PUSHJ P,OPNL33  ;BAD ARG OPNL.
487         JRST POPCUJ
488
489 ;PAGE TO COPY WAS AN ABS PAGE.
490 NCORE5: CAIN R,%JSNEW
491          JRST NCORD0    ;SUBSTITUTE A FRESH PAGE
492         LDB B,T                 ;GET ABS PAGE NUM.
493         TRZE B,400000           ;IF HE HASN'T WRITE PERM.
494          JUMPGE R,NCORE3        ;OR WE CAN'T WRITE IN HIM,
495 NCORE2: TRZ A,%CBWRT            ;CAN'T GET WRITE,
496         TLNN A,%CBNDW           ;FAIL IF INSIST.
497 NCORE3:  TLNE A,%CBPUB+%CBPRV+%CBLOK+%CBULK+%CBSLO+%CBUSL
498           JRST NCORE0           ;OR IF TRYING TO CHANGE PUBLICNESS.
499         MOVE D,B                ;GET JUST THE PAGE # (NOT THE ACCESS CODE)
500         ANDI D,PMRCM            ;TO INDEX INTO TABLES WITH.
501 IFN TEN11P,[
502         LDB I,[.BP <PMRCM-377> D]       ;GET MOBY #
503         CAIE I,T11CPA_-18.
504          JRST NCORE9
505         MOVE Q,D
506         SUBI Q,<T11CPA_-18.>_8
507         CAIL Q,256.
508          JRST 4,.
509         SKIPN I,T11MP(Q)
510          JRST 4,.       ;SHOULDNT HAVE ABS PNTR TO NOT SET UP PAGE
511         AOJE I,NCOREA   ;CONFLICT PAGE
512         LDB I,[350500,,T11MP(Q)]
513         CAIN I,37
514          JRST NCOREA    ;USAGE COUNT FULL
515         ADDI I,1
516         DPB I,[350500,,T11MP(Q)]
517         JRST NCOREA
518 NCORE9:]
519 IFN PDP6P,[
520         CAIL D,PDP6BM_-10.      ;IS ABS PAGE # WITHIN RANGE OF PDP6 PAGES?
521          CAIL D,PDP6BM_-10.+LPDP6M
522           JRST NCOREB
523         SKIPL PDP6UP            ;IF SO, ALLOW PAGE COPYING, IFF PDP6 IS UP.
524          JRST NCORE6
525         JRST NCOREA
526
527 NCOREB:]
528         CAIL D,TSYSM
529          JRST NCORE6    ;DONT ALLOW POINTER TO PAGE ABOVE TOTAL SYSTEM MEMORY
530         LDB I,[MUR,,MEMBLT(D)]
531         CAIN I,MUHOLE   ;DON'T GIVE ABS PAGE THAT IS NXM.
532          JRST NCORE6
533 NCOREA: MOVEI I,%JSABS  ;INDICATE ABS REQ.
534         JRST NCORD0
535
536 EBLK
537 NCORQC: 0       ;COUNTS PASSES THRU NCORL, IF SOURCE IS DISK FILE.
538                 ;FORCES COMPLETE REPOSITIONING IN FILE THE 1ST TIME THRU.
539 BBLK
540 \f
541 ;THIS IS FOR DELETE RQS WHAT NCORL IS FOR INSERTS.
542 .SEE NCORL      ;ABOUT CIRPSW, ACS, ETC.
543                 ;ALSO SEE COMMENTS HALFWAY DOWN THIS PAGE.
544 NCORD:  TRNE C,-400
545          JRST OPNL33    ;PAGE NUM. OUT OF RANGE.
546         PUSH P,U
547         PUSH P,C
548 NCORD0: PUSH P,A        ;COME IN HERE ON VALID INSERT RQ.
549 NCORD1: MOVE U,TT
550         HRRZ A,-1(P)
551         PUSH P,T
552         PUSH P,B
553         PUSHJ P,UPLC    ;SAVE TIME BY CHECKING WHETHER PAGE EXISTS.
554         LDB B,T
555         SKIPE B
556          PUSHJ P,PAGERT ;IT EXISTS; DELETE IT.
557         POP P,B
558         POP P,T
559         POP P,A         ;FLAG WORD
560         POP P,C         ;TARGET PAGNUM
561         POP P,U
562         TRNN A,%CBRED+%CBWRT    ;IF NO ACCESS REQ, IS DELETE, THRU.
563          JRST NCORX
564 ;RH. OF A HAS ACCESS TO GRANT.  LH(A) HAS ORIGINAL CONTROL BITS.
565 ;IF I=%JSABS, ABS PAGE, NUM. IN B.
566 ;IF I=%JSNEW, FRESH PAGE.
567 ;IF 4.8 IN I SET, DISK PAGE POINTED TO BY CHNL IN I
568 ;ELSE OLD PAGE, B IS BP -> CIRC LIST, T -> OLD ACCESS.
569         PUSH P,C        ;-3
570         PUSH P,E        ;-2
571         PUSH P,TT       ;-1
572         PUSH P,A        ;0
573         TLNE I,NCOR$Q
574          JRST NCORQ2    ;INSERT PAGE FROM FILE
575         CAIN I,%JSABS
576          JRST NCORA     ;GO INSERT ABS PAGE
577         CAIE I,%JSNEW
578          JRST NCORR     ;GO INSERT REAL PAGE.
579         PUSH P,R
580         LSH C,9         ;INSERT FRESH PAGE.
581         MOVEI Q,(TT)    ;TARGET JOB
582         IDIVI TT,LUBLK  ;CLOBBERS I.
583         IORI TT,400000(C)
584         HRLI TT,204000
585         TLNE A,%CBPUB   ;MAYBE RQ PUBLIC
586          TLO TT,1000
587         PUSHJ P,NACRFL  ;PUT IN CORE RQ (FREES CIRPSW)
588          JRST NCORF1
589         POP P,R
590         PUSHJ P,SWTL
591             CIRPSW
592         HRRZ E,-3(P)    ;GET TARGET PAGE NUM
593         JRST NCORR2
594
595 NCORF1: SUB P,[5,,5]
596         JRST OPNL37     ;NO CORE OPNL.
597
598 ;COME HERE IF NEED TO WAIT FOR CORE AVAILABLE FOR NEW MMP PAGE.
599 NCORQW: PUSHJ P,LSWPOP  ;UNLOCK TUT.
600         PUSHJ P,LSWPOP  ;AND CIRPSW, SO CORE JOB CAN OPERATE.
601         MOVEI T,3       ;WAIT TILL MEM HAS BEEN FREED BY CORE JOB.
602         CAMLE T,LMEMFR
603          PUSHJ P,UFLS
604         PUSHJ P,SWTL    ;RE-LOCK CIRPSW
605          CIRPSW
606         MOVE TT,(P)
607         JRST NCORQB     ;THEN RETRY, RELOCKING TUT.
608 \f;FIND OR CREATE MMP ENTRY FOR BLOCK <- DISK CHNL IN I.
609 ;ACCESS TO GRANT IS IN A.
610 ;RETURNS STUFF IN B,T ACCORDING TO COMMENT
611 ;AFTER NCORD1 (IF NEW MMP, IT POINT TO SELF AND B -> IT)
612 NCORQ2: PUSH P,R
613         PUSH P,[NCORR3] ;RETURN TO NCORR3, SKIPPING UNLESS MMP FULL
614         MOVE TT,A
615         MOVE A,I
616 NCORQ7: PUSH P,TT       ;ENTRY FROM NLOAD
617 NCORQB: MOVE I,QDSKN(A)
618         MOVE W,QSLGL(A)
619         HRL W,I
620         PUSHJ P,QTLOCK
621         TRNE TT,%CBCPY  ;SPECIFIED COPY-ON-WRITE?
622          JRST NCORQ6    ;GET FRESH COPY OF PAGE
623         MOVE B,W        ;ELSE TRY TO SHARE EXISTING COPY OF PAGE
624         IDIVI B,SHRHSL  ;LOOK UP IN SHAREABLE-PAGE HASH TABLE
625         MOVEI B,SHRHSH-1(C)
626 NCORQ5: HRRZ B,1(B)     ;THREAD TO NEXT MMP ENTRY IN BUCKET
627         JUMPE B,NCORQ6  ;END OF LIST, DESIRED PAGE NOT FOUND
628         HLRZ C,1(B)     ;GET DISK ADDRESS OF THIS PAGE
629         LDB R,[$MMPUN,,(B)]
630         CAIN C,(W)
631          CAIE R,(I)
632           JRST NCORQ5   ;NOT THE ONE WE WANT
633         MOVEI R,(B)     ;SET UP MMP IDX IN R
634         SUB R,MMPEAD    ;AS GMMPP RETURNS IT.
635         PUSHJ P,QTULK   ;TUT ALREADY AOS'ED.
636         MOVSI T,MMPGON
637         TDNE T,(B)
638          JRST [ MOVSI T,MMPTMP  ;MMP ENTRY GOING AWAY.
639                 TDNE T,(B)      ;IF DISK TRANSFER ALSO IN PROGRESS,
640                  JRST NCRMMW    ; GO WAIT FOR THINGS TO SETTLE WITH CIRPSW FREE.
641                 PUSH P,A
642                 PUSHJ P,RETMM4  ;CLEAR PENDING FREEAGE
643                 POP P,A
644                 JRST NCORQB ]   ;AND TRY AGAIN
645         MOVEI C,-1
646         HRRZ T,(B)      ;GET CIRC PNTR OUT OF MMP ENTRY.
647         CAIL T,600000   ;SKIP IF DOESN'T POINT TO MEMORY
648          TDNE C,MMSWP-600000(T) ;SKIP IF IT'S A LOOSE PAGE
649           JRST NCORQ8
650         HRRZ C,MEMPNT-600000(T)
651         CAIE C,400000(R) ;SKIP IF NO USERS IN CIRCULAR LIST
652          JRST NCORQ8    ;NOT REALLY LOOSE, USERS LINKED BUT NOT CONNECTED
653         MOVEI C,0       ;REMOVE FROM LOOSE PAGE LIST
654         MOVE W,FLOOSP
655 NCORQ3: MOVE TT,C       ;TT PREDECESSOR
656         SKIPN C,W       ;W SUCCESSOR
657          JRST 4,.       ;NOT IN LOOSE PAGE LIST?
658         LDB W,[MLO,,MEMBLT(C)]
659         CAIE C,-600000(T)
660          JRST NCORQ3
661         SKIPE TT
662          DPB W,[MLO,,MEMBLT(TT)]
663         SKIPN TT
664          MOVEM W,FLOOSP
665         SKIPN W
666          MOVEM TT,LLOOSP
667         SOSL NLOOSP
668          JRST NCORQ8
669         JRST 4,.        ;NLOOSP WAS TOO SMALL?
670
671 NCORQ6: SOSGE MMPFR     ;NEED TO CREATE NEW MMP ENTRY; COMMIT ONE
672          JRST [ AOS MMPFR       ;MMP FULL
673                 JRST POPTTJ ]   ;TAKE ERROR RETURN
674         PUSHJ P,GMMPP   ;GET FREE MMP ENTRY (CAN'T PCLSR AFTER THIS SUCCEEDS)
675          JRST NCORQW    ;WAIT FOR MORE MEM
676         PUSHJ P,QTAOS1  ;AOS TUT FOR BLOCK (TUT ALREADY LOCKED)
677         HRLZM W,1(TT)   ;STORE DISK ADR
678         MOVE D,R
679         IOR D,[MMPOUT+MMPWOD,,400000]   ;SWAPPED OUT, MMP POINTING TO SELF
680         DPB I,[$MMPUN,,D]
681         MOVE C,(P)      ;A
682         TRNE C,%CBCPY
683          TLCA D,MMPWOD+MMPISW   ;COPYING, SO SET INITIAL-SWAPIN
684           JRST [ MOVE B,W       ;NO COPYING, SO
685                  IDIVI B,SHRHSL ;STICK INTO SHAREABLE-PAGE HASH TABLE
686                  MOVE B,SHRHSH(C)
687                  HRRM B,1(TT)
688                  HRRZM TT,SHRHSH(C)
689                  TLO D,MMPSHR   ;FLAG MMP ENTRY AS IN SHRHSH TABLE
690                  JRST .+1 ]
691         MOVEM D,(TT)
692         HRRZ B,TT
693         AOS NPGSWO
694 NCORQ8: MOVE T,[300,,[3]]
695         HRLI B,2200
696         AOS -1(P)       ;SUCCESS RETURN
697         JRST POPTTJ
698 \f
699 NCORA:  MOVEI A,(C)
700         MOVE U,TT       ;INSERT ABS PAGE.
701         PUSHJ P,UPLC    ;FIND TARGET PAGE
702         IOR B,(P)               ;COMBINE ACCESS W/ PAGE NUM.
703         TRZ B,PMAGEM\PMUNSD\PMCSHM
704 IFE KA10P,[
705         TRNE B,PMRCM    ;PAGE 0 NOT CACHED
706          IORI B,PMCSHM
707 ]
708         LDB D,T
709         TRZ D,PMAGEM    ;TURN OFF REMNANT AGE BITS
710         JUMPN D,[JRST 4,.]      ;SHOULD HAVE DELETED PAGE ALREADY
711         DPB B,T
712         MOVNI B,1       ;CIRC. PTR. IS -1.
713         DPB B,Q
714         MOVEI E,(A)
715         JRST NCORR2
716
717  ;VIRTUAL PUSHJ AT NCORQ2
718 NCORR3:  JRST [ SUB P,[5,,5]    ;MMP WAS FULL
719                 JRST OPNL37 ]
720         POP P,R         ;COME HERE FOR DSK PG, AFTER FINDING MMP.
721         MOVE C,QRADAD(A)        ;MOVE ACCESS POINTER OF FILE TO
722         IDIVI C,@QSBYTE(A)      ;NEXT PAGE BOUNDARY, BEING CAREFUL
723         IORI C,1777             ;ABOUT BYTES.
724         AOS C
725         IMULI C,@QSBYTE(A)      ;NEXT USE OF FILE WILL GET
726         MOVEM C,QRADAD(A)       ;WHAT FOLLOWS PAGES MAPPED.
727         MOVSI C,%QAACC  ;INDICATE ACCESS PTR CHANGED.
728         IORM C,QSRAC(A)
729 ;COME HERE TO INSERT PG FROM OTHER USER.
730 NCORR:  HRRZ E,-3(P)    ;TARGET PAGE # C
731         HRRZ U,-1(P)    ;TARGET JOB TT
732         HRRZ TT,(P)     ;ACCESS (WRITE BIT IN 2.9)
733         PUSHJ P,NCORR1  ;ACTUALLY MUNG MAP.
734 NCORR2: PUSHJ P,GHUSRA  ;TARGET PAGE NUM MUST BE IN E
735         POP P,A
736         POP P,TT
737 NCORA1: POP P,E
738         POP P,C
739 ;COME HERE AFTER HANDLING 1 PAGE.
740 NCORX:  MOVE U,USER
741         CLRPGM (U)
742         JUMPGE C,NCORX1 ;IF LH POS, DON'T REWRITE.
743         ADD C,[1,,1]
744         ADDI E,1
745         UMOVEM C,@SRN3(U)
746         SKIPL SRN4(U)   ;REWRITE 5TH ARG ONLY IF WAS GIVEN.
747          UMOVEM E,@SRN4(U)
748         JUMPGE C,NCORX1
749         TLNN A,%CBRED
750          JRST NCORD     ;LOOP AROUND FOR DELETE RQ
751         JRST NCORL      ;FOR INSERT RQ.
752
753 NCORX1: AOS (P)
754 NCORX0: PUSHJ P,LSWPOP  ;FREE CIRPSW
755 NCORX2: CAIN TT,(U)     ;IF NOT ACTING ON SELF,
756          POPJ P,
757         JRST LSWPOP     ;CAN'T FALL THRU SINCE MIGHT BE NULSET.
758
759 ;THIS IS A LOSSET ROUTINE TO CLEAR THE BSSTP BIT OF THE JOB
760 ;WHOSE INDEX IS IN THE SRN5 OF THE RUNNING JOB.
761 NCORFS: MOVE A,SRN5(U)
762         MOVSI T,BSSTP
763         ANDCAM T,USTP(A)
764         POPJ P,
765 \f;JSP T,NCORUI   WITH JOB-SPEC IN J, RETURNS USER IDX IN J (OR ,,-1 FOR PDP6)
766
767 ;JOB SPECS ARE:
768 ;  -1  OR  ,,-1    FOR SELF.
769 ;  <CHNL-NUM>      (MUST BE USR, STY, JOB OR BOJ DEVICE ELSE OPNL34)
770 ;  400000+<USR NUM>  JOB WITH THAT NUMBER (OPNL35 IF NONE)
771 ;   (  -1,,<USR NUM>  ALSO WORKS)
772 ;IF THIS JOB IS CERTAINLY ALLOWED TO MODIFY SPEC'D JOB, DOESN'T SKIP.
773 ;IF SKIPS ONCE, MUST CHECK FARTHER.  IN EITHER CASE, DIELOK OF JOB HAS BEEN AOS'D
774 ;AND SOSSET'ED, UNLESS ENTRY POINT WAS NCRUI2, OR JOB IS PDP6.
775 ;2 SKIPS => ARG IS RANDOM I-O CHANNEL; CLSTB ENTRY IN H.
776 ;IN THAT CASE, NO SOSSET WAS DONE. RANDOM CHANNELS ALLOWED ONLY IF ENTRY POINT IS NCRUI1.
777
778 NCRUI2: HRLI T,200000   ;ENTRY TO SUPPRESS AOS'ING OF DIELOK, AND SOSSET'ING.
779         JRST NCRUI3
780
781 NCRUI1: TLOA T,400000   ;ENTRY FOR RANDOM CHNLS OK (SKIP TWICE IF SO)
782 NCORUI:  TLZ T,400000   ;RANDOM DEVS NOT OK
783         TLZ T,200000
784 NCRUI3: TRZE J,400000
785          HRLI J,-1
786         JUMPL J,NCORU1
787         CAIL J,NIOCHN   ;>0 => CHNL NUM.
788          JRST OPNL14
789         ADDI J,IOCHNM(U)
790         MOVE H,(J)
791         HLRZ J,H
792         SKIPGE H,CLSTB(H)
793          JRST NCORU4    ;IF INFERIOR, CAN WRITE.
794         TLNE H,%CLSBJ   ;OR IF BOJ DEVICE
795          JRST [HRRZ J,JBCUI(J) ? JRST NCORU4]
796         TLNE H,%CLSST   ;STY => USE JOB THAT HAS ASSOCIATED TTY.
797          JRST [ SKIPGE J,TTYSTS(J)
798                  JRST OPNL41    ;NO JOB HAS THAT TTY.
799                 ANDI J,-1
800                 JRST NCORU4]
801         TLNE H,%CLSFU   ;FOREIGN USR, MUST CHECK.
802          AOJA T,NCORU4
803 IFN PDP6P,[
804         TLNN H,%CLS6
805          JRST NCORU5    ;RANDOM DEVICE. (MAYBE DISK)
806 NCRUI6: MOVEI J,-1      ;PDP6, MUST CHECK.
807         JRST 1(T)
808 ];PDP6P
809 NCORU5: JUMPL T,2(T)    ;RANDOM DEVICE, SKIP TWICE IF THATS OK
810         JRST OPNL34
811
812 NCORU1: TRNE J,777400   ;CHECK FOR -1 FOR SELF.
813          JRST NCORU2
814         ANDI J,377
815         CAIN J,377      ;CHECK FOR 377 => SUPERIOR.
816          JRST NCORU3
817 IFN PDP6P,[             ;AND FOR 376 => PDP6.
818         CAIN J,376
819          JRST NCRUI6
820 ]
821         IMULI J,LUBLK   ;ELSE WAS USRNUM,
822         CAMGE J,USRHI   ;CHECK FOR VALID USER
823          SKIPN UNAME(J)
824           JRST OPNL35   ;IF NOT, NO SUCH JOB.
825         AOJA T,NCORU4
826
827 NCORU2: CAME J,[-1,,377777]
828          JRST OPNL33
829         MOVEI J,(U)
830 NCORU4: CONO PI,CLKOFF
831         MOVE H,APRC(J)  ;IS THE JOB WE'RE HACKING DIEING?
832         TLNE H,BULGOS
833          JRST OPNL42    ;YES, PREVENT TIMING ERRORS.
834         TLNE T,200000   ;UNLESS ENTRY POINT WAS NCRUI2,
835          JRST NCORU6
836         AOS DIELOK(J)   ;PREVENT THE JOB FROM DIEING.
837         PUSH P,T
838         PUSHJ P,SOSSET
839          DIELOK(J)
840         POP P,T
841 NCORU6: CONO PI,CLKON
842         JRST (T)
843
844 NCORU3: SKIPGE J,SUPPRO(U)      ;GET SUPERIOR,
845          JRST OPNL35
846         MOVEI J,(J)
847         AOJA T,NCORU4
848 \f
849 ;SKIP IF ALLOWED WRITE ACCESS TO PAGES FROM SOURCE IN J
850 ;USE IF NCORUI ETC. SKIPS ONCE.  CALL BY JSP T,.
851
852 NCORW1:
853 IFN PDP6P,[
854         CAIN J,-1       ;IF IT GETS THIS FAR, USER HAS A PDP6 CHANNEL,
855          JRST 1(T)      ; THEREFORE OBVIOUSLY IS ALLOWED TO WRITE PDP6 MEMORY.
856 ];PDP6P
857         CAIE J,LUBLK    ;CAN GET WRITE ACCESS TO FRESH PAGE,
858 ;SKIP IF ALLOWED TO MODIFY PAGE MAP OF TARGET JOB IN J.
859 NCORWR:  CAIN J,(U)     ;CAN DO THAT AND STICK PAGE IN SELF
860           JRST 1(T)
861         HRRZ H,SUPPRO(J)
862         CAIE U,(H)      ;AND OUR INFERIORS
863          CAMN U,SERVER(J)       ; and anyone who thinks we are a server
864           JRST 1(T)
865         SKIPL H,JBI(U)  ;AND OUR BOJ DEVICE.
866          CAIE J,JBCUI(H)
867           JRST (T)
868         JRST 1(T)
869 \f
870 ;.CBLK AC,
871 ;(OBSOLESCENT)
872         ;AC 4.9 MUST BE ZERO
873         ;4.7 USED INTERNALLY IN CODE (W RQ ON PDP6)
874         ;4.3-4.1 = 0 GET PAGE FROM SELF
875         ;       = 1 GET ABSOLUTE PAGE
876         ;       = 2 GET PAGE FROM USER OPEN ON CH # 3.1-3.8
877         ;       = 3 GET PAGE FROM USER NUMBER 3.1-3.8
878         ;       = 4 GET PAGE
879         ;       = 5 GET PAGE (PUBLIC)
880         ;       = 6 MAKE PAGE PRIVATE
881         ;       = 7 MAKE PAGE PUBLIC
882         ;3.9=1 REQUEST WRITE PERMISSION (IGNORED ON FRESH PAGE, OTHERWISE VALID ONLY FOR
883         ;               SELF OR DIRECT INFERIOR OPEN ON CH OR PUBLIC PAGE)
884         ;3.1-3.8  USER NUMBER OR CH # (377 => CREATOR IF JOB DEVICE)
885         ;2.9=1 INSERT PAGE, 0 DELETE (IGNORES 4.3-4.1 EXCEPT FOR 6 OR 7 WHEN IT IS IGNORED)
886         ;2.1-2.8 VIRTUAL PAGE TO BE AFFECTED
887         ;1.1-1.9 BLOCK # IN ABSOLUTE OR OTHER USER (OR SELF IF 4.3-4.1 = 0)
888
889 ;TO CALL NCBLK, SET UP Q WITH USER INDEX REQUEST IS FOR AND U WITH
890 ;THE USER INDEX MAKING THE REQUEST
891
892 ;NEW .CBLK CODE, PASSES THE BUCK TO CORBLK.
893 ;SAME AS FAR AS CALLER IS CONCERNED.
894
895 ACBLK:  MOVE TT,U       ;TARGET USR IDX.
896         UMOVE B,(J)
897 NCBLK0: MOVEI W,5       ;FAKE 5 ARGS TO NCORBL
898         LDB C,[111000,,B]       ;TARGET PAGNUM.
899         LDB E,[1100,,B] ;SOURCE PAGNUM.
900         TRNN B,400000
901          JRST NCBLKD    ;LIKELY TO BE DELETE RQ.
902 NCBLK1: MOVSI A,210000  ;NOT DELETE => RQ READ, FAIL IF CAN'T.
903         LDB D,[221000,,B]       ;SOURCE USR IDX OR CHNL NUM.
904         LDB H,[330300,,B]       ;REQUEST TYPE-CODE.
905         JRST .+1(H)
906
907         JRST NCBLKS     ;TYPE 0, SOURCE IS SELF.
908         JRST NCBLKA     ;TYPE 1, GET ABS PAGE.
909         JRST NCBLKC     ;2, USE SPEC'D CHNL NUM.
910         JRST NCBLKI     ;3, USE SPEC'D USR IDX.
911         JRST NCBLKF     ;4, FRESH PAGE.
912         JRST NCBLKP     ;5, FRESH PUBLIC PAGE.
913         TLOA A,420000   ;6, MAKE PRIVATE, SOURCE=TARGET.
914         TLO A,440000    ;7, MAKE PUBLIC,    "      "
915         MOVE E,C        ;SOURCE PAGNUM _ TARGET PAGNUM,
916 NCBLKS: TROA D,-1       ;GET PAGE FROM SELF. (%JSELF=-1)
917 NCBLKA:  MOVEI D,%JSABS ;GET ABS PAGE
918 ;IF GET-FROM-CHANNEL, THE CHNL NUM IN D IS DESIRED JOB-SPEC.
919 NCBLKC: TLNE B,400      ;IF WRITE-RQ BIT ON,
920          TLO A,100000   ;INSIST ON WRITE ACCESS.
921 NCORBX: CAIE TT,(U)     ;IF TARGET .NE. SELF,
922          PUSHJ P,NULSET  ;FAKE OUT THOSE EXPECTING A LOSSET.
923         JRST NCORB9
924
925 NCBLKI: IORI D,%JSNUM   ;GET FROM USR IDX, MAKE JOB SPEC.
926         JRST NCBLKC
927
928 NCBLKP: TLO A,40000     ;GET FRESH PUBLIC PAGE.
929 NCBLKF: MOVEI D,%JSNEW  ;GET FRESH PAGE
930         JRST NCBLKC
931
932 NCBLKD: TLC B,6000      ;COME HERE IF BIT 2.9 IS 0
933         TLCN B,6000
934          JRST NCBLK1    ;(TYPES 6,7 IGNORE THAT BIT)
935         SETZB A,B       ;OTHERWISE IS DELETE REQUEST.
936         JRST NCBLKS
937
938 NCBLK:  MOVE B,TT
939         MOVE TT,Q
940         JRST NCBLK0
941 \f
942 ;ACTUALLY COPY A PAGE FROM ONE MAP TO ANOTHER
943 ;T PNTR TO MAP COPYING FROM
944 ;TT 400000 BIT 1=> WRITE
945 ;E TARGET PAGE #
946 ;U TARGET USER
947 ;B PNTR TO CIRC LIST
948
949 NCORR1: LDB J,T         ;ENTRY FROM NCORR
950         TRNN J,600000
951          JRST ACBK3A    ;PAGE NON EXISTANT OR SWAPPED OUT
952         TRNN TT,400000  ;WRITE RQ ?
953          TRZ J,400000   ;DOESN'T RQ MORE
954         TRNN J,600000
955          TRO J,200000   ;IN CASE OF RWF
956 ACBK3B: MOVE A,E        ;TARGET PAGE #
957         PUSHJ P,UPLC
958         LDB C,T         ;GET PTW ABOUT TO BE CLOBBERED
959         TRZ C,PMAGEM    ;TURN OFF AGE BITS
960         JUMPN C,[JRST 4,.]      ;SHOULD HAVE DELETED PAGE BY NOW
961         DPB J,T         ;SET UP MAP
962         TRNN J,600000
963          JRST ACBK3C    ;JUMP IF PAGE SWAPPED OUT
964         ANDI J,PMRCM
965         CAIL J,TSYSM
966          JRST 4,.
967 IFE SWPWSP,     AOS MMSWP(J)    ;AOS NUMBER OF USERS POINTING TO PAGE
968 IFN SWPWSP,[
969         HRRZ TT,MMSWP(J)
970         AOS MMSWP(J)    ;AOS NUMBER OF USERS POINTING TO PAGE
971         MOVSI C,1       ;ADJUST WORKING SET OF TARGET JOB
972         IDIV C,TT       ;1,,0 IF DIVISION BY ZERO
973         ADDM C,UWRKST(U)
974         JUMPE TT,ACBK3D ;JUMP IF NO SHARERS
975         IMULI TT,1(TT)  ;COMPUTE ADJUSTMENT TO ALL WORKING SETS
976         MOVSI C,-1      ;DUE TO INCREASE IN SHARING
977         IDIV C,TT
978         MOVE D,C
979         PUSH P,U
980         PUSH P,I
981         PUSHJ P,UCPRL7  ;CLOBBERS C,H,I,U
982             400000,,SWOP6B
983         POP P,I
984         POP P,U
985 ];SWPWSP
986 ACBK3D: LDB J,B         ;POINTER TO PREVIOUS IN CHAIN
987         DPB J,Q         ;PATCH
988         MOVE C,U
989         IDIVI C,LUBLK
990         DPB C,[101000,,A]
991         DPB A,B         ;PATCH
992         AOS NMPGS(U)
993         AOS SNMPGS      ;SYSTEM HAS 1 MORE PAGE
994         POPJ P,
995
996 ACBK3A: TRNN TT,400000
997          TRZ J,2
998         TRO J,1         ;IN CASE OF R/W/F
999         JRST ACBK3B
1000
1001 ACBK3C: AOS NSWPGS(U)
1002         AOS SNSWPG
1003         JRST ACBK3D
1004 \fACRF1: MOVE TT,B
1005         MOVE W,Q        ;INDEX OF USER THAT REQUEST IS FOR
1006         IDIVI W,LUBLK   ;CLOBBERS H
1007         HRL TT,W
1008         TLNE TT,600000
1009          JRST 4,.
1010         JRST ACRFL
1011
1012 NACRFL: PUSHJ P,LSWPOP  ;UNLOCK CASW OR CIRPSW
1013 ACRFL:  PCLT
1014         SKIPL CORRQ(U)  ;CURRENT USER IN U COR RQ FOR USER IN Q
1015          PUSHJ P,UFLS   ;WAIT FOR MY CORE RQ TO CORE JOB TO CLEAR
1016         MOVSI J,BUSRCR
1017         MOVE T,J
1018         TDNE T,APRC(Q)
1019          PUSHJ P,UFLS   ;SOMEBODY ELSE HAS RQ IN ON THIS JOB WAIT TO CLEAR
1020         PUSHJ P,SWTL
1021             CASW        ;GET CORE ASSIGN SW
1022         TDNE J,APRC(Q)
1023          JRST NACRFL    ;CHECK FOR TIMING ERROR
1024         TLNN TT,200000
1025          JRST ACRF6     ;OLD TYPE
1026         MOVNI J,1       ;ADDING ONE BLOCK
1027         MOVEI B,105     ;FAKE OUT CORE TO ZERO CHECK
1028         JRST ACRF8
1029
1030 ACRF6:  MOVE J,HUSRAD(Q)
1031         LSH J,-10.
1032         CAMN J,B
1033          JRST LSWPJ1    ;SAME AMOUNT AS NOW
1034         MOVE T,APRC(Q)
1035         TLNE T,BULGOS
1036          JUMPN B,LSWPOP ;TRYING TO CORE NON-ZERO A JOB THAT IS DYING?
1037         SUB J,B         ;GET AMT OF DECREASE (- => INCREASE)
1038         CAMGE J,[-20.]
1039          JRST ACRF6A    ;GET 20 AT A WHACK MAX
1040 ACRF8:  MOVN I,J        ;I GETS POSITIVE # OF PAGES ADDED
1041         ADD J,MEMFR
1042         SUB J,NCBCOM    ;J GETS AMT THAT WILL BE LEFT
1043         CAIGE J,5
1044          JUMPG I,ACRF7  ;NOT ENUF CORE
1045         MOVEI J,0       ;INDICATE RQ WILL BE COMPLETELY SATISFIED
1046         CAIL I,20.
1047          MOVNI J,1      ;MAKE SURE RQ IS REALLY FILLED
1048 ACRF5:  JUMPL I,ACRF2   ;JUMP IF DECREASING CORE
1049         JUMPE Q,ACRF3   ;SYSTEM JOB DOESN'T USE MMP
1050         MOVN T,I
1051         ADDB T,MMPFR    ;COMMIT SUFFICIENT NUMBER OF MMP ENTRIES
1052         JUMPGE T,ACRF3  ;JUMP IF THAT MANY ARE AVAILABLE
1053         ADDM I,MMPFR    ;MMP FULL, DECOMMIT THE MMP ENTRIES
1054         JRST LSWPOP     ;AND TAKE ERROR RETURN
1055
1056 ACRF2:  AOSA NCRQL      ;COUNT # REQUESTS FOR LESS
1057 ACRF3:   ADDM I,NCBCOM  ;IF EXPANDING, COMMIT SUFFICIENT AMOUNT OF PHYSICAL CORE
1058         MOVSI T,BUSRCR
1059         IORM T,APRC(Q)  ;CORING USER
1060         MOVEM TT,CORRQ(U)
1061         AOS NCORRQ
1062         PUSHJ P,LSWPOP  ;UNLOCK
1063 IFN SCHBLN,[
1064         CONO PI,CLKOFF  ;GET CORE JOB TO RUN RIGHT AWAY
1065         MOVE I,USER     ;THEN COME RIGHT BACK TO US (WHAT A CROCK THIS ALL IS)
1066         PUSHJ P,SCHSB
1067         MOVEI I,LUBLK
1068         PUSHJ P,SCHSB
1069         CONO PI,CLKON
1070 ];SCHBLN
1071         PCLT
1072         SKIPL CORRQ(U)  ;WILL NOT SKIP AT FIRST
1073          PUSHJ P,UFLS
1074         JUMPN J,ACRF1   ;REALLY NEED TO TAKE ANOTHER WACK AT THIS
1075         JRST POPJ1
1076
1077 ACRF7:  PUSHJ P,LSWPOP
1078         PCLT
1079         MOVE T,I
1080         PUSHJ P,CFHPO3
1081          PUSHJ P,UFLS
1082         TLNE TT,200000
1083          JRST ACRFL
1084         JRST ACRF1
1085
1086 ACRF6A: ADDI J,20.
1087         ADD TT,J        ;GET REDUCED RQ
1088         MOVNI J,20.
1089         JRST ACRF8
1090 \f
1091 SUBTTL CORE ALLOCATOR - CORE JOB ROUTINES
1092
1093 CORJI:  MOVE P,USRPDL+L ;SET UP CORE JOB PDL
1094         JRST CORJOB
1095
1096 CORJ2:  AOSN UTBFLF
1097          JRST UTBFF     ;FLUSH UTAPE
1098         AOSN UFDFLF
1099          JRST UFDFF     ;FLUSH 2314 UFDS
1100         SKIPE MMPFS2
1101          JRST RETMM2    ;FLUSH PARTIALLY-RETURNED MMP ENTRIES
1102         SKIPE QFBTS
1103          JRST [ PUSHJ P,QDLFBT  ;RETURN DISK BLOCKS TO FREE
1104                 SOS NCORRQ
1105                 JRST CORJOB ]
1106         SKIPE NCRQL
1107          JRST CORJOB    ;RQ'S FOR LESS HAVE COME IN. BETTER EXECUTE THEM OR MAY NOT HAVE ENUF CORE
1108         SKIPL CORUPU
1109          JRST CORUP     ;FOUND USER IN SEARCH WHO WANTS MORE GIVE IT TO HIM
1110         SKIPL CORSRV
1111          JRST CORJOB
1112         MOVE A,LMEMFR
1113         CAMGE A,MINCOR
1114          PUSHJ P,CFLM1  ;FREE SOME LOW MEMORY BY SHUFFLING
1115         SKIPLE NCORRQ
1116          SOS NCORRQ     ;CAN'T FIND ANYTHING TO DO SO DECREMENT COUNT
1117                 ;THIS CAN HAPPEN AS A RESULT OF EXCESS ATTEMPTED UTAPE FLUSHAGE
1118                 ;OR DUE TO CALLING CFLM1
1119 CORJOB: PUSHJ P,ACMTC   ;XFER ANY "SPECIAL FREE" MEM BLOCKS TO FREE
1120         SKIPN NCORRQ    ;ANYONE WANT CORE?
1121          PUSHJ P,[      ;IF NOT, WAIT UNTIL SOMEONE DOES, BUT FIRST
1122                 MOVE TT,QMDRO   ;SEE IF MFD AND TUTS NEED TO BE READ IN
1123                 AOJE TT,IDSK
1124                 JRST UFLS ]     ;WAIT
1125         SETOM CORSRV    ;INITIALIZE NO RQS SERVED THIS PASS
1126         SETOM CORUPU
1127         MOVNI U,LUBLK   ;SCAN FOR USER WITH HIGHEST PRIORITY
1128 CORLUP: ADDI U,LUBLK
1129         CAML U,USRHI
1130          JRST CORJ2     ;THRU EXAMINE RESULTS OF SEARCH
1131         SKIPGE B,CORRQ(U)
1132          JRST CORLUP
1133         TLNE B,200000
1134          JRST CORNEW
1135         LDB Q,[221000,,B]
1136         IMULI Q,LUBLK
1137         MOVE A,HUSRAD(Q)
1138         LSH A,-10.      ;COMPUTE # BLKS JOB HAS NOW
1139         CAIN A,(B)
1140          JRST 4,CORL1   ;SAME AS NOW, CHECKED FOR AT ACORE
1141         CAIG A,(B)
1142          JRST CORLUG    ;INCREASE
1143         MOVEM U,CORUPU  ;DECREASE HAS PRIORITY
1144         HRRZS B
1145         SUB B,A
1146         MOVEM A,CORUPS
1147         MOVEM B,CORUPA  ;DIFFERENCE
1148         MOVEM Q,CORUUC
1149         JRST CORUP
1150 \f
1151 CUSTOP: PUSHJ P,RPCLSR  ;STOP USER WHO IS BEING CORED
1152         MOVSI T,BUCSTP  ;(THE BUCK STOPS HERE)
1153         IORM T,USTP(A)
1154         PUSHJ P,UPCLSR
1155         MOVEI T,-1      ;GET MASK FOR RH
1156         TDNE T,USTP(A)  ;WAIT FOR RANDOM STOPS TO CLEAR
1157          PUSHJ P,UFLS
1158         POPJ P,
1159
1160 ;Core job initializes disks while system job stands around and supervises
1161 ;This makes it possible for system job to print any resulting error messages
1162 ;Provided no one hits ^Z too soon
1163 IDSK:   MOVE I,MDSK
1164         MOVE U,USER
1165         PUSHJ P,QMCH1
1166         MOVSI I,-NQS
1167         SKIPL QACT(I)
1168          PUSHJ P,QTCH1
1169         AOBJN I,.-2
1170         MOVSI TT,SCLIDK         ;System is up now
1171         IORM TT,SUPCOR
1172         JRST CORJI
1173
1174 EBLK
1175
1176 CORUPU: -1      ;BEST USER SO FAR TO CHANGE CORE
1177                 ;IF SETOMED AT CORUPR, REQUEST NOT COMPLETELY FILLED
1178 CORUPA: 0       ;INCREASE AMOUNT(1 FOR .CBLK)
1179 CORUPS: 0       ;CURRENT SIZE
1180 CORUUC: 0       ;USER CORE REQ ACTUALLY FOR
1181 CORSRV: -1      ;0 => RQ SRVED THIS TIME THRU USER VARS
1182 NCRQL:  0       ;# RQS FOR LESS
1183
1184 BBLK
1185
1186 CORLUG: HRRZS B ;GUY WANTS MORE GIVE GUY WHO WANTS LEAST PRIORITY
1187         SUB B,A
1188 CORLUH: MOVE A,NMPGS(Q)
1189         SKIPGE CORUPU
1190         JRST CORLG1     ;FIRST
1191         CAMGE B,CORUPA  ;IS RQ SMALLER?
1192         JRST CORLG1
1193 CORLG2: CAME B,CORUPA   ;OR IF TIE GIVE IT TO GUY WHO IS SMALLER NOW
1194         JRST CORG1A
1195         CAML A,CORUPS   ;IS RQ= & SIZE SMALLER?
1196         JRST CORG1A
1197 CORLG1: MOVEM U,CORUPU  ;HIGHEST PRIORITY SO FAR
1198         MOVEM B,CORUPA
1199         MOVEM A,CORUPS
1200         MOVEM Q,CORUUC
1201 CORG1A: JRST CORLUP
1202
1203 CORNEW: LDB Q,[1100,,B]         ;.CBLK TYPE RQ
1204         IMULI Q,LUBLK
1205         MOVEI B,1
1206         JRST CORLUH
1207 \f
1208 CORUP:          ;EXECUTE REQUEST
1209         MOVE U,CORUUC
1210         MOVEM U,CUSER
1211         SKIPL D,CORUPU
1212          SKIPN UNAME(U)
1213           JRST 4,.
1214         MOVE A,CORUUC
1215         JUMPE A,CORUP8  ;DONT USTOP SYS JOB
1216         PUSHJ P,CUSTOP  ;STOP GUY
1217 CORUP8: PUSHJ P,SWTL
1218             CIRPSW
1219         MOVE TT,CORRQ(D)
1220         TLNE TT,200000
1221          JRST CORUPN    ;.CBLK TYPE
1222         MOVE B,CORUPS
1223         MOVE A,B        ;A HAS CURRENT SIZE
1224         ADD B,CORUPA    ;B HAS NEW SIZE
1225         PUSHJ P,SWTL
1226             MEMFRZ
1227         SKIPL J,CORUPA
1228          JRST CORM1C    ;WANTS MORE THAN NOW
1229 CORL2:  LDB A,[121100,,HUSRAD(U)]
1230         CAMG A,B
1231          JRST CORUPR
1232         SOS A
1233         PUSH P,B
1234         PUSHJ P,UPGRTN  ;RETURN USER PG
1235         POP P,B
1236         JRST CORL2
1237
1238 CORUPR: MOVE U,CUSER    ;FINISHED FOR NOW ANYWAY REVIVE USER
1239         SKIPN UNAME(U)
1240          JRST 4,.
1241 IFN E.SP,[
1242         CAMN U,DISUSR
1243          PUSHJ P,E.SLPM ;LOAD PAGE MAP
1244 ]
1245 IFN 340P,[
1246         CAMN U,DISUSR
1247          PUSHJ P,DCRRST ;DIS IS RUNNING BUT UPDATE UPR ETC
1248 ]
1249         MOVSI A,BUCSTP
1250         ANDCAM A,USTP(U)        ;RESTART USER
1251         PUSHJ P,LSWPOP  ;UNLOCK MEMORY
1252         PUSHJ P,LSWPOP
1253         PUSHJ P,ACMTC   ;XFER IN PROCESS BLOCKS TO FREE
1254         SKIPGE U,CORUPU
1255          JRST CORJOB    ;NOT THRU WITH THIS RQ
1256         MOVE A,CORUUC   ;THRU WITH RQ
1257         SETOM CORUPU
1258         SKIPGE CORUPA
1259          SOS NCRQL      ;FINISHED A REQUEST FOR LESS, DECREMENT COUNT OF THEM
1260         MOVSI TT,BUSRCR
1261         ANDCAM TT,APRC(A)       ;CLEAR RQ PENDING THIS USER FLAG
1262 CORL1:  SETOM CORRQ(U)
1263         CLEARM CORSRV
1264         SOSE NCORRQ
1265          JRST CORLUP
1266         JRST CORJOB
1267 \f
1268 CORUPN: LDB A,[111000,,TT]
1269         PUSHJ P,SWTL
1270             MEMFRZ
1271         PUSH P,A
1272         PUSHJ P,UPGRTN
1273         POP P,E
1274         TLNE TT,4000
1275          TRNN TT,400000
1276           JRST 4,.
1277         TLO E,600000+PMCSHM     ;ADD FRESH PAGE
1278         PUSH P,TT
1279         PUSHJ P,CORGP
1280         POP P,TT
1281         LDB A,[111000,,TT]
1282         PUSHJ P,UPLC
1283         LDB B,T
1284         TRNN B,400000
1285          JRST 4,.       ;LOSEY
1286         MOVE C,Q
1287         PUSHJ P,UCPRL
1288             200000,,[   LDB B,[330100,,TT]
1289                         DPB B,[430100,,(C)]
1290                         POPJ P, ]       ;SET TO DESIRED PUBLICNESS
1291         SOS NCBCOM
1292         JRST CORUPR
1293
1294 CORM1C: MOVEM J,CORCNT
1295 CORM1A: JUMPE U,CORS2   ;SNIFFLE
1296 CORM1B: MOVE U,CORUUC
1297         LDB E,[121100,,HUSRAD(U)]
1298         TLO E,600000+PMCSHM
1299         PUSHJ P,CORGP
1300         SOS NCBCOM
1301         SOSLE CORCNT
1302          JRST CORM1A
1303         JRST CORUPR
1304
1305 \f;INSERT FRESH PAGE INTO USR MEM IN PLACE SPECIFIED BY E PROT BITS IN LH
1306 ;MMPFR SHOULD HAVE BEEN SOS'ED ALREADY
1307
1308 CORGP:  JUMPN U,CORGP0  ;JUMP UNLESS GIVING PAGE TO SYS JOB
1309         MOVE A,SJSPG    ;GOBBLE PAGE RESERVED
1310         SETZM MEMBLT(A)
1311         CAIL A,SYSB
1312          JRST CORGP1    ;USER VARIABLES, CLEAR IT OUT
1313         JRST CORGP2     ;INITIAL GET OF SYSTEM, DON'T ZERO IT
1314
1315 CORGP0: PUSHJ P,GMMPP   ;RETN MMP PNTR IN R
1316          JRST CORGPZ
1317         PUSHJ P,TCALL
1318           JRST HMEMRQ   ;GET MEM, HIGH IF POSSIBLE
1319          JRST 4,.
1320 CORGP1: PUSHJ P,CZRR
1321 CORGP2: AOS NMPGS(U)
1322         AOS SNMPGS      ;INCR SYS PAGE COUNT (VIRT)
1323         PUSH P,A        ;REAL CORE BLOCK #
1324         HRRZ A,E        ;ADDR IN USERS MAP
1325         PUSHJ P,UPLC
1326         POP P,A
1327         LDB B,Q
1328         SETZM MMSWP(A)
1329         JUMPE U,CORGP3  ;IF SYS JOB, DON'T TRY TO SET UP MAP
1330         JUMPN B,[JRST 4,.]      ;ALREADY HAS PAGE
1331         AOS MMSWP(A)    ;INDICATE THAT ONE USER MAP POINTS AT THIS PAGE
1332         TSO A,E         ;SET PROTECTION BITS
1333         DPB A,T         ;STORE IN USER'S MAP
1334         MOVE C,R        ;MMP IDX
1335         TRO R,400000    ;MAKE USERS CP POINT AT MMP
1336         DPB R,Q
1337 IFN SWPWSP,[
1338         MOVSI TT,1      ;INCREASE WORKING SET
1339         ADDM TT,UWRKST(U)
1340 ];SWPWSP
1341         ANDI A,PMRCM    ;TURN ACCESS BITS BACK OFF
1342 CORGP3: CAIL A,TSYSM
1343          JRST 4,.
1344         MOVEI TT,MURUSR
1345         DPB TT,[MUR,,MEMBLT(A)] ;SET USER FIELD IN MEMBLT
1346         MOVE TT,U
1347         IDIVI TT,LUBLK
1348         LSH TT,8
1349         IOR TT,E        ;PG # IN USER'S MAP
1350         SKIPN U
1351          MOVEI TT,600000(A)     ;IF SYS JOB, MEM BLOCK POINTS AT SELF
1352         HRRZM TT,MEMPNT(A)      ;ELSE MAKE MEM BLOCK POINT AT USERS MAP
1353         JUMPE U,GHUSRA  ;IF SYS JOB, NO MMP ENTRY
1354         DPB C,[MMMPX,,MEMBLT(A)];STORE INDEX OF MMP ENTRY IN MEMBLT
1355         TRO A,600000
1356         HRRM A,MMP(C)   ;MAKE MMP POINT AT MEM BLOCK
1357         PUSHJ P,CHACK   ;FOR CHECKING ONLY
1358         CAME C,[SETZ 3] ;REAL MEM, 3 ENTRIES (MMP, MEMPNT, USER)
1359          JRST 4,.
1360 GHUSRA: AOS E
1361         LSH E,10.       ;COMP NEW HUSRAD AFTER GETTING PAGE
1362         TLZ E,-2        ;FLUSH PROTECT BITS (LEAVE 3.1)
1363         CAMLE E,HUSRAD(U)
1364          MOVEM E,HUSRAD(U)
1365         POPJ P,
1366
1367 CORGPZ: PUSH P,E        ;SAVE REGISTERS
1368         PUSH P,U
1369         PUSHJ P,CFLM2   ;TRY TO FREE UP SOME LOW MEMORY
1370         POP P,U
1371         POP P,E
1372         SKIPE LMEMFR
1373          JRST CORGP     ;SHOULD WORK NOW
1374         PUSHJ P,LSWPOP  ;MEMFRZ
1375         PUSHJ P,LSWPOP  ;CIRPSW
1376         BUG INFO,[NO CORE AVAIL FOR MMP PAGE]
1377         PUSHJ P,UDELAY  ;Break possible infinite loop if no user pgs in low mem
1378         SKIPG MEMFR     ;WAIT FOR SWAPPER TO MAKE ROOM (PANIC!)
1379          PUSHJ P,UFLS
1380         PUSHJ P,SWTL
1381           CIRPSW
1382         PUSHJ P,SWTL
1383           MEMFRZ
1384         JRST CORGP
1385 \f
1386 PAGERT: PUSHJ P,SWTL
1387             MEMFRZ
1388         PUSHJ P,UPGRTN
1389         JRST LSWPOP
1390
1391 UPGRTN: PUSH P,R        ;RETURN VIRT PG # IN A USER IN U
1392         PUSH P,I
1393         PUSH P,TT
1394         PUSH P,E
1395 IFN XGP,[
1396         PUSHJ P,UPLC    ;SEE IF PAGE XGP LOCKED
1397         LDB E,T
1398         TRNN E,600000
1399          JRST UPGRT7    ;SWAPPED OUT, OBVIOUSLY NOT XGP
1400         ANDI E,PMRCM    ;E := PHYS PAGE NO
1401         CAIL E,TSYSM
1402          JRST UPGRT7
1403         IDIVI E,36.
1404         MOVNS TT
1405         PUSH P,T
1406         MOVSI T,400000
1407         LSH T,(TT)
1408         TDNE T,XGPMTB(E)
1409         PUSHJ P,UFLS    ;WAIT FOR XGP TO CLEAR
1410         POP P,T
1411 UPGRT7: ]
1412 .ELSE   PUSHJ P,UPLC    ;FIND PAGE IF DIDN'T ALREADY
1413         JUMPE U,UPGRT8  ;SYS JOB, NO SWAPPING NOR MMP ENTRY
1414         LDB B,Q
1415         CAIN B,-1
1416          JRST UPRABS    ;ABSOLUTE PAGE
1417         JUMPE B,RHUSRA  ;DOESNT REALLY HAVE PG
1418         PUSH P,T
1419         PUSHJ P,CHACK   
1420         ADD D,MMPEAD    ;D HAS MMP ADDRESS
1421 UPGRTA: MOVSI T,MMPTMP
1422         TDNE T,(D)
1423          JRST UPGRTW    ;WAIT FOR PAGE TO TRANSIT BUT UNLOCK SWITCHES
1424         MOVNI I,1       ;ASSUME NO DISK SPACE
1425         HLRZ A,1(D)     ;SEE IF DISK SPACE ASSIGNED
1426         JUMPE A,UPGRT5
1427         LDB I,[$MMPUN,,(D)]
1428         PUSHJ P,QTLOCK  ;LOCK APPRO TUT
1429 UPGRT5: POP P,T         ;POINTER TO ORIG MAP ENTRY OF USER
1430         MOVE H,(T)      ;SAVE MAP WORD FOR DEBUGGING
1431         LDB TT,T        ;IF PROT BITS=0 PAGE IS SWAPPED OUT FOR PURPOSES
1432         MOVEI E,0       ;OF USER'S SWAP OUT COUNT, EVEN IF IN CORE
1433         DPB E,T         ;CLEAR USER MAP ENTRY
1434         TRCN TT,600000  ;IS USER MAPPED TO PAGE?
1435          JRST UPGRT9
1436         MOVSI E,MMPWRT  ;YES, CHECK IF ACCESS BITS = RW
1437         TRNN TT,600000
1438          IORM E,(D)     ;PAGE WRITTEN BY USER WHO HAS DETACHED IT
1439         ANDI TT,PMRCM   ;MASK TO MEM PAGE #
1440         CAIE TT,(J)
1441          JRST 4,.       ;PTW POINTED TO WRONG PAGE
1442         MOVSI E,MMPOUT+MMPTMP
1443         TDNE E,(D)
1444          JRST 4,.       ;PAGE NOT IN, IN MMP
1445 IFE SWPWSP,     SOS MMSWP(J)    ;ONE LESS USER POINTING AT PAGE
1446 IFN SWPWSP,[
1447         HRRZ E,MMSWP(TT)        ;DECREASE THIS USER'S WORKING SET
1448         MOVSI T,-1
1449         IDIVM T,E
1450         ADDM E,UWRKST(U)
1451         SOS MMSWP(TT)
1452         HRRZ E,MMSWP(TT)
1453         JUMPE E,UPGRTB  ;JUMP IF NO OTHER SHARERS, FOR SPEED AND NO ZERODIVIDE
1454         PUSH P,C        ;ADJUST OTHER SHARER'S WORKING SETS
1455         PUSH P,D
1456         PUSH P,I
1457         PUSH P,U
1458         IMULI E,1(E)
1459         MOVSI D,1
1460         IDIV D,E
1461         PUSHJ P,UCPRL7  ;CLOBBERS H ALSO C,T,U,I
1462             400000,,SWOP6F
1463         POP P,U
1464         POP P,I
1465         POP P,D
1466         POP P,C
1467 ];SWPWSP
1468         JRST UPGRTB
1469 \f
1470 ;RETURNING A PAGE TO WHICH USER IS NOT CURRENTLY MAPPED (MAY BE IN OR OUT)
1471 UPGRT9: SOS NSWPGS(U)
1472         SOS SNSWPG      ;DECR CNT OF SWAPPED OUT FOR SYS
1473         JUMPGE C,UPGRT4 ;NO MEM IN CP S, PAGE REALLY SWAPPED OUT
1474 ;RETURNING A PAGE WHICH IS SWAPPED IN
1475 UPGRTB: HLRE E,MMSWP(J) ;GET # EXEC PGS POINTING TO THIS
1476         JUMPL E,[JRST 4,.]      ;<0 EXEC PAGES
1477         JUMPE E,UPGRT4  ;NO EXEC PGS POINTING TO THIS
1478         PUSH P,J
1479         MOVE TT,J
1480         MOVSI T,-NEXPGS ;LOOK FOR EXEC PGS SET UP TO PNT
1481         MOVE E,[442200,,EXEUMP] ;TO USER PAGE FLUSHED
1482 UPGRT3: ILDB J,E
1483         TRZN J,600000
1484          JRST UPGRT2
1485         ANDI J,PMRCM
1486         CAMN TT,J
1487          JRST UPGRT1
1488 UPGRT2: AOBJN T,UPGRT3
1489 IFN E.SP,[
1490         MOVSI T,-1
1491         TDNE T,MMSWP(TT)
1492          PUSHJ P,E.SPRT         ;SEE IF E&S HAS IT
1493 ]
1494 IFN XGP,[
1495         MOVSI T,-1
1496         TDNE T,MMSWP(TT)        ;FLUSH XGP TIE DOWNS AND RETURN
1497          PUSHJ P,XGPCFL
1498 ]
1499         POP P,J
1500 UPGRT4: LDB T,Q ;DELINK CIRC PNTR
1501         DPB T,B
1502         MOVEI T,0
1503         DPB T,Q         ;CLOBBER CIRC P
1504         SOS NMPGS(U)
1505         SOS SNMPGS      ;SYSTEM HAS 1 LESS PAGE
1506         CAME C,[SETZ 3]
1507         CAIN C,2
1508          JRST MMPRTN    ;RETURN MMP ENTRY SINCE PAGE NO LONGER IN USE
1509 MMPRT4: MOVE A,J
1510         CAMN C,[SETZ 3]
1511          JRST MMPRT5    ;FLUSH REAL MEM
1512 MMPRT6: SKIPL I
1513          PUSHJ P,QTULK
1514 RHUSRA: POP P,E
1515         POP P,TT
1516         POP P,I
1517         POP P,R
1518 RHUSR1: LDB A,[121100,,HUSRAD(U)]       ;COMP HUSRAD AFTER RETURNING PAGE
1519         JUMPE A,CPOPJ
1520         SOS A
1521         PUSHJ P,UPLC
1522         LDB B,Q
1523         JUMPN B,CPOPJ   ;FOUND ACTIVE PAGE
1524         MOVNI C,2000    ;KEEP LOOKING
1525         ADDM C,HUSRAD(U)
1526         JRST RHUSR1
1527
1528 UPGRT8: SOS NMPGS       ;RETURNING PAGE FROM SYS JOB
1529         SOS SNMPGS
1530         DPB A,[121100,,HUSRAD(U)] ;NORMAL METHOD OF COMPUTING HUSRAD WON'T WORK
1531         MOVNI I,1       ;NO DISK SPACE
1532 MMPRT5: SKIPE MMSWP(A)  ;MAKE SURE NO ONE (EXEC OR USER) IS POINTING AT PAGE
1533          JRST 4,.
1534         PUSHJ P,CMEMR   ;HAS REAL MEM, CIRC LENGTH =3 SO FLUSH MEM
1535         JRST MMPRT6
1536
1537 UPRABS:
1538 IFN TEN11P,[
1539         LDB B,T
1540         LDB E,[.BP <PMRCM-377> B]       ;GET MOBY #
1541         CAIE E,T11CPA_-18.
1542         JRST UPRAB1
1543         ANDI B,377
1544         PUSHJ P,T11DL   ;DELETE PAGE REF TO TEN11 MAP
1545 UPRAB1:]
1546         MOVEI B,0
1547         DPB B,Q
1548         DPB B,T
1549         JRST RHUSRA
1550 \f
1551 IFN E.SP,[
1552 ;TT/MMSWP INDEX
1553 E.SPRT: CAME U,DISUSR   ;IS HE USING THE DISPLAY?
1554          POPJ P,        ;NO, DON'T UNTIE ANYTHING
1555         PUSH P,H
1556         MOVE T,TT       ;FOR E.SPCH
1557         PUSHJ P,E.SPCH  ;LOOK IN E&S TABLES
1558          SKIPA          ;FOUND, INDEX IN H
1559           JRST E.SPR2   ;NOT FOUND, DO NOTHING
1560         MOVSI T,-1
1561         ADDM T,MMSWP(TT) ;SOS COUNT
1562         SETZM DISSWP(H) ;CLEAR DISPLAY MMSWP TABLE
1563         AOS E.SNUT      ;COUNT FOR UNTIES
1564 E.SPR2: POP P,H
1565         POPJ P,
1566 ]
1567 UPGRT1: MOVSI J,-1
1568         XCT EXPFT(T)    ;MAYBE XFERR TO ROUTINE TO DO SOMETHING ABOUT THIS
1569          JRST UPGRT6    ;NOT USER CONCERNED ABOUT (THERE HAD BETTER BE ANOTHER)
1570         MOVEI J,0
1571         DPB J,E ;CLEAR OUT EXEC PAGE ENTRY
1572         MOVE J,USER
1573         CLRPGM (J)
1574 UPGRT6: CONO PI,UTCON
1575         JRST UPGRT2
1576
1577 ;WAIT FOR PAGE TO TRANSIT, WITH CIRPSW FREE (IN CASE SWAP READ ERROR!)
1578 ;COME HERE WITH T/MMPTMP,, D/MMP.ENTRY.ADDR
1579 UPGRTW: MOVE B,D
1580 NCRMMW: MOVE U,USER
1581         PUSHJ P,LSWCLR
1582         PCLT
1583         TDNE T,(B)
1584          PUSHJ P,UFLS   ;WAIT FOR ACTIVE PAGE TO SETTLE DOWN
1585         CAIE U,LUBLK    ;SKIP IF CORE JOB
1586          JRST UUOTROLL  ;AS IF PCLSR'ED OUT OF WAIT FOR PAGE & CAME BACK
1587         SETOM CORUPU    ;REQUEST FOR THIS USER NOT SATISFIED
1588         MOVE P,USRPDL+LUBLK     ;CLEAN UP AND RE INIT CORE JOB
1589         PUSHJ P,NULSET
1590         PUSHJ P,NULSET
1591         JRST CORUPR
1592
1593 EXPFT:
1594 IFN 340P,       REPEAT 2+N340PB,        PUSHJ P,DISACR
1595         REPEAT 2,JFCL           ;CORJF, CORJT
1596 IFN VIDP,       REPEAT 2,PUSHJ P,SCNACR
1597 IFN TEN11P,     JRST 4,.        ;TEN-11 CONTROL PAGE
1598         JRST 4,.                ;PAREP
1599 IFN ECCMEM,     JRST 4,.        ;ECCPG
1600 IFN XGP,        REPEAT 3,JRST 4,.
1601 IFN N11TYS,     REPEAT NTTPG+NTVBP,JRST 4,.
1602 IFN CHAOSP, IFN T11CHP, JRST 4,.
1603         REPEAT NMMP,JRST 4,.    ;MMP
1604 IFN .-EXPFT-NEXPGS, .ERR LOSE AT EXPFT
1605 \f;CIRCULAR MEM LIST HACKER
1606 ;CALL WITH Q CONTAINING BYTE POINTER TO CIRC PNTR IN LIST TO BE HACKED
1607 ;THE BYTE POINTER MUST POINT AT A UPGCP ENTRY (RATHER THAN MEMPNT OR MMP)
1608 ;OR THIS CODE WILL LOOP FOREVER.
1609 ;RETN BYTE PNTR IN B TO GUY WHO PNTS TO THAT PNTR
1610 ;COUNT FOR ENTRIES IN C (RH)
1611 ; 4.9 C SAYS ACTUAL MEM IN LOOP
1612 ;RETN IN D MMP INDEX
1613 ;RETURN MEM PAGE IF ANY IN J
1614 ;CLOBBERS H,I,W
1615
1616 CHACK:  PUSH P,A
1617         LDB J,Q ;PICK UP STARTING C. P.
1618         SETZM C
1619         MOVNI D,1
1620         MOVE B,Q
1621 CHACK1: JUMPE B,[JRST 4,.]
1622         AOS C
1623         CAIE J,-1       ;SKIP ON ABS PAGE
1624          TRNE C,776000
1625           JRST 4,.      ;CIRC CHAIN TOO LONG?
1626         TRZE J,400000
1627          JRST CHACK3    ;MEMPNT OR MMP PNTR
1628         LDB I,[1000,,J] ;PG #
1629         LDB H,[101100,,J]       ;USER #
1630         IMULI H,LUBLK
1631         SKIPE UNAME(H)
1632          CAML H,USRHI
1633           JRST 4,.      ;POINTER TO NON-EXISTENT USER
1634         MOVEI W,UPGCP(H)
1635         ROT I,-1
1636         ADDI W,(I)
1637         HRLI W,222200
1638         SKIPGE I
1639          HRLI W,2200
1640         CAMN W,Q
1641          JRST CHACK2    ;FOUND ENTRY WHICH PNTS AT ORIGINAL ENTRY
1642         LDB J,W
1643         MOVE B,W
1644         JRST CHACK1     ;KEEP LOOKING
1645
1646 CHACK2: MOVE J,A
1647         JUMPL D,[JRST 4,.]      ;NO MMP ENTRY ?
1648         JRST POPAJ
1649
1650 CHACK3: TRZE J,200000
1651          JRST CHACK4    ;ACTUAL CORE
1652         CAML J,MMPMX
1653          JRST 4,.       ;GARBAGE POINTER
1654         MOVSI B,2200    ;MMP ENTRY
1655         HRR B,MMPEAD
1656         ADDI B,(J)
1657         JUMPGE D,[JRST 4,.]     ;MORE THAN 1 MMP ENTRY
1658         MOVE D,J
1659         LDB J,B
1660         JRST CHACK1
1661
1662 CHACK4: TLOE C,400000
1663          JRST 4,.       ;PAGES IS IN TWO PLACES IN CORE
1664         CAIL J,TSYSM
1665          JRST 4,.       ;GARBAGE POINTER
1666         MOVE A,J        ;SAVE MEMBLT INDEX
1667         MOVSI B,2200
1668         HRRI B,MEMPNT
1669         ADDI B,(J)
1670         LDB J,B
1671         JRST CHACK1
1672
1673 ;LOOK UP PAGE IN USER MAP
1674 ;USER IN U, VIR PG # IN A
1675 ;GET PNTR TO MAP HW IN T, TO CIRC IN Q
1676
1677 UPLC:   SKIPL A
1678         CAIL A,400
1679          JRST 4,.               ;BAD VIRTUAL PAGE NUMBER
1680         PUSH P,A
1681         MOVEI Q,UPGCP(U)
1682         MOVEI T,UPGMP(U)
1683         ROT A,-1
1684         ADDI T,(A)
1685         HRLI T,222200
1686         SKIPGE A
1687          HRLI T,2200
1688         ADDI Q,(A)
1689         HLL Q,T
1690         JRST POPAJ
1691 \f
1692 ;FREE THE MMP ENTRY D POINTS AT, SOSING TUT IF DISK SPACE ASSIGNED.
1693 ;I HAS DSK #, C HAS WHAT CHACK RETURNED IN C, A HAS TRACK #.
1694 ;TUT MUST BE LOCKED ALREADY. CIRPSW AND MEMFRZ SHOULD BE LOCKED.
1695 ;EXIT TO MMPRT4 OR RHUSRA
1696
1697 MMPRTN: MOVEM C,MMPRTC  ;SAVE IN CASE OF BUG HALT LATER
1698         JUMPL I,MMPRT3  ;NO DISK SPACE ASSIGNED
1699         PUSH P,B
1700         LDB B,[$MMPUN,,(D)]
1701         CAME B,I
1702          JRST 4,.       ;WRITING WRONG DISK
1703         MOVE H,D        ;H SAVES POINTER TO MMP ENTRY
1704         MOVE D,A        ;D GETS DISK TRACK NUMBER
1705         PUSHJ P,TUTPNT
1706         CAIGE B,TUTMNY
1707          SOJL B,[JRST 4,.]      ;DETECT OVER-SOS
1708         DPB B,D
1709         EXCH D,H        ;D GETS MMP PNTR, H GETS TUT BYTE PNTR
1710         JUMPN B,MMPRT2
1711         MOVE T,QTUTO(I)
1712         CAML A,QSWAPA(T)
1713          AOS QSFT(I)
1714         CAMGE A,QSWAPA(T)
1715          AOS QSFTS(I)
1716 MMPRT2: MOVE T,DCHBT(I)
1717         IORM T,QTUTO(I)
1718         MOVE A,(D)      ;ELSE DELETE MMP ENTRY NOW
1719         SKIPGE C
1720          JUMPN B,MMPRT0 ;IF PG IS IN FILE, AND SWAPPED IN, MAYBE WRITE OUT.
1721         TLNN A,MMPSHR
1722          JRST MMPRT8
1723         HLRZ A,1(D)     ;ALSO REMOVE FROM SHAREABLE PAGE TABLE
1724         HRL A,I
1725         IDIVI A,SHRHSL
1726         ADDI B,SHRHSH-1
1727 MMPRT7: MOVE A,B
1728         HRRZ B,1(B)
1729         JUMPE B,[JRST 4,.]
1730         CAME B,D
1731          JRST MMPRT7
1732         HRRZ B,1(B)
1733         HRRM B,1(A)
1734 MMPRT8: POP P,B
1735         JUMPL C,MMPRT3  ;WAS MEM IN LOOP SO NOT SWAPPED OUT FOR SYSTEM'S COUNT
1736         SOS NPGSWO      ;IT WAS SWAPPED OUT
1737 MMPRT3: PUSHJ P,MMPRT1
1738         SOS MMPCNT      ;1 LESS IN USE
1739         AOS MMPFR       ;1 MORE FREE
1740         JRST MMPRT4
1741 \f
1742 ;FLUSHING AN MMP ENTRY FOR A PAGE SHARED WITH A FILE WHICH IS CURRENTLY IN CORE.
1743 ;WE MAY WANT THIS PAGE AGAIN, SO TRY TO KEEP IT AROUND FOR A WHILE.
1744 ;BUT IF PAGE HAS BEEN MODIFIED, IMMEDIATELY SWAP IT OUT SO FILE GETS UPDATED.
1745
1746 MMPRT0: POP P,B
1747         LDB C,H         ;UN-SOS THE TUT
1748         CAIGE C,TUTMNY  ;DON'T OVER-AOS
1749          AOS C
1750         DPB C,H
1751         PUSHJ P,QTULK
1752         MOVEI C,.BM MLO
1753         ANDCAM C,MEMBLT(J)
1754         SKIPE C,LLOOSP          ;ADD TO TAIL OF LOOSE PAGE LIST
1755          DPB J,[MLO,,MEMBLT(C)]
1756         MOVEM J,LLOOSP
1757         SKIPN C
1758          MOVEM J,FLOOSP
1759         AOS NLOOSP
1760         TLNN A,MMPWRT
1761          JRST RHUSRA
1762         PUSH P,U        ;PAGE WAS MODIFIED, SWAP IT OUT RIGHT AWAY
1763         CONO PI,CLKOFF  ;CALL SWAPPER AT IMITATION CLOCK LEVEL
1764         MOVEM J,SWOBK
1765         MOVEM D,SWOMMP
1766         AOS CIRPSW      ;SWOP1A WILL SOS IT BEFORE RETURNING
1767         PUSHJ P,SWOP1A  ;WILL RETURN THE MMP ENTRY SINCE NO USERS ARE LINKED TO IT
1768          JRST 4,.       ;EXEC PAGES STILL POINT TO PAGE, ALTHOUGH UPGRTN FLUSHED THEM
1769         CONO PI,CLKON
1770         POP P,U
1771         JRST RHUSRA
1772 \f
1773 ;HERE TO RETURN AN MMP ENTRY AND SOS THE TUT, AT P.I. LEVEL
1774 ;IF TUT OR CIRPSW IS LOCKED, PUTS ON MMPFS2 AND WAKES UP CORE JOB
1775 ;OTHERWISE, CLEARS OUT AND PUTS ON MMPFS
1776 ;A -> MMP ENTRY, CLOBBERS B,D,E,I
1777
1778 RETMMP: PI2SAF
1779         LDB I,[$MMPUN,,(A)]
1780         SKIPGE CIRPSW
1781          SKIPGE QTUTO(I)
1782           JRST RETMM1   ;CAN'T SET LOCKS, LET CORE JOB DO IT
1783 RETMM0: HLRZ D,1(A)
1784         PUSHJ P,TUTPNT  ;SOS THE TUT
1785         CAIGE B,TUTMNY
1786          SOJL B,[JRST 4,.]
1787         DPB B,D
1788         JUMPN B,RETMM7
1789         MOVE E,QTUTO(I) ;RETURNING BLOCK TO FREE, AOS APPROPRIATE FREE COUNT
1790         HLRZ D,1(A)
1791         CAML D,QSWAPA(E)
1792          AOSA QSFT(I)
1793           AOS QSFTS(I)
1794 RETMM7: MOVSI D,MMPSHR
1795         TDNN D,(A)
1796          JRST RETMM6
1797         HLRZ D,1(A)     ;REMOVE FROM SHAREABLE PAGE HASH TABLE
1798         HRL D,I
1799         IDIVI D,SHRHSL
1800         MOVEI D,SHRHSH-1(E)
1801 RETMM5: MOVE E,D
1802         HRRZ D,1(D)
1803         JUMPE D,[JRST 4,.]      ;NOT IN TABLE OR MIS-HASHED?
1804         CAME D,A
1805          JRST RETMM5
1806         HRRZ D,1(D)
1807         HRRM D,1(E)
1808 RETMM6: MOVE D,A
1809         SOS MMPCNT
1810         AOS MMPFR
1811 MMPRT1: EXCH D,MMPFS    ;ADD THIS ENTRY ONTO THE FRONT OF
1812         MOVE A,MMPFS    ;THE LIST OF AVAILABLE MMP ENTRIES
1813         MOVEM D,(A)     ;CLEAR LH OF FIRST WORD OF ENTRY
1814         SETZM 1(A)      ;CLEAR SECOND WORD OF ENTRY
1815         POPJ P,
1816
1817 RETMM1: MOVE D,A        ;ADD THIS ENTRY TO LIST OF ONES TO HACK LATER
1818         EXCH D,MMPFS2
1819         HRRM D,(A)      ;ONLY CLOBBER THE CIRC PNTR, WHICH POINTS TO SELF
1820         SKIPN D
1821          AOS NCORRQ     ;LIST WAS EMPTY, AWAKEN CORE JOB
1822         POPJ P,
1823
1824 ;CORE JOB COMES HERE WHEN MMPFS2 IS NON-ZERO
1825
1826 RETMM2: SOS NCORRQ
1827         PUSHJ P,SWTL
1828             CIRPSW
1829         PUSHJ P,RETMM4
1830         PUSHJ P,LSWPOP
1831         JRST CORJOB
1832
1833 RETMM4: MOVEI A,0       ;HERE, WITH CIRPSW LOCKED, TO FINISH RETURNING MMP ENTRIES
1834         EXCH A,MMPFS2
1835 RETMM3: JUMPE A,CPOPJ
1836         LDB I,[$MMPUN,,(A)]
1837         PUSHJ P,QTLOCK
1838         HRRZ H,(A)
1839         PUSHJ P,RETMM0
1840         PUSHJ P,QTULK
1841         MOVE A,H
1842         JRST RETMM3
1843 \f
1844 ;GET AN MMP ENTRY, RET. IDX IN R, ADDR IN TT.
1845 ;CLEARS BOTH WDS OF MMP ENTRY. CLOBBERS NO ACS.
1846 ;SKIPS IF SUCCESSFUL.  DOESN'T SKIP IF NO LOW CORE FOR NEW MMP PAGE.
1847 ;YOU BETTER ALREADY HAVE COMMITTED THE MMP ENTRY VIA SOSGE MMPFR
1848
1849 GMMPP:  HRRZ TT,MMPFS
1850         JUMPE TT,GMMP1  ;FREE LIST IS EMPTY
1851         CAMGE TT,MMPEAD
1852          JRST 4,.       ;IDX GOT ON FREE LIST; SHOULD BE ADDR
1853         MOVE R,TT
1854         SUB R,MMPEAD
1855         CLEARM 1(TT)
1856         HRL TT,(TT)
1857         CLEARM (TT)
1858         HLRZM TT,MMPFS
1859         AOS MMPCNT      ;1 MORE MMP ENTRY IN USE.
1860         JRST POPJ1
1861
1862 GMMP1:  SKIPN MMPFS2
1863          JRST GMMP4
1864         PUSH P,A        ;PROTECT ACS CLOBBERED BY RETMM4
1865         PUSH P,B
1866         PUSH P,D
1867         PUSH P,E
1868         PUSH P,H
1869         PUSH P,I
1870         PUSH P,T
1871         PUSHJ P,RETMM4
1872         POP P,T
1873         POP P,I
1874         POP P,H
1875         POP P,E
1876         POP P,D
1877         POP P,B
1878         POP P,A
1879         JRST GMMPP
1880
1881 GMMP4:  PUSH P,A        ;CREATE ANOTHER PAGE-FULL OF MMP ENTRIES
1882         PUSH P,B
1883         PUSH P,D
1884         PUSHJ P,TCALL
1885           ;JRST IOMQ    ;ALLOCATE LOW CORE SO GETS DUMPED WITH CRASHES
1886           JRST NMMRQ    ;IOMQ LOSES BECAUSE WE GET CALLED WITH MEMFRZ LOCKED
1887                         ;NMMRQ ISN'T QUITE RIGHT, BECAUSE OF NCBCOM.  FIX LATER. ---
1888          JRST GMMP3     ;NO LOW CORE AVAIL NOW
1889         MOVEI B,MUMMP
1890         DPB B,[MUR,,MEMBLT(A)]
1891         MOVEI B,2000
1892         ADDM B,MMPMX    ;INCREMENT MAX ALLOWABLE ADDR OF MMP
1893         AOS B,MMPNP
1894         CAILE B,NMMP
1895          JRST 4,.       ;SOMEONE DIDN'T CHECK MMPFR?
1896         MOVEM A,MMMPG-1(B)
1897         TRO A,600000+PMCSHM
1898         DPB A,MMPPPP-1(B) ;PUT NEW MMP PAGE INTO EXEC MAP
1899         MOVE D,USER
1900         CLRPGM (D)
1901         SOS B
1902         LSH B,10.
1903         HRLI B,-1000
1904 GMMP2:  MOVEI D,MMP(B)  ;PUT ALL ENTRIES IN PAGE ON THE FREE LIST
1905         PUSHJ P,MMPRT1
1906         AOS B
1907         AOBJN B,GMMP2
1908         POP P,D
1909         POP P,B
1910         POP P,A
1911         JRST GMMPP
1912
1913 GMMP3:  POP P,D
1914         POP P,B
1915         POP P,A
1916         POPJ P,
1917 \f
1918 ;HERE IF TRANSIENT CONDITION PREVENTS GRABBING PAGE RIGHT NOW
1919
1920 CORS18: MOVE T,LSWPR+LUBLK
1921         CAIE T,MEMFRZ
1922          JRST 4,.
1923         PUSHJ P,LSWPOP          ;MEMFRZ
1924         PUSHJ P,UDELAY
1925         PUSHJ P,ACMTC
1926         PUSHJ P,SWTL
1927             MEMFRZ
1928
1929 ;GROW A JOB'S CONTIGUOUS MEMORY.  USED ONLY FOR SYSTEM JOB THESE DAYS.
1930
1931 CORS2:
1932 IFN XGP,[
1933         SKIPL XGPUSR    ;AVOID EXPANDING INTO XGP PAGE.
1934          PUSHJ P,UFLS
1935 ]
1936         LDB J,[121100,,HUSRAD(U)]
1937         LDB E,[MUR,,MEMBLT(J)]
1938         CAIN E,MUFR
1939          JRST COSFR     ;FREE PAGE, TAKE IT.
1940         CAIE E,MUINP
1941         CAIN E,MUFRT
1942          JRST CORS18    ;WAIT UNTIL IT STABILIZES
1943         CAIN E,MUSWPG
1944          JRST CORS18    ;WAIT UNTIL IT GETS WHERE IT'S GOING
1945         CAIE E,MURUSR   ;USER PAGE, SHUFFLE IT AWAY.
1946          JRST 4,.        ;SHOULDN'T HAVE TO SHUFFLE SYSTEM PAGES.
1947
1948 ;SHUFFLE A USER PAGE
1949 CORS4:  PUSHJ P,TCALL
1950             JRST HMEMRQ ;GET FREE PAGE TO SHUFFLE IT INTO
1951          JRST 4,.       ;THERE OUGHT TO BE ONE
1952         PUSHJ P,CORS5
1953         JRST CBMRT
1954
1955 ;Shuffle user page in J into page in A
1956 ;Clobbers C,D,E,H,I,Q,U,T
1957 CORS5:  MOVE D,A
1958         SKIPGE E,MMSWP(J)
1959          JRST 4,.       ;BLOCK IS ON SWAP OUT LIST (??)
1960         TRNN E,-1
1961          PUSHJ P,CORS6  ;SHUFFLING A POSSIBLY LOOSE PAGE, FIX POINTERS
1962         SETOM DLSRCH    ;CAN'T BE BEING SWAPPED OUT ETC BECAUSE SWAPOUT
1963         PUSHJ P,UCPRL7  ;BLOCKS HAVE MUR=MU23B, AND CIRPSW IS SIEZED
1964           SETZ CORSTU   ;STOP DIRECT TO MEM DEVICES AND FIX USER MAPS
1965         TLC C,200       ;CHANGE TO 20 BIT BYTE 
1966         DPB D,C         ;RELOCATE PTR TO MEMPNT ENTRY
1967         PUSHJ P,CMOVE1  ;MOVE CONTENTS OF BLOCK
1968         MOVSI C,-NEXPGS
1969         MOVE T,[442200,,EXEUMP]
1970         PUSHJ P,CORPS1  ;FIX ANY EXEC PAGE MAP PNTRS TO THIS PAGE
1971         PUSHJ P,UCPRL4
1972           SETZ DEVSTR   ;RESTART DIRECT TO MEM DEVICES
1973         SETZM DLSRCH    ;MAPS ARE CONSISTENT AGAIN, LET USERS RUN
1974         POPJ P,
1975
1976 CORSTU: PUSHJ P,DEVSTP  ;STOP DIRECT-TO-MEM DEVICES
1977         MOVE A,I        ;COMPUTE USER'S MAP ENTRY LOCN
1978         PUSHJ P,UPLC
1979         LDB C,T
1980         TRNN C,600000
1981          POPJ P,        ;PAGE SWAPPED IN BUT NOT YET LINKED UP
1982         ANDI C,PMRCM
1983         CAIE C,(J)
1984          JRST 4,.
1985         TLC T,2200#<PMRCAD&7700>        ;CHANGE TO ADDRESS REAL CORE ADR FIELD
1986         DPB D,T                         ;RELOCATE USER'S MAP
1987         POPJ P,
1988
1989 COSFR:  MOVE D,J
1990         PUSHJ P,MEMMF
1991 CBMRT:  MOVEM J,SJSPG   ;SAVE PAGE # RESERVED
1992         JRST CORM1B
1993 \f
1994 ;CORE SHUFFLER, TO KEEP LOW MEMORY FREE
1995 CFLM1:  PUSHJ P,SWTL
1996             CIRPSW
1997         PUSHJ P,SWTL
1998             MEMFRZ
1999         PUSHJ P,CFLM2
2000         PUSHJ P,LSWPOP          ;MEMFRZ
2001         JRST LSWPOP             ;CIRPSW
2002
2003 CFLM2:  MOVEI J,LIOBLK          ;Scan through "low" memory
2004         SKIPE MEMHPT            ;Make sure there is likely to be free high mem
2005          JRST CFLM4
2006         AOS SWPOPR              ;Kick swapper more than kicked already
2007         POPJ P,                 ;And give up
2008
2009 CFLM3:  CAIN J,128.
2010          MOVEI J,128.+NEXPGS
2011         CAIL J,256.             ;Assume USEMDM is always on (safe assumption)
2012          POPJ P,                ;All done, couldn't find anything
2013 CFLM4:  LDB A,[MUR,,MEMBLT(J)]
2014         CAIE A,MURUSR
2015          AOJA J,CFLM3
2016         PUSHJ P,TCALL
2017             JRST HMEMRQ         ;Get free page to shuffle it into
2018          POPJ P,                ;No memory free, give up for now
2019         PUSHJ P,CORS5           ;Shuffle page into new memory
2020         MOVE A,J                ;Free old page
2021         PUSHJ P,CMEMR
2022         MOVE A,LMEMFR
2023         CAMGE A,MINCOR
2024          AOJA J,CFLM3
2025         POPJ P,                 ;Freed sufficient low pages, stop now
2026 \f
2027 ;STOP DIRECT TO MEM DEVICES
2028
2029 DEVSTP:
2030 IFN VIDP,[
2031         CAMN U,SCNUSR   ;STOP DIRECT MEM DEVICES
2032          PUSHJ P,SCNSTC ;STOP DIRECT VIDI INPUT
2033 ]
2034 IFN 340P\E.SP,[
2035         CAMN U,DISUSR   ;STOP DISPLAY IF THIS GUY HAS IT
2036          PUSHJ P,DCRSTP
2037 ]
2038         POPJ P,
2039
2040 ;RESTART DIRECT TO MEM DEVICES
2041
2042 DEVSTR: CLRPGM +LUBLK   ;CLEAR PAGE MAP ASSOC REGS IN HARDWARE
2043 IFN VIDP,[
2044         CAMN U,SCNUSR   ;RESTART DIRECT MEM DEVICES
2045          PUSHJ P,SCNRST ;RESTART DIRECT VIDI INPUT
2046 ]
2047 IFN 340P\E.SP,[
2048         CAMN U,DISUSR
2049          PUSHJ P,DCRRST ;RESTART DISPLAY
2050 ]
2051         POPJ P,
2052
2053 ;HERE TO RELOCATE EXEC PAGES WHICH POINT TO PAGE IN J
2054
2055 CORPS1: MOVEI I,0
2056 CORPS4: ILDB Q,T
2057         TLC T,2200#<PMRCAD&7700>        ;CHANGE SIZE FIELD TO ADDRESS REAL CORE ADR
2058         ANDI Q,PMRCM
2059         CAME Q,J
2060          JRST CORPS3
2061         AOS I           ;COUNT # OF EXEC PGS POINTING TO THIS ONE
2062         DPB D,T         ;RELOCATE EXEC PG PNTR
2063 CORPS3: TLC T,2200#<PMRCAD&7700>        ;CHANGE SIZE BACK TO 22
2064         AOBJN C,CORPS4
2065         HLRZ T,MMSWP(D)
2066         CAMN T,I        ;CHECK COUNT OF EXEC PAGES
2067          POPJ P,        ;COUNTED CORRECTLY, WIN
2068
2069 IFN E.SP,[              ;SEE IF E&S CAN ACCOUNT FOR SOME PAGES
2070         MOVSI Q,-MXDISP         ;SET UP INDEX
2071         CAMN J,DISSWP(Q)        ;J/ OLD INDEX, D/ NEW
2072          AOJA I,E.SX2           ;COUNT I IF FOUND, AND RECHECK COUNT
2073         AOBJN Q,.-2             ;ELSE CONTINUE SEARCH
2074         JRST 4,.                ;NOT FOUND, BOMB
2075 E.SX2:  MOVEM D,DISSWP(Q)       ;RELOCATE PAGE
2076         AOS E.SREL              ;# PAGES RELOCATED (FOR DEBUGGING)
2077         CAMN T,I                ;SKIP IF COUNT IS STILL BAD
2078          POPJ P,                ;E&S COUNT WAS CULPRIT -- HAPPY AGAIN
2079 ]
2080 IFN XGP,[
2081         PUSH P,A
2082         PUSH P,B
2083         MOVE B,J
2084         PUSHJ P,XGPBIT
2085         TDNE A,XGPMTB(B)
2086          AOS I
2087         CAMN I,T
2088          JRST POPBAJ
2089 ]
2090         JRST 4,.        ;EXEC PGS COUNT OFF
2091
2092 CORS6:  MOVE T,FLOOSP   ;FIX POINTERS TO LOOSE PAGE BEING SHUFFLED
2093 CORS7:  SKIPN C,T
2094          JRST CORS8
2095         LDB T,[MLO,,MEMBLT(C)]
2096         CAME T,J
2097          JRST CORS7
2098         DPB D,[MLO,,MEMBLT(C)]
2099 CORS8:  CAMN J,FLOOSP
2100          MOVEM D,FLOOSP
2101         CAMN J,LLOOSP
2102          MOVEM D,LLOOSP
2103         POPJ P,
2104 \f
2105 ;RUN AROUND CIRC LIST STRUCTURE
2106 ;WORD AFTER CALL IS POINTER TO ROUTINE TO BE CALLED FOR EACH ITEM IN LIST ACCORDING
2107 ;TO FLAGS IN LH: 4.9 USER PAGE (U=USER,I=PG#), 4.8 MMP (T=IDX), 4.7 MEMPNT (T=PG#)
2108 ;CALLED ROUTINE MUSTN'T CLOBBER C,H; NOR U,I IF A USER PAGE; NOR T IF MEMPNT.
2109 ;RETURNS IN C BYTE POINTER TO PLACE THAT POINTS TO
2110 ;STARTING BYTE POINTER THAT WAS IN C
2111 ;ENTRIES:
2112 ; UCPRL - STARTING BYTE POINTER IN C
2113 ; UCPRL4 - STARTING CORE PAGE # IN D
2114 ; UCPRL7 - STARTING CORE PAGE # IN J
2115 ;PDL DEEPENED BY TWO PUSH'S AND TWO PUSHJ'S.
2116 ;---WARNING--- : CLOBBERS U ------- ALSO CLOBBERS H,T,I
2117
2118 UCPRL7: SKIPA C,[2200,,MEMPNT(J)]
2119 UCPRL4: MOVE C,[2200,,MEMPNT(D)]
2120 UCPRL:  MOVE H,@(P)
2121         HRRI C,@C
2122         TLZ C,37
2123         PUSH P,C
2124         PUSH P,C
2125         JRST UCPRL5
2126
2127 UCPRL2: CAMN C,-1(P)
2128          JRST UCPRL6
2129         MOVEM C,(P)
2130 UCPRL5: LDB T,C
2131         JUMPE T,[JRST 4,.]
2132         TRZE T,400000
2133          JRST UCPRL1
2134         LDB I,[1000,,T] ;PAGE #
2135         LDB U,[101100,,T]       ;USER #
2136         IMULI U,LUBLK
2137         CAML U,USRHI
2138          JRST 4,.
2139         SKIPGE H
2140          PUSHJ P,(H)
2141         MOVEI C,UPGCP(U)
2142         ROT I,-1
2143         ADDI C,(I)
2144         HRLI C,222200
2145         SKIPGE I
2146          HRLI C,2200
2147         JRST UCPRL2
2148
2149 UCPRL1: TRZE T,200000
2150          JRST UCPRL3
2151         CAML T,MMPMX
2152          JRST 4,.       ;MMP ADR OUT OF RANGE
2153         MOVSI C,2200    ;MMP
2154         HRR C,MMPEAD
2155         ADDI C,(T)
2156         TLNE H,200000
2157          PUSHJ P,(H)
2158         JRST UCPRL2
2159
2160 UCPRL3: CAIL T,TSYSM
2161          JRST 4,.       ;MEMBLT ADR OUT OF RANGE
2162         TLNE H,100000   ;MEMPNT
2163          PUSHJ P,(H)
2164         MOVE C,[2200,,MEMPNT]
2165         ADDI C,(T)
2166         JRST UCPRL2
2167
2168 UCPRL6: MOVE C,(P)
2169         SUB P,[2,,2]
2170         JRST POPJ1
2171 \f;DISCARD IDLE DISK UFD'S.
2172
2173 UFDFF:  PUSHJ P,SWTL
2174             UDRSW
2175         MOVEI C,MEMR
2176         PUSHJ P,QDFLS
2177         JRST UTBFF5
2178
2179 ;FLUSH "UTAPE" (200-WD) BUFFERS
2180 ;TRY TO COMPACTIFY INTO FEWER PAGES BY DELETING PAGES CONTAINING
2181 ;ONLY FREE ONES AND BY MOVING NETWORK BUFFERS AROUND.  OTHER KINDS
2182 ;OF BUFFERS DON'T STAY AROUND VERY LONG AND ARE HARD TO MOVE
2183 ;WITHOUT INTRODUCING TIMING/PCLSR'ING BUGS.
2184
2185 UTBFF:  PUSHJ P,SWTL
2186           MEMFRZ
2187         MOVSI J,-TSYSM
2188 UTBFF3: LDB R,[MUR,,MEMBLT(J)]
2189         CAIN R,MUIOB
2190          PUSHJ P,UTBFF2
2191         AOBJN J,UTBFF3
2192 UTBFF5: SOS NCORRQ
2193         PUSHJ P,LSWPOP
2194 IFN CHAOSP, PUSHJ P,CHCLN       ;ALSO, CLEAN UP CHAOS NET BUFFERS
2195 IFN INETP, PUSHJ P,PKBCLN       ; Clean up network packet buffers
2196 ;SWAP OUT ALL LOOSE PAGES.  THE REASON THIS IS DONE IS THAT IF THE
2197 ;SYSTEM LOAD IS LIGHT LOOSE PAGES FOR DELETED INQUIR DATA BASE FILES
2198 ;CAN STAY AROUND INDEFINITELY, TYING UP DISK SPACE.
2199 ;SWAPPING OUT LOOSE PAGES DOES NOT CAUSE ANY DISK I/O.
2200 ;SWPOPG MAY NON-SKIP RETURN IF CIRPSW OR A TUT IS LOCKED,
2201 ;IN WHICH CASE WE GIVE UP UNTIL THE NEXT 2-MINUTE CLOCK.
2202 UTBFF6: CONO PI,CLKOFF
2203         SKIPN A,FLOOSP          ;GET A LOOSE PAGE
2204          JRST UTBFF7
2205         MOVNI C,1
2206         PUSHJ P,SWPOPL          ;SWAP OUT EVEN IF LOCKED (SHOULDN'T BE)
2207          JRST UTBFF7            ;COULDN'T SWAP OUT, GIVE UP FOR NOW
2208         CONO PI,CLKON           ;ALLOW CHANCE FOR AN INTERRUPT
2209         JRST UTBFF6
2210
2211 UTBFF7: CONO PI,CLKON
2212         JRST CORJOB
2213
2214 ;RH(J) HAS PAGE NUMBER OF A BLOCK OF 200-WD BUFFERS
2215 UTBFF2: LDB R,[MNUMB,,MEMBLT(J)] ;GET LIST OF IOBFT ENTRIES IN THIS BLOCK
2216         CLEARB Q,TT
2217 COSIO1: MOVSI E,200000          ;ALLOC INH ALL BUFFERS IN BLOCK
2218         IORM E,IOBFT(R)
2219         LDB E,[IOCH,,IOBFT(R)]
2220         CAIE E,77
2221          AOS Q                  ;COUNT NUMBER USED FOR SOMETHING
2222         CAIL E,NFNETC
2223          CAIL E,NFNETC+NNETCH
2224           CAIA
2225            AOS TT               ;COUNT NUMBER USED FOR NETWORK
2226         LDB R,[IOLC,,IOBFT(R)]
2227         CAIE R,377
2228          JRST COSIO1
2229         JUMPE Q,COSIO3          ;IF ALL BUFFERS FREE, FLUSH THIS PAGE
2230         CAME Q,TT
2231          JRST UTBFF1            ;CONTAINS NON-NET BUFFERS, LEAVE ALONE
2232         MOVEI E,0
2233         EXCH E,UTTBF
2234         CAIL E,8                ;IF THERE ARE ENOUGH FREE IN OTHER BLOCKS
2235          JRST CISHUF            ;THEN GO SHUFFLE THE NET BUFFERS
2236         EXCH E,UTTBF
2237 UTBFF1: LDB R,[MNUMB,,MEMBLT(J)]        ;ABANDON IDEA OF FLUSHING THIS BLOCK
2238         MOVSI E,200000                  ;UN-INHIBIT THE BUFFERS..
2239 UTBFF4: ANDCAM E,IOBFT(R)
2240         LDB R,[IOLC,,IOBFT(R)]
2241         CAIE R,377
2242          JRST UTBFF4
2243         POPJ P,                 ;RETURN OUT OF UTBFF2
2244 \f;SHUFFLE BUFFERS
2245 ;COME HERE WITH UTTBF SET TO 0 AND OLD VALUE IN E
2246 ;LEAVE UTTBF 0 WHILE SHUFFLING SO NO ONE ELSE CAN ALLOCATE
2247
2248 CISHUF: PUSH P,E
2249         LDB R,[MNUMB,,MEMBLT(J)]
2250 CISHF1: LDB Q,[IOCH,,IOBFT(R)]
2251         CAIN Q,77
2252          JRST CISHF2            ;FREE, IGNORE
2253         CAIL Q,NFNETC
2254         CAILE Q,NFNETC+NNETCH
2255          JRST 4,.               ;SOME RANDOM UNSHUFFABLE BUFFER
2256         PUSHJ P,CINET
2257 CISHF2: LDB R,[IOLC,,IOBFT(R)]
2258         CAIE R,377
2259          JRST CISHF1
2260         POP P,UTTBF             ;ALLOW ALLOC AGAIN.  THIS MEM BLOCK NOW
2261                                 ;CONTAINS 8 FREE, ALLOC INH BUFFERS.
2262                                 ;SO FALL INTO COSIO3 TO FLUSH THEM.
2263 ;FLUSH ALL 8 BUFFERS.
2264
2265 COSIO3: LDB R,[MNUMB,,MEMBLT(J)]
2266         MOVEI TT,7
2267 COSIO4: LDB Q,[IOCH,,IOBFT(R)]
2268         CAIE Q,77
2269          JRST 4,.               ;BUFFER WAS SUPPOSED TO BE FREE??
2270         MOVEI Q,UTFS-IOBFT      ;PNTR TO F.S. LIST
2271         SOS UTTBF               ;SOON WILL BE ONE LESS FREE UTAPE BUFFER
2272         CONO PI,UTCOFF
2273 COSIO5: MOVE E,Q                ;REMOVE IOBFT ENTRY IN R FROM F.S. LIST
2274         LDB Q,[IOLO,,IOBFT(Q)]
2275         CAIN Q,377
2276          JRST 4,.               ;IT WASN'T IN THE LIST
2277         CAME Q,R
2278          JRST COSIO5
2279
2280         LDB Q,[IOLO,,IOBFT(R)]
2281         DPB Q,[IOLO,,IOBFT(E)]
2282         MOVE A,R                ;GIVE IOBFT ENTRY BACK TO LIST OF UNUSED IOBFTS
2283         LDB R,[IOLC,,IOBFT(R)]
2284         PUSHJ P,IOBR
2285         CONO PI,UTCON
2286         CAIE R,377
2287          SOJA TT,COSIO4
2288
2289         JUMPN TT,[JRST 4,.]     ;BLOCK DIDN'T CONTAIN 8 BUFFERS
2290         MOVNI A,8
2291         ADDB A,UTTLB
2292         CAMGE A,[-NUTIC-NUTOC]
2293          JRST 4,.
2294         PUSHJ P,FSCMP
2295         HRRZ A,J                ;THIS BLOCK OF MEMORY IS FREE NOW
2296         JRST CMEMR              ;AND RETURN OUT OF UTBFF2
2297
2298 ;EXCHANGE BUFFER IN R WITH SOME FREE BUFFER, RETURNED IN A
2299 ;CALL WITH UCTOFF, CHANNEL NUMBER IN Q, TURNS UTCON
2300
2301 COSIMG: MOVEI D,NFNETC(Q)       ;CHNL NO TO CONS FOR
2302         AOS UTTBF               ;UNRESERVE ONE BUFFER MOMENTARILY
2303         PUSHJ P,IUTCONS
2304          JRST 4,.
2305         CONO PI,UTCON
2306         LDB TT,[IOSA1,,IOBFT(R)]        ;TRANSFER BUFFER R TO BUFFER A
2307         LDB T,[IOSA1,,IOBFT(A)]
2308         HRL T,TT
2309         LSH T,7
2310         HRRZ TT,T
2311         BLT T,177(TT)
2312         EXCH R,A
2313         CONO PI,UTCOFF
2314         PUSHJ P,IBRTN           ;RETURN THE OLD BUFFER
2315         SOS UTTBF               ;BUT RESERVE IT
2316         EXCH R,A
2317         JRST UTCONJ
2318 \f
2319 ;SHUFFLE OFF A NCP NETWORK BUFFER
2320 ;R HAS IOBFT INDEX, Q HAS CHANNEL NUMBER, E MUST BE PRESERVED
2321
2322 CINET:
2323 IFE NCPP,JRST 4,.
2324 IFN NCPP,[
2325         SUBI Q,NFNETC           ;GET IMSOC INDEX
2326         HRRZ A,IMSOC1(Q)        ;USER WHO OWNS THIS BUFFER
2327         MOVSI T,200000
2328         TDNE T,IMSOC1(Q)        ;SKIP OVER USER STOP IF BEING CLOSED
2329          TROA A,-1              ; SINCE USER CAN'T REFERENCE BUFFER ANY MORE
2330           PUSHJ P,RPCLSR        ;AND LEAVE A=USER # STOPPED OR 0,,-1 IF NONE
2331         MOVSI T,200000          ;MUSTN'T BE ACTIVE AT PI LEVEL
2332         PUSHJ P,LWAIT
2333           TDNE T,IMSOC6(Q)
2334         SKIPN IMSOC6(Q) ;LWAIT RETURNS WITH NETOFF
2335          JRST CINET2            ;BUFFER HAS BEEN RETURNED
2336         MOVSI T,400000          ;LOCK THE BUFFER SO PI LEVEL WON'T TOUCH
2337         IORM T,IMSOC6(Q)
2338         LDB T,[221000,,IMSOC6(Q)]
2339         CAIE T,(R)
2340          JRST 4,.               ;IOBFT ENTRY POINTS TO WRONG CHANNEL
2341         PUSH P,A                ;SAVE INDEX OF STOPPED USER
2342         PUSHJ P,COSIMG          ;COPY BUFFER
2343         LDB TT,[IOSA,,IOBFT(A)]
2344         LSH TT,6
2345         MOVE T,TT
2346         HRRZ D,IMSOC6(Q)
2347         SUB T,D                 ;OFFSET NEW BUFFER MINUS OLD
2348         HRL TT,A
2349         DPB TT,[003200,,IMSOC6(Q)] ;STORE NEW BUFFER ADDR, LEAVE FLAGS ALONE
2350         ADDM T,IMSBFE(Q)        ;RELOCATE VARIOUS POINTERS
2351         ADDM T,IMSMPP(Q)
2352         ADDM T,IMSPIP(Q)
2353         MOVE TT,IMSOC2(Q)
2354         TRNN TT,1
2355          AOSA IMNISH
2356           AOS IMNOSH
2357         CONO PI,NETOFF
2358         MOVE TT,IMSOC6(Q)
2359         TLNN TT,100000          ;SKIP IF INPUT OCCURRED WITH BUFFER LOCKED
2360          JRST CINET1
2361 IFE DMI,[
2362         MOVE TT,IMPSVP          ;RESTART INPUT
2363         MOVEM TT,IMPPIA
2364         CONO IMP,(TT)
2365 ]
2366 IFN DMI,CONO FI,FIIN+NETCHN*11
2367 CINET1: MOVSI TT,500000         ;UNLOCK THE BUFFER, CLEAR INPUT WITH LOCK FLAG
2368         ANDCAM TT,IMSOC6(Q)
2369         PUSHJ P,IMPIOS          ;RESTART OUTPUT
2370         POP P,A                 ;AND FALL INTO CINET2 TO RESTART USER
2371 CINET2: CONO PI,NETON
2372         JRST NJUPCL             ;RESTART USER IF ONE WAS STOPPED
2373 ] ;END IFN NCPP
2374 \f
2375 ;FREE BLOCKS THAT BECAME FREE AT INT LEVEL.
2376 ACMTC:  SKIPN MEMFP1    ;ANY BLKS BECAME FREE AT INT LVL?
2377          POPJ P,
2378         CONO PI,UTCOFF
2379         SKIPL MEMFRZ    ;IF MEMFRZ IS LOCKED, CAN'T DO THIS.  JUST
2380          JRST UTCONJ    ;HOPE ENOUGH CORE IS FREE. MUST BE BETTER WAY!
2381         MOVE A,MEMFP1   ;GET # OF ONE OF THEM,
2382         LDB B,[MLO,,MEMBLT(A)]  ;REMOVE IT FROM LIST OF SUCH BLOCKS
2383         HRRZM B,MEMFP1
2384         LDB B,[MUR,,MEMBLT(A)]
2385         CAIE B,MUFRT
2386          JRST 4,.
2387         PUSHJ P,MEMR
2388         JRST ACMTC
2389
2390 ;COPY A PHYSICAL PAGE'S DATA FROM PAGE (J) TO PAGE (D)
2391 CMOVE1: MOVE C,MEMBLT(J)
2392         MOVEM C,MEMBLT(D)
2393         CLEARM MEMBLT(J)
2394         MOVE C,MEMPNT(J)
2395         MOVEM C,MEMPNT(D)
2396         CLEARM MEMPNT(J)
2397         MOVE C,MMSWP(J)
2398         MOVEM C,MMSWP(D)
2399         HRRZ A,D
2400         CAIGE A,SYSB
2401          JRST 4,.
2402         TRO D,600000+PMCSHM
2403         TRO J,600000+PMCSHM
2404         DPB D,[.CORJT+EXEUMP]
2405         DPB J,[.CORJF+EXEUMP]
2406         TRZ D,600000+PMCSHM
2407         TRZ J,600000+PMCSHM
2408         CLRPGM +LUBLK
2409         MOVE A,[400000+CORJF*2000,,400000+CORJT*2000]
2410         BLT A,400000+CORJT*2000+1777
2411         MOVEI A,0
2412         DPB A,[.CORJT+EXEUMP]
2413         DPB A,[.CORJF+EXEUMP]
2414         POPJ P,
2415
2416 MEMMF:  LDB A,[MUR,,MEMBLT(D)]
2417         CAIE A,MUFR
2418          JRST 4,.
2419         HRRZ A,D
2420         PUSHJ P,TCALL
2421           JRST MPOUT
2422         POPJ P,
2423
2424 UDELAY: PUSH P,T
2425         MOVE T,TIME
2426         ADDI T,15.      ;SLEEP 1/2 SEC. (REALLY SHOULD DO A LOW
2427         CAMLE T,TIME    ;PRIORITY UNBLOCK IF SYS LIGHTLY LOADED)
2428 UDELA1:  PUSHJ P,UFLS
2429         JRST POPTJ
2430
2431 CZRR:   PUSH P,A
2432         CAIGE A,SYSB    ;CORE ZEROER
2433          JRST 4,.
2434         TRO A,600000+PMCSHM
2435         DPB A,[.CORJT+EXEUMP]
2436         CLRPGM +LUBLK
2437         CLEARM 400000+CORJT*2000
2438         MOVE A,[400000+CORJT*2000,,400000+CORJT*2000+1]
2439         BLT A,400000+CORJT*2000+1777
2440         MOVEI A,0
2441         DPB A,[.CORJT+EXEUMP]
2442         JRST POPAJ
2443 \f
2444 ;ROUTINES TO ALLOCATE BLOCKS OF MEMORY
2445 ;CALL ONLY AT UTC LEVEL OR WITH UTC OFF
2446
2447 OVHMTR ALC      ;CORE ALLOCATION
2448
2449 ;SEE IF CAN ALLOCATE MEMORY
2450 MQTEST: MOVE A,MEMFR
2451         SUB A,NCBCOM
2452         JUMPLE A,CPOPJ
2453         SKIPLE MEMFR
2454          SKIPL MEMFRZ
2455           POPJ P,
2456         JRST POPJ1
2457
2458 ;ALLOCATE PREFERRING HIGH MEMORY, FOR RANDOM USER PAGE.  SHUFFLEABLE PAGE OK.
2459 HMRQC:  PUSHJ P,MQTEST
2460          POPJ P,
2461 HMEMRQ: PUSH P,B
2462         PUSH P,E
2463         HRREI B,MEMHPT-MEMBLT
2464 HMRQ3:  LDB A,[MLO,,MEMBLT(B)]
2465         JUMPE A,HMRQ1   ;HIGH HALF FULL TRY LOW
2466         CAIL A,SYSB     ;DON'T ALLOCATE PART OF THE SYSTEM
2467         SKIPGE MEMBLT(A) ;DON'T ALLOCATE IF LOCKED
2468          SKIPA B,A      ;THIS PAGE NOT AVAIL, TRY NEXT
2469           JRST IMRQ8    ;GOBBLE IT
2470         JRST HMRQ3
2471
2472 HMRQ1:  POP P,E
2473         POP P,B
2474         JRST NMMRQ      ;THAT DIDNT WORK, TRY LOW HALF
2475
2476 ;ALLOCATE A BLOCK OF MEM FOR 200-WORD BUFFERS
2477 UIMRQ:  MOVE A,IOBFC
2478         CAIGE A,8
2479          POPJ P,        ;NOT ENOUGH ROOM IM IOBFT
2480         MOVE A,MEMFR
2481         SUB A,NCBCOM
2482         CAIG A,3
2483          POPJ P,
2484
2485 ;GET A BLOCK THAT WON'T BE SHUFFLED, AND IS DIRECTLY ACCESSIBLE.
2486 IOMQ:   PUSHJ P,MQTEST  ;GET LOW OR MEDIUM MEMORY FOR I/O
2487          POPJ P,
2488
2489 ;ALLOCATING LOW MEM
2490 NMMRQ:  MOVEI A,0               ;MEMFP = MEMBLT+0
2491 IMRQ7:  PI2SAF
2492         PUSH P,B
2493         PUSH P,E
2494 IMRQ2:  LDB A,[MLO,,MEMBLT(A)]
2495         JUMPN A,IMRQ3
2496         PUSH P,C
2497         PUSH P,H
2498         PUSH P,TT
2499         MOVEI C,IMEMR
2500         SKIPGE UDRSW
2501          PUSHJ P,QDFLS  ;TRY FLUSHING DISK DIRS
2502         POP P,TT
2503         POP P,H
2504         POP P,C
2505         MOVEI A,0
2506 IMRQ6:  LDB A,[MLO,,MEMBLT(A)]
2507         JUMPE A,IMRQR   ;NO MEM AVAIL IN LOW HALF, TAKE NON-SKIP RETURN
2508         SKIPGE MEMBLT(A)
2509          JRST IMRQ6
2510         JRST IMRQ9
2511
2512 MPOUT1:
2513 IMRQR:  POP P,E
2514         JRST POPBJ
2515
2516 IMRQ3:  SKIPGE MEMBLT(A)
2517          JRST IMRQ2     ;LOCKED LOOK FOR ANOTHER
2518 IMRQ9:  TDZA B,B        ;GOBBLE FROM LOW
2519 IMRQ8:   MOVNI B,1      ;GOBBLE FROM HIGH
2520         AOS -2(P)       ;CAUSE RETURN TO SKIP
2521         LDB E,[MUR,,MEMBLT(A)]
2522         CAIN E,MUFR
2523          JUMPN A,IMRQ4
2524         JRST 4,.        ;BLOCK GOT PUT ON FREE STORAGE LIST WITHOUT USAGE FIELD GETTING "FREE"
2525 \f;ROUTINES FOR RETURNING MEMORY
2526 IMEMR:  PI2SAF          ;HERE OTHERWISE (SEE BELOW)
2527         CAIGE A,TSYSM
2528         CAIGE A,SYSB
2529          JRST 4,.       ;DON'T RETURN PART OF SYSTEM
2530         SKIPL MEMFRZ
2531          JRST IMEMR1
2532 CIMEMR: PUSH P,B        ;ENTER HERE IF OK TO HACK WITH MEM FROZEN
2533         LDB B,[MUR,,MEMBLT(A)]  ;I E CALLING FROM CORE ALLOCATOR
2534         CAIN B,MUFR
2535          JRST 4,.       ;ALREADY FREE, LOSSAGE
2536         SETZM MEMBLT(A) ;INITIALIZE RANDOM FIELDS
2537         CAIGE A,256.    ;HIGH MOBY GOES ON HIGH LIST
2538         CAIGE A,LIOBLK  ;LOW SHUFFLEABLE GOES ON HIGH LIST
2539          JRST CIMEM1
2540         CAIGE A,128.    ;LOW NON-SHUFFLEABLE GOES ON LOW LIST
2541          JRST CIMEM0
2542         CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
2543          SKIPN USEMDM   ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
2544            JRST CIMEM1
2545 CIMEM0: LDB B,[MLO,,MEMFP]      ;PICK UP HEAD OF APPRO FS LIST
2546         DPB B,[MLO,,MEMBLT(A)]  ;STORE AS LINK OUT OF CURRENT WD
2547         CAIE B,0        ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
2548          DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
2549         MOVEI B,0       ;NO BACK PTR, THIS WILL BE FIRST IN LIST
2550         DPB B,[MLU,,MEMBLT(A)]
2551         DPB A,[MLO,,MEMFP]      ;STORE THIS AS FREE LIST HEAD
2552         AOS LMEMFR
2553 CIMEM3: MOVEI B,MUFR
2554         DPB B,[MUR,,MEMBLT(A)]  ;STORE FREE IN USER
2555         CLEARM MEMPNT(A)
2556         AOS MEMFR
2557         JRST POPBJ
2558
2559 CIMEM1: LDB B,[MLO,,MEMHPT]     ;PICK UP HEAD OF APPRO FS LIST
2560         DPB B,[MLO,,MEMBLT(A)]  ;STORE AS LINK OUT OF CURRENT WD
2561         CAIE B,0        ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
2562          DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
2563         MOVEI B,0       ;NO BACK PTR, THIS WILL BE FIRST IN LIST
2564         DPB B,[MLU,,MEMBLT(A)]
2565         DPB A,[MLO,,MEMHPT]     ;STORE THIS AS FREE LIST HEAD
2566         JRST CIMEM3
2567
2568 IMEMR1: PUSH P,B        ;FREE A PAGE WHEN MEMFRZ LOCKED.
2569         MOVE B,MEMFP1   ;ADD IT TO FRONT OF MEMFP1 LIST
2570         DPB B,[MLO,,MEMBLT(A)]
2571         HRRZM A,MEMFP1
2572         MOVEI B,MUFRT   ;THEN SAY THIS BLK BECAME FREE WITH MEM FROZEN.
2573         DPB B,[MUR,,MEMBLT(A)]
2574         SETZM MEMPNT(A)
2575         JRST POPBJ
2576
2577 ;ROUTINES TO RETURN MEMORY CONTINUED
2578
2579 MGMEMR: PUSHJ P,TMEMR   ;MAG TAPE MEMR
2580          MUMGB
2581         POPJ P,
2582
2583 TMEMR:  PUSH P,B
2584         LDB B,[MUR,,MEMBLT(A)]
2585         CAME B,@-1(P)
2586          JRST 4,.       ;RETURNING BLOCK NOT OF TYPE EXPECTED
2587         POP P,B
2588         AOS (P)         ;SKIP OVER ARG
2589 MEMR:   CONO PI,UTCOFF
2590         PUSHJ P,IMEMR
2591         JRST UTCONJ
2592
2593 CMEMR:  CONO PI,UTCOFF
2594         PUSHJ P,CIMEMR
2595         JRST UTCONJ
2596 \f
2597 ; ROUTINES TO UNTHREAD BLOCKS FROM FREE LISTS
2598
2599 MPOUT:  PI2SAF
2600 MPOUT2: JUMPE A,[JRST 4,.]      ;ENTER HERE FROM INITIALIZATION IF HOLE FOUND
2601         PUSH P,B
2602         PUSH P,E
2603         CAIGE A,256.    ;HIGH MOBY GOES ON HIGH LIST
2604         CAIGE A,LIOBLK  ;LOW NON-SHUFFLEABLE GOES ON HIGH LIST
2605          JRST MPOUT4
2606         CAIGE A,128.    ;LOW SHUFFLEABLE GOES ON LOW LIST
2607          JRST MPOUT3
2608         CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
2609          SKIPN USEMDM   ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
2610 MPOUT4:   SKIPA B,[-1]  ;IT'S HIGH MEM
2611 MPOUT3:    MOVEI B,0    ;IT'S LOW MEM
2612
2613 IMRQ4:  PUSH P,B                ;0 LOW -1 HIGH
2614         LDB B,[MLU,,MEMBLT(A)]  ;LINK UP
2615         LDB E,[MLO,,MEMBLT(A)]  ;LINK OUT
2616         JUMPN B,IMRQ5   ;JUMP IF NOT FIRST IN LIST
2617         JUMPE E,IMRQ5   ;JUMP IF LAST BLOCK IN LIST
2618         LDB B,[MUR,,MEMBLT(E)]  ;FIRST AND FOLLOWED
2619         CAIE B,MUFR
2620          JRST 4,.       ;DOESNT LINK TO A FREE BLOCK
2621         MOVEI B,0       ;PUT BACK 0
2622 IMRQ5:  SKIPE E         ;SKIP IF NO BLOCK FOLLOWS
2623          DPB B,[MLU,,MEMBLT(E)] ;STORE LINK UP OF PATCHED OUT BLOCK IN LINK OUT BLOCK
2624         JUMPE B,IMRQ5A
2625         DPB E,[MLO,,MEMBLT(B)]  ;STORE LINK OUT OF PATCHED OUT BLOCK IN LINK UP BLOCK
2626         POP P,B         ;GET BACK WHICH PART OF MEM IT'S IN
2627         JRST IMRQ5C     
2628
2629 IMRQ5A: POP P,B         ;GET BACK WHICH PART OF MEM IT'S IN
2630         DPB E,[MLO,,MEMFP(B)] ;THIS WAS FIRST IN FREE LIST, ADJUST LIST HEADER
2631 IMRQ5C: SKIPL B         ;SKIP IF NOT IN LOW HALF
2632          SOS LMEMFR     ;ADJUST FREE BLOCKS IN LOWER HALF
2633         SOS MEMFR       ;1 LESS FREE BLOCK IN SYSTEM
2634         SETZM MEMBLT(A) ;CLEAN UP MEMBLT ENTRY FOR CALLER'S SAKE
2635         MOVEI B,MUINP   ;IN PROCESS
2636         DPB B,[MUR,,MEMBLT(A)]
2637         JRST MPOUT1
2638
2639 OVHMTR UUO      ;MORE MISC UUOS ETC.
2640
2641 TCALL:  CONO PI,UTCOFF
2642         PUSHJ P,@(P)
2643          SKIPA
2644           AOS (P)
2645         JRST UTCOJ1
2646
2647 EBLK
2648 \f
2649 SUBTTL MEMORY ALLOCATION TABLES
2650
2651 IOBFTL: MXIOB   ;BEG FOR GETSYS (MEMORY)
2652 IOBFT:  REPEAT  MXIOB-1,176000,,.RPCNT+1        ;MAX DYN ALLOC IO BUFFERS
2653         176000,,377     ;4.9 FREEZE
2654         ;4.8 ALLOC INHIBIT
2655 IOCH==340600    ;4.7-4.2 SYS CHN NO 77 => FREE
2656 IOLC==241000    ;4.1-3.3 LINK TO NEXT SEQ BUF IN CORE (W/IN 1K BLK)
2657 IOLO==1000      ; LINK TO FOLLOWING BUFFER OR
2658         ;SPECIAL STATES LINK OUT
2659         ;-1     LAST BUFFER CURRENTLY FILLED
2660         ;-2   END OF FILE
2661         ;-3   BUFFER ACTIVE AT MAIN PROG LEVEL
2662         ;-4   BUFFER ACTIVE AT PI LEVEL
2663 ;IF CHN IS NUTIC+NUTOC (UTAPE FILE DIR) THEN IOLO IS TAPE NO
2664 ;CHNLS NUTIC+NUTOC+1 (NFCLC)=>$Q+NCLCH-1 ARE CORE LINK DEVICE
2665 ;CHNLS NFNETC => $Q+NNETCH-1 ARE NET CHNLS
2666 SCNCLO==NUTIC+NUTOC+1
2667
2668 IOSA==101400    ; BUFFER SA _-6
2669 IOSA1==111300   ;ONLY RELEVANT BITS FOR 200 WD BUFFERS
2670
2671
2672 IOBFP:  0       ;FREE STG TO IOBFT ENT
2673 IOBFC:  MXIOB-8 ;CNT OF AVAIL
2674                         ;LEAVE 8 AVAIL SO CORE HACKER CAN NOT RUN OUT
2675
2676 UTFS:   377     ;FREE STG PNTR TO 200 WD BUFFERS
2677 UTTLB:  -NUTIC-NUTOC ;TOTAL BUFFERS ALLOCATED TO UTAPES
2678 UTTBF:  0       ;TOTAL UT BUFFERS FREE
2679
2680 ;EXEC MAPS
2681 IF2,[
2682 EXEUMP=UPGMP+100        ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S MAP AREA
2683 EXELMP==UPGMP           ;KL10 AND KS10 ALSO NEED EXEC LOWER MAP, + EXISTS
2684 ];IF2                   ;SO USERS CAN COPY PAGES FROM THE SYSTEM JOB
2685
2686 ;TABLE OF BYTE POINTERS THAT POINT TO VIDEO BUFFER AREA OF EXEUMP
2687 IFN N11TYS,[
2688 TTCRT:  REPEAT NTVBP,[
2689                 CONC [.TTR]\.RPCNT,+EXEUMP
2690 ]
2691 ]
2692
2693 IFN PDP6P,[
2694 ;DBR FOR REFERENCING PDP6 MEM
2695 PDP6MP: <LPDP6M/2>_1,,PDPUMP
2696
2697 ;PAGE MAP FOR REFERENCING PDP6 MEM
2698 PDPUMP: REPEAT LPDP6M/2,600000+<PDP6BM_-10.>+2*.RPCNT,,600000+<PDP6BM_-10.>+2*.RPCNT+1
2699 ]
2700
2701 IFN 340P,[
2702 DDEXCF: BLOCK NEXPGS    ;-1 IF EXEC PAGE SET UP FOR 340
2703 ]
2704
2705 IFN KA10P, EXECMP: 100_1,,EXEUMP        ;EXEC DBR
2706 \f;MEMORY ORGANIZATION
2707
2708 ;PAGE 0 ALWAYS BELONGS TO THE SYSTEM AND IS NEVER ALLOCATED OR FREED.
2709 ;
2710 ;N PAGES OF SYSTEM CODE AND VARIABLES ARE ACQUIRED BY THE SYSTEM JOB AT STARTUP.
2711 ;
2712 ;N PAGES OF USER-VARIABLE BLOCKS BELONG TO THE SYSTEM JOB.  THESE ARE
2713 ;ALLOCATED AND DEALLOCATED AS REQUIRED.  LIOBLK-1 IS THE HIGHEST THIS CAN GO.
2714 ;USER PAGES BELOW LIOBLK CAN BE SHUFFLED OUT WHEN THE SYSTEM JOB NEEDS THE CORE.
2715 ;
2716 ;FROM LIOBLK TO 128K IS THE "LOW HALF."  THESE PAGES ARE DIRECTLY ADDRESSABLE
2717 ;IN EXEC MODE AND NEVER NEED TO BE SHUFFLED.  I/O BUFFERS, DISK DIRECTORIES,
2718 ;ETC. ARE ALLOCATED IN THESE PAGES.
2719 ;
2720 ;128K TO 128K+NEXPGS ARE PAGES WHICH CAN'T BE ADDRESSED DIRECTLY FROM
2721 ;EXEC MODE BECAUSE THEIR EXEUMP SLOTS ARE USED BY "EXEC PAGES."
2722 ;
2723 ;THE REST OF THE LOW MOBY, UP TO FDDTPG, IS DIRECT-MAPPED AND
2724 ;USED FOR ADDITIONAL "LOW HALF" PAGES.
2725 ;
2726 ;FDDTPG TO 256K CONTAINS DDT AND THE SYSTEM SYMBOL TABLE.
2727 ;
2728 ;PAGES ABOVE 256K ARE IN THE "HIGH MOBY".
2729 ;
2730 ;PAGES NOT IN THE "LOW HALF" (BELOW LIOBLK, SHADOWED BY EXEC, OR HIGH MOBY)
2731 ;ARE CONSIDERED TO BE IN THE "HIGH HALF".  USER PAGES PREFER TO GO HERE.
2732 ;
2733 ;COMPLICATIONS:
2734 ; IF USEMDM IS OFF, THE DIRECT MAPPED PAGES IN THE HIGH HALF
2735 ; OF THE LOW MOBY ARE CONSIDERED HIGH RATHER THAN LOW.  THIS IS USED
2736 ; MOSTLY FOR DEBUGGING, TO CATCH REFERENCES TO RANDOM ADDRESSES.
2737 ; THERE CAN BE HOLES IN MEMORY (NXM).
2738 ;
2739 ;THE MEMBLT TABLE HAS ONE WORD FOR EACH 1K BLOCK OF MEMORY.
2740 ;IT SAYS WHAT THAT BLOCK IS USED FOR AND CONTAINS LINKS TO OTHER
2741 ;BLOCKS AND OTHER TABLES.  THE MEMPNT AND MMSWP TABLES ALSO CONTAIN
2742 ;ONE WORD PER BLOCK AND CONTAIN ADDITIONAL INFORMATION.
2743 \f
2744 FDDTPG: 0       ;# OF LOWEST BLOCK USED BY DDT & SYMTAB (SET AT STARTUP)
2745
2746 MEMFR:  0       ;# OF FREE BLOCKS IN ALL OF MEMORY.
2747
2748 LMEMFR: 0       ;# OF FREE BLOCKS IN LOW LIST (MEMFP).
2749
2750 MINCOR: 8       ;TRY TO KEEP THIS MANY PAGES FREE IN LOW MEMORY
2751                 ;MUST BE >= 3, SINCE LESSER-PRIORITY CONSUMERS OF
2752                 ;MEMORY WAIT IF LMEMFR IS < 3.
2753
2754 MEMFP1: 0       ;LIST (THREADED THROUGH MLO, TERMINATED BY 0)
2755                 ;OF BLKS THAT BECAME FREE WHILE MEMFRZ WAS LOCKED.
2756
2757 MEMHPT: 0       ;FREE LIST OF HIGH HALF PAGES AND HIGH MOBY PAGES
2758                 ;AND SHUFFLEABLE LOW HALF PAGES.  MUST BE AT MEMFP-1.
2759 MEMFP::
2760 MEMBLT: 0       ;FREE LIST POINTER FOR LOW PGS AND ALSO WD FOR BLOCK 0
2761         BLOCK TSYSM-1   .SEE BEGF0 ;FILLS THIS IN
2762
2763 ;FIELDS IN MEMBLT ENTRY:
2764 ;4.9  FREEZE OR ALLOC INHIBIT
2765 ;IF 4.9=1, DONT SET UP ANY MORE EXEC PGS POINTING TO THIS ONE
2766 MUR==360500     ;4.4-4.8 USAGE CODE
2767  MURUSR==1      ;USER PAGE, MMMPX=MMP INDEX
2768  MUEX==2        ;EXEC (?)
2769  MUIOB==3       ;200 WD BUFFERS, MNUMB=FIRST IOBFT ENTRY IN BLOCK
2770  MUFR==4        ;FREE
2771  MUINP==5       ;IN PROCESS OF BEING ALLOCATED
2772  MUMGB==6       ;MAG TAPE BUFFER, MNUMB=TAPE NO+EOF BIT, MWC=WORD COUNT
2773  MUMMP==7       ;MMP TABLE
2774  MUDISB==10     ;340 DISPLAY BUFFER
2775  MUFRT==11      ;BLOCK RETURNING TO FREE WHEN MEM LOCKED
2776  MU23B==12      ;DISK BUF, MWC=WORD COUNT, MNUMB=CHANNEL
2777  MU23UD==13     ;DISK USER DIR, MNUMB=QSNUD SLOT
2778  MU23MD==14     ;DISK MASTER DIR
2779  MU23TT==15     ;DISK TUT MNUMB=DISK NO.
2780  MU23LS==16     ;DISK COPY OF USER DIR FOR LISTING
2781  MUHOLE==17     ;"HOLE" IN REAL MEM
2782  MUDDT==20      ;"DDT" PAGE
2783  MUNET==21      ;NETWORK "BIG" BUFFER
2784  MUSWPG==22     ;PAGE IN SWAPPING QUEUE, MMMPX=MMP INDEX
2785  MUCHA==23      ;CHAOS NET BUFFERS
2786  MU23FB==24     .SEE QSFBT      ;DISK FREED-BLOCKS TABLES
2787  MUPKT==25      ; Net packet buffers
2788  MUDVB==26      ;Semi-static device IO buffer page
2789 ;ADD NEW MUR TYPES HERE ^
2790 MURMAX==27      ;HIGHEST VALID CODE + 1
2791
2792 MWC==221400     ;3.1-4.3 WORD COUNT IN I/O BUFFERS
2793
2794 MLU==221400     ;3.1-4.3 LINK UP FOR DOUBLY-THREADED FREE LIST
2795
2796 MNUMB==140600   ;2.4-2.9 MAGIC NUMBER SEE COMMENTS UNDER MUR ABOVE
2797
2798 MMMPX==142200   ;2.4-4.3 MMP INDEX IN USER PGS + SWAP BUFFERS
2799
2800 MLO==001400     ;1.1-2.3 LINK TO NEXT PAGE IN A LIST
2801                 ;0 = END OF LIST
2802                 ;UNLIKE IOLO AND PREVIOUS VERSION OF MLO, THERE ARE NO MAGIC NEGATIVE CODES
2803                 ;N.B.: MLO MUST BE AT RIGHT-HAND END OF WORD - CODE DEPENDS
2804
2805 MEMPNT: BLOCK TSYSM     ;RH USED FOR CIRC MEM USE PNTR IF USER MEM
2806                         ;LH FOR DISK ADDRESS CAME FROM OR GOING TO
2807                          ;MEMPNT HAS BLOCK NUMBER
2808                          ;DISK NUMBER COMES FROM CHANNEL LINKED TO
2809         ;CIRCULAR PAGE LINK FORM
2810         ;2.9=0
2811         ;1.1-1.8 PAGE #
2812         ;2.8-1.9 USER #
2813         ;2.9=1
2814         ;2.8=0 2.7-1.1 LINK TO MMP TABLE
2815         ;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE
2816         ;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED
2817
2818 MMSWP:  BLOCK TSYSM     ;IF USER MEM, HAS NUMBER OF PAGE TABLE WORDS
2819                         ; WHICH POINT AT THIS PAGE.  LH IS NUMBER OF EXEC
2820                         ; PAGES, RH IS NUMBER OF USER PAGES.  NOTE THAT THE
2821                         ; NUMBER OF UPGCP ENTRIES COULD BE MORE, FOR VARIOUS
2822                         ; REASONS, E.G. CIRPSW LOCKED WHEN PAGE SWAPPED IN,
2823                         ; OR A USER WAS SWAPPED OUT.
2824                         ;IFN SWPWSP, RH(MMSWP) IS USED AS NUMBER OF SHARERS.
2825
2826 EMEMTL==.-1     ;END FOR GETSYS (MEMORY)
2827 \f
2828 MMPRTC: 0       ;C AT MMPRTN, FOR DEBUGGING
2829
2830 MMPFS:  0       ;FREE-LIST OF MMP ENTRIES.  VALUE IS ADDRESS. (FORMERLY WAS IDX).
2831
2832 MMPFS2: 0       ;LIST OF MMPS THAT NEED TO HAVE TUT SOS'ED BEFORE THEY CAN BE FREED.
2833                 ;TUT COULDN'T BE SOS'ED AT P.I. LEVEL BECAUSE IT WAS LOCKED.
2834                 ;THESE MMPS MAY ALSO NEED TO BE REMOVED FROM THE SHAREABLE
2835                 ;PAGE TABLE, WHICH REQUIRES CIRPSW.
2836
2837 MMPCNT: 0       ;# OF MMP ENTRIES IN USE.
2838
2839 MMPFR:  NMMP*1000       ;MAX POSSIBLE # MMP ENTRIES, MINUS # IN USE OR COMMITTED.
2840
2841 ;MMP TABLE - TWO WDS PER ENTRY
2842 MMPPUB==400000  ;WD1 4.9 INDICATES A PUBLIC PAGE IF ON (ANYONE CAN ATTACH TO WRITE)
2843 MMPOUT==200000  ;4.8 => PAGE IS SWAPPED OUT OR ON WAY OUT.
2844 MMPTMP==100000  ;4.7 => IN TRANSIT (ON WAY IN OR ON WAY OUT).
2845 MMPWOD==40000   ;4.6 => THIS PAGE HAS BEEN WRITTEN ON DISK AT LEAST ONCE
2846 MMPISW==20000   ;4.5 PAGE ON INITIAL SWAPIN, BEING COPIED SO SWAP OUT TO DIFF PLACE
2847 MMPWRT==10000   ;4.4 HAS BEEN WRITTEN SINCE LAST DISK WRITE BY USER WHO HAS DETACHED THIS PAGE
2848 MMPGON==4000    ;4.3 FILE PAGE BEING WRITTEN OUT AFTER
2849                  ;DELETED FROM ALL MAPS (MMP ENTRY WILL SOON GO AWAY.)
2850 MMPBAD==2000    ;4.2 PAGE GOT PAR ERR SINCE LAST TIME SWAPPED OUT OR IN.
2851 MMPLOK==1000    ;4.1 => PAGE MAY NOT BE SWAPPED OUT.
2852 MMPSLO==400     ;3.9 => PAGE SHOULD GO IN SLOW MEMORY.
2853 MMPSHR==200     ;3.8 MMP ENTRY IS IN SHAREABLE PAGE HASH TABLE
2854 MMPPGA==100     ;3.7 BEING SWAPPED IN BY PAGE-AHEAD.  DON'T PUT IN USER MAPS; WAIT FOR FAULTS.
2855 MMPPGB==40      ;3.6 BEING SWAPPED OUT BY PAGE-BEHIND.
2856 $MMPUN==220300  ;3.1-3.3 UNIT NUMBER (GOES WITH DISK ADDR IN WD2 LH)
2857         ;WD1 RH CIRC MEM USE PNTR
2858         ;WD2 LH READ DISK ADR OR 0
2859         ;WD2 RH THREAD FOR SHAREABLE PAGE HASH TABLE
2860
2861 MMPNP:  0       ;#MMP PGS ACTUALLY IN USE
2862 MMPMX:  0       ;HIGHEST VALID MMP INDEX (MMPNP*2000)
2863
2864 MMMPG:  BLOCK NMMP      ;BLOCK NOS OF BLOCKS ACTUALLY USED
2865
2866 ;SHAREABLE PAGE HASH TABLE
2867 ;MMP ENTRIES THAT ARE SHARED WITH FILES ARE LISTED HERE TO SAVE TIME AT NCORQ2
2868 ;SIMPLE REMAINDER HASH ON UNIT#,,DISK ADDRESS,
2869 ;BUCKETS THREADED THROUGH RH(MMPE+1)
2870
2871 SHRHSL==31.     ;NUMBER OF BUCKETS
2872 SHRHSH: BLOCK SHRHSL
2873
2874 ;"LOOSE" PAGES (NOT USED BY ANY USER, BUT NOT YET SWAPPED OUT.)
2875 ;MMP ENTRY GOES AWAY WHEN SWAPPED OUT, OR GETS PUT BACK INTO SERVICE AT NCORQ3.
2876 NLOOSP: 0       ;NUMBER OF LOOSE PAGES
2877 FLOOSP: 0       ;HEAD OF LIST.  THREADED THROUGH MLO IN MEMBLT.
2878 LLOOSP: 0       ;TAIL OF LIST.  ADD AT TAIL, SWAPPER REMOVES FROM HEAD.
2879
2880 BBLK
2881 MMPEAD: REPEAT NMMP,    CONC MMP,\.RPCNT,*2000+400000   ;EXEC ADR
2882 MMPPPP: REPEAT NMMP,    CONC .MMP,\.RPCNT,+EXEUMP       ;PNTR TO EXEC PC MP
2883 USEMDM: DIRMAP          ;NON-ZERO => USE MEDIUM MEMORY.
2884                         ;DON'T CHANGE AFTER SYSTEM STARTUP
2885 \f
2886 SUBTTL 200-WORD I/O BUFFER ROUTINES
2887
2888 ;SYS CHANNEL ASSIGN
2889 ;  77=>FREE
2890 ; 0 - NUTIC+NUTOC-1 => UTAPE CHNL
2891 ;NUTIC+NUTOC (=NFCLC-1) =>UTAPE FILE DIR
2892 ;NFCLS-NFCLC+NCLCH-1 (=NFNETC-1) => CORE LINK
2893 ;NFNETC-NNETCH => NETWORK
2894
2895 IOBCNS: MOVEI A,IOBFP-IOBFT
2896 IOBC1:  MOVE E,A
2897         LDB A,[IOLO,,IOBFT(A)]
2898         CAIN A,377
2899          JRST 4,.       ;IOBFT POINTERS FOULED UP
2900
2901 IOBC2:  LDB B,[420200,,IOBFT(A)]
2902         JUMPN B,IOBC1
2903         LDB B,[IOLO,,IOBFT(A)]
2904         DPB B,[IOLO,,IOBFT(E)]
2905         SOS IOBFC
2906         POPJ P,
2907
2908
2909 IOBR:   MOVE B,IOBFP    ;RETURN IOBFT WORD
2910         CLEARM IOBFT(A)
2911         DPB B,[IOLO,,IOBFT(A)]
2912         MOVEM A,IOBFP
2913         MOVEI B,77
2914         DPB B,[IOCH,,IOBFT(A)]
2915         AOS IOBFC
2916         POPJ P,
2917
2918 IUTCONS:                ;ALLOCATE 200 WORD BUFFER
2919 IUTCO1: PI2SAF
2920         SKIPG UTTBF     ;CLOBBERS A B E TT, RETURNS IOBFT INDEX IN A
2921          JRST IUTC1     ;NO UTAPE BUFFERS FREE
2922         MOVEI E,UTFS-IOBFT
2923         MOVE A,UTFS     ;CHNL NO IN D
2924 IUTC3:  CAIN A,377
2925          JRST IUTC1
2926         LDB B,[420200,,IOBFT(A)]
2927         JUMPN B,IUTC2
2928         LDB B,[IOCH,,IOBFT(A)]
2929         CAIE B,77
2930          JRST 4,.       ;BUFFER BEING ALLOCATED ISN'T FREE.
2931         LDB B,[IOLO,,IOBFT(A)]
2932         DPB B,[IOLO,,IOBFT(E)]
2933         DPB D,[IOCH,,IOBFT(A)]
2934         SOS UTTBF
2935         JRST POPJ1
2936
2937 IUTC2:  MOVE E,A
2938         LDB A,[IOLO,,IOBFT(A)]
2939         JRST IUTC3
2940
2941 IUTC1:  PUSHJ P,UIMRQ
2942          POPJ P,
2943         PUSHJ P,UTMGB
2944         JRST IUTCO1
2945
2946 IBRTN:  PI2SAF
2947         PUSH P,B        ;FREE 200 WORD BUFFER (SEE BRTN)
2948 ;       LDB B,[IOCH,,IOBFT(A)]
2949 ;       CAIN B,77
2950 ;        JRST 4,.       ;RETURNING A BUFFER THAT'S FREE?
2951         MOVE B,UTFS
2952         DPB B,[IOLO,,IOBFT(A)]
2953         MOVEM A,UTFS
2954         MOVEI B,77
2955         DPB B,[IOCH,,IOBFT(A)]
2956         LDB B,[IOSA,,IOBFT(A)]
2957         SKIPN B
2958          JRST 4,.
2959         AOS UTTBF
2960         JRST POPBJ
2961 \f
2962 UTMGB:  PUSH P,J        ;GOBBLE MEM BLK IN A FOR UTAPE BUFFER
2963         PUSH P,R
2964         PUSH P,Q
2965         PUSH P,B
2966         PUSH P,E
2967         MOVEI B,MUIOB
2968         DPB B,[MUR,,MEMBLT(A)]
2969         MOVE J,A
2970         LSH A,10.-6.    ;CONV TO BUF SA
2971         MOVE TT,A       ;INCR TO NEXT BUF ADR
2972         MOVEI R,8
2973         ADDM R,UTTLB    ;UTTBF AOSED AT IBRTN
2974         MOVNI Q,1
2975 UTMG1:  PUSHJ P,IOBCNS
2976         DPB TT,[IOSA,,IOBFT(A)]
2977         JUMPL Q,UTMG2
2978         DPB A,[IOLC,,IOBFT(Q)]
2979 UTMG3:  MOVE Q,A
2980         PUSHJ P,IBRTN
2981         ADDI TT,2
2982         SOJG R,UTMG1
2983         MOVEI TT,377
2984         DPB TT,[IOLC,,IOBFT(A)]
2985         POP P,E
2986         POP P,B
2987         POP P,Q
2988         POP P,R
2989         POP P,J
2990 FSCMP:                          ;RECOMPUTE UTAPE BUFFER FAIR SHARE
2991 IFN NUNITS,[
2992         MOVE A,UTTLB
2993         PUSH P,A+1
2994         IDIV A,NUTCA
2995         POP P,A+1
2996         MOVEM A,UPCHFS
2997 ]
2998         POPJ P,
2999
3000 UTMG2:  DPB A,[MNUMB,,MEMBLT(J)]
3001         JRST UTMG3
3002
3003 BRTN:   CONO PI,UTCOFF          ;RETURN A 200-WD BUFFER
3004         PUSHJ P,IBRTN
3005         JRST UTCONJ