Subversion Repositories Kolibri OS

Rev

Rev 7107 | 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
 
7209 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
7209 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
 
7209 akron1 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
 
6613 leency 137
PROCEDURE GetCommandLine*(): INTEGER;
138
VAR param: INTEGER;
139
BEGIN
7209 akron1 140
  sys.GET(28 + AppAdr(), param)
6613 leency 141
  RETURN param
142
END GetCommandLine;
143
 
144
PROCEDURE GetName*(): INTEGER;
145
VAR name: INTEGER;
146
BEGIN
7209 akron1 147
  sys.GET(32 + AppAdr(), name)
6613 leency 148
  RETURN name
149
END GetName;
150
 
151
PROCEDURE malloc*(size: INTEGER): INTEGER;
7107 akron1 152
  RETURN API.sysfunc3(68, 12, size)
6613 leency 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.