]> wirehaze git hosting - MS-DOS.git/blob - v2.0/source/TIME.ASM

wirehaze git hosting

Fixed minor spelling error in README.txt
[MS-DOS.git] / v2.0 / source / TIME.ASM
1 ;
2 ; Time and date functions for MSDOS
3 ;
4
5 INCLUDE DOSSEG.ASM
6
7 CODE SEGMENT BYTE PUBLIC 'CODE'
8 ASSUME SS:DOSGROUP,CS:DOSGROUP
9
10 .xlist
11 .xcref
12 INCLUDE DOSSYM.ASM
13 INCLUDE DEVSYM.ASM
14 .cref
15 .list
16
17 TITLE TIME - time and date functions
18 NAME TIME
19
20
21 i_need DAY,BYTE
22 i_need MONTH,BYTE
23 i_need YEAR,WORD
24 i_need WEEKDAY,BYTE
25 i_need TIMEBUF,6
26 i_need BCLOCK,DWORD
27 i_need DAYCNT,WORD
28 i_need YRTAB,8
29 i_need MONTAB,12
30
31 FOURYEARS = 3*365 + 366
32
33 SUBTTL DATE16, READTIME, DODATE -- GUTS OF TIME AND DATE
34 PAGE
35 ;
36 ; Date16 returns the current date in AX, current time in DX
37 ; AX - YYYYYYYMMMMDDDDD years months days
38 ; DX - HHHHHMMMMMMSSSSS hours minutes seconds/2
39 ;
40 procedure DATE16,NEAR
41 ASSUME DS:DOSGROUP,ES:NOTHING
42 PUSH CX
43 PUSH ES
44 CALL READTIME
45 POP ES
46 SHL CL,1 ;Minutes to left part of byte
47 SHL CL,1
48 SHL CX,1 ;Push hours and minutes to left end
49 SHL CX,1
50 SHL CX,1
51 SHR DH,1 ;Count every two seconds
52 OR CL,DH ;Combine seconds with hours and minutes
53 MOV DX,CX
54 MOV AX,WORD PTR [MONTH] ;Fetch month and year
55 MOV CL,4
56 SHL AL,CL ;Push month to left to make room for day
57 SHL AX,1
58 POP CX
59 OR AL,[DAY]
60 RET
61 DATE16 ENDP
62
63 procedure READTIME,NEAR
64
65 ASSUME DS:DOSGROUP,ES:NOTHING
66 ;Gets time in CX:DX. Figures new date if it has changed.
67 ;Uses AX, CX, DX.
68
69 PUSH SI
70 PUSH BX
71 MOV BX,OFFSET DOSGROUP:TIMEBUF
72 MOV CX,6
73 XOR DX,DX
74 MOV AX,DX
75 invoke SETREAD
76 PUSH DS
77 LDS SI,[BCLOCK]
78 ASSUME DS:NOTHING
79 invoke DEVIOCALL2 ;Get correct date and time
80 POP DS
81 ASSUME DS:DOSGROUP
82 POP BX
83 POP SI
84 MOV AX,WORD PTR [TIMEBUF]
85 MOV CX,WORD PTR [TIMEBUF+2]
86 MOV DX,WORD PTR [TIMEBUF+4]
87 CMP AX,[DAYCNT] ;See if day count is the same
88 JZ RET22
89 CMP AX,FOURYEARS*30 ;Number of days in 120 years
90 JAE RET22 ;Ignore if too large
91 MOV [DAYCNT],AX
92 PUSH SI
93 PUSH CX
94 PUSH DX ;Save time
95 XOR DX,DX
96 MOV CX,FOURYEARS ;Number of days in 4 years
97 DIV CX ;Compute number of 4-year units
98 SHL AX,1
99 SHL AX,1
100 SHL AX,1 ;Multiply by 8 (no. of half-years)
101 MOV CX,AX ;<240 implies AH=0
102 MOV SI,OFFSET DOSGROUP:YRTAB ;Table of days in each year
103 CALL DSLIDE ;Find out which of four years we're in
104 SHR CX,1 ;Convert half-years to whole years
105 JNC SK ;Extra half-year?
106 ADD DX,200
107 SK:
108 CALL SETYEAR
109 MOV CL,1 ;At least at first month in year
110 MOV SI,OFFSET DOSGROUP:MONTAB ;Table of days in each month
111 CALL DSLIDE ;Find out which month we're in
112 MOV [MONTH],CL
113 INC DX ;Remainder is day of month (start with one)
114 MOV [DAY],DL
115 CALL WKDAY ;Set day of week
116 POP DX
117 POP CX
118 POP SI
119 RET22: RET
120 READTIME ENDP
121
122 procedure DSLIDE,NEAR
123 MOV AH,0
124 DSLIDE1:
125 LODSB ;Get count of days
126 CMP DX,AX ;See if it will fit
127 JB RET23 ;If not, done
128 SUB DX,AX
129 INC CX ;Count one more month/year
130 JMP SHORT DSLIDE1
131 DSLIDE ENDP
132
133 procedure SETYEAR,NEAR
134 ;Set year with value in CX. Adjust length of February for this year.
135 MOV BYTE PTR [YEAR],CL
136
137 CHKYR:
138 TEST CL,3 ;Check for leap year
139 MOV AL,28
140 JNZ SAVFEB ;28 days if no leap year
141 INC AL ;Add leap day
142 SAVFEB:
143 MOV [MONTAB+1],AL ;Store for February
144 RET23: RET
145 SETYEAR ENDP
146
147 procedure DODATE,NEAR
148 ASSUME DS:DOSGROUP,ES:NOTHING
149 CALL CHKYR ;Set Feb. up for new year
150 MOV AL,DH
151 MOV BX,OFFSET DOSGROUP:MONTAB-1
152 XLAT ;Look up days in month
153 CMP AL,DL
154 MOV AL,-1 ;Restore error flag, just in case
155 JB RET25 ;Error if too many days
156 CALL SETYEAR
157 MOV WORD PTR [DAY],DX ;Set both day and month
158 SHR CX,1
159 SHR CX,1
160 MOV AX,FOURYEARS
161 MOV BX,DX
162 MUL CX
163 MOV CL,BYTE PTR [YEAR]
164 AND CL,3
165 MOV SI,OFFSET DOSGROUP:YRTAB
166 MOV DX,AX
167 SHL CX,1 ;Two entries per year, so double count
168 CALL DSUM ;Add up the days in each year
169 MOV CL,BH ;Month of year
170 MOV SI,OFFSET DOSGROUP:MONTAB
171 DEC CX ;Account for months starting with one
172 CALL DSUM ;Add up days in each month
173 MOV CL,BL ;Day of month
174 DEC CX ;Account for days starting with one
175 ADD DX,CX ;Add in to day total
176 XCHG AX,DX ;Get day count in AX
177 MOV [DAYCNT],AX
178 PUSH SI
179 PUSH BX
180 PUSH AX
181 MOV BX,OFFSET DOSGROUP:TIMEBUF
182 MOV CX,6
183 XOR DX,DX
184 MOV AX,DX
185 PUSH BX
186 invoke SETREAD
187 ASSUME ES:DOSGROUP
188 PUSH DS
189 LDS SI,[BCLOCK]
190 ASSUME DS:NOTHING
191 invoke DEVIOCALL2 ;Get correct date and time
192 POP DS
193 POP BX
194 ASSUME DS:DOSGROUP
195 invoke SETWRITE
196 POP WORD PTR [TIMEBUF]
197 PUSH DS
198 LDS SI,[BCLOCK]
199 ASSUME DS:NOTHING
200 invoke DEVIOCALL2 ;Set the date
201 POP DS
202 ASSUME DS:DOSGROUP
203 POP BX
204 POP SI
205 WKDAY:
206 MOV AX,[DAYCNT]
207 XOR DX,DX
208 MOV CX,7
209 INC AX
210 INC AX ;First day was Tuesday
211 DIV CX ;Compute day of week
212 MOV [WEEKDAY],DL
213 XOR AL,AL ;Flag OK
214 RET25: RET
215 DODATE ENDP
216
217 procedure DSUM,NEAR
218 MOV AH,0
219 JCXZ RET25
220 DSUM1:
221 LODSB
222 ADD DX,AX
223 LOOP DSUM1
224 RET
225 DSUM ENDP
226
227 do_ext
228
229 CODE ENDS
230 END
231