(* BSD 2-Clause License Copyright (c) 2023, Anton Krotov All rights reserved. *) MODULE API; IMPORT SYSTEM; CONST eol* = 0DX + 0AX; BIT_DEPTH* = 32; HEAP_SIZE = 3*1024; VAR org*: INTEGER; mem: ARRAY HEAP_SIZE OF BYTE; heap: INTEGER; PROCEDURE [stdcall-] sysfunc3* (arg1, arg2, arg3: INTEGER): INTEGER; BEGIN SYSTEM.CODE( 053H, (* push ebx *) 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) 08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *) 08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *) 0CDH, 040H, (* int 64 *) 05BH, (* pop ebx *) 0C9H, (* leave *) 0C2H, 00CH, 000H (* ret 12 *) ) RETURN 0 END sysfunc3; PROCEDURE OutChar* (c: CHAR); BEGIN sysfunc3(63, 1, ORD(c)) END OutChar; PROCEDURE OutLn*; BEGIN OutChar(0DX); OutChar(0AX) END OutLn; PROCEDURE OutStr* (pchar: INTEGER); VAR c: CHAR; BEGIN IF pchar # 0 THEN REPEAT SYSTEM.GET(pchar, c); IF c # 0X THEN OutChar(c) END; INC(pchar) UNTIL c = 0X END END OutStr; PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER); BEGIN IF lpCaption # 0 THEN OutLn; OutStr(lpCaption); OutChar(":"); OutLn END; OutStr(lpText); IF lpCaption # 0 THEN OutLn END END DebugMsg; PROCEDURE _NEW* (size: INTEGER): INTEGER; VAR res: INTEGER; BEGIN IF heap + size <= SYSTEM.ADR(mem[0]) + HEAP_SIZE THEN res := heap; INC(heap, size) ELSE res := 0 END RETURN res END _NEW; PROCEDURE _DISPOSE* (ptr: INTEGER): INTEGER; RETURN 0 END _DISPOSE; PROCEDURE init* (reserved, _org: INTEGER); BEGIN org := _org; heap := SYSTEM.ADR(mem[0]) END init; PROCEDURE exit* (code: INTEGER); BEGIN sysfunc3(-1, 0, 0) END exit; PROCEDURE exit_thread* (code: INTEGER); BEGIN sysfunc3(-1, 0, 0) END exit_thread; PROCEDURE dllentry* (param1, param2, param3: INTEGER): INTEGER; RETURN 0 END dllentry; PROCEDURE sofinit*; END sofinit; END API.