API.ob07 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2023, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE API;
  7. IMPORT SYSTEM;
  8. CONST
  9. eol* = 0DX + 0AX;
  10. BIT_DEPTH* = 32;
  11. HEAP_SIZE = 3*1024;
  12. VAR
  13. org*: INTEGER;
  14. mem: ARRAY HEAP_SIZE OF BYTE;
  15. heap: INTEGER;
  16. PROCEDURE [stdcall-] sysfunc3* (arg1, arg2, arg3: INTEGER): INTEGER;
  17. BEGIN
  18. SYSTEM.CODE(
  19. 053H, (* push ebx *)
  20. 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
  21. 08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
  22. 08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *)
  23. 0CDH, 040H, (* int 64 *)
  24. 05BH, (* pop ebx *)
  25. 0C9H, (* leave *)
  26. 0C2H, 00CH, 000H (* ret 12 *)
  27. )
  28. RETURN 0
  29. END sysfunc3;
  30. PROCEDURE OutChar* (c: CHAR);
  31. BEGIN
  32. sysfunc3(63, 1, ORD(c))
  33. END OutChar;
  34. PROCEDURE OutLn*;
  35. BEGIN
  36. OutChar(0DX);
  37. OutChar(0AX)
  38. END OutLn;
  39. PROCEDURE OutStr* (pchar: INTEGER);
  40. VAR
  41. c: CHAR;
  42. BEGIN
  43. IF pchar # 0 THEN
  44. REPEAT
  45. SYSTEM.GET(pchar, c);
  46. IF c # 0X THEN
  47. OutChar(c)
  48. END;
  49. INC(pchar)
  50. UNTIL c = 0X
  51. END
  52. END OutStr;
  53. PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
  54. BEGIN
  55. IF lpCaption # 0 THEN
  56. OutLn;
  57. OutStr(lpCaption);
  58. OutChar(":");
  59. OutLn
  60. END;
  61. OutStr(lpText);
  62. IF lpCaption # 0 THEN
  63. OutLn
  64. END
  65. END DebugMsg;
  66. PROCEDURE _NEW* (size: INTEGER): INTEGER;
  67. VAR
  68. res: INTEGER;
  69. BEGIN
  70. IF heap + size <= SYSTEM.ADR(mem[0]) + HEAP_SIZE THEN
  71. res := heap;
  72. INC(heap, size)
  73. ELSE
  74. res := 0
  75. END
  76. RETURN res
  77. END _NEW;
  78. PROCEDURE _DISPOSE* (ptr: INTEGER): INTEGER;
  79. RETURN 0
  80. END _DISPOSE;
  81. PROCEDURE init* (reserved, _org: INTEGER);
  82. BEGIN
  83. org := _org;
  84. heap := SYSTEM.ADR(mem[0])
  85. END init;
  86. PROCEDURE exit* (code: INTEGER);
  87. BEGIN
  88. sysfunc3(-1, 0, 0)
  89. END exit;
  90. PROCEDURE exit_thread* (code: INTEGER);
  91. BEGIN
  92. sysfunc3(-1, 0, 0)
  93. END exit_thread;
  94. PROCEDURE dllentry* (param1, param2, param3: INTEGER): INTEGER;
  95. RETURN 0
  96. END dllentry;
  97. PROCEDURE sofinit*;
  98. END sofinit;
  99. END API.