UTILS.ob07 3.8 KB

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