1 ; **************************************************************************** 2 ; HDFORMAT.ASM (HDFORMAT.COM) - Retro DOS v4 Hard Disk Formatting Utility 3 ; (RDHDFORM.S - RDHDFORM.COM) 4 ; ---------------------------------------------------------------------------- 5 ; Primary DOS Partition (FAT File System) Format Utility for Retro DOS v4 OS. 6 ; ---------------------------------------------------------------------------- 7 ; Last Update: 29/01/2026 (Previous: 14/07/2024) 8 ; ---------------------------------------------------------------------------- 9 ; Beginning: 28/10/2023 10 ; ---------------------------------------------------------------------------- 11 ; Assembler: NASM version 2.15 (rdhdform.s) 12 ; ---------------------------------------------------------------------------- 13 ; Modified from 'hdformat.s'(HDFORMAT.COM) source code by Erdogan Tan 14 ; (25/09/2020) - TRDOS 386 hard/fixed disk formatting utility - 15 ; **************************************************************************** 16 ; Copyright (C) 2020-2024 Erdogan TAN 17 ; **************************************************************************** 18 ; assembling: nasm hdformat.s -l hdformat.lst -o HDFORMAT.COM -Z error.txt 19 20 ; Note: Logical DOS drives in extended DOS partitions are excluded. 21 22 ; ---------------------------------------------------------------------------- 23 ; equations 24 ; ---------------------------------------------------------------------------- 25 26 ; boot sector parameters 27 28 bsOemName equ 3 29 bsBytesPerSec equ 11 ; 512 (word) 30 bsSecPerClust equ 13 31 bsResSectors equ 14 32 bsFATs equ 16 33 bsRootDirEnts equ 17 34 bsSectors equ 19 35 bsMedia equ 21 36 bsFATsecs equ 22 37 bsSecPerTrack equ 24 ; 18 (word) 38 bsHeads equ 26 ; 2 (word) 39 bsHidden1 equ 28 40 bsHidden2 equ 30 41 bsHugeSectors equ 32 42 bsDriveNumber equ 36 43 bsReserved1 equ 37 44 bsBpbSignature equ 38 ; 29h (byte) 45 bsVolumeID equ 39 46 bsVolumeLabel equ 43 47 bsFileSysType equ 54 ; 'FAT12 ' (8 bytes) 48 ; 49 bsReserved2 equ 62 50 ; TRDOS 386 v2.0 2018 Extensions 51 bsDataStart equ 64 52 bsRootDirStart equ 66 53 bsRootDirSects equ 68 54 bsDirEntsPerSec equ 70 55 56 ; FAT32 bs 57 BPB_FATSz32 equ 36 58 BPB_ExtFlags equ 40 59 BPB_FSVer equ 42 60 BPB_RootClus equ 44 61 BPB_FSInfo equ 48 62 BPB_BkBootSec equ 50 63 BPB_Reserved equ 52 64 BS_DrvNum equ 64 ; 80h 65 BS_Reserved1 equ 65 66 BS_BootSig equ 66 ; 29h (byte) 67 BS_VolID equ 67 68 BS_VolLab equ 71 69 BS_FilSysType equ 82 ; 'FAT32 ' (8 bytes) 70 71 ; Masterboot / Partition Table at Beginning+1BEh 72 ptBootable equ 0 73 ptBeginHead equ 1 74 ptBeginSector equ 2 75 ptBeginCylinder equ 3 76 ptFileSystemID equ 4 77 ptEndHead equ 5 78 ptEndSector equ 6 79 ptEndCylinder equ 7 80 ptStartSector equ 8 81 ptSectors equ 12 82 83 partition_table equ 1BEh 84 85 ; ---------------------------------------------------------------------------- 86 ; code 87 ; ---------------------------------------------------------------------------- 88 89 [BITS 16] 90 [ORG 100h] 91 92 00000000 FA cli 93 00000001 FC cld 94 00000002 0E push cs 95 00000003 17 pop ss 96 00000004 BCFEFF mov sp, 0FFFEh 97 00000007 FB sti 98 99 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 100 ; see if drive specified 101 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 102 103 00000008 BE8000 mov si, 80h ; PSP command tail 104 0000000B 8A0C mov cl, [si] 105 0000000D 08C9 or cl, cl 106 0000000F 7503 jnz short T_1 107 00000011 E99100 jmp T_9 ; jump if zero 108 T_1: 109 00000014 46 inc si ; (+) 110 111 00000015 8A04 mov al, [si] 112 00000017 3C20 cmp al, ' ' ; is it SPACE ? 113 00000019 7507 jne short T_2 114 R_1: 115 0000001B FEC9 dec cl 116 0000001D 75F5 jnz short T_1 117 0000001F E98300 jmp T_9 118 T_2: 119 00000022 46 inc si ; (*) 120 121 00000023 3C2D cmp al, '-' 122 00000025 7523 jne short R_2 123 124 00000027 FEC9 dec cl ; 1st 'inc si' (+) 125 00000029 FEC9 dec cl ; previous 'inc si' (*) 126 0000002B 7E78 jng short T_9 ; cl < 1 127 128 0000002D 38E0 cmp al, ah 129 0000002F 7474 je short T_9 130 131 00000031 88C4 mov ah, al ; '-' 132 00000033 8A04 mov al, [si] 133 ; cl > 0 134 00000035 46 inc si ; (**) 135 00000036 803C20 cmp byte [si], ' ' 136 00000039 756A jne short T_9 137 0000003B 3C30 cmp al, '0' 138 0000003D 7266 jb short T_9 139 0000003F 3C34 cmp al, '4' 140 00000041 7762 ja short T_9 141 00000043 2C30 sub al, '0' 142 00000045 A2[8516] mov [partition], al 143 00000048 EBD1 jmp short R_1 144 ; dec cl for previous 'inc si' (**) 145 R_2: 146 0000004A FEC9 dec cl ; 1st 'inc si' (+) 147 0000004C 7430 jz short R_3 148 149 0000004E 803C3A cmp byte [si], ':' 150 00000051 7421 je short T_3 151 152 00000053 803C20 cmp byte [si], ' ' 153 00000056 7626 jna short R_3 154 155 00000058 FEC9 dec cl ; following 'inc si' (*) 156 0000005A 7422 jz short R_3 157 158 0000005C 3C68 cmp al, 'h' 159 0000005E 7545 jne short T_9 160 00000060 803C64 cmp byte [si], 'd' 161 00000063 7540 jne short T_9 162 00000065 46 inc si ; (*) 163 00000066 8A04 mov al, [si] 164 00000068 3C30 cmp al, '0' 165 0000006A 7433 je short T_8 166 0000006C 7237 jb short T_9 167 0000006E 3C33 cmp al, '3' 168 00000070 762D jna short T_8 169 00000072 EB31 jmp short T_9 170 T_3: 171 00000074 FEC9 dec cl ; following 'inc si' (**) 172 00000076 7406 jz short R_3 173 ; cl > 0 174 00000078 46 inc si ; (**) 175 00000079 803C20 cmp byte [si], ' ' 176 0000007C 7727 ja short T_9 177 R_3: 178 0000007E 3C43 cmp al, 'C' 179 00000080 7223 jb short T_9 180 00000082 7414 je short T_6 181 ;cmp al, 'Z' ; A - Z 182 ;jna short T_6 183 00000084 3C44 cmp al, 'D' 184 00000086 7610 jna short T_6 185 00000088 3C5A cmp al, 'Z' 186 0000008A 7619 jna short T_9 187 T_4: 188 0000008C 3C63 cmp al, 'c' ; a - z 189 0000008E 7215 jb short T_9 190 00000090 7404 je short T_5 191 ;cmp al, 'z' 192 ;ja short T_9 193 00000092 3C64 cmp al, 'd' 194 00000094 770F ja short T_9 195 T_5: 196 00000096 2C20 sub al, 'a'-'A' ; to upper case 197 198 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 199 ; get drive code 200 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 201 202 T_6: 203 00000098 2C13 sub al, 'C'-'0' 204 T_7: 205 0000009A A2[6F17] mov [RD_Drive], al ; '0' .. '4' 206 0000009D EB0F jmp short T_10 207 T_8: 208 0000009F 46 inc si 209 000000A0 803C20 cmp byte [si], ' ' 210 000000A3 76F5 jna short T_7 211 212 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 213 ; Write message 214 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 215 216 T_9: 217 000000A5 BE[FE13] mov si, RD_Welcome 218 000000A8 E81A02 call print_msg 219 ;cmp cl, 0 220 ;ja short T_35 221 000000AB E90002 jmp T_35 222 223 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 224 ; get drive parameters 225 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 226 227 T_10: 228 000000AE B408 mov ah, 08h 229 ;mov dl, [RD_Drive] ; drive 230 000000B0 88C2 mov dl, al 231 000000B2 80C250 add dl, 80h -'0' ; make it 80h based 232 000000B5 8816[F713] mov [drv], dl 233 000000B9 CD13 int 13h ; return disk parameters 234 235 000000BB 0E push cs 236 000000BC 07 pop es ; restore es 237 238 000000BD 08E4 or ah, ah 239 000000BF 7542 jnz short T_12 ; error 240 241 000000C1 88C8 mov al, cl 242 000000C3 243F and al, 63 243 000000C5 A2[F813] mov [sectors], al 244 000000C8 C0E906 shr cl, 6 245 000000CB 86E9 xchg ch, cl 246 000000CD 41 inc cx 247 000000CE 890E[FC13] mov [cylinders], cx 248 000000D2 FEC6 inc dh 249 000000D4 8836[FA13] mov [heads], dh 250 000000D8 F6E6 mul dh 251 ; ax = heads * spt 252 000000DA A3[5A1E] mov [csize], ax 253 000000DD F7E1 mul cx ; * cylinders 254 ; dx:ax = chs limit 255 000000DF A3[5C18] mov [CHS_limit], ax 256 000000E2 8916[5E18] mov [CHS_limit+2], dx 257 258 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 259 ; read MBR 260 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 261 262 ; check for (valid) primary dos partition 263 264 ;mov byte [RetryCount], 4 265 000000E6 BF0500 mov di, 5 266 267 ;mov ax, 0201h ; read disk 268 000000E9 BB[641E] mov bx, MBR ; location of masterboot code 269 270 000000EC B90100 mov cx, 1 ; cylinder = 0 271 ; sector = 1 272 000000EF B600 mov dh, 0 ; head = 0 273 ;mov dl, [RD_Drive] ; drive 274 ;add dl, 80h -'0' ; make it 80h based 275 000000F1 8A16[F713] mov dl, [drv] 276 T_11: 277 000000F5 B80102 mov ax, 0201h 278 000000F8 CD13 int 13h 279 ;jc short T_37 280 000000FA 7312 jnc short T_13 ; read masterboot sector, OK 281 282 ; reset hard disk(s) 283 000000FC 30E4 xor ah, ah 284 ;mov dl, [drv] 285 000000FE CD13 int 13h 286 287 ;dec byte [RetryCount] 288 00000100 4F dec di 289 00000101 75F2 jnz short T_11 290 291 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 292 ; write disk error message and terminate 293 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 294 295 T_12: 296 00000103 C606[9517]00 mov byte [zbyte], 0 ; message without (Y/N) question 297 298 00000108 E8B701 call T_37 ; write error message 299 0000010B E9A001 jmp T_35 ; terminate 300 301 T_13: 302 0000010E 813E[6220]55AA cmp word [MBR+510], 0AA55h 303 00000114 75ED jne short T_12 304 305 00000116 BE[2620] mov si, MBR+(partition_table+ptFileSystemID) 306 307 ; ah = 0 308 00000119 A0[8516] mov al, [partition] 309 0000011C 20C0 and al, al ; 0 ? 310 0000011E 7409 jz short T_14 311 00000120 FEC8 dec al 312 00000122 7405 jz short T_14 313 00000124 C0E004 shl al, 4 ; * 16 314 00000127 01C6 add si, ax 315 T_14: 316 00000129 E8C901 call validate_primary_dos_partition 317 0000012C 7326 jnc short T_15 318 319 0000012E 803E[8516]00 cmp byte [partition], 0 320 00000133 770F ja short R_5 321 322 00000135 83C610 add si, 16 323 00000138 81FE[6620] cmp si, MBR+partition_table+ptFileSystemID+64 324 0000013C 72EB jb short T_14 325 326 0000013E BE[FC17] mov si, RD_fatp_notfound 327 ;call print_msg 328 ;jmp T_35 329 R_4: 330 00000141 E91301 jmp M_3 331 R_5: 332 00000144 BE[2E18] mov si, not_primary_dos_p 333 00000147 E87B01 call print_msg 334 0000014A BE[1318] mov si, a_p_d_p 335 0000014D EBF2 jmp short R_4 336 M_2: 337 ; Partition size defect 338 ; (less than the minimum number of sectors required) 339 0000014F BE[A817] mov si, RD_psize_defect 340 ;call print_msg 341 ;jmp T_35 342 00000152 EBED jmp short R_4 343 344 T_15: 345 ; valid primary dos partition 346 ; al = FAT type (1,2,3) 347 ; ah = partition type 348 349 00000154 A2[2D18] mov byte [fattype], al 350 00000157 8826[581E] mov [fsID], ah 351 352 0000015B 3C02 cmp al, 2 353 0000015D 741B je short T_17 ; FAT16 BS (default offset addr) 354 0000015F 720E jb short T_16 355 356 ; set format code pointer to FAT32 format code 357 00000161 C706[F20B][BF03] mov word [trdos386fc], format_FAT32_fs 358 ; set FS type string 359 00000167 C706[1817]3332 mov word [fattype_str],'32' ; 'FAT32' 360 ; ok.. read boot sector 361 0000016D EB0B jmp short T_17 362 T_16: 363 ; set format code pointer to FAT12 format code 364 0000016F C706[F20B][8009] mov word [trdos386fc], format_FAT12_fs 365 00000175 C606[1917]32 mov byte [fattype_str+1],'2' ; 'FAT12' 366 367 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 368 ; read primary dos partition's boot sector 369 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 370 371 T_17: 372 ;mov byte [RetryCount], 5 373 374 0000017A 83C604 add si, ptStartSector-ptFileSystemID 375 0000017D 8B04 mov ax, [si] 376 0000017F 8B5402 mov dx, [si+2] 377 00000182 A3[5C1E] mov [dosp_start], ax 378 00000185 8916[5E1E] mov [dosp_start+2], dx 379 00000189 83C604 add si, ptSectors-ptStartSector 380 0000018C 8B0C mov cx, [si] 381 0000018E 8B5C02 mov bx, [si+2] 382 00000191 890E[601E] mov [dosp_size], cx 383 00000195 891E[621E] mov [dosp_size+2], bx 384 385 ; check minimum partition size 386 00000199 803E[2D18]03 cmp byte [fattype], 3 ; FAT32 FS 387 0000019E 730C jnb short M_1 ; yes 388 M_0: 389 000001A0 09DB or bx, bx 390 000001A2 7515 jnz short T_19 391 392 000001A4 3B0E[5A1E] cmp cx, [csize] ; sectors per cylinder 393 000001A8 730F jnb short T_19 394 000001AA EBA3 jmp short M_2 395 M_1: 396 000001AC 83FB01 cmp bx, 1 ; >= 32MB ? 397 000001AF 7708 ja short T_19 398 000001B1 729C jb short M_2 399 400 000001B3 81F91504 cmp cx, 0415h ; must be >= 66581 sectors 401 000001B7 7296 jb short M_2 402 T_19: 403 000001B9 01C1 add cx, ax 404 000001BB 11D3 adc bx, dx 405 000001BD 0F8242FF jc T_12 406 407 000001C1 3B1E[5E18] cmp bx, [CHS_limit+2] 408 000001C5 BB[641E] mov bx, bootsector 409 000001C8 7711 ja short T_20 ; LBA read/write 410 000001CA 7206 jb short T_18 411 000001CC 3B0E[5C18] cmp cx, [CHS_limit] 412 000001D0 7709 ja short T_20 413 T_18: 414 ; CHS read 415 416 ;mov ax, [dosp_start] 417 ;mov dx, [dosp_start+2] 418 419 000001D2 E85901 call read_chs_sector 420 000001D5 0F822AFF jc T_12 421 000001D9 EB0C jmp short T_22 422 T_20: 423 000001DB C606[F613]01 mov byte [lba], 1 ; LBA r/w is required 424 425 ;mov ax, [dosp_start] 426 ;mov dx, [dosp_start+2] 427 428 000001E0 E89901 call read_lba_sector 429 000001E3 0F821CFF jc T_12 430 T_22: 431 000001E7 813E[6220]55AA cmp word [bootsector+510], 0AA55h 432 000001ED 7558 jne short T_23 433 434 000001EF 813E[6F1E]0002 cmp word [bootsector+bsBytesPerSec], 512 435 000001F5 7550 jne short T_23 436 437 ; 04/05/2024 (BugFix) 438 000001F7 803E[791E]F8 cmp byte [bootsector+bsMedia], 0F8h 439 000001FC 7549 jne short T_23 440 441 000001FE 803E[2D18]02 cmp byte [fattype], 2 442 00000203 7722 ja short T_24 443 444 00000205 803E[8A1E]29 cmp byte [bootsector+bsBpbSignature], 29h 445 0000020A 753B jne short T_23 446 0000020C 66813E[9A1E]464154- cmp dword [bootsector+bsFileSysType], 'FAT1' 446 00000214 31 447 00000215 7530 jne short T_23 448 449 00000217 A0[9E1E] mov al, [bootsector+bsFileSysType+4] 450 0000021A 3C36 cmp al, '6' 451 0000021C 7404 je short T_25 452 453 0000021E 3C32 cmp al, '2' 454 00000220 7525 jne short T_23 455 456 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 457 ; format question (and warning msg) 458 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 459 460 T_25: 461 00000222 BE[8616] mov si, RD_Format_warning ; warning is required 462 00000225 EB23 jmp short T_26 463 T_24: 464 ; 04/05/2024 465 00000227 833E[7A1E]00 cmp word [bootsector+bsFATsecs], 0 466 0000022C 7719 ja short T_23 ; not FAT32 fs 467 468 0000022E 803E[A61E]29 cmp byte [bootsector+BS_BootSig], 29h 469 00000233 7512 jne short T_23 470 471 00000235 66813E[B61E]464154- cmp dword [bootsector+BS_FilSysType], 'FAT3' 471 0000023D 33 472 0000023E 7507 jne short T_23 473 00000240 803E[BA1E]32 cmp byte [bootsector+BS_FilSysType+4], '2' 474 00000245 74DB je short T_25 475 T_23: 476 00000247 BE[E016] mov si, RD_Do_you_want ; no need to warning 477 T_26: 478 0000024A E87800 call print_msg 479 480 0000024D E88400 call get_answer 481 00000250 3C59 cmp al, 'Y' 482 00000252 7408 je short T_27 483 484 00000254 BE[2E17] mov si, _no_str 485 M_3: 486 00000257 E86B00 call print_msg 487 488 0000025A EB52 jmp short T_35 489 T_27: 490 0000025C BE[2717] mov si, _yes_str 491 0000025F E86300 call print_msg 492 493 00000262 BE[3C17] mov si, RD_PressKeyWhenReady 494 00000265 E85D00 call print_msg 495 T_28: 496 00000268 31C0 xor ax, ax 497 0000026A CD16 int 16h ; wait for keyboard command 498 0000026C 3C0D cmp al, 'M'-40h ; Enter (OK) key 499 ;je short T_29 ; write 500 0000026E 740A je short R_6 501 00000270 3C03 cmp al, 'C'-40h 502 00000272 743A je short T_35 ; no write (exit) 503 00000274 3C1B cmp al, 27 504 00000276 7436 je short T_35 505 00000278 EBEE jmp short T_28 506 507 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 508 ; clear fat buffer and start formatting 509 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 510 511 R_6: 512 0000027A 803E[2D18]03 cmp byte [fattype], 3 ; FAT32 ? 513 0000027F 750E jne short T_29 514 515 ; Temporary FAT32 note for Retro DOS v4 516 ; (This code will be removed when the Retro DOS v5 517 ; FAT32 boot sector code will be ready.)" ; 28/10/2023 518 519 00000281 BE[FA18] mov si, FAT32_note 520 00000284 E83E00 call print_msg 521 00000287 30E4 xor ah, ah 522 00000289 CD16 int 16h 523 0000028B 3C0D cmp al, 'M'-40h ; Enter (OK) key 524 0000028D 751F jne short T_35 525 526 T_29: 527 0000028F BE[3917] mov si, RD_CRLF 528 00000292 E83000 call print_msg 529 530 ; Clear buffer in BSS 531 00000295 BF[641E] mov di, HDFORMAT_FATBUFFER 532 00000298 31C0 xor ax, ax 533 0000029A B90001 mov cx, 256 534 0000029D F3AB rep stosw 535 536 ; Clear volume name field 537 0000029F BF[7820] mov di, StrVolumeName 538 000002A2 B10C mov cl, 12 539 000002A4 F3AA rep stosb 540 541 000002A6 8A16[581E] mov dl, [fsID] ; Partition ID 542 543 000002AA FF26[F20B] jmp word [trdos386fc] 544 545 T_35: 546 000002AE BE[3917] mov si, RD_CRLF 547 Exit: 548 000002B1 E81100 call print_msg 549 000002B4 B8004C mov ax, 4C00h ; terminate 550 000002B7 CD21 int 21h 551 T_36: 552 000002B9 E81800 call get_answer 553 000002BC 3C59 cmp al, 'Y' 554 000002BE 74CF je short T_29 555 000002C0 EBEC jmp short T_35 556 557 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 558 ; disk r/w error or disk not ready 559 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 560 561 T_37: 562 000002C2 BE[7317] mov si, RD_disk_NotReadyOrError 563 ;;call print_msg 564 ;;jmp short T_36 565 ;jmp short print_msg 566 567 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 568 ; print message 569 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 570 571 print_msg: 572 T_38: 573 000002C5 AC lodsb ; Load byte at DS:SI to AL 574 000002C6 20C0 and al, al 575 000002C8 7409 jz short T_39 576 000002CA B40E mov ah, 0Eh 577 000002CC BB0700 mov bx, 07h 578 000002CF CD10 int 10h ; BIOS Service func ( ah ) = 0Eh 579 ; Write char as TTY 580 ; AL-char BH-page BL-color 581 000002D1 EBF2 jmp short T_38 582 T_39: 583 _NO_: 584 000002D3 C3 retn 585 586 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 587 ; Yes/No 588 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 589 590 get_answer: 591 000002D4 31C0 xor ax, ax 592 000002D6 CD16 int 16h ; wait for keyboard command 593 000002D8 3C79 cmp al, 'y' 594 000002DA 7416 je short _yes ; retry 595 000002DC 3C59 cmp al, 'Y' 596 000002DE 7414 je short _YES_ 597 000002E0 3C6E cmp al, 'n' 598 000002E2 74EF je short _NO_ ; exit 599 000002E4 3C4E cmp al, 'N' 600 000002E6 74EB je short _NO_ 601 000002E8 3C03 cmp al, 'C'-40h 602 000002EA 74E7 je short _NO_ 603 000002EC 3C1B cmp al, 27 604 000002EE 74E3 je short _NO_ 605 000002F0 EBE2 jmp short get_answer 606 _yes: 607 000002F2 B059 mov al, 'Y' 608 _YES_: 609 000002F4 C3 retn 610 611 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 612 ; get and set partition type for formatting 613 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 614 615 validate_primary_dos_partition: 616 617 ; INPUT: 618 ; si = partition table entry offset + file system ID 619 ; OUTPUT: 620 ; cf = 0 -> ah = primary DOS partition ID 621 ; (01h,04h,06h,0Bh,0Ch,0Eh) 622 ; al = FAT type 623 ; 1 = FAT12 624 ; 2 = FAT16 625 ; 3 = FAT32 626 ; 627 ; cf = 1 -> not a primary DOS partition 628 629 000002F5 28C0 sub al, al ; mov al, 0 630 631 000002F7 8A24 mov ah, [si] 632 633 000002F9 80FC01 cmp ah, 01h ; FAT12 partition 634 000002FC 7228 jb short V_5 ; 0 635 000002FE 741E je short V_3 636 V_0: 637 00000300 FEC0 inc al ; mov al, 1 638 639 00000302 80FC06 cmp ah, 06h ; FAT16 CHS partition (>=32MB) 640 00000305 7709 ja short V_2 641 00000307 7415 je short V_3 642 643 00000309 80FC04 cmp ah, 04h ; FAT16 CHS partition (< 32MB) 644 0000030C 7410 je short V_3 645 V_1: 646 0000030E F9 stc 647 0000030F C3 retn 648 V_2: 649 00000310 FEC0 inc al ; mov al, 2 650 651 00000312 80FC0C cmp ah, 0Ch ; FAT32 LBA partition 652 00000315 7407 je short V_3 653 00000317 7708 ja short V_4 654 655 00000319 80FC0B cmp ah, 0Bh ; FAT32 CHS partition 656 0000031C 7208 jb short V_5 657 V_3: 658 0000031E FEC0 inc al ; 0->1, 1->2, 2->3 659 00000320 C3 retn 660 V_4: 661 00000321 80FC0E cmp ah, 0Eh ; FAT16 LBA partition 662 00000324 75E8 jne short V_1 663 ;mov al, 2 664 V_5: 665 00000326 C3 retn 666 667 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 668 ; disk read 669 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 670 671 read_hd_sector: 672 00000327 803E[F613]00 cmp byte [lba], 0 673 0000032C 774E ja short read_lba_sector 674 675 read_chs_sector: 676 ; Derived from 'proc_write_chs_sector' in HDFORMAT.ASM (30/07/2011) 677 ; (TRDOS v1, Singlix FS formatting utility) 678 0000032E C606[591E]02 mov byte [rw], 2 ; read 679 00000333 EB05 jmp short chs_rw 680 681 write_chs_sector: 682 ; Derived from 'proc_write_chs_sector' in HDFORMAT.ASM (30/07/2011) 683 ; (TRDOS v1, Singlix FS formatting utility) 684 00000335 C606[591E]03 mov byte [rw], 3 ; write 685 ;jmp short chs_rw 686 chs_rw: 687 0000033A 56 push si 688 0000033B 51 push cx 689 chs_rw_0: 690 0000033C BF0500 mov di, 5 691 chs_rw_1: 692 0000033F 52 push dx ; Linear sector # 693 00000340 50 push ax ; DX_AX = Linear address (sectors) 694 00000341 8B0E[F813] mov cx, [sectors] 695 00000345 53 push bx 696 697 00000346 E86C08 call div32 ; 32 bit divide 698 699 00000349 89D9 mov cx, bx ; Sector (zero based) 700 0000034B 41 inc cx ; To make it 1 based 701 0000034C 51 push cx 702 0000034D 8B0E[FA13] mov cx, [heads] 703 00000351 E86108 call div32 ; Convert track to head & cyl 704 00000354 88DE mov dh, bl ; BX = Head (max. FFh) 705 00000356 59 pop cx ; AX=Cyl, DH=Head, CX=Sector 706 00000357 5B pop bx ; ES:BX = Buffer 707 708 00000358 8A16[F713] mov dl, [drv] 709 0000035C 88C5 mov ch, al 710 0000035E D0CC ror ah, 1 ; Rotate right 711 00000360 D0CC ror ah, 1 712 00000362 08E1 or cl, ah 713 chs_rw_2: 714 00000364 8A26[591E] mov ah, [rw] ; 02h = read, 03h = write 715 00000368 B001 mov al, 01h 716 0000036A CD13 int 13h ; BIOS Service func (ah) = 2/3 717 ; Read/Write disk sectors 718 ; AL-sec num CH-track CL-sec 719 ; DH-head DL-drive ES:BX-buffer 720 ; CF-flag AH-status AL-sectors written/read 721 ; If CF = 1 then AH = Error code (>0) 722 723 ;mov [error], ah 724 0000036C 7309 jnc short chs_rw_3 725 0000036E 4F dec di 726 0000036F 7406 jz short chs_rw_3 727 728 00000371 30E4 xor ah, ah 729 ;mov dl, [drv] 730 00000373 CD13 int 13h ; BIOS Service func (ah) = 0 731 ; Reset disk system 732 00000375 EBED jmp short chs_rw_2 733 734 chs_rw_3: 735 00000377 58 pop ax 736 00000378 5A pop dx 737 00000379 59 pop cx 738 0000037A 5E pop si 739 0000037B C3 retn ; db 0C3h 740 741 read_lba_sector: 742 ; trhdboot.s (2020), hdformat.asm (2011) 743 0000037C C606[591E]42 mov byte [rw], 42h 744 00000381 EB0C jmp short lba_rw 745 746 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 747 ; disk write 748 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 749 750 write_hd_sector: 751 00000383 803E[F613]00 cmp byte [lba], 0 752 00000388 76AB jna short write_chs_sector 753 754 write_lba_sector: 755 ; trhdboot.s (2020), hdformat.asm (2011) 756 0000038A C606[591E]43 mov byte [rw], 43h 757 ;jmp short lba_rw 758 lba_rw: 759 0000038F BF0500 mov di, 5 760 lba_rw_1: 761 ;pusha ; db 60h 762 00000392 60 db 60h 763 ;push 0 ; db 6Ah, 00h 764 00000393 6A00 db 6Ah, 0 765 ;push 0 ; db 6Ah, 00h 766 00000395 6A00 db 6Ah, 0 767 00000397 52 push dx 768 00000398 50 push ax 769 00000399 06 push es 770 0000039A 53 push bx 771 ;push 1 ; db 6Ah, 01h 772 0000039B 6A01 db 6Ah, 01h 773 ;push 10h ; db 6Ah, 10h 774 0000039D 6A10 db 6Ah, 10h 775 776 0000039F 89E6 mov si, sp 777 000003A1 8A16[F713] mov dl, [drv] 778 000003A5 30C0 xor al, al ; verify off 779 lba_rw_2: 780 000003A7 8A26[591E] mov ah, [rw] ; 42h = LBA read, 43h = LBA write 781 ;xor al, al ; verify off 782 000003AB CD13 int 13h 783 784 ;mov [error], ah 785 000003AD 730D jnc short lba_rw_3 786 787 000003AF 4F dec di 788 000003B0 740A jz short lba_rw_3 789 790 000003B2 30E4 xor ah, ah 791 ;mov dl, [drv] 792 000003B4 CD13 int 13h ; BIOS Service func (ah) = 0 793 ; Reset disk system 794 795 ;mov word [si+2], 1 ; set r/w count to 1 again 796 000003B6 C6440201 mov byte [si+2], 1 797 798 000003BA EBEB jmp short lba_rw_2 799 800 lba_rw_3: 801 ;popa 802 000003BC 61 db 61h 803 ;popa 804 000003BD 61 db 61h 805 000003BE C3 retn 806 807 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 808 ; FAT32 FORMATTING 809 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 810 811 ; ((TRDOS 386 criter)) 812 ; Minimum size of FAT32 FS = 65525 + 512 + 512 + 32 813 ; >= 66581 sectors (or >= 65525 data clusters) 814 815 format_FAT32_fs: 816 ;mov ax, 000Ch ; db 0Ch, 00h ; 'or al, 0' 817 ;cmp dl, al ; 0Ch 818 ;je short FAT32_lba_format 819 ;mov ax, 0C00Bh ; db 0Bh, 0C0h ; 'or ax, ax' 820 ;FAT32_lba_format: 821 ; Put TRDOS 386 FAT32 partition magic word 822 ; at offset 5Ah, in TRDOS386 FAT32 boot sector 0. 823 000003BF BD[F60F] mov bp, RD_FAT32_hd_bs 824 000003C2 8D7E03 lea di, [bp+3] 825 000003C5 BE[6C18] mov si, bs_oem_name 826 000003C8 B90400 mov cx, 4 827 000003CB F3A5 rep movsw 828 ;mov [bp+5Ah], ax ; [loc_5A] 829 000003CD C7465A0BC0 mov word [bp+5Ah], 0C00Bh 830 000003D2 A1[F813] mov ax, [sectors] 831 000003D5 894618 mov [bp+18h], ax ; [BPB_SecPerTrk] 832 000003D8 A1[FA13] mov ax, [heads] 833 000003DB 89461A mov [bp+1Ah], ax ; [BPB_NumHeads] 834 000003DE A1[5C1E] mov ax, [dosp_start] 835 000003E1 89461C mov [bp+1Ch], ax ; [BPB_HiddSec] 836 000003E4 A1[5E1E] mov ax, [dosp_start+2] 837 000003E7 89461E mov [bp+1Eh], ax ; [BPB_HiddSec+2] 838 000003EA A1[601E] mov ax, [dosp_size] 839 000003ED 894620 mov [bp+20h], ax ; [BPB_TotSec32] 840 000003F0 8B16[621E] mov dx, [dosp_size+2] 841 000003F4 895622 mov [bp+22h], dx ; [BPB_TotSec32+2] 842 843 ; Sectors per cluster calculation 844 ; (According to MS FAT32 FS specification.) 845 000003F7 B108 mov cl, 8 ; 8 sectors per cluster 846 000003F9 83FA08 cmp dx, 8 ; >= 532480 sectors 847 000003FC 7709 ja short FAT32_f_2 ; 8 sectors per cluster 848 000003FE 7205 jb short FAT32_f_1 ; 1 sector per cluster 849 00000400 3D0020 cmp ax, 2000h ; dx_ax = (8*65536)+8192 850 00000403 7302 jnb short FAT32_f_2 851 FAT32_f_1: 852 00000405 B101 mov cl, 1 ; 1 sector per cluster 853 FAT32_f_2: 854 00000407 884E0D mov [bp+0Dh], cl ; [BPB_SecPerClus] 855 ;mov byte [bp+10h], 2 ; [BPB_NumFATs] 856 ;mov word [bp+0Eh], 32 ; [BPB_RsvdSecCnt] 857 858 ; Calculating FAT size in sectors 859 ; (According to MS FAT32 FS Specification, 2000) 860 861 ; DX_AX = partition (volume) size in sectors 862 0000040A 2B460E sub ax, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 32 863 0000040D 83DA00 sbb dx, 0 864 ; TmpVal1 = DiskSize - (BPB_ResvdSecCnt + 865 ; RootDirsectors) 866 ; RootDirSectors = 0 (for FAT32 FS) 867 00000410 89CB mov bx, cx ; ch = 0 868 00000412 C1E308 shl bx, 8 ; * 256 869 00000415 8A4E10 mov cl, [bp+10h] ; [BPB_NumFATs] 870 00000418 01CB add bx, cx 871 ; TmpVal2 = (256*BPB_SecPerClus)+BPB_NumFATs 872 0000041A D1EB shr bx, 1 873 ; TmpVal2 = TmpVal2/2 874 0000041C 89D9 mov cx, bx 875 0000041E 4B dec bx ; TmpVal2-1 876 0000041F 01D8 add ax, bx 877 00000421 83D200 adc dx, 0 878 00000424 E88E07 call div32 879 ; FATSz = (TmpVal1+(TmpVal2-1))/TmpVal2 880 ; DX_AX = FAT size in sectors 881 00000427 894624 mov [bp+24h], ax ; [BPB_FATSz32] 882 0000042A 895626 mov [bp+26h], dx ; [BPB_FATSz32+2] 883 ; * 2 884 0000042D 89D3 mov bx, dx 885 0000042F 01C0 add ax, ax 886 00000431 11D3 adc bx, dx 887 ; BX_AX = [BPB_NumFATs] * [BPB_FATSz32] 888 00000433 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 32 889 00000436 01C1 add cx, ax 890 00000438 83D300 adc bx, 0 891 ; BX_CX = [BPB_RsvdSecCnt]+[BPB_NumFATs]*[BPB_FATSz32] 892 0000043B 8B4620 mov ax, [bp+20h] ; [BPB_TotSec32] 893 0000043E 8B5622 mov dx, [bp+22h] ; [BPB_TotSec32+2] 894 00000441 29C8 sub ax, cx 895 00000443 19DA sbb dx, bx 896 00000445 890E[6420] mov [data_start], cx 897 00000449 891E[6620] mov [data_start+2], bx 898 ; DX_AX = Data sectors 899 0000044D A3[6820] mov [data_sectors], ax 900 00000450 8916[6A20] mov [data_sectors+2], dx 901 00000454 8A4E0D mov cl, [bp+0Dh] ; [BPB_SecPerClus] 902 00000457 30ED xor ch, ch 903 00000459 E85907 call div32 ; DX_AX/CX 904 ; DX_AX = Count of clusters (rounded down) 905 0000045C A3[6C20] mov [cluster_count], ax 906 0000045F 8916[6E20] mov [cluster_count+2], dx 907 908 00000463 8D7E47 lea di, [bp+71] ; [BS_VolLab] 909 00000466 E89B01 call write_volume_name 910 00000469 8D7643 lea si, [bp+67] ; [BS_VolID] 911 0000046C E8F401 call write_volume_serial 912 0000046F E8F402 call write_cluster_count 913 914 00000472 E87502 call write_formatting_msg 915 00000475 B000 mov al, 0 916 00000477 E8CD02 call write_format_percent_x 917 918 0000047A 8B461C mov ax, [bp+1Ch] ; [BPB_HiddSec] 919 0000047D 8B561E mov dx, [bp+1Eh] ; [BPB_HiddSec+2] 920 00000480 0106[6420] add [data_start], ax 921 00000484 1116[6620] adc [data_start+2], dx 922 FAT32_f_3: 923 ; DX_AX = FAT32 Boot Sector address 924 00000488 BB[F60F] mov bx, RD_FAT32_hd_bs 925 ; ES:BX = Boot Sector 1 Buffer 926 0000048B E8F5FE call write_hd_sector 927 0000048E 0F82BC02 jc formatting_error 928 00000492 E87902 call write_format_percent 929 00000495 83C001 add ax, 1 930 00000498 83D200 adc dx, 0 931 0000049B BB[551C] mov bx, HDFORMAT_FSINFO_BUFF 932 ; ES:BX = FS INFO Sector Buffer (= BS+1) 933 0000049E E8E2FE call write_hd_sector 934 000004A1 0F82A902 jc formatting_error 935 000004A5 E86602 call write_format_percent 936 000004A8 83C001 add ax, 1 937 000004AB 83D200 adc dx, 0 938 000004AE BB[F611] mov bx, RD_FAT32_hd_bs + 512 939 ; ES:BX = Boot Sector 2 Buffer 940 000004B1 E8CFFE call write_hd_sector 941 000004B4 0F829602 jc formatting_error 942 000004B8 E85302 call write_format_percent 943 000004BB B90300 mov cx, 3 944 FAT32_f_4: 945 000004BE 51 push cx 946 000004BF 83C001 add ax, 1 947 000004C2 83D200 adc dx, 0 948 000004C5 BB[641E] mov bx, HDFORMAT_EMPTY_BUFF 949 000004C8 E8B8FE call write_hd_sector 950 000004CB 0F827F02 jc formatting_error 951 000004CF E83C02 call write_format_percent 952 000004D2 59 pop cx 953 000004D3 FEC9 dec cl 954 000004D5 75E7 jnz short FAT32_f_4 955 000004D7 83C001 add ax, 1 956 000004DA 83D200 adc dx, 0 957 000004DD 8B4E1C mov cx, [bp+1Ch] ; [BPB_HiddSec] 958 000004E0 8B5E1E mov bx, [bp+1Eh] ; [BPB_HiddSec+2] 959 000004E3 83C10C add cx, 12 960 000004E6 83D300 adc bx, 0 961 ; write BACKUP sectors 962 ; (6,7,8 boot+fsi and 9,10,11 empty sectors) 963 000004E9 39DA cmp dx, bx 964 000004EB 729B jb short FAT32_f_3 965 000004ED 39C8 cmp ax, cx 966 000004EF 7297 jb short FAT32_f_3 967 ; write remain part of reserved sectors 968 000004F1 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] 969 000004F4 83E90C sub cx, 12 970 000004F7 7618 jna short FAT32_f_6 971 FAT32_f_5: 972 000004F9 51 push cx 973 000004FA BB[641E] mov bx, HDFORMAT_EMPTY_BUFF 974 000004FD E883FE call write_hd_sector 975 00000500 0F824A02 jc formatting_error 976 00000504 E80702 call write_format_percent 977 00000507 83C001 add ax, 1 978 0000050A 83D200 adc dx, 0 979 0000050D 59 pop cx 980 0000050E 49 dec cx 981 0000050F 75E8 jnz short FAT32_f_5 982 FAT32_f_6: 983 ; write FAT sectors 984 00000511 8B0E[6420] mov cx, [data_start] ; lba/abs addr 985 00000515 8B1E[6620] mov bx, [data_start+2] ; lba/abs addr 986 00000519 53 push bx 987 0000051A 51 push cx 988 0000051B BB[641E] mov bx, HDFORMAT_FATBUFFER 989 ; ES:BX = FAT Sector Buffer 990 0000051E 8A4E15 mov cl, [bp+15h] ; [BPB_Media] 991 00000521 B5FF mov ch, 0FFh 992 00000523 890F mov [bx], cx 993 00000525 88E9 mov cl, ch ; cx = 0FFFFh 994 00000527 894F02 mov [bx+2], cx 995 0000052A 894F04 mov [bx+4], cx 996 0000052D 894F06 mov [bx+6], cx 997 ; Root dir cluster number = 2 998 ; 0FFFFFFFh = end of cluster chain 999 00000530 894F08 mov [bx+8], cx ; 0FFFFh 1000 00000533 80E50F and ch, 0Fh 1001 00000536 894F0A mov [bx+10], cx ; 0FFFh 1002 ;inc cx 1003 00000539 E847FE call write_hd_sector 1004 0000053C 0F820E02 jc formatting_error 1005 00000540 E8CB01 call write_format_percent 1006 ;mov bx, HDFORMAT_FATBUFFER 1007 00000543 B90000 mov cx, 0 1008 00000546 890F mov [bx], cx 1009 00000548 894F02 mov [bx+2], cx 1010 0000054B 894F04 mov [bx+4], cx 1011 0000054E 894F06 mov [bx+6], cx 1012 00000551 894F08 mov [bx+8], cx 1013 00000554 894F0A mov [bx+10], cx 1014 00000557 EB0F jmp short FAT32_f_8 1015 FAT32_f_7: 1016 00000559 53 push bx 1017 0000055A 51 push cx 1018 0000055B BB[641E] mov bx, HDFORMAT_FATBUFFER 1019 0000055E E822FE call write_hd_sector 1020 00000561 0F82E901 jc formatting_error 1021 00000565 E8A601 call write_format_percent 1022 FAT32_f_8: 1023 00000568 59 pop cx 1024 00000569 5B pop bx 1025 0000056A 83C001 add ax, 1 1026 0000056D 83D200 adc dx, 0 1027 00000570 39DA cmp dx, bx 1028 00000572 72E5 jb short FAT32_f_7 1029 00000574 39C8 cmp ax, cx 1030 00000576 72E1 jb short FAT32_f_7 1031 1032 ; write root directory (1st cluster) 1033 ; as empty sectors 1034 00000578 8A4E0D mov cl, [bp+0Dh] ; [BPB_SecPerClus] 1035 0000057B 30ED xor ch, ch 1036 0000057D 290E[6820] sub [data_sectors], cx 1037 00000581 831E[6A20]00 sbb word [data_sectors+2], 0 1038 FAT32_f_9: 1039 00000586 51 push cx 1040 00000587 BB[641E] mov bx, HDFORMAT_EMPTY_BUFF 1041 0000058A E8F6FD call write_hd_sector 1042 0000058D 0F82BD01 jc formatting_error 1043 00000591 E87A01 call write_format_percent 1044 00000594 83C001 add ax, 1 1045 00000597 83D200 adc dx, 0 1046 0000059A 59 pop cx 1047 0000059B FEC9 dec cl 1048 0000059D 75E7 jnz short FAT32_f_9 1049 1050 ; write DATA sectors 1051 ; (after root directory 1st cluster) 1052 0000059F 8B0E[6820] mov cx, [data_sectors] 1053 000005A3 8B1E[6A20] mov bx, [data_sectors+2] 1054 ; NOTE: Partition size must be >= 512 MB 1055 ; for FAT32 FS ((BX >= 15)) 1056 FAT32_f_10: 1057 000005A7 53 push bx 1058 000005A8 51 push cx 1059 000005A9 BB[551A] mov bx, HDFORMAT_SECBUFFER 1060 000005AC E8D4FD call write_hd_sector 1061 000005AF 0F829B01 jc formatting_error 1062 000005B3 E85801 call write_format_percent 1063 000005B6 59 pop cx 1064 000005B7 5B pop bx 1065 000005B8 83C001 add ax, 1 1066 000005BB 83D200 adc dx, 0 1067 000005BE 49 dec cx 1068 000005BF 75E6 jnz short FAT32_f_10 1069 000005C1 4B dec bx 1070 000005C2 75E3 jnz short FAT32_f_10 1071 1072 ; If there are, format remain sectors which are 1073 ; at beyond of data clusters, with zero bytes. 1074 1075 000005C4 8B4E1C mov cx, [bp+1Ch] ; [BPB_HiddSec] 1076 000005C7 8B5E1E mov bx, [bp+1Eh] ; [BPB_HiddSec+2] 1077 FAT16_f_18: 1078 000005CA 034E20 add cx, [bp+20h] ; [BPB_TotSec32] 1079 000005CD 135E22 adc bx, [bp+22h] ; [BPB_TotSec32+2] 1080 FAT16_f_19: 1081 FAT12_f_8: 1082 ; are there remain sectors (in partition) ? 1083 000005D0 29C1 sub cx, ax 1084 000005D2 19D3 sbb bx, dx 1085 ; 11/02/2019 1086 ; BX must be 0 (Because, 1 cluster <= 32KB. So, 1087 ; remain sectors must not be more than 32K) 1088 000005D4 751C jnz short FAT32_f_12 ; There is a wrong thing !!! 1089 ; If BX is not zero, 1090 ; it is better to skip this stage...) 1091 000005D6 09C9 or cx, cx 1092 000005D8 7418 jz short FAT32_f_12 ; no.. 1093 ; (good! FAT contains all data sectors) 1094 FAT32_f_11: 1095 000005DA 51 push cx 1096 000005DB BB[641E] mov bx, HDFORMAT_EMPTY_BUFF 1097 000005DE E8A2FD call write_hd_sector 1098 000005E1 0F826901 jc formatting_error 1099 000005E5 E82601 call write_format_percent 1100 000005E8 59 pop cx 1101 000005E9 83C001 add ax, 1 1102 000005EC 83D200 adc dx, 0 1103 000005EF 49 dec cx 1104 000005F0 75E8 jnz short FAT32_f_11 1105 1106 FAT32_f_12: 1107 ; End of FAT format routine... 1108 end_of_formatting: 1109 000005F2 B064 mov al, 100 1110 000005F4 E85001 call write_format_percent_x 1111 ;mov si, CRLF 1112 ;call print_msg 1113 000005F7 BE[3417] mov si, _msg_OK 1114 ;call print_msg 1115 000005FA E9B4FC jmp Exit 1116 1117 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1118 ; set & write volume name 1119 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1120 1121 write_fs_volume_name: 1122 000005FD C606[6B18]40 mov byte [vname_length], 64 1123 00000602 EB05 jmp short svn_fs 1124 1125 write_volume_name: 1126 00000604 C606[6B18]0B mov byte [vname_length], 11 1127 svn_fs: 1128 ; DI = (BS) Volume Label address 1129 00000609 BE[8218] mov si, Msg_Volume_Name 1130 0000060C E8B6FC call print_msg 1131 1132 ; get cursor position 1133 ; bh = 0 ; video page 1134 0000060F B403 mov ah, 3 ; get cursor pos 1135 00000611 CD10 int 10h 1136 00000613 8916[5C18] mov [Cursor_Pos], dx 1137 1138 00000617 E80905 call rw_char 1139 0000061A 7207 jc short svn_1 1140 svn_0: 1141 0000061C AC lodsb 1142 0000061D 3C20 cmp al, 20h 1143 0000061F 7706 ja short svn_2 1144 00000621 74F9 je short svn_0 1145 svn_1: 1146 00000623 BE[7618] mov si, no_name 1147 00000626 AC lodsb 1148 svn_2: 1149 ;mov di, [bp+47h) ; [BS_VolLab] ; FAT32 1150 ;mov di, [bp+2Bh) ; [BS_VolLab] ; FAT16 (&FAT12) 1151 00000627 89FB mov bx, di ; * 1152 00000629 30ED xor ch, ch 1153 0000062B 8A0E[6B18] mov cl, [vname_length] ; 11 1154 0000062F EB05 jmp short svn_4 1155 svn_3: 1156 00000631 AC lodsb 1157 00000632 3C20 cmp al, 20h 1158 00000634 7226 jb short svn_6 1159 svn_4: 1160 00000636 AA stosb 1161 00000637 E2F8 loop svn_3 1162 svn_5: 1163 00000639 8A0E[6B18] mov cl, [vname_length] ; 11 1164 0000063D 89DE mov si, bx ; * 1165 0000063F BF[7820] mov di, StrVolumeName 1166 00000642 F3A4 rep movsb 1167 ;mov byte [di], 0 1168 1169 00000644 8B16[5C18] mov dx, [Cursor_Pos] 1170 00000648 BB0700 mov bx, 7 1171 0000064B B402 mov ah, 2 1172 0000064D CD10 int 10h ; Set Cursor Position 1173 1174 0000064F BE[7820] mov si, StrVolumeName 1175 00000652 E870FC call print_msg 1176 00000655 BE[E418] mov si, CRLF 1177 00000658 E86AFC call print_msg 1178 0000065B C3 retn 1179 svn_6: 1180 0000065C B020 mov al, 20h 1181 svn_7: 1182 0000065E AA stosb 1183 0000065F E2FD loop svn_7 1184 00000661 EBD6 jmp short svn_5 1185 1186 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1187 ; set & write volume serial number (volume ID) 1188 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1189 1190 write_volume_serial: 1191 ; SI = (BS) Volume Serial Number (binary) address 1192 1193 ;xor ax, ax 1194 ;int 1Ah ; get time of day 1195 1196 ;mov [si], dx 1197 ;mov [si+2], cx ; set unique volume ID 1198 1199 ;mov ah, 02h ; Return Current Time 1200 ;int 1Ah 1201 ;xchg ch, cl 1202 ;xchg dh, dl 1203 1204 ;add cx, dx 1205 ;add [si+2], cx 1206 1207 ;mov ah, 04h ; Return Current Date 1208 ;int 1Ah 1209 1210 ;xchg ch,cl 1211 ;xchg dh,dl 1212 1213 ;add cx, dx 1214 ;add [si+2], cx 1215 1216 ; According to Microsoft DOS 6.0 serial number 1217 ; production method... 1218 ; < Create unique 32 bit serial number > 1219 1220 ; Create_Serial_ID (MSDOS 6.0 Source code, MSFOR.ASM) 1221 ; (20/04/1987) 1222 ; 1223 ; Get date (INT 21h, AH=2Bh) 1224 ; Get time (INT 21h, AH=2Ch) 1225 ; Serial_ID+0 = DX reg date + DX reg time 1226 ; Serial_ID+2 = CX reg date + CX reg time 1227 ; Serial_Num_Low = Serial_ID+2 1228 ; Serial_Num_High = Serial_ID+0 1229 1230 00000663 B404 mov ah, 04h ; Return Current Date 1231 00000665 CD1A int 1Ah 1232 1233 ; DL = Day (BCD) (20h) 1234 ; DH = Month (BCD) (12h) 1235 ; CH = Century (BCD) (20h) 1236 ; CL = Year (BCD) (17h) 1237 1238 00000667 88D0 mov al, dl 1239 00000669 E87100 call bcd_to_bin 1240 0000066C 88C2 mov dl, al 1241 0000066E 88F0 mov al, dh 1242 00000670 E86A00 call bcd_to_bin 1243 00000673 88C6 mov dh, al 1244 00000675 88C8 mov al, cl 1245 00000677 E86300 call bcd_to_bin 1246 0000067A 88C1 mov cl, al 1247 0000067C 88E8 mov al, ch 1248 0000067E E85C00 call bcd_to_bin 1249 00000681 88C5 mov ch, al 1250 1251 ; DH = Month (1-10) 1252 ; DL = Day (1-31) 1253 ; CX = Year (1900-2099) 1254 1255 00000683 52 push dx 1256 00000684 51 push cx 1257 1258 00000685 B402 mov ah, 02h ; Return Current Time 1259 00000687 CD1A int 1Ah 1260 1261 ; DH = Seconds (BCD) (59h) 1262 ; CL = Minutes (BCD) (59h) 1263 ; CH = Hours (BCD) (23h) 1264 ; DL = Daylight savings time option (1=yes) 1265 1266 00000689 88F0 mov al, dh 1267 0000068B E84F00 call bcd_to_bin 1268 0000068E 88C6 mov dh, al 1269 00000690 88C8 mov al, cl 1270 00000692 E84800 call bcd_to_bin 1271 00000695 88C1 mov cl, al 1272 00000697 88E8 mov al, ch 1273 00000699 E84100 call bcd_to_bin 1274 0000069C 88C5 mov ch, al 1275 1276 ; CH = Hour (0-23) 1277 ; CL = Minutes (0-59) 1278 ; DH = Seconds (0-59) 1279 ; ((DL = Hundredths (0-99) - MSDOS!)) 1280 ; DL = 0 or 1 (here!) 1281 1282 0000069E 89C8 mov ax, cx 1283 000006A0 59 pop cx 1284 000006A1 01C8 add ax, cx 1285 1286 000006A3 894402 mov [si+2], ax 1287 1288 000006A6 89D0 mov ax, dx 1289 000006A8 5A pop dx 1290 000006A9 01D0 add ax, dx 1291 1292 000006AB 8904 mov [si], ax 1293 1294 000006AD 30E4 xor ah, ah ; Read time counter 1295 000006AF CD1A int 1Ah 1296 1297 ; CX = High word of clock count 1298 ; DX = Low word of clock count 1299 ; AL = 0 if 24 hours has not passed, else 1 1300 1301 ; NOTES: 1302 ; (Ref: vitaly_filatov.tripod.com/ng/asm/asm_029.1.html) 1303 ; 1304 ; Following formulas convert the clock count to 1305 ; the time of day: 1306 ; Hour = Clock / 65543 (1007h) 1307 ; Remainder = Clock MOD 65543 1308 ; 1309 ; Minutes = Remainder / 1092 (444h) 1310 ; Remainder = Remainder MOD 1092 1311 ; 1312 ; Second = Remainder / 18.21 1313 ; Remainder = Remainder MOD 18.21 1314 ; 1315 ; Hundredths = CINT(Remainder * 100) 1316 1317 000006B1 0014 add [si], dl 1318 1319 ; SI = Volume serial number address (4 bytes) 1320 000006B3 8A04 mov al, [si] 1321 000006B5 E82205 call bin_to_hex 1322 000006B8 A3[AD18] mov [Vol_Serial2+2], ax 1323 000006BB 8A4401 mov al, [si+1] 1324 000006BE E81905 call bin_to_hex 1325 000006C1 A3[AB18] mov [Vol_Serial2], ax 1326 000006C4 8A4402 mov al, [si+2] 1327 000006C7 E81005 call bin_to_hex 1328 000006CA A3[A818] mov [Vol_Serial1+2], ax 1329 000006CD 8A4403 mov al, [si+3] 1330 000006D0 E80705 call bin_to_hex 1331 000006D3 A3[A618] mov [Vol_Serial1], ax 1332 1333 000006D6 BE[9418] mov si, Msg_Volume_Serial 1334 000006D9 E8E9FB call print_msg 1335 1336 000006DC C3 retn 1337 1338 bcd_to_bin: 1339 000006DD 53 push bx 1340 000006DE D410 db 0D4h,10h ; Undocumented inst. AAM 1341 ; AH = AL / 10h 1342 ; AL = AL MOD 10h 1343 000006E0 88C3 mov bl, al 1344 000006E2 B00A mov al, 10 1345 000006E4 F6E4 mul ah 1346 000006E6 00D8 add al, bl 1347 000006E8 5B pop bx 1348 000006E9 C3 retn 1349 1350 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1351 ; write formatting percentage 1352 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1353 1354 write_formatting_msg: 1355 000006EA A1[601E] mov ax, [dosp_size] 1356 000006ED 8B16[621E] mov dx, [dosp_size+2] 1357 1358 ; DX_AX = Total sectors for percentage 1359 000006F1 B96400 mov cx, 100 1360 000006F4 E8BE04 call div32 1361 000006F7 A3[7220] mov [format_percent], ax 1362 1363 000006FA BE[CC18] mov si, msg_formatting 1364 000006FD E8C5FB call print_msg 1365 1366 ; get cursor position 1367 ; bh = 0 ; video page 1368 00000700 B403 mov ah, 3 ; get cursor pos 1369 00000702 CD10 int 10h 1370 00000704 8916[5C18] mov [Cursor_Pos], dx 1371 1372 00000708 C606[7420]FF mov byte [prev_percent], 255 1373 1374 0000070D C3 retn 1375 1376 write_format_percent: 1377 ; DX_AX = Current sector (which has been written) 1378 1379 0000070E 50 push ax 1380 0000070F 52 push dx 1381 00000710 53 push bx 1382 00000711 51 push cx 1383 00000712 56 push si 1384 1385 00000713 2B461C sub ax, [bp+1Ch] ; [BPB_HiddSec] 1386 00000716 1B561E sbb dx, [bp+1Eh] ; [BPB_HiddSec+2] 1387 wpc_t: 1388 00000719 8B0E[7220] mov cx, [format_percent] 1389 0000071D E89504 call div32 1390 ; AL = percentage value between 1 to 100 1391 wpc_x: 1392 00000720 3A06[7420] cmp al, [prev_percent] 1393 00000724 741B je short wpc_y 1394 00000726 A2[7420] mov [prev_percent], al 1395 00000729 8B16[5C18] mov dx, [Cursor_Pos] 1396 0000072D BB0700 mov bx, 7 1397 00000730 B402 mov ah, 2 1398 00000732 CD10 int 10h ; Set Cursor Position 1399 00000734 31D2 xor dx, dx 1400 00000736 30E4 xor ah, ah 1401 ;mov al, [prev_percent] 1402 00000738 BE[DA18] mov si, format_percent_str + 2 1403 0000073B E88504 call bin_to_decimal 1404 0000073E E884FB call print_msg 1405 wpc_y: 1406 00000741 5E pop si 1407 00000742 59 pop cx 1408 00000743 5B pop bx 1409 00000744 5A pop dx 1410 00000745 58 pop ax 1411 00000746 C3 retn 1412 1413 write_format_percent_x: 1414 ; AL = % number 1415 1416 00000747 50 push ax 1417 00000748 52 push dx 1418 00000749 53 push bx 1419 0000074A 51 push cx 1420 0000074B 56 push si 1421 1422 0000074C EBD2 jmp short wpc_x 1423 1424 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1425 ; format error 1426 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1427 1428 formatting_error: 1429 0000074E 8B26[7620] mov sp, [old_sp] 1430 1431 00000752 88E0 mov al, ah ; error code 1432 00000754 E88304 call bin_to_hex 1433 00000757 A3[F218] mov [error_code], ax 1434 1435 0000075A BE[E418] mov si, CRLF 1436 0000075D E865FB call print_msg 1437 1438 00000760 BE[E718] mov si, Msg_Error 1439 ;call print_msg 1440 00000763 E94BFB jmp Exit 1441 1442 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1443 ; write cluster count 1444 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1445 1446 write_cluster_count: 1447 00000766 BE[B218] mov si, msg_cluster_count 1448 00000769 E859FB call print_msg 1449 0000076C A1[6C20] mov ax, [cluster_count] 1450 0000076F 8B16[6E20] mov dx, [cluster_count+2] 1451 00000773 BE[C818] mov si, cluster_count_str+6 1452 00000776 E84A04 call bin_to_decimal 1453 00000779 E849FB call print_msg 1454 0000077C C3 retn 1455 1456 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1457 ; FAT16 FORMATTING 1458 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1459 1460 ; ((TRDOS 386 criter)) 1461 ; Minimum size of FAT16 FS = [heads]*[sectors] 1462 ; (1 cylinder) or 4096 sectors (for TRDOS 386) 1463 1464 format_FAT16_fs: 1465 ; 04/05/2024 (BugFix) 1466 ; DL = Partition (FS) ID 1467 ; mov ax, 0706h ; db 06h, 07h ; 'push es, pop es' 1468 ; cmp dl, al ; 06h ; Big CHS partition (>= 32MB) 1469 ; je short FAT16_big_chs_format 1470 ; ;mov ax, 070Eh ; db 0Eh, 07h ; 'push cs, pop es' 1471 ; ;cmp dl, al ; 0Eh ; LBA partition 1472 ; ;je short FAT16_lba_format 1473 ;FAT16_chs_format: 1474 ; ; Partition Type: 04h, CHS (<32 MB) partition 1475 ; mov ax, 0004h ; db 04h, 00h ; 'add al, 0' 1476 ;FAT16_big_chs_format: 1477 ;;; 1478 ;FAT16_lba_format: 1479 ; Put TRDOS 386 FAT16 partition magic word 1480 ; at offset 3Eh, in TRDOS386 FAT16 boot sector. 1481 0000077D BD[F60D] mov bp, RD_FAT16_hd_bs 1482 00000780 8D7E03 lea di, [bp+3] 1483 00000783 BE[6C18] mov si, bs_oem_name 1484 00000786 B90400 mov cx, 4 1485 00000789 F3A5 rep movsw 1486 1487 ;mov [bp+3Eh], ax ; [loc_3E] 1488 ; 04/05/2024 (BugFix) 1489 0000078B 80FA06 cmp dl, 6 1490 0000078E 7404 je short FAT16_f_x ; skip ; db 'RDv4 FAT16 06h', 0 1491 ; dl = 04h or 0Eh 1492 00000790 8896CE01 mov [bp+1CEh], dl ; Retro DOS v4 boot sect off 1CEh 1493 ; (see: 'rd4hdbs.lst' for 1CEh) 1494 FAT16_f_x: 1495 00000794 A1[F813] mov ax, [sectors] 1496 00000797 894618 mov [bp+18h], ax ; [BPB_SecPerTrk] 1497 0000079A A1[FA13] mov ax, [heads] 1498 0000079D 89461A mov [bp+1Ah], ax ; [BPB_NumHeads] 1499 000007A0 A1[5C1E] mov ax, [dosp_start] 1500 000007A3 89461C mov [bp+1Ch], ax ; [BPB_HiddSec] 1501 000007A6 A1[5E1E] mov ax, [dosp_start+2] 1502 000007A9 89461E mov [bp+1Eh], ax ; [BPB_HiddSec+2] 1503 000007AC A1[601E] mov ax, [dosp_size] 1504 000007AF 8B16[621E] mov dx, [dosp_size+2] 1505 000007B3 21D2 and dx, dx 1506 000007B5 7505 jnz short FAT16_f_0 1507 000007B7 894613 mov [bp+13h], ax ; [BPB_TotSec16] 1508 ; CX = 0 1509 ;mov [bp+20h], cx ; [BPB_TotSec32] = 0 1510 ;mov [bp+22h], cx ; [BPB_TotSec32+2] = 0 1511 000007BA EB06 jmp short FAT16_f_1 1512 FAT16_f_0: 1513 000007BC 894620 mov [bp+20h], ax ; [BPB_TotSec32] 1514 000007BF 895622 mov [bp+22h], dx ; [BPB_TotSec32+2] 1515 ; CX = 0 1516 ;mov [bp+13h], cx ; [BPB_TotSec16] = 0 1517 FAT16_f_1: 1518 ; Sectors per cluster calculation 1519 ; (According to MS FAT32 FS specification.) 1520 000007C2 B102 mov cl, 2 ; 2 sectors per cluster 1521 000007C4 09D2 or dx, dx 1522 000007C6 7507 jnz short FAT16_f_2 ; >2 sectors (>16MB) 1523 000007C8 3DA87F cmp ax, 32680 1524 000007CB 763C jna short FAT16_f_10 ; 2 sectors, <=16MB 1525 ; > 16MB 1526 000007CD EB38 jmp short FAT16_f_9 ; 4 sectors per cluster 1527 FAT16_f_2: 1528 000007CF 83FA04 cmp dx, 4 ; >= 262144 sectors ; >=128MB 1529 000007D2 7708 ja short FAT16_f_3 ; >4 sectors per cluster 1530 000007D4 7231 jb short FAT16_f_9 ; 4 sectors per cluster 1531 000007D6 09C0 or ax, ax ; dx_ax = (4*65536)+0 1532 000007D8 742D jz short FAT16_f_9 ; 4 sectors per cluster 1533 000007DA EB29 jmp short FAT16_f_8 ; 8 sectors per cluster 1534 FAT16_f_3: 1535 000007DC 83FA08 cmp dx, 8 ; >= 524288 sectors ; >=256MB 1536 000007DF 7708 ja short FAT16_f_4 ; >8 sectors per cluster 1537 000007E1 7222 jb short FAT16_f_8 ; 8 sectors per cluster 1538 000007E3 21C0 and ax, ax ; dx_ax = (8*65536)+0 1539 000007E5 741E jz short FAT16_f_8 ; 8 sectors per cluster 1540 000007E7 EB1A jmp short FAT16_f_7 ; 16 sectors per cluster 1541 FAT16_f_4: 1542 000007E9 83FA10 cmp dx, 16 ; >= 1048576 sectors ; >=512MB 1543 000007EC 7708 ja short FAT16_f_5 ; >16 sectors per cluster 1544 000007EE 7213 jb short FAT16_f_7 ; 16 sectors per cluster 1545 000007F0 21C0 and ax, ax ; dx_ax = (16*65536)+0 1546 000007F2 740F jz short FAT16_f_7 ; 16 sectors per cluster 1547 000007F4 EB0B jmp short FAT16_f_6 ; 32 sectors per cluster 1548 FAT16_f_5: 1549 000007F6 83FA20 cmp dx, 32 ; >= 2097152 sectors ; >=1GB 1550 000007F9 7206 jb short FAT16_f_6 ; 32 sectors per cluster 1551 000007FB 09C0 or ax, ax ; dx_ax = (32*65536)+0 1552 000007FD 7402 jz short FAT16_f_6 ; 32 sectors per cluster 1553 ; >1GB (<=2GB) 1554 ; 64 sectors per cluster 1555 000007FF D0E1 shl cl, 1 1556 FAT16_f_6: 1557 ; 32 sectors per cluster (for <= 2GB volumes) 1558 00000801 D0E1 shl cl, 1 1559 FAT16_f_7: 1560 ; 16 sectors per cluster (for <= 1GB volumes) 1561 00000803 D0E1 shl cl, 1 1562 FAT16_f_8: 1563 ; 8 sectors per cluster (for <= 512MB volumes) 1564 00000805 D0E1 shl cl, 1 1565 FAT16_f_9: 1566 ; 4 sectors per cluster (for <= 256MB volumes) 1567 00000807 D0E1 shl cl, 1 1568 FAT16_f_10: 1569 ; 2 sectors per cluster (for <= 128MB volumes) 1570 00000809 884E0D mov [bp+0Dh], cl ; [BPB_SecPerClus] 1571 ;mov byte [bp+10h], 2 ; [BPB_NumFATs] 1572 ;mov word [bp+0Eh], 1 ; [BPB_RsvdSecCnt] 1573 ;mov word [bp+11h], 512 ; [BPB_RootEntCnt] 1574 1575 ; Calculating FAT size in sectors 1576 ; (According to MS FAT32 FS Specification, 2000) 1577 1578 ; DX_AX = partition (volume) size in sectors 1579 0000080C 8B5E11 mov bx, [bp+11h] ; [BPB_RootEntCnt] = 512 1580 0000080F 83C30F add bx, 15 ; bx = 527 1581 00000812 C1EB04 shr bx, 4 ; /16 = 527/16 = 32 1582 ; ((32*BX)+511)/512 1583 00000815 891E[7020] mov [root_dir_secs], bx 1584 00000819 035E0E add bx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 1585 0000081C 29D8 sub ax, bx 1586 0000081E 83DA00 sbb dx, 0 1587 ; TmpVal1 = DiskSize - (BPB_ResvdSecCnt + 1588 ; RootDirsectors) 1589 ;mov bx, cx ; ch = 0 1590 ;shl bx, 8 ; * 256 1591 00000821 88CF mov bh, cl 1592 00000823 30DB xor bl, bl 1593 00000825 B102 mov cl, 2 ; [BPB_NumFATs] 1594 00000827 01CB add bx, cx 1595 ; TmpVal2 = (256*BPB_SecPerClus)+BPB_NumFATs 1596 00000829 89D9 mov cx, bx 1597 0000082B 4B dec bx ; TmpVal2-1 1598 0000082C 01D8 add ax, bx 1599 0000082E 83D200 adc dx, 0 1600 00000831 E88103 call div32 1601 ; FATSz = (TmpVal1+(TmpVal2-1))/TmpVal2 1602 ; AX = FAT size in sectors 1603 ; DX = 0 1604 00000834 894616 mov [bp+16h], ax ; [BPB_FATSz16] 1605 ; * 2 1606 00000837 D1E0 shl ax, 1 1607 ; AX = [BPB_NumFATs] * [BPB_FATSz16] 1608 00000839 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 1609 0000083C 01C1 add cx, ax 1610 1611 ; 14/07/2024 (bugfix) 1612 0000083E 894E42 mov [bp+42h], cx ; bsRootDirStart 1613 00000841 8B1E[7020] mov bx, [root_dir_secs] 1614 00000845 895E44 mov [bp+44h], bx ; bsRootDirSects 1615 ;mov word [bp+46h], 16 ; bsDirEntsPerSec 1616 1617 ; CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 1618 ;add cx, [root_dir_secs] ; + RootDirsectors 1619 ; 14/07/2024 1620 00000848 01D9 add cx, bx 1621 0000084A 29DB sub bx, bx ; BX = 0 1622 ; BX_CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 1623 ; + RootDirSectors 1624 0000084C 8B4613 mov ax, [bp+13h] ; [BPB_TotSec16] 1625 ;sub dx, dx 1626 ; DX = 0 1627 0000084F 21C0 and ax, ax 1628 00000851 7506 jnz short FAT16_f_11 1629 00000853 8B4620 mov ax, [bp+20h] ; [BPB_TotSec32] 1630 00000856 8B5622 mov dx, [bp+22h] ; [BPB_TotSec32+2] 1631 FAT16_f_11: 1632 00000859 29C8 sub ax, cx 1633 0000085B 19DA sbb dx, bx 1634 0000085D 890E[6420] mov [data_start], cx 1635 00000861 891E[6620] mov [data_start+2], bx 1636 1637 ; 14/07/2024 (bugfix) 1638 00000865 894E40 mov [bp+40h], cx ; bsDataStart 1639 1640 ; DX_AX = Data sectors 1641 00000868 A3[6820] mov [data_sectors], ax 1642 0000086B 8916[6A20] mov [data_sectors+2], dx 1643 0000086F 8A4E0D mov cl, [bp+0Dh] ; [BPB_SecPerClus] 1644 00000872 30ED xor ch, ch 1645 00000874 E83E03 call div32 ; DX_AX/CX 1646 ; AX = Count of clusters (rounded down) 1647 ; DX = 0 1648 00000877 A3[6C20] mov [cluster_count], ax 1649 0000087A 8916[6E20] mov [cluster_count+2], dx 1650 1651 0000087E 8D7E2B lea di, [bp+43] ; [BS_VolLab] 1652 00000881 E880FD call write_volume_name 1653 00000884 8D7627 lea si, [bp+39] ; [BS_VolID] 1654 00000887 E8D9FD call write_volume_serial 1655 0000088A E8D9FE call write_cluster_count 1656 1657 0000088D E85AFE call write_formatting_msg 1658 00000890 B000 mov al, 0 1659 00000892 E8B2FE call write_format_percent_x 1660 1661 00000895 8B461C mov ax, [bp+1Ch] ; [BPB_HiddSec] 1662 00000898 8B561E mov dx, [bp+1Eh] ; [BPB_HiddSec+2] 1663 1664 0000089B 0106[6420] add [data_start], ax 1665 0000089F 1116[6620] adc [data_start+2], dx 1666 1667 ; DX_AX = FAT16 Boot Sector address 1668 000008A3 BB[F60D] mov bx, RD_FAT16_hd_bs 1669 ; ES:BX = Boot Sector Buffer 1670 000008A6 E8DAFA call write_hd_sector 1671 000008A9 0F82A1FE jc formatting_error 1672 000008AD E85EFE call write_format_percent 1673 000008B0 83C001 add ax, 1 1674 000008B3 83D200 adc dx, 0 1675 ; write remain part of reserved sectors 1676 000008B6 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] 1677 ;sub cx, 1 1678 ;jna short FAT16_f_13 1679 000008B9 49 dec cx 1680 000008BA 7418 jz short FAT16_f_13 1681 FAT16_f_12: 1682 000008BC 51 push cx 1683 000008BD BB[641E] mov bx, HDFORMAT_EMPTY_BUFF 1684 000008C0 E8C0FA call write_hd_sector 1685 000008C3 0F8287FE jc formatting_error 1686 000008C7 E844FE call write_format_percent 1687 000008CA 83C001 add ax, 1 1688 000008CD 83D200 adc dx, 0 1689 000008D0 59 pop cx 1690 000008D1 49 dec cx ; dec cl 1691 000008D2 75E8 jnz short FAT16_f_12 1692 FAT16_f_13: 1693 ; write FAT sectors 1694 000008D4 8B0E[6420] mov cx, [data_start] ; lba/abs addr 1695 000008D8 8B1E[6620] mov bx, [data_start+2] ; lba/abs addr 1696 1697 000008DC 2B0E[7020] sub cx, [root_dir_secs] 1698 000008E0 83DB00 sbb bx, 0 1699 1700 000008E3 53 push bx 1701 000008E4 51 push cx 1702 000008E5 BB[641E] mov bx, HDFORMAT_FATBUFFER 1703 ; ES:BX = FAT Sector Buffer 1704 000008E8 8A4E15 mov cl, [bp+15h] ; [BPB_Media] 1705 000008EB B5FF mov ch, 0FFh 1706 000008ED 890F mov [bx], cx ; 0FFF8h 1707 000008EF 88E9 mov cl, ch ; cx = 0FFFFh 1708 000008F1 894F02 mov [bx+2], cx 1709 ;inc cx 1710 000008F4 E88CFA call write_hd_sector 1711 000008F7 0F8253FE jc formatting_error 1712 000008FB E810FE call write_format_percent 1713 ;mov bx, HDFORMAT_FATBUFFER 1714 000008FE B90000 mov cx, 0 1715 00000901 890F mov [bx], cx 1716 00000903 894F02 mov [bx+2], cx 1717 00000906 EB0F jmp short FAT16_f_15 1718 FAT16_f_14: 1719 00000908 53 push bx 1720 00000909 51 push cx 1721 0000090A BB[641E] mov bx, HDFORMAT_FATBUFFER 1722 0000090D E873FA call write_hd_sector 1723 00000910 0F823AFE jc formatting_error 1724 00000914 E8F7FD call write_format_percent 1725 FAT16_f_15: 1726 00000917 59 pop cx 1727 00000918 5B pop bx 1728 00000919 83C001 add ax, 1 1729 0000091C 83D200 adc dx, 0 1730 0000091F 39DA cmp dx, bx 1731 00000921 72E5 jb short FAT16_f_14 1732 00000923 39C8 cmp ax, cx 1733 00000925 72E1 jb short FAT16_f_14 1734 1735 ; write root directory sectors 1736 ; as empty sectors 1737 00000927 8B0E[7020] mov cx, [root_dir_secs] 1738 FAT16_f_16: 1739 0000092B 51 push cx 1740 0000092C BB[641E] mov bx, HDFORMAT_EMPTY_BUFF 1741 0000092F E851FA call write_hd_sector 1742 00000932 0F8218FE jc formatting_error 1743 00000936 E8D5FD call write_format_percent 1744 00000939 83C001 add ax, 1 1745 0000093C 83D200 adc dx, 0 1746 0000093F 59 pop cx 1747 00000940 49 dec cx 1748 00000941 75E8 jnz short FAT16_f_16 1749 1750 ; write DATA sectors 1751 ; (after root directory sectors) 1752 00000943 8B0E[6820] mov cx, [data_sectors] 1753 00000947 8B1E[6A20] mov bx, [data_sectors+2] 1754 0000094B 43 inc bx ; 0 -> 1, 1-> 2 1755 FAT16_f_17: 1756 0000094C 53 push bx 1757 0000094D 51 push cx 1758 0000094E BB[551A] mov bx, HDFORMAT_SECBUFFER 1759 00000951 E82FFA call write_hd_sector 1760 00000954 0F82F6FD jc formatting_error 1761 00000958 E8B3FD call write_format_percent 1762 0000095B 59 pop cx 1763 0000095C 5B pop bx 1764 0000095D 83C001 add ax, 1 1765 00000960 83D200 adc dx, 0 1766 00000963 49 dec cx 1767 00000964 75E6 jnz short FAT16_f_17 1768 00000966 4B dec bx 1769 00000967 75E3 jnz short FAT16_f_17 1770 1771 ; If there are, format remain sectors which are 1772 ; at beyond of data clusters, with zero bytes. 1773 1774 00000969 8B4E1C mov cx, [bp+1Ch] ; [BPB_HiddSec] 1775 0000096C 8B5E1E mov bx, [bp+1Eh] ; [BPB_HiddSec+2] 1776 1777 0000096F 837E1300 cmp word [bp+13h], 0 ; [BPB_TotSec16] 1778 00000973 0F8453FC jz FAT16_f_18 1779 00000977 034E13 add cx, [bp+13h] ; [BPB_TotSec16] 1780 0000097A 83D300 adc bx, 0 1781 0000097D E950FC jmp FAT16_f_19 1782 1783 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1784 ; FAT12 FORMATTING 1785 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1786 1787 ; ((TRDOS 386 criter)) 1788 ; Minimum size of FAT12 FS = [heads]*[sectors] 1789 ; (1 cylinder) 1790 1791 format_FAT12_fs: 1792 00000980 BD[F60B] mov bp, RD_FAT12_hd_bs 1793 00000983 8D7E03 lea di, [bp+3] 1794 00000986 BE[6C18] mov si, bs_oem_name 1795 00000989 B90400 mov cx, 4 1796 0000098C F3A5 rep movsw 1797 0000098E A1[F813] mov ax, [sectors] 1798 00000991 894618 mov [bp+18h], ax ; [BPB_SecPerTrk] 1799 00000994 A1[FA13] mov ax, [heads] 1800 00000997 89461A mov [bp+1Ah], ax ; [BPB_NumHeads] 1801 0000099A A1[5C1E] mov ax, [dosp_start] 1802 0000099D 89461C mov [bp+1Ch], ax ; [BPB_HiddSec] 1803 000009A0 A1[5E1E] mov ax, [dosp_start+2] 1804 000009A3 89461E mov [bp+1Eh], ax ; [BPB_HiddSec+2] 1805 000009A6 A1[601E] mov ax, [dosp_size] 1806 000009A9 894613 mov [bp+13h], ax ; [BPB_TotSec16] 1807 1808 000009AC 31F6 xor si, si ; reset (FAT size fix) flag 1809 000009AE 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 1810 000009B1 8B5611 mov dx, [bp+11h] ; [BPB_RootEntCnt] = 512 1811 000009B4 83C20F add dx, 15 ; (16-1) (512-1) 1812 000009B7 C1EA04 shr dx, 4 ; /16 (*32/512) 1813 ; AX = Root dir sectors 1814 ; CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 1815 000009BA 01D1 add cx, dx ; + RootDirsectors ; + 32 1816 000009BC 890E[7020] mov [root_dir_secs], cx ; = 33 1817 1818 ;sub ax, 33 ; 1 reserved sector, 32 root dir sectors 1819 ; .. now AX has number of data sectors 1820 ; + 2* (FAT sectors) 1821 000009C0 29C8 sub ax, cx 1822 FAT12_f_10: 1823 ; Sectors per cluster calculation 1824 ; (According to MS FAT32 FS specification.) 1825 ;mov cx, 1 ; 1 sector per cluster 1826 000009C2 B101 mov cl, 1 ; CH = 0 1827 ; 28/10/2023 ; (BugFix) 1828 000009C4 50 push ax 1829 FAT12_f_0: 1830 000009C5 3DF50F cmp ax, 4085 ; Max. cluster count for FAT12 1831 000009C8 7206 jb short FAT12_f_1 1832 000009CA D0E1 shl cl, 1 ; *2 1833 000009CC D1E8 shr ax, 1 ; /2 1834 000009CE EBF5 jmp short FAT12_f_0 1835 FAT12_f_1: 1836 ; 28/10/2023 1837 000009D0 58 pop ax 1838 000009D1 884E0D mov [bp+0Dh], cl ; [BPB_SecPerClus] 1839 ;mov byte [bp+10h], 2 ; [BPB_NumFATs] 1840 ;mov word [bp+0Eh], 1 ; [BPB_RsvdSecCnt] 1841 ;mov word [bp+11h], 512 ; [BPB_RootEntCnt] 1842 1843 ; Calculating FAT size in sectors 1844 ; AX = partition (volume) size in sectors 1845 ; CX = sectors per clusters 1846 000009D4 31D2 xor dx, dx 1847 000009D6 F7F1 div cx 1848 ; AX = cluster count (only for FAT size calc) 1849 ; DX = 0 1850 000009D8 83C002 add ax, 2 ; cluster 2 to ... 1851 000009DB 89C2 mov dx, ax 1852 000009DD D1E2 shl dx, 1 1853 000009DF 01D0 add ax, dx ; *3 1854 000009E1 D1E8 shr ax, 1 ; /2 1855 000009E3 83D000 adc ax, 0 ; +0.5 -> +1 1856 1857 ; AX = FAT bytes for 12 bit cluster numbers 1858 1859 000009E6 B90002 mov cx, 512 ; [BPB_BytesPerSec] 1860 000009E9 01C8 add ax, cx 1861 000009EB 48 dec ax ; [BPB_BytesPerSec] - 1 1862 000009EC 29D2 sub dx, dx 1863 000009EE F7F1 div cx 1864 000009F0 894616 mov [bp+16h], ax ; [BPB_FATSz16] 1865 ; * 2 1866 000009F3 D1E0 shl ax, 1 1867 ; AX = [BPB_NumFATs] * [BPB_FATSz16] 1868 1869 ;mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 1870 ;add cx, ax 1871 ;mov ax, [bp+11h] ; [BPB_RootEntCnt] = 512 1872 ;add ax, 15 ; (16-1) (512-1) 1873 ;shr ax, 4 ; /16 (*32/512) 1874 ;; AX = Root dir sectors 1875 ;; CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 1876 ;add cx, ax ; + RootDirsectors 1877 ;mov [root_dir_secs], ax 1878 1879 ;mov cx, 33 1880 000009F5 8B0E[7020] mov cx, [root_dir_secs] 1881 1882 ; 14/07/2024 (bugfix) 1883 ; ax = 2 * FAT size (in sectors) 1884 000009F9 03460E add ax, [bp+0Eh] ; total FAT sectors + reserved sectors 1885 000009FC 894642 mov [bp+42h], ax ; bsRootDirStart 1886 000009FF 894E44 mov [bp+44h], cx ; bsRootDirSects 1887 ;mov word [bp+46h], 16 ; bsDirEntsPerSec 1888 1889 ; 14/07/2024 1890 ;add cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 1891 ; cx = root directory sectors + reserved sectors 1892 00000A02 01C1 add cx, ax 1893 ; cx = root dir sects + rsvd sects + total FAT sects 1894 1895 ; CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 1896 ; + RootDirSectors 1897 1898 00000A04 8B4613 mov ax, [bp+13h] ; [BPB_TotSec16] 1899 00000A07 29C8 sub ax, cx 1900 ; AX = data sectors 1901 ; cH = 0 1902 1903 ; fix FAT size (better method) 1904 00000A09 09F6 or si, si 1905 00000A0B 7504 jnz short FAT12_f_9 1906 1907 00000A0D 89C6 mov si, ax ; ax = data sectors 1908 00000A0F EBB1 jmp short FAT12_f_10 1909 1910 FAT12_f_9: 1911 00000A11 31D2 xor dx, dx 1912 00000A13 890E[6420] mov [data_start], cx 1913 00000A17 8916[6620] mov [data_start+2], dx ; 0 1914 1915 ; 14/07/2024 (bugfix) 1916 00000A1B 894E40 mov [bp+40h], cx ; bsDataStart 1917 1918 ; DX_AX = Data sectors 1919 00000A1E A3[6820] mov [data_sectors], ax 1920 00000A21 8916[6A20] mov [data_sectors+2], dx ; 0 1921 00000A25 8A4E0D mov cl, [bp+0Dh] ; [BPB_SecPerClus] 1922 00000A28 28ED sub ch, ch 1923 00000A2A F7F1 div cx 1924 ; AX = Count of clusters (rounded down) 1925 00000A2C 29D2 sub dx, dx ; 0 1926 00000A2E A3[6C20] mov [cluster_count], ax 1927 00000A31 8916[6E20] mov [cluster_count+2], dx ; 0 1928 1929 00000A35 8D7E2B lea di, [bp+43] ; [BS_VolLab] 1930 00000A38 E8C9FB call write_volume_name 1931 00000A3B 8D7627 lea si, [bp+39] ; [BS_VolID] 1932 00000A3E E822FC call write_volume_serial 1933 00000A41 E822FD call write_cluster_count 1934 1935 00000A44 E8A3FC call write_formatting_msg 1936 00000A47 B000 mov al, 0 1937 00000A49 E8FBFC call write_format_percent_x 1938 1939 00000A4C 8B461C mov ax, [bp+1Ch] ; [BPB_HiddSec] 1940 00000A4F 8B561E mov dx, [bp+1Eh] ; [BPB_HiddSec+2] 1941 1942 00000A52 0106[6420] add [data_start], ax 1943 00000A56 1116[6620] adc [data_start+2], dx 1944 1945 ; DX_AX = FAT12 Boot Sector address 1946 00000A5A BB[F60B] mov bx, RD_FAT12_hd_bs 1947 ; ES:BX = Boot Sector Buffer 1948 00000A5D E823F9 call write_hd_sector 1949 00000A60 0F82EAFC jc formatting_error 1950 00000A64 E8A7FC call write_format_percent 1951 00000A67 83C001 add ax, 1 1952 00000A6A 83D200 adc dx, 0 1953 ; write remain part of reserved sectors 1954 00000A6D 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] 1955 ;sub cx, 1 1956 ;jna short FAT12_f_3 1957 00000A70 49 dec cx 1958 00000A71 7418 jz short FAT12_f_3 1959 FAT12_f_2: 1960 00000A73 51 push cx 1961 00000A74 BB[641E] mov bx, HDFORMAT_EMPTY_BUFF 1962 00000A77 E809F9 call write_hd_sector 1963 00000A7A 0F82D0FC jc formatting_error 1964 00000A7E E88DFC call write_format_percent 1965 00000A81 83C001 add ax, 1 1966 00000A84 83D200 adc dx, 0 1967 00000A87 59 pop cx 1968 00000A88 49 dec cx ; dec cl 1969 00000A89 75E8 jnz short FAT12_f_2 1970 FAT12_f_3: 1971 ; write FAT sectors 1972 00000A8B 8B0E[6420] mov cx, [data_start] ; lba/abs addr 1973 00000A8F 8B1E[6620] mov bx, [data_start+2] ; lba/abs addr 1974 1975 00000A93 2B0E[7020] sub cx, [root_dir_secs] 1976 00000A97 83DB00 sbb bx, 0 1977 1978 00000A9A 53 push bx 1979 00000A9B 51 push cx 1980 00000A9C BB[641E] mov bx, HDFORMAT_FATBUFFER 1981 ; ES:BX = FAT Sector Buffer 1982 00000A9F 8A4E15 mov cl, [bp+15h] ; [BPB_Media] 1983 00000AA2 B5FF mov ch, 0FFh 1984 00000AA4 890F mov [bx], cx ; 0FFF8h 1985 00000AA6 886F02 mov [bx+2], ch ; 0FFFFF8h 1986 ;xor cx, cx 1987 00000AA9 E8D7F8 call write_hd_sector 1988 00000AAC 0F829EFC jc formatting_error 1989 00000AB0 E85BFC call write_format_percent 1990 ;mov bx, HDFORMAT_FATBUFFER 1991 00000AB3 B90000 mov cx, 0 1992 00000AB6 890F mov [bx], cx 1993 00000AB8 884F02 mov [bx+2], cl 1994 00000ABB EB0F jmp short FAT12_f_5 1995 FAT12_f_4: 1996 00000ABD 53 push bx 1997 00000ABE 51 push cx 1998 00000ABF BB[641E] mov bx, HDFORMAT_FATBUFFER 1999 00000AC2 E8BEF8 call write_hd_sector 2000 00000AC5 0F8285FC jc formatting_error 2001 00000AC9 E842FC call write_format_percent 2002 FAT12_f_5: 2003 00000ACC 59 pop cx 2004 00000ACD 5B pop bx 2005 00000ACE 83C001 add ax, 1 2006 00000AD1 83D200 adc dx, 0 2007 00000AD4 39DA cmp dx, bx 2008 00000AD6 72E5 jb short FAT12_f_4 2009 00000AD8 39C8 cmp ax, cx 2010 00000ADA 72E1 jb short FAT12_f_4 2011 2012 ; write root directory sectors 2013 ; as empty sectors 2014 00000ADC 8B0E[7020] mov cx, [root_dir_secs] 2015 FAT12_f_6: 2016 00000AE0 51 push cx 2017 00000AE1 BB[641E] mov bx, HDFORMAT_EMPTY_BUFF 2018 00000AE4 E89CF8 call write_hd_sector 2019 00000AE7 0F8263FC jc formatting_error 2020 00000AEB E820FC call write_format_percent 2021 00000AEE 83C001 add ax, 1 2022 00000AF1 83D200 adc dx, 0 2023 00000AF4 59 pop cx 2024 00000AF5 49 dec cx ; dec cl 2025 00000AF6 75E8 jnz short FAT12_f_6 2026 2027 ; write DATA sectors 2028 ; (after root directory sectors) 2029 00000AF8 8B0E[6820] mov cx, [data_sectors] 2030 ;mov bx, [data_sectors+2] 2031 ;inc bx 2032 FAT12_f_7: 2033 ;push bx 2034 00000AFC 51 push cx 2035 00000AFD BB[551A] mov bx, HDFORMAT_SECBUFFER 2036 00000B00 E880F8 call write_hd_sector 2037 00000B03 0F8247FC jc formatting_error 2038 00000B07 E804FC call write_format_percent 2039 00000B0A 59 pop cx 2040 ;pop bx 2041 00000B0B 83C001 add ax, 1 2042 00000B0E 83D200 adc dx, 0 2043 00000B11 49 dec cx 2044 00000B12 75E8 jnz short FAT12_f_7 2045 ;dec bx 2046 ;jnz short FAT12_f_7 2047 2048 ; If there are, format remain sectors which are 2049 ; at beyond of data clusters, with zero bytes. 2050 2051 00000B14 8B4E1C mov cx, [bp+1Ch] ; [BPB_HiddSec] 2052 00000B17 8B5E1E mov bx, [bp+1Eh] ; [BPB_HiddSec+2] 2053 2054 00000B1A 034E13 add cx, [bp+13h] ; [BPB_TotSec16] 2055 00000B1D 83D300 adc bx, 0 2056 00000B20 E9ADFA jmp FAT12_f_8 2057 2058 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2059 ; Read & Write characters 2060 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2061 2062 rw_char: 2063 ; OUTPUT -> DS:SI = Entered String (ASCIIZ) 2064 00000B23 BE[7820] mov si, StrVolumeName 2065 00000B26 BB0700 mov bx, 7 2066 00000B29 B403 mov ah, 3 2067 00000B2B CD10 int 10h 2068 00000B2D 8916[5C18] mov [Cursor_Pos], dx 2069 read_next_char: 2070 00000B31 30E4 xor ah, ah 2071 00000B33 CD16 int 16h 2072 00000B35 20C0 and al, al 2073 00000B37 7439 jz short loc_arrow 2074 00000B39 3CE0 cmp al, 0E0h 2075 00000B3B 7435 je short loc_arrow 2076 00000B3D 3C08 cmp al, 8 2077 00000B3F 753D jne short char_return 2078 loc_back: 2079 00000B41 B403 mov ah, 3 2080 00000B43 CD10 int 10h 2081 00000B45 3A16[5C18] cmp dl, byte [Cursor_Pos] 2082 00000B49 761F jna short loc_beep 2083 prev_column: 2084 00000B4B FECA dec dl 2085 set_cursor_pos: 2086 00000B4D B402 mov ah, 2 2087 00000B4F CD10 int 10h 2088 00000B51 88D3 mov bl, dl 2089 00000B53 2A1E[5C18] sub bl, byte [Cursor_Pos] 2090 00000B57 B90100 mov cx, 1 2091 00000B5A B409 mov ah, 9 2092 00000B5C B020 mov al, 20h 2093 00000B5E 8800 mov [si+bx], al 2094 loc_write_it: 2095 00000B60 B307 mov bl, 7 2096 00000B62 CD10 int 10h 2097 00000B64 8B16[5C18] mov dx, [Cursor_Pos] 2098 00000B68 EBC7 jmp short read_next_char 2099 loc_beep: 2100 00000B6A B40E mov ah, 0Eh 2101 00000B6C B007 mov al, 7 2102 00000B6E CD10 int 10h 2103 00000B70 EBBF jmp short read_next_char 2104 loc_arrow: 2105 00000B72 80FC4B cmp ah, 4Bh 2106 00000B75 74CA je short loc_back 2107 00000B77 80FC53 cmp ah, 53h 2108 00000B7A 74C5 je short loc_back 2109 00000B7C EBB3 jmp short read_next_char 2110 char_return: 2111 00000B7E B403 mov ah, 3 2112 00000B80 CD10 int 10h 2113 check_char_type: 2114 00000B82 3C20 cmp al, 20h 2115 00000B84 7229 jb short loc_escape 2116 00000B86 88D4 mov ah, dl 2117 00000B88 2A26[5C18] sub ah, byte [Cursor_Pos] 2118 ;cmp ah, 10 2119 ;ja short loc_beep 2120 00000B8C 3A26[6B18] cmp ah, [vname_length] 2121 00000B90 73D8 jnb short loc_beep 2122 00000B92 3C7A cmp al, 'z' 2123 00000B94 779B ja short read_next_char 2124 00000B96 3C61 cmp al, 'a' 2125 00000B98 7202 jb short pass_capitalize 2126 00000B9A 24DF and al, 0DFh 2127 pass_capitalize: 2128 00000B9C 88E3 mov bl, ah 2129 00000B9E 30E4 xor ah, ah 2130 00000BA0 8900 mov [si+bx], ax 2131 00000BA2 B307 mov bl, 7 2132 00000BA4 B40E mov ah, 0Eh 2133 00000BA6 CD10 int 10h 2134 00000BA8 EB87 jmp short read_next_char 2135 pass_escape: 2136 00000BAA 3C0D cmp al, 0Dh ; 13 ; ENTER 2137 00000BAC 7583 jne short read_next_char 2138 ;mov ah, 0Eh 2139 ;int 10h 2140 ;mov al, 0Ah 2141 ;int 10h 2142 00000BAE C3 retn 2143 loc_escape: 2144 00000BAF 3C1B cmp al, 1Bh ; 27 ; ESC 2145 00000BB1 75F7 jne short pass_escape 2146 00000BB3 F9 stc 2147 00000BB4 C3 retn 2148 2149 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2150 ; 32 bit division 2151 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2152 2153 div32: 2154 ; DX_AX/CX 2155 ; Result: DX_AX, BX (remainder) 2156 00000BB5 89C3 mov bx, ax 2157 ;or dx, ax ; * DX_AX = 0 ? 2158 ;jz short div32_retn ; yes, do not divide! 2159 00000BB7 89D0 mov ax, dx 2160 00000BB9 31D2 xor dx, dx 2161 00000BBB F7F1 div cx ; at first, divide DX 2162 ; remainder is in DX 2163 00000BBD 93 xchg ax, bx ; now quotient is in BX 2164 ; and initial AX value is in AX 2165 00000BBE F7F1 div cx ; now, DX_AX has been divided and 2166 ; AX has quotient 2167 ; DX has remainder 2168 00000BC0 87D3 xchg dx, bx ; finally, BX has remainder 2169 ;div32_retn: 2170 00000BC2 C3 retn 2171 2172 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2173 ; Convert byte to decimal number 2174 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2175 2176 bin_to_decimal: 2177 ; INPUT: DS:SI = Target location 2178 ; DX_AX = Binary Number (Integer) 2179 ; OUTPUT: Decimal char at DS:SI 2180 ; SI decremented after every division 2181 ; till AX<10. 2182 ; CX, DX, BX will be changed. 2183 ; 2184 00000BC3 B90A00 mov cx, 10 2185 btd_0: 2186 ; DX_AX = Dividend 2187 ; CX = Divisor 2188 00000BC6 E8ECFF call div32 2189 ; DX_AX = Quotient 2190 ; BX = remainder 2191 00000BC9 80C330 add bl, '0' 2192 00000BCC 881C mov [si], bl 2193 00000BCE 21D2 and dx, dx 2194 00000BD0 7403 jz short btd_2 2195 btd_1: 2196 00000BD2 4E dec si 2197 00000BD3 EBF1 jmp short btd_0 2198 btd_2: 2199 00000BD5 09C0 or ax, ax 2200 00000BD7 75F9 jnz short btd_1 2201 2202 00000BD9 C3 retn 2203 2204 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2205 ; Convert byte to hexadecimal number 2206 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2207 2208 byte_to_hex: 2209 bin_to_hex: 2210 ; INPUT -> 2211 ; AL = byte (binary number) 2212 ; OUTPUT -> 2213 ; AX = hexadecimal string 2214 ; 2215 00000BDA 53 push bx 2216 00000BDB 31DB xor bx, bx 2217 00000BDD 88C3 mov bl, al 2218 00000BDF C0EB04 shr bl, 4 2219 00000BE2 8A9F[4C18] mov bl, [bx+hexchrs] 2220 00000BE6 86D8 xchg bl, al 2221 00000BE8 80E30F and bl, 0Fh 2222 00000BEB 8AA7[4C18] mov ah, [bx+hexchrs] 2223 00000BEF 5B pop bx 2224 00000BF0 C3 retn 2225 2226 ; ---------------------------------------------------------------------------- 2227 ; initialized data 2228 ; ---------------------------------------------------------------------------- 2229 2230 00000BF1 90 align 2 2231 2232 trdos386fc: 2233 00000BF2 [7D07] dw format_FAT16_fs 2234 00000BF4 0000 dw 0 2235 2236 ;volume_id: 2237 ; dd 0 2238 2239 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2240 ; FAT boot sector code 2241 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2242 2243 RD_FAT12_hd_bs: 2244 00000BF6 incbin 'RD2HDBS.BIN' ; 25/10/2023 2245 RD_FAT16_hd_bs: 2246 00000DF6 incbin 'RD4HDBS.BIN' ; 24/10/2023 2247 RD_FAT32_hd_bs: 2248 00000FF6 incbin 'RD5HDBS3.BIN' ; 29/01/2026 2249 2250 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2251 ; messages 2252 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2253 2254 000013F6 00 lba: db 0 2255 2256 000013F7 00 drv: db 0 2257 2258 000013F8 00 sectors: db 0 2259 000013F9 00 db 0 2260 000013FA 00 heads: db 0 2261 000013FB 00 db 0 2262 000013FC 0000 cylinders: dw 0 2263 2264 RD_Welcome: 2265 000013FE 0D0A db 0Dh, 0Ah 2266 00001400 526574726F20444F53- db 'Retro DOS v4 Hard Disk Partition Formatting Utility ' 2266 00001409 207634204861726420- 2266 00001412 4469736B2050617274- 2266 0000141B 6974696F6E20466F72- 2266 00001424 6D617474696E672055- 2266 0000142D 74696C69747920 2267 00001434 0D0A db 0Dh, 0Ah 2268 00001436 76312E312E32363031- db 'v1.1.260129 (c) Erdogan TAN 2020-2026 ' 2268 0000143F 323920286329204572- 2268 00001448 646F67616E2054414E- 2268 00001451 20323032302D323032- 2268 0000145A 3620 2269 0000145C 0D0A db 0Dh,0Ah 2270 0000145E 0D0A db 0Dh,0Ah 2271 00001460 55736167653A206864- db 'Usage: hdformat ' 2271 00001469 666F726D6174203C64- 2271 00001472 726976653E20 2272 00001478 0D0A0D0A db 0Dh,0Ah, 0Dh, 0Ah 2273 0000147C 4472697665206E616D- db 'Drive names: ' 2273 00001485 65733A20 2274 00001489 0D0A db 0Dh, 0Ah 2275 0000148B 20686430206F722043- db ' hd0 or C: ..for primary dos partition on 1st disk ' 2275 00001494 3A202E2E666F722070- 2275 0000149D 72696D61727920646F- 2275 000014A6 732070617274697469- 2275 000014AF 6F6E206F6E20317374- 2275 000014B8 206469736B20 2276 000014BE 0D0A db 0Dh, 0Ah 2277 000014C0 20686431206F722044- db ' hd1 or D: ..for primary dos partition on 2nd disk ' 2277 000014C9 3A202E2E666F722070- 2277 000014D2 72696D61727920646F- 2277 000014DB 732070617274697469- 2277 000014E4 6F6E206F6E20326E64- 2277 000014ED 206469736B20 2278 000014F3 0D0A db 0Dh, 0Ah 2279 000014F5 206864322020202020- db ' hd2 ..for primary dos partition on 3rd disk ' 2279 000014FE 20202E2E666F722070- 2279 00001507 72696D61727920646F- 2279 00001510 732070617274697469- 2279 00001519 6F6E206F6E20337264- 2279 00001522 206469736B20 2280 00001528 0D0A db 0Dh, 0Ah 2281 0000152A 206864332020202020- db ' hd3 ..for primary dos partition on 4th disk ' 2281 00001533 20202E2E666F722070- 2281 0000153C 72696D61727920646F- 2281 00001545 732070617274697469- 2281 0000154E 6F6E206F6E20347468- 2281 00001557 206469736B20 2282 0000155D 0D0A db 0Dh, 0Ah 2283 0000155F 0D0A db 0Dh, 0Ah 2284 00001561 204578616D706C653A- db ' Example: hdformat hd0 ', 0Dh, 0Ah 2284 0000156A 206864666F726D6174- 2284 00001573 20686430200D0A 2285 0000157A 0D0A db 0Dh, 0Ah 2286 0000157C 4F7074696F6E616C3A- db 'Optional: hdformat -partition ', 0Dh, 0Ah 2286 00001585 206864666F726D6174- 2286 0000158E 202D70617274697469- 2286 00001597 6F6E203C6472697665- 2286 000015A0 3E200D0A 2287 000015A4 0D0A db 0Dh, 0Ah 2288 000015A6 204578616D706C653A- db ' Example: hdformat -1 hd1 (partition 1 on 2nd disk) ' 2288 000015AF 206864666F726D6174- 2288 000015B8 202D31206864312028- 2288 000015C1 706172746974696F6E- 2288 000015CA 2031206F6E20326E64- 2288 000015D3 206469736B2920 2289 000015DA 0D0A db 0Dh, 0Ah 2290 000015DC 202020202020202020- db ' hdformat -2 hd0 (partition 2 on 1st disk) ' 2290 000015E5 206864666F726D6174- 2290 000015EE 202D32206864302028- 2290 000015F7 706172746974696F6E- 2290 00001600 2032206F6E20317374- 2290 00001609 206469736B2920 2291 00001610 0D0A db 0Dh, 0Ah 2292 00001612 0D0A db 0Dh, 0Ah 2293 00001614 4F7074696F6E733A20- db 'Options: 1 (partition 1) ' 2293 0000161D 312020287061727469- 2293 00001626 74696F6E20312920 2294 0000162E 0D0A db 0Dh, 0Ah 2295 00001630 202020202020202020- db ' 2 (partition 2) ' 2295 00001639 322020287061727469- 2295 00001642 74696F6E20322920 2296 0000164A 0D0A db 0Dh, 0Ah 2297 0000164C 202020202020202020- db ' 3 (partition 3) ' 2297 00001655 332020287061727469- 2297 0000165E 74696F6E20332920 2298 00001666 0D0A db 0Dh, 0Ah 2299 00001668 202020202020202020- db ' 4 (partition 4) ' 2299 00001671 342020287061727469- 2299 0000167A 74696F6E20342920 2300 00001682 0D0A00 db 0Dh, 0Ah, 0 2301 2302 partition: ; selected partition (0 = primary dos partition) 2303 00001685 00 db 0 2304 2305 RD_Format_warning: 2306 00001686 0D0A db 0Dh, 0Ah 2307 00001688 5741524E494E472021- db "WARNING ! ", 0Dh, 0Ah 2307 00001691 200D0A 2308 00001694 28496620796F752073- db "(If you say 'Yes', all of data in the primary DOS partition will be lost !) " 2308 0000169D 61792027596573272C- 2308 000016A6 20616C6C206F662064- 2308 000016AF 61746120696E207468- 2308 000016B8 65207072696D617279- 2308 000016C1 20444F532070617274- 2308 000016CA 6974696F6E2077696C- 2308 000016D3 6C206265206C6F7374- 2308 000016DC 20212920 2309 RD_Do_you_want: 2310 000016E0 0D0A db 0Dh, 0Ah 2311 000016E2 0D0A db 0Dh, 0Ah 2312 000016E4 446F20796F75207761- db "Do you want to format DOS partition as Retro DOS FAT" 2312 000016ED 6E7420746F20666F72- 2312 000016F6 6D617420444F532070- 2312 000016FF 6172746974696F6E20- 2312 00001708 617320526574726F20- 2312 00001711 444F5320464154 2313 fattype_str: 2314 00001718 3136206673203F2028- db "16 fs ? (Y/N) " 2314 00001721 592F4E2920 2315 00001726 00 db 0 2316 2317 _yes_str: 2318 00001727 59455320 db 'YES ' 2319 0000172B 0D0A00 db 0Dh, 0Ah, 0 2320 _no_str: 2321 0000172E 4E4F20 db 'NO ' 2322 00001731 0D0A00 db 0Dh, 0Ah, 0 2323 2324 _msg_OK: 2325 ;db 07h 2326 00001734 0D0A db 0Dh, 0Ah 2327 00001736 4F4B2E db "OK." 2328 RD_CRLF: 2329 00001739 0D0A00 db 0Dh, 0Ah, 0 2330 2331 RD_PressKeyWhenReady: 2332 0000173C 0D0A db 0Dh, 0Ah 2333 0000173E 507265737320456E74- db 'Press Enter to format primary dos partition on hd' 2333 00001747 657220746F20666F72- 2333 00001750 6D6174207072696D61- 2333 00001759 727920646F73207061- 2333 00001762 72746974696F6E206F- 2333 0000176B 6E206864 2334 RD_Drive: 2335 0000176F 3F2E2000 db '?. ', 0 2336 2337 RD_disk_NotReadyOrError: 2338 00001773 0D0A db 0Dh, 0Ah 2339 00001775 4469736B206572726F- db 'Disk error or drive not ready ! ' 2339 0000177E 72206F722064726976- 2339 00001787 65206E6F7420726561- 2339 00001790 6479202120 2340 00001795 54727920616761696E- zbyte: db 'Try again ? (Y/N) ' 2340 0000179E 203F2028592F4E2920 2341 000017A7 00 db 0 2342 2343 RD_psize_defect: 2344 000017A8 0D0A db 0Dh, 0Ah 2345 000017AA 4D4252207061727469- db 'MBR partition size defect ! ' 2345 000017B3 74696F6E2073697A65- 2345 000017BC 206465666563742021- 2345 000017C5 20 2346 000017C6 0D0A db 0Dh, 0Ah 2347 000017C8 286C65737320746861- db '(less than the minimum number of sectors required) ' 2347 000017D1 6E20746865206D696E- 2347 000017DA 696D756D206E756D62- 2347 000017E3 6572206F6620736563- 2347 000017EC 746F72732072657175- 2347 000017F5 697265642920 2348 000017FB 00 db 0 2349 2350 RD_fatp_notfound: 2351 000017FC 0D0A db 0Dh, 0Ah 2352 000017FE 4D425220646F657320- db 'MBR does not contain ' 2352 00001807 6E6F7420636F6E7461- 2352 00001810 696E20 2353 a_p_d_p: 2354 00001813 61207072696D617279- db 'a primary DOS partition ! ' 2354 0000181C 20444F532070617274- 2354 00001825 6974696F6E202120 2355 fattype: 2356 0000182D 00 db 0 2357 ;RetryCount: 2358 ; db 4 2359 2360 ;error: db 0 2361 2362 not_primary_dos_p: 2363 0000182E 0D0A db 0Dh, 0Ah 2364 00001830 53656C656374656420- db 'Selected partition is not ' 2364 00001839 706172746974696F6E- 2364 00001842 206973206E6F7420 2365 0000184A 00 db 0 2366 2367 ;align 2 2368 0000184B 90 align 4 2369 2370 hexchrs: 2371 0000184C 303132333435363738- db '0123456789ABCDEF' 2371 00001855 39414243444546 2372 2373 Cursor_Pos: ; dw 0 2374 CHS_limit: ; dword 2375 0000185C 0000 dw 0 2376 ;dw 0 2377 2378 0000185E A101 sign: dw 417 ; magic word 2379 2380 ;align 4 2381 2382 msg_sectors_crlf: 2383 00001860 20736563746F72 db " sector" 2384 msg_sectors_crlf_s: 2385 00001867 73 db "s" 2386 00001868 0D0A00 db 0Dh, 0Ah, 0 2387 2388 vname_length: 2389 0000186B 00 db 0 2390 2391 bs_oem_name: 2392 ;db 'TRDOS2.0', 0 2393 ; 28/10/2023 2394 0000186C 524554524F444F5300 db 'RETRODOS', 0 2395 2396 00001875 90 align 2 2397 2398 no_name: 2399 00001876 4E4F204E414D452020- db 'NO NAME ', 0 2399 0000187F 202000 2400 2401 Msg_Volume_Name: 2402 00001882 0D0A db 0Dh, 0Ah 2403 00001884 0D0A db 0Dh, 0Ah 2404 00001886 566F6C756D65204E61- db "Volume Name: ", 0 2404 0000188F 6D653A2000 2405 2406 Msg_Volume_Serial: 2407 00001894 566F6C756D65205365- db "Volume Serial No: " 2407 0000189D 7269616C204E6F3A20 2408 Vol_Serial1: 2409 000018A6 30303030 db "0000" 2410 000018AA 2D db "-" 2411 Vol_Serial2: 2412 000018AB 30303030 db "0000" 2413 000018AF 0D0A00 db 0Dh, 0Ah, 0 2414 2415 msg_cluster_count: 2416 000018B2 436C75737465722043- db "Cluster Count: ", 0 2416 000018BB 6F756E743A2000 2417 cluster_count_str: 2418 000018C2 30303030303030 db "0000000" 2419 000018C9 0D0A00 db 0Dh, 0Ah, 0 2420 msg_formatting: 2421 000018CC 466F726D617474696E- db "Formatting ", 0 2421 000018D5 672000 2422 format_percent_str: 2423 000018D8 30303025 db "000%" 2424 000018DC 00 db 0 2425 2426 Msg_3dot_OK: 2427 000018DD 2E2E2E db '...' 2428 Msg_OK: 2429 000018E0 204F4B2E db ' OK.' 2430 CRLF: 2431 000018E4 0D0A00 db 0Dh, 0Ah, 0 2432 2433 Msg_Error: 2434 000018E7 0D0A db 0Dh, 0Ah 2435 000018E9 4572726F72202120 db 'Error ! ' 2436 000018F1 28 db '(' 2437 error_code: 2438 000018F2 3030 dw 3030h 2439 000018F4 68 db 'h' 2440 000018F5 2920 db ') ' 2441 000018F7 0D0A db 0Dh, 0Ah 2442 000018F9 00 db 0 2443 2444 ; 04/05/2024 2445 FAT32_note: 2446 000018FA 0D0A db 0Dh, 0Ah 2447 000018FC 0D0A db 0Dh, 0Ah 2448 000018FE 4E4F54453A20 db 'NOTE: ' 2449 00001904 0D0A db 0Dh, 0Ah 2450 00001906 0D0A db 0Dh, 0Ah 2451 00001908 526574726F20444F53- db 'Retro DOS v4.2 -MSDOS 6.22- does not recognize FAT32 file system.' 2451 00001911 2076342E32202D4D53- 2451 0000191A 444F5320362E32322D- 2451 00001923 20646F6573206E6F74- 2451 0000192C 207265636F676E697A- 2451 00001935 652046415433322066- 2451 0000193E 696C65207379737465- 2451 00001947 6D2E 2452 00001949 0D0A db 0Dh, 0Ah 2453 0000194B 0D0A DB 0Dh, 0Ah 2454 0000194D 4275742C2052657472- db 'But, Retro DOS v5 -PCDOS 7.1- recognizes FAT32 file system and ' 2454 00001956 6F20444F5320763520- 2454 0000195F 2D5043444F5320372E- 2454 00001968 312D207265636F676E- 2454 00001971 697A65732046415433- 2454 0000197A 322066696C65207379- 2454 00001983 7374656D20616E6420 2455 0000198C 0D0A db 0Dh, 0Ah 2456 0000198E 69747320626F6F7420- db 'its boot sector will be used to format the new FAT32 partition/volume.' 2456 00001997 736563746F72207769- 2456 000019A0 6C6C20626520757365- 2456 000019A9 6420746F20666F726D- 2456 000019B2 617420746865206E65- 2456 000019BB 772046415433322070- 2456 000019C4 6172746974696F6E2F- 2456 000019CD 766F6C756D652E 2457 000019D4 0D0A db 0Dh, 0Ah 2458 000019D6 0D0A db 0Dh, 0Ah 2459 000019D8 546865206B65726E65- db 'The kernel file name of the FAT32 boot sector is ', 34,'PCDOS.SYS', 34,'.' 2459 000019E1 6C2066696C65206E61- 2459 000019EA 6D65206F6620746865- 2459 000019F3 20464154333220626F- 2459 000019FC 6F7420736563746F72- 2459 00001A05 20697320225043444F- 2459 00001A0E 532E535953222E 2460 00001A15 0D0A db 0Dh, 0Ah 2461 00001A17 0D0A db 0Dh, 0Ah 2462 00001A19 507265737320454E54- db 'Press ENTER to CONTINUE or press another key to CANCEL.' 2462 00001A22 455220746F20434F4E- 2462 00001A2B 54494E5545206F7220- 2462 00001A34 707265737320616E6F- 2462 00001A3D 74686572206B657920- 2462 00001A46 746F2043414E43454C- 2462 00001A4F 2E 2463 00001A50 0D0A0D0A00 db 0Dh, 0Ah, 0Dh, 0Ah, 0 2464 2465 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2466 ; initialized buffers 2467 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2468 2469 HDFORMAT_SECBUFFER: 2470 00001A55 F6 times 512 db 0F6h 2471 HDFORMAT_FSINFO_BUFF: 2472 00001C55 52526141 dd 41615252h ; FSI_LeadSig 2473 00001C59 00 times 480 db 0 ; FSI_Reserved1 2474 00001E39 72724161 dd 61417272h ; FSI_StrucSig 2475 00001E3D FFFFFFFF dd 0FFFFFFFFh ; FSI_Free_Count 2476 00001E41 02000000 dd 000000002h ; FSI_Nxt_Free 2477 00001E45 00 times 12 db 0 ; FSI_Reserved2 2478 00001E51 000055AA dd 0AA550000h ; FSI_TrailSig 2479 2480 ;SizeOfFile equ $-100 2481 2482 ; ---------------------------------------------------------------------------- 2483 ; uninitialized data 2484 ; ---------------------------------------------------------------------------- 2485 2486 bss_start: 2487 2488 ABSOLUTE bss_start 2489 2490 00001E55 ?????? alignb 4 2491 2492 00001E58 ?? fsID: resb 1 2493 00001E59 ?? rw: resb 1 2494 00001E5A ???? csize: resw 1 ; heads*spt (sectors per cylinder) 2495 2496 00001E5C ???????? dosp_start: resd 1 ; start sector of the (primary) dos partition 2497 00001E60 ???????? dosp_size: resd 1 ; partition size in sectors 2498 2499 MBR: 2500 bootsector: 2501 ; resb 512 2502 HDFORMAT_FATBUFFER: 2503 HDFORMAT_EMPTY_BUFF: 2504 00001E64 resb 512 2505 2506 ;HDFORMAT_FATBUFFER: 2507 ;HDFORMAT_EMPTY_BUFF: 2508 ; resb 512 2509 2510 00002064 ???????? data_start: resd 1 2511 00002068 ???????? data_sectors: resd 1 2512 0000206C ???????? cluster_count: resd 1 2513 00002070 ???? root_dir_secs: resw 1 2514 00002072 ???? format_percent: resw 1 2515 00002074 ?? prev_percent: resb 1 2516 00002075 ?? rsvdbyte: resb 1 2517 2518 00002076 ???? old_sp: resw 1 2519 2520 00002078 StrVolumeName: resb 12 2521 2522 end_bss: