Subversion Repositories Kolibri OS

Rev

Rev 7107 | 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 AppAdr(): INTEGER;
  128. VAR
  129.     buf: ARRAY 1024 OF CHAR;
  130.     a: INTEGER;
  131. BEGIN
  132.     a := API.sysfunc3(9, sys.ADR(buf), -1);
  133.     sys.GET(sys.ADR(buf) + 22, a)
  134.     RETURN a
  135. END AppAdr;
  136.  
  137. PROCEDURE GetCommandLine*(): INTEGER;
  138. VAR param: INTEGER;
  139. BEGIN
  140.   sys.GET(28 + AppAdr(), param)
  141.   RETURN param
  142. END GetCommandLine;
  143.  
  144. PROCEDURE GetName*(): INTEGER;
  145. VAR name: INTEGER;
  146. BEGIN
  147.   sys.GET(32 + AppAdr(), name)
  148.   RETURN name
  149. END GetName;
  150.  
  151. PROCEDURE malloc*(size: INTEGER): INTEGER;
  152.   RETURN API.sysfunc3(68, 12, size)
  153. END malloc;
  154.  
  155. PROCEDURE CloseFile*(hObject: INTEGER);
  156. VAR pFS: POINTER TO OFSTRUCT;
  157. BEGIN
  158.   sys.PUT(sys.ADR(pFS), hObject);
  159.   DISPOSE(pFS)
  160. END CloseFile;
  161.  
  162. PROCEDURE _OCFile(FileName: ARRAY OF CHAR; VAR FS: OFSTRUCT; mode: INTEGER; VAR fsize: INTEGER): INTEGER;
  163. VAR buf: ARRAY 40 OF CHAR; res: INTEGER;
  164. BEGIN
  165.   FS.subfunc := mode;
  166.   FS.pos := 0;
  167.   FS.hpos := 0;
  168.   FS.bytes := 0;
  169.   FS.buf := sys.ADR(buf);
  170.   COPY(FileName, FS.name);
  171.   IF sysfunc22(70, sys.ADR(FS), res) = 0 THEN
  172.     res := sys.ADR(FS);
  173.     sys.GET(sys.ADR(buf) + 32, fsize)
  174.   ELSE
  175.     res := 0
  176.   END
  177.   RETURN res
  178. END _OCFile;
  179.  
  180. PROCEDURE IOFile(VAR FS: OFSTRUCT; Buffer, bytes, io: INTEGER): INTEGER;
  181. VAR res1, res: INTEGER;
  182. BEGIN
  183.   FS.subfunc := io;
  184.   FS.bytes := bytes;
  185.   FS.buf := Buffer;
  186.   res1 := sysfunc22(70, sys.ADR(FS), res);
  187.   IF res = -1 THEN
  188.     res := 0
  189.   END;
  190.   FS.pos := FS.pos + res
  191.   RETURN res
  192. END IOFile;
  193.  
  194. PROCEDURE OCFile(FName: ARRAY OF CHAR; mode: INTEGER): INTEGER;
  195. VAR FS: OFSTRUCT; pFS: POINTER TO OFSTRUCT; res: INTEGER;
  196. BEGIN
  197.   IF _OCFile(FName, FS, mode, fsize) # 0 THEN
  198.     NEW(pFS);
  199.     IF pFS = NIL THEN
  200.       res := 0
  201.     ELSE
  202.       sys.GET(sys.ADR(pFS), res);
  203.       pFS^ := FS
  204.     END
  205.   ELSE
  206.     res := 0
  207.   END
  208.   RETURN res
  209. END OCFile;
  210.  
  211. PROCEDURE CreateFile* (FName: ARRAY OF CHAR): INTEGER;
  212.   RETURN OCFile(FName, 2)
  213. END CreateFile;
  214.  
  215. PROCEDURE OpenFile* (FName: ARRAY OF CHAR): INTEGER;
  216.   RETURN OCFile(FName, 5)
  217. END OpenFile;
  218.  
  219. PROCEDURE FileSize* (F: INTEGER): INTEGER;
  220.   RETURN fsize
  221. END FileSize;
  222.  
  223. PROCEDURE FileRW* (hFile, Buffer, nNumberOfBytes: INTEGER; write: BOOLEAN): INTEGER;
  224. VAR pFS: POINTER TO OFSTRUCT; res: INTEGER;
  225. BEGIN
  226.   IF hFile # 0 THEN
  227.     sys.PUT(sys.ADR(pFS), hFile);
  228.     res := IOFile(pFS^, Buffer, nNumberOfBytes, 3 * ORD(write))
  229.   ELSE
  230.     res := 0
  231.   END
  232.   RETURN res
  233. END FileRW;
  234.  
  235. PROCEDURE OutString* (str: ARRAY OF CHAR);
  236. VAR n: INTEGER;
  237. BEGIN
  238.   n := ORD(str[0] = 3X);
  239.   IF con_write_asciiz # NIL THEN
  240.     con_write_asciiz(sys.ADR(str[n]))
  241.   ELSE
  242.     API.DebugMsg(sys.ADR(str[n]), 0)
  243.   END
  244. END OutString;
  245.  
  246. END HOST.