Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     Copyright 2016, 2017 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] sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER;
  45. BEGIN
  46.   sys.CODE("53");               (* push    ebx              *)
  47.   sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
  48.   sys.CODE("8B5D0C");           (* mov     ebx, [ebp + 0Ch] *)
  49.   sys.CODE("CD40");             (* int     40h              *)
  50.   sys.CODE("8B4D10");           (* mov     ecx, [ebp + 10h] *)
  51.   sys.CODE("8919");             (* mov     [ecx], ebx       *)
  52.   sys.CODE("5B");               (* pop     ebx              *)
  53.   sys.CODE("C9");               (* leave                    *)
  54.   sys.CODE("C20C00");           (* ret     0Ch              *)
  55.   RETURN 0
  56. END sysfunc22;
  57.  
  58. PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER;
  59. VAR cur, procname, adr: INTEGER;
  60.  
  61.   PROCEDURE streq(str1, str2: INTEGER): BOOLEAN;
  62.   VAR c1, c2: CHAR;
  63.   BEGIN
  64.     REPEAT
  65.       sys.GET(str1, c1);
  66.       sys.GET(str2, c2);
  67.       INC(str1);
  68.       INC(str2)
  69.     UNTIL (c1 # c2) OR (c1 = 0X)
  70.     RETURN c1 = c2
  71.   END streq;
  72.  
  73. BEGIN
  74.   adr := 0;
  75.   IF (lib # 0) & (name # "") THEN
  76.     cur := lib;
  77.     REPEAT
  78.       sys.GET(cur, procname);
  79.       INC(cur, 8)
  80.     UNTIL (procname = 0) OR streq(procname, sys.ADR(name[0]));
  81.     IF procname # 0 THEN
  82.       sys.GET(cur - 4, adr)
  83.     END
  84.   END
  85.   RETURN adr
  86. END GetProcAdr;
  87.  
  88. PROCEDURE Time*(VAR sec, dsec: INTEGER);
  89. VAR t: INTEGER;
  90. BEGIN
  91.   t := API.sysfunc2(26, 9);
  92.   sec := t DIV 100;
  93.   dsec := t MOD 100
  94. END Time;
  95.  
  96. PROCEDURE init*;
  97. VAR Lib: INTEGER;
  98.  
  99.   PROCEDURE GetProc(v: INTEGER; name: ARRAY OF CHAR);
  100.   VAR a: INTEGER;
  101.   BEGIN
  102.     a := GetProcAdr(name, Lib);
  103.     sys.PUT(v, a)
  104.   END GetProc;
  105.  
  106. BEGIN
  107.   Time(sec, dsec);
  108.   Lib := API.sysfunc3(68, 19, sys.ADR("/rd/1/lib/console.obj"));
  109.   IF Lib # 0 THEN
  110.     GetProc(sys.ADR(con_init),         "con_init");
  111.     GetProc(sys.ADR(con_exit),         "con_exit");
  112.     GetProc(sys.ADR(con_write_asciiz), "con_write_asciiz");
  113.     IF con_init # NIL THEN
  114.       con_init(-1, -1, -1, -1, sys.ADR("Oberon-07/11 for KolibriOS"))
  115.     END
  116.   END
  117. END init;
  118.  
  119. PROCEDURE ExitProcess* (n: INTEGER);
  120. BEGIN
  121.   IF con_exit # NIL THEN
  122.     con_exit(FALSE)
  123.   END;
  124.   API.ExitProcess(0)
  125. END ExitProcess;
  126.  
  127. PROCEDURE GetCommandLine*(): INTEGER;
  128. VAR param: INTEGER;
  129. BEGIN
  130.   sys.GET(28, param)
  131.   RETURN param
  132. END GetCommandLine;
  133.  
  134. PROCEDURE GetName*(): INTEGER;
  135. VAR name: INTEGER;
  136. BEGIN
  137.   sys.GET(32, name)
  138.   RETURN name
  139. END GetName;
  140.  
  141. PROCEDURE malloc*(size: INTEGER): INTEGER;
  142.   RETURN API.sysfunc3(68, 12, size)
  143. END malloc;
  144.  
  145. PROCEDURE CloseFile*(hObject: INTEGER);
  146. VAR pFS: POINTER TO OFSTRUCT;
  147. BEGIN
  148.   sys.PUT(sys.ADR(pFS), hObject);
  149.   DISPOSE(pFS)
  150. END CloseFile;
  151.  
  152. PROCEDURE _OCFile(FileName: ARRAY OF CHAR; VAR FS: OFSTRUCT; mode: INTEGER; VAR fsize: INTEGER): INTEGER;
  153. VAR buf: ARRAY 40 OF CHAR; res: INTEGER;
  154. BEGIN
  155.   FS.subfunc := mode;
  156.   FS.pos := 0;
  157.   FS.hpos := 0;
  158.   FS.bytes := 0;
  159.   FS.buf := sys.ADR(buf);
  160.   COPY(FileName, FS.name);
  161.   IF sysfunc22(70, sys.ADR(FS), res) = 0 THEN
  162.     res := sys.ADR(FS);
  163.     sys.GET(sys.ADR(buf) + 32, fsize)
  164.   ELSE
  165.     res := 0
  166.   END
  167.   RETURN res
  168. END _OCFile;
  169.  
  170. PROCEDURE IOFile(VAR FS: OFSTRUCT; Buffer, bytes, io: INTEGER): INTEGER;
  171. VAR res1, res: INTEGER;
  172. BEGIN
  173.   FS.subfunc := io;
  174.   FS.bytes := bytes;
  175.   FS.buf := Buffer;
  176.   res1 := sysfunc22(70, sys.ADR(FS), res);
  177.   IF res = -1 THEN
  178.     res := 0
  179.   END;
  180.   FS.pos := FS.pos + res
  181.   RETURN res
  182. END IOFile;
  183.  
  184. PROCEDURE OCFile(FName: ARRAY OF CHAR; mode: INTEGER): INTEGER;
  185. VAR FS: OFSTRUCT; pFS: POINTER TO OFSTRUCT; res: INTEGER;
  186. BEGIN
  187.   IF _OCFile(FName, FS, mode, fsize) # 0 THEN
  188.     NEW(pFS);
  189.     IF pFS = NIL THEN
  190.       res := 0
  191.     ELSE
  192.       sys.GET(sys.ADR(pFS), res);
  193.       pFS^ := FS
  194.     END
  195.   ELSE
  196.     res := 0
  197.   END
  198.   RETURN res
  199. END OCFile;
  200.  
  201. PROCEDURE CreateFile* (FName: ARRAY OF CHAR): INTEGER;
  202.   RETURN OCFile(FName, 2)
  203. END CreateFile;
  204.  
  205. PROCEDURE OpenFile* (FName: ARRAY OF CHAR): INTEGER;
  206.   RETURN OCFile(FName, 5)
  207. END OpenFile;
  208.  
  209. PROCEDURE FileSize* (F: INTEGER): INTEGER;
  210.   RETURN fsize
  211. END FileSize;
  212.  
  213. PROCEDURE FileRW* (hFile, Buffer, nNumberOfBytes: INTEGER; write: BOOLEAN): INTEGER;
  214. VAR pFS: POINTER TO OFSTRUCT; res: INTEGER;
  215. BEGIN
  216.   IF hFile # 0 THEN
  217.     sys.PUT(sys.ADR(pFS), hFile);
  218.     res := IOFile(pFS^, Buffer, nNumberOfBytes, 3 * ORD(write))
  219.   ELSE
  220.     res := 0
  221.   END
  222.   RETURN res
  223. END FileRW;
  224.  
  225. PROCEDURE OutString* (str: ARRAY OF CHAR);
  226. VAR n: INTEGER;
  227. BEGIN
  228.   n := ORD(str[0] = 3X);
  229.   IF con_write_asciiz # NIL THEN
  230.     con_write_asciiz(sys.ADR(str[n]))
  231.   ELSE
  232.     API.DebugMsg(sys.ADR(str[n]), 0)
  233.   END
  234. END OutString;
  235.  
  236. END HOST.