;**************************** ; 'filer.asm' ;**************************** include vz.inc IFNDEF NOFILER ;--- Equations --- PX_TTL equ 1 PX_FILES equ 36 PX_FREE equ 24 KEY_SHIFT equ 00000001b ; ##156.101 DCMP_EXIST equ 00001b DCMP_NEW equ 00010b DCMP_OLD equ 00100b DCMP_LARGE equ 01000b DCMP_SMALL equ 10000b SORT_NAME equ 00000001b SORT_EXT equ 00000010b SORT_NEW equ 00000100b SORT_OLD equ 00001000b SORT_LARGE equ 00010000b SORT_SMALL equ 00100000b SORT_DIR equ 01000000b FM_SPACE equ 00000001b FM_EXEC equ 00000010b FM_DOSBOX equ 00000100b FM_ROTATE equ 00001000b FM_FDCSR equ 00010000b FM_SPCEXT equ 00100000b FB_MENU equ 0001b FB_TBOX equ 0010b FB_EXIST equ 0100b FT_ALL equ 0 FT_BIN equ -1 FT_TEXT equ 1 SPE_SRCDIR equ 0001b SPE_DSTDIR equ 0010b SPE_DSTFILE equ 0100b SPE_CANCEL equ 80h FLATRCNT equ 6 FMCMDCNT equ 4 FATTRCNT equ 4 NAMEWSIZE equ -13 fcmd macro cmdnum,label db cmdnum dw cgroup:label endm fmnu macro label,mode dw cgroup:label db mode endm ;--- External symbols --- wseg extrn dcmpopt :byte extrn dirchr :byte extrn hardware :byte extrn nm_path :byte extrn parsef :byte extrn sortopt :byte extrn tchdir :byte extrn flmode :byte extrn doslen :byte extrn dossw :byte extrn flret :byte extrn sysmode :word extrn basemode :word extrn silent :word extrn curdir :word extrn dspsw :word extrn edtsw :word extrn execcmd :word extrn extlist :word extrn farseg :word extrn fbuf :word extrn filermnu :word extrn flcmdp :word extrn flwork :word extrn flwork2 :word extrn getextp :word extrn getnamp :word extrn hfiles :word extrn menubit :word extrn pathbuf :word extrn pathbuf2 :word extrn pathp :word extrn pool :word extrn poolend :word extrn refloc :word extrn tmpbuf :word extrn tmpbuf2 :word extrn tmpbuf3 :word ; extrn wbuf :word extrn nbuf :word extrn menumsgp :word extrn actwkp :word extrn retval :word extrn xbuf :word extrn dosloc :word extrn lbuf :word extrn hidden :word endws extrn addsep :near ; extrn chkline :near extrn csroff :near extrn dispframe :near extrn dosheight :near extrn doswindow :near extrn do_mbar :near extrn drawmbar :near extrn ems_map :near extrn fillatr :near extrn fillc :near extrn fillset :near extrn fillspc :near extrn finddir :near extrn getatr1 :near extrn getcurdir :near extrn getcurdir1 :near extrn getcurscrn :near extrn getkey :near extrn getloc :near extrn getwindow :near extrn iskanji :near extrn isslash :near extrn loadwloc :near extrn locate :near extrn memmove :near extrn parsepath1 :near extrn popupmenu :near extrn printf :near extrn putc :near extrn putcw :near extrn putcurscrn :near extrn putcurwind :near extrn puts :near extrn putmg :near extrn putspc :near extrn puts_s :near extrn repputc :near extrn revatr :near extrn rollwind :near extrn savewloc :near extrn schsysmenu :near extrn setatr :near extrn setatr1 :near extrn setatr2 :near extrn setdoswindow :near extrn setenvvar :near extrn setfnckey :near extrn setmsgp :near extrn setwindow :near extrn shift_key :near extrn skipchar :near extrn skipspc :near extrn skipstr :near extrn strcmp :near extrn strcpy :near extrn strlen :near extrn strlwr :near extrn strncpy :near extrn strskip :near extrn sysmenu :near extrn undatr :near extrn windgets :near extrn windgetsc :near extrn windgets1 :near extrn wrdcpy :near extrn wrdicmp :near extrn stricmp :near extrn set_attr :near extrn isbinary :near extrn toupper :near extrn dispask :near extrn scantbl :near extrn do_evmac :near extrn run_evmac :near extrn histcpy :near extrn open_file :near extrn get_refpath :near extrn isdigit :near extrn dispmsg :near extrn off_silent :near extrn islower :near extrn isupper :near extrn cmdmenu :near extrn get_mbar :near extrn sel_number :near extrn setvzkey :near extrn strchr :near extrn maptexts :near dseg ; bseg ;--- Local work --- GDATA flparm, label, byte fldual db 0 ; 0=single, 1=dual retdir db 0 fllastcmd dw 0 GDATA flatrtbl, db, mb_filer db 1,0,WD,-1 dw 0 mn_drive db 7 drive_c db 0,0,0 dw offset cgroup:draw_drive mn_vzpath db 32 db 0,0,0 dw 0 mask_all db "*.*",0 path_root db "\",0 path_parent db "..",0 maskbit dw 0 archive dw 0 attrbit db 0 flbinary db 0 vzpathp dd 0 speflag db 0 rotate db 0 lastpos db 0 walkmnu dw 0 endds cseg assume ds:cgroup ;--- Constants --- pf_size db "%7lu",0 ; ##156.119 IFDEF US pf_time db "%2d-%02d-%02d %2d:%02d%c",0 ; ##156.92 ELSE pf_time db "%02d-%02d-%02d %2d:%02d",0 ENDIF pf_files db " %d ",0 pf_free db " %,lu ",0 ; ##156.103 mg_dir db " ",0 ; ##156.119 mg_files db "files ",0 mg_free db "bytes free ",0 mg_total db "bytes total ",0 mg_eod db " ",0 mg_ovf db " (Out of Buf) ",0 ;--- Filer main --- ;<-- CY :escape ; NC,AL(flret) ; 0=Open file ; 1=exec command ; -1=sHell public filer filer proc pushm movseg ds,ss movseg es,ss push basemode ; push silent ; test silent,4 ;_ifn z ; call off_silent ;_endif call setfnckey clr ax mov execcmd,ax mov fllastcmd,ax mov doslen,al mov dossw,al call savewloc call getcurdir jmpl c,filer_x ; ##100.13 call getcurscrn ; call chkline call initfiler mov bx,offset cgroup:mb_filer call drawmbar mov si,filermnu mov bp,actwkp call setaccdir jc filer5 call setmask call setcurpath call newpath tstb fldual _ifn z push bp mov bp,[bp].fl_back call setcurpath _if c ; ##151.12 call resetaccdir _endif call newpath pop bp call setcurpath _endif mov tchdir,FALSE call setflwind mov ax,SYS_FILER mov sysmode,ax mov basemode,ax mov retval,0 mov al,EV_FILER call do_evmac filer1: call bcsron clr ax mov refloc,ax mov dossw,al mov dl,SYS_FILER mov al,CSR_OFF call getkey mov fllastcmd,ax call do_filer tstw execcmd jz filer1 filer5: pushf mov si,curdir call chpath ; call chkline tstw flcmdp _ifn z mov ax,xbuf call spreadexec jc gdos_c mov execcmd,ax jmps filer7 _endif mov ax,execcmd tst ax jz filer8 cmp ax,-1 jne filer6 mov execcmd,0 jmps filer8 filer6: call spreadexec jc gdos_c mov execcmd,ax mov si,xbuf call dos_go _if c mov doslen,cl _else test flmode,FM_DOSBOX _ifn z mov refloc,0 mov cx,DOSLEN-2 mov dl,W_DOSBOX test dossw,DOS_BOXTTL _ifn z mov dl,W_CMDBOX _endif mov al,GETS_DOSBOX call windgets1 jcxz gdos_c _if c gdos_c: popf mov execcmd,0 call setcurpath jmp filer1 _endif or dossw,DOS_TBOX mov doslen,cl _endif _endif filer7: mov al,1 filer8: mov flret,al push ax mov basemode,SYS_SEDIT call nextpool call putcurscrn pop ax popf filer_x: call loadwloc ; pop silent ; pushf ; and silent,not 4 ; popf pop basemode popm ret filer endp ;--- Init filer --- initfiler proc mov bp,flwork tstw pathp _ifn z mov fldual,0 clr ax mov actwkp,ax mov [bp].fl_which,al mov [bp].fl_mask,al tstb retdir _if z lea si,[bp].fl_path lea di,[bp].fl_lastpath call strcpy _endif _else tstb retdir _ifn z lea si,[bp].fl_lastpath lea di,[bp].fl_path call strcpy tstb [bp].fl_path _if z mov [bp].fl_curf,FALSE _endif mov [bp].fl_mask,0 mov tchdir,TRUE mov retdir,0 _endif _endif mov bx,flwork2 tstw actwkp _if z mov actwkp,bp _endif call initfl1 xchg bx,bp call initfl1 mov bx,offset cgroup:mb_filer mov ax,filermnu mov [bx].mb_ttl,ax ret initfl1: mov ax,farseg call ems_map mov [bp].fl_seg,ax mov [bp].fl_back,bx ; mov [bp].fl_pooltop,0 mov ax,[bp].fl_pooltop mov [bp].fl_poolp,ax tstb [bp].fl_mask _if z call selwild _endif tstb [bp].fl_curf _if z mov si,curdir lea di,[bp].fl_path call strcpy _endif ret initfiler endp ;--- To new path --- newpath proc call clrpath tstw pathp jnz newpath1 tstb tchdir jnz newpath1 tstw [bp].fl_files jz newpath1 mov bl,[bp].fl_path and bl,1Fh msdos F_IOCTRL,08h jc npath1 tst ax jnz npath1 jmps newpath1 newpath0: mov [bp].fl_bcsr,0 newpath1: call csroff call initpoolp call readdir jmps npath1 redump: mov [bp].fl_home,0 npath1: call initflwind call drawflframe call drawouter call dumpfile clc ret clrpath: mov si,pathbuf mov byte ptr [si],0 ret newpath endp ;--- Filer command table --- tb_flcmdsym db "LMPSVW+> mov di,offset cgroup:tb_flcmdsym mov cx,offset tb_flcmd - offset tb_flcmdsym call scantbl clc _if e sub cl,offset tb_flcmd - offset tb_flcmdsym - 1 neg cl mov al,cl add al,CM_FILER3 stc _endif popm ret scan_flcmd endp ;----- &Fl(path) ----- public fx_filer fx_filer proc push sysmode mov cx,si call parsepath1 call filer _if c mov ax,-1 _endif mov retval,ax clr ax mov execcmd,ax pop ax mov sysmode,ax cmp al,SYS_SEDIT _if e call setvzkey _if c call maptexts _endif _endif ret fx_filer endp ;----- &Fm(c) ----- public fx_mbar fx_mbar proc mov dx,ax pushm mov bx,offset cgroup:mb_filer call do_mbar popm _ifn c mov lastpos,al mov refloc,dx _else mov al,INVALID _endif cbw mov retval,ax ret fx_mbar endp ;----- &Fg(di[,al]) ----- public fx_getpool fx_getpool proc mov di,si mov al,dl call getpool clr al xchg al,ah mov retval,ax ret fx_getpool endp ;----- &Fi ----- public fx_initpool fx_initpool proc pushm mov bp,actwkp tst bp _ifn z mov ax,farseg call ems_map call scan_1st mov [bp].fl_poolp,bx mov ax,[bp].fl_selcnt mov ss:retval,ax _endif popm ret fx_initpool endp ;----- &Fn ----- public fx_nextpool fx_nextpool proc pushm call nextpool mov ax,1 _if c dec ax _endif mov retval,ax popm ret fx_nextpool endp ;----- Walk on menu bar ----- walk_mbar proc mov bx,offset cgroup:mb_filer mov cl,lastpos clr ch tst cl _ifn s cmp al,CM_R je walk_right cmp al,CM_L je walk_left _endif clc ret walk_right: inc cx cmp cl,[bx].mb_c _if ae clr cx _endif jmps walk1 walk_left: tst cx _if z mov cl,[bx].mb_c _endif dec cx walk1: mov walkmnu,ax mov lastpos,cl call get_mbar stc ret walk_mbar endp ;----- Is bottom of dir? ----- isbottom proc tstw [bp].fl_selcnt _if z mov ax,[bp].fl_bcsr inc ax cmp ax,[bp].fl_files _if ae inc sp inc sp _endif _endif ret isbottom endp ;--- Do filer --- do_filer proc mov walkmnu,FALSE mov cx,[bp].fl_bcsr mov bx,hfiles tst al jz do_flkey mov lastpos,INVALID do_flcmd: cmp al,CM_FILER3 jb doflcmd1 sub al,CM_FILER3 clr dx doflmenu1: cbw mov di,ax shl ax,1 add ax,di mov di,offset cgroup:tb_menucmd add di,ax mov cl,cs:[di+2] doflmenu2: mov ax,walkmnu tst ax _ifn z test cl,FB_MENU jz doflwalk _endif mov bx,menumsgp test cl,FB_EXIST _ifn z call isbottom _endif test cl,FB_TBOX _ifn z mov refloc,0 _endif push cx call cs:[di] pop dx _ifn c clr ax _endif test dl,FB_MENU _ifn z doflwalk: call walk_mbar jc doflkey1 _endif call setflwind ret doflcmd1: mov ah,FALSE test flmode,FM_ROTATE _ifn z mov ah,TRUE _endif mov rotate,ah mov si,offset cgroup:tb_flcmd _repeat cmp al,cs:[si] jmpl e,cs:[si+1] add si,3 tstb cs:[si] _until z ret do_flkey: ; cmp dl,':' ; [:] ##152.25 ;_if e ; mov dx,word ptr [bx].mb_px ; jmp do_drive ;_endif cmp dl,SPC _if e test flmode,FM_SPACE jmpl z,do_spc jmp csr_next _endif cmp dl,'*' ; [*] je do_wild cmp dl,'\' ; [\] je do_root cmp dl,'/' ; [/] je do_root call shift_key ; ##156.101 test ah,KEY_SHIFT jmpln z,do_search cmp dl,'0' ; ##156.102 _if ae cmp dl,'9' _if be sub dl,'0'+1 _if s push si mov si,curdir lodsb pop si call toupper sub al,'A' mov dl,al _endif mov al,dl jmp do_drive1 _endif _endif doflkey1: mov al,dl cbw call toupper push retval mov retval,ax mov al,EV_FILER call do_evmac _if c call run_evmac pop retval jmp do_flcmd _endif pop retval mov bx,offset cgroup:mb_filer call do_mbar _ifn c mov lastpos,al mov refloc,dx jmp doflmenu1 _endif ret do_filer endp do_wild proc call selwild call newpath0 ret do_wild endp do_root proc mov si,offset cgroup:path_root mov cx,1 jmp dopath1 do_root endp do_parent proc mov dx,offset cgroup:path_parent push ds jmps chgdir1 do_parent endp ;--- Do select command --- do_spc: pushm call getpoolp jae dospc9 push ds mov ds,dx mov al,[bx].dr_attr ; test al,FA_DIREC ; ##156.100 ; jnz dospcx xor al,FA_SEL mov [bx].dr_attr,al pop ds test al,FA_SEL _ifn z inc [bp].fl_selcnt _else dec [bp].fl_selcnt _endif call drawdiskinfo jmps dospc9 dospcx: pop ds dospc9: popm ret do_cr: call isbottom ;; call set_poolp ;; tstw flcmdp _if z call check_dir jc docr9 _endif push ds call scan_1st tstw [bp].fl_selcnt _if z test [bx].dr_attr,FA_DIREC jnz chgdir _else test ss:flmode,FM_SPCEXT jz docr1 _endif tstw ss:flcmdp _if z call isspecext _endif docr1: pop ds clc jmps esc8 ;docr8: ; tst ax ; jz do_esc ; jmps esc8 chgdir: mov dx,bx add dx,dr_pack chgdir1: msdos F_CHDIR pop ds jc docr9 mov [bp].fl_home,0 lea si,[bp].fl_path push si mov di,pathbuf call strcpy pop di call getaccdir call newpath1 call clrpath docr9: ret do_esc: mov ax,[bp].fl_poolend mov [bp].fl_poolp,ax stc esc8: inc sp inc sp jmp filer5 ;--- Move block cursor --- csr_next: cmp hfiles,5 jne csr_ds csr_rs: mov rotate,FALSE call do_spc csr_r: call chkdual inc cx cmp cx,[bp].fl_files jb fscrl1 tstb rotate jnz csr_top ret csr_ls: mov rotate,FALSE call csr_l jmp do_spc csr_l: call chkdual dec cx jns fscroll tstb rotate jnz csr_end csr9: ret csr_ds: mov rotate,FALSE call do_spc csr_d: add cx,bx cmp cx,[bp].fl_files jb fscroll tstb rotate jz csr9 cmp bl,5 jne csr_top sub cx,bx mov ax,cx cwd div bx mov cx,dx cmp cx,[bp].fl_files jae csr_top fscrl1: jmps fscroll csr_us: mov rotate,FALSE call csr_u jmp do_spc csr_u: sub cx,bx jnb fscroll tstb rotate jz csr9 cmp bl,5 jne csr_end csru1: add cx,bx cmp cx,[bp].fl_files jb csru1 sub cx,bx jmps fscroll ;--- Move cursor to home/bottom --- csr_home: tstw [bp].fl_bcsr _ifn z ; call bcsroff csr_top: clr cx _else csr_end: mov cx,[bp].fl_files dec cx _endif ; jmps fscroll ;--- Scroll up/down window --- ;--> CX :new position fscroll proc tstw [bp].fl_files jz frol9 call bcsroff call fsetcsr fscroll1: tst al jz frol9 cmp al,1 je frolup cmp al,-1 je froldn jmp dumpfile frolup: mov ah,[bp].fl_wsy dec ah push ax push dx call getwindow movhl ax,ATR_WTXT,1 call rollwind jmps frol1 froldn: clr ah push ax push dx call getwindow movhl ax,ATR_WTXT,-1 call rollwind frol1: pop bx call getpoolp1 pop dx call dumpline frol9: ret fscroll endp ;--- Roll window --- csr_rolup: mov al,-1 jmps viewroll csr_roldown: mov al,1 jmps viewroll csr_rolup2: mov al,-2 jmps viewroll csr_roldown2: mov al,2 jmps viewroll csr_pageup: call flpageln neg al jmps viewroll csr_pagedown: call flpageln ; jmps viewroll viewroll proc tstw [bp].fl_files jz frol9 cbw push ax call bcsroff pop ax imul bx mov dx,[bp].fl_home tst ax _if s add cx,ax _ifn c push ax sub cx,ax mov ax,cx div bl mov cl,ah clr ch pop ax _endif add dx,ax _ifn c cmp al,-1 _if e clr ax _endif clr dx _endif _else add cx,ax _repeat cmp cx,[bp].fl_files _break b sub cx,bx _until pushm mov ax,[bp].fl_tsy sub al,[bp].fl_wsy sbb ah,0 mul bx mov bx,ax popm add dx,ax cmp dx,bx _if a cmp al,1 _if e clr ax _endif mov dx,bx _endif _endif mov [bp].fl_bcsr,cx mov [bp].fl_home,dx cmp al,1 _if e mov al,[bp].fl_wsy dec al mul byte ptr hfiles add dx,ax _endif jmp fscroll1 viewroll endp flpageln proc mov al,[bp].fl_wsy test edtsw,EDT_PGHALF _ifn z shr al,1 _if z inc ax _endif ret _endif dec ax ret flpageln endp ;--- Set cursor position --- ;--> CX :new position ;<-- ; AL :0=hold, 1=rollup, -1=rolldown, else dump ; DX :display ptr fsetcsr proc mov [bp].fl_bcsr,cx push bx mov bx,hfiles mov ax,cx cwd div bx mov dx,[bp].fl_home cmp cx,dx _if b push dx mul bx mov dx,ax pop ax sub ax,cx cmp ax,bx mov al,-1 jbe fset8 jmps fset2 _else push ax mov ax,dx cwd div bx pop dx mov cx,dx sub dx,ax mov al,[bp].fl_wsy cbw cmp dx,ax mov dx,ax mov al,0 jb fset9 _if e mov ax,cx mul bx mov dx,ax add [bp].fl_home,bx mov al,1 jmps fset9 _endif mov ax,cx inc ax sub ax,dx mul bx mov dx,ax _endif fset2: mov al,2 fset8: mov [bp].fl_home,dx fset9: pop bx ret fsetcsr endp ;----- Set home position ----- ;--> CX :files fsethome proc mov ax,cx cwd div bx push ax mov bx,hfiles mov ax,[bp].fl_home cwd div bx pop dx sub dx,ax mov al,[bp].fl_wsy cbw cmp dx,ax _if l mov [bp].fl_home,0 _endif ret fsethome endp ;--- Get pool pointer --- ;<-- ; DX:BX :pool ptr getpoolp proc mov bx,[bp].fl_bcsr getpoolp1: mov ax,type _dir mul bx add ax,[bp].fl_pooltop mov bx,ax mov dx,[bp].fl_seg cmp bx,[bp].fl_poolend ret getpoolp endp ;--- Change drive --- do_drive proc msdos F_CURDRV mov bx,offset cgroup:mn_drive mov [bx].mn_sel,al clr si clr dx call popupmenu do_drive1: _ifn c mov dl,PRS_DRV call setdrive _ifn c call newpath0 _endif clc _endif ret do_drive endp draw_drive proc tst ah jnz sel_drive push ax msdos F_VERSION cmp al,3 pop ax _if b add al,'A' call putc mov al,':' _else pushm mov bl,al inc bl msdos F_IOCTRL,8 mov dx,'()' _ifn c tst ax mov dx,'==' _ifn z mov dx,'[]' _endif _endif mov al,dh call putc call putspc mov al,bl add al,'A'-1 call putc call putspc mov al,dl popm _endif call putc call putspc ret sel_drive: sub al,'A' ret draw_drive endp ;--- Change mask --- do_mask proc mov ax,maskbit or ax,hidden or ax,archive mov menubit,ax mov cl,MNU_FMASK call sysmenu _ifn c mov dl,al call selmask call newpath0 clc _endif ret do_mask endp selmask proc push dx mov dl,MNU_FMASK call schsysmenu pop dx _if c selwild: mov maskbit,0 mov si,offset cgroup:mask_all jmp setmask1 _endif mov di,si add di,type _menu push ax call setmsgp pop ax mov cl,dl mov dx,1 shl dx,cl lodsb push ax call skipspc mov cl,al pop ax cmp cl,'.' je selmsk1 cmp cl,'*' _if e selmsk1: mov maskbit,dx jmp setmask1 _endif cmp cl,'<' _if e cmp al,'T' je mask_text cmp al,'B' je mask_bin cmp al,'A' je mask_archive cmp al,'H' je mask_hidden ret _endif mov cx,1 jmps dopath1 mask_bin: mov al,FT_BIN skip2 mask_text: mov al,FT_TEXT test maskbit,dx _ifn z mov al,FT_ALL clr dx _endif mov flbinary,al mov maskbit,dx mov si,offset cgroup:mask_all jmp setmask2 mask_hidden: xor hidden,dx ret mask_archive: xor archive,dx ret selmask endp ;--- Input new path --- do_path proc ; mov refloc,0 ; mov dx,word ptr [bp].fl_wpx ; add dx,0001h ; mov refloc,dx mov si,fbuf mov cx,PATHSZ mov dl,W_PATH call windgets jc dopath9 jcxz do_vzpath dopath1: call parsepath1 call setaccdir jc dopath9 call setmask call newpath0 dopath9:ret do_path endp do_vzpath proc mov dl,MNU_VZPATH call schsysmenu mov ax,0 mov bx,offset cgroup:mn_vzpath _ifn c mov bx,si mov ax,si add ax,type _menu _endif push ax mov di,pathbuf mov si,offset cgroup:nm_path call setenvvar pop di jnc dopath9 push di mov word ptr vzpathp.@off,si mov word ptr vzpathp.@seg,ax mov al,-1 call scanvzpath movseg ds,ss mov [bx].mn_c,cl cmp cl,[bx].mn_sel _if be dec cl mov [bx].mn_sel,cl _endif mov [bx].mn_ext,offset cgroup:draw_vzpath clr dx pop si call popupmenu _ifn c call scanvzpath mov di,ss:pathbuf push di call wrdcpy pop si movseg ds,ss inc cx call dopath1 clc _endif ret draw_vzpath: tst ah _if z push ax add al,'1' cmp al,'9' _if a sub al,'A'-'1'-9 _endif call putc call putspc pop ax call scanvzpath call puts_s _else call sel_number _endif ret scanvzpath: lds si,vzpathp cbw mov cx,ax jcxz setvp9 _repeat call skipchar jc setvp1 _loop setvp9: ret setvp1: not cx inc cx ret do_vzpath endp ;--- Sort option --- do_sort proc mov ax,word ptr sortopt mov menubit,ax mov cl,MNU_FSORT call sysmenu _ifn c mov cl,al mov al,1 shl al,cl cmp al,sortopt _if e clr al _endif mov sortopt,al call newpath0 clc _endif ret do_sort endp ;--- Change view mode --- do_view proc xor hfiles,4 call redump tstb fldual _ifn z push bp mov bp,[bp].fl_back call redump pop bp _endif ret do_view endp ;--- Single/dual window --- do_dual proc xor fldual,1 _ifn z mov bx,[bp].fl_back mov [bx].fl_which,TRUE push bp mov bp,bx call setcurpath call clrpath call newpath1 pop bp call redump ; ##153.36 call setcurpath jmps dowind1 _endif tstb [bp].fl_which _ifn z call dowind1 mov [bp].fl_which,FALSE _endif call redump ret do_dual endp ;--- Change window --- do_window proc tstb fldual jz dowind9 dowind1: call setflwind call bcsroff mov bx,[bp].fl_back xchg bx,bp mov actwkp,bp call setflwind call setcurpath call bcsron dowind9:ret do_window endp chkdual proc tstb fldual jz chkdu9 cmp hfiles,5 je chkdu9 pop ax jmp dowind1 chkdu9: ret chkdual endp ;--- To current dir --- do_tocd proc tstb [bp].fl_curf _ifn z ; mov [bp].fl_curf,FALSE mov si,curdir lea di,[bp].fl_lastpath call strcpy lea si,[bp].fl_path mov di,curdir push si call strcpy pop si tstb fldual _ifn z push bp mov bp,[bp].fl_back ; mov al,TRUE ; ##151.13 ; xchg [bp].fl_curf,al ; tst al ; _ifn z ; lea di,[bp].fl_path ; call iscurdir ; _endif call setflwind call drawpath pop bp _endif call setflwind call drawpath _endif ret do_tocd endp iscurdir proc ; ##151.13 mov si,curdir lea di,[bp].fl_path call strcmp mov al,TRUE _if e mov al,FALSE _endif mov [bp].fl_curf,al ret iscurdir endp ;--- Return to current dir --- do_retcd proc tstb [bp].fl_curf _if z lea si,[bp].fl_lastpath tstb [si] _ifn z lea di,[bp].fl_path call strcpy jmps retcd1 _endif _else ; mov [bp].fl_curf,FALSE lea si,[bp].fl_path lea di,[bp].fl_lastpath call strcpy mov si,curdir lea di,[bp].fl_path call strcpy retcd1: call setcurpath call newpath0 _endif ret do_retcd endp ;--- Select all --- do_all proc push ds lds bx,dword ptr [bp].fl_pooltop clr cx doall1: cmp bx,[bp].fl_poolend jae doall4 mov al,[bx].dr_attr test al,FA_DIREC _if z xor al,FA_SEL mov [bx].dr_attr,al ; ##157.xx _endif test al,FA_SEL _ifn z inc cx _endif add bx,type _dir jmp doall1 doall4: pop ds mov [bp].fl_selcnt,cx call setflwind call dumpfile call drawdiskinfo ret do_all endp ;----- Cancel all ----- do_cancel proc push ds lds bx,dword ptr [bp].fl_pooltop _repeat cmp bx,[bp].fl_poolend _break ae and [bx].dr_attr,not FA_SEL add bx,type _dir _until clr cx jmp doall4 do_cancel endp ;--- Compare directory --- do_compare proc _repeat mov ax,word ptr dcmpopt shl ax,1 mov menubit,ax mov cl,MNU_FCOMP push dx call sysmenu pop dx jc docmp9 tst al jz docmp2 mov cl,al mov al,80h rol al,cl xor dcmpopt,al _until docmp8: popm call setflwind call dumpfile call drawdiskinfo clc docmp9: ret docmp2: tstb fldual jz docmp9 mov [bp].fl_selcnt,0 mov cl,dcmpopt pushm lds bx,dword ptr [bp].fl_pooltop movseg es,ds docmp3: cmp bx,[bp].fl_poolend jae docmp8 test [bx].dr_attr,FA_DIREC jmpln z,docmp7 lea si,[bx].dr_pack pushm mov bp,[bp].fl_back mov bx,[bp].fl_pooltop _repeat cmp bx,[bp].fl_poolend _break ae lea di,[bx].dr_pack pushm mov cx,PACKSZ repe cmpsb popm je docmp6 add bx,type _dir _until popm test cl,DCMP_EXIST jnz docmp_sel jmps docmp_x docmp6: mov di,bx popm test cl,DCMP_NEW+DCMP_OLD+DCMP_LARGE+DCMP_SMALL jz docmp_x test cl,DCMP_NEW+DCMP_OLD jz docmp_l ldl [bx].dr_time cmpl [di].dr_time je docmp_x jb docmp_o test cl,DCMP_NEW jz docmp_x jmps docmp_l docmp_o:test cl,DCMP_OLD jz docmp_x docmp_l: test cl,DCMP_LARGE+DCMP_SMALL jz docmp_sel ldl [bx].dr_size cmpl [di].dr_size je docmp_x jb docmp_s test cl,DCMP_LARGE jz docmp_x jmps docmp_sel docmp_s:test cl,DCMP_SMALL jz docmp_x docmp_sel: or [bx].dr_attr,FA_SEL inc [bp].fl_selcnt docmp7: add bx,type _dir jmp docmp3 docmp_x: and [bx].dr_attr,not FA_SEL jmps docmp7 do_compare endp ;--- Execute DOS command --- do_execmnu proc mov dl,MNU_FEXEC ; call isbottom test flmode,FM_EXEC _if z tstw walkmnu _if z tstw [bp].fl_selcnt _if z do_shell: dec execcmd ret _endif _endif _endif skip2 do_filemnu: mov dl,MNU_FFILE call schsysmenu jc doexec_x mov bx,si clr si clr ax call cmdmenu jc doexec_x cmp ah,MCHR_CMD _if e add sp,4 mov refloc,0 jmp do_filer _endif cbw doexec2: mov di,si call strlen mov cx,ax mov al,TAB repne scasb _if e or dossw,DOS_BOXTTL mov menumsgp,si mov si,di call skipspc _endif mov execcmd,si set_poolp: mov ax,[bp].fl_pooltop tstw [bp].fl_selcnt _if z clr ax _endif mov [bp].fl_poolp,ax ret doexec_x: stc ret do_execmnu endp do_exec1 proc ; call isbottom mov si,bx ; bx=pm jmp doexec2 do_exec1 endp ;----- File Attribute ----- do_attr proc ; call isbottom ; mov refloc,0 push ds call getpoolp mov ds,dx mov al,[bx].dr_attr pop ds test al,FA_ARCH _ifn z or al,1000b _endif and al,1111b _repeat mov attrbit,al cbw mov menubit,ax mov cl,MNU_FATTR clr dx call sysmenu jc doattr9 cmp al,FATTRCNT _break e mov cl,al mov al,1 shl al,cl xor al,attrbit _until mov di,offset cgroup:do_attr1 call do_selfiles jc doattr9 call newpath1 clc doattr9: ret do_attr endp do_attr1 proc push ds call copy_pack1 movseg ds,ss mov cl,attrbit test cl,1000b _ifn z and cl,0111b or cl,FA_ARCH _endif clr ch msdos F_ATTR,1 pop ds ret do_attr1 endp ;----- Delete ----- do_delete proc ; call isbottom mov dl,M_DELETE mov ax,[bp].fl_selcnt tst ax _if z inc ax _endif push ax mov bx,sp call dispask pop ax _if a mov di,offset cgroup:do_delete1 call do_selfiles _ifn c call newpath1 _endif _endif ret do_delete endp do_delete1 proc push ds call copy_pack1 test [bx].dr_attr,FA_DIREC movseg ds,ss mov ah,F_DELETE _ifn z mov ah,F_RMDIR _endif int 21h pop ds ret do_delete1 endp ;----- Rename ----- do_rename proc ; call isbottom ; mov refloc,0 push bx call getpoolp pop si jae doren9 xchg si,bx mov di,nbuf mov ds,dx push di movseg es,ss call copyafile pop si movseg ds,ss mov cx,32 mov dl,W_RENFILE call windgetsc jc doren9 jcxz doren9 mov di,si call strskip tstb [si] jz doren9 mov dx,si msdos F_RENAME jc doren9 call newpath1 doren9: ret do_rename endp copy_pack1 proc mov si,bx mov di,ss:tmpbuf push di movseg es,ss call copyafile pop dx ret copy_pack1 endp ;----- Make Dir ----- do_makedir proc ; mov refloc,0 mov si,nbuf mov cx,32 mov dl,W_MKDIR call windgets mov ah,F_MKDIR jmps makepath do_makedir endp ;----- Make New file ----- do_newfile proc ; mov refloc,0 lea ax,[bp].fl_path push curdir mov curdir,ax mov si,fbuf mov cx,PATHSZ mov dl,W_NEW call windgets pop curdir movhl ax,F_ATTR,0 makepath: jc donew9 jcxz donew9 makepath1: push ax mov di,pathbuf push di push si lea si,[bp].fl_path call strcpy call addsep pop si call wrdcpy pop dx pop ax push ax cmp ah,F_MKDIR _if e int 21h _else int 21h jnc new_x clr cx msdos F_CREATE _ifn c mov bx,ax msdos F_CLOSE _endif _endif jc new_x call skipspc pop ax jnc makepath1 donew8: call newpath1 donew9: ret new_x: pop ax jmp donew8 do_newfile endp ;----- Do select files ----- ;--> DI :calling proc. ;<-- CY :nop do_selfiles proc push ds tstw [bp].fl_selcnt _if z push dx push ax call getpoolp pop ax jae doself_x mov ds,dx pop dx push di call di pop di _else lds bx,dword ptr [bp].fl_pooltop _repeat cmp bx,[bp].fl_poolend _break ae test [bx].dr_attr,FA_SEL _ifn z push di call di pop di _endif add bx,type _dir _until _endif pop ds clc ret doself_x: pop dx pop ds stc ret do_selfiles endp ;--- Quick exec for special EXT --- isspecext proc push es lea si,[bx].dr_pack call skip_ext jz noext movseg es,ds movseg ds,ss mov di,si mov dl,MNU_FQUICK call schsysmenu jc noext mov cl,[si].mn_c clr ch inc cx add si,type _menu _repeat mov al,[si] pushm call wrdicmp popm _if c cmp fllastcmd,CM_CR _if e call islower jc specext _else call isupper jc specext _endif _endif call strskip _loop noext: pop es ret specext: call skipchar mov execcmd,si pop es pop ax pop ax ret isspecext endp ;--- Init dump window --- initflwind proc call dosheight sub ch,4 movhl dx,2,1 mov ax,[bp].fl_files cmp hfiles,5 _if e tstb fldual _ifn z shr ch,1 dec ch tstb [bp].fl_which _ifn z add dh,ch add dh,2 _endif _endif mov cl,5 div cl mov cl,WD-2 tst ah _ifn z inc al clr ah _endif _else mov cl,WD/2-2 tstb [bp].fl_which _ifn z mov dl,WD/2+1 _endif _endif mov [bp].fl_tsy,ax tst ah jnz iwind3 cmp al,ch ja iwind3 mov ch,al iwind3: mov word ptr [bp].fl_wpx,dx mov word ptr [bp].fl_wsx,cx call setwindow call initcsrpos ret initflwind endp setflwind proc mov dx,word ptr [bp].fl_wpx mov cx,word ptr [bp].fl_wsx call setwindow ret setflwind endp ;--- Init cursor position --- initcsrpos proc push es push ds mov si,pathbuf tstb [si] jz ibcsr2 call strlen pushm lea si,[bp].fl_path call strlen popm cmp ax,cx ja ibcsr3 add si,ax cmp byte ptr [si],'\' _if e inc si _endif cmp byte ptr [si],'/' _if e inc si _endif clr cx les di,dword ptr [bp].fl_pooltop add di,dr_pack _repeat cmp di,[bp].fl_poolend jae ibcsr3 call stricmp je ibcsr8 inc cx add di,type _dir _until ibcsr2: mov cx,[bp].fl_bcsr _ifn cxz cmp cx,[bp].fl_files jb ibcsr8 _endif mov [bp].fl_home,0 lds bx,dword ptr [bp].fl_pooltop clr cx _repeat cmp bx,[bp].fl_poolend _break ae test [bx].dr_attr,FA_DIREC jz ibcsr8 add bx,type _dir inc cx _until ibcsr3: clr cx ibcsr8: pop ds call fsetcsr pop es ret initcsrpos endp ;--- Draw window frame --- drawflframe proc mov al,ATR_WFRM call dispframe call drawpath call drawdiskinfo ret drawflframe endp ;--- Draw disk info. --- drawdiskinfo proc mov dx,word ptr [bp].fl_wsx sub dl,PX_FILES call locate call fillset mov dx,[bp].fl_selcnt mov cx,dx tst cx jnz drfile1 mov dx,[bp].fl_files dec dx mov al,ATR_W1ST ; ##153.47 tstb [bp].fl_overflow jnz drfile2 drfile1:mov al,ATR_WTXT drfile2:push dx call setatr mov bx,sp mov si,offset cgroup:pf_files call printf inc sp inc sp mov al,ATR_WFRM _ifn cxz mov al,ATR_W1ST _endif mov si,offset cgroup:mg_files mov dl,PX_FILES-PX_FREE call drfile3 mov al,ATR_WTXT call setatr ldl [bp].fl_free _ifn cxz call sumselsize _endif push dx push ax mov bx,sp mov si,offset cgroup:pf_free call printf add sp,4 tst cx _if z mov al,ATR_WFRM mov si,offset cgroup:mg_free _else mov al,ATR_W1ST mov si,offset cgroup:mg_total _endif mov dl,PX_FILES drfile3: call setatr call putmg mov al,ATR_WFRM call setatr2 mov al,GRC_H call fillc ret drawdiskinfo endp ;--- Sum select files size --- ;<-- DX:AX size sumselsize proc clr ax clr dx mov bx,bp tstb fldual _ifn z mov bx,[bp].fl_back _endif mov cx,[bx].fl_clust dec cx mov di,offset cgroup:sumselsize1 call do_selfiles ret sumselsize endp sumselsize1 proc mov di,word ptr [bx].dr_size add di,cx _ifn c ; ##100.22 not cx and di,cx not cx add ax,di _endif adc dx,word ptr [bx].dr_size+2 ret sumselsize1 endp ;--- Draw path name --- drawpath proc call iscurdir ; ##151.13 movhl dx,-1,PX_TTL call locate mov al,ATR_WTXT call setatr tstb [bp].fl_curf _if z call revatr _endif call putspc lea si,[bp].fl_path call puts mov al,dirchr cmp byte ptr [si-2],al _ifn e call putc _endif lea si,[bp].fl_mask call puts call putspc call getloc mov [bp].fl_ttlsx,dl mov al,ATR_WTXT call setatr ret drawpath endp ;--- Draw outer region --- drawouter proc call doswindow mov cl,WD ; ##156.123 mov al,fldual mov ah,[bp].fl_which cmp hfiles,5 _if e tst al _ifn z tst ah _if z shr ch,1 _endif _endif clr dl _else tst al _if z inc dh dec ch mov dl,WD/2 mov cl,WD/2 call putcurwind call dosheight _endif mov dl,[bp].fl_wpx dec dl mov cl,WD/2 _endif mov dh,[bp].fl_wpy add dh,[bp].fl_wsy inc dh sub ch,dh _if g call putcurwind _endif ret drawouter endp ;--- Dump files --- dumpfile proc tstb [bp].fl_wsy _ifn z mov ax,type _dir mul [bp].fl_home mov bx,[bp].fl_pooltop add bx,ax clr dh _repeat call dumpline inc dh cmp dh,[bp].fl_wsy _while b _endif ret dumpfile endp dumpline proc clr dl call locate dumpl1: push ds mov ds,[bp].fl_seg call set_flatr call fillset cmp bx,[bp].fl_poolend _if e pop ds mov si,offset cgroup:mg_eod mov al,'-' tstb [bp].fl_overflow _ifn z mov si,offset cgroup:mg_ovf mov al,'*' _endif cmp ss:hfiles,5 _if e call putmg jmps dumpl5 _endif push ax call putspc pop ax push ax mov cl,11 call repputc call putmg pop ax call repputc jmps dumpl6 _endif ; cmp bx,[bp].fl_poolend ; ##156.127 _if b test ss:flmode,FM_FDCSR _if z test [bx].dr_attr,FA_SEL _ifn z call revatr _endif call putspc _else clr ah call put_marker _endif call dumpname _endif pop ds mov dl,14 ; ##156.119 call fillspc cmp ss:hfiles,5 _if e dumpl5: mov al,ATR_WTXT call setatr add bx,type _dir call getloc cmp dl,77 jae dumpl9 mov dl,16 call fillspc jmp dumpl1 _endif ; mov dl,14 ; call fillspc call dumpinfo dumpl6: call putspc add bx,type _dir dumpl9: ret dumpline endp dumpname proc lea si,[bx].dr_pack test [bx].dr_attr,FA_DIREC _ifn z call puts mov al,ss:dirchr call putc _else _repeat lodsb tst al _break z cmp al,'.' _break z call iskanji _if c push dx mov dh,al lodsb mov dl,al call putcw pop dx _else call putc _endif _until push ax mov dl,9 call fillspc pop ax tst al _ifn z call putc call puts _endif _endif ret dumpname endp dumpinfo proc pushm mov es,[bp].fl_seg test es:[bx].dr_attr,FA_DIREC _ifn z mov si,offset cgroup:mg_dir call putmg _else push bx ldl es:[bx].dr_size pushm mov bx,sp mov si,offset cgroup:pf_size call printf add sp,4 pop bx _endif IFDEF US mov dl,22 ; ##156.119 ELSE mov dl,23 ENDIF call fillspc push bx IFDEF US ; ##156.92 mov si,bx ; mov ch,byte ptr syssw+1 ; and ch,SW_US / 256 ;_if z ; call putspc ;_endif mov ax,es:[si].dr_time mov dx,ax mov cl,5 shr dx,cl and dx,111111b rol ax,cl and ax,11111b clr bx ; tst ch ;_ifn z mov bl,'a' cmp al,12 _if ae mov bl,'p' _endif tst al _if z add al,12 _endif cmp al,12 _if a sub al,12 _endif ;_endif pushm mov ax,es:[si].dr_date mov bx,ax and bx,11111b mov dx,ax shr dx,cl and dx,1111b mov cl,9 shr ax,cl add al,80 cmp al,100 _if ae sub al,100 _endif ; tst ch ;_ifn z xchg ax,dx xchg bx,dx ;_endif pushm mov bx,sp mov si,offset cgroup:pf_time call printf add sp,12 ELSE mov ax,es:[bx].dr_time mov dx,ax mov cl,5 shr ax,cl and ax,111111b push ax rol dx,cl and dx,11111b push dx mov ax,es:[bx].dr_date mov dx,ax and ax,11111b push ax mov ax,dx shr ax,cl and ax,1111b push ax mov cl,9 shr dx,cl add dx,80 cmp dx,100 _if ae sub dx,100 _endif push dx mov bx,sp mov si,offset cgroup:pf_time call printf add sp,10 ENDIF pop bx popm ret dumpinfo endp ;----- Set filer attribute ------ set_flatr proc push bp clr al cmp bx,[bp].fl_poolend _if b mov al,[bx].dr_attr _endif mov ah,al and ah,FA_DIREC+FA_BINARY mov cl,5 shl al,cl or al,ah mov bp,offset cgroup:flatrtbl mov cx,FLATRCNT-1 _repeat shl al,1 _break c inc bp _loop mov al,[bp] tst al _if z mov al,ATR_WTXT call setatr _else call set_attr _endif pop bp ret set_flatr endp ;----- Put select marker ----- ;--> AH :cursor mode put_marker proc call getatr1 push ax test [bx].dr_attr,FA_SEL _if z mov al,SPC _else tst ah _if z mov al,ATR_WTXT call setatr _endif mov al,'*' _endif call putc pop ax call setatr1 ret put_marker endp ;--- Block cursor on/off --- bcsron proc mov ah,TRUE skip2 bcsroff: mov ah,FALSE pushm push ax call getpoolp mov ds,dx call set_flatr mov dl,al pop ax push ax tst ah _ifn z test ss:flmode,FM_FDCSR _if z mov al,ATR_BCSR call setatr test [bx].dr_attr,FA_SEL _ifn z cmp al,dl _if e mov al,ATR_WTXT call setatr _endif _endif call undatr _else call revatr _endif _endif call bcsrloc mov cl,14 cmp ss:hfiles,5 _ifn e mov cl,38 _endif test ss:flmode,FM_FDCSR _if z cmp bx,[bp].fl_poolend ; ##156.127 _if b test [bx].dr_attr,FA_SEL _ifn z call revatr _endif _endif test ss:hardware,IDN_PC98 _if z dec cx call fillatr pop ax push ax tst ah _ifn z call undatr _endif mov cl,1 _endif call fillatr _else call locate pop ax push ax call put_marker inc dl dec cx call fillatr _endif pop ax popm ret bcsron endp bcsrloc proc mov ax,[bp].fl_bcsr bcsrloc1: sub ax,[bp].fl_home cwd div ss:hfiles shlm dx,4 mov dh,al ret bcsrloc endp ;--- Init pool ptr --- ;<-- BX :pool ptr initpoolp proc mov di,pool tstb fldual _ifn z mov bx,[bp].fl_back mov si,[bx].fl_pooltop tst si _ifn z mov cx,[bx].fl_poolend sub cx,si pushm mov ds,[bp].fl_seg movseg es,ds call memmove popm mov ax,si sub ax,di sub [bx].fl_pooltop,ax sub [bx].fl_poolend,ax sub [bx].fl_poolp,ax add di,cx _endif _endif mov bx,di mov [bp].fl_pooltop,bx mov [bp].fl_poolp,bx ret initpoolp endp ;--- Read directory --- ;--> BX :pool ptr readdir proc mov [bp].fl_overflow,FALSE mov dx,tmpbuf3 msdos F_SETDTA clr cx ; CX :file counter lea si,[bp].fl_mask mov di,offset cgroup:mask_all mov dl,FA_DIREC cmp word ptr [si],'*' _ifn e push di call strcmp pop di _ifn e mov dl,FA_DIREC+FA_SEL _endif _endif mov ah,F_FINDDIR mov si,bx _repeat call getdir _until c test dl,FA_SEL jz readdir8 lea si,[bp].fl_mask cmp word ptr [si],'.' _if e mov si,extlist _endif _repeat call skipspc _break c mov di,pathbuf2 push di cmp byte ptr [si],'.' _if e mov al,'*' stosb _endif clr ah _repeat lodsb stosb cmp al,'.' _if e mov ah,TRUE _endif cmp al,SPC _while a dec si dec di tst ah _if z mov ax,'*.' stosw _endif clr al stosb pop di mov ah,F_FINDDIR push si mov si,bx _repeat mov dl,FA_SEL call getdir _until c pop si tst si _until z readdir8: inc cx ; End of dir mov [bp].fl_poolend,bx tstw [bp].fl_files ; ##16 _if z mov [bp].fl_bcsr,0 _endif cmp cx,[bp].fl_bcsr _if b mov ax,cx dec ax mov [bp].fl_bcsr,ax _endif mov [bp].fl_files,cx mov [bp].fl_selcnt,0 call fsethome mov dl,0 msdos F_GETDRV cmp ax,-1 _ifn e ; ##100.13 mul cx mov [bp].fl_clust,ax mul bx stl [bp].fl_free _endif ret readdir endp ;--- Get one dir --- ;--> ; AH :funcion No. ; BX :pool ptr (update) ; CX :file count (update) ; DL :file attr ; SI :sort start ptr ; DI :mask string ;<-- ; CY :no more files getdir proc cmp bx,poolend _if ae mov [bp].fl_overflow,TRUE stc getd9: ret _endif tstw hidden _ifn z or dl,FA_SYSTEM+FA_HIDDEN _endif call finddir jc getd9 pushm push si mov si,tmpbuf3 add si,dta_attr mov es,[bp].fl_seg push cx mov di,bx and byte ptr [si],not FA_SEL ; ##156.104 mov cx,dta_pack-dta_attr rep movsb mov cx,PACKSZ push di clr al rep stosb pop di push di call strcpy pop si movseg ds,es test ss:dspsw,DSP_PATHCASE _ifn z call strlwr _endif pop cx test dl,FA_SEL _ifn z mov al,[bx].dr_attr xor al,dl test al,FA_DIREC jnz getd4 _endif mov si,bx add si,dr_pack cmp word ptr [si],'.' je getd4 test [bx].dr_attr,FA_DIREC jnz getd3 tstw ss:archive _ifn z test [bx].dr_attr,FA_ARCH jz getd4 _endif call skip_ext jz chktype push cx call isbinary mov al,FT_ALL tst ch _ifn z or [bx].dr_attr,FA_BINARY mov al,FT_BIN _endif pop cx chktype: mov dh,ss:flbinary tst dh _ifn z _if g ; FT_TEXT mov dh,FT_ALL _endif cmp al,dh jne getd4 _endif getd3: pop si push si tstb ss:sortopt _ifn z call sortdir _endif inc cx add bx,type _dir mov [bx].dr_attr,0 getd4: pop si popm cmp ah,F_FINDDIR jne getd8 inc ah getd8: clc ret getdir endp skip_ext proc _repeat lodsb tst al _break z cmp al,'.' _until e tst al ret skip_ext endp ;--- Sort directory --- ;--> ; SI :sort start ptr ; BX :current ptr sortdir proc pushm sort1: cmp si,bx je sort9 cmp word ptr [si].dr_pack,'..' je sort2 mov di,bx mov al,[si].dr_attr mov ah,al xor ah,[di].dr_attr test ah,FA_DIREC jnz sort3 mov cl,ss:sortopt test cl,not SORT_DIR _ifn z pushm test cl,SORT_NAME+SORT_EXT _ifn z call byname _else test cl,SORT_NEW+SORT_OLD _ifn z call bytime _else call bysize _endif _endif popm ja sort4 _endif sort2: add si,type _dir jmp sort1 sort3: mov dx,type _dir test al,FA_DIREC jnz sort2 sort4: mov dx,type _dir push di mov cx,di add cx,dx sub cx,si mov di,si add di,dx call memmove mov di,si pop si add si,dx mov cx,dx call memmove sort9: popm ret sortdir endp ;--- Compare by name --- ;--> ; SI-DI :dir ptr ; DL :sort option byname proc add si,dr_pack add di,dr_pack test cl,SORT_EXT _if z mov cx,12 _else pushm call skip_ext dec si mov al,'.' _repeat scasb _break e tstb es:[di-1] _until z dec di mov cx,4 repz cmpsb popm jne bynam9 mov cx,8 _endif repz cmpsb bynam9: ret byname endp ;--- Compare by time/size --- ;--> ; SI-DI :dir ptr ; DL :sort option bysize proc add si,dr_size-dr_time add di,dr_size-dr_time mov ch,SORT_LARGE jmps bytime1 bytime proc mov ch,SORT_NEW bytime1:ldl [si].dr_time cmpl [di].dr_time lahf test cl,ch _ifn z xor ah,1 _endif sahf ret bytime endp bysize endp ;----- Speed Seach ----- ; ##156.101 ;--> DL :key do_search proc push ds and dl,not 20h ; to upper push dx call getpoolp mov ds,dx pop dx mov cx,bx _repeat dosrch1: add bx,type _dir cmp bx,[bp].fl_poolend _if a mov bx,[bp].fl_pooltop _endif cmp bx,cx je sch_ng cmp bx,[bp].fl_poolend je dosrch1 mov al,[bx].dr_pack and al,not 20h cmp al,dl _until e sub bx,[bp].fl_pooltop mov ax,bx cwd mov cx,type _dir div cx mov cx,ax pop ds jmp fscroll sch_ng: pop ds ret do_search endp ;--- Check DIR in pool --- ; ##156.100 ;<-- CY :exist check_dir proc push ds lds bx,dword ptr [bp].fl_pooltop _repeat mov al,[bx].dr_attr and al,FA_SEL+FA_DIREC cmp al,FA_SEL+FA_DIREC je exist_dir add bx,type _dir cmp bx,[bp].fl_poolend _while b pop ds clc ret exist_dir: pop ds stc ret check_dir endp endcs eseg ;--- Get path from pool --- ;--> ; AL :full path ; ES:DI :result path ptr ;<-- ; BX :name ptr public getpool getpool proc pushm movseg ds,ss mov bp,actwkp call cpyaccdir call mappoolseg call copyafile popm ret getpool endp copyafile proc mov ah,[si] ; ##156.100 add si,dr_pack ; call strcpy ; test ah,FA_DIREC ;_if z ; tstb [si] ; _ifn z ; mov al,'.' ; stosb call strcpy ; _endif ;_endif ret copyafile endp assume ds:nothing ;--- Search next file in pool --- ;--> CY :no more files public nextpool nextpool proc pushm mov bp,actwkp mov ds,[bp].fl_seg ; SS != CS call nextpool1 mov [bp].fl_poolp,si popm ret nextpool1: call mappoolseg _ifn c mov al,byte ptr ss:basemode cmp al,SYS_FILER je npool2 _repeat cmp si,[bp].fl_poolend jae npool3 test [si].dr_attr,FA_SEL _break nz npool2: add si,type _dir _until cmp al,SYS_FILER _ifn e and [si].dr_attr,not FA_SEL dec [bp].fl_selcnt _endif _endif clc ret npool3: clr si stc ret nextpool endp mappoolseg proc mov ax,farseg call ems_map mov ds,ax mov si,[bp].fl_poolp tst si _if z pushm call getpoolp mov si,bx popm mov [bp].fl_poolp,si stc _endif ret mappoolseg endp ;----- Scan first file ----- scan_1st proc call getpoolp mov ds,dx tstw [bp].fl_selcnt jz sc1st9 mov bx,[bp].fl_pooltop _repeat cmp bx,[bp].fl_poolend _break ae test [bx].dr_attr,FA_SEL _break nz add bx,type _dir _until sc1st9: ret scan_1st endp ;----- Open from 2nd window ----- public chk_fldual chk_fldual proc push bp tstb fldual _ifn z mov bp,actwkp mov bp,[bp].fl_back tstw [bp].fl_selcnt _ifn z mov actwkp,bp _endif _endif pop bp ret chk_fldual endp assume ds:cgroup ;--- Get pooled file name --- ;--> DS:SI :file name public poolnamep poolnamep proc push bp mov bp,actwkp mov ds,[bp].fl_seg mov si,[bp].fl_poolp tst si _ifn z add si,dr_pack _endif pop bp ret poolnamep endp ;--- Copy access directory --- cpyaccdir proc mov bx,di lea si,[bp].fl_path tstb [bp].fl_curf _if z tst al jz cpyac9 call strcpy call addsep mov bx,di ret _endif call strcpy call addsep cpyac9: ret cpyaccdir endp ;--- Select drive --- ;--> AL :drive No. (A=0) ;<-- CY :error (AL :drive count) seldrv proc mov dl,al msdos F_SELDRV cmp al,26 ; ##156.120 _if a mov al,26 _endif mov drive_c,al cmp dl,al _if b clc ret _endif stc ret seldrv endp ;--- Change path --- ;--> SI :dir name ptr public chgpath,chpath chgpath: test dl,PRS_DRV jnz chpath jmps chpath1 setcurpath proc lea si,[bp].fl_path chpath: lodsb inc si and al,1Fh ; ##100.01 dec al call seldrv chpath1:mov dx,si msdos F_CHDIR ret setcurpath endp ;--- Set access dir --- ;<-- CY :path not found setaccdir proc mov si,pathp lea di,[bp].fl_path mov dl,parsef tst si jz setac1 test dl,PRS_DRV+PRS_DIR jnz setac2 setac1: mov si,di call chpath jnc setac9 resetaccdir: lea di,[bp].fl_path ; ##156.?? cmp ax,-1 ; ##152.15 jne getaccdir mov si,curdir ; ##151.12 call chpath mov [bp].fl_files,0 jmps getaccdir setac2: test dl,PRS_DRV _if z xchg si,di _endif lodsb inc si and al,1Fh ; ##100.01 dec al test dl,PRS_DRV jnz setdrive xchg si,di setdrive: push dx call seldrv pop dx jc setac_x mov di,pathbuf2 test dl,PRS_DIR jz getaccdir mov dx,di mov bx,getnamp mov al,[bx-1] call isslash _if e dec bx _endif setac4: movsb cmp si,bx jb setac4 clr al stosb msdos F_CHDIR jc setac_x1 mov di,dx getaccdir: push di call getcurdir1 pop si jc setac_x1 lea di,[bp].fl_path mov [bp].fl_files,0 ;; ##16 call strcpy setac9: clc ret setac_x1: call setcurpath setac_x:stc ret setaccdir endp ;--- Set mask --- public setmask setmask proc mov si,getnamp tst si jz stmsk9 call skipspc ; ##156.94 tstb [si] jz stmsk9 setmask1: mov flbinary,FT_ALL setmask2: lea di,[bp].fl_mask mov cx,MASKSZ-1 call strncpy stmsk9: ret setmask endp ;--- Spread execute command --- ;--> AX :exec command ptr ;<-- AX :multi file mode tb_spesym db "12*?!^:@\[FG" tb_spejmp: ofs spexe_s ofs spexe_d ofs spexe_a ofs spexesfile ofs spexe_go ofs spexe_ret ofs spexe_sd ofs spexe_ref1 ofs spexe_bslash ofs spexe_opt ofs spexe_getsf ofs spexe_gets public spreadexec spreadexec proc mov speflag,0 push bp mov bp,actwkp mov si,ax mov di,tmpbuf mov ax,farseg call ems_map clr dx _repeat cmp si,flcmdp _break e lodsb tst al _break z call spread1 _until tst dx _if z cmp di,tmpbuf je spexe8 cmp byte ptr es:[di-1],SPC _if be spexe8: call spexesdir call spexesfile _endif _endif mov al,LF stosb mov al,dl cbw ;; pop bp test speflag,SPE_CANCEL _ifn z stc _endif ret spread1: cmp al,'%' _ifn e stosb ret _endif mov ah,al lodsb push di mov di,offset cgroup:tb_spesym mov cx,offset tb_spejmp - offset tb_spesym push cx call scantbl pop bx pop di _ifn e mov al,ah stosb dec si ret _endif dec bx sub bx,cx shl bx,1 add bx,offset cgroup:tb_spejmp jmp cs:[bx] spexe_s: call spexesdir jmps spexesfile spexe_sd: push si ; mov bp,actwkp mov al,TRUE call cpyaccdir pop si or speflag,SPE_SRCDIR spexe91:ret spexe_d: tstb fldual jz spexe91 pushm ; mov bp,actwkp mov bp,[bp].fl_back lea si,[bp].fl_path tstb [si] _ifn z call strcpy _endif tstw [bp].fl_selcnt _ifn z call addsep push ds call spe_copyfile pop ds or speflag,SPE_DSTFILE _endif or speflag,SPE_DSTDIR popm ret spexe_bslash: cmp byte ptr es:[di-1],SPC _if a call addsep _endif ret spexe_ref1: mov al,[si] call isdigit jnc spexe_ref inc si sub al,'0' clr ah cmp ax,[bp].fl_selcnt jb spexe_ref spexe_a: push si mov al,FALSE mov dx,di mov di,offset cgroup:echo_all call do_selfiles mov di,dx pop si movhl dx,TRUE,0 ret spexesdir: push si ; mov bp,actwkp mov al,FALSE call cpyaccdir pop si ret spexesfile: ; mov bp,actwkp cmp [bp].fl_selcnt,1 _if a mov ax,'?%' stosw mov dl,-1 _else call spe_copyfile mov dh,TRUE _endif ret spexe_go: or dossw,DOS_GO ret spexe_ret: or dossw,DOS_RETURN ret spe_copyfile: pushm call scan_1st mov si,bx call copyafile popm ret spreadexec endp ;----- Write @filelist ----- spexe_ref proc mov al,'@' stosb push di cmp byte ptr [si],SPC _if be push si call get_refpath pop si _else call wrdcpy _endif pop dx pushm call open_file jc spref9 mov di,lbuf push dx pushm mov al,FALSE test speflag,SPE_SRCDIR _ifn z mov al,INVALID _endif mov dx,di mov di,offset cgroup:echo_ref call do_selfiles mov di,dx popm mov cx,di sub cx,dx msdos F_WRITE clr cx msdos F_WRITE msdos F_CLOSE pop dx mov cx,FA_HIDDEN msdos F_ATTR,1 spref9: popm movhl dx,TRUE,0 ret spexe_ref endp echo_all proc push ax mov di,dx cmp di,ss:tmpbuf+2 jae echoall9 call echo_pool mov al,SPC stosb mov dx,di echoall9: pop ax ret echo_all endp echo_ref proc push ax mov di,dx cmp di,ss:lbuf+2 jae echoref9 call echo_pool mov ax,CRLF stosw mov dx,di echoref9: pop ax ret echo_ref endp echo_pool proc push bx tst al _ifn s push ds movseg ds,ss call cpyaccdir pop ds _endif pop bx mov si,bx call copyafile ret echo_pool endp ;----- Get string ----- spexe_gets proc test speflag,SPE_DSTDIR jnz egets9 spexe_getsf: test speflag,SPE_DSTFILE jnz egets9 mov refloc,0 pushm mov si,nbuf mov cx,PATHSZ mov dl,W_DSTBOX push tmpbuf mov ax,tmpbuf2 mov tmpbuf,ax push di call windgets pop di pop tmpbuf jc egets_c _ifn cxz call strcpy _endif jmps egets8 egets_c: or speflag,SPE_CANCEL egets8: popm egets9: ret spexe_gets endp ;----- if include directory ----- spexe_opt proc tstw [bp].fl_selcnt _if z push ds call getpoolp mov ds,dx test [bx].dr_attr,FA_DIREC pop ds _ifn z stc _endif _else call check_dir _endif mov ah,FALSE _if c mov ah,TRUE _endif _repeat lodsb cmp al,SPC _break be cmp al,']' _break e tst ah _ifn z stosb _endif _until ret spexe_opt endp ;----- Check DOS_GO flag ----- ;--> SI:xbuf ;<-- CY: DOS_GO on (SI:buffer) public dos_go dos_go proc test dossw,DOS_GO jz dosgo9 push si mov di,tmpbuf push di mov al,LF mov cx,TMPSZ repne scasb dec di pop si pop bx clr cx push bx call histcpy pop si stc dosgo9: ret dos_go endp endes ENDIF end ;**************************** ; End of 'filer.asm' ; Copyright (C) 1989 by c.mos ;****************************