-- PrincOps.Mesa Edited by JGS on 2-Nov-81 11:22:20 -- Copyright (C) Xerox Corporation 1982. All rights reserved. PrincOps: DEFINITIONS = BEGIN BYTE: TYPE = [0..377B]; -- control link definitions ControlLinkTag: TYPE = {frame, procedure, indirect, rep}; ControlLink: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID ControlLinkTag FROM frame => [frame: LocalFrameHandle], procedure => [gfi: GFTIndex, ep: EPIndex, tag: BOOLEAN], indirect => [ SELECT OVERLAID * FROM port => [port: PortHandle], link => [link: POINTER TO ControlLink], ENDCASE], rep => [fill: [0..37777B], indirect: BOOLEAN, proc: BOOLEAN], ENDCASE]; ProcDesc, SignalDesc: TYPE = procedure ControlLink; TrapLink, NullLink: ControlLink = ControlLink[frame[NullLocalFrame]]; trapLink, nullLink: ControlLink = NullLink; UnboundLink: ControlLink = ControlLink[procedure[gfi: 0, ep: 0, tag: TRUE]]; unboundLink: ControlLink = UnboundLink; PortHandle: TYPE = POINTER TO Port; Port: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM representation => [in, out: UNSPECIFIED], links => [frame: LocalFrameHandle, dest: ControlLink], ENDCASE]; -- local frames LocalFrameHandle: TYPE = POINTER TO LocalVariables; LocalVariables: TYPE = ARRAY CARDINAL[0..0) OF UNSPECIFIED; LocalFrameBase: TYPE = POINTER TO LocalOverhead; LocalWord: TYPE = MACHINE DEPENDENT RECORD [ available (0:0..7): BYTE, fsi (0:8..15): FSIndex]; LocalOverhead: TYPE = MACHINE DEPENDENT RECORD [ word (0): LocalWord, returnlink (1): ControlLink, globallink (2): GlobalFrameHandle, pc (3): BytePC, local (4): LocalVariables]; NullLocalFrame, nullLocalFrame: LocalFrameHandle = LOOPHOLE[0]; localWordOffset: CARDINAL = 4; returnOffset: CARDINAL = 3; globalOffset, accessOffset: CARDINAL = 2; pcOffset: CARDINAL = 1; -- global frame GlobalFrameHandle: TYPE = POINTER TO GlobalVariables; GlobalVariables: TYPE = ARRAY CARDINAL[0..0) OF UNSPECIFIED; GlobalFrameBase: TYPE = POINTER TO GlobalOverhead; GlobalWord: TYPE = MACHINE DEPENDENT RECORD [ gfi (0:0..9): GFTIndex, started (0:10..10), copied (0:11..11), alloced (0:12..12), shared (0:13..13), trapxfers (0:14..14), codelinks (0:15..15): BOOLEAN]; GlobalCodebase: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM code => [codebase: PrefixHandle], offset => [offset, highHalf: CARDINAL], either => [ fill: CARDINAL[0..77777B], out: BOOLEAN, highByte, otherByte: BYTE], ENDCASE]; GlobalOverhead: TYPE = MACHINE DEPENDENT RECORD [ word (0): GlobalWord, codebase (1): GlobalCodebase, global (3): GlobalVariables]; NullGlobalFrame, nullGlobalFrame: GlobalFrameHandle = LOOPHOLE[0]; globalWordOffset: CARDINAL = 3; codebaseLowOffset: CARDINAL = 2; codebaseHighOffset: CARDINAL = 1; -- efficiently addressable portion of frames globalbase: CARDINAL = 0; localbase: CARDINAL = 0; framelink: CARDINAL = localbase; -- code segments BytePC: TYPE = RECORD [CARDINAL]; InstWord: TYPE = MACHINE DEPENDENT RECORD [evenbyte, oddbyte: BYTE]; FieldDescriptor: TYPE = MACHINE DEPENDENT RECORD [ offset: BYTE, posn: [0..16), size: [1..16]]; BiasRange: CARDINAL = 4; EPBias: TYPE = [0..BiasRange); EPRange: CARDINAL = 32; EPIndex: TYPE = [0..EPRange); EVRange: CARDINAL = BiasRange*EPRange; EVIndex: TYPE = [0..EVRange); -- Global frame size preceeds body zero CodeSegment: TYPE = MACHINE DEPENDENT RECORD [ header: PrefixHeader, entry: ARRAY [0..0) OF EVItem]; PrefixHandle: TYPE = LONG BASE POINTER TO CodeSegment; PrefixHeader: TYPE = MACHINE DEPENDENT RECORD [ globalFsi (0:0..7): BYTE, nEntries (0:8..15): [0..377B], info (1): PrefixInfo]; PrefixInfo: TYPE = MACHINE DEPENDENT RECORD [ available (0:0..4): [0..37B], stops (0:5..5): BOOLEAN, ngfi (0:6..7): [1..MaxNGfi], nlinks (0:8..15): [0..MaxNLinks]]; EVItem: TYPE = MACHINE DEPENDENT RECORD [ pc: BytePC]; CSegPrefix: TYPE = CodeSegment; EntryVectorItem: TYPE = EVItem; MaxNLinks, maxNLinks: CARDINAL = 255; MainBodyIndex, mainBodyIndex: CARDINAL = 0; -- Global Frame Table definitions MaxNGfi, maxNGfi: CARDINAL = 4; GFTIndex: TYPE = [0..1777B]; GFTNull, nullGFT: GFTIndex = 0; -- system frame allocation vector AllocTag: TYPE = {frame, empty, indirect, unused}; AVItem: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM data => [fsi: [0..37777B], tag: AllocTag], link => [link: POINTER TO AVItem], frame => [frame: LocalFrameHandle], ENDCASE]; FSIndex: TYPE = CARDINAL[0..256); AllocationVector: TYPE = ARRAY FSIndex OF AVItem; AVHandle: TYPE = POINTER TO AllocationVector; AV: AVHandle = LOOPHOLE[400B]; AVHeapSize: CARDINAL = 40B; AVHeap: TYPE = ARRAY [0..AVHeapSize) OF AVItem; LastAVHeapSlot: CARDINAL = AVHeapSize - 2; FrameSizeIndex: TYPE = [0..LastAVHeapSlot]; -- frame definitions MaxFrameSize, maxFrameSize: CARDINAL = 4092; MaxSmallFrameIndex, maxSmallFrameIndex: CARDINAL = 17; FrameVec, frameSizeMap: ARRAY FrameSizeIndex OF [0..MaxFrameSize] = [ 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 68, 80, 96, 112, 128, 148, 168, 192, 224, 252, 508, 764, 1020, 1276, 1532, 1788, 2044, 2556, 3068, 3580, 4092]; LargeReturnSlot: CARDINAL = AVHeapSize - 1; -- ESC and ESCL trap table OpTrapTable: TYPE = POINTER TO ARRAY BYTE OF ControlLink; ESCTrapTable: OpTrapTable = LOOPHOLE[1400B]; -- Global Frame Table definitions GFTHandle: TYPE = POINTER TO ARRAY [0..0) OF GFTItem; GFT: GFTHandle = LOOPHOLE[2000B]; GFTItem: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM frame => [gf: GlobalFrameHandle], ep => [data: [0..37777B], epbias: [0..3]], ENDCASE]; EmptyGFTItem: GFTItem = [ep[data: 0, epbias: 0]]; FreedGFTItem: GFTItem = [ep[data: 0, epbias: 3]]; -- Evaluation Stack SVPointer: TYPE = POINTER TO StateVector; stackDepth: CARDINAL = 14; StateVector: TYPE = MACHINE DEPENDENT RECORD [ stk(0): ARRAY [0..stackDepth) OF UNSPECIFIED, instbyte(stackDepth:0..7): BYTE, stkptr(stackDepth:8..15): BYTE, -- 0 => empty stack data(stackDepth+1): SELECT OVERLAID * FROM dst => NULL, lst => [dest(stackDepth+1), source(stackDepth+2): PrincOps.ControlLink], fault => [ frame(stackDepth+1): LocalFrameHandle, faultData(stackDepth+2): SELECT OVERLAID * FROM allocFault => [fsi(stackDepth+2): FrameSizeIndex], memFault => [memPointer(stackDepth+2): LONG POINTER], otherFault => [dataArray(stackDepth+2): ARRAY [0..0) OF UNSPECIFIED], ENDCASE], ENDCASE]; MaxParamsInStack, maxParamsInStack: CARDINAL = stackDepth - 2; END.