mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 17:54:31 +00:00
129 lines
2.7 KiB
Plaintext
129 lines
2.7 KiB
Plaintext
(*
|
|
BSD 2-Clause License
|
|
|
|
Copyright (c) 2019, Anton Krotov
|
|
All rights reserved.
|
|
*)
|
|
|
|
MODULE API;
|
|
|
|
IMPORT SYSTEM;
|
|
|
|
|
|
CONST
|
|
|
|
SIZE_OF_DWORD = 4;
|
|
|
|
|
|
VAR
|
|
|
|
eol*: ARRAY 2 OF CHAR;
|
|
base*, libc*, MainParam*: INTEGER;
|
|
|
|
dlopen* : PROCEDURE [ccall] (filename, flag: INTEGER): INTEGER;
|
|
dlsym* : PROCEDURE [ccall] (handle, symbol: INTEGER): INTEGER;
|
|
malloc : PROCEDURE [ccall] (size: INTEGER): INTEGER;
|
|
free : PROCEDURE [ccall] (ptr: INTEGER);
|
|
|
|
|
|
PROCEDURE [stdcall] sysfunc4* (arg1, arg2, arg3, arg4: 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] *)
|
|
08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *)
|
|
0CDH, 080H, (* int 80h *)
|
|
05BH, (* pop ebx *)
|
|
0C9H, (* leave *)
|
|
0C2H, 010H, 000H (* ret 16 *)
|
|
)
|
|
RETURN 0
|
|
END sysfunc4;
|
|
|
|
|
|
PROCEDURE putc* (c: CHAR);
|
|
VAR
|
|
res: INTEGER;
|
|
|
|
BEGIN
|
|
res := sysfunc4(4, 1, SYSTEM.ADR(c), 1)
|
|
END putc;
|
|
|
|
|
|
PROCEDURE puts (pStr: INTEGER);
|
|
VAR
|
|
c: CHAR;
|
|
|
|
BEGIN
|
|
REPEAT
|
|
SYSTEM.GET(pStr, c);
|
|
INC(pStr);
|
|
IF c # 0X THEN
|
|
putc(c)
|
|
END
|
|
UNTIL c = 0X
|
|
END puts;
|
|
|
|
|
|
PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
|
|
BEGIN
|
|
puts(lpCaption); putc(0AX);
|
|
puts(lpText); putc(0AX)
|
|
END DebugMsg;
|
|
|
|
|
|
PROCEDURE _NEW* (size: INTEGER): INTEGER;
|
|
VAR
|
|
res, ptr, dwords: INTEGER;
|
|
|
|
BEGIN
|
|
res := malloc(size);
|
|
IF res # 0 THEN
|
|
ptr := res;
|
|
dwords := size DIV SIZE_OF_DWORD;
|
|
WHILE dwords > 0 DO
|
|
SYSTEM.PUT(ptr, 0);
|
|
INC(ptr, SIZE_OF_DWORD);
|
|
DEC(dwords)
|
|
END
|
|
END
|
|
|
|
RETURN res
|
|
END _NEW;
|
|
|
|
|
|
PROCEDURE _DISPOSE* (p: INTEGER): INTEGER;
|
|
BEGIN
|
|
free(p)
|
|
RETURN 0
|
|
END _DISPOSE;
|
|
|
|
|
|
PROCEDURE init* (esp, code: INTEGER);
|
|
BEGIN
|
|
SYSTEM.GET(code - 1000H - SIZE_OF_DWORD * 2, dlopen);
|
|
SYSTEM.GET(code - 1000H - SIZE_OF_DWORD, dlsym);
|
|
eol := 0AX;
|
|
base := 08048000H;
|
|
MainParam := esp + SIZE_OF_DWORD;
|
|
libc := dlopen(SYSTEM.SADR("libc.so.6"), 1);
|
|
SYSTEM.PUT(SYSTEM.ADR(malloc), dlsym(libc, SYSTEM.SADR("malloc")));
|
|
SYSTEM.PUT(SYSTEM.ADR(free), dlsym(libc, SYSTEM.SADR("free")))
|
|
END init;
|
|
|
|
|
|
PROCEDURE exit* (code: INTEGER);
|
|
BEGIN
|
|
code := sysfunc4(1, code, 0, 0)
|
|
END exit;
|
|
|
|
|
|
PROCEDURE exit_thread* (code: INTEGER);
|
|
BEGIN
|
|
exit(code)
|
|
END exit_thread;
|
|
|
|
|
|
END API. |