⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rxdosdir.asm

📁 dos source
💻 ASM
📖 第 1 页 / 共 3 页
字号:

        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 + -