From 1386fef88b503baed81dd2ade7aa431d48b8ac3e Mon Sep 17 00:00:00 2001 From: IgorA Date: Fri, 23 Mar 2012 17:24:30 +0000 Subject: [PATCH] fix some functions git-svn-id: svn://kolibrios.org@2501 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/games/life3/trunk/life3.asm | 13 ++- programs/media/log_el/trunk/le_pole.inc | 90 +++++++++++++-- programs/media/log_el/trunk/log_el.asm | 139 +++++++++++++++++++----- 3 files changed, 198 insertions(+), 44 deletions(-) diff --git a/programs/games/life3/trunk/life3.asm b/programs/games/life3/trunk/life3.asm index 4e764d95c7..4ede70ec2a 100644 --- a/programs/games/life3/trunk/life3.asm +++ b/programs/games/life3/trunk/life3.asm @@ -16,7 +16,7 @@ include '../../nu_pogodi/trunk/mem.inc' include '../../nu_pogodi/trunk/dll.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -hed db 'Life 20.02.12',0 ;подпись окна +hed db 'Life 23.03.12',0 ;подпись окна struct FileInfoBlock Function dd ? @@ -329,9 +329,11 @@ proc pole_cell_find, x:dword, y:dword mov edx,ebx shl edx,2 add edx,ecx - inc ebx mov ecx,dword[ecx] .cycle_b: ;for(i=b_sort+1;i<=fristC;i++) + inc ebx + cmp ebx,ecx + jg .cycle_e add edx,4 get_cell_offset edi,dword[edx] mov esi,dword[x] @@ -344,9 +346,7 @@ proc pole_cell_find, x:dword, y:dword mov eax,dword[edx] ;fnd=memCell[i]; jmp .cycle_e ;break; .if_e: - inc ebx - cmp ebx,ecx - jle .cycle_b + jmp .cycle_b .cycle_e: pop esi edi edx ecx ebx @@: @@ -886,7 +886,8 @@ start: mov [CellColors],eax load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE - stdcall pole_init_colors, 0xffffff,0xff0000,0x0000ff + ;настройка цветов ячеек + stdcall pole_init_colors, 0xffffd0,0xff0000,0x0000ff call pole_clear call pole_paint ;рисование поля в буфере (не на экране) diff --git a/programs/media/log_el/trunk/le_pole.inc b/programs/media/log_el/trunk/le_pole.inc index b9178bdf68..2f04393ddc 100644 --- a/programs/media/log_el/trunk/le_pole.inc +++ b/programs/media/log_el/trunk/le_pole.inc @@ -27,6 +27,7 @@ pole_index equ dword[edi] pole_data equ dword[edi +4] ;указатель на память со структурами ячеек pole_max_cell equ dword[edi +8] pole_b_sort equ dword[edi+12] ;граница для сортированных ячеек +offs_pole_b_sort equ 12 macro get_cell_offset reg,ind { @@ -151,6 +152,8 @@ align 4 proc pole_cell_delete, pole:dword, x:dword, y:dword pushad mov edi,dword[pole] + mov ebx,edi + add ebx,offs_pole_b_sort mov esi,pole_index mov ecx,[esi] @@ -161,10 +164,6 @@ proc pole_cell_delete, pole:dword, x:dword, y:dword cmp eax,0 je .fun_e ;если клетка не была создана - cmp pole_b_sort,0 - je @f - dec pole_b_sort - @@: dec dword[esi] mov edi,esi @@ -174,6 +173,17 @@ proc pole_cell_delete, pole:dword, x:dword, y:dword repnz scasd ;поиск sub edi,4 + cmp dword[ebx],1 ;[ebx]=pole_b_sort + jl @f + mov eax,edi + sub eax,esi ;esi=pole_index + shr eax,2 + dec eax + cmp [ebx],eax ;eax - позиция указателя удаляемой ячейки + jle @f ;было jl @f + dec dword[ebx] + @@: + shl edx,2 add edx,esi ;конечный элемент массива sub edx,edi @@ -193,7 +203,7 @@ proc pole_cell_delete, pole:dword, x:dword, y:dword ret endp -if 0 +if debug align 4 proc but_test_pole, pole:dword pushad @@ -205,7 +215,12 @@ proc but_test_pole, pole:dword mov esi,pole_index mov ecx,[esi] + + mov eax,pole_b_sort mov edi,open_file_lif + stdcall convert_int_to_str + stdcall [buf2d_draw_text], buf_0, buf_font,edi,5,ebx,color_s0 ;рисуем b_sort + add ebx,18 mov eax,[esi] add esi,4 @@ -279,9 +294,11 @@ proc pole_cell_find uses edi, pole:dword, x:dword, y:dword mov edx,ebx shl edx,2 add edx,ecx - inc ebx mov ecx,dword[ecx] .cycle_b: ;for(i=pole_b_sort+1;i<=fristC;i++) + inc ebx + cmp ebx,ecx + jg .not_found add edx,4 get_cell_offset esi,dword[edx] mov eax,dword[x] @@ -294,9 +311,8 @@ proc pole_cell_find uses edi, pole:dword, x:dword, y:dword mov eax,dword[edx] ;fnd=pole_index[i]; jmp .cycle_e ;break; .if_e: - inc ebx - cmp ebx,ecx - jle .cycle_b + jmp .cycle_b + .not_found: xor eax,eax ;восстанавливаем нулевое значение если не нашли ячейку (в цикле eax портится при проверке координат) .cycle_e: pop esi edx ecx ebx @@ -363,6 +379,58 @@ proc pole_bin_find uses ebx ecx edx edi, mas:dword, fx:dword, fy:dword, k:dword ret endp +;сдвиг всех ячеек (и объектов) +align 4 +proc pole_move_all, pole:dword, m_d_x:dword, m_d_y:dword +pushad + mov edi,dword[pole] + mov edx,[m_d_x] + mov esi,[m_d_y] + + mov eax,pole_index + cmp dword[eax],0 + je .end_0 ;если нет ячеек (проводов) то выход + + mov ecx,dword[eax] + cld + @@: ;цикл по всем ячейкам + add eax,4 + mov ebx,[eax] + imul ebx,sizeof.Cell + add ebx,pole_data + + add dword[ebx+offs_cell_x],edx + add dword[ebx+offs_cell_y],esi + loop @b + .end_0: + + ;цикл по логическим элементам и подписям + stdcall dword[tl_node_poi_get_info],0,tree1 + pop eax + @@: + cmp eax,0 + je .end_1 + cmp word[eax],el_icon_elems ;получение через eax тип иконки + je .mov_1 + cmp word[eax],el_icon_captions + 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 + .end_mov_1: + stdcall dword[tl_node_poi_get_next_info],eax,tree1 + pop eax ;переходим к следущему узлу + jmp @b + .end_1: + +popad + ret +endp + ;output: ; dl align 4 @@ -910,7 +978,7 @@ proc pole_draw_pok uses eax ebx ecx edx edi esi, pole:dword ;mov edi,dword[pole] mov eax,4 ;рисование текста - mov ebx,325*65536+5 + mov ebx,400*65536+5 mov ecx,[sc.work_text] or ecx,0x80000000 ;or (1 shl 30) mov edx,txt_zoom @@ -928,7 +996,7 @@ proc pole_draw_pok uses eax ebx ecx edx edi esi, pole:dword mov eax,47 movzx ecx,byte[zoom] mov ebx,(2 shl 16) - mov edx,(325+6*9)*65536+5 + mov edx,(400+6*9)*65536+5 mov esi,[sc.work_button_text] or esi,(1 shl 30) mov edi,[sc.work_button] diff --git a/programs/media/log_el/trunk/log_el.asm b/programs/media/log_el/trunk/log_el.asm index ca3b079431..58de806c97 100644 --- a/programs/media/log_el/trunk/log_el.asm +++ b/programs/media/log_el/trunk/log_el.asm @@ -16,6 +16,8 @@ color_s2 equ 0xff00 ; color_s3 equ 0xff0000 ;временное значение для сохранения color_caption equ 0x808080 +debug equ 0 + ;номара иконок: el_icon_group equ 0 ;групповая el_icon_points equ 1 ;точки @@ -48,7 +50,7 @@ include 'le_pole.inc' include 'le_signal.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Логические элементы 21.03.12',0 ;подпись окна +caption db 'Логические элементы 23.03.12',0 ;подпись окна panel_0_coord_top equ 5 ;верхняя координата 0-го ряда панели инструментов panel_1_coord_top equ 35 @@ -104,6 +106,7 @@ elOpt 'or[4]', 0xff00ff,5,9,tbl_or, tbl_il_4, 4 elOpt 'and[2]',0xffff00,5,5,tbl_and.2, tbl_il_2, 2 elOpt 'and[3]',0xffff00,5,7,tbl_and.3, tbl_il_3, 3 elOpt 'and[4]',0xffff00,5,9,tbl_and.4, tbl_il_4, 4 +elOpt 'and[5]',0xffff00,5,11,tbl_and.5, tbl_il_5, 5 elOpt 'not', 0xffff, 3,3,tbl_not, tbl_il_1, 1 elOpt 'xor', 0x8000ff,5,5,tbl_xor, tbl_il_2, 2 elOpt 'sm[1]', 0x8080ff,7,7,tbl_sm, tbl_il_3, 1,4 @@ -116,6 +119,7 @@ align 4 tbl_or db 0,1,1,1, 1,1,1,1 ;or2, or3 db 1,1,1,1,1,1,1,1 ;or4 tbl_and: +.5: dq 0,0 .4: dq 0 .3: dd 0 .2: db 0,0,0,1 @@ -129,6 +133,7 @@ tbl_il_1 db 1,0 ; tbl_il_2 db 1,2,0 ;корпус на 2 ноги tbl_il_3 db 1,2,2,0 tbl_il_4 db 1,2,2,2,0 +tbl_il_5 db 1,2,2,2,2,0 ;tbl_il_8 db 1,2,2,2,2,2,2,2,0 time dd 0 @@ -339,15 +344,18 @@ mouse: stdcall [tl_mouse], tree1 stdcall [tl_mouse], tree2 - push eax ebx ecx edx + pushad mcall 37,2 ;нажатые кнопки мыши bt eax,0 ;левая кнопка нажата? + jc @f + bt eax,1 ;правая кнопка нажата? jc @f xor eax,eax mov [pen_coord_x],eax mov [pen_coord_y],eax jmp .end_buf_wnd @@: + mov esi,eax mcall 37,1 ;eax = (x shl 16) + y cmp ax,word[buf_0.t] @@ -384,6 +392,8 @@ mouse: cmp byte[pen_mode],0 jne .end_mode_0 + bt esi,1 + jc .end_mode_0 ;режим курсора (выбор элемента при нажатии) stdcall element_is_click,eax,ebx test eax,eax @@ -445,32 +455,50 @@ mouse: mov eax,[pen_coord_x] ;привязка к координате x .beg_draw: - stdcall pole_cell_creat, pole,eax,ebx,0 - ;ничего не убралось redraw_pole не подходит, т. к. чистить поле не нужно - stdcall pole_paint, pole - stdcall [buf2d_draw], buf_0 - ;stdcall but_test_pole, pole - jmp .end_buf_wnd + bt esi,1 + jc @f + stdcall pole_cell_creat, pole,eax,ebx,0 + ;ничего не убралось redraw_pole не подходит, т. к. чистить поле не нужно + stdcall pole_paint, pole + stdcall [buf2d_draw], buf_0 + jmp .end_buf_wnd + @@: + stdcall pole_cell_delete, pole,eax,ebx + call redraw_pole + jmp .end_buf_wnd .end_mode_1: cmp byte[pen_mode],2 jne @f ;режим рисования изоляции для провода - stdcall pole_cell_creat, pole,eax,ebx,2 + bt esi,1 + jc .mode_2_del + stdcall pole_cell_creat, pole,eax,ebx,2 + jmp .mode_2_draw + .mode_2_del: + ;стирание изоляции + mov ecx,eax + stdcall pole_cell_find, pole,ecx,ebx + test eax,eax + jz .end_buf_wnd + stdcall pole_cell_creat, pole,ecx,ebx,0 + .mode_2_draw: stdcall pole_paint, pole stdcall [buf2d_draw], buf_0 - ;stdcall but_test_pole, pole jmp .end_buf_wnd @@: cmp byte[pen_mode],3 jne @f + bt esi,1 + jc @f ;режим стирания провода stdcall pole_cell_delete, pole,eax,ebx call redraw_pole - ;stdcall but_test_pole, pole jmp .end_buf_wnd @@: cmp byte[pen_mode],4 jne @f + bt esi,1 + jc @f ;режим создания элементов stdcall shem_element_creat, eax,ebx stdcall pole_paint, pole @@ -479,7 +507,10 @@ mouse: @@: .end_buf_wnd: - pop edx ecx ebx eax +if debug +stdcall but_test_pole, pole +end if + popad ret ;output: @@ -589,44 +620,60 @@ pushad mov esi,[sc.work_button] int 0x40 - mov ebx,(30 shl 16)+20 + add ebx,25 shl 16 mov edx,4 int 0x40 - mov ebx,(55 shl 16)+20 + add ebx,25 shl 16 mov edx,5 int 0x40 - mov ebx,(85 shl 16)+20 - mov edx,6 + add ebx,30 shl 16 + mov edx,6 ;пуск | остановка int 0x40 - mov ebx,(110 shl 16)+20 + add ebx,25 shl 16 mov edx,7 int 0x40 - mov ebx,(135 shl 16)+20 + add ebx,25 shl 16 mov edx,8 int 0x40 - mov ebx,(160 shl 16)+20 + add ebx,25 shl 16 mov edx,9 int 0x40 - mov ebx,(185 shl 16)+20 + add ebx,25 shl 16 mov edx,10 int 0x40 - mov ebx,(210 shl 16)+20 + add ebx,25 shl 16 mov edx,11 int 0x40 - mov ebx,(235 shl 16)+20 + add ebx,25 shl 16 mov edx,12 int 0x40 - mov ebx,(265 shl 16)+20 - mov edx,13 + add ebx,30 shl 16 + mov edx,13 ;центровка схемы + int 0x40 + + add ebx,25 shl 16 + mov edx,14 + int 0x40 + + add ebx,25 shl 16 + mov edx,15 + int 0x40 + + add ebx,25 shl 16 + mov edx,16 ;сдвиг схемы вверх + int 0x40 + + add ebx,25 shl 16 + mov edx,17 ;сдвиг схемы вниз int 0x40 ; *** рисование иконок на кнопках *** @@ -846,6 +893,32 @@ button: jne @f call but_center @@: + + ;передвижение всех объектов схемы + cmp byte[tim_ch],0 + jne .no_move + cmp ah,14 + jne @f + stdcall pole_move_all, pole, -1, 0 + call redraw_pole + @@: + cmp ah,15 + jne @f + stdcall pole_move_all, pole, 1, 0 + call redraw_pole + @@: + cmp ah,16 ;сдвиг схемы вверх + jne @f + stdcall pole_move_all, pole, 0, -1 + call redraw_pole + @@: + cmp ah,17 ;сдвиг схемы вниз + jne @f + stdcall pole_move_all, pole, 0, 1 + call redraw_pole + @@: + .no_move: + cmp ah,20 jne @f call but_set_0 @@ -1275,6 +1348,7 @@ align 4 proc but_save_file locals napr dd ? + s_param dd ? ;параметр для красивого сохранения endl pushad ;*** вызов диалогового окна для сохранения файла @@ -1549,6 +1623,7 @@ pushad mov edi,eax mov ecx,dword[esi] + mov dword[s_param],0 .cycle4: ;цикл по всем точкам add esi,4 mov ebx,[esi] @@ -1574,12 +1649,22 @@ pushad add edi,eax movzx eax,dh stdcall convert_int_to_str - stdcall str_cat,edi,txt_space - ;stdcall str_cat,edi,txt_nl + + cmp dword[s_param],7 ;для формата строки + je .new_line + inc dword[s_param] + stdcall str_cat,edi,txt_space + jmp @f + .new_line: + mov dword[s_param],0 + stdcall str_cat,edi,txt_nl @@: dec ecx jnz .cycle4 - stdcall str_cat,edi,txt_nl + cmp dword[s_param],0 + je @f + stdcall str_cat,edi,txt_nl + @@: ;*** сохранение изоляционных точек *** stdcall str_cat,edi,txt_sub_points