Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     Copyright 2016 Anton Krotov
  3.  
  4.     This program is free software: you can redistribute it and/or modify
  5.     it under the terms of the GNU Lesser General Public License as published by
  6.     the Free Software Foundation, either version 3 of the License, or
  7.     (at your option) any later version.
  8.  
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU Lesser General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU Lesser General Public License
  15.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  16. *)
  17.  
  18. MODULE HOST;
  19.  
  20. IMPORT sys := SYSTEM, API;
  21.  
  22. CONST
  23.  
  24.   OS* = "KOS";
  25.   Slash* = "/";
  26.  
  27. TYPE
  28.  
  29.   FILENAME = ARRAY 2048 OF CHAR;
  30.  
  31.   OFSTRUCT = RECORD
  32.     subfunc, pos, hpos, bytes, buf: INTEGER;
  33.     name: FILENAME
  34.   END;
  35.  
  36. VAR
  37.  
  38.   con_init               : PROCEDURE [stdcall] (wnd_width, wnd_height, scr_width, scr_height, title: INTEGER);
  39.   con_exit               : PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
  40.   con_write_asciiz       : PROCEDURE [stdcall] (string: INTEGER);
  41.  
  42.   fsize, sec*, dsec*: INTEGER;
  43.  
  44. PROCEDURE [stdcall] sysfunc1(arg1: INTEGER): INTEGER;
  45. BEGIN
  46.   sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
  47.   sys.CODE("CD40");             (* int     40h              *)
  48.   sys.CODE("C9");               (* leave                    *)
  49.   sys.CODE("C20400");           (* ret     04h              *)
  50.   RETURN 0
  51. END sysfunc1;
  52.  
  53. PROCEDURE [stdcall] sysfunc2(arg1, arg2: INTEGER): INTEGER;
  54. BEGIN
  55.   sys.CODE("53");               (* push    ebx              *)
  56.   sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
  57.   sys.CODE("8B5D0C");           (* mov     ebx, [ebp + 0Ch] *)
  58.   sys.CODE("CD40");             (* int     40h              *)
  59.   sys.CODE("5B");               (* pop     ebx              *)
  60.   sys.CODE("C9");               (* leave                    *)
  61.   sys.CODE("C20800");           (* ret     08h              *)
  62.   RETURN 0
  63. END sysfunc2;
  64.  
  65. PROCEDURE [stdcall] sysfunc3(arg1, arg2, arg3: INTEGER): INTEGER;
  66. BEGIN
  67.   sys.CODE("53");               (* push    ebx              *)
  68.   sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
  69.   sys.CODE("8B5D0C");           (* mov     ebx, [ebp + 0Ch] *)
  70.   sys.CODE("8B4D10");           (* mov     ecx, [ebp + 10h] *)
  71.   sys.CODE("CD40");             (* int     40h              *)
  72.   sys.CODE("5B");               (* pop     ebx              *)
  73.   sys.CODE("C9");               (* leave                    *)
  74.   sys.CODE("C20C00");           (* ret     0Ch              *)
  75.   RETURN 0
  76. END sysfunc3;
  77.  
  78. PROCEDURE [stdcall] sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER;
  79. BEGIN
  80.   sys.CODE("53");               (* push    ebx              *)
  81.   sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
  82.   sys.CODE("8B5D0C");           (* mov     ebx, [ebp + 0Ch] *)
  83.   sys.CODE("CD40");             (* int     40h              *)
  84.   sys.CODE("8B4D10");           (* mov     ecx, [ebp + 10h] *)
  85.   sys.CODE("8919");             (* mov     [ecx], ebx       *)
  86.   sys.CODE("5B");               (* pop     ebx              *)
  87.   sys.CODE("C9");               (* leave                    *)
  88.   sys.CODE("C20C00");           (* ret     0Ch              *)
  89.   RETURN 0
  90. END sysfunc22;
  91.  
  92. PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER;
  93. VAR cur, procname, adr: INTEGER;
  94.  
  95.   PROCEDURE streq(str1, str2: INTEGER): BOOLEAN;
  96.   VAR c1, c2: CHAR;
  97.   BEGIN
  98.     REPEAT
  99.       sys.GET(str1, c1);
  100.       sys.GET(str2, c2);
  101.       INC(str1);
  102.       INC(str2)
  103.     UNTIL (c1 # c2) OR (c1 = 0X)
  104.     RETURN c1 = c2
  105.   END streq;
  106.  
  107. BEGIN
  108.   adr := 0;
  109.   IF (lib # 0) & (name # "") THEN
  110.     cur := lib;
  111.     REPEAT
  112.       sys.GET(cur, procname);
  113.       INC(cur, 8)
  114.     UNTIL (procname = 0) OR streq(procname, sys.ADR(name[0]));
  115.     IF procname # 0 THEN
  116.       sys.GET(cur - 4, adr)
  117.     END
  118.   END
  119.   RETURN adr
  120. END GetProcAdr;
  121.  
  122. PROCEDURE Time*(VAR sec, dsec: INTEGER);
  123. VAR t: INTEGER;
  124. BEGIN
  125.   t := sysfunc2(26, 9);
  126.   sec := t DIV 100;
  127.   dsec := t MOD 100
  128. END Time;
  129.  
  130. PROCEDURE init*;
  131. VAR Lib: INTEGER;
  132.  
  133.   PROCEDURE GetProc(v: INTEGER; name: ARRAY OF CHAR);
  134.   VAR a: INTEGER;
  135.   BEGIN
  136.     a := GetProcAdr(name, Lib);
  137.     sys.PUT(v, a)
  138.   END GetProc;
  139.  
  140. BEGIN
  141.   Time(sec, dsec);
  142.   Lib := sysfunc3(68, 19, sys.ADR("/rd/1/lib/console.obj"));
  143.   IF Lib # 0 THEN
  144.     GetProc(sys.ADR(con_init),         "con_init");
  145.     GetProc(sys.ADR(con_exit),         "con_exit");
  146.     GetProc(sys.ADR(con_write_asciiz), "con_write_asciiz");
  147.     IF con_init # NIL THEN
  148.       con_init(-1, -1, -1, -1, sys.ADR("Oberon-07/11 for KolibriOS"))
  149.     END
  150.   END
  151. END init;
  152.  
  153. PROCEDURE ExitProcess* (n: INTEGER);
  154. BEGIN
  155.   IF con_exit # NIL THEN
  156.     con_exit(FALSE)
  157.   END;
  158.   n := sysfunc1(-1)
  159. END ExitProcess;
  160.  
  161. PROCEDURE GetCommandLine*(): INTEGER;
  162. VAR param: INTEGER;
  163. BEGIN
  164.   sys.GET(28, param)
  165.   RETURN param
  166. END GetCommandLine;
  167.  
  168. PROCEDURE GetName*(): INTEGER;
  169. VAR name: INTEGER;
  170. BEGIN
  171.   sys.GET(32, name)
  172.   RETURN name
  173. END GetName;
  174.  
  175. PROCEDURE malloc*(size: INTEGER): INTEGER;
  176.   RETURN sysfunc3(68, 12, size)
  177. END malloc;
  178.  
  179. PROCEDURE CloseFile*(hObject: INTEGER);
  180. VAR pFS: POINTER TO OFSTRUCT;
  181. BEGIN
  182.   sys.PUT(sys.ADR(pFS), hObject);
  183.   DISPOSE(pFS)
  184. END CloseFile;
  185.  
  186. PROCEDURE _OCFile(FileName: ARRAY OF CHAR; VAR FS: OFSTRUCT; mode: INTEGER; VAR fsize: INTEGER): INTEGER;
  187. VAR buf: ARRAY 40 OF CHAR; res: INTEGER;
  188. BEGIN
  189.   FS.subfunc := mode;
  190.   FS.pos := 0;
  191.   FS.hpos := 0;
  192.   FS.bytes := 0;
  193.   FS.buf := sys.ADR(buf);
  194.   COPY(FileName, FS.name);
  195.   IF sysfunc22(70, sys.ADR(FS), res) = 0 THEN
  196.     res := sys.ADR(FS);
  197.     sys.GET(sys.ADR(buf) + 32, fsize)
  198.   ELSE
  199.     res := 0
  200.   END
  201.   RETURN res
  202. END _OCFile;
  203.  
  204. PROCEDURE IOFile(VAR FS: OFSTRUCT; Buffer, bytes, io: INTEGER): INTEGER;
  205. VAR res1, res: INTEGER;
  206. BEGIN
  207.   FS.subfunc := io;
  208.   FS.bytes := bytes;
  209.   FS.buf := Buffer;
  210.   res1 := sysfunc22(70, sys.ADR(FS), res);
  211.   IF res = -1 THEN
  212.     res := 0
  213.   END;
  214.   FS.pos := FS.pos + res
  215.   RETURN res
  216. END IOFile;
  217.  
  218. PROCEDURE OCFile(FName: ARRAY OF CHAR; mode: INTEGER): INTEGER;
  219. VAR FS: OFSTRUCT; pFS: POINTER TO OFSTRUCT; res: INTEGER;
  220. BEGIN
  221.   IF _OCFile(FName, FS, mode, fsize) # 0 THEN
  222.     NEW(pFS);
  223.     IF pFS = NIL THEN
  224.       res := 0
  225.     ELSE
  226.       sys.GET(sys.ADR(pFS), res);
  227.       pFS^ := FS
  228.     END
  229.   ELSE
  230.     res := 0
  231.   END
  232.   RETURN res
  233. END OCFile;
  234.  
  235. PROCEDURE CreateFile* (FName: ARRAY OF CHAR): INTEGER;
  236.   RETURN OCFile(FName, 2)
  237. END CreateFile;
  238.  
  239. PROCEDURE OpenFile* (FName: ARRAY OF CHAR): INTEGER;
  240.   RETURN OCFile(FName, 5)
  241. END OpenFile;
  242.  
  243. PROCEDURE FileSize* (F: INTEGER): INTEGER;
  244.   RETURN fsize
  245. END FileSize;
  246.  
  247. PROCEDURE FileRW* (hFile, Buffer, nNumberOfBytes: INTEGER; write: BOOLEAN): INTEGER;
  248. VAR pFS: POINTER TO OFSTRUCT; res: INTEGER;
  249. BEGIN
  250.   IF hFile # 0 THEN
  251.     sys.PUT(sys.ADR(pFS), hFile);
  252.     res := IOFile(pFS^, Buffer, nNumberOfBytes, 3 * ORD(write))
  253.   ELSE
  254.     res := 0
  255.   END
  256.   RETURN res
  257. END FileRW;
  258.  
  259. PROCEDURE OutString* (str: ARRAY OF CHAR);
  260. VAR n: INTEGER;
  261. BEGIN
  262.   n := ORD(str[0] = 3X);
  263.   IF con_write_asciiz # NIL THEN
  264.     con_write_asciiz(sys.ADR(str[n]))
  265.   ELSE
  266.     API.DebugMsg(sys.ADR(str[n]), 0)
  267.   END
  268. END OutString;
  269.  
  270. END HOST.