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

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