DIRECTORY Table USING [Base, Selector]; MobDefs: DEFINITIONS = { Base: TYPE = Table.Base; MobBase: TYPE = LONG POINTER TO Mob; NTHandle: TYPE = LONG POINTER TO NTRecord; CTHandle: TYPE = LONG POINTER TO CTRecord; MTHandle: TYPE = LONG POINTER TO MTRecord; IMPHandle: TYPE = LONG POINTER TO IMPRecord; EXPHandle: TYPE = LONG POINTER TO EXPRecord; EVHandle: TYPE = LONG POINTER TO EVRecord; SGHandle: TYPE = LONG POINTER TO SGRecord; FTHandle: TYPE = LONG POINTER TO FTRecord; SPHandle: TYPE = LONG POINTER TO SPRecord; FPHandle: TYPE = LONG POINTER TO FPRecord; TYPHandle: TYPE = LONG POINTER TO TYPRecord; TMHandle: TYPE = LONG POINTER TO TMRecord; NameString: TYPE = LONG POINTER TO PackedString; BinderNTables: CARD16 = 20; Selector: TYPE = Table.Selector[0..BinderNTables); treetype: Selector = 0; -- trees httype: Selector = 1; -- hash table sstype: Selector = 2; -- (packed) string table cttype: Selector = 3; -- config table mttype: Selector = 4; -- module table imptype: Selector = 5; -- import table exptype: Selector = 6; -- export table sgtype: Selector = 7; -- segment table fttype: Selector = 8; -- file table sttype: Selector = 9; -- semantic table cxtype: Selector = 10; -- context table nttype: Selector = 11; -- name table evtype: Selector = 12; -- external variable table sptype: Selector = 13; -- space table fptype: Selector = 14; -- frame pack table typtype: Selector = 15; -- type table tmtype: Selector = 16; -- type table lftype: Selector = 17; -- link fragment table rftype: Selector = 18; -- ref literal and atom fragment table tftype: Selector = 19; -- type fragment table VersionStamp: TYPE = ARRAY [0..1] OF CARD; NullVersion: VersionStamp = [0, 0]; VersionID: INT = 880328; -- defined on 28 March 1988 Mob: TYPE = MACHINE DEPENDENT RECORD [ versionIdent: INT ¬ VersionID, format: MobFormat, version: VersionStamp, creator: VersionStamp, sourceVersion: VersionStamp, source: NameRecord, nBytes: INT, -- # of bytes in the file nConfigs, nModules, nImports, nExports: CARD16, definitions, repackaged, typeExported: BOOL, inlineFloat: BOOL, mappingStarted: BOOL, mappingFinished: BOOL, versions: BOOL, extended: BOOL ¬ TRUE, padOptions: BYTE ¬ 0, padDummy: [0..3] ¬ 0, firstdummy: ModuleIndex, nDummies: CARD16, pad1: CARD16, ssOffset: MobOffset, -- string table ssLimit: MobOffset, ctOffset: MobOffset, -- config table ctLimit: CTIndex, mtOffset: MobOffset, -- module table mtLimit: MTIndex, impOffset: MobOffset, -- import table impLimit: IMPIndex, expOffset: MobOffset, -- export table expLimit: EXPIndex, evOffset: MobOffset, -- external variable table evLimit: EVIndex, sgOffset: MobOffset, -- segment table sgLimit: SGIndex, ftOffset: MobOffset, -- file table ftLimit: FTIndex, spOffset: MobOffset, -- space table spLimit: SPIndex, ntOffset: MobOffset, -- name table ntLimit: NTIndex, typOffset: MobOffset, -- type table typLimit: TYPIndex, tmOffset: MobOffset, -- type map table tmLimit: TMIndex, fpOffset: MobOffset, -- frame pack table fpLimit: FPIndex, lfOffset: MobOffset, -- link fragment table lfLimit: LFIndex, rfOffset: MobOffset, -- ref literal fragment table rfLimit: RFIndex, tfOffset: MobOffset, -- type fragment table tfLimit: TFIndex, rtOffset: MobOffset, -- atom print names, type table, etc. rtLimit: MobOffset ]; checkMobSize: BOOL [TRUE..TRUE] = (SIZE[Mob] MOD SIZE[CARD]) = 0; MobFormat: TYPE = RECORD [ bytes: PACKED ARRAY [0..4) OF BYTE ¬ [0, 1, 2, 3], halves: PACKED ARRAY [0..2) OF CARD16 ¬ [0, 1], sign: INT ¬ FIRST[INT], bitsPerWord: PACKED ARRAY [0..4) OF BYTE ¬ [BITS[WORD], BITS[WORD], BITS[WORD], BITS[WORD]], bitsPerUnit: PACKED ARRAY [0..4) OF BYTE ¬ [BITS[UNIT], BITS[UNIT], BITS[UNIT], BITS[UNIT]] ]; MobOffset: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM foreign => [xUnits: INT], -- when reader & writer differ domestic => [units: INT] -- when reader & writer user same format ENDCASE]; Portable: TYPE = MACHINE DEPENDENT {module(0), interface(1)}; PackedString: TYPE = MACHINE DEPENDENT RECORD [ length: CARD16, text: PACKED SEQUENCE maxLength: CARD16 OF CHAR ]; NameRecord: TYPE = MACHINE DEPENDENT RECORD [INT]; NullName: NameRecord = [0]; NTRecord: TYPE = MACHINE DEPENDENT RECORD [ name: NameRecord, item: Namee ]; checkNTRecord: [0..0] = BYTES[NTRecord] MOD 4; Namee: TYPE = MACHINE DEPENDENT RECORD [ pad1: CARD16, pad2: [0..CARD16.LAST/4], cases: SELECT type: * FROM config => [cti: CTIndex], module => [mti: MTIndex], import => [impi: IMPIndex], export => [expi: EXPIndex] ENDCASE ]; checkNamee: [0..0] = BYTES[Namee] MOD 4; NTIndex: TYPE = Base RELATIVE LONG POINTER TO NTRecord; NTNull: NTIndex = NTIndex.LAST; CTRecord: TYPE = MACHINE DEPENDENT RECORD [ name: NameRecord, file: FTIndex, config: CTIndex, namedInstance: BOOL, pad: NAT15, nControls: CARD16, controls: SEQUENCE COMPUTED NAT OF Namee ]; checkCTRecord: [0..0] = BYTES[CTRecord] MOD 4; CTIndex: TYPE = Base RELATIVE LONG POINTER TO CTRecord; CTNull: CTIndex = CTIndex.LAST; LinkLocKind: TYPE = MACHINE DEPENDENT { framePrefix(0), codePrefix(1), inFrame(2), dontcare(3)}; MTRecord: TYPE = MACHINE DEPENDENT RECORD [ name: NameRecord, namedInstance: BOOL, initial: BOOL, frameRefs: BOOL, -- TRUE IFF there are REFs in this frame spare: BOOL ¬ FALSE, residentFrame, crossJumped, packageable: BOOL, long, inlineFloat, boundsChecks, nilChecks: BOOL, pad1: CARDINAL[0..31] ¬ 0, pad2: CARD16 ¬ 0, linkLoc: LinkLocKind, -- indicates frame or code links modIndex: ModuleIndex, -- index of this module entries: ProcIndex, -- # of entry points to this module file: FTIndex, config: CTIndex, code: CodeDesc, sseg: SGIndex, links: LFIndex, refLiterals: RFIndex, types: TFIndex, -- the type indexes for this frame frameType: TypeIndex, -- the type for this frame framesize: CARD, -- # of AUs this frame occupies variables: EVIndex -- # of external variables in this frame ]; checkMTRecordSize: BOOL [TRUE..TRUE] = (SIZE[MTRecord] MOD SIZE[CARD]) = 0; CodeDesc: TYPE = MACHINE DEPENDENT RECORD [ sgi: SGIndex, packed: BOOL, linkspace: BOOL, pad1: CARDINAL[0..CARD16.LAST/4] ¬ 0, pad2: CARD16 ¬ 0, offset: INT, length: INT ]; MTIndex: TYPE = Base RELATIVE LONG POINTER TO MTRecord; MTNull: MTIndex = MTIndex.LAST; IMPRecord: TYPE = MACHINE DEPENDENT RECORD [ name: NameRecord ¬ NullName, file: FTIndex ¬ FTNull, port: Portable, namedInstance: BOOL, modIndex: ModuleIndex ¬ 0, offset: CARD16 ]; IMPIndex: TYPE = Base RELATIVE LONG POINTER TO IMPRecord; IMPNull: IMPIndex = IMPIndex.LAST; EXPRecord: TYPE = MACHINE DEPENDENT RECORD [ name: NameRecord ¬ NullName, file: FTIndex ¬ FTNull, pad: CARDINAL[0..CARD16.LAST/8] ¬ 0, port: Portable, namedInstance: BOOL, typeExported: BOOL, links: SEQUENCE nLinks: CARD16 OF EXPLink ]; EXPLink: TYPE = MACHINE DEPENDENT RECORD [ pad: CARD16 ¬ 0, to: LinkOffset, from: Link ]; EXPIndex: TYPE = Base RELATIVE LONG POINTER TO EXPRecord; EXPNull: EXPIndex = EXPIndex.LAST; EVRecord: TYPE = MACHINE DEPENDENT RECORD [ pad: CARD16, length: CARD16, offsets: PACKED SEQUENCE COMPUTED [1..CARD16.LAST) OF CARD ]; EVIndex: TYPE = Base RELATIVE LONG POINTER TO EVRecord; EVNull: EVIndex = EVIndex.LAST; SegClass: TYPE = MACHINE DEPENDENT {code (0), symbols, acMap, other (CARD16.LAST)}; SGRecord: TYPE = MACHINE DEPENDENT RECORD [ file: FTIndex, class: SegClass, pad: CARD16, base: MobOffset, -- offset from file start in writer units units: MobOffset, -- # of writer units of info extraUnits: MobOffset -- # of writer units of extra info ]; SGIndex: TYPE = Base RELATIVE LONG POINTER TO SGRecord; SGNull: SGIndex = SGIndex.LAST; FTRecord: TYPE = MACHINE DEPENDENT RECORD [ name: NameRecord, version: VersionStamp ]; FTIndex: TYPE = Base RELATIVE LONG POINTER TO FTRecord; FTNull: FTIndex = FTIndex.LAST; FTSelf: FTIndex = FTIndex.LAST - WORDS[WORD]; SPRecord: TYPE = MACHINE DEPENDENT RECORD [ seg: SGIndex, name: NameRecord, length: CARD16, pad: CARD16, spaces: SEQUENCE COMPUTED NAT OF SpaceID ]; SpaceID: TYPE = MACHINE DEPENDENT RECORD [ name: NameRecord, resident: BOOL, offset: NAT15, pages: [1..CARD16.LAST] ]; SPIndex: TYPE = Base RELATIVE LONG POINTER TO SPRecord; SPNull: SPIndex = SPIndex.LAST; FPRecord: TYPE = MACHINE DEPENDENT RECORD [ name: NameRecord, length: CARD16, pad: CARD16, modules: SEQUENCE COMPUTED NAT OF MTIndex ]; FPIndex: TYPE = Base RELATIVE LONG POINTER TO FPRecord; FPNull: FPIndex = FPIndex.LAST; TYPRecord: TYPE = MACHINE DEPENDENT RECORD [ version: VersionStamp, id: INT ]; TYPIndex: TYPE = Base RELATIVE LONG POINTER TO TYPRecord; TYPNull: TYPIndex = TYPIndex.LAST; TMRecord: TYPE = RECORD [ version: VersionStamp, offset: INT, map: TYPIndex]; TMIndex: TYPE = Base RELATIVE LONG POINTER TO TMRecord; TMNull: TMIndex = TMIndex.LAST; ModuleIndex: TYPE = CARDINAL[0..CARD16.LAST/4]; nullModule: ModuleIndex = ModuleIndex.FIRST; ProcIndex: TYPE = LinkOffset; procLimit: CARD16 = LinkOffset.LAST; VarIndex: TYPE = LinkOffset; varLimit: CARD16 = LinkOffset.LAST; nullLink: Link = [var, 0, 0]; unboundLink: Link = [proc, 0, 0]; LinkFrag: TYPE = MACHINE DEPENDENT RECORD [ offset: CARD16 ¬ 0, frag: SEQUENCE length: CARD16 OF Link ]; Link: TYPE = MACHINE DEPENDENT RECORD [ tag: LinkTag ¬ other, modIndex: ModuleIndex ¬ 0, offset: LinkOffset ¬ 0 ]; LinkTag: TYPE = MACHINE DEPENDENT {var(0), proc(1), type(2), other(3)}; LinkOffset: TYPE = CARD16; LFIndex: TYPE = Base RELATIVE LONG POINTER TO LinkFrag; LFNull: LFIndex = LFIndex.LAST; RefLitFrag: TYPE = MACHINE DEPENDENT RECORD [ offset: CARD16, frag: SEQUENCE length: CARD16 OF RefLitIndex ]; RefLitIndex: TYPE = RECORD [INT]; RFIndex: TYPE = Base RELATIVE LONG POINTER TO RefLitFrag; RFNull: RFIndex = RFIndex.LAST; TypeFrag: TYPE = MACHINE DEPENDENT RECORD [ offset: CARD16, frag: PACKED SEQUENCE length: CARD16 OF TypeIndex ]; TypeIndex: TYPE = RECORD [INT]; TFIndex: TYPE = Base RELATIVE LONG POINTER TO TypeFrag; TFNull: TFIndex = TFIndex.LAST; }. 6 MobDefs.mesa (formerly BcdDefs) Copyright Σ 1986, 1987, 1988, 1991 by Xerox Corporation. All rights reserved. Russ Atkinson (RRA) December 13, 1988 12:15:28 pm PST base pointer types allocation codes for the binder version identification Mob Header This definition is sufficient to determine the characteristics of the host machine when an arbitrary machine wants to read an object file. Even where not declared this way, all Limit fields in the header are also treated as MobOffset type for purposes of fixup on reading/writing. This type is here for bookeeping only. Portable Type Name Table This record occurs at ssOffset from the start of the bcd file. Every name is at most 255 characters long, the length being determined by the first byte. Configuration Table only config or module are valid Module Table Import Table name of imported item file for imported item either a module import or an interface record import TRUE if the imported item was explicitly named index of the module receiving the import offset in link area of the reference to the module or interface record Export Table name of exported item file defining exported item either a module export or an interface record export TRUE if the exported item was explicitly named TRUE if a type is exported the destination offset (in interface record) of the exported link the source of the link External Variable Table Segment Table File Table Space Table Frame Pack Table Type Table Type Map Table Links the offset in AUs to where the links are (only useful if linkLoc = inFrame) Atoms and REFs to literals Types Κ_–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ ΟeœC™NK™5—˜KšΟk œžœ˜'—IheadšœΟnœž œ˜K˜™K˜Kšœžœ˜K˜Kš œ žœžœžœžœ˜$K˜Kš œ žœžœžœžœ ˜*Kš œ žœžœžœžœ ˜*Kš œ žœžœžœžœ ˜*Kš œ žœžœžœžœ ˜,Kš œ žœžœžœžœ ˜,Kš œ žœžœžœžœ ˜*Kš œ žœžœžœžœ ˜*Kš œ žœžœžœžœ ˜*Kš œ žœžœžœžœ ˜*Kš œ žœžœžœžœ ˜*Kš œ žœžœžœžœ ˜,Kš œ žœžœžœžœ ˜*K˜Kš œ žœžœžœžœ˜0K˜—šœ™K˜Kšœžœ˜Kšœ žœ$˜2K˜KšœΟc˜ Kšœ  ˜#Kšœ ˜.Kšœ ˜%Kšœ ˜%Kšœ ˜&Kšœ ˜&Kšœ ˜&Kšœ  ˜#Kšœ ˜'Kšœ ˜'Kšœ  ˜$Kšœ ˜1Kšœ ˜%Kšœ ˜*Kšœ  ˜%Kšœ  ˜$Kšœ ˜-Kšœ &˜=Kšœ ˜-K˜—šœ™K˜š œžœžœžœžœ˜*Kšœ#˜#—K˜—šœ ™ K˜Kšœ žœ  ˜4K˜š œžœžœž œžœ˜&Kšœžœ ˜Kšœ˜K˜K˜K˜K˜Kšœžœ ˜'Kšœ(žœ˜/Kšœ'žœ˜,Kšœ žœ˜Kšœžœ˜Kšœžœ˜Kšœ žœ˜Kšœ žœžœ˜Kšœ žœ˜K˜K˜Kšœ žœ˜Kšœžœ˜ Kšœ ˜$Kšœ˜Kšœ ˜$K˜Kšœ ˜$K˜Kšœ ˜%K˜Kšœ ˜%K˜Kšœ ˜/K˜Kšœ ˜%K˜Kšœ  ˜"K˜Kšœ ˜#K˜Kšœ  ˜"K˜Kšœ  ˜#K˜Kšœ ˜&K˜Kšœ ˜(K˜Kšœ ˜+K˜Kšœ ˜2K˜Kšœ ˜+K˜Kšœ %˜:Kšœ˜Kšœ˜Kšœžœžœžœžœžœžœžœ˜AK˜—šœ žœžœ˜Kš œžœžœžœžœ˜2Kš œžœžœžœžœ ˜/Kšœžœžœžœ˜Kšœ žœžœžœžœžœžœžœžœžœžœžœžœ˜\Kšœ žœžœžœžœžœžœžœžœžœžœžœžœ˜[K˜K™ŠK˜—š œ žœžœž œžœ˜,šžœžœž˜Kšœžœ ˜8Kšœžœ (˜AKšžœ˜ —Kšœ΅™΅K˜——šœ ™ K˜Kšœ žœžœž œ˜=K˜—šœ ™ K˜š œžœžœž œžœ˜/Kšœžœ˜Kš œžœžœ žœžœž˜/K˜Kšœ™™™—K˜Kš œ žœžœž œžœžœ˜2K˜K˜š œ žœžœž œžœ˜+Kšœ˜Kšœ ˜ Kšœ˜Kšœžœ žœ˜.—K˜š œžœžœž œžœ˜(Kšœžœ˜ Kšœ žœžœ˜šœžœ ž˜K˜K˜K˜K˜Kšž˜—Kšœ˜Kšœžœžœ˜(—K˜Kš œ žœžœžœžœžœ ˜7Kšœžœ˜K˜—šœ™K˜š œ žœžœž œžœ˜+K˜K˜K˜Kšœžœ˜Kšœžœ˜ Kšœ žœ˜š œ žœžœžœžœ˜(Kšœ™—Kšœ˜Kšœžœ žœ˜.K˜—Kš œ žœžœžœžœžœ ˜7Kšœžœ˜K˜—šœ ™ K˜šœ žœžœž œ˜'Kšœ˜Kšœ˜K˜ Kšœ ˜ K˜—–2.2 in tabStopsš œ žœžœž œžœ˜+K–2.2 in tabStops˜K–2.2 in tabStopsšœžœ˜K–2.2 in tabStopsšœ žœ˜K–2.2 in tabStopsšœ žœ (˜9K–2.2 in tabStopsšœž œ˜K–2.2 in tabStopsšœ)žœ˜.K–2.2 in tabStopsšœ,žœ˜1K–2.2 in tabStopsšœžœ ˜K–2.2 in tabStopsšœžœ˜K–2.2 in tabStopsšœ  ˜6K–2.2 in tabStopsšœ ˜.K–2.2 in tabStopsšœ #˜7K–2.2 in tabStops˜K–2.2 in tabStops˜K–2.2 in tabStops˜K–2.2 in tabStops˜K–2.2 in tabStops˜K–2.2 in tabStops˜K–2.2 in tabStopsšœ "˜2K–2.2 in tabStopsšœ ˜0K–2.2 in tabStopsšœ žœ ˜0K–2.2 in tabStopsšœ (˜;K–2.2 in tabStops˜K–2.2 in tabStopsšœžœžœžœžœ žœžœžœ˜KK˜—š œ žœžœž œžœ˜+Kšœ ˜ Kšœžœ žœ˜Kšœžœžœžœ˜%Kšœžœ˜Kšœžœ˜ Kšœž˜ Kšœ˜K˜—Kš œ žœžœžœžœžœ ˜7Kšœžœ˜K˜—šœ ™ K˜š œ žœžœž œžœ˜,˜Kšœ™—˜K™—˜K™4—šœžœ˜Kšžœ*™.—šœ˜K™(—šœž˜KšœF™F—Kšœ˜K˜—Kš œ žœžœžœžœžœ ˜9Kšœžœ˜"K˜—šœ ™ K˜š œ žœžœž œžœ˜,˜Kšœ™—˜Kšœ™—Kšœžœžœžœ˜$˜K™4—šœžœ˜Kšžœ*™.—šœžœ˜Kšžœ™—Kšœžœ žœžœ˜)Kšœ˜K˜—š œ žœžœž œžœ˜*Kšœžœ˜šœ˜K™A—˜ Kšœ™—K˜K˜—Kš œ žœžœžœžœžœ ˜9Kšœžœ˜"K˜—šœ™K˜š œ žœžœž œžœ˜+Kšœžœ˜ Kšœžœ˜Kšœ žœžœžœžœžœžœž˜:Kšœ˜K˜—Kš œ žœžœžœžœžœ ˜7Kšœžœ˜K˜—šœ ™ K˜Kš œ žœžœž œ#žœžœ˜SK˜š œ žœžœž œžœ˜+Kšœ˜Kšœ˜Kšœžœ˜ Kšœ )˜:Kšœ ˜.Kšœ "˜8Kšœ˜K˜—Kš œ žœžœžœžœžœ ˜7Kšœžœ˜K˜—šœ ™ K˜šœ žœžœžœ˜+Kšœ˜Kšœ˜Kšœ˜K˜—š œ žœžœžœžœžœ ˜7KšŸœžœ˜KšŸœžœžœžœ˜-—K˜—šœ ™ K˜š œ žœžœž œžœ˜+K˜ K˜Kšœžœ˜Kšœžœ˜ Kš œžœžœžœžœ˜(Kšœ˜K˜—š œ žœžœž œžœ˜*Kšœ˜Kšœ žœ˜Kšœžœ˜Kšœ žœžœ˜Kšœ˜K˜—Kš œ žœžœžœžœžœ ˜7Kšœžœ˜K˜—šœ™K˜š œ žœžœž œžœ˜+Kšœ˜Kšœžœ˜Kšœžœ˜ Kš œ žœžœžœžœ˜)Kšœ˜K˜—Kš œ žœžœžœžœžœ ˜7Kšœžœ˜K˜—šœ ™ K˜š œ žœžœž œžœ˜,Kšœ˜Kšœž˜Kšœ˜K˜—Kš œ žœžœžœžœžœ ˜9Kšœžœ˜"K˜—šœ™K˜šœ žœžœ˜Kšœ˜Kšœžœ˜ Kšœ˜—K˜Kš œ žœžœžœžœžœ ˜7Kšœžœ˜K˜—šœ™K˜š œ žœžœžœžœ˜/Kšœ&žœ˜,—K˜šœ žœ˜Kšœ žœžœ˜$—K˜šœ žœ˜Kšœ žœžœ˜#—K˜Kšœ˜Kšœ!˜!K˜šœ žœžœžœ˜+šœžœ˜™(Kšœ"™"——Kšœžœ žœžœ˜%Kšœ˜K˜—š œžœžœž œžœ˜'Kšœ˜Kšœ˜Kšœ˜Kšœ˜—šœ žœžœž œ&˜GK˜—Kšœ žœžœ˜K˜Kš œ žœžœžœžœžœ ˜7Kšœžœ˜K˜—šœ™K˜šœ žœžœžœ˜-Kšœžœ˜Kšœžœ žœžœ ˜,Kšœ˜—Kšœ žœžœžœ˜!K˜Kš œ žœžœžœžœžœ ˜9Kšœžœ˜K˜—šœ™K˜š œ žœžœž œžœ˜+Kšœžœ˜Kš œžœžœ žœžœ ˜1Kšœ˜K˜—Kšœ žœžœžœ˜K˜Kš œ žœžœžœžœžœ ˜7Kšœžœ˜—K˜K˜K˜K˜—…—&š@/