一个窗口模式的文件属性修改器LXA 0.56,为以后扩展方便,可复用的代码比较多

来源:互联网 发布:手写字体制作软件 编辑:程序博客网 时间:2024/06/08 06:56

;===========================================
;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