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