forked from KolibriOS/kolibrios
use @notify
new macros 'notify_window_run' git-svn-id: svn://kolibrios.org@3374 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
26657b44a4
commit
a2d96a4749
@ -1,3 +1,5 @@
|
||||
;13.03.2013 - use @notify
|
||||
;08.06.2010 - new macros @use_library_mem
|
||||
;08.05.2009 - bugfix
|
||||
;14.04.2009 - a macros for code load library the box_lib.obj from '/sys/lib/' or current dirrectory.
|
||||
; The macros for load any library/libraries:
|
||||
@ -27,9 +29,9 @@
|
||||
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
;*****************************************************************************
|
||||
; This macros based on source code:
|
||||
; <Lrz> - Alexey Teplov / Алексей Теплов
|
||||
; Mario79, Mario - Marat Zakiyanov / Марат Закиянов
|
||||
; Diamondz - Evgeny Grechnikov / Евгений Гречников
|
||||
; <Lrz> - Alexey Teplov / €«¥ªá¥© ’¥¯«®¢
|
||||
; Mario79, Mario - Marat Zakiyanov / Œ à â ‡ ª¨ï®¢
|
||||
; Diamondz - Evgeny Grechnikov / …¢£¥¨© ƒà¥ç¨ª®¢
|
||||
;------------------------
|
||||
; DESCRIPTION
|
||||
; Macro load_library
|
||||
@ -62,13 +64,13 @@
|
||||
;- Well, if you get
|
||||
;
|
||||
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
;DATA данные
|
||||
;Всегда соблюдать последовательность в имени.
|
||||
;DATA ¤ ë¥
|
||||
;‚ᥣ¤ ᮡ«î¤ âì ¯®á«¥¤®¢ ⥫ì®áâì ¢ ¨¬¥¨.
|
||||
;system_path__ db '/sys/lib/'
|
||||
;library_name__ db 'box_lib.obj',0
|
||||
; Если есть желание разъединить, то нужно использовать следующию конструкцию
|
||||
; …᫨ ¥áâì ¦¥« ¨¥ à §ê¥¤¨¨âì, ⮠㦮 ¨á¯®«ì§®¢ âì á«¥¤ãîé¨î ª®áâàãªæ¨î
|
||||
;system_path__ db '/sys/lib/box_lib.obj',0
|
||||
;... любая последовательность других команд и определений.
|
||||
;... «î¡ ï ¯®á«¥¤®¢ ⥫ì®áâì ¤àã£¨å ª®¬ ¤ ¨ ®¯à¥¤¥«¥¨©.
|
||||
;library_name__ db 'box_lib.obj',0
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
@ -112,158 +114,25 @@
|
||||
macro @use_library
|
||||
{
|
||||
|
||||
local __sc
|
||||
local lp
|
||||
local lp1
|
||||
local correction
|
||||
local exit_
|
||||
local file_name
|
||||
|
||||
library_fun_memory_alloc equ 0 ;не использовать в макросах проверку на функции 'lib_init'
|
||||
err_message1 equ dword [esp+8]
|
||||
head1 equ dword [esp+4]
|
||||
|
||||
|
||||
__sc.frame equ dword [__sc+0]
|
||||
__sc.grab equ dword [__sc+4]
|
||||
__sc.grab_button equ dword [__sc+8]
|
||||
__sc.grab_button_text equ dword [__sc+12]
|
||||
__sc.grab_text equ dword [__sc+16]
|
||||
__sc.work equ dword [__sc+20]
|
||||
__sc.work_button equ dword [__sc+24]
|
||||
__sc.work_button_text equ dword [__sc+28]
|
||||
__sc.work_text equ dword [__sc+32]
|
||||
__sc.work_graph equ dword [__sc+36]
|
||||
|
||||
;;;;;;;;;;;CALC WIDTH & HIGHT WINDOW & CENTER MONITOR POSITION;;;;;;;;;;
|
||||
show_err_:
|
||||
;check memory
|
||||
push dword [arrea_xx]
|
||||
pop eax
|
||||
test eax,eax
|
||||
jnz @f
|
||||
|
||||
mcall 68,11
|
||||
mcall 68,12,4096
|
||||
push eax
|
||||
pop dword [arrea_xx]
|
||||
|
||||
push head1
|
||||
pop dword[eax]
|
||||
|
||||
push 0x0
|
||||
pop dword[eax+4]
|
||||
|
||||
@@:
|
||||
mov eax,48 ;get system color
|
||||
mov ebx,3
|
||||
mov ecx,__sc
|
||||
mov edx,sizeof.system_colors
|
||||
mcall
|
||||
;-----------------------------------
|
||||
xor eax,eax
|
||||
mov esi,err_message1
|
||||
mov ecx,30
|
||||
align 4
|
||||
lp: add ecx,7
|
||||
lodsb
|
||||
test eax,eax
|
||||
jnz lp
|
||||
|
||||
push dword [arrea_xx]
|
||||
pop ebp
|
||||
library_fun_memory_alloc equ 0 ;¥ ¨á¯®«ì§®¢ âì ¢ ¬ ªà®á å ¯à®¢¥àªã äãªæ¨¨ 'lib_init'
|
||||
|
||||
align 4
|
||||
@@: add ebp,4
|
||||
mov eax,dword [ebp]
|
||||
|
||||
test eax,eax
|
||||
jnz @b
|
||||
|
||||
push err_message1
|
||||
pop dword[ebp]
|
||||
|
||||
mov dword [ebp+4],eax
|
||||
|
||||
mcall 48,5 ;get system window
|
||||
cmp word[on_x],cx
|
||||
jae @f; не нужно обновлять
|
||||
|
||||
sub eax,ecx
|
||||
shl eax,15
|
||||
mov ax,cx
|
||||
mov dword [on_x],eax
|
||||
|
||||
@@:
|
||||
add word [on_y],12
|
||||
sub bx,word [on_y]
|
||||
shl ebx,15
|
||||
mov bx,word [on_y]
|
||||
mov dword [on_y],ebx
|
||||
|
||||
ret
|
||||
|
||||
|
||||
;;;;;;;;;;;DRAW WINDOW;;;;;;;;;;;;;;
|
||||
align 4
|
||||
start__:
|
||||
mcall 40,0x5 ;set mask on events rewraw window and get id button.
|
||||
.red_win:
|
||||
;draw_window:
|
||||
mcall 12,1
|
||||
|
||||
xor eax,eax
|
||||
mov ebp,dword [arrea_xx] ; set point
|
||||
mov ebx,dword [on_x]
|
||||
mov ecx,dword [on_y]
|
||||
mov edx,__sc.work
|
||||
or edx,0x33000000
|
||||
mov esi,__sc.grab_text
|
||||
xor edi,edi
|
||||
mov edi,dword [ebp] ;head1
|
||||
mcall
|
||||
|
||||
mov ebx,(10*65536+25-12)
|
||||
add ebp,4 ;inc index
|
||||
|
||||
@@:
|
||||
mov eax,4
|
||||
add bx,12
|
||||
mov ecx,__sc.grab_text
|
||||
or ecx,0x90000000
|
||||
mov edx,dword [ebp] ;err_message1
|
||||
mcall
|
||||
|
||||
add ebp,4 ;inc index
|
||||
|
||||
mov eax,dword [ebp]
|
||||
test eax,eax
|
||||
jnz @b
|
||||
|
||||
mcall 12,2
|
||||
align 4
|
||||
|
||||
.still: ;main loop
|
||||
mcall 10 ;wait event
|
||||
dec eax
|
||||
jz .red_win
|
||||
sub eax,2
|
||||
jnz .still ;go to main loop
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
.button:
|
||||
mcall 17 ;get id button
|
||||
test ah,ah ;if in ah 0, then go to still
|
||||
jz .still
|
||||
mcall -1
|
||||
ret
|
||||
arrea_xx dd 0
|
||||
file_name db '/rd/1/@notify',0
|
||||
|
||||
align 4
|
||||
__sc system_colors
|
||||
on_x dd 0x0
|
||||
on_y dd 0x0000004E
|
||||
arrea_xx dd 0x0
|
||||
rb 0x50
|
||||
end_tr:
|
||||
|
||||
run_notify_struct:
|
||||
.Function dd 7
|
||||
.Position dd 0
|
||||
.Flags dd ?
|
||||
.Count dd 0
|
||||
.Buffer dd 0
|
||||
db 0
|
||||
.FileName dd file_name
|
||||
;---------------------------------------------------------------------
|
||||
|
||||
@library_name equ dword [esp+16]
|
||||
@ -368,7 +237,7 @@ exit:
|
||||
test eax,eax
|
||||
jz @f
|
||||
|
||||
mcall 51,1,start__,end_tr ; создаем новый поток по шаблону
|
||||
notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª® @notify
|
||||
or eax,-1
|
||||
@@:
|
||||
|
||||
@ -408,7 +277,7 @@ exit:
|
||||
test eax,eax
|
||||
jz @f
|
||||
|
||||
mcall 51,1,start__,end_tr ; создаем новый поток по шаблону
|
||||
notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª® @notify
|
||||
or eax,-1
|
||||
@@:
|
||||
|
||||
@ -481,7 +350,7 @@ lp2:
|
||||
test eax,eax
|
||||
jz @f
|
||||
|
||||
mcall 51,1,start__,end_tr ; создаем новый поток по шаблону
|
||||
notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª® @notify
|
||||
or eax,-1
|
||||
jmp exit_lp2
|
||||
|
||||
@ -561,7 +430,7 @@ lp2:
|
||||
test eax,eax
|
||||
jz @f
|
||||
|
||||
mcall 51,1,start__,end_tr ; создаем новый поток по шаблону
|
||||
notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª® @notify
|
||||
or eax,-1
|
||||
jmp exit_lp2
|
||||
|
||||
@ -587,22 +456,57 @@ macro copy_path lib_name,dir_path,lib_path,point_dir_name
|
||||
popad ;restore all registers
|
||||
}
|
||||
|
||||
; £®â®¢¨¬ ⥪áâ ¤«ï ¯®ª § ç¥à¥§ @notify:
|
||||
; 1) ¢ë¤¥«ï¥¬ ¯ ¬ïâì ¢ [arrea_xx]
|
||||
; 2) ª®¯¨à㥬 err_message ¨ head ¢ [arrea_xx]
|
||||
macro show_error_window err_message, head
|
||||
{ pushad ;save all registers
|
||||
push dword err_message
|
||||
push dword head
|
||||
{
|
||||
local lp0
|
||||
local lp1
|
||||
|
||||
call show_err_
|
||||
pushad
|
||||
mcall 68,11
|
||||
mcall 68,12,4096
|
||||
push eax
|
||||
pop dword [arrea_xx]
|
||||
|
||||
add esp,8
|
||||
popad ;restore all registers
|
||||
or eax,-1 ;увы
|
||||
mov edi,eax
|
||||
mov esi,dword head
|
||||
cld
|
||||
align 4
|
||||
lp0:
|
||||
movsb
|
||||
cmp byte[esi],0
|
||||
jne lp0
|
||||
mov word[edi],'. '
|
||||
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
|
||||
{
|
||||
push eax ebx
|
||||
mov eax,message ;¯ à ¬¥âàë ¤«ï ª®¬ ¤®© áâப¨
|
||||
mov [run_notify_struct.Flags], eax
|
||||
mov eax,70 ;run @notify
|
||||
mov ebx,run_notify_struct
|
||||
int 0x40
|
||||
pop ebx eax
|
||||
}
|
||||
|
||||
|
||||
;входные параметры:
|
||||
;eax - адрес библиотеки в памяти
|
||||
;myimport - импортируемые функции
|
||||
;¢å®¤ë¥ ¯ à ¬¥âàë:
|
||||
;eax - ¤à¥á ¡¨¡«¨®â¥ª¨ ¢ ¯ ¬ïâ¨
|
||||
;myimport - ¨¬¯®àâ¨àã¥¬ë¥ äãªæ¨¨
|
||||
macro import_boxlib myimport, err_message_import__, head_f_i__
|
||||
{
|
||||
local import_loop
|
||||
@ -619,42 +523,42 @@ local import_not_found
|
||||
mov edx, eax
|
||||
mov esi,myimport
|
||||
import_loop:
|
||||
lodsd ;mov eax,dword[esi] ;add esi,4 ;получаем в eax указатель на имя импортируемой функции
|
||||
lodsd ;mov eax,dword[esi] ;add esi,4 ;¯®«ãç ¥¬ ¢ eax 㪠§ â¥«ì ¨¬ï ¨¬¯®àâ¨à㥬®© äãªæ¨¨
|
||||
test eax, eax
|
||||
jz import_done ;если указатель на имя функции = 0 (в пользовательской программе)
|
||||
push edx ;сохраняем начало библиотечных указателей на функции
|
||||
jz import_done ;¥á«¨ 㪠§ â¥«ì ¨¬ï äãªæ¨¨ = 0 (¢ ¯®«ì§®¢ ⥫ì᪮© ¯à®£à ¬¬¥)
|
||||
push edx ;á®åà 塞 ç «® ¡¨¡«¨®â¥çëå 㪠§ ⥫¥© äãªæ¨¨
|
||||
import_find:
|
||||
mov ebx, [ds:edx]
|
||||
test ebx, ebx
|
||||
jz import_not_found ;если указатель на имя функции = 0 (в библиотеке)
|
||||
push eax ;eax - указатель на имя экспортируемой функции (в пользовательской программе)
|
||||
jz import_not_found ;¥á«¨ 㪠§ â¥«ì ¨¬ï äãªæ¨¨ = 0 (¢ ¡¨¡«¨®â¥ª¥)
|
||||
push eax ;eax - 㪠§ â¥«ì ¨¬ï íªá¯®àâ¨à㥬®© äãªæ¨¨ (¢ ¯®«ì§®¢ ⥫ì᪮© ¯à®£à ¬¬¥)
|
||||
lp:
|
||||
mov cl, [ds:eax]
|
||||
cmp cl, [ds:ebx] ;сравниваем имена функций в библиотеке и в пользовательской программе
|
||||
jnz import_find_next ;если названия не совпали
|
||||
cmp cl, [ds:ebx] ;áà ¢¨¢ ¥¬ ¨¬¥ äãªæ¨© ¢ ¡¨¡«¨®â¥ª¥ ¨ ¢ ¯®«ì§®¢ ⥫ì᪮© ¯à®£à ¬¬¥
|
||||
jnz import_find_next ;¥á«¨ §¢ ¨ï ¥ ᮢ¯ «¨
|
||||
test cl, cl
|
||||
jz import_found ;если названия совпали, и уже конец строки (cl=0)
|
||||
jz import_found ;¥á«¨ §¢ ¨ï ᮢ¯ «¨, ¨ 㦥 ª®¥æ áâப¨ (cl=0)
|
||||
inc eax
|
||||
inc ebx
|
||||
jmp lp
|
||||
import_find_next:
|
||||
pop eax
|
||||
add edx, 8 ;8 = 4 байта указатель на название и 4 байта указатель на функцию
|
||||
add edx, 8 ;8 = 4 ¡ ©â 㪠§ â¥«ì §¢ ¨¥ ¨ 4 ¡ ©â 㪠§ ⥫ì äãªæ¨î
|
||||
jmp import_find
|
||||
import_found:
|
||||
pop ebx ;востанавливаем указатель на имя функции (который был в eax) и освобождаем стек
|
||||
mov eax, [ds:edx+4] ;eax = указатель на функцию (в библиотеке)
|
||||
mov [esi-4], eax ;копируем указатель (на функцию) в программу, -4 ставим потому что esi было сдвинуто командой lodsd
|
||||
pop edx ;устанавливаем edx на начало библиотечных функций
|
||||
;--- проверяем совпадает ли имя экспортированной функции с 'lib_init'
|
||||
pop ebx ;¢®áâ ¢«¨¢ ¥¬ 㪠§ â¥«ì ¨¬ï äãªæ¨¨ (ª®â®àë© ¡ë« ¢ eax) ¨ ®á¢®¡®¦¤ ¥¬ á⥪
|
||||
mov eax, [ds:edx+4] ;eax = 㪠§ ⥫ì äãªæ¨î (¢ ¡¨¡«¨®â¥ª¥)
|
||||
mov [esi-4], eax ;ª®¯¨à㥬 㪠§ ⥫ì ( äãªæ¨î) ¢ ¯à®£à ¬¬ã, -4 áâ ¢¨¬ ¯®â®¬ã çâ® esi ¡ë«® ᤢ¨ãâ® ª®¬ ¤®© lodsd
|
||||
pop edx ;ãáâ ¢«¨¢ ¥¬ edx ç «® ¡¨¡«¨®â¥çëå äãªæ¨©
|
||||
;--- ¯à®¢¥à塞 ᮢ¯ ¤ ¥â «¨ ¨¬ï íªá¯®àâ¨à®¢ ®© äãªæ¨¨ á 'lib_init'
|
||||
if library_fun_memory_alloc eq 0
|
||||
else
|
||||
cmp dword[ebx],'lib_'
|
||||
jne import_loop
|
||||
cmp dword[ebx+4],'init'
|
||||
jne import_loop
|
||||
;--- если имя функции совпало с 'lib_init' попадаем сюда
|
||||
;подключение функций для работы с памятью
|
||||
;--- ¥á«¨ ¨¬ï äãªæ¨¨ ᮢ¯ «® á 'lib_init' ¯®¯ ¤ ¥¬ áî¤
|
||||
;¯®¤ª«î票¥ äãªæ¨© ¤«ï à ¡®âë á ¯ ¬ïâìî
|
||||
;push eax
|
||||
;call dll.Init
|
||||
pushad
|
||||
@ -672,18 +576,18 @@ import_not_found:
|
||||
show_error_window err_message_import__, head_f_i__ ;show error message /create window
|
||||
jmp e.exit
|
||||
import_done:
|
||||
xor eax,eax ;=0 все загрузилось удачно
|
||||
xor eax,eax ;=0 ¢á¥ § £à㧨«®áì 㤠ç®
|
||||
e.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
|
||||
{
|
||||
.library_name__ dd library_name__ ; имя загружаемой библиотеки
|
||||
.cur_dir_path__ dd cur_dir_path__ ; указатель на буфер в котором содержиться путь от куда была запущена программа
|
||||
.library_name__ dd library_name__ ; ¨¬ï § £à㦠¥¬®© ¡¨¡«¨®â¥ª¨
|
||||
.cur_dir_path__ dd cur_dir_path__ ; 㪠§ â¥«ì ¡ãä¥à ¢ ª®â®à®¬ ᮤ¥à¦¨âìáï ¯ãâì ®â ªã¤ ¡ë« § ¯ãé¥ ¯à®£à ¬¬
|
||||
|
||||
.library_path__ dd library_path__ ; указатель на буфер в котором будет софоримирован путь к библиотеки, если нужно вычислить путь до либы с места запуска программы, обычно нужно, в случаях, если либа расположена в той же папке
|
||||
.complete_path dd system_path__ ; путь который четко содержит путь
|
||||
.library_path__ dd library_path__ ; 㪠§ â¥«ì ¡ãä¥à ¢ ª®â®à®¬ ¡ã¤¥â á®ä®à¨¬¨à®¢ ¯ãâì ª ¡¨¡«¨®â¥ª¨, ¥á«¨ 㦮 ¢ëç¨á«¨âì ¯ãâì ¤® «¨¡ë á ¬¥áâ § ¯ã᪠¯à®£à ¬¬ë, ®¡ëç® ã¦®, ¢ á«ãç ïå, ¥á«¨ «¨¡ à ᯮ«®¦¥ ¢ ⮩ ¦¥ ¯ ¯ª¥
|
||||
.complete_path dd system_path__ ; ¯ãâì ª®â®àë© ç¥âª® ᮤ¥à¦¨â ¯ãâì
|
||||
|
||||
.err_message_found_lib__ dd err_message_found_lib__
|
||||
.head_f_l__ dd head_f_l__
|
||||
@ -693,7 +597,7 @@ struc l_libs library_name__, cur_dir_path__, library_path__, system_path__, err_
|
||||
if point_dir_name eq
|
||||
.point_dir_name__ dd 0x0
|
||||
else
|
||||
.point_dir_name__ dd point_dir_name ; имя вложенной дирректории в кторой храняться подгружаемые модули.
|
||||
.point_dir_name__ dd point_dir_name ; ¨¬ï ¢«®¦¥®© ¤¨à४â®à¨¨ ¢ ªâ®à®© åà ïâìáï ¯®¤£à㦠¥¬ë¥ ¬®¤ã«¨.
|
||||
end if
|
||||
.adr_load_lib dd 0x0
|
||||
.status_lib dd 0x0 ;status of load library
|
||||
|
Loading…
Reference in New Issue
Block a user