-- BcdDefs.Mesa Edited by Satterthwaite on August 26, 1980 9:15 AM
-- Copyright Xerox Corporation 1979, 1980
DIRECTORY
PrincOps: TYPE USING [EPIndex, GFTIndex, GFTNull, MaxFrameSize, MaxNGfi],
Table: TYPE USING [Base, Limit, Selector],
TimeStamp: TYPE USING [Null, Stamp];
BcdDefs: DEFINITIONS =
BEGIN
Base: TYPE = Table.Base;
-- allocation codes for the binder
BinderNTables: CARDINAL = 17;
treetype: Table.Selector = 0; -- trees
httype: Table.Selector = 1; -- hash table
sstype: Table.Selector = 2; -- (packed) string table
cttype: Table.Selector = 3; -- config table
mttype: Table.Selector = 4; -- module table
imptype: Table.Selector = 5; -- import table
exptype: Table.Selector = 6; -- export table
sgtype: Table.Selector = 7; -- segment table
fttype: Table.Selector = 8; -- file table
sttype: Table.Selector = 9; -- semantic table
cxtype: Table.Selector = 10; -- context table
nttype: Table.Selector = 11; -- name table
evtype: Table.Selector = 12; -- external variable table
sptype: Table.Selector = 13; -- space table
fptype: Table.Selector = 14; -- frame pack table
typtype: Table.Selector = 15; -- type table
tmtype: Table.Selector = 16; -- type table
-- version identification
VersionStamp: TYPE = TimeStamp.Stamp;
NullVersion: TimeStamp.Stamp = TimeStamp.Null;
-- BCD Header
VersionID: CARDINAL = 01280;
BCD: TYPE = RECORD [
versionIdent: CARDINAL,
version: VersionStamp,
creator: VersionStamp,
sourceVersion: VersionStamp,
source: NameRecord,
spare1, spare2: BOOLEAN,
nPages: [0..377B],
nConfigs, nModules: CARDINAL,
nImports, nExports: CARDINAL,
definitions, repackaged, typeExported, tableCompiled: BOOLEAN,
versions, extended: BOOLEAN,
firstdummy: GFTIndex,
nDummies: CARDINAL,
ssOffset: CARDINAL, -- string table
ssLimit: CARDINAL,
ctOffset: CARDINAL, -- config table
ctLimit: CTIndex,
mtOffset: CARDINAL, -- module table
mtLimit: MTIndex,
impOffset: CARDINAL, -- import table
impLimit: IMPIndex,
expOffset: CARDINAL, -- export table
expLimit: EXPIndex,
evOffset: CARDINAL, -- external variable table
evLimit: EVIndex,
sgOffset: CARDINAL, -- segment table
sgLimit: SGIndex,
ftOffset: CARDINAL, -- file table
ftLimit: FTIndex,
spOffset: CARDINAL, -- space table
spLimit: SPIndex,
ntOffset: CARDINAL, -- name table
ntLimit: NTIndex,
typOffset: CARDINAL, -- type table
typLimit: TYPIndex,
tmOffset: CARDINAL, -- type map table
tmLimit: TMIndex,
fpOffset: CARDINAL, -- frame pack table
fpLimit: FPIndex];
-- Portable Type
Portable: TYPE = {module, interface};
-- Name Table
PackedString: TYPE = MACHINE DEPENDENT RECORD [
SELECT OVERLAID * FROM
string => [string: StringBody],
size => [size: PACKED ARRAY [-3..-3) OF [0..377B]]
ENDCASE];
NameRecord: TYPE = RECORD [CARDINAL];
NullName: NameRecord = [1];
NTRecord: TYPE = RECORD [name: NameRecord, item: Namee];
Namee: TYPE = RECORD [
SELECT type: * FROM
config => [cti: CTIndex],
module => [mti: MTIndex],
import => [impi: IMPIndex],
export => [expi: EXPIndex]
ENDCASE];
NTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO NTRecord;
NTNull: NTIndex = LAST[NTIndex];
-- Configuration Table
CTRecord: TYPE = RECORD [
name: NameRecord,
namedInstance: BOOLEAN,
file: FTIndex,
config: CTIndex,
nControls: CARDINAL,
controls: ARRAY [0..0) OF MTIndex];
CTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO CTRecord;
CTNull: CTIndex = LAST[CTIndex];
-- Module Table
LinkLocation: TYPE = {frame, code};
MTRecord: TYPE = RECORD [
name: NameRecord,
namedInstance: BOOLEAN,
initial: BOOLEAN,
file: FTIndex,
links: LinkLocation,
config: CTIndex,
code: CodeDesc,
sseg: SGIndex,
long, tableCompiled, boundsChecks, nilChecks: BOOLEAN,
acMap: SGIndex,
framesize: [0..PrincOps.MaxFrameSize),
altoCode, residentFrame, crossJumped, packageable: BOOLEAN,
gfi: GFTIndex,
variables: EVIndex,
ngfi: [1..PrincOps.MaxNGfi],
frame: FrameFrag];
CodeDesc: TYPE = RECORD [
sgi: SGIndex, packed: BOOLEAN, linkspace: BOOLEAN, offset, length: CARDINAL];
FrameFrag: TYPE = RECORD [length: CARDINAL, frag: ARRAY [0..0) OF Link];
MTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO MTRecord;
MTNull: MTIndex = LAST[MTIndex];
-- Import Table
IMPRecord: TYPE = RECORD [
name: NameRecord,
port: Portable,
namedInstance: BOOLEAN,
file: FTIndex,
gfi: GFTIndex,
ngfi: [1..PrincOps.MaxNGfi]];
IMPIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO IMPRecord;
IMPNull: IMPIndex = LAST[IMPIndex];
-- Export Table
EXPRecord: TYPE = RECORD [
name: NameRecord,
size: [0..377B],
port: Portable,
namedInstance, typeExported: BOOLEAN,
file: FTIndex,
links: ARRAY [0..0) OF Link];
EXPIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO EXPRecord;
EXPNull: EXPIndex = LAST[EXPIndex];
-- External Variable Table
EVRecord: TYPE = RECORD [length: CARDINAL, offsets: ARRAY [1..1) OF CARDINAL];
EVIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO EVRecord;
EVNull: EVIndex = LAST[EVIndex];
-- Segment Table
SegClass: TYPE = {code, symbols, acMap, other};
SGRecord: TYPE = RECORD [
class: SegClass, file: FTIndex, base: CARDINAL, pages, extraPages: [0..256)];
SGIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO SGRecord;
SGNull: SGIndex = LAST[SGIndex];
-- File Table
FTRecord: TYPE = RECORD [name: NameRecord, version: VersionStamp];
FTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO FTRecord;
FTNull: FTIndex = LAST[FTIndex];
FTSelf: FTIndex = LAST[FTIndex] - 1;
-- Space Table
SPRecord: TYPE = RECORD [
seg: SGIndex, length: CARDINAL, spaces: ARRAY [0..0) OF SpaceID];
SpaceID: TYPE = RECORD [
name: NameRecord, resident: BOOLEAN, offset: [0..256), pages: [1..128]];
SPIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO SPRecord;
SPNull: SPIndex = LAST[SPIndex];
-- Frame Pack Table
FPRecord: TYPE = RECORD [
name: NameRecord, length: CARDINAL, modules: ARRAY [0..0) OF MTIndex];
FPIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO FPRecord;
FPNull: FPIndex = LAST[FPIndex];
-- Type Table
TYPRecord: TYPE = RECORD [version: VersionStamp, id: RECORD [UNSPECIFIED]];
TYPIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO TYPRecord;
TYPNull: TYPIndex = LAST[TYPIndex];
-- Type Map Table
TMRecord: TYPE = RECORD [
version: VersionStamp, offset: CARDINAL, map: TYPIndex];
TMIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO TMRecord;
TMNull: TMIndex = LAST[TMIndex];
-- Links
GFTIndex: TYPE = PrincOps.GFTIndex;
GFTNull: GFTIndex = PrincOps.GFTNull;
EPIndex: TYPE = PrincOps.EPIndex;
EPLimit: CARDINAL = LAST[EPIndex] + 1;
VarIndex: TYPE = [0..17B];
VarLimit: CARDINAL = LAST[VarIndex] + 1;
NullLink: Link = [procedure[0, 0, FALSE]];
UnboundLink: Link = [procedure[0, 0, TRUE]];
LinkTag: TYPE = {variable, procedure, type};
VarTag: TYPE = {var, proc0, type, proc1};
Link: TYPE = MACHINE DEPENDENT RECORD [
SELECT OVERLAID LinkTag FROM
variable => [vgfi: GFTIndex, var: VarIndex, vtag: VarTag],
procedure => [gfi: GFTIndex, ep: EPIndex, tag: BOOLEAN],
type => [typeID: TYPIndex, type: BOOLEAN, proc: BOOLEAN]
ENDCASE];
END.