; Z80DOS - Z80 Disk Operating System ; ; Version 1.0 - 05 Sept. 87 by Carson Wilson ; ; ------------------------------------------------------------------- ; ; Z80DTIME.Z80 - Time Functions, Exit Routine, RAM Area ; ; ------------------------------------------------------------------- ; Time Routines ; ; Set file's time and date ; ; Entry: E = 2 - set creation date or get time stamp ; E = 4 - Set last update time/date ; E = 8 - Set last access time/date ; ; Exit: Z if time stamps present ; NZ if no time stamps stime: ld hl,(dirbuf) ; get directory entry ld bc,060h ; offset entry point time/date stamp add hl,bc ; add offset to time stamp ld a,(hl) ; get time stamp byte sub 021h ; time stamp present? ret nz ; no, return ld d,a ; yes, clear d add hl,de ; add entry (update/create/access) ld a,e ; set access time if E ge 8 and 8 ; jr z,stim1 ; E lt 8 srl e ; E ge 8, set to 4 stim1: ld b,e ; save # bytes to write ld a,(secpnt) ; get sector pointer rrca ; shift 2 times rrca ld e,a ; save it rrca ; shift 2 times rrca add a,e ; add it (a=0,10,20) ld e,a ; save in e add hl,de ; add offset ld a,(funct) cp 54 ; if set DOS time ret z ; ..just point to date stamp push hl ; save result ld c,0 ; time return date/time pointer in hl push bc ; save 2 or 4 byte count call time ; return pointer in hl pop bc pop de ; get pointer ld c,b ; set write 2 or 4 bytes ld b,0 ldir ; copy 2 or 4 bytes to directory buff. xor a ; set zero flag - time stamps present ret ; and return to caller ; ; Store time stamp following file find, open, or make. ; ; Exit: HL points to file's 10-byte time stamp ; stored in DOS for subsequent commands ; when DOS-time is on (command 55). ; GetStp: ld e,2 ; point to file's stamp call stime ; point to beginning of ; ..last file's stamp ld de,cdate ; point to DOS storage ld (pexit),de ; save for return ld bc,10 jr nz,GtStp1 ; no stamp found ldir ; save full stamp ret GtStp1: ld b,c GtStp2: ld a,0 ; else zero out storage ld (de),a inc de djnz GtStp2 ret ; return to calling program ; ; Time - get time for stamping from DOS storage or BIOS ; ; Entry: rdwr and dtime both = 0ffh, get time from DOS ; and reset dtime to 0 ; else get time from BIOS ; ; Format of time returned to pointer in HL: ; ; HL + 0 = low byte of date since Dec. 31, 1977 ; HL + 1 = high byte of date since Dec. 31, 1977 ; HL + 2 = hours (BCD) ; HL + 3 = minutes (BCD) ; HL + 4 = seconds (BCD) (not used in time stamp) ; time: ld a,(dtime) ; Use DOS time? or a jr z,btime ; no, get BIOS time ld a,(funct) cp 22 ; creating file? ld hl,cdate ; point to create date jr z,time2 ; yes ld hl,udate ; no, point to update date/time time2: xor a ld (dtime),a ; use DOS time for one call only ret ; ; Get BIOS time to address DE ; gettim: push de ; save address to put time ld c,0 ; get time address call btime ; execute p2bios call pop de ; restore address to put time ld bc,5 ; 5 bytes to move ldir ; store the time ret ; and return to caller ; ; Set BIOS time from address DE ; settim: ex de,hl ; get address time in hl ld c,0ffh ; set time address ; and fall through to p2bios call ; ; Get/Set time in BIOS clock interface ; ; Entry: C = 0: On return HL points to 5-byte time entry ; C <> 0: 5-byte entry pointed to by HL sets system time btime: ; get system time push hl ; save value in hl ld hl,(timead) ; get address time routine ex (sp),hl ; put address on stack and restore hl ret ; execute BIOS time routine ; ; Use stored time stamp for very next DOS call ; ..all other DOS calls cancel DOS time thru p2exit ; UseStp: or 0ffh ld (dtime),a ; Use DOS time pop hl ; clean up stack jr p2ext0 ; ---------------------------- ; DOS exit routines ; ---------------------------- p2exit: xor a ld (dtime),a ; turn off DOS time ld a,(fldrv) ; test drive select used flag or a jr z,p2ext0 ; no then exit ld a,(FCB0) ; get FCB byte 0 ld (ix+0),a ; save it ld a,(drive) ; get old drive number call seldk ; select disk p2ext0: push ix ; save ix pop de ; restore de pop ix ; restore ix ld sp,(spsave) ; get old sp ld hl,(pexit) ; get exit code ld a,(funct) ; get function code ld c,a ; restore c ld a,l ; copy function code ld b,h ret ; and return to caller ; -------------------- ; RAM area ; -------------------- tabcnt: defb 0 ; tab counter tabcx1: defb 0 ; temporary tab counter (used by rdbuf) fcontp: defb 0 ; list enable flag (control p) lastch: defb 0 ; last character delay: defb 0ffh ; delay counter ; trans: defw 0 ; translation vector temp0: defw 0 ; number of files on drive dirbuf: defw 0 ; directory buffer ixp: defw 0 ; disk parameter block csv: defw 0 ; check sum pointer alv: defw 0 ; allocation vector pointer ; maxsec: defw 0 ; maximum number of sectors/track nblock: defb 0 ; number of blocks nmask: defb 0 ; mask number of blocks nextnd: defb 0 ; extent mask maxlen: defw 0 ; maximum block number-1 nfiles: defw 0 ; maximum number of files-1 ndir0: defb 0 ; first two entries alv buffer ndir1: defb 0 ncheck: defw 0 ; number of checksum entries nftrk: defw 0 ; first track number ; dskro: defw 0 ; disk R/O vector login: defw 0 ; login vector DMA: defw 080h ; DMA address ; funct: defb 0 ; function number pexit: defw 0 ; exit code fldrv: defb 0 ; drive select used flag rdwr: defb 0 ; read/write flag ; FCB0: defb 0 ; FCB byte 0 user: defb 0 ; user number drive: defb 0 ; drive number defdrv: defb 0 ; default drive number recdir: defw 0 ; record directory (checksum) filcnt: defw 0 ; file counter secpnt: defb 0 ; sector pointer subflg: defb 0 ; submit flag (reset disk command) ; dcopy: defw 0 ; copy address FCB searex: defb 0 ; exit code search searnb: defb 0 ; search number of bytes searqu: defb 0 ; search question mark used searpu: defb 0 ; search public file ;next two flags added by b.h. diff: db 0 ; Disk changed flag retflg: db 0 ; allow retry on error when non-zero ; dtime db 0 ; Flag for UseStp cdate ds 2 ; Create date storage udate ds 4 ; Update date/time adate ds 4 ; Last access date/time ; spsave: defw 0 ; stack pointer location defs 64 DOSs: equ $ ; DOS internal 64 byte stack DOSstop equ $ ; if ((DOSstop-DOS) gt 3584) * BDOS over 3584 bytes - too large!! * endif ; END Z80DTIME.Z80