HOST.ob07 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2020-2022, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE HOST;
  7. IMPORT SYSTEM, Trap;
  8. CONST
  9. $IF (host_linux)
  10. slash* = "/";
  11. eol* = 0AX;
  12. $ELSE
  13. slash* = "\";
  14. eol* = 0DX + 0AX;
  15. $END
  16. bit_depth* = 64;
  17. maxint* = ROR(-2, 1);
  18. minint* = ROR(1, 1);
  19. VAR
  20. maxreal*, inf*: REAL;
  21. PROCEDURE syscall0 (fn: INTEGER): INTEGER;
  22. BEGIN
  23. Trap.syscall(SYSTEM.ADR(fn))
  24. RETURN fn
  25. END syscall0;
  26. PROCEDURE syscall1 (fn, p1: INTEGER): INTEGER;
  27. BEGIN
  28. Trap.syscall(SYSTEM.ADR(fn))
  29. RETURN fn
  30. END syscall1;
  31. PROCEDURE syscall2 (fn, p1, p2: INTEGER): INTEGER;
  32. BEGIN
  33. Trap.syscall(SYSTEM.ADR(fn))
  34. RETURN fn
  35. END syscall2;
  36. PROCEDURE syscall3 (fn, p1, p2, p3: INTEGER): INTEGER;
  37. BEGIN
  38. Trap.syscall(SYSTEM.ADR(fn))
  39. RETURN fn
  40. END syscall3;
  41. PROCEDURE syscall4 (fn, p1, p2, p3, p4: INTEGER): INTEGER;
  42. BEGIN
  43. Trap.syscall(SYSTEM.ADR(fn))
  44. RETURN fn
  45. END syscall4;
  46. PROCEDURE ExitProcess* (code: INTEGER);
  47. BEGIN
  48. code := syscall1(0, code)
  49. END ExitProcess;
  50. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  51. VAR
  52. a: INTEGER;
  53. BEGIN
  54. a := syscall2(1, LEN(path), SYSTEM.ADR(path[0]))
  55. END GetCurrentDirectory;
  56. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  57. BEGIN
  58. n := syscall3(2, n, LEN(s), SYSTEM.ADR(s[0]))
  59. END GetArg;
  60. PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
  61. RETURN syscall4(3, F, LEN(Buffer), SYSTEM.ADR(Buffer[0]), bytes)
  62. END FileRead;
  63. PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  64. RETURN syscall4(4, F, LEN(Buffer), SYSTEM.ADR(Buffer[0]), bytes)
  65. END FileWrite;
  66. PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
  67. RETURN syscall2(5, LEN(FName), SYSTEM.ADR(FName[0]))
  68. END FileCreate;
  69. PROCEDURE FileClose* (F: INTEGER);
  70. BEGIN
  71. F := syscall1(6, F)
  72. END FileClose;
  73. PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
  74. RETURN syscall2(7, LEN(FName), SYSTEM.ADR(FName[0]))
  75. END FileOpen;
  76. PROCEDURE chmod* (FName: ARRAY OF CHAR);
  77. VAR
  78. a: INTEGER;
  79. BEGIN
  80. a := syscall2(12, LEN(FName), SYSTEM.ADR(FName[0]))
  81. END chmod;
  82. PROCEDURE OutChar* (c: CHAR);
  83. VAR
  84. a: INTEGER;
  85. BEGIN
  86. a := syscall1(8, ORD(c))
  87. END OutChar;
  88. PROCEDURE GetTickCount* (): INTEGER;
  89. RETURN syscall0(9)
  90. END GetTickCount;
  91. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  92. RETURN syscall2(11, LEN(path), SYSTEM.ADR(path[0])) # 0
  93. END isRelative;
  94. PROCEDURE UnixTime* (): INTEGER;
  95. RETURN syscall0(10)
  96. END UnixTime;
  97. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  98. VAR
  99. res: INTEGER;
  100. BEGIN
  101. a := 0;
  102. b := 0;
  103. SYSTEM.GET32(SYSTEM.ADR(x), a);
  104. SYSTEM.GET32(SYSTEM.ADR(x) + 4, b);
  105. SYSTEM.GET(SYSTEM.ADR(x), res)
  106. RETURN res
  107. END splitf;
  108. PROCEDURE d2s* (x: REAL): INTEGER;
  109. VAR
  110. h, l, s, e: INTEGER;
  111. BEGIN
  112. e := splitf(x, l, h);
  113. s := ASR(h, 31) MOD 2;
  114. e := (h DIV 100000H) MOD 2048;
  115. IF e <= 896 THEN
  116. h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H;
  117. REPEAT
  118. h := h DIV 2;
  119. INC(e)
  120. UNTIL e = 897;
  121. e := 896;
  122. l := (h MOD 8) * 20000000H;
  123. h := h DIV 8
  124. ELSIF (1151 <= e) & (e < 2047) THEN
  125. e := 1151;
  126. h := 0;
  127. l := 0
  128. ELSIF e = 2047 THEN
  129. e := 1151;
  130. IF (h MOD 100000H # 0) OR (BITS(l) * {0..31} # {}) THEN
  131. h := 80000H;
  132. l := 0
  133. END
  134. END;
  135. DEC(e, 896)
  136. RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8
  137. END d2s;
  138. BEGIN
  139. inf := SYSTEM.INF();
  140. maxreal := 1.9;
  141. PACK(maxreal, 1023)
  142. END HOST.