UTILS.ob07 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. MODULE UTILS;
  2. IMPORT HOST;
  3. CONST
  4. slash* = HOST.slash;
  5. eol* = HOST.eol;
  6. bit_depth* = HOST.bit_depth;
  7. maxint* = HOST.maxint;
  8. minint* = HOST.minint;
  9. min32* = -2147483647-1;
  10. max32* = 2147483647;
  11. vMajor* = 1;
  12. vMinor* = 66;
  13. Date* = "10-feb-2023";
  14. FILE_EXT* = ".ob07";
  15. RTL_NAME* = "RTL";
  16. MAX_GLOBAL_SIZE* = 1600000000;
  17. VAR
  18. time*: INTEGER;
  19. maxreal*, inf*: REAL;
  20. target*:
  21. RECORD
  22. bit_depth*,
  23. maxInt*,
  24. minInt*,
  25. maxSet*,
  26. maxHex*: INTEGER;
  27. maxReal*: REAL
  28. END;
  29. bit_diff*: INTEGER;
  30. PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
  31. RETURN HOST.FileRead(F, Buffer, bytes)
  32. END FileRead;
  33. PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  34. RETURN HOST.FileWrite(F, Buffer, bytes)
  35. END FileWrite;
  36. PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
  37. RETURN HOST.FileCreate(FName)
  38. END FileCreate;
  39. PROCEDURE FileClose* (F: INTEGER);
  40. BEGIN
  41. HOST.FileClose(F)
  42. END FileClose;
  43. PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
  44. RETURN HOST.FileOpen(FName)
  45. END FileOpen;
  46. PROCEDURE chmod* (FName: ARRAY OF CHAR);
  47. BEGIN
  48. HOST.chmod(FName)
  49. END chmod;
  50. PROCEDURE GetArg* (i: INTEGER; VAR str: ARRAY OF CHAR);
  51. BEGIN
  52. HOST.GetArg(i, str)
  53. END GetArg;
  54. PROCEDURE Exit* (code: INTEGER);
  55. BEGIN
  56. HOST.ExitProcess(code)
  57. END Exit;
  58. PROCEDURE GetTickCount* (): INTEGER;
  59. RETURN HOST.GetTickCount()
  60. END GetTickCount;
  61. PROCEDURE OutChar* (c: CHAR);
  62. BEGIN
  63. HOST.OutChar(c)
  64. END OutChar;
  65. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  66. RETURN HOST.splitf(x, a, b)
  67. END splitf;
  68. PROCEDURE d2s* (x: REAL): INTEGER;
  69. RETURN HOST.d2s(x)
  70. END d2s;
  71. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  72. RETURN HOST.isRelative(path)
  73. END isRelative;
  74. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  75. BEGIN
  76. HOST.GetCurrentDirectory(path)
  77. END GetCurrentDirectory;
  78. PROCEDURE UnixTime* (): INTEGER;
  79. RETURN HOST.UnixTime()
  80. END UnixTime;
  81. PROCEDURE SetBitDepth* (BitDepth: INTEGER; Double: BOOLEAN);
  82. BEGIN
  83. ASSERT((BitDepth = 16) OR (BitDepth = 32) OR (BitDepth = 64));
  84. bit_diff := bit_depth - BitDepth;
  85. ASSERT(bit_diff >= 0);
  86. target.bit_depth := BitDepth;
  87. target.maxSet := BitDepth - 1;
  88. target.maxHex := BitDepth DIV 4;
  89. target.minInt := ASR(minint, bit_diff);
  90. target.maxInt := ASR(maxint, bit_diff);
  91. IF Double THEN
  92. target.maxReal := maxreal
  93. ELSE
  94. target.maxReal := 1.9;
  95. PACK(target.maxReal, 127)
  96. END
  97. END SetBitDepth;
  98. PROCEDURE Byte* (n: INTEGER; idx: INTEGER): BYTE;
  99. RETURN ASR(n, 8 * idx) MOD 256
  100. END Byte;
  101. PROCEDURE Align* (VAR bytes: INTEGER; align: INTEGER): BOOLEAN;
  102. BEGIN
  103. INC(bytes, (-bytes) MOD align)
  104. RETURN bytes >= 0
  105. END Align;
  106. PROCEDURE Long* (value: INTEGER): INTEGER;
  107. RETURN ASR(LSL(value, bit_diff), bit_diff)
  108. END Long;
  109. PROCEDURE Short* (value: INTEGER): INTEGER;
  110. RETURN LSR(LSL(value, bit_diff), bit_diff)
  111. END Short;
  112. PROCEDURE Log2* (x: INTEGER): INTEGER;
  113. VAR
  114. n: INTEGER;
  115. BEGIN
  116. n := 0;
  117. WHILE ~ODD(x) DO
  118. x := x DIV 2;
  119. INC(n)
  120. END;
  121. IF x # 1 THEN
  122. n := -1
  123. END
  124. RETURN n
  125. END Log2;
  126. PROCEDURE hexdgt* (n: BYTE): BYTE;
  127. BEGIN
  128. IF n < 10 THEN
  129. INC(n, ORD("0"))
  130. ELSE
  131. INC(n, ORD("A") - 10)
  132. END
  133. RETURN n
  134. END hexdgt;
  135. BEGIN
  136. time := HOST.GetTickCount();
  137. inf := HOST.inf;
  138. maxreal := HOST.maxreal
  139. END UTILS.