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

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / SELECT / MACROS2.INC
1 ;;****************************************************************************
2 ;; Assembler MACROS for use with SELECT.
3 ;; File: MACROS2.INC
4 ;; Latest Change Date: August 04, 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 ;; CLOSE_FILE: Close File
22 ;;
23 ;; SYNTAX: CLOSE_FILE handle
24 ;;
25 ;; INPUT: handle = The handle of the file to close.
26 ;;
27 ;; OUTPUT: CY = 0, AX = undefined, successful
28 ;; CY = 1, AX = error code
29 ;;
30 ;; OPERATION:
31 ;;
32 ;; THIS MACROS CLOSES THE FILE WITH THE GIVEN FILE HANDLE.
33 ;; IT MAKES USE OF INT 21 (AH=3EH).
34 ;; IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
35 ;; IS RETURNED IN AX.
36 ;;
37 ;;**************************************************************************
38 CLOSE_FILE MACRO HANDLE ;;AN000;
39 ;;
40 MOV BX, HANDLE ;;AN000;
41 CALL FAR PTR CLOSE_FILE_ROUTINE ;;AN000;
42 ENDM ;;AN000;
43 ;;**************************************************************
44 ;;
45 ;; CREATE_FILE: Create new File
46 ;;
47 ;; SYNTAX: CREATE_FILE name_file, immed_attr, var_handle
48 ;;
49 ;; INPUT: name_file - filename in ASCII-N string format.
50 ;; immed_attr - file attribute
51 ;;
52 ;; OUTPUT: CY = 0 Success: var_handle contain the file handle
53 ;; CY = 1 Error: AX contains as error code
54 ;;
55 ;;
56 ;; OPERATION:
57 ;;
58 ;; CREATE_FILE CREATES A FILE WITH THE GIVEN NAME USING INT 21H (AH=5BH)
59 ;; IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
60 ;; IS RETURNED IN AX.
61 ;;
62 ;;**************************************************************************
63 CREATE_FILE MACRO NAME_FILE, IMMED_ATTR, VAR_HANDLE ;;AN000;
64 LEA DI, NAME_FILE ;;AN000;
65 MOV CX, IMMED_ATTR ;;AN000;
66 CALL CREATE_FILE_ROUTINE ;;AN000;
67 MOV VAR_HANDLE, AX ;;AN000;
68 ENDM ;;AN000;
69 ;;****************************************************************************
70 ;;
71 ;; ERASE_FILE: Erase File
72 ;;
73 ;; SYNTAX: ERASE_FILE filename
74 ;;
75 ;; INPUT: filename = POINTER TO ASCII-N STRING - FILE NAME
76 ;;
77 ;; OUTPUT: CY = 0, AX = undefined, successful
78 ;; CY = 1, AX = error code
79 ;;
80 ;; OPERATION:
81 ;;
82 ;; ERASE_FILE ERASES THE FILE USING INT 21H (AH=41H).
83 ;; IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
84 ;; IS RETURNED IN AX.
85 ;;
86 ;;****************************************************************************
87 ERASE_FILE MACRO FILE_NAME ;;AN000;
88
89 LEA DI, FILE_NAME ;;AN000;
90 CALL ERASE_FILE_ROUTINE ;;AN000;
91 ENDM ;;AN000;
92 ;;****************************************************************************
93 ;;
94 ;; CHMOD_FILE: Change file attributes to read/write
95 ;;
96 ;; SYNTAX: CHMOD_FILE filename
97 ;;
98 ;; INPUT: filename = POINTER TO ASCII-N STRING - FILE NAME
99 ;;
100 ;; OUTPUT: None.
101 ;;
102 ;; OPERATION:
103 ;; The CHMOD dos call is executed (43H) to change the file's attributes
104 ;; to read/write.
105 ;;
106 ;;****************************************************************************
107 CHMOD_FILE MACRO FILE_NAME ;;AN000;
108
109 LEA DI, FILE_NAME ;;AN000;
110 CALL CHMOD_FILE_ROUTINE ;;AN000;
111 ENDM ;;AN000;
112 ;;************************************************************************
113 ;; FIND_FILE: Find File
114 ;;
115 ;; SYNTAX: FIND_FILE name, attribute
116 ;;
117 ;; INPUT: name = POINTER TO ASCII-N STRING - FILE NAME
118 ;; attribute - the file attribute used in the search
119 ;;
120 ;; OUTPUT: CY = 0, AX = undefined, successful
121 ;; CY = 1, AX = error code
122 ;;
123 ;; OPERATION:
124 ;;
125 ;; FINDFILE FINDS THE FIRST FILENAME SPECIFIED USING INT 21 (AH=4EH).
126 ;; AND LOADS INFORMATION INTO THE CURRENT DTA.
127 ;; NOTE : THE DEFAULT DTA IS AT 80H IN THE PSP.
128 ;; IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
129 ;; IS RETURNED IN AX.
130 ;;
131 ;;************************************************************************
132 FIND_FILE MACRO LOC_FILE,ATTRIBUTE ;;AN000;
133 ;;
134 LEA DI, LOC_FILE ;;AN000;
135 MOV CX, ATTRIBUTE ;;AN000;
136 CALL FIND_FILE_ROUTINE ;;AN000;
137 ENDM ;;AN000;
138 ;;************************************************************************
139 ;; FIND_NEXT: Find the next match in the directory.
140 ;;
141 ;; SYNTAX: FIND_NEXT
142 ;;
143 ;; INPUT:
144 ;; None.
145 ;;
146 ;; OUTPUT: CY = 0, AX = undefined, successful
147 ;; CY = 1, AX = error code
148 ;;
149 ;; OPERATION: This macro must be called after FIND_FIRST. It searched
150 ;; the same directory as the FIND_FIRST command for the next match.
151 ;; If none is found then the carry flag is set.
152 ;; This macro uses the data in the DTA for the directory seach so
153 ;; it is important not to change the address of the current DTA.
154 ;;
155 ;;
156 ;;************************************************************************
157 FIND_NEXT MACRO LOC_FILE,ATTRIBUTE ;;AN000;
158 CALL HOOK_INT_24 ;;AN000;
159 MOV INT_24_ERROR, FALSE ;;AN000; Zero the number of critical errors
160 MOV AH,4FH ;;AN000;
161 DOSCALL ;;AN000;
162 CALL RESTORE_INT_24 ;;AN000;
163 ENDM ;;AN000;
164 ;;**************************************************************************
165 ;;
166 ;; OPEN_FILE - Open File
167 ;;
168 ;; SYNTAX: OPEN_FILE file_name, mode, handle
169 ;;
170 ;; INPUT: file_name = POINTER TO ASCII-N STRING - FILE NAME
171 ;; mode = 0,1,2 (read,write,read/write)
172 ;; handle = POINTER TO A LOCATION TO STORE FILE HANDLE
173 ;;
174 ;; OUTPUT: CY = 0, AX = FILE HANDLE, successful
175 ;; CY = 1, AX = error code
176 ;;
177 ;; OPERATION:
178 ;;
179 ;; THIS MACRO OPENS A FILE FOR READ/WRITE OPERATIONS.
180 ;; IT MAKES USE OF INT 21 (AH=3DH).
181 ;; IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
182 ;; IS RETURNED IN AX.
183 ;;
184 ;;**************************************************************************
185 OPEN_FILE MACRO FILE_NAME,MODE,HANDLE ;;AN000;
186
187 LEA DI, FILE_NAME ;;AN000;
188 MOV AL, MODE ;;AN000;
189 CALL OPEN_FILE_ROUTINE ;;AN000;
190 MOV HANDLE, AX ;;AN000;
191 ENDM ;;AN000;
192 ;;**************************************************************************
193 ;;
194 ;; RENAME_FILE - Rename File
195 ;;
196 ;; SYNTAX: RENAME_FILE old_name, new_name
197 ;;
198 ;; INPUT: old_name = POINTER TO ASCII-N STRING -OLD FILE NAME
199 ;; new_name = POINTER TO ASCII-N STRING -NEW FILE NAME
200 ;;
201 ;; OUTPUT: CY = 0, AX = undefined, successful
202 ;; CY = 1, AX = error code
203 ;;
204 ;; OPERATION:
205 ;;
206 ;; THIS MACRO RENAMES A FILE GIVEN 2 NAMES.
207 ;; IT MAKES USE OF INT 21 (AH=56H).
208 ;; IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
209 ;; IS RETURNED IN AX.
210 ;;
211 ;;**************************************************************************
212 RENAME_FILE MACRO OLD_NAME,NEW_NAME ;;AN000;
213 ;;
214 LEA SI, OLD_NAME ;;AN000;
215 LEA DI, NEW_NAME ;;AN000;
216 CALL RENAME_FILE_ROUTINE ;;AN000;
217 ENDM ;;AN000;
218 ;;**************************************************************************
219 ;;
220 ;; READ_FILE: Transfer the specified number of bytes from a file into a
221 ;; buffer location.
222 ;;
223 ;; SYNTAX: READ_FILE var_handle, buffer, immed_char, var_char
224 ;;
225 ;; INPUT:
226 ;; var_handle - The handle of the file to read.
227 ;; buffer - The address of where to store the data
228 ;; immed_char - The number of characters to read
229 ;;
230 ;; OUTPUT:
231 ;; CY = 0, Read success. var_char - number of bytes read
232 ;; CY = 1, Read error. AX contains the error code.
233 ;;
234 ;; OPERATION:
235 ;;
236 ;; THIS MACRO READS TO AN ALREADY OPENED FILE.
237 ;; IT MAKES USE OF INT 21 (AH=3FH).
238 ;; AX WILL RETURN THE NUMBER BYTES ACTUALLY WRITTEN.
239 ;;
240 ;;************************************************************************
241 READ_FILE MACRO VAR_HANDLE,BUFFER,IMMED_CHAR, VAR_CHAR ;;AN000;
242
243 MOV BX,VAR_HANDLE ;;AN000;
244 MOV DX,OFFSET BUFFER ;;AN000;
245 MOV CX,IMMED_CHAR ;;AN000;
246 CALL READ_FILE_ROUTINE ;;AN000;
247 ENDM ;;AN000;
248 ;;**************************************************************************
249 ;;
250 ;; WRITE_FILE: Transfer the specified number of bytes from a buffer into a
251 ;; specified file.
252 ;;
253 ;; SYNTAX: WRITE_FILE var_handle, buffer, immed_char, var_char
254 ;;
255 ;; INPUT:
256 ;; var_handle - The handle of the file to write to.
257 ;; buffer - The address of where the data is stored.
258 ;; immed_char - The number of characters to write.
259 ;;
260 ;; OUTPUT:
261 ;; CY = 0, Write success. var_char - number of bytes written.
262 ;; CY = 1, Write error. AX contains the error code.
263 ;;
264 ;; OPERATION:
265 ;;
266 ;; THIS MACRO WRITES TO AN ALREADY OPENED FILE.
267 ;; IT MAKES USE OF INT 21 (AH=3DH).
268 ;; AX WILL RETURN THE NUMBER BYTES ACTUALLY WRITTEN.
269 ;;
270 ;;************************************************************************
271 WRITE_FILE MACRO VAR_HANDLE, BUFFER, IMMED_CHAR, VAR_CHAR ;;AN000;
272 ;;
273 MOV BX,VAR_HANDLE ;;AN000;
274 MOV DX,OFFSET BUFFER ;;AN000;
275 MOV CX,IMMED_CHAR ;;AN000;
276 CALL WRITE_FILE_ROUTINE ;;AN000;
277 ENDM ;;AN000;
278 ;;**************************************************************************
279 ;;
280 ;; PREPARE_FILE: Prepare a file and a buffer for the construction of that
281 ;; file line by line.
282 ;;
283 ;; SYNTAX: PREPARE_FILE filename
284 ;;
285 ;; INPUT:
286 ;; filename = The name of the file to create. (ASCII-N format)
287 ;;
288 ;; OUTPUT: CY = 0: No error was encountered.
289 ;; CY = 1: There was an error encountered.
290 ;;
291 ;; OPERATION: A attempt is made to create the file. If it fails because
292 ;; the file already exists, then the file is opened for writing.
293 ;; The user will then write to the file be calling WRITE_LINE macro. The
294 ;; data will be temperarily stored in a buffer to limit the actual number
295 ;; of writes to the file.
296 ;;
297 ;;**************************************************************************
298 PREPARE_FILE MACRO FILENAME ;;AN000;
299
300 MOV BX, OFFSET FILENAME ;;AN000; Pass the address of the filename string
301 CALL PREPARE_FILE_ROUTINE ;;AN000; Call a routine to do that actual work
302 ENDM ;;AN000;
303 ;;**************************************************************************
304 ;;
305 ;; WRITE_LINE: Write a line to the file being constructed.
306 ;;
307 ;; SYNTAX: WRITE_LINE line
308 ;;
309 ;; INPUT:
310 ;; line = The line to write to the file. (ASCII-N format)
311 ;;
312 ;; OUTPUT: CY = 0: No error was encountered.
313 ;; CY = 1: An error was encountered.
314 ;;
315 ;; OPERATION: The line that is passed, has a CR and a LF appended to the
316 ;; end of the line. The data is then stored in a buffer. When the
317 ;; buffer is full, the data is written to the disk.
318 ;;
319 ;;**************************************************************************
320 WRITE_LINE MACRO LINE ;;AN000;
321
322 MOV BX, OFFSET LINE ;;AN000; Pass the address of the line to write
323 CALL WRITE_LINE_ROUTINE ;;AN000; Call a routine to do the actual work
324 ENDM ;;AN000;
325 ;;**************************************************************************
326 ;;
327 ;; SAVE_FILE: Empty the data in the buffer being used to create the file
328 ;; and then close the file.
329 ;;
330 ;; SYNTAX: SAVE_FILE file_name, error_code
331 ;;
332 ;; INPUT:
333 ;; file_name = The name of the file being built. If there has been
334 ;; an error encountered, then the file will be erased.
335 ;;
336 ;; OUTPUT: CY = 0: No error was encountered.
337 ;; CY = 1: An error was encountered.
338 ;; ERROR_CODE will contain the code of the error which
339 ;; occured.
340 ;;
341 ;; OPERATION: The routine will check to see if there is any data left in
342 ;; the buffer. If there is, the data is written to the file being
343 ;; created. The file is then closed. If errors were encountered at
344 ;; anytime during the create process, then the carry flag will be set
345 ;; and the error code will be returned in ERROR_CODE.
346 ;;
347 ;;**************************************************************************
348 SAVE_FILE MACRO FILE_NAME, ERROR_CODE ;;AN000;
349
350 MOV BX, OFFSET FILE_NAME ;;AN000; Get the address of the file name string
351 CALL SAVE_FILE_ROUTINE ;;AN000; Call a subroutine to do the actual work
352 MOV ERROR_CODE, AX ;;AN000; Store the returned error code
353 ENDM ;;AN000;
354 ;;**************************************************************************
355 ;;
356 ;; CHECK_DOS_VERSION: Check DOS Version level is 4.00
357 ;;
358 ;; SYNTAX: CHECK_DOS_VERSION
359 ;;
360 ;; INPUT:
361 ;; None.
362 ;;
363 ;; OUTPUT: CY = 0: Current DOS Version is 4.00
364 ;; CY = 1: Current DOS Version is other than level 4.00
365 ;;
366 ;; OPERATION: DOS function call 30h is performed to get the current DOS
367 ;; version number. If the DOS version is not 4.00, the carry flag is set.
368 ;;
369 ;;**************************************************************************
370 CHECK_DOS_VERSION MACRO ;;AN000;
371 MOV AH, 30H ;;AN000; DOS function number to perform
372 DOSCALL ;;AN000;
373 .IF < AL EQ MAJOR_VERSION > AND ;;AC047;SEH check is now made in VERSIONA.INC
374 .IF < AH EQ MINOR_VERSION > ;;AC047;SEH Check the DOS minor version
375 CLC ;;AN000; This is the correct version
376 .ELSE ;;AN000;
377 STC ;;AN000; This is the incorrect version
378 .ENDIF ;;AN000;
379 ENDM ;;AN000;
380 ;;**************************************************************************
381 ;;
382 ;; SET_DISPLAY_MODE: Set the display mode to 80 column.
383 ;;
384 ;; SYNTAX: SET_DISPLAY_MODE
385 ;;
386 ;; INPUT:
387 ;; None.
388 ;;
389 ;; OUTPUT:
390 ;; None.
391 ;;
392 ;; OPERATION: The Video Interrupt (INT 10H, AH = 0) is performed to set
393 ;; the display to 80 column mode.
394 ;;
395 ;;************************************************************************
396 SET_DISPLAY_MODE MACRO ;;AN000;
397
398 CALL SET_DISPLAY_MODE_ROUTINE ;;AN000;
399 ENDM ;;AN000;
400
401 ;;************************************************************************
402 ;;
403 ;; CHECK_EXPANDED_MEMORY: Check if the system supports expanded memory.
404 ;;
405 ;; SYNTAX: CHECK_EXPANDED_MEMORY var_xma
406 ;;
407 ;; INPUT:
408 ;; None.
409 ;;
410 ;; OUTPUT:
411 ;; var_xma = 0: Expanded memory is NOT supported.
412 ;; = 1: Expanded memory is supported.
413 ;; var_mod80 = 0: Not model 80
414 ;; = 1: Model 80
415 ;;
416 ;; OPERATION: A call to the system services (INT 15H, AH = C0H) is performed
417 ;; to get the system configuration parameters. (model byte).
418 ;;
419 ;; The Personal System/2 Model 80 (model byte = 0F8h) always support
420 ;; expanded memory.
421 ;;
422 ;; The Personal System/2 Models 50 and 60 (model byte = 0FCh) support
423 ;; expanded memory if the ??? 2 is present. The ??? 2 card has
424 ;; the identity number of F7FEh. F7H is read through the port address
425 ;; 101h and FEH is read through port 100H
426 ;;
427 ;; All other models do not support expanded memory.
428 ;;
429 ;;************************************************************************
430 CHECK_EXPANDED_MEMORY MACRO VAR_XMA, VAR_MOD80 ;;AC000;JW
431
432 CALL CHK_EX_MEM_ROUTINE ;;AN000;
433 MOV VAR_XMA, SI ;;AN000;
434 MOV VAR_MOD80,BX ;;AN000;JW
435 ENDM ;;AN000;
436
437 INCLUDE MACROS3.INC ;;AN000;