HOST.ob07 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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* = 32;
  17. maxint* = 7FFFFFFFH;
  18. minint* = 80000000H;
  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 s2d (x: INTEGER; VAR h, l: INTEGER);
  98. VAR
  99. s, e, f: INTEGER;
  100. BEGIN
  101. s := ASR(x, 31) MOD 2;
  102. f := x MOD 800000H;
  103. e := (x DIV 800000H) MOD 256;
  104. IF e = 255 THEN
  105. e := 2047
  106. ELSE
  107. INC(e, 896)
  108. END;
  109. h := LSL(s, 31) + LSL(e, 20) + (f DIV 8);
  110. l := (f MOD 8) * 20000000H
  111. END s2d;
  112. PROCEDURE d2s* (x: REAL): INTEGER;
  113. VAR
  114. i: INTEGER;
  115. BEGIN
  116. SYSTEM.GET(SYSTEM.ADR(x), i)
  117. RETURN i
  118. END d2s;
  119. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  120. BEGIN
  121. s2d(d2s(x), b, a)
  122. RETURN a
  123. END splitf;
  124. BEGIN
  125. inf := SYSTEM.INF();
  126. maxreal := 1.9;
  127. PACK(maxreal, 127)
  128. END HOST.