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
/
BEEHIVE
/
OS
/
P2DOSV3.ARC
/
DATE.MAC
< prev
next >
Wrap
Text File
|
1991-08-11
|
9KB
|
750 lines
.Z80
;
; EQUATES
;
CR EQU 0DH
LF EQU 0AH
;
; CALCULATE DAYS AND YEAR,MONTH,DAYS
;
START: LD (SPSAVE),SP
LD SP,STACK
LD A,(00080H)
ADD A,81H
LD H,0
LD L,A
LD (HL),0
LD HL,00081H
CALL BLANK
CP '/'
JP NZ,START0
LD DE,EXPLA
LD C,9
CALL 5
JP EXIT
;
EXPLA: DEFM 'DATE. Date 03-01-86. Version 5.0'
DEFB CR,LF,CR,LF
DEFM 'With this program you can get and set the current date and time'
DEFB CR,LF,CR,LF
DEFM 'usage : ''DATE'' gives current date and time'
DEFB CR,LF
DEFM ' ''DATE dd/mm/yy hh:mm:ss'' sets current date and time'
DEFB CR,LF
DEFM ' ''DATE s[et]'' sets current date and time in dialog mode'
DEFB CR,LF
DEFM ' ''DATE c[ontinuous]'' display date and time continuous'
DEFB CR,LF
DEFM ' ''DATE //'' display this help info'
DEFB '$'
START0: CP 0
JP Z,GET
CP 'C'
JP Z,CONT
CP 'c'
JP Z,CONT
CP 'S'
JP Z,SET
CP 's'
JP Z,SET
PUSH HL
LD DE,TIMEDT
LD C,200
CALL 5
POP HL
CALL GETDAT
JP C,ERROR
PUSH HL
LD L,E ; YEAR
LD H,019H
LD E,B ; MONTH
CALL CONHEX
CALL CHKDAT
JP C,ERROR
CALL DAYS
LD (TIMEDT),BC
POP HL
CALL BLANK
CP 0
JR Z,START1
CALL GETTIM
JP C,ERROR
CALL BLANK
CP 0
JP NZ,ERROR
CALL CHKTIM
JP C,ERROR
LD A,B ; HOUR
LD (HOUR),A
LD A,C ; MINUTE
LD (MINUTE),A
LD A,E ; SECOND
LD (SECOND),A
START1: LD DE,PRESS
LD C,9
CALL 5
LD C,1
CALL 5
LD DE,TIMEDT
LD C,201
CALL 5
LD A,CR
CALL OUTCH
LD A,LF
CALL OUTCH
;
GET: LD DE,TIMEDT
LD C,200
CALL 5
LD BC,(TIMEDT)
CALL DMJ
CALL PRDMJ
JP EXIT
;
CONT: LD DE,TIMEDT
LD C,200
CALL 5
LD BC,(TIMEDT)
CALL DMJ
CALL PRDMJ
CONT0: LD C,11
CALL 5
OR A
JR NZ,CONT1
LD A,(SECOND)
PUSH AF
LD DE,TIMEDT
LD C,200
CALL 5
POP AF
LD B,A
LD A,(SECOND)
CP B
JR Z,CONT0
LD A,CR
CALL OUTCH
JR CONT
CONT1: LD C,1
CALL 5
JP EXIT
;
SET: LD DE,DATMSG
LD C,9
CALL 5
LD DE,00080H
LD A,126
LD (00080H),A
LD C,10
CALL 5
LD A,LF
CALL OUTCH
LD DE,DATE
LD C,200
CALL 5
LD HL,(DATE)
LD (TIMEDT),HL
LD A,(00081H)
ADD A,82H
LD H,0
LD L,A
LD (HL),0
LD HL,00082H
CALL BLANK
CP 0
JR Z,SET0
CALL GETDAT
JP C,ERROR
CALL BLANK
CP 0
JP NZ,ERROR
LD L,E ; YEAR
LD H,019H
LD E,B ; MONTH
CALL CONHEX
CALL CHKDAT
JP C,ERROR
CALL DAYS
LD (TIMEDT),BC
SET0: LD A,0FFH
LD (TDFLAG),A
LD DE,TIMMSG
LD C,9
CALL 5
LD DE,00080H
LD A,126
LD (00080H),A
LD C,10
CALL 5
LD A,LF
CALL OUTCH
LD DE,DATE
LD C,200
CALL 5
LD HL,DATE+2
LD DE,HOUR
LD BC,3
LDIR
LD A,(00081H)
ADD A,82H
LD H,0
LD L,A
LD (HL),0
LD HL,00082H
CALL BLANK
CP 0
JP Z,SET1
CALL GETTIM
JP C,ERROR
CALL BLANK
CP 0
JP NZ,ERROR
CALL CHKTIM
JP C,ERROR
LD A,B ; HOUR
LD (HOUR),A
LD A,C ; MINUTE
LD (MINUTE),A
LD A,E ; SECOND
LD (SECOND),A
SET1: LD DE,TIMEDT
LD C,201
CALL 5
JP GET
;
ERROR: LD DE,ERRMSG
LD C,9
CALL 5
LD A,(TDFLAG)
OR A
JP Z,SET
JP SET0
;
EXIT: LD SP,(SPSAVE)
RET
;
ERRMSG: DEFM 'Error in data input'
DEFB CR,LF,'$'
;
DATMSG: DEFM 'Enter today''s date (DD/MM/YY): $'
;
TIMMSG: DEFM 'Enter the time (HH:MM:SS): $'
;
PRESS: DEFM 'Press any key to set time $'
;
; GET DATE
;
GETDAT: LD A,(HL)
INC HL
OR A
SCF
RET Z
CALL DIGIT
JR C,GETDAT
DEC HL
CALL NUMBER
RET C
LD C,E ; DAY
GETDT0: LD A,(HL)
INC HL
OR A
SCF
RET Z
CALL DIGIT
JR C,GETDT0
DEC HL
CALL NUMBER
RET C
LD B,E ; MONTH
GETDT1: LD A,(HL)
INC HL
OR A
SCF
RET Z
CALL DIGIT
JR C,GETDT1
DEC HL
CALL NUMBER ; YEAR
RET
;
; GET TIME
;
GETTIM: LD A,(HL)
INC HL
OR A
SCF
RET Z
CALL DIGIT
JR C,GETTIM
DEC HL
CALL NUMBER
RET C
LD B,E ; HOUR
GETT0: LD A,(HL)
INC HL
OR A
SCF
RET Z
CALL DIGIT
JR C,GETT0
DEC HL
CALL NUMBER
RET C
LD C,E ; MINUTE
LD E,0
GETT1: LD A,(HL)
OR A
RET Z
INC HL
CALL DIGIT
JR C,GETT1
DEC HL
CALL NUMBER ; SECOND
RET
;
; CHECK DATE
;
CHKDAT: LD A,E
OR A
SCF
RET Z
CP 12+1
CCF
RET C
PUSH HL
LD D,0
LD HL,DM-1
ADD HL,DE
LD B,(HL) ; DAYS IN MONTH
POP HL
CP 2
JR NZ,CHKDT0
CALL LEAPYR
JR NZ,CHKDT0
INC B
CHKDT0: LD A,C
OR A
SCF
RET Z
CP B
RET Z
CCF
RET
;
; CHECK TIME
;
CHKTIM: LD A,B
CP 24H
CCF
RET C
LD A,C
CP 60H
CCF
RET C
LD A,E
CP 60H
CCF
RET
;
; CALCULATE DAYS
; ENTRY : HL=YEAR (1978..2157)
; E =MONTH (1..12)
; C =DAYS (1..31)
; EXIT : BC=DAYS
; FIRST DAY (00001) : SU 01-01-1978
; LAST DAY (65535) : SU 05-06-2157
;
DAYS: LD B,0
PUSH DE
LD DE,1978
DAYS0: OR A
SBC HL,DE
ADD HL,DE
JR Z,DAYS1
PUSH HL
LD HL,365
ADD HL,BC
LD B,H
LD C,L
POP HL
EX DE,HL
CALL LEAPYR
EX DE,HL
INC DE
JR NZ,DAYS0
INC BC
JR DAYS0
DAYS1: POP DE
PUSH HL
LD HL,DM
LD D,1
DAYS2: LD A,E
CP D
JR Z,DAYS4
LD A,C
ADD A,(HL)
LD C,A
JR NC,DAYS3
INC B
DAYS3: INC HL
LD A,D
INC D
CP 2
JR NZ,DAYS2
EX (SP),HL
CALL LEAPYR
EX (SP),HL
JR NZ,DAYS2
INC BC
JR DAYS2
DAYS4: POP HL
RET
;
; CALCULATE YEAR,MONTH,DAY
; ENTRY : BC=DAYS
; FIRST DAY (00001) : SU 01-01-1978
; LAST DAY (65535) : SU 05-06-2157
; EXIT : HL=YEAR (1978..2157)
; D =DAYS IN LAST MONTH (1..31)
; E =MONTH (1..12)
; B =DAY OF WEEK (1..7, 1=SUNDAY)
; C =DAYS (1..31)
;
DMJ: PUSH BC
LD HL,1978
DMJ0: LD DE,365
CALL LEAPYR
JR NZ,DMJ1
INC DE
DMJ1: LD A,E
SUB C
LD A,D
SBC A,B
JR NC,DMJ2
LD A,C
SUB E
LD C,A
LD A,B
SBC A,D
LD B,A
INC HL
JR DMJ0
DMJ2: LD E,1
PUSH HL
LD HL,DM
DMJ3: LD D,(HL)
LD A,E
CP 2
JR NZ,DMJ4
EX (SP),HL
CALL LEAPYR
EX (SP),HL
JR NZ,DMJ4
INC D
DMJ4: LD A,D
SUB C
LD A,0
SBC A,B
JR NC,DMJ5
LD A,C
SUB D
LD C,A
LD A,B
SBC A,0
LD B,A
INC HL
INC E
JR DMJ3
DMJ5: POP HL
EX (SP),HL
PUSH BC
DEC HL
LD BC,16*256+7
XOR A
DMJ6: RL L
RL H
RLA
CP C
JR C,DMJ7
SUB C
DMJ7: DJNZ DMJ6
INC A
POP BC
LD B,A
POP HL
RET
;
; CALCULATE LEAP YEAR CORRECTION
; ENTRY : HL = YEAR
; EXIT : Z = 1 CORRECTION NECCESARRY
; Z = 0 NO CORRECTION NEEDED
;
LEAPYR: LD A,L
AND 3
RET NZ
PUSH HL
PUSH DE
LD A,-1
LD DE,100
OR A
LEAPY0: INC A
SBC HL,DE
JR NC,LEAPY0
ADD HL,DE
LD H,A
LD A,L
OR A
JR NZ,LEAPY1
LD A,H
AND 3
JR LEAPY2
LEAPY1: XOR A
LEAPY2: POP DE
POP HL
RET
;
; DAYS/MONTH
;
DM: DEFB 31,28,31,30,31,30,31,31,30,31,30,31
;
; CONVERT DAYS,MONTH,YEAR TO HEX
;
CONHEX: LD A,C
CALL BCDHEX
LD C,A
LD A,E
CALL BCDHEX
LD E,A
PUSH DE
LD DE,100
LD A,L
CALL BCDHEX
LD L,A
LD A,H
CALL BCDHEX
LD H,0
OR A
JR Z,CONHX1
CONHX0: ADD HL,DE
DEC A
JR NZ,CONHX0
CONHX1: LD DE,1978
OR A
SBC HL,DE
ADD HL,DE
JR NC,CONHX2
LD DE,100
ADD HL,DE
CONHX2: POP DE
RET
;
; PRINT: DAY IN WEEK,DAYS,MONTH,YEAR
;
PRDMJ: PUSH HL
PUSH BC
LD HL,DAYSWK-3
LD C,B
LD B,0
ADD HL,BC
ADD HL,BC
ADD HL,BC
LD A,(HL)
INC HL
CALL OUTCH
LD A,(HL)
INC HL
CALL OUTCH
LD A,(HL)
CALL OUTCH
POP BC
POP HL
LD A,' '
CALL OUTCH
LD A,C
CALL HEXBCD
CALL OUTBCD
LD A,'-'
CALL OUTCH
PUSH HL
PUSH DE
LD D,0
LD HL,MONTHS-3
ADD HL,DE
ADD HL,DE
ADD HL,DE
LD A,(HL)
INC HL
CALL OUTCH
LD A,(HL)
INC HL
CALL OUTCH
LD A,(HL)
CALL OUTCH
POP DE
POP HL
LD A,'-'
CALL OUTCH
LD A,E
CALL HEXBCD
LD E,A
PUSH DE
LD A,-1
LD DE,100
OR A
PRDMJ0: INC A
SBC HL,DE
JR NC,PRDMJ0
ADD HL,DE
CALL HEXBCD
LD H,A
LD A,L
CALL HEXBCD
LD L,A
POP DE
LD A,H
CALL OUTBCD
LD A,L
CALL OUTBCD
LD A,' '
CALL OUTCH
LD A,(HOUR)
CALL OUTBCD
LD A,':'
CALL OUTCH
LD A,(MINUTE)
CALL OUTBCD
LD A,':'
CALL OUTCH
LD A,(SECOND)
CALL OUTBCD
RET
;
; DAYS IN WEEK
;
MONTHS: DEFM 'JanFebMarAprMayJunJulAugSepOctNovDec'
;
DAYSWK: DEFM 'SunMonTueWedThuFriSat'
;
; CONVERT HEX TO BCD
;
HEXBCD: OR A
RET Z
PUSH BC
LD B,A
XOR A
HXBCD0: ADD A,1
DAA
DJNZ HXBCD0
POP BC
RET
;
; CONVERT BCD TO HEX
;
BCDHEX: OR A
RET Z
PUSH BC
LD B,0
BCDHX0: INC B
SUB 1
DAA
JR NZ,BCDHX0
LD A,B
POP BC
RET
;
; OUTPUT BCD CHAR
;
OUTBCD: PUSH AF
RRCA
RRCA
RRCA
RRCA
AND 0FH
ADD A,'0'
CALL OUTCH
POP AF
PUSH AF
AND 0FH
ADD A,'0'
CALL OUTCH
POP AF
RET
;
; OUTPUT CHAR
;
OUTCH: PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD E,A
LD C,2
CALL 5
POP HL
POP DE
POP BC
POP AF
RET
;
; INPUT NUMBER
;
NUMBER: CALL BLANK
LD A,(HL)
CALL DIGIT
RET C
AND 0FH
LD E,A
LD D,0
NUMB0: INC HL
LD A,(HL)
CALL DIGIT
CCF
RET NC
EX DE,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
AND 0FH
ADD A,L
LD L,A
EX DE,HL
LD A,D
OR A
SCF
RET NZ
JR NUMB0
;
; BLANK INPUT
;
BLANK: LD A,(HL)
CP ' '
JR Z,BLANK0
CP 09H
RET NZ
BLANK0: INC HL
JR BLANK
;
; TEST DIGIT
;
DIGIT: CP '0'
RET C
CP '9'+1
CCF
RET
;
TDFLAG: DEFB 0
;
TIMEDT: DEFW 0
HOUR: DEFB 0
MINUTE: DEFB 0
SECOND: DEFB 0
;
DATE: DEFW 0
DEFS 3
;
SPSAVE: DEFS 2
DEFS 64
STACK:
;
END