home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
BDOS
/
Z80DOS10.LBR
/
Z80DTIME.ZZ0
/
Z80DTIME.Z8°
Wrap
Text File
|
2000-06-30
|
7KB
|
252 lines
; 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 <crw>
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 <crw>
call time ; return pointer in hl
pop bc
pop de ; get pointer
ld c,b ; set write 2 or 4 bytes <crw>
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. <crw>
;
; 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 <crw>
;
; 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 <crw>
; ..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 <crw>
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 <crw>
cdate ds 2 ; Create date storage
udate ds 4 ; Update date/time
adate ds 4 ; Last access date/time <crw>
;
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