Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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