// IfsVMemInit.bcpl - once only code
// Copyright Xerox Corporation 1979, 1982
// Last modified September 17, 1982 4:14 PM by Taft
get "IfsVMem.decl"
external
[
// outgoing procedures
InitVMem
// incoming procedures
Allocate; SysErr; Noop; FalsePredicate; Zero
// incoming statics
vmdt; vmStats; sysZone
]
//----------------------------------------------------------------------------
let InitVMem() be
//----------------------------------------------------------------------------
// Note that no buffers are made available to the VMem package
// The caller must do that after calling this procedure
[
// Initialize the VMem package
let hMap = Allocate(sysZone, lenHMap, 0, true)
(table //initialize vmem microcode
[
#55001 // sta 3 1 2
#35003 // lda 3 3 2
#74000 // initVMem
#35001 // lda 3 1 2
#1401 // jmp 1 3
])(hMap, lenHMap, 0)
InitializeVmem(hMap, lenHMap, //Hash Map
Allocate(sysZone, 256), //buffer table
Allocate(sysZone, lenLT), lenLT) //lock table
// Initialize the VMD table.
// Note that it must always contain "zero" and "infinity" entries.
vmdt = Allocate(sysZone, lenVMDT)
let vmi = Allocate(sysZone, lenVMI)
vmi>>VMI.DOPAGEIO = SysErr
vmi>>VMI.CleanupLocks = Noop
vmi>>VMI.PageType = SysErr
vmi>>VMI.PageGroupAlign = SysErr
vmi>>VMI.PageGroupBase = SysErr
vmi>>VMI.PageGroupSize = SysErr
let vmd = Allocate(sysZone, 2*lenVMD)
vmd>>VMD.base = 0
vmd>>VMD.length = 4
vmd>>VMD.vmi = vmi
vmdt>>VMDT.vmd↑1 = vmd
vmd = vmd+lenVMD
vmd>>VMD.base = -8 //reserved by vMem package
vmd>>VMD.length = 8
vmd>>VMD.vmi = vmi
vmdt>>VMDT.vmd↑2 = vmd
vmdt>>VMDT.length = 2
vmStats = Allocate(sysZone, lenVMStats)
Zero(vmStats, lenVMStats)
]
// Derived from VMem package, by P. Deutsch:
// VMEMINIT -- initialize VMEM
// last edited August 1, 1977 1:48 PM
and InitializeVmem(HM, HMSIZE, BPTAB, LCL, LLCL) be
[
get "vmem.d"
external // procedures
[ // O.S.
TruePredicate
CallSwat
SetBlock
// VMEM
LockOnly; LockZero
// VMEMA
REHASHMAP
]
external // statics
[ // VMEM
@HASHMAP; @HASHMAPSIZE; @HASHMAPMASK
@HASHMAPSIZE2
@HASHMAP1
@HASHMAPTOP
@Bpt; @BptLast
EMPTYXX
NAXX
LockedCells; EndLockedCells; LastLockedCell
]
if (HMSIZE & (HMSIZE-1)) ne 0 then
CallSwat("Bad HMAPSIZE -- InitializeVmem")
HASHMAP, HASHMAPSIZE = HM+(HM&1), HMSIZE
HASHMAPMASK = HASHMAPSIZE-2
HASHMAPSIZE2 = HMSIZE rshift 1
HASHMAP1 = HASHMAP+HMflagOffset
HASHMAPTOP = HASHMAP+HASHMAPSIZE
Bpt, LockedCells, EndLockedCells =
BPTAB, LCL, LCL+(LLCL & not 1)-LCsize
LastLockedCell = LCL
Zero(HASHMAP, HASHMAPSIZE)
let dummypage(vp, bits) = valof
[ let hp = REHASHMAP(vp)
hp>>HM.NKEY = not vp
hp>>HM.FLAGWD = bits
resultis (hp-HASHMAP) lshift 7
]
EMPTYXX = dummypage(EmptyVP, CLEANbit+NOTREFbit+DUMMYbit)
NAXX = dummypage(NaVP, CLEANbit+NOTREFbit+DUMMYbit)
SetBlock(Bpt, NAXX, BptSize)
@Bpt = 0; BptLast = 0
LockOnly = FalsePredicate
LockZero = TruePredicate
]