From e016ecafca689a30434742aef2fb15019fa500ab Mon Sep 17 00:00:00 2001 From: IgorA Date: Sun, 15 Nov 2015 21:02:34 +0000 Subject: [PATCH] update 'log_el' work with new 'tree_list' git-svn-id: svn://kolibrios.org@5916 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/media/log_el/trunk/le_pole.inc | 31 ++-- programs/media/log_el/trunk/le_signal.inc | 2 +- programs/media/log_el/trunk/log_el.asm | 190 ++++++++++------------ 3 files changed, 99 insertions(+), 124 deletions(-) diff --git a/programs/media/log_el/trunk/le_pole.inc b/programs/media/log_el/trunk/le_pole.inc index 6eb175ab3d..8a606a565b 100644 --- a/programs/media/log_el/trunk/le_pole.inc +++ b/programs/media/log_el/trunk/le_pole.inc @@ -405,8 +405,7 @@ pushad .end_0: ;цикл по логическим элементам и подписям - stdcall dword[tl_node_poi_get_info],0,tree1 - pop eax + stdcall dword[tl_node_poi_get_info], tree1,0 @@: cmp eax,0 je .end_1 @@ -416,14 +415,13 @@ pushad je .mov_1 jmp .end_mov_1 .mov_1: - stdcall [tl_node_poi_get_data], eax, tree1 - pop ecx - - add [ecx],edx ;coord x - add [ecx+4],esi ;coord y + mov ecx,eax + stdcall [tl_node_poi_get_data], tree1,eax + add [eax],edx ;coord x + add [eax+4],esi ;coord y + mov eax,ecx .end_mov_1: - stdcall dword[tl_node_poi_get_next_info],eax,tree1 - pop eax ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,eax ;переходим к следущему узлу jmp @b .end_1: @@ -536,25 +534,22 @@ endp align 4 proc p_paint_elems uses eax esi - stdcall dword[tl_node_poi_get_info],0,tree1 - pop esi + stdcall dword[tl_node_poi_get_info], tree1,0 @@: - cmp esi,0 + cmp eax,0 je @f + mov esi,eax cmp word[esi],el_icon_elems ;получение через esi тип иконки jne .end_element - stdcall [tl_node_poi_get_data], esi, tree1 - pop eax + stdcall [tl_node_poi_get_data], tree1,esi stdcall el_draw, eax .end_element: cmp word[esi],el_icon_captions ;получение через esi тип иконки jne .end_caption - stdcall [tl_node_poi_get_data], esi, tree1 - pop eax + stdcall [tl_node_poi_get_data], tree1,esi stdcall capt_draw, eax .end_caption: - stdcall dword[tl_node_poi_get_next_info],esi,tree1 - pop esi ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,esi jmp @b @@: ret diff --git a/programs/media/log_el/trunk/le_signal.inc b/programs/media/log_el/trunk/le_signal.inc index 4bac3dc570..bb3ae33a7c 100644 --- a/programs/media/log_el/trunk/le_signal.inc +++ b/programs/media/log_el/trunk/le_signal.inc @@ -1 +1 @@ -; ; функци для создания сигналов ; ;color_s0 - сигнал 0 ;color_s1 - сигнал 1 ;color_s2 - точка без пересечения ;color_s3 - временное значение для сохранения size_sign equ 10 sign_x equ 0 sign_y equ 4 sign_a equ 8 sign_z equ 9 sign_data dd 0 ;указатель на массив со структурами сигналов sign_count dd 0 ;текущ. кол. сигналов sign_max dd 0 ;макс. кол. сигналов align 4 proc sign_init uses eax ecx, m_count:dword mov ecx,[m_count] mov [sign_max],ecx imul ecx,size_sign stdcall mem.Alloc, ecx mov [sign_data],eax call sign_clear ret endp ;очистка всех сигналов align 4 proc sign_clear uses eax ecx edi xor eax,eax mov dword[time],eax mov dword[sign_count],eax mov ecx,[sign_max] imul ecx,size_sign mov edi,[sign_data] cld rep stosb ret endp ;очистка одного сигнала align 4 proc sign_clear_one uses ecx edi esi, p_sign:dword mov ecx,size_sign mov esi,[sign_count] dec esi imul esi,ecx add esi,[sign_data] mov edi,[p_sign] cld rep movsb dec dword[sign_count] ret endp ;освобождение памяти занятой массивами для сигналов align 4 proc sign_delete stdcall mem.Free, dword[sign_data] ret endp ;функция для перемещения сигналов align 4 proc sign_move pushad mov ecx,[sign_count] cmp ecx,1 jl .end_f mov esi,ecx dec esi imul esi,size_sign add esi,[sign_data] ;cld .cycle_beg: mov eax,[esi+sign_x] mov ebx,[esi+sign_y] movzx edi,byte[esi+sign_a] movzx edx,byte[esi+sign_z] cmp edx,0 je @f or edi,0x100 @@: ;пытаемся создать разветвление сигнала stdcall move_rotate_n90, 0,-1,edi inc edi stdcall sign_creat,eax,ebx,edi stdcall move_rotate_n90, -2,0,edi add edi,2 stdcall sign_creat,eax,ebx,edi mov eax,[esi+sign_x] mov ebx,[esi+sign_y] inc edi mov eax,[esi+sign_x] mov ebx,[esi+sign_y] shl edx,2 add edx,shem_colors stdcall draw_signal_rect, eax,ebx, dword[edx] ;рисуем сигнал на поле .move_1: stdcall move_rotate_x_n90, 1,edi mov edi,eax stdcall pole_cell_find, pole, edi,ebx cmp eax,0 jne @f stdcall sign_clear_one,esi ;удаление сигнала, если он зашел в тупик jmp .cycle_next @@: imul eax,sizeof.Cell add eax,dword[cell] movzx edx,byte[esi+sign_z] cmp byte[eax+offs_cell_liv],2 jne @f ;если стоит пересечение проводов mov eax,edi movzx edi,byte[esi+sign_a] jmp .move_1 @@: cmp byte[eax+offs_cell_liv],dl jne @f stdcall sign_clear_one,esi ;удаление сигнала, если он попал на область закрашеную данным цветом jmp .cycle_next @@: mov byte[eax+offs_cell_liv],dl ;ставим на поле знак сигнала mov [esi+sign_x],edi mov [esi+sign_y],ebx .cycle_next: sub esi,size_sign ;loop .cycle_beg dec ecx jnz .cycle_beg ;stdcall [buf2d_draw], buf_0 .end_f: popad ret endp align 4 proc sign_creat uses eax ebx ecx edx edi esi, coord_x:dword, coord_y:dword, opt:dword mov edi,[sign_count] cmp edi,[sign_max] jge .end_f mov esi,[coord_x] mov ebx,[coord_y] .found: stdcall pole_cell_find, pole, esi,ebx cmp eax,0 je .end_f mov ecx,[opt] get_cell_offset edx,eax cmp byte[edx+offs_cell_liv],2 jne @f mov eax,esi stdcall move_rotate_x_n90,1,ecx mov esi,eax jmp .found @@: cmp ch,byte[edx+offs_cell_liv] ;проверяем на поле знак сигнала je .end_f ;доделать установку метки в провод, что-бы избежать дублирования сигналов на широких проводах imul edi,size_sign add edi,[sign_data] mov [edi+sign_x],esi mov [edi+sign_y],ebx mov [edi+sign_a],cl mov [edi+sign_z],ch inc dword[sign_count] mov [edx+offs_cell_liv],ch ;ставим на поле знак сигнала ;stdcall draw_signal_rect, [coord_x],[coord_y], 0x800080 .end_f: ret endp ;description: ; подфункция для рисования сигналов на схеме align 4 proc draw_signal_rect uses eax ebx edi, x0:dword,y0:dword, color:dword movzx edi,byte[zoom] mov ebx,[y0] mov eax,[x0] add ebx,[Cor_y] imul ebx,edi add eax,[Cor_x] imul eax,edi stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx,edi,edi, dword[color] ret endp align 4 proc sign_from_elems locals s_inp dd ? n_leg dd ? endl pushad mov edi,pole ;*** создание сигналов из логических элементов *** stdcall dword[tl_node_poi_get_info],0,tree1 pop esi @@: cmp esi,0 je @f cmp word[esi],el_icon_elems ;получение через esi тип иконки jne .end_add_p3 stdcall [tl_node_poi_get_data], esi, tree1 pop ecx ;*** проверка сигналов на входных ногах mov dword[s_inp],0 mov dword[n_leg],0 ;word[n_leg] - номер входной ноги mov edx,1 .add_p1: stdcall el_get_leg_coords, ecx,dword[n_leg] test eax,eax jnz .get1 test ebx,ebx jnz .get1 jmp .end_add_p1 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла .get1: stdcall pole_cell_find, pole, eax,ebx cmp eax,0 je .get2 imul eax,sizeof.Cell add eax,pole_data cmp byte[eax+offs_cell_liv],1 jne .get2 or dword[s_inp],edx .get2: inc dword[n_leg] shl edx,1 jmp .add_p1 .end_add_p1: ;*** определяем выходную комбинацию битов на основе заданной таблицы работы элемента movzx eax,byte[ecx+sp_offs_el_type] imul eax,size_el_opt add eax,el_opt_beg+el_offs_table mov ebx,[eax] add ebx,dword[s_inp] mov ebx,[ebx] mov dword[s_inp],ebx ;*** установка сигналов на выходных ногах mov dword[n_leg],(1 shl 16) ;word[n_leg] - номер выходной ноги .add_p2: stdcall el_get_leg_coords, ecx,dword[n_leg] test eax,eax jnz .get3 test ebx,ebx jnz .get3 jmp .end_add_p2 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла .get3: movzx edx,byte[ecx+8] ;dl - направление сигнала bt dword[s_inp],0 jnc .set1 or edx,0x100 ;dh - значение сигнала 0 или 1 .set1: stdcall sign_creat,eax,ebx,edx inc dword[n_leg] shr dword[s_inp],1 jmp .add_p2 .end_add_p2: .end_add_p3: stdcall dword[tl_node_poi_get_next_info],esi,tree1 pop esi ;переходим к следущему узлу jmp @b @@: popad ret endp ;создание сигналов на основе подписей align 4 proc sign_from_captions pushad ;mov edi,pole ;*** создание сигналов из подписей *** stdcall dword[tl_node_poi_get_info],0,tree1 pop esi @@: cmp esi,0 je @f cmp word[esi],el_icon_captions ;получение через esi тип иконки jne .end_add_p3 stdcall [tl_node_poi_get_data], esi, tree1 pop ecx cmp byte[ecx+8],'n' je .end_add_p3 ;если надпись информационная, то не создаем сигнала ;xor edx,edx movzx edx,byte[ecx+9] ;первоначальное напрвление выходного сигнала ;*** определяем выходой бит, ;который был установлен в but_set_0 и but_set_1 cmp byte[ecx+8],'o' jne .end_add_p1 or edx,0x100 .end_add_p1: stdcall sign_creat,dword[ecx],dword[ecx+4],edx .end_add_p3: stdcall dword[tl_node_poi_get_next_info],esi,tree1 pop esi ;переходим к следущему узлу jmp @b @@: popad ret endp ; изменяем первоначальное напрвление выходного сигнала ; выставляются 2 направления: слева на право, справа на лево ; остальные 2 возможных направления не учитываются, ; т. к. повороты сигналов возможны и без них align 4 proc sign_set_captions_angles pushad mov edi,pole stdcall dword[tl_node_poi_get_info],0,tree1 pop esi .cycle0: cmp esi,0 je .cycle0_end cmp word[esi],el_icon_captions ;получение через esi тип иконки jne .end_p0 stdcall [tl_node_poi_get_data], esi, tree1 pop ecx mov ebx,[ecx] ;ebx = coord x xor edx,edx dec ebx stdcall pole_cell_find, edi, ebx,dword[ecx+4] cmp eax,0 je @f mov edx,2 ;jmp .set_angle @@: ;.set_angle: mov byte[ecx+9],dl ;первоначальное напрвление выходного сигнала .end_p0: stdcall dword[tl_node_poi_get_next_info],esi,tree1 pop esi ;переходим к следущему узлу jmp .cycle0 .cycle0_end: popad ret endp \ No newline at end of file +; ; функци для создания сигналов ; ;color_s0 - сигнал 0 ;color_s1 - сигнал 1 ;color_s2 - точка без пересечения ;color_s3 - временное значение для сохранения size_sign equ 10 sign_x equ 0 sign_y equ 4 sign_a equ 8 sign_z equ 9 sign_data dd 0 ;указатель на массив со структурами сигналов sign_count dd 0 ;текущ. кол. сигналов sign_max dd 0 ;макс. кол. сигналов align 4 proc sign_init uses eax ecx, m_count:dword mov ecx,[m_count] mov [sign_max],ecx imul ecx,size_sign stdcall mem.Alloc, ecx mov [sign_data],eax call sign_clear ret endp ;очистка всех сигналов align 4 proc sign_clear uses eax ecx edi xor eax,eax mov dword[time],eax mov dword[sign_count],eax mov ecx,[sign_max] imul ecx,size_sign mov edi,[sign_data] cld rep stosb ret endp ;очистка одного сигнала align 4 proc sign_clear_one uses ecx edi esi, p_sign:dword mov ecx,size_sign mov esi,[sign_count] dec esi imul esi,ecx add esi,[sign_data] mov edi,[p_sign] cld rep movsb dec dword[sign_count] ret endp ;освобождение памяти занятой массивами для сигналов align 4 proc sign_delete stdcall mem.Free, dword[sign_data] ret endp ;функция для перемещения сигналов align 4 proc sign_move pushad mov ecx,[sign_count] cmp ecx,1 jl .end_f mov esi,ecx dec esi imul esi,size_sign add esi,[sign_data] ;cld .cycle_beg: mov eax,[esi+sign_x] mov ebx,[esi+sign_y] movzx edi,byte[esi+sign_a] movzx edx,byte[esi+sign_z] cmp edx,0 je @f or edi,0x100 @@: ;пытаемся создать разветвление сигнала stdcall move_rotate_n90, 0,-1,edi inc edi stdcall sign_creat,eax,ebx,edi stdcall move_rotate_n90, -2,0,edi add edi,2 stdcall sign_creat,eax,ebx,edi mov eax,[esi+sign_x] mov ebx,[esi+sign_y] inc edi mov eax,[esi+sign_x] mov ebx,[esi+sign_y] shl edx,2 add edx,shem_colors stdcall draw_signal_rect, eax,ebx, dword[edx] ;рисуем сигнал на поле .move_1: stdcall move_rotate_x_n90, 1,edi mov edi,eax stdcall pole_cell_find, pole, edi,ebx cmp eax,0 jne @f stdcall sign_clear_one,esi ;удаление сигнала, если он зашел в тупик jmp .cycle_next @@: imul eax,sizeof.Cell add eax,dword[cell] movzx edx,byte[esi+sign_z] cmp byte[eax+offs_cell_liv],2 jne @f ;если стоит пересечение проводов mov eax,edi movzx edi,byte[esi+sign_a] jmp .move_1 @@: cmp byte[eax+offs_cell_liv],dl jne @f stdcall sign_clear_one,esi ;удаление сигнала, если он попал на область закрашеную данным цветом jmp .cycle_next @@: mov byte[eax+offs_cell_liv],dl ;ставим на поле знак сигнала mov [esi+sign_x],edi mov [esi+sign_y],ebx .cycle_next: sub esi,size_sign ;loop .cycle_beg dec ecx jnz .cycle_beg ;stdcall [buf2d_draw], buf_0 .end_f: popad ret endp align 4 proc sign_creat coord_x:dword, coord_y:dword, opt:dword pushad mov edi,[sign_count] cmp edi,[sign_max] jge .end_f mov esi,[coord_x] mov ebx,[coord_y] .found: stdcall pole_cell_find, pole, esi,ebx cmp eax,0 je .end_f mov ecx,[opt] get_cell_offset edx,eax cmp byte[edx+offs_cell_liv],2 jne @f mov eax,esi stdcall move_rotate_x_n90,1,ecx mov esi,eax jmp .found @@: cmp ch,byte[edx+offs_cell_liv] ;проверяем на поле знак сигнала je .end_f ;доделать установку метки в провод, что-бы избежать дублирования сигналов на широких проводах imul edi,size_sign add edi,[sign_data] mov [edi+sign_x],esi mov [edi+sign_y],ebx mov [edi+sign_a],cl mov [edi+sign_z],ch inc dword[sign_count] mov [edx+offs_cell_liv],ch ;ставим на поле знак сигнала ;stdcall draw_signal_rect, [coord_x],[coord_y], 0x800080 .end_f: popad ret endp ;description: ; подфункция для рисования сигналов на схеме align 4 proc draw_signal_rect uses eax ebx edi, x0:dword,y0:dword, color:dword movzx edi,byte[zoom] mov ebx,[y0] mov eax,[x0] add ebx,[Cor_y] imul ebx,edi add eax,[Cor_x] imul eax,edi stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx,edi,edi, dword[color] ret endp align 4 proc sign_from_elems locals s_inp dd ? n_leg dd ? endl pushad mov edi,pole ;*** создание сигналов из логических элементов *** stdcall dword[tl_node_poi_get_info], tree1,0 mov esi,eax @@: cmp esi,0 je @f cmp word[esi],el_icon_elems ;получение через esi тип иконки jne .end_add_p3 stdcall [tl_node_poi_get_data], tree1,esi mov ecx,eax ;*** проверка сигналов на входных ногах mov dword[s_inp],0 mov dword[n_leg],0 ;word[n_leg] - номер входной ноги mov edx,1 .add_p1: stdcall el_get_leg_coords, ecx,dword[n_leg] test eax,eax jnz .get1 test ebx,ebx jnz .get1 jmp .end_add_p1 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла .get1: stdcall pole_cell_find, pole, eax,ebx cmp eax,0 je .get2 imul eax,sizeof.Cell add eax,pole_data cmp byte[eax+offs_cell_liv],1 jne .get2 or dword[s_inp],edx .get2: inc dword[n_leg] shl edx,1 jmp .add_p1 .end_add_p1: ;*** определяем выходную комбинацию битов на основе заданной таблицы работы элемента movzx eax,byte[ecx+sp_offs_el_type] imul eax,size_el_opt add eax,el_opt_beg+el_offs_table mov ebx,[eax] add ebx,dword[s_inp] mov ebx,[ebx] mov dword[s_inp],ebx ;*** установка сигналов на выходных ногах mov dword[n_leg],(1 shl 16) ;word[n_leg] - номер выходной ноги .add_p2: stdcall el_get_leg_coords, ecx,dword[n_leg] test eax,eax jnz .get3 test ebx,ebx jnz .get3 jmp .end_add_p2 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла .get3: movzx edx,byte[ecx+8] ;dl - направление сигнала bt dword[s_inp],0 jnc .set1 or edx,0x100 ;dh - значение сигнала 0 или 1 .set1: stdcall sign_creat,eax,ebx,edx inc dword[n_leg] shr dword[s_inp],1 jmp .add_p2 .end_add_p2: .end_add_p3: stdcall dword[tl_node_poi_get_next_info], tree1,esi mov esi,eax ;переходим к следущему узлу jmp @b @@: popad ret endp ;создание сигналов на основе подписей align 4 proc sign_from_captions pushad ;*** создание сигналов из подписей *** stdcall dword[tl_node_poi_get_info], tree1,0 mov esi,eax @@: cmp esi,0 je @f cmp word[esi],el_icon_captions ;получение через esi тип иконки jne .end_add_p3 stdcall [tl_node_poi_get_data], tree1,esi mov ecx,eax cmp byte[ecx+8],'n' je .end_add_p3 ;если надпись информационная, то не создаем сигнала ;xor edx,edx movzx edx,byte[ecx+9] ;первоначальное напрвление выходного сигнала ;*** определяем выходой бит, ;который был установлен в but_set_0 и but_set_1 cmp byte[ecx+8],'o' jne .end_add_p1 or edx,0x100 .end_add_p1: stdcall sign_creat,dword[ecx],dword[ecx+4],edx .end_add_p3: stdcall dword[tl_node_poi_get_next_info], tree1,esi mov esi,eax ;переходим к следущему узлу jmp @b @@: popad ret endp ; изменяем первоначальное напрвление выходного сигнала ; выставляются 2 направления: слева на право, справа на лево ; остальные 2 возможных направления не учитываются, ; т. к. повороты сигналов возможны и без них align 4 proc sign_set_captions_angles pushad mov edi,pole stdcall dword[tl_node_poi_get_info],tree1,0 mov esi,eax .cycle0: cmp esi,0 je .cycle0_end cmp word[esi],el_icon_captions ;получение через esi тип иконки jne .end_p0 stdcall [tl_node_poi_get_data], tree1,esi mov ecx,eax mov ebx,[ecx] ;ebx = coord x xor edx,edx dec ebx stdcall pole_cell_find, edi, ebx,dword[ecx+4] cmp eax,0 je @f mov edx,2 ;jmp .set_angle @@: ;.set_angle: mov byte[ecx+9],dl ;первоначальное напрвление выходного сигнала .end_p0: stdcall dword[tl_node_poi_get_next_info], tree1,esi mov esi,eax ;переходим к следущему узлу jmp .cycle0 .cycle0_end: popad ret endp \ No newline at end of file diff --git a/programs/media/log_el/trunk/log_el.asm b/programs/media/log_el/trunk/log_el.asm index 613b81aeaa..003fd5c1a9 100644 --- a/programs/media/log_el/trunk/log_el.asm +++ b/programs/media/log_el/trunk/log_el.asm @@ -53,7 +53,7 @@ include 'le_pole.inc' include 'le_signal.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Логические элементы 19.04.12',0 ;подпись окна +caption db 'Логические элементы 15.11.15',0 ;подпись окна panel_0_coord_top equ 5 ;верхняя координата 0-го ряда панели инструментов panel_1_coord_top equ 35 @@ -208,7 +208,7 @@ macro load_image_file path,buf,size { ; db 0 @@: ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0x0 + copy_path .path_str,[32],file_name,0 else copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой end if @@ -216,16 +216,14 @@ macro load_image_file path,buf,size { ; stdcall mem.Alloc, dword size ;выделяем память для изображения mov [buf],eax - mov eax,70 ;70-я функция работа с файлами mov [run_file_70.Function], 0 mov [run_file_70.Position], 0 mov [run_file_70.Flags], 0 mov [run_file_70.Count], dword size - m2m [run_file_70.Buffer], [buf] + m2m [run_file_70.Buffer], eax mov byte[run_file_70+20], 0 mov [run_file_70.FileName], file_name - mov ebx,run_file_70 - int 0x40 ;загружаем файл изображения + mcall 70,run_file_70 ;загружаем файл изображения cmp ebx,0xffffffff je @f ;определяем вид изображения и переводим его во временный буфер image_data @@ -341,7 +339,7 @@ start: mov ecx,(el_opt_beg.end-el_opt_beg)/size_el_opt ;колличество типов элементов cld @@: - stdcall [tl_node_add], eax, el_icon_elems shl 16, tree2 + stdcall [tl_node_add], tree2,el_icon_elems shl 16,eax stdcall [tl_cur_next], tree2 add eax,size_el_opt loop @b @@ -479,15 +477,19 @@ mouse: stdcall element_is_click,eax,ebx test eax,eax jz .end_buf_wnd ;при нажатии не попали ни на один из элементов - stdcall [tl_node_get_data], tree1 - pop ebx + push eax + stdcall [tl_node_get_data], tree1 + mov ebx,eax + pop eax cmp eax,ebx je .end_buf_wnd ;если уже курсор стоит там где нужно stdcall [tl_cur_beg], tree1 .cycle0: - stdcall [tl_node_get_data], tree1 - pop ebx + push eax + stdcall [tl_node_get_data], tree1 + mov ebx,eax + pop eax test ebx,ebx jz .end_buf_wnd cmp eax,ebx @@ -607,15 +609,15 @@ end if ; eax - pointer to element data align 4 proc element_is_click uses ebx ecx edx esi edi, coord_x:dword, coord_y:dword - stdcall dword[tl_node_poi_get_info],0,tree1 - pop esi + stdcall dword[tl_node_poi_get_info], tree1,0 + mov esi,eax @@: cmp esi,0 je @f cmp word[esi],el_icon_elems ;получение через esi тип иконки jne .end_add_p1 - stdcall [tl_node_poi_get_data], esi, tree1 - pop ecx + stdcall [tl_node_poi_get_data], tree1,esi + mov ecx,eax movzx edx,byte[ecx+sp_offs_el_type] imul edx,size_el_opt @@ -639,8 +641,8 @@ proc element_is_click uses ebx ecx edx esi edi, coord_x:dword, coord_y:dword mov eax,ecx jmp .end_f .end_add_p1: - stdcall dword[tl_node_poi_get_next_info],esi,tree1 - pop esi ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,esi + mov esi,eax ;переходим к следущему узлу jmp @b @@: xor eax,eax ;если не нашли @@ -827,12 +829,8 @@ pushad stdcall pole_draw_pok, pole ; *** создание кнопок установки сигналов set_0 и set_1 *** - mov eax,8 - mov ebx,(5 shl 16)+20 - mov ecx,(panel_1_coord_top shl 16)+20 - mov edx,20 mov esi,[sc.work_button] - int 0x40 + mcall 8, (5 shl 16)+20, (panel_1_coord_top shl 16)+20, 20 add ebx,25 shl 16 mov edx,21 @@ -854,26 +852,19 @@ pushad mov edx,25 int 0x40 - mov eax,4 ;рисование текста - mov ebx,(10 shl 16)+panel_1_coord_top+5 mov ecx,[sc.work_text] or ecx,0x80000000 ;or (1 shl 30) - mov edx,txt_set_0 ;mov edi,[sc.work] - int 0x40 + mcall 4, (12 shl 16)+panel_1_coord_top+6,, txt_set_0 add ebx,25 shl 16 mov edx,txt_set_1 int 0x40 ; *** рисование иконок на кнопках *** - mov eax,7 mov ebx,[image_data_toolbar] - mov ecx,(16 shl 16)+16 - mov edx,(62 shl 16)+panel_1_coord_top+2 - add ebx,IMAGE_TOOLBAR_ICON_SIZE*15 - int 0x40 + mcall 7,, (16 shl 16)+16, (62 shl 16)+panel_1_coord_top+2 add ebx,IMAGE_TOOLBAR_ICON_SIZE add edx,(25 shl 16) @@ -888,12 +879,8 @@ pushad int 0x40 ; *** создание кнопок рисования провода *** - mov eax,8 - mov ebx,(5 shl 16)+20 - mov ecx,(panel_2_coord_top shl 16)+20 - mov edx,30 mov esi,[sc.work_button] - int 0x40 + mcall 8, (5 shl 16)+20, (panel_2_coord_top shl 16)+20, 30 add ebx,30 shl 16 mov edx,31 @@ -962,46 +949,57 @@ button: cmp ah,3 jne @f call but_new_file + jmp still @@: cmp ah,4 jne @f call but_open_file + jmp still @@: cmp ah,5 jne @f call but_save_file + jmp still @@: cmp ah,6 jne @f call but_run_stop + jmp still @@: cmp ah,7 jne @f call but_zoom_p + jmp still @@: cmp ah,8 jne @f call but_zoom_m + jmp still @@: cmp ah,9 jne @f call but_pole_left + jmp still @@: cmp ah,10 jne @f call but_pole_right + jmp still @@: cmp ah,11 jne @f call but_pole_up + jmp still @@: cmp ah,12 jne @f call but_pole_dn + jmp still @@: cmp ah,13 jne @f call but_center + jmp still @@: ;передвижение всех объектов схемы @@ -1134,7 +1132,6 @@ but_open_file: jne .end_open_file ;код при удачном открытии диалога - mov eax,70 ;70-я функция работа с файлами mov [run_file_70.Function], 0 mov [run_file_70.Position], 0 mov [run_file_70.Flags], 0 @@ -1142,8 +1139,7 @@ but_open_file: m2m [run_file_70.Buffer], open_file_lif mov byte[run_file_70+20], 0 mov dword[run_file_70.FileName], openfile_path - mov ebx,run_file_70 - int 0x40 ;загружаем файл + mcall 70,run_file_70 ;загружаем файл cmp ebx,0xffffffff je .end_open_file @@ -1178,7 +1174,7 @@ but_open_file: stdcall [tl_info_clear],tree1 ;*** добавление в список логических элементов *** - stdcall [tl_node_add], txt_elements-capt_offs,(el_icon_group shl 16), tree1 + stdcall [tl_node_add], tree1,(el_icon_group shl 16),txt_elements-capt_offs stdcall [tl_cur_next], tree1 mov esi,txt_elements @@ -1209,14 +1205,14 @@ but_open_file: stdcall make_list_capts,txt_buf,edi - stdcall [tl_node_add], txt_buf,(el_icon_elems shl 16)+1, tree1 + stdcall [tl_node_add], tree1,(el_icon_elems shl 16)+1,txt_buf stdcall [tl_cur_next], tree1 dec ecx jnz .cycle_elem .end_elems: ;*** добавление в список текстовых подписей *** - stdcall [tl_node_add], txt_captions-capt_offs,(el_icon_group shl 16), tree1 + stdcall [tl_node_add], tree1,(el_icon_group shl 16),txt_captions-capt_offs stdcall [tl_cur_next], tree1 mov esi,txt_captions @@ -1244,7 +1240,7 @@ but_open_file: stdcall make_list_capts,txt_buf,edi - stdcall [tl_node_add], txt_buf,(el_icon_captions shl 16)+1, tree1 + stdcall [tl_node_add], tree1,(el_icon_captions shl 16)+1,txt_buf stdcall [tl_cur_next], tree1 dec ecx jnz .cycle_captions @@ -1253,7 +1249,7 @@ but_open_file: mov byte[txt_buf+capt_offs],0 ;обнуление подписей ;*** добавление в список ключевых точек *** - stdcall [tl_node_add], txt_points-capt_offs,(el_icon_group shl 16), tree1 + stdcall [tl_node_add], tree1,(el_icon_group shl 16),txt_points-capt_offs stdcall [tl_cur_next], tree1 mov dword[shem_points],0 @@ -1279,9 +1275,7 @@ but_open_file: stdcall conv_str_to_int,edi mov byte[txt_buf+8],al ;направления -; stdcall make_list_capts,txt_buf,0 - - stdcall [tl_node_add], txt_buf,(el_icon_points shl 16)+1, tree1 + stdcall [tl_node_add], tree1,(el_icon_points shl 16)+1,txt_buf stdcall [tl_cur_next], tree1 dec ecx jnz .cycle_poi @@ -1291,33 +1285,32 @@ but_open_file: ;*** добавление точечных объектов *** stdcall pole_clear, pole - stdcall dword[tl_node_poi_get_info],0,tree1 - pop esi + stdcall dword[tl_node_poi_get_info], tree1,0 + mov esi,eax @@: cmp esi,0 je @f cmp word[esi],el_icon_points ;получение через esi тип иконки, и пропуск не точечных объектов jne .end_add_p0 - stdcall [tl_node_poi_get_data], esi, tree1 - pop eax + stdcall [tl_node_poi_get_data], tree1,esi stdcall pole_cell_creat, pole,dword[eax],dword[eax+4],0 .end_add_p0: - stdcall dword[tl_node_poi_get_next_info],esi,tree1 - pop esi ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,esi + mov esi,eax ;переходим к следущему узлу jmp @b @@: stdcall pole_sort, pole ;*** добавление точечных объектов (на основе логических элементов) *** - stdcall dword[tl_node_poi_get_info],0,tree1 - pop esi + stdcall dword[tl_node_poi_get_info], tree1,0 + mov esi,eax @@: cmp esi,0 je @f cmp word[esi],el_icon_elems ;получение через esi тип иконки jne .end_add_p3 - stdcall [tl_node_poi_get_data], esi, tree1 - pop ecx + stdcall [tl_node_poi_get_data], tree1,esi + mov ecx,eax xor edx,edx ;edx - номер входной ноги .add_p1: @@ -1348,49 +1341,48 @@ but_open_file: .end_add_p2: .end_add_p3: - stdcall dword[tl_node_poi_get_next_info],esi,tree1 - pop esi ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,esi + mov esi,eax ;переходим к следущему узлу jmp @b @@: stdcall pole_sort, pole ;*** добавление точечных объектов (на основе подписей) *** - stdcall dword[tl_node_poi_get_info],0,tree1 - pop esi + stdcall dword[tl_node_poi_get_info], tree1,0 + mov esi,eax @@: cmp esi,0 je @f cmp word[esi],el_icon_captions ;получение через esi тип иконки jne .end_add_p6 - stdcall [tl_node_poi_get_data], esi, tree1 - pop ecx + stdcall [tl_node_poi_get_data], tree1,esi + mov ecx,eax cmp byte[ecx+8],'n' je .end_add_p6 stdcall pole_cell_creat, pole,[ecx],[ecx+4],0 .end_add_p6: - stdcall dword[tl_node_poi_get_next_info],esi,tree1 - pop esi ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,esi + mov esi,eax ;переходим к следущему узлу jmp @b @@: stdcall pole_sort, pole ;*** рисование проводов (на основе точечных объектов) *** - stdcall dword[tl_node_poi_get_info],0,tree1 - pop esi + stdcall dword[tl_node_poi_get_info], tree1,0 + mov esi,eax xor ecx,ecx @@: cmp esi,0 je @f cmp word[esi],el_icon_points ;получение через esi тип иконки, и пропуск не точечных объектов jne .end_add_p4 - stdcall [tl_node_poi_get_data], esi, tree1 - pop eax + stdcall [tl_node_poi_get_data], tree1,esi movzx ebx,byte[eax+8] stdcall shem_create_line, dword[eax],dword[eax+4],ebx add ecx,edx .end_add_p4: - stdcall dword[tl_node_poi_get_next_info],esi,tree1 - pop esi ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,esi + mov esi,eax ;переходим к следущему узлу cmp ecx,250 ;ecx - число добавленных точек jl @b xor ecx,ecx @@ -1555,15 +1547,13 @@ pushad ;*** снятие метки с точек, которые находятся на входных ногах логических элементов .cycle1_beg: mov dword[shem_elems],0 ;для пепеопределения числа элементов - stdcall dword[tl_node_poi_get_info],0,tree1 - pop esi + stdcall dword[tl_node_poi_get_info], tree1,0 + mov esi,eax .cycle1: cmp esi,0 je .cycle1_end cmp word[esi],el_icon_elems ;получение через esi тип иконки jne .end_add_p1 -; stdcall [tl_node_poi_get_data], esi, tree1 -; pop ecx inc dword[shem_elems] if 0 xor edx,edx ;edx - номер входной ноги @@ -1586,8 +1576,8 @@ if 0 ;mov edx,(1 shl 16) ;edx - номер выходной ноги end if .end_add_p1: - stdcall dword[tl_node_poi_get_next_info],esi,tree1 - pop esi ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,esi + mov esi,eax ;переходим к следущему узлу jmp .cycle1 .cycle1_end: @@ -1616,15 +1606,15 @@ end if cmp eax,1 jl .cycle2_end - stdcall dword[tl_node_poi_get_info],0,tree1 - pop esi + stdcall dword[tl_node_poi_get_info], tree1,0 + mov esi,eax .cycle2: cmp esi,0 je .cycle2_end cmp word[esi],el_icon_elems ;получение через esi тип иконки jne .end_add_p2 - stdcall [tl_node_poi_get_data], esi, tree1 - pop ecx + stdcall [tl_node_poi_get_data], tree1,esi + mov ecx,eax stdcall str_len,edi add edi,eax @@ -1653,8 +1643,8 @@ end if stdcall str_cat,edi,txt_nl .end_add_p2: - stdcall dword[tl_node_poi_get_next_info],esi,tree1 - pop esi ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,esi + mov esi,eax ;переходим к следущему узлу jmp .cycle2 .cycle2_end: @@ -1669,15 +1659,15 @@ end if cmp eax,1 jl .cycle3_end - stdcall dword[tl_node_poi_get_info],0,tree1 - pop esi + stdcall dword[tl_node_poi_get_info], tree1,0 + mov esi,eax .cycle3: cmp esi,0 je .cycle3_end cmp word[esi],el_icon_captions ;получение через esi тип иконки jne .end_add_p3 - stdcall [tl_node_poi_get_data], esi, tree1 - pop ecx + stdcall [tl_node_poi_get_data], tree1,esi + mov ecx,eax stdcall str_len,edi add edi,eax @@ -1710,8 +1700,8 @@ end if stdcall str_cat,edi,txt_nl .end_add_p3: - stdcall dword[tl_node_poi_get_next_info],esi,tree1 - pop esi ;переходим к следущему узлу + stdcall dword[tl_node_poi_get_next_info], tree1,esi + mov esi,eax ;переходим к следущему узлу jmp .cycle3 .cycle3_end: @@ -1828,19 +1818,16 @@ end if ;*** определение параметров файла mov edi,open_file_lif stdcall str_len,edi - mov ecx,eax ;*** запись файла - mov eax,70 mov [run_file_70.Function], 2 mov [run_file_70.Position], 0 mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], ecx + mov dword[run_file_70.Count], eax mov [run_file_70.Buffer], edi mov byte[run_file_70+20], 0 mov dword[run_file_70.FileName], openfile_path - mov ebx,run_file_70 - int 0x40 ;сохраняем файл + mcall 70,run_file_70 ;сохраняем файл call redraw_pole .end_save_file: @@ -1914,7 +1901,7 @@ proc shem_element_creat uses eax ebx, coord_x:dword, coord_y:dword mov byte[txt_buf+sp_offs_el_angle],al ;направление stdcall [tl_node_get_data], tree2 - pop ebx + mov ebx,eax test ebx,ebx jnz @f mov ebx,el_opt_beg+el_offs_nam ;если не взялось имя элемента, то по умолчанию берем 1-й из списка @@ -1923,7 +1910,7 @@ proc shem_element_creat uses eax ebx, coord_x:dword, coord_y:dword mov byte[txt_buf+sp_offs_el_type],al ;тип элемента stdcall make_list_capts,txt_buf,ebx - stdcall [tl_node_add], txt_buf,(el_icon_elems shl 16)+1, tree1 + stdcall [tl_node_add], tree1,(el_icon_elems shl 16)+1,txt_buf stdcall [tl_cur_next], tree1 stdcall [tl_draw], tree1 .end_f: @@ -2234,7 +2221,6 @@ endp align 4 proc but_set_0 uses eax stdcall [tl_node_get_data], tree1 - pop eax test eax,eax jz .end_f ;el_icon_captions @@ -2250,7 +2236,6 @@ endp align 4 proc but_set_1 uses eax stdcall [tl_node_get_data], tree1 - pop eax test eax,eax jz .end_f ;el_icon_captions @@ -2269,7 +2254,6 @@ proc but_mov_l uses eax edi cmp byte[tim_ch],0 jne .end_f stdcall [tl_node_get_data], tree1 - pop eax test eax,eax jz .end_f cmp dword[eax],1 @@ -2294,7 +2278,6 @@ proc but_mov_r uses eax edi cmp byte[tim_ch],0 jne .end_f stdcall [tl_node_get_data], tree1 - pop eax test eax,eax jz .end_f inc dword[eax] @@ -2316,7 +2299,6 @@ proc but_mov_u uses eax edi cmp byte[tim_ch],0 jne .end_f stdcall [tl_node_get_data], tree1 - pop eax test eax,eax jz .end_f cmp dword[eax+4],1 @@ -2340,7 +2322,6 @@ proc but_mov_d uses eax edi cmp byte[tim_ch],0 jne .end_f stdcall [tl_node_get_data], tree1 - pop eax test eax,eax jz .end_f inc dword[eax+4] @@ -2606,9 +2587,8 @@ endp ;output: ; eax - число align 4 -proc conv_str_to_int, buf:dword +proc conv_str_to_int uses ebx ecx esi, buf:dword xor eax,eax - push ebx ecx esi xor ebx,ebx mov esi,[buf] @@ -2679,7 +2659,6 @@ proc conv_str_to_int, buf:dword sub ecx,eax mov eax,ecx @@: - pop esi ecx ebx ret endp @@ -2712,6 +2691,7 @@ align 4 stosb ;записать элемент из регистра al в ячеку памяти es:edi ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться +align 16 i_end: rb 1024 stacktop: