mirror of
https://github.com/PDP-10/its.git
synced 2026-01-16 00:14:18 +00:00
2990 lines
77 KiB
Plaintext
Executable File
2990 lines
77 KiB
Plaintext
Executable File
|
||
;;; CORE JOB
|
||
|
||
SUBTTL CORE ALLOCATOR - USER ROUTINES
|
||
;
|
||
; USER ROUTINES (TO COMMUNICATE WITH CORE JOB)
|
||
;
|
||
UACORE: ;U HAS INDEX CORE REQUEST IS FOR
|
||
ACORE: CAILE B,400
|
||
POPJ P,
|
||
MOVE Q,U ;USER TO MAKE CORE FOR
|
||
ACORE1: PUSH P,U
|
||
MOVE U,USER
|
||
PUSHJ P,ACRF1
|
||
SKIPA
|
||
AOS -1(P)
|
||
POP P,U
|
||
POPJ P,
|
||
|
||
;EXCESSIVE CORE REQUEST CHECK
|
||
ACRTST: CAILE B,400
|
||
POPJ P,
|
||
JRST POPJ1
|
||
;CORTYP SYSTEM CALL.
|
||
;IF 2 ARGS,1ST ARG IS JOB SPEC, LIKE CORBLK'S 2ND AND 4TH ARGS.
|
||
;2ND ARG IS PAGE NUMBER IN THAT JOB.
|
||
;IF ONLY 1 ARG, IT IS THE PAGE NUMBER IN THE EXECUTING JOB.
|
||
;RETURNED VALUES:
|
||
;1ST VALUE BITS:
|
||
; %CBWRT ;4.9 PAGE IS WRITEABLE
|
||
; %CBRED ;4.8 PAGE IS READABLE (EXISTS)
|
||
; %CBPUB ;4.6 PAGE IS PUBLIC
|
||
; %CBLOK ;4.2 PAGE IS LOCKED IN CORE
|
||
; %CBSLO ;3.9 PAGE IS IN SLOW MEMORY
|
||
; FOR NON EX PAGE, ALL THE REST ARE 0.
|
||
;2ND IS 0 => PAGE IS ABSOLUTE, -1 => UNSHARED,
|
||
; ELSE IS JOB NUMBER OF NEXT JOB IN CIRCULAR LIST.
|
||
;3RD IF ABSOLUTE PAGE, HAS PAGE NUMBER.
|
||
; IF PAGE IS SHARED, HAS PAGE NUMBER IN THE JOB
|
||
; WHOSE NUMBER IS THE 2ND VALUE. ELSE, 0.
|
||
;4TH BIT 4.9 => PAGE IS IN CORE.
|
||
; RH IS NUMBER OF TIMES PAGE IS SHARED
|
||
; (WILL BE 0 FOR ABS PAGE OR IF NO PAGE,
|
||
; OTHERWISE WILL BE >= 1)
|
||
|
||
NCORTY: PUSHJ P,SWTL ;DON'T LET PAGE MAPS CHANGE.
|
||
CIRPSW
|
||
SOSG W ;IF 1 ARG, USE -1 (SELF) FOR JOB SPEC.
|
||
SKIPA B,[-1]
|
||
EXCH A,B ;ELSE 1ST ARG IS JOB SPEC.
|
||
MOVE J,B
|
||
JSP T,NCRUI2 ;DECODE THE JOB SPEC IN J,
|
||
JFCL ;RETURNS USR IDX IN J.
|
||
TDNE A,[-400]
|
||
JRST OPNL33 ;BAD PAGE NUM.
|
||
PUSHJ P,NCORT0 ;DO THE ACTUAL WORK.
|
||
PUSHJ P,LSWPOP ;UNLOCK CIRPSW,
|
||
JRST POPJ1 ;GIVE VALUES TO USER, SKIP.
|
||
|
||
;CALL HERE FROM AUSET5 (ALWAYS COMES WITH CIRPSW LOCKED)
|
||
NCORT0: PUSH P,U
|
||
IFN PDP6P,[
|
||
CAIN J,-1
|
||
JRST [ SETZB B,D ;DON'T CALL UPLC IF PDP6, WOULD CRASH SYSTEM
|
||
MOVEI C,PDP6BM_-12(A)
|
||
CAIL A,LPDP6M
|
||
TDZA A,A
|
||
MOVSI A,%CBRED+%CBWRT
|
||
JRST POPUJ ]
|
||
];PDP6P
|
||
MOVEI U,(J) ;UPLC USES USER IN U.
|
||
PUSHJ P,UPLC ;NOTE PAGE NUM IS IN A.
|
||
LDB J,T ;GET PAGE'S HARDWARE HALFWD,
|
||
LDB C,Q ;GET CIRC. LIST POINTER.
|
||
JUMPE C,NCORTE ;J IF NO PAGE THERE.
|
||
MOVEI A,(J)
|
||
TRNE A,600000 ;GET ACCESS INTO A 1.1-1.2
|
||
LDB A,[200200,,A]
|
||
CAIN A,2 ;CHANGE READ-WRITE-FIRST TO READ-WRITE.
|
||
MOVEI A,3
|
||
ROT A,-2 ;SHIFT INTO 4.8-4.9
|
||
CAIN C,-1
|
||
JRST NCORTA ;J IF ABSOLUTE PAGE(CIRC PTR -1)
|
||
PUSHJ P,CHACK ;PG MUST HAVE REAL CIRC LIST, TRACE IT.
|
||
EXCH C,D ;D HAD MMP IDX; C HAD IN-CORE,,LIST LENGTH.
|
||
ADD C,MMPEAD
|
||
SKIPGE C,(C) .SEE MMPPUB
|
||
TLO A,%CBPUB
|
||
TLNE C,MMPLOK
|
||
TLO A,%CBLOK
|
||
TLNE C,MMPSLO
|
||
TLO A,%CBSLO
|
||
SUBI D,1 ;LIST LENGTH COUNTS THE MMP ENTRY,
|
||
SKIPGE D
|
||
SUBI D,1 ;COUNTS THE MEMBLT ENTRY IF PAGE IN CORE.
|
||
TRNN D,-2 ;RH NOW HAS # SHARERS,
|
||
JRST NCORTS ;ONLY 1 => PAGE NOT SHARED.
|
||
MOVE C,Q
|
||
MOVE B,P
|
||
PUSHJ P,UCPRL ;>1 SHARER => FIND NEXT SHARER,
|
||
400000,,.+1
|
||
MOVE P,B ;UN-SCREW STACK (UCPRL PUSHJ'D BACK)
|
||
LDB B,[101100,,T]
|
||
MOVE C,I ;2ND, 3RD VALUES USR NUM & PAGE NUM
|
||
JRST POPUJ ;OF THE NEXT SHARER.
|
||
|
||
;COME HERE IF NO PAGE WITH THAT PAGE NUM.
|
||
NCORTE: SETZB A,B
|
||
SETZB C,D ;RETURN ALL ZEROS.
|
||
JRST POPUJ
|
||
|
||
;COME HERE IF ABS PAGE, ACCESS ALREADY IN A.
|
||
NCORTA: SETZB B,D ;JOB # 0 (SYS JOB) FOR ABS PAGE.
|
||
LDB C,[PMRCAD,,J] ;GET ABS PAGE NUM FROM HARDWARE HALFWD.
|
||
JRST POPUJ
|
||
|
||
;COME HERE IF UNSHARED NORMAL PAGE.
|
||
;ACCESS ALREADY IN A, 4TH VALUE IN D.
|
||
NCORTS: SETO B, ;2ND VALUE -1 FOR UNSHARED.
|
||
SETZ C,
|
||
JRST POPUJ
|
||
|
||
;CORBLK CALL
|
||
;1ST ARG FLAG BITS: (RH XOR'D INTO LH BEFORE DECODING)
|
||
|
||
%CB==0,,525252
|
||
%CBWRT==400000 ; 4.9 GET WRITE ACCESS IF OK, DON'T FAIL IF NOT.
|
||
%CBRED==200000 ; 4.8 GET READ ACCESS
|
||
%CBNDW==100000 ; 4.7 GET WRITE ACCESS, FAIL IF CAN'T.
|
||
%CBPUB==40000 ; 4.6 MAKE PAGE PUBLIC
|
||
%CBPRV==20000 ; 4.5 MAKE IT PRIVATE (BOTH FAIL IF COULDN'T GET WRITE ACCESS)
|
||
%CBNDR==10000 ; 4.4 FAIL IF CAN'T GET READ ACCESS.(COPYING NONEXISTANT PAGE)
|
||
%CBCPY==4000 ; 4.3 MAKE COPY (CURRENTLY ONLY IMPLEMENTED FOR PAGE OF FILE)
|
||
%CBLOK==2000 ; 4.2 LOCK PAGE IN CORE.
|
||
%CBULK==1000 ; 4.1 UNLOCK PAGE (ALLOW SWAP-OUT)
|
||
%CBSLO==400 ; 3.9 MAY ONLY RESIDE IN SLOWEST MEMORY
|
||
%CBUSL==200 ; 3.8 ALLOWS USE OF ANY MEMORY.
|
||
;IF ALL 0, DELETE.
|
||
|
||
%CBNWP==563600 ;BITS THAT NEED WRITE-PERMISSION.
|
||
|
||
;2ND ARG SPECIFIES JOB TO PUT PAGE IN
|
||
; IS EITHER CHNL NUM, -1 FOR SELF, OR 400000+USRNUM
|
||
;JOB SPECIFIED MUST BE CURRENT JOB OR INFERIOR.
|
||
|
||
;3RD ARG RH. IS PAGE NUM. IN IT.
|
||
; LH. IF NEGATIVE, BLOCK MODE, REPEAT THAT MANY TIMES,
|
||
; INCREMENTING BOTH PAGE NUMS EACH TIME.
|
||
;IN BLOCK MODE, REWRITES 3RD AND 5TH ARGS EACH TIME.
|
||
|
||
;4TH ARG IS SOURCE OF PAGE,
|
||
; A DISK CHANNEL NUMBER (GET N'TH PAGE IN FILE), OR
|
||
; A <JOB> SPEC:
|
||
; A USR, JOB, BOJ, OR STY CHANNEL NUMBER
|
||
; OR ONE OF THE FOLLOWING SPECIAL CODES:
|
||
%JS==,-1
|
||
%JSNUM==400000 ;400000+JOB NUMBER => THAT JOB
|
||
%JSSUP==400377 ;CURRENT JOB'S SUPERIOR
|
||
%JSELF==,,-1 ;SELF
|
||
%JSTVB==,,-2 ;TV11 VIDEO BUFFER IN FIRST 8 PAGES, 1ST WD OF 9TH PG IS CONSOLE REG
|
||
%JSNUL==,,-3 ;NULL JOB (NOT VALID FOR CORBLK)
|
||
%JSALL==,,-4 ;ALL JOBS (NOT VALID FOR CORBLK)
|
||
%JSNEW==,,-5 ;FRESH PAGE
|
||
%JSABS==,,-6 ;ABSOLUTE PAGE (PHYSICAL MEMORY)
|
||
; JOB 0 = SYSTEM JOB = EXEC VIRTUAL ADDRESS SPACE
|
||
; JOB 1 = CORE JOB = FRESH PAGE (OBSOLESCENT, USE %JSNEW, EVENTUALLY WILL GO AWAY)
|
||
;IF NO 4TH ARG, SAME AS 2ND
|
||
|
||
;5TH ARG IS PAGE NUM IN SOURCE (IGNORED FOR FRESH PAGE)
|
||
;IF NO 5TH ARG, SAME AS 3RD IF 4TH ARG SPECIFIES JOB.
|
||
|
||
;IF 4TH ARG SPECS FILE, USE CURRENT ACCESS PNTR
|
||
;IF INSERTING DISK PAGES, THE ACCESS PTR WILL BE
|
||
;POSITIONED AT THE BEGINNING OF THE PAGE AFTER THE LAST PAGE INSERTED.
|
||
|
||
;BITS IN REGS R AND I:
|
||
NCOR$P==400000 ;SOURCE USER ISN'T WRITEABLE. PAGES ARE, IFF PUBLIC.
|
||
NCOR$Q==200000 ;SOURCE IS A DISK FILE.
|
||
|
||
;CORBLK - COMMENTS ON PRECEDING PAGE.
|
||
NCORBL: TSC A,CTLBTS(U)
|
||
TLC A,(A) ;WIN FOR IMMEDIATE FIRST ARG
|
||
HRRZM C,SRN3(U) ;SAVE PTRS TO 3RD, 5TH ARGS IN SRN3, SRN4 RESPECTIVELY
|
||
TLNE C,1000
|
||
TLZA C,-1
|
||
UMOVE C,(C)
|
||
SKIPGE C ;IF WILL REWRITE,CHECK FOR PURE
|
||
XCTR XRW,[MOVES @SRN3(U)]
|
||
HRRZM E,SRN4(U)
|
||
CAIGE W,5 ;BUT IF NO 5TH ARG, SAY SO & USE 3RD.
|
||
JRST NCORB1 ;DEFAULT E TO C,SETOM SRN4
|
||
TLNN E,1000 ;IMMEDIATE 5TH ARG LEGAL
|
||
JRST NCORB8
|
||
JUMPGE C,NCORB7 ;ONLY IF WON'T HAVE TO REWRITE IT
|
||
JRST OPNL33
|
||
|
||
NCORB1: SETOM SRN4(U)
|
||
MOVE E,C
|
||
JRST NCORB7
|
||
|
||
NCORB8: UMOVE E,(E)
|
||
SKIPGE C
|
||
XCTR XRW,[MOVES @SRN4(U)]
|
||
NCORB7: ANDI E,-1
|
||
MOVE J,B
|
||
JSP T,NCRUI1 ;GET USER INDEX OF TARGET.
|
||
JRST NCORB0 ;IF DOESN'T SKIP, CAN CERTAINLY WRITE.
|
||
CAIE J,-1 ;CAN'T STICK PAGE IN 6.
|
||
JSP T,NCORWR ;ELSE CHECK.
|
||
JRST OPNL31 ;CANT WRITE SO CANT STICK PAGE IN
|
||
NCORB0: MOVEI TT,(J) ;SAVE DEST. USER IDX.
|
||
CAIN TT,(U) ;IF NOT ACTING ON SELF, PCLSR TARGET JOB.
|
||
JRST NCORC1
|
||
EXCH A,TT
|
||
PUSHJ P,RPCLSR
|
||
PUSHJ P,LSWPOP ;SOS DIELOK(A)
|
||
MOVEM A,SRN5(U)
|
||
MOVSI T,BSSTP ;BUT LEAVE BSSTP SET INSTEAD OF RH
|
||
IORM T,USTP(A)
|
||
SOS USTP(A) ;BECAUSE CORE JOB WANTS RH TO BE CLEAR
|
||
EXCH A,TT
|
||
PUSHJ P,LOSSET ;UNDO SETTING OF BSSTP IF WE PCLSR OR FAIL
|
||
NCORFS
|
||
CAIA
|
||
NCORC1: PUSHJ P,LSWPOP ;SOS DIELOK(TT)
|
||
;DROPS THROUGH.
|
||
|
||
;DROPS THROUGH. ALSO COME HERE FROM ACBLK.
|
||
;TARGET DECODED AND STOPPED IF NEC.; USER IDX IN TT.
|
||
; NOW DECODE SOURCE IF NEC.
|
||
NCORB9: PUSHJ P,SWTL
|
||
CIRPSW
|
||
TLNE A,%CBNDW ;FORCE WRITE => WRITE.
|
||
TLO A,%CBWRT
|
||
JUMPE A,NCORD ;0 ACCESS WANTED => DELETE PAGES.
|
||
TLO A,%CBRED ;NOT DELETE, WANT AT LEAST READ ACCESS.
|
||
CAIGE W,4 ;IF HAD 4TH ARG, DECODE,
|
||
JRST NCORC2 ;ELSE USE DECODED 2ND (STILL IN J).
|
||
HRRZ J,D
|
||
CAIE J,%JSNEW
|
||
CAIN J,%JSABS
|
||
JRST NCORC2 ;SPECIAL NON-JOB SOURCE, SKIP DECODE
|
||
IFN N11TYS,[
|
||
CAIN J,%JSTVB
|
||
JRST [ SKIPN TEN11F ;TV11 SOURCE
|
||
SKIPL TT11P
|
||
JRST OPNL10 ;DEVICE NOT AVAIL
|
||
JRST NCORC2]
|
||
]
|
||
MOVE J,D
|
||
JSP T,NCRUI1 ;GET SOURCE USR IDX
|
||
JRST NCORB2
|
||
JRST NCORC0
|
||
TLNN H,%CLSQ ;COME HERE IF ARG IS RANDOM IO CHANNEL.
|
||
JRST OPNL34 ;NOT DSK => NO GOOD.
|
||
MOVE R,J ;2 SKIPS => DISK CHNL; PUT ITS # IN R.
|
||
TLO R,NCOR$Q ;INDICATE DISK CHNL
|
||
MOVSI T,%QAACC
|
||
TDNE T,QSRAC(R) ;INSURE THAT %QAACC WILL BE ON IF OUR
|
||
JRST NCORQD
|
||
IORM T,QSRAC(R) ;CALL TO QFNTR FINDS EOF.
|
||
MOVE T,QFBLNO(R) ;IF %QAACC WAS 0, THEN QRADAD ISN'T SET UP.
|
||
MOVEM T,QRADAD(R)
|
||
NCORQD: SETOM NCORQC ;1ST TIME THRU NCORL LOOP COMING UP.
|
||
CAIGE W,5
|
||
JRST NCORL
|
||
MOVE T,E ;DON'T SMASH E, WILL BE WRITTEN BACK TO USER
|
||
LSH T,10. ;5TH ARG GIVES PAGE ADDRESS IN FILE FOR DISK CHNL
|
||
IMULI T,@QSBYTE(R)
|
||
MOVEM T,QRADAD(R) ;SET ACCESS PTR OF DSK CHNL -> SPEC'D PAGE.
|
||
JRST NCORL
|
||
|
||
NCORC0: TLNN A,%CBNWP ;IF REQUIRE ALTERATION,
|
||
JRST NCORB2
|
||
JSP T,NCORW1 ;IF CAN'T WRITE THAT JOB,
|
||
HRLI J,NCOR$P ;SET FLAG TO CHECK FOR PUBLIC.
|
||
NCORB2: CAIE J,-1 ;IF NOT PDP6,
|
||
PUSHJ P,LSWPOP ;SOS DIELOK(J)
|
||
CAIN J,LUBLK ;IF SOURCE IS CORE JOB (EVENTUALLY DELETE THESE TWO LINES)
|
||
MOVEI J,%JSNEW ; THAT MEANS GET FRESH PAGE
|
||
NCORC2: MOVE R,J
|
||
CAIN R,%JSNEW ;FRESH PAGE IMPLIES WRITING
|
||
TLO A,%CBNDW+%CBWRT
|
||
|
||
;DROPS THROUGH
|
||
|
||
;DROPS IN
|
||
|
||
;NOW HAVE TARGET IDX IN TT, SOURCE IN R (USER INDEX, -1 FOR
|
||
; PDP6, %JSTVB, %JSNEW, OR %JSABS).
|
||
;TARGET PAGNUM IN C; SOURCE IN E (MAYBE INVALID).
|
||
;R 4.9 => WRITE REQUIRES PUBLIC PAGE.
|
||
;R 4.8 => R HAS DISK CHNL (AND NCORQC IS -1 THE 1ST TIME AROUND)
|
||
;DECIDE WHAT KIND PAGE WANTED AND FIND IT.
|
||
;CIRPSW MUST BE ON TOP OF LSWPR. IT WILL BE
|
||
;UNLOCKED EVENTUALLY (AND ALSO 1 MORE UNDERNEATH IT
|
||
;IF THE TARGET JOB ISN'T US). FAILURE DOES A LSWCLR.
|
||
NCORL: MOVEI I,(R) ;I WILL HAVE USR IDX FOR ACTUAL PAGE.
|
||
HLRS A ;RH OF A WILL GET ACCESS TO BE GRANTED.
|
||
TRNE C,-400 ;CHECK DEST PAGE NUM IN RANGE.
|
||
JRST OPNL33
|
||
|
||
PUSH P,U
|
||
PUSH P,C
|
||
TLNE R,NCOR$Q
|
||
JRST NCORQ1 ;DISK FILE
|
||
IFN PDP6P,[
|
||
CAIN I,-1
|
||
JRST NCORE4 ;-1 => PDP6 PAGE.
|
||
]
|
||
IFN N11TYS,[
|
||
CAIN I,%JSTVB
|
||
JRST NCORV1 ;TV11
|
||
]
|
||
CAIN I,%JSNEW
|
||
JRST NCORF0 ;FRESH PAGE.
|
||
CAIN I,%JSABS
|
||
JRST NCORE1 ;ABSOLUTE PAGE.
|
||
CAIL E,400
|
||
JRST NCORE7 ;ELSE SOURCE PAGNUM MUST BE < 400
|
||
MOVEI U,(R) ;SOURCE IS A USER
|
||
NCORF2: EXCH E,A ;GET SOURCE PAGNUM IN A
|
||
PUSHJ P,UPLC;(A,U) ;FIND THE PAGE WANTED.
|
||
EXCH E,A
|
||
LDB J,Q ;UPLC RETURNS IN T,Q.
|
||
JUMPE J,NCORE6 ;FAIL OR DELETE IF HE HAS NO PAGE THERE.
|
||
CAIN J,-1
|
||
JRST NCORE5 ;IF THAT PAGE IS ABS,CHANGE TO ABS REQ.
|
||
PUSHJ P,CHACK ;A REAL PAGE, FIND MMP, PREV. PTR.
|
||
ADD D,MMPEAD
|
||
MOVE B,Q
|
||
MOVEI I,(R) ;CHACK CLOBBERS I
|
||
TLNN A,%CBNDW+%CBWRT ;IF WANTED ALTERATION, CHECK LEGAL.
|
||
JRST NCORB3
|
||
LDB J,T ;1ST OF ALL, SOURCE MUST HAVE WRITE PERM.
|
||
TRNN J,600000
|
||
LSH J,20
|
||
TRNN J,400000
|
||
JRST NCORB5
|
||
CAIN R,%JSNEW
|
||
JRST NCORF3
|
||
NCORF4: CONO PI,UTCOFF ;DSK XFER COULD COMPLETE, CHANGING INTRANSIT BIT
|
||
MOVE J,(D) ; HE HAS WRITE PERM.; GET MMP IN J.
|
||
TLNE R,NCOR$P ; CAN'T ALTER IF NEEDED PUBLIC BUT IT ISN'T.
|
||
JUMPGE J,[ CONO PI,UTCON .SEE MMPPUB
|
||
JRST NCORB5]
|
||
TLNE A,%CBPUB ;WE CAN ALTER; CHANGE PUBLIC IF REQ.
|
||
TLO J,MMPPUB
|
||
TLNE A,%CBPRV
|
||
TLZ J,MMPPUB
|
||
TLNE A,%CBLOK
|
||
TLO J,MMPLOK
|
||
TLNE A,%CBULK
|
||
TLZ J,MMPLOK
|
||
TLNE A,%CBSLO
|
||
TLO J,MMPSLO
|
||
TLNE A,%CBUSL
|
||
TLZ J,MMPSLO
|
||
MOVEM J,(D)
|
||
CONO PI,UTCON
|
||
JRST NCORB3
|
||
|
||
NCORF0: MOVEI U,(TT) ;WHEN CREATING A FRESH PAGE, HAVE TO RE-USE A PREVIOUSLY
|
||
MOVEI E,(C) ;EXISTING PAGE IF POSSIBLE, BECAUSE AFTER THE FRESH PAGE
|
||
JRST NCORF2 ;IS GIVEN, USER WILL BE PCLSR'ED AND WILL COME IN AGAIN
|
||
;LOOKING FOR A FRESH PAGE. CURRENTLY THIS CAUSES A BUG
|
||
;THAT A "FRESH PAGE" IS NOT ALWAYS ZERO.
|
||
|
||
NCORF3: CAIE C,2 ;WANT FRESH PAGE
|
||
CAMN C,[SETZ 3]
|
||
JRST .+2
|
||
JRST NCORD0 ;SHARED PAGE CAN'T SERVE AS FRESH PAGE
|
||
MOVEI I,(TT)
|
||
JRST NCORF4
|
||
|
||
;COME HERE IF REQ WRITE ON REAL PAGE BUT CAN'T GRANT.
|
||
NCORB5: CAIN R,%JSNEW
|
||
JRST NCORD0 ;JUST REPLACE WITH FRESH PAGE
|
||
TLNE A,%CBNDW+%CBPUB+%CBPRV+%CBSLO+%CBUSL+%CBLOK+%CBULK ;IF HE INSISTED, FAIL.
|
||
JRST NCORE0
|
||
TRZ A,%CBWRT ;ELSE GIVE HIM ONLY READ PERM.
|
||
;COME HERE IF PAGE EXISTS TO GIVE ACCESS AS IN A 2.8,2.9
|
||
NCORB3: HRRZ J,(P)
|
||
CAIN TT,(I) ;ARE WE REPLACING PAGE BY ITSELF?
|
||
CAME E,J
|
||
JRST NCORD0 ;NO, DELETE OLD, INSERT NEW.
|
||
LDB J,T ;REPLACING PG W/ SELF, SET ACCESS & EXIT.
|
||
TRNN J,600000
|
||
JRST NCORI1
|
||
TRNN J,400000 ;CHANGE READ TO RWF
|
||
TRC J,600000
|
||
TRNE A,%CBWRT
|
||
JRST NCORI2
|
||
MOVSI I,40000
|
||
TROE J,200000
|
||
ANDCAM I,(D)
|
||
TRZ J,400000
|
||
JRST NCORI2
|
||
|
||
NCORI1: MOVEI J,1
|
||
TRNE A,%CBWRT
|
||
TRO J,2
|
||
NCORI2: DPB J,T
|
||
POP P,C
|
||
POP P,U
|
||
JRST NCORX ;TO END OF LOOP.
|
||
|
||
NCORQ1: PUSH P,A
|
||
PUSH P,TT
|
||
PUSH P,R
|
||
MOVEI A,(R)
|
||
AOSN NCORQC ;THE 1ST TIME AROUND LOOP?
|
||
JRST NCORQ0 ;YES, ACCESS TO 1ST PAGE TO BE INSERTED.
|
||
PUSHJ P,QFNTN ;NO, JUST MOVE FORWARD 1 PAGE
|
||
JRST NCORE8 ;REACHED EOF, CAN'T INSERT PAGE
|
||
NCORQF: POP P,R
|
||
POP P,TT
|
||
POP P,A
|
||
MOVE I,R ;FOUND THE PAGE, GO INSERT IT.
|
||
JRST NCORD0
|
||
|
||
NCORQ0: MOVE Q,QRADAD(A)
|
||
PUSHJ P,QFNTR
|
||
JRST NCORE8
|
||
PUSHJ P,QUDULK ;QFNTR LEAVES IT LOCKED
|
||
AOS QSLGL(A) ;DON'T BE FOOLED BY QFNTR'S TRICK
|
||
SOS QSBI(A) ;ON THE DISK PI RTNS.
|
||
JRST NCORQF
|
||
|
||
NCORE8: POP P,R
|
||
POP P,TT
|
||
POP P,A
|
||
NCORE6: CAIN R,%JSNEW ;COPY NONEXISTANT PAGE
|
||
JRST NCORD0 ;JUST PUT IN A FRESH PAGE
|
||
HRRI A,0 ;CHANGE TO DELETE RQ.
|
||
TLNN A,%CBNDR+%CBNDW+%CBPUB+%CBPRV+%CBLOK+%CBULK+%CBSLO+%CBUSL
|
||
JRST NCORD0 ;IF INSIST ON ACCESS, FAIL.
|
||
NCORE0: PUSHJ P,OPNL32 ;CAN'T GRANT ACCESS OPNL.
|
||
POPCUJ: POP P,C ;FAIL OUT OF CALL.
|
||
JRST POPUJ
|
||
|
||
IFN PDP6P,[
|
||
;REQ FOR PDP6 PAGE.
|
||
NCORE4: CAIL E,LPDP6M
|
||
JRST NCORE7 ;OUT OF RANGE.
|
||
MOVEI B,PDP6BM_<-10.>(E)
|
||
JRST NCORE3 ;CONVERT TO ABS REQ, WRITE OK
|
||
]
|
||
|
||
IFN N11TYS,[
|
||
;REQ FOR TV11 PAGE.
|
||
NCORV1: CAIL E,NTVBP
|
||
JRST NCORE7
|
||
SKIPL TVCREG(TT) ;IF CONSOLE REGISTER NOT ALREADY SET UP
|
||
JRST NCORV2
|
||
MOVE B,TVVBN(TT) ;INITIALIZE IT FROM BLINKER
|
||
MOVEM B,TVCREG(TT)
|
||
CAMN TT,USER
|
||
MOVEM B,400000+TTR10*2000 ;INITIALIZE HARDWARE CONSOLE REGISTER.
|
||
NCORV2: LDB B,TTCRT(E) ;GET MAP ENTRY OUT OF EXEUMP
|
||
ANDI B,PMRCM ;MASK TO PAGE #
|
||
JRST NCORE3 ;CONVERT TO ABS REQ, WRITE OK
|
||
]
|
||
;REQ FOR ABS PAGE.
|
||
NCORE1: MOVEI B,(E)
|
||
CAIGE B,TSYSM
|
||
JRST NCORE2 ;ACCESS AVAILABLE, READ ONLY
|
||
JRST NCORE6 ;CAN'T GET ACCESS TO PAGE.
|
||
|
||
NCORE7: PUSHJ P,OPNL33 ;BAD ARG OPNL.
|
||
JRST POPCUJ
|
||
|
||
;PAGE TO COPY WAS AN ABS PAGE.
|
||
NCORE5: CAIN R,%JSNEW
|
||
JRST NCORD0 ;SUBSTITUTE A FRESH PAGE
|
||
LDB B,T ;GET ABS PAGE NUM.
|
||
TRZE B,400000 ;IF HE HASN'T WRITE PERM.
|
||
JUMPGE R,NCORE3 ;OR WE CAN'T WRITE IN HIM,
|
||
NCORE2: TRZ A,%CBWRT ;CAN'T GET WRITE,
|
||
TLNN A,%CBNDW ;FAIL IF INSIST.
|
||
NCORE3: TLNE A,%CBPUB+%CBPRV+%CBLOK+%CBULK+%CBSLO+%CBUSL
|
||
JRST NCORE0 ;OR IF TRYING TO CHANGE PUBLICNESS.
|
||
MOVE D,B ;GET JUST THE PAGE # (NOT THE ACCESS CODE)
|
||
ANDI D,PMRCM ;TO INDEX INTO TABLES WITH.
|
||
IFN TEN11P,[
|
||
LDB I,[.BP <PMRCM-377> D] ;GET MOBY #
|
||
CAIE I,T11CPA_-18.
|
||
JRST NCORE9
|
||
MOVE Q,D
|
||
SUBI Q,<T11CPA_-18.>_8
|
||
CAIL Q,256.
|
||
JRST 4,.
|
||
SKIPN I,T11MP(Q)
|
||
JRST 4,. ;SHOULDNT HAVE ABS PNTR TO NOT SET UP PAGE
|
||
AOJE I,NCOREA ;CONFLICT PAGE
|
||
LDB I,[350500,,T11MP(Q)]
|
||
CAIN I,37
|
||
JRST NCOREA ;USAGE COUNT FULL
|
||
ADDI I,1
|
||
DPB I,[350500,,T11MP(Q)]
|
||
JRST NCOREA
|
||
NCORE9:]
|
||
IFN PDP6P,[
|
||
CAIL D,PDP6BM_-10. ;IS ABS PAGE # WITHIN RANGE OF PDP6 PAGES?
|
||
CAIL D,PDP6BM_-10.+LPDP6M
|
||
JRST NCOREB
|
||
SKIPL PDP6UP ;IF SO, ALLOW PAGE COPYING, IFF PDP6 IS UP.
|
||
JRST NCORE6
|
||
JRST NCOREA
|
||
|
||
NCOREB:]
|
||
CAIL D,TSYSM
|
||
JRST NCORE6 ;DONT ALLOW POINTER TO PAGE ABOVE TOTAL SYSTEM MEMORY
|
||
LDB I,[MUR,,MEMBLT(D)]
|
||
CAIN I,MUHOLE ;DON'T GIVE ABS PAGE THAT IS NXM.
|
||
JRST NCORE6
|
||
NCOREA: MOVEI I,%JSABS ;INDICATE ABS REQ.
|
||
JRST NCORD0
|
||
|
||
EBLK
|
||
NCORQC: 0 ;COUNTS PASSES THRU NCORL, IF SOURCE IS DISK FILE.
|
||
;FORCES COMPLETE REPOSITIONING IN FILE THE 1ST TIME THRU.
|
||
BBLK
|
||
|
||
;THIS IS FOR DELETE RQS WHAT NCORL IS FOR INSERTS.
|
||
.SEE NCORL ;ABOUT CIRPSW, ACS, ETC.
|
||
;ALSO SEE COMMENTS HALFWAY DOWN THIS PAGE.
|
||
NCORD: TRNE C,-400
|
||
JRST OPNL33 ;PAGE NUM. OUT OF RANGE.
|
||
PUSH P,U
|
||
PUSH P,C
|
||
NCORD0: PUSH P,A ;COME IN HERE ON VALID INSERT RQ.
|
||
NCORD1: MOVE U,TT
|
||
HRRZ A,-1(P)
|
||
PUSH P,T
|
||
PUSH P,B
|
||
PUSHJ P,UPLC ;SAVE TIME BY CHECKING WHETHER PAGE EXISTS.
|
||
LDB B,T
|
||
SKIPE B
|
||
PUSHJ P,PAGERT ;IT EXISTS; DELETE IT.
|
||
POP P,B
|
||
POP P,T
|
||
POP P,A ;FLAG WORD
|
||
POP P,C ;TARGET PAGNUM
|
||
POP P,U
|
||
TRNN A,%CBRED+%CBWRT ;IF NO ACCESS REQ, IS DELETE, THRU.
|
||
JRST NCORX
|
||
;RH. OF A HAS ACCESS TO GRANT. LH(A) HAS ORIGINAL CONTROL BITS.
|
||
;IF I=%JSABS, ABS PAGE, NUM. IN B.
|
||
;IF I=%JSNEW, FRESH PAGE.
|
||
;IF 4.8 IN I SET, DISK PAGE POINTED TO BY CHNL IN I
|
||
;ELSE OLD PAGE, B IS BP -> CIRC LIST, T -> OLD ACCESS.
|
||
PUSH P,C ;-3
|
||
PUSH P,E ;-2
|
||
PUSH P,TT ;-1
|
||
PUSH P,A ;0
|
||
TLNE I,NCOR$Q
|
||
JRST NCORQ2 ;INSERT PAGE FROM FILE
|
||
CAIN I,%JSABS
|
||
JRST NCORA ;GO INSERT ABS PAGE
|
||
CAIE I,%JSNEW
|
||
JRST NCORR ;GO INSERT REAL PAGE.
|
||
PUSH P,R
|
||
LSH C,9 ;INSERT FRESH PAGE.
|
||
MOVEI Q,(TT) ;TARGET JOB
|
||
IDIVI TT,LUBLK ;CLOBBERS I.
|
||
IORI TT,400000(C)
|
||
HRLI TT,204000
|
||
TLNE A,%CBPUB ;MAYBE RQ PUBLIC
|
||
TLO TT,1000
|
||
PUSHJ P,NACRFL ;PUT IN CORE RQ (FREES CIRPSW)
|
||
JRST NCORF1
|
||
POP P,R
|
||
PUSHJ P,SWTL
|
||
CIRPSW
|
||
HRRZ E,-3(P) ;GET TARGET PAGE NUM
|
||
JRST NCORR2
|
||
|
||
NCORF1: SUB P,[5,,5]
|
||
JRST OPNL37 ;NO CORE OPNL.
|
||
|
||
;COME HERE IF NEED TO WAIT FOR CORE AVAILABLE FOR NEW MMP PAGE.
|
||
NCORQW: PUSHJ P,LSWPOP ;UNLOCK TUT.
|
||
PUSHJ P,LSWPOP ;AND CIRPSW, SO CORE JOB CAN OPERATE.
|
||
MOVEI T,3 ;WAIT TILL MEM HAS BEEN FREED BY CORE JOB.
|
||
CAMLE T,LMEMFR
|
||
PUSHJ P,UFLS
|
||
PUSHJ P,SWTL ;RE-LOCK CIRPSW
|
||
CIRPSW
|
||
MOVE TT,(P)
|
||
JRST NCORQB ;THEN RETRY, RELOCKING TUT.
|
||
;FIND OR CREATE MMP ENTRY FOR BLOCK <- DISK CHNL IN I.
|
||
;ACCESS TO GRANT IS IN A.
|
||
;RETURNS STUFF IN B,T ACCORDING TO COMMENT
|
||
;AFTER NCORD1 (IF NEW MMP, IT POINT TO SELF AND B -> IT)
|
||
NCORQ2: PUSH P,R
|
||
PUSH P,[NCORR3] ;RETURN TO NCORR3, SKIPPING UNLESS MMP FULL
|
||
MOVE TT,A
|
||
MOVE A,I
|
||
NCORQ7: PUSH P,TT ;ENTRY FROM NLOAD
|
||
NCORQB: MOVE I,QDSKN(A)
|
||
MOVE W,QSLGL(A)
|
||
HRL W,I
|
||
PUSHJ P,QTLOCK
|
||
TRNE TT,%CBCPY ;SPECIFIED COPY-ON-WRITE?
|
||
JRST NCORQ6 ;GET FRESH COPY OF PAGE
|
||
MOVE B,W ;ELSE TRY TO SHARE EXISTING COPY OF PAGE
|
||
IDIVI B,SHRHSL ;LOOK UP IN SHAREABLE-PAGE HASH TABLE
|
||
MOVEI B,SHRHSH-1(C)
|
||
NCORQ5: HRRZ B,1(B) ;THREAD TO NEXT MMP ENTRY IN BUCKET
|
||
JUMPE B,NCORQ6 ;END OF LIST, DESIRED PAGE NOT FOUND
|
||
HLRZ C,1(B) ;GET DISK ADDRESS OF THIS PAGE
|
||
LDB R,[$MMPUN,,(B)]
|
||
CAIN C,(W)
|
||
CAIE R,(I)
|
||
JRST NCORQ5 ;NOT THE ONE WE WANT
|
||
MOVEI R,(B) ;SET UP MMP IDX IN R
|
||
SUB R,MMPEAD ;AS GMMPP RETURNS IT.
|
||
PUSHJ P,QTULK ;TUT ALREADY AOS'ED.
|
||
MOVSI T,MMPGON
|
||
TDNE T,(B)
|
||
JRST [ MOVSI T,MMPTMP ;MMP ENTRY GOING AWAY.
|
||
TDNE T,(B) ;IF DISK TRANSFER ALSO IN PROGRESS,
|
||
JRST NCRMMW ; GO WAIT FOR THINGS TO SETTLE WITH CIRPSW FREE.
|
||
PUSH P,A
|
||
PUSHJ P,RETMM4 ;CLEAR PENDING FREEAGE
|
||
POP P,A
|
||
JRST NCORQB ] ;AND TRY AGAIN
|
||
MOVEI C,-1
|
||
HRRZ T,(B) ;GET CIRC PNTR OUT OF MMP ENTRY.
|
||
CAIL T,600000 ;SKIP IF DOESN'T POINT TO MEMORY
|
||
TDNE C,MMSWP-600000(T) ;SKIP IF IT'S A LOOSE PAGE
|
||
JRST NCORQ8
|
||
HRRZ C,MEMPNT-600000(T)
|
||
CAIE C,400000(R) ;SKIP IF NO USERS IN CIRCULAR LIST
|
||
JRST NCORQ8 ;NOT REALLY LOOSE, USERS LINKED BUT NOT CONNECTED
|
||
MOVEI C,0 ;REMOVE FROM LOOSE PAGE LIST
|
||
MOVE W,FLOOSP
|
||
NCORQ3: MOVE TT,C ;TT PREDECESSOR
|
||
SKIPN C,W ;W SUCCESSOR
|
||
JRST 4,. ;NOT IN LOOSE PAGE LIST?
|
||
LDB W,[MLO,,MEMBLT(C)]
|
||
CAIE C,-600000(T)
|
||
JRST NCORQ3
|
||
SKIPE TT
|
||
DPB W,[MLO,,MEMBLT(TT)]
|
||
SKIPN TT
|
||
MOVEM W,FLOOSP
|
||
SKIPN W
|
||
MOVEM TT,LLOOSP
|
||
SOSL NLOOSP
|
||
JRST NCORQ8
|
||
JRST 4,. ;NLOOSP WAS TOO SMALL?
|
||
|
||
NCORQ6: SOSGE MMPFR ;NEED TO CREATE NEW MMP ENTRY; COMMIT ONE
|
||
JRST [ AOS MMPFR ;MMP FULL
|
||
JRST POPTTJ ] ;TAKE ERROR RETURN
|
||
PUSHJ P,GMMPP ;GET FREE MMP ENTRY (CAN'T PCLSR AFTER THIS SUCCEEDS)
|
||
JRST NCORQW ;WAIT FOR MORE MEM
|
||
PUSHJ P,QTAOS1 ;AOS TUT FOR BLOCK (TUT ALREADY LOCKED)
|
||
HRLZM W,1(TT) ;STORE DISK ADR
|
||
MOVE D,R
|
||
IOR D,[MMPOUT+MMPWOD,,400000] ;SWAPPED OUT, MMP POINTING TO SELF
|
||
DPB I,[$MMPUN,,D]
|
||
MOVE C,(P) ;A
|
||
TRNE C,%CBCPY
|
||
TLCA D,MMPWOD+MMPISW ;COPYING, SO SET INITIAL-SWAPIN
|
||
JRST [ MOVE B,W ;NO COPYING, SO
|
||
IDIVI B,SHRHSL ;STICK INTO SHAREABLE-PAGE HASH TABLE
|
||
MOVE B,SHRHSH(C)
|
||
HRRM B,1(TT)
|
||
HRRZM TT,SHRHSH(C)
|
||
TLO D,MMPSHR ;FLAG MMP ENTRY AS IN SHRHSH TABLE
|
||
JRST .+1 ]
|
||
MOVEM D,(TT)
|
||
HRRZ B,TT
|
||
AOS NPGSWO
|
||
NCORQ8: MOVE T,[300,,[3]]
|
||
HRLI B,2200
|
||
AOS -1(P) ;SUCCESS RETURN
|
||
JRST POPTTJ
|
||
|
||
NCORA: MOVEI A,(C)
|
||
MOVE U,TT ;INSERT ABS PAGE.
|
||
PUSHJ P,UPLC ;FIND TARGET PAGE
|
||
IOR B,(P) ;COMBINE ACCESS W/ PAGE NUM.
|
||
TRZ B,PMAGEM\PMUNSD\PMCSHM
|
||
IFE KA10P,[
|
||
TRNE B,PMRCM ;PAGE 0 NOT CACHED
|
||
IORI B,PMCSHM
|
||
]
|
||
LDB D,T
|
||
TRZ D,PMAGEM ;TURN OFF REMNANT AGE BITS
|
||
JUMPN D,[JRST 4,.] ;SHOULD HAVE DELETED PAGE ALREADY
|
||
DPB B,T
|
||
MOVNI B,1 ;CIRC. PTR. IS -1.
|
||
DPB B,Q
|
||
MOVEI E,(A)
|
||
JRST NCORR2
|
||
|
||
;VIRTUAL PUSHJ AT NCORQ2
|
||
NCORR3: JRST [ SUB P,[5,,5] ;MMP WAS FULL
|
||
JRST OPNL37 ]
|
||
POP P,R ;COME HERE FOR DSK PG, AFTER FINDING MMP.
|
||
MOVE C,QRADAD(A) ;MOVE ACCESS POINTER OF FILE TO
|
||
IDIVI C,@QSBYTE(A) ;NEXT PAGE BOUNDARY, BEING CAREFUL
|
||
IORI C,1777 ;ABOUT BYTES.
|
||
AOS C
|
||
IMULI C,@QSBYTE(A) ;NEXT USE OF FILE WILL GET
|
||
MOVEM C,QRADAD(A) ;WHAT FOLLOWS PAGES MAPPED.
|
||
MOVSI C,%QAACC ;INDICATE ACCESS PTR CHANGED.
|
||
IORM C,QSRAC(A)
|
||
;COME HERE TO INSERT PG FROM OTHER USER.
|
||
NCORR: HRRZ E,-3(P) ;TARGET PAGE # C
|
||
HRRZ U,-1(P) ;TARGET JOB TT
|
||
HRRZ TT,(P) ;ACCESS (WRITE BIT IN 2.9)
|
||
PUSHJ P,NCORR1 ;ACTUALLY MUNG MAP.
|
||
NCORR2: PUSHJ P,GHUSRA ;TARGET PAGE NUM MUST BE IN E
|
||
POP P,A
|
||
POP P,TT
|
||
NCORA1: POP P,E
|
||
POP P,C
|
||
;COME HERE AFTER HANDLING 1 PAGE.
|
||
NCORX: MOVE U,USER
|
||
CLRPGM (U)
|
||
JUMPGE C,NCORX1 ;IF LH POS, DON'T REWRITE.
|
||
ADD C,[1,,1]
|
||
ADDI E,1
|
||
UMOVEM C,@SRN3(U)
|
||
SKIPL SRN4(U) ;REWRITE 5TH ARG ONLY IF WAS GIVEN.
|
||
UMOVEM E,@SRN4(U)
|
||
JUMPGE C,NCORX1
|
||
TLNN A,%CBRED
|
||
JRST NCORD ;LOOP AROUND FOR DELETE RQ
|
||
JRST NCORL ;FOR INSERT RQ.
|
||
|
||
NCORX1: AOS (P)
|
||
NCORX0: PUSHJ P,LSWPOP ;FREE CIRPSW
|
||
NCORX2: CAIN TT,(U) ;IF NOT ACTING ON SELF,
|
||
POPJ P,
|
||
JRST LSWPOP ;CAN'T FALL THRU SINCE MIGHT BE NULSET.
|
||
|
||
;THIS IS A LOSSET ROUTINE TO CLEAR THE BSSTP BIT OF THE JOB
|
||
;WHOSE INDEX IS IN THE SRN5 OF THE RUNNING JOB.
|
||
NCORFS: MOVE A,SRN5(U)
|
||
MOVSI T,BSSTP
|
||
ANDCAM T,USTP(A)
|
||
POPJ P,
|
||
;JSP T,NCORUI WITH JOB-SPEC IN J, RETURNS USER IDX IN J (OR ,,-1 FOR PDP6)
|
||
|
||
;JOB SPECS ARE:
|
||
; -1 OR ,,-1 FOR SELF.
|
||
; <CHNL-NUM> (MUST BE USR, STY, JOB OR BOJ DEVICE ELSE OPNL34)
|
||
; 400000+<USR NUM> JOB WITH THAT NUMBER (OPNL35 IF NONE)
|
||
; ( -1,,<USR NUM> ALSO WORKS)
|
||
;IF THIS JOB IS CERTAINLY ALLOWED TO MODIFY SPEC'D JOB, DOESN'T SKIP.
|
||
;IF SKIPS ONCE, MUST CHECK FARTHER. IN EITHER CASE, DIELOK OF JOB HAS BEEN AOS'D
|
||
;AND SOSSET'ED, UNLESS ENTRY POINT WAS NCRUI2, OR JOB IS PDP6.
|
||
;2 SKIPS => ARG IS RANDOM I-O CHANNEL; CLSTB ENTRY IN H.
|
||
;IN THAT CASE, NO SOSSET WAS DONE. RANDOM CHANNELS ALLOWED ONLY IF ENTRY POINT IS NCRUI1.
|
||
|
||
NCRUI2: HRLI T,200000 ;ENTRY TO SUPPRESS AOS'ING OF DIELOK, AND SOSSET'ING.
|
||
JRST NCRUI3
|
||
|
||
NCRUI1: TLOA T,400000 ;ENTRY FOR RANDOM CHNLS OK (SKIP TWICE IF SO)
|
||
NCORUI: TLZ T,400000 ;RANDOM DEVS NOT OK
|
||
TLZ T,200000
|
||
NCRUI3: TRZE J,400000
|
||
HRLI J,-1
|
||
JUMPL J,NCORU1
|
||
CAIL J,NIOCHN ;>0 => CHNL NUM.
|
||
JRST OPNL14
|
||
ADDI J,IOCHNM(U)
|
||
MOVE H,(J)
|
||
HLRZ J,H
|
||
SKIPGE H,CLSTB(H)
|
||
JRST NCORU4 ;IF INFERIOR, CAN WRITE.
|
||
TLNE H,%CLSBJ ;OR IF BOJ DEVICE
|
||
JRST [HRRZ J,JBCUI(J) ? JRST NCORU4]
|
||
TLNE H,%CLSST ;STY => USE JOB THAT HAS ASSOCIATED TTY.
|
||
JRST [ SKIPGE J,TTYSTS(J)
|
||
JRST OPNL41 ;NO JOB HAS THAT TTY.
|
||
ANDI J,-1
|
||
JRST NCORU4]
|
||
TLNE H,%CLSFU ;FOREIGN USR, MUST CHECK.
|
||
AOJA T,NCORU4
|
||
IFN PDP6P,[
|
||
TLNN H,%CLS6
|
||
JRST NCORU5 ;RANDOM DEVICE. (MAYBE DISK)
|
||
NCRUI6: MOVEI J,-1 ;PDP6, MUST CHECK.
|
||
JRST 1(T)
|
||
];PDP6P
|
||
NCORU5: JUMPL T,2(T) ;RANDOM DEVICE, SKIP TWICE IF THATS OK
|
||
JRST OPNL34
|
||
|
||
NCORU1: TRNE J,777400 ;CHECK FOR -1 FOR SELF.
|
||
JRST NCORU2
|
||
ANDI J,377
|
||
CAIN J,377 ;CHECK FOR 377 => SUPERIOR.
|
||
JRST NCORU3
|
||
IFN PDP6P,[ ;AND FOR 376 => PDP6.
|
||
CAIN J,376
|
||
JRST NCRUI6
|
||
]
|
||
IMULI J,LUBLK ;ELSE WAS USRNUM,
|
||
CAMGE J,USRHI ;CHECK FOR VALID USER
|
||
SKIPN UNAME(J)
|
||
JRST OPNL35 ;IF NOT, NO SUCH JOB.
|
||
AOJA T,NCORU4
|
||
|
||
NCORU2: CAME J,[-1,,377777]
|
||
JRST OPNL33
|
||
MOVEI J,(U)
|
||
NCORU4: CONO PI,CLKOFF
|
||
MOVE H,APRC(J) ;IS THE JOB WE'RE HACKING DIEING?
|
||
TLNE H,BULGOS
|
||
JRST OPNL42 ;YES, PREVENT TIMING ERRORS.
|
||
TLNE T,200000 ;UNLESS ENTRY POINT WAS NCRUI2,
|
||
JRST NCORU6
|
||
AOS DIELOK(J) ;PREVENT THE JOB FROM DIEING.
|
||
PUSH P,T
|
||
PUSHJ P,SOSSET
|
||
DIELOK(J)
|
||
POP P,T
|
||
NCORU6: CONO PI,CLKON
|
||
JRST (T)
|
||
|
||
NCORU3: SKIPGE J,SUPPRO(U) ;GET SUPERIOR,
|
||
JRST OPNL35
|
||
MOVEI J,(J)
|
||
AOJA T,NCORU4
|
||
|
||
;SKIP IF ALLOWED WRITE ACCESS TO PAGES FROM SOURCE IN J
|
||
;USE IF NCORUI ETC. SKIPS ONCE. CALL BY JSP T,.
|
||
|
||
NCORW1:
|
||
IFN PDP6P,[
|
||
CAIN J,-1 ;IF IT GETS THIS FAR, USER HAS A PDP6 CHANNEL,
|
||
JRST 1(T) ; THEREFORE OBVIOUSLY IS ALLOWED TO WRITE PDP6 MEMORY.
|
||
];PDP6P
|
||
CAIE J,LUBLK ;CAN GET WRITE ACCESS TO FRESH PAGE,
|
||
;SKIP IF ALLOWED TO MODIFY PAGE MAP OF TARGET JOB IN J.
|
||
NCORWR: CAIN J,(U) ;CAN DO THAT AND STICK PAGE IN SELF
|
||
JRST 1(T)
|
||
HRRZ H,SUPPRO(J)
|
||
CAIE U,(H) ;AND OUR INFERIORS
|
||
CAMN U,SERVER(J) ; and anyone who thinks we are a server
|
||
JRST 1(T)
|
||
SKIPL H,JBI(U) ;AND OUR BOJ DEVICE.
|
||
CAIE J,JBCUI(H)
|
||
JRST (T)
|
||
JRST 1(T)
|
||
|
||
;.CBLK AC,
|
||
;(OBSOLESCENT)
|
||
;AC 4.9 MUST BE ZERO
|
||
;4.7 USED INTERNALLY IN CODE (W RQ ON PDP6)
|
||
;4.3-4.1 = 0 GET PAGE FROM SELF
|
||
; = 1 GET ABSOLUTE PAGE
|
||
; = 2 GET PAGE FROM USER OPEN ON CH # 3.1-3.8
|
||
; = 3 GET PAGE FROM USER NUMBER 3.1-3.8
|
||
; = 4 GET PAGE
|
||
; = 5 GET PAGE (PUBLIC)
|
||
; = 6 MAKE PAGE PRIVATE
|
||
; = 7 MAKE PAGE PUBLIC
|
||
;3.9=1 REQUEST WRITE PERMISSION (IGNORED ON FRESH PAGE, OTHERWISE VALID ONLY FOR
|
||
; SELF OR DIRECT INFERIOR OPEN ON CH OR PUBLIC PAGE)
|
||
;3.1-3.8 USER NUMBER OR CH # (377 => CREATOR IF JOB DEVICE)
|
||
;2.9=1 INSERT PAGE, 0 DELETE (IGNORES 4.3-4.1 EXCEPT FOR 6 OR 7 WHEN IT IS IGNORED)
|
||
;2.1-2.8 VIRTUAL PAGE TO BE AFFECTED
|
||
;1.1-1.9 BLOCK # IN ABSOLUTE OR OTHER USER (OR SELF IF 4.3-4.1 = 0)
|
||
|
||
;TO CALL NCBLK, SET UP Q WITH USER INDEX REQUEST IS FOR AND U WITH
|
||
;THE USER INDEX MAKING THE REQUEST
|
||
|
||
;NEW .CBLK CODE, PASSES THE BUCK TO CORBLK.
|
||
;SAME AS FAR AS CALLER IS CONCERNED.
|
||
|
||
ACBLK: MOVE TT,U ;TARGET USR IDX.
|
||
UMOVE B,(J)
|
||
NCBLK0: MOVEI W,5 ;FAKE 5 ARGS TO NCORBL
|
||
LDB C,[111000,,B] ;TARGET PAGNUM.
|
||
LDB E,[1100,,B] ;SOURCE PAGNUM.
|
||
TRNN B,400000
|
||
JRST NCBLKD ;LIKELY TO BE DELETE RQ.
|
||
NCBLK1: MOVSI A,210000 ;NOT DELETE => RQ READ, FAIL IF CAN'T.
|
||
LDB D,[221000,,B] ;SOURCE USR IDX OR CHNL NUM.
|
||
LDB H,[330300,,B] ;REQUEST TYPE-CODE.
|
||
JRST .+1(H)
|
||
|
||
JRST NCBLKS ;TYPE 0, SOURCE IS SELF.
|
||
JRST NCBLKA ;TYPE 1, GET ABS PAGE.
|
||
JRST NCBLKC ;2, USE SPEC'D CHNL NUM.
|
||
JRST NCBLKI ;3, USE SPEC'D USR IDX.
|
||
JRST NCBLKF ;4, FRESH PAGE.
|
||
JRST NCBLKP ;5, FRESH PUBLIC PAGE.
|
||
TLOA A,420000 ;6, MAKE PRIVATE, SOURCE=TARGET.
|
||
TLO A,440000 ;7, MAKE PUBLIC, " "
|
||
MOVE E,C ;SOURCE PAGNUM _ TARGET PAGNUM,
|
||
NCBLKS: TROA D,-1 ;GET PAGE FROM SELF. (%JSELF=-1)
|
||
NCBLKA: MOVEI D,%JSABS ;GET ABS PAGE
|
||
;IF GET-FROM-CHANNEL, THE CHNL NUM IN D IS DESIRED JOB-SPEC.
|
||
NCBLKC: TLNE B,400 ;IF WRITE-RQ BIT ON,
|
||
TLO A,100000 ;INSIST ON WRITE ACCESS.
|
||
NCORBX: CAIE TT,(U) ;IF TARGET .NE. SELF,
|
||
PUSHJ P,NULSET ;FAKE OUT THOSE EXPECTING A LOSSET.
|
||
JRST NCORB9
|
||
|
||
NCBLKI: IORI D,%JSNUM ;GET FROM USR IDX, MAKE JOB SPEC.
|
||
JRST NCBLKC
|
||
|
||
NCBLKP: TLO A,40000 ;GET FRESH PUBLIC PAGE.
|
||
NCBLKF: MOVEI D,%JSNEW ;GET FRESH PAGE
|
||
JRST NCBLKC
|
||
|
||
NCBLKD: TLC B,6000 ;COME HERE IF BIT 2.9 IS 0
|
||
TLCN B,6000
|
||
JRST NCBLK1 ;(TYPES 6,7 IGNORE THAT BIT)
|
||
SETZB A,B ;OTHERWISE IS DELETE REQUEST.
|
||
JRST NCBLKS
|
||
|
||
NCBLK: MOVE B,TT
|
||
MOVE TT,Q
|
||
JRST NCBLK0
|
||
|
||
;ACTUALLY COPY A PAGE FROM ONE MAP TO ANOTHER
|
||
;T PNTR TO MAP COPYING FROM
|
||
;TT 400000 BIT 1=> WRITE
|
||
;E TARGET PAGE #
|
||
;U TARGET USER
|
||
;B PNTR TO CIRC LIST
|
||
|
||
NCORR1: LDB J,T ;ENTRY FROM NCORR
|
||
TRNN J,600000
|
||
JRST ACBK3A ;PAGE NON EXISTANT OR SWAPPED OUT
|
||
TRNN TT,400000 ;WRITE RQ ?
|
||
TRZ J,400000 ;DOESN'T RQ MORE
|
||
TRNN J,600000
|
||
TRO J,200000 ;IN CASE OF RWF
|
||
ACBK3B: MOVE A,E ;TARGET PAGE #
|
||
PUSHJ P,UPLC
|
||
LDB C,T ;GET PTW ABOUT TO BE CLOBBERED
|
||
TRZ C,PMAGEM ;TURN OFF AGE BITS
|
||
JUMPN C,[JRST 4,.] ;SHOULD HAVE DELETED PAGE BY NOW
|
||
DPB J,T ;SET UP MAP
|
||
TRNN J,600000
|
||
JRST ACBK3C ;JUMP IF PAGE SWAPPED OUT
|
||
ANDI J,PMRCM
|
||
CAIL J,TSYSM
|
||
JRST 4,.
|
||
IFE SWPWSP, AOS MMSWP(J) ;AOS NUMBER OF USERS POINTING TO PAGE
|
||
IFN SWPWSP,[
|
||
HRRZ TT,MMSWP(J)
|
||
AOS MMSWP(J) ;AOS NUMBER OF USERS POINTING TO PAGE
|
||
MOVSI C,1 ;ADJUST WORKING SET OF TARGET JOB
|
||
IDIV C,TT ;1,,0 IF DIVISION BY ZERO
|
||
ADDM C,UWRKST(U)
|
||
JUMPE TT,ACBK3D ;JUMP IF NO SHARERS
|
||
IMULI TT,1(TT) ;COMPUTE ADJUSTMENT TO ALL WORKING SETS
|
||
MOVSI C,-1 ;DUE TO INCREASE IN SHARING
|
||
IDIV C,TT
|
||
MOVE D,C
|
||
PUSH P,U
|
||
PUSH P,I
|
||
PUSHJ P,UCPRL7 ;CLOBBERS C,H,I,U
|
||
400000,,SWOP6B
|
||
POP P,I
|
||
POP P,U
|
||
];SWPWSP
|
||
ACBK3D: LDB J,B ;POINTER TO PREVIOUS IN CHAIN
|
||
DPB J,Q ;PATCH
|
||
MOVE C,U
|
||
IDIVI C,LUBLK
|
||
DPB C,[101000,,A]
|
||
DPB A,B ;PATCH
|
||
AOS NMPGS(U)
|
||
AOS SNMPGS ;SYSTEM HAS 1 MORE PAGE
|
||
POPJ P,
|
||
|
||
ACBK3A: TRNN TT,400000
|
||
TRZ J,2
|
||
TRO J,1 ;IN CASE OF R/W/F
|
||
JRST ACBK3B
|
||
|
||
ACBK3C: AOS NSWPGS(U)
|
||
AOS SNSWPG
|
||
JRST ACBK3D
|
||
ACRF1: MOVE TT,B
|
||
MOVE W,Q ;INDEX OF USER THAT REQUEST IS FOR
|
||
IDIVI W,LUBLK ;CLOBBERS H
|
||
HRL TT,W
|
||
TLNE TT,600000
|
||
JRST 4,.
|
||
JRST ACRFL
|
||
|
||
NACRFL: PUSHJ P,LSWPOP ;UNLOCK CASW OR CIRPSW
|
||
ACRFL: PCLT
|
||
SKIPL CORRQ(U) ;CURRENT USER IN U COR RQ FOR USER IN Q
|
||
PUSHJ P,UFLS ;WAIT FOR MY CORE RQ TO CORE JOB TO CLEAR
|
||
MOVSI J,BUSRCR
|
||
MOVE T,J
|
||
TDNE T,APRC(Q)
|
||
PUSHJ P,UFLS ;SOMEBODY ELSE HAS RQ IN ON THIS JOB WAIT TO CLEAR
|
||
PUSHJ P,SWTL
|
||
CASW ;GET CORE ASSIGN SW
|
||
TDNE J,APRC(Q)
|
||
JRST NACRFL ;CHECK FOR TIMING ERROR
|
||
TLNN TT,200000
|
||
JRST ACRF6 ;OLD TYPE
|
||
MOVNI J,1 ;ADDING ONE BLOCK
|
||
MOVEI B,105 ;FAKE OUT CORE TO ZERO CHECK
|
||
JRST ACRF8
|
||
|
||
ACRF6: MOVE J,HUSRAD(Q)
|
||
LSH J,-10.
|
||
CAMN J,B
|
||
JRST LSWPJ1 ;SAME AMOUNT AS NOW
|
||
MOVE T,APRC(Q)
|
||
TLNE T,BULGOS
|
||
JUMPN B,LSWPOP ;TRYING TO CORE NON-ZERO A JOB THAT IS DYING?
|
||
SUB J,B ;GET AMT OF DECREASE (- => INCREASE)
|
||
CAMGE J,[-20.]
|
||
JRST ACRF6A ;GET 20 AT A WHACK MAX
|
||
ACRF8: MOVN I,J ;I GETS POSITIVE # OF PAGES ADDED
|
||
ADD J,MEMFR
|
||
SUB J,NCBCOM ;J GETS AMT THAT WILL BE LEFT
|
||
CAIGE J,5
|
||
JUMPG I,ACRF7 ;NOT ENUF CORE
|
||
MOVEI J,0 ;INDICATE RQ WILL BE COMPLETELY SATISFIED
|
||
CAIL I,20.
|
||
MOVNI J,1 ;MAKE SURE RQ IS REALLY FILLED
|
||
ACRF5: JUMPL I,ACRF2 ;JUMP IF DECREASING CORE
|
||
JUMPE Q,ACRF3 ;SYSTEM JOB DOESN'T USE MMP
|
||
MOVN T,I
|
||
ADDB T,MMPFR ;COMMIT SUFFICIENT NUMBER OF MMP ENTRIES
|
||
JUMPGE T,ACRF3 ;JUMP IF THAT MANY ARE AVAILABLE
|
||
ADDM I,MMPFR ;MMP FULL, DECOMMIT THE MMP ENTRIES
|
||
JRST LSWPOP ;AND TAKE ERROR RETURN
|
||
|
||
ACRF2: AOSA NCRQL ;COUNT # REQUESTS FOR LESS
|
||
ACRF3: ADDM I,NCBCOM ;IF EXPANDING, COMMIT SUFFICIENT AMOUNT OF PHYSICAL CORE
|
||
MOVSI T,BUSRCR
|
||
IORM T,APRC(Q) ;CORING USER
|
||
MOVEM TT,CORRQ(U)
|
||
AOS NCORRQ
|
||
PUSHJ P,LSWPOP ;UNLOCK
|
||
IFN SCHBLN,[
|
||
CONO PI,CLKOFF ;GET CORE JOB TO RUN RIGHT AWAY
|
||
MOVE I,USER ;THEN COME RIGHT BACK TO US (WHAT A CROCK THIS ALL IS)
|
||
PUSHJ P,SCHSB
|
||
MOVEI I,LUBLK
|
||
PUSHJ P,SCHSB
|
||
CONO PI,CLKON
|
||
];SCHBLN
|
||
PCLT
|
||
SKIPL CORRQ(U) ;WILL NOT SKIP AT FIRST
|
||
PUSHJ P,UFLS
|
||
JUMPN J,ACRF1 ;REALLY NEED TO TAKE ANOTHER WACK AT THIS
|
||
JRST POPJ1
|
||
|
||
ACRF7: PUSHJ P,LSWPOP
|
||
PCLT
|
||
MOVE T,I
|
||
PUSHJ P,CFHPO3
|
||
PUSHJ P,UFLS
|
||
TLNE TT,200000
|
||
JRST ACRFL
|
||
JRST ACRF1
|
||
|
||
ACRF6A: ADDI J,20.
|
||
ADD TT,J ;GET REDUCED RQ
|
||
MOVNI J,20.
|
||
JRST ACRF8
|
||
|
||
SUBTTL CORE ALLOCATOR - CORE JOB ROUTINES
|
||
|
||
CORJI: MOVE P,USRPDL+L ;SET UP CORE JOB PDL
|
||
JRST CORJOB
|
||
|
||
CORJ2: AOSN UTBFLF
|
||
JRST UTBFF ;FLUSH UTAPE
|
||
AOSN UFDFLF
|
||
JRST UFDFF ;FLUSH 2314 UFDS
|
||
SKIPE MMPFS2
|
||
JRST RETMM2 ;FLUSH PARTIALLY-RETURNED MMP ENTRIES
|
||
SKIPE QFBTS
|
||
JRST [ PUSHJ P,QDLFBT ;RETURN DISK BLOCKS TO FREE
|
||
SOS NCORRQ
|
||
JRST CORJOB ]
|
||
SKIPE NCRQL
|
||
JRST CORJOB ;RQ'S FOR LESS HAVE COME IN. BETTER EXECUTE THEM OR MAY NOT HAVE ENUF CORE
|
||
SKIPL CORUPU
|
||
JRST CORUP ;FOUND USER IN SEARCH WHO WANTS MORE GIVE IT TO HIM
|
||
SKIPL CORSRV
|
||
JRST CORJOB
|
||
MOVE A,LMEMFR
|
||
CAMGE A,MINCOR
|
||
PUSHJ P,CFLM1 ;FREE SOME LOW MEMORY BY SHUFFLING
|
||
SKIPLE NCORRQ
|
||
SOS NCORRQ ;CAN'T FIND ANYTHING TO DO SO DECREMENT COUNT
|
||
;THIS CAN HAPPEN AS A RESULT OF EXCESS ATTEMPTED UTAPE FLUSHAGE
|
||
;OR DUE TO CALLING CFLM1
|
||
CORJOB: PUSHJ P,ACMTC ;XFER ANY "SPECIAL FREE" MEM BLOCKS TO FREE
|
||
SKIPN NCORRQ ;ANYONE WANT CORE?
|
||
PUSHJ P,[ ;IF NOT, WAIT UNTIL SOMEONE DOES, BUT FIRST
|
||
MOVE TT,QMDRO ;SEE IF MFD AND TUTS NEED TO BE READ IN
|
||
AOJE TT,IDSK
|
||
JRST UFLS ] ;WAIT
|
||
SETOM CORSRV ;INITIALIZE NO RQS SERVED THIS PASS
|
||
SETOM CORUPU
|
||
MOVNI U,LUBLK ;SCAN FOR USER WITH HIGHEST PRIORITY
|
||
CORLUP: ADDI U,LUBLK
|
||
CAML U,USRHI
|
||
JRST CORJ2 ;THRU EXAMINE RESULTS OF SEARCH
|
||
SKIPGE B,CORRQ(U)
|
||
JRST CORLUP
|
||
TLNE B,200000
|
||
JRST CORNEW
|
||
LDB Q,[221000,,B]
|
||
IMULI Q,LUBLK
|
||
MOVE A,HUSRAD(Q)
|
||
LSH A,-10. ;COMPUTE # BLKS JOB HAS NOW
|
||
CAIN A,(B)
|
||
JRST 4,CORL1 ;SAME AS NOW, CHECKED FOR AT ACORE
|
||
CAIG A,(B)
|
||
JRST CORLUG ;INCREASE
|
||
MOVEM U,CORUPU ;DECREASE HAS PRIORITY
|
||
HRRZS B
|
||
SUB B,A
|
||
MOVEM A,CORUPS
|
||
MOVEM B,CORUPA ;DIFFERENCE
|
||
MOVEM Q,CORUUC
|
||
JRST CORUP
|
||
|
||
CUSTOP: PUSHJ P,RPCLSR ;STOP USER WHO IS BEING CORED
|
||
MOVSI T,BUCSTP ;(THE BUCK STOPS HERE)
|
||
IORM T,USTP(A)
|
||
PUSHJ P,UPCLSR
|
||
MOVEI T,-1 ;GET MASK FOR RH
|
||
TDNE T,USTP(A) ;WAIT FOR RANDOM STOPS TO CLEAR
|
||
PUSHJ P,UFLS
|
||
POPJ P,
|
||
|
||
;Core job initializes disks while system job stands around and supervises
|
||
;This makes it possible for system job to print any resulting error messages
|
||
;Provided no one hits ^Z too soon
|
||
IDSK: MOVE I,MDSK
|
||
MOVE U,USER
|
||
PUSHJ P,QMCH1
|
||
MOVSI I,-NQS
|
||
SKIPL QACT(I)
|
||
PUSHJ P,QTCH1
|
||
AOBJN I,.-2
|
||
MOVSI TT,SCLIDK ;System is up now
|
||
IORM TT,SUPCOR
|
||
JRST CORJI
|
||
|
||
EBLK
|
||
|
||
CORUPU: -1 ;BEST USER SO FAR TO CHANGE CORE
|
||
;IF SETOMED AT CORUPR, REQUEST NOT COMPLETELY FILLED
|
||
CORUPA: 0 ;INCREASE AMOUNT(1 FOR .CBLK)
|
||
CORUPS: 0 ;CURRENT SIZE
|
||
CORUUC: 0 ;USER CORE REQ ACTUALLY FOR
|
||
CORSRV: -1 ;0 => RQ SRVED THIS TIME THRU USER VARS
|
||
NCRQL: 0 ;# RQS FOR LESS
|
||
|
||
BBLK
|
||
|
||
CORLUG: HRRZS B ;GUY WANTS MORE GIVE GUY WHO WANTS LEAST PRIORITY
|
||
SUB B,A
|
||
CORLUH: MOVE A,NMPGS(Q)
|
||
SKIPGE CORUPU
|
||
JRST CORLG1 ;FIRST
|
||
CAMGE B,CORUPA ;IS RQ SMALLER?
|
||
JRST CORLG1
|
||
CORLG2: CAME B,CORUPA ;OR IF TIE GIVE IT TO GUY WHO IS SMALLER NOW
|
||
JRST CORG1A
|
||
CAML A,CORUPS ;IS RQ= & SIZE SMALLER?
|
||
JRST CORG1A
|
||
CORLG1: MOVEM U,CORUPU ;HIGHEST PRIORITY SO FAR
|
||
MOVEM B,CORUPA
|
||
MOVEM A,CORUPS
|
||
MOVEM Q,CORUUC
|
||
CORG1A: JRST CORLUP
|
||
|
||
CORNEW: LDB Q,[1100,,B] ;.CBLK TYPE RQ
|
||
IMULI Q,LUBLK
|
||
MOVEI B,1
|
||
JRST CORLUH
|
||
|
||
CORUP: ;EXECUTE REQUEST
|
||
MOVE U,CORUUC
|
||
MOVEM U,CUSER
|
||
SKIPL D,CORUPU
|
||
SKIPN UNAME(U)
|
||
JRST 4,.
|
||
MOVE A,CORUUC
|
||
JUMPE A,CORUP8 ;DONT USTOP SYS JOB
|
||
PUSHJ P,CUSTOP ;STOP GUY
|
||
CORUP8: PUSHJ P,SWTL
|
||
CIRPSW
|
||
MOVE TT,CORRQ(D)
|
||
TLNE TT,200000
|
||
JRST CORUPN ;.CBLK TYPE
|
||
MOVE B,CORUPS
|
||
MOVE A,B ;A HAS CURRENT SIZE
|
||
ADD B,CORUPA ;B HAS NEW SIZE
|
||
PUSHJ P,SWTL
|
||
MEMFRZ
|
||
SKIPL J,CORUPA
|
||
JRST CORM1C ;WANTS MORE THAN NOW
|
||
CORL2: LDB A,[121100,,HUSRAD(U)]
|
||
CAMG A,B
|
||
JRST CORUPR
|
||
SOS A
|
||
PUSH P,B
|
||
PUSHJ P,UPGRTN ;RETURN USER PG
|
||
POP P,B
|
||
JRST CORL2
|
||
|
||
CORUPR: MOVE U,CUSER ;FINISHED FOR NOW ANYWAY REVIVE USER
|
||
SKIPN UNAME(U)
|
||
JRST 4,.
|
||
IFN E.SP,[
|
||
CAMN U,DISUSR
|
||
PUSHJ P,E.SLPM ;LOAD PAGE MAP
|
||
]
|
||
IFN 340P,[
|
||
CAMN U,DISUSR
|
||
PUSHJ P,DCRRST ;DIS IS RUNNING BUT UPDATE UPR ETC
|
||
]
|
||
MOVSI A,BUCSTP
|
||
ANDCAM A,USTP(U) ;RESTART USER
|
||
PUSHJ P,LSWPOP ;UNLOCK MEMORY
|
||
PUSHJ P,LSWPOP
|
||
PUSHJ P,ACMTC ;XFER IN PROCESS BLOCKS TO FREE
|
||
SKIPGE U,CORUPU
|
||
JRST CORJOB ;NOT THRU WITH THIS RQ
|
||
MOVE A,CORUUC ;THRU WITH RQ
|
||
SETOM CORUPU
|
||
SKIPGE CORUPA
|
||
SOS NCRQL ;FINISHED A REQUEST FOR LESS, DECREMENT COUNT OF THEM
|
||
MOVSI TT,BUSRCR
|
||
ANDCAM TT,APRC(A) ;CLEAR RQ PENDING THIS USER FLAG
|
||
CORL1: SETOM CORRQ(U)
|
||
CLEARM CORSRV
|
||
SOSE NCORRQ
|
||
JRST CORLUP
|
||
JRST CORJOB
|
||
|
||
CORUPN: LDB A,[111000,,TT]
|
||
PUSHJ P,SWTL
|
||
MEMFRZ
|
||
PUSH P,A
|
||
PUSHJ P,UPGRTN
|
||
POP P,E
|
||
TLNE TT,4000
|
||
TRNN TT,400000
|
||
JRST 4,.
|
||
TLO E,600000+PMCSHM ;ADD FRESH PAGE
|
||
PUSH P,TT
|
||
PUSHJ P,CORGP
|
||
POP P,TT
|
||
LDB A,[111000,,TT]
|
||
PUSHJ P,UPLC
|
||
LDB B,T
|
||
TRNN B,400000
|
||
JRST 4,. ;LOSEY
|
||
MOVE C,Q
|
||
PUSHJ P,UCPRL
|
||
200000,,[ LDB B,[330100,,TT]
|
||
DPB B,[430100,,(C)]
|
||
POPJ P, ] ;SET TO DESIRED PUBLICNESS
|
||
SOS NCBCOM
|
||
JRST CORUPR
|
||
|
||
CORM1C: MOVEM J,CORCNT
|
||
CORM1A: JUMPE U,CORS2 ;SNIFFLE
|
||
CORM1B: MOVE U,CORUUC
|
||
LDB E,[121100,,HUSRAD(U)]
|
||
TLO E,600000+PMCSHM
|
||
PUSHJ P,CORGP
|
||
SOS NCBCOM
|
||
SOSLE CORCNT
|
||
JRST CORM1A
|
||
JRST CORUPR
|
||
|
||
;INSERT FRESH PAGE INTO USR MEM IN PLACE SPECIFIED BY E PROT BITS IN LH
|
||
;MMPFR SHOULD HAVE BEEN SOS'ED ALREADY
|
||
|
||
CORGP: JUMPN U,CORGP0 ;JUMP UNLESS GIVING PAGE TO SYS JOB
|
||
MOVE A,SJSPG ;GOBBLE PAGE RESERVED
|
||
SETZM MEMBLT(A)
|
||
CAIL A,SYSB
|
||
JRST CORGP1 ;USER VARIABLES, CLEAR IT OUT
|
||
JRST CORGP2 ;INITIAL GET OF SYSTEM, DON'T ZERO IT
|
||
|
||
CORGP0: PUSHJ P,GMMPP ;RETN MMP PNTR IN R
|
||
JRST CORGPZ
|
||
PUSHJ P,TCALL
|
||
JRST HMEMRQ ;GET MEM, HIGH IF POSSIBLE
|
||
JRST 4,.
|
||
CORGP1: PUSHJ P,CZRR
|
||
CORGP2: AOS NMPGS(U)
|
||
AOS SNMPGS ;INCR SYS PAGE COUNT (VIRT)
|
||
PUSH P,A ;REAL CORE BLOCK #
|
||
HRRZ A,E ;ADDR IN USERS MAP
|
||
PUSHJ P,UPLC
|
||
POP P,A
|
||
LDB B,Q
|
||
SETZM MMSWP(A)
|
||
JUMPE U,CORGP3 ;IF SYS JOB, DON'T TRY TO SET UP MAP
|
||
JUMPN B,[JRST 4,.] ;ALREADY HAS PAGE
|
||
AOS MMSWP(A) ;INDICATE THAT ONE USER MAP POINTS AT THIS PAGE
|
||
TSO A,E ;SET PROTECTION BITS
|
||
DPB A,T ;STORE IN USER'S MAP
|
||
MOVE C,R ;MMP IDX
|
||
TRO R,400000 ;MAKE USERS CP POINT AT MMP
|
||
DPB R,Q
|
||
IFN SWPWSP,[
|
||
MOVSI TT,1 ;INCREASE WORKING SET
|
||
ADDM TT,UWRKST(U)
|
||
];SWPWSP
|
||
ANDI A,PMRCM ;TURN ACCESS BITS BACK OFF
|
||
CORGP3: CAIL A,TSYSM
|
||
JRST 4,.
|
||
MOVEI TT,MURUSR
|
||
DPB TT,[MUR,,MEMBLT(A)] ;SET USER FIELD IN MEMBLT
|
||
MOVE TT,U
|
||
IDIVI TT,LUBLK
|
||
LSH TT,8
|
||
IOR TT,E ;PG # IN USER'S MAP
|
||
SKIPN U
|
||
MOVEI TT,600000(A) ;IF SYS JOB, MEM BLOCK POINTS AT SELF
|
||
HRRZM TT,MEMPNT(A) ;ELSE MAKE MEM BLOCK POINT AT USERS MAP
|
||
JUMPE U,GHUSRA ;IF SYS JOB, NO MMP ENTRY
|
||
DPB C,[MMMPX,,MEMBLT(A)];STORE INDEX OF MMP ENTRY IN MEMBLT
|
||
TRO A,600000
|
||
HRRM A,MMP(C) ;MAKE MMP POINT AT MEM BLOCK
|
||
PUSHJ P,CHACK ;FOR CHECKING ONLY
|
||
CAME C,[SETZ 3] ;REAL MEM, 3 ENTRIES (MMP, MEMPNT, USER)
|
||
JRST 4,.
|
||
GHUSRA: AOS E
|
||
LSH E,10. ;COMP NEW HUSRAD AFTER GETTING PAGE
|
||
TLZ E,-2 ;FLUSH PROTECT BITS (LEAVE 3.1)
|
||
CAMLE E,HUSRAD(U)
|
||
MOVEM E,HUSRAD(U)
|
||
POPJ P,
|
||
|
||
CORGPZ: PUSH P,E ;SAVE REGISTERS
|
||
PUSH P,U
|
||
PUSHJ P,CFLM2 ;TRY TO FREE UP SOME LOW MEMORY
|
||
POP P,U
|
||
POP P,E
|
||
SKIPE LMEMFR
|
||
JRST CORGP ;SHOULD WORK NOW
|
||
PUSHJ P,LSWPOP ;MEMFRZ
|
||
PUSHJ P,LSWPOP ;CIRPSW
|
||
BUG INFO,[NO CORE AVAIL FOR MMP PAGE]
|
||
PUSHJ P,UDELAY ;Break possible infinite loop if no user pgs in low mem
|
||
SKIPG MEMFR ;WAIT FOR SWAPPER TO MAKE ROOM (PANIC!)
|
||
PUSHJ P,UFLS
|
||
PUSHJ P,SWTL
|
||
CIRPSW
|
||
PUSHJ P,SWTL
|
||
MEMFRZ
|
||
JRST CORGP
|
||
|
||
PAGERT: PUSHJ P,SWTL
|
||
MEMFRZ
|
||
PUSHJ P,UPGRTN
|
||
JRST LSWPOP
|
||
|
||
UPGRTN: PUSH P,R ;RETURN VIRT PG # IN A USER IN U
|
||
PUSH P,I
|
||
PUSH P,TT
|
||
PUSH P,E
|
||
IFN XGP,[
|
||
PUSHJ P,UPLC ;SEE IF PAGE XGP LOCKED
|
||
LDB E,T
|
||
TRNN E,600000
|
||
JRST UPGRT7 ;SWAPPED OUT, OBVIOUSLY NOT XGP
|
||
ANDI E,PMRCM ;E := PHYS PAGE NO
|
||
CAIL E,TSYSM
|
||
JRST UPGRT7
|
||
IDIVI E,36.
|
||
MOVNS TT
|
||
PUSH P,T
|
||
MOVSI T,400000
|
||
LSH T,(TT)
|
||
TDNE T,XGPMTB(E)
|
||
PUSHJ P,UFLS ;WAIT FOR XGP TO CLEAR
|
||
POP P,T
|
||
UPGRT7: ]
|
||
.ELSE PUSHJ P,UPLC ;FIND PAGE IF DIDN'T ALREADY
|
||
JUMPE U,UPGRT8 ;SYS JOB, NO SWAPPING NOR MMP ENTRY
|
||
LDB B,Q
|
||
CAIN B,-1
|
||
JRST UPRABS ;ABSOLUTE PAGE
|
||
JUMPE B,RHUSRA ;DOESNT REALLY HAVE PG
|
||
PUSH P,T
|
||
PUSHJ P,CHACK
|
||
ADD D,MMPEAD ;D HAS MMP ADDRESS
|
||
UPGRTA: MOVSI T,MMPTMP
|
||
TDNE T,(D)
|
||
JRST UPGRTW ;WAIT FOR PAGE TO TRANSIT BUT UNLOCK SWITCHES
|
||
MOVNI I,1 ;ASSUME NO DISK SPACE
|
||
HLRZ A,1(D) ;SEE IF DISK SPACE ASSIGNED
|
||
JUMPE A,UPGRT5
|
||
LDB I,[$MMPUN,,(D)]
|
||
PUSHJ P,QTLOCK ;LOCK APPRO TUT
|
||
UPGRT5: POP P,T ;POINTER TO ORIG MAP ENTRY OF USER
|
||
MOVE H,(T) ;SAVE MAP WORD FOR DEBUGGING
|
||
LDB TT,T ;IF PROT BITS=0 PAGE IS SWAPPED OUT FOR PURPOSES
|
||
MOVEI E,0 ;OF USER'S SWAP OUT COUNT, EVEN IF IN CORE
|
||
DPB E,T ;CLEAR USER MAP ENTRY
|
||
TRCN TT,600000 ;IS USER MAPPED TO PAGE?
|
||
JRST UPGRT9
|
||
MOVSI E,MMPWRT ;YES, CHECK IF ACCESS BITS = RW
|
||
TRNN TT,600000
|
||
IORM E,(D) ;PAGE WRITTEN BY USER WHO HAS DETACHED IT
|
||
ANDI TT,PMRCM ;MASK TO MEM PAGE #
|
||
CAIE TT,(J)
|
||
JRST 4,. ;PTW POINTED TO WRONG PAGE
|
||
MOVSI E,MMPOUT+MMPTMP
|
||
TDNE E,(D)
|
||
JRST 4,. ;PAGE NOT IN, IN MMP
|
||
IFE SWPWSP, SOS MMSWP(J) ;ONE LESS USER POINTING AT PAGE
|
||
IFN SWPWSP,[
|
||
HRRZ E,MMSWP(TT) ;DECREASE THIS USER'S WORKING SET
|
||
MOVSI T,-1
|
||
IDIVM T,E
|
||
ADDM E,UWRKST(U)
|
||
SOS MMSWP(TT)
|
||
HRRZ E,MMSWP(TT)
|
||
JUMPE E,UPGRTB ;JUMP IF NO OTHER SHARERS, FOR SPEED AND NO ZERODIVIDE
|
||
PUSH P,C ;ADJUST OTHER SHARER'S WORKING SETS
|
||
PUSH P,D
|
||
PUSH P,I
|
||
PUSH P,U
|
||
IMULI E,1(E)
|
||
MOVSI D,1
|
||
IDIV D,E
|
||
PUSHJ P,UCPRL7 ;CLOBBERS H ALSO C,T,U,I
|
||
400000,,SWOP6F
|
||
POP P,U
|
||
POP P,I
|
||
POP P,D
|
||
POP P,C
|
||
];SWPWSP
|
||
JRST UPGRTB
|
||
|
||
;RETURNING A PAGE TO WHICH USER IS NOT CURRENTLY MAPPED (MAY BE IN OR OUT)
|
||
UPGRT9: SOS NSWPGS(U)
|
||
SOS SNSWPG ;DECR CNT OF SWAPPED OUT FOR SYS
|
||
JUMPGE C,UPGRT4 ;NO MEM IN CP S, PAGE REALLY SWAPPED OUT
|
||
;RETURNING A PAGE WHICH IS SWAPPED IN
|
||
UPGRTB: HLRE E,MMSWP(J) ;GET # EXEC PGS POINTING TO THIS
|
||
JUMPL E,[JRST 4,.] ;<0 EXEC PAGES
|
||
JUMPE E,UPGRT4 ;NO EXEC PGS POINTING TO THIS
|
||
PUSH P,J
|
||
MOVE TT,J
|
||
MOVSI T,-NEXPGS ;LOOK FOR EXEC PGS SET UP TO PNT
|
||
MOVE E,[442200,,EXEUMP] ;TO USER PAGE FLUSHED
|
||
UPGRT3: ILDB J,E
|
||
TRZN J,600000
|
||
JRST UPGRT2
|
||
ANDI J,PMRCM
|
||
CAMN TT,J
|
||
JRST UPGRT1
|
||
UPGRT2: AOBJN T,UPGRT3
|
||
IFN E.SP,[
|
||
MOVSI T,-1
|
||
TDNE T,MMSWP(TT)
|
||
PUSHJ P,E.SPRT ;SEE IF E&S HAS IT
|
||
]
|
||
IFN XGP,[
|
||
MOVSI T,-1
|
||
TDNE T,MMSWP(TT) ;FLUSH XGP TIE DOWNS AND RETURN
|
||
PUSHJ P,XGPCFL
|
||
]
|
||
POP P,J
|
||
UPGRT4: LDB T,Q ;DELINK CIRC PNTR
|
||
DPB T,B
|
||
MOVEI T,0
|
||
DPB T,Q ;CLOBBER CIRC P
|
||
SOS NMPGS(U)
|
||
SOS SNMPGS ;SYSTEM HAS 1 LESS PAGE
|
||
CAME C,[SETZ 3]
|
||
CAIN C,2
|
||
JRST MMPRTN ;RETURN MMP ENTRY SINCE PAGE NO LONGER IN USE
|
||
MMPRT4: MOVE A,J
|
||
CAMN C,[SETZ 3]
|
||
JRST MMPRT5 ;FLUSH REAL MEM
|
||
MMPRT6: SKIPL I
|
||
PUSHJ P,QTULK
|
||
RHUSRA: POP P,E
|
||
POP P,TT
|
||
POP P,I
|
||
POP P,R
|
||
RHUSR1: LDB A,[121100,,HUSRAD(U)] ;COMP HUSRAD AFTER RETURNING PAGE
|
||
JUMPE A,CPOPJ
|
||
SOS A
|
||
PUSHJ P,UPLC
|
||
LDB B,Q
|
||
JUMPN B,CPOPJ ;FOUND ACTIVE PAGE
|
||
MOVNI C,2000 ;KEEP LOOKING
|
||
ADDM C,HUSRAD(U)
|
||
JRST RHUSR1
|
||
|
||
UPGRT8: SOS NMPGS ;RETURNING PAGE FROM SYS JOB
|
||
SOS SNMPGS
|
||
DPB A,[121100,,HUSRAD(U)] ;NORMAL METHOD OF COMPUTING HUSRAD WON'T WORK
|
||
MOVNI I,1 ;NO DISK SPACE
|
||
MMPRT5: SKIPE MMSWP(A) ;MAKE SURE NO ONE (EXEC OR USER) IS POINTING AT PAGE
|
||
JRST 4,.
|
||
PUSHJ P,CMEMR ;HAS REAL MEM, CIRC LENGTH =3 SO FLUSH MEM
|
||
JRST MMPRT6
|
||
|
||
UPRABS:
|
||
IFN TEN11P,[
|
||
LDB B,T
|
||
LDB E,[.BP <PMRCM-377> B] ;GET MOBY #
|
||
CAIE E,T11CPA_-18.
|
||
JRST UPRAB1
|
||
ANDI B,377
|
||
PUSHJ P,T11DL ;DELETE PAGE REF TO TEN11 MAP
|
||
UPRAB1:]
|
||
MOVEI B,0
|
||
DPB B,Q
|
||
DPB B,T
|
||
JRST RHUSRA
|
||
|
||
IFN E.SP,[
|
||
;TT/MMSWP INDEX
|
||
E.SPRT: CAME U,DISUSR ;IS HE USING THE DISPLAY?
|
||
POPJ P, ;NO, DON'T UNTIE ANYTHING
|
||
PUSH P,H
|
||
MOVE T,TT ;FOR E.SPCH
|
||
PUSHJ P,E.SPCH ;LOOK IN E&S TABLES
|
||
SKIPA ;FOUND, INDEX IN H
|
||
JRST E.SPR2 ;NOT FOUND, DO NOTHING
|
||
MOVSI T,-1
|
||
ADDM T,MMSWP(TT) ;SOS COUNT
|
||
SETZM DISSWP(H) ;CLEAR DISPLAY MMSWP TABLE
|
||
AOS E.SNUT ;COUNT FOR UNTIES
|
||
E.SPR2: POP P,H
|
||
POPJ P,
|
||
]
|
||
UPGRT1: MOVSI J,-1
|
||
XCT EXPFT(T) ;MAYBE XFERR TO ROUTINE TO DO SOMETHING ABOUT THIS
|
||
JRST UPGRT6 ;NOT USER CONCERNED ABOUT (THERE HAD BETTER BE ANOTHER)
|
||
MOVEI J,0
|
||
DPB J,E ;CLEAR OUT EXEC PAGE ENTRY
|
||
MOVE J,USER
|
||
CLRPGM (J)
|
||
UPGRT6: CONO PI,UTCON
|
||
JRST UPGRT2
|
||
|
||
;WAIT FOR PAGE TO TRANSIT, WITH CIRPSW FREE (IN CASE SWAP READ ERROR!)
|
||
;COME HERE WITH T/MMPTMP,, D/MMP.ENTRY.ADDR
|
||
UPGRTW: MOVE B,D
|
||
NCRMMW: MOVE U,USER
|
||
PUSHJ P,LSWCLR
|
||
PCLT
|
||
TDNE T,(B)
|
||
PUSHJ P,UFLS ;WAIT FOR ACTIVE PAGE TO SETTLE DOWN
|
||
CAIE U,LUBLK ;SKIP IF CORE JOB
|
||
JRST UUOTROLL ;AS IF PCLSR'ED OUT OF WAIT FOR PAGE & CAME BACK
|
||
SETOM CORUPU ;REQUEST FOR THIS USER NOT SATISFIED
|
||
MOVE P,USRPDL+LUBLK ;CLEAN UP AND RE INIT CORE JOB
|
||
PUSHJ P,NULSET
|
||
PUSHJ P,NULSET
|
||
JRST CORUPR
|
||
|
||
EXPFT:
|
||
IFN 340P, REPEAT 2+N340PB, PUSHJ P,DISACR
|
||
REPEAT 2,JFCL ;CORJF, CORJT
|
||
IFN VIDP, REPEAT 2,PUSHJ P,SCNACR
|
||
IFN TEN11P, JRST 4,. ;TEN-11 CONTROL PAGE
|
||
JRST 4,. ;PAREP
|
||
IFN ECCMEM, JRST 4,. ;ECCPG
|
||
IFN XGP, REPEAT 3,JRST 4,.
|
||
IFN N11TYS, REPEAT NTTPG+NTVBP,JRST 4,.
|
||
IFN CHAOSP, IFN T11CHP, JRST 4,.
|
||
REPEAT NMMP,JRST 4,. ;MMP
|
||
IFN .-EXPFT-NEXPGS, .ERR LOSE AT EXPFT
|
||
;CIRCULAR MEM LIST HACKER
|
||
;CALL WITH Q CONTAINING BYTE POINTER TO CIRC PNTR IN LIST TO BE HACKED
|
||
;THE BYTE POINTER MUST POINT AT A UPGCP ENTRY (RATHER THAN MEMPNT OR MMP)
|
||
;OR THIS CODE WILL LOOP FOREVER.
|
||
;RETN BYTE PNTR IN B TO GUY WHO PNTS TO THAT PNTR
|
||
;COUNT FOR ENTRIES IN C (RH)
|
||
; 4.9 C SAYS ACTUAL MEM IN LOOP
|
||
;RETN IN D MMP INDEX
|
||
;RETURN MEM PAGE IF ANY IN J
|
||
;CLOBBERS H,I,W
|
||
|
||
CHACK: PUSH P,A
|
||
LDB J,Q ;PICK UP STARTING C. P.
|
||
SETZM C
|
||
MOVNI D,1
|
||
MOVE B,Q
|
||
CHACK1: JUMPE B,[JRST 4,.]
|
||
AOS C
|
||
CAIE J,-1 ;SKIP ON ABS PAGE
|
||
TRNE C,776000
|
||
JRST 4,. ;CIRC CHAIN TOO LONG?
|
||
TRZE J,400000
|
||
JRST CHACK3 ;MEMPNT OR MMP PNTR
|
||
LDB I,[1000,,J] ;PG #
|
||
LDB H,[101100,,J] ;USER #
|
||
IMULI H,LUBLK
|
||
SKIPE UNAME(H)
|
||
CAML H,USRHI
|
||
JRST 4,. ;POINTER TO NON-EXISTENT USER
|
||
MOVEI W,UPGCP(H)
|
||
ROT I,-1
|
||
ADDI W,(I)
|
||
HRLI W,222200
|
||
SKIPGE I
|
||
HRLI W,2200
|
||
CAMN W,Q
|
||
JRST CHACK2 ;FOUND ENTRY WHICH PNTS AT ORIGINAL ENTRY
|
||
LDB J,W
|
||
MOVE B,W
|
||
JRST CHACK1 ;KEEP LOOKING
|
||
|
||
CHACK2: MOVE J,A
|
||
JUMPL D,[JRST 4,.] ;NO MMP ENTRY ?
|
||
JRST POPAJ
|
||
|
||
CHACK3: TRZE J,200000
|
||
JRST CHACK4 ;ACTUAL CORE
|
||
CAML J,MMPMX
|
||
JRST 4,. ;GARBAGE POINTER
|
||
MOVSI B,2200 ;MMP ENTRY
|
||
HRR B,MMPEAD
|
||
ADDI B,(J)
|
||
JUMPGE D,[JRST 4,.] ;MORE THAN 1 MMP ENTRY
|
||
MOVE D,J
|
||
LDB J,B
|
||
JRST CHACK1
|
||
|
||
CHACK4: TLOE C,400000
|
||
JRST 4,. ;PAGES IS IN TWO PLACES IN CORE
|
||
CAIL J,TSYSM
|
||
JRST 4,. ;GARBAGE POINTER
|
||
MOVE A,J ;SAVE MEMBLT INDEX
|
||
MOVSI B,2200
|
||
HRRI B,MEMPNT
|
||
ADDI B,(J)
|
||
LDB J,B
|
||
JRST CHACK1
|
||
|
||
;LOOK UP PAGE IN USER MAP
|
||
;USER IN U, VIR PG # IN A
|
||
;GET PNTR TO MAP HW IN T, TO CIRC IN Q
|
||
|
||
UPLC: SKIPL A
|
||
CAIL A,400
|
||
JRST 4,. ;BAD VIRTUAL PAGE NUMBER
|
||
PUSH P,A
|
||
MOVEI Q,UPGCP(U)
|
||
MOVEI T,UPGMP(U)
|
||
ROT A,-1
|
||
ADDI T,(A)
|
||
HRLI T,222200
|
||
SKIPGE A
|
||
HRLI T,2200
|
||
ADDI Q,(A)
|
||
HLL Q,T
|
||
JRST POPAJ
|
||
|
||
;FREE THE MMP ENTRY D POINTS AT, SOSING TUT IF DISK SPACE ASSIGNED.
|
||
;I HAS DSK #, C HAS WHAT CHACK RETURNED IN C, A HAS TRACK #.
|
||
;TUT MUST BE LOCKED ALREADY. CIRPSW AND MEMFRZ SHOULD BE LOCKED.
|
||
;EXIT TO MMPRT4 OR RHUSRA
|
||
|
||
MMPRTN: MOVEM C,MMPRTC ;SAVE IN CASE OF BUG HALT LATER
|
||
JUMPL I,MMPRT3 ;NO DISK SPACE ASSIGNED
|
||
PUSH P,B
|
||
LDB B,[$MMPUN,,(D)]
|
||
CAME B,I
|
||
JRST 4,. ;WRITING WRONG DISK
|
||
MOVE H,D ;H SAVES POINTER TO MMP ENTRY
|
||
MOVE D,A ;D GETS DISK TRACK NUMBER
|
||
PUSHJ P,TUTPNT
|
||
CAIGE B,TUTMNY
|
||
SOJL B,[JRST 4,.] ;DETECT OVER-SOS
|
||
DPB B,D
|
||
EXCH D,H ;D GETS MMP PNTR, H GETS TUT BYTE PNTR
|
||
JUMPN B,MMPRT2
|
||
MOVE T,QTUTO(I)
|
||
CAML A,QSWAPA(T)
|
||
AOS QSFT(I)
|
||
CAMGE A,QSWAPA(T)
|
||
AOS QSFTS(I)
|
||
MMPRT2: MOVE T,DCHBT(I)
|
||
IORM T,QTUTO(I)
|
||
MOVE A,(D) ;ELSE DELETE MMP ENTRY NOW
|
||
SKIPGE C
|
||
JUMPN B,MMPRT0 ;IF PG IS IN FILE, AND SWAPPED IN, MAYBE WRITE OUT.
|
||
TLNN A,MMPSHR
|
||
JRST MMPRT8
|
||
HLRZ A,1(D) ;ALSO REMOVE FROM SHAREABLE PAGE TABLE
|
||
HRL A,I
|
||
IDIVI A,SHRHSL
|
||
ADDI B,SHRHSH-1
|
||
MMPRT7: MOVE A,B
|
||
HRRZ B,1(B)
|
||
JUMPE B,[JRST 4,.]
|
||
CAME B,D
|
||
JRST MMPRT7
|
||
HRRZ B,1(B)
|
||
HRRM B,1(A)
|
||
MMPRT8: POP P,B
|
||
JUMPL C,MMPRT3 ;WAS MEM IN LOOP SO NOT SWAPPED OUT FOR SYSTEM'S COUNT
|
||
SOS NPGSWO ;IT WAS SWAPPED OUT
|
||
MMPRT3: PUSHJ P,MMPRT1
|
||
SOS MMPCNT ;1 LESS IN USE
|
||
AOS MMPFR ;1 MORE FREE
|
||
JRST MMPRT4
|
||
|
||
;FLUSHING AN MMP ENTRY FOR A PAGE SHARED WITH A FILE WHICH IS CURRENTLY IN CORE.
|
||
;WE MAY WANT THIS PAGE AGAIN, SO TRY TO KEEP IT AROUND FOR A WHILE.
|
||
;BUT IF PAGE HAS BEEN MODIFIED, IMMEDIATELY SWAP IT OUT SO FILE GETS UPDATED.
|
||
|
||
MMPRT0: POP P,B
|
||
LDB C,H ;UN-SOS THE TUT
|
||
CAIGE C,TUTMNY ;DON'T OVER-AOS
|
||
AOS C
|
||
DPB C,H
|
||
PUSHJ P,QTULK
|
||
MOVEI C,.BM MLO
|
||
ANDCAM C,MEMBLT(J)
|
||
SKIPE C,LLOOSP ;ADD TO TAIL OF LOOSE PAGE LIST
|
||
DPB J,[MLO,,MEMBLT(C)]
|
||
MOVEM J,LLOOSP
|
||
SKIPN C
|
||
MOVEM J,FLOOSP
|
||
AOS NLOOSP
|
||
TLNN A,MMPWRT
|
||
JRST RHUSRA
|
||
PUSH P,U ;PAGE WAS MODIFIED, SWAP IT OUT RIGHT AWAY
|
||
CONO PI,CLKOFF ;CALL SWAPPER AT IMITATION CLOCK LEVEL
|
||
MOVEM J,SWOBK
|
||
MOVEM D,SWOMMP
|
||
AOS CIRPSW ;SWOP1A WILL SOS IT BEFORE RETURNING
|
||
PUSHJ P,SWOP1A ;WILL RETURN THE MMP ENTRY SINCE NO USERS ARE LINKED TO IT
|
||
JRST 4,. ;EXEC PAGES STILL POINT TO PAGE, ALTHOUGH UPGRTN FLUSHED THEM
|
||
CONO PI,CLKON
|
||
POP P,U
|
||
JRST RHUSRA
|
||
|
||
;HERE TO RETURN AN MMP ENTRY AND SOS THE TUT, AT P.I. LEVEL
|
||
;IF TUT OR CIRPSW IS LOCKED, PUTS ON MMPFS2 AND WAKES UP CORE JOB
|
||
;OTHERWISE, CLEARS OUT AND PUTS ON MMPFS
|
||
;A -> MMP ENTRY, CLOBBERS B,D,E,I
|
||
|
||
RETMMP: PI2SAF
|
||
LDB I,[$MMPUN,,(A)]
|
||
SKIPGE CIRPSW
|
||
SKIPGE QTUTO(I)
|
||
JRST RETMM1 ;CAN'T SET LOCKS, LET CORE JOB DO IT
|
||
RETMM0: HLRZ D,1(A)
|
||
PUSHJ P,TUTPNT ;SOS THE TUT
|
||
CAIGE B,TUTMNY
|
||
SOJL B,[JRST 4,.]
|
||
DPB B,D
|
||
JUMPN B,RETMM7
|
||
MOVE E,QTUTO(I) ;RETURNING BLOCK TO FREE, AOS APPROPRIATE FREE COUNT
|
||
HLRZ D,1(A)
|
||
CAML D,QSWAPA(E)
|
||
AOSA QSFT(I)
|
||
AOS QSFTS(I)
|
||
RETMM7: MOVSI D,MMPSHR
|
||
TDNN D,(A)
|
||
JRST RETMM6
|
||
HLRZ D,1(A) ;REMOVE FROM SHAREABLE PAGE HASH TABLE
|
||
HRL D,I
|
||
IDIVI D,SHRHSL
|
||
MOVEI D,SHRHSH-1(E)
|
||
RETMM5: MOVE E,D
|
||
HRRZ D,1(D)
|
||
JUMPE D,[JRST 4,.] ;NOT IN TABLE OR MIS-HASHED?
|
||
CAME D,A
|
||
JRST RETMM5
|
||
HRRZ D,1(D)
|
||
HRRM D,1(E)
|
||
RETMM6: MOVE D,A
|
||
SOS MMPCNT
|
||
AOS MMPFR
|
||
MMPRT1: EXCH D,MMPFS ;ADD THIS ENTRY ONTO THE FRONT OF
|
||
MOVE A,MMPFS ;THE LIST OF AVAILABLE MMP ENTRIES
|
||
MOVEM D,(A) ;CLEAR LH OF FIRST WORD OF ENTRY
|
||
SETZM 1(A) ;CLEAR SECOND WORD OF ENTRY
|
||
POPJ P,
|
||
|
||
RETMM1: MOVE D,A ;ADD THIS ENTRY TO LIST OF ONES TO HACK LATER
|
||
EXCH D,MMPFS2
|
||
HRRM D,(A) ;ONLY CLOBBER THE CIRC PNTR, WHICH POINTS TO SELF
|
||
SKIPN D
|
||
AOS NCORRQ ;LIST WAS EMPTY, AWAKEN CORE JOB
|
||
POPJ P,
|
||
|
||
;CORE JOB COMES HERE WHEN MMPFS2 IS NON-ZERO
|
||
|
||
RETMM2: SOS NCORRQ
|
||
PUSHJ P,SWTL
|
||
CIRPSW
|
||
PUSHJ P,RETMM4
|
||
PUSHJ P,LSWPOP
|
||
JRST CORJOB
|
||
|
||
RETMM4: MOVEI A,0 ;HERE, WITH CIRPSW LOCKED, TO FINISH RETURNING MMP ENTRIES
|
||
EXCH A,MMPFS2
|
||
RETMM3: JUMPE A,CPOPJ
|
||
LDB I,[$MMPUN,,(A)]
|
||
PUSHJ P,QTLOCK
|
||
HRRZ H,(A)
|
||
PUSHJ P,RETMM0
|
||
PUSHJ P,QTULK
|
||
MOVE A,H
|
||
JRST RETMM3
|
||
|
||
;GET AN MMP ENTRY, RET. IDX IN R, ADDR IN TT.
|
||
;CLEARS BOTH WDS OF MMP ENTRY. CLOBBERS NO ACS.
|
||
;SKIPS IF SUCCESSFUL. DOESN'T SKIP IF NO LOW CORE FOR NEW MMP PAGE.
|
||
;YOU BETTER ALREADY HAVE COMMITTED THE MMP ENTRY VIA SOSGE MMPFR
|
||
|
||
GMMPP: HRRZ TT,MMPFS
|
||
JUMPE TT,GMMP1 ;FREE LIST IS EMPTY
|
||
CAMGE TT,MMPEAD
|
||
JRST 4,. ;IDX GOT ON FREE LIST; SHOULD BE ADDR
|
||
MOVE R,TT
|
||
SUB R,MMPEAD
|
||
CLEARM 1(TT)
|
||
HRL TT,(TT)
|
||
CLEARM (TT)
|
||
HLRZM TT,MMPFS
|
||
AOS MMPCNT ;1 MORE MMP ENTRY IN USE.
|
||
JRST POPJ1
|
||
|
||
GMMP1: SKIPN MMPFS2
|
||
JRST GMMP4
|
||
PUSH P,A ;PROTECT ACS CLOBBERED BY RETMM4
|
||
PUSH P,B
|
||
PUSH P,D
|
||
PUSH P,E
|
||
PUSH P,H
|
||
PUSH P,I
|
||
PUSH P,T
|
||
PUSHJ P,RETMM4
|
||
POP P,T
|
||
POP P,I
|
||
POP P,H
|
||
POP P,E
|
||
POP P,D
|
||
POP P,B
|
||
POP P,A
|
||
JRST GMMPP
|
||
|
||
GMMP4: PUSH P,A ;CREATE ANOTHER PAGE-FULL OF MMP ENTRIES
|
||
PUSH P,B
|
||
PUSH P,D
|
||
PUSHJ P,TCALL
|
||
;JRST IOMQ ;ALLOCATE LOW CORE SO GETS DUMPED WITH CRASHES
|
||
JRST NMMRQ ;IOMQ LOSES BECAUSE WE GET CALLED WITH MEMFRZ LOCKED
|
||
;NMMRQ ISN'T QUITE RIGHT, BECAUSE OF NCBCOM. FIX LATER. ---
|
||
JRST GMMP3 ;NO LOW CORE AVAIL NOW
|
||
MOVEI B,MUMMP
|
||
DPB B,[MUR,,MEMBLT(A)]
|
||
MOVEI B,2000
|
||
ADDM B,MMPMX ;INCREMENT MAX ALLOWABLE ADDR OF MMP
|
||
AOS B,MMPNP
|
||
CAILE B,NMMP
|
||
JRST 4,. ;SOMEONE DIDN'T CHECK MMPFR?
|
||
MOVEM A,MMMPG-1(B)
|
||
TRO A,600000+PMCSHM
|
||
DPB A,MMPPPP-1(B) ;PUT NEW MMP PAGE INTO EXEC MAP
|
||
MOVE D,USER
|
||
CLRPGM (D)
|
||
SOS B
|
||
LSH B,10.
|
||
HRLI B,-1000
|
||
GMMP2: MOVEI D,MMP(B) ;PUT ALL ENTRIES IN PAGE ON THE FREE LIST
|
||
PUSHJ P,MMPRT1
|
||
AOS B
|
||
AOBJN B,GMMP2
|
||
POP P,D
|
||
POP P,B
|
||
POP P,A
|
||
JRST GMMPP
|
||
|
||
GMMP3: POP P,D
|
||
POP P,B
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
;HERE IF TRANSIENT CONDITION PREVENTS GRABBING PAGE RIGHT NOW
|
||
|
||
CORS18: MOVE T,LSWPR+LUBLK
|
||
CAIE T,MEMFRZ
|
||
JRST 4,.
|
||
PUSHJ P,LSWPOP ;MEMFRZ
|
||
PUSHJ P,UDELAY
|
||
PUSHJ P,ACMTC
|
||
PUSHJ P,SWTL
|
||
MEMFRZ
|
||
|
||
;GROW A JOB'S CONTIGUOUS MEMORY. USED ONLY FOR SYSTEM JOB THESE DAYS.
|
||
|
||
CORS2:
|
||
IFN XGP,[
|
||
SKIPL XGPUSR ;AVOID EXPANDING INTO XGP PAGE.
|
||
PUSHJ P,UFLS
|
||
]
|
||
LDB J,[121100,,HUSRAD(U)]
|
||
LDB E,[MUR,,MEMBLT(J)]
|
||
CAIN E,MUFR
|
||
JRST COSFR ;FREE PAGE, TAKE IT.
|
||
CAIE E,MUINP
|
||
CAIN E,MUFRT
|
||
JRST CORS18 ;WAIT UNTIL IT STABILIZES
|
||
CAIN E,MUSWPG
|
||
JRST CORS18 ;WAIT UNTIL IT GETS WHERE IT'S GOING
|
||
CAIE E,MURUSR ;USER PAGE, SHUFFLE IT AWAY.
|
||
JRST 4,. ;SHOULDN'T HAVE TO SHUFFLE SYSTEM PAGES.
|
||
|
||
;SHUFFLE A USER PAGE
|
||
CORS4: PUSHJ P,TCALL
|
||
JRST HMEMRQ ;GET FREE PAGE TO SHUFFLE IT INTO
|
||
JRST 4,. ;THERE OUGHT TO BE ONE
|
||
PUSHJ P,CORS5
|
||
JRST CBMRT
|
||
|
||
;Shuffle user page in J into page in A
|
||
;Clobbers C,D,E,H,I,Q,U,T
|
||
CORS5: MOVE D,A
|
||
SKIPGE E,MMSWP(J)
|
||
JRST 4,. ;BLOCK IS ON SWAP OUT LIST (??)
|
||
TRNN E,-1
|
||
PUSHJ P,CORS6 ;SHUFFLING A POSSIBLY LOOSE PAGE, FIX POINTERS
|
||
SETOM DLSRCH ;CAN'T BE BEING SWAPPED OUT ETC BECAUSE SWAPOUT
|
||
PUSHJ P,UCPRL7 ;BLOCKS HAVE MUR=MU23B, AND CIRPSW IS SIEZED
|
||
SETZ CORSTU ;STOP DIRECT TO MEM DEVICES AND FIX USER MAPS
|
||
TLC C,200 ;CHANGE TO 20 BIT BYTE
|
||
DPB D,C ;RELOCATE PTR TO MEMPNT ENTRY
|
||
PUSHJ P,CMOVE1 ;MOVE CONTENTS OF BLOCK
|
||
MOVSI C,-NEXPGS
|
||
MOVE T,[442200,,EXEUMP]
|
||
PUSHJ P,CORPS1 ;FIX ANY EXEC PAGE MAP PNTRS TO THIS PAGE
|
||
PUSHJ P,UCPRL4
|
||
SETZ DEVSTR ;RESTART DIRECT TO MEM DEVICES
|
||
SETZM DLSRCH ;MAPS ARE CONSISTENT AGAIN, LET USERS RUN
|
||
POPJ P,
|
||
|
||
CORSTU: PUSHJ P,DEVSTP ;STOP DIRECT-TO-MEM DEVICES
|
||
MOVE A,I ;COMPUTE USER'S MAP ENTRY LOCN
|
||
PUSHJ P,UPLC
|
||
LDB C,T
|
||
TRNN C,600000
|
||
POPJ P, ;PAGE SWAPPED IN BUT NOT YET LINKED UP
|
||
ANDI C,PMRCM
|
||
CAIE C,(J)
|
||
JRST 4,.
|
||
TLC T,2200#<PMRCAD&7700> ;CHANGE TO ADDRESS REAL CORE ADR FIELD
|
||
DPB D,T ;RELOCATE USER'S MAP
|
||
POPJ P,
|
||
|
||
COSFR: MOVE D,J
|
||
PUSHJ P,MEMMF
|
||
CBMRT: MOVEM J,SJSPG ;SAVE PAGE # RESERVED
|
||
JRST CORM1B
|
||
|
||
;CORE SHUFFLER, TO KEEP LOW MEMORY FREE
|
||
CFLM1: PUSHJ P,SWTL
|
||
CIRPSW
|
||
PUSHJ P,SWTL
|
||
MEMFRZ
|
||
PUSHJ P,CFLM2
|
||
PUSHJ P,LSWPOP ;MEMFRZ
|
||
JRST LSWPOP ;CIRPSW
|
||
|
||
CFLM2: MOVEI J,LIOBLK ;Scan through "low" memory
|
||
SKIPE MEMHPT ;Make sure there is likely to be free high mem
|
||
JRST CFLM4
|
||
AOS SWPOPR ;Kick swapper more than kicked already
|
||
POPJ P, ;And give up
|
||
|
||
CFLM3: CAIN J,128.
|
||
MOVEI J,128.+NEXPGS
|
||
CAIL J,256. ;Assume USEMDM is always on (safe assumption)
|
||
POPJ P, ;All done, couldn't find anything
|
||
CFLM4: LDB A,[MUR,,MEMBLT(J)]
|
||
CAIE A,MURUSR
|
||
AOJA J,CFLM3
|
||
PUSHJ P,TCALL
|
||
JRST HMEMRQ ;Get free page to shuffle it into
|
||
POPJ P, ;No memory free, give up for now
|
||
PUSHJ P,CORS5 ;Shuffle page into new memory
|
||
MOVE A,J ;Free old page
|
||
PUSHJ P,CMEMR
|
||
MOVE A,LMEMFR
|
||
CAMGE A,MINCOR
|
||
AOJA J,CFLM3
|
||
POPJ P, ;Freed sufficient low pages, stop now
|
||
|
||
;STOP DIRECT TO MEM DEVICES
|
||
|
||
DEVSTP:
|
||
IFN VIDP,[
|
||
CAMN U,SCNUSR ;STOP DIRECT MEM DEVICES
|
||
PUSHJ P,SCNSTC ;STOP DIRECT VIDI INPUT
|
||
]
|
||
IFN 340P\E.SP,[
|
||
CAMN U,DISUSR ;STOP DISPLAY IF THIS GUY HAS IT
|
||
PUSHJ P,DCRSTP
|
||
]
|
||
POPJ P,
|
||
|
||
;RESTART DIRECT TO MEM DEVICES
|
||
|
||
DEVSTR: CLRPGM +LUBLK ;CLEAR PAGE MAP ASSOC REGS IN HARDWARE
|
||
IFN VIDP,[
|
||
CAMN U,SCNUSR ;RESTART DIRECT MEM DEVICES
|
||
PUSHJ P,SCNRST ;RESTART DIRECT VIDI INPUT
|
||
]
|
||
IFN 340P\E.SP,[
|
||
CAMN U,DISUSR
|
||
PUSHJ P,DCRRST ;RESTART DISPLAY
|
||
]
|
||
POPJ P,
|
||
|
||
;HERE TO RELOCATE EXEC PAGES WHICH POINT TO PAGE IN J
|
||
|
||
CORPS1: MOVEI I,0
|
||
CORPS4: ILDB Q,T
|
||
TLC T,2200#<PMRCAD&7700> ;CHANGE SIZE FIELD TO ADDRESS REAL CORE ADR
|
||
ANDI Q,PMRCM
|
||
CAME Q,J
|
||
JRST CORPS3
|
||
AOS I ;COUNT # OF EXEC PGS POINTING TO THIS ONE
|
||
DPB D,T ;RELOCATE EXEC PG PNTR
|
||
CORPS3: TLC T,2200#<PMRCAD&7700> ;CHANGE SIZE BACK TO 22
|
||
AOBJN C,CORPS4
|
||
HLRZ T,MMSWP(D)
|
||
CAMN T,I ;CHECK COUNT OF EXEC PAGES
|
||
POPJ P, ;COUNTED CORRECTLY, WIN
|
||
|
||
IFN E.SP,[ ;SEE IF E&S CAN ACCOUNT FOR SOME PAGES
|
||
MOVSI Q,-MXDISP ;SET UP INDEX
|
||
CAMN J,DISSWP(Q) ;J/ OLD INDEX, D/ NEW
|
||
AOJA I,E.SX2 ;COUNT I IF FOUND, AND RECHECK COUNT
|
||
AOBJN Q,.-2 ;ELSE CONTINUE SEARCH
|
||
JRST 4,. ;NOT FOUND, BOMB
|
||
E.SX2: MOVEM D,DISSWP(Q) ;RELOCATE PAGE
|
||
AOS E.SREL ;# PAGES RELOCATED (FOR DEBUGGING)
|
||
CAMN T,I ;SKIP IF COUNT IS STILL BAD
|
||
POPJ P, ;E&S COUNT WAS CULPRIT -- HAPPY AGAIN
|
||
]
|
||
IFN XGP,[
|
||
PUSH P,A
|
||
PUSH P,B
|
||
MOVE B,J
|
||
PUSHJ P,XGPBIT
|
||
TDNE A,XGPMTB(B)
|
||
AOS I
|
||
CAMN I,T
|
||
JRST POPBAJ
|
||
]
|
||
JRST 4,. ;EXEC PGS COUNT OFF
|
||
|
||
CORS6: MOVE T,FLOOSP ;FIX POINTERS TO LOOSE PAGE BEING SHUFFLED
|
||
CORS7: SKIPN C,T
|
||
JRST CORS8
|
||
LDB T,[MLO,,MEMBLT(C)]
|
||
CAME T,J
|
||
JRST CORS7
|
||
DPB D,[MLO,,MEMBLT(C)]
|
||
CORS8: CAMN J,FLOOSP
|
||
MOVEM D,FLOOSP
|
||
CAMN J,LLOOSP
|
||
MOVEM D,LLOOSP
|
||
POPJ P,
|
||
|
||
;RUN AROUND CIRC LIST STRUCTURE
|
||
;WORD AFTER CALL IS POINTER TO ROUTINE TO BE CALLED FOR EACH ITEM IN LIST ACCORDING
|
||
;TO FLAGS IN LH: 4.9 USER PAGE (U=USER,I=PG#), 4.8 MMP (T=IDX), 4.7 MEMPNT (T=PG#)
|
||
;CALLED ROUTINE MUSTN'T CLOBBER C,H; NOR U,I IF A USER PAGE; NOR T IF MEMPNT.
|
||
;RETURNS IN C BYTE POINTER TO PLACE THAT POINTS TO
|
||
;STARTING BYTE POINTER THAT WAS IN C
|
||
;ENTRIES:
|
||
; UCPRL - STARTING BYTE POINTER IN C
|
||
; UCPRL4 - STARTING CORE PAGE # IN D
|
||
; UCPRL7 - STARTING CORE PAGE # IN J
|
||
;PDL DEEPENED BY TWO PUSH'S AND TWO PUSHJ'S.
|
||
;---WARNING--- : CLOBBERS U ------- ALSO CLOBBERS H,T,I
|
||
|
||
UCPRL7: SKIPA C,[2200,,MEMPNT(J)]
|
||
UCPRL4: MOVE C,[2200,,MEMPNT(D)]
|
||
UCPRL: MOVE H,@(P)
|
||
HRRI C,@C
|
||
TLZ C,37
|
||
PUSH P,C
|
||
PUSH P,C
|
||
JRST UCPRL5
|
||
|
||
UCPRL2: CAMN C,-1(P)
|
||
JRST UCPRL6
|
||
MOVEM C,(P)
|
||
UCPRL5: LDB T,C
|
||
JUMPE T,[JRST 4,.]
|
||
TRZE T,400000
|
||
JRST UCPRL1
|
||
LDB I,[1000,,T] ;PAGE #
|
||
LDB U,[101100,,T] ;USER #
|
||
IMULI U,LUBLK
|
||
CAML U,USRHI
|
||
JRST 4,.
|
||
SKIPGE H
|
||
PUSHJ P,(H)
|
||
MOVEI C,UPGCP(U)
|
||
ROT I,-1
|
||
ADDI C,(I)
|
||
HRLI C,222200
|
||
SKIPGE I
|
||
HRLI C,2200
|
||
JRST UCPRL2
|
||
|
||
UCPRL1: TRZE T,200000
|
||
JRST UCPRL3
|
||
CAML T,MMPMX
|
||
JRST 4,. ;MMP ADR OUT OF RANGE
|
||
MOVSI C,2200 ;MMP
|
||
HRR C,MMPEAD
|
||
ADDI C,(T)
|
||
TLNE H,200000
|
||
PUSHJ P,(H)
|
||
JRST UCPRL2
|
||
|
||
UCPRL3: CAIL T,TSYSM
|
||
JRST 4,. ;MEMBLT ADR OUT OF RANGE
|
||
TLNE H,100000 ;MEMPNT
|
||
PUSHJ P,(H)
|
||
MOVE C,[2200,,MEMPNT]
|
||
ADDI C,(T)
|
||
JRST UCPRL2
|
||
|
||
UCPRL6: MOVE C,(P)
|
||
SUB P,[2,,2]
|
||
JRST POPJ1
|
||
;DISCARD IDLE DISK UFD'S.
|
||
|
||
UFDFF: PUSHJ P,SWTL
|
||
UDRSW
|
||
MOVEI C,MEMR
|
||
PUSHJ P,QDFLS
|
||
JRST UTBFF5
|
||
|
||
;FLUSH "UTAPE" (200-WD) BUFFERS
|
||
;TRY TO COMPACTIFY INTO FEWER PAGES BY DELETING PAGES CONTAINING
|
||
;ONLY FREE ONES AND BY MOVING NETWORK BUFFERS AROUND. OTHER KINDS
|
||
;OF BUFFERS DON'T STAY AROUND VERY LONG AND ARE HARD TO MOVE
|
||
;WITHOUT INTRODUCING TIMING/PCLSR'ING BUGS.
|
||
|
||
UTBFF: PUSHJ P,SWTL
|
||
MEMFRZ
|
||
MOVSI J,-TSYSM
|
||
UTBFF3: LDB R,[MUR,,MEMBLT(J)]
|
||
CAIN R,MUIOB
|
||
PUSHJ P,UTBFF2
|
||
AOBJN J,UTBFF3
|
||
UTBFF5: SOS NCORRQ
|
||
PUSHJ P,LSWPOP
|
||
IFN CHAOSP, PUSHJ P,CHCLN ;ALSO, CLEAN UP CHAOS NET BUFFERS
|
||
IFN INETP, PUSHJ P,PKBCLN ; Clean up network packet buffers
|
||
;SWAP OUT ALL LOOSE PAGES. THE REASON THIS IS DONE IS THAT IF THE
|
||
;SYSTEM LOAD IS LIGHT LOOSE PAGES FOR DELETED INQUIR DATA BASE FILES
|
||
;CAN STAY AROUND INDEFINITELY, TYING UP DISK SPACE.
|
||
;SWAPPING OUT LOOSE PAGES DOES NOT CAUSE ANY DISK I/O.
|
||
;SWPOPG MAY NON-SKIP RETURN IF CIRPSW OR A TUT IS LOCKED,
|
||
;IN WHICH CASE WE GIVE UP UNTIL THE NEXT 2-MINUTE CLOCK.
|
||
UTBFF6: CONO PI,CLKOFF
|
||
SKIPN A,FLOOSP ;GET A LOOSE PAGE
|
||
JRST UTBFF7
|
||
MOVNI C,1
|
||
PUSHJ P,SWPOPL ;SWAP OUT EVEN IF LOCKED (SHOULDN'T BE)
|
||
JRST UTBFF7 ;COULDN'T SWAP OUT, GIVE UP FOR NOW
|
||
CONO PI,CLKON ;ALLOW CHANCE FOR AN INTERRUPT
|
||
JRST UTBFF6
|
||
|
||
UTBFF7: CONO PI,CLKON
|
||
JRST CORJOB
|
||
|
||
;RH(J) HAS PAGE NUMBER OF A BLOCK OF 200-WD BUFFERS
|
||
UTBFF2: LDB R,[MNUMB,,MEMBLT(J)] ;GET LIST OF IOBFT ENTRIES IN THIS BLOCK
|
||
CLEARB Q,TT
|
||
COSIO1: MOVSI E,200000 ;ALLOC INH ALL BUFFERS IN BLOCK
|
||
IORM E,IOBFT(R)
|
||
LDB E,[IOCH,,IOBFT(R)]
|
||
CAIE E,77
|
||
AOS Q ;COUNT NUMBER USED FOR SOMETHING
|
||
CAIL E,NFNETC
|
||
CAIL E,NFNETC+NNETCH
|
||
CAIA
|
||
AOS TT ;COUNT NUMBER USED FOR NETWORK
|
||
LDB R,[IOLC,,IOBFT(R)]
|
||
CAIE R,377
|
||
JRST COSIO1
|
||
JUMPE Q,COSIO3 ;IF ALL BUFFERS FREE, FLUSH THIS PAGE
|
||
CAME Q,TT
|
||
JRST UTBFF1 ;CONTAINS NON-NET BUFFERS, LEAVE ALONE
|
||
MOVEI E,0
|
||
EXCH E,UTTBF
|
||
CAIL E,8 ;IF THERE ARE ENOUGH FREE IN OTHER BLOCKS
|
||
JRST CISHUF ;THEN GO SHUFFLE THE NET BUFFERS
|
||
EXCH E,UTTBF
|
||
UTBFF1: LDB R,[MNUMB,,MEMBLT(J)] ;ABANDON IDEA OF FLUSHING THIS BLOCK
|
||
MOVSI E,200000 ;UN-INHIBIT THE BUFFERS..
|
||
UTBFF4: ANDCAM E,IOBFT(R)
|
||
LDB R,[IOLC,,IOBFT(R)]
|
||
CAIE R,377
|
||
JRST UTBFF4
|
||
POPJ P, ;RETURN OUT OF UTBFF2
|
||
;SHUFFLE BUFFERS
|
||
;COME HERE WITH UTTBF SET TO 0 AND OLD VALUE IN E
|
||
;LEAVE UTTBF 0 WHILE SHUFFLING SO NO ONE ELSE CAN ALLOCATE
|
||
|
||
CISHUF: PUSH P,E
|
||
LDB R,[MNUMB,,MEMBLT(J)]
|
||
CISHF1: LDB Q,[IOCH,,IOBFT(R)]
|
||
CAIN Q,77
|
||
JRST CISHF2 ;FREE, IGNORE
|
||
CAIL Q,NFNETC
|
||
CAILE Q,NFNETC+NNETCH
|
||
JRST 4,. ;SOME RANDOM UNSHUFFABLE BUFFER
|
||
PUSHJ P,CINET
|
||
CISHF2: LDB R,[IOLC,,IOBFT(R)]
|
||
CAIE R,377
|
||
JRST CISHF1
|
||
POP P,UTTBF ;ALLOW ALLOC AGAIN. THIS MEM BLOCK NOW
|
||
;CONTAINS 8 FREE, ALLOC INH BUFFERS.
|
||
;SO FALL INTO COSIO3 TO FLUSH THEM.
|
||
;FLUSH ALL 8 BUFFERS.
|
||
|
||
COSIO3: LDB R,[MNUMB,,MEMBLT(J)]
|
||
MOVEI TT,7
|
||
COSIO4: LDB Q,[IOCH,,IOBFT(R)]
|
||
CAIE Q,77
|
||
JRST 4,. ;BUFFER WAS SUPPOSED TO BE FREE??
|
||
MOVEI Q,UTFS-IOBFT ;PNTR TO F.S. LIST
|
||
SOS UTTBF ;SOON WILL BE ONE LESS FREE UTAPE BUFFER
|
||
CONO PI,UTCOFF
|
||
COSIO5: MOVE E,Q ;REMOVE IOBFT ENTRY IN R FROM F.S. LIST
|
||
LDB Q,[IOLO,,IOBFT(Q)]
|
||
CAIN Q,377
|
||
JRST 4,. ;IT WASN'T IN THE LIST
|
||
CAME Q,R
|
||
JRST COSIO5
|
||
|
||
LDB Q,[IOLO,,IOBFT(R)]
|
||
DPB Q,[IOLO,,IOBFT(E)]
|
||
MOVE A,R ;GIVE IOBFT ENTRY BACK TO LIST OF UNUSED IOBFTS
|
||
LDB R,[IOLC,,IOBFT(R)]
|
||
PUSHJ P,IOBR
|
||
CONO PI,UTCON
|
||
CAIE R,377
|
||
SOJA TT,COSIO4
|
||
|
||
JUMPN TT,[JRST 4,.] ;BLOCK DIDN'T CONTAIN 8 BUFFERS
|
||
MOVNI A,8
|
||
ADDB A,UTTLB
|
||
CAMGE A,[-NUTIC-NUTOC]
|
||
JRST 4,.
|
||
PUSHJ P,FSCMP
|
||
HRRZ A,J ;THIS BLOCK OF MEMORY IS FREE NOW
|
||
JRST CMEMR ;AND RETURN OUT OF UTBFF2
|
||
|
||
;EXCHANGE BUFFER IN R WITH SOME FREE BUFFER, RETURNED IN A
|
||
;CALL WITH UCTOFF, CHANNEL NUMBER IN Q, TURNS UTCON
|
||
|
||
COSIMG: MOVEI D,NFNETC(Q) ;CHNL NO TO CONS FOR
|
||
AOS UTTBF ;UNRESERVE ONE BUFFER MOMENTARILY
|
||
PUSHJ P,IUTCONS
|
||
JRST 4,.
|
||
CONO PI,UTCON
|
||
LDB TT,[IOSA1,,IOBFT(R)] ;TRANSFER BUFFER R TO BUFFER A
|
||
LDB T,[IOSA1,,IOBFT(A)]
|
||
HRL T,TT
|
||
LSH T,7
|
||
HRRZ TT,T
|
||
BLT T,177(TT)
|
||
EXCH R,A
|
||
CONO PI,UTCOFF
|
||
PUSHJ P,IBRTN ;RETURN THE OLD BUFFER
|
||
SOS UTTBF ;BUT RESERVE IT
|
||
EXCH R,A
|
||
JRST UTCONJ
|
||
|
||
;SHUFFLE OFF A NCP NETWORK BUFFER
|
||
;R HAS IOBFT INDEX, Q HAS CHANNEL NUMBER, E MUST BE PRESERVED
|
||
|
||
CINET:
|
||
IFE NCPP,JRST 4,.
|
||
IFN NCPP,[
|
||
SUBI Q,NFNETC ;GET IMSOC INDEX
|
||
HRRZ A,IMSOC1(Q) ;USER WHO OWNS THIS BUFFER
|
||
MOVSI T,200000
|
||
TDNE T,IMSOC1(Q) ;SKIP OVER USER STOP IF BEING CLOSED
|
||
TROA A,-1 ; SINCE USER CAN'T REFERENCE BUFFER ANY MORE
|
||
PUSHJ P,RPCLSR ;AND LEAVE A=USER # STOPPED OR 0,,-1 IF NONE
|
||
MOVSI T,200000 ;MUSTN'T BE ACTIVE AT PI LEVEL
|
||
PUSHJ P,LWAIT
|
||
TDNE T,IMSOC6(Q)
|
||
SKIPN IMSOC6(Q) ;LWAIT RETURNS WITH NETOFF
|
||
JRST CINET2 ;BUFFER HAS BEEN RETURNED
|
||
MOVSI T,400000 ;LOCK THE BUFFER SO PI LEVEL WON'T TOUCH
|
||
IORM T,IMSOC6(Q)
|
||
LDB T,[221000,,IMSOC6(Q)]
|
||
CAIE T,(R)
|
||
JRST 4,. ;IOBFT ENTRY POINTS TO WRONG CHANNEL
|
||
PUSH P,A ;SAVE INDEX OF STOPPED USER
|
||
PUSHJ P,COSIMG ;COPY BUFFER
|
||
LDB TT,[IOSA,,IOBFT(A)]
|
||
LSH TT,6
|
||
MOVE T,TT
|
||
HRRZ D,IMSOC6(Q)
|
||
SUB T,D ;OFFSET NEW BUFFER MINUS OLD
|
||
HRL TT,A
|
||
DPB TT,[003200,,IMSOC6(Q)] ;STORE NEW BUFFER ADDR, LEAVE FLAGS ALONE
|
||
ADDM T,IMSBFE(Q) ;RELOCATE VARIOUS POINTERS
|
||
ADDM T,IMSMPP(Q)
|
||
ADDM T,IMSPIP(Q)
|
||
MOVE TT,IMSOC2(Q)
|
||
TRNN TT,1
|
||
AOSA IMNISH
|
||
AOS IMNOSH
|
||
CONO PI,NETOFF
|
||
MOVE TT,IMSOC6(Q)
|
||
TLNN TT,100000 ;SKIP IF INPUT OCCURRED WITH BUFFER LOCKED
|
||
JRST CINET1
|
||
IFE DMI,[
|
||
MOVE TT,IMPSVP ;RESTART INPUT
|
||
MOVEM TT,IMPPIA
|
||
CONO IMP,(TT)
|
||
]
|
||
IFN DMI,CONO FI,FIIN+NETCHN*11
|
||
CINET1: MOVSI TT,500000 ;UNLOCK THE BUFFER, CLEAR INPUT WITH LOCK FLAG
|
||
ANDCAM TT,IMSOC6(Q)
|
||
PUSHJ P,IMPIOS ;RESTART OUTPUT
|
||
POP P,A ;AND FALL INTO CINET2 TO RESTART USER
|
||
CINET2: CONO PI,NETON
|
||
JRST NJUPCL ;RESTART USER IF ONE WAS STOPPED
|
||
] ;END IFN NCPP
|
||
|
||
;FREE BLOCKS THAT BECAME FREE AT INT LEVEL.
|
||
ACMTC: SKIPN MEMFP1 ;ANY BLKS BECAME FREE AT INT LVL?
|
||
POPJ P,
|
||
CONO PI,UTCOFF
|
||
SKIPL MEMFRZ ;IF MEMFRZ IS LOCKED, CAN'T DO THIS. JUST
|
||
JRST UTCONJ ;HOPE ENOUGH CORE IS FREE. MUST BE BETTER WAY!
|
||
MOVE A,MEMFP1 ;GET # OF ONE OF THEM,
|
||
LDB B,[MLO,,MEMBLT(A)] ;REMOVE IT FROM LIST OF SUCH BLOCKS
|
||
HRRZM B,MEMFP1
|
||
LDB B,[MUR,,MEMBLT(A)]
|
||
CAIE B,MUFRT
|
||
JRST 4,.
|
||
PUSHJ P,MEMR
|
||
JRST ACMTC
|
||
|
||
;COPY A PHYSICAL PAGE'S DATA FROM PAGE (J) TO PAGE (D)
|
||
CMOVE1: MOVE C,MEMBLT(J)
|
||
MOVEM C,MEMBLT(D)
|
||
CLEARM MEMBLT(J)
|
||
MOVE C,MEMPNT(J)
|
||
MOVEM C,MEMPNT(D)
|
||
CLEARM MEMPNT(J)
|
||
MOVE C,MMSWP(J)
|
||
MOVEM C,MMSWP(D)
|
||
HRRZ A,D
|
||
CAIGE A,SYSB
|
||
JRST 4,.
|
||
TRO D,600000+PMCSHM
|
||
TRO J,600000+PMCSHM
|
||
DPB D,[.CORJT+EXEUMP]
|
||
DPB J,[.CORJF+EXEUMP]
|
||
TRZ D,600000+PMCSHM
|
||
TRZ J,600000+PMCSHM
|
||
CLRPGM +LUBLK
|
||
MOVE A,[400000+CORJF*2000,,400000+CORJT*2000]
|
||
BLT A,400000+CORJT*2000+1777
|
||
MOVEI A,0
|
||
DPB A,[.CORJT+EXEUMP]
|
||
DPB A,[.CORJF+EXEUMP]
|
||
POPJ P,
|
||
|
||
MEMMF: LDB A,[MUR,,MEMBLT(D)]
|
||
CAIE A,MUFR
|
||
JRST 4,.
|
||
HRRZ A,D
|
||
PUSHJ P,TCALL
|
||
JRST MPOUT
|
||
POPJ P,
|
||
|
||
UDELAY: PUSH P,T
|
||
MOVE T,TIME
|
||
ADDI T,15. ;SLEEP 1/2 SEC. (REALLY SHOULD DO A LOW
|
||
CAMLE T,TIME ;PRIORITY UNBLOCK IF SYS LIGHTLY LOADED)
|
||
UDELA1: PUSHJ P,UFLS
|
||
JRST POPTJ
|
||
|
||
CZRR: PUSH P,A
|
||
CAIGE A,SYSB ;CORE ZEROER
|
||
JRST 4,.
|
||
TRO A,600000+PMCSHM
|
||
DPB A,[.CORJT+EXEUMP]
|
||
CLRPGM +LUBLK
|
||
CLEARM 400000+CORJT*2000
|
||
MOVE A,[400000+CORJT*2000,,400000+CORJT*2000+1]
|
||
BLT A,400000+CORJT*2000+1777
|
||
MOVEI A,0
|
||
DPB A,[.CORJT+EXEUMP]
|
||
JRST POPAJ
|
||
|
||
;ROUTINES TO ALLOCATE BLOCKS OF MEMORY
|
||
;CALL ONLY AT UTC LEVEL OR WITH UTC OFF
|
||
|
||
OVHMTR ALC ;CORE ALLOCATION
|
||
|
||
;SEE IF CAN ALLOCATE MEMORY
|
||
MQTEST: MOVE A,MEMFR
|
||
SUB A,NCBCOM
|
||
JUMPLE A,CPOPJ
|
||
SKIPLE MEMFR
|
||
SKIPL MEMFRZ
|
||
POPJ P,
|
||
JRST POPJ1
|
||
|
||
;ALLOCATE PREFERRING HIGH MEMORY, FOR RANDOM USER PAGE. SHUFFLEABLE PAGE OK.
|
||
HMRQC: PUSHJ P,MQTEST
|
||
POPJ P,
|
||
HMEMRQ: PUSH P,B
|
||
PUSH P,E
|
||
HRREI B,MEMHPT-MEMBLT
|
||
HMRQ3: LDB A,[MLO,,MEMBLT(B)]
|
||
JUMPE A,HMRQ1 ;HIGH HALF FULL TRY LOW
|
||
CAIL A,SYSB ;DON'T ALLOCATE PART OF THE SYSTEM
|
||
SKIPGE MEMBLT(A) ;DON'T ALLOCATE IF LOCKED
|
||
SKIPA B,A ;THIS PAGE NOT AVAIL, TRY NEXT
|
||
JRST IMRQ8 ;GOBBLE IT
|
||
JRST HMRQ3
|
||
|
||
HMRQ1: POP P,E
|
||
POP P,B
|
||
JRST NMMRQ ;THAT DIDNT WORK, TRY LOW HALF
|
||
|
||
;ALLOCATE A BLOCK OF MEM FOR 200-WORD BUFFERS
|
||
UIMRQ: MOVE A,IOBFC
|
||
CAIGE A,8
|
||
POPJ P, ;NOT ENOUGH ROOM IM IOBFT
|
||
MOVE A,MEMFR
|
||
SUB A,NCBCOM
|
||
CAIG A,3
|
||
POPJ P,
|
||
|
||
;GET A BLOCK THAT WON'T BE SHUFFLED, AND IS DIRECTLY ACCESSIBLE.
|
||
IOMQ: PUSHJ P,MQTEST ;GET LOW OR MEDIUM MEMORY FOR I/O
|
||
POPJ P,
|
||
|
||
;ALLOCATING LOW MEM
|
||
NMMRQ: MOVEI A,0 ;MEMFP = MEMBLT+0
|
||
IMRQ7: PI2SAF
|
||
PUSH P,B
|
||
PUSH P,E
|
||
IMRQ2: LDB A,[MLO,,MEMBLT(A)]
|
||
JUMPN A,IMRQ3
|
||
PUSH P,C
|
||
PUSH P,H
|
||
PUSH P,TT
|
||
MOVEI C,IMEMR
|
||
SKIPGE UDRSW
|
||
PUSHJ P,QDFLS ;TRY FLUSHING DISK DIRS
|
||
POP P,TT
|
||
POP P,H
|
||
POP P,C
|
||
MOVEI A,0
|
||
IMRQ6: LDB A,[MLO,,MEMBLT(A)]
|
||
JUMPE A,IMRQR ;NO MEM AVAIL IN LOW HALF, TAKE NON-SKIP RETURN
|
||
SKIPGE MEMBLT(A)
|
||
JRST IMRQ6
|
||
JRST IMRQ9
|
||
|
||
MPOUT1:
|
||
IMRQR: POP P,E
|
||
JRST POPBJ
|
||
|
||
IMRQ3: SKIPGE MEMBLT(A)
|
||
JRST IMRQ2 ;LOCKED LOOK FOR ANOTHER
|
||
IMRQ9: TDZA B,B ;GOBBLE FROM LOW
|
||
IMRQ8: MOVNI B,1 ;GOBBLE FROM HIGH
|
||
AOS -2(P) ;CAUSE RETURN TO SKIP
|
||
LDB E,[MUR,,MEMBLT(A)]
|
||
CAIN E,MUFR
|
||
JUMPN A,IMRQ4
|
||
JRST 4,. ;BLOCK GOT PUT ON FREE STORAGE LIST WITHOUT USAGE FIELD GETTING "FREE"
|
||
;ROUTINES FOR RETURNING MEMORY
|
||
IMEMR: PI2SAF ;HERE OTHERWISE (SEE BELOW)
|
||
CAIGE A,TSYSM
|
||
CAIGE A,SYSB
|
||
JRST 4,. ;DON'T RETURN PART OF SYSTEM
|
||
SKIPL MEMFRZ
|
||
JRST IMEMR1
|
||
CIMEMR: PUSH P,B ;ENTER HERE IF OK TO HACK WITH MEM FROZEN
|
||
LDB B,[MUR,,MEMBLT(A)] ;I E CALLING FROM CORE ALLOCATOR
|
||
CAIN B,MUFR
|
||
JRST 4,. ;ALREADY FREE, LOSSAGE
|
||
SETZM MEMBLT(A) ;INITIALIZE RANDOM FIELDS
|
||
CAIGE A,256. ;HIGH MOBY GOES ON HIGH LIST
|
||
CAIGE A,LIOBLK ;LOW SHUFFLEABLE GOES ON HIGH LIST
|
||
JRST CIMEM1
|
||
CAIGE A,128. ;LOW NON-SHUFFLEABLE GOES ON LOW LIST
|
||
JRST CIMEM0
|
||
CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
|
||
SKIPN USEMDM ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
|
||
JRST CIMEM1
|
||
CIMEM0: LDB B,[MLO,,MEMFP] ;PICK UP HEAD OF APPRO FS LIST
|
||
DPB B,[MLO,,MEMBLT(A)] ;STORE AS LINK OUT OF CURRENT WD
|
||
CAIE B,0 ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
|
||
DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
|
||
MOVEI B,0 ;NO BACK PTR, THIS WILL BE FIRST IN LIST
|
||
DPB B,[MLU,,MEMBLT(A)]
|
||
DPB A,[MLO,,MEMFP] ;STORE THIS AS FREE LIST HEAD
|
||
AOS LMEMFR
|
||
CIMEM3: MOVEI B,MUFR
|
||
DPB B,[MUR,,MEMBLT(A)] ;STORE FREE IN USER
|
||
CLEARM MEMPNT(A)
|
||
AOS MEMFR
|
||
JRST POPBJ
|
||
|
||
CIMEM1: LDB B,[MLO,,MEMHPT] ;PICK UP HEAD OF APPRO FS LIST
|
||
DPB B,[MLO,,MEMBLT(A)] ;STORE AS LINK OUT OF CURRENT WD
|
||
CAIE B,0 ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
|
||
DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
|
||
MOVEI B,0 ;NO BACK PTR, THIS WILL BE FIRST IN LIST
|
||
DPB B,[MLU,,MEMBLT(A)]
|
||
DPB A,[MLO,,MEMHPT] ;STORE THIS AS FREE LIST HEAD
|
||
JRST CIMEM3
|
||
|
||
IMEMR1: PUSH P,B ;FREE A PAGE WHEN MEMFRZ LOCKED.
|
||
MOVE B,MEMFP1 ;ADD IT TO FRONT OF MEMFP1 LIST
|
||
DPB B,[MLO,,MEMBLT(A)]
|
||
HRRZM A,MEMFP1
|
||
MOVEI B,MUFRT ;THEN SAY THIS BLK BECAME FREE WITH MEM FROZEN.
|
||
DPB B,[MUR,,MEMBLT(A)]
|
||
SETZM MEMPNT(A)
|
||
JRST POPBJ
|
||
|
||
;ROUTINES TO RETURN MEMORY CONTINUED
|
||
|
||
MGMEMR: PUSHJ P,TMEMR ;MAG TAPE MEMR
|
||
MUMGB
|
||
POPJ P,
|
||
|
||
TMEMR: PUSH P,B
|
||
LDB B,[MUR,,MEMBLT(A)]
|
||
CAME B,@-1(P)
|
||
JRST 4,. ;RETURNING BLOCK NOT OF TYPE EXPECTED
|
||
POP P,B
|
||
AOS (P) ;SKIP OVER ARG
|
||
MEMR: CONO PI,UTCOFF
|
||
PUSHJ P,IMEMR
|
||
JRST UTCONJ
|
||
|
||
CMEMR: CONO PI,UTCOFF
|
||
PUSHJ P,CIMEMR
|
||
JRST UTCONJ
|
||
|
||
; ROUTINES TO UNTHREAD BLOCKS FROM FREE LISTS
|
||
|
||
MPOUT: PI2SAF
|
||
MPOUT2: JUMPE A,[JRST 4,.] ;ENTER HERE FROM INITIALIZATION IF HOLE FOUND
|
||
PUSH P,B
|
||
PUSH P,E
|
||
CAIGE A,256. ;HIGH MOBY GOES ON HIGH LIST
|
||
CAIGE A,LIOBLK ;LOW NON-SHUFFLEABLE GOES ON HIGH LIST
|
||
JRST MPOUT4
|
||
CAIGE A,128. ;LOW SHUFFLEABLE GOES ON LOW LIST
|
||
JRST MPOUT3
|
||
CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
|
||
SKIPN USEMDM ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
|
||
MPOUT4: SKIPA B,[-1] ;IT'S HIGH MEM
|
||
MPOUT3: MOVEI B,0 ;IT'S LOW MEM
|
||
|
||
IMRQ4: PUSH P,B ;0 LOW -1 HIGH
|
||
LDB B,[MLU,,MEMBLT(A)] ;LINK UP
|
||
LDB E,[MLO,,MEMBLT(A)] ;LINK OUT
|
||
JUMPN B,IMRQ5 ;JUMP IF NOT FIRST IN LIST
|
||
JUMPE E,IMRQ5 ;JUMP IF LAST BLOCK IN LIST
|
||
LDB B,[MUR,,MEMBLT(E)] ;FIRST AND FOLLOWED
|
||
CAIE B,MUFR
|
||
JRST 4,. ;DOESNT LINK TO A FREE BLOCK
|
||
MOVEI B,0 ;PUT BACK 0
|
||
IMRQ5: SKIPE E ;SKIP IF NO BLOCK FOLLOWS
|
||
DPB B,[MLU,,MEMBLT(E)] ;STORE LINK UP OF PATCHED OUT BLOCK IN LINK OUT BLOCK
|
||
JUMPE B,IMRQ5A
|
||
DPB E,[MLO,,MEMBLT(B)] ;STORE LINK OUT OF PATCHED OUT BLOCK IN LINK UP BLOCK
|
||
POP P,B ;GET BACK WHICH PART OF MEM IT'S IN
|
||
JRST IMRQ5C
|
||
|
||
IMRQ5A: POP P,B ;GET BACK WHICH PART OF MEM IT'S IN
|
||
DPB E,[MLO,,MEMFP(B)] ;THIS WAS FIRST IN FREE LIST, ADJUST LIST HEADER
|
||
IMRQ5C: SKIPL B ;SKIP IF NOT IN LOW HALF
|
||
SOS LMEMFR ;ADJUST FREE BLOCKS IN LOWER HALF
|
||
SOS MEMFR ;1 LESS FREE BLOCK IN SYSTEM
|
||
SETZM MEMBLT(A) ;CLEAN UP MEMBLT ENTRY FOR CALLER'S SAKE
|
||
MOVEI B,MUINP ;IN PROCESS
|
||
DPB B,[MUR,,MEMBLT(A)]
|
||
JRST MPOUT1
|
||
|
||
OVHMTR UUO ;MORE MISC UUOS ETC.
|
||
|
||
TCALL: CONO PI,UTCOFF
|
||
PUSHJ P,@(P)
|
||
SKIPA
|
||
AOS (P)
|
||
JRST UTCOJ1
|
||
|
||
EBLK
|
||
|
||
SUBTTL MEMORY ALLOCATION TABLES
|
||
|
||
IOBFTL: MXIOB ;BEG FOR GETSYS (MEMORY)
|
||
IOBFT: REPEAT MXIOB-1,176000,,.RPCNT+1 ;MAX DYN ALLOC IO BUFFERS
|
||
176000,,377 ;4.9 FREEZE
|
||
;4.8 ALLOC INHIBIT
|
||
IOCH==340600 ;4.7-4.2 SYS CHN NO 77 => FREE
|
||
IOLC==241000 ;4.1-3.3 LINK TO NEXT SEQ BUF IN CORE (W/IN 1K BLK)
|
||
IOLO==1000 ; LINK TO FOLLOWING BUFFER OR
|
||
;SPECIAL STATES LINK OUT
|
||
;-1 LAST BUFFER CURRENTLY FILLED
|
||
;-2 END OF FILE
|
||
;-3 BUFFER ACTIVE AT MAIN PROG LEVEL
|
||
;-4 BUFFER ACTIVE AT PI LEVEL
|
||
;IF CHN IS NUTIC+NUTOC (UTAPE FILE DIR) THEN IOLO IS TAPE NO
|
||
;CHNLS NUTIC+NUTOC+1 (NFCLC)=>$Q+NCLCH-1 ARE CORE LINK DEVICE
|
||
;CHNLS NFNETC => $Q+NNETCH-1 ARE NET CHNLS
|
||
SCNCLO==NUTIC+NUTOC+1
|
||
|
||
IOSA==101400 ; BUFFER SA _-6
|
||
IOSA1==111300 ;ONLY RELEVANT BITS FOR 200 WD BUFFERS
|
||
|
||
|
||
IOBFP: 0 ;FREE STG TO IOBFT ENT
|
||
IOBFC: MXIOB-8 ;CNT OF AVAIL
|
||
;LEAVE 8 AVAIL SO CORE HACKER CAN NOT RUN OUT
|
||
|
||
UTFS: 377 ;FREE STG PNTR TO 200 WD BUFFERS
|
||
UTTLB: -NUTIC-NUTOC ;TOTAL BUFFERS ALLOCATED TO UTAPES
|
||
UTTBF: 0 ;TOTAL UT BUFFERS FREE
|
||
|
||
;EXEC MAPS
|
||
IF2,[
|
||
EXEUMP=UPGMP+100 ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S MAP AREA
|
||
EXELMP==UPGMP ;KL10 AND KS10 ALSO NEED EXEC LOWER MAP, + EXISTS
|
||
];IF2 ;SO USERS CAN COPY PAGES FROM THE SYSTEM JOB
|
||
|
||
;TABLE OF BYTE POINTERS THAT POINT TO VIDEO BUFFER AREA OF EXEUMP
|
||
IFN N11TYS,[
|
||
TTCRT: REPEAT NTVBP,[
|
||
CONC [.TTR]\.RPCNT,+EXEUMP
|
||
]
|
||
]
|
||
|
||
IFN PDP6P,[
|
||
;DBR FOR REFERENCING PDP6 MEM
|
||
PDP6MP: <LPDP6M/2>_1,,PDPUMP
|
||
|
||
;PAGE MAP FOR REFERENCING PDP6 MEM
|
||
PDPUMP: REPEAT LPDP6M/2,600000+<PDP6BM_-10.>+2*.RPCNT,,600000+<PDP6BM_-10.>+2*.RPCNT+1
|
||
]
|
||
|
||
IFN 340P,[
|
||
DDEXCF: BLOCK NEXPGS ;-1 IF EXEC PAGE SET UP FOR 340
|
||
]
|
||
|
||
IFN KA10P, EXECMP: 100_1,,EXEUMP ;EXEC DBR
|
||
;MEMORY ORGANIZATION
|
||
|
||
;PAGE 0 ALWAYS BELONGS TO THE SYSTEM AND IS NEVER ALLOCATED OR FREED.
|
||
;
|
||
;N PAGES OF SYSTEM CODE AND VARIABLES ARE ACQUIRED BY THE SYSTEM JOB AT STARTUP.
|
||
;
|
||
;N PAGES OF USER-VARIABLE BLOCKS BELONG TO THE SYSTEM JOB. THESE ARE
|
||
;ALLOCATED AND DEALLOCATED AS REQUIRED. LIOBLK-1 IS THE HIGHEST THIS CAN GO.
|
||
;USER PAGES BELOW LIOBLK CAN BE SHUFFLED OUT WHEN THE SYSTEM JOB NEEDS THE CORE.
|
||
;
|
||
;FROM LIOBLK TO 128K IS THE "LOW HALF." THESE PAGES ARE DIRECTLY ADDRESSABLE
|
||
;IN EXEC MODE AND NEVER NEED TO BE SHUFFLED. I/O BUFFERS, DISK DIRECTORIES,
|
||
;ETC. ARE ALLOCATED IN THESE PAGES.
|
||
;
|
||
;128K TO 128K+NEXPGS ARE PAGES WHICH CAN'T BE ADDRESSED DIRECTLY FROM
|
||
;EXEC MODE BECAUSE THEIR EXEUMP SLOTS ARE USED BY "EXEC PAGES."
|
||
;
|
||
;THE REST OF THE LOW MOBY, UP TO FDDTPG, IS DIRECT-MAPPED AND
|
||
;USED FOR ADDITIONAL "LOW HALF" PAGES.
|
||
;
|
||
;FDDTPG TO 256K CONTAINS DDT AND THE SYSTEM SYMBOL TABLE.
|
||
;
|
||
;PAGES ABOVE 256K ARE IN THE "HIGH MOBY".
|
||
;
|
||
;PAGES NOT IN THE "LOW HALF" (BELOW LIOBLK, SHADOWED BY EXEC, OR HIGH MOBY)
|
||
;ARE CONSIDERED TO BE IN THE "HIGH HALF". USER PAGES PREFER TO GO HERE.
|
||
;
|
||
;COMPLICATIONS:
|
||
; IF USEMDM IS OFF, THE DIRECT MAPPED PAGES IN THE HIGH HALF
|
||
; OF THE LOW MOBY ARE CONSIDERED HIGH RATHER THAN LOW. THIS IS USED
|
||
; MOSTLY FOR DEBUGGING, TO CATCH REFERENCES TO RANDOM ADDRESSES.
|
||
; THERE CAN BE HOLES IN MEMORY (NXM).
|
||
;
|
||
;THE MEMBLT TABLE HAS ONE WORD FOR EACH 1K BLOCK OF MEMORY.
|
||
;IT SAYS WHAT THAT BLOCK IS USED FOR AND CONTAINS LINKS TO OTHER
|
||
;BLOCKS AND OTHER TABLES. THE MEMPNT AND MMSWP TABLES ALSO CONTAIN
|
||
;ONE WORD PER BLOCK AND CONTAIN ADDITIONAL INFORMATION.
|
||
|
||
FDDTPG: 0 ;# OF LOWEST BLOCK USED BY DDT & SYMTAB (SET AT STARTUP)
|
||
|
||
MEMFR: 0 ;# OF FREE BLOCKS IN ALL OF MEMORY.
|
||
|
||
LMEMFR: 0 ;# OF FREE BLOCKS IN LOW LIST (MEMFP).
|
||
|
||
MINCOR: 8 ;TRY TO KEEP THIS MANY PAGES FREE IN LOW MEMORY
|
||
;MUST BE >= 3, SINCE LESSER-PRIORITY CONSUMERS OF
|
||
;MEMORY WAIT IF LMEMFR IS < 3.
|
||
|
||
MEMFP1: 0 ;LIST (THREADED THROUGH MLO, TERMINATED BY 0)
|
||
;OF BLKS THAT BECAME FREE WHILE MEMFRZ WAS LOCKED.
|
||
|
||
MEMHPT: 0 ;FREE LIST OF HIGH HALF PAGES AND HIGH MOBY PAGES
|
||
;AND SHUFFLEABLE LOW HALF PAGES. MUST BE AT MEMFP-1.
|
||
MEMFP::
|
||
MEMBLT: 0 ;FREE LIST POINTER FOR LOW PGS AND ALSO WD FOR BLOCK 0
|
||
BLOCK TSYSM-1 .SEE BEGF0 ;FILLS THIS IN
|
||
|
||
;FIELDS IN MEMBLT ENTRY:
|
||
;4.9 FREEZE OR ALLOC INHIBIT
|
||
;IF 4.9=1, DONT SET UP ANY MORE EXEC PGS POINTING TO THIS ONE
|
||
MUR==360500 ;4.4-4.8 USAGE CODE
|
||
MURUSR==1 ;USER PAGE, MMMPX=MMP INDEX
|
||
MUEX==2 ;EXEC (?)
|
||
MUIOB==3 ;200 WD BUFFERS, MNUMB=FIRST IOBFT ENTRY IN BLOCK
|
||
MUFR==4 ;FREE
|
||
MUINP==5 ;IN PROCESS OF BEING ALLOCATED
|
||
MUMGB==6 ;MAG TAPE BUFFER, MNUMB=TAPE NO+EOF BIT, MWC=WORD COUNT
|
||
MUMMP==7 ;MMP TABLE
|
||
MUDISB==10 ;340 DISPLAY BUFFER
|
||
MUFRT==11 ;BLOCK RETURNING TO FREE WHEN MEM LOCKED
|
||
MU23B==12 ;DISK BUF, MWC=WORD COUNT, MNUMB=CHANNEL
|
||
MU23UD==13 ;DISK USER DIR, MNUMB=QSNUD SLOT
|
||
MU23MD==14 ;DISK MASTER DIR
|
||
MU23TT==15 ;DISK TUT MNUMB=DISK NO.
|
||
MU23LS==16 ;DISK COPY OF USER DIR FOR LISTING
|
||
MUHOLE==17 ;"HOLE" IN REAL MEM
|
||
MUDDT==20 ;"DDT" PAGE
|
||
MUNET==21 ;NETWORK "BIG" BUFFER
|
||
MUSWPG==22 ;PAGE IN SWAPPING QUEUE, MMMPX=MMP INDEX
|
||
MUCHA==23 ;CHAOS NET BUFFERS
|
||
MU23FB==24 .SEE QSFBT ;DISK FREED-BLOCKS TABLES
|
||
MUPKT==25 ; Net packet buffers
|
||
MUDVB==26 ;Semi-static device IO buffer page
|
||
;ADD NEW MUR TYPES HERE ^
|
||
MURMAX==27 ;HIGHEST VALID CODE + 1
|
||
|
||
MWC==221400 ;3.1-4.3 WORD COUNT IN I/O BUFFERS
|
||
|
||
MLU==221400 ;3.1-4.3 LINK UP FOR DOUBLY-THREADED FREE LIST
|
||
|
||
MNUMB==140600 ;2.4-2.9 MAGIC NUMBER SEE COMMENTS UNDER MUR ABOVE
|
||
|
||
MMMPX==142200 ;2.4-4.3 MMP INDEX IN USER PGS + SWAP BUFFERS
|
||
|
||
MLO==001400 ;1.1-2.3 LINK TO NEXT PAGE IN A LIST
|
||
;0 = END OF LIST
|
||
;UNLIKE IOLO AND PREVIOUS VERSION OF MLO, THERE ARE NO MAGIC NEGATIVE CODES
|
||
;N.B.: MLO MUST BE AT RIGHT-HAND END OF WORD - CODE DEPENDS
|
||
|
||
MEMPNT: BLOCK TSYSM ;RH USED FOR CIRC MEM USE PNTR IF USER MEM
|
||
;LH FOR DISK ADDRESS CAME FROM OR GOING TO
|
||
;MEMPNT HAS BLOCK NUMBER
|
||
;DISK NUMBER COMES FROM CHANNEL LINKED TO
|
||
;CIRCULAR PAGE LINK FORM
|
||
;2.9=0
|
||
;1.1-1.8 PAGE #
|
||
;2.8-1.9 USER #
|
||
;2.9=1
|
||
;2.8=0 2.7-1.1 LINK TO MMP TABLE
|
||
;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE
|
||
;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED
|
||
|
||
MMSWP: BLOCK TSYSM ;IF USER MEM, HAS NUMBER OF PAGE TABLE WORDS
|
||
; WHICH POINT AT THIS PAGE. LH IS NUMBER OF EXEC
|
||
; PAGES, RH IS NUMBER OF USER PAGES. NOTE THAT THE
|
||
; NUMBER OF UPGCP ENTRIES COULD BE MORE, FOR VARIOUS
|
||
; REASONS, E.G. CIRPSW LOCKED WHEN PAGE SWAPPED IN,
|
||
; OR A USER WAS SWAPPED OUT.
|
||
;IFN SWPWSP, RH(MMSWP) IS USED AS NUMBER OF SHARERS.
|
||
|
||
EMEMTL==.-1 ;END FOR GETSYS (MEMORY)
|
||
|
||
MMPRTC: 0 ;C AT MMPRTN, FOR DEBUGGING
|
||
|
||
MMPFS: 0 ;FREE-LIST OF MMP ENTRIES. VALUE IS ADDRESS. (FORMERLY WAS IDX).
|
||
|
||
MMPFS2: 0 ;LIST OF MMPS THAT NEED TO HAVE TUT SOS'ED BEFORE THEY CAN BE FREED.
|
||
;TUT COULDN'T BE SOS'ED AT P.I. LEVEL BECAUSE IT WAS LOCKED.
|
||
;THESE MMPS MAY ALSO NEED TO BE REMOVED FROM THE SHAREABLE
|
||
;PAGE TABLE, WHICH REQUIRES CIRPSW.
|
||
|
||
MMPCNT: 0 ;# OF MMP ENTRIES IN USE.
|
||
|
||
MMPFR: NMMP*1000 ;MAX POSSIBLE # MMP ENTRIES, MINUS # IN USE OR COMMITTED.
|
||
|
||
;MMP TABLE - TWO WDS PER ENTRY
|
||
MMPPUB==400000 ;WD1 4.9 INDICATES A PUBLIC PAGE IF ON (ANYONE CAN ATTACH TO WRITE)
|
||
MMPOUT==200000 ;4.8 => PAGE IS SWAPPED OUT OR ON WAY OUT.
|
||
MMPTMP==100000 ;4.7 => IN TRANSIT (ON WAY IN OR ON WAY OUT).
|
||
MMPWOD==40000 ;4.6 => THIS PAGE HAS BEEN WRITTEN ON DISK AT LEAST ONCE
|
||
MMPISW==20000 ;4.5 PAGE ON INITIAL SWAPIN, BEING COPIED SO SWAP OUT TO DIFF PLACE
|
||
MMPWRT==10000 ;4.4 HAS BEEN WRITTEN SINCE LAST DISK WRITE BY USER WHO HAS DETACHED THIS PAGE
|
||
MMPGON==4000 ;4.3 FILE PAGE BEING WRITTEN OUT AFTER
|
||
;DELETED FROM ALL MAPS (MMP ENTRY WILL SOON GO AWAY.)
|
||
MMPBAD==2000 ;4.2 PAGE GOT PAR ERR SINCE LAST TIME SWAPPED OUT OR IN.
|
||
MMPLOK==1000 ;4.1 => PAGE MAY NOT BE SWAPPED OUT.
|
||
MMPSLO==400 ;3.9 => PAGE SHOULD GO IN SLOW MEMORY.
|
||
MMPSHR==200 ;3.8 MMP ENTRY IS IN SHAREABLE PAGE HASH TABLE
|
||
MMPPGA==100 ;3.7 BEING SWAPPED IN BY PAGE-AHEAD. DON'T PUT IN USER MAPS; WAIT FOR FAULTS.
|
||
MMPPGB==40 ;3.6 BEING SWAPPED OUT BY PAGE-BEHIND.
|
||
$MMPUN==220300 ;3.1-3.3 UNIT NUMBER (GOES WITH DISK ADDR IN WD2 LH)
|
||
;WD1 RH CIRC MEM USE PNTR
|
||
;WD2 LH READ DISK ADR OR 0
|
||
;WD2 RH THREAD FOR SHAREABLE PAGE HASH TABLE
|
||
|
||
MMPNP: 0 ;#MMP PGS ACTUALLY IN USE
|
||
MMPMX: 0 ;HIGHEST VALID MMP INDEX (MMPNP*2000)
|
||
|
||
MMMPG: BLOCK NMMP ;BLOCK NOS OF BLOCKS ACTUALLY USED
|
||
|
||
;SHAREABLE PAGE HASH TABLE
|
||
;MMP ENTRIES THAT ARE SHARED WITH FILES ARE LISTED HERE TO SAVE TIME AT NCORQ2
|
||
;SIMPLE REMAINDER HASH ON UNIT#,,DISK ADDRESS,
|
||
;BUCKETS THREADED THROUGH RH(MMPE+1)
|
||
|
||
SHRHSL==31. ;NUMBER OF BUCKETS
|
||
SHRHSH: BLOCK SHRHSL
|
||
|
||
;"LOOSE" PAGES (NOT USED BY ANY USER, BUT NOT YET SWAPPED OUT.)
|
||
;MMP ENTRY GOES AWAY WHEN SWAPPED OUT, OR GETS PUT BACK INTO SERVICE AT NCORQ3.
|
||
NLOOSP: 0 ;NUMBER OF LOOSE PAGES
|
||
FLOOSP: 0 ;HEAD OF LIST. THREADED THROUGH MLO IN MEMBLT.
|
||
LLOOSP: 0 ;TAIL OF LIST. ADD AT TAIL, SWAPPER REMOVES FROM HEAD.
|
||
|
||
BBLK
|
||
MMPEAD: REPEAT NMMP, CONC MMP,\.RPCNT,*2000+400000 ;EXEC ADR
|
||
MMPPPP: REPEAT NMMP, CONC .MMP,\.RPCNT,+EXEUMP ;PNTR TO EXEC PC MP
|
||
USEMDM: DIRMAP ;NON-ZERO => USE MEDIUM MEMORY.
|
||
;DON'T CHANGE AFTER SYSTEM STARTUP
|
||
|
||
SUBTTL 200-WORD I/O BUFFER ROUTINES
|
||
|
||
;SYS CHANNEL ASSIGN
|
||
; 77=>FREE
|
||
; 0 - NUTIC+NUTOC-1 => UTAPE CHNL
|
||
;NUTIC+NUTOC (=NFCLC-1) =>UTAPE FILE DIR
|
||
;NFCLS-NFCLC+NCLCH-1 (=NFNETC-1) => CORE LINK
|
||
;NFNETC-NNETCH => NETWORK
|
||
|
||
IOBCNS: MOVEI A,IOBFP-IOBFT
|
||
IOBC1: MOVE E,A
|
||
LDB A,[IOLO,,IOBFT(A)]
|
||
CAIN A,377
|
||
JRST 4,. ;IOBFT POINTERS FOULED UP
|
||
|
||
IOBC2: LDB B,[420200,,IOBFT(A)]
|
||
JUMPN B,IOBC1
|
||
LDB B,[IOLO,,IOBFT(A)]
|
||
DPB B,[IOLO,,IOBFT(E)]
|
||
SOS IOBFC
|
||
POPJ P,
|
||
|
||
|
||
IOBR: MOVE B,IOBFP ;RETURN IOBFT WORD
|
||
CLEARM IOBFT(A)
|
||
DPB B,[IOLO,,IOBFT(A)]
|
||
MOVEM A,IOBFP
|
||
MOVEI B,77
|
||
DPB B,[IOCH,,IOBFT(A)]
|
||
AOS IOBFC
|
||
POPJ P,
|
||
|
||
IUTCONS: ;ALLOCATE 200 WORD BUFFER
|
||
IUTCO1: PI2SAF
|
||
SKIPG UTTBF ;CLOBBERS A B E TT, RETURNS IOBFT INDEX IN A
|
||
JRST IUTC1 ;NO UTAPE BUFFERS FREE
|
||
MOVEI E,UTFS-IOBFT
|
||
MOVE A,UTFS ;CHNL NO IN D
|
||
IUTC3: CAIN A,377
|
||
JRST IUTC1
|
||
LDB B,[420200,,IOBFT(A)]
|
||
JUMPN B,IUTC2
|
||
LDB B,[IOCH,,IOBFT(A)]
|
||
CAIE B,77
|
||
JRST 4,. ;BUFFER BEING ALLOCATED ISN'T FREE.
|
||
LDB B,[IOLO,,IOBFT(A)]
|
||
DPB B,[IOLO,,IOBFT(E)]
|
||
DPB D,[IOCH,,IOBFT(A)]
|
||
SOS UTTBF
|
||
JRST POPJ1
|
||
|
||
IUTC2: MOVE E,A
|
||
LDB A,[IOLO,,IOBFT(A)]
|
||
JRST IUTC3
|
||
|
||
IUTC1: PUSHJ P,UIMRQ
|
||
POPJ P,
|
||
PUSHJ P,UTMGB
|
||
JRST IUTCO1
|
||
|
||
IBRTN: PI2SAF
|
||
PUSH P,B ;FREE 200 WORD BUFFER (SEE BRTN)
|
||
; LDB B,[IOCH,,IOBFT(A)]
|
||
; CAIN B,77
|
||
; JRST 4,. ;RETURNING A BUFFER THAT'S FREE?
|
||
MOVE B,UTFS
|
||
DPB B,[IOLO,,IOBFT(A)]
|
||
MOVEM A,UTFS
|
||
MOVEI B,77
|
||
DPB B,[IOCH,,IOBFT(A)]
|
||
LDB B,[IOSA,,IOBFT(A)]
|
||
SKIPN B
|
||
JRST 4,.
|
||
AOS UTTBF
|
||
JRST POPBJ
|
||
|
||
UTMGB: PUSH P,J ;GOBBLE MEM BLK IN A FOR UTAPE BUFFER
|
||
PUSH P,R
|
||
PUSH P,Q
|
||
PUSH P,B
|
||
PUSH P,E
|
||
MOVEI B,MUIOB
|
||
DPB B,[MUR,,MEMBLT(A)]
|
||
MOVE J,A
|
||
LSH A,10.-6. ;CONV TO BUF SA
|
||
MOVE TT,A ;INCR TO NEXT BUF ADR
|
||
MOVEI R,8
|
||
ADDM R,UTTLB ;UTTBF AOSED AT IBRTN
|
||
MOVNI Q,1
|
||
UTMG1: PUSHJ P,IOBCNS
|
||
DPB TT,[IOSA,,IOBFT(A)]
|
||
JUMPL Q,UTMG2
|
||
DPB A,[IOLC,,IOBFT(Q)]
|
||
UTMG3: MOVE Q,A
|
||
PUSHJ P,IBRTN
|
||
ADDI TT,2
|
||
SOJG R,UTMG1
|
||
MOVEI TT,377
|
||
DPB TT,[IOLC,,IOBFT(A)]
|
||
POP P,E
|
||
POP P,B
|
||
POP P,Q
|
||
POP P,R
|
||
POP P,J
|
||
FSCMP: ;RECOMPUTE UTAPE BUFFER FAIR SHARE
|
||
IFN NUNITS,[
|
||
MOVE A,UTTLB
|
||
PUSH P,A+1
|
||
IDIV A,NUTCA
|
||
POP P,A+1
|
||
MOVEM A,UPCHFS
|
||
]
|
||
POPJ P,
|
||
|
||
UTMG2: DPB A,[MNUMB,,MEMBLT(J)]
|
||
JRST UTMG3
|
||
|
||
BRTN: CONO PI,UTCOFF ;RETURN A 200-WD BUFFER
|
||
PUSHJ P,IBRTN
|
||
JRST UTCONJ
|