diff --git a/programs/develop/ktcc/trunk/libc.obj/source/crt/crt0.asm b/programs/develop/ktcc/trunk/libc.obj/source/crt/crt0.asm index 7237073af7..55bf4f6f69 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/crt/crt0.asm +++ b/programs/develop/ktcc/trunk/libc.obj/source/crt/crt0.asm @@ -1,39 +1,36 @@ +; +; 2021, Edited by Coldy +; +; This module same as original crt0.asm, but cut: +; 1. virtual header block (hparams change to __app_params, hpath change to __app_path) +; 2. init heap of memory - not needed because 68.18 (68.19) init heap implicitly +; (it is does dll.obj) +; 3. loader (he lives in dll.obj) +; + format ELF section '.text' executable public start public start as '_start' -;extrn mf_init -extrn main -include '../../../../../proc32.inc' -include '../../../../../macros.inc' -include '../../../../../dll.inc' -;include '../../../../../debug.inc' -;start_: -virtual at 0 - db 'MENUET01' ; 1. Magic number (8 bytes) - dd 0x01 ; 2. Version of executable file - dd start ; 3. Start address -imgsz dd 0x0 ; 4. Size of image - dd 0x100000 ; 5. Size of needed memory - dd 0x100000 ; 6. Pointer to stack -hparams dd 0x0 ; 7. Pointer to program arguments -hpath dd 0x0 ; 8. Pointer to program path -end virtual +extrn main +;include 'debug2.inc' +include '/../../../../../../proc32.inc' +include '/../../../../../../macros.inc' +__DEBUG__ = 0 + +__app_params equ 0x1C ; Pointer to program arguments +;__app_path equ 0x20 ; Pointer to program path start: ;DEBUGF 'Start programm\n' - ;init heap of memory - mov eax,68 - mov ebx,11 - int 0x40 mov [argc], 0 - mov eax, [hparams] + mov eax, [__app_params] test eax, eax - jz .without_path + jz .without_path mov eax, path - cmp word ptr eax, 32fh ; '/#3' UTF8 + cmp word ptr eax, 32fh ; '/#3' UTF8 jne .without_path mov word ptr eax, 12fh ; '/#1' fix to CP866 .without_path: @@ -42,21 +39,21 @@ start: ; retrieving parameters mov esi, params xor edx, edx ; dl - идёт параметр(1) или разделители(0) - ; dh - символ с которого начался параметр (1 кавычки, 0 остальное) + ; dh - символ с которого начался параметр (1 кавычки, 0 остальное) mov ecx, 1 ; cl = 1 - ; ch = 0 просто ноль + ; ch = 0 просто ноль .parse: lodsb test al, al - jz .run + jz .run test dl, dl jnz .findendparam - ;{если был разделитель + ;{если был разделитель cmp al, ' ' - jz .parse ;загружен пробел, грузим следующий символ + jz .parse ;загружен пробел, грузим следующий символ mov dl, cl ;начинается параметр cmp al, '"' - jz @f ;загружены кавычки + jz @f ;загружены кавычки mov dh, ch ;параметр без кавычек dec esi call push_param @@ -70,9 +67,9 @@ start: .findendparam: test dh, dh - jz @f ; без кавычек + jz @f ; без кавычек cmp al, '"' - jz .clear + jz .clear jmp .parse @@: cmp al, ' ' @@ -85,7 +82,6 @@ start: jmp .parse .run: - call load_imports push argv push [argc] call main @@ -93,7 +89,7 @@ start: xor eax,eax dec eax int 0x40 - dd -1 + dd -1 .crash: jmp .exit ;============================ @@ -112,101 +108,9 @@ push_param: inc [argc] .dont_add: ret + + ;============================== - -;============================== -load_imports: -;============================== -;parameters -; none -;description -; imports must be located at end of image (but before BSS sections) -; the address of end of imports (next byte after imports) is located in imgsz -; look at each import from that address up to illegal import -; legal import is such that: -; first pointer points to procedure name -; and is smaller than imgsz -; second pointer points lo library name, starting with 0x55, 0xAA -; and is smaller than imgsz -; each library should be initialized as appropriate, once -; so as library is initialized, its name will be replaced 0x00 - mov ebx, [imgsz] ; byte after imports -.handle_next_import: - sub ebx, 4 ; ebx = pointer to pointer to library name - mov esi, dword[ebx] ; esi = pointer to library name - push ebx - push esi - call load_library ; eax = pointer to library exports - pop esi - pop ebx - test eax, eax - jz .done - sub ebx, 4 ; ebx = pointer to pointer to symbol name - push ebx - stdcall dll.GetProcAddress, eax, dword[ebx] - pop ebx - test eax, eax - jz .fail - mov dword[ebx], eax - jmp .handle_next_import -.done: - ;DEBUGF 1, "Library: %s not loaded!\n", esi - ;mcall -1 - ret -.fail: - ret - -;============================== - -;============================== -load_library: -;============================== -;parameters -; ebx: library name address -;description -; each library should be initialized as appropriate, once -; so as library is initialized, its name will be replaced 0x00 -; and 4 next bytes will be set to address of library - ; first two bytes of library name must be 0x55, 0xAA (is like a magic) - cld ; move esi further, not back - cmp esi, [imgsz] - ja .fail - lodsb ; al = first byte of library name - cmp al, 0x55 - jne .fail - lodsb ; al = second byte of library name - cmp al, 0xAA - jne .fail - lodsb ; al = third byte of library name (0x00 if the library is already loaded) - test al, al - jnz .load - lodsd ; if we here, then third byte is 0x00 => address of library is in next 4 bytes - ; now eax contains address of library - ret -.load: - dec esi ; we checked on 0 before, let's go back - mov eax, 68 - mov ebx, 19 - mov ecx, esi - int 0x40 ; eax = address of exports - mov byte[esi], 0 ; library is loaded, let's place 0 in first byte of name - mov [esi + 1], eax ; now next 4 bytes of library name are replaced by address of library - ; call lib_init - stdcall dll.GetProcAddress, eax, lib_init_str ; eax = address of lib_init - test eax, eax - jz .ret - stdcall dll.Init, eax -.ret: - mov eax, [esi + 1] ; put address of library into eax - ret -.fail: - mov eax, 0 - ret - -;============================== - -lib_init_str db 'lib_init', 0 - public argc as '__argc' public params as '__argv' public path as '__path' @@ -214,8 +118,10 @@ public path as '__path' section '.bss' buf_len = 0x400 max_parameters=0x20 -argc rd 1 -argv rd max_parameters -path rb buf_len -params rb buf_len +argc rd 1 +argv rd max_parameters +path rb buf_len +params rb buf_len +;section '.data' +;include_debug_strings ; ALWAYS present in data section diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdio/conio.c b/programs/develop/ktcc/trunk/libc.obj/source/stdio/conio.c index c99924ecaa..0aa0954817 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdio/conio.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdio/conio.c @@ -7,31 +7,25 @@ static char* __con_dllname = "/sys/lib/console.obj"; int __con_is_load = 0; -void stdcall (*__con_init_hidden)(int wnd_width, unsigned wnd_height, int scr_width, int scr_height, const char* title); -void stdcall (*con_exit)(int); -void stdcall (*con_set_title)(const char* title); -void stdcall (*con_write_asciiz)(const char* str); -void stdcall (*con_write_string)(const char* str, dword length); -int cdecl (*con_printf)(const char* format, ...); -dword stdcall (*con_get_flags)(void); -dword stdcall (*con_set_flags)(dword new_flags); -int stdcall (*con_get_font_height)(void); -int stdcall (*con_get_cursor_height)(void); -int stdcall (*con_set_cursor_height)(int new_height); -int stdcall (*con_getch)(void); -word stdcall (*con_getch2)(void); -int stdcall (*con_kbhit)(void); -char* stdcall (*con_gets)(char* str, int n); -char* stdcall (*con_gets2)(con_gets2_callback callback, char* str, int n); -void stdcall (*con_cls)(); -void stdcall (*con_get_cursor_pos)(int* px, int* py); -void stdcall (*con_set_cursor_pos)(int x, int y); - -/*static void __con_panic(char* func_name) -{ - debug_printf("In console.obj %s=NULL!\n", func_name); - _ksys_exit(); -}*/ +void __stdcall (*__con_init_hidden)(int wnd_width, unsigned wnd_height, int scr_width, int scr_height, const char* title); +void __stdcall (*con_exit)(int); +void __stdcall (*con_set_title)(const char* title); +void __stdcall (*con_write_asciiz)(const char* str); +void __stdcall (*con_write_string)(const char* str, dword length); +int __cdecl (*con_printf)(const char* format, ...); +dword __stdcall (*con_get_flags)(void); +dword __stdcall (*con_set_flags)(dword new_flags); +int __stdcall (*con_get_font_height)(void); +int __stdcall (*con_get_cursor_height)(void); +int __stdcall (*con_set_cursor_height)(int new_height); +int __stdcall (*con_getch)(void); +word __stdcall (*con_getch2)(void); +int __stdcall (*con_kbhit)(void); +char* __stdcall (*con_gets)(char* str, int n); +char* __stdcall (*con_gets2)(con_gets2_callback callback, char* str, int n); +void __stdcall (*con_cls)(); +void __stdcall (*con_get_cursor_pos)(int* px, int* py); +void __stdcall (*con_set_cursor_pos)(int x, int y); static void __con_lib_link(ksys_dll_t *exp) {