modify load_lib.mac and add description (language ru)

git-svn-id: svn://kolibrios.org@1127 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Alexey Teplov ( 2009-07-06 14:27:36 +00:00
parent b8d5ef9aac
commit f5609621f4
2 changed files with 610 additions and 113 deletions

View File

@ -0,0 +1,396 @@
Руководство программиста по использованию макросов для универсальной загрузки библиотеки/библиотек
от 6 июля 2009г.
Copyright (c) 2009, <Lrz>
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the <organization> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE MPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************Изменения:
Доработан макрос, убраны ограничения при его использовании. Вывод сообщений об ошибках производиться в отдельном потоке. При пакетной обработке загрузки библиотек, в начале формируется все сообщения от библиотек, которые загружены с ошибками, и затем произведен вывод на экран отдельным потоком со всем списком ошибок.Введение:
В последнее время наметилась тенденция в переносе основных, базовых блоков (компонентов) в библиотеки. Для разработчика это является очень удобно, т.к. сроки разработки программы значительно сокращаются. Макрос load_lib.mac разрабатывался как универсальный для загрузки любого количества библиотек. Особенностью его является то, что если библиотека не может быть найдена по указанному пути, или существует ошибка при импорте, то тогда, формируется сообщение и выводиться в окне информация об ошибке. Поиск библиотеки происходит по 2-м направлениям. В текущей папке, откуда стартовала программа и в системной папке (по указанному пути + название библиотеки).
Структура макросов:
Файл load_lib.mac состоит из 5 основных макросов.
Для загрузки одной библиотеки существуют макросы первой группы, назовем, ее группа А. Для загрузки от 2-х и более библиотек созданы макросы группы B. Название этих макросов:
A:
sys_load_library
load_library
B:
sys_load_libraries
load_libraries
Для макросов группы А необходимо в качестве параметров указать следующие опции:
library_name, cur_dir_path, library_path, system_path, err_message_found_lib, head_f_l, myimport, err_message_import, head_f_i . Синтаксически правильно использовать следующию запись для правильного разворачивания макроса:
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
или
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
Разница между этими двумя макросами только в порядке проверки пути к библиотеке.
sys_load_library - в первую очередь проверяется значение указанное в system_path, т.е. на этом месте где находится system_path должен быть помещен адрес записи.
Всегда соблюдать последовательность в имени.
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
А load_library - в первую очередь проверяет текущую папку, т.е. использует этот путь для поиска библиотеки.
library_name - имя библиотеки обычно в данных определяется как
library_name db 'box_lib.obj',0
Иногда, возникает необходимость загрузки библиотеки с папки, которая находиться ниже уровнем директории, с которой была запущена программа. Допустим, следующее:
Необходимая нам библиотека расположена в папке ff2, для того, что бы макрос загрузил библиотеку из этой папки, нам нужно сделать следующее:
Обращаю внимание, что короткая запись в этом случае невозможна, и нужно определить следующие пути полностью.
system_path db '/sys/lib/tread_lib.obj',0
;... любая последовательность других команд и определений.
library_name db 'ff2/tread_lib.obj',0
- именно такое определение имени, позволит динамически сформировать путь до нашей бибилотеки.
cur_dir_path - первоначально должен быть определен в заголовке программы, как:
use32 ; транслятор, использующий 32 разрядных команды
org 0x0 ; базовый адрес кода, всегда 0x0
db 'MENUET01' ; идентификатор исполняемого файла (8 байт)
dd 0x1 ; версия формата заголовка исполняемого файла
dd start ; адрес, на который система передаёт управление
; после загрузки приложения в память
dd i_end ; размер приложения
dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
dd 0x0 ; указатель на строку с параметрами.
dd cur_dir_path ; указатель на адрес, куда помещается строка, содержащая путь до программы в момент запуска.
а затем в секции DATA программы
cur_dir_path rb 4096 ; значение 4096 может быть и меньше, но должно вмещать полностью путь до библиотеки. Т.е. это буфер, в котором формируется путь при запуске программы.
library_path - начало буфера, в котором будет сформирован путь полученный при запуске программы с именем библиотеки.
library_path rb 4096
system_path - путь до библиотеки с именем библиотеки. Предполагаем, что, тут указан полный путь до библиотеки.
Всегда соблюдать последовательность в имени.
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
err_message_found_lib - строка, которая будет в сформированном окне, если библиотека не будет найдена.
err_message_found_lib db 'Sorry I cannot load library box_lib.obj',0
head_f_l - заголовок окна, при возникновении ошибки - библиотека не найдена.
head_f_l db 'System error',0
myimport - указатель на импорт функций из библиотеки.
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
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
err_message_import - строка, которая будет в сформированном окне, если при импорте функций произошла ошибка.
err_message_import db 'Error on load import library box_lib.obj',0
head_f_i - заголовок окна, при возникновении ошибки - ошибка импорта функций.
head_f_i db 'System error',0
После того, как макрос будет раскрыт и отработает свою часть кода, можно узнать об успешности или не успешности загрузки, импорте библиотеки. В регистре еax формируется 0 при успешной загрузке и импорте, или -1, если на любом из этих этапов возникла ошибка. При возникновении ошибки рекомендуется завершить выполнение программы.
cmp eax,-1
jz exit
Группа макросов B
Основным отличием макросов группы А, от группы B является блочная (пакетная) обработка загрузки большого количестве библиотек. Так же, больше информации можно получить после обработки пакета. Так, при пакетной обработке получаем код возврата, который содержит 2 типа кодов ошибок:
Не нашли либу
Не смогли импортировать функции.
B:
sys_load_libraries
load_libraries
Для макросов группы B необходимо в качестве параметров указать следующие опции:
начало блока данных структур и конец load_libraries l_libs_start,end_l_libs, где
l_libs_start:
library01 l_libs boxlib_name, path, file_name, system_dir, \
er_message_found_lib, ihead_f_l, myimport, er_message_import, ihead_f_i
library02 l_libs plugin_BMP_name, path, file_name, system_dir1,\
er_message_found_lib2, ihead_f_l, myimport, er_message_import2, ihead_f_i
end_l_libs:
Вот такая запись
library01 l_libs boxlib_name, path, file_name, system_dir, \
er_message_found_lib, ihead_f_l, myimport, er_message_import, ihead_f_i
раскрывается в следующее:
.library_name dd library_name
.cur_dir_path dd cur_dir_path
.library_path dd library_path
.system_path dd system_path
.err_message_found_lib dd err_message_found_lib
.head_f_l dd head_f_l
.my_import dd my_import
.err_message_import dd err_message_import
.head_f_i dd head_f_i
;выше полностью соответствует значениям для параметров группы макросов А.
.adr_load_lib dd 0x0 ; адрес загруженной библиотеки
.status_lib dd 0x0 ;status of load library - статус коды могут принимать значение 0 - успешно, 0х1 - ошибка поиска библиотеки, 0х2 - ошибка импорта функций.
Если нужно узнать программе, как загрузилась библиотека, используем следующую проверку:
;проверка на сколько удачно загрузилась наша библиотека
mov ebp,library01 - метка структуры
cmp dword [ebp+ll_struc_size-4],0 ; тут проверяем код статуса возврата
jnz exit ;если не 0, то уходим.
;получение адреса загруженной библиотеки
mov ebp,library01 - метка структуры
cmp dword [ebp+ll_struc_size-4],0 ; тут проверяем код статуса возврата
jnz exit ;если не 0, то уходим.
mov ebp, dword [ebp+ll_struc_size-8] - в ebp адрес начала.
Макорос @use_library
Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса обязательно.
Как я могу использовать макрос загрузки библиотеки/библиотек в своей программе?
Общий шаблон для использования библиотеки такой:
use32 ; транслятор, использующий 32 разрядных команды
org 0x0 ; базовый адрес кода, всегда 0x0
db 'MENUET01' ; идентификатор исполняемого файла (8 байт)
dd 0x1 ; версия формата заголовка исполняемого файла
dd start ; адрес, на который система передаёт управление
; после загрузки приложения в память
dd i_end ; размер приложения
dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
dd 0x0 ; указатель на строку с параметрами.
dd cur_dir_path
include 'macros.inc'
include 'editbox_ex.mac'
include 'load_lib.mac'
@use_library ;use load lib macros
start:
;universal load library/librarys
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
;if return code =-1 then exit, else nornary work
cmp eax,-1
jz exit
mcall 40,0x27 ;установить маску для ожидаемых событий
red_win:
call draw_window ;первоначально необходимо нарисовать окно
align 4
still: ;основной обработчик
mcall 10 ;Ожидать события
dec eax
jz red_win
dec eax
jz key
dec eax
jz button
push dword edit1
call [edit_box_mouse]
push dword edit2
call [edit_box_mouse]
push dword check1
call [check_box_mouse]
push dword check2
call [check_box_mouse]
push dword Option_boxs
call [option_box_mouse]
push dword Option_boxs2
call [option_box_mouse]
jmp still ;если ничего из перечисленного то снова в цикл
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
button:
mcall 17 ;получить идентификатор нажатой клавиши
test ah,ah ;если в ah 0, то перейти на обработчик событий still
jz still
exit: mcall -1
key:
mcall 2 ;загрузим значение 2 в регистор eax и получим код нажатой клавиши
push dword edit1
call [edit_box_key]
push dword edit2
call [edit_box_key]
jmp still
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
align 4
draw_window: ;рисование окна приложения
mcall 12,1
mcall 0,(50*65536+390),(30*65536+200),0x33AABBCC,0x805080DD,hed
push dword edit1
call [edit_box_draw]
push dword edit2
call [edit_box_draw]
push dword check1
call [check_box_draw]
push dword check2
call [check_box_draw]
push dword Option_boxs
call [option_box_draw]
push dword Option_boxs2
call [option_box_draw]
mcall 12,2
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
err_message_found_lib db 'Sorry I cannot load library box_lib.obj',0
head_f_i:
head_f_l db 'System error',0
err_message_import db 'Error on load import library box_lib.obj',0
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
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
check1 check_box 10,45,6,12,0x80AABBCC,0,0,check_text,14,ch_flag_en
check2 check_box 10,60,6,12,0x80AABBCC,0,0,check_text2,15
edit1 edit_box 350,3,5,0xffffff,0x6f9480,0,0xAABBCC,0,308,hed,ed_focus,hed_end-hed-1,hed_end-hed-1
edit2 edit_box 350,3,25,0xffffff,0x6a9480,0,0,0,99,ed_buffer,ed_figure_only
op1 option_box option_group1,10,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1
op2 option_box option_group1,10,105,6,12,0xFFFFFF,0,0,op_text.2,op_text.e2-op_text.2
op3 option_box option_group1,10,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3
op11 option_box option_group2,120,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1
op12 option_box option_group2,120,105,6,12,0xffffff,0,0,op_text.2,op_text.e2-op_text.2
op13 option_box option_group2,120,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3
option_group1 dd op1 ;указатели, они отображаются по умолчанию, когда выводится
option_group2 dd op12 ;приложение
Option_boxs dd op1,op2,op3,0
Option_boxs2 dd op11,op12,op13,0
hed db 'BOXs load from lib <Lrz> date 27.04.2009',0
hed_end:
rb 256
check_text db 'First checkbox'
check_text2 db 'Second checkbox'
op_text: ; Сопровождающий текст для чек боксов
.1 db 'Option_Box #1'
.e1:
.2 db 'Option_Box #2'
.e2:
.3 db 'Option_Box #3'
.e3:
ed_buffer rb 100
;-----------------------
;sc system_colors
p_info process_information
cur_dir_path rb 4096
library_path rb 4096
i_end:
rb 1024
mem:

View File

@ -54,8 +54,8 @@
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
;-Example using single load library ;-Example using single load library
;-universal load library/librarys ;-universal load library/librarys
;load_library library_name, cur_dir_path, library_path, system_path, \ ;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 ;err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__
;-if return code =-1 then exit, else normally work ;-if return code =-1 then exit, else normally work
; cmp eax,-1 ; cmp eax,-1
; jz exit ; jz exit
@ -64,18 +64,18 @@
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;DATA äàííûå ;DATA äàííûå
;Âñåãäà ñîáëþäàòü ïîñëåäîâàòåëüíîñòü â èìåíè. ;Âñåãäà ñîáëþäàòü ïîñëåäîâàòåëüíîñòü â èìåíè.
;system_path db '/sys/lib/' ;system_path__ db '/sys/lib/'
;library_name db 'box_lib.obj',0 ;library_name__ db 'box_lib.obj',0
; Åñëè åñòü æåëàíèå ðàçúåäèíèòü, òî íóæíî èñïîëüçîâàòü ñëåäóþùèþ êîíñòðóêöèþ ; Åñëè åñòü æåëàíèå ðàçúåäèíèòü, òî íóæíî èñïîëüçîâàòü ñëåäóþùèþ êîíñòðóêöèþ
;system_path db '/sys/lib/box_lib.obj',0 ;system_path__ db '/sys/lib/box_lib.obj',0
;... ëþáàÿ ïîñëåäîâàòåëüíîñòü äðóãèõ êîìàíä è îïðåäåëåíèé. ;... ëþáàÿ ïîñëåäîâàòåëüíîñòü äðóãèõ êîìàíä è îïðåäåëåíèé.
;library_name db 'box_lib.obj',0 ;library_name__ db 'box_lib.obj',0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;err_message_found_lib db 'Sorry I cannot found library box_lib.obj',0 ;err_message_found_lib__ db 'Sorry I cannot found library box_lib.obj',0
;head_f_i: ;head_f_i__:
;head_f_l db 'System error',0 ;head_f_l__ db 'System error',0
;err_message_import db 'Error on load import library box_lib.obj',0 ;err_message_import__ db 'Error on load import library box_lib.obj',0
;myimport: ;myimport:
; ;
@ -111,15 +111,13 @@
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
macro @use_library macro @use_library
{ {
show_err_:
local red_win
local still
local button
local __sc local __sc
local start
local ex_lp
local lp local lp
local lp1
local correction local correction
;local end_tr
local exit_
;/equ ;/equ
err_message1 equ dword [esp+8] err_message1 equ dword [esp+8]
head1 equ dword [esp+4] head1 equ dword [esp+4]
@ -136,92 +134,136 @@ __sc.work_button_text equ dword [__sc+28]
__sc.work_text equ dword [__sc+32] __sc.work_text equ dword [__sc+32]
__sc.work_graph equ dword [__sc+36] __sc.work_graph equ dword [__sc+36]
;local on_x
;local on_y
;;;;;;;;;;;CALC WIDTH & HIGHT WINDOW & CENTER MONITOR POSITION;;;;;;;;;; ;;;;;;;;;;;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 eax,48 ;get system color
mov ebx,3 mov ebx,3
mov ecx,__sc mov ecx,__sc
mov edx,sizeof.system_colors mov edx,sizeof.system_colors
mcall mcall
;--------------------------------------------------------------------- ;-----------------------------------
;get with text imul on 6 pix
xor eax,eax xor eax,eax
mov esi,err_message1 mov esi,err_message1
mov ecx,30 mov ecx,30
align 4 align 4
lp: lodsb lp: add ecx,7
lodsb
test eax,eax test eax,eax
jz ex_lp jnz lp
add ecx,7
jmp lp push dword [arrea_xx]
;--------------------------------------------------------------------- pop ebp
ex_lp:
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 mcall 48,5 ;get system window
cmp word[on_x],cx
jae @f; íå íóæíî îáíîâëÿòü
sub eax,ecx sub eax,ecx
sub bx,90
shl eax,15 shl eax,15
shl ebx,15
mov ax,cx mov ax,cx
mov bx,90
mov dword [on_x],eax 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 mov dword [on_y],ebx
; mov eax,dword [esp+4] ret
; mov dword [header_xx],eax
; mov eax,dword [esp+8]
; mov dword [message_xx],eax
jmp start
__sc system_colors
on_x dd ?
on_y dd ?
message_xx dd ?
header_xx dd ?
;;;;;;;;;;;DRAW WINDOW;;;;;;;;;;;;;; ;;;;;;;;;;;DRAW WINDOW;;;;;;;;;;;;;;
start: align 4
start__:
mcall 40,0x5 ;set mask on events rewraw window and get id button. mcall 40,0x5 ;set mask on events rewraw window and get id button.
red_win: .red_win:
;draw_window: ;draw_window:
mcall 12,1 mcall 12,1
xor eax,eax xor eax,eax
mov ebp,dword [arrea_xx] ; set point
mov ebx,dword [on_x] mov ebx,dword [on_x]
mov ecx,dword [on_y] mov ecx,dword [on_y]
mov edx,__sc.work mov edx,__sc.work
or edx,0x33000000 or edx,0x33000000
mov esi,__sc.grab_text mov esi,__sc.grab_text
mov edi,head1 xor edi,edi
mov edi,dword [ebp] ;head1
mcall mcall
mov ebx,(10*65536+25-12)
add ebp,4 ;inc index
@@:
mov eax,4 mov eax,4
mov ebx,(10*65536+25) add bx,12
mov ecx,__sc.grab_text mov ecx,__sc.grab_text
or ecx,0x90000000 or ecx,0x90000000
mov edx,err_message1 mov edx,dword [ebp] ;err_message1
mcall mcall
add ebp,4 ;inc index
mov eax,dword [ebp]
test eax,eax
jnz @b
mcall 12,2 mcall 12,2
align 4 align 4
still: ;main loop
.still: ;main loop
mcall 10 ;wait event mcall 10 ;wait event
dec eax dec eax
jz red_win jz .red_win
sub eax,2 sub eax,2
jnz still ;go to main loop jnz .still ;go to main loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
button: .button:
mcall 17 ;get id button mcall 17 ;get id button
test ah,ah ;if in ah 0, then go to still test ah,ah ;if in ah 0, then go to still
jz still jz .still
or dword [esp+40],-1; modify eax in stack (pushad) mcall -1
ret ret
align 4
__sc system_colors
on_x dd 0x0
on_y dd 0x0000004E
arrea_xx dd 0x0
rb 0x50
end_tr:
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
@library_name equ dword [esp+12] @library_name equ dword [esp+12]
@cur_dir_path equ dword [esp+8] @cur_dir_path equ dword [esp+8]
@ -264,107 +306,120 @@ align 4
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 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__
{ {
local end_steep local end_steep
local exit local exit
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
; loading Box_Lib library ; loading Box_Lib library
mcall 68,19,system_path ; load of sys directory mcall 68,19,system_path__ ; load of sys directory
test eax,eax test eax,eax
jnz end_steep jnz end_steep
copy_path library_name, cur_dir_path, library_path ;the macros making way /current pach a program/+ name system library copy_path library_name__, cur_dir_path__, library_path__ ;the macros making way /current pach a program/+ name system library
mcall 68,19,library_path ; load of alternative mcall 68,19,library_path__ ; load of alternative
test eax,eax test eax,eax
jnz end_steep jnz end_steep
show_error_window err_message_found_lib, head_f_l ;show error message /create window show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window
jmp exit jmp exit
align 4 align 4
end_steep: end_steep:
import_boxlib myimport, err_message_import, head_f_i ;import import_boxlib myimport, err_message_import__, head_f_i__ ;import
exit: exit:
test eax,eax
jz @f
mcall 51,1,start__,end_tr ; ñîçäàåì íîâûé ïîòîê ïî øàáëîíó
or eax,-1
@@:
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
} }
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 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__
{ {
local end_steep local end_steep
local exit local exit
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
; loading Box_Lib library ; loading Box_Lib library
copy_path library_name, cur_dir_path, library_path ;the macros making way /current pach a program/+ name system library copy_path library_name__, cur_dir_path__, library_path__ ;the macros making way /current pach a program/+ name system library
mcall 68,19,library_path ; load of alternative mcall 68,19,library_path__ ; load of alternative
test eax,eax test eax,eax
jnz end_steep jnz end_steep
mcall 68,19,system_path ; load of sys directory mcall 68,19,system_path__ ; load of sys directory
test eax,eax test eax,eax
jnz end_steep jnz end_steep
show_error_window err_message_found_lib, head_f_l ;show error message /create window show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window
jmp exit jmp exit
align 4 align 4
end_steep: end_steep:
import_boxlib myimport, err_message_import, head_f_i ;import import_boxlib myimport, err_message_import__, head_f_i__ ;import
exit: exit:
test eax,eax
jz @f
mcall 51,1,start__,end_tr ; ñîçäàåì íîâûé ïîòîê ïî øàáëîíó
or eax,-1
@@:
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
} }
macro sys_load_libraries _start,_end macro sys_load_libraries _start,_end
{ {
local exit_lp2
local lp2
local lp local lp
local end_steep local end_steep
local next local next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
library_name equ [ebp] library_name__ equ [ebp]
cur_dir_path equ [ebp+4] cur_dir_path__ equ [ebp+4]
library_path equ [ebp+8] library_path__ equ [ebp+8]
system_path equ [ebp+12] system_path__ equ [ebp+12]
err_message_found_lib equ [ebp+16] err_message_found_lib__ equ [ebp+16]
head_f_l equ [ebp+20] head_f_l__ equ [ebp+20]
my_import equ [ebp+24] my_import equ [ebp+24]
err_message_import equ [ebp+28] err_message_import__ equ [ebp+28]
head_f_i equ [ebp+32] head_f_i__ equ [ebp+32]
adr_load_lib equ dword [ebp+36] adr_load_lib equ dword [ebp+36]
status_lib equ dword [ebp+40] status_lib equ dword [ebp+40]
; show_error_window err_message_found_lib, head_f_l ;show error message /create window
; int 0x40
mov ebp,_start mov ebp,_start
mov ecx,((_end-_start)/ll_struc_size) mov ecx,((_end-_start)/ll_struc_size)
align 4 align 4
lp: push ecx lp: push ecx
mcall 68,19,system_path ; load of sys directory mcall 68,19,system_path__ ; load of sys directory
test eax,eax test eax,eax
jnz end_steep jnz end_steep
copy_path library_name, cur_dir_path, library_path ;the macros making way /current pach a program/+ name system library copy_path library_name__, cur_dir_path__, library_path__ ;the macros making way /current pach a program/+ name system library
mcall 68,19,library_path ; load of alternative mcall 68,19,library_path__ ; load of alternative
test eax,eax test eax,eax
jnz end_steep jnz end_steep
or status_lib,0x1 ; 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 show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window
jmp next jmp next
align 4 align 4
end_steep: end_steep:
mov adr_load_lib,eax ;save adr lib in memory mov adr_load_lib,eax ;save adr lib in memory
import_boxlib my_import, err_message_import, head_f_i ;import import_boxlib my_import, err_message_import__, head_f_i__ ;import
test eax,eax test eax,eax
jz next jz next
@ -376,23 +431,45 @@ next:
add ebp,ll_struc_size add ebp,ll_struc_size
dec ecx dec ecx
jnz lp jnz lp
;----------------------------------
mov ebp,_start
mov ecx,((_end-_start)/ll_struc_size)
align 4
lp2:
mov eax,status_lib
test eax,eax
jz @f
mcall 51,1,start__,end_tr ; ñîçäàåì íîâûé ïîòîê ïî øàáëîíó
or eax,-1
jmp exit_lp2
@@:
add ebp,ll_struc_size
dec ecx
jnz lp2
exit_lp2:
} }
macro load_libraries _start,_end macro load_libraries _start,_end
{ {
local lp2
local exit_lp2
local lp local lp
local end_steep local end_steep
local next local next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
library_name equ [ebp] library_name__ equ [ebp]
cur_dir_path equ [ebp+4] cur_dir_path__ equ [ebp+4]
library_path equ [ebp+8] library_path__ equ [ebp+8]
system_path equ [ebp+12] system_path__ equ [ebp+12]
err_message_found_lib equ [ebp+16] err_message_found_lib__ equ [ebp+16]
head_f_l equ [ebp+20] head_f_l__ equ [ebp+20]
my_import equ [ebp+24] my_import equ [ebp+24]
err_message_import equ [ebp+28] err_message_import__ equ [ebp+28]
head_f_i equ [ebp+32] head_f_i__ equ [ebp+32]
adr_load_lib equ dword [ebp+36] adr_load_lib equ dword [ebp+36]
status_lib equ dword [ebp+40] status_lib equ dword [ebp+40]
@ -402,26 +479,26 @@ status_lib equ dword [ebp+40]
align 4 align 4
lp: push ecx lp: push ecx
copy_path library_name, cur_dir_path, library_path ;the macros making way /current pach a program/+ name system library copy_path library_name__, cur_dir_path__, library_path__ ;the macros making way /current pach a program/+ name system library
mcall 68,19,library_path ; load of alternative mcall 68,19,library_path__ ; load of alternative
test eax,eax test eax,eax
jnz end_steep jnz end_steep
mcall 68,19,system_path ; load of sys directory mcall 68,19,system_path__ ; load of sys directory
test eax,eax test eax,eax
jnz end_steep jnz end_steep
or status_lib,0x1 ; 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 show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window
jmp next jmp next
align 4 align 4
end_steep: end_steep:
mov adr_load_lib,eax ;save adr lib in memory mov adr_load_lib,eax ;save adr lib in memory
import_boxlib my_import, err_message_import, head_f_i ;import import_boxlib my_import, err_message_import__, head_f_i__ ;import
test eax,eax test eax,eax
jz next jz next
@ -433,6 +510,27 @@ next:
add ebp,ll_struc_size add ebp,ll_struc_size
dec ecx dec ecx
jnz lp jnz lp
;-----------------------------------------------
mov ebp,_start
mov ecx,((_end-_start)/ll_struc_size)
align 4
lp2:
mov eax,status_lib
test eax,eax
jz @f
mcall 51,1,start__,end_tr ; ñîçäàåì íîâûé ïîòîê ïî øàáëîíó
or eax,-1
jmp exit_lp2
@@:
add ebp,ll_struc_size
dec ecx
jnz lp2
exit_lp2:
} }
@ -458,10 +556,11 @@ macro show_error_window err_message, head
add esp,8 add esp,8
popad ;restore all registers popad ;restore all registers
or eax,-1 ;óâû
} }
macro import_boxlib myimport, err_message_import, head_f_i macro import_boxlib myimport, err_message_import__, head_f_i__
{ {
local import_loop local import_loop
local import_find local import_find
@ -507,27 +606,29 @@ import_found:
jmp import_loop jmp import_loop
import_not_found: import_not_found:
add esp,4 add esp,4
show_error_window err_message_import, head_f_i ;show error message /create window show_error_window err_message_import__, head_f_i__ ;show error message /create window
jmp e.exit jmp e.exit
import_done: import_done:
xor eax,eax xor eax,eax
e.exit: e.exit:
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
} }
ll_struc_size = 44;($-library_name) ; constant size of struct ll_struc_size = 44;($-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; struct for loading libraries 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__; struct for loading libraries
{ {
.library_name dd library_name .library_name__ dd library_name__ ; èìÿ çàãðóæàåìîé áèáëèîòåêè
.cur_dir_path dd cur_dir_path .cur_dir_path__ dd cur_dir_path__ ; óêàçàòåëü íà áóôåð â êîòîðîì ñîäåðæèòüñÿ ïóòü îò êóäà áûëà çàïóùåíà ïðîãðàììà
.library_path dd library_path
.system_path dd system_path .library_path__ dd library_path__ ; óêàçàòåëü íà áóôåð â êîòîðîì áóäåò ñîôîðèìèðîâàí ïóòü ê áèáëèîòåêè, åñëè íóæíî âû÷èñëèòü ïóòü äî ëèáû ñ ìåñòà çàïóñêà ïðîãðàììû, îáû÷íî íóæíî, â ñëó÷àÿõ, åñëè ëèáà ðàñïîëîæåíà â òîé æå ïàïêå
.err_message_found_lib dd err_message_found_lib .complete_path dd system_path__ ; ïóòü êîòîðûé ÷åòêî ñîäåðæèò ïóòü
.head_f_l dd head_f_l
.err_message_found_lib__ dd err_message_found_lib__
.head_f_l__ dd head_f_l__
.my_import dd my_import .my_import dd my_import
.err_message_import dd err_message_import .err_message_import__ dd err_message_import__
.head_f_i dd head_f_i .head_f_i__ dd head_f_i__
.adr_load_lib dd 0x0 .adr_load_lib dd 0x0
.status_lib dd 0x0 ;status of load library .status_lib dd 0x0 ;status of load library
; ;
} }