Subversion Repositories Kolibri OS

Rev

Rev 6613 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6613 leency 1
(*
7107 akron1 2
    Copyright 2016, 2017 Anton Krotov
6613 leency 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 .
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
 
7107 akron1 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);
6613 leency 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
7107 akron1 91
  t := API.sysfunc2(26, 9);
6613 leency 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);
7107 akron1 108
  Lib := API.sysfunc3(68, 19, sys.ADR("/rd/1/lib/console.obj"));
6613 leency 109
  IF Lib # 0 THEN
7107 akron1 110
    GetProc(sys.ADR(con_init),         "con_init");
111
    GetProc(sys.ADR(con_exit),         "con_exit");
6613 leency 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;
7107 akron1 124
  API.ExitProcess(0)
6613 leency 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;
7107 akron1 142
  RETURN API.sysfunc3(68, 12, size)
6613 leency 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.