Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6613 leency 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 .
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.