<<>> <> <> <> <<>> DIRECTORY TargetArchitecture, RuntimeError; TargetArchitectureImpl: CEDAR PROGRAM IMPORTS RuntimeError EXPORTS TargetArchitecture ~ { IsNullAddress: PUBLIC PROCEDURE [address: TargetArchitecture.Address] RETURNS [BOOLEAN] ~ { isNullAddress: BOOLEAN ~ (address = TargetArchitecture.nullAddress); RETURN [isNullAddress]; }; AddressFromDisplacement: PUBLIC PROCEDURE [ address: TargetArchitecture.Address, displacement: TargetArchitecture.Displacement] RETURNS [TargetArchitecture.Address] ~ { ordAddress: CARD32 ~ LOOPHOLE[address]; ordTarget: CARD32 _ 0; displaced: TargetArchitecture.Address _ TargetArchitecture.nullAddress; IF displacement >= 0 THEN { absDisplacement: CARD32 ~ displacement; IF LAST[CARD32] - ordAddress < absDisplacement THEN { <> ERROR RuntimeError.BoundsFault; }; ordTarget _ ordAddress + absDisplacement; } ELSE { absDisplacement: CARD32 ~ -displacement; IF ordAddress < absDisplacement THEN { <> ERROR RuntimeError.BoundsFault; }; ordTarget _ ordAddress - absDisplacement; }; displaced _ LOOPHOLE[ordTarget]; RETURN [displaced]; }; DisplacementFromAddresses: PUBLIC PROCEDURE [ here: TargetArchitecture.Address, there: TargetArchitecture.Address] RETURNS [TargetArchitecture.Displacement] ~ { <> ordHere: CARD32 ~ LOOPHOLE[here]; ordThere: CARD32 ~ LOOPHOLE[there]; displacement: TargetArchitecture.Displacement ~ IF ordThere >= ordHere THEN ordThere - ordHere ELSE -(ordHere - ordThere); RETURN [displacement]; }; NextInstruction: PUBLIC PROCEDURE [pc: TargetArchitecture.Address] RETURNS [TargetArchitecture.Address] ~ { nextAddress: TargetArchitecture.Address ~ AddressFromDisplacement[ address: pc, displacement: +BYTES[TargetArchitecture.Instruction]]; RETURN [nextAddress]; }; PrevInstruction: PUBLIC PROCEDURE [pc: TargetArchitecture.Address] RETURNS [TargetArchitecture.Address] ~ { prevAddress: TargetArchitecture.Address ~ AddressFromDisplacement[ address: pc, displacement: -BYTES[TargetArchitecture.Instruction]]; RETURN [prevAddress]; }; InstructionFromContents: PUBLIC PROCEDURE [contents: TargetArchitecture.Contents] RETURNS [TargetArchitecture.Instruction] ~ { instruction: TargetArchitecture.Instruction ~ LOOPHOLE[contents]; RETURN [instruction]; }; ContentsFromInstruction: PUBLIC PROCEDURE [instruction: TargetArchitecture.Instruction] RETURNS [TargetArchitecture.Contents] ~ { contents: TargetArchitecture.Contents ~ LOOPHOLE[instruction]; RETURN [contents]; }; }. <<>>