home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a013 / 1.ddi / SOURCE.EXE / FILETIME.ASM < prev    next >
Encoding:
Assembly Source File  |  1991-01-25  |  8.2 KB  |  182 lines

  1. ; --------------------------------------------------------------
  2. ; FUNCTION NAME: FILETIME - Gets or sets the DOS time on a file
  3. ; --------------------------------------------------------------
  4. ; Copyright(c)              1988-1990 -- James Occhiogrosso
  5.  
  6. INCLUDE DEVELOP.MAC         ; Developer's Library macro file
  7.  
  8. PUBLIC   FILETIME           ; Declare function name
  9.                             ; Declare Clipper EXTERNALS
  10. EXTRN    __PARINFO:FAR      ; Get Clipper parameter information
  11. EXTRN    __PARC:FAR         ; Get a Clipper string
  12. EXTRN    __RETC:FAR         ; Return a string to Clipper
  13.  
  14. CODESEG  SEGMENT 'CODE'
  15.           ASSUME CS:CODESEG
  16.  
  17.  
  18. FILETIME PROC  FAR
  19.  
  20.          JMP BEGIN                   ; Jump around data area
  21.  
  22.          FILE_HANDLE  DB  0          ; Store file handle here
  23.          GET_TIME DB  '00:00:00', 0  ; Store Clipper return time
  24.          SET_FLAG DB  0              ; Set to 1 for setting time
  25.  
  26. BEGIN:
  27.          PUSH_REGS                   ; Save Clipper registers
  28.  
  29.          PUSH DS                     ; Save Clippers data segment
  30.          PUSH CS                     ;
  31.          POP DS                      ; Set up our data segment
  32.          MOV BX, OFFSET FILE_HANDLE  ; Get address of first data
  33.          MOV AX, 0
  34.          MOV CX, 11                  ; Set to loop 11 times
  35. NEXT:    MOV [BX], AL                ; Clear a byte of data area
  36.          ADD BX, 1                   ; Increment the address
  37.          LOOP NEXT
  38.          POP DS                      ; Restore data segment
  39.  
  40.          P_TYPE 1                    ; Get parameter type to AX
  41.          CMP AX, 1                   ; Character string passed?
  42.          JNE RET_NULL_1              ; No! Return null time
  43.  
  44.          P_COUNT                     ; Yes! Get parameters passed
  45.          CMP AX, 02                  ; If no second parameter,
  46.          JNE OPEN_FILE               ;   get file time and return
  47.          P_TYPE 2                    ; Else, get its type
  48.          CMP AX, 1                   ;   Is it a string?
  49.          JNE RET_NULL_1              ;   No! Return null time
  50.          MOV CS:SET_FLAG, 1          ;   Yes! Set the flag
  51.          PUSH DS                     ;   Save the data segment
  52.          JMP OPEN_FILE               ; Jump around null return
  53.  
  54.  
  55. RET_NULL_1:
  56.          JMP EXIT_TIME               ; RET_NULL labels used for
  57.                                      ; direct jump to exit point
  58. RET_NULL_2:                          ; due to an error condition.
  59.          JMP CLOSE_FILE
  60.  
  61.  
  62. OPEN_FILE:
  63.          GET_PARC 1                  ; Address of passed filename
  64.          MOV DS, DX                  ; Get filename segment
  65.          MOV DX, AX                  ; Get filename offset
  66.          SUB AL, AL                  ; Set for read only mode
  67.          MOV AH, 3Dh                 ; Open file request
  68.          INT 21h
  69.          JC RET_NULL_1               ; On error, return null time
  70.          MOV CS:FILE_HANDLE, AL      ; Save the file handle
  71.  
  72. GET_THE_TIME:
  73.          PUSH CS                     ; Move data segment to CS
  74.          POP DS                      ;   for our data
  75.          SUB BH, BH                  ; Zero out BX for handle
  76.          MOV BL, FILE_HANDLE         ; Get the DOS handle
  77.          MOV AH, 57h                 ; DOS date/time function
  78.          SUB AL, AL                  ; Get file date/time
  79.          INT 21h
  80.          JC RET_NULL_2               ; Return null time
  81.  
  82.          MOV AL, CL                  ; Move time to AL (seconds)
  83.          AND AL, 00011111b           ; Mask out unused bits
  84.          ADD AL, AL                  ; DOS resolves 2 seconds
  85.          AAM                         ; Adjust MS/LS digits
  86.          ADD AX, 3030h               ; Convert to ASCII
  87.          MOV BX, OFFSET GET_TIME     ; Get return time address
  88.          MOV [BX+6], AH              ; Save seconds digit (tens)
  89.          MOV [BX+7], AL              ; Save seconds digit (ones)
  90.  
  91.          MOV AX, CX                  ; Restore original time
  92.          AND AX, 0000011111100000b   ; Mask out the unused bits
  93.          MOV CL, 5                   ; Constant for shift
  94.          SHR AX, CL                  ; Shift minute bits
  95.          AAM                         ; Adjust MS/LS digits
  96.          ADD AX, 3030h               ; Convert AX to ASCII
  97.          MOV [BX+3], AH              ; Save minutes digit (tens)
  98.          MOV [BX+4], AL              ; Save minutes digits (ones)
  99.  
  100.          MOV AL, CH                  ; Restore original time
  101.          AND AL, 11111000b           ; Mask out the unused bits
  102.          MOV CL, 3                   ; Constant for shift
  103.          SHR AL, CL                  ; Shift hour bits
  104.          AAM                         ; Adjust MS/LS digits
  105.          ADD AX, 3030h               ; Convert to ASCII
  106.          MOV [BX], AH                ; Save hour MS digit (tens)
  107.          MOV [BX+1], AL              ; Save hour LS digit (ones)
  108.          MOV AL, ':'                 ; Put colons in time string
  109.          MOV [BX+2], AL
  110.          MOV [BX+5], AL
  111.  
  112. SET_THE_TIME:
  113.          MOV AL, CS:SET_FLAG         ; Check the flag
  114.          CMP AL, 0                   ; Is it set?
  115.          JE CLOSE_FILE               ; No! We are done
  116.          POP DS                      ; Yes! Recover data segment,
  117.          MOV CS:SET_FLAG, 0          ;   reset the flag, and
  118.          GET_PARC 2                  ;   get passed time string
  119.          MOV DS, DX                  ; Get passed segment into DS
  120.          MOV BX, AX                  ;        and offset into BX
  121.  
  122.          MOV AX, WORD PTR [BX]       ; Get the hours digits
  123.          XCHG AH, AL                 ; Put them in correct order
  124.          SUB AX, 3030h               ; Remove ASCII bias
  125.          AAD                         ; Adjust from ASCII
  126.          MOV CL, 11                  ; Shift constant
  127.          SHL AX, CL                  ; Shift year left 9 bytes
  128.          PUSH AX                     ; Save the hours value
  129.  
  130.          MOV AX, WORD PTR [BX+3]     ; Get the minutes digits
  131.          XCHG AH, AL                 ; Put them in correct order
  132.          SUB AX, 3030h               ; Remove ASCII bias
  133.          AAD                         ; Adjust from ASCII
  134.          MOV CL, 5                   ; Shift constant
  135.          SHL AX, CL                  ; Shift month left 5 bytes
  136.          PUSH AX                     ; Save the minutes value
  137.  
  138.          MOV AX, WORD PTR [BX+6]     ; Get the seconds digits
  139.          XCHG AH, AL                 ; Put them in correct order
  140.          SUB AX, 3030h               ; Remove ASCII bias
  141.          AAD                         ; Adjust from ASCII
  142.          SHR AX, 1                   ; Divide by 2 for DOS
  143.  
  144.          POP BX                      ; Get back minutes value
  145.          ADD AX, BX                  ; Add it in
  146.          POP BX                      ; Get back hours value
  147.          ADD AX, BX                  ; Add it in
  148.          PUSH AX                     ; Store new time
  149.  
  150.          SUB BH, BH                  ; Clear upper handle byte
  151.          MOV BL, FILE_HANDLE         ; Get the DOS handle
  152.          MOV AH, 57h                 ; DOS set file date/time
  153.          SUB AL, AL                  ; Date/time DOS request
  154.          INT 21h
  155.          MOV AL, 1                   ; Set date/time DOS value
  156.          POP CX                      ; Get new time back
  157.          INT 21h                     ; Set new time
  158.  
  159. CLOSE_FILE:
  160.          MOV BH, 0
  161.          MOV BL, FILE_HANDLE         ; Get the DOS handle
  162.          MOV AX, 3E00h               ; DOS request to close file
  163.          INT 21h
  164.  
  165.  
  166. EXIT_TIME:
  167.          MOV AL, CS:SET_FLAG         ; Get the set flag
  168.          CMP AL, 0                   ; Is it zero?
  169.          JE AROUND2                  ; Yes! Jump around next line
  170.          POP DS                      ; Error condition, fix stack
  171. AROUND2:
  172.          POP_REGS                    ; Restore all registers
  173.          MOV AX, CS                  ; Segment of return time
  174.          MOV BX, OFFSET CS:GET_TIME  ; Offset of return time
  175.          RET_STRING AX BX            ; Return time string
  176.  
  177. FILETIME ENDP                        ; End of procedure
  178.  
  179. CODESEG  ENDS                        ; End of code segment
  180.          END                         ; End of assembly
  181.  
  182.