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* = 32;
  28.     maxint* = 7FFFFFFFH;
  29.     minint* = 80000000H;
  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 s2d (x: INTEGER; VAR h, l: INTEGER);
  150. VAR
  151.     s, e, f: INTEGER;
  152. BEGIN
  153.     s := ASR(x, 31) MOD 2;
  154.     f := x MOD 800000H;
  155.     e := (x DIV 800000H) MOD 256;
  156.     IF e = 255 THEN
  157.         e := 2047
  158.     ELSE
  159.         INC(e, 896)
  160.     END;
  161.     h := LSL(s, 31) + LSL(e, 20) + (f DIV 8);
  162.     l := (f MOD 8) * 20000000H
  163. END s2d;
  164.  
  165.  
  166. PROCEDURE d2s* (x: REAL): INTEGER;
  167. VAR
  168.     i: INTEGER;
  169. BEGIN
  170.     SYSTEM.GET(SYSTEM.ADR(x), i)
  171.     RETURN i
  172. END d2s;
  173.  
  174.  
  175. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  176. BEGIN
  177.     s2d(d2s(x), b, a)
  178.     RETURN a
  179. END splitf;
  180.  
  181.  
  182. BEGIN
  183.     maxreal := 1.9;
  184.     PACK(maxreal, 127)
  185. END HOST.