Consolidate license copies
[its.git] / system / core.81
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         CAIN U,(H)      ;AND OUR INFERIORS
863          JRST 1(T)
864         SKIPL H,JBI(U)  ;AND OUR BOJ DEVICE.
865          CAIE J,JBCUI(H)
866           JRST (T)
867         JRST 1(T)
868 \f
869 ;.CBLK AC,
870 ;(OBSOLESCENT)
871         ;AC 4.9 MUST BE ZERO
872         ;4.7 USED INTERNALLY IN CODE (W RQ ON PDP6)
873         ;4.3-4.1 = 0 GET PAGE FROM SELF
874         ;       = 1 GET ABSOLUTE PAGE
875         ;       = 2 GET PAGE FROM USER OPEN ON CH # 3.1-3.8
876         ;       = 3 GET PAGE FROM USER NUMBER 3.1-3.8
877         ;       = 4 GET PAGE
878         ;       = 5 GET PAGE (PUBLIC)
879         ;       = 6 MAKE PAGE PRIVATE
880         ;       = 7 MAKE PAGE PUBLIC
881         ;3.9=1 REQUEST WRITE PERMISSION (IGNORED ON FRESH PAGE, OTHERWISE VALID ONLY FOR
882         ;               SELF OR DIRECT INFERIOR OPEN ON CH OR PUBLIC PAGE)
883         ;3.1-3.8  USER NUMBER OR CH # (377 => CREATOR IF JOB DEVICE)
884         ;2.9=1 INSERT PAGE, 0 DELETE (IGNORES 4.3-4.1 EXCEPT FOR 6 OR 7 WHEN IT IS IGNORED)
885         ;2.1-2.8 VIRTUAL PAGE TO BE AFFECTED
886         ;1.1-1.9 BLOCK # IN ABSOLUTE OR OTHER USER (OR SELF IF 4.3-4.1 = 0)
887
888 ;TO CALL NCBLK, SET UP Q WITH USER INDEX REQUEST IS FOR AND U WITH
889 ;THE USER INDEX MAKING THE REQUEST
890
891 ;NEW .CBLK CODE, PASSES THE BUCK TO CORBLK.
892 ;SAME AS FAR AS CALLER IS CONCERNED.
893
894 ACBLK:  MOVE TT,U       ;TARGET USR IDX.
895         UMOVE B,(J)
896 NCBLK0: MOVEI W,5       ;FAKE 5 ARGS TO NCORBL
897         LDB C,[111000,,B]       ;TARGET PAGNUM.
898         LDB E,[1100,,B] ;SOURCE PAGNUM.
899         TRNN B,400000
900          JRST NCBLKD    ;LIKELY TO BE DELETE RQ.
901 NCBLK1: MOVSI A,210000  ;NOT DELETE => RQ READ, FAIL IF CAN'T.
902         LDB D,[221000,,B]       ;SOURCE USR IDX OR CHNL NUM.
903         LDB H,[330300,,B]       ;REQUEST TYPE-CODE.
904         JRST .+1(H)
905
906         JRST NCBLKS     ;TYPE 0, SOURCE IS SELF.
907         JRST NCBLKA     ;TYPE 1, GET ABS PAGE.
908         JRST NCBLKC     ;2, USE SPEC'D CHNL NUM.
909         JRST NCBLKI     ;3, USE SPEC'D USR IDX.
910         JRST NCBLKF     ;4, FRESH PAGE.
911         JRST NCBLKP     ;5, FRESH PUBLIC PAGE.
912         TLOA A,420000   ;6, MAKE PRIVATE, SOURCE=TARGET.
913         TLO A,440000    ;7, MAKE PUBLIC,    "      "
914         MOVE E,C        ;SOURCE PAGNUM _ TARGET PAGNUM,
915 NCBLKS: TROA D,-1       ;GET PAGE FROM SELF. (%JSELF=-1)
916 NCBLKA:  MOVEI D,%JSABS ;GET ABS PAGE
917 ;IF GET-FROM-CHANNEL, THE CHNL NUM IN D IS DESIRED JOB-SPEC.
918 NCBLKC: TLNE B,400      ;IF WRITE-RQ BIT ON,
919          TLO A,100000   ;INSIST ON WRITE ACCESS.
920 NCORBX: CAIE TT,(U)     ;IF TARGET .NE. SELF,
921          PUSHJ P,NULSET  ;FAKE OUT THOSE EXPECTING A LOSSET.
922         JRST NCORB9
923
924 NCBLKI: IORI D,%JSNUM   ;GET FROM USR IDX, MAKE JOB SPEC.
925         JRST NCBLKC
926
927 NCBLKP: TLO A,40000     ;GET FRESH PUBLIC PAGE.
928 NCBLKF: MOVEI D,%JSNEW  ;GET FRESH PAGE
929         JRST NCBLKC
930
931 NCBLKD: TLC B,6000      ;COME HERE IF BIT 2.9 IS 0
932         TLCN B,6000
933          JRST NCBLK1    ;(TYPES 6,7 IGNORE THAT BIT)
934         SETZB A,B       ;OTHERWISE IS DELETE REQUEST.
935         JRST NCBLKS
936
937 NCBLK:  MOVE B,TT
938         MOVE TT,Q
939         JRST NCBLK0
940 \f
941 ;ACTUALLY COPY A PAGE FROM ONE MAP TO ANOTHER
942 ;T PNTR TO MAP COPYING FROM
943 ;TT 400000 BIT 1=> WRITE
944 ;E TARGET PAGE #
945 ;U TARGET USER
946 ;B PNTR TO CIRC LIST
947
948 NCORR1: LDB J,T         ;ENTRY FROM NCORR
949         TRNN J,600000
950          JRST ACBK3A    ;PAGE NON EXISTANT OR SWAPPED OUT
951         TRNN TT,400000  ;WRITE RQ ?
952          TRZ J,400000   ;DOESN'T RQ MORE
953         TRNN J,600000
954          TRO J,200000   ;IN CASE OF RWF
955 ACBK3B: MOVE A,E        ;TARGET PAGE #
956         PUSHJ P,UPLC
957         LDB C,T         ;GET PTW ABOUT TO BE CLOBBERED
958         TRZ C,PMAGEM    ;TURN OFF AGE BITS
959         JUMPN C,[JRST 4,.]      ;SHOULD HAVE DELETED PAGE BY NOW
960         DPB J,T         ;SET UP MAP
961         TRNN J,600000
962          JRST ACBK3C    ;JUMP IF PAGE SWAPPED OUT
963         ANDI J,PMRCM
964         CAIL J,TSYSM
965          JRST 4,.
966 IFE SWPWSP,     AOS MMSWP(J)    ;AOS NUMBER OF USERS POINTING TO PAGE
967 IFN SWPWSP,[
968         HRRZ TT,MMSWP(J)
969         AOS MMSWP(J)    ;AOS NUMBER OF USERS POINTING TO PAGE
970         MOVSI C,1       ;ADJUST WORKING SET OF TARGET JOB
971         IDIV C,TT       ;1,,0 IF DIVISION BY ZERO
972         ADDM C,UWRKST(U)
973         JUMPE TT,ACBK3D ;JUMP IF NO SHARERS
974         IMULI TT,1(TT)  ;COMPUTE ADJUSTMENT TO ALL WORKING SETS
975         MOVSI C,-1      ;DUE TO INCREASE IN SHARING
976         IDIV C,TT
977         MOVE D,C
978         PUSH P,U
979         PUSH P,I
980         PUSHJ P,UCPRL7  ;CLOBBERS C,H,I,U
981             400000,,SWOP6B
982         POP P,I
983         POP P,U
984 ];SWPWSP
985 ACBK3D: LDB J,B         ;POINTER TO PREVIOUS IN CHAIN
986         DPB J,Q         ;PATCH
987         MOVE C,U
988         IDIVI C,LUBLK
989         DPB C,[101000,,A]
990         DPB A,B         ;PATCH
991         AOS NMPGS(U)
992         AOS SNMPGS      ;SYSTEM HAS 1 MORE PAGE
993         POPJ P,
994
995 ACBK3A: TRNN TT,400000
996          TRZ J,2
997         TRO J,1         ;IN CASE OF R/W/F
998         JRST ACBK3B
999
1000 ACBK3C: AOS NSWPGS(U)
1001         AOS SNSWPG
1002         JRST ACBK3D
1003 \fACRF1: MOVE TT,B
1004         MOVE W,Q        ;INDEX OF USER THAT REQUEST IS FOR
1005         IDIVI W,LUBLK   ;CLOBBERS H
1006         HRL TT,W
1007         TLNE TT,600000
1008          JRST 4,.
1009         JRST ACRFL
1010
1011 NACRFL: PUSHJ P,LSWPOP  ;UNLOCK CASW OR CIRPSW
1012 ACRFL:  PCLT
1013         SKIPL CORRQ(U)  ;CURRENT USER IN U COR RQ FOR USER IN Q
1014          PUSHJ P,UFLS   ;WAIT FOR MY CORE RQ TO CORE JOB TO CLEAR
1015         MOVSI J,BUSRCR
1016         MOVE T,J
1017         TDNE T,APRC(Q)
1018          PUSHJ P,UFLS   ;SOMEBODY ELSE HAS RQ IN ON THIS JOB WAIT TO CLEAR
1019         PUSHJ P,SWTL
1020             CASW        ;GET CORE ASSIGN SW
1021         TDNE J,APRC(Q)
1022          JRST NACRFL    ;CHECK FOR TIMING ERROR
1023         TLNN TT,200000
1024          JRST ACRF6     ;OLD TYPE
1025         MOVNI J,1       ;ADDING ONE BLOCK
1026         MOVEI B,105     ;FAKE OUT CORE TO ZERO CHECK
1027         JRST ACRF8
1028
1029 ACRF6:  MOVE J,HUSRAD(Q)
1030         LSH J,-10.
1031         CAMN J,B
1032          JRST LSWPJ1    ;SAME AMOUNT AS NOW
1033         MOVE T,APRC(Q)
1034         TLNE T,BULGOS
1035          JUMPN B,LSWPOP ;TRYING TO CORE NON-ZERO A JOB THAT IS DYING?
1036         SUB J,B         ;GET AMT OF DECREASE (- => INCREASE)
1037         CAMGE J,[-20.]
1038          JRST ACRF6A    ;GET 20 AT A WHACK MAX
1039 ACRF8:  MOVN I,J        ;I GETS POSITIVE # OF PAGES ADDED
1040         ADD J,MEMFR
1041         SUB J,NCBCOM    ;J GETS AMT THAT WILL BE LEFT
1042         CAIGE J,5
1043          JUMPG I,ACRF7  ;NOT ENUF CORE
1044         MOVEI J,0       ;INDICATE RQ WILL BE COMPLETELY SATISFIED
1045         CAIL I,20.
1046          MOVNI J,1      ;MAKE SURE RQ IS REALLY FILLED
1047 ACRF5:  JUMPL I,ACRF2   ;JUMP IF DECREASING CORE
1048         JUMPE Q,ACRF3   ;SYSTEM JOB DOESN'T USE MMP
1049         MOVN T,I
1050         ADDB T,MMPFR    ;COMMIT SUFFICIENT NUMBER OF MMP ENTRIES
1051         JUMPGE T,ACRF3  ;JUMP IF THAT MANY ARE AVAILABLE
1052         ADDM I,MMPFR    ;MMP FULL, DECOMMIT THE MMP ENTRIES
1053         JRST LSWPOP     ;AND TAKE ERROR RETURN
1054
1055 ACRF2:  AOSA NCRQL      ;COUNT # REQUESTS FOR LESS
1056 ACRF3:   ADDM I,NCBCOM  ;IF EXPANDING, COMMIT SUFFICIENT AMOUNT OF PHYSICAL CORE
1057         MOVSI T,BUSRCR
1058         IORM T,APRC(Q)  ;CORING USER
1059         MOVEM TT,CORRQ(U)
1060         AOS NCORRQ
1061         PUSHJ P,LSWPOP  ;UNLOCK
1062 IFN SCHBLN,[
1063         CONO PI,CLKOFF  ;GET CORE JOB TO RUN RIGHT AWAY
1064         MOVE I,USER     ;THEN COME RIGHT BACK TO US (WHAT A CROCK THIS ALL IS)
1065         PUSHJ P,SCHSB
1066         MOVEI I,LUBLK
1067         PUSHJ P,SCHSB
1068         CONO PI,CLKON
1069 ];SCHBLN
1070         PCLT
1071         SKIPL CORRQ(U)  ;WILL NOT SKIP AT FIRST
1072          PUSHJ P,UFLS
1073         JUMPN J,ACRF1   ;REALLY NEED TO TAKE ANOTHER WACK AT THIS
1074         JRST POPJ1
1075
1076 ACRF7:  PUSHJ P,LSWPOP
1077         PCLT
1078         MOVE T,I
1079         PUSHJ P,CFHPO3
1080          PUSHJ P,UFLS
1081         TLNE TT,200000
1082          JRST ACRFL
1083         JRST ACRF1
1084
1085 ACRF6A: ADDI J,20.
1086         ADD TT,J        ;GET REDUCED RQ
1087         MOVNI J,20.
1088         JRST ACRF8
1089 \f
1090 SUBTTL CORE ALLOCATOR - CORE JOB ROUTINES
1091
1092 CORJI:  MOVE P,USRPDL+L ;SET UP CORE JOB PDL
1093         JRST CORJOB
1094
1095 CORJ2:  AOSN UTBFLF
1096          JRST UTBFF     ;FLUSH UTAPE
1097         AOSN UFDFLF
1098          JRST UFDFF     ;FLUSH 2314 UFDS
1099         SKIPE MMPFS2
1100          JRST RETMM2    ;FLUSH PARTIALLY-RETURNED MMP ENTRIES
1101         SKIPE QFBTS
1102          JRST [ PUSHJ P,QDLFBT  ;RETURN DISK BLOCKS TO FREE
1103                 SOS NCORRQ
1104                 JRST CORJOB ]
1105         SKIPE NCRQL
1106          JRST CORJOB    ;RQ'S FOR LESS HAVE COME IN. BETTER EXECUTE THEM OR MAY NOT HAVE ENUF CORE
1107         SKIPL CORUPU
1108          JRST CORUP     ;FOUND USER IN SEARCH WHO WANTS MORE GIVE IT TO HIM
1109         SKIPL CORSRV
1110          JRST CORJOB
1111         MOVE A,LMEMFR
1112         CAMGE A,MINCOR
1113          PUSHJ P,CFLM1  ;FREE SOME LOW MEMORY BY SHUFFLING
1114         SKIPLE NCORRQ
1115          SOS NCORRQ     ;CAN'T FIND ANYTHING TO DO SO DECREMENT COUNT
1116                 ;THIS CAN HAPPEN AS A RESULT OF EXCESS ATTEMPTED UTAPE FLUSHAGE
1117                 ;OR DUE TO CALLING CFLM1
1118 CORJOB: PUSHJ P,ACMTC   ;XFER ANY "SPECIAL FREE" MEM BLOCKS TO FREE
1119         SKIPN NCORRQ    ;ANYONE WANT CORE?
1120          PUSHJ P,[      ;IF NOT, WAIT UNTIL SOMEONE DOES, BUT FIRST
1121                 MOVE TT,QMDRO   ;SEE IF MFD AND TUTS NEED TO BE READ IN
1122                 AOJE TT,IDSK
1123                 JRST UFLS ]     ;WAIT
1124         SETOM CORSRV    ;INITIALIZE NO RQS SERVED THIS PASS
1125         SETOM CORUPU
1126         MOVNI U,LUBLK   ;SCAN FOR USER WITH HIGHEST PRIORITY
1127 CORLUP: ADDI U,LUBLK
1128         CAML U,USRHI
1129          JRST CORJ2     ;THRU EXAMINE RESULTS OF SEARCH
1130         SKIPGE B,CORRQ(U)
1131          JRST CORLUP
1132         TLNE B,200000
1133          JRST CORNEW
1134         LDB Q,[221000,,B]
1135         IMULI Q,LUBLK
1136         MOVE A,HUSRAD(Q)
1137         LSH A,-10.      ;COMPUTE # BLKS JOB HAS NOW
1138         CAIN A,(B)
1139          JRST 4,CORL1   ;SAME AS NOW, CHECKED FOR AT ACORE
1140         CAIG A,(B)
1141          JRST CORLUG    ;INCREASE
1142         MOVEM U,CORUPU  ;DECREASE HAS PRIORITY
1143         HRRZS B
1144         SUB B,A
1145         MOVEM A,CORUPS
1146         MOVEM B,CORUPA  ;DIFFERENCE
1147         MOVEM Q,CORUUC
1148         JRST CORUP
1149 \f
1150 CUSTOP: PUSHJ P,RPCLSR  ;STOP USER WHO IS BEING CORED
1151         MOVSI T,BUCSTP  ;(THE BUCK STOPS HERE)
1152         IORM T,USTP(A)
1153         PUSHJ P,UPCLSR
1154         MOVEI T,-1      ;GET MASK FOR RH
1155         TDNE T,USTP(A)  ;WAIT FOR RANDOM STOPS TO CLEAR
1156          PUSHJ P,UFLS
1157         POPJ P,
1158
1159 ;Core job initializes disks while system job stands around and supervises
1160 ;This makes it possible for system job to print any resulting error messages
1161 ;Provided no one hits ^Z too soon
1162 IDSK:   MOVE I,MDSK
1163         MOVE U,USER
1164         PUSHJ P,QMCH1
1165         MOVSI I,-NQS
1166         SKIPL QACT(I)
1167          PUSHJ P,QTCH1
1168         AOBJN I,.-2
1169         MOVSI TT,SCLIDK         ;System is up now
1170         IORM TT,SUPCOR
1171         JRST CORJI
1172
1173 EBLK
1174
1175 CORUPU: -1      ;BEST USER SO FAR TO CHANGE CORE
1176                 ;IF SETOMED AT CORUPR, REQUEST NOT COMPLETELY FILLED
1177 CORUPA: 0       ;INCREASE AMOUNT(1 FOR .CBLK)
1178 CORUPS: 0       ;CURRENT SIZE
1179 CORUUC: 0       ;USER CORE REQ ACTUALLY FOR
1180 CORSRV: -1      ;0 => RQ SRVED THIS TIME THRU USER VARS
1181 NCRQL:  0       ;# RQS FOR LESS
1182
1183 BBLK
1184
1185 CORLUG: HRRZS B ;GUY WANTS MORE GIVE GUY WHO WANTS LEAST PRIORITY
1186         SUB B,A
1187 CORLUH: MOVE A,NMPGS(Q)
1188         SKIPGE CORUPU
1189         JRST CORLG1     ;FIRST
1190         CAMGE B,CORUPA  ;IS RQ SMALLER?
1191         JRST CORLG1
1192 CORLG2: CAME B,CORUPA   ;OR IF TIE GIVE IT TO GUY WHO IS SMALLER NOW
1193         JRST CORG1A
1194         CAML A,CORUPS   ;IS RQ= & SIZE SMALLER?
1195         JRST CORG1A
1196 CORLG1: MOVEM U,CORUPU  ;HIGHEST PRIORITY SO FAR
1197         MOVEM B,CORUPA
1198         MOVEM A,CORUPS
1199         MOVEM Q,CORUUC
1200 CORG1A: JRST CORLUP
1201
1202 CORNEW: LDB Q,[1100,,B]         ;.CBLK TYPE RQ
1203         IMULI Q,LUBLK
1204         MOVEI B,1
1205         JRST CORLUH
1206 \f
1207 CORUP:          ;EXECUTE REQUEST
1208         MOVE U,CORUUC
1209         MOVEM U,CUSER
1210         SKIPL D,CORUPU
1211          SKIPN UNAME(U)
1212           JRST 4,.
1213         MOVE A,CORUUC
1214         JUMPE A,CORUP8  ;DONT USTOP SYS JOB
1215         PUSHJ P,CUSTOP  ;STOP GUY
1216 CORUP8: PUSHJ P,SWTL
1217             CIRPSW
1218         MOVE TT,CORRQ(D)
1219         TLNE TT,200000
1220          JRST CORUPN    ;.CBLK TYPE
1221         MOVE B,CORUPS
1222         MOVE A,B        ;A HAS CURRENT SIZE
1223         ADD B,CORUPA    ;B HAS NEW SIZE
1224         PUSHJ P,SWTL
1225             MEMFRZ
1226         SKIPL J,CORUPA
1227          JRST CORM1C    ;WANTS MORE THAN NOW
1228 CORL2:  LDB A,[121100,,HUSRAD(U)]
1229         CAMG A,B
1230          JRST CORUPR
1231         SOS A
1232         PUSH P,B
1233         PUSHJ P,UPGRTN  ;RETURN USER PG
1234         POP P,B
1235         JRST CORL2
1236
1237 CORUPR: MOVE U,CUSER    ;FINISHED FOR NOW ANYWAY REVIVE USER
1238         SKIPN UNAME(U)
1239          JRST 4,.
1240 IFN E.SP,[
1241         CAMN U,DISUSR
1242          PUSHJ P,E.SLPM ;LOAD PAGE MAP
1243 ]
1244 IFN 340P,[
1245         CAMN U,DISUSR
1246          PUSHJ P,DCRRST ;DIS IS RUNNING BUT UPDATE UPR ETC
1247 ]
1248         MOVSI A,BUCSTP
1249         ANDCAM A,USTP(U)        ;RESTART USER
1250         PUSHJ P,LSWPOP  ;UNLOCK MEMORY
1251         PUSHJ P,LSWPOP
1252         PUSHJ P,ACMTC   ;XFER IN PROCESS BLOCKS TO FREE
1253         SKIPGE U,CORUPU
1254          JRST CORJOB    ;NOT THRU WITH THIS RQ
1255         MOVE A,CORUUC   ;THRU WITH RQ
1256         SETOM CORUPU
1257         SKIPGE CORUPA
1258          SOS NCRQL      ;FINISHED A REQUEST FOR LESS, DECREMENT COUNT OF THEM
1259         MOVSI TT,BUSRCR
1260         ANDCAM TT,APRC(A)       ;CLEAR RQ PENDING THIS USER FLAG
1261 CORL1:  SETOM CORRQ(U)
1262         CLEARM CORSRV
1263         SOSE NCORRQ
1264          JRST CORLUP
1265         JRST CORJOB
1266 \f
1267 CORUPN: LDB A,[111000,,TT]
1268         PUSHJ P,SWTL
1269             MEMFRZ
1270         PUSH P,A
1271         PUSHJ P,UPGRTN
1272         POP P,E
1273         TLNE TT,4000
1274          TRNN TT,400000
1275           JRST 4,.
1276         TLO E,600000+PMCSHM     ;ADD FRESH PAGE
1277         PUSH P,TT
1278         PUSHJ P,CORGP
1279         POP P,TT
1280         LDB A,[111000,,TT]
1281         PUSHJ P,UPLC
1282         LDB B,T
1283         TRNN B,400000
1284          JRST 4,.       ;LOSEY
1285         MOVE C,Q
1286         PUSHJ P,UCPRL
1287             200000,,[   LDB B,[330100,,TT]
1288                         DPB B,[430100,,(C)]
1289                         POPJ P, ]       ;SET TO DESIRED PUBLICNESS
1290         SOS NCBCOM
1291         JRST CORUPR
1292
1293 CORM1C: MOVEM J,CORCNT
1294 CORM1A: JUMPE U,CORS2   ;SNIFFLE
1295 CORM1B: MOVE U,CORUUC
1296         LDB E,[121100,,HUSRAD(U)]
1297         TLO E,600000+PMCSHM
1298         PUSHJ P,CORGP
1299         SOS NCBCOM
1300         SOSLE CORCNT
1301          JRST CORM1A
1302         JRST CORUPR
1303
1304 \f;INSERT FRESH PAGE INTO USR MEM IN PLACE SPECIFIED BY E PROT BITS IN LH
1305 ;MMPFR SHOULD HAVE BEEN SOS'ED ALREADY
1306
1307 CORGP:  JUMPN U,CORGP0  ;JUMP UNLESS GIVING PAGE TO SYS JOB
1308         MOVE A,SJSPG    ;GOBBLE PAGE RESERVED
1309         SETZM MEMBLT(A)
1310         CAIL A,SYSB
1311          JRST CORGP1    ;USER VARIABLES, CLEAR IT OUT
1312         JRST CORGP2     ;INITIAL GET OF SYSTEM, DON'T ZERO IT
1313
1314 CORGP0: PUSHJ P,GMMPP   ;RETN MMP PNTR IN R
1315          JRST CORGPZ
1316         PUSHJ P,TCALL
1317           JRST HMEMRQ   ;GET MEM, HIGH IF POSSIBLE
1318          JRST 4,.
1319 CORGP1: PUSHJ P,CZRR
1320 CORGP2: AOS NMPGS(U)
1321         AOS SNMPGS      ;INCR SYS PAGE COUNT (VIRT)
1322         PUSH P,A        ;REAL CORE BLOCK #
1323         HRRZ A,E        ;ADDR IN USERS MAP
1324         PUSHJ P,UPLC
1325         POP P,A
1326         LDB B,Q
1327         SETZM MMSWP(A)
1328         JUMPE U,CORGP3  ;IF SYS JOB, DON'T TRY TO SET UP MAP
1329         JUMPN B,[JRST 4,.]      ;ALREADY HAS PAGE
1330         AOS MMSWP(A)    ;INDICATE THAT ONE USER MAP POINTS AT THIS PAGE
1331         TSO A,E         ;SET PROTECTION BITS
1332         DPB A,T         ;STORE IN USER'S MAP
1333         MOVE C,R        ;MMP IDX
1334         TRO R,400000    ;MAKE USERS CP POINT AT MMP
1335         DPB R,Q
1336 IFN SWPWSP,[
1337         MOVSI TT,1      ;INCREASE WORKING SET
1338         ADDM TT,UWRKST(U)
1339 ];SWPWSP
1340         ANDI A,PMRCM    ;TURN ACCESS BITS BACK OFF
1341 CORGP3: CAIL A,TSYSM
1342          JRST 4,.
1343         MOVEI TT,MURUSR
1344         DPB TT,[MUR,,MEMBLT(A)] ;SET USER FIELD IN MEMBLT
1345         MOVE TT,U
1346         IDIVI TT,LUBLK
1347         LSH TT,8
1348         IOR TT,E        ;PG # IN USER'S MAP
1349         SKIPN U
1350          MOVEI TT,600000(A)     ;IF SYS JOB, MEM BLOCK POINTS AT SELF
1351         HRRZM TT,MEMPNT(A)      ;ELSE MAKE MEM BLOCK POINT AT USERS MAP
1352         JUMPE U,GHUSRA  ;IF SYS JOB, NO MMP ENTRY
1353         DPB C,[MMMPX,,MEMBLT(A)];STORE INDEX OF MMP ENTRY IN MEMBLT
1354         TRO A,600000
1355         HRRM A,MMP(C)   ;MAKE MMP POINT AT MEM BLOCK
1356         PUSHJ P,CHACK   ;FOR CHECKING ONLY
1357         CAME C,[SETZ 3] ;REAL MEM, 3 ENTRIES (MMP, MEMPNT, USER)
1358          JRST 4,.
1359 GHUSRA: AOS E
1360         LSH E,10.       ;COMP NEW HUSRAD AFTER GETTING PAGE
1361         TLZ E,-2        ;FLUSH PROTECT BITS (LEAVE 3.1)
1362         CAMLE E,HUSRAD(U)
1363          MOVEM E,HUSRAD(U)
1364         POPJ P,
1365
1366 CORGPZ: PUSH P,E        ;SAVE REGISTERS
1367         PUSH P,U
1368         PUSHJ P,CFLM2   ;TRY TO FREE UP SOME LOW MEMORY
1369         POP P,U
1370         POP P,E
1371         SKIPE LMEMFR
1372          JRST CORGP     ;SHOULD WORK NOW
1373         PUSHJ P,LSWPOP  ;MEMFRZ
1374         PUSHJ P,LSWPOP  ;CIRPSW
1375         BUG INFO,[NO CORE AVAIL FOR MMP PAGE]
1376         PUSHJ P,UDELAY  ;Break possible infinite loop if no user pgs in low mem
1377         SKIPG MEMFR     ;WAIT FOR SWAPPER TO MAKE ROOM (PANIC!)
1378          PUSHJ P,UFLS
1379         PUSHJ P,SWTL
1380           CIRPSW
1381         PUSHJ P,SWTL
1382           MEMFRZ
1383         JRST CORGP
1384 \f
1385 PAGERT: PUSHJ P,SWTL
1386             MEMFRZ
1387         PUSHJ P,UPGRTN
1388         JRST LSWPOP
1389
1390 UPGRTN: PUSH P,R        ;RETURN VIRT PG # IN A USER IN U
1391         PUSH P,I
1392         PUSH P,TT
1393         PUSH P,E
1394 IFN XGP,[
1395         PUSHJ P,UPLC    ;SEE IF PAGE XGP LOCKED
1396         LDB E,T
1397         TRNN E,600000
1398          JRST UPGRT7    ;SWAPPED OUT, OBVIOUSLY NOT XGP
1399         ANDI E,PMRCM    ;E := PHYS PAGE NO
1400         CAIL E,TSYSM
1401          JRST UPGRT7
1402         IDIVI E,36.
1403         MOVNS TT
1404         PUSH P,T
1405         MOVSI T,400000
1406         LSH T,(TT)
1407         TDNE T,XGPMTB(E)
1408         PUSHJ P,UFLS    ;WAIT FOR XGP TO CLEAR
1409         POP P,T
1410 UPGRT7: ]
1411 .ELSE   PUSHJ P,UPLC    ;FIND PAGE IF DIDN'T ALREADY
1412         JUMPE U,UPGRT8  ;SYS JOB, NO SWAPPING NOR MMP ENTRY
1413         LDB B,Q
1414         CAIN B,-1
1415          JRST UPRABS    ;ABSOLUTE PAGE
1416         JUMPE B,RHUSRA  ;DOESNT REALLY HAVE PG
1417         PUSH P,T
1418         PUSHJ P,CHACK   
1419         ADD D,MMPEAD    ;D HAS MMP ADDRESS
1420 UPGRTA: MOVSI T,MMPTMP
1421         TDNE T,(D)
1422          JRST UPGRTW    ;WAIT FOR PAGE TO TRANSIT BUT UNLOCK SWITCHES
1423         MOVNI I,1       ;ASSUME NO DISK SPACE
1424         HLRZ A,1(D)     ;SEE IF DISK SPACE ASSIGNED
1425         JUMPE A,UPGRT5
1426         LDB I,[$MMPUN,,(D)]
1427         PUSHJ P,QTLOCK  ;LOCK APPRO TUT
1428 UPGRT5: POP P,T         ;POINTER TO ORIG MAP ENTRY OF USER
1429         MOVE H,(T)      ;SAVE MAP WORD FOR DEBUGGING
1430         LDB TT,T        ;IF PROT BITS=0 PAGE IS SWAPPED OUT FOR PURPOSES
1431         MOVEI E,0       ;OF USER'S SWAP OUT COUNT, EVEN IF IN CORE
1432         DPB E,T         ;CLEAR USER MAP ENTRY
1433         TRCN TT,600000  ;IS USER MAPPED TO PAGE?
1434          JRST UPGRT9
1435         MOVSI E,MMPWRT  ;YES, CHECK IF ACCESS BITS = RW
1436         TRNN TT,600000
1437          IORM E,(D)     ;PAGE WRITTEN BY USER WHO HAS DETACHED IT
1438         ANDI TT,PMRCM   ;MASK TO MEM PAGE #
1439         CAIE TT,(J)
1440          JRST 4,.       ;PTW POINTED TO WRONG PAGE
1441         MOVSI E,MMPOUT+MMPTMP
1442         TDNE E,(D)
1443          JRST 4,.       ;PAGE NOT IN, IN MMP
1444 IFE SWPWSP,     SOS MMSWP(J)    ;ONE LESS USER POINTING AT PAGE
1445 IFN SWPWSP,[
1446         HRRZ E,MMSWP(TT)        ;DECREASE THIS USER'S WORKING SET
1447         MOVSI T,-1
1448         IDIVM T,E
1449         ADDM E,UWRKST(U)
1450         SOS MMSWP(TT)
1451         HRRZ E,MMSWP(TT)
1452         JUMPE E,UPGRTB  ;JUMP IF NO OTHER SHARERS, FOR SPEED AND NO ZERODIVIDE
1453         PUSH P,C        ;ADJUST OTHER SHARER'S WORKING SETS
1454         PUSH P,D
1455         PUSH P,I
1456         PUSH P,U
1457         IMULI E,1(E)
1458         MOVSI D,1
1459         IDIV D,E
1460         PUSHJ P,UCPRL7  ;CLOBBERS H ALSO C,T,U,I
1461             400000,,SWOP6F
1462         POP P,U
1463         POP P,I
1464         POP P,D
1465         POP P,C
1466 ];SWPWSP
1467         JRST UPGRTB
1468 \f
1469 ;RETURNING A PAGE TO WHICH USER IS NOT CURRENTLY MAPPED (MAY BE IN OR OUT)
1470 UPGRT9: SOS NSWPGS(U)
1471         SOS SNSWPG      ;DECR CNT OF SWAPPED OUT FOR SYS
1472         JUMPGE C,UPGRT4 ;NO MEM IN CP S, PAGE REALLY SWAPPED OUT
1473 ;RETURNING A PAGE WHICH IS SWAPPED IN
1474 UPGRTB: HLRE E,MMSWP(J) ;GET # EXEC PGS POINTING TO THIS
1475         JUMPL E,[JRST 4,.]      ;<0 EXEC PAGES
1476         JUMPE E,UPGRT4  ;NO EXEC PGS POINTING TO THIS
1477         PUSH P,J
1478         MOVE TT,J
1479         MOVSI T,-NEXPGS ;LOOK FOR EXEC PGS SET UP TO PNT
1480         MOVE E,[442200,,EXEUMP] ;TO USER PAGE FLUSHED
1481 UPGRT3: ILDB J,E
1482         TRZN J,600000
1483          JRST UPGRT2
1484         ANDI J,PMRCM
1485         CAMN TT,J
1486          JRST UPGRT1
1487 UPGRT2: AOBJN T,UPGRT3
1488 IFN E.SP,[
1489         MOVSI T,-1
1490         TDNE T,MMSWP(TT)
1491          PUSHJ P,E.SPRT         ;SEE IF E&S HAS IT
1492 ]
1493 IFN XGP,[
1494         MOVSI T,-1
1495         TDNE T,MMSWP(TT)        ;FLUSH XGP TIE DOWNS AND RETURN
1496          PUSHJ P,XGPCFL
1497 ]
1498         POP P,J
1499 UPGRT4: LDB T,Q ;DELINK CIRC PNTR
1500         DPB T,B
1501         MOVEI T,0
1502         DPB T,Q         ;CLOBBER CIRC P
1503         SOS NMPGS(U)
1504         SOS SNMPGS      ;SYSTEM HAS 1 LESS PAGE
1505         CAME C,[SETZ 3]
1506         CAIN C,2
1507          JRST MMPRTN    ;RETURN MMP ENTRY SINCE PAGE NO LONGER IN USE
1508 MMPRT4: MOVE A,J
1509         CAMN C,[SETZ 3]
1510          JRST MMPRT5    ;FLUSH REAL MEM
1511 MMPRT6: SKIPL I
1512          PUSHJ P,QTULK
1513 RHUSRA: POP P,E
1514         POP P,TT
1515         POP P,I
1516         POP P,R
1517 RHUSR1: LDB A,[121100,,HUSRAD(U)]       ;COMP HUSRAD AFTER RETURNING PAGE
1518         JUMPE A,CPOPJ
1519         SOS A
1520         PUSHJ P,UPLC
1521         LDB B,Q
1522         JUMPN B,CPOPJ   ;FOUND ACTIVE PAGE
1523         MOVNI C,2000    ;KEEP LOOKING
1524         ADDM C,HUSRAD(U)
1525         JRST RHUSR1
1526
1527 UPGRT8: SOS NMPGS       ;RETURNING PAGE FROM SYS JOB
1528         SOS SNMPGS
1529         DPB A,[121100,,HUSRAD(U)] ;NORMAL METHOD OF COMPUTING HUSRAD WON'T WORK
1530         MOVNI I,1       ;NO DISK SPACE
1531 MMPRT5: SKIPE MMSWP(A)  ;MAKE SURE NO ONE (EXEC OR USER) IS POINTING AT PAGE
1532          JRST 4,.
1533         PUSHJ P,CMEMR   ;HAS REAL MEM, CIRC LENGTH =3 SO FLUSH MEM
1534         JRST MMPRT6
1535
1536 UPRABS:
1537 IFN TEN11P,[
1538         LDB B,T
1539         LDB E,[.BP <PMRCM-377> B]       ;GET MOBY #
1540         CAIE E,T11CPA_-18.
1541         JRST UPRAB1
1542         ANDI B,377
1543         PUSHJ P,T11DL   ;DELETE PAGE REF TO TEN11 MAP
1544 UPRAB1:]
1545         MOVEI B,0
1546         DPB B,Q
1547         DPB B,T
1548         JRST RHUSRA
1549 \f
1550 IFN E.SP,[
1551 ;TT/MMSWP INDEX
1552 E.SPRT: CAME U,DISUSR   ;IS HE USING THE DISPLAY?
1553          POPJ P,        ;NO, DON'T UNTIE ANYTHING
1554         PUSH P,H
1555         MOVE T,TT       ;FOR E.SPCH
1556         PUSHJ P,E.SPCH  ;LOOK IN E&S TABLES
1557          SKIPA          ;FOUND, INDEX IN H
1558           JRST E.SPR2   ;NOT FOUND, DO NOTHING
1559         MOVSI T,-1
1560         ADDM T,MMSWP(TT) ;SOS COUNT
1561         SETZM DISSWP(H) ;CLEAR DISPLAY MMSWP TABLE
1562         AOS E.SNUT      ;COUNT FOR UNTIES
1563 E.SPR2: POP P,H
1564         POPJ P,
1565 ]
1566 UPGRT1: MOVSI J,-1
1567         XCT EXPFT(T)    ;MAYBE XFERR TO ROUTINE TO DO SOMETHING ABOUT THIS
1568          JRST UPGRT6    ;NOT USER CONCERNED ABOUT (THERE HAD BETTER BE ANOTHER)
1569         MOVEI J,0
1570         DPB J,E ;CLEAR OUT EXEC PAGE ENTRY
1571         MOVE J,USER
1572         CLRPGM (J)
1573 UPGRT6: CONO PI,UTCON
1574         JRST UPGRT2
1575
1576 ;WAIT FOR PAGE TO TRANSIT, WITH CIRPSW FREE (IN CASE SWAP READ ERROR!)
1577 ;COME HERE WITH T/MMPTMP,, D/MMP.ENTRY.ADDR
1578 UPGRTW: MOVE B,D
1579 NCRMMW: MOVE U,USER
1580         PUSHJ P,LSWCLR
1581         PCLT
1582         TDNE T,(B)
1583          PUSHJ P,UFLS   ;WAIT FOR ACTIVE PAGE TO SETTLE DOWN
1584         CAIE U,LUBLK    ;SKIP IF CORE JOB
1585          JRST UUOTROLL  ;AS IF PCLSR'ED OUT OF WAIT FOR PAGE & CAME BACK
1586         SETOM CORUPU    ;REQUEST FOR THIS USER NOT SATISFIED
1587         MOVE P,USRPDL+LUBLK     ;CLEAN UP AND RE INIT CORE JOB
1588         PUSHJ P,NULSET
1589         PUSHJ P,NULSET
1590         JRST CORUPR
1591
1592 EXPFT:
1593 IFN 340P,       REPEAT 2+N340PB,        PUSHJ P,DISACR
1594         REPEAT 2,JFCL           ;CORJF, CORJT
1595 IFN VIDP,       REPEAT 2,PUSHJ P,SCNACR
1596 IFN TEN11P,     JRST 4,.        ;TEN-11 CONTROL PAGE
1597         JRST 4,.                ;PAREP
1598 IFN ECCMEM,     JRST 4,.        ;ECCPG
1599 IFN XGP,        REPEAT 3,JRST 4,.
1600 IFN N11TYS,     REPEAT NTTPG+NTVBP,JRST 4,.
1601 IFN CHAOSP, IFN T11CHP, JRST 4,.
1602         REPEAT NMMP,JRST 4,.    ;MMP
1603 IFN .-EXPFT-NEXPGS, .ERR LOSE AT EXPFT
1604 \f;CIRCULAR MEM LIST HACKER
1605 ;CALL WITH Q CONTAINING BYTE POINTER TO CIRC PNTR IN LIST TO BE HACKED
1606 ;THE BYTE POINTER MUST POINT AT A UPGCP ENTRY (RATHER THAN MEMPNT OR MMP)
1607 ;OR THIS CODE WILL LOOP FOREVER.
1608 ;RETN BYTE PNTR IN B TO GUY WHO PNTS TO THAT PNTR
1609 ;COUNT FOR ENTRIES IN C (RH)
1610 ; 4.9 C SAYS ACTUAL MEM IN LOOP
1611 ;RETN IN D MMP INDEX
1612 ;RETURN MEM PAGE IF ANY IN J
1613 ;CLOBBERS H,I,W
1614
1615 CHACK:  PUSH P,A
1616         LDB J,Q ;PICK UP STARTING C. P.
1617         SETZM C
1618         MOVNI D,1
1619         MOVE B,Q
1620 CHACK1: JUMPE B,[JRST 4,.]
1621         AOS C
1622         CAIE J,-1       ;SKIP ON ABS PAGE
1623          TRNE C,776000
1624           JRST 4,.      ;CIRC CHAIN TOO LONG?
1625         TRZE J,400000
1626          JRST CHACK3    ;MEMPNT OR MMP PNTR
1627         LDB I,[1000,,J] ;PG #
1628         LDB H,[101100,,J]       ;USER #
1629         IMULI H,LUBLK
1630         SKIPE UNAME(H)
1631          CAML H,USRHI
1632           JRST 4,.      ;POINTER TO NON-EXISTENT USER
1633         MOVEI W,UPGCP(H)
1634         ROT I,-1
1635         ADDI W,(I)
1636         HRLI W,222200
1637         SKIPGE I
1638          HRLI W,2200
1639         CAMN W,Q
1640          JRST CHACK2    ;FOUND ENTRY WHICH PNTS AT ORIGINAL ENTRY
1641         LDB J,W
1642         MOVE B,W
1643         JRST CHACK1     ;KEEP LOOKING
1644
1645 CHACK2: MOVE J,A
1646         JUMPL D,[JRST 4,.]      ;NO MMP ENTRY ?
1647         JRST POPAJ
1648
1649 CHACK3: TRZE J,200000
1650          JRST CHACK4    ;ACTUAL CORE
1651         CAML J,MMPMX
1652          JRST 4,.       ;GARBAGE POINTER
1653         MOVSI B,2200    ;MMP ENTRY
1654         HRR B,MMPEAD
1655         ADDI B,(J)
1656         JUMPGE D,[JRST 4,.]     ;MORE THAN 1 MMP ENTRY
1657         MOVE D,J
1658         LDB J,B
1659         JRST CHACK1
1660
1661 CHACK4: TLOE C,400000
1662          JRST 4,.       ;PAGES IS IN TWO PLACES IN CORE
1663         CAIL J,TSYSM
1664          JRST 4,.       ;GARBAGE POINTER
1665         MOVE A,J        ;SAVE MEMBLT INDEX
1666         MOVSI B,2200
1667         HRRI B,MEMPNT
1668         ADDI B,(J)
1669         LDB J,B
1670         JRST CHACK1
1671
1672 ;LOOK UP PAGE IN USER MAP
1673 ;USER IN U, VIR PG # IN A
1674 ;GET PNTR TO MAP HW IN T, TO CIRC IN Q
1675
1676 UPLC:   SKIPL A
1677         CAIL A,400
1678          JRST 4,.               ;BAD VIRTUAL PAGE NUMBER
1679         PUSH P,A
1680         MOVEI Q,UPGCP(U)
1681         MOVEI T,UPGMP(U)
1682         ROT A,-1
1683         ADDI T,(A)
1684         HRLI T,222200
1685         SKIPGE A
1686          HRLI T,2200
1687         ADDI Q,(A)
1688         HLL Q,T
1689         JRST POPAJ
1690 \f
1691 ;FREE THE MMP ENTRY D POINTS AT, SOSING TUT IF DISK SPACE ASSIGNED.
1692 ;I HAS DSK #, C HAS WHAT CHACK RETURNED IN C, A HAS TRACK #.
1693 ;TUT MUST BE LOCKED ALREADY. CIRPSW AND MEMFRZ SHOULD BE LOCKED.
1694 ;EXIT TO MMPRT4 OR RHUSRA
1695
1696 MMPRTN: MOVEM C,MMPRTC  ;SAVE IN CASE OF BUG HALT LATER
1697         JUMPL I,MMPRT3  ;NO DISK SPACE ASSIGNED
1698         PUSH P,B
1699         LDB B,[$MMPUN,,(D)]
1700         CAME B,I
1701          JRST 4,.       ;WRITING WRONG DISK
1702         MOVE H,D        ;H SAVES POINTER TO MMP ENTRY
1703         MOVE D,A        ;D GETS DISK TRACK NUMBER
1704         PUSHJ P,TUTPNT
1705         CAIGE B,TUTMNY
1706          SOJL B,[JRST 4,.]      ;DETECT OVER-SOS
1707         DPB B,D
1708         EXCH D,H        ;D GETS MMP PNTR, H GETS TUT BYTE PNTR
1709         JUMPN B,MMPRT2
1710         MOVE T,QTUTO(I)
1711         CAML A,QSWAPA(T)
1712          AOS QSFT(I)
1713         CAMGE A,QSWAPA(T)
1714          AOS QSFTS(I)
1715 MMPRT2: MOVE T,DCHBT(I)
1716         IORM T,QTUTO(I)
1717         MOVE A,(D)      ;ELSE DELETE MMP ENTRY NOW
1718         SKIPGE C
1719          JUMPN B,MMPRT0 ;IF PG IS IN FILE, AND SWAPPED IN, MAYBE WRITE OUT.
1720         TLNN A,MMPSHR
1721          JRST MMPRT8
1722         HLRZ A,1(D)     ;ALSO REMOVE FROM SHAREABLE PAGE TABLE
1723         HRL A,I
1724         IDIVI A,SHRHSL
1725         ADDI B,SHRHSH-1
1726 MMPRT7: MOVE A,B
1727         HRRZ B,1(B)
1728         JUMPE B,[JRST 4,.]
1729         CAME B,D
1730          JRST MMPRT7
1731         HRRZ B,1(B)
1732         HRRM B,1(A)
1733 MMPRT8: POP P,B
1734         JUMPL C,MMPRT3  ;WAS MEM IN LOOP SO NOT SWAPPED OUT FOR SYSTEM'S COUNT
1735         SOS NPGSWO      ;IT WAS SWAPPED OUT
1736 MMPRT3: PUSHJ P,MMPRT1
1737         SOS MMPCNT      ;1 LESS IN USE
1738         AOS MMPFR       ;1 MORE FREE
1739         JRST MMPRT4
1740 \f
1741 ;FLUSHING AN MMP ENTRY FOR A PAGE SHARED WITH A FILE WHICH IS CURRENTLY IN CORE.
1742 ;WE MAY WANT THIS PAGE AGAIN, SO TRY TO KEEP IT AROUND FOR A WHILE.
1743 ;BUT IF PAGE HAS BEEN MODIFIED, IMMEDIATELY SWAP IT OUT SO FILE GETS UPDATED.
1744
1745 MMPRT0: POP P,B
1746         LDB C,H         ;UN-SOS THE TUT
1747         CAIGE C,TUTMNY  ;DON'T OVER-AOS
1748          AOS C
1749         DPB C,H
1750         PUSHJ P,QTULK
1751         MOVEI C,.BM MLO
1752         ANDCAM C,MEMBLT(J)
1753         SKIPE C,LLOOSP          ;ADD TO TAIL OF LOOSE PAGE LIST
1754          DPB J,[MLO,,MEMBLT(C)]
1755         MOVEM J,LLOOSP
1756         SKIPN C
1757          MOVEM J,FLOOSP
1758         AOS NLOOSP
1759         TLNN A,MMPWRT
1760          JRST RHUSRA
1761         PUSH P,U        ;PAGE WAS MODIFIED, SWAP IT OUT RIGHT AWAY
1762         CONO PI,CLKOFF  ;CALL SWAPPER AT IMITATION CLOCK LEVEL
1763         MOVEM J,SWOBK
1764         MOVEM D,SWOMMP
1765         AOS CIRPSW      ;SWOP1A WILL SOS IT BEFORE RETURNING
1766         PUSHJ P,SWOP1A  ;WILL RETURN THE MMP ENTRY SINCE NO USERS ARE LINKED TO IT
1767          JRST 4,.       ;EXEC PAGES STILL POINT TO PAGE, ALTHOUGH UPGRTN FLUSHED THEM
1768         CONO PI,CLKON
1769         POP P,U
1770         JRST RHUSRA
1771 \f
1772 ;HERE TO RETURN AN MMP ENTRY AND SOS THE TUT, AT P.I. LEVEL
1773 ;IF TUT OR CIRPSW IS LOCKED, PUTS ON MMPFS2 AND WAKES UP CORE JOB
1774 ;OTHERWISE, CLEARS OUT AND PUTS ON MMPFS
1775 ;A -> MMP ENTRY, CLOBBERS B,D,E,I
1776
1777 RETMMP: PI2SAF
1778         LDB I,[$MMPUN,,(A)]
1779         SKIPGE CIRPSW
1780          SKIPGE QTUTO(I)
1781           JRST RETMM1   ;CAN'T SET LOCKS, LET CORE JOB DO IT
1782 RETMM0: HLRZ D,1(A)
1783         PUSHJ P,TUTPNT  ;SOS THE TUT
1784         CAIGE B,TUTMNY
1785          SOJL B,[JRST 4,.]
1786         DPB B,D
1787         JUMPN B,RETMM7
1788         MOVE E,QTUTO(I) ;RETURNING BLOCK TO FREE, AOS APPROPRIATE FREE COUNT
1789         HLRZ D,1(A)
1790         CAML D,QSWAPA(E)
1791          AOSA QSFT(I)
1792           AOS QSFTS(I)
1793 RETMM7: MOVSI D,MMPSHR
1794         TDNN D,(A)
1795          JRST RETMM6
1796         HLRZ D,1(A)     ;REMOVE FROM SHAREABLE PAGE HASH TABLE
1797         HRL D,I
1798         IDIVI D,SHRHSL
1799         MOVEI D,SHRHSH-1(E)
1800 RETMM5: MOVE E,D
1801         HRRZ D,1(D)
1802         JUMPE D,[JRST 4,.]      ;NOT IN TABLE OR MIS-HASHED?
1803         CAME D,A
1804          JRST RETMM5
1805         HRRZ D,1(D)
1806         HRRM D,1(E)
1807 RETMM6: MOVE D,A
1808         SOS MMPCNT
1809         AOS MMPFR
1810 MMPRT1: EXCH D,MMPFS    ;ADD THIS ENTRY ONTO THE FRONT OF
1811         MOVE A,MMPFS    ;THE LIST OF AVAILABLE MMP ENTRIES
1812         MOVEM D,(A)     ;CLEAR LH OF FIRST WORD OF ENTRY
1813         SETZM 1(A)      ;CLEAR SECOND WORD OF ENTRY
1814         POPJ P,
1815
1816 RETMM1: MOVE D,A        ;ADD THIS ENTRY TO LIST OF ONES TO HACK LATER
1817         EXCH D,MMPFS2
1818         HRRM D,(A)      ;ONLY CLOBBER THE CIRC PNTR, WHICH POINTS TO SELF
1819         SKIPN D
1820          AOS NCORRQ     ;LIST WAS EMPTY, AWAKEN CORE JOB
1821         POPJ P,
1822
1823 ;CORE JOB COMES HERE WHEN MMPFS2 IS NON-ZERO
1824
1825 RETMM2: SOS NCORRQ
1826         PUSHJ P,SWTL
1827             CIRPSW
1828         PUSHJ P,RETMM4
1829         PUSHJ P,LSWPOP
1830         JRST CORJOB
1831
1832 RETMM4: MOVEI A,0       ;HERE, WITH CIRPSW LOCKED, TO FINISH RETURNING MMP ENTRIES
1833         EXCH A,MMPFS2
1834 RETMM3: JUMPE A,CPOPJ
1835         LDB I,[$MMPUN,,(A)]
1836         PUSHJ P,QTLOCK
1837         HRRZ H,(A)
1838         PUSHJ P,RETMM0
1839         PUSHJ P,QTULK
1840         MOVE A,H
1841         JRST RETMM3
1842 \f
1843 ;GET AN MMP ENTRY, RET. IDX IN R, ADDR IN TT.
1844 ;CLEARS BOTH WDS OF MMP ENTRY. CLOBBERS NO ACS.
1845 ;SKIPS IF SUCCESSFUL.  DOESN'T SKIP IF NO LOW CORE FOR NEW MMP PAGE.
1846 ;YOU BETTER ALREADY HAVE COMMITTED THE MMP ENTRY VIA SOSGE MMPFR
1847
1848 GMMPP:  HRRZ TT,MMPFS
1849         JUMPE TT,GMMP1  ;FREE LIST IS EMPTY
1850         CAMGE TT,MMPEAD
1851          JRST 4,.       ;IDX GOT ON FREE LIST; SHOULD BE ADDR
1852         MOVE R,TT
1853         SUB R,MMPEAD
1854         CLEARM 1(TT)
1855         HRL TT,(TT)
1856         CLEARM (TT)
1857         HLRZM TT,MMPFS
1858         AOS MMPCNT      ;1 MORE MMP ENTRY IN USE.
1859         JRST POPJ1
1860
1861 GMMP1:  SKIPN MMPFS2
1862          JRST GMMP4
1863         PUSH P,A        ;PROTECT ACS CLOBBERED BY RETMM4
1864         PUSH P,B
1865         PUSH P,D
1866         PUSH P,E
1867         PUSH P,H
1868         PUSH P,I
1869         PUSH P,T
1870         PUSHJ P,RETMM4
1871         POP P,T
1872         POP P,I
1873         POP P,H
1874         POP P,E
1875         POP P,D
1876         POP P,B
1877         POP P,A
1878         JRST GMMPP
1879
1880 GMMP4:  PUSH P,A        ;CREATE ANOTHER PAGE-FULL OF MMP ENTRIES
1881         PUSH P,B
1882         PUSH P,D
1883         PUSHJ P,TCALL
1884           ;JRST IOMQ    ;ALLOCATE LOW CORE SO GETS DUMPED WITH CRASHES
1885           JRST NMMRQ    ;IOMQ LOSES BECAUSE WE GET CALLED WITH MEMFRZ LOCKED
1886                         ;NMMRQ ISN'T QUITE RIGHT, BECAUSE OF NCBCOM.  FIX LATER. ---
1887          JRST GMMP3     ;NO LOW CORE AVAIL NOW
1888         MOVEI B,MUMMP
1889         DPB B,[MUR,,MEMBLT(A)]
1890         MOVEI B,2000
1891         ADDM B,MMPMX    ;INCREMENT MAX ALLOWABLE ADDR OF MMP
1892         AOS B,MMPNP
1893         CAILE B,NMMP
1894          JRST 4,.       ;SOMEONE DIDN'T CHECK MMPFR?
1895         MOVEM A,MMMPG-1(B)
1896         TRO A,600000+PMCSHM
1897         DPB A,MMPPPP-1(B) ;PUT NEW MMP PAGE INTO EXEC MAP
1898         MOVE D,USER
1899         CLRPGM (D)
1900         SOS B
1901         LSH B,10.
1902         HRLI B,-1000
1903 GMMP2:  MOVEI D,MMP(B)  ;PUT ALL ENTRIES IN PAGE ON THE FREE LIST
1904         PUSHJ P,MMPRT1
1905         AOS B
1906         AOBJN B,GMMP2
1907         POP P,D
1908         POP P,B
1909         POP P,A
1910         JRST GMMPP
1911
1912 GMMP3:  POP P,D
1913         POP P,B
1914         POP P,A
1915         POPJ P,
1916 \f
1917 ;HERE IF TRANSIENT CONDITION PREVENTS GRABBING PAGE RIGHT NOW
1918
1919 CORS18: MOVE T,LSWPR+LUBLK
1920         CAIE T,MEMFRZ
1921          JRST 4,.
1922         PUSHJ P,LSWPOP          ;MEMFRZ
1923         PUSHJ P,UDELAY
1924         PUSHJ P,ACMTC
1925         PUSHJ P,SWTL
1926             MEMFRZ
1927
1928 ;GROW A JOB'S CONTIGUOUS MEMORY.  USED ONLY FOR SYSTEM JOB THESE DAYS.
1929
1930 CORS2:
1931 IFN XGP,[
1932         SKIPL XGPUSR    ;AVOID EXPANDING INTO XGP PAGE.
1933          PUSHJ P,UFLS
1934 ]
1935         LDB J,[121100,,HUSRAD(U)]
1936         LDB E,[MUR,,MEMBLT(J)]
1937         CAIN E,MUFR
1938          JRST COSFR     ;FREE PAGE, TAKE IT.
1939         CAIE E,MUINP
1940         CAIN E,MUFRT
1941          JRST CORS18    ;WAIT UNTIL IT STABILIZES
1942         CAIN E,MUSWPG
1943          JRST CORS18    ;WAIT UNTIL IT GETS WHERE IT'S GOING
1944         CAIE E,MURUSR   ;USER PAGE, SHUFFLE IT AWAY.
1945          JRST 4,.        ;SHOULDN'T HAVE TO SHUFFLE SYSTEM PAGES.
1946
1947 ;SHUFFLE A USER PAGE
1948 CORS4:  PUSHJ P,TCALL
1949             JRST HMEMRQ ;GET FREE PAGE TO SHUFFLE IT INTO
1950          JRST 4,.       ;THERE OUGHT TO BE ONE
1951         PUSHJ P,CORS5
1952         JRST CBMRT
1953
1954 ;Shuffle user page in J into page in A
1955 ;Clobbers C,D,E,H,I,Q,U,T
1956 CORS5:  MOVE D,A
1957         SKIPGE E,MMSWP(J)
1958          JRST 4,.       ;BLOCK IS ON SWAP OUT LIST (??)
1959         TRNN E,-1
1960          PUSHJ P,CORS6  ;SHUFFLING A POSSIBLY LOOSE PAGE, FIX POINTERS
1961         SETOM DLSRCH    ;CAN'T BE BEING SWAPPED OUT ETC BECAUSE SWAPOUT
1962         PUSHJ P,UCPRL7  ;BLOCKS HAVE MUR=MU23B, AND CIRPSW IS SIEZED
1963           SETZ CORSTU   ;STOP DIRECT TO MEM DEVICES AND FIX USER MAPS
1964         TLC C,200       ;CHANGE TO 20 BIT BYTE 
1965         DPB D,C         ;RELOCATE PTR TO MEMPNT ENTRY
1966         PUSHJ P,CMOVE1  ;MOVE CONTENTS OF BLOCK
1967         MOVSI C,-NEXPGS
1968         MOVE T,[442200,,EXEUMP]
1969         PUSHJ P,CORPS1  ;FIX ANY EXEC PAGE MAP PNTRS TO THIS PAGE
1970         PUSHJ P,UCPRL4
1971           SETZ DEVSTR   ;RESTART DIRECT TO MEM DEVICES
1972         SETZM DLSRCH    ;MAPS ARE CONSISTENT AGAIN, LET USERS RUN
1973         POPJ P,
1974
1975 CORSTU: PUSHJ P,DEVSTP  ;STOP DIRECT-TO-MEM DEVICES
1976         MOVE A,I        ;COMPUTE USER'S MAP ENTRY LOCN
1977         PUSHJ P,UPLC
1978         LDB C,T
1979         TRNN C,600000
1980          POPJ P,        ;PAGE SWAPPED IN BUT NOT YET LINKED UP
1981         ANDI C,PMRCM
1982         CAIE C,(J)
1983          JRST 4,.
1984         TLC T,2200#<PMRCAD&7700>        ;CHANGE TO ADDRESS REAL CORE ADR FIELD
1985         DPB D,T                         ;RELOCATE USER'S MAP
1986         POPJ P,
1987
1988 COSFR:  MOVE D,J
1989         PUSHJ P,MEMMF
1990 CBMRT:  MOVEM J,SJSPG   ;SAVE PAGE # RESERVED
1991         JRST CORM1B
1992 \f
1993 ;CORE SHUFFLER, TO KEEP LOW MEMORY FREE
1994 CFLM1:  PUSHJ P,SWTL
1995             CIRPSW
1996         PUSHJ P,SWTL
1997             MEMFRZ
1998         PUSHJ P,CFLM2
1999         PUSHJ P,LSWPOP          ;MEMFRZ
2000         JRST LSWPOP             ;CIRPSW
2001
2002 CFLM2:  MOVEI J,LIOBLK          ;Scan through "low" memory
2003         SKIPE MEMHPT            ;Make sure there is likely to be free high mem
2004          JRST CFLM4
2005         AOS SWPOPR              ;Kick swapper more than kicked already
2006         POPJ P,                 ;And give up
2007
2008 CFLM3:  CAIN J,128.
2009          MOVEI J,128.+NEXPGS
2010         CAIL J,256.             ;Assume USEMDM is always on (safe assumption)
2011          POPJ P,                ;All done, couldn't find anything
2012 CFLM4:  LDB A,[MUR,,MEMBLT(J)]
2013         CAIE A,MURUSR
2014          AOJA J,CFLM3
2015         PUSHJ P,TCALL
2016             JRST HMEMRQ         ;Get free page to shuffle it into
2017          POPJ P,                ;No memory free, give up for now
2018         PUSHJ P,CORS5           ;Shuffle page into new memory
2019         MOVE A,J                ;Free old page
2020         PUSHJ P,CMEMR
2021         MOVE A,LMEMFR
2022         CAMGE A,MINCOR
2023          AOJA J,CFLM3
2024         POPJ P,                 ;Freed sufficient low pages, stop now
2025 \f
2026 ;STOP DIRECT TO MEM DEVICES
2027
2028 DEVSTP:
2029 IFN VIDP,[
2030         CAMN U,SCNUSR   ;STOP DIRECT MEM DEVICES
2031          PUSHJ P,SCNSTC ;STOP DIRECT VIDI INPUT
2032 ]
2033 IFN 340P\E.SP,[
2034         CAMN U,DISUSR   ;STOP DISPLAY IF THIS GUY HAS IT
2035          PUSHJ P,DCRSTP
2036 ]
2037         POPJ P,
2038
2039 ;RESTART DIRECT TO MEM DEVICES
2040
2041 DEVSTR: CLRPGM +LUBLK   ;CLEAR PAGE MAP ASSOC REGS IN HARDWARE
2042 IFN VIDP,[
2043         CAMN U,SCNUSR   ;RESTART DIRECT MEM DEVICES
2044          PUSHJ P,SCNRST ;RESTART DIRECT VIDI INPUT
2045 ]
2046 IFN 340P\E.SP,[
2047         CAMN U,DISUSR
2048          PUSHJ P,DCRRST ;RESTART DISPLAY
2049 ]
2050         POPJ P,
2051
2052 ;HERE TO RELOCATE EXEC PAGES WHICH POINT TO PAGE IN J
2053
2054 CORPS1: MOVEI I,0
2055 CORPS4: ILDB Q,T
2056         TLC T,2200#<PMRCAD&7700>        ;CHANGE SIZE FIELD TO ADDRESS REAL CORE ADR
2057         ANDI Q,PMRCM
2058         CAME Q,J
2059          JRST CORPS3
2060         AOS I           ;COUNT # OF EXEC PGS POINTING TO THIS ONE
2061         DPB D,T         ;RELOCATE EXEC PG PNTR
2062 CORPS3: TLC T,2200#<PMRCAD&7700>        ;CHANGE SIZE BACK TO 22
2063         AOBJN C,CORPS4
2064         HLRZ T,MMSWP(D)
2065         CAMN T,I        ;CHECK COUNT OF EXEC PAGES
2066          POPJ P,        ;COUNTED CORRECTLY, WIN
2067
2068 IFN E.SP,[              ;SEE IF E&S CAN ACCOUNT FOR SOME PAGES
2069         MOVSI Q,-MXDISP         ;SET UP INDEX
2070         CAMN J,DISSWP(Q)        ;J/ OLD INDEX, D/ NEW
2071          AOJA I,E.SX2           ;COUNT I IF FOUND, AND RECHECK COUNT
2072         AOBJN Q,.-2             ;ELSE CONTINUE SEARCH
2073         JRST 4,.                ;NOT FOUND, BOMB
2074 E.SX2:  MOVEM D,DISSWP(Q)       ;RELOCATE PAGE
2075         AOS E.SREL              ;# PAGES RELOCATED (FOR DEBUGGING)
2076         CAMN T,I                ;SKIP IF COUNT IS STILL BAD
2077          POPJ P,                ;E&S COUNT WAS CULPRIT -- HAPPY AGAIN
2078 ]
2079 IFN XGP,[
2080         PUSH P,A
2081         PUSH P,B
2082         MOVE B,J
2083         PUSHJ P,XGPBIT
2084         TDNE A,XGPMTB(B)
2085          AOS I
2086         CAMN I,T
2087          JRST POPBAJ
2088 ]
2089         JRST 4,.        ;EXEC PGS COUNT OFF
2090
2091 CORS6:  MOVE T,FLOOSP   ;FIX POINTERS TO LOOSE PAGE BEING SHUFFLED
2092 CORS7:  SKIPN C,T
2093          JRST CORS8
2094         LDB T,[MLO,,MEMBLT(C)]
2095         CAME T,J
2096          JRST CORS7
2097         DPB D,[MLO,,MEMBLT(C)]
2098 CORS8:  CAMN J,FLOOSP
2099          MOVEM D,FLOOSP
2100         CAMN J,LLOOSP
2101          MOVEM D,LLOOSP
2102         POPJ P,
2103 \f
2104 ;RUN AROUND CIRC LIST STRUCTURE
2105 ;WORD AFTER CALL IS POINTER TO ROUTINE TO BE CALLED FOR EACH ITEM IN LIST ACCORDING
2106 ;TO FLAGS IN LH: 4.9 USER PAGE (U=USER,I=PG#), 4.8 MMP (T=IDX), 4.7 MEMPNT (T=PG#)
2107 ;CALLED ROUTINE MUSTN'T CLOBBER C,H; NOR U,I IF A USER PAGE; NOR T IF MEMPNT.
2108 ;RETURNS IN C BYTE POINTER TO PLACE THAT POINTS TO
2109 ;STARTING BYTE POINTER THAT WAS IN C
2110 ;ENTRIES:
2111 ; UCPRL - STARTING BYTE POINTER IN C
2112 ; UCPRL4 - STARTING CORE PAGE # IN D
2113 ; UCPRL7 - STARTING CORE PAGE # IN J
2114 ;PDL DEEPENED BY TWO PUSH'S AND TWO PUSHJ'S.
2115 ;---WARNING--- : CLOBBERS U ------- ALSO CLOBBERS H,T,I
2116
2117 UCPRL7: SKIPA C,[2200,,MEMPNT(J)]
2118 UCPRL4: MOVE C,[2200,,MEMPNT(D)]
2119 UCPRL:  MOVE H,@(P)
2120         HRRI C,@C
2121         TLZ C,37
2122         PUSH P,C
2123         PUSH P,C
2124         JRST UCPRL5
2125
2126 UCPRL2: CAMN C,-1(P)
2127          JRST UCPRL6
2128         MOVEM C,(P)
2129 UCPRL5: LDB T,C
2130         JUMPE T,[JRST 4,.]
2131         TRZE T,400000
2132          JRST UCPRL1
2133         LDB I,[1000,,T] ;PAGE #
2134         LDB U,[101100,,T]       ;USER #
2135         IMULI U,LUBLK
2136         CAML U,USRHI
2137          JRST 4,.
2138         SKIPGE H
2139          PUSHJ P,(H)
2140         MOVEI C,UPGCP(U)
2141         ROT I,-1
2142         ADDI C,(I)
2143         HRLI C,222200
2144         SKIPGE I
2145          HRLI C,2200
2146         JRST UCPRL2
2147
2148 UCPRL1: TRZE T,200000
2149          JRST UCPRL3
2150         CAML T,MMPMX
2151          JRST 4,.       ;MMP ADR OUT OF RANGE
2152         MOVSI C,2200    ;MMP
2153         HRR C,MMPEAD
2154         ADDI C,(T)
2155         TLNE H,200000
2156          PUSHJ P,(H)
2157         JRST UCPRL2
2158
2159 UCPRL3: CAIL T,TSYSM
2160          JRST 4,.       ;MEMBLT ADR OUT OF RANGE
2161         TLNE H,100000   ;MEMPNT
2162          PUSHJ P,(H)
2163         MOVE C,[2200,,MEMPNT]
2164         ADDI C,(T)
2165         JRST UCPRL2
2166
2167 UCPRL6: MOVE C,(P)
2168         SUB P,[2,,2]
2169         JRST POPJ1
2170 \f;DISCARD IDLE DISK UFD'S.
2171
2172 UFDFF:  PUSHJ P,SWTL
2173             UDRSW
2174         MOVEI C,MEMR
2175         PUSHJ P,QDFLS
2176         JRST UTBFF5
2177
2178 ;FLUSH "UTAPE" (200-WD) BUFFERS
2179 ;TRY TO COMPACTIFY INTO FEWER PAGES BY DELETING PAGES CONTAINING
2180 ;ONLY FREE ONES AND BY MOVING NETWORK BUFFERS AROUND.  OTHER KINDS
2181 ;OF BUFFERS DON'T STAY AROUND VERY LONG AND ARE HARD TO MOVE
2182 ;WITHOUT INTRODUCING TIMING/PCLSR'ING BUGS.
2183
2184 UTBFF:  PUSHJ P,SWTL
2185           MEMFRZ
2186         MOVSI J,-TSYSM
2187 UTBFF3: LDB R,[MUR,,MEMBLT(J)]
2188         CAIN R,MUIOB
2189          PUSHJ P,UTBFF2
2190         AOBJN J,UTBFF3
2191 UTBFF5: SOS NCORRQ
2192         PUSHJ P,LSWPOP
2193 IFN CHAOSP, PUSHJ P,CHCLN       ;ALSO, CLEAN UP CHAOS NET BUFFERS
2194 IFN INETP, PUSHJ P,PKBCLN       ; Clean up network packet buffers
2195 ;SWAP OUT ALL LOOSE PAGES.  THE REASON THIS IS DONE IS THAT IF THE
2196 ;SYSTEM LOAD IS LIGHT LOOSE PAGES FOR DELETED INQUIR DATA BASE FILES
2197 ;CAN STAY AROUND INDEFINITELY, TYING UP DISK SPACE.
2198 ;SWAPPING OUT LOOSE PAGES DOES NOT CAUSE ANY DISK I/O.
2199 ;SWPOPG MAY NON-SKIP RETURN IF CIRPSW OR A TUT IS LOCKED,
2200 ;IN WHICH CASE WE GIVE UP UNTIL THE NEXT 2-MINUTE CLOCK.
2201 UTBFF6: CONO PI,CLKOFF
2202         SKIPN A,FLOOSP          ;GET A LOOSE PAGE
2203          JRST UTBFF7
2204         MOVNI C,1
2205         PUSHJ P,SWPOPL          ;SWAP OUT EVEN IF LOCKED (SHOULDN'T BE)
2206          JRST UTBFF7            ;COULDN'T SWAP OUT, GIVE UP FOR NOW
2207         CONO PI,CLKON           ;ALLOW CHANCE FOR AN INTERRUPT
2208         JRST UTBFF6
2209
2210 UTBFF7: CONO PI,CLKON
2211         JRST CORJOB
2212
2213 ;RH(J) HAS PAGE NUMBER OF A BLOCK OF 200-WD BUFFERS
2214 UTBFF2: LDB R,[MNUMB,,MEMBLT(J)] ;GET LIST OF IOBFT ENTRIES IN THIS BLOCK
2215         CLEARB Q,TT
2216 COSIO1: MOVSI E,200000          ;ALLOC INH ALL BUFFERS IN BLOCK
2217         IORM E,IOBFT(R)
2218         LDB E,[IOCH,,IOBFT(R)]
2219         CAIE E,77
2220          AOS Q                  ;COUNT NUMBER USED FOR SOMETHING
2221         CAIL E,NFNETC
2222          CAIL E,NFNETC+NNETCH
2223           CAIA
2224            AOS TT               ;COUNT NUMBER USED FOR NETWORK
2225         LDB R,[IOLC,,IOBFT(R)]
2226         CAIE R,377
2227          JRST COSIO1
2228         JUMPE Q,COSIO3          ;IF ALL BUFFERS FREE, FLUSH THIS PAGE
2229         CAME Q,TT
2230          JRST UTBFF1            ;CONTAINS NON-NET BUFFERS, LEAVE ALONE
2231         MOVEI E,0
2232         EXCH E,UTTBF
2233         CAIL E,8                ;IF THERE ARE ENOUGH FREE IN OTHER BLOCKS
2234          JRST CISHUF            ;THEN GO SHUFFLE THE NET BUFFERS
2235         EXCH E,UTTBF
2236 UTBFF1: LDB R,[MNUMB,,MEMBLT(J)]        ;ABANDON IDEA OF FLUSHING THIS BLOCK
2237         MOVSI E,200000                  ;UN-INHIBIT THE BUFFERS..
2238 UTBFF4: ANDCAM E,IOBFT(R)
2239         LDB R,[IOLC,,IOBFT(R)]
2240         CAIE R,377
2241          JRST UTBFF4
2242         POPJ P,                 ;RETURN OUT OF UTBFF2
2243 \f;SHUFFLE BUFFERS
2244 ;COME HERE WITH UTTBF SET TO 0 AND OLD VALUE IN E
2245 ;LEAVE UTTBF 0 WHILE SHUFFLING SO NO ONE ELSE CAN ALLOCATE
2246
2247 CISHUF: PUSH P,E
2248         LDB R,[MNUMB,,MEMBLT(J)]
2249 CISHF1: LDB Q,[IOCH,,IOBFT(R)]
2250         CAIN Q,77
2251          JRST CISHF2            ;FREE, IGNORE
2252         CAIL Q,NFNETC
2253         CAILE Q,NFNETC+NNETCH
2254          JRST 4,.               ;SOME RANDOM UNSHUFFABLE BUFFER
2255         PUSHJ P,CINET
2256 CISHF2: LDB R,[IOLC,,IOBFT(R)]
2257         CAIE R,377
2258          JRST CISHF1
2259         POP P,UTTBF             ;ALLOW ALLOC AGAIN.  THIS MEM BLOCK NOW
2260                                 ;CONTAINS 8 FREE, ALLOC INH BUFFERS.
2261                                 ;SO FALL INTO COSIO3 TO FLUSH THEM.
2262 ;FLUSH ALL 8 BUFFERS.
2263
2264 COSIO3: LDB R,[MNUMB,,MEMBLT(J)]
2265         MOVEI TT,7
2266 COSIO4: LDB Q,[IOCH,,IOBFT(R)]
2267         CAIE Q,77
2268          JRST 4,.               ;BUFFER WAS SUPPOSED TO BE FREE??
2269         MOVEI Q,UTFS-IOBFT      ;PNTR TO F.S. LIST
2270         SOS UTTBF               ;SOON WILL BE ONE LESS FREE UTAPE BUFFER
2271         CONO PI,UTCOFF
2272 COSIO5: MOVE E,Q                ;REMOVE IOBFT ENTRY IN R FROM F.S. LIST
2273         LDB Q,[IOLO,,IOBFT(Q)]
2274         CAIN Q,377
2275          JRST 4,.               ;IT WASN'T IN THE LIST
2276         CAME Q,R
2277          JRST COSIO5
2278
2279         LDB Q,[IOLO,,IOBFT(R)]
2280         DPB Q,[IOLO,,IOBFT(E)]
2281         MOVE A,R                ;GIVE IOBFT ENTRY BACK TO LIST OF UNUSED IOBFTS
2282         LDB R,[IOLC,,IOBFT(R)]
2283         PUSHJ P,IOBR
2284         CONO PI,UTCON
2285         CAIE R,377
2286          SOJA TT,COSIO4
2287
2288         JUMPN TT,[JRST 4,.]     ;BLOCK DIDN'T CONTAIN 8 BUFFERS
2289         MOVNI A,8
2290         ADDB A,UTTLB
2291         CAMGE A,[-NUTIC-NUTOC]
2292          JRST 4,.
2293         PUSHJ P,FSCMP
2294         HRRZ A,J                ;THIS BLOCK OF MEMORY IS FREE NOW
2295         JRST CMEMR              ;AND RETURN OUT OF UTBFF2
2296
2297 ;EXCHANGE BUFFER IN R WITH SOME FREE BUFFER, RETURNED IN A
2298 ;CALL WITH UCTOFF, CHANNEL NUMBER IN Q, TURNS UTCON
2299
2300 COSIMG: MOVEI D,NFNETC(Q)       ;CHNL NO TO CONS FOR
2301         AOS UTTBF               ;UNRESERVE ONE BUFFER MOMENTARILY
2302         PUSHJ P,IUTCONS
2303          JRST 4,.
2304         CONO PI,UTCON
2305         LDB TT,[IOSA1,,IOBFT(R)]        ;TRANSFER BUFFER R TO BUFFER A
2306         LDB T,[IOSA1,,IOBFT(A)]
2307         HRL T,TT
2308         LSH T,7
2309         HRRZ TT,T
2310         BLT T,177(TT)
2311         EXCH R,A
2312         CONO PI,UTCOFF
2313         PUSHJ P,IBRTN           ;RETURN THE OLD BUFFER
2314         SOS UTTBF               ;BUT RESERVE IT
2315         EXCH R,A
2316         JRST UTCONJ
2317 \f
2318 ;SHUFFLE OFF A NCP NETWORK BUFFER
2319 ;R HAS IOBFT INDEX, Q HAS CHANNEL NUMBER, E MUST BE PRESERVED
2320
2321 CINET:
2322 IFE NCPP,JRST 4,.
2323 IFN NCPP,[
2324         SUBI Q,NFNETC           ;GET IMSOC INDEX
2325         HRRZ A,IMSOC1(Q)        ;USER WHO OWNS THIS BUFFER
2326         MOVSI T,200000
2327         TDNE T,IMSOC1(Q)        ;SKIP OVER USER STOP IF BEING CLOSED
2328          TROA A,-1              ; SINCE USER CAN'T REFERENCE BUFFER ANY MORE
2329           PUSHJ P,RPCLSR        ;AND LEAVE A=USER # STOPPED OR 0,,-1 IF NONE
2330         MOVSI T,200000          ;MUSTN'T BE ACTIVE AT PI LEVEL
2331         PUSHJ P,LWAIT
2332           TDNE T,IMSOC6(Q)
2333         SKIPN IMSOC6(Q) ;LWAIT RETURNS WITH NETOFF
2334          JRST CINET2            ;BUFFER HAS BEEN RETURNED
2335         MOVSI T,400000          ;LOCK THE BUFFER SO PI LEVEL WON'T TOUCH
2336         IORM T,IMSOC6(Q)
2337         LDB T,[221000,,IMSOC6(Q)]
2338         CAIE T,(R)
2339          JRST 4,.               ;IOBFT ENTRY POINTS TO WRONG CHANNEL
2340         PUSH P,A                ;SAVE INDEX OF STOPPED USER
2341         PUSHJ P,COSIMG          ;COPY BUFFER
2342         LDB TT,[IOSA,,IOBFT(A)]
2343         LSH TT,6
2344         MOVE T,TT
2345         HRRZ D,IMSOC6(Q)
2346         SUB T,D                 ;OFFSET NEW BUFFER MINUS OLD
2347         HRL TT,A
2348         DPB TT,[003200,,IMSOC6(Q)] ;STORE NEW BUFFER ADDR, LEAVE FLAGS ALONE
2349         ADDM T,IMSBFE(Q)        ;RELOCATE VARIOUS POINTERS
2350         ADDM T,IMSMPP(Q)
2351         ADDM T,IMSPIP(Q)
2352         MOVE TT,IMSOC2(Q)
2353         TRNN TT,1
2354          AOSA IMNISH
2355           AOS IMNOSH
2356         CONO PI,NETOFF
2357         MOVE TT,IMSOC6(Q)
2358         TLNN TT,100000          ;SKIP IF INPUT OCCURRED WITH BUFFER LOCKED
2359          JRST CINET1
2360 IFE DMI,[
2361         MOVE TT,IMPSVP          ;RESTART INPUT
2362         MOVEM TT,IMPPIA
2363         CONO IMP,(TT)
2364 ]
2365 IFN DMI,CONO FI,FIIN+NETCHN*11
2366 CINET1: MOVSI TT,500000         ;UNLOCK THE BUFFER, CLEAR INPUT WITH LOCK FLAG
2367         ANDCAM TT,IMSOC6(Q)
2368         PUSHJ P,IMPIOS          ;RESTART OUTPUT
2369         POP P,A                 ;AND FALL INTO CINET2 TO RESTART USER
2370 CINET2: CONO PI,NETON
2371         JRST NJUPCL             ;RESTART USER IF ONE WAS STOPPED
2372 ] ;END IFN NCPP
2373 \f
2374 ;FREE BLOCKS THAT BECAME FREE AT INT LEVEL.
2375 ACMTC:  SKIPN MEMFP1    ;ANY BLKS BECAME FREE AT INT LVL?
2376          POPJ P,
2377         CONO PI,UTCOFF
2378         SKIPL MEMFRZ    ;IF MEMFRZ IS LOCKED, CAN'T DO THIS.  JUST
2379          JRST UTCONJ    ;HOPE ENOUGH CORE IS FREE. MUST BE BETTER WAY!
2380         MOVE A,MEMFP1   ;GET # OF ONE OF THEM,
2381         LDB B,[MLO,,MEMBLT(A)]  ;REMOVE IT FROM LIST OF SUCH BLOCKS
2382         HRRZM B,MEMFP1
2383         LDB B,[MUR,,MEMBLT(A)]
2384         CAIE B,MUFRT
2385          JRST 4,.
2386         PUSHJ P,MEMR
2387         JRST ACMTC
2388
2389 ;COPY A PHYSICAL PAGE'S DATA FROM PAGE (J) TO PAGE (D)
2390 CMOVE1: MOVE C,MEMBLT(J)
2391         MOVEM C,MEMBLT(D)
2392         CLEARM MEMBLT(J)
2393         MOVE C,MEMPNT(J)
2394         MOVEM C,MEMPNT(D)
2395         CLEARM MEMPNT(J)
2396         MOVE C,MMSWP(J)
2397         MOVEM C,MMSWP(D)
2398         HRRZ A,D
2399         CAIGE A,SYSB
2400          JRST 4,.
2401         TRO D,600000+PMCSHM
2402         TRO J,600000+PMCSHM
2403         DPB D,[.CORJT+EXEUMP]
2404         DPB J,[.CORJF+EXEUMP]
2405         TRZ D,600000+PMCSHM
2406         TRZ J,600000+PMCSHM
2407         CLRPGM +LUBLK
2408         MOVE A,[400000+CORJF*2000,,400000+CORJT*2000]
2409         BLT A,400000+CORJT*2000+1777
2410         MOVEI A,0
2411         DPB A,[.CORJT+EXEUMP]
2412         DPB A,[.CORJF+EXEUMP]
2413         POPJ P,
2414
2415 MEMMF:  LDB A,[MUR,,MEMBLT(D)]
2416         CAIE A,MUFR
2417          JRST 4,.
2418         HRRZ A,D
2419         PUSHJ P,TCALL
2420           JRST MPOUT
2421         POPJ P,
2422
2423 UDELAY: PUSH P,T
2424         MOVE T,TIME
2425         ADDI T,15.      ;SLEEP 1/2 SEC. (REALLY SHOULD DO A LOW
2426         CAMLE T,TIME    ;PRIORITY UNBLOCK IF SYS LIGHTLY LOADED)
2427 UDELA1:  PUSHJ P,UFLS
2428         JRST POPTJ
2429
2430 CZRR:   PUSH P,A
2431         CAIGE A,SYSB    ;CORE ZEROER
2432          JRST 4,.
2433         TRO A,600000+PMCSHM
2434         DPB A,[.CORJT+EXEUMP]
2435         CLRPGM +LUBLK
2436         CLEARM 400000+CORJT*2000
2437         MOVE A,[400000+CORJT*2000,,400000+CORJT*2000+1]
2438         BLT A,400000+CORJT*2000+1777
2439         MOVEI A,0
2440         DPB A,[.CORJT+EXEUMP]
2441         JRST POPAJ
2442 \f
2443 ;ROUTINES TO ALLOCATE BLOCKS OF MEMORY
2444 ;CALL ONLY AT UTC LEVEL OR WITH UTC OFF
2445
2446 OVHMTR ALC      ;CORE ALLOCATION
2447
2448 ;SEE IF CAN ALLOCATE MEMORY
2449 MQTEST: MOVE A,MEMFR
2450         SUB A,NCBCOM
2451         JUMPLE A,CPOPJ
2452         SKIPLE MEMFR
2453          SKIPL MEMFRZ
2454           POPJ P,
2455         JRST POPJ1
2456
2457 ;ALLOCATE PREFERRING HIGH MEMORY, FOR RANDOM USER PAGE.  SHUFFLEABLE PAGE OK.
2458 HMRQC:  PUSHJ P,MQTEST
2459          POPJ P,
2460 HMEMRQ: PUSH P,B
2461         PUSH P,E
2462         HRREI B,MEMHPT-MEMBLT
2463 HMRQ3:  LDB A,[MLO,,MEMBLT(B)]
2464         JUMPE A,HMRQ1   ;HIGH HALF FULL TRY LOW
2465         CAIL A,SYSB     ;DON'T ALLOCATE PART OF THE SYSTEM
2466         SKIPGE MEMBLT(A) ;DON'T ALLOCATE IF LOCKED
2467          SKIPA B,A      ;THIS PAGE NOT AVAIL, TRY NEXT
2468           JRST IMRQ8    ;GOBBLE IT
2469         JRST HMRQ3
2470
2471 HMRQ1:  POP P,E
2472         POP P,B
2473         JRST NMMRQ      ;THAT DIDNT WORK, TRY LOW HALF
2474
2475 ;ALLOCATE A BLOCK OF MEM FOR 200-WORD BUFFERS
2476 UIMRQ:  MOVE A,IOBFC
2477         CAIGE A,8
2478          POPJ P,        ;NOT ENOUGH ROOM IM IOBFT
2479         MOVE A,MEMFR
2480         SUB A,NCBCOM
2481         CAIG A,3
2482          POPJ P,
2483
2484 ;GET A BLOCK THAT WON'T BE SHUFFLED, AND IS DIRECTLY ACCESSIBLE.
2485 IOMQ:   PUSHJ P,MQTEST  ;GET LOW OR MEDIUM MEMORY FOR I/O
2486          POPJ P,
2487
2488 ;ALLOCATING LOW MEM
2489 NMMRQ:  MOVEI A,0               ;MEMFP = MEMBLT+0
2490 IMRQ7:  PI2SAF
2491         PUSH P,B
2492         PUSH P,E
2493 IMRQ2:  LDB A,[MLO,,MEMBLT(A)]
2494         JUMPN A,IMRQ3
2495         PUSH P,C
2496         PUSH P,H
2497         PUSH P,TT
2498         MOVEI C,IMEMR
2499         SKIPGE UDRSW
2500          PUSHJ P,QDFLS  ;TRY FLUSHING DISK DIRS
2501         POP P,TT
2502         POP P,H
2503         POP P,C
2504         MOVEI A,0
2505 IMRQ6:  LDB A,[MLO,,MEMBLT(A)]
2506         JUMPE A,IMRQR   ;NO MEM AVAIL IN LOW HALF, TAKE NON-SKIP RETURN
2507         SKIPGE MEMBLT(A)
2508          JRST IMRQ6
2509         JRST IMRQ9
2510
2511 MPOUT1:
2512 IMRQR:  POP P,E
2513         JRST POPBJ
2514
2515 IMRQ3:  SKIPGE MEMBLT(A)
2516          JRST IMRQ2     ;LOCKED LOOK FOR ANOTHER
2517 IMRQ9:  TDZA B,B        ;GOBBLE FROM LOW
2518 IMRQ8:   MOVNI B,1      ;GOBBLE FROM HIGH
2519         AOS -2(P)       ;CAUSE RETURN TO SKIP
2520         LDB E,[MUR,,MEMBLT(A)]
2521         CAIN E,MUFR
2522          JUMPN A,IMRQ4
2523         JRST 4,.        ;BLOCK GOT PUT ON FREE STORAGE LIST WITHOUT USAGE FIELD GETTING "FREE"
2524 \f;ROUTINES FOR RETURNING MEMORY
2525 IMEMR:  PI2SAF          ;HERE OTHERWISE (SEE BELOW)
2526         CAIGE A,TSYSM
2527         CAIGE A,SYSB
2528          JRST 4,.       ;DON'T RETURN PART OF SYSTEM
2529         SKIPL MEMFRZ
2530          JRST IMEMR1
2531 CIMEMR: PUSH P,B        ;ENTER HERE IF OK TO HACK WITH MEM FROZEN
2532         LDB B,[MUR,,MEMBLT(A)]  ;I E CALLING FROM CORE ALLOCATOR
2533         CAIN B,MUFR
2534          JRST 4,.       ;ALREADY FREE, LOSSAGE
2535         SETZM MEMBLT(A) ;INITIALIZE RANDOM FIELDS
2536         CAIGE A,256.    ;HIGH MOBY GOES ON HIGH LIST
2537         CAIGE A,LIOBLK  ;LOW SHUFFLEABLE GOES ON HIGH LIST
2538          JRST CIMEM1
2539         CAIGE A,128.    ;LOW NON-SHUFFLEABLE GOES ON LOW LIST
2540          JRST CIMEM0
2541         CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
2542          SKIPN USEMDM   ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
2543            JRST CIMEM1
2544 CIMEM0: LDB B,[MLO,,MEMFP]      ;PICK UP HEAD OF APPRO FS LIST
2545         DPB B,[MLO,,MEMBLT(A)]  ;STORE AS LINK OUT OF CURRENT WD
2546         CAIE B,0        ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
2547          DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
2548         MOVEI B,0       ;NO BACK PTR, THIS WILL BE FIRST IN LIST
2549         DPB B,[MLU,,MEMBLT(A)]
2550         DPB A,[MLO,,MEMFP]      ;STORE THIS AS FREE LIST HEAD
2551         AOS LMEMFR
2552 CIMEM3: MOVEI B,MUFR
2553         DPB B,[MUR,,MEMBLT(A)]  ;STORE FREE IN USER
2554         CLEARM MEMPNT(A)
2555         AOS MEMFR
2556         JRST POPBJ
2557
2558 CIMEM1: LDB B,[MLO,,MEMHPT]     ;PICK UP HEAD OF APPRO FS LIST
2559         DPB B,[MLO,,MEMBLT(A)]  ;STORE AS LINK OUT OF CURRENT WD
2560         CAIE B,0        ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
2561          DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
2562         MOVEI B,0       ;NO BACK PTR, THIS WILL BE FIRST IN LIST
2563         DPB B,[MLU,,MEMBLT(A)]
2564         DPB A,[MLO,,MEMHPT]     ;STORE THIS AS FREE LIST HEAD
2565         JRST CIMEM3
2566
2567 IMEMR1: PUSH P,B        ;FREE A PAGE WHEN MEMFRZ LOCKED.
2568         MOVE B,MEMFP1   ;ADD IT TO FRONT OF MEMFP1 LIST
2569         DPB B,[MLO,,MEMBLT(A)]
2570         HRRZM A,MEMFP1
2571         MOVEI B,MUFRT   ;THEN SAY THIS BLK BECAME FREE WITH MEM FROZEN.
2572         DPB B,[MUR,,MEMBLT(A)]
2573         SETZM MEMPNT(A)
2574         JRST POPBJ
2575
2576 ;ROUTINES TO RETURN MEMORY CONTINUED
2577
2578 MGMEMR: PUSHJ P,TMEMR   ;MAG TAPE MEMR
2579          MUMGB
2580         POPJ P,
2581
2582 TMEMR:  PUSH P,B
2583         LDB B,[MUR,,MEMBLT(A)]
2584         CAME B,@-1(P)
2585          JRST 4,.       ;RETURNING BLOCK NOT OF TYPE EXPECTED
2586         POP P,B
2587         AOS (P)         ;SKIP OVER ARG
2588 MEMR:   CONO PI,UTCOFF
2589         PUSHJ P,IMEMR
2590         JRST UTCONJ
2591
2592 CMEMR:  CONO PI,UTCOFF
2593         PUSHJ P,CIMEMR
2594         JRST UTCONJ
2595 \f
2596 ; ROUTINES TO UNTHREAD BLOCKS FROM FREE LISTS
2597
2598 MPOUT:  PI2SAF
2599 MPOUT2: JUMPE A,[JRST 4,.]      ;ENTER HERE FROM INITIALIZATION IF HOLE FOUND
2600         PUSH P,B
2601         PUSH P,E
2602         CAIGE A,256.    ;HIGH MOBY GOES ON HIGH LIST
2603         CAIGE A,LIOBLK  ;LOW NON-SHUFFLEABLE GOES ON HIGH LIST
2604          JRST MPOUT4
2605         CAIGE A,128.    ;LOW SHUFFLEABLE GOES ON LOW LIST
2606          JRST MPOUT3
2607         CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
2608          SKIPN USEMDM   ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
2609 MPOUT4:   SKIPA B,[-1]  ;IT'S HIGH MEM
2610 MPOUT3:    MOVEI B,0    ;IT'S LOW MEM
2611
2612 IMRQ4:  PUSH P,B                ;0 LOW -1 HIGH
2613         LDB B,[MLU,,MEMBLT(A)]  ;LINK UP
2614         LDB E,[MLO,,MEMBLT(A)]  ;LINK OUT
2615         JUMPN B,IMRQ5   ;JUMP IF NOT FIRST IN LIST
2616         JUMPE E,IMRQ5   ;JUMP IF LAST BLOCK IN LIST
2617         LDB B,[MUR,,MEMBLT(E)]  ;FIRST AND FOLLOWED
2618         CAIE B,MUFR
2619          JRST 4,.       ;DOESNT LINK TO A FREE BLOCK
2620         MOVEI B,0       ;PUT BACK 0
2621 IMRQ5:  SKIPE E         ;SKIP IF NO BLOCK FOLLOWS
2622          DPB B,[MLU,,MEMBLT(E)] ;STORE LINK UP OF PATCHED OUT BLOCK IN LINK OUT BLOCK
2623         JUMPE B,IMRQ5A
2624         DPB E,[MLO,,MEMBLT(B)]  ;STORE LINK OUT OF PATCHED OUT BLOCK IN LINK UP BLOCK
2625         POP P,B         ;GET BACK WHICH PART OF MEM IT'S IN
2626         JRST IMRQ5C     
2627
2628 IMRQ5A: POP P,B         ;GET BACK WHICH PART OF MEM IT'S IN
2629         DPB E,[MLO,,MEMFP(B)] ;THIS WAS FIRST IN FREE LIST, ADJUST LIST HEADER
2630 IMRQ5C: SKIPL B         ;SKIP IF NOT IN LOW HALF
2631          SOS LMEMFR     ;ADJUST FREE BLOCKS IN LOWER HALF
2632         SOS MEMFR       ;1 LESS FREE BLOCK IN SYSTEM
2633         SETZM MEMBLT(A) ;CLEAN UP MEMBLT ENTRY FOR CALLER'S SAKE
2634         MOVEI B,MUINP   ;IN PROCESS
2635         DPB B,[MUR,,MEMBLT(A)]
2636         JRST MPOUT1
2637
2638 OVHMTR UUO      ;MORE MISC UUOS ETC.
2639
2640 TCALL:  CONO PI,UTCOFF
2641         PUSHJ P,@(P)
2642          SKIPA
2643           AOS (P)
2644         JRST UTCOJ1
2645
2646 EBLK
2647 \f
2648 SUBTTL MEMORY ALLOCATION TABLES
2649
2650 IOBFTL: MXIOB   ;BEG FOR GETSYS (MEMORY)
2651 IOBFT:  REPEAT  MXIOB-1,176000,,.RPCNT+1        ;MAX DYN ALLOC IO BUFFERS
2652         176000,,377     ;4.9 FREEZE
2653         ;4.8 ALLOC INHIBIT
2654 IOCH==340600    ;4.7-4.2 SYS CHN NO 77 => FREE
2655 IOLC==241000    ;4.1-3.3 LINK TO NEXT SEQ BUF IN CORE (W/IN 1K BLK)
2656 IOLO==1000      ; LINK TO FOLLOWING BUFFER OR
2657         ;SPECIAL STATES LINK OUT
2658         ;-1     LAST BUFFER CURRENTLY FILLED
2659         ;-2   END OF FILE
2660         ;-3   BUFFER ACTIVE AT MAIN PROG LEVEL
2661         ;-4   BUFFER ACTIVE AT PI LEVEL
2662 ;IF CHN IS NUTIC+NUTOC (UTAPE FILE DIR) THEN IOLO IS TAPE NO
2663 ;CHNLS NUTIC+NUTOC+1 (NFCLC)=>$Q+NCLCH-1 ARE CORE LINK DEVICE
2664 ;CHNLS NFNETC => $Q+NNETCH-1 ARE NET CHNLS
2665 SCNCLO==NUTIC+NUTOC+1
2666
2667 IOSA==101400    ; BUFFER SA _-6
2668 IOSA1==111300   ;ONLY RELEVANT BITS FOR 200 WD BUFFERS
2669
2670
2671 IOBFP:  0       ;FREE STG TO IOBFT ENT
2672 IOBFC:  MXIOB-8 ;CNT OF AVAIL
2673                         ;LEAVE 8 AVAIL SO CORE HACKER CAN NOT RUN OUT
2674
2675 UTFS:   377     ;FREE STG PNTR TO 200 WD BUFFERS
2676 UTTLB:  -NUTIC-NUTOC ;TOTAL BUFFERS ALLOCATED TO UTAPES
2677 UTTBF:  0       ;TOTAL UT BUFFERS FREE
2678
2679 ;EXEC MAPS
2680 IF2,[
2681 EXEUMP=UPGMP+100        ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S MAP AREA
2682 EXELMP==UPGMP           ;KL10 AND KS10 ALSO NEED EXEC LOWER MAP, + EXISTS
2683 ];IF2                   ;SO USERS CAN COPY PAGES FROM THE SYSTEM JOB
2684
2685 ;TABLE OF BYTE POINTERS THAT POINT TO VIDEO BUFFER AREA OF EXEUMP
2686 IFN N11TYS,[
2687 TTCRT:  REPEAT NTVBP,[
2688                 CONC [.TTR]\.RPCNT,+EXEUMP
2689 ]
2690 ]
2691
2692 IFN PDP6P,[
2693 ;DBR FOR REFERENCING PDP6 MEM
2694 PDP6MP: <LPDP6M/2>_1,,PDPUMP
2695
2696 ;PAGE MAP FOR REFERENCING PDP6 MEM
2697 PDPUMP: REPEAT LPDP6M/2,600000+<PDP6BM_-10.>+2*.RPCNT,,600000+<PDP6BM_-10.>+2*.RPCNT+1
2698 ]
2699
2700 IFN 340P,[
2701 DDEXCF: BLOCK NEXPGS    ;-1 IF EXEC PAGE SET UP FOR 340
2702 ]
2703
2704 IFN KA10P, EXECMP: 100_1,,EXEUMP        ;EXEC DBR
2705 \f;MEMORY ORGANIZATION
2706
2707 ;PAGE 0 ALWAYS BELONGS TO THE SYSTEM AND IS NEVER ALLOCATED OR FREED.
2708 ;
2709 ;N PAGES OF SYSTEM CODE AND VARIABLES ARE ACQUIRED BY THE SYSTEM JOB AT STARTUP.
2710 ;
2711 ;N PAGES OF USER-VARIABLE BLOCKS BELONG TO THE SYSTEM JOB.  THESE ARE
2712 ;ALLOCATED AND DEALLOCATED AS REQUIRED.  LIOBLK-1 IS THE HIGHEST THIS CAN GO.
2713 ;USER PAGES BELOW LIOBLK CAN BE SHUFFLED OUT WHEN THE SYSTEM JOB NEEDS THE CORE.
2714 ;
2715 ;FROM LIOBLK TO 128K IS THE "LOW HALF."  THESE PAGES ARE DIRECTLY ADDRESSABLE
2716 ;IN EXEC MODE AND NEVER NEED TO BE SHUFFLED.  I/O BUFFERS, DISK DIRECTORIES,
2717 ;ETC. ARE ALLOCATED IN THESE PAGES.
2718 ;
2719 ;128K TO 128K+NEXPGS ARE PAGES WHICH CAN'T BE ADDRESSED DIRECTLY FROM
2720 ;EXEC MODE BECAUSE THEIR EXEUMP SLOTS ARE USED BY "EXEC PAGES."
2721 ;
2722 ;THE REST OF THE LOW MOBY, UP TO FDDTPG, IS DIRECT-MAPPED AND
2723 ;USED FOR ADDITIONAL "LOW HALF" PAGES.
2724 ;
2725 ;FDDTPG TO 256K CONTAINS DDT AND THE SYSTEM SYMBOL TABLE.
2726 ;
2727 ;PAGES ABOVE 256K ARE IN THE "HIGH MOBY".
2728 ;
2729 ;PAGES NOT IN THE "LOW HALF" (BELOW LIOBLK, SHADOWED BY EXEC, OR HIGH MOBY)
2730 ;ARE CONSIDERED TO BE IN THE "HIGH HALF".  USER PAGES PREFER TO GO HERE.
2731 ;
2732 ;COMPLICATIONS:
2733 ; IF USEMDM IS OFF, THE DIRECT MAPPED PAGES IN THE HIGH HALF
2734 ; OF THE LOW MOBY ARE CONSIDERED HIGH RATHER THAN LOW.  THIS IS USED
2735 ; MOSTLY FOR DEBUGGING, TO CATCH REFERENCES TO RANDOM ADDRESSES.
2736 ; THERE CAN BE HOLES IN MEMORY (NXM).
2737 ;
2738 ;THE MEMBLT TABLE HAS ONE WORD FOR EACH 1K BLOCK OF MEMORY.
2739 ;IT SAYS WHAT THAT BLOCK IS USED FOR AND CONTAINS LINKS TO OTHER
2740 ;BLOCKS AND OTHER TABLES.  THE MEMPNT AND MMSWP TABLES ALSO CONTAIN
2741 ;ONE WORD PER BLOCK AND CONTAIN ADDITIONAL INFORMATION.
2742 \f
2743 FDDTPG: 0       ;# OF LOWEST BLOCK USED BY DDT & SYMTAB (SET AT STARTUP)
2744
2745 MEMFR:  0       ;# OF FREE BLOCKS IN ALL OF MEMORY.
2746
2747 LMEMFR: 0       ;# OF FREE BLOCKS IN LOW LIST (MEMFP).
2748
2749 MINCOR: 8       ;TRY TO KEEP THIS MANY PAGES FREE IN LOW MEMORY
2750                 ;MUST BE >= 3, SINCE LESSER-PRIORITY CONSUMERS OF
2751                 ;MEMORY WAIT IF LMEMFR IS < 3.
2752
2753 MEMFP1: 0       ;LIST (THREADED THROUGH MLO, TERMINATED BY 0)
2754                 ;OF BLKS THAT BECAME FREE WHILE MEMFRZ WAS LOCKED.
2755
2756 MEMHPT: 0       ;FREE LIST OF HIGH HALF PAGES AND HIGH MOBY PAGES
2757                 ;AND SHUFFLEABLE LOW HALF PAGES.  MUST BE AT MEMFP-1.
2758 MEMFP::
2759 MEMBLT: 0       ;FREE LIST POINTER FOR LOW PGS AND ALSO WD FOR BLOCK 0
2760         BLOCK TSYSM-1   .SEE BEGF0 ;FILLS THIS IN
2761
2762 ;FIELDS IN MEMBLT ENTRY:
2763 ;4.9  FREEZE OR ALLOC INHIBIT
2764 ;IF 4.9=1, DONT SET UP ANY MORE EXEC PGS POINTING TO THIS ONE
2765 MUR==360500     ;4.4-4.8 USAGE CODE
2766  MURUSR==1      ;USER PAGE, MMMPX=MMP INDEX
2767  MUEX==2        ;EXEC (?)
2768  MUIOB==3       ;200 WD BUFFERS, MNUMB=FIRST IOBFT ENTRY IN BLOCK
2769  MUFR==4        ;FREE
2770  MUINP==5       ;IN PROCESS OF BEING ALLOCATED
2771  MUMGB==6       ;MAG TAPE BUFFER, MNUMB=TAPE NO+EOF BIT, MWC=WORD COUNT
2772  MUMMP==7       ;MMP TABLE
2773  MUDISB==10     ;340 DISPLAY BUFFER
2774  MUFRT==11      ;BLOCK RETURNING TO FREE WHEN MEM LOCKED
2775  MU23B==12      ;DISK BUF, MWC=WORD COUNT, MNUMB=CHANNEL
2776  MU23UD==13     ;DISK USER DIR, MNUMB=QSNUD SLOT
2777  MU23MD==14     ;DISK MASTER DIR
2778  MU23TT==15     ;DISK TUT MNUMB=DISK NO.
2779  MU23LS==16     ;DISK COPY OF USER DIR FOR LISTING
2780  MUHOLE==17     ;"HOLE" IN REAL MEM
2781  MUDDT==20      ;"DDT" PAGE
2782  MUNET==21      ;NETWORK "BIG" BUFFER
2783  MUSWPG==22     ;PAGE IN SWAPPING QUEUE, MMMPX=MMP INDEX
2784  MUCHA==23      ;CHAOS NET BUFFERS
2785  MU23FB==24     .SEE QSFBT      ;DISK FREED-BLOCKS TABLES
2786  MUPKT==25      ; Net packet buffers
2787  MUDVB==26      ;Semi-static device IO buffer page
2788 ;ADD NEW MUR TYPES HERE ^
2789 MURMAX==27      ;HIGHEST VALID CODE + 1
2790
2791 MWC==221400     ;3.1-4.3 WORD COUNT IN I/O BUFFERS
2792
2793 MLU==221400     ;3.1-4.3 LINK UP FOR DOUBLY-THREADED FREE LIST
2794
2795 MNUMB==140600   ;2.4-2.9 MAGIC NUMBER SEE COMMENTS UNDER MUR ABOVE
2796
2797 MMMPX==142200   ;2.4-4.3 MMP INDEX IN USER PGS + SWAP BUFFERS
2798
2799 MLO==001400     ;1.1-2.3 LINK TO NEXT PAGE IN A LIST
2800                 ;0 = END OF LIST
2801                 ;UNLIKE IOLO AND PREVIOUS VERSION OF MLO, THERE ARE NO MAGIC NEGATIVE CODES
2802                 ;N.B.: MLO MUST BE AT RIGHT-HAND END OF WORD - CODE DEPENDS
2803
2804 MEMPNT: BLOCK TSYSM     ;RH USED FOR CIRC MEM USE PNTR IF USER MEM
2805                         ;LH FOR DISK ADDRESS CAME FROM OR GOING TO
2806                          ;MEMPNT HAS BLOCK NUMBER
2807                          ;DISK NUMBER COMES FROM CHANNEL LINKED TO
2808         ;CIRCULAR PAGE LINK FORM
2809         ;2.9=0
2810         ;1.1-1.8 PAGE #
2811         ;2.8-1.9 USER #
2812         ;2.9=1
2813         ;2.8=0 2.7-1.1 LINK TO MMP TABLE
2814         ;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE
2815         ;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED
2816
2817 MMSWP:  BLOCK TSYSM     ;IF USER MEM, HAS NUMBER OF PAGE TABLE WORDS
2818                         ; WHICH POINT AT THIS PAGE.  LH IS NUMBER OF EXEC
2819                         ; PAGES, RH IS NUMBER OF USER PAGES.  NOTE THAT THE
2820                         ; NUMBER OF UPGCP ENTRIES COULD BE MORE, FOR VARIOUS
2821                         ; REASONS, E.G. CIRPSW LOCKED WHEN PAGE SWAPPED IN,
2822                         ; OR A USER WAS SWAPPED OUT.
2823                         ;IFN SWPWSP, RH(MMSWP) IS USED AS NUMBER OF SHARERS.
2824
2825 EMEMTL==.-1     ;END FOR GETSYS (MEMORY)
2826 \f
2827 MMPRTC: 0       ;C AT MMPRTN, FOR DEBUGGING
2828
2829 MMPFS:  0       ;FREE-LIST OF MMP ENTRIES.  VALUE IS ADDRESS. (FORMERLY WAS IDX).
2830
2831 MMPFS2: 0       ;LIST OF MMPS THAT NEED TO HAVE TUT SOS'ED BEFORE THEY CAN BE FREED.
2832                 ;TUT COULDN'T BE SOS'ED AT P.I. LEVEL BECAUSE IT WAS LOCKED.
2833                 ;THESE MMPS MAY ALSO NEED TO BE REMOVED FROM THE SHAREABLE
2834                 ;PAGE TABLE, WHICH REQUIRES CIRPSW.
2835
2836 MMPCNT: 0       ;# OF MMP ENTRIES IN USE.
2837
2838 MMPFR:  NMMP*1000       ;MAX POSSIBLE # MMP ENTRIES, MINUS # IN USE OR COMMITTED.
2839
2840 ;MMP TABLE - TWO WDS PER ENTRY
2841 MMPPUB==400000  ;WD1 4.9 INDICATES A PUBLIC PAGE IF ON (ANYONE CAN ATTACH TO WRITE)
2842 MMPOUT==200000  ;4.8 => PAGE IS SWAPPED OUT OR ON WAY OUT.
2843 MMPTMP==100000  ;4.7 => IN TRANSIT (ON WAY IN OR ON WAY OUT).
2844 MMPWOD==40000   ;4.6 => THIS PAGE HAS BEEN WRITTEN ON DISK AT LEAST ONCE
2845 MMPISW==20000   ;4.5 PAGE ON INITIAL SWAPIN, BEING COPIED SO SWAP OUT TO DIFF PLACE
2846 MMPWRT==10000   ;4.4 HAS BEEN WRITTEN SINCE LAST DISK WRITE BY USER WHO HAS DETACHED THIS PAGE
2847 MMPGON==4000    ;4.3 FILE PAGE BEING WRITTEN OUT AFTER
2848                  ;DELETED FROM ALL MAPS (MMP ENTRY WILL SOON GO AWAY.)
2849 MMPBAD==2000    ;4.2 PAGE GOT PAR ERR SINCE LAST TIME SWAPPED OUT OR IN.
2850 MMPLOK==1000    ;4.1 => PAGE MAY NOT BE SWAPPED OUT.
2851 MMPSLO==400     ;3.9 => PAGE SHOULD GO IN SLOW MEMORY.
2852 MMPSHR==200     ;3.8 MMP ENTRY IS IN SHAREABLE PAGE HASH TABLE
2853 MMPPGA==100     ;3.7 BEING SWAPPED IN BY PAGE-AHEAD.  DON'T PUT IN USER MAPS; WAIT FOR FAULTS.
2854 MMPPGB==40      ;3.6 BEING SWAPPED OUT BY PAGE-BEHIND.
2855 $MMPUN==220300  ;3.1-3.3 UNIT NUMBER (GOES WITH DISK ADDR IN WD2 LH)
2856         ;WD1 RH CIRC MEM USE PNTR
2857         ;WD2 LH READ DISK ADR OR 0
2858         ;WD2 RH THREAD FOR SHAREABLE PAGE HASH TABLE
2859
2860 MMPNP:  0       ;#MMP PGS ACTUALLY IN USE
2861 MMPMX:  0       ;HIGHEST VALID MMP INDEX (MMPNP*2000)
2862
2863 MMMPG:  BLOCK NMMP      ;BLOCK NOS OF BLOCKS ACTUALLY USED
2864
2865 ;SHAREABLE PAGE HASH TABLE
2866 ;MMP ENTRIES THAT ARE SHARED WITH FILES ARE LISTED HERE TO SAVE TIME AT NCORQ2
2867 ;SIMPLE REMAINDER HASH ON UNIT#,,DISK ADDRESS,
2868 ;BUCKETS THREADED THROUGH RH(MMPE+1)
2869
2870 SHRHSL==31.     ;NUMBER OF BUCKETS
2871 SHRHSH: BLOCK SHRHSL
2872
2873 ;"LOOSE" PAGES (NOT USED BY ANY USER, BUT NOT YET SWAPPED OUT.)
2874 ;MMP ENTRY GOES AWAY WHEN SWAPPED OUT, OR GETS PUT BACK INTO SERVICE AT NCORQ3.
2875 NLOOSP: 0       ;NUMBER OF LOOSE PAGES
2876 FLOOSP: 0       ;HEAD OF LIST.  THREADED THROUGH MLO IN MEMBLT.
2877 LLOOSP: 0       ;TAIL OF LIST.  ADD AT TAIL, SWAPPER REMOVES FROM HEAD.
2878
2879 BBLK
2880 MMPEAD: REPEAT NMMP,    CONC MMP,\.RPCNT,*2000+400000   ;EXEC ADR
2881 MMPPPP: REPEAT NMMP,    CONC .MMP,\.RPCNT,+EXEUMP       ;PNTR TO EXEC PC MP
2882 USEMDM: DIRMAP          ;NON-ZERO => USE MEDIUM MEMORY.
2883                         ;DON'T CHANGE AFTER SYSTEM STARTUP
2884 \f
2885 SUBTTL 200-WORD I/O BUFFER ROUTINES
2886
2887 ;SYS CHANNEL ASSIGN
2888 ;  77=>FREE
2889 ; 0 - NUTIC+NUTOC-1 => UTAPE CHNL
2890 ;NUTIC+NUTOC (=NFCLC-1) =>UTAPE FILE DIR
2891 ;NFCLS-NFCLC+NCLCH-1 (=NFNETC-1) => CORE LINK
2892 ;NFNETC-NNETCH => NETWORK
2893
2894 IOBCNS: MOVEI A,IOBFP-IOBFT
2895 IOBC1:  MOVE E,A
2896         LDB A,[IOLO,,IOBFT(A)]
2897         CAIN A,377
2898          JRST 4,.       ;IOBFT POINTERS FOULED UP
2899
2900 IOBC2:  LDB B,[420200,,IOBFT(A)]
2901         JUMPN B,IOBC1
2902         LDB B,[IOLO,,IOBFT(A)]
2903         DPB B,[IOLO,,IOBFT(E)]
2904         SOS IOBFC
2905         POPJ P,
2906
2907
2908 IOBR:   MOVE B,IOBFP    ;RETURN IOBFT WORD
2909         CLEARM IOBFT(A)
2910         DPB B,[IOLO,,IOBFT(A)]
2911         MOVEM A,IOBFP
2912         MOVEI B,77
2913         DPB B,[IOCH,,IOBFT(A)]
2914         AOS IOBFC
2915         POPJ P,
2916
2917 IUTCONS:                ;ALLOCATE 200 WORD BUFFER
2918 IUTCO1: PI2SAF
2919         SKIPG UTTBF     ;CLOBBERS A B E TT, RETURNS IOBFT INDEX IN A
2920          JRST IUTC1     ;NO UTAPE BUFFERS FREE
2921         MOVEI E,UTFS-IOBFT
2922         MOVE A,UTFS     ;CHNL NO IN D
2923 IUTC3:  CAIN A,377
2924          JRST IUTC1
2925         LDB B,[420200,,IOBFT(A)]
2926         JUMPN B,IUTC2
2927         LDB B,[IOCH,,IOBFT(A)]
2928         CAIE B,77
2929          JRST 4,.       ;BUFFER BEING ALLOCATED ISN'T FREE.
2930         LDB B,[IOLO,,IOBFT(A)]
2931         DPB B,[IOLO,,IOBFT(E)]
2932         DPB D,[IOCH,,IOBFT(A)]
2933         SOS UTTBF
2934         JRST POPJ1
2935
2936 IUTC2:  MOVE E,A
2937         LDB A,[IOLO,,IOBFT(A)]
2938         JRST IUTC3
2939
2940 IUTC1:  PUSHJ P,UIMRQ
2941          POPJ P,
2942         PUSHJ P,UTMGB
2943         JRST IUTCO1
2944
2945 IBRTN:  PI2SAF
2946         PUSH P,B        ;FREE 200 WORD BUFFER (SEE BRTN)
2947 ;       LDB B,[IOCH,,IOBFT(A)]
2948 ;       CAIN B,77
2949 ;        JRST 4,.       ;RETURNING A BUFFER THAT'S FREE?
2950         MOVE B,UTFS
2951         DPB B,[IOLO,,IOBFT(A)]
2952         MOVEM A,UTFS
2953         MOVEI B,77
2954         DPB B,[IOCH,,IOBFT(A)]
2955         LDB B,[IOSA,,IOBFT(A)]
2956         SKIPN B
2957          JRST 4,.
2958         AOS UTTBF
2959         JRST POPBJ
2960 \f
2961 UTMGB:  PUSH P,J        ;GOBBLE MEM BLK IN A FOR UTAPE BUFFER
2962         PUSH P,R
2963         PUSH P,Q
2964         PUSH P,B
2965         PUSH P,E
2966         MOVEI B,MUIOB
2967         DPB B,[MUR,,MEMBLT(A)]
2968         MOVE J,A
2969         LSH A,10.-6.    ;CONV TO BUF SA
2970         MOVE TT,A       ;INCR TO NEXT BUF ADR
2971         MOVEI R,8
2972         ADDM R,UTTLB    ;UTTBF AOSED AT IBRTN
2973         MOVNI Q,1
2974 UTMG1:  PUSHJ P,IOBCNS
2975         DPB TT,[IOSA,,IOBFT(A)]
2976         JUMPL Q,UTMG2
2977         DPB A,[IOLC,,IOBFT(Q)]
2978 UTMG3:  MOVE Q,A
2979         PUSHJ P,IBRTN
2980         ADDI TT,2
2981         SOJG R,UTMG1
2982         MOVEI TT,377
2983         DPB TT,[IOLC,,IOBFT(A)]
2984         POP P,E
2985         POP P,B
2986         POP P,Q
2987         POP P,R
2988         POP P,J
2989 FSCMP:                          ;RECOMPUTE UTAPE BUFFER FAIR SHARE
2990 IFN NUNITS,[
2991         MOVE A,UTTLB
2992         PUSH P,A+1
2993         IDIV A,NUTCA
2994         POP P,A+1
2995         MOVEM A,UPCHFS
2996 ]
2997         POPJ P,
2998
2999 UTMG2:  DPB A,[MNUMB,,MEMBLT(J)]
3000         JRST UTMG3
3001
3002 BRTN:   CONO PI,UTCOFF          ;RETURN A 200-WD BUFFER
3003         PUSHJ P,IBRTN
3004         JRST UTCONJ