;===========================================
;LX TOOLS ,Designed by lxleaves
;http://lxleaves.126.com
;http://lxleaves.yeah.net
;
;command:
;masm lxa.asm
;link lxa
;exe2bin lxa lxa.com
;===========================================
version equ ' <LXAttrib> Ver0.56'
news equ 'Publish: 04/01/14'
;-------------------------------------------
form0 equ 0c4h
form1 equ 0dah
form2 equ 0bfh
form3 equ 0b3h
form4 equ 0c3h
form5 equ 0b4h
form6 equ 0c0h
form7 equ 0d9h
form8 equ 201
form9 equ 205 ;=
form10 equ 187
form11 equ 186 ;||
form12 equ 200 ;left bottom
form13 equ 188
key_esc equ 1
key_r equ 19
key_enter equ 28
key_a equ 30
key_s equ 31
key_h equ 35
key_c equ 46
key_space equ 57
key_up equ 72
key_down equ 80
;===========================================
cseg segment
org 100h
assume cs:cseg,ds:cseg,ss:cseg
;--------------macro fun-------------------
floodword macro y,x,word,color,times
goto y,x
mov al,word
mov bl,color
mov cx,times
call floodword_macro
endm
;---------------------------------------
goto macro y,x
mov dh,y
mov dl,x
call goto_macro
endm
;----------------------------------------
biosstr macro str,color
mov bl,color
mov bp,offset str
strlen str,cx
call biosstr_macro
endm
;-----------------------------------------
strlen macro str,len
mov si,0FFFFh
add si,1
cmp str[si],0h
jne $-8 ;goto the 'add' fun above
mov len,si
endm
;-----------------------------------------
getch macro char
mov ah,0
int 16h
mov char,al
endm
bioskey macro num
mov ah,num
int 16h
mov bkey,ax
endm
;---------------------------------------------------------
putline macro y,color
;name
goto y,6
biosstr findfiledta_name,color
;attr
mov putline_color,color
mov putline_y,y
call putline_attr_macro
endm
;---------------------------------------------------------
;==================================================================
main proc near
mov ax,3
int 10h ;set textmode
call drawwin
call getdir
;-------------------------------------------------------------
call setfindfiledta
call listbox
call getfun
;-------------------------------------------------------------
main endp
;===================================================================
;--------------------DATA-----------------------------
winhead db 'LX-TOOLS',version,' Designed by lxleaves,All for free!',' ',news,0
info0 db 'Usage:',36 dup(' '),'Support me:http://lxleaves.yeah.net',0
info1 db 'keyboard->R:read only,H:hide,S:system,A:archive,C:clear all. 6088cncard',0
info2 db 'Space:change drive, ESC:quit (D means directory)',0
info3 db '使用方法:',0
info4 db '键盘操作->R:只读,H:隐藏,S:系统,A:档案,C:清除全部属性',0
info5 db '空格键:改变盘符 ESC:离开 另外,D表示目录 http://lxleaves.126.com',0
info6 db 'PATH=',0
info7 db 'Attr Name',0
info8 db 'File Functions',0
str_01 db '-----',0
;str_dir db '<Dir>',0
;---------------------------------
chdrive_s1 db form8,32 dup(form9),form10,0
chdrive_s2 db form11,32 dup(' '),form11,0
chdrive_s3 db form12,32 dup(form9),form13,0
chdrive_s4 db 'Please enter the drive name:',0
chdrive_s5 db 'ESC Cancel <',217,' OK',0
quit_ask db 'Are you sure to quit?',0
textinsertbox db 'C',0
;-----------exchange data
bkey dw ?
;DTA start
findfiledta:
findfiledta_1 db 21 dup(0)
findfiledta_attr db ?
findfiledta_time dw ?
findfiledta_date dw ?
findfiledta_size db 4 dup(0)
findfiledta_name db 13 dup(0)
;DTA end
selectfile_ip dw ?
selectfile_attr db ?
selectfile_name db 13 dup(0)
putline_color db ?
putline_y db ?
;----------------------------------------
fileattr db 110111b
defaultattr db 110111b
attr_dir db 010000b
;----------------------------------------
path db 64 dup(0)
allfile db '*.*',0
listip dw 0
listbar db 1
listflag db 0
filenum dw 0
;-------------------------------------------------------------------------------------------
drawwin: ;draw the default win
call clearall
;------------------------
floodword 0,0,' ',1fh,80
floodword 1,0,form0,1fh,80
floodword 3,0,' ',2fh,80
;from now on 'cx' is set to 78,that is count is 78
floodword 11h,0,' ',1fh,640
floodword 11h,1,form0,1fh,78
floodword 18h,1,form0,1fh,78
;from now on,the 'cx' is set to 1,that is count is 1
mov dh,12h
mov al,form3
mov bl,1fh
mov cx,7
@lo: push cx ;as macro need more space
mov ah,2
mov dl,0
int 10h
mov cx,1
mov ah,09
int 10h
mov ah,2
mov dl,79
int 10h
mov ah,09
int 10h
pop cx
inc dh
loop @lo
floodword 11h,00h,form1,1fh,1
floodword 11h,79,form2,1fh,1
floodword 18h,0,form6,1fh,1
floodword 18h,79,form7,1fh,1
;winhead
goto 0,0
biosstr winhead,1fh
goto 18,2
biosstr info0,1fh
goto 19,3
biosstr info1,1fh
goto 20,13
biosstr info2,1fh
goto 21,2
biosstr info3,1fh
goto 22,3
biosstr info4,1fh
goto 23,13
biosstr info5,1fh
;info8
goto 1,21h
biosstr info8,1fh
;info6
goto 2,0
biosstr info6,0eh
;info7
goto 3,0
biosstr info7,2fh
ret
;---------------------------------------------------------------------------------------------------------
;---macro call---------------------------------------
floodword_macro:
mov ah,09
mov bh,0
int 10h
ret
goto_macro:
mov ah,2
int 10h
ret
biosstr_macro:
mov al,0
mov ah,13h
int 10h
ret
;--------------------------------------------------
putline_attr_macro:
goto putline_y,0
biosstr str_01,putline_color ; put '-----'
mov dl,findfiledta_attr
;is HIDE?
test dl,1b
jz @pt1
push dx
floodword putline_y,0,'R',putline_color,1
pop dx
@pt1: ;is Readonly?
test dl,10b
jz @pt2
push dx
floodword putline_y,1,'H',putline_color,1
pop dx
@pt2: ;is System?
test dl,100b
jz @pt3
push dx
floodword putline_y,2,'S',putline_color,1
pop dx
@pt3: ;is A?
test dl,100000b
jz @pt4
push dx
floodword putline_y,3,'A',putline_color,1
pop dx
@pt4: ;is DIR?
test dl,10000b
jz @pt5
push dx
floodword putline_y,4,'D',0ah,1
pop dx
@pt5:
ret
;------------------------------------------------
;normal call
clearall:
mov ax,600h
mov cx,0
mov dx,2479h
mov bh,7
int 10h
ret
;==================================================================
setfindfiledta:
mov ah,1ah
lea dx,findfiledta ;42 dup(' ')
int 21h
ret
;------------------------------------------------
findfirst:
lea dx,allfile ; *.*
mov cx,0 ;fileattrib
mov cl,fileattr
mov ah,4eh
int 21h
call checkfind
ret
checkfind:
push ax
mov ah,findfiledta_name
mov al,findfiledta_name[1]
cmp ah,'.'
je @check2
pop ax
ret
@check2:
cmp al,0
je @not
pop ax
ret
@not:
pop ax
call findnext
ret
;------------------------------------------------
findnext:
mov ah,4fh
int 21h
call checkfind
ret
;------------------------------------------------
listbox:
;clear the list space
;if listbar=0||listbar=14
mov ah,defaultattr
mov fileattr,ah
mov dl,listflag
cmp dl,1
je clearlistbox
mov dl,listbar
cmp dl,1
je clearlistbox
cmp dl,13
je clearlistbox
jmp notclearlistbox
clearlistbox:
floodword 4,0,' ',00h,1040
notclearlistbox:
;-----------------
call findfirst
mov bx,listip
checkip:
cmp bx,0
je ipok
sub bx,1
call findnext
cmp ax,18
je stoplist ;if not find
cmp ax,2
je stoplist ;if error occur
jmp checkip
ipok: mov dh,4
nextcheck:
mov dl,listbar
add dl,3
cmp dh,dl ;check whether is a select bar
je selectcheck
;if not select bar
cmp dh,11h
jnl stoplist
putline dh,07h
;to make more than jump
jmp nextfind
nextfind:
call findnext
cmp ax,18
je stoplist ;if not find
add dh,1 ;line+=1
jmp nextcheck
stoplist:
ret
selectcheck:
floodword dh,0,' ',4fh,19
putline dh,4fh
mov dl,dh
sub dl,3
mov listbar,dl
lea di,selectfile_name
lea si,findfiledta_name
cld
mov cx,13
rep movsb
mov cl,findfiledta_attr
mov selectfile_attr,cl
jmp nextfind
;===============================================================================
getfun:
call getfilenum
goto 2,79
bioskey 0
;=============mainfun==============
mov ax,bkey
;---------------------
cmp ah,key_space
je getfun_chdrive
;---------------------
cmp ah,key_up
je up_fun
;---------------------
cmp ah,key_down
je down_fun
;---------------------
cmp ah,key_a
je getfun_chmod
;---------------------
cmp ah,key_s
je getfun_chmod
;---------------------
cmp ah,key_h
je getfun_chmod
;---------------------
cmp ah,key_r
je getfun_chmod
;---------------------
cmp ah,key_c
je getfun_chmod
;---------------------
cmp ah,key_esc
je getfun_quit
;---------------------
cmp ah,key_enter
je getfun_enter
;---------------------
jmp getfun
;==================================
getfun_chmod:
call getfun_chmod_more
jmp showchange
up_fun:
call clear_listbar
call up_fun_more
jmp showchange
getfun_quit:
call quit_fun
jmp showchange
getfun_chdrive:
call chdrive
jmp getfun
getfun_enter:
mov ah,selectfile_attr
call getfun_enter_more
jmp showchange
down_fun:
call clear_listbar
call down_fun_more
jmp showchange
showchange:
call getdir
call listbox
jmp getfun
;============================================================================================
;the more fun for call
getfun_chmod_more:
mov al,selectfile_attr
cmp ah,key_c
je @chmod6
cmp ah,key_r
je @chmod1
cmp ah,key_s
je @chmod2
cmp ah,key_h
je @chmod3
jmp @chmod4
@chmod1: ;r
xor al,1b
jmp @chmod5
@chmod2: ;s
xor al,100b
jmp @chmod5
@chmod3: ;h
xor al,10b
jmp @chmod5
@chmod4: ;a
xor al,100000b
jmp @chmod5
@chmod6:
mov al,0
@chmod5:
mov cx,0
mov cl,al
lea dx,selectfile_name
mov ax,4301h
int 21h
ret
clear_listbar:
mov dl,listbar
add dl,3
floodword dl,0,' ',00h,80
ret
;------------------------------
up_fun_more:
mov ah,listbar
cmp ah,1
je up_sub
sub ah,1
mov listbar,ah
@upfun1:
ret
up_sub:
mov ax,listip
cmp ax,0
jng @upfun1
sub ax,1
mov listip,ax
ret
;------------------------------
down_fun_more:
;if listip+listbar>filenum,stop listbar and downfun
mov al,listbar
mov ah,0
mov dx,listip
add dx,ax
inc dx
mov ax,filenum
cmp ax,dx ;if ax<=dx,stop
jl @down2
;if not,if listbar>13
mov ah,listbar
cmp ah,13
jnb @down_ipadd1
;else listbar++
inc ah
mov listbar,ah
@down2: ret
@down_ipadd1:
mov ax,listip
add ax,1
mov listip,ax
ret
;-------------------------------------------
getfun_enter_more:
test ah,10000b ;whether is a dir
jnz @enter1
ret
@enter1:
call changedir
;reset all
mov listbar,1
mov listip,0
floodword 4,0,' ',00h,1040
ret
;---------------------------------------------
quit_fun:
call messagebox
goto 9,24
biosstr quit_ask,5fh
goto 2,79
@quitfun0:
bioskey 0
mov ax,bkey
cmp ah,key_esc
je @quitfun1
cmp ah,key_enter
je @quitfun2
jmp @quitfun0
@quitfun1:
call drawwin
call getdir
mov listflag,1
call listbox
mov listflag,0
ret
@quitfun2:
;end the soft
call clearall
mov ax,4c00h
int 21h
;============================================================================================
getdir:
floodword 2,5,' ',00h,75
mov ah,19h
int 21h
add al,65
mov textinsertbox,al
floodword 2,5,al,0eh,1
floodword 2,6,':',0eh,1
floodword 2,7,'/',0eh,1
mov dl,0
mov ah,47h
mov si,offset path
int 21h
goto 2,8
biosstr path,0eh
ret
;----------------------------------------------
getfilenum:
mov ah,defaultattr
mov bx,0
mov fileattr,ah
call findfirst
cmp ax,2
je gfn_quit
gfn_check:
cmp ax,18
je gfn_show
add bx,1
call findnext
jmp gfn_check
gfn_show:
mov filenum,bx
sub bx,1
gfn_quit:
ret
;---------------------------------------------
changedir:
lea dx,selectfile_name
mov ah,3bh
int 21h
ret
;----------------------------------------------
chdrive:
call messagebox
goto 9,24
biosstr chdrive_s4,5fh
@showch:
goto 9,52
biosstr textinsertbox,0b0h
bioskey 0
mov ax,bkey
cmp ah,key_enter
je douserchd_enter
cmp ah,key_esc
je douserchd_esc
cmp al,65
jb @showch
cmp al,122
jnl @showch
cmp al,90
jb @sh1
sub al,32
@sh1:
mov textinsertbox,al
jmp @showch
douserchd_enter:
mov dl,textinsertbox
sub dl,65
mov ah,0eh
int 21h
mov listip,0
mov listbar,1
douserchd_esc:
call getdir
mov listflag,1
call listbox
mov listflag,0
ret
;-----------------------------------------------
messagebox:
goto 7,22
biosstr chdrive_s1,5fh
mov cx,5
mov bx,8
@chd1:
push bx
push cx
goto bl,22
biosstr chdrive_s2,5fh
pop cx
pop bx
add bl,1
loop @chd1
goto 13,22
biosstr chdrive_s3,5fh
goto 12,29
biosstr chdrive_s5,5fh
ret
;=======================================================================
;-------------------------------------
cseg ends
end main