;------------------------------------------------------------------------------ draw_buttons_panel: mov ecx,[skin_high] add ecx,19 shl ecx,16 mov cx,18 mov ebx,[window_width] sub ebx,9 add ebx,5 shl 16 mcall 13,,,0xffffff mov edx,15 shl 16+20 add edx,[skin_high] mcall 7,buttons_file_data,<198,16> mov ecx, 20 add ecx, [skin_high] shl ecx, 16 add ecx, 16 mcall 8,<15,16>,,150+0x40000000 _new_but: add ebx,26 shl 16 inc edx mcall cmp edx, 157+0x40000000 jl _new_but ret ;-------------------------------------- .calculate_button: mov ebx,edx mov bx,15 mov ecx,edx shl ecx,16 mov cx,bx ret ;------------------------------------------------------------------------------ draw_left_sort_button: mov bx,[left_panel_x.start_x] add bx,[left_panel_x.size_x] sub ebx,50+15 mov cx,[left_panel_y.start_y] call calclulate_sort_button_1 mov edx,145 ;-------------------------------------- .start: mov esi,0xffffff dec ebp cmp [left_sort_flag],ebp jne @f mov esi,0xccccff ;-------------------------------------- @@: call calclulate_sort_button_2 jnz .start ret ;------------------------------------------------------------------------------ calclulate_sort_button_1: shl ebx,16 mov bx,50 sub cx,14 shl ecx,16 mov cx,12 mov eax,8 mov ebp,4 ret ;------------------------------------------------------------------------------ calclulate_sort_button_2: inc ebp mcall pusha push ebx mov eax,ebx inc eax shl eax,16 add ebx,eax cmp ebp,4 jne @f mov bx,15 jmp .continue ;-------------------------------------- @@: mov bx,1 ;-------------------------------------- .continue: inc ecx mcall 13,,,0xcccccc pop ebx cmp ebp,1 jne @f mov eax,[temp_panel_end] shl eax,16 add eax,[temp_panel_end] shr eax,16 shr ebx,16 sub ebx,eax shl ebx,16 mov bx,ax rol ebx,16 mcall 13 mov [temp_panel_end],ebx ;-------------------------------------- @@: popa pusha shr ecx,16 mov bx,cx add ebx,3 shl 16+2 mov edx,ebp dec edx shl edx,2 add edx,sort_button_name mov eax,4 xor ecx,ecx mov esi,eax mcall popa dec edx sub ebx,38 shl 16 mov bx,36 dec ebp ret ;------------------------------------------------------------------------------ draw_right_sort_button: mov bx,[right_panel_x.start_x] add bx,[right_panel_x.size_x] sub ebx,50+15 mov cx,[right_panel_y.start_y] call calclulate_sort_button_1 mov edx,149 ;-------------------------------------- .start: mov esi,0xffffff dec ebp cmp [right_sort_flag],ebp jne @f mov esi,0xccccff ;-------------------------------------- @@: call calclulate_sort_button_2 jnz .start ret ;------------------------------------------------------------------------------ draw_left_select_disk_button: mov bx,[left_panel_x.start_x] mov cx,[left_panel_y.start_y] mov ebp,read_folder_name ;read_folder.name mov edx,0x40000000+140 ;-------------------------------------- .1: shl ebx,16 mov bx,60 sub cx,14 shl ecx,16 mov cx,13 mcall 8,,,,0xffffff mcall 13,,,0xffffff pusha mov esi,ebp add esi,2 ;-------------------------------------- @@: inc esi cmp [esi],byte 0 je @f cmp [esi],byte '/' jne @r add esi,2 ;-------------------------------------- @@: sub esi,ebp ;read_folder.name add ebx,1 shl 16 shr ecx,16 mov bx,cx add ebx,3 mov edx,ebp mcall 4,,0 ;,read_folder.name popa add ebx,50 shl 16 mov bx,10 mcall ,,,0x6060ff mov [temp_panel_end],ebx add ebx,1 shl 16 shr ecx,16 mov bx,cx add ebx,3 mcall 4, ,0x80ffffff,select_disk_char add ebx,1 shl 16 mcall ret ;------------------------------------------------------------------------------ draw_right_select_disk_button: mov bx,[right_panel_x.start_x] mov cx,[right_panel_y.start_y] mov ebp,read_folder_1_name ;read_folder_1.name mov edx,0x40000000+141 jmp draw_left_select_disk_button.1 ;------------------------------------------------------------------------------ ;draw_ATAPI_tray_control: ; ret ;------------------------------------------------------------------------------ calc_max_panel_line: xor eax,eax mov ax,[left_panel_y.size_y] mov ebx,10 xor edx,edx div ebx mov [max_panel_line],eax ret ;------------------------------------------------------------------------------ draw_icon: pusha test [edx-40],byte 0x10 jnz .draw_dir_pic call get_icon_number imul ebx,270 add ebx,icons_file_data jmp .draw ;-------------------------------------- .draw_dir_pic: mov ebx,icons_file_data cmp [edx],word '..' jne .draw add ebx,270 ;*17 ;-------------------------------------- .draw: mov edx,[esp+16] ;ebx ror edx,16 sub edx,12 rol edx,16 dec edx mcall 7, ,<10,9> popa ret ;------------------------------------------------------------------------------ ; ПЕРЕВОД 10-НЫХ ЧИСЕЛ СО ЗНАКОМ В СТРОКОВЫЙ ВИД ; Вход: ; AX - число ; EBX - адрес строки ; Выход: ; строка содержит число, конец отмечен кодом 0 ;------------------------------------------------------------------------------ decimal_string_2: push eax ebx ecx edx xor ecx,ecx mov [ebx],byte '0' inc ebx ;-------------------------------------- .p3: xor edx,edx push ebx mov ebx,10 div ebx pop ebx add edx,48 push edx inc ecx cmp ax,0 jne .p3 cmp ecx,1 jbe .p4 mov ecx,2 dec ebx ;-------------------------------------- .p4: pop edx mov [ebx],dl inc ebx loop .p4 pop edx ecx ebx eax ret ;------------------------------------------------------------------------------ decimal_string_4: push eax ecx edx xor ecx,ecx mov [ebx],byte '0' inc ebx ;-------------------------------------- .p3: xor edx,edx push ebx mov ebx,10 div ebx pop ebx add edx,48 push edx inc ecx cmp eax,0 jne .p3 cmp ecx,3 jbe .p4 mov ecx,4 dec ebx ;-------------------------------------- .p4: pop edx mov [ebx],dl inc ebx loop .p4 pop edx ecx eax ret ;------------------------------------------------------------------------------ draw_type_size_date: pusha test [edx-40],byte 0x10 jz .copy_type mov [type_table],dword ' ' mov [file_name_length],0 mov [extension_size],0 jmp .start ;.size ;-------------------------------------- .copy_type: mov [type_table],dword ' ' mov [type_table+4],word ' ' ;-------------------------------------- .start: mov esi,edx xor eax,eax ;-------------------------------------- @@: cld lodsb test eax,eax jnz @b mov [file_name_length],esi sub [file_name_length],edx mov [temp_counter_1],esi test [edx-40],byte 0x10 jnz .size dec esi dec edx ;-------------------------------------- @@: std lodsb cmp esi,edx je .extension_size_0 cmp al,'.' jnz @b add esi,2 mov [extension_start],esi mov ecx,[temp_counter_1] sub ecx,esi inc ecx mov [extension_size],ecx sub [file_name_length],ecx cmp ecx,2 ja @f inc [file_name_length] ;-------------------------------------- @@: sub ecx,2 cmp ecx,4 jbe @f mov ecx,4 mov [type_table+4],word '..' ;-------------------------------------- @@: mov edi,type_table ;+1 cld rep movsb mov [edi],byte ' ' inc edx jmp .size ;-------------------------------------- .extension_size_0: inc edx mov [extension_size],0 ;-------------------------------------- .size: test [edx-40],byte 0x10 jz .copy_size mov [size_table],dword '----' mov [size_table+4],word '- ' jmp .date ;-------------------------------------- .copy_size: ;/0x40000000 - Gb ;/0x100000 - Mb ;/0x400 Kb mov [size_table],dword ' ' mov [size_table+4],word ' ' push ebx push edx mov eax,[edx-40+32] mov ebx,0x40000000 xor edx,edx div ebx cmp eax,0 je @f mov ebx,size_table call decimal_string_4 mov [ebx],byte 'G' jmp .size_convert_end ;-------------------------------------- @@: mov edx,[esp] mov eax,[edx-40+32] mov ebx,0x100000 xor edx,edx div ebx cmp eax,0 je @f mov ebx,size_table call decimal_string_4 mov [ebx],byte 'M' jmp .size_convert_end ;-------------------------------------- @@: mov edx,[esp] mov eax,[edx-40+32] mov ebx,0x400 xor edx,edx div ebx cmp eax,0 je @f mov ebx,size_table call decimal_string_4 mov [ebx],byte 'K' jmp .size_convert_end ;-------------------------------------- @@: mov edx,[esp] mov eax,[edx-40+32] ;.size_convert: mov ebx,size_table call decimal_string_4 ;-------------------------------------- .size_convert_end: cmp [size_table],byte '0' jne @f mov [size_table],byte ' ' ;-------------------------------------- @@: cmp [size_table+4],byte ' ' jne @f mov esi,size_table+3 mov edi,esi inc edi mov ecx,5 std rep movsb jmp @r ;-------------------------------------- @@: pop edx pop ebx ;-------------------------------------- .date: xor eax,eax mov al,[edx-40+28] push ebx mov ebx,date_table call decimal_string_2 mov al,[edx-40+29] mov ebx,date_table+3 call decimal_string_2 mov ax,[edx-40+30] mov ebx,year_table call decimal_string_4 mov ax,[year_table+2] mov [date_table+6],ax pop ebx ror ebx,16 add bx,[left_panel_x.size_x] sub ebx,122+12+15 rol ebx,16 mov ecx,0 cmp [marked_file],byte 0 je @f mov ecx,0xff0000 ;-------------------------------------- @@: mcall 4,,,type_table,20 popa ret ;------------------------------------------------------------------------------ draw_folder_data: cmp [drawing_panel_folder],1 jne .right_panel mov eax,[left_folder_block] sub eax,[max_panel_line] test eax,0x8000000 jz .ok_left mov [left_start_draw_line],0 jmp @f ;-------------------------------------- .ok_left: cmp eax,[left_start_draw_line] jae @f mov [left_start_draw_line],eax ;-------------------------------------- @@: mov bx,[left_panel_x.start_x] add bx,12 shl ebx,16 mov bx,[left_panel_y.start_y] inc bx mov edx,[left_start_draw_line] imul edx,304 add edx,[left_folder_data] add edx,32+40 mov [temp_counter],0 jmp .type_folder ;-------------------------------------- .right_panel: mov eax,[right_folder_block] sub eax,[max_panel_line] test eax,0x8000000 jz .ok_right mov [right_start_draw_line],0 jmp @f ;-------------------------------------- .ok_right: cmp eax,[right_start_draw_line] jae @f mov [right_start_draw_line],eax ;-------------------------------------- @@: mov bx,[right_panel_x.start_x] add bx,12 shl ebx,16 mov bx,[right_panel_y.start_y] inc bx mov edx,[right_start_draw_line] imul edx,304 add edx,[right_folder_data] add edx,32+40 mov [temp_counter],1 ;-------------------------------------- .type_folder: xor eax,eax ;-------------------------------------- .start: pusha mov eax,edx cmp [temp_counter],1 je @f sub eax,[left_folder_data] sub eax,32+40 xor edx,edx mov ebx,304 div ebx cmp eax,[left_folder_block] je .end_1 jmp .continue_1 ;-------------------------------------- @@: sub eax,[right_folder_data] sub eax,32+40 xor edx,edx mov ebx,304 div ebx cmp eax,[right_folder_block] je .end_1 ;-------------------------------------- .continue_1: popa cmp eax,[max_panel_line] ; 20 je .end_2 mov [marked_file],0 cmp [edx+299-40],byte 0 je @f mov [marked_file],1 ;-------------------------------------- @@: call clear_line call draw_type_size_date call draw_icon push eax xor eax,eax mov ax,[left_panel_x.size_x] push ebx edx mov ebx,6 xor edx,edx div ebx pop edx ebx sub eax,23+2+2 mov esi,[file_name_length] mov [temp_counter_1],0 cmp esi,eax jbe @f mov esi,eax mov [temp_counter_1],1 ;-------------------------------------- @@: mov ecx,0 cmp [marked_file],byte 0 je @f mov ecx,0xff0000 ;-------------------------------------- @@: mcall 4 cmp [temp_counter_1],0 je .continue mov eax,esi ;[file_name_length] imul eax,6 shl eax,16 push ebx edx add ebx,eax mcall 4,,0xff0000,truncated_filename_char,2 add ebx,1 shl 16 mcall pop edx ebx ;-------------------------------------- .continue: add ebx,10 add edx,304 ;10 pop eax inc eax jmp .start ;-------------------------------------- .end_1: popa ;-------------------------------------- .end_2: mov ax,[left_panel_y.start_y] add ax,[left_panel_y.size_y] mov cx,bx dec cx rol ecx,16 mov cx,ax mov eax,ecx shr eax,16 sub cx,ax cmp cx,0 jbe @f mov bx,[left_panel_x.size_x] sub ebx,12 shl 16 mcall 13,,,0xffffff ;-------------------------------------- @@: .end: cmp [drawing_panel_folder],1 jne @f call draw_scroll_bar_left ret ;-------------------------------------- @@: call draw_scroll_bar_right ret ;------------------------------------------------------------------------------ clear_line: cmp [not_clear_lines],0 jne .end_1 pusha shl ebx,16 shr ebx,16 dec ebx cmp [drawing_panel_folder],1 jne .right cmp [select_panel_counter],0 jne .continue mov ax,[left_start_draw_cursor_line] add ax,[left_panel_y.start_y] cmp bx,ax je .end jmp .continue ;-------------------------------------- .right: cmp [select_panel_counter],0 je .continue mov ax,[right_start_draw_cursor_line] add ax,[right_panel_y.start_y] cmp bx,ax je .end ;-------------------------------------- .continue: mov ebx,[esp+16] mov cx,bx dec cx rol ecx,16 mov cx,10 mov bx,[left_panel_x.size_x] cmp [drawing_panel_folder],1 je @f dec ebx ;-------------------------------------- @@: sub ebx,12 shl 16+15 mcall 13,,,0xffffff ;-------------------------------------- .end: popa ;-------------------------------------- .end_1: ret ;------------------------------------------------------------------------------ draw_left_panel: call clear_left_panel call calc_max_panel_line call draw_left_panel_selection mov [drawing_panel_folder],1 call draw_folder_data call draw_left_panel_patch ret ;------------------------------------------------------------------------------ draw_right_panel: call clear_right_panel call calc_max_panel_line call draw_right_panel_selection mov [drawing_panel_folder],2 call draw_folder_data call draw_right_panel_patch ret ;------------------------------------------------------------------------------ draw_left_panel_patch: cmp [select_panel_counter],0 jne .end mov edx,read_folder_name ;read_folder.name ;-------------------------------------- .1: call clear_patch_area mov ebx,[window_high] sub ebx,33 add ebx,8 shl 16 mcall 4,,0x80000000 ; ,read_folder.name ;-------------------------------------- .end: ret ;------------------------------------------------------------------------------ draw_right_panel_patch: cmp [select_panel_counter],1 jne draw_left_panel_patch.end mov edx,read_folder_1_name ;read_folder_1.name jmp draw_left_panel_patch.1 ;------------------------------------------------------------------------------ clear_patch_area: push edx mov ebx,[window_width] sub ebx,9 add ebx,5 shl 16 mov ecx,[window_high] sub ecx,35 shl ecx,16 mov cx,12 mcall 13,,,0xffffcc pop edx ret ;------------------------------------------------------------------------------ draw_left_panel_selection: cmp [select_panel_counter],0 jne .end mov eax,[left_folder_block] sub eax,[left_start_draw_line] mov edx,left_start_draw_cursor_line mov cx,[edx] call for_all_panel_selection mov eax,[left_folder_block] dec eax imul eax,10 cmp ax,cx jae @f mov cx,ax ;-------------------------------------- @@: mov [edx],cx mov ebx,[left_panel_x] add cx,[left_panel_y.start_y] ;-------------------------------------- .1: shl ecx,16 mov cx,10 sub ebx,15 mcall 13,,,0xbbddff ;-------------------------------------- .end: ret ;------------------------------------------------------------------------------ draw_right_panel_selection: cmp [select_panel_counter],1 jne draw_left_panel_selection.end mov eax,[right_folder_block] sub eax,[right_start_draw_line] mov edx,right_start_draw_cursor_line mov cx,[edx] call for_all_panel_selection mov eax,[right_folder_block] dec eax imul eax,10 cmp ax,cx jae @f mov cx,ax ;-------------------------------------- @@: mov [edx],cx mov ebx,[right_panel_x] add cx,[right_panel_y.start_y] jmp draw_left_panel_selection.1 ;------------------------------------------------------------------------------ for_all_panel_selection: imul eax,10 cmp ax,cx jae @f mov cx,ax ;-------------------------------------- @@: mov eax,[max_panel_line] dec eax imul eax,10 cmp ax,cx jae @f mov cx,ax ;-------------------------------------- @@: ret ;------------------------------------------------------------------------------ clear_left_panel: mov ebx,7 shl 16 add ebx,[window_width] shr bx,1 sub ebx,6+1 mov [left_panel_x],ebx call calculate_panel_1 mov [left_panel_y],ecx xor eax,eax mov ax,cx xor edx,edx mov ebx,10 div ebx ; умножение на 10 shl eax,1 ; умножение на 2 lea eax,[eax+eax*4] ; умножение на 5 mov [left_panel_y_correct_size_y],ax ret ;------------------------------------------------------------------------------ calculate_panel_1: mov ecx,[skin_high] add ecx,70 shl ecx,16 add ecx,[window_high] sub ecx,129 ret ;------------------------------------------------------------------------------ clear_right_panel: mov ebx,[window_width] shr ebx,1 add ebx,3 shl ebx,16 add ebx,[window_width] shr bx,1 sub bx,2+6 mov [right_panel_x],ebx call calculate_panel_1 mov [right_panel_y],ecx xor eax,eax mov ax,cx xor edx,edx mov ebx,10 div ebx ; умножение на 10 shl eax,1 ; умножение на 2 lea eax,[eax+eax*4] ; умножение на 5 mov [right_panel_y_correct_size_y],ax ret ;------------------------------------------------------------------------------ erase_fbutton: mov edx,0x80000065 mov eax,8 mov ebp,12 ;-------------------------------------- .start: mcall dec ebp jnz .start ret ;------------------------------------------------------------------------------ draw_fbutton: test [window_status],100b ; window is rolled up jnz .exit test [window_status],10b ; window is minimized to panel jnz .exit mov ecx,[window_high] sub ecx,20 shl ecx,16 add ecx,15 mov eax,[window_width] mov ebx,12 xor edx,edx div ebx mov [fbutton_width],eax mov ebx,5 shl 16 add ebx,eax sub ebx,2 mov esi,0xaa00 mov edx,101 mov eax,8 mov ebp,12 ;-------------------------------------- .start: cmp ebp,1 jne @f mov eax,ebx shr eax,16 mov bx,ax mov eax,[window_width] sub ax,bx sub ax,5 mov bx,ax mov eax,8 ;-------------------------------------- @@: mcall push eax ebx edx mov edx,0x6060ff mov bx,10 cmp ebp,4 jae @f mov bx,18 ;-------------------------------------- @@: mcall 13 cmp ebp,1 je @f ror ebx,16 add ebx,[fbutton_width] dec ebx rol ebx,16 mov bx,1 inc ecx mcall ,,,0xcccccc dec ecx ;-------------------------------------- @@: pop edx ebx eax call .rol_ror inc edx dec ebp jnz .start call draw_fbutton_name ret ;-------------------------------------- .rol_ror: rol ebx,16 add ebx,[fbutton_width] ror ebx,16 ;-------------------------------------- .exit: ret ;------------------------------------------------------------------------------ draw_fbutton_name: mov ebx, 7 shl 16 add ebx,[window_high] sub ebx,19 mov eax,4 mov ecx,0x90000000 push ebx call .type_1 pop ebx mov ecx,0x90ffffff sub ebx,1 shl 16 + 1 ;-------------------------------------- .type_1: cmp [shift_flag],1 je .type_shift cmp [ctrl_flag],1 je .type_ctrl cmp [alt_flag],1 je .type_alt ;-------------------------------------- .type: mov edx,fbutton_name.f1 call .type_all mov edx,fbutton_name.f2 call .type_all mov edx,fbutton_name.f3 call .type_all mov edx,fbutton_name.f4 call .type_all mov edx,fbutton_name.f5 call .type_all mov edx,fbutton_name.f6 call .type_all mov edx,fbutton_name.f7 call .type_all mov edx,fbutton_name.f8 call .type_all mov edx,fbutton_name.f9 call .type_all mov edx,fbutton_name.f10 call .type_all mov edx,fbutton_name.f11 call .type_all mov edx,fbutton_name.f12 mcall ret ;-------------------------------------- .type_shift: mov edx,fbutton_name_shift.f1 call .type_all mov edx,fbutton_name_shift.f2 call .type_all mov edx,fbutton_name_shift.f3 call .type_all mov edx,fbutton_name_shift.f4 call .type_all mov edx,fbutton_name_shift.f5 call .type_all mov edx,fbutton_name_shift.f6 call .type_all mov edx,fbutton_name_shift.f7 call .type_all mov edx,fbutton_name_shift.f8 call .type_all mov edx,fbutton_name_shift.f9 call .type_all mov edx,fbutton_name_shift.f10 call .type_all mov edx,fbutton_name_shift.f11 call .type_all mov edx,fbutton_name_shift.f12 mcall ret ;-------------------------------------- .type_ctrl: mov edx,fbutton_name_ctrl.f1 call .type_all mov edx,fbutton_name_ctrl.f2 call .type_all mov edx,fbutton_name_ctrl.f3 call .type_all mov edx,fbutton_name_ctrl.f4 call .type_all mov edx,fbutton_name_ctrl.f5 call .type_all mov edx,fbutton_name_ctrl.f6 call .type_all mov edx,fbutton_name_ctrl.f7 call .type_all mov edx,fbutton_name_ctrl.f8 call .type_all mov edx,fbutton_name_ctrl.f9 call .type_all mov edx,fbutton_name_ctrl.f10 call .type_all mov edx,fbutton_name_ctrl.f11 call .type_all mov edx,fbutton_name_ctrl.f12 mcall ret ;-------------------------------------- .type_alt: mov edx,fbutton_name_alt.f1 call .type_all mov edx,fbutton_name_alt.f2 call .type_all mov edx,fbutton_name_alt.f3 call .type_all mov edx,fbutton_name_alt.f4 call .type_all mov edx,fbutton_name_alt.f5 call .type_all mov edx,fbutton_name_alt.f6 call .type_all mov edx,fbutton_name_alt.f7 call .type_all mov edx,fbutton_name_alt.f8 call .type_all mov edx,fbutton_name_alt.f9 call .type_all mov edx,fbutton_name_alt.f10 call .type_all mov edx,fbutton_name_alt.f11 call .type_all mov edx,fbutton_name_alt.f12 ;-------------------------------------- .type_all: mcall call draw_fbutton.rol_ror ret ;------------------------------------------------------------------------------