From 06339c5e4ea19fff40639e9b91e4497547f83e1d Mon Sep 17 00:00:00 2001 From: IgorA Date: Tue, 29 Sep 2020 19:58:14 +0000 Subject: [PATCH] update 'load_lib.mac', update 'info3ds', fix 'kol_f_edit' git-svn-id: svn://kolibrios.org@8083 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/info3ds/info3ds.asm | 12 +- programs/develop/info3ds/info3ds_u.asm | 42 +- programs/develop/info3ds/info_o3d.inc | 22 +- programs/develop/kol_f_edit/kol_f_edit.asm | 60 +-- .../develop/libraries/box_lib/load_lib.mac | 492 +++++++++--------- 5 files changed, 312 insertions(+), 316 deletions(-) diff --git a/programs/develop/info3ds/info3ds.asm b/programs/develop/info3ds/info3ds.asm index 6ace7bd008..0152db287d 100644 --- a/programs/develop/info3ds/info3ds.asm +++ b/programs/develop/info3ds/info3ds.asm @@ -231,12 +231,12 @@ start: stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов stdcall [glClearColor], [color_bk+8],[color_bk+4],[color_bk],0.0 stdcall [glShadeModel], GL_SMOOTH - stdcall [gluNewQuadric] + call [gluNewQuadric] mov [qObj],eax mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext mov eax,[eax] ;eax -> ZBuffer - mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf + mov eax,[eax+ZBuffer.pbuf] mov dword[buf_ogl],eax ;open file from cmd line @@ -1392,9 +1392,6 @@ align 4 w_scr_t1 scrollbar 16,0, 3,0, 15, 100, 0,0, 0,0,0, 1 align 4 -ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext -;sizeof.TinyGLContext = 28 - qObj dd 0 light_position dd 0.0, 0.0, -2.0, 1.0 ; Расположение источника [0][1][2] @@ -1407,13 +1404,14 @@ white_light dd 0.8, 0.8, 0.8, 1.0 ; lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; Параметры фонового освещения if lang eq ru -capt db 'info 3ds версия 23.03.19',0 ;подпись окна +capt db 'info 3ds версия 29.09.20',0 ;подпись окна else -capt db 'info 3ds version 23.03.19',0 ;window caption +capt db 'info 3ds version 29.09.20',0 ;window caption end if align 16 i_end: + ctx1 rb 28 ;sizeof.TinyGLContext = 28 procinfo process_information run_file_70 FileInfoBlock sc system_colors diff --git a/programs/develop/info3ds/info3ds_u.asm b/programs/develop/info3ds/info3ds_u.asm index d28911f77e..5d51533a3a 100644 --- a/programs/develop/info3ds/info3ds_u.asm +++ b/programs/develop/info3ds/info3ds_u.asm @@ -227,12 +227,12 @@ start: stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов stdcall [glClearColor], [color_bk+8],[color_bk+4],[color_bk],0.0 stdcall [glShadeModel], GL_SMOOTH - stdcall [gluNewQuadric] + call [gluNewQuadric] mov [qObj],eax mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext mov eax,[eax] ;eax -> ZBuffer - mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf + mov eax,[eax+ZBuffer.pbuf] mov dword[buf_ogl],eax ;open file from cmd line @@ -287,14 +287,14 @@ mouse: stdcall [tl_node_get_data],tree1 or eax,eax jz .end_d - mov ebx,dword[eax] + mov ebx,[eax] add ebx,dword[open_file_data] ;получаем значение сдвига в памяти cmp word[ebx],CHUNK_OBJBLOCK jne .end_d mcall SF_MOUSE_GET,SSF_WINDOW_POSITION mov ebx,eax - shr ebx,16 ;mouse.x + sar ebx,16 ;mouse.x cmp ebx,3d_wnd_l jg @f mov ebx,3d_wnd_l @@ -304,7 +304,7 @@ mouse: jle @f mov ebx,3d_wnd_w @@: - and eax,0xffff ;mouse.y + movsx eax,ax ;mouse.y cmp eax,3d_wnd_t jg @f mov eax,3d_wnd_t @@ -346,13 +346,13 @@ mouse: ;mouse l. but. press mcall SF_MOUSE_GET,SSF_WINDOW_POSITION mov ebx,eax - shr ebx,16 ;mouse.x + sar ebx,16 ;mouse.x cmp ebx,3d_wnd_l jl .end_d sub ebx,3d_wnd_l cmp ebx,3d_wnd_w jg .end_d - and eax,0xffff ;mouse.y + movsx eax,ax ;mouse.y cmp eax,3d_wnd_t jl .end_d sub eax,3d_wnd_t @@ -363,7 +363,7 @@ mouse: mov dword[mouse_y],eax .end_d: - stdcall [tl_mouse], dword tree1 + stdcall [tl_mouse], tree1 stdcall [kmainmenu_dispatch_cursorevent], [main_menu] pop ebx eax ret @@ -378,19 +378,18 @@ timer_funct: stdcall [tl_node_get_data],tree1 or eax,eax jz .end_f - mov edi,eax - add edi,list_offs_obj3d + lea edi,[eax+list_offs_obj3d] mov ebx,eax - mov eax,dword[ebx] - mov ecx,dword[ebx+4] ;размер блока + mov eax,[ebx] + mov ecx,[ebx+4] ;размер блока stdcall hex_in_str, txt_3ds_offs.dig, eax,8 stdcall hex_in_str, txt_3ds_offs.siz, ecx,8 - add eax,dword[open_file_data] ;получаем значение сдвига в памяти - cmp dword[offs_last_timer],eax + add eax,[open_file_data] ;получаем значение сдвига в памяти + cmp [offs_last_timer],eax je .end_f ;если выделенный блок данных не совпадает с последним запомненным - mov dword[offs_last_timer],eax + mov [offs_last_timer],eax cmp word[eax],CHUNK_OBJBLOCK jne .end_oblo @@ -422,7 +421,7 @@ timer_funct: stdcall buf_draw_beg, buf_ogl stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_3ds_offs,5,35,0xb000 - mov edx,dword[ebx+list_offs_p_data] + mov edx,[ebx+list_offs_p_data] or edx,edx ;смотрим есть ли описание блока jz .no_info stdcall [buf2d_draw_text], buf_ogl, buf_1,edx,5,45,0xb000 @@ -1043,8 +1042,7 @@ proc add_3ds_object, icon:dword, level:dword, size_bl:dword, info_bl:dword .no_capt: mov ecx,(sizeof.obj_3d)/4 xor eax,eax - mov edi,buffer - add edi,list_offs_obj3d + mov edi,buffer+list_offs_obj3d rep stosd stdcall [tl_node_add], tree1, ebx, buffer stdcall [tl_cur_next], tree1 @@ -1459,9 +1457,6 @@ align 4 w_scr_t1 scrollbar 16,0, 3,0, 15, 100, 0,0, 0,0,0, 1 align 4 -ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext -;sizeof.TinyGLContext = 28 - qObj dd 0 light_position dd 0.0, 0.0, -2.0, 1.0 ; Расположение источника [0][1][2] @@ -1474,13 +1469,14 @@ white_light dd 0.8, 0.8, 0.8, 1.0 ; lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; Параметры фонового освещения if lang eq ru -capt db 'info 3ds [user] версия 23.03.19',0 ;подпись окна +capt db 'info 3ds [user] версия 29.09.20',0 ;подпись окна else -capt db 'info 3ds [user] version 23.03.19',0 ;window caption +capt db 'info 3ds [user] version 29.09.20',0 ;window caption end if align 16 i_end: + ctx1 rb 28 ;sizeof.TinyGLContext = 28 procinfo process_information run_file_70 FileInfoBlock sc system_colors diff --git a/programs/develop/info3ds/info_o3d.inc b/programs/develop/info3ds/info_o3d.inc index 8fcd5414d9..4fb34f0487 100644 --- a/programs/develop/info3ds/info_o3d.inc +++ b/programs/develop/info3ds/info_o3d.inc @@ -2,7 +2,7 @@ ; структуры и функции для рисования 3d объектов ; -offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc' +include '../../develop/libraries/TinyGL/asm_fork/zbuffer.inc' struct obj_3d poi_data dd ? ;указатель на координаты вершин @@ -356,8 +356,7 @@ pushad mov ecx,[ecx+obj_3d.poi_data] align 4 @@: - mov edi,ebp - sub edi,36 ;tbl2 + lea edi,[ebp-36] ;tbl2 movzx esi,word[edx] ;1-я вершина imul esi,12 add esi,ecx @@ -377,8 +376,7 @@ align 4 movsd movsd - mov esi,ebp - sub esi,72 ;tbl1 + lea esi,[ebp-72] ;tbl1 sub edi,36 ;tbl2 ;v1 <-> v2 fld dword[edi+12] @@ -806,7 +804,7 @@ proc draw_3d uses eax ebx ecx edi, o_data:dword cmp dword[edi+obj_3d.poi_count],2 jl .end_f stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины - stdcall [glPushMatrix] + call [glPushMatrix] bt dword[draw_mode],bit_light jnc @f call SetLight @@ -976,10 +974,10 @@ if version_edit eq 1 stdcall [glEnd] stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select] - stdcall [glPushMatrix] + call [glPushMatrix] stdcall [glTranslatef], [eax],[eax+4],[eax+8] stdcall [gluSphere], [qObj], [sph_radius], 8,8 - stdcall [glPopMatrix] + call [glPopMatrix] @@: ;рисование выделенных точек @@ -997,10 +995,10 @@ align 4 jne .next_sel stdcall [tl_node_poi_get_data], tree3,ebx mov eax,[eax] - stdcall [glPushMatrix] + call [glPushMatrix] stdcall [glTranslatef], [eax],[eax+4],[eax+8] stdcall [gluSphere], [qObj], [sph_radius], 4,4 - stdcall [glPopMatrix] + call [glPopMatrix] dec ecx jz .end_select .next_sel: @@ -1009,14 +1007,14 @@ align 4 .end_select: end if - stdcall [glPopMatrix] + call [glPopMatrix] if version_edit eq 1 cmp dword[obj_poi_sel_c],0 je @f stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select] @@: end if - stdcall [kosglSwapBuffers] + call [kosglSwapBuffers] .end_f: ret endp diff --git a/programs/develop/kol_f_edit/kol_f_edit.asm b/programs/develop/kol_f_edit/kol_f_edit.asm index 52e73e8c64..866042abfd 100644 --- a/programs/develop/kol_f_edit/kol_f_edit.asm +++ b/programs/develop/kol_f_edit/kol_f_edit.asm @@ -1,13 +1,7 @@ use32 - org 0x0 + org 0 db 'MENUET01' - dd 0x1 - dd start - dd i_end - dd mem - dd stacktop - dd buf_cmd_lin - dd sys_path + dd 1,start,i_end,mem,stacktop,buf_cmd_lin,sys_path include '../../macros.inc' include '../../proc32.inc' @@ -21,7 +15,7 @@ include 'obj_codes.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load -hed db 'kol_f_edit 16.11.15',0 +hed db 'kol_f_edit 29.09.20',0 sizeof.TreeList equ 20 ;need for element 'tree_list' @@ -1337,34 +1331,34 @@ obj_m_win dd 0 ; ; if 1 ;lang eq ru - err_message_found_lib0 db 'Не найдена библиотека box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена - err_message_import0 db 'Ошибка при импорте библиотеки box_lib.obj',0 - err_message_found_lib1 db 'Не найдена библиотека proc_lib.obj',0 - err_message_import1 db 'Ошибка при импорте библиотеки proc_lib.obj',0 - err_message_found_lib2 db 'Не удалось найти библиотеку buf2d.obj',0 - err_message_import2 db 'Ошибка при импорте библиотеки buf2d.obj',0 - err_message_found_lib3 db 'Не удалось найти библиотеку libimg.obj',0 - err_message_import3 db 'Ошибка при импорте библиотеки libimg.obj',0 - err_message_found_lib4 db 'Не удалось найти библиотеку msgbox.obj',0 - err_message_import4 db 'Ошибка при импорте библиотеки msgbox.obj',0 + err_message_found_lib0 db 'Не найдена библиотека box_lib.obj',39,'" -tE',0 + err_message_import0 db 'Ошибка при импорте библиотеки box_lib.obj',39,'" -tW',0 + err_message_found_lib1 db 'Не найдена библиотека proc_lib.obj',39,'" -tE',0 + err_message_import1 db 'Ошибка при импорте библиотеки proc_lib.obj',39,'" -tW',0 + err_message_found_lib2 db 'Не удалось найти библиотеку buf2d.obj',39,'" -tE',0 + err_message_import2 db 'Ошибка при импорте библиотеки buf2d.obj',39,'" -tW',0 + err_message_found_lib3 db 'Не удалось найти библиотеку libimg.obj',39,'" -tE',0 + err_message_import3 db 'Ошибка при импорте библиотеки libimg.obj',39,'" -tW',0 + err_message_found_lib4 db 'Не удалось найти библиотеку msgbox.obj',39,'" -tE',0 + err_message_import4 db 'Ошибка при импорте библиотеки msgbox.obj',39,'" -tW',0 head_f_i: - head_f_l db 'Системная ошибка',0 ;заголовок окна, при возникновении ошибки + head_f_l db '"Системная ошибка',0 ;заголовок окна, при возникновении ошибки else - err_message_found_lib0 db 'Sorry I cannot found library box_lib.obj',0 - err_message_import0 db 'Error on load import library box_lib.obj',0 - err_message_found_lib1 db 'Sorry I cannot found library proc_lib.obj',0 - err_message_import1 db 'Error on load import library proc_lib.obj',0 - err_message_found_lib2 db 'Sorry I cannot found library buf2d.obj',0 - err_message_import2 db 'Error on load import library buf2d.obj',0 - err_message_found_lib3 db 'Sorry I cannot found library libimg.obj',0 - err_message_import3 db 'Error on load import library libimg.obj',0 - err_message_found_lib4 db 'Sorry I cannot found library msgbox.obj',0 - err_message_import4 db 'Error on load import library msgbox.obj',0 + err_message_found_lib0 db 'Sorry I cannot found library box_lib.obj',39,'" -tE',0 + err_message_import0 db 'Error on load import library box_lib.obj',39,'" -tW',0 + err_message_found_lib1 db 'Sorry I cannot found library proc_lib.obj',39,'" -tE',0 + err_message_import1 db 'Error on load import library proc_lib.obj',39,'" -tW',0 + err_message_found_lib2 db 'Sorry I cannot found library buf2d.obj',39,'" -tE',0 + err_message_import2 db 'Error on load import library buf2d.obj',39,'" -tW',0 + err_message_found_lib3 db 'Sorry I cannot found library libimg.obj',39,'" -tE',0 + err_message_import3 db 'Error on load import library libimg.obj',39,'" -tW',0 + err_message_found_lib4 db 'Sorry I cannot found library msgbox.obj',39,'" -tE',0 + err_message_import4 db 'Error on load import library msgbox.obj',39,'" -tW',0 head_f_i: - head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки + head_f_l db '"System error',0 ;заголовок окна, при возникновении ошибки end if system_dir0 db '/sys/lib/' @@ -1492,7 +1486,7 @@ import_box_lib: ted_but_undo dd sz_ted_but_undo ted_but_redo dd sz_ted_but_redo ted_but_reverse dd sz_ted_but_reverse - ted_but_find_next dd sz_ted_but_find_next + ted_but_find dd sz_ted_but_find ted_text_colored dd sz_ted_text_colored ;version_text_edit dd sz_ted_version @@ -1558,7 +1552,7 @@ dd 0,0 sz_ted_but_undo db 'ted_but_undo',0 sz_ted_but_redo db 'ted_but_redo',0 sz_ted_but_reverse db 'ted_but_reverse',0 - sz_ted_but_find_next db 'ted_but_find_next',0 + sz_ted_but_find db 'ted_but_find',0 sz_ted_text_colored db 'ted_text_colored',0 ;sz_ted_version db 'version_text_edit',0 diff --git a/programs/develop/libraries/box_lib/load_lib.mac b/programs/develop/libraries/box_lib/load_lib.mac index 7b6a63e04c..f11b506e1a 100644 --- a/programs/develop/libraries/box_lib/load_lib.mac +++ b/programs/develop/libraries/box_lib/load_lib.mac @@ -81,36 +81,18 @@ ;myimport: ; -;edit_box_draw dd aEdit_box_draw -;edit_box_key dd aEdit_box_key -;edit_box_mouse dd aEdit_box_mouse -;version_ed dd aVersion_ed -; -;check_box_draw dd aCheck_box_draw -;check_box_mouse dd aCheck_box_mouse -;version_ch dd aVersion_ch -; -;option_box_draw dd aOption_box_draw -;option_box_mouse dd aOption_box_mouse -;version_op dd aVersion_op - -; dd 0 -; dd 0 -; +;edit_box_draw dd aEdit_box_draw +;edit_box_key dd aEdit_box_key +;edit_box_mouse dd aEdit_box_mouse +;version_ed dd aVersion_ed +; dd 0,0 ;aEdit_box_draw db 'edit_box',0 ;aEdit_box_key db 'edit_box_key',0 ;aEdit_box_mouse db 'edit_box_mouse',0 ;aVersion_ed db 'version_ed',0 -;aCheck_box_draw db 'check_box_draw',0 -;aCheck_box_mouse db 'check_box_mouse',0 -;aVersion_ch db 'version_ch',0 -;aOption_box_draw db 'option_box_draw',0 -;aOption_box_mouse db 'option_box_mouse',0 -;aVersion_op db 'version_op',0 -;--------------------------------------------------------------------- macro @use_library { local lp1 @@ -136,13 +118,70 @@ run_notify_struct: .Buffer dd 0 db 0 .FileName dd file_name -;--------------------------------------------------------------------- @library_name equ dword [esp+16] @cur_dir_path equ dword [esp+12] @library_path equ dword [esp+8] @point_dir_name equ dword [esp+4] +;description: +; готовим текст для показа через @notify: +; 1) выделяем память в [arrea_xx] но не больше одного раза +; 2) копируем заголовок (если есть имя функции то добавляем его к заголовку) и текст сообщения в [arrea_xx] +;input: +; ebp+8 - head message +; ebp+12 - error message +; ebp+16 - 0 или имя функции, которую не удалось экспортировать +;output: +; eax = -1 +align 4 +l_lib_init_error_window: + push ebp + mov ebp,esp + cmp dword[arrea_xx],0 + jne .no_msg ;если раньше было создано другое сообщение + pushad + + mcall 68,11 + mcall 68,12,4096 + mov [arrea_xx],eax + + mov edi,eax + mov esi,[ebp+8] +align 4 +@@: + movsb + cmp byte[esi],0 + jne @b + mov word[edi],0xa0d + add edi,2 + + ;добавляем имя функции в заголовок + mov esi,[ebp+16] + or esi,esi + jz .lp1 + mov word[edi-2],0x2020 +@@: + movsb + cmp byte[esi],0 + jne @b + mov word[edi],0xa0d + add edi,2 +.lp1: + + mov esi,[ebp+12] +align 4 +@@: + movsb + cmp byte[esi],0 + jne @b + mov byte[edi],0 + popad + .no_msg: + or eax,-1 + pop ebp + ret 12 + align 4 @copy_path: mov esi,@cur_dir_path @@ -200,11 +239,9 @@ align 4 stosb test eax,eax jnz .lp4 -;--------------------------------------------------------------------- ret } - - +;--------------------------------------------------------------------- macro @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load { @@ -215,92 +252,93 @@ library_fun_memory_realloc equ mem_realloc library_fun_dll_load equ dll_load } - macro sys_load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__,point_dir_name__ { -local end_steep -local exit -;--------------------------------------------------------------------- -; loading Box_Lib library +local i_begin +local i_error +local i_exit - mcall 68,19,system_path__ ; load of sys directory - test eax,eax - jnz end_steep + mcall 68,19,system_path__ ; load of sys directory + test eax,eax + jnz i_begin if point_dir_name__ eq - copy_path library_name__, cur_dir_path__, library_path__,0x0 + copy_path library_name__, cur_dir_path__, library_path__,0 else - copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ ;the macros making way /current pach a program/+ name system library -end if - - mcall 68,19,library_path__ ; load of alternative - test eax,eax - jnz end_steep - show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window - jmp exit - - + ;the macros making way /current path a program/ + name system library + copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ +end if + mcall 68,19,library_path__ ; load of alternative + test eax,eax + jnz i_begin + push eax + push dword err_message_found_lib__ + push dword head_f_l__ + jmp i_error align 4 -end_steep: - - import_boxlib myimport, err_message_import__, head_f_i__ ;import -exit: - test eax,eax - jz @f - - notify_window_run [arrea_xx] ; создаем окно @notify - or eax,-1 -@@: - -;--------------------------------------------------------------------- + i_begin: + import_boxlib myimport + test eax,eax + jz i_exit + push eax + push dword err_message_import__ + push dword head_f_i__ + i_error: + call l_lib_init_error_window + notify_window_run [arrea_xx] ; создаем окно @notify + i_exit: } - +;--------------------------------------------------------------------- macro load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__,point_dir_name__ { -local end_steep -local exit -;--------------------------------------------------------------------- -; loading Box_Lib library +local i_begin +local i_error +local i_exit if point_dir_name__ eq - copy_path library_name__, cur_dir_path__, library_path__,0x0 + copy_path library_name__, cur_dir_path__, library_path__,0 else - copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ ;the macros making way /current pach a program/+ name system library -end if - - mcall 68,19,library_path__ ; load of alternative - test eax,eax - jnz end_steep - - mcall 68,19,system_path__ ; load of sys directory - test eax,eax - jnz end_steep - - show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window - jmp exit + ;the macros making way /current path a program/ + name system library + copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ +end if + mcall 68,19,library_path__ ; load of alternative + test eax,eax + jnz i_begin + mcall 68,19,system_path__ ; load of sys directory + test eax,eax + jnz i_begin + push eax + push dword err_message_found_lib__ + push dword head_f_l__ + jmp i_error align 4 -end_steep: - - import_boxlib myimport, err_message_import__, head_f_i__ ;import -exit: - test eax,eax - jz @f - - notify_window_run [arrea_xx] ; создаем окно @notify - or eax,-1 -@@: - + i_begin: + import_boxlib myimport + test eax,eax + jz i_exit + push eax + push dword err_message_found_lib__ + push dword head_f_l__ + i_error: + call l_lib_init_error_window + notify_window_run [arrea_xx] ; создаем окно @notify + i_exit: ;--------------------------------------------------------------------- } + +;description: +; макрос загрузки библиотек из системной папки, если библиотека не найдена +; тогда поиск идет в текущей папке с программой macro sys_load_libraries _start,_end { -local exit_lp2 -local lp2 -local lp +local cycle0 local end_steep -local next +local cycle0n +local cycle1 +local cycle1n +local cycle1e ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; library_name__ equ [ebp] cur_dir_path__ equ [ebp+4] @@ -315,70 +353,76 @@ point_dir_name__ equ [ebp+36] adr_load_lib equ dword [ebp+40] status_lib equ dword [ebp+44] - mov ebp,_start - mov ecx,((_end-_start)/ll_struc_size) - + mov ebp,_start + mov ecx,(_end-_start)/ll_struc_size align 4 -lp: push ecx + cycle0: + push ecx mcall 68,19,system_path__ ; load of sys directory test eax,eax jnz end_steep - copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ ;the macros making way /current pach a program/+ name system library + ;the macros making way /current path a program/ + name system library + copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ mcall 68,19,library_path__ ; load of alternative test eax,eax jnz end_steep + or status_lib,1 ; status of code - enable error - not found library - or status_lib,0x1 ; status of code - enable error - not found library - - show_error_window err_message_found_lib__, head_f_l__, ;show error message /create window - jmp next + push eax + push dword err_message_found_lib__ + push dword head_f_l__ + call l_lib_init_error_window + jmp cycle0n align 4 -end_steep: - mov adr_load_lib,eax ;save adr lib in memory - import_boxlib my_import, err_message_import__, head_f_i__ ;import - - test eax,eax - jz next - - or status_lib,0x2 ; status of code - enable error - import error - -next: - pop ecx - add ebp,ll_struc_size - dec ecx - jnz lp - -;---------------------------------- - mov ebp,_start - mov ecx,((_end-_start)/ll_struc_size) + end_steep: + mov adr_load_lib,eax ;save adr lib in memory + import_boxlib my_import + test eax,eax + jz cycle0n + or status_lib,2 ; status of code - enable error - import error + push eax + push dword err_message_import__ + push dword head_f_i__ + call l_lib_init_error_window + cycle0n: + pop ecx + add ebp,ll_struc_size + dec ecx + jnz cycle0 + ;вывод сообщения об ошибке при загрузке + mov ebp,_start + mov ecx,(_end-_start)/ll_struc_size align 4 -lp2: - mov eax,status_lib - test eax,eax - jz @f - - notify_window_run [arrea_xx] ; создаем окно @notify - or eax,-1 - jmp exit_lp2 - -@@: - add ebp,ll_struc_size - dec ecx - jnz lp2 -exit_lp2: + cycle1: + mov eax,status_lib + test eax,eax + jz cycle1n + notify_window_run [arrea_xx] ; создаем окно @notify + mov eax,-1 + jmp cycle1e +align 4 + cycle1n: + add ebp,ll_struc_size + dec ecx + jnz cycle1 + cycle1e: } +;description: +; макрос загрузки библиотек из текущей папки с программой, если библиотека не найдена +; тогда поиск идет в системной папке macro load_libraries _start,_end { -local lp2 -local exit_lp2 -local lp +local cycle0 local end_steep -local next +local cycle0n +local cycle1 +local cycle1n +local cycle1e ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; library_name__ equ [ebp] cur_dir_path__ equ [ebp+4] @@ -393,64 +437,64 @@ point_dir_name__ equ [ebp+36] adr_load_lib equ dword [ebp+40] status_lib equ dword [ebp+44] - mov ebp,_start - mov ecx,((_end-_start)/ll_struc_size) + mov ebp,_start + mov ecx,(_end-_start)/ll_struc_size +align 4 + cycle0: + push ecx + + ;the macros making way /current path a program/ + name system library + copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ + + mcall 68,19,library_path__ ; load of alternative + test eax,eax + jnz end_steep + + mcall 68,19,system_path__ ; load of sys directory + test eax,eax + jnz end_steep + or status_lib,1 ; status of code - enable error - not found library + + push eax + push dword err_message_found_lib__ + push dword head_f_l__ + call l_lib_init_error_window + jmp cycle0n align 4 -lp: push ecx - - copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ ;the macros making way /current pach a program/+ name system library - - mcall 68,19,library_path__ ; load of alternative - test eax,eax - jnz end_steep - - mcall 68,19,system_path__ ; load of sys directory - test eax,eax - jnz end_steep - - or status_lib,0x1 ; status of code - enable error - not found library - - show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window - jmp next + end_steep: + mov adr_load_lib,eax ;save adr lib in memory + import_boxlib my_import + test eax,eax + jz cycle0n + or status_lib,2 ; status of code - enable error - import error + push eax + push dword err_message_import__ + push dword head_f_i__ + call l_lib_init_error_window + cycle0n: + pop ecx + add ebp,ll_struc_size + dec ecx + jnz cycle0 + ;вывод сообщения об ошибке при загрузке + mov ebp,_start + mov ecx,(_end-_start)/ll_struc_size align 4 -end_steep: - mov adr_load_lib,eax ;save adr lib in memory - - import_boxlib my_import, err_message_import__, head_f_i__ ;import - - test eax,eax - jz next - - or status_lib,0x2 ; status of code - enable error - import error - -next: - pop ecx - add ebp,ll_struc_size - dec ecx - jnz lp - -;----------------------------------------------- - mov ebp,_start - mov ecx,((_end-_start)/ll_struc_size) - + cycle1: + mov eax,status_lib + test eax,eax + jz cycle1n + notify_window_run [arrea_xx] ; создаем окно @notify + mov eax,-1 + jmp cycle1e align 4 -lp2: - mov eax,status_lib - test eax,eax - jz @f - - notify_window_run [arrea_xx] ; создаем окно @notify - or eax,-1 - jmp exit_lp2 - -@@: - add ebp,ll_struc_size - dec ecx - jnz lp2 -exit_lp2: - + cycle1n: + add ebp,ll_struc_size + dec ecx + jnz cycle1 + cycle1e: } @@ -468,41 +512,6 @@ pushad ;save all registers popad ;restore all registers } -; готовим текст для показа через @notify: -; 1) выделяем память в [arrea_xx] -; 2) копируем err_message и head в [arrea_xx] -macro show_error_window err_message, head -{ -local lp0 -local lp1 - -pushad - mcall 68,11 - mcall 68,12,4096 - push eax - pop dword[arrea_xx] - - mov edi,eax - mov esi,head - cld -align 4 -lp0: - movsb - cmp byte[esi],0 - jne lp0 - mov word[edi],0xa0d - add edi,2 - mov esi,dword err_message -align 4 -lp1: - movsb - cmp byte[esi],0 - jne lp1 - mov byte[edi],0 -popad - or eax,-1 ;увы -} - ; включаем показ сообщения через @notify: macro notify_window_run message { @@ -516,10 +525,12 @@ pop ebx eax } -;входные параметры: -;eax - адрес библиотеки в памяти -;myimport - импортируемые функции -macro import_boxlib myimport, err_message_import__, head_f_i__ +;input: +; eax - адрес библиотеки в памяти +; myimport - импортируемые функции +;output: +; eax - если удачно то 0 или указатель на имя функции которую не удалось загрузить +macro import_boxlib myimport { local import_loop local import_find @@ -528,7 +539,6 @@ local import_find_next local import_found local import_done local exit -local e.exit local import_not_found ; initialize import @@ -540,13 +550,13 @@ import_loop: jz import_done ;если указатель на имя функции = 0 (в пользовательской программе) push edx ;сохраняем начало библиотечных указателей на функции import_find: - mov ebx, [ds:edx] + mov ebx, [edx] test ebx, ebx jz import_not_found ;если указатель на имя функции = 0 (в библиотеке) push eax ;eax - указатель на имя экспортируемой функции (в пользовательской программе) lp: - mov cl, [ds:eax] - cmp cl, [ds:ebx] ;сравниваем имена функций в библиотеке и в пользовательской программе + mov cl, [eax] + cmp cl, [ebx] ;сравниваем имена функций в библиотеке и в пользовательской программе jnz import_find_next ;если названия не совпали test cl, cl jz import_found ;если названия совпали, и уже конец строки (cl=0) @@ -559,7 +569,7 @@ import_find_next: jmp import_find import_found: pop ebx ;востанавливаем указатель на имя функции (который был в eax) и освобождаем стек - mov eax, [ds:edx+4] ;eax = указатель на функцию (в библиотеке) + mov eax, [edx+4] ;eax = указатель на функцию (в библиотеке) mov [esi-4], eax ;копируем указатель (на функцию) в программу, -4 ставим потому что esi было сдвинуто командой lodsd pop edx ;устанавливаем edx на начало библиотечных функций ;--- проверяем совпадает ли имя экспортированной функции с 'lib_init' @@ -585,13 +595,13 @@ end if jmp import_loop import_not_found: add esp,4 - show_error_window err_message_import__, head_f_i__ ;show error message /create window - jmp e.exit + jmp exit import_done: xor eax,eax ;=0 все загрузилось удачно -e.exit: +exit: +} ;--------------------------------------------------------------------- -} + ll_struc_size = 48;($-library_name__) ; constant size of struct struc l_libs library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, my_import, err_message_import__, head_f_i__,point_dir_name; struct for loading libraries { @@ -607,11 +617,11 @@ struc l_libs library_name__, cur_dir_path__, library_path__, system_path__, err_ .err_message_import__ dd err_message_import__ .head_f_i__ dd head_f_i__ if point_dir_name eq -.point_dir_name__ dd 0x0 +.point_dir_name__ dd 0 else .point_dir_name__ dd point_dir_name ; имя вложенной дирректории в кторой храняться подгружаемые модули. end if -.adr_load_lib dd 0x0 -.status_lib dd 0x0 ;status of load library +.adr_load_lib dd 0 +.status_lib dd 0 ;status of load library ; }