Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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 API;
19
 
20
IMPORT sys := SYSTEM;
21
 
22
CONST
23
 
24
  MAX_SIZE  = 16 * 400H;
25
  HEAP_SIZE =  1 * 100000H;
26
 
27
VAR
28
 
29
  heap, endheap: INTEGER;
30
  pockets: ARRAY MAX_SIZE DIV 32 + 1 OF INTEGER;
31
 
32
PROCEDURE [stdcall] zeromem*(size, adr: INTEGER);
33
BEGIN
34
  sys.CODE("578B7D0C8B4D0833C09CFCF3AB9D5F")
35
END zeromem;
36
 
37
PROCEDURE strncmp*(a, b, n: INTEGER): INTEGER;
38
VAR A, B: CHAR; Res: INTEGER;
39
BEGIN
40
  Res := 0;
41
  WHILE n > 0 DO
42
    sys.GET(a, A); INC(a);
43
    sys.GET(b, B); INC(b);
44
    DEC(n);
45
    IF A # B THEN
46
      Res := ORD(A) - ORD(B);
47
      n := 0
48
    ELSIF A = 0X THEN
49
      n := 0
50
    END
51
  END
52
  RETURN Res
53
END strncmp;
54
 
55
PROCEDURE [stdcall] sysfunc1(arg1: INTEGER): INTEGER;
56
BEGIN
57
  sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
58
  sys.CODE("CD40");             (* int     40h              *)
59
  sys.CODE("C9");               (* leave                    *)
60
  sys.CODE("C20400");           (* ret     04h              *)
61
  RETURN 0
62
END sysfunc1;
63
 
64
PROCEDURE [stdcall] sysfunc2(arg1, arg2: INTEGER): INTEGER;
65
BEGIN
66
  sys.CODE("53");               (* push    ebx              *)
67
  sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
68
  sys.CODE("8B5D0C");           (* mov     ebx, [ebp + 0Ch] *)
69
  sys.CODE("CD40");             (* int     40h              *)
70
  sys.CODE("5B");               (* pop     ebx              *)
71
  sys.CODE("C9");               (* leave                    *)
72
  sys.CODE("C20800");           (* ret     08h              *)
73
  RETURN 0
74
END sysfunc2;
75
 
76
PROCEDURE [stdcall] sysfunc3(arg1, arg2, arg3: INTEGER): INTEGER;
77
BEGIN
78
  sys.CODE("53");               (* push    ebx              *)
79
  sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
80
  sys.CODE("8B5D0C");           (* mov     ebx, [ebp + 0Ch] *)
81
  sys.CODE("8B4D10");           (* mov     ecx, [ebp + 10h] *)
82
  sys.CODE("CD40");             (* int     40h              *)
83
  sys.CODE("5B");               (* pop     ebx              *)
84
  sys.CODE("C9");               (* leave                    *)
85
  sys.CODE("C20C00");           (* ret     0Ch              *)
86
  RETURN 0
87
END sysfunc3;
88
 
89
PROCEDURE _NEW*(size: INTEGER): INTEGER;
90
VAR res, idx, temp: INTEGER;
91
BEGIN
92
  IF size <= MAX_SIZE THEN
93
    idx := ASR(size, 5);
94
    res := pockets[idx];
95
    IF res # 0 THEN
96
      sys.GET(res, pockets[idx]);
97
      sys.PUT(res, size);
98
      INC(res, 4)
99
    ELSE
100
      IF heap + size >= endheap THEN
101
	IF sysfunc2(18, 16) > ASR(HEAP_SIZE, 10) THEN
102
	  heap := sysfunc3(68, 12, HEAP_SIZE);
103
	  endheap := heap + HEAP_SIZE
104
	ELSE
105
	  heap := 0
106
	END
107
      END;
108
      IF heap # 0 THEN
109
	sys.PUT(heap, size);
110
	res := heap + 4;
111
	heap := heap + size
112
      ELSE
113
	endheap := 0;
114
	res := 0
115
      END
116
    END
117
  ELSE
118
    IF sysfunc2(18, 16) > ASR(size, 10) THEN
119
      res := sysfunc3(68, 12, size);
120
      sys.PUT(res, size);
121
      INC(res, 4)
122
    ELSE
123
      res := 0
124
    END
125
  END;
126
  IF res # 0 THEN
127
    zeromem(ASR(size, 2) - 1, res)
128
  END
129
  RETURN res
130
END _NEW;
131
 
132
PROCEDURE _DISPOSE*(ptr: INTEGER): INTEGER;
133
VAR size, idx: INTEGER;
134
BEGIN
135
  DEC(ptr, 4);
136
  sys.GET(ptr, size);
137
  IF size <= MAX_SIZE THEN
138
    idx := ASR(size, 5);
139
    sys.PUT(ptr, pockets[idx]);
140
    pockets[idx] := ptr
141
  ELSE
142
    size := sysfunc3(68, 13, ptr)
143
  END
144
  RETURN 0
145
END _DISPOSE;
146
 
147
PROCEDURE ExitProcess*(p1: INTEGER);
148
BEGIN
149
  p1 := sysfunc1(-1)
150
END ExitProcess;
151
 
152
PROCEDURE OutChar(c: CHAR);
153
VAR res: INTEGER;
154
BEGIN
155
  res := sysfunc3(63, 1, ORD(c))
156
END OutChar;
157
 
158
PROCEDURE DebugMsg*(lpText, lpCaption: INTEGER);
159
VAR c: CHAR;
160
BEGIN
161
  IF lpCaption # 0 THEN
162
    OutChar(0DX);
163
    OutChar(0AX);
164
    REPEAT
165
      sys.GET(lpCaption, c);
166
      IF c # 0X THEN
167
	OutChar(c)
168
      END;
169
      INC(lpCaption)
170
    UNTIL c = 0X;
171
    OutChar(":");
172
    OutChar(0DX);
173
    OutChar(0AX)
174
  END;
175
  REPEAT
176
    sys.GET(lpText, c);
177
    IF c # 0X THEN
178
      OutChar(c)
179
    END;
180
    INC(lpText)
181
  UNTIL c = 0X;
182
  IF lpCaption # 0 THEN
183
    OutChar(0DX);
184
    OutChar(0AX)
185
  END
186
END DebugMsg;
187
 
188
PROCEDURE init* (p1: INTEGER);
189
BEGIN
190
  p1 := sysfunc2(68, 11)
191
END init;
192
 
193
END API.