;
; в этом файле собраны функции создающие програмный код
;
u_object object ;временный объект для задания смещений
macro insert_coma
{
stdcall [ted_text_add], tedit0,txt_coma,1,ted_opt_ed_move_cursor
}
macro insert_nl
{
stdcall [ted_text_add], tedit0,txt_nl,1,ted_opt_ed_move_cursor
}
macro insert_com
{
stdcall [ted_text_add], tedit0,txt_com,1,ted_opt_ed_move_cursor
}
macro insert_sp
{
stdcall [ted_text_add], tedit0,txt_sp,1,ted_opt_ed_move_cursor
}
;функция вставляет текстовую строку в текстовый редактор
align 4
proc insert_text, txt:dword
push eax
stdcall str_len,dword[txt]
cmp eax,1
jl @f
stdcall [ted_text_add], tedit0,dword[txt],eax,ted_opt_ed_move_cursor
@@:
pop eax
ret
endp
;вставляет указанное текстовое свойство из объекта в текстовый редактор
align 4
proc insert_text_prop, p_obj:dword,index:dword
push eax edx
mov eax,[p_obj]
mov edx,[index]
stdcall get_obj_text_col,eax,edx
stdcall str_len,edx
stdcall [ted_text_add], tedit0,edx,eax,ted_opt_ed_move_cursor
pop edx eax
ret
endp
;вставляет указанное битовое свойство из объекта в текстовый редактор
align 4
proc insert_bit_prop, p_obj:dword,index:dword
push ebx ecx edi
mov ebx,[p_obj]
mov ecx,[index]
test_bool_prop ebx,ecx
jnc @f ;если пользователь не выбрал в объекте данное свойство
mov ebx,dword[ebx]
call find_obj_in_opt
mov ecx,dword[edi+obj_opt.bit_val-obj_opt] ;ecx - смещение значений свойств (констант)
cmp byte[ecx],0
je @f ;если у объекта нет заданных битовых свойств
add ecx,obj_opt ;добавляем начало файла с опциями
stdcall get_string_by_ind, ecx,[index]
cmp byte[edi],0
je @f ;если у объекта битовое свойство пустое
stdcall insert_text, txt_plus
stdcall insert_text, edi
@@:
pop edi ecx ebx
ret
endp
;функция вставляет 2 параметра по 16 бит в виде:
; (_p1_ shl 16 + _p2_)
align 4
proc insert_2_prop_16_bit, obj:dword, p_hi:dword, p_lo:dword
stdcall insert_text, txt_skob_o
stdcall insert_text_prop, [obj],[p_hi]
stdcall insert_text, txt_shl_16
stdcall insert_text, txt_skob_c
stdcall insert_text, txt_plus
stdcall insert_text_prop, [obj],[p_lo]
ret
endp
;вставляем строку вида:
; txt_(n) db (s)
align 4
proc insert_text_label_data, obj:dword, col:dword
push eax edx
mov eax,[obj]
stdcall insert_text, txt_txt
mov edx,fp_icon
stdcall get_obj_id_str, eax,edx ;edx = 'n'
stdcall str_cat, edx,txt_db ;edx = 'n db '
stdcall insert_text, edx
stdcall insert_text_prop, eax,[col]
insert_nl
pop edx eax
ret
endp
macro insert_tab
{
stdcall [ted_text_add], tedit0,txt_tab,1,ted_opt_ed_move_cursor
}
macro insert_br
{
stdcall [ted_text_add], tedit0,txt_br,3,ted_opt_ed_move_cursor
}
macro insert_a_met
{
stdcall [ted_text_add], tedit0,txt_a_met,3,ted_opt_ed_move_cursor
}
macro insert_0
{
stdcall [ted_text_add], tedit0,txt_0,1,ted_opt_ed_move_cursor
}
macro insert_plus
{
stdcall [ted_text_add], tedit0,txt_plus,1,ted_opt_ed_move_cursor
}
macro insert_xor
{
stdcall [ted_text_add], tedit0,txt_xor,4,ted_opt_ed_move_cursor
}
macro insert_cmp
{
stdcall [ted_text_add], tedit0,txt_cmp,4,ted_opt_ed_move_cursor
}
macro insert_reg reg_name
{
stdcall [ted_text_add], tedit0,reg_name,3,ted_opt_ed_move_cursor
}
macro insert_reg8 reg_name
{
stdcall [ted_text_add], tedit0,reg_name,2,ted_opt_ed_move_cursor
}
;
macro insert_key_beg
{
stdcall [ted_text_add], tedit0,txt_key_1,txt_key_2-txt_key_1,ted_opt_ed_move_cursor
}
macro insert_key_end
{
stdcall [ted_text_add], tedit0,txt_key_2,txt_key_3-txt_key_2,ted_opt_ed_move_cursor
}
macro insert_d_poi
{
stdcall [ted_text_add], tedit0,txt_d_poi,1,ted_opt_ed_move_cursor
}
macro insert_ret
{
stdcall [ted_text_add], tedit0,txt_ret,4,ted_opt_ed_move_cursor
}
align 4
but_update:
call draw_constructor
cmp byte[show_mode],0 ;условие видимости окна конструктора
jne @f
stdcall [buf2d_draw], buf_fon
@@:
call code_gen
cmp byte[show_mode],1 ;условие видимости текстового окна
jne @f
stdcall [ted_draw], tedit0
@@:
ret
;функция создающая код всего файла
align 4
code_gen:
stdcall [ted_clear], tedit0,1
pushad
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
xor bl,bl
call code_gen_obj
stdcall [ted_text_add], tedit0,\
txt_nl,1,ted_opt_ed_move_cursor+ted_opt_ed_change_time ;добавляем символ новой строки с опцией ted_opt_ed_change_time для возможности сохранения файла
stdcall [ted_init_scroll_bars], tedit0, 4 ;меняем размеры скроллингов
popad
ret
;input:
; bl - уровень объекта
; esi - указатель на узел
align 4
code_gen_obj:
push eax ebx edx
.beg_iterat:
cmp esi,0
je .find_no
cmp byte[esi+2],bl ;lev
jl .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop eax ;получаем данные узла
cmp eax,0
je .find_no
cmp dword[eax],C_STR
jne .no_struct
stdcall get_obj_text_col, eax,1 ;edx - указатель на 1-е свойство структуры
stdcall insert_text,txt_struc
cmp byte[edx],0
jne @f
stdcall insert_text,txt_t
@@:
insert_sp
stdcall insert_text_prop, eax,0
cmp byte[edx],0
je @f
;если структура задана макросом
insert_sp
stdcall insert_text_prop, eax,1
insert_nl
stdcall insert_text, txt_skob_fo
@@:
insert_nl
stdcall get_code_children_objects, esi
call move_next_no_child_objects ;пропуск дочерних обектов
cmp byte[edx],0
je @f
;если структура задана макросом
stdcall insert_text, txt_skob_fc
insert_nl
@@:
stdcall insert_text,txt_ends
.no_struct:
cmp dword[eax],C_TXT
jne @f
stdcall get_code_text,eax ;обработка объекта
@@:
cmp dword[eax],C_INC
jne @f
stdcall get_code_incl,eax ;обработка объекта
@@:
cmp dword[eax],C_VAR
jne @f
stdcall get_code_variable,eax,ebx ;обработка объекта
@@:
cmp dword[eax],C_WND
jne @f
stdcall get_code_window,eax ;обработка объекта
stdcall get_code_children_objects, esi ;обработка дочерних обектов
call move_next_no_child_objects ;пропуск дочерних обектов
stdcall insert_text, txt_draw_we ;код завершающий функцию рисования
@@:
cmp dword[eax],C_ACO
jne @f
stdcall get_code_auto,esi ;обработка объекта
call move_next_no_child_objects ;пропуск дочерних обектов
@@:
cmp dword[eax],C_KEY ;клавиатура
jne @f
stdcall get_code_key,eax ;обработка объекта
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
pop edx ebx eax
ret
;взять коды дочерних объектов
align 4
proc get_code_children_objects, p_node:dword
push ebx esi
mov esi,[p_node]
mov bl,byte[esi+2] ;сохраняем уровень текущего объекта
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
cmp esi,0 ;если достигли конца списка объектов
je @f
cmp byte[esi+2],bl ;если уровень следующего объекта больше или равен текущему
jle @f ;то дочерних узлов нет
mov bl,byte[esi+2]
call code_gen_obj ;рекурсивный вызов дочерних объектов
@@:
pop esi ebx
ret
endp
;пропуск всех дочерних объектов
;input:
; esi - указатель на узел
;outpet:
; esi - указатель следущий не дочерний (относительно входящего) на узел
align 4
move_next_no_child_objects:
push eax ebx
mov bl,byte[esi+2] ;сохраняем уровень текущего объекта
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop eax ;переходим к следущему узлу
cmp eax,0 ;если достигли конца списка объектов
je @f
cmp byte[eax+2],bl ;если уровень следующего объекта больше или равен текущему
jle @f ;то дочерних узлов нет
mov esi,eax ;если следущий узел оказался дочерним, переставляем указатель
jmp @b
@@:
pop ebx eax
ret
;добавление объекта с програмным кодом (текстом)
align 4
proc get_code_text, p_obj:dword
;pushad
insert_nl
stdcall insert_text_prop, dword[p_obj],0
insert_nl
;popad
ret
endp
;обработка объекта создающего автоматичексие коды
align 4
proc get_code_auto, p_node:dword
pushad
insert_nl
mov esi,dword[p_node]
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
test_bool_prop ebx,BIT_MOD_ACI
jae @f
mov edx,C_CHB
stdcall find_obj_in_file,edx ;eax - указатель на структуру check_box
cmp eax,0
je @f
stdcall insert_text, txt_std_init_cb
@@:
test_bool_prop ebx,BIT_MOD_ACM
jae @f
;автоматические события от мыши
call get_code_auto_m
@@:
test_bool_prop ebx,BIT_MOD_ABU
jae @f
;создание функции button
stdcall insert_text, txt_but_beg
call get_code_auto_but ;коды вызова кнопок
stdcall insert_text, txt_but_mid
stdcall get_code_children_objects, esi
;конец функции button (кнопка id=-1, завершение программы)
stdcall insert_text, txt_but_end
call get_code_a_but_fun ;коды функций, вызываемых при нажатии кнопок
@@:
test_bool_prop ebx,BIT_MOD_ACD
jae @f
call get_code_auto_data_el
mov edx,C_CHB
stdcall find_obj_in_file,edx ;eax - указатель на структуру check_box
cmp eax,0
je .no_check
stdcall insert_text, txt_cb_b
call get_code_auto_data_el_cbox
stdcall insert_text, txt_cb_e
.no_check:
call get_code_auto_data_dop
mov edx,C_LIB
stdcall find_obj_in_file,edx ;eax - указатель на структуру библиотеки
cmp eax,0
je @f
insert_nl
stdcall insert_text, txt_head_i
stdcall insert_text, txt_d_poi
insert_nl
stdcall insert_text, txt_head_l
stdcall insert_text, txt_db
stdcall insert_text, txt_str_beg
stdcall insert_text, txt_sys_err
stdcall insert_text, txt_str_end
insert_nl
call get_code_auto_data_libs_param
stdcall insert_text, txt_ll_start
call get_code_auto_data_libs_struc
stdcall insert_text, txt_ll_end
call get_code_auto_data_libs ;таблицы импорта библиотек
@@:
insert_nl
popad
ret
endp
align 4
proc get_code_auto_m
pushad
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_EDB
jne @f
stdcall insert_text, txt_std_mouse_ed
stdcall insert_text_prop, ebx,0
insert_nl
@@:
cmp dword[ebx],C_CHB
jne @f
stdcall insert_text, txt_std_mouse_cb
stdcall insert_text_prop, ebx,0
insert_nl
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
;создание данных (структур объектов)
align 4
proc get_code_auto_data_el
pushad
insert_nl ;отступ для форматирования
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_EDB
jne @f
;1,2,3,4,...,6,...8,...,10 - w,x,y,col_fon,...,col_frame,...,col_txt,...,txt
stdcall insert_text_prop, ebx,0
stdcall insert_text, txt_ebox
mov ecx,1
.prop:
insert_sp
stdcall insert_text_prop, ebx,ecx
insert_coma
inc ecx
cmp ecx,10
jl .prop
insert_br
stdcall insert_text, txt_txt
mov edx,fp_icon
stdcall get_obj_id_str, ebx,edx
stdcall insert_text, edx
stdcall insert_text, txt_mouse_dd
stdcall insert_text, txt_0 ;свойства editbox
stdcall insert_bit_prop, ebx,BIT_MOD_EDIT_FOC
stdcall insert_bit_prop, ebx,BIT_MOD_EDIT_FIO
xchg eax,edx ;сохраняем значение edx
stdcall get_obj_text_col,ebx,10
cmp byte[edx],0 ;проверяем пустая ли строка при запуске editbox
je .null_string
xchg eax,edx ;востанавливаем значение edx
stdcall insert_text, txt_coma
stdcall insert_text, txt_txt
stdcall insert_text, edx
stdcall insert_text, txt_met_end
stdcall insert_text, txt_minus
stdcall insert_text, txt_txt
stdcall insert_text, edx
stdcall insert_text, txt_minus
stdcall insert_text, txt_1
stdcall insert_text, txt_coma
stdcall insert_text, txt_txt
stdcall insert_text, edx
stdcall insert_text, txt_met_end
stdcall insert_text, txt_minus
stdcall insert_text, txt_txt
stdcall insert_text, edx
stdcall insert_text, txt_minus
stdcall insert_text, txt_1
.null_string:
insert_nl
@@:
cmp dword[ebx],C_DTT
jne @f
stdcall insert_text_label_data, ebx,0
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
align 4
proc get_code_auto_data_el_cbox
pushad
insert_nl ;отступ для форматирования
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_CHB
jne .no_check
;1,2,3,4,5, 6,7,8, 9 - ot_x,ot_y,w,h,ot_w_txt, col_fon,col_frame,col_txt, txt
stdcall insert_text_prop, ebx,0
stdcall insert_text, txt_cbox
insert_sp
stdcall insert_2_prop_16_bit, ebx,1,3
stdcall insert_text, txt_coma
stdcall insert_2_prop_16_bit, ebx,2,4
stdcall insert_text, txt_coma
stdcall insert_text_prop, ebx,5
stdcall insert_text, txt_coma
insert_sp
stdcall insert_text_prop, ebx,6
stdcall insert_text, txt_coma
stdcall insert_text_prop, ebx,7
stdcall insert_text, txt_coma
stdcall insert_text_prop, ebx,8
stdcall insert_text, txt_coma
stdcall insert_text, txt_br
stdcall insert_text, txt_txt
mov edx,fp_icon
stdcall get_obj_id_str, ebx,edx
stdcall insert_text, edx
stdcall insert_text, txt_coma
;флаги
stdcall insert_text,txt_0
stdcall insert_bit_prop, ebx,BIT_MOD_CHE
stdcall insert_bit_prop, ebx,BIT_MOD_CHE_T
stdcall insert_bit_prop, ebx,BIT_MOD_CHE_M
stdcall insert_bit_prop, ebx,BIT_MOD_CHE_B
insert_nl
.no_check:
cmp dword[ebx],C_DTT
jne @f
stdcall insert_text_label_data, ebx,0
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
;данные для библиотек
align 4
proc get_code_auto_data_libs_param
pushad
insert_nl ;отступ для форматирования
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_LIB
jne @f
;0,1,2,3,4,5 - l_nam,s_dir,i_met,...
stdcall insert_text, txt_sys_dir
;object code
mov edx,fp_icon
stdcall get_obj_id_str, ebx,edx
stdcall insert_text,edx
stdcall insert_text,txt_db
;stdcall insert_text, txt_str_beg
stdcall insert_text_prop, ebx,1
;stdcall insert_text, txt_str_end
insert_nl
stdcall insert_text, txt_lib_name
stdcall insert_text,edx
stdcall insert_text,txt_db
stdcall insert_text, txt_str_beg
stdcall insert_text_prop, ebx,0
stdcall insert_text, txt_str_end
insert_nl
stdcall insert_text,txt_err_m_f_lib
stdcall insert_text,edx
stdcall insert_text,txt_db
stdcall insert_text, txt_str_beg
stdcall insert_text_prop, ebx,4
stdcall insert_text, txt_str_end
insert_nl
stdcall insert_text,txt_err_m_i_lib
stdcall insert_text,edx
stdcall insert_text,txt_db
stdcall insert_text, txt_str_beg
stdcall insert_text_prop, ebx,5
stdcall insert_text, txt_str_end
insert_nl
insert_nl
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
;данные для библиотек
align 4
proc get_code_auto_data_libs_struc
pushad
;insert_nl ;отступ для форматирования
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_LIB
jne @f
;0,1,2,3,4,5 - l_nam,s_dir,i_met,...
stdcall insert_text, txt_lib
;object code
mov edx,fp_icon
stdcall get_obj_id_str, ebx,edx
stdcall insert_text,edx
insert_sp
stdcall insert_text, txt_ll
stdcall insert_text, txt_lib_name
stdcall insert_text,edx
stdcall insert_text,txt_coma
stdcall insert_text, txt_lib_path
stdcall insert_text, txt_sys_dir
stdcall insert_text,edx
stdcall insert_text,txt_coma
stdcall insert_text,txt_br
stdcall insert_text,txt_tab
stdcall insert_text,txt_err_m_f_lib
stdcall insert_text,edx
stdcall insert_text,txt_coma
stdcall insert_text,txt_head_l
stdcall insert_text,txt_coma
stdcall insert_text_prop, ebx,2
stdcall insert_text,txt_coma
stdcall insert_text,txt_err_m_i_lib
stdcall insert_text,edx
stdcall insert_text,txt_coma
stdcall insert_text,txt_head_i
insert_nl
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
;данные для библиотек
align 4
proc get_code_auto_data_libs
pushad
insert_nl ;отступ для форматирования
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_LIB
jne @f
;0,1,2,3,4,5 - l_nam,s_dir,i_met,...
stdcall insert_text, txt_align_4
stdcall insert_text_prop, ebx,2
stdcall insert_text, txt_d_poi
insert_nl
call get_code_lib_table
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
;input:
; esi
align 4
get_code_lib_table:
pushad
mov bl,byte[esi+2]
mov edi,esi
stdcall dword[tl_node_poi_get_data], esi,tree2
pop edx ;получение данных родительского объекта
cmp edx,0
je @f
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
cmp esi,0
je @f
cmp byte[esi+2],bl ;lev
jle @f
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ecx ;получаем данные узла
cmp ecx,0
je @f
cmp dword[ecx],C_IFN
jne @b
;вставка указателя на функцию
test_bool_prop ecx,BIT_MOD_IMPORT_FUNCT_COMMENT
jae .no_com_0
stdcall insert_text, txt_com
.no_com_0:
insert_tab
stdcall insert_text_prop, ecx,0
stdcall insert_text, txt_dd
stdcall insert_text_prop, edx,3 ;приставка к функции
stdcall insert_text_prop, ecx,0
insert_nl
jmp @b
@@:
stdcall insert_text, txt_dd_0_0
mov esi,edi
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
cmp esi,0
je @f
cmp byte[esi+2],bl ;lev
jle @f
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ecx ;получаем данные узла
cmp ecx,0
je @f
cmp dword[ecx],C_IFN
jne @b
;вставка имени импортированной функции
test_bool_prop ecx,BIT_MOD_IMPORT_FUNCT_COMMENT
jae .no_com_1
stdcall insert_text, txt_com
.no_com_1:
insert_tab
stdcall insert_text_prop, edx,3 ;приставка к функции
stdcall insert_text_prop, ecx,0
stdcall insert_text, txt_db
stdcall insert_text, txt_str_beg
stdcall insert_text_prop, ecx,1
stdcall insert_text, txt_str_end
insert_nl
jmp @b
@@:
popad
ret
;
align 4
proc get_code_auto_data_dop
pushad
insert_nl ;отступ для форматирования
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_EDB
jne @f
;1,2,3,4,...,6,...8,...,10 - w,x,y,col_fon,...,col_frame,...,col_txt,...,txt
;формируем текстовые данные для editbox-ов
stdcall insert_text, txt_txt
mov edx,fp_icon
stdcall get_obj_id_str, ebx,edx
stdcall insert_text,edx
stdcall get_obj_text_col,ebx,10
cmp byte[edx],0
je .no_text
stdcall insert_text, txt_d_poi
stdcall insert_text, txt_db
stdcall insert_text, txt_str_beg
stdcall str_len,edx
stdcall [ted_text_add], tedit0,edx,eax,ted_opt_ed_move_cursor
stdcall insert_text, txt_str_end
insert_nl
insert_tab
stdcall insert_text, txt_met_end
stdcall insert_text, txt_rb
stdcall insert_text, txt_txt
mov edx,fp_icon
stdcall get_obj_id_str, ebx,edx
stdcall insert_text,edx
stdcall insert_text, txt_minus
stdcall insert_text, txt_txt
stdcall insert_text,edx
stdcall insert_text, txt_met_end
insert_plus
stdcall insert_text_prop,ebx,9
insert_plus
stdcall insert_text, txt_3
insert_nl
jmp @f
.no_text: ;первоначально текст не задан
stdcall insert_text, txt_times
stdcall insert_text_prop,ebx,9
insert_plus
stdcall insert_text, txt_2
stdcall insert_text, txt_db
insert_0
insert_nl
@@:
cmp dword[ebx],C_CHB
jne @f
stdcall insert_text_label_data, ebx,9
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
;связываем кнопки с функциями
align 4
proc get_code_auto_but
pushad
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_BUT
jne @f
insert_tab
insert_cmp
insert_reg8 txt_ah
insert_coma
stdcall get_obj_text_col,ebx,0
stdcall str_len,edx
stdcall [ted_text_add], tedit0,edx,eax,ted_opt_ed_move_cursor
insert_nl
insert_tab
stdcall insert_text, txt_jne_f
insert_nl
insert_tab
insert_tab
stdcall insert_text, txt_call
stdcall get_obj_text_col,ebx,6
stdcall str_len,edx
cmp eax,1
jl .c_fun
stdcall [ted_text_add], tedit0,edx,eax,ted_opt_ed_move_cursor
.c_fun:
insert_nl
insert_tab
insert_a_met ;@@:
insert_nl
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
;берем коды для функций нажатий на кнопки
align 4
proc get_code_a_but_fun
pushad
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_BUT
jne @f
stdcall get_obj_text_col,ebx,6
stdcall str_len,edx
cmp eax,1
jl .c_fun
insert_nl
stdcall insert_text, txt_align_4
stdcall [ted_text_add], tedit0,edx,eax,ted_opt_ed_move_cursor
insert_d_poi
insert_nl
insert_tab
insert_ret
.c_fun:
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
align 4
proc get_code_key, p_obj:dword
pushad
insert_nl
mov ebx,dword[p_obj]
insert_key_beg
call get_code_funct_key ;коды вызова кнопок
insert_key_end
insert_nl
popad
ret
endp
align 4
proc get_code_funct_key
pushad
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_EDB
jne @f
stdcall insert_text, txt_std_key_ed
stdcall insert_text_prop,ebx,0
insert_nl
@@:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
;объекты подключения файлов 'include ...'
align 4
proc get_code_incl, p_obj:dword
pushad
stdcall insert_text, txt_incl
mov ebx,dword[p_obj]
stdcall insert_text_prop,ebx,0
stdcall get_obj_text_col,ebx,1
stdcall str_len,edx
cmp eax,1
jl @f
insert_sp
insert_com
stdcall [ted_text_add], tedit0,edx,eax,ted_opt_ed_move_cursor
@@:
insert_nl
popad
ret
endp
;создаем код задания окна
align 4
proc get_code_window, p_obj:dword
pushad
mov ebx,dword[p_obj]
;2,3,4,5,6 - x,y,w,h,col_bkg
stdcall insert_text, txt_draw_wb
insert_tab
insert_xor
insert_reg txt_eax
insert_coma
insert_reg txt_eax
insert_nl
;mov ebx,... задается ширина окна и отступ от левого края экрана
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_ebx
insert_coma
stdcall insert_2_prop_16_bit, ebx,2,4
insert_nl
;mov ecx,... задается высота окна и отступ от верхнего края экрана
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_ecx
insert_coma
stdcall insert_2_prop_16_bit, ebx,3,5
insert_nl
;mov edx,... задается цвет рабочей области окна
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_edx
insert_coma
stdcall insert_text_prop, ebx,6
insert_nl
;or edx,0x33000000
insert_tab
stdcall insert_text, txt_or
insert_reg txt_edx
insert_coma
stdcall insert_text,txt_skob_o
stdcall insert_text_prop, ebx,1 ;стиль окна
stdcall insert_text,txt_shl_24
stdcall insert_text,txt_skob_c
stdcall insert_bit_prop, ebx,BIT_MOD_WI_CAPT
stdcall insert_bit_prop, ebx,BIT_MOD_WI_CORD_OTN_CL_OBL
stdcall insert_bit_prop, ebx,BIT_MOD_WI_REDR
stdcall insert_bit_prop, ebx,BIT_MOD_WI_GRAD
insert_nl
;mov edi,...
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_edi
insert_coma
stdcall insert_text_prop, ebx,0
insert_nl
insert_tab
stdcall insert_text, txt_i_40
insert_nl
call get_code_draw_obj
popad
ret
endp
;формируем вызов функций для рисования объектов
align 4
proc get_code_draw_obj
pushad
stdcall dword[tl_node_poi_get_info], 0,tree2
pop esi
.beg_iterat:
cmp esi,0
je .find_no
stdcall dword[tl_node_poi_get_data], esi,tree2
pop ebx ;получаем данные узла
cmp ebx,0
je .find_no
cmp dword[ebx],C_EDB
jne @f
stdcall insert_text, txt_editb_draw
stdcall insert_text_prop, ebx,0
insert_nl
@@:
cmp dword[ebx],C_CHB
jne @f
stdcall insert_text, txt_cbox_draw
stdcall insert_text_prop, ebx,0
insert_nl
@@:
cmp dword[ebx],C_BUT
jne .ob_draw_but
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_eax
insert_coma
stdcall insert_text, txt_8
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_ebx
insert_coma
stdcall insert_2_prop_16_bit, ebx,1,3
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_ecx
insert_coma
stdcall insert_2_prop_16_bit, ebx,2,4
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_edx
insert_coma
stdcall insert_text_prop, ebx,0
test_bool_prop ebx,BIT_MOD_BUT_NFON
jnc @f
stdcall insert_text, txt_plus
stdcall insert_text, txt_bit_30
@@:
test_bool_prop ebx,BIT_MOD_BUT_NBORD
jnc @f
stdcall insert_text, txt_plus
stdcall insert_text, txt_bit_29
@@:
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_esi
insert_coma
stdcall insert_text_prop, ebx,5 ;button color
insert_nl
insert_tab
stdcall insert_text, txt_i_40
insert_nl
.ob_draw_but:
cmp dword[ebx],C_REC
jne @f
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_eax
insert_coma
stdcall insert_text, txt_1
stdcall insert_text, txt_3
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_ebx
insert_coma
stdcall insert_2_prop_16_bit, ebx,1,3
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_ecx
insert_coma
stdcall insert_2_prop_16_bit, ebx,2,4
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_edx
insert_coma
stdcall insert_text_prop, ebx,0 ;rect color
insert_nl
insert_tab
stdcall insert_text, txt_i_40
insert_nl
@@:
cmp dword[ebx],C_DTT ;рисование текста через сист. ф. 4
jne .ob_draw_text
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_eax
insert_coma
stdcall insert_text, txt_4
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_ebx
insert_coma
stdcall insert_2_prop_16_bit, ebx,1,2
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_ecx
insert_coma
stdcall insert_text_prop, ebx,3
stdcall insert_bit_prop, ebx,BIT_MOD_TXT_ASCII_0 ;31 - бит для строки ASCIIZ
stdcall insert_bit_prop, ebx,BIT_MOD_TXT_NO_TRAN ;30 - бит для не прозрачного текста
stdcall insert_bit_prop, ebx,BIT_MOD_TXT_CHAR2 ;28 - бит для 2-го сист. шрифта
insert_nl
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_edx
insert_coma
stdcall insert_text, txt_txt
mov edx,fp_icon
stdcall get_obj_id_str, ebx,edx
stdcall insert_text,edx
insert_nl
;mov esi,...
test_bool_prop ebx,BIT_MOD_TXT_NO_TRAN
jnc @f
insert_tab
stdcall insert_text, txt_mov
insert_reg txt_edi
insert_coma
stdcall insert_text_prop, ebx,4 ;цвет фона
insert_nl
@@:
insert_tab
stdcall insert_text, txt_i_40
insert_nl
.ob_draw_text:
stdcall dword[tl_node_poi_get_next_info], esi,tree2
pop esi ;переходим к следущему узлу
jmp .beg_iterat
.find_no:
popad
ret
endp
;создать код объявления переменной
align 4
proc get_code_variable, p_obj:dword,o_lev:dword
pushad
mov ebx,dword[p_obj]
;0,1,2 - name,value,comment
mov ecx,dword[o_lev]
cmp cl,0
je .no_tab ;избегаем зацикливания (0-1 = 2^32-1)
and ecx,0xff
cld
@@:
insert_tab ;формирование отступа перед переменной
loop @b
.no_tab:
stdcall insert_text_prop, ebx,0 ;имя переменной
insert_sp
mov ecx,dword[ebx+u_object.typid-u_object] ;ecx - относительный индекс родительского объекта (в памяти)
xor eax,eax
mov ax,[tree2.info_size]
imul ecx,eax ;умножаем индекс на размер структуры
add ecx,[tree2.data_info] ;ecx - указатель данные родительского узла
;проверку на правильность ecx ???
stdcall insert_text_prop, ecx,0 ;тип переменной
insert_sp
stdcall insert_text_prop, ebx,1 ;значение
stdcall get_obj_text_col,ebx,2 ;комментарий
stdcall str_len,edx
cmp eax,1
jl @f
insert_sp
insert_com
stdcall [ted_text_add], tedit0,edx,eax,ted_opt_ed_move_cursor
@@:
insert_nl
popad
ret
endp
;--- текстовые константы ---
txt_str_beg db 39,0
txt_str_end db 39,',0',0
txt_coma db ',',0
txt_skob_o db '(',0
txt_skob_c db ')',0
txt_skob_fo db '{',0 ;скобка фигурная открывающая
txt_skob_fc db '}',0 ;скобка фигурная закрывающая
txt_i_40 db 'int 0x40',13,0
txt_0 db '0',0
txt_1 db '1',0
txt_2 db '2',0
txt_3 db '3',0
txt_4 db '4',0
txt_8 db '8',0
txt_plus db '+',0
txt_minus db '-',0
;txt_dol db '$',0
txt_nl db 13,0
txt_com db ';',0
txt_sp db ' ',0
txt_tab db 9,0
txt_br db '\',13,9,0
txt_txt db 'txt_',0
txt_db db ' db ',0
txt_dd db ' dd ',0
txt_rb db ' rb ',0
txt_dd_0_0 db 9,'dd 0,0',13,0
txt_mouse_dd db ', mouse_dd, ',0
txt_times db ':',13,9,'times ',0
txt_draw_wb:
db 13,'align 4',13,'draw_window:',13,'pushad',13,9,'mcall 12,1',13,0
txt_draw_we:
db 9,'mcall 12,2',13,'popad',13,9,'ret',13,0
txt_sys_dir db 'system_dir_',0
txt_lib_name db 'lib_name_',0
txt_lib_path db ' sys_path, library_path, ',0
txt_sys_err db 'Системная ошибка',0
txt_ll_start db 'l_libs_start:',13,0
txt_lib db 9,'lib_',0
txt_ll db 'l_libs ',0
txt_err_m_f_lib db 'err_msg_found_lib_',0
txt_head_l db 'head_f_l',0
txt_err_m_i_lib db 'err_msg_import_',0
txt_head_i db 'head_f_i',0
txt_ll_end db 'l_libs_end:',13,0
;txt_bit_28 db '0x10000000',0
txt_bit_29 db '0x20000000',0
txt_bit_30 db '0x40000000',0
;txt_bit_31 db '0x80000000',0
txt_struc db 'struc',0
txt_t db 't',0
txt_met_end db '.end',0
txt_ends db 'ends',13,13,0
txt_mov db 'mov ',0
txt_xor db 'xor ',0
txt_or db 'or ',0
txt_cmp db 'cmp ',0
txt_call db 'call ',0
txt_jne_f db 'jne @f',0
txt_a_met db '@@:',0
txt_ah db 'ah',0
txt_eax db 'eax',0
txt_ebx db 'ebx',0
txt_ecx db 'ecx',0
txt_edx db 'edx',0
txt_edi db 'edi',0
txt_esi db 'esi',0
txt_align_4 db 'align 4',13,0
txt_d_poi db ':',0
txt_ret db 'ret',13,0
txt_shl_16 db ' shl 16',0
txt_shl_24 db ' shl 24',0
txt_std_mouse_ed:
db 9,'stdcall [edit_box_mouse], ',0
txt_std_init_cb:
db 9,'init_checkboxes2 check_boxes,check_boxes_end',13,0
txt_std_mouse_cb:
db 9,'stdcall [check_box_mouse], ',0
txt_std_key_ed:
db 9,'stdcall [edit_box_key], ',0
txt_incl:
db 'include ',0
txt_cbox db ' check_box2',0
txt_cb_b db 13,'check_boxes:',0
txt_cb_e db 'check_boxes_end:',13,0
txt_ebox db ' edit_box',0
txt_editb_draw db 9,'stdcall [edit_box_draw], ',0
txt_cbox_draw db 9,'stdcall [check_box_draw], ',0
;начало функции кнопок
txt_but_beg db 'align 4',13,'button:',13,9,'mcall 17',13,0
txt_but_mid db 9,'cmp ah,1',13,9,'jne still',13,'.exit:',13,0
;конец функции кнопок (завершение програмы)
txt_but_end db 9,'mcall -1',13,0
txt_key_1:
db 'align 4',13,'key:',13,9,'mcall 2',13
txt_key_2:
db 9,'jmp still',13
txt_key_3:
;получаем порядковый номер объекта относительно памяти элемента tree2
;output:
; txt_buf - строка с номером объекта
align 4
proc get_obj_id_str, p_obj:dword, txt_buf:dword
push eax ecx edx
mov eax,dword[p_obj]
sub eax,[tree2.data_info]
xor edx,edx
xor ecx,ecx
mov cx,word[tree2.info_size]
div ecx
mov edx,dword[txt_buf]
mov byte[edx],0
stdcall str_cat_value,edx,eax
pop edx ecx eax
ret
endp
;получаем порядковый номер объекта относительно памяти элемента tree2
;output:
; eax - номер объекта
align 4
proc get_obj_id, p_obj:dword
push ecx edx
mov eax,dword[p_obj]
sub eax,[tree2.data_info]
xor edx,edx
xor ecx,ecx
mov cx,word[tree2.info_size]
div ecx
pop edx ecx
ret
endp
;--- текстовые функции ---
;выбираем строку из масива, по указанному индексу
;input:
; str - указатель на масив строк
; ind - индекс искомой строки
;output:
; edi - указатель на найденую строку
align 4
proc get_string_by_ind, str:dword, ind:dword
push eax ebx ecx
mov edi,[str]
mov ebx,[ind]
xor al,al ;0 - символ конца строки
@@:
cmp ebx,0
jle @f ;если найдена строка с указанным индексом
xor ecx,ecx
dec ecx ;ecx - число просматриваемых байт
cld
repne scasb ;ищем конец строки (al=0)
cmp byte[edi],0
je @f ;если следующей строки нет выход из цикла
dec ebx
jmp @b
@@:
pop ecx ebx eax
ret
endp
align 4
proc mem_clear, mem:dword, len:dword
push eax ecx edi
cld
xor al,al
mov edi, dword[mem]
mov ecx, dword[len]
repne stosb
pop edi ecx eax
ret
endp
align 4
proc str_cat, str1:dword, str2:dword
push eax ecx edi esi
mov esi,dword[str2]
stdcall str_len,esi
mov ecx,eax
inc ecx
mov edi,dword[str1]
stdcall str_len,edi
add edi,eax
cld
repne movsb
pop esi edi ecx eax
ret
endp
align 4
proc str_cat_value, str1:dword, value:dword
pushad
mov edi,[str1]
stdcall str_len,edi
add edi,eax
mov eax,[value]
call tl_convert_to_str
popad
ret
endp
;output:
; eax = strlen
align 4
proc str_len, str1:dword
mov eax,[str1]
@@:
cmp byte[eax],0
je @f
inc eax
jmp @b
@@:
sub eax,[str1]
ret
endp
;input:
; eax = value
; edi = string buffer
align 4
tl_convert_to_str:
pushad
stdcall mem_clear,edi,12
call .str
popad
ret
align 4
.str:
mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
;преревод числа в ASCII строку входные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
jb @f
xor edx,edx ;очистить edx
div ecx ;разделить - остаток в edx
push edx ;положить в стек
;dec edi ;смещение необходимое для записи с конца строки
call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
pop eax
@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
or al,0x30 ;данная команда короче чем две выше
stosb ;записать элемент из регистра al в ячеку памяти es:edi
ret