summaryrefslogtreecommitdiff
path: root/v4.0/src/SELECT/MACROS4.INC
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/SELECT/MACROS4.INC')
-rw-r--r--v4.0/src/SELECT/MACROS4.INC345
1 files changed, 345 insertions, 0 deletions
diff --git a/v4.0/src/SELECT/MACROS4.INC b/v4.0/src/SELECT/MACROS4.INC
new file mode 100644
index 0000000..43278d5
--- /dev/null
+++ b/v4.0/src/SELECT/MACROS4.INC
@@ -0,0 +1,345 @@
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;;****************************************************************************
18page ;;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;;****************************************************************************
38GET_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;;****************************************************************************
73GET_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;;************************************************************;;
105SET_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;;****************************************************************************
137SET_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;;************************************************************************;;
176CHECK_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;
190EXIT_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;;************************************************************************;;
214CHECK_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;
228EXIT_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;;****************************************************************************
272SET_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;;****************************************************************************
332CHECK_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;
345INCLUDE MACROS5.INC ;;AN000;