home *** CD-ROM | disk | FTP | other *** search
- ; --------------------------------------------------------------
- ; FUNCTION NAME: FILEDATE - Gets or sets the DOS date on a file
- ; --------------------------------------------------------------
- ; Copyright(c) 1988-1990 -- James Occhiogrosso
-
- INCLUDE DEVELOP.MAC ; Developer's Library macro file
-
- PUBLIC FILEDATE ; Declare function name
-
- ; Declare Clipper EXTERNALS
- EXTRN __PARINFO:FAR ; Get Clipper parameter information
- EXTRN __PARDS:FAR ; Get a Clipper date
- EXTRN __PARC:FAR ; Get a Clipper string
- EXTRN __RETDS:FAR ; Return date string to Clipper
- EXTRN __RETC:FAR ; Return a string to Clipper
-
-
- CODESEG SEGMENT 'CODE'
- ASSUME CS:CODESEG
-
-
- FILEDATE PROC FAR ; Get or set date on a file
-
- JMP BEGIN ; Jump around data area
-
- FILE_HANDLE DB 0 ; Store file handle
- GET_DATE DB 08h DUP(0) ; Store Clipper return date
- SET_FLAG DB 0 ; Set to 1 if setting date
-
- BEGIN:
- PUSH_REGS ; Save Clipper registers
-
- PUSH DS ; Save Clipper data segment
- PUSH CS ;
- POP DS ; Set up our data segment
- MOV BX, OFFSET FILE_HANDLE ; Get address of first data
- MOV AX, 0
- MOV CX, 5 ; Loop five times (10 bytes)
- NEXT: MOV [BX], AX ; Clear date string area
- ADD BX, 2 ; Increment the address
- LOOP NEXT
- POP DS ; Restore Clipper DS
-
- P_TYPE 1 ; Get parameter type to AX
- CMP AX, 1 ; Character string passed?
- JNE RET_NULL_1 ; No! Return null date
-
- P_COUNT ; Yes! Get parameter count
- CMP AX, 02 ; If no second parameter,
- JNE OPEN_FILE ; get file date and return
- P_TYPE 2 ; Else, get parameter type
- CMP AX, 8 ; Is it a date?
- JNE RET_NULL_1 ; No! Return null date
- MOV CS:SET_FLAG, 1 ; Yes! Set the flag
- PUSH DS ; Save the data segment
- JMP OPEN_FILE ; Jump around null return
-
-
- RET_NULL_1: ;
- JMP EXIT_DATE ; RET_NULL label for direct
- ; jump to exit point due
- RET_NULL_2: ; to an error condition
- JMP CLOSE_FILE ;
-
-
- OPEN_FILE:
- GET_PARC 1 ; Get address of filename
- MOV DS, DX ; Get filename segment
- MOV DX, AX ; Get filename offset
- SUB AL, AL ; Read-only mode
- MOV AH, 3Dh ; Open file request
- INT 21h ;
- JC RET_NULL_1 ; On error, return null date
- MOV CS:FILE_HANDLE, AL ; Save the file handle
-
- GET_THE_DATE:
- PUSH CS ; Move data segment to CS
- POP DS ; for our data
- SUB BH, BH ; Clear upper handle byte
- MOV BL, FILE_HANDLE ; Get the DOS handle
- MOV AH, 57h ; DOS date/time function
- SUB AL, AL ; Clear lower byte
- INT 21h ;
- JC RET_NULL_2 ; Error! Return null date
-
- MOV AL, DL ; Move days to AL
- AND AL, 00011111b ; Mask out the unused bits
- AAM ; Adjust MS/LS digits
- ADD AX, 3030h ; Convert digits to ASCII
- MOV BX, OFFSET GET_DATE ; Get address of return date
- MOV [BX+6], AH ; Save days digits (tens)
- MOV [BX+7], AL ; Save days digits (ones)
-
- MOV AX, DX ; Restore original Date
- MOV CL, 5 ; Get shift count
- SHR AX, CL ; Shift month bits for DOS
- AND AL, 00001111b ; Mask out the unused bits
- AAM ; Adjust MS/LS digits
- ADD AX, 3030h ; Convert digits to ASCII
- MOV [BX+4], AH ; Save days digits (tens)
- MOV [BX+5], AL ; Save days digits (ones)
-
- MOV AX, DX ; Restore original date
- SHR AH, 1 ; Shift year bits
- XCHG AL,AH ; to correct position
- ADD AL, 80d ; Correct to 1980
- CMP AL, 100d ; Are we beyond year 2000
- MOV [BX], 3931h ; No! Default to 19 for MS
- JB AROUND1 ; And skip next 2 lines
- SUB AL, 100d ; Yes! Adjust digit
- MOV [BX], 3032h ; Save MS digit as 20
-
- AROUND1:
- AAM ; Adjust MS/LS digits
- ADD AX, 3030h ; Convert digits to ASCII
- MOV [BX+2], AH ; Save year MS digit (tens)
- MOV [BX+3], AL ; Save year LS digit (ones)
-
-
- SET_THE_DATE:
- MOV AL, CS:SET_FLAG ; Check the flag
- CMP AL, 0 ; Is it set?
- JE CLOSE_FILE ; No! We are done
- POP DS ; Yes! Recover data segment
- MOV CS:SET_FLAG, 0 ; reset flag and
- GET_PARDS 2 ; get passed date
- MOV DS, DX ; Get date segment into DS
- MOV BX, AX ; and offset into BX
-
- MOV AX, WORD PTR [BX+2] ; Get the year digits
- XCHG AH, AL ; Put them in correct order
- SUB AX, 3030h ; Remove ASCII bias
- AAD ; Adjust from ASCII
- CMP AX, 80 ; Is year value > 80 ?
- JAE YEAR_OK ; Yes! Leave it alone.
- ADD AX, 100 ; No! Adjust for century
- YEAR_OK:
- SUB AX, 80 ; Subtract 80 for DOS
- MOV CL, 9 ; Shift constant
- SHL AX, CL ; Shift year left 9 bytes
- PUSH AX ; Save the year value
-
- MOV AX, WORD PTR [BX+4] ; Get the month digits
- XCHG AH, AL ; Put them in correct order
- SUB AX, 3030h ; Remove ASCII bias
- AAD ; Adjust from ASCII
- MOV CL, 5 ; Shift constant
- SHL AX, CL ; Shift month left 5 bytes
- PUSH AX ; Save the month value
-
- MOV AX, WORD PTR [BX+6] ; Get the day digits
- XCHG AH, AL ; Put them in correct order
- SUB AX, 3030h ; Remove ASCII bias
- AAD ; Adjust from ASCII
-
- POP BX ; Get back the month value
- ADD AX, BX ; Add it in
- POP BX ; Get back the year value
- ADD AX, BX ; Add it in
-
- PUSH AX ; Store the new date
- SUB BH, BH
- MOV BL, FILE_HANDLE ; Get the DOS handle
- MOV AH, 57h ; DOS file date request
- SUB AL, AL ; Clear lower byte
- INT 21h
- MOV AL, 1 ; Set date/time DOS value
- POP DX ; Get the new date back
- INT 21h ; Set new date
-
- CLOSE_FILE:
- SUB BH, BH
- MOV BL, FILE_HANDLE ; Get the DOS handle
- MOV AX, 3E00h ; DOS request to close file
- INT 21h
-
-
- EXIT_DATE:
- MOV AL, CS:SET_FLAG ; Get the set flag
- CMP AL, 0 ; Is it zero?
- JE AROUND2 ; Yes! Jump around next line
- POP DS ; No! Fix stack
- AROUND2:
- POP_REGS ; Restore all registers
- MOV AX, CS ; Segment of return date
- MOV BX, OFFSET CS:GET_DATE ; Offset of return date
- RET_DATE AX BX ; Return date to Clipper
-
- FILEDATE ENDP ; End of procedure
-
- CODESEG ENDS ; End of code segment
- END ; End of assembly
-
-