<<>> <> <> <> <> DIRECTORY IntCodeTarget USING [BitOrder], Rope USING [ROPE], Target: TYPE MachineParms USING [BitOrder, bitOrder, bitsPerAU, bitsPerByte, bitsPerWord]; IntCodeTargetImpl: CEDAR PROGRAM EXPORTS IntCodeTarget = BEGIN ROPE: TYPE = Rope.ROPE; <> <> name: PUBLIC ROPE ¬ "Sun-3/4"; <> <> bitsPerAU: PUBLIC NAT ¬ Target.bitsPerAU; logBitsPerAU: PUBLIC NAT ¬ ExactLog2[bitsPerAU]; bytesPerAU: PUBLIC NAT ¬ Target.bitsPerAU/Target.bitsPerByte; logBytesPerAU: PUBLIC NAT ¬ ExactLog2[bytesPerAU]; <> bitOrder: PUBLIC IntCodeTarget.BitOrder ¬ SELECT Target.bitOrder FROM $msBit => $msBit, $lsBit => $lsBit, ENDCASE => ERROR; <> maxBitsArgumentRecord: PUBLIC NAT ¬ 16*Target.bitsPerWord; <> minBitsPerArgument: PUBLIC NAT ¬ Target.bitsPerWord; logMinBitsPerArgument: PUBLIC NAT ¬ ExactLog2[minBitsPerArgument]; <> <<(to get the bits for an argument, round up & shift by logMinBitsPerArgument)>> maxBitsReturnRecord: PUBLIC NAT ¬ 1*Target.bitsPerWord; <> minBitsPerReturn: PUBLIC NAT ¬ Target.bitsPerWord; logMinBitsPerReturn: PUBLIC NAT ¬ ExactLog2[minBitsPerReturn]; <> <> bitsPerGlobal: PUBLIC NAT ¬ Target.bitsPerWord; logBitsPerGlobal: PUBLIC NAT ¬ ExactLog2[bitsPerGlobal]; <> <<(can be different than locals)>> firstGlobalOffset: PUBLIC NAT ¬ 4*Target.bitsPerWord; <> <<(what should this be?)>> <<>> directGlobals: PUBLIC BOOL ¬ FALSE; < target supports direct use of global variables>> < target requires global frame pointer>> <> lastRegister: PUBLIC NAT ¬ 0; <> lastStack: PUBLIC NAT ¬ 0; <> <<>> bitsPerLocal: PUBLIC NAT ¬ Target.bitsPerWord; logBitsPerLocal: PUBLIC NAT ¬ ExactLog2[bitsPerLocal]; <> bitsPerLink: PUBLIC NAT ¬ Target.bitsPerWord; logBitsPerLink: PUBLIC NAT ¬ ExactLog2[bitsPerLink]; <> <<(uniform for static link, global link, & frame extension if any).>> ExactLog2: PROC [n: NAT] RETURNS [log2: NAT ¬ 2] = { RETURN [SELECT n FROM 1 => 0, 2 => 1, 4 => 2, 8 => 3, 16 => 4, 32 => 5, 64 => 6, 128 => 7, 256 => 8, 512 => 9, 1024 => 10, 2048 => 11, 4096 => 12, 8192 => 13, 16384 => 14 ENDCASE => ERROR]; }; END.