Atlas - FORMAT.DOC

Home / ext / JunkDrawer / DOS / BuildTools / v2.0 Lines: 1 | Size: 16640 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)]
[FILE BEGIN]
1FORMAT - formats a new disk, clears the FAT and DIRECTORY 2and optionally copies the SYSTEM and COMMAND.COM to this 3new disk. 4 5Command syntax: 6 7 FORMAT [drive:][/switch1][/switch2]...[/switch16] 8 9 Where "drive:" is a legal drive specification and if 10 omitted indicates that the default drive will be used. 11 There may be up to 16 legal switches included in the 12 command line. 13 14 15 The OEM must supply five (NEAR) routines to the program 16along with 6 data items. The names of the routines are INIT, 17DISKFORMAT, BADSECTOR, WRTFAT and DONE, and their flow of 18control (by the Microsoft module) is like this: 19 20 | 21 +---------+ 22 | INIT | 23 +---------+ 24 | 25 |<------------------------------+ 26+------------+ | 27| DISKFORMAT | | 28+------------+ | 29 |<-------+ | 30+-----------+ |-This loop is done |- This loop done 31| BADSECTOR | | for each group of | once for each disk 32+-----------+ | bad sectors | to be formatted. 33 |----->--+ | If variable HARDFLAG 34 | | is set then the loop 35+----------+ | is only performed 36| | | once. 37| WRTFAT | | 38+----------+ | 39 | | 40 +------+ | 41 | DONE | | 42 +------+ | 43 +---->--------------------------+ 44 45 The INIT, DISKFORMAT, and BADSECTOR routines are free 46to use any MS-DOS system calls, except for calls that cause 47disk accesses on the disk being formatted. DONE may use 48ANY calls, since by the time it is called the new disk has 49been formatted. 50 51The following data must be declared PUBLIC in a module 52provided by the OEM: 53 54 SWITCHLIST - A string of bytes. The first byte is count 55 N, followed by N characters which are the switches to 56 be accepted by the command line scanner. Alphabetic 57 characters must be in upper case (the numeric 58 characters 0-9 are allowed). The last three switches, 59 normally "O", "V" and "S", have pre-defined meanings. 60 61 The "S" switch is the switch which causes the 62 system files IO.SYS, MSDOS.SYS, and COMMAND.COM to be 63 transfered to the disk after it is formatted thus 64 making a "S"ystem disk. The switch can be some letter 65 other than "S", but the last switch in the list is 66 assumed to have the meaning "transfer system", 67 regardles of what the particular letter is. 68 69 The second to the last switch, "V", causes FORMAT 70 to prompt the user for a volume label after the disk 71 is formatted. Again, as with "S", the particular 72 letter is not important but rather the position in the 73 list. 74 75 The third to the last switch, "O", causes FORMAT to 76 produce an IBM Personal Computer DOS version 1.X 77 compatible disk. Normally FORMAT causes a 0 byte to 78 be placed in the first byte of each directory entry 79 instead of the 0E5 Hex free entry designator. This 80 results in a very marked directory search performance 81 increase due to an optimization in the DOS. Disks 82 made this way cause trouble on IBM PC DOS 1.X 83 versions, however, which did not have this 84 optimization. The 0 byte fools IBM 1.X versions into 85 thinking these entries are allocated instead of free, 86 NOTE that IBM Personnal Computer DOS version 2.00 and 87 MS-DOS version 1.25 will have no trouble with these 88 disks, since they have the same optimization. The "O" 89 switch causes FORMAT to re-do the directory with a 0E5 90 Hex byte at the start of each entry so that the disk 91 may be used with 1.X versions of IBM PC DOS, as well 92 as MS-DOS 1.25/2.00 and IBM PC DOS 2.00. This switch 93 should only be given when needed because it takes a 94 fair amount of time for FORMAT to perform the 95 conversion, and it noticably decreases 1.25 and 2.00 96 performance on disks with few directory entries. 97 98 Up to 16 switches are permitted. Normally a "C" 99 switch is specified for "Clear". This switch should 100 cause the formatting operation to be bypassed (within 101 DISKFORMAT or BADSECTOR). This is provided as a 102 time-saving convenience to the user, who may wish 103 to "start fresh" on a previosly formatted and used 104 disk. 105 106 HARDFLAG - BYTE location which specifies whether the 107 OEM routine is formatting a fixed disk or a a drive 108 with removable media. A zero indicates removable 109 media, any other value indicates a fixed disk. The 110 status of this byte only effect the messages printed 111 by the main format module. This value should be 112 set or reset by the OEM supplied INIT routine. 113 114 FATID - BYTE location containing the value to be used 115 in the first byte of the FAT. Must be in the range 116 F8 hex to FF hex. 117 118 STARTSECTOR - WORD location containing the sector number 119 of the first sector of the data area. 120 121 FATSPACE - WORD location containing the address of the 122 start of the FAT area. A FAT built in this area 123 will be written to disk using the OEM supplied WRTFAT 124 subroutine. 6k is sufficient to store any FAT. This 125 area must not overlap the FREESPACE area. 126 127 FREESPACE - WORD location which contains the address 128 of the start of free memory space. This is where 129 the system will be loaded, by the Microsoft module, 130 for transferring to the newly formatted disk. Memory 131 should be available from this address to the end 132 of memory, so it is typically the address of the 133 end of the OEM module. 134 135The following routines must be declared PUBLIC in the 136OEM-supplied module: 137 138 INIT - An initialization routine. This routine is called 139 once at the start of the FORMAT run after the switches 140 have been processed. This routine should perform 141 any functions that only need to be done once per 142 FORMAT run. An example of what this routine might 143 do is read the boot sector into a buffer so that 144 it can be transferred to the new disks by DISKFORMAT. 145 If this routine returns with the CARRY flag set it 146 indicates an error, and FORMAT will print "Format 147 failure" and quit. This feature can be used to detect 148 conflicting switches (like specifying both single 149 and double density) and cause FORMAT to quit without 150 doing anything. 151 152 DISKFORMAT - Formats the disk according to the options 153 indicated by the switches and the value of FATID 154 must be defined when it returns (although INIT may 155 have already done it). This routine is called once 156 for EACH disk to be formatted. If neccessary it 157 must transfer the Bootstrap loader. If any error 158 conditions are detected, set the CARRY flag and return 159 to FORMAT. FORMAT will report a 'Format failure' 160 and prompt for another disk. (If you only require 161 a clear directory and FAT then simply setting the 162 appropriate FATID, if not done by INIT, will be all 163 that DISKFORMAT must do.) 164 165 BADSECTOR - Reports the sector number of any bad sectors 166 that may have been found during the formatting of 167 the disk. This routine is called at least once for 168 EACH disk to be formatted, and is called repeatedly 169 until AX is zero or the carry flag is set. The carry 170 flag is used just as in DISKFORMAT to indicate an 171 error, and FORMAT handles it in the same way. The 172 first sector in the data area must be in STARTSECTOR 173 for the returns from this routine to be interpreted 174 correctly. If there are bad sectors, BADSECTOR must 175 return a sector number in in register BX, the number 176 of consecutive bad sectors in register AX, and carry 177 clear. FORMAT will then process the bad sectors 178 and call BADSECTOR again. When BADSECTOR returns 179 with AX = 0 this means there are no more bad sectors; 180 FORMAT clears the directory and goes on to DONE, 181 so for this last return BX need not contain anything 182 meaningful. 183 184 FORMAT processes bad sectors by determining their 185 corresponding allocation unit and marking that unit 186 with an FF7 hex in the File Allocation Table. CHKDSK 187 understands the FF7 mark as a flag for bad sectors 188 and accordingly reports the number of bytes marked 189 in this way. 190 191 NOTE: Actual formatting of the disk can be done in 192 BADSECTOR instead of DISKFORMAT on a "report as you 193 go" basis. Formatting goes until a group of bad 194 sectors is encountered, BADSECTOR then reports them 195 by returning with AX and BX set. FORMAT will then 196 call BADSECTOR again and formatting can continue. 197 198 WRTFAT - This routine is called after the disk is 199 formatted and bad sectors have been reported. Its 200 purpose is to write all copies of the FAT from the 201 area of memory referenced by FATSPACE to the drive 202 just formatted. It may be possible to use INT 26H 203 to perform the write, or a direct BIOS call. Whether 204 this is possible depends on whether the FAT ID byte 205 is used by the BIOS to determine the media in the 206 drive. If it is, these methods will probably fail 207 because there is no FAT ID byte on the disk yet (in 208 this case WRTFATs primary job is to get the FAT ID 209 byte out on the disk and thus solve the chicken and 210 egg problem). 211 212 DONE - This routine is called after the formatting is 213 complete, the disk directory has been initialized, 214 and the system has been transferred. It is called 215 once for EACH disk to be formatted. This gives the 216 chance for any finishing-up operations, if needed. 217 If the OEM desires certain extra files to be put 218 on the diskette by default, or according to a switch, 219 this could be done in DONE. Again, as in BADSECTOR 220 and DISKFORMAT, carry flag set on return means an 221 error has occurred: 'Format failure' will be printed 222 and FORMAT will prompt for another disk. 223 224 225The following data is declared PUBLIC in Microsoft's FORMAT 226module: 227 228 SWITCHMAP - A word with a bit vector indicating what 229 switches have been included in the command line. The 230 correspondence of the bits to the switches is 231 determined by SWITCHLIST. The right-most 232 (highest-addressed) switch in SWITCHLIST (which must 233 be the system transfer switch, normally "S") 234 corresponds to bit 0, the second from the right, 235 normally "V" to bit 1, etc. For example, if 236 SWITCHLIST is the string "7,'AGI2OVS'", and the user 237 specifies "/G/S" on the command line, then bit 6 will 238 be 0 (A not specified), bit 5 will be 1 (G specified), 239 bits 4,3,2 and 1 will be 0 (neither I,2,O or V 240 specified), and bit 0 will be 1 (S specified). 241 242 Bits 0,1 and 2 are the only switches used in 243 Microsoft's FORMAT module. These switches are used 1) 244 after INIT has been called, to determine if it is 245 necessary to load the system; 2) after the last 246 BADSECTOR call, to determine if the system is to be 247 written, E5 directory conversion is to be done, and/or 248 a volume label is to be asked for. INIT may force 249 these bits set or reset if desired (for example, some 250 drives may never be used as system disk, such as hard 251 disks). After INIT, the "S" bit may be turned off 252 (but not on, since the system was never read) if 253 something happens that means the system should not be 254 transferred. 255 256 After INIT, a second copy of SWITCHMAP is made 257 internally which is used to restore SWITCHMAP for 258 each disk to be formatted. FORMAT itself will turn 259 off the system bit if bad sectors are reported in 260 the system area; DISKFORMAT and BADSECTOR are also 261 allowed to change the map. However, these changes 262 affect only the current disk being formatted, since 263 SWITCHMAP is restored after each disk. (Changes 264 made to SWITCHMAP by INIT do affect ALL disks.) 265 266 DRIVE - A byte containing the drive specified in the 267 command line. 0=A, 1=B, etc. 268 269Once the OEM-supplied module has been prepared, it must linked 270with Microsoft's FORMAT.OBJ module and the FORMES.OBJ module. 271If the OEM-supplied module is called OEMFOR.OBJ, then the 272following linker command will do: 273 274 LINK FORMAT FORMES OEMFOR; 275 276This command will produce a file called FORMAT.EXE. FORMAT 277has been designed to run under MS-DOS as a simple binary 278.COM file. This conversion is performed by LOCATE (EXE2BIN) 279with the command 280 281 LOCATE FORMAT.EXE FORMAT.COM 282 283which will produce the file FORMAT.COM. 284 285;***************************************** 286; 287; A Sample OEM module 288; 289;***************************************** 290 291CODE SEGMENT BYTE PUBLIC 'CODE' 292; This segment must be 293; named CODE, it must be 294; PUBLIC, and it's 295; classname must be 'CODE' 296 297 298 ASSUME CS:CODE,DS:CODE,ES:CODE 299 300; Must declare data and routines PUBLIC 301 302PUBLIC FATID,STARTSECTOR,SWITCHLIST,FREESPACE 303PUBLIC INIT,DISKFORMAT,BADSECTOR,DONE,WRTFAT 304PUBLIC FATSPACE,HARDFLAG 305 306; This data defined in Microsoft-supplied module 307 308 EXTRN SWITCHMAP:WORD,DRIVE:BYTE 309 310INIT: 311 312; Read the boot sector into memory 313 CALL READBOOT 314 ... 315; Set FATID to double sided if "D" switch specified 316 TEST SWITCHMAP,10H 317 JNZ SETDBLSIDE 318 ... 319 RET 320 321DISKFORMAT: 322 ... 323 324; Use the bit map in SWITCHMAP to determine 325; what switches are set 326 327 TEST SWITCHMAP,8 ;Is there a "/C"? 328 JNZ CLEAR ; Yes -- clear operation 329 ; requested jump around the 330 ; format code 331 < format the disk > 332CLEAR: 333 ... 334; Transfer the boot from memory to the new disk 335 CALL TRANSBOOT 336 ... 337 RET 338 339; Error return - set carry 340 341ERRET: 342 STC 343 RET 344 345BADSECTOR: 346 ... 347 RET 348 349 350WRTFAT: 351 ... 352 353WRTFATLOOP: 354 < Set up call to write out a fat to disk> 355 ... 356 MOV BX,[FATSPACE] 357 358 < Write out one fat to disk> 359 JC ERRET 360 ... 361 < Decrement fat counter > 362 JNZ WRTFATLOOP 363 CLC ;Good return 364 RET 365 366 367DONE: 368 ... 369 RET 370 371; Default Single sided 372FATID DB 0FEH 373 374HARDFLAG DB 0 375 376STARTSECTOR DW 9 377 378SWITCHLIST DB 5,"DCOVS" ; "OVS" must be the last 379 ; switches in the list 380 381FATSPACE DW FATBUF 382 383FREESPACE DW ENDBOOT 384 385BOOT DB BOOTSIZE DUP(?) ; Buffer for the 386 ; boot sector 387 388FATBUF DB 6 * 1024 DUP(?) ; Fat buffer 389ENDBOOT LABEL BYTE 390 391CODE ENDS 392 END 393
[FILE END]
(C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.