Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

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