API.ob07 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2018-2021, 2023, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE API;
  7. IMPORT SYSTEM;
  8. CONST
  9. OS* = "WINDOWS";
  10. eol* = 0DX + 0AX;
  11. BIT_DEPTH* = (ORD(LSL(1, 31) > 0) + 1) * 32;
  12. SectionAlignment = 1000H;
  13. DLL_PROCESS_ATTACH = 1;
  14. DLL_THREAD_ATTACH = 2;
  15. DLL_THREAD_DETACH = 3;
  16. DLL_PROCESS_DETACH = 0;
  17. KERNEL = "kernel32.dll";
  18. USER = "user32.dll";
  19. TYPE
  20. DLL_ENTRY* = PROCEDURE (hinstDLL, fdwReason, lpvReserved: INTEGER);
  21. VAR
  22. base*: INTEGER;
  23. heap: INTEGER;
  24. process_detach,
  25. thread_detach,
  26. thread_attach: DLL_ENTRY;
  27. PROCEDURE [windows-, KERNEL, ""] ExitProcess (code: INTEGER);
  28. PROCEDURE [windows-, KERNEL, ""] ExitThread (code: INTEGER);
  29. PROCEDURE [windows-, KERNEL, ""] GetProcessHeap (): INTEGER;
  30. PROCEDURE [windows-, KERNEL, ""] HeapAlloc (hHeap, dwFlags, dwBytes: INTEGER): INTEGER;
  31. PROCEDURE [windows-, KERNEL, ""] HeapFree (hHeap, dwFlags, lpMem: INTEGER);
  32. PROCEDURE [windows-, USER, ""] MessageBoxA (hWnd, lpText, lpCaption, uType: INTEGER): INTEGER;
  33. PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
  34. BEGIN
  35. MessageBoxA(0, lpText, lpCaption, 16)
  36. END DebugMsg;
  37. PROCEDURE _NEW* (size: INTEGER): INTEGER;
  38. RETURN HeapAlloc(heap, 8, size)
  39. END _NEW;
  40. PROCEDURE _DISPOSE* (p: INTEGER): INTEGER;
  41. BEGIN
  42. HeapFree(heap, 0, p)
  43. RETURN 0
  44. END _DISPOSE;
  45. PROCEDURE init* (reserved, code: INTEGER);
  46. BEGIN
  47. process_detach := NIL;
  48. thread_detach := NIL;
  49. thread_attach := NIL;
  50. base := code - SectionAlignment;
  51. heap := GetProcessHeap()
  52. END init;
  53. PROCEDURE exit* (code: INTEGER);
  54. BEGIN
  55. ExitProcess(code)
  56. END exit;
  57. PROCEDURE exit_thread* (code: INTEGER);
  58. BEGIN
  59. ExitThread(code)
  60. END exit_thread;
  61. PROCEDURE dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER;
  62. VAR
  63. res: INTEGER;
  64. BEGIN
  65. res := 0;
  66. CASE fdwReason OF
  67. |DLL_PROCESS_ATTACH:
  68. res := 1
  69. |DLL_THREAD_ATTACH:
  70. IF thread_attach # NIL THEN
  71. thread_attach(hinstDLL, fdwReason, lpvReserved)
  72. END
  73. |DLL_THREAD_DETACH:
  74. IF thread_detach # NIL THEN
  75. thread_detach(hinstDLL, fdwReason, lpvReserved)
  76. END
  77. |DLL_PROCESS_DETACH:
  78. IF process_detach # NIL THEN
  79. process_detach(hinstDLL, fdwReason, lpvReserved)
  80. END
  81. ELSE
  82. END
  83. RETURN res
  84. END dllentry;
  85. PROCEDURE sofinit*;
  86. END sofinit;
  87. PROCEDURE SetDll* (_process_detach, _thread_detach, _thread_attach: DLL_ENTRY);
  88. BEGIN
  89. process_detach := _process_detach;
  90. thread_detach := _thread_detach;
  91. thread_attach := _thread_attach
  92. END SetDll;
  93. END API.