Subversion Repositories Kolibri OS

Rev

Rev 7110 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7110 Rev 7209
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016, 2017 Anton Krotov
2
    Copyright 2016, 2017, 2018 Anton Krotov
Line 3... Line 3...
3
 
3
 
4
    This program is free software: you can redistribute it and/or modify
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
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
6
    the Free Software Foundation, either version 3 of the License, or
Line 22... Line 22...
22
 
22
 
Line 23... Line 23...
23
CONST
23
CONST
24
 
24
 
25
    MAX_SIZE  = 16 * 400H;
25
    MAX_SIZE  = 16 * 400H;
26
    HEAP_SIZE =  1 * 100000H;
26
    HEAP_SIZE =  1 * 100000H;
27
    
27
 
Line 28... Line 28...
28
    _new = 1;
28
    _new = 1;
29
    _dispose = 2;
29
    _dispose = 2;
Line 30... Line 30...
30
 
30
 
Line 43... Line 43...
43
 
43
 
44
 
44
 
45
PROCEDURE [stdcall] zeromem* (size, adr: INTEGER);
45
PROCEDURE [stdcall] zeromem* (size, adr: INTEGER);
46
BEGIN
46
BEGIN
Line 47... Line 47...
47
    sys.CODE("578B7D0C8B4D0833C09CFCF3AB9D5F")
47
    sys.CODE("578B7D0C8B4D0833C09CFCF3AB9D5F")
48
END zeromem; 
48
END zeromem;
49
 
49
 
50
 
50
 
51
PROCEDURE mem_commit* (adr, size: INTEGER);
51
PROCEDURE mem_commit* (adr, size: INTEGER);
52
VAR
52
VAR
53
    tmp: INTEGER;
53
    tmp: INTEGER;
54
BEGIN
54
BEGIN
Line 55... Line 55...
55
    FOR tmp := adr TO adr + size - 1 BY 4096 DO
55
    FOR tmp := adr TO adr + size - 1 BY 4096 DO
56
        sys.PUT(tmp, 0)
56
        sys.PUT(tmp, 0)
57
    END
57
    END
Line 74... Line 74...
74
        ELSIF A = 0X THEN
74
        ELSIF A = 0X THEN
75
            n := 0
75
            n := 0
76
        END
76
        END
77
    END
77
    END
78
    RETURN Res
78
    RETURN Res
79
END strncmp;    
79
END strncmp;
Line 80... Line 80...
80
 
80
 
81
 
81
 
82
PROCEDURE [stdcall] sysfunc1* (arg1: INTEGER): INTEGER;
82
PROCEDURE [stdcall] sysfunc1* (arg1: INTEGER): INTEGER;
83
BEGIN
83
BEGIN
84
    sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
84
    sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
85
    sys.CODE("CD40");             (* int     40h              *)
85
    sys.CODE("CD40");             (* int     40h              *)
86
    sys.CODE("C9");               (* leave                    *)
86
    sys.CODE("C9");               (* leave                    *)
87
    sys.CODE("C20400");           (* ret     04h              *)
87
    sys.CODE("C20400");           (* ret     04h              *)
Line 88... Line 88...
88
    RETURN 0
88
    RETURN 0
89
END sysfunc1; 
89
END sysfunc1;
90
 
90
 
Line 97... Line 97...
97
    sys.CODE("CD40");             (* int     40h              *)
97
    sys.CODE("CD40");             (* int     40h              *)
98
    sys.CODE("5B");               (* pop     ebx              *)
98
    sys.CODE("5B");               (* pop     ebx              *)
99
    sys.CODE("C9");               (* leave                    *)
99
    sys.CODE("C9");               (* leave                    *)
100
    sys.CODE("C20800");           (* ret     08h              *)
100
    sys.CODE("C20800");           (* ret     08h              *)
101
    RETURN 0
101
    RETURN 0
102
END sysfunc2;    
102
END sysfunc2;
Line 103... Line 103...
103
 
103
 
104
 
104
 
105
PROCEDURE [stdcall] sysfunc3* (arg1, arg2, arg3: INTEGER): INTEGER;
105
PROCEDURE [stdcall] sysfunc3* (arg1, arg2, arg3: INTEGER): INTEGER;
Line 126... Line 126...
126
    sys.CODE("CD40");             (* int     40h              *)
126
    sys.CODE("CD40");             (* int     40h              *)
127
    sys.CODE("5B");               (* pop     ebx              *)
127
    sys.CODE("5B");               (* pop     ebx              *)
128
    sys.CODE("C9");               (* leave                    *)
128
    sys.CODE("C9");               (* leave                    *)
129
    sys.CODE("C21000");           (* ret     10h              *)
129
    sys.CODE("C21000");           (* ret     10h              *)
130
    RETURN 0
130
    RETURN 0
131
END sysfunc4;    
131
END sysfunc4;
Line 132... Line 132...
132
 
132
 
133
 
133
 
134
PROCEDURE [stdcall] sysfunc5* (arg1, arg2, arg3, arg4, arg5: INTEGER): INTEGER;
134
PROCEDURE [stdcall] sysfunc5* (arg1, arg2, arg3, arg4, arg5: INTEGER): INTEGER;
Line 245... Line 245...
245
            END
245
            END
246
        ELSE
246
        ELSE
247
            res := 0
247
            res := 0
248
        END
248
        END
249
    END;
249
    END;
250
    IF res # 0 THEN
250
    IF (res # 0) & (size <= MAX_SIZE) THEN
251
        zeromem(ASR(size, 2) - 1, res)
251
        zeromem(ASR(size, 2) - 1, res)
252
    END
252
    END
253
    RETURN res
253
    RETURN res
254
END __NEW;
254
END __NEW;
Line 272... Line 272...
272
 
272
 
273
 
273
 
274
PROCEDURE NEW_DISPOSE (func, arg: INTEGER): INTEGER;
274
PROCEDURE NEW_DISPOSE (func, arg: INTEGER): INTEGER;
275
VAR
275
VAR
276
    res: INTEGER;
276
    res: INTEGER;
Line 277... Line 277...
277
BEGIN    
277
BEGIN
278
    EnterCriticalSection(CriticalSection); 
278
    EnterCriticalSection(CriticalSection);
279
 
279
 
280
    IF func = _new THEN
280
    IF func = _new THEN
281
        res := __NEW(arg)
281
        res := __NEW(arg)
Line 282... Line 282...
282
    ELSIF func = _dispose THEN
282
    ELSIF func = _dispose THEN
283
        res := __DISPOSE(arg)
283
        res := __DISPOSE(arg)
284
    END;                 
284
    END;
Line 285... Line 285...
285
 
285
 
286
    LeaveCriticalSection(CriticalSection)
286
    LeaveCriticalSection(CriticalSection)
287
    RETURN res
287
    RETURN res
288
END NEW_DISPOSE;  
288
END NEW_DISPOSE;
Line 289... Line 289...
289
 
289
 
290
 
290
 
291
PROCEDURE _NEW* (size: INTEGER): INTEGER;
291
PROCEDURE _NEW* (size: INTEGER): INTEGER;
Line 292... Line 292...
292
    RETURN NEW_DISPOSE(_new, size)
292
    RETURN NEW_DISPOSE(_new, size)
293
END _NEW;
293
END _NEW;
294
                     
294
 
295
 
295
 
Line 296... Line 296...
296
PROCEDURE _DISPOSE* (ptr: INTEGER): INTEGER;
296
PROCEDURE _DISPOSE* (ptr: INTEGER): INTEGER;
297
    RETURN NEW_DISPOSE(_dispose, ptr)
297
    RETURN NEW_DISPOSE(_dispose, ptr)
298
END _DISPOSE;
298
END _DISPOSE;
299
 
299
 
Line 300... Line 300...
300
 
300
 
301
PROCEDURE ExitProcess* (p1: INTEGER);
301
PROCEDURE ExitProcess* (p1: INTEGER);
302
BEGIN
302
BEGIN
303
  p1 := sysfunc1(-1)
303
    p1 := sysfunc1(-1)
304
END ExitProcess;  
304
END ExitProcess;
305
 
305
 
Line 306... Line 306...
306
 
306
 
307
PROCEDURE ExitThread* (p1: INTEGER);
307
PROCEDURE ExitThread* (p1: INTEGER);
308
BEGIN
308
BEGIN
Line 345... Line 345...
345
    UNTIL c = 0X;
345
    UNTIL c = 0X;
346
    IF lpCaption # 0 THEN
346
    IF lpCaption # 0 THEN
347
        OutChar(0DX);
347
        OutChar(0DX);
348
        OutChar(0AX)
348
        OutChar(0AX)
349
    END
349
    END
350
END DebugMsg;  
350
END DebugMsg;
Line 351... Line 351...
351
 
351
 
352
 
352
 
353
PROCEDURE init* (p1: INTEGER);
353
PROCEDURE init* (p1: INTEGER);
354
BEGIN
354
BEGIN
355
    p1 := sysfunc2(68, 11);
355
    p1 := sysfunc2(68, 11);
Line 356... Line 356...
356
    InitializeCriticalSection(CriticalSection)
356
    InitializeCriticalSection(CriticalSection)
357
END init; 
357
END init;