// STATEINIT.BCPL Initialization for STATE.BCPL
get "state.d"
external [
// OS
CallSwat; InitializeZone; sysZone; lvSysZone
// Program
StateBlockSize
//STATE.BCPL
GetStorage; EndStorage; Storage; NoStore; StateBlock; StatePtr
// Defined here
StorageInit; SaveStatics
]
manifest [ codePtr = #335 ]
//Initialize the storage area, rebuild sysZone after Junta, allocate the
//StateBlock for subsequent use of BeginSave and SaveState. FirstStatic
//is Layout!26 and LastStatic is Layout!27 as passed to the entry procedure
//by CallSubsys. ErrRtn is called by GetStorage with the string
//"Out of storage", if storage is exhausted.
let StorageInit(FirstStatic,LastStatic,
sysZoneSize,StackSize,ErrRtn; numargs NA) be
[ if NA < 5 then
[ ErrRtn = CallSwat
if NA < 4 then StackSize = #4000
]
Storage = (rv codePtr)
EndStorage = (lv sysZoneSize) - 10 - StackSize
rv codePtr = EndStorage
NoStore = ErrRtn eq 0 ? CallSwat,ErrRtn
if (NA > 2) & (sysZoneSize ne 0) do
[ sysZone = InitializeZone(GetStorage(sysZoneSize),sysZoneSize,
0,ErrRtn)
rv lvSysZone = sysZone
]
StateBlock = GetStorage(StateBlockSize)
StateBlock>>State.FirstS = FirstStatic
StateBlock>>State.NStats = LastStatic-FirstStatic+1
StatePtr = size State/16
]
//Fill in alternate words of StateBlock with pointers to page-zero statics
//to be saved. The values are filled in by SaveState.
and SaveStatics(lv1,lv2,lv3,lv4,lv5,lv6,lv7,lv8,lv9,lv10,
lv11,lv12,lv13,lv14,lv15,lv16,lv17,lv18,lv19,lv20; numargs NA) be
//Know that BCPL puts the args in sequential order on the stack
[ if NA > 20 then CallSwat("Too many args to SaveStatics")
while NA > 0 do
[ NA = NA-1; StateBlock!StatePtr = (lv lv1)!NA
StatePtr = StatePtr+2
]
if StatePtr > StateBlockSize then CallSwat("StateBlock too small")
]