mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-01 13:06:58 +03:00
fca11d7700
git-svn-id: svn://kolibrios.org@111 a494cfbc-eb01-0410-851d-a64ba20cac60
1182 lines
30 KiB
NASM
1182 lines
30 KiB
NASM
|
|
; 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
|