Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  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 <http://www.gnu.org/licenses/>.
  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.