1 ; **************************************************************************** 2 ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.7 - epformat.s 3 ; ---------------------------------------------------------------------------- 4 ; Extended DOS Partition (FAT File System) Format Utility for TRDOS 386 v2 OS. 5 ; ---------------------------------------------------------------------------- 6 ; Last Update: 03/05/2024 (Previous: 28/10/2023) 7 ; ---------------------------------------------------------------------------- 8 ; Beginning: 22/09/2020 9 ; ---------------------------------------------------------------------------- 10 ; Assembler: NASM version 2.15 (epformat.s) 11 ; ---------------------------------------------------------------------------- 12 ; Turkish Rational DOS 13 ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016) 14 ; 15 ; Derived from TRDOS Operating System v2.0 (80386) source code by Erdogan Tan 16 ; hdformat.s (14/09/2020) 17 ; **************************************************************************** 18 ; Derived from hdimage.s (08/03/2019), Retro DOS v2 Hard Disk BS Utility 19 20 ; HDFORMAT.ASM 21 ; Turkish Rational DOS 22 ; Disk Operation System v2.0 Project 23 ; Primary DOS Partition (FAT12, FAT16, FAT32 fs) FORMAT Code 24 ; 25 ; Copyright (C) 2020 Erdogan TAN 26 ; **************************************************************************** 27 ; assembling: nasm epformat.s -l epformat.txt -o EPFORMAT.COM -Z error.txt 28 29 ; Note: Only for formatting logical DOS drives in extended DOS partitions. 30 31 ; ---------------------------------------------------------------------------- 32 ; equations 33 ; ---------------------------------------------------------------------------- 34 35 ; boot sector parameters 36 37 bsOemName equ 3 ; ('MSWIN4.1') --> 'TRDOS386' 38 bsBytesPerSec equ 11 ; 512 (word) 39 bsSecPerClust equ 13 40 bsResSectors equ 14 41 bsFATs equ 16 42 bsRootDirEnts equ 17 43 bsSectors equ 19 44 bsMedia equ 21 ; 0F8h 45 bsFATsecs equ 22 46 bsSecPerTrack equ 24 47 bsHeads equ 26 48 bsHidden1 equ 28 49 bsHidden2 equ 30 50 bsHugeSectors equ 32 51 ; FAT 16 bs & FAT 12 bs 52 bsDriveNumber equ 36 ; 80h 53 bsReserved1 equ 37 54 bsBpbSignature equ 38 ; 29h (byte) 55 bsVolumeID equ 39 56 bsVolumeLabel equ 43 57 bsFileSysType equ 54 ; 'FAT16 ' (8 bytes) 58 ; FAT 32 bs 59 BPB_FATSz32 equ 36 60 BPB_ExtFlags equ 40 61 BPB_FSVer equ 42 62 BPB_RootClus equ 44 63 BPB_FSInfo equ 48 64 BPB_BkBootSec equ 50 65 BPB_Reserved equ 52 66 BS_DrvNum equ 64 ; 80h 67 BS_Reserved1 equ 65 68 BS_BootSig equ 66 ; 29h (byte) 69 BS_VolID equ 67 70 BS_VolLab equ 71 71 BS_FilSysType equ 82 ; 'FAT32 ' (8 bytes) 72 73 ; Masterboot / Partition Table at Beginning+1BEh 74 ptBootable equ 0 75 ptBeginHead equ 1 76 ptBeginSector equ 2 77 ptBeginCylinder equ 3 78 ptFileSystemID equ 4 79 ptEndHead equ 5 80 ptEndSector equ 6 81 ptEndCylinder equ 7 82 ptStartSector equ 8 83 ptSectors equ 12 84 85 partition_table equ 1BEh 86 87 ; ---------------------------------------------------------------------------- 88 ; code 89 ; ---------------------------------------------------------------------------- 90 91 [BITS 16] 92 [ORG 100h] 93 94 00000000 FA cli 95 00000001 FC cld 96 00000002 0E push cs 97 00000003 17 pop ss 98 00000004 BCFEFF mov sp, 0FFFEh 99 00000007 FB sti 100 101 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 102 ; see if drive specified 103 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 104 105 00000008 BE8000 mov si, 80h ; PSP command tail 106 0000000B 8A0C mov cl, [si] 107 0000000D 08C9 or cl, cl 108 0000000F 7424 jz short T_3 ; jump if zero 109 T_1: 110 00000011 46 inc si 111 112 00000012 8A04 mov al, [si] 113 00000014 3C20 cmp al, ' ' ; is it SPACE ? 114 00000016 7506 jne short T_2 115 116 00000018 FEC9 dec cl 117 0000001A 75F5 jnz short T_1 118 0000001C EB17 jmp short T_3 119 T_2: 120 0000001E 46 inc si 121 122 0000001F 3C68 cmp al, 'h' 123 00000021 7512 jne short T_3 124 00000023 803C64 cmp byte [si], 'd' 125 00000026 750D jne short T_3 126 00000028 46 inc si 127 00000029 8A04 mov al, [si] 128 0000002B 3C30 cmp al, '0' 129 0000002D 740F je short T_4 130 0000002F 7204 jb short T_3 131 00000031 3C33 cmp al, '3' 132 00000033 7609 jna short T_4 133 134 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 135 ; Write message 136 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 137 138 T_3: 139 00000035 BE[4415] mov si, TrDOS_Welcome 140 00000038 E83F03 call print_msg 141 ;cmp cl, 0 142 ;ja short T_44 143 0000003B E92503 jmp T_44 144 145 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 146 ; get drive code 147 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 148 149 T_4: 150 0000003E 46 inc si 151 0000003F 803C20 cmp byte [si], ' ' 152 00000042 77F1 ja short T_3 153 154 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 155 ; get drive parameters 156 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 157 158 00000044 A2[B417] mov [TrDOS_Drive], al ; '0' .. '3' 159 160 00000047 A2[E718] mov [drv_str], al 161 162 0000004A B408 mov ah, 08h 163 0000004C 88C2 mov dl, al 164 0000004E 80C250 add dl, 80h -'0' ; make it 80h based 165 00000051 8816[3D15] mov [drv], dl 166 00000055 CD13 int 13h ; return disk parameters 167 168 00000057 0E push cs 169 00000058 07 pop es ; restore es 170 171 00000059 08E4 or ah, ah 172 0000005B 7542 jnz short T_6 ; error 173 174 0000005D 88C8 mov al, cl 175 0000005F 243F and al, 63 176 00000061 A2[3E15] mov [sectors], al 177 00000064 C0E906 shr cl, 6 178 00000067 86E9 xchg ch, cl 179 00000069 41 inc cx 180 0000006A 890E[4215] mov [cylinders], cx 181 0000006E FEC6 inc dh 182 00000070 8836[4015] mov [heads], dh 183 00000074 F6E6 mul dh 184 ; ax = heads * spt 185 00000076 A3[CE1E] mov [csize], ax 186 00000079 F7E1 mul cx ; * cylinders 187 ; dx:ax = chs limit 188 0000007B A3[B018] mov [CHS_limit], ax 189 0000007E 8916[B218] mov [CHS_limit+2], dx 190 191 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 192 ; read MBR 193 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 194 195 ; check for (valid) extended dos partition 196 197 ;mov byte [RetryCount], 4 198 00000082 BF0500 mov di, 5 199 200 ;mov ax, 0201h ; read disk 201 00000085 BB[D81E] mov bx, MBR ; location of masterboot code 202 203 00000088 B90100 mov cx, 1 ; cylinder = 0 204 ; sector = 1 205 0000008B B600 mov dh, 0 ; head = 0 206 ;mov dl, [TrDOS_Drive] ; drive 207 ;add dl, 80h -'0' ; make it 80h based 208 0000008D 8A16[3D15] mov dl, [drv] 209 T_5: 210 00000091 B80102 mov ax, 0201h 211 00000094 CD13 int 13h 212 ;jc short T_46 213 00000096 7312 jnc short T_7 ; read masterboot sector, OK 214 215 ; reset hard disk(s) 216 00000098 30E4 xor ah, ah 217 ;mov dl, [drv] 218 0000009A CD13 int 13h 219 220 ;dec byte [RetryCount] 221 0000009C 4F dec di 222 0000009D 75F2 jnz short T_5 223 224 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 225 ; write disk error message and terminate 226 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 227 228 T_6: 229 0000009F C606[DA17]00 mov byte [zbyte], 0 ; message without (Y/N) question 230 231 000000A4 E8D002 call T_46 ; write error message 232 000000A7 E9B902 jmp T_44 ; terminate 233 234 T_7: 235 000000AA 813E[D620]55AA cmp word [MBR+510], 0AA55h 236 000000B0 75ED jne short T_6 237 238 000000B2 BE[9A20] mov si, MBR+(partition_table+ptFileSystemID) 239 T_8: 240 000000B5 E8F202 call validate_extended_dos_partition 241 000000B8 730F jnc short T_10 242 243 000000BA 83C610 add si, 16 244 000000BD 81FE[DA20] cmp si, MBR+partition_table+ptFileSystemID+64 245 000000C1 72F2 jb short T_8 246 T_9: 247 000000C3 BE[6918] mov si, TRDOS_fatp_notfound 248 ;call print_msg 249 ;jmp T_44 250 000000C6 E95802 jmp T_40 251 T_10: 252 ; AL = EP type (05h or 0Fh) 253 000000C9 3C0F cmp al, 0Fh 254 000000CB 7604 jna short T_11 255 000000CD FE06[3C15] inc byte [lba] 256 T_11: 257 000000D1 A1[1821] mov ax, [EP_Start] 258 000000D4 8B16[1A21] mov dx, [EP_Start+2] 259 T_12: 260 000000D8 A3[1C21] mov [EP_Start_x], ax 261 000000DB 8916[1E21] mov [EP_Start_x+2], dx 262 T_13: 263 000000DF BB[D81E] mov bx, bootsector 264 000000E2 E89903 call read_hd_sector 265 000000E5 7309 jnc short T_14 266 267 000000E7 803E[6818]00 cmp byte [ldd_count], 0 268 000000EC 7771 ja short T_18 269 000000EE EBAF jmp short T_6 270 T_14: 271 000000F0 813E[D620]55AA cmp word [bootsector+510], 0AA55h 272 000000F6 7409 je short T_15 273 274 000000F8 803E[6818]00 cmp byte [ldd_count], 0 275 000000FD 7760 ja short T_18 276 000000FF EBC2 jmp short T_9 ; there is not a valid extd dos part. 277 T_15: 278 00000101 BE[9A20] mov si, bootsector+(partition_table+ptFileSystemID) 279 00000104 E8BE02 call validate_dos_partition 280 00000107 730D jnc short T_16 281 282 00000109 803E[6818]00 cmp byte [ldd_count], 0 283 0000010E 774F ja short T_18 284 285 00000110 BE[4118] mov si, TrDOS_ep_ldd_defect ; not a logical dos drive 286 00000113 E90B02 jmp T_40 287 288 T_16: 289 00000116 FE06[6818] inc byte [ldd_count] 290 0000011A 83EE04 sub si, ptFileSystemID 291 0000011D A1[1C21] mov ax, [EP_Start_x] 292 00000120 8B16[1E21] mov dx, [EP_Start_x+2] 293 00000124 014408 add [si+ptStartSector], ax 294 00000127 11540A adc [si+ptStartSector+2], dx 295 296 0000012A 8B3E[C81E] mov di, [lddt_ptr] 297 0000012E B90800 mov cx, 8 298 00000131 F3A5 rep movsw 299 300 00000133 8A4C04 mov cl, [si+ptFileSystemID] 301 00000136 80F905 cmp cl, 05h 302 00000139 7409 je short T_17 303 0000013B 80F90F cmp cl, 0Fh 304 0000013E 751F jne short T_18 ; there is not a next logical dos drive 305 00000140 FE06[3C15] inc byte [lba] ; LBA type disk r/w 306 T_17: 307 00000144 803E[6818]03 cmp byte [ldd_count], 3 308 00000149 7714 ja short T_18 ; max. 4 logical dos drive 309 0000014B 893E[C81E] mov [lddt_ptr], di 310 0000014F A1[1821] mov ax, [EP_Start] 311 00000152 8B16[1A21] mov dx, [EP_Start+2] 312 00000156 034408 add ax, [si+ptStartSector] 313 00000159 13540A adc dx, [si+ptStartSector+2] 314 0000015C E979FF jmp T_12 315 316 T_18: 317 0000015F BE[B418] mov si, ldd_table 318 00000162 E81502 call print_msg 319 320 00000165 30FF xor bh, bh 321 322 00000167 B301 mov bl, 1 323 00000169 E87902 call fill_ldd_row 324 0000016C BE[8419] mov si, ldd_row 325 0000016F E80802 call print_msg 326 00000172 B302 mov bl, 2 327 00000174 381E[6818] cmp [ldd_count], bl ; 2 328 00000178 722B jb short T_19 ; direct question (only one ldd) 329 0000017A E86802 call fill_ldd_row 330 0000017D BE[8419] mov si, ldd_row 331 00000180 E8F701 call print_msg 332 00000183 B303 mov bl, 3 333 00000185 381E[6818] cmp [ldd_count], bl ; 3 334 00000189 721A jb short T_19 ; select menu 335 0000018B E85702 call fill_ldd_row 336 0000018E BE[8419] mov si, ldd_row 337 00000191 E8E601 call print_msg 338 00000194 B304 mov bl, 4 339 00000196 381E[6818] cmp [ldd_count], bl ; 4 340 0000019A 7209 jb short T_19 ; select menu 341 0000019C E84602 call fill_ldd_row 342 0000019F BE[8419] mov si, ldd_row 343 000001A2 E8D501 call print_msg 344 345 T_19: 346 000001A5 BE[AE19] mov si, ldd_dline ; print bottom line 347 000001A8 E8CF01 call print_msg 348 349 000001AB 803E[6818]01 cmp byte [ldd_count], 1 350 000001B0 7705 ja short T_20 351 352 ; the first logical dos partition in extended dos partition 353 000001B2 BB[D820] mov bx, lddt ; start of logical dos drives 354 ; (dos partitiona) table 355 356 000001B5 EB4C jmp short T_25 ; pass select menu 357 T_20: 358 000001B7 A0[6818] mov al, [ldd_count] 359 000001BA 0430 add al, '0' 360 000001BC A2[021A] mov [ldd_select_pn], al ; last logical dos drive number 361 362 T_21: 363 000001BF BE[D819] mov si, ldd_select_msg 364 000001C2 E8B501 call print_msg 365 366 T_22: 367 000001C5 31C0 xor ax, ax 368 000001C7 CD16 int 16h ; wait for keyboard command 369 370 000001C9 3C1B cmp al, 27 ; ESC key 371 000001CB 0F849401 je T_44 ; CRLF and Exit 372 373 000001CF 3C20 cmp al, 32 ; SPACE key (or control keys or CR key etc.) 374 000001D1 7711 ja short T_24 375 000001D3 7404 je short T_23 376 377 000001D5 3C0D cmp al, 13 ; CR/ENTER key 378 000001D7 75EC jne short T_22 ; don't beep 379 380 ; Beeper 381 T_23: 382 000001D9 B007 mov al, 07h ; beep 383 000001DB B40E mov ah, 0Eh 384 000001DD BB0700 mov bx, 07h 385 000001E0 CD10 int 10h 386 387 000001E2 EBE1 jmp short T_22 388 389 T_24: 390 000001E4 8A26[6818] mov ah, [ldd_count] 391 000001E8 80C430 add ah, '0' 392 000001EB 3C31 cmp al, '1' 393 000001ED 72D0 jb short T_21 394 000001EF 38E0 cmp al, ah 395 000001F1 77CC ja short T_21 396 397 000001F3 A2[AD17] mov [TrDos_ldn], al 398 399 000001F6 2C31 sub al, '1' 400 000001F8 C0E004 shl al, 4 ; * 16 401 000001FB 88C3 mov bl, al 402 000001FD 30FF xor bh, bh 403 000001FF 81C3[D820] add bx, lddt ; logical dos drive (partition) table 404 T_25: 405 00000203 891E[4021] mov [lddt_save], bx 406 00000207 B401 mov ah, 1 407 00000209 8A4704 mov al, [bx+ptFileSystemID] ; Partition ID 408 0000020C 38E0 cmp al, ah ; 1 ; FAT12 file system 409 0000020E 760E jna short T_26 410 00000210 FEC4 inc ah ; 2 411 00000212 3C06 cmp al, 6 ; FAT 16 file system (>32MB) 412 00000214 7408 je short T_26 413 00000216 7206 jb short T_26 ; 4 ; FAT16 file sytem (<=32MB) 414 00000218 3C0E cmp al, 0Eh 415 0000021A 7402 je short T_26 ; FAT16 LBA file sytem (>32MB) 416 0000021C FEC4 inc ah ; 3 417 ; FAT32 CHS or FAT 32 LBA file system 418 T_26: 419 0000021E 8826[9C18] mov byte [fattype], ah 420 00000222 A2[CC1E] mov [fsID], al 421 422 00000225 80FC02 cmp ah, 2 423 00000228 7421 je short T_29 ; FAT16 BS (default offset addr) 424 0000022A 7214 jb short T_28 425 ; set format code pointer to FAT32 format code 426 0000022C C706[380D][1605] mov word [trdos386fc], format_FAT32_fs 427 ; set FS type string 428 00000232 C706[5F17]3332 mov word [fattype_str],'32' ; 'FAT32' 429 ; ok.. read boot sector 430 00000238 EB11 jmp short T_29 431 432 T_27: 433 ; Partition size defect 434 ; (less than the minimum number of sectors required) 435 0000023A BE[ED17] mov si, TrDOS_psize_defect 436 ;call print_msg 437 ;jmp T_44 438 0000023D E9E100 jmp T_40 439 440 T_28: 441 ; set format code pointer to FAT12 format code 442 00000240 C706[380D][D00A] mov word [trdos386fc], format_FAT12_fs 443 00000246 C606[6017]32 mov byte [fattype_str+1],'2' ; 'FAT12' 444 445 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 446 ; read primary dos partition's boot sector 447 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 448 449 T_29: 450 ;mov byte [RetryCount], 5 451 452 0000024B 8B36[4021] mov si, [lddt_save] ; pt row for logical dos drive 453 454 0000024F 8B4408 mov ax, [si+ptStartSector] 455 00000252 8B540A mov dx, [si+ptStartSector+2] 456 00000255 A3[D01E] mov [dosp_start], ax 457 00000258 8916[D21E] mov [dosp_start+2], dx 458 0000025C 8B4C0C mov cx, [si+ptSectors] 459 0000025F 8B5C0E mov bx, [si+ptSectors+2] 460 00000262 890E[D41E] mov [dosp_size], cx 461 00000266 891E[D61E] mov [dosp_size+2], bx 462 463 ; check minimum partition size 464 0000026A 803E[9C18]03 cmp byte [fattype], 3 ; FAT32 FS 465 0000026F 730C jnb short T_31 ; yes 466 T_30: 467 00000271 09DB or bx, bx 468 00000273 7515 jnz short T_32 469 470 00000275 3B0E[CE1E] cmp cx, [csize] ; sectors per cylinder 471 00000279 730F jnb short T_32 472 0000027B EBBD jmp short T_27 473 T_31: 474 0000027D 83FB01 cmp bx, 1 ; >= 32MB ? 475 00000280 7708 ja short T_32 476 00000282 72B6 jb short T_27 477 478 00000284 81F91504 cmp cx, 0415h ; must be >= 66581 sectors 479 00000288 72B0 jb short T_27 480 T_32: 481 0000028A 01C1 add cx, ax 482 0000028C 11D3 adc bx, dx 483 0000028E 0F820DFE jc T_6 484 485 00000292 3B1E[B218] cmp bx, [CHS_limit+2] 486 00000296 BB[D81E] mov bx, bootsector 487 00000299 7711 ja short T_34 ; LBA read/write 488 0000029B 7206 jb short T_33 489 0000029D 3B0E[B018] cmp cx, [CHS_limit] 490 000002A1 7709 ja short T_34 491 T_33: 492 ; CHS read 493 494 ;mov ax, [dosp_start] 495 ;mov dx, [dosp_start+2] 496 497 000002A3 E8DF01 call read_chs_sector 498 000002A6 0F82F5FD jc T_6 499 000002AA EB0C jmp short T_35 500 T_34: 501 000002AC C606[3C15]01 mov byte [lba], 1 ; LBA r/w is required 502 503 ;mov ax, [dosp_start] 504 ;mov dx, [dosp_start+2] 505 506 000002B1 E81F02 call read_lba_sector 507 000002B4 0F82E7FD jc T_6 508 T_35: 509 000002B8 813E[D620]55AA cmp word [bootsector+510], 0AA55h 510 000002BE 7551 jne short T_38 511 512 000002C0 813E[E31E]0002 cmp word [bootsector+bsBytesPerSec], 512 513 000002C6 7549 jne short T_38 514 515 ; 03/05/2024 (BugFix) 516 000002C8 803E[ED1E]F8 cmp byte [bootsector+bsMedia], 0F8h 517 000002CD 7542 jne short T_38 518 519 000002CF 803E[9C18]02 cmp byte [fattype], 2 520 000002D4 7722 ja short T_37 521 522 000002D6 803E[FE1E]29 cmp byte [bootsector+bsBpbSignature], 29h 523 000002DB 7534 jne short T_38 524 000002DD 66813E[0E1F]464154- cmp dword [bootsector+bsFileSysType], 'FAT1' 524 000002E5 31 525 000002E6 7529 jne short T_38 526 527 000002E8 A0[121F] mov al, [bootsector+bsFileSysType+4] 528 000002EB 3C36 cmp al, '6' 529 000002ED 7404 je short T_36 530 531 000002EF 3C32 cmp al, '2' 532 000002F1 751E jne short T_38 533 534 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 535 ; format question (and warning msg) 536 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 537 538 T_36: 539 000002F3 BE[CD16] mov si, TrDOS_Format_warning ; warning is required 540 000002F6 EB1C jmp short T_39 541 T_37: 542 000002F8 803E[1A1F]29 cmp byte [bootsector+BS_BootSig], 29h 543 000002FD 7512 jne short T_38 544 000002FF 66813E[2A1F]464154- cmp dword [bootsector+BS_FilSysType], 'FAT3' 544 00000307 33 545 00000308 7507 jne short T_38 546 0000030A 803E[2E1F]32 cmp byte [bootsector+BS_FilSysType+4], '2' 547 0000030F 74E2 je short T_36 548 T_38: 549 00000311 BE[2317] mov si, TrDOS_Do_you_want ; no need to warning 550 T_39: 551 00000314 E86300 call print_msg 552 553 00000317 E86F00 call get_answer 554 0000031A 3C59 cmp al, 'Y' 555 0000031C 7408 je short T_41 556 557 0000031E BE[7517] mov si, _no_str 558 T_40: 559 00000321 E85600 call print_msg 560 561 00000324 EB3D jmp short T_44 562 T_41: 563 00000326 BE[6E17] mov si, _yes_str 564 00000329 E84E00 call print_msg 565 566 0000032C BE[8317] mov si, TrDOS_PressKeyWhenReady 567 0000032F E84800 call print_msg 568 T_42: 569 00000332 31C0 xor ax, ax 570 00000334 CD16 int 16h ; wait for keyboard command 571 00000336 3C0D cmp al, 'M'-40h ; Enter (OK) key 572 00000338 740A je short T_43 ; write 573 0000033A 3C03 cmp al, 'C'-40h 574 0000033C 7425 je short T_44 ; no write (exit) 575 0000033E 3C1B cmp al, 27 576 00000340 7421 je short T_44 577 00000342 EBEE jmp short T_42 578 579 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 580 ; clear fat buffer and start formatting 581 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 582 583 T_43: 584 00000344 BE[8017] mov si, TrDOS_CRLF 585 00000347 E83000 call print_msg 586 587 ; Clear buffer in BSS 588 0000034A BF[D81E] mov di, HDFORMAT_FATBUFFER 589 0000034D 31C0 xor ax, ax 590 0000034F B90001 mov cx, 256 591 00000352 F3AB rep stosw 592 593 ; Clear volume name field 594 00000354 BF[3421] mov di, StrVolumeName 595 00000357 B10C mov cl, 12 596 00000359 F3AA rep stosb 597 598 0000035B 8A16[CC1E] mov dl, [fsID] ; Partition ID 599 600 0000035F FF26[380D] jmp word [trdos386fc] 601 602 T_44: 603 00000363 BE[8017] mov si, TrDOS_CRLF 604 Exit: 605 00000366 E81100 call print_msg 606 00000369 B8004C mov ax, 4C00h ; terminate 607 0000036C CD21 int 21h 608 T_45: 609 0000036E E81800 call get_answer 610 00000371 3C59 cmp al, 'Y' 611 00000373 74CF je short T_43 612 00000375 EBEC jmp short T_44 613 614 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 615 ; disk r/w error or disk not ready 616 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 617 618 T_46: 619 00000377 BE[B817] mov si, TrDOS_disk_NotReadyOrError 620 ;;call print_msg 621 ;;jmp short T_45 622 ;jmp short print_msg 623 624 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 625 ; print message 626 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 627 628 print_msg: 629 T_47: 630 0000037A AC lodsb ; Load byte at DS:SI to AL 631 0000037B 20C0 and al, al 632 0000037D 7409 jz short T_48 633 0000037F B40E mov ah, 0Eh 634 00000381 BB0700 mov bx, 07h 635 00000384 CD10 int 10h ; BIOS Service func ( ah ) = 0Eh 636 ; Write char as TTY 637 ; AL-char BH-page BL-color 638 00000386 EBF2 jmp short T_47 639 T_48: 640 _NO_: 641 00000388 C3 retn 642 643 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 644 ; Yes/No 645 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 646 647 get_answer: 648 00000389 31C0 xor ax, ax 649 0000038B CD16 int 16h ; wait for keyboard command 650 0000038D 3C79 cmp al, 'y' 651 0000038F 7416 je short _yes ; retry 652 00000391 3C59 cmp al, 'Y' 653 00000393 7414 je short _YES_ 654 00000395 3C6E cmp al, 'n' 655 00000397 74EF je short _NO_ ; exit 656 00000399 3C4E cmp al, 'N' 657 0000039B 74EB je short _NO_ 658 0000039D 3C03 cmp al, 'C'-40h 659 0000039F 74E7 je short _NO_ 660 000003A1 3C1B cmp al, 27 661 000003A3 74E3 je short _NO_ 662 000003A5 EBE2 jmp short get_answer 663 _yes: 664 000003A7 B059 mov al, 'Y' 665 _YES_: 666 000003A9 C3 retn 667 668 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 669 ; get and set partition type for formatting 670 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 671 672 validate_extended_dos_partition: 673 674 ; INPUT: 675 ; si = partition table entry offset + file system ID 676 ; OUTPUT: 677 ; cf = 0 -> al = extended DOS partition ID 678 ; (05h,0Fh) 679 ; ;ah = 0 680 ; 681 ; [EP_Start] is set 682 ; 683 ; cf = 1 -> not an extended DOS partition 684 ; 685 ; Modified registers: ax, cx 686 687 ;sub ah, ah ; mov ah, 0 688 689 000003AA 8A04 mov al, [si] 690 691 000003AC 3C05 cmp al, 05h ; Extended DOS partition (CHS) 692 000003AE 7406 je short VEP_clc 693 694 000003B0 3C0F cmp al, 0Fh ; Extended DOS partition (CHS) 695 000003B2 7402 je short VEP_clc 696 VEP_stc: 697 000003B4 F9 stc 698 000003B5 C3 retn 699 VEP_clc: 700 000003B6 8B4C04 mov cx, [si+ptStartSector-ptFileSystemID] 701 000003B9 890E[1821] mov [EP_Start], cx 702 000003BD 8B4C06 mov cx, [si+2+ptStartSector-ptFileSystemID] 703 000003C0 890E[1A21] mov [EP_Start+2], cx 704 ;mov cx, [si+2+ptSectors-ptFileSystemID] 705 ;mov [EP_Size+2], cx 706 ;mov cx, [si+ptSectors-ptFileSystemID] 707 ;mov [EP_Size], cx 708 000003C4 C3 retn 709 710 validate_dos_partition: 711 712 ; INPUT: 713 ; si = partition table entry, partition ID offset 714 ; OUTPUT: 715 ; cf = 0 -> al = primary DOS partition ID 716 ; (01h,04h,06h,0Bh,0Ch,0Eh) 717 ; 718 ; cf = 1 -> not a primary DOS partition 719 720 000003C5 8A04 mov al, [si] 721 722 000003C7 3C01 cmp al, 01h ; FAT12 partition 723 000003C9 7613 jna short V_2 724 725 000003CB 3C06 cmp al, 06h ; FAT16 CHS partition (>=32MB) 726 000003CD 7707 ja short V_1 727 000003CF 740D je short V_2 728 729 000003D1 3C04 cmp al, 04h ; FAT16 CHS partition (< 32MB) 730 000003D3 770E ja short V_4 731 000003D5 C3 retn 732 V_1: 733 000003D6 3C0C cmp al, 0Ch ; FAT32 LBA partition 734 000003D8 7404 je short V_2 735 000003DA 7703 ja short V_3 736 737 000003DC 3C0B cmp al, 0Bh ; FAT32 CHS partition 738 V_2: 739 000003DE C3 retn 740 V_3: 741 000003DF 3C0E cmp al, 0Eh ; FAT16 LBA partition 742 000003E1 74FB je short V_2 743 V_4: 744 000003E3 F9 stc 745 000003E4 C3 retn 746 747 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 748 ; preparing text row for logical dos drive 749 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 750 751 fill_ldd_row: 752 ; bl = selected logical drive number 753 ; bh = 0 754 755 ;xor bh, bh 756 757 000003E5 88D8 mov al, bl 758 000003E7 0430 add al, '0' 759 000003E9 A2[9519] mov [ldd_row_dn], al 760 000003EC FECB dec bl 761 000003EE 7403 jz short flddtr_0 762 000003F0 C0E304 shl bl, 4 ; * 16 763 flddtr_0: 764 000003F3 81C3[D820] add bx, lddt 765 000003F7 8A4704 mov al, [bx+ptFileSystemID] 766 000003FA 3C01 cmp al, 1 767 000003FC 7508 jne short flddtr_1 768 000003FE C706[9C19]3132 mov word [ldd_row_fs], "12" 769 00000404 EB16 jmp short flddtr_4 770 flddtr_1: 771 00000406 3C06 cmp al, 06h 772 00000408 7700 ja short flddtr_2 773 flddtr_2: 774 0000040A C706[9C19]3136 mov word [ldd_row_fs], "16" 775 00000410 EB0A jmp short flddtr_4 776 flddtr_3: 777 00000412 3C0E cmp al, 0Eh 778 00000414 75F4 jne short flddtr_2 779 ; al = 0Bh or 0Ch 780 00000416 C706[9C19]3332 mov word [ldd_row_fs], "32" 781 flddtr_4: 782 0000041C 8B470C mov ax, [bx+ptSectors] 783 0000041F 8B570E mov dx, [bx+ptSectors+2] 784 00000422 81FA0001 cmp dx, 100h ; 8GB limit 785 00000426 720D jb short flddtr_6 ; display size as MB or KB 786 flddtr_5: 787 00000428 89D0 mov ax, dx 788 0000042A C1E805 shr ax, 5 ; / 32 789 ; GB 790 0000042D E83400 call convert_to_decimal 791 00000430 B84742 mov ax, 'GB' 792 00000433 EB26 jmp short flddtr_9 793 flddtr_6: 794 00000435 09D2 or dx, dx 795 00000437 750F jnz short flddtr_7 ; MB 796 00000439 3D0008 cmp ax, 2048 797 0000043C 7312 jnb short flddtr_8 ; MB 798 0000043E D1E8 shr ax, 1 ; / 2 799 ; KB 800 00000440 E82100 call convert_to_decimal 801 ; di points to unit location 802 00000443 B84B42 mov ax, 'KB' 803 00000446 EB13 jmp short flddtr_9 804 flddtr_7: 805 00000448 F6C21F test dl, 1Fh ; flat ? 806 0000044B 74DB jz short flddtr_5 807 0000044D C1E205 shl dx, 5 ; convert GB to MB 808 flddtr_8: 809 00000450 C1E80B shr ax, 11 ; / 2048 810 00000453 09D0 or ax, dx ; MB 811 ; MB 812 00000455 E80C00 call convert_to_decimal 813 00000458 B84D42 mov ax, 'MB' 814 flddtr_9: 815 0000045B AB stosw ; volume size unit (KB,MB,GB) 816 ;CRLF 817 0000045C B80D0A mov ax, 0A0Dh ; al = 0Dh, ah = 0Ah 818 0000045F AB stosw 819 00000460 28C0 sub al, al ; 0 820 00000462 AA stosb 821 00000463 C3 retn 822 823 convert_to_decimal: 824 00000464 89E5 mov bp, sp 825 00000466 B90A00 mov cx, 10 826 cvd_loop1: 827 00000469 31D2 xor dx, dx 828 0000046B F7F1 div cx 829 0000046D 52 push dx 830 0000046E 09C0 or ax, ax 831 00000470 75F7 jnz short cvd_loop1 832 00000472 BF[A319] mov di, ldd_row_sz 833 cvd_loop2: 834 00000475 58 pop ax 835 00000476 0430 add al, '0' 836 00000478 AA stosb 837 00000479 39EC cmp sp, bp 838 0000047B 75F8 jne short cvd_loop2 839 840 ; di points to unit location 841 0000047D C3 retn 842 843 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 844 ; disk read 845 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 846 847 read_hd_sector: 848 0000047E 803E[3C15]00 cmp byte [lba], 0 849 00000483 774E ja short read_lba_sector 850 851 read_chs_sector: 852 ; Derived from 'proc_write_chs_sector' in HDFORMAT.ASM (30/07/2011) 853 ; (TRDOS v1, Singlix FS formatting utility) 854 00000485 C606[CD1E]02 mov byte [rw], 2 ; read 855 0000048A EB05 jmp short chs_rw 856 857 write_chs_sector: 858 ; Derived from 'proc_write_chs_sector' in HDFORMAT.ASM (30/07/2011) 859 ; (TRDOS v1, Singlix FS formatting utility) 860 0000048C C606[CD1E]03 mov byte [rw], 3 ; write 861 ;jmp short chs_rw 862 chs_rw: 863 00000491 56 push si 864 00000492 51 push cx 865 chs_rw_0: 866 00000493 BF0500 mov di, 5 867 chs_rw_1: 868 00000496 52 push dx ; Linear sector # 869 00000497 50 push ax ; DX_AX = Linear address (sectors) 870 00000498 8B0E[3E15] mov cx, [sectors] 871 0000049C 53 push bx 872 873 0000049D E85C08 call div32 ; 32 bit divide 874 875 000004A0 89D9 mov cx, bx ; Sector (zero based) 876 000004A2 41 inc cx ; To make it 1 based 877 000004A3 51 push cx 878 000004A4 8B0E[4015] mov cx, [heads] 879 000004A8 E85108 call div32 ; Convert track to head & cyl 880 000004AB 88DE mov dh, bl ; BX = Head (max. FFh) 881 000004AD 59 pop cx ; AX=Cyl, DH=Head, CX=Sector 882 000004AE 5B pop bx ; ES:BX = Buffer 883 884 000004AF 8A16[3D15] mov dl, [drv] 885 000004B3 88C5 mov ch, al 886 000004B5 D0CC ror ah, 1 ; Rotate right 887 000004B7 D0CC ror ah, 1 888 000004B9 08E1 or cl, ah 889 chs_rw_2: 890 000004BB 8A26[CD1E] mov ah, [rw] ; 02h = read, 03h = write 891 000004BF B001 mov al, 01h 892 000004C1 CD13 int 13h ; BIOS Service func (ah) = 2/3 893 ; Read/Write disk sectors 894 ; AL-sec num CH-track CL-sec 895 ; DH-head DL-drive ES:BX-buffer 896 ; CF-flag AH-status AL-sectors written/read 897 ; If CF = 1 then AH = Error code (>0) 898 899 ;mov [error], ah 900 000004C3 7309 jnc short chs_rw_3 901 000004C5 4F dec di 902 000004C6 7406 jz short chs_rw_3 903 904 000004C8 30E4 xor ah, ah 905 ;mov dl, [drv] 906 000004CA CD13 int 13h ; BIOS Service func (ah) = 0 907 ; Reset disk system 908 000004CC EBED jmp short chs_rw_2 909 910 chs_rw_3: 911 000004CE 58 pop ax 912 000004CF 5A pop dx 913 000004D0 59 pop cx 914 000004D1 5E pop si 915 000004D2 C3 retn ; db 0C3h 916 917 read_lba_sector: 918 ; trhdboot.s (2020), hdformat.asm (2011) 919 000004D3 C606[CD1E]42 mov byte [rw], 42h 920 000004D8 EB0C jmp short lba_rw 921 922 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 923 ; disk write 924 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 925 926 write_hd_sector: 927 000004DA 803E[3C15]00 cmp byte [lba], 0 928 000004DF 76AB jna short write_chs_sector 929 930 write_lba_sector: 931 ; trhdboot.s (2020), hdformat.asm (2011) 932 000004E1 C606[CD1E]43 mov byte [rw], 43h 933 ;jmp short lba_rw 934 lba_rw: 935 000004E6 BF0500 mov di, 5 936 lba_rw_1: 937 ;pusha ; db 60h 938 000004E9 60 db 60h 939 ;push 0 ; db 6Ah, 00h 940 000004EA 6A00 db 6Ah, 0 941 ;push 0 ; db 6Ah, 00h 942 000004EC 6A00 db 6Ah, 0 943 000004EE 52 push dx 944 000004EF 50 push ax 945 000004F0 06 push es 946 000004F1 53 push bx 947 ;push 1 ; db 6Ah, 01h 948 000004F2 6A01 db 6Ah, 01h 949 ;push 10h ; db 6Ah, 10h 950 000004F4 6A10 db 6Ah, 10h 951 952 000004F6 89E6 mov si, sp 953 000004F8 8A16[3D15] mov dl, [drv] 954 000004FC 30C0 xor al, al ; verify off 955 lba_rw_2: 956 000004FE 8A26[CD1E] mov ah, [rw] ; 42h = LBA read, 43h = LBA write 957 ;xor al, al ; verify off 958 00000502 CD13 int 13h 959 960 ;mov [error], ah 961 00000504 730D jnc short lba_rw_3 962 963 00000506 4F dec di 964 00000507 740A jz short lba_rw_3 965 966 00000509 30E4 xor ah, ah 967 ;mov dl, [drv] 968 0000050B CD13 int 13h ; BIOS Service func (ah) = 0 969 ; Reset disk system 970 971 ;mov word [si+2], 1 ; set r/w count to 1 again 972 0000050D C6440201 mov byte [si+2], 1 973 974 00000511 EBEB jmp short lba_rw_2 975 976 lba_rw_3: 977 ;popa 978 00000513 61 db 61h 979 ;popa 980 00000514 61 db 61h 981 00000515 C3 retn 982 983 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 984 ; FAT32 FORMATTING 985 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 986 987 ; ((TRDOS 386 criter)) 988 ; Minimum size of FAT32 FS = 65525 + 512 + 512 + 32 989 ; >= 66581 sectors (or >= 65525 data clusters) 990 991 format_FAT32_fs: 992 ;mov ax, 000Ch ; db 0Ch, 00h ; 'or al, 0' 993 ;cmp dl, al ; 0Ch 994 ;je short FAT32_lba_format 995 ;mov ax, 0C00Bh ; db 0Bh, 0C0h ; 'or ax, ax' 996 ;FAT32_lba_format: 997 ; Put TRDOS 386 FAT32 partition magic word 998 ; at offset 5Ah, in TRDOS386 FAT32 boot sector 0. 999 00000516 BD[3C0D] mov bp, TRDOS_FAT32_hd_bs 1000 00000519 8D7E03 lea di, [bp+3] 1001 0000051C BE[3A1A] mov si, bs_oem_name 1002 0000051F B90400 mov cx, 4 1003 00000522 F3A5 rep movsw 1004 ;mov [bp+5Ah], ax ; [loc_5A] 1005 00000524 C7465A0BC0 mov word [bp+5Ah], 0C00Bh 1006 00000529 A1[3E15] mov ax, [sectors] 1007 0000052C 894618 mov [bp+18h], ax ; [BPB_SecPerTrk] 1008 0000052F A1[4015] mov ax, [heads] 1009 00000532 89461A mov [bp+1Ah], ax ; [BPB_NumHeads] 1010 00000535 A1[D01E] mov ax, [dosp_start] 1011 00000538 89461C mov [bp+1Ch], ax ; [BPB_HiddSec] 1012 0000053B A1[D21E] mov ax, [dosp_start+2] 1013 0000053E 89461E mov [bp+1Eh], ax ; [BPB_HiddSec+2] 1014 00000541 A1[D41E] mov ax, [dosp_size] 1015 00000544 894620 mov [bp+20h], ax ; [BPB_TotSec32] 1016 00000547 8B16[D61E] mov dx, [dosp_size+2] 1017 0000054B 895622 mov [bp+22h], dx ; [BPB_TotSec32+2] 1018 1019 ; Sectors per cluster calculation 1020 ; (According to MS FAT32 FS specification.) 1021 0000054E B108 mov cl, 8 ; 8 sectors per cluster 1022 00000550 83FA08 cmp dx, 8 ; >= 532480 sectors 1023 00000553 7709 ja short FAT32_f_2 ; 8 sectors per cluster 1024 00000555 7205 jb short FAT32_f_1 ; 1 sector per cluster 1025 00000557 3D0020 cmp ax, 2000h ; dx_ax = (8*65536)+8192 1026 0000055A 7302 jnb short FAT32_f_2 1027 FAT32_f_1: 1028 0000055C B101 mov cl, 1 ; 1 sector per cluster 1029 FAT32_f_2: 1030 0000055E 884E0D mov [bp+0Dh], cl ; [BPB_SecPerClus] 1031 ;mov byte [bp+10h], 2 ; [BPB_NumFATs] 1032 ;mov word [bp+0Eh], 32 ; [BPB_RsvdSecCnt] 1033 1034 ; Calculating FAT size in sectors 1035 ; (According to MS FAT32 FS Specification, 2000) 1036 1037 ; DX_AX = partition (volume) size in sectors 1038 00000561 2B460E sub ax, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 32 1039 00000564 83DA00 sbb dx, 0 1040 ; TmpVal1 = DiskSize - (BPB_ResvdSecCnt + 1041 ; RootDirsectors) 1042 ; RootDirSectors = 0 (for FAT32 FS) 1043 00000567 89CB mov bx, cx ; ch = 0 1044 00000569 C1E308 shl bx, 8 ; * 256 1045 0000056C 8A4E10 mov cl, [bp+10h] ; [BPB_NumFATs] 1046 0000056F 01CB add bx, cx 1047 ; TmpVal2 = (256*BPB_SecPerClus)+BPB_NumFATs 1048 00000571 D1EB shr bx, 1 1049 ; TmpVal2 = TmpVal2/2 1050 00000573 89D9 mov cx, bx 1051 00000575 4B dec bx ; TmpVal2-1 1052 00000576 01D8 add ax, bx 1053 00000578 83D200 adc dx, 0 1054 0000057B E87E07 call div32 1055 ; FATSz = (TmpVal1+(TmpVal2-1))/TmpVal2 1056 ; DX_AX = FAT size in sectors 1057 0000057E 894624 mov [bp+24h], ax ; [BPB_FATSz32] 1058 00000581 895626 mov [bp+26h], dx ; [BPB_FATSz32+2] 1059 ; * 2 1060 00000584 89D3 mov bx, dx 1061 00000586 01C0 add ax, ax 1062 00000588 11D3 adc bx, dx 1063 ; BX_AX = [BPB_NumFATs] * [BPB_FATSz32] 1064 0000058A 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 32 1065 0000058D 01C1 add cx, ax 1066 0000058F 83D300 adc bx, 0 1067 ; BX_CX = [BPB_RsvdSecCnt]+[BPB_NumFATs]*[BPB_FATSz32] 1068 00000592 8B4620 mov ax, [bp+20h] ; [BPB_TotSec32] 1069 00000595 8B5622 mov dx, [bp+22h] ; [BPB_TotSec32+2] 1070 00000598 29C8 sub ax, cx 1071 0000059A 19DA sbb dx, bx 1072 0000059C 890E[2021] mov [data_start], cx 1073 000005A0 891E[2221] mov [data_start+2], bx 1074 ; DX_AX = Data sectors 1075 000005A4 A3[2421] mov [data_sectors], ax 1076 000005A7 8916[2621] mov [data_sectors+2], dx 1077 000005AB 8A4E0D mov cl, [bp+0Dh] ; [BPB_SecPerClus] 1078 000005AE 30ED xor ch, ch 1079 000005B0 E84907 call div32 ; DX_AX/CX 1080 ; DX_AX = Count of clusters (rounded down) 1081 000005B3 A3[2821] mov [cluster_count], ax 1082 000005B6 8916[2A21] mov [cluster_count+2], dx 1083 1084 000005BA 8D7E47 lea di, [bp+71] ; [BS_VolLab] 1085 000005BD E89B01 call write_volume_name 1086 000005C0 8D7643 lea si, [bp+67] ; [BS_VolID] 1087 000005C3 E8F401 call write_volume_serial 1088 000005C6 E8F402 call write_cluster_count 1089 1090 000005C9 E87502 call write_formatting_msg 1091 000005CC B000 mov al, 0 1092 000005CE E8CD02 call write_format_percent_x 1093 1094 000005D1 8B461C mov ax, [bp+1Ch] ; [BPB_HiddSec] 1095 000005D4 8B561E mov dx, [bp+1Eh] ; [BPB_HiddSec+2] 1096 000005D7 0106[2021] add [data_start], ax 1097 000005DB 1116[2221] adc [data_start+2], dx 1098 FAT32_f_3: 1099 ; DX_AX = FAT32 Boot Sector address 1100 000005DF BB[3C0D] mov bx, TRDOS_FAT32_hd_bs 1101 ; ES:BX = Boot Sector 1 Buffer 1102 000005E2 E8F5FE call write_hd_sector 1103 000005E5 0F82BC02 jc formatting_error 1104 000005E9 E87902 call write_format_percent 1105 000005EC 83C001 add ax, 1 1106 000005EF 83D200 adc dx, 0 1107 000005F2 BB[C81C] mov bx, HDFORMAT_FSINFO_BUFF 1108 ; ES:BX = FS INFO Sector Buffer (= BS+1) 1109 000005F5 E8E2FE call write_hd_sector 1110 000005F8 0F82A902 jc formatting_error 1111 000005FC E86602 call write_format_percent 1112 000005FF 83C001 add ax, 1 1113 00000602 83D200 adc dx, 0 1114 00000605 BB[3C0F] mov bx, TRDOS_FAT32_hd_bs + 512 1115 ; ES:BX = Boot Sector 2 Buffer 1116 00000608 E8CFFE call write_hd_sector 1117 0000060B 0F829602 jc formatting_error 1118 0000060F E85302 call write_format_percent 1119 00000612 B90300 mov cx, 3 1120 FAT32_f_4: 1121 00000615 51 push cx 1122 00000616 83C001 add ax, 1 1123 00000619 83D200 adc dx, 0 1124 0000061C BB[D81E] mov bx, HDFORMAT_EMPTY_BUFF 1125 0000061F E8B8FE call write_hd_sector 1126 00000622 0F827F02 jc formatting_error 1127 00000626 E83C02 call write_format_percent 1128 00000629 59 pop cx 1129 0000062A FEC9 dec cl 1130 0000062C 75E7 jnz short FAT32_f_4 1131 0000062E 83C001 add ax, 1 1132 00000631 83D200 adc dx, 0 1133 00000634 8B4E1C mov cx, [bp+1Ch] ; [BPB_HiddSec] 1134 00000637 8B5E1E mov bx, [bp+1Eh] ; [BPB_HiddSec+2] 1135 0000063A 83C10C add cx, 12 1136 0000063D 83D300 adc bx, 0 1137 ; write BACKUP sectors 1138 ; (6,7,8 boot+fsi and 9,10,11 empty sectors) 1139 00000640 39DA cmp dx, bx 1140 00000642 729B jb short FAT32_f_3 1141 00000644 39C8 cmp ax, cx 1142 00000646 7297 jb short FAT32_f_3 1143 ; write remain part of reserved sectors 1144 00000648 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] 1145 0000064B 83E90C sub cx, 12 1146 0000064E 7618 jna short FAT32_f_6 1147 FAT32_f_5: 1148 00000650 51 push cx 1149 00000651 BB[D81E] mov bx, HDFORMAT_EMPTY_BUFF 1150 00000654 E883FE call write_hd_sector 1151 00000657 0F824A02 jc formatting_error 1152 0000065B E80702 call write_format_percent 1153 0000065E 83C001 add ax, 1 1154 00000661 83D200 adc dx, 0 1155 00000664 59 pop cx 1156 00000665 49 dec cx 1157 00000666 75E8 jnz short FAT32_f_5 1158 FAT32_f_6: 1159 ; write FAT sectors 1160 00000668 8B0E[2021] mov cx, [data_start] ; lba/abs addr 1161 0000066C 8B1E[2221] mov bx, [data_start+2] ; lba/abs addr 1162 00000670 53 push bx 1163 00000671 51 push cx 1164 00000672 BB[D81E] mov bx, HDFORMAT_FATBUFFER 1165 ; ES:BX = FAT Sector Buffer 1166 00000675 8A4E15 mov cl, [bp+15h] ; [BPB_Media] 1167 00000678 B5FF mov ch, 0FFh 1168 0000067A 890F mov [bx], cx 1169 0000067C 88E9 mov cl, ch ; cx = 0FFFFh 1170 0000067E 894F02 mov [bx+2], cx 1171 00000681 894F04 mov [bx+4], cx 1172 00000684 894F06 mov [bx+6], cx 1173 ; Root dir cluster number = 2 1174 ; 0FFFFFFFh = end of cluster chain 1175 00000687 894F08 mov [bx+8], cx ; 0FFFFh 1176 0000068A 80E50F and ch, 0Fh 1177 0000068D 894F0A mov [bx+10], cx ; 0FFFh 1178 ;inc cx 1179 00000690 E847FE call write_hd_sector 1180 00000693 0F820E02 jc formatting_error 1181 00000697 E8CB01 call write_format_percent 1182 ;mov bx, HDFORMAT_FATBUFFER 1183 0000069A B90000 mov cx, 0 1184 0000069D 890F mov [bx], cx 1185 0000069F 894F02 mov [bx+2], cx 1186 000006A2 894F04 mov [bx+4], cx 1187 000006A5 894F06 mov [bx+6], cx 1188 000006A8 894F08 mov [bx+8], cx 1189 000006AB 894F0A mov [bx+10], cx 1190 000006AE EB0F jmp short FAT32_f_8 1191 FAT32_f_7: 1192 000006B0 53 push bx 1193 000006B1 51 push cx 1194 000006B2 BB[D81E] mov bx, HDFORMAT_FATBUFFER 1195 000006B5 E822FE call write_hd_sector 1196 000006B8 0F82E901 jc formatting_error 1197 000006BC E8A601 call write_format_percent 1198 FAT32_f_8: 1199 000006BF 59 pop cx 1200 000006C0 5B pop bx 1201 000006C1 83C001 add ax, 1 1202 000006C4 83D200 adc dx, 0 1203 000006C7 39DA cmp dx, bx 1204 000006C9 72E5 jb short FAT32_f_7 1205 000006CB 39C8 cmp ax, cx 1206 000006CD 72E1 jb short FAT32_f_7 1207 1208 ; write root directory (1st cluster) 1209 ; as empty sectors 1210 000006CF 8A4E0D mov cl, [bp+0Dh] ; [BPB_SecPerClus] 1211 000006D2 30ED xor ch, ch 1212 000006D4 290E[2421] sub [data_sectors], cx 1213 000006D8 831E[2621]00 sbb word [data_sectors+2], 0 1214 FAT32_f_9: 1215 000006DD 51 push cx 1216 000006DE BB[D81E] mov bx, HDFORMAT_EMPTY_BUFF 1217 000006E1 E8F6FD call write_hd_sector 1218 000006E4 0F82BD01 jc formatting_error 1219 000006E8 E87A01 call write_format_percent 1220 000006EB 83C001 add ax, 1 1221 000006EE 83D200 adc dx, 0 1222 000006F1 59 pop cx 1223 000006F2 FEC9 dec cl 1224 000006F4 75E7 jnz short FAT32_f_9 1225 1226 ; write DATA sectors 1227 ; (after root directory 1st cluster) 1228 000006F6 8B0E[2421] mov cx, [data_sectors] 1229 000006FA 8B1E[2621] mov bx, [data_sectors+2] 1230 ; NOTE: Partition size must be >= 512 MB 1231 ; for FAT32 FS ((BX >= 15)) 1232 FAT32_f_10: 1233 000006FE 53 push bx 1234 000006FF 51 push cx 1235 00000700 BB[C81A] mov bx, HDFORMAT_SECBUFFER 1236 00000703 E8D4FD call write_hd_sector 1237 00000706 0F829B01 jc formatting_error 1238 0000070A E85801 call write_format_percent 1239 0000070D 59 pop cx 1240 0000070E 5B pop bx 1241 0000070F 83C001 add ax, 1 1242 00000712 83D200 adc dx, 0 1243 00000715 49 dec cx 1244 00000716 75E6 jnz short FAT32_f_10 1245 00000718 4B dec bx 1246 00000719 75E3 jnz short FAT32_f_10 1247 1248 ; If there are, format remain sectors which are 1249 ; at beyond of data clusters, with zero bytes. 1250 1251 0000071B 8B4E1C mov cx, [bp+1Ch] ; [BPB_HiddSec] 1252 0000071E 8B5E1E mov bx, [bp+1Eh] ; [BPB_HiddSec+2] 1253 FAT16_f_18: 1254 00000721 034E20 add cx, [bp+20h] ; [BPB_TotSec32] 1255 00000724 135E22 adc bx, [bp+22h] ; [BPB_TotSec32+2] 1256 FAT16_f_19: 1257 FAT12_f_8: 1258 ; are there remain sectors (in partition) ? 1259 00000727 29C1 sub cx, ax 1260 00000729 19D3 sbb bx, dx 1261 ; 11/02/2019 1262 ; BX must be 0 (Because, 1 cluster <= 32KB. So, 1263 ; remain sectors must not be more than 32K) 1264 0000072B 751C jnz short FAT32_f_12 ; There is a wrong thing !!! 1265 ; If BX is not zero, 1266 ; it is better to skip this stage...) 1267 0000072D 09C9 or cx, cx 1268 0000072F 7418 jz short FAT32_f_12 ; no.. 1269 ; (good! FAT contains all data sectors) 1270 FAT32_f_11: 1271 00000731 51 push cx 1272 00000732 BB[D81E] mov bx, HDFORMAT_EMPTY_BUFF 1273 00000735 E8A2FD call write_hd_sector 1274 00000738 0F826901 jc formatting_error 1275 0000073C E82601 call write_format_percent 1276 0000073F 59 pop cx 1277 00000740 83C001 add ax, 1 1278 00000743 83D200 adc dx, 0 1279 00000746 49 dec cx 1280 00000747 75E8 jnz short FAT32_f_11 1281 1282 FAT32_f_12: 1283 ; End of FAT format routine... 1284 end_of_formatting: 1285 00000749 B064 mov al, 100 1286 0000074B E85001 call write_format_percent_x 1287 ;mov si, CRLF 1288 ;call print_msg 1289 0000074E BE[7B17] mov si, _msg_OK 1290 ;call print_msg 1291 00000751 E912FC jmp Exit 1292 1293 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1294 ; set & write volume name 1295 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1296 1297 write_fs_volume_name: 1298 00000754 C606[391A]40 mov byte [vname_length], 64 1299 00000759 EB05 jmp short svn_fs 1300 1301 write_volume_name: 1302 0000075B C606[391A]0B mov byte [vname_length], 11 1303 svn_fs: 1304 ; DI = (BS) Volume Label address 1305 00000760 BE[501A] mov si, Msg_Volume_Name 1306 00000763 E814FC call print_msg 1307 1308 ; get cursor position 1309 ; bh = 0 ; video page 1310 00000766 B403 mov ah, 3 ; get cursor pos 1311 00000768 CD10 int 10h 1312 0000076A 8916[B018] mov [Cursor_Pos], dx 1313 1314 0000076E E8F904 call rw_char 1315 00000771 7207 jc short svn_1 1316 svn_0: 1317 00000773 AC lodsb 1318 00000774 3C20 cmp al, 20h 1319 00000776 7706 ja short svn_2 1320 00000778 74F9 je short svn_0 1321 svn_1: 1322 0000077A BE[441A] mov si, no_name 1323 0000077D AC lodsb 1324 svn_2: 1325 ;mov di, [bp+47h) ; [BS_VolLab] ; FAT32 1326 ;mov di, [bp+2Bh) ; [BS_VolLab] ; FAT16 (&FAT12) 1327 0000077E 89FB mov bx, di ; * 1328 00000780 30ED xor ch, ch 1329 00000782 8A0E[391A] mov cl, [vname_length] ; 11 1330 00000786 EB05 jmp short svn_4 1331 svn_3: 1332 00000788 AC lodsb 1333 00000789 3C20 cmp al, 20h 1334 0000078B 7226 jb short svn_6 1335 svn_4: 1336 0000078D AA stosb 1337 0000078E E2F8 loop svn_3 1338 svn_5: 1339 00000790 8A0E[391A] mov cl, [vname_length] ; 11 1340 00000794 89DE mov si, bx ; * 1341 00000796 BF[3421] mov di, StrVolumeName 1342 00000799 F3A4 rep movsb 1343 ;mov byte [di], 0 1344 1345 0000079B 8B16[B018] mov dx, [Cursor_Pos] 1346 0000079F BB0700 mov bx, 7 1347 000007A2 B402 mov ah, 2 1348 000007A4 CD10 int 10h ; Set Cursor Position 1349 1350 000007A6 BE[3421] mov si, StrVolumeName 1351 000007A9 E8CEFB call print_msg 1352 000007AC BE[B21A] mov si, CRLF 1353 000007AF E8C8FB call print_msg 1354 000007B2 C3 retn 1355 svn_6: 1356 000007B3 B020 mov al, 20h 1357 svn_7: 1358 000007B5 AA stosb 1359 000007B6 E2FD loop svn_7 1360 000007B8 EBD6 jmp short svn_5 1361 1362 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1363 ; set & write volume serial number (volume ID) 1364 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1365 1366 write_volume_serial: 1367 ; SI = (BS) Volume Serial Number (binary) address 1368 1369 ;xor ax, ax 1370 ;int 1Ah ; get time of day 1371 1372 ;mov [si], dx 1373 ;mov [si+2], cx ; set unique volume ID 1374 1375 ;mov ah, 02h ; Return Current Time 1376 ;int 1Ah 1377 ;xchg ch, cl 1378 ;xchg dh, dl 1379 1380 ;add cx, dx 1381 ;add [si+2], cx 1382 1383 ;mov ah, 04h ; Return Current Date 1384 ;int 1Ah 1385 1386 ;xchg ch,cl 1387 ;xchg dh,dl 1388 1389 ;add cx, dx 1390 ;add [si+2], cx 1391 1392 ; According to Microsoft DOS 6.0 serial number 1393 ; production method... 1394 ; < Create unique 32 bit serial number > 1395 1396 ; Create_Serial_ID (MSDOS 6.0 Source code, MSFOR.ASM) 1397 ; (20/04/1987) 1398 ; 1399 ; Get date (INT 21h, AH=2Bh) 1400 ; Get time (INT 21h, AH=2Ch) 1401 ; Serial_ID+0 = DX reg date + DX reg time 1402 ; Serial_ID+2 = CX reg date + CX reg time 1403 ; Serial_Num_Low = Serial_ID+2 1404 ; Serial_Num_High = Serial_ID+0 1405 1406 000007BA B404 mov ah, 04h ; Return Current Date 1407 000007BC CD1A int 1Ah 1408 1409 ; DL = Day (BCD) (20h) 1410 ; DH = Month (BCD) (12h) 1411 ; CH = Century (BCD) (20h) 1412 ; CL = Year (BCD) (17h) 1413 1414 000007BE 88D0 mov al, dl 1415 000007C0 E87100 call bcd_to_bin 1416 000007C3 88C2 mov dl, al 1417 000007C5 88F0 mov al, dh 1418 000007C7 E86A00 call bcd_to_bin 1419 000007CA 88C6 mov dh, al 1420 000007CC 88C8 mov al, cl 1421 000007CE E86300 call bcd_to_bin 1422 000007D1 88C1 mov cl, al 1423 000007D3 88E8 mov al, ch 1424 000007D5 E85C00 call bcd_to_bin 1425 000007D8 88C5 mov ch, al 1426 1427 ; DH = Month (1-10) 1428 ; DL = Day (1-31) 1429 ; CX = Year (1900-2099) 1430 1431 000007DA 52 push dx 1432 000007DB 51 push cx 1433 1434 000007DC B402 mov ah, 02h ; Return Current Time 1435 000007DE CD1A int 1Ah 1436 1437 ; DH = Seconds (BCD) (59h) 1438 ; CL = Minutes (BCD) (59h) 1439 ; CH = Hours (BCD) (23h) 1440 ; DL = Daylight savings time option (1=yes) 1441 1442 000007E0 88F0 mov al, dh 1443 000007E2 E84F00 call bcd_to_bin 1444 000007E5 88C6 mov dh, al 1445 000007E7 88C8 mov al, cl 1446 000007E9 E84800 call bcd_to_bin 1447 000007EC 88C1 mov cl, al 1448 000007EE 88E8 mov al, ch 1449 000007F0 E84100 call bcd_to_bin 1450 000007F3 88C5 mov ch, al 1451 1452 ; CH = Hour (0-23) 1453 ; CL = Minutes (0-59) 1454 ; DH = Seconds (0-59) 1455 ; ((DL = Hundredths (0-99) - MSDOS!)) 1456 ; DL = 0 or 1 (here!) 1457 1458 000007F5 89C8 mov ax, cx 1459 000007F7 59 pop cx 1460 000007F8 01C8 add ax, cx 1461 1462 000007FA 894402 mov [si+2], ax 1463 1464 000007FD 89D0 mov ax, dx 1465 000007FF 5A pop dx 1466 00000800 01D0 add ax, dx 1467 1468 00000802 8904 mov [si], ax 1469 1470 00000804 30E4 xor ah, ah ; Read time counter 1471 00000806 CD1A int 1Ah 1472 1473 ; CX = High word of clock count 1474 ; DX = Low word of clock count 1475 ; AL = 0 if 24 hours has not passed, else 1 1476 1477 ; NOTES: 1478 ; (Ref: vitaly_filatov.tripod.com/ng/asm/asT_3029.1.html) 1479 ; 1480 ; Following formulas convert the clock count to 1481 ; the time of day: 1482 ; Hour = Clock / 65543 (1007h) 1483 ; Remainder = Clock MOD 65543 1484 ; 1485 ; Minutes = Remainder / 1092 (444h) 1486 ; Remainder = Remainder MOD 1092 1487 ; 1488 ; Second = Remainder / 18.21 1489 ; Remainder = Remainder MOD 18.21 1490 ; 1491 ; Hundredths = CINT(Remainder * 100) 1492 1493 00000808 0014 add [si], dl 1494 1495 ; SI = Volume serial number address (4 bytes) 1496 0000080A 8A04 mov al, [si] 1497 0000080C E81205 call bin_to_hex 1498 0000080F A3[7B1A] mov [Vol_Serial2+2], ax 1499 00000812 8A4401 mov al, [si+1] 1500 00000815 E80905 call bin_to_hex 1501 00000818 A3[791A] mov [Vol_Serial2], ax 1502 0000081B 8A4402 mov al, [si+2] 1503 0000081E E80005 call bin_to_hex 1504 00000821 A3[761A] mov [Vol_Serial1+2], ax 1505 00000824 8A4403 mov al, [si+3] 1506 00000827 E8F704 call bin_to_hex 1507 0000082A A3[741A] mov [Vol_Serial1], ax 1508 1509 0000082D BE[621A] mov si, Msg_Volume_Serial 1510 00000830 E847FB call print_msg 1511 1512 00000833 C3 retn 1513 1514 bcd_to_bin: 1515 00000834 53 push bx 1516 00000835 D410 db 0D4h,10h ; Undocumented inst. AAM 1517 ; AH = AL / 10h 1518 ; AL = AL MOD 10h 1519 00000837 88C3 mov bl, al 1520 00000839 B00A mov al, 10 1521 0000083B F6E4 mul ah 1522 0000083D 00D8 add al, bl 1523 0000083F 5B pop bx 1524 00000840 C3 retn 1525 1526 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1527 ; write formatting percentage 1528 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1529 1530 write_formatting_msg: 1531 00000841 A1[D41E] mov ax, [dosp_size] 1532 00000844 8B16[D61E] mov dx, [dosp_size+2] 1533 1534 ; DX_AX = Total sectors for percentage 1535 00000848 B96400 mov cx, 100 1536 0000084B E8AE04 call div32 1537 0000084E A3[2E21] mov [format_percent], ax 1538 1539 00000851 BE[9A1A] mov si, msg_formatting 1540 00000854 E823FB call print_msg 1541 1542 ; get cursor position 1543 ; bh = 0 ; video page 1544 00000857 B403 mov ah, 3 ; get cursor pos 1545 00000859 CD10 int 10h 1546 0000085B 8916[B018] mov [Cursor_Pos], dx 1547 1548 0000085F C606[3021]FF mov byte [prev_percent], 255 1549 1550 00000864 C3 retn 1551 1552 write_format_percent: 1553 ; DX_AX = Current sector (which has been written) 1554 1555 00000865 50 push ax 1556 00000866 52 push dx 1557 00000867 53 push bx 1558 00000868 51 push cx 1559 00000869 56 push si 1560 1561 0000086A 2B461C sub ax, [bp+1Ch] ; [BPB_HiddSec] 1562 0000086D 1B561E sbb dx, [bp+1Eh] ; [BPB_HiddSec+2] 1563 wpc_t: 1564 00000870 8B0E[2E21] mov cx, [format_percent] 1565 00000874 E88504 call div32 1566 ; AL = percentage value between 1 to 100 1567 wpc_x: 1568 00000877 3A06[3021] cmp al, [prev_percent] 1569 0000087B 741B je short wpc_y 1570 0000087D A2[3021] mov [prev_percent], al 1571 00000880 8B16[B018] mov dx, [Cursor_Pos] 1572 00000884 BB0700 mov bx, 7 1573 00000887 B402 mov ah, 2 1574 00000889 CD10 int 10h ; Set Cursor Position 1575 0000088B 31D2 xor dx, dx 1576 0000088D 30E4 xor ah, ah 1577 ;mov al, [prev_percent] 1578 0000088F BE[A81A] mov si, format_percent_str + 2 1579 00000892 E87504 call bin_to_decimal 1580 00000895 E8E2FA call print_msg 1581 wpc_y: 1582 00000898 5E pop si 1583 00000899 59 pop cx 1584 0000089A 5B pop bx 1585 0000089B 5A pop dx 1586 0000089C 58 pop ax 1587 0000089D C3 retn 1588 1589 write_format_percent_x: 1590 ; AL = % number 1591 1592 0000089E 50 push ax 1593 0000089F 52 push dx 1594 000008A0 53 push bx 1595 000008A1 51 push cx 1596 000008A2 56 push si 1597 1598 000008A3 EBD2 jmp short wpc_x 1599 1600 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1601 ; format error 1602 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1603 1604 formatting_error: 1605 000008A5 8B26[3221] mov sp, [old_sp] 1606 1607 000008A9 88E0 mov al, ah ; error code 1608 000008AB E87304 call bin_to_hex 1609 000008AE A3[C01A] mov [error_code], ax 1610 1611 000008B1 BE[B21A] mov si, CRLF 1612 000008B4 E8C3FA call print_msg 1613 1614 000008B7 BE[B51A] mov si, Msg_Error 1615 ;call print_msg 1616 000008BA E9A9FA jmp Exit 1617 1618 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1619 ; write cluster count 1620 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1621 1622 write_cluster_count: 1623 000008BD BE[801A] mov si, msg_cluster_count 1624 000008C0 E8B7FA call print_msg 1625 000008C3 A1[2821] mov ax, [cluster_count] 1626 000008C6 8B16[2A21] mov dx, [cluster_count+2] 1627 000008CA BE[961A] mov si, cluster_count_str+6 1628 000008CD E83A04 call bin_to_decimal 1629 000008D0 E8A7FA call print_msg 1630 000008D3 C3 retn 1631 1632 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1633 ; FAT16 FORMATTING 1634 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1635 1636 ; ((TRDOS 386 criter)) 1637 ; Minimum size of FAT16 FS = [heads]*[sectors] 1638 ; (1 cylinder) or 4096 sectors (for TRDOS 386) 1639 1640 format_FAT16_fs: 1641 000008D4 B80607 mov ax, 0706h ; db 06h, 07h ; 'push es, pop es' 1642 000008D7 38C2 cmp dl, al ; 06h ; Big CHS partition (>= 32MB) 1643 000008D9 7403 je short FAT16_big_chs_format 1644 ;mov ax, 070Eh ; db 0Eh, 07h ; 'push cs, pop es' 1645 ;cmp dl, al ; 0Eh ; LBA partition 1646 ;je short FAT16_lba_format 1647 FAT16_chs_format: 1648 ; Partition Type: 04h, CHS (<32 MB) partition 1649 000008DB B80400 mov ax, 0004h ; db 04h, 00h ; 'add al, 0' 1650 FAT16_big_chs_format: 1651 ;FAT16_lba_format: 1652 ; Put TRDOS 386 FAT16 partition magic word 1653 ; at offset 3Eh, in TRDOS386 FAT16 boot sector. 1654 000008DE BD[3C11] mov bp, TRDOS_FAT16_hd_bs 1655 000008E1 8D7E03 lea di, [bp+3] 1656 000008E4 BE[3A1A] mov si, bs_oem_name 1657 000008E7 B90400 mov cx, 4 1658 000008EA F3A5 rep movsw 1659 000008EC 89463E mov [bp+3Eh], ax ; [loc_3E] 1660 1661 000008EF A1[3E15] mov ax, [sectors] 1662 000008F2 894618 mov [bp+18h], ax ; [BPB_SecPerTrk] 1663 000008F5 A1[4015] mov ax, [heads] 1664 000008F8 89461A mov [bp+1Ah], ax ; [BPB_NumHeads] 1665 000008FB A1[D01E] mov ax, [dosp_start] 1666 000008FE 89461C mov [bp+1Ch], ax ; [BPB_HiddSec] 1667 00000901 A1[D21E] mov ax, [dosp_start+2] 1668 00000904 89461E mov [bp+1Eh], ax ; [BPB_HiddSec+2] 1669 00000907 A1[D41E] mov ax, [dosp_size] 1670 0000090A 8B16[D61E] mov dx, [dosp_size+2] 1671 0000090E 21D2 and dx, dx 1672 00000910 7505 jnz short FAT16_f_0 1673 00000912 894613 mov [bp+13h], ax ; [BPB_TotSec16] 1674 ; CX = 0 1675 ;mov [bp+20h], cx ; [BPB_TotSec32] = 0 1676 ;mov [bp+22h], cx ; [BPB_TotSec32+2] = 0 1677 00000915 EB06 jmp short FAT16_f_1 1678 FAT16_f_0: 1679 00000917 894620 mov [bp+20h], ax ; [BPB_TotSec32] 1680 0000091A 895622 mov [bp+22h], dx ; [BPB_TotSec32+2] 1681 ; CX = 0 1682 ;mov [bp+13h], cx ; [BPB_TotSec16] = 0 1683 FAT16_f_1: 1684 ; Sectors per cluster calculation 1685 ; (According to MS FAT32 FS specification.) 1686 0000091D B102 mov cl, 2 ; 2 sectors per cluster 1687 0000091F 09D2 or dx, dx 1688 00000921 7507 jnz short FAT16_f_2 ; >2 sectors (>16MB) 1689 00000923 3DA87F cmp ax, 32680 1690 00000926 763C jna short FAT16_f_10 ; 2 sectors, <=16MB 1691 ; > 16MB 1692 00000928 EB38 jmp short FAT16_f_9 ; 4 sectors per cluster 1693 FAT16_f_2: 1694 0000092A 83FA04 cmp dx, 4 ; >= 262144 sectors ; >=128MB 1695 0000092D 7708 ja short FAT16_f_3 ; >4 sectors per cluster 1696 0000092F 7231 jb short FAT16_f_9 ; 4 sectors per cluster 1697 00000931 09C0 or ax, ax ; dx_ax = (4*65536)+0 1698 00000933 742D jz short FAT16_f_9 ; 4 sectors per cluster 1699 00000935 EB29 jmp short FAT16_f_8 ; 8 sectors per cluster 1700 FAT16_f_3: 1701 00000937 83FA08 cmp dx, 8 ; >= 524288 sectors ; >=256MB 1702 0000093A 7708 ja short FAT16_f_4 ; >8 sectors per cluster 1703 0000093C 7222 jb short FAT16_f_8 ; 8 sectors per cluster 1704 0000093E 21C0 and ax, ax ; dx_ax = (8*65536)+0 1705 00000940 741E jz short FAT16_f_8 ; 8 sectors per cluster 1706 00000942 EB1A jmp short FAT16_f_7 ; 16 sectors per cluster 1707 FAT16_f_4: 1708 00000944 83FA10 cmp dx, 16 ; >= 1048576 sectors ; >=512MB 1709 00000947 7708 ja short FAT16_f_5 ; >16 sectors per cluster 1710 00000949 7213 jb short FAT16_f_7 ; 16 sectors per cluster 1711 0000094B 21C0 and ax, ax ; dx_ax = (16*65536)+0 1712 0000094D 740F jz short FAT16_f_7 ; 16 sectors per cluster 1713 0000094F EB0B jmp short FAT16_f_6 ; 32 sectors per cluster 1714 FAT16_f_5: 1715 00000951 83FA20 cmp dx, 32 ; >= 2097152 sectors ; >=1GB 1716 00000954 7206 jb short FAT16_f_6 ; 32 sectors per cluster 1717 00000956 09C0 or ax, ax ; dx_ax = (32*65536)+0 1718 00000958 7402 jz short FAT16_f_6 ; 32 sectors per cluster 1719 ; >1GB (<=2GB) 1720 ; 64 sectors per cluster 1721 0000095A D0E1 shl cl, 1 1722 FAT16_f_6: 1723 ; 32 sectors per cluster (for <= 2GB volumes) 1724 0000095C D0E1 shl cl, 1 1725 FAT16_f_7: 1726 ; 16 sectors per cluster (for <= 1GB volumes) 1727 0000095E D0E1 shl cl, 1 1728 FAT16_f_8: 1729 ; 8 sectors per cluster (for <= 512MB volumes) 1730 00000960 D0E1 shl cl, 1 1731 FAT16_f_9: 1732 ; 4 sectors per cluster (for <= 256MB volumes) 1733 00000962 D0E1 shl cl, 1 1734 FAT16_f_10: 1735 ; 2 sectors per cluster (for <= 128MB volumes) 1736 00000964 884E0D mov [bp+0Dh], cl ; [BPB_SecPerClus] 1737 ;mov byte [bp+10h], 2 ; [BPB_NumFATs] 1738 ;mov word [bp+0Eh], 1 ; [BPB_RsvdSecCnt] 1739 ;mov word [bp+11h], 512 ; [BPB_RootEntCnt] 1740 1741 ; Calculating FAT size in sectors 1742 ; (According to MS FAT32 FS Specification, 2000) 1743 1744 ; DX_AX = partition (volume) size in sectors 1745 00000967 8B5E11 mov bx, [bp+11h] ; [BPB_RootEntCnt] = 512 1746 0000096A 83C30F add bx, 15 ; bx = 527 1747 0000096D C1EB04 shr bx, 4 ; /16 = 527/16 = 32 1748 ; ((32*BX)+511)/512 1749 00000970 891E[2C21] mov [root_dir_secs], bx 1750 00000974 035E0E add bx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 1751 00000977 29D8 sub ax, bx 1752 00000979 83DA00 sbb dx, 0 1753 ; TmpVal1 = DiskSize - (BPB_ResvdSecCnt + 1754 ; RootDirsectors) 1755 ;mov bx, cx ; ch = 0 1756 ;shl bx, 8 ; * 256 1757 0000097C 88CF mov bh, cl 1758 0000097E 30DB xor bl, bl 1759 00000980 B102 mov cl, 2 ; [BPB_NumFATs] 1760 00000982 01CB add bx, cx 1761 ; TmpVal2 = (256*BPB_SecPerClus)+BPB_NumFATs 1762 00000984 89D9 mov cx, bx 1763 00000986 4B dec bx ; TmpVal2-1 1764 00000987 01D8 add ax, bx 1765 00000989 83D200 adc dx, 0 1766 0000098C E86D03 call div32 1767 ; FATSz = (TmpVal1+(TmpVal2-1))/TmpVal2 1768 ; AX = FAT size in sectors 1769 ; DX = 0 1770 0000098F 894616 mov [bp+16h], ax ; [BPB_FATSz16] 1771 ; * 2 1772 00000992 D1E0 shl ax, 1 1773 ; AX = [BPB_NumFATs] * [BPB_FATSz16] 1774 00000994 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 1775 00000997 01C1 add cx, ax 1776 ; CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 1777 00000999 030E[2C21] add cx, [root_dir_secs] ; + RootDirsectors 1778 0000099D 29DB sub bx, bx ; BX = 0 1779 ; BX_CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 1780 ; + RootDirSectors 1781 0000099F 8B4613 mov ax, [bp+13h] ; [BPB_TotSec16] 1782 ;sub dx, dx 1783 ; DX = 0 1784 000009A2 21C0 and ax, ax 1785 000009A4 7506 jnz short FAT16_f_11 1786 000009A6 8B4620 mov ax, [bp+20h] ; [BPB_TotSec32] 1787 000009A9 8B5622 mov dx, [bp+22h] ; [BPB_TotSec32+2] 1788 FAT16_f_11: 1789 000009AC 29C8 sub ax, cx 1790 000009AE 19DA sbb dx, bx 1791 000009B0 890E[2021] mov [data_start], cx 1792 000009B4 891E[2221] mov [data_start+2], bx 1793 ; DX_AX = Data sectors 1794 000009B8 A3[2421] mov [data_sectors], ax 1795 000009BB 8916[2621] mov [data_sectors+2], dx 1796 000009BF 8A4E0D mov cl, [bp+0Dh] ; [BPB_SecPerClus] 1797 000009C2 30ED xor ch, ch 1798 000009C4 E83503 call div32 ; DX_AX/CX 1799 ; AX = Count of clusters (rounded down) 1800 ; DX = 0 1801 000009C7 A3[2821] mov [cluster_count], ax 1802 000009CA 8916[2A21] mov [cluster_count+2], dx 1803 1804 000009CE 8D7E2B lea di, [bp+43] ; [BS_VolLab] 1805 000009D1 E887FD call write_volume_name 1806 000009D4 8D7627 lea si, [bp+39] ; [BS_VolID] 1807 000009D7 E8E0FD call write_volume_serial 1808 000009DA E8E0FE call write_cluster_count 1809 1810 000009DD E861FE call write_formatting_msg 1811 000009E0 B000 mov al, 0 1812 000009E2 E8B9FE call write_format_percent_x 1813 1814 000009E5 8B461C mov ax, [bp+1Ch] ; [BPB_HiddSec] 1815 000009E8 8B561E mov dx, [bp+1Eh] ; [BPB_HiddSec+2] 1816 1817 000009EB 0106[2021] add [data_start], ax 1818 000009EF 1116[2221] adc [data_start+2], dx 1819 1820 ; DX_AX = FAT16 Boot Sector address 1821 000009F3 BB[3C11] mov bx, TRDOS_FAT16_hd_bs 1822 ; ES:BX = Boot Sector Buffer 1823 000009F6 E8E1FA call write_hd_sector 1824 000009F9 0F82A8FE jc formatting_error 1825 000009FD E865FE call write_format_percent 1826 00000A00 83C001 add ax, 1 1827 00000A03 83D200 adc dx, 0 1828 ; write remain part of reserved sectors 1829 00000A06 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] 1830 ;sub cx, 1 1831 ;jna short FAT16_f_13 1832 00000A09 49 dec cx 1833 00000A0A 7418 jz short FAT16_f_13 1834 FAT16_f_12: 1835 00000A0C 51 push cx 1836 00000A0D BB[D81E] mov bx, HDFORMAT_EMPTY_BUFF 1837 00000A10 E8C7FA call write_hd_sector 1838 00000A13 0F828EFE jc formatting_error 1839 00000A17 E84BFE call write_format_percent 1840 00000A1A 83C001 add ax, 1 1841 00000A1D 83D200 adc dx, 0 1842 00000A20 59 pop cx 1843 00000A21 49 dec cx ; dec cl 1844 00000A22 75E8 jnz short FAT16_f_12 1845 FAT16_f_13: 1846 ; write FAT sectors 1847 00000A24 8B0E[2021] mov cx, [data_start] ; lba/abs addr 1848 00000A28 8B1E[2221] mov bx, [data_start+2] ; lba/abs addr 1849 1850 00000A2C 2B0E[2C21] sub cx, [root_dir_secs] 1851 00000A30 83DB00 sbb bx, 0 1852 1853 00000A33 53 push bx 1854 00000A34 51 push cx 1855 00000A35 BB[D81E] mov bx, HDFORMAT_FATBUFFER 1856 ; ES:BX = FAT Sector Buffer 1857 00000A38 8A4E15 mov cl, [bp+15h] ; [BPB_Media] 1858 00000A3B B5FF mov ch, 0FFh 1859 00000A3D 890F mov [bx], cx ; 0FFF8h 1860 00000A3F 88E9 mov cl, ch ; cx = 0FFFFh 1861 00000A41 894F02 mov [bx+2], cx 1862 ;inc cx 1863 00000A44 E893FA call write_hd_sector 1864 00000A47 0F825AFE jc formatting_error 1865 00000A4B E817FE call write_format_percent 1866 ;mov bx, HDFORMAT_FATBUFFER 1867 00000A4E B90000 mov cx, 0 1868 00000A51 890F mov [bx], cx 1869 00000A53 894F02 mov [bx+2], cx 1870 00000A56 EB0F jmp short FAT16_f_15 1871 FAT16_f_14: 1872 00000A58 53 push bx 1873 00000A59 51 push cx 1874 00000A5A BB[D81E] mov bx, HDFORMAT_FATBUFFER 1875 00000A5D E87AFA call write_hd_sector 1876 00000A60 0F8241FE jc formatting_error 1877 00000A64 E8FEFD call write_format_percent 1878 FAT16_f_15: 1879 00000A67 59 pop cx 1880 00000A68 5B pop bx 1881 00000A69 83C001 add ax, 1 1882 00000A6C 83D200 adc dx, 0 1883 00000A6F 39DA cmp dx, bx 1884 00000A71 72E5 jb short FAT16_f_14 1885 00000A73 39C8 cmp ax, cx 1886 00000A75 72E1 jb short FAT16_f_14 1887 1888 ; write root directory sectors 1889 ; as empty sectors 1890 00000A77 8B0E[2C21] mov cx, [root_dir_secs] 1891 FAT16_f_16: 1892 00000A7B 51 push cx 1893 00000A7C BB[D81E] mov bx, HDFORMAT_EMPTY_BUFF 1894 00000A7F E858FA call write_hd_sector 1895 00000A82 0F821FFE jc formatting_error 1896 00000A86 E8DCFD call write_format_percent 1897 00000A89 83C001 add ax, 1 1898 00000A8C 83D200 adc dx, 0 1899 00000A8F 59 pop cx 1900 00000A90 49 dec cx 1901 00000A91 75E8 jnz short FAT16_f_16 1902 1903 ; write DATA sectors 1904 ; (after root directory sectors) 1905 00000A93 8B0E[2421] mov cx, [data_sectors] 1906 00000A97 8B1E[2621] mov bx, [data_sectors+2] 1907 00000A9B 43 inc bx ; 0 -> 1, 1-> 2 1908 FAT16_f_17: 1909 00000A9C 53 push bx 1910 00000A9D 51 push cx 1911 00000A9E BB[C81A] mov bx, HDFORMAT_SECBUFFER 1912 00000AA1 E836FA call write_hd_sector 1913 00000AA4 0F82FDFD jc formatting_error 1914 00000AA8 E8BAFD call write_format_percent 1915 00000AAB 59 pop cx 1916 00000AAC 5B pop bx 1917 00000AAD 83C001 add ax, 1 1918 00000AB0 83D200 adc dx, 0 1919 00000AB3 49 dec cx 1920 00000AB4 75E6 jnz short FAT16_f_17 1921 00000AB6 4B dec bx 1922 00000AB7 75E3 jnz short FAT16_f_17 1923 1924 ; If there are, format remain sectors which are 1925 ; at beyond of data clusters, with zero bytes. 1926 1927 00000AB9 8B4E1C mov cx, [bp+1Ch] ; [BPB_HiddSec] 1928 00000ABC 8B5E1E mov bx, [bp+1Eh] ; [BPB_HiddSec+2] 1929 1930 00000ABF 837E1300 cmp word [bp+13h], 0 ; [BPB_TotSec16] 1931 00000AC3 0F845AFC jz FAT16_f_18 1932 00000AC7 034E13 add cx, [bp+13h] ; [BPB_TotSec16] 1933 00000ACA 83D300 adc bx, 0 1934 00000ACD E957FC jmp FAT16_f_19 1935 1936 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1937 ; FAT12 FORMATTING 1938 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1939 1940 ; ((TRDOS 386 criter)) 1941 ; Minimum size of FAT12 FS = [heads]*[sectors] 1942 ; (1 cylinder) 1943 1944 format_FAT12_fs: 1945 00000AD0 BD[3C13] mov bp, TRDOS_FAT12_hd_bs 1946 00000AD3 8D7E03 lea di, [bp+3] 1947 00000AD6 BE[3A1A] mov si, bs_oem_name 1948 00000AD9 B90400 mov cx, 4 1949 00000ADC F3A5 rep movsw 1950 00000ADE A1[3E15] mov ax, [sectors] 1951 00000AE1 894618 mov [bp+18h], ax ; [BPB_SecPerTrk] 1952 00000AE4 A1[4015] mov ax, [heads] 1953 00000AE7 89461A mov [bp+1Ah], ax ; [BPB_NumHeads] 1954 00000AEA A1[D01E] mov ax, [dosp_start] 1955 00000AED 89461C mov [bp+1Ch], ax ; [BPB_HiddSec] 1956 00000AF0 A1[D21E] mov ax, [dosp_start+2] 1957 00000AF3 89461E mov [bp+1Eh], ax ; [BPB_HiddSec+2] 1958 00000AF6 A1[D41E] mov ax, [dosp_size] 1959 00000AF9 894613 mov [bp+13h], ax ; [BPB_TotSec16] 1960 1961 00000AFC 31F6 xor si, si ; reset (FAT size fix) flag 1962 00000AFE 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 1963 00000B01 8B5611 mov dx, [bp+11h] ; [BPB_RootEntCnt] = 512 1964 00000B04 83C20F add dx, 15 ; (16-1) (512-1) 1965 00000B07 C1EA04 shr dx, 4 ; /16 (*32/512) 1966 ; AX = Root dir sectors 1967 ; CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 1968 00000B0A 01D1 add cx, dx ; + RootDirsectors ; + 32 1969 00000B0C 890E[2C21] mov [root_dir_secs], cx ; = 33 1970 1971 ;sub ax, 33 ; 1 reserved sector, 32 root dir sectors 1972 ; .. now AX has number of data sectors 1973 ; + 2* (FAT sectors) 1974 00000B10 29C8 sub ax, cx 1975 FAT12_f_10: 1976 ; Sectors per cluster calculation 1977 ; (According to MS FAT32 FS specification.) 1978 ;mov cx, 1 ; 1 sector per cluster 1979 00000B12 B101 mov cl, 1 ; CH = 0 1980 ; 28/10/2023 ; (BugFix) 1981 00000B14 50 push ax 1982 FAT12_f_0: 1983 00000B15 3DF50F cmp ax, 4085 ; Max. cluster count for FAT12 1984 00000B18 7206 jb short FAT12_f_1 1985 00000B1A D0E1 shl cl, 1 ; *2 1986 00000B1C D1E8 shr ax, 1 ; /2 1987 00000B1E EBF5 jmp short FAT12_f_0 1988 FAT12_f_1: 1989 ; 28/10/2023 1990 00000B20 58 pop ax 1991 00000B21 884E0D mov [bp+0Dh], cl ; [BPB_SecPerClus] 1992 ;mov byte [bp+10h], 2 ; [BPB_NumFATs] 1993 ;mov word [bp+0Eh], 1 ; [BPB_RsvdSecCnt] 1994 ;mov word [bp+11h], 512 ; [BPB_RootEntCnt] 1995 1996 ; Calculating FAT size in sectors 1997 ; AX = partition (volume, data) size in sectors 1998 ; CX = sectors per clusters 1999 00000B24 31D2 xor dx, dx 2000 00000B26 F7F1 div cx 2001 ; AX = cluster count (only for FAT size calc) 2002 ; DX = 0 2003 00000B28 83C002 add ax, 2 ; cluster 2 to ... 2004 00000B2B 89C2 mov dx, ax 2005 00000B2D D1E2 shl dx, 1 2006 00000B2F 01D0 add ax, dx ; *3 2007 00000B31 D1E8 shr ax, 1 ; /2 2008 00000B33 83D000 adc ax, 0 ; +0.5 -> +1 2009 2010 ; AX = FAT bytes for 12 bit cluster numbers 2011 2012 00000B36 B90002 mov cx, 512 ; [BPB_BytesPerSec] 2013 00000B39 01C8 add ax, cx 2014 00000B3B 48 dec ax ; [BPB_BytesPerSec] - 1 2015 00000B3C 29D2 sub dx, dx 2016 00000B3E F7F1 div cx 2017 00000B40 894616 mov [bp+16h], ax ; [BPB_FATSz16] 2018 ; * 2 2019 00000B43 D1E0 shl ax, 1 2020 ; AX = [BPB_NumFATs] * [BPB_FATSz16] 2021 2022 ;mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 2023 ;add cx, ax 2024 ;mov ax, [bp+11h] ; [BPB_RootEntCnt] = 512 2025 ;add ax, 15 ; (16-1) (512-1) 2026 ;shr ax, 4 ; /16 (*32/512) 2027 ;; AX = Root dir sectors 2028 ;; CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 2029 ;add cx, ax ; + RootDirsectors 2030 ;mov [root_dir_secs], ax 2031 2032 ;mov cx, 33 2033 00000B45 8B0E[2C21] mov cx, [root_dir_secs] 2034 00000B49 034E0E add cx, [bp+0Eh] ; [BPB_RsvdSecCnt] ; 1 2035 ; cx = root directory sectors + reserved sectors 2036 00000B4C 01C1 add cx, ax 2037 ; CX = [BPB_RsvdSecCnt]+([BPB_NumFATs]*[BPB_FATSz16]) 2038 ; + RootDirSectors 2039 00000B4E 8B4613 mov ax, [bp+13h] ; [BPB_TotSec16] 2040 00000B51 29C8 sub ax, cx 2041 ; AX = data sectors 2042 ; cH = 0 2043 2044 ; fix FAT size (better method) 2045 00000B53 09F6 or si, si 2046 00000B55 7504 jnz short FAT12_f_9 2047 2048 00000B57 89C6 mov si, ax ; ax = data sectors 2049 00000B59 EBB7 jmp short FAT12_f_10 2050 2051 FAT12_f_9: 2052 00000B5B 31D2 xor dx, dx 2053 00000B5D 890E[2021] mov [data_start], cx 2054 00000B61 8916[2221] mov [data_start+2], dx ; 0 2055 ; DX_AX = Data sectors 2056 00000B65 A3[2421] mov [data_sectors], ax 2057 00000B68 8916[2621] mov [data_sectors+2], dx ; 0 2058 00000B6C 8A4E0D mov cl, [bp+0Dh] ; [BPB_SecPerClus] 2059 00000B6F 28ED sub ch, ch 2060 00000B71 F7F1 div cx 2061 ; AX = Count of clusters (rounded down) 2062 00000B73 29D2 sub dx, dx ; 0 2063 00000B75 A3[2821] mov [cluster_count], ax 2064 00000B78 8916[2A21] mov [cluster_count+2], dx ; 0 2065 2066 00000B7C 8D7E2B lea di, [bp+43] ; [BS_VolLab] 2067 00000B7F E8D9FB call write_volume_name 2068 00000B82 8D7627 lea si, [bp+39] ; [BS_VolID] 2069 00000B85 E832FC call write_volume_serial 2070 00000B88 E832FD call write_cluster_count 2071 2072 00000B8B E8B3FC call write_formatting_msg 2073 00000B8E B000 mov al, 0 2074 00000B90 E80BFD call write_format_percent_x 2075 2076 00000B93 8B461C mov ax, [bp+1Ch] ; [BPB_HiddSec] 2077 00000B96 8B561E mov dx, [bp+1Eh] ; [BPB_HiddSec+2] 2078 2079 00000B99 0106[2021] add [data_start], ax 2080 00000B9D 1116[2221] adc [data_start+2], dx 2081 2082 ; DX_AX = FAT12 Boot Sector address 2083 00000BA1 BB[3C13] mov bx, TRDOS_FAT12_hd_bs 2084 ; ES:BX = Boot Sector Buffer 2085 00000BA4 E833F9 call write_hd_sector 2086 00000BA7 0F82FAFC jc formatting_error 2087 00000BAB E8B7FC call write_format_percent 2088 00000BAE 83C001 add ax, 1 2089 00000BB1 83D200 adc dx, 0 2090 ; write remain part of reserved sectors 2091 00000BB4 8B4E0E mov cx, [bp+0Eh] ; [BPB_RsvdSecCnt] 2092 ;sub cx, 1 2093 ;jna short FAT12_f_3 2094 00000BB7 49 dec cx 2095 00000BB8 7418 jz short FAT12_f_3 2096 FAT12_f_2: 2097 00000BBA 51 push cx 2098 00000BBB BB[D81E] mov bx, HDFORMAT_EMPTY_BUFF 2099 00000BBE E819F9 call write_hd_sector 2100 00000BC1 0F82E0FC jc formatting_error 2101 00000BC5 E89DFC call write_format_percent 2102 00000BC8 83C001 add ax, 1 2103 00000BCB 83D200 adc dx, 0 2104 00000BCE 59 pop cx 2105 00000BCF 49 dec cx ; dec cl 2106 00000BD0 75E8 jnz short FAT12_f_2 2107 FAT12_f_3: 2108 ; write FAT sectors 2109 00000BD2 8B0E[2021] mov cx, [data_start] ; lba/abs addr 2110 00000BD6 8B1E[2221] mov bx, [data_start+2] ; lba/abs addr 2111 2112 00000BDA 2B0E[2C21] sub cx, [root_dir_secs] 2113 00000BDE 83DB00 sbb bx, 0 2114 2115 00000BE1 53 push bx 2116 00000BE2 51 push cx 2117 00000BE3 BB[D81E] mov bx, HDFORMAT_FATBUFFER 2118 ; ES:BX = FAT Sector Buffer 2119 00000BE6 8A4E15 mov cl, [bp+15h] ; [BPB_Media] 2120 00000BE9 B5FF mov ch, 0FFh 2121 00000BEB 890F mov [bx], cx ; 0FFF8h 2122 00000BED 886F02 mov [bx+2], ch ; 0FFFFF8h 2123 ;xor cx, cx 2124 00000BF0 E8E7F8 call write_hd_sector 2125 00000BF3 0F82AEFC jc formatting_error 2126 00000BF7 E86BFC call write_format_percent 2127 ;mov bx, HDFORMAT_FATBUFFER 2128 00000BFA B90000 mov cx, 0 2129 00000BFD 890F mov [bx], cx 2130 00000BFF 884F02 mov [bx+2], cl 2131 00000C02 EB0F jmp short FAT12_f_5 2132 FAT12_f_4: 2133 00000C04 53 push bx 2134 00000C05 51 push cx 2135 00000C06 BB[D81E] mov bx, HDFORMAT_FATBUFFER 2136 00000C09 E8CEF8 call write_hd_sector 2137 00000C0C 0F8295FC jc formatting_error 2138 00000C10 E852FC call write_format_percent 2139 FAT12_f_5: 2140 00000C13 59 pop cx 2141 00000C14 5B pop bx 2142 00000C15 83C001 add ax, 1 2143 00000C18 83D200 adc dx, 0 2144 00000C1B 39DA cmp dx, bx 2145 00000C1D 72E5 jb short FAT12_f_4 2146 00000C1F 39C8 cmp ax, cx 2147 00000C21 72E1 jb short FAT12_f_4 2148 2149 ; write root directory sectors 2150 ; as empty sectors 2151 00000C23 8B0E[2C21] mov cx, [root_dir_secs] 2152 FAT12_f_6: 2153 00000C27 51 push cx 2154 00000C28 BB[D81E] mov bx, HDFORMAT_EMPTY_BUFF 2155 00000C2B E8ACF8 call write_hd_sector 2156 00000C2E 0F8273FC jc formatting_error 2157 00000C32 E830FC call write_format_percent 2158 00000C35 83C001 add ax, 1 2159 00000C38 83D200 adc dx, 0 2160 00000C3B 59 pop cx 2161 00000C3C 49 dec cx ; dec cl 2162 00000C3D 75E8 jnz short FAT12_f_6 2163 2164 ; write DATA sectors 2165 ; (after root directory sectors) 2166 00000C3F 8B0E[2421] mov cx, [data_sectors] 2167 ;mov bx, [data_sectors+2] 2168 ;inc bx 2169 FAT12_f_7: 2170 ;push bx 2171 00000C43 51 push cx 2172 00000C44 BB[C81A] mov bx, HDFORMAT_SECBUFFER 2173 00000C47 E890F8 call write_hd_sector 2174 00000C4A 0F8257FC jc formatting_error 2175 00000C4E E814FC call write_format_percent 2176 00000C51 59 pop cx 2177 ;pop bx 2178 00000C52 83C001 add ax, 1 2179 00000C55 83D200 adc dx, 0 2180 00000C58 49 dec cx 2181 00000C59 75E8 jnz short FAT12_f_7 2182 ;dec bx 2183 ;jnz short FAT12_f_7 2184 2185 ; If there are, format remain sectors which are 2186 ; at beyond of data clusters, with zero bytes. 2187 2188 00000C5B 8B4E1C mov cx, [bp+1Ch] ; [BPB_HiddSec] 2189 00000C5E 8B5E1E mov bx, [bp+1Eh] ; [BPB_HiddSec+2] 2190 2191 00000C61 034E13 add cx, [bp+13h] ; [BPB_TotSec16] 2192 00000C64 83D300 adc bx, 0 2193 00000C67 E9BDFA jmp FAT12_f_8 2194 2195 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2196 ; Read & Write characters 2197 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2198 2199 rw_char: 2200 ; OUTPUT -> DS:SI = Entered String (ASCIIZ) 2201 00000C6A BE[3421] mov si, StrVolumeName 2202 00000C6D BB0700 mov bx, 7 2203 00000C70 B403 mov ah, 3 2204 00000C72 CD10 int 10h 2205 00000C74 8916[B018] mov [Cursor_Pos], dx 2206 read_next_char: 2207 00000C78 30E4 xor ah, ah 2208 00000C7A CD16 int 16h 2209 00000C7C 20C0 and al, al 2210 00000C7E 7439 jz short loc_arrow 2211 00000C80 3CE0 cmp al, 0E0h 2212 00000C82 7435 je short loc_arrow 2213 00000C84 3C08 cmp al, 8 2214 00000C86 753D jne short char_return 2215 loc_back: 2216 00000C88 B403 mov ah, 3 2217 00000C8A CD10 int 10h 2218 00000C8C 3A16[B018] cmp dl, byte [Cursor_Pos] 2219 00000C90 761F jna short loc_beep 2220 prev_column: 2221 00000C92 FECA dec dl 2222 set_cursor_pos: 2223 00000C94 B402 mov ah, 2 2224 00000C96 CD10 int 10h 2225 00000C98 88D3 mov bl, dl 2226 00000C9A 2A1E[B018] sub bl, byte [Cursor_Pos] 2227 00000C9E B90100 mov cx, 1 2228 00000CA1 B409 mov ah, 9 2229 00000CA3 B020 mov al, 20h 2230 00000CA5 8800 mov [si+bx], al 2231 loc_write_it: 2232 00000CA7 B307 mov bl, 7 2233 00000CA9 CD10 int 10h 2234 00000CAB 8B16[B018] mov dx, [Cursor_Pos] 2235 00000CAF EBC7 jmp short read_next_char 2236 loc_beep: 2237 00000CB1 B40E mov ah, 0Eh 2238 00000CB3 B007 mov al, 7 2239 00000CB5 CD10 int 10h 2240 00000CB7 EBBF jmp short read_next_char 2241 loc_arrow: 2242 00000CB9 80FC4B cmp ah, 4Bh 2243 00000CBC 74CA je short loc_back 2244 00000CBE 80FC53 cmp ah, 53h 2245 00000CC1 74C5 je short loc_back 2246 00000CC3 EBB3 jmp short read_next_char 2247 char_return: 2248 00000CC5 B403 mov ah, 3 2249 00000CC7 CD10 int 10h 2250 check_char_type: 2251 00000CC9 3C20 cmp al, 20h 2252 00000CCB 7229 jb short loc_escape 2253 00000CCD 88D4 mov ah, dl 2254 00000CCF 2A26[B018] sub ah, byte [Cursor_Pos] 2255 ;cmp ah, 10 2256 ;ja short loc_beep 2257 00000CD3 3A26[391A] cmp ah, [vname_length] 2258 00000CD7 73D8 jnb short loc_beep 2259 00000CD9 3C7A cmp al, 'z' 2260 00000CDB 779B ja short read_next_char 2261 00000CDD 3C61 cmp al, 'a' 2262 00000CDF 7202 jb short pass_capitalize 2263 00000CE1 24DF and al, 0DFh 2264 pass_capitalize: 2265 00000CE3 88E3 mov bl, ah 2266 00000CE5 30E4 xor ah, ah 2267 00000CE7 8900 mov [si+bx], ax 2268 00000CE9 B307 mov bl, 7 2269 00000CEB B40E mov ah, 0Eh 2270 00000CED CD10 int 10h 2271 00000CEF EB87 jmp short read_next_char 2272 pass_escape: 2273 00000CF1 3C0D cmp al, 0Dh ; 13 ; ENTER 2274 00000CF3 7583 jne short read_next_char 2275 ;mov ah, 0Eh 2276 ;int 10h 2277 ;mov al, 0Ah 2278 ;int 10h 2279 00000CF5 C3 retn 2280 loc_escape: 2281 00000CF6 3C1B cmp al, 1Bh ; 27 ; ESC 2282 00000CF8 75F7 jne short pass_escape 2283 00000CFA F9 stc 2284 00000CFB C3 retn 2285 2286 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2287 ; 32 bit division 2288 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2289 2290 div32: 2291 ; DX_AX/CX 2292 ; Result: DX_AX, BX (remainder) 2293 00000CFC 89C3 mov bx, ax 2294 ;or dx, ax ; * DX_AX = 0 ? 2295 ;jz short div32_retn ; yes, do not divide! 2296 00000CFE 89D0 mov ax, dx 2297 00000D00 31D2 xor dx, dx 2298 00000D02 F7F1 div cx ; at first, divide DX 2299 ; remainder is in DX 2300 00000D04 93 xchg ax, bx ; now quotient is in BX 2301 ; and initial AX value is in AX 2302 00000D05 F7F1 div cx ; now, DX_AX has been divided and 2303 ; AX has quotient 2304 ; DX has remainder 2305 00000D07 87D3 xchg dx, bx ; finally, BX has remainder 2306 ;div32_retn: 2307 00000D09 C3 retn 2308 2309 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2310 ; Convert byte to decimal number 2311 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2312 2313 bin_to_decimal: 2314 ; INPUT: DS:SI = Target location 2315 ; DX_AX = Binary Number (Integer) 2316 ; OUTPUT: Decimal char at DS:SI 2317 ; SI decremented after every division 2318 ; till AX<10. 2319 ; CX, DX, BX will be changed. 2320 ; 2321 00000D0A B90A00 mov cx, 10 2322 btd_0: 2323 ; DX_AX = Dividend 2324 ; CX = Divisor 2325 00000D0D E8ECFF call div32 2326 ; DX_AX = Quotient 2327 ; BX = remainder 2328 00000D10 80C330 add bl, '0' 2329 00000D13 881C mov [si], bl 2330 00000D15 21D2 and dx, dx 2331 00000D17 7403 jz short btd_2 2332 btd_1: 2333 00000D19 4E dec si 2334 00000D1A EBF1 jmp short btd_0 2335 btd_2: 2336 00000D1C 09C0 or ax, ax 2337 00000D1E 75F9 jnz short btd_1 2338 2339 00000D20 C3 retn 2340 2341 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2342 ; Convert byte to hexadecimal number 2343 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2344 2345 byte_to_hex: 2346 bin_to_hex: 2347 ; INPUT -> 2348 ; AL = byte (binary number) 2349 ; OUTPUT -> 2350 ; AX = hexadecimal string 2351 ; 2352 00000D21 53 push bx 2353 00000D22 31DB xor bx, bx 2354 00000D24 88C3 mov bl, al 2355 00000D26 C0EB04 shr bl, 4 2356 00000D29 8A9F[A018] mov bl, [bx+hexchrs] 2357 00000D2D 86D8 xchg bl, al 2358 00000D2F 80E30F and bl, 0Fh 2359 00000D32 8AA7[A018] mov ah, [bx+hexchrs] 2360 00000D36 5B pop bx 2361 00000D37 C3 retn 2362 2363 ; ---------------------------------------------------------------------------- 2364 ; initialized data 2365 ; ---------------------------------------------------------------------------- 2366 2367 align 2 2368 2369 trdos386fc: 2370 00000D38 [D408] dw format_FAT16_fs 2371 00000D3A 0000 dw 0 2372 2373 ;volume_id: 2374 ; dd 0 2375 2376 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2377 ; FAT boot sector code 2378 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2379 2380 TRDOS_FAT32_hd_bs: 2381 00000D3C incbin 'FAT32_BS.BIN' ; 27/04/2024 2382 TRDOS_FAT16_hd_bs: 2383 0000113C incbin 'FAT16_BS.BIN' ; 26/12/2017 2384 TRDOS_FAT12_hd_bs: 2385 0000133C incbin 'FAT12_BS.BIN' ; 26/12/2017 2386 2387 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2388 ; messages 2389 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2390 2391 0000153C 00 lba: db 0 2392 2393 0000153D 00 drv: db 0 2394 2395 0000153E 00 sectors: db 0 2396 0000153F 00 db 0 2397 00001540 00 heads: db 0 2398 00001541 00 db 0 2399 00001542 0000 cylinders: dw 0 2400 2401 TrDOS_Welcome: 2402 00001544 0D0A db 0Dh, 0Ah 2403 00001546 54522D444F53203338- db 'TR-DOS 386 v2 Hard Disk Partition Formatting Utility ' 2403 0000154F 362076322048617264- 2403 00001558 204469736B20506172- 2403 00001561 746974696F6E20466F- 2403 0000156A 726D617474696E6720- 2403 00001573 5574696C69747920 2404 0000157B 0D0A db 0Dh, 0Ah 2405 0000157D 28666F72206C6F6769- db '(for logical dos drives in extended dos partitions) ' 2405 00001586 63616C20646F732064- 2405 0000158F 726976657320696E20- 2405 00001598 657874656E64656420- 2405 000015A1 646F73207061727469- 2405 000015AA 74696F6E732909 2406 000015B1 0D0A db 0Dh, 0Ah 2407 000015B3 0D0A db 0Dh, 0Ah 2408 000015B5 286329204572646F67- db '(c) Erdogan TAN 2020-2024' 2408 000015BE 616E2054414E203230- 2408 000015C7 32302D32303234 2409 000015CE 0D0A db 0Dh,0Ah 2410 000015D0 0D0A db 0Dh,0Ah 2411 000015D2 55736167653A206570- db 'Usage: epformat ' 2411 000015DB 666F726D6174203C64- 2411 000015E4 726976653E20 2412 000015EA 0D0A0D0A db 0Dh,0Ah, 0Dh, 0Ah 2413 000015EE 4472697665206E616D- db 'Drive names: ' 2413 000015F7 65733A20 2414 000015FB 0D0A db 0Dh, 0Ah 2415 000015FD 2020686430202E2E66- db ' hd0 ..for extended dos partition on 1st disk ' 2415 00001606 6F7220657874656E64- 2415 0000160F 656420646F73207061- 2415 00001618 72746974696F6E206F- 2415 00001621 6E2031737420646973- 2415 0000162A 6B20 2416 0000162C 0D0A db 0Dh, 0Ah 2417 0000162E 2020686431202E2E66- db ' hd1 ..for extended dos partition on 2nd disk ' 2417 00001637 6F7220657874656E64- 2417 00001640 656420646F73207061- 2417 00001649 72746974696F6E206F- 2417 00001652 6E20326E6420646973- 2417 0000165B 6B20 2418 0000165D 0D0A db 0Dh, 0Ah 2419 0000165F 2020686432202E2E66- db ' hd2 ..for extended dos partition on 3rd disk ' 2419 00001668 6F7220657874656E64- 2419 00001671 656420646F73207061- 2419 0000167A 72746974696F6E206F- 2419 00001683 6E2033726420646973- 2419 0000168C 6B20 2420 0000168E 0D0A db 0Dh, 0Ah 2421 00001690 2020686433202E2E66- db ' hd3 ..for extended dos partition on 4th disk ' 2421 00001699 6F7220657874656E64- 2421 000016A2 656420646F73207061- 2421 000016AB 72746974696F6E206F- 2421 000016B4 6E2034746820646973- 2421 000016BD 6B20 2422 000016BF 0D0A00 db 0Dh, 0Ah, 0 2423 2424 000016C2 30332F30352F323032- db '03/05/2024' 2424 000016CB 34 2425 000016CC 00 db 0 2426 2427 TrDOS_Format_warning: 2428 000016CD 0D0A db 0Dh, 0Ah 2429 000016CF 5741524E494E472021- db "WARNING ! ", 0Dh, 0Ah 2429 000016D8 200D0A 2430 000016DB 28496620796F752073- db "(If you say 'Yes', all of data in the logical DOS drive will be lost !) " 2430 000016E4 61792027596573272C- 2430 000016ED 20616C6C206F662064- 2430 000016F6 61746120696E207468- 2430 000016FF 65206C6F676963616C- 2430 00001708 20444F532064726976- 2430 00001711 652077696C6C206265- 2430 0000171A 206C6F737420212920 2431 TrDOS_Do_you_want: 2432 00001723 0D0A db 0Dh, 0Ah 2433 00001725 0D0A db 0Dh, 0Ah 2434 00001727 446F20796F75207761- db "Do you want to format logical DOS drive as TRDOS 386 FAT" 2434 00001730 6E7420746F20666F72- 2434 00001739 6D6174206C6F676963- 2434 00001742 616C20444F53206472- 2434 0000174B 697665206173205452- 2434 00001754 444F53203338362046- 2434 0000175D 4154 2435 fattype_str: 2436 0000175F 3136206673203F2028- db "16 fs ? (Y/N) " 2436 00001768 592F4E2920 2437 0000176D 00 db 0 2438 2439 _yes_str: 2440 0000176E 59455320 db 'YES ' 2441 00001772 0D0A00 db 0Dh, 0Ah, 0 2442 _no_str: 2443 00001775 4E4F20 db 'NO ' 2444 00001778 0D0A00 db 0Dh, 0Ah, 0 2445 2446 _msg_OK: 2447 ;db 07h 2448 0000177B 0D0A db 0Dh, 0Ah 2449 0000177D 4F4B2E db "OK." 2450 TrDOS_CRLF: 2451 00001780 0D0A00 db 0Dh, 0Ah, 0 2452 2453 TrDOS_PressKeyWhenReady: 2454 00001783 0D0A db 0Dh, 0Ah 2455 00001785 507265737320456E74- db 'Press Enter to format logical DOS drive ' 2455 0000178E 657220746F20666F72- 2455 00001797 6D6174206C6F676963- 2455 000017A0 616C20444F53206472- 2455 000017A9 69766520 2456 TrDos_ldn: 2457 000017AD 31206F6E206864 db '1 on hd' 2458 TrDOS_Drive: 2459 000017B4 3F2E2000 db '?. ', 0 2460 2461 TrDOS_disk_NotReadyOrError: 2462 000017B8 0D0A db 0Dh, 0Ah 2463 000017BA 4469736B206572726F- db 'Disk error or drive not ready ! ' 2463 000017C3 72206F722064726976- 2463 000017CC 65206E6F7420726561- 2463 000017D5 6479202120 2464 000017DA 54727920616761696E- zbyte: db 'Try again ? (Y/N) ' 2464 000017E3 203F2028592F4E2920 2465 000017EC 00 db 0 2466 2467 TrDOS_psize_defect: 2468 000017ED 0D0A db 0Dh, 0Ah 2469 000017EF 4D4252207061727469- db 'MBR partition size defect ! ' 2469 000017F8 74696F6E2073697A65- 2469 00001801 206465666563742021- 2469 0000180A 20 2470 0000180B 0D0A db 0Dh, 0Ah 2471 0000180D 286C65737320746861- db '(less than the minimum number of sectors required) ' 2471 00001816 6E20746865206D696E- 2471 0000181F 696D756D206E756D62- 2471 00001828 6572206F6620736563- 2471 00001831 746F72732072657175- 2471 0000183A 697265642920 2472 00001840 00 db 0 2473 2474 TrDOS_ep_ldd_defect: 2475 00001841 0D0A db 0Dh, 0Ah 2476 00001843 546865726520697320- db 'There is not a logical DOS drive ! ' 2476 0000184C 6E6F742061206C6F67- 2476 00001855 6963616C20444F5320- 2476 0000185E 6472697665202120 2477 00001866 0D0A db 0Dh, 0Ah 2478 ldd_count: 2479 00001868 00 db 0 2480 2481 TRDOS_fatp_notfound: 2482 00001869 0D0A db 0Dh, 0Ah 2483 0000186B 4D425220646F657320- db 'MBR does not contain an extended DOS partition ! ' 2483 00001874 6E6F7420636F6E7461- 2483 0000187D 696E20616E20657874- 2483 00001886 656E64656420444F53- 2483 0000188F 20706172746974696F- 2483 00001898 6E202120 2484 fattype: 2485 0000189C 00 db 0 2486 ;RetryCount: 2487 ; db 4 2488 2489 ;error: db 0 2490 2491 ;align 2 2492 0000189D 90 align 4 2493 2494 hexchrs: 2495 000018A0 303132333435363738- db '0123456789ABCDEF' 2495 000018A9 39414243444546 2496 2497 Cursor_Pos: ; dw 0 2498 CHS_limit: ; dword 2499 000018B0 0000 dw 0 2500 ;dw 0 2501 2502 000018B2 A101 sign: dw 417 ; magic word 2503 2504 ldd_table: 2505 000018B4 0D0A db 0Dh, 0Ah 2506 000018B6 3D3D3D3D3D3D3D3D3D- db "=======================================", 0Dh, 0Ah 2506 000018BF 3D3D3D3D3D3D3D3D3D- 2506 000018C8 3D3D3D3D3D3D3D3D3D- 2506 000018D1 3D3D3D3D3D3D3D3D3D- 2506 000018DA 3D3D3D0D0A 2507 000018DF 2020202020204844 db " HD" 2508 drv_str: 2509 000018E7 3020455854454E4445- db "0 EXTENDED DOS PARTITION ", 0Dh, 0Ah 2509 000018F0 4420444F5320504152- 2509 000018F9 544954494F4E202020- 2509 00001902 202020200D0A 2510 00001908 3D3D3D3D3D3D3D3D3D- db "=======================================", 0Dh, 0Ah 2510 00001911 3D3D3D3D3D3D3D3D3D- 2510 0000191A 3D3D3D3D3D3D3D3D3D- 2510 00001923 3D3D3D3D3D3D3D3D3D- 2510 0000192C 3D3D3D0D0A 2511 00001931 204C6F676963616C20- db " Logical DOS Drive Type SIZE ", 0Dh, 0Ah 2511 0000193A 444F53204472697665- 2511 00001943 202020547970652020- 2511 0000194C 2020202053495A4520- 2511 00001955 2020200D0A 2512 0000195A 2D2D2D2D2D2D2D2D2D- db "---------------------------------------", 0Dh, 0Ah, 0 2512 00001963 2D2D2D2D2D2D2D2D2D- 2512 0000196C 2D2D2D2D2D2D2D2D2D- 2512 00001975 2D2D2D2D2D2D2D2D2D- 2512 0000197E 2D2D2D0D0A00 2513 ldd_row: 2514 00001984 202020202020202020- db " " 2514 0000198D 2020202020202020 2515 ldd_row_dn: 2516 00001995 31202020464154 db "1 FAT" 2517 ldd_row_fs: 2518 0000199C 31322020202020 db "12 " 2519 ldd_row_sz: 2520 000019A3 31323847422020200D- db "128GB ", 0Dh, 0Ah, 0 2520 000019AC 0A00 2521 ldd_dline: 2522 000019AE 3D3D3D3D3D3D3D3D3D- db "=======================================", 0Dh, 0Ah 2522 000019B7 3D3D3D3D3D3D3D3D3D- 2522 000019C0 3D3D3D3D3D3D3D3D3D- 2522 000019C9 3D3D3D3D3D3D3D3D3D- 2522 000019D2 3D3D3D0D0A 2523 000019D7 00 db 0 2524 2525 ldd_select_msg: 2526 000019D8 0D0A0D0A db 0Dh, 0Ah, 0Dh, 0Ah 2527 000019DC 53656C656374206C6F- db "Select logical DOS drive number (1 to " 2527 000019E5 676963616C20444F53- 2527 000019EE 206472697665206E75- 2527 000019F7 6D6265722028312074- 2527 00001A00 6F20 2528 ldd_select_pn: 2529 00001A02 342920746F20666F72- db "4) to format. " 2529 00001A0B 6D61742E20 2530 00001A10 0D0A db 0Dh, 0Ah 2531 00001A12 286F72207072657373- db "(or press ESC to cancel) ", 0Dh, 0Ah, 0 2531 00001A1B 2045534320746F2063- 2531 00001A24 616E63656C29200D0A- 2531 00001A2D 00 2532 2533 ;align 4 2534 2535 msg_sectors_crlf: 2536 00001A2E 20736563746F72 db " sector" 2537 msg_sectors_crlf_s: 2538 00001A35 73 db "s" 2539 00001A36 0D0A00 db 0Dh, 0Ah, 0 2540 2541 vname_length: 2542 00001A39 00 db 0 2543 2544 bs_oem_name: 2545 00001A3A 5452444F53322E3000 db 'TRDOS2.0', 0 2546 2547 00001A43 90 align 2 2548 2549 no_name: 2550 00001A44 4E4F204E414D452020- db 'NO NAME ', 0 2550 00001A4D 202000 2551 2552 Msg_Volume_Name: 2553 00001A50 0D0A db 0Dh, 0Ah 2554 00001A52 0D0A db 0Dh, 0Ah 2555 00001A54 566F6C756D65204E61- db "Volume Name: ", 0 2555 00001A5D 6D653A2000 2556 2557 Msg_Volume_Serial: 2558 00001A62 566F6C756D65205365- db "Volume Serial No: " 2558 00001A6B 7269616C204E6F3A20 2559 Vol_Serial1: 2560 00001A74 30303030 db "0000" 2561 00001A78 2D db "-" 2562 Vol_Serial2: 2563 00001A79 30303030 db "0000" 2564 00001A7D 0D0A00 db 0Dh, 0Ah, 0 2565 2566 msg_cluster_count: 2567 00001A80 436C75737465722043- db "Cluster Count: ", 0 2567 00001A89 6F756E743A2000 2568 cluster_count_str: 2569 00001A90 30303030303030 db "0000000" 2570 00001A97 0D0A00 db 0Dh, 0Ah, 0 2571 msg_formatting: 2572 00001A9A 466F726D617474696E- db "Formatting ", 0 2572 00001AA3 672000 2573 format_percent_str: 2574 00001AA6 30303025 db "000%" 2575 00001AAA 00 db 0 2576 2577 Msg_3dot_OK: 2578 00001AAB 2E2E2E db '...' 2579 Msg_OK: 2580 00001AAE 204F4B2E db ' OK.' 2581 CRLF: 2582 00001AB2 0D0A00 db 0Dh, 0Ah, 0 2583 2584 Msg_Error: 2585 00001AB5 0D0A db 0Dh, 0Ah 2586 00001AB7 4572726F72202120 db 'Error ! ' 2587 00001ABF 28 db '(' 2588 error_code: 2589 00001AC0 3030 dw 3030h 2590 00001AC2 68 db 'h' 2591 00001AC3 2920 db ') ' 2592 00001AC5 0D0A db 0Dh, 0Ah 2593 00001AC7 00 db 0 2594 2595 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2596 ; initialized buffers 2597 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2598 2599 HDFORMAT_SECBUFFER: 2600 00001AC8 F6 times 512 db 0F6h 2601 HDFORMAT_FSINFO_BUFF: 2602 00001CC8 52526141 dd 41615252h ; FSI_LeadSig 2603 00001CCC 00 times 480 db 0 ; FSI_Reserved1 2604 00001EAC 72724161 dd 61417272h ; FSI_StrucSig 2605 00001EB0 FFFFFFFF dd 0FFFFFFFFh ; FSI_Free_Count 2606 00001EB4 02000000 dd 000000002h ; FSI_Nxt_Free 2607 00001EB8 00 times 12 db 0 ; FSI_Reserved2 2608 00001EC4 000055AA dd 0AA550000h ; FSI_TrailSig 2609 2610 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2611 2612 00001EC8 [D820] lddt_ptr dw lddt 2613 2614 ;SizeOfFile equ $-100 2615 2616 ; ---------------------------------------------------------------------------- 2617 ; uninitialized data 2618 ; ---------------------------------------------------------------------------- 2619 2620 bss_start: 2621 2622 ABSOLUTE bss_start 2623 2624 00001ECA ???? alignb 4 2625 2626 00001ECC ?? fsID: resb 1 2627 00001ECD ?? rw: resb 1 2628 00001ECE ???? csize: resw 1 ; heads*spt (sectors per cylinder) 2629 2630 00001ED0 ???????? dosp_start: resd 1 ; start sector of the (primary) dos partition 2631 00001ED4 ???????? dosp_size: resd 1 ; partition size in sectors 2632 2633 MBR: 2634 bootsector: 2635 ; resb 512 2636 HDFORMAT_FATBUFFER: 2637 HDFORMAT_EMPTY_BUFF: 2638 00001ED8 resb 512 2639 2640 ;HDFORMAT_FATBUFFER: 2641 ;HDFORMAT_EMPTY_BUFF: 2642 ; resb 512 2643 2644 ; logical dos drives table 2645 000020D8 lddt: resb 4*16 ; 64 bytes 2646 2647 00002118 ???????? EP_Start: resd 1 2648 0000211C ???????? EP_Start_x: resd 1 2649 2650 00002120 ???????? data_start: resd 1 2651 00002124 ???????? data_sectors: resd 1 2652 00002128 ???????? cluster_count: resd 1 2653 0000212C ???? root_dir_secs: resw 1 2654 0000212E ???? format_percent: resw 1 2655 00002130 ?? prev_percent: resb 1 2656 00002131 ?? rsvdbyte: resb 1 2657 2658 00002132 ???? old_sp: resw 1 2659 2660 00002134 StrVolumeName: resb 12 2661 2662 00002140 ???? lddt_save: resw 1 2663 2664 end_bss: