Assembly Language Help (alang.hlp) (Table of Contents; Topic list)
Important Notice
The pages on this site contain documentation for very old MS-DOS software, purely for historical purposes. If you're looking for up-to-date documentation, particularly for programming, you should not rely on the information found here, as it will be woefully out of date.
GetFileTime
 Map                                       Up Contents Index Back
────────────────────────────────────────────────────────────────────────────
 
;* GetFileTime - Gets date/time for open file specified by handle.
;*
;* Shows:   DOS Function - 57h (Get or Set File Date and Time)
;*          Instructions - shl     shr
;*
;* Params:  Handle - Handle of open file
;*          Sptr - Pointer to 18-byte buffer to receive date/time
;*
;* Return:  Short integer with error code
;*          0 if successful
;*          1 if error
 
GetFileTime PROC USES di,
        Handle:WORD,
        Sptr:PBYTE
 
        mov     ax, 5700h               ; AH = function number
                                        ; AL = get request
        mov     bx, Handle              ; BX = file handle
        int     21h                     ; Get File Date and Time
        mov     ax, 1                   ; Set error code, keep flags
        .IF     !carry?                 ; If not carry, continue
        mov     bx, cx                  ; Else save time in BX
        mov     al, bl                  ; Get low byte of time
        and     al, 00011111y           ; Mask to get 2-second incrs,
        shl     al, 1                   ;   convert to seconds
        push    ax                      ; Save seconds
        mov     cl, 5
        shr     bx, cl                  ; Shift minutes into low byte
        mov     al, bl                  ; Get new low byte
        and     al, 00111111y           ; Mask to get minutes
        push    ax                      ; Save minutes
        mov     cl, 6
        shr     bx, cl                  ; Shift hours into low byte
        push    bx                      ; Save hours
 
        mov     bl, dl                  ; Get low byte of date
        and     bl, 00011111y           ; Mask to get day in BX
        mov     cl, 5
        shr     dx, cl                  ; Shift month into low byte
        mov     al, dl                  ; Get new low byte
        and     al, 00001111y           ; Mask to get month
        mov     cl, 4
        shr     dx, cl                  ; Shift year into low byte
        add     dx, 80                  ; Year is relative to 1980
        push    dx                      ; Save year
        push    bx                      ; Save day
        push    ax                      ; Save month
 
        LoadPtr es, di, Sptr            ; Point ES:DI to 18-byte
        mov     cx, 6                   ;   string
 
        .REPEAT
        pop     ax                      ; Get 6 numbers sequentially in AL
        aam                             ; Convert to unpacked BCD
        xchg    al, ah                  ; Switch bytes for word move
        or      ax, '00'                ; Make ASCII numerals
        stosw                           ; Copy to string
        mov     al, '-'                 ; Separator for date text
        cmp     cl, 4                   ; First 3 iters are for date
        jg      @F                      ; If CX=6 or 5, insert hyphen
        mov     al, ' '                 ; Separator date and time
        je      @F                      ; If CX = 4, insert hyphen
        mov     al, ':'                 ; Separator for time text
        .IF     cl != 1
@@:     stosb                           ; Copy separator to string
        .ENDIF
        .UNTILCXZ
 
        sub     ax, ax                  ; Clear return code
        stosb                           ; Terminate string with null
        .ENDIF                          ;   to make ASCIIZ
        ret
 
GetFileTime ENDP
                                    -♦-