]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/SELECT/MACROS4.INC

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / SELECT / MACROS4.INC
1 ;;****************************************************************************
2 ;; Assembler MACROS for use with SELECT.
3 ;; File: MACROS4.INC
4 ;; Latest Change Date: July 16, 1987
5 ;;
6 ;; These macros define powerful assembler verbs neccessary for SELECT.
7 ;;
8 ;; Note: Many of the macros make use of an ASCII-N string for passing
9 ;; parameters. The string is defined below.
10 ;; DW count
11 ;; DB "string_variable",?
12 ;;
13 ;; COUNT is the length of the string and is a word.
14 ;; It is necessary to follow the string with at least one byte for the
15 ;; purpose of changing the ASCII-N string to an ASCII-Z string.
16 ;;
17 ;;****************************************************************************
18 page ;;AN000;
19 ;;****************************************************************************
20 ;;
21 ;; GET_DATE: Get the current system date.
22 ;;
23 ;; SYNTAX: GET_DATE var_year, var_month, var_day
24 ;;
25 ;; INPUT: NONE
26 ;;
27 ;; OUTPUT: CY = 0: CURRENT SYSTEM DATE IS 1/1/80
28 ;; CY = 1: CURRENT SYSTEM DATE IS NOT 1/1/80
29 ;; VAR_YEAR - SYSTEM YEAR (16 BITS)
30 ;; VAR_MONTH - SYSTEM MONTH (16 BITS)
31 ;; VAR_DAY - SYSTEM DAY (16 BITS)
32 ;;
33 ;; OPERATION: DOS function call 2Ah is performed to get the current
34 ;; system date. If the system date is not 1/1/80, the
35 ;; carry flag is set.
36 ;;
37 ;;****************************************************************************
38 GET_DATE MACRO VAR_YEAR, VAR_MONTH, VAR_DAY ;;AN000;
39
40 MOV AH,2AH ;;AN000; get time dos interrupt
41 DOSCALL ;;AN000;
42 MOV VAR_YEAR, CX ;;AN000; Save the date.
43 MOV CH,0 ;;AN000; Clear the byte
44 MOV CL,DH ;;AN000;
45 MOV VAR_MONTH, CX ;;AN000;
46 MOV CL,DL ;;AN000;
47 MOV VAR_DAY, CX ;;AN000;
48 .IF < VAR_YEAR EQ 1980 > AND ;;AN000; See if it is the base year.
49 .IF < DX EQ 0101H> ;;AN000; i.e. 1/1/80
50 CLC ;;AN000; Yes it is.
51 .ELSE ;;AN000;
52 STC ;;AN000;
53 .ENDIF ;;AN000;
54
55 ENDM ;;AN000;
56 ;;****************************************************************************
57 ;;
58 ;; GET_TIME: Get current system time.
59 ;;
60 ;; SYNTAX: GET_TIME var_hour, var_minutes, var_seconds
61 ;;
62 ;; INPUT: None.
63 ;;
64 ;; OUTPUT: VAR_HOUR - SYSTEM HOUR (16 BITS)
65 ;; VAR_MINUTES - SYSTEM MINUTES (16 BITS)
66 ;; VAR_SECONDS - SYSTEM SECONDS (16 BITS)
67 ;;
68 ;; OPERATION: DOS function call 2Ch is performed to get the current
69 ;; system time.
70 ;;
71 ;;
72 ;;****************************************************************************
73 GET_TIME MACRO VAR_HOUR, VAR_MINUTES, VAR_SECONDS ;;AN000;
74
75
76 MOV AH,2CH ;;AN000; get time dos interrupt
77 DOSCALL ;;AN000;
78
79 MOV AH, 0 ;;AN000;
80 MOV AL, CH ;;AN000;
81 MOV VAR_HOUR, AX ;;AN000;
82 MOV AL, CL ;;AN000;
83 MOV VAR_MINUTES, AX ;;AN000;
84 MOV AL, DH ;;AN000;
85 MOV VAR_SECONDS, AX ;;AN000;
86
87
88 ENDM ;;AN000;
89 ;;************************************************************************;;
90 ;; SET_DATE: Sets the system date
91 ;;
92 ;; SYNTAX: SET_DATE var_year, var_month, var_day
93 ;;
94 ;; INPUT: var_year - 1980 - 2099 ( 16 bits )
95 ;; var_month - 1 - 12 ( 16 bits )
96 ;; var_day - 1 - 31 ( 16 bits )
97 ;;
98 ;; OUTPUT: CY = 0: SUCCESSFUL
99 ;; CY = 1: ERROR - Date is not valid
100 ;;
101 ;; OPERATION: DOS function call 2Bh is performed to set the system date.
102 ;; If the date is not valid, the carry flag is set.
103 ;;
104 ;;************************************************************;;
105 SET_DATE MACRO VAR_YEAR, VAR_MONTH, VAR_DAY ;;AN000;
106 MOV CX, VAR_YEAR ;;AN000;
107 MOV AX, VAR_MONTH ;;AN000;
108 MOV DH, AL ;;AN000;
109 MOV AX, VAR_DAY ;;AN000;
110 MOV DL, AL ;;AN000;
111 MOV AH,2BH ;;AN000; set date dos interrupt
112 DOSCALL ;;AN000;
113 .IF < ZERO AL > ;;AN000;
114 CLC ;;AN000;
115 .ELSE ;;AN000;
116 STC ;;AN000;
117 .ENDIF ;;AN000;
118 ENDM ;;AN000;
119 ;;****************************************************************************
120 ;;
121 ;; SET_TIME: Sets the current system time.
122 ;;
123 ;; SYNTAX: SET_TIME var_hour, var_minutes, var_seconds
124 ;;
125 ;; INPUT: var_hour = 0 - 23 ( 16 BITS )
126 ;; var_minutes = 0 - 59 ( 16 BITS )
127 ;; var_seconds = 0 - 59 ( 16 BITS )
128 ;; hundredth = Assumed to be zero
129 ;;
130 ;; OUTPUT: CY = 0: SUCCESSFUL
131 ;; CY = 1: Error - Date is not valid
132 ;;
133 ;; OPERATION: DOS function call 2Dh is performed to set the current system
134 ;; time. If the time is not valid, the carry flag will be set.
135 ;;
136 ;;****************************************************************************
137 SET_TIME MACRO VAR_HOUR, VAR_MINUTES, VAR_SECONDS ;;AN000;
138
139 MOV AX, VAR_HOUR ;;AN000;
140 MOV CH, AL ;;AN000;
141 MOV AX, VAR_MINUTES ;;AN000;
142 MOV CL, AL ;;AN000;
143 MOV AX, VAR_SECONDS ;;AN000;
144 MOV DH, AL ;;AN000;
145 MOV DL, 0 ;;AN000; Hundredths of seconds is 0
146 MOV AH,2DH ;;AN000; set time dos interrupt
147 DOSCALL ;;AN000;
148 .IF < ZERO AL > ;;AN000;
149 CLC ;;AN000;
150 .ELSE ;;AN000;
151 STC ;;AN000;
152 .ENDIF ;;AN000;
153 ENDM ;;AN000;
154 ;;****************************************************************************
155 ;;
156 ;; CHECK_TIME_CHANGE: Check if user entered time is different from the
157 ;; specified system time.
158 ;;
159 ;; SYNTAX: CHECK_TIME_CHANGE: var_u_hour, var_u_min, var_u_sec,
160 ;; var_s_hour, var_s_min, var_s_sec
161 ;;
162 ;; INPUT: var_u_hour = User specified hour ( 16 bits )
163 ;; var_u_min = User specified minutes ( 16 bits )
164 ;; var_u_sec = User specified seconds ( 16 bits )
165 ;; var_s_hour = System hour ( 16 bits )
166 ;; var_s_min = System min ( 16 bits )
167 ;; var_s_sec = System sec ( 16 bits )
168 ;;
169 ;; OUTPUT: CY = 0: User specified time is the same as the system time.
170 ;; CY = 1: User specified time is different from the system time.
171 ;;
172 ;; OPERATION: The user time and system time are compared and the carry
173 ;; flag is updated as specified above.
174 ;;
175 ;;************************************************************************;;
176 CHECK_TIME_CHANGE MACRO VAR_U_HOUR, VAR_U_MIN, VAR_U_SEC, VAR_S_HOUR, VAR_S_MIN, VAR_S_SEC ;;AN000;
177 LOCAL EXIT_CHECK_TIME_CHANGE ;;AN000;
178 MOV AX, VAR_S_HOUR ;;AN000;
179 .IF < VAR_U_HOUR EQ AX > ;;AN000;
180 MOV AX, VAR_S_MIN ;;AN000;
181 .IF < VAR_U_MIN EQ AX > ;;AN000;
182 MOV AX, VAR_S_SEC ;;AN000;
183 .IF < VAR_U_SEC EQ AX > ;;AN000;
184 CLC ;;AN000;
185 JMP EXIT_CHECK_TIME_CHANGE;AN000;
186 .ENDIF ;;AN000;
187 .ENDIF ;;AN000;
188 .ENDIF ;;AN000;
189 STC ;;AN000;
190 EXIT_CHECK_TIME_CHANGE: ;;AN000;
191 ENDM ;;AN000;
192 ;;****************************************************************************
193 ;;
194 ;; CHECK_DATE_CHANGE: Check if user entered date is different from the
195 ;; specified system date.
196 ;;
197 ;; SYNTAX: CHECK_DATE_CHANGE: var_u_year, var_u_month, var_u_day,
198 ;; var_s_year, var_s_month, var_s_day
199 ;;
200 ;; INPUT: var_u_year = User specified year ( 16 bits )
201 ;; var_u_month = User specified month ( 16 bits )
202 ;; var_u_day = User specified day ( 16 bits )
203 ;; var_s_year = System year ( 16 bits )
204 ;; var_s_month = System month ( 16 bits )
205 ;; var_s_day = System day ( 16 bits )
206 ;;
207 ;; OUTPUT: CY = 0: User specified date is the same as the system date.
208 ;; CY = 1: User specified date is different from the system date.
209 ;;
210 ;; OPERATION: The user date and system date are compared and the carry
211 ;; flag is updated as specified above.
212 ;;
213 ;;************************************************************************;;
214 CHECK_DATE_CHANGE MACRO VAR_U_YEAR, VAR_U_MONTH, VAR_U_DAY, VAR_S_YEAR, VAR_S_MONTH, VAR_S_DAY ;;AN000;
215 LOCAL EXIT_CHECK_DATE_CHANGE ;;AN000;
216 MOV AX, VAR_S_YEAR ;;AN000;
217 .IF < VAR_U_YEAR EQ AX > ;;AN000;
218 MOV AX, VAR_S_MONTH ;;AN000;
219 .IF < VAR_U_MONTH EQ AX > ;;AN000;
220 MOV AX, VAR_S_DAY ;;AN000;
221 .IF < VAR_U_DAY EQ AX > ;;AN000;
222 CLC ;;AN000;
223 JMP EXIT_CHECK_DATE_CHANGE ;;AN000;
224 .ENDIF ;;AN000;
225 .ENDIF ;;AN000;
226 .ENDIF ;;AN000;
227 STC ;;AN000;
228 EXIT_CHECK_DATE_CHANGE: ;;AN000;
229 ENDM ;;AN000;
230 ;;****************************************************************************
231 ;;
232 ;; SET_FILE_DATE_TIME: Set a files date and time.
233 ;;
234 ;; SYNTAX: SET_FILE_DATE_TIME file_handle, var_hour, var_minutes, var_seconds
235 ;; var_year, var_month, var_day
236 ;;
237 ;; INPUT:
238 ;; file_handle = The handle of the file to set the time/date of.
239 ;; var_hour = 0 - 23 ( 16 bits )
240 ;; var_minutes = 0 - 59 ( 16 bits )
241 ;; var_seconds = 0 - 59 ( 16 bits )
242 ;; var_year = 1980 - 2099 ( 16 bits )
243 ;; var_month = 1 - 12 ( 16 bits )
244 ;; var_day = 1 - 31 ( 16 bits )
245 ;;
246 ;; OUTPUTS:
247 ;; CY = 0: Success
248 ;; CY = 1: Error - Date/Time format is invalid
249 ;;
250 ;; OPERATION: The data and time values are converted to internal formats
251 ;; defined below and DOS function call 57h is performed to set the
252 ;; files date and time.
253 ;;
254 ;;
255 ;; The internal time format is:
256 ;; bits 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
257 ;; h h h h h m m m m m m x x x x x
258 ;;
259 ;; h - Binary number of hours ( 0 - 23 )
260 ;; m - Binary number of minutes ( 0 - 59 )
261 ;; x - Binary number of two second increments
262 ;;
263 ;; The internal date format is:
264 ;; bits 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
265 ;; y y y y y y y m m m m d d d d d
266 ;;
267 ;; y - 0 - 119 ( 1980 - 2099 )
268 ;; m - 1 - 31
269 ;; d - 1 - 31
270 ;;
271 ;;****************************************************************************
272 SET_FILE_DATE_TIME MACRO FILE_HANDLE, VAR_HOUR, VAR_MINUTES, VAR_SECONDS, VAR_YEAR, VAR_MONTH, VAR_DAY ;;AN000;
273 CALL HOOK_INT_24 ;;AN000;
274 ;;
275 ;; Handle the file's time first
276 ;;
277 MOV BX, VAR_SECONDS ;;AN000; Get the number of seconds
278 SHR BX, 1 ;;AN000; Need the number of 2 seconds
279 MOV AX, VAR_MINUTES ;;AN000; Get the number of minutes
280 MOV CL, 5 ;;AN000;
281 SHL AX, CL ;;AN000; Least significant bit #5
282 OR BX, AX ;;AN000;
283 MOV AX, VAR_HOUR ;;AN000; Get the number of hours
284 XCHG AH, AL ;;AN000;
285 MOV CL, 3 ;;AN000;
286 SHL AX, CL ;;AN000; Put hours at bit #11
287 OR BX, AX ;;AN000;
288 ;;
289 ;; Handle the file's date now
290 ;;
291 MOV DX, VAR_DAY ;;AN000; Get the day.
292 MOV AX, VAR_MONTH ;;AN000;
293 MOV CL, 5 ;;AN000;
294 SHL AX, CL ;;AN000; Least significant month bit #5
295 OR DX, AX ;;AN000;
296 MOV AX, VAR_YEAR ;;AN000; Get the year (1980 - 2099)
297 SUB AX, 1980 ;;AN000; Put in the range 0 - 119
298 XCHG AL, AH ;;AN000;
299 SHL AX, 1 ;;AN000;
300 OR DX, AX ;;AN000;
301
302 MOV CX, BX ;;AN000;
303 MOV BX, FILE_HANDLE ;;AN000;
304 MOV AX, 5701H ;;AN000;
305 DOSCALL ;;AN000;
306 CALL RESTORE_INT_24 ;;AN000;
307
308 ENDM ;;AN000;
309 ;;************************************************************************;;
310 ;;
311 ;; CHECK_CLOCK: Check if the real time clock is operating.
312 ;;
313 ;; SYNTAX: CHECK_CLOCK
314 ;;
315 ;; INPUT:
316 ;; None.
317 ;;
318 ;; OUTPUT:
319 ;; CY = 0: Real time clock is operating
320 ;; CY = 1: Real time clock is not operating
321 ;;
322 ;; OPERATION: A call to the real time clock services (INT 1Ah, AH = 02h)
323 ;; is performed to get the real time clock. If the clock is operating,
324 ;; the time is returned in the registers and CF = 0 is returned. If the
325 ;; clock is not operating, CF = 1 is returned.
326 ;;
327 ;; Since the older machines may not have the clock services interrupt,
328 ;; the registers are set to zero before the call is made and checked for
329 ;; non-zero on return.
330 ;;
331 ;;****************************************************************************
332 CHECK_CLOCK MACRO ;;AN000;
333 MOV CX, 0 ;;AN000; Zero the registers for later comparison
334 MOV DX, 0 ;;AN000;
335 MOV AH, 02 ;;AN000;
336 INT 1AH ;;AN000; Time of day service routine
337 .IF < ZERO CX > AND ;;AN000; If CX and DH are zero, clock is not there.
338 .IF < ZERO DH > ;;AN000;
339 STC ;;AN000;
340 .ELSE ;;AN000;
341 CLC ;;AN000; The clock is there!
342 .ENDIF ;;AN000;
343
344 ENDM ;;AN000;
345 INCLUDE MACROS5.INC ;;AN000;