📄 rxdosdir.asm
字号:
lea si, offset [ _pathname ][ bp ]
lea di, offset [ _filename ][ bp ]
mov word ptr [ di ], '\' ; init area
Int21 GetActualFileName ; expand name
jnc _dir_16 ; if valid -->
call _CopyString ; if error, pass original for further processing
_dir_16:
lea si, offset [ _filename ][ bp ]
lea di, offset [ _expandedname ][ bp ]
call _splitpath
jnz _dir_28 ; if wild characters found -->
mov cx, ATTR_DIRECTORY
lea dx, offset [ _filename ][ bp ]
Int21 FindFirstFile ; locate file
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; if . or .. handle special
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_20:
jc _dir_28 ; not found, try expanding -->
test byte ptr [ RxDOS_DTA. findFileAttribute ], ATTR_DIRECTORY
jz _dir_28 ; if a directory, add \*.* -->
cmp byte ptr [ RxDOS_DTA. findFileName ], '.'
jnz _dir_22
Int21 FindNextFile ; locate next file
jmp _dir_20 ; see if also a dir -->
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; if a directory name, change to include *.* for all files
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_22:
lea si, offset [ _expandedname. expFilename ][ bp ]
lea di, offset [ _expandedname. expPath ][ bp ]
call _AppendPathName ; append path name
lea si, offset [ _expandedname. expExtension ][ bp ]
call _CopyString ; append to path name
mov byte ptr [ _expandedname. expExtension ][ bp ], 00
mov si, offset [ RxDOS_AllFiles ]
lea di, offset [ _expandedname. expFilename ][ bp ]
call _CopyString
jmp _dir_36 ; if none, ok to makepath
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; is name is not a directory
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_28:
lea di, offset [ _expandedname. expFilename ][ bp ]
cmp byte ptr [ di ], 00
jnz _dir_32
mov word ptr [ di ], '*'
_dir_32:
lea di, offset [ _expandedname. expExtension ][ bp ]
mov al, byte ptr [ _extensionFlag ][ bp ] ; extension required
or al, byte ptr [ di ] ; or extension provided
jnz _dir_36 ; if either -->
mov word ptr [ di ], '*.'
mov byte ptr [ di+2 ], 0
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; rebuild and edit name
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_36:
lea si, offset [ _expandedname ][ bp ]
lea di, offset [ _pathname ][ bp ]
call _makePath
lea si, offset [ _pathname ][ bp ]
lea di, offset [ _filename ][ bp ]
mov word ptr [ di ], '\' ; init area
Int21 GetActualFileName ; expand name to get real display name
jnc _dir_38 ; if ok -->
lea si, offset [ _pathname ][ bp ]
lea di, offset [ _filename ][ bp ]
call _CopyString
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; extract drive letter
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_38:
lea di, offset [ _filename ][ bp ]
cmp byte ptr [ di+1 ], ':'
jnz _dir_42
xor ah, ah
mov al, byte ptr [ di ]
mov word ptr [ _currdisk ][ bp ], ax ; save current disk
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; display header
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_42:
test word ptr [ _DirBareSwitch. swFlags ], SW_SWITCHSET
jnz _dir_52 ; skip header -->
mov bx, offset _Dir_NoVolumeLabel ; assume no volume label
mov al, byte ptr [ _currdisk ][ bp ] ; get current disk value
call returnVolumeName ; get volume for drive
ifc _dir_DriveError ; cannot open drive -->
jnz _dir_44 ; if no volume name -->
push di ; save vol label pointer
mov bx, offset _Dir_VolumeLabel ; print statement format
_dir_44:
lea di, offset [ _currdisk ][ bp ] ; pointer to current disk
push di ; current disk
push bx ; format
lea di, offset [ _printbuffer ][ bp ]
push di
call _sprintf
add sp, ax ; # args passed
call DisplayLine
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; display drive: path
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
lea si, offset [ _filename ][ bp ]
lea di, offset [ _pathname ][ bp ]
call _copyString ; copy to pathname
_dir_48:
dec di
cmp byte ptr [ di ], '\' ; isolate path
jnz _dir_48
mov byte ptr [ di ], 0
lea di, offset [ _pathname ][ bp ]
push di ; first arg encountered
mov di, offset _Dir_DirectoryOf
push di
lea di, offset [ _printbuffer ][ bp ]
push di
call _sprintf
add sp, ax ; # args passed
call DisplayLine
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; scan through files
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_52:
mov cx, ATTR_DIRECTORY
lea dx, offset [ _filename ][ bp ] ; pointer to search filename
Int21 FindFirstFile ; locate file
ifc _dir_72 ; if none located -->
_dir_54:
inc word ptr [ _filesread ][ bp ] ; files read
mov ax, word ptr [ RxDOS_DTA. findFileTime ]
lea di, offset [ _asciiFileTime ][ bp ]
call _dirTimeToAscii
push di
mov ax, word ptr [ RxDOS_DTA. findFileDate ]
lea di, offset [ _asciiFileDate ][ bp ]
call _dirDateToAscii
push di
test byte ptr [ RxDOS_DTA. findFileAttribute ], ATTR_DIRECTORY
ifnz _dir_60 ; if a directory -->
mov di, offset [ RxDOS_DTA. findFileSize ]
mov ax, word ptr [ _low ][ di ]
mov dx, word ptr [ _high ][ di ]
add word ptr [ _totalfilespace. _low ][ bp ], ax
adc word ptr [ _totalfilespace. _high ][ bp ], dx
push di ; third arg: file size
_dir_60:
mov di, offset [ RxDOS_DTA. findFileName ] ; locate extension
mov al, byte ptr [ di ] ; start of filename
call _endofString ; point to null terminator
push di ; terminator, in case no extension
cmp al, '.' ; filename either . or .. ?
jz _dir_64 ; yes, no need to find extension -->
mov al, '.'
mov cx, offset [ RxDOS_DTA. findFileName ] ; search length
xchg di, cx ; determine search length
sub cx, di ; search length
repnz scasb ; else scan for extension
jnz _dir_64 ; if found, di points to extension
mov byte ptr [ di-1 ], 0 ; else, di will point to a null (no extension)
pop ax
push di ; extension address, if found
_dir_64:
mov di, offset [ RxDOS_DTA. findFileName ]
push di ; pointer to filename
mov di, offset _Dir_FileEntry
test byte ptr [ RxDOS_DTA. findFileAttribute ], ATTR_DIRECTORY
ifz _dir_66 ; if not a directory -->
mov di, offset _Dir_DirEntry
_dir_66:
push di
lea di, offset [ _printbuffer ][ bp ]
push di
call _sprintf
add sp, ax ; # args passed
test word ptr [ _DirLowerCaseSwitch. swFlags ], SW_SWITCHSET
jz _dir_68 ; not lower case option ->
push ss
push si ; where string
call _lowerCaseString ; lowercase string
_dir_68:
call DisplayLine ; print line
jc _dir_Exit ; control C abort -->
Int21 FindNextFile ; locate next file
ifnc _dir_54 ; if none located -->
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; print number of files
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_72:
cmp word ptr [ _filesread ][ bp ], 0000 ; any files read ?
jnz _dir_76 ; yes -->
mov dx, offset CmndError_NoFilesFound
call DisplayLine ; file not found
jmp short _dir_Exit
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; display files, space used, space free
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_76:
mov dl, byte ptr [ _expandedName. expDrive ][ bp ]
and dl, 15 ; drive
Int21 GetFreeDiskSpace
mul cx ; total space
mul bx
stordarg _freespace, dx, ax
lea di, offset [ _freespace ][ bp ]
push di
lea di, offset [ _totalfilespace ][ bp ]
push di
lea di, offset [ _filesread ][ bp ]
push di
mov di, offset _Dir_Files
push di
lea di, offset [ _printbuffer ][ bp ]
push di
call _sprintf
add sp, ax ; # args passed
call DisplayLine ; print line
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; done
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_Exit:
Return
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; if error
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_dir_DriveError:
mov dx, offset CmndError_InvalidDrive
call DisplayErrorMessage ; display message
Return
RxDOSCMD ENDS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -