forked from KolibriOS/kolibrios
110 lines
2.1 KiB
Plaintext
110 lines
2.1 KiB
Plaintext
|
(*
|
||
|
BSD 2-Clause License
|
||
|
|
||
|
Copyright (c) 2018, 2019, Anton Krotov
|
||
|
All rights reserved.
|
||
|
*)
|
||
|
|
||
|
MODULE MACHINE;
|
||
|
|
||
|
IMPORT UTILS;
|
||
|
|
||
|
|
||
|
CONST
|
||
|
|
||
|
min32* = -2147483647-1;
|
||
|
max32* = 2147483647;
|
||
|
|
||
|
|
||
|
VAR
|
||
|
|
||
|
target*:
|
||
|
|
||
|
RECORD
|
||
|
|
||
|
bit_depth*,
|
||
|
maxInt*,
|
||
|
minInt*,
|
||
|
maxSet*,
|
||
|
maxHex*: INTEGER;
|
||
|
|
||
|
maxReal*: REAL
|
||
|
|
||
|
END;
|
||
|
|
||
|
_64to32*: BOOLEAN;
|
||
|
|
||
|
|
||
|
PROCEDURE SetBitDepth* (pBitDepth: INTEGER);
|
||
|
BEGIN
|
||
|
ASSERT(pBitDepth <= UTILS.bit_depth);
|
||
|
ASSERT((pBitDepth = 32) OR (pBitDepth = 64));
|
||
|
|
||
|
_64to32 := (UTILS.bit_depth = 64) & (pBitDepth = 32);
|
||
|
|
||
|
target.bit_depth := pBitDepth;
|
||
|
target.maxSet := pBitDepth - 1;
|
||
|
target.maxHex := pBitDepth DIV 4;
|
||
|
target.minInt := ASR(UTILS.minint, UTILS.bit_depth - pBitDepth);
|
||
|
target.maxInt := ASR(UTILS.maxint, UTILS.bit_depth - pBitDepth);
|
||
|
target.maxReal := 1.9;
|
||
|
PACK(target.maxReal, 1023);
|
||
|
END SetBitDepth;
|
||
|
|
||
|
|
||
|
PROCEDURE Byte* (n: INTEGER; idx: INTEGER): BYTE;
|
||
|
BEGIN
|
||
|
WHILE idx > 0 DO
|
||
|
n := ASR(n, 8);
|
||
|
DEC(idx)
|
||
|
END
|
||
|
|
||
|
RETURN ORD(BITS(n) * {0..7})
|
||
|
END Byte;
|
||
|
|
||
|
|
||
|
PROCEDURE Align* (VAR bytes: INTEGER; align: INTEGER): BOOLEAN;
|
||
|
VAR
|
||
|
res: BOOLEAN;
|
||
|
|
||
|
BEGIN
|
||
|
IF bytes MOD align # 0 THEN
|
||
|
res := UTILS.maxint - bytes >= align - (bytes MOD align);
|
||
|
IF res THEN
|
||
|
bytes := bytes + align - (bytes MOD align)
|
||
|
END
|
||
|
ELSE
|
||
|
res := TRUE
|
||
|
END
|
||
|
|
||
|
RETURN res
|
||
|
END Align;
|
||
|
|
||
|
|
||
|
PROCEDURE Int32To64* (value: INTEGER): INTEGER;
|
||
|
BEGIN
|
||
|
IF UTILS.bit_depth = 64 THEN
|
||
|
value := LSL(value, 16);
|
||
|
value := LSL(value, 16);
|
||
|
value := ASR(value, 16);
|
||
|
value := ASR(value, 16)
|
||
|
END
|
||
|
|
||
|
RETURN value
|
||
|
END Int32To64;
|
||
|
|
||
|
|
||
|
PROCEDURE Int64To32* (value: INTEGER): INTEGER;
|
||
|
BEGIN
|
||
|
IF UTILS.bit_depth = 64 THEN
|
||
|
value := LSL(value, 16);
|
||
|
value := LSL(value, 16);
|
||
|
value := LSR(value, 16);
|
||
|
value := LSR(value, 16)
|
||
|
END
|
||
|
|
||
|
RETURN value
|
||
|
END Int64To32;
|
||
|
|
||
|
|
||
|
END MACHINE.
|