0,0 → 1,1181 |
|
; MENUET FAR [MFAR] PRE-ALPHA-8.1 |
; 2003-2004 (C) Mike Semenyako aka mike.dld |
; Compile with FASM for Menuet |
|
use32 |
org 0 |
|
db 'MENUET01' ; 8 byte id |
dd $01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd MEM_USED ; memory for app |
dd $007FF0 ; esp |
dd $00,$00 ; I_Param , I_Icon |
|
; |
; START:SIZE |
; |
; +00000000:00007FF0 - image |
; +00007FF0:00007FF0 - stack |
; +00008000:00000300 - path strings buffer |
; +00008300:0003FD00 - files data |
; +00048000:00000300 - temporary file read area |
; +00048300:00004000 - memory for OS (read/write buffer) |
; +0004C300:FFFB3CFF - dinamically allocated for copy, view, edit etc. |
; |
|
include 'lang.inc' |
include 'macros.inc' |
include 'menuet.inc' |
include 'mfar.inc' |
|
START: |
|
mcall MF_RDREADFILE,fcfile,0,-1,fc ; read user colors |
|
mov esi,p_rd ; left panel = RD |
mov edi,f_path0 |
mov ecx,p_rd.size |
rep movsb |
mov esi,p_hd ; right panel = HD |
mov edi,f_path1 |
mov ecx,p_hd.size |
rep movsb |
|
redraw_all: |
call draw_window_full |
jmp still |
redraw_files: |
call draw_files |
still: |
mcall MF_WAITEVWTO,100 ; waiting 1 sec |
jmpe al,,\ |
EV_REDRAW,redraw_all,\ |
EV_KEY,key,\ |
EV_BUTTON,button |
|
; after every 1 second [when no other events occur] updating files info |
; eg. requesting ACTIVE panel files data and drawing it |
;; timed redraw { |
mov dl,[active_panel] |
cmp dl,0 |
jne ._00 |
push [d_ltsz] |
jmp @f |
._00: |
push [d_rtsz] |
@@: |
call get_files_data |
pop eax |
cmp dl,0 |
jne ._01 |
cmp eax,[d_ltsz] |
jmp @f |
._01: |
cmp eax,[d_rtsz] |
@@: |
je still ; nothing happened, waiting again |
mov al,dl |
jmp redraw_files |
;; } |
|
; key pressed event |
key: |
mcall MF_GETKEY ; get key-code |
|
movzx ecx,[active_panel] |
|
jmpe ah,k_directional,\ |
VK_RETURN,k_return,\ ; execute something |
VK_TAB,k_tab,\ ; change active panel |
VK_F5,k_f5,\ ; copy |
VK_F10,mfar_exit,\ ; terminate |
VK_CTRLF3,k_ctrl_f3,\ ; sort by name |
VK_CTRLF4,k_ctrl_f4 ; sort by extension |
;------------------------------------------------------------------------------ |
k_return: |
call execute_current_file |
jmp still |
;------------------------------------------------------------------------------ |
k_tab: |
mov edi,[fc.background] |
call draw_sel ; hide current file selection |
xor [active_panel],1 ; changing active panel |
call draw_path ; drawing path of new panel |
mov dl,[active_panel] |
call get_files_data ; requesting panel files info |
mov edi,sel_color |
call draw_sel ; show current file |
mov al,[active_panel] |
call draw_file_info ; and its info (size,date) |
jmp still |
;------------------------------------------------------------------------------ |
k_f5: |
call copy_file |
jc still |
jmp redraw_all |
;------------------------------------------------------------------------------ |
k_ctrl_f3: |
jecxz ._00 |
cmp [r_sort],0 |
je still |
mov [r_sort],0 |
jmp @f |
._00: |
cmp [l_sort],0 |
je still |
mov [l_sort],0 |
@@: |
mov al,cl |
call mfar_sort |
jmp redraw_files |
;------------------------------------------------------------------------------ |
k_ctrl_f4: |
jecxz ._00 |
cmp [r_sort],1 |
je still |
mov [r_sort],1 |
jmp @f |
._00: |
cmp [l_sort],1 |
je still |
mov [l_sort],1 |
@@: |
mov al,al |
call mfar_sort |
jmp redraw_files |
;------------------------------------------------------------------------------ |
k_directional: |
cmp ah,VK_LEFT ; non-directional keys ? |
jb still ; ignore them |
cmp ah,VK_END |
ja still |
jecxz ._00 |
mov edx,[d_rpos] |
mov ebx,[d_rtop] |
mov esi,[d_rcnt] |
jmp @f |
._00: |
mov edx,[d_lpos] |
mov ebx,[d_ltop] |
mov esi,[d_lcnt] |
@@: |
xor ebp,ebp ; redraw whole panel [0-no, 1-yes] |
;------------------------------------------------------------------------------ |
jmpe ah,show_cur,\ |
VK_LEFT,k_left,\ |
VK_DOWN,k_down,\ |
VK_UP,k_up,\ |
VK_RIGHT,k_right,\ |
VK_HOME,k_home,\ |
VK_END,k_end |
k_left: |
cmp edx,0 |
je still |
sub edx,FPC |
jge @f |
xor edx,edx |
@@: |
mov eax,edx |
sub eax,ebx |
jge show_cur |
inc ebp |
sub ebx,FPC |
jge show_cur |
xor ebx,ebx |
jmp show_cur |
;------------------------------------------------------------------------------ |
k_down: |
lea eax,[esi-1] |
cmp edx,eax |
je still |
inc edx |
mov eax,edx |
sub eax,ebx |
cmp eax,FPC*3-1 |
jle show_cur |
inc ebp |
inc ebx |
jmp show_cur |
;------------------------------------------------------------------------------ |
k_up: |
cmp edx,0 |
je still |
dec edx |
mov eax,ebx |
cmp edx,eax |
jge show_cur |
inc ebp |
dec ebx |
jmp show_cur |
;------------------------------------------------------------------------------ |
k_right: |
lea eax,[esi-1] |
cmp edx,eax |
je still |
add edx,FPC |
cmp edx,eax |
jle @f |
mov edx,eax |
@@: |
mov eax,edx |
sub eax,ebx |
cmp eax,FPC*3-1 |
jle show_cur |
inc ebp |
add ebx,FPC |
jmp show_cur |
;------------------------------------------------------------------------------ |
k_home: |
cmp edx,0 |
je still |
inc ebp |
xor edx,edx |
xor ebx,ebx |
jmp show_cur |
;------------------------------------------------------------------------------ |
k_end: |
lea eax,[esi-1] |
cmp edx,eax |
je still |
mov edx,eax |
mov edi,eax |
sub edi,ebx |
cmp edi,FPC*3-1 |
jle show_cur |
inc ebp |
sub eax,FPC*3-1 |
mov ebx,eax |
;------------------------------------------------------------------------------ |
|
show_cur: |
|
mov edi,[fc.background] |
call draw_sel |
|
jecxz ._00 |
mov [d_rpos],edx |
mov [d_rtop],ebx |
jmp @f |
._00: |
mov [d_lpos],edx |
mov [d_ltop],ebx |
@@: |
|
cmp ebp,0 |
mov al,cl |
jne redraw_files |
|
mov edi,[fc.selection] |
call draw_sel |
call draw_file_info |
jmp still |
|
button: |
mcall MF_GETPRSDBTNID |
cmp ah,1 |
jne noclose |
|
mfar_exit: |
mcall MF_RDDELFILE,fcfile ; delete existing mfar.dat |
mcall MF_RDWRITEFILE,fcfile,fc,12*4,0 ; create new mfar.dat |
|
mcall MF_TERMINATE ; close program |
noclose: |
jmp still |
|
;------------------------------------------------------------------------------ |
;///// DRAW WINDOW //////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
func draw_window |
mcall MF_WINPROPS,WP_GETSYSCLRS,sc,sizeof.system_colors |
|
mcall MF_WNDDRAW,WD_BEGINDRAW |
mov edx,[fc.background] |
or edx,WS_SKINNED |
mcall2 MF_DEFWINDOW,90,oX+tW*80+4,45,oY+tH*25+4 |
mcall1 MF_DRAWTEXT,8,8,[sc.grab_text],caption,caption.size |
|
mmov esi,oX+2,oX+tW*39+2 |
mmov edi,oY+3,oY+tH*22+3 |
mov edx,[fc.default] |
call draw_frame |
mmov esi,oX+tW*40+2,oX+tW*79+2 |
call draw_frame |
|
mcall2 MF_DRAWLINE,oX+tW*13+2,oX+tW*13+2,oY+tH,oY+tH*20+3 |
madd ebx,tW*13,tW*13 |
mcall |
mcall2 ,oX+3,oX+tW*39+1,oY+tH*20+3,oY+tH*20+3 |
mcall2 ,oX+tW*53+2,oX+tW*53+2,oY+tH,oY+tH*20+3 |
madd ebx,tW*13,tW*13 |
mcall |
mcall2 ,oX+tW*40+3,oX+tW*79+1,oY+tH*20+3,oY+tH*20+3 |
|
mcall1 MF_DRAWTEXT,oX+tW*5,oY+tH,$00ffff00,lname,lname.size |
mcall1 ,oX+tW*18,oY+tH |
mcall1 ,oX+tW*31,oY+tH |
mcall1 ,oX+tW*45,oY+tH |
mcall1 ,oX+tW*58,oY+tH |
mcall1 ,oX+tW*71,oY+tH |
|
movzx edi,[l_sort] |
lea edx,[edi+sort_kind] |
mcall1 ,oX+tW,oY+tH,$00ffff00,,1 |
movzx edi,[r_sort] |
lea edx,[edi+sort_kind] |
mcall1 ,oX+tW*41,oY+tH |
|
call draw_path |
call draw_bottom_keys |
|
mcall MF_WNDDRAW,WD_ENDDRAW |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
func draw_window_full |
call draw_window |
mov edx,1 |
call get_files_data |
mov al,1 |
call draw_files |
mov edx,0 |
call get_files_data |
mov al,0 |
call draw_files |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
align 4 |
len dd ? |
|
func get_normal_path |
pusha |
mov ecx,5 |
rep movsb |
dec esi |
dec edi |
mov ecx,5 |
push eax |
@@: |
dec dword[esp] |
jz @f |
lodsb |
cmp al,0 |
je @b |
cmp al,' ' |
je @b |
stosb |
inc ecx |
jmp @b |
@@: |
pop eax |
mov byte[edi],'>' |
mov [len],ecx |
popa |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
; EAX = length needed |
; ECX = current length |
; EDI = path string |
func get_path_ellipses |
cmp ecx,eax |
jbe @f |
pushad |
lea esi,[edi+ecx+3+6] ; ... + /??/?/ |
sub esi,eax |
add ecx,edi |
sub ecx,esi |
mov dword[edi+6],'... ' |
add edi,9 |
cld |
rep movsb |
mov [len],eax |
popad |
@@: |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
func draw_path |
pushad |
cmp [active_panel],0 |
jne ._00 |
mov esi,f_path0 |
mov eax,[f_plen0] |
jmp @f |
._00: |
mov esi,f_path1 |
mov eax,[f_plen1] |
@@: |
mov edi,f_pathn |
call get_normal_path |
mov eax,39 |
mov ecx,[len] |
mov edi,f_pathn |
call get_path_ellipses |
mcall2 MF_FILLRECT,oX-1,tW*80+1,oY+tH*23-1,tH,[fc.pathbg] |
mcall1 MF_DRAWTEXT,oX,oY+tH*23,[fc.path],f_pathn,[len] |
popad |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
; AL = panel |
func draw_files |
push eax |
mmov ecx,oY+tH*2-1,tH*FPC |
mov edx,[fc.background] |
cmp al,0 |
mov eax,MF_FILLRECT |
jne ._00 |
mcall1 ,oX+tW-2,tW*12+3 |
mcall1 ,oX+tW*14-2,tW*12+3 |
mcall1 ,oX+tW*27-2,tW*12+3 |
mmov ebx,oX+tW,oY+tH*2 |
mov edx,[d_ltop] |
shl edx,4 |
add edx,lstart |
mov edi,[d_lcnt] |
mov esi,edi |
sub edi,[d_ltop] |
jmp @f |
._00: |
mcall1 ,oX+tW*41-2,tW*12+3 |
mcall1 ,oX+tW*54-2,tW*12+3 |
mcall1 ,oX+tW*67-2,tW*12+3 |
mmov ebx,oX+tW*41,oY+tH*2 |
mov edx,[d_rtop] |
shl edx,4 |
add edx,rstart |
mov edi,[d_rcnt] |
mov esi,edi |
sub edi,[d_rtop] |
@@: |
cmp esi,0 |
je .exit_nok ; no files |
|
mov ecx,3 |
.next_col: |
push ecx |
mov ecx,FPC |
.next_row: |
dec edi |
jge @f |
pop eax |
jmp .exit_ok |
@@: |
push ecx |
call get_file_color |
mov esi,edx |
call get_file_name |
push edx |
mcall 4,,,f_name,12 ; draw file name |
pop edx ecx |
add ebx,tH |
|
add edx,16 |
dec ecx |
jnz .next_row |
pop ecx |
dec ecx |
jz .exit_ok |
madd ebx,tW*13,0 |
mov bx,oY+tH*2 |
jmp .next_col |
|
.exit_ok: |
mov edi,sel_color |
call draw_sel |
.exit_nok: |
pop eax |
call draw_file_info |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
func draw_bottom_keys |
pushad |
mcall2 MF_FILLRECT,oX-1,tW*80+1,oY+tH*24-1,tH+1,[fc.pathbg] |
dec ecx |
mcall1 ,oX+tW-1,tW*6+1,,[fc.keysbg] |
mov esi,7 |
@@: |
madd ebx,tW*8,0 |
mcall |
dec esi |
jge @b |
mcall1 ,oX+tW*73-1,tW*7+1 |
mcall MF_DRAWNUMBER,$00010100,1,oX*65536+(oY+tH*24),[fc.path] |
sub edx,$00010000 |
@@: |
inc cl |
madd edx,tW*8,0 |
mcall |
cmp cl,10 |
jb @b |
mcall1 MF_DRAWTEXT,oX+tW,oY+tH*24,[fc.keys],btmkeys,btmkeys.size |
popad |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
; ESI = X1*65536+X2 |
; EDI = Y1*65536+Y2 |
; EDX = color |
func draw_frame |
mov ecx,edi |
mov ebx,edi |
shr ebx,16 |
mov cx,bx |
mcall MF_DRAWLINE,esi |
mov ecx,edi |
shl ecx,16 |
mov cx,di |
mcall |
mov ebx,esi |
mov ecx,esi |
shr ecx,16 |
mov bx,cx |
mcall ,,edi |
mov ebx,esi |
shl ebx,16 |
mov bx,si |
mcall |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
; EDX = pointer to file data |
func get_file_color |
push esi |
mov cl,[edx+11] |
test cl,(FA_HIDDEN or FA_SYSTEM) |
jz @f |
mov ecx,[fc.system] |
jmp .exit |
@@: |
test cl,FA_FOLDER |
jz @f |
mov ecx,[fc.folder] |
jmp .exit |
@@: |
mov ecx,[edx+7] |
and ecx,$ffffff00 |
or ecx,$00000020 |
|
mov esi,ext0-4 |
@@: |
lodsd |
or eax,eax |
jz @f |
cmp ecx,eax |
jne @b |
mov ecx,[fc.executable] |
jmp .exit |
@@: |
lodsd |
or eax,eax |
jz @f |
cmp ecx,eax |
jne @b |
mov ecx,[fc.bitmap] |
jmp .exit |
@@: |
lodsd |
or eax,eax |
je @f |
cmp ecx,eax |
jne @b |
mov ecx,[fc.source] |
jmp .exit |
@@: |
mov ecx,[fc.default] |
.exit: |
pop esi |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
; EDI = color |
func draw_sel |
pushad |
cmp [active_panel],0 |
jne ._00 |
mov eax,[d_lpos] |
sub eax,[d_ltop] |
mov esi,[d_lcnt] |
jmp @f |
._00: |
mov eax,[d_rpos] |
sub eax,[d_rtop] |
mov esi,[d_rcnt] |
@@: |
cmp esi,0 |
je .exit |
mov cl,FPC |
div cl |
mov bp,ax |
and eax,$000000FF |
mov cl,tW*13 |
mul cl |
add ax,oX+tW-2 |
push eax |
shl eax,16 |
mov ax,tW*12+3 |
mov ebx,eax |
mov ax,bp |
shr eax,8 |
and eax,$000000FF |
mov cl,tH |
mul cl |
add ax,oY+tH*2-1 |
push eax |
shl eax,16 |
mov ax,tH |
mov ecx,eax |
mov edx,edi |
cmp [active_panel],0 |
je @f |
madd ebx,(40*6),0 |
@@: |
mcall MF_FILLRECT |
|
pop eax |
movzx ebx,ax |
inc bx |
pop eax |
add ax,2 |
shl eax,16 |
or ebx,eax |
cmp [active_panel],0 |
jne ._01 |
mov edx,[d_lpos] |
shl edx,4 |
add edx,lstart |
jmp @f |
._01: |
mov edx,[d_rpos] |
shl edx,4 |
add edx,rstart |
@@: |
mov esi,edx |
call get_file_name |
call get_file_color |
cmp ecx,edi |
jne @f |
xor ecx,ecx |
@@: |
cmp [active_panel],0 |
je @f |
madd ebx,tW*40,0 |
@@: |
mcall MF_DRAWTEXT,,,f_name,12 |
.exit: |
popad |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
; AL = panel |
func draw_file_info |
push eax |
mmov ecx,oY+tH*21,tH |
mov edx,[fc.background] |
cmp al,0 |
mov eax,MF_FILLRECT |
jne ._00 |
mcall1 ,oX+tW,tW*38+1 |
mov esi,[d_lpos] |
shl esi,4 |
add esi,lstart |
mov edi,[d_lcnt] |
jmp @f |
._00: |
mcall1 ,oX+tW*41,tW*38+1 |
mov esi,[d_rpos] |
shl esi,4 |
add esi,rstart |
mov edi,[d_rcnt] |
@@: |
cmp edi,0 |
jne @f |
pop eax |
ret |
@@: |
call get_file_info |
mov dword[file_info+17],' ' |
mov word[file_info+15],' ' |
test byte[esi+11],FA_FOLDER |
jz @f |
mov dword[file_info+21],' DIR' |
jmp .no_size |
@@: |
mov dword[file_info+21],' ' |
mov eax,[f_size] |
mov esi,file_info+24 |
mov ebx,10 |
mov ecx,ebx |
@@: |
xor edx,edx |
div ebx |
add dl,'0' |
mov [esi],dl |
or eax,eax |
jz .no_size |
dec esi |
loop @b |
.no_size: |
pop eax |
mmov edx,oX+tW*35,oY+tH*21 |
mmov ebx,oX+tW,oY+tH*21 |
cmp al,0 |
je @f |
madd edx,tW*40,0 |
madd ebx,tW*40,0 |
@@: |
push edx |
mcall MF_DRAWTEXT,,[fc.default],file_info,34 |
pop edx |
mov esi,ecx |
mov cx,[f_year] |
mcall MF_DRAWNUMBER,$00040000 |
sub edx,$00240000 ; 6*6 = $24 |
movzx ecx,[f_day] |
mcall ,$00020000 |
add edx,$00120000 |
mov cl,[f_mnth] |
mcall |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
func get_file_name |
pushad |
mov eax,[esi+0] |
mov [f_name+0],eax |
mov eax,[esi+4] |
mov [f_name+4],eax |
mov eax,[esi+8] |
shl eax,8 |
and eax,$FFFFFF00 |
or al,$00000020 |
mov [f_name+8],eax |
popad |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
; ESI = pointer to file data |
func get_file_info |
pushad |
mov eax,[esi+12] |
mov dword[f_info],FS_READ |
mov [f_info+4],eax |
mov dword[f_info+12],read_area |
mcall MF_FSACCESS,f_info |
cmp eax,ERR_SUCCESS |
je @f |
cmp eax,ERR_FS_LAST |
ja @f |
popad |
stc |
ret |
@@: |
mov eax,read_area |
mov ecx,16 |
.next_file: |
mov edx,[esi+0] |
cmp [eax+0],edx |
jne @f |
mov edx,[esi+4] |
cmp [eax+4],edx |
jne @f |
mov edx,[esi+8] |
cmp [eax+8],edx |
jne @f |
mov esi,eax |
jmp .found |
@@: |
add eax,32 |
loop .next_file |
.found: |
push esi |
mov eax,' ' |
mov ecx,3 |
mov edi,file_info |
rep stosd |
mov edi,file_info |
mov ecx,2 |
rep movsd |
mov edi,file_info |
@@: |
cmp byte[edi],' ' |
jbe @f |
inc edi |
jmp @b |
@@: |
mov eax,[esi] |
shl eax,8 |
mov al,'.' |
cmp eax,'. ' |
je @f |
mov [edi],eax |
@@: |
pop esi |
mov eax,[esi+28] |
mov [f_size],eax |
mov eax,[esi+24] |
mov [f_day],al |
and [f_day],00011111b |
shr eax,5 |
mov [f_mnth],al |
and [f_mnth],00001111b |
shr eax,4 |
mov [f_year],ax |
and [f_year],01111111b |
add [f_year],1980 |
popad |
clc |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
; DL = panel |
func get_files_data |
pushad |
mov [d_tcnt],0 |
mov [d_ttsz],0 |
cmp dl,0 |
jne ._00 |
mov esi,f_path0 |
mov ecx,[f_plen0] |
jmp @f |
._00: |
mov esi,f_path1 |
mov ecx,[f_plen1] |
@@: |
push edi |
mov edi,f_info.path |
mov byte[edi+ecx],0 |
rep movsb |
pop edi |
cmp dl,0 |
jne ._01 |
mov edi,lstart |
jmp @f |
._01: |
mov edi,rstart |
@@: |
push edx |
xor ebp,ebp |
mov dword[f_info],FS_READ ; read |
mov dword[f_info+8],1 ; 1 block |
mov dword[f_info+12],read_area ; to read_area |
.next_block: |
mov dword[f_info+4],ebp ; starting from block #ebp |
mcall MF_FSACCESS,f_info |
cmp eax,ERR_SUCCESS |
je @f |
cmp eax,ERR_FS_LAST |
ja @f |
jmp .exit |
@@: |
mov esi,read_area |
mov ecx,16 |
.next_file: |
cmp word[esi],0 ; end of entries |
je .exit |
cmp word[esi],'. ' ; self-pointer |
je .skip |
test byte[esi+11],FA_LABEL ; disk label |
jnz .skip |
cmp byte[esi+11],$0F ; fat32 |
je .skip |
cmp byte[esi],$E5 ; erased |
je .skip |
mov eax,[esi+28] ; add file size |
add [d_ttsz],eax ; to folder size |
push ecx |
mov ecx,3 |
rep movsd ; copy name, attriputes |
mov [edi],ebp ; and block number |
add edi,4 |
add esi,20 |
inc [d_tcnt] ; increase folder files counter |
; cmp [d_tcnt],max_cnt |
; je .exit |
pop ecx |
jmp @f |
.skip: |
add esi,32 |
@@: |
loop .next_file |
|
cmp [d_tcnt],max_cnt |
je .exit |
inc ebp |
jmp .next_block |
.exit: |
pop edx |
push [d_ttsz] |
mov eax,[d_tcnt] |
cmp dl,0 |
jne ._02 |
mov [d_lcnt],eax |
pop [d_ltsz] |
jmp @f |
._02: |
mov [d_rcnt],eax |
pop [d_rtsz] |
@@: |
popad |
mov al,dl |
call mfar_sort |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
func execute_current_file |
pushad |
cmp [active_panel],0 |
jne ._00 |
mov esi,[d_lpos] |
shl esi,4 |
add esi,lstart |
mov edi,f_path0 |
mov ecx,f_plen0 |
jmp @f |
._00: |
mov esi,[d_rpos] |
shl esi,4 |
add esi,rstart |
mov edi,f_path1 |
mov ecx,f_plen1 |
@@: |
call get_file_info |
test byte[esi+11],FA_FOLDER |
jz .file |
cmp word[esi],'..' |
jne .enter_dir |
add edi,[ecx] |
dec edi |
@@: |
dec [f_plen1] |
cmp byte[edi],'/' |
je @f |
dec edi |
jmp @b |
@@: |
mov dword[edi],0 |
jmp @f |
.enter_dir: |
add edi,[ecx] |
push ecx edi |
mov byte[edi],'/' |
inc edi |
mov esi,file_info |
mov ecx,3 |
cld |
rep movsd |
mov dword[edi],0 |
pop esi ecx |
sub edi,esi |
add dword[ecx],edi |
mov [d_rpos],0 |
mov [d_rtop],0 |
@@: |
mov dl,[active_panel] |
call get_files_data |
call draw_path |
mov al,dl |
call draw_files |
jmp .exit |
.file: |
mov eax,[esi+8] |
shl eax,8 |
and eax,$FFFFFF00 |
or eax,$00000020 |
cmp eax,' ' |
jne .exit |
|
mov esi,edi |
mov eax,[ecx] |
mov edi,f_pathn |
call get_normal_path |
mov esi,f_pathn |
mov ecx,[len] |
dec ecx |
mov edi,f_info.path |
rep movsb |
mov byte[edi],'/' |
inc edi |
mov esi,file_info |
@@: |
movsb |
cmp byte[esi],0 |
je @f |
cmp byte[esi],' ' |
jne @b |
@@: |
mov byte[edi],0 |
mov dword[f_info],FS_EXECUTE |
mov dword[f_info+12],0 |
mcall MF_FSACCESS,f_info |
.exit: |
popad |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;////////////////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
func delete_current_file |
pushad |
popad |
ret |
endf |
|
;------------------------------------------------------------------------------ |
;///// INCLUDES /////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
include 'mf-copy.inc' |
include 'mf-sort.inc' |
|
;------------------------------------------------------------------------------ |
;///// DATA /////////////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
|
align 4 |
|
f_size dd ? |
f_day db ? |
f_mnth db ? |
f_year dw ? |
|
d_lpos dd 0 |
d_ltop dd 0 |
d_lcnt dd 0 |
d_ltsz dd 0 |
d_rpos dd 0 |
d_rtop dd 0 |
d_rcnt dd 0 |
d_rtsz dd 0 |
d_tpos dd ? |
d_ttop dd ? |
d_tcnt dd ? |
d_ttsz dd ? |
|
f_info: |
dd 0 |
dd 0 |
dd ? |
dd read_area |
dd MEM_FOR_OS |
.path: |
rb 200 |
|
f_plen0 dd 5 |
f_plen1 dd 5 |
|
sz caption,'MFAR : PRE-ALPHA-8.1' |
sz fcfile,'MFAR DAT' |
sz p_hd,'/HD/1',0 |
sz p_rd,'/RD/1',0 |
ext0: |
db ' EXE COM BAT CMD' |
dd 0 |
ext1: |
db ' BMP GIF JPG PNG WMF' |
dd 0 |
ext2: |
db ' ASM INC' |
dd 0 |
|
;----- LANGUAGE-SPECIFIC STRINGS ----- |
include 'mf-lang.inc' |
;------------------------------------- |
|
f_name: rb 12 |
file_info: db ' . .' |
active_panel db 0 |
;--------------------------------- |
|
sel_color = $00008080 |
|
FPC = 18 |
|
MEM_FOR_OS = $48300 |
MEM_USED = $4C300 |
read_area = $48000 |
fdata_size = $40000-$300 |
max_cnt = fdata_size/32 |
lstart = $8000+$300 |
rstart = lstart+max_cnt*16 |
|
f_path0 = $8000 |
f_path1 = $8000+$100 |
f_pathn = $8000+$200 |
|
align 4 |
|
sc system_colors |
fc mfar_colors |
|
I_END: |
; 16 bytes per entry: |
; -> 8 bytes - name |
; -> 3 bytes - extension |
; -> 1 byte - attributes |
; -> 4 bytes - block number |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |