218 lines
10 KiB
NASM
218 lines
10 KiB
NASM
|
;* This is a simple litte assembler program that cleans out *
|
||
|
;* the documents folder in the start menu. *
|
||
|
;* This is version 1.2 *
|
||
|
;* There's no command line switches and stuff. *
|
||
|
;* It gives NO messages if everything goes allright. *
|
||
|
;* It check for a environment variable called CLEANDIR and CD:s *
|
||
|
;* down to that dir if the variable is found. If not it uses *
|
||
|
;* the default WINDOWS\RECENT directory and deletes(UNLINKS) *
|
||
|
;* EVERYTHING it finds there, and CD:s back to where it started *
|
||
|
;* from. *
|
||
|
;************************************************************************
|
||
|
|
||
|
;some euqates for readability
|
||
|
kbd equ 16h ;keyboard irq
|
||
|
msdos equ 21h ;MSDOS irq
|
||
|
|
||
|
reset equ 0dh ;disk reset
|
||
|
dfopen equ 0fh ;open disk file
|
||
|
dfclose equ 10h ;close disk file
|
||
|
searchf equ 11h ;search first
|
||
|
searchn equ 12h ;search next
|
||
|
seqread equ 14h ;sequential disk read
|
||
|
seqwrite equ 15h ; " " write
|
||
|
getdisk equ 19h ;get current disk(default)
|
||
|
setdta equ 1ah ;set disk transfer area address
|
||
|
setdir equ 3bh ;set current directory
|
||
|
createf equ 3ch ;create file with handle
|
||
|
openf equ 3dh ;open file with handle
|
||
|
closef equ 3eh ;close file with handle
|
||
|
readf equ 3fh ;read from file with handle
|
||
|
writef equ 40h ;write to file with handle
|
||
|
unlink equ 41h ;UNLINK(delete file)
|
||
|
getdir equ 47h ;get current directory
|
||
|
allocmem equ 48h ;allocate memory
|
||
|
freemem equ 49h ;free memory
|
||
|
changebs equ 4ah ;change block size
|
||
|
findfirst equ 4eh ;find first file
|
||
|
findnext equ 4fh ;find next file
|
||
|
exit equ 4c00h ;msdos exit
|
||
|
|
||
|
envir equ 2ch ;offset ENVIRONMENT block
|
||
|
|
||
|
[BITS 16] ;NASM STUFF !?
|
||
|
[ORG 100h]
|
||
|
|
||
|
mov ax,cs ;get code segment
|
||
|
mov ds,ax ;use it now
|
||
|
mov [comseg],ds
|
||
|
mov [extseg],es
|
||
|
|
||
|
;************************ setup and preparing ***************************
|
||
|
main:
|
||
|
mov ah,setdta ;set our DTA-area
|
||
|
mov dx,mydta ;buffer for it
|
||
|
int msdos ;call dos
|
||
|
|
||
|
mov ah,getdisk ;get default drive
|
||
|
int msdos ;call dos
|
||
|
add al,41h ;drive in al, make it ASCII
|
||
|
mov byte [curdir],al ;fill buffer with name (A:..etc)
|
||
|
mov byte [path],al ;and default path
|
||
|
|
||
|
mov word [curdir+1],":\" ;copy separator to path
|
||
|
mov si,curdir ;pointer path buffer
|
||
|
add si,3 ;offset doscall part
|
||
|
mov ah,getdir ;get current dir
|
||
|
mov dl,0 ;0 = default
|
||
|
int msdos ;call dos
|
||
|
jnc diskok ;ok
|
||
|
mov bx,errt0 ;could not find current dir ?? If You
|
||
|
jmp errout ;get an error here You probably have
|
||
|
diskok: ;forgot to turn on Your computer.
|
||
|
call getenv ;check out if any ENV var
|
||
|
cmp dx,-1 ;was it there
|
||
|
je findfile ;yeahh
|
||
|
mov dx,path ;noo way, use default path
|
||
|
mov ah,setdir ;cd down
|
||
|
int msdos ;call dos
|
||
|
jnc findfile ;all ok
|
||
|
mov bx,errt1 ;error
|
||
|
jmp errout ;skip
|
||
|
|
||
|
;*************************** the delete file loop ***********************
|
||
|
findfile:
|
||
|
mov ah,findfirst ;see if the files out there
|
||
|
mov cx,0fh ;all files
|
||
|
mov dx,files ;our NULL terminated filname(*.*)
|
||
|
int msdos ;do the stuff
|
||
|
jnc delit ;all ok, must delete first file
|
||
|
jmp goback ;error, CD back and skip
|
||
|
found: ;found something
|
||
|
mov dx,files ;files (*.*)
|
||
|
mov ah,findnext ;the function
|
||
|
int msdos ;call dos
|
||
|
jc goback ;no more files, quit
|
||
|
delit:
|
||
|
mov ah,unlink ;UNLINK (delete) file
|
||
|
mov dx,mydta ;pointer Disk Transfer Area
|
||
|
add dx,30 ;offset Filename
|
||
|
int msdos ;delete it
|
||
|
jnc found ;deleted ok
|
||
|
|
||
|
mov bx,errt2 ;could not delete it ????
|
||
|
call write ;let us know
|
||
|
mov bx,mydta ;show wich file
|
||
|
add bx,30 ;offset filename in DTA
|
||
|
call write ;write out filename
|
||
|
mov bx,linefeed ;linefeed
|
||
|
jmp errout ;and skip
|
||
|
goback:
|
||
|
mov ah,setdir ;CD back to origin
|
||
|
mov dx,curdir ;path to dir
|
||
|
int msdos ;do it
|
||
|
jnc quit ;all ok, proceed
|
||
|
mov bx,errt1 ;error, get text
|
||
|
|
||
|
;*************************** errorexit ***********************
|
||
|
errout: call write ;show errormessage
|
||
|
quit:
|
||
|
xor eax,eax ;clean out that
|
||
|
mov ax,exit ;MS-DOS successful exit
|
||
|
int msdos ;back to the operating system
|
||
|
|
||
|
;***************** get ENVIRONMENT var if any *****************
|
||
|
getenv:
|
||
|
push es ;now check if there's any
|
||
|
push ds ;environment variable
|
||
|
|
||
|
mov es,[es:+2Ch] ;ES:DI points at environment
|
||
|
xor di,di ;which is paragraph-aligned
|
||
|
floop:
|
||
|
cmp byte [es:di],0 ;if we got 2 zeroes in a row
|
||
|
jne goon ;we are at the end of the ENV
|
||
|
cmp byte [es:di+1],0 ;variables
|
||
|
je eout
|
||
|
goon:
|
||
|
equal: cmp byte [es:di],'C' ;is it our variable ?
|
||
|
jne flop
|
||
|
inc byte di
|
||
|
cmp byte [es:di],'L'
|
||
|
jne flop
|
||
|
inc byte di
|
||
|
cmp byte [es:di],'E'
|
||
|
jne flop
|
||
|
inc byte di
|
||
|
cmp byte [es:di],'A'
|
||
|
jne flop
|
||
|
inc byte di
|
||
|
cmp byte [es:di],'N'
|
||
|
jne flop
|
||
|
inc byte di
|
||
|
cmp byte [es:di],'D'
|
||
|
jne flop
|
||
|
inc byte di
|
||
|
cmp byte [es:di],'I'
|
||
|
jne flop
|
||
|
inc byte di
|
||
|
cmp byte [es:di],'R'
|
||
|
jne flop
|
||
|
sign: inc byte di ;dump the R
|
||
|
inc byte di ;dump the =
|
||
|
|
||
|
mov ax,es ;make DS:DX point to string we found
|
||
|
mov ds,ax
|
||
|
mov si,di
|
||
|
mov bx,si
|
||
|
mov dx,bx
|
||
|
mov ah,setdir ;func Set Current Directory(CD)
|
||
|
int msdos ;do it
|
||
|
jnc envok ;all ok, proceed
|
||
|
mov dx,0 ;clear flag (use default dir)
|
||
|
jmp eout ;return
|
||
|
|
||
|
flop: inc byte di ;next byte
|
||
|
cmp byte [es:di],0 ;a 0 ?
|
||
|
jne flop ;noo
|
||
|
inc byte di ;yeahh, dump it
|
||
|
jmp floop ;check if two
|
||
|
envok: mov dx,-1
|
||
|
eout: pop ds
|
||
|
pop es
|
||
|
ret
|
||
|
|
||
|
;*************************************************************************
|
||
|
;* Writes out the NULL terminated text supplied in BX. *
|
||
|
;* OR writes out data,BX and size,CX if called at lwrite. *
|
||
|
;*************************************************************************
|
||
|
write: pusha
|
||
|
mov si,bx ;copy to SI
|
||
|
mov cx,0 ;clear count
|
||
|
wloop: lodsb ;load AL with SI
|
||
|
cmp al,0 ;end of line ?
|
||
|
je lwrite ;yeahh
|
||
|
inc cx ;no, incrase byte count
|
||
|
jmp wloop ;test next byte
|
||
|
lwrite: mov dx,bx ;text address in DX
|
||
|
mov bx,1 ;filehandle standard output = 1
|
||
|
mov ah,writef ;MS-DOS writefile with handle is 040
|
||
|
int msdos ;write buffer to standard output
|
||
|
popa
|
||
|
ret ;done
|
||
|
|
||
|
;************************ DATA and BSS stuff ***************************
|
||
|
|
||
|
comseg: dw 0
|
||
|
extseg: dw 0
|
||
|
utext: db "XXX",13,10,0
|
||
|
errt0: db "Could not find current directory !",13,10,0
|
||
|
errt1: db "Directory not found.",13,10,0
|
||
|
errt2: db "Could not delete ",0
|
||
|
path: db " :\WINDOWS\RECENT",0 ;default path without DRIVE
|
||
|
files: db "*.*",0
|
||
|
linefeed: db 13,10,0
|
||
|
|
||
|
mydta times 128 db 0 ;use 128 bytes as DTA NASM stuff !
|
||
|
curdir times 68 db 0 ;use 64 + 4 bytes for current dir
|
||
|
|
||
|
END
|