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

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / SELECT / MACROS3.INC
1 ;;****************************************************************************
2 ;; Assembler MACROS for use with SELECT.
3 ;; File: MACROS3.INC
4 ;; Latest Change Date: July 28, 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 ;; CHECK_DEFAULT_DRIVE: Determine if default drive is drive A:
22 ;;
23 ;; SYNTAX: CHECK_DEFAULT_DRIVE
24 ;;
25 ;; INPUT:
26 ;; None.
27 ;;
28 ;; OUTPUT:
29 ;; CY = 0: Drive A is the default drive
30 ;; CY = 1: Drive A is NOT the default drive
31 ;;
32 ;; OPERATION: DOS Function Call 19h is performed to get the default drive.
33 ;; If the default drive is not drive A (AL <> 0), the carry flag is set.
34 ;;
35 ;;************************************************************************;;
36 CHECK_DEFAULT_DRIVE MACRO ;;AN000;
37 MOV AH, 19H ;;AN000; Fn. Number for getting current drive
38 DOSCALL ;;AN000;
39 .IF < ZERO AL > ;;AN000; Is A the default drive?
40 CLC ;;AN000; Yes!
41 .ELSE ;;AN000;
42 STC ;;AN000; No!
43 .ENDIF ;;AN000;
44 ENDM ;;AN000;
45 ;;************************************************************************;;
46 ;;
47 ;; CHECK_DISK: Check is the specified fixed disk is present. If disk is
48 ;; present, return disk partition status.
49 ;;
50 ;; SYNTAX: CHECK_DISK immed_disk, var_disk, var_status, var_status_2, buffer
51 ;;
52 ;; INPUT:
53 ;; immed_disk = 1: First fixed disk.
54 ;; = 2: Second fixed disk.
55 ;;
56 ;; OUTPUT:
57 ;; var_disk = 0: Disk not present.
58 ;; = 1: Disk present - No DOS or EDOS partitions
59 ;; = 2: Disk present - DOS or EDOS partitions exist
60 ;; var_status = 01H: Primary DOS partition exists
61 ;; = 02H: Extended DOS partitions exists
62 ;; = 04H: Logical drives exist
63 ;; = 08H: Free space exists in EDOS partition
64 ;; = 10H: Free space exists on disk
65 ;; More than one status bit can be set
66 ;; var_status_2 = 0: There is no free space in EDOS partition and the
67 ;; disk.
68 ;; = 1: There is free space in the EDOS partition.
69 ;; = 2: There is no EDOS partition, but there is free
70 ;; disk space.
71 ;; buffer = Buffer for fixed disk status information.
72 ;;
73 ;; OPERATION: A call is performed to the FDISK utility (GET_DISK_STATUS)
74 ;; to get the status of the specified fixed disk drive. The returned
75 ;; status information is checked and the memory variables are set as
76 ;; specified above.
77 ;;
78 ;;************************************************************************;;
79 CHECK_DISK MACRO IMMED_DISK, VAR_DISK, VAR_STATUS, VAR_STATUS_2, BUFFER ;;AN000;
80
81 LEA DI, BUFFER ;;AN000;
82 MOV AX, IMMED_DISK ;;AN000;
83 CALL CHECK_DISK_ROUTINE ;;AN000;
84 MOV VAR_DISK, CX ;;AN000;
85 MOV VAR_STATUS, BX ;;AN000;
86 MOV VAR_STATUS_2, DX ;;AN000;
87 ENDM ;;AN000;
88 ;;************************************************************************;;
89 ;;
90 ;; CHECK_DISKETTE: Check the type of diskettes attached to the system.
91 ;;
92 ;; SYNTAX: CHECK_DISKETTE var_disk_a, var_disk_b, var_tot, buffer
93 ;;
94 ;; INPUT:
95 ;; buffer = Buffer for IOCTL
96 ;;
97 ;; OUTPUT:
98 ;; var_disk_a = 0FFH Diskette drive A not present
99 ;; = 0 360k diskette (5.25 inch)
100 ;; = 1 740K diskette (3.5 inch)
101 ;; = 2 1.2M diskette (5.25 inch)
102 ;; = 7 1.44M diskette (3.5 inch)
103 ;; var_disk_b = 0FFH Diskette drive B not present
104 ;; = 0, 1, 2, 7 as defined above for diskette A.
105 ;; var_tot = total number of diskettes attached (1 or 2)
106 ;;
107 ;; OPERATION: Interrupt 11H is performed to get equipment status. The number
108 ;; of diskettes attached will be returned as specified above. A call
109 ;; is then made to the IOCTL function of DOS (AH = 44h) to get the type
110 ;; of media the disk drives are. The function returns its data in a
111 ;; 26 byte buffer, where the second byte contains a description of the
112 ;; drive. The codes are as follows:
113 ;; 0 = 320/360 KB 5-1/4-inch
114 ;; 1 = 5-1/4-inch, 1.2 MB
115 ;; 2 = 3-1/2-inch, 720 KB
116 ;; 3 = 8 inch single density
117 ;; 4 = 8 inch double density
118 ;; 5 = Fixed disk
119 ;; 6 = Tape drive
120 ;; 7 = Other
121 ;;
122 ;;************************************************************************;;
123 CHECK_DISKETTE MACRO VAR_DISK_A, VAR_DISK_B, VAR_TOT, BUFFER ;;AN000;
124 INT 11H ;;AN000; See how many diskette drives there are
125 .IF < BIT AL NAND DISKETTES_EXIST > ;;AN000; Are there diskettes?
126 MOV AX, 0 ;;AN000; There are no diskettes.
127 .ELSE ;;AN000;
128 MOV CL,6 ;;AN000; Number of bits to shift
129 SHR AL,CL ;;AN000; Diskette bits are 6 and 7. Shift to right
130 MOV AH, 0 ;;AN000; Clear the high byte
131 INC AX ;;AN000; Make into the actual number of diskettes
132 .IF < AX GT MAX_NUM_DISKETTE > ;;AN000; Are there more then 2 diskette drives?
133 MOV AX, MAX_NUM_DISKETTE ;;AN000; Yes, but we are only concern with two.
134 .ENDIF ;;AN000;
135 .ENDIF ;;AN000;
136 MOV VAR_TOT, AL ;;AN000; Store the number of diskette drives.
137 ;;**********************************************************************
138 ;; Examine diskette drive A first.
139 ;;**********************************************************************
140 MOV VAR_DISK_A, E_DISKETTE_INV ;;AN000;
141 MOV VAR_DISK_B, E_DISKETTE_INV ;;AN000;
142 MOV DI, OFFSET VAR_DISK_A ;;AN000;
143 .FOR BL = 1 TO VAR_TOT ;;AN000;
144 MOV AX, 440DH ;;AN000;
145 MOV CX, 0860H ;;AN000;
146 MOV DX, OFFSET BUFFER ;;AN000;
147 DOSCALL ;;AN000;
148 MOV SI, OFFSET BUFFER + 1 ;;AN000;
149 MOV AL, [SI] ;;AN000;
150 .IF < AL EQ E_DISKETTE_1200 > ;;AN111;JW
151 MOV AL,E_DISKETTE_360 ;;AN111;JW
152 .ENDIF ;;AN111;JW
153 .IF < AL EQ E_DISKETTE_1440 > ;;AN000;
154 .IF < <WORD PTR [SI+3]> NE E_1440_TRACKS > OR ;;AN000;
155 .IF < <WORD PTR [SI+19]> NE E_1440_SECTORS > ;;AN000;
156 MOV AL, E_DISKETTE_INV ;;AN000;
157 .else ;yuk- don't have time to get this working on 1.4M drives
158 mov al, e_diskette_720 ;so pretend there is no such thing
159 .ENDIF ;;AN000;
160 .ENDIF ;;AN000;
161 MOV [DI], AL ;;AN000;
162 MOV DI, OFFSET VAR_DISK_B ;;AN000;
163 .NEXT BL ;;AN000;
164 ;;**********************************************************************
165 ;; Check for compatible A: to B: combinations ;AN000;JW
166 ;;**********************************************************************
167 .IF < VAR_DISK_A eq E_DISKETTE_720 > or ;;AN000;JW
168 .IF < VAR_DISK_A eq E_DISKETTE_1440 > ;;AN000;JW
169 .IF < VAR_DISK_B eq E_DISKETTE_360 > ;;AN000;JW
170 MOV VAR_DISK_B, E_DISKETTE_INV ;;AN000;JW
171 DEC VAR_TOT ;;AN000;JW
172 .ENDIF ;;AN000;JW
173 .ENDIF ;;AN000;JW
174 .IF < VAR_DISK_A eq E_DISKETTE_360 > ;;AN000;JW
175 .IF < VAR_DISK_B eq E_DISKETTE_720 > or ;;AN000;JW
176 .IF < VAR_DISK_B eq E_DISKETTE_1440 > ;;AN000;JW
177 MOV VAR_DISK_B, E_DISKETTE_INV ;;AN000;JW
178 DEC VAR_TOT ;;AN000;JW
179 .ENDIF ;;AN000;JW
180 .ENDIF ;;AN000;JW
181 ;;
182 ENDM ;;AN000;
183 ;;************************************************************************;;
184 ;;
185 ;; CHECK_VALID_MEDIA: Check if the diskettes attached will support
186 ;; installation of SELECT. Also, check if install destination will
187 ;; be selected by user or determined by SELECT.
188 ;;
189 ;; SYNTAX: CHECK_VALID_MEDIA var_disk_a, var_disk_b, var_tot, var_disk,
190 ;; var_def, var_index, var_option
191 ;;
192 ;; INPUT:
193 ;; var_disk_a = diskette A presence and type
194 ;; var_disk_b = diskette B presence and type
195 ;; var_tot = total number of dikettes
196 ;; var_disk = 0: first fixed disk is not present
197 ;; > 0: first fixed disk is present
198 ;;
199 ;; OUTPUT:
200 ;; CY = 0: Success variables are returned as defined below.
201 ;; CY = 1: Error - invalid media
202 ;; var_def = 0 use default destination drive
203 ;; = 1 default destination drive not applicable
204 ;; var_index = 1 default destination is drive C
205 ;; = 2 default destination is drive B
206 ;; var_option = 1 possible drive B or C
207 ;; = 2 possible drive A or C
208 ;; = 3 possible drive A or B or C
209 ;; = 4 possible drive A or B
210 ;;
211 ;; OPERATION: The diskette drive types are checked for valid media type.
212 ;; If the diskette media types are valid, a check is made to determine if
213 ;; install destination will be user selected or will be determined by
214 ;; SELECT. The following checks are made.
215 ;;
216 ;; - if one diskette, return valid media and default destination is A
217 ;;
218 ;; - If two diskettes only, return valid and:
219 ;; if A = B, default = B
220 ;; if A <> B, default = A
221 ;; if A and B are mixed 720 and 1.44, destination option is A or B
222 ;;
223 ;; - If one diskette and a fixed disk only, return valid media and
224 ;; destination option is drive A or C.
225 ;;
226 ;; - If two diskettes and a fixed disk, return valid media and:
227 ;; if A = B, destination option is B or C
228 ;; if A <> B, destination option is A or C
229 ;; if A and B are mixed 720 and 1.44, destination option is
230 ;; A or B or C
231 ;;
232 ;;************************************************************************;;
233 CHECK_VALID_MEDIA MACRO VAR_DISK_A, VAR_DISK_B, VAR_TOT, VAR_DISK, VAR_DEF, VAR_INDEX, VAR_OPTION ;;AN111;JW
234
235 MOV AL, VAR_DISK_A ;;AN111;JW
236 MOV BL, VAR_DISK_B ;;AN111;JW
237 MOV SI, VAR_DISK ;;AN111;JW
238 CALL CHECK_VALID_MEDIA_ROUTINE ;;AN111;JW
239 MOV VAR_DEF, CL ;;AN111;JW
240 MOV VAR_INDEX, DX ;;AN111;JW
241 MOV VAR_OPTION, DI ;;AN111;JW
242 ENDM ;;AN111;JW
243 ;;************************************************************************;;
244 ;;
245 ;; SCAN_DISK_TABLE: Scan the specified disk status table from the
246 ;; specified index item for specified field and return status information.
247 ;;
248 ;; SYNTAX: SCAN_DISK_TABLE immed_disk, var_index, var_ref
249 ;;
250 ;; INPUT:
251 ;; immed_disk = 1: First fixed disk
252 ;; = 2: Second fixed disk
253 ;; var_index = Index of the information to return
254 ;;
255 ;; OUTPUT:
256 ;; var_ret = 0: Success - Index into table is valid
257 ;; = 1: Error - Index invalid or end of table
258 ;; N_NAME_PART = Partition name.
259 ;; N_SIZE_PART = Partition size.
260 ;; N_STATUS_PART = Partition status
261 ;; P_DRIVE_PART = Drive letter assigned.
262 ;;
263 ;; OPERATION:
264 ;; Starts scanning the disk table from the point indicated by var_index
265 ;; for either the name, status or type. The table is scanned until either
266 ;; the desired entry is found, or the end of the table is reached. If
267 ;; the end of the table is reached before a marching entry is found, then
268 ;; var_ret returns 1, else if an entry is found, it returns 0.
269 ;; If found, var_index will also return the index of the entry.
270 ;;
271 ;; Note: The index of the first entry in the table is 1.
272 ;;
273 ;;************************************************************************;;
274 SCAN_DISK_TABLE MACRO IMMED_DISK, VAR_INDEX, VAR_RET ;;AN000;
275
276 MOV CX, IMMED_DISK ;;AN000;
277 MOV AX, VAR_INDEX ;;AN000;
278 CALL SCAN_DISK_TABLE_ROUTINE ;;AN000;
279 MOV VAR_RET, AX ;;AN000;
280 ENDM ;;AN000;
281 ;;************************************************************************;;
282 ;;
283 ;; UPDATE_DISK_TABLE: Update the specifed disk status table for the
284 ;; specified index item.
285 ;;
286 ;; SYNTAX: UPDATE_DISK_TABLE immed_disk, var_index, var_ref
287 ;;
288 ;; INPUT:
289 ;; immed_disk = 1: First fixed disk
290 ;; = 2: Second fixed disk
291 ;; var_index = Index into table
292 ;;
293 ;; OUTPUT:
294 ;; var_ret = 0: Success - Index into table is valid
295 ;; = 1: Error - Index into table is not valid
296 ;; partition name = N_NAME_PART
297 ;; partition size = N_SIZE_PART
298 ;; partition status = N_STATUS_PART
299 ;; partition type = N_TYPE_PART
300 ;; drive letter = P_DRIVE_PART
301 ;;
302 ;; OPERATION: If the index into the disk table is valid, the disk table
303 ;; is updated for the specifed index. Disk status information is obtained
304 ;; from pre-defined locations as specified above.
305 ;;
306 ;;************************************************************************;;
307 UPDATE_DISK_TABLE MACRO IMMED_DISK, VAR_INDEX, VAR_REF ;;AN000;
308
309 MOV CX, IMMED_DISK ;;AN000;
310 MOV AX, VAR_INDEX ;;AN000;
311 CALL UPDATE_DISK_TABLE_ROUTINE ;;AN000;
312 MOV VAR_REF, AX ;;AN000;
313 ENDM ;;AN000;
314 ;;************************************************************************;;
315 ;;
316 ;; GET_PARTITION_SIZE: Return DOS and EDOS partition size in ASCII-N format.
317 ;;
318 ;; SYNTAX: GET_PARTITION_SIZE var_tot, var_dos, name_dos, name_edos
319 ;;
320 ;; INPUT:
321 ;; var_tot = Free disk space
322 ;; var_dos = Size of DOS partition
323 ;;
324 ;; OUTPUT:
325 ;; name_dos = Size of DOS partition in ASCII-N format.
326 ;; name_edos = Size of EDOS partition in ASCII-N format.
327 ;;
328 ;; OPERATION: The DOS partition size is converted to ASCII-N format.
329 ;; The size of the Extended DOS partition is obtained by subtracting
330 ;; the size of DOS partition from the free disk space. If the size of
331 ;; any partition is zero, a zero string length is returned.
332 ;;
333 ;;************************************************************************;;
334 GET_PARTITION_SIZE MACRO VAR_TOT, VAR_DOS, NAME_DOS, NAME_EDOS ;;AN000;
335 ;;
336 PUSH VAR_TOT ;;AN000; Save the variable
337 MOV AX, VAR_DOS ;;AN000; Size of the DOS partition.
338 SUB VAR_TOT, AX ;;AN000; Subtract the dos partition size
339 WORD_TO_CHAR VAR_TOT, NAME_EDOS ;;AN000; Convert binay values to ASCII
340 WORD_TO_CHAR VAR_DOS, NAME_DOS ;;AN000;
341 POP VAR_TOT ;;AN000;
342 ENDM ;;AN000;
343 ;;************************************************************************;;
344 ;;
345 ;; CHECK_MACHINE: Return the model byte
346 ;;
347 ;; SYNTAX: CHECK_MACHINE mac_type p_flag
348 ;;
349 ;; INPUT:
350 ;;
351 ;; OUTPUT:
352 ;; mac_type = model byte
353 ;; p_flag = PS2 presence (E_YES, E_NO)
354 ;;
355 ;; OPERATION: An INT 15H is executed to return a pointer to the system
356 ;; descriptor vector. The model byte is retrieved from this vector
357 ;; and placed in the supplied variable. The ps2 flag is also set.
358 ;;
359 ;;************************************************************************;;
360 CHECK_MACHINE MACRO MAC_TYPE, P_FLAG ;;AN000;JW
361 ;;
362 MOV AH,0C0H ;;AN000; INT 15H system config request
363 INT 15H ;;AN000; system services
364 .IF < nc > ;;AN000;
365 MOV AH,ES: BYTE PTR [BX+2] ;;AN000; get the model byte
366 .ELSE ;;AN000;
367 MOV AH,00 ;;AN000;
368 .ENDIF ;;AN000;
369 MOV MAC_TYPE,AH ;;AN000; save the model byte
370 MOV P_FLAG,E_YES ;;AN000;
371 ;;
372 .IF < AH eq 0 > or ;;AN000; if old pc
373 .IF < AH eq 0FBH > or ;;AN000; if pc XT
374 .IF < AH eq 0F9H > or ;;AN000; if pc convertible
375 .IF < AH eq 0FCH > and ;;AN000; if pc AT and
376 .IF <<ES:BYTE PTR [BX+3]> le 02 > ;;AN000; sub-model byte le 2
377 MOV P_FLAG,E_NO ;;AN000; not a ps2
378 .ENDIF ;;AN000;
379 ENDM ;;AN000;
380
381 INCLUDE MACROS4.INC ;AN000;
382 \1a