-- file: MB.mesa -- last modified by McCreight, August 18, 1981 10:46 AM -- written by McCreight, August 4, 1981 2:44 PM -- This interface supports the internalizing of the Micro Binary format -- file originally introduced by Deutsch in the early 1970's and now -- used to represent all of our ROM data. As defined in Maxc Document 9.2, -- dated July 6, 1972, pages 30-32, the format is a sequence of MBItems. DIRECTORY StreamDefs: FROM "StreamDefs"; MB: DEFINITIONS = PUBLIC BEGIN -- T Y P E S MBItemType: TYPE = MACHINE DEPENDENT{ end(0), dataWord(1), setLC(2), fixup(3), memName(4), addrSym(5), extRef(6)}; MBItem: TYPE = MACHINE DEPENDENT RECORD [ ugh(0): SELECT itemType(0): MBItemType FROM end => [], dataWord => [ -- in current memory at current LC, then advance LC lineNo(1): CARDINAL, bits(2): PACKED ARRAY [0..0) OF BOOLEAN -- high order in [0] ], setLC => [memNo(1), location(2): CARDINAL], -- make this memory and LC current fixup => [ memNo(1), location(2): CARDINAL, firstBit(3:0..7), lastBit(3:8..15): [0..255], bits(4): PACKED ARRAY [0..15] OF BOOLEAN], -- high order in [0] memName => [ memNo(1), width(2): CARDINAL, name(3): PACKED ARRAY [0..0) OF CHARACTER], addrSym => [ memNo(1), location(2): CARDINAL, name(3): PACKED ARRAY [0..0) OF CHARACTER], extRef => [ memNo(1), location(2): CARDINAL, firstBit(3:0..7), lastBit(3:8..15): [0..255], name(4): PACKED ARRAY [0..0) OF CHARACTER], ENDCASE]; MBHandle: TYPE = MBMemoryPtr; MBMemoryPtr: TYPE = LONG POINTER TO MBMemory; MBMemory: TYPE = RECORD [ nextMem: MBMemoryPtr ← NIL, name: LONG STRING ← NIL, zone: UNCOUNTED ZONE ← NIL, memNo, length, width: CARDINAL, words: MBWordPtr ← NIL, symbols: MBSymPtr ← NIL]; MBWordPtr: TYPE = LONG POINTER TO MBWord; MBWord: TYPE = RECORD [ nextWord: MBWordPtr ← NIL, location: LONG CARDINAL, value: PACKED SEQUENCE COMPUTED CARDINAL OF BOOLEAN -- low order in [0] ]; MBSymPtr: TYPE = LONG POINTER TO MBSym; MBSym: TYPE = RECORD [ nextSym: MBSymPtr, location: LONG CARDINAL, name: LONG STRING]; BitSource: TYPE = RECORD[ invert: BOOLEAN ← FALSE, s: SELECT source: * FROM constantFalse => NULL, addrBit => [index: CARDINAL], ENDCASE ]; Permutation: TYPE = RECORD[ seq: SEQUENCE length: CARDINAL OF BitSource ]; -- Permutation[0] says how to compute the low-order bit PermutationPtr: TYPE = LONG POINTER TO Permutation; -- P R O C E D U R E S IllegalMBFormat: SIGNAL; ReadMB: PROCEDURE [ s: StreamDefs.StreamHandle -- a word stream -- , z: UNCOUNTED ZONE] RETURNS [MBHandle]; FreeMB: PROCEDURE [mb: MBHandle]; FreeMBMemory: PROCEDURE [memP: LONG POINTER TO MBMemoryPtr]; FindMBMemory: PROCEDURE [mb: MBHandle, memName: STRING] RETURNS [MBMemoryPtr]; AnalyzeMemory: PROCEDURE [mem: MBMemoryPtr] RETURNS [decodeWidth, wordCount, wordWidth: CARDINAL]; SuppressDefaultWords: PROCEDURE [mem: MBMemoryPtr, default: BOOLEAN]; ReCast: PROCEDURE [mem: MBMemoryPtr, newWordWidth: CARDINAL]; -- steals low-order address bits to widen the word by a power of 2. -- puts all original bit 0's together, then all bit 1's, then bit 2's, etc. PermuteAddress: PROCEDURE [mem: MBMemoryPtr, p: PermutationPtr]; PermuteData: PROCEDURE [mem: MBMemoryPtr, p: PermutationPtr]; FindMBBit: PROCEDURE [ mb: MBHandle, memName: STRING, word: LONG CARDINAL, bit: CARDINAL] RETURNS [BOOLEAN]; END. -- MB