DIRECTORY BasicLoadStateFormat USING [ BcdInfo, ConfigIndex, LoadStateObject, ModuleInfo, nullConfig, nullModule, versionID], BasicLoadStateFormatExtension USING [Extension, nullType], BcdDefs USING [BcdBase, MTIndex, MTNull], MB USING [BHandle, Error, Handle], MBLoaderOps USING [Binding, BindingRecord, BindLink, EnumerationDirection], MBVM USING [AllocData, DataSeg, HyperSpace, LongCopyWrite, LongPointerFromSeg, Write], PrincOps USING [GFT, GFTIndex, GlobalFrame, GlobalFrameHandle], PrincOpsUtils USING [PagesForWords]; MBLoadState: PROGRAM IMPORTS MB, MBVM, PrincOpsUtils EXPORTS MBLoaderOps = BEGIN OPEN MB; data: MB.Handle _ NIL; loadstate: REF BasicLoadStateFormat.LoadStateObject _ NIL; extension: REF BasicLoadStateFormatExtension.Extension _ NIL; lsWords, extensionWords: CARDINAL; nextGFI: CARDINAL _ 1; -- gfi 0 is never used InitLoadState: PUBLIC PROC [h: MB.Handle] = {data _ h}; FinishLoadState: PUBLIC PROC = { loadstate _ NIL; extension _ NIL; data _ NIL; }; InputLoadState: PUBLIC PROC RETURNS [nbcds: BasicLoadStateFormat.ConfigIndex] = { IF loadstate = NIL THEN { IF ~data.germ THEN { lsWords _ SIZE[BasicLoadStateFormat.LoadStateObject[BasicLoadStateFormat.ConfigIndex.LAST]]; extensionWords _ SIZE[BasicLoadStateFormatExtension.Extension]; data.lsseg _ MBVM.AllocData[ base: MBVM.HyperSpace, pages: PrincOpsUtils.PagesForWords[lsWords+extensionWords], dir: up ]; data.lsseg.info.readOnly _ FALSE; data.lsseg.bootLoaded _ TRUE; }; loadstate _ NEW[BasicLoadStateFormat.LoadStateObject[BasicLoadStateFormat.ConfigIndex.LAST]]; loadstate.versionident _ BasicLoadStateFormat.versionID; FOR gfi: PrincOps.GFTIndex IN [0..data.gftLength) DO loadstate.gft[gfi] _ BasicLoadStateFormat.nullModule; ENDLOOP; FOR i: BasicLoadStateFormat.ConfigIndex IN [0..BasicLoadStateFormat.ConfigIndex.LAST) DO loadstate.bcds[i] _ [ptr[NIL]]; ENDLOOP; loadstate.nBcds _ 0; extension _ NEW[BasicLoadStateFormatExtension.Extension]; FOR gfi: PrincOps.GFTIndex IN [0..data.gftLength) DO extension[gfi] _ [mti: BcdDefs.MTNull, type: BasicLoadStateFormatExtension.nullType]; ENDLOOP; nextGFI _ 1; }; RETURN[loadstate.nBcds] }; UpdateLoadState: PUBLIC PROC [ config: BasicLoadStateFormat.ConfigIndex, handle: MB.BHandle] = { bcd: BcdDefs.BcdBase = handle.bcd; IF config = BasicLoadStateFormat.nullConfig THEN ERROR; loadstate.bcds[config].bcd _ IF data.germ THEN NIL ELSE MBVM.LongPointerFromSeg[handle.bcdSeg]; loadstate.bcds[config].typeExported _ bcd.typeExported; loadstate.bcds[config].exports _ (bcd.nExports ~= 0); IF config >= loadstate.nBcds THEN loadstate.nBcds _ loadstate.nBcds + 1; }; WriteLoadState: PUBLIC PROC = { p: LONG POINTER; IF data.germ THEN RETURN; p _ MBVM.LongPointerFromSeg[data.lsseg]; MBVM.LongCopyWrite[ from: LOOPHOLE[loadstate], to: p, nwords: lsWords ]; MBVM.LongCopyWrite[ from: LOOPHOLE[extension], to: p + lsWords, nwords: extensionWords ]; }; EnterModule: PUBLIC PROC [ rgfi: PrincOps.GFTIndex, module: BasicLoadStateFormat.ModuleInfo, mti: BcdDefs.MTIndex _ BcdDefs.MTNull] = { loadstate.gft[rgfi] _ module; IF mti ~= BcdDefs.MTNull THEN extension[rgfi].mti _ mti; }; GetModule: PUBLIC PROC [rgfi: PrincOps.GFTIndex] RETURNS [module: BasicLoadStateFormat.ModuleInfo] = { RETURN[loadstate.gft[rgfi]]}; AcquireBcd: PUBLIC PROC [config: BasicLoadStateFormat.ConfigIndex] RETURNS [handle: MB.BHandle] = { RETURN[data.inputBCDs.bcds[config]]}; InitBinding: PUBLIC PROC [bcd: BcdDefs.BcdBase] RETURNS [binding: MBLoaderOps.Binding] = { binding _ NEW[MBLoaderOps.BindingRecord[bcd.nDummies] _ [ bias: bcd.firstdummy, b: NULL --ALL[MBLoaderOps.BindLink[whichgfi: 0, body: notbound[]]] ]]; FOR i: CARDINAL IN [0..binding.n) DO binding.b[i] _ MBLoaderOps.BindLink[whichgfi: 0, body: notbound[]]; ENDLOOP; }; BcdUnresolved: PUBLIC PROC [ bcd: BasicLoadStateFormat.ConfigIndex] RETURNS [BOOL] = { FOR i: PrincOps.GFTIndex IN [0..data.gftLength) DO IF bcd = loadstate.gft[i].config AND ~loadstate.gft[i].resolved THEN RETURN[TRUE]; ENDLOOP; RETURN[FALSE] }; BcdExports: PUBLIC PROC [bcd: BasicLoadStateFormat.ConfigIndex] RETURNS [BOOL] = { RETURN[loadstate.bcds[bcd].exports]}; BcdExportsTypes: PUBLIC PROC [bcd: BasicLoadStateFormat.ConfigIndex] RETURNS [BOOL] = { RETURN[loadstate.bcds[bcd].typeExported]}; GetNextGFI: PUBLIC PROC [reserve: CARDINAL] RETURNS [next: PrincOps.GFTIndex] = { IF (next _ nextGFI) >= data.gftLength THEN MB.Error["GFT overflow"]; nextGFI _ nextGFI + reserve; }; SetGFTEntry: PUBLIC PROC [ frame: PrincOps.GlobalFrameHandle, gfi: PrincOps.GFTIndex, ngfi: CARDINAL] = { IF gfi+ngfi >= data.gftLength THEN MB.Error["GFT Full"]; FOR i: CARDINAL IN [gfi..gfi+ngfi) DO bias: CARDINAL = (i-gfi); MBVM.Write[ @PrincOps.GFT[i].framePtr, (frame + bias)]; -- bottom two bits of GFT entries bias evi's ENDLOOP; }; EnumerateModules: PUBLIC PROC [ proc: PROC [rgfi: PrincOps.GFTIndex, module: BasicLoadStateFormat.ModuleInfo] RETURNS [BOOL]] RETURNS [i: PrincOps.GFTIndex] = { FOR i IN [0..nextGFI) DO IF loadstate.gft[i].config ~= BasicLoadStateFormat.nullConfig AND proc[i, loadstate.gft[i]] THEN EXIT; ENDLOOP; }; EnumerateBcds: PUBLIC PROC [ dir: MBLoaderOps.EnumerationDirection, proc: PROC [BasicLoadStateFormat.ConfigIndex] RETURNS [BOOL]] RETURNS [config: BasicLoadStateFormat.ConfigIndex] = { SELECT dir FROM recentfirst => FOR config DECREASING IN [0..loadstate.nBcds) DO IF proc[config] THEN RETURN; ENDLOOP; recentlast => FOR config IN [0..loadstate.nBcds) DO IF proc[config] THEN RETURN; ENDLOOP; ENDCASE; RETURN[BasicLoadStateFormat.nullConfig] }; END. MBLoadState.mesa Last modified by Sandman on March 13, 1981 4:01 PM Last modified by Lewis on 21-Sep-81 17:08:04 Last modified by Levin on September 30, 1983 5:06 pm allocate temporary copy of loadstate (written into MBVM loadstate by WriteLoadState) GFT management ÊX˜Jšœ™Jšœ7™7Jšœ,™,Jšœ4™4J˜šÏk ˜ šœœ˜J˜V—Jšœœ˜:Jšœœ˜)Jšœœ˜"Jšœ œ:˜KJšœœL˜VJšœ œœ,˜?Jšœœ˜$J˜—šœ ˜Jšœœœ˜Jšœ˜—J˜Jš˜J˜Jšœœ˜J˜Jšœœ œ˜Jšœ œ(œ˜:Jšœ œ+œ˜=Jšœœ˜"Jšœ œÏc˜.J˜JšÏn œœœœ˜7J˜šŸœœœ˜ Jšœ œ˜Jšœ œ˜Jšœ˜ Jšœ˜J˜—šŸœœœœ.˜Qšœ œœ˜šœ œ˜šœ ˜ JšœGœ˜R—Jšœœ*˜?šœ œ ˜Jšœœ ˜Jšœ;˜;Jšœ˜Jšœ˜—Jšœœ˜!Jšœ˜Jšœ˜—JšœT™Tšœ ˜ JšœGœ˜Q—J˜8šœœœ˜5Jšœ6˜6Jšœ˜—šœ%œ&œœ˜YJšœœ˜ Jšœ˜—J˜Jšœ œ*˜9šœœ˜4JšœU˜UJšœ˜—J˜ J˜—Jšœ˜Jšœ˜J˜—šŸœœœ˜Jšœ2œ ˜AJ˜"Jšœ*œœ˜7˜Jš œ œœœœ#˜B—J˜7J˜5Jšœœ'˜HJšœ˜J˜—šŸœœœ˜Jšœœœ˜Jšœ œœ˜Jšœœ ˜(šœ˜Jšœœ˜!J˜J˜—šœ˜Jšœœ˜+J˜J˜—˜J˜J˜——šŸ œœœ˜JšœA˜AJšœ*˜*Jšœ˜Jšœœ˜8šœ˜J˜——šŸ œœœ˜1Jšœ.˜5Jšœ˜J˜J˜—šŸ œœœ+˜BJšœ œ ˜ Jšœ˜%J˜—šŸ œœœœ#˜Zšœ œ,˜9J˜Jšœœž:˜BJšœ˜—šœœœ˜$JšœC˜CJšœ˜—šœ˜J˜——šŸ œœœ˜Jšœ'œœ˜9šœœ˜2Jšœœ œœ˜RJšœ˜—Jšœœ˜ Jšœ˜J˜—š Ÿ œœœ)œœ˜RJšœ˜%J˜—š Ÿœœœ)œœ˜WJšœ$˜*J˜J˜—Jšœ™J˜š Ÿ œœœ œœ˜QJšœ$œœ˜DJ˜J˜J˜—šŸ œœœ˜JšœAœ˜NJšœœœ˜8šœœœ˜%Jšœœ ˜šœ˜ Jšœ œ˜Jšœž,˜>—Jš˜—šœ˜J˜——šŸœœœ˜JšœœDœœ˜]Jšœ˜"šœœ˜šœ<œ˜`Jšœ˜—Jš˜—šœ˜J˜——šŸ œœœ˜J˜&Jšœœ$œœ˜=Jšœ/˜6šœ˜˜šœ œœ˜0Jšœœœ˜Jšœ˜——˜ šœœ˜%Jšœœœ˜Jšœ˜——Jšœ˜—Jšœ!˜'Jšœ˜J˜—šœ˜J˜——…—¤