See our Tech Notes on the difficulty of working with versions 1.00 and 1.10 of IBM®'s Personal Computer DOS.
NOTE: The FORMAT.COM file (08-04-1981; 2,560 bytes; MD5: EDE9224C34BE6E01FCEB4D17DDC3337E) contains an exact copy of the Boot Sector; it's located at offsets 780h through 97Fh within that file. In an image file of the whole diskette, it can be found at offsets 4580h through 477Fh.
Unlike later versions of DOS, 1.00 (and 1.10) never contained a BPB (BIOS Parameter Block; though it appears to have a BPB pre-cursor located at offsets 0002h through 0007h), nor what has become the standard Boot Signature (the Word AA55h) in the last two bytes of every IBM®/Microsoft® Boot/MBR sector beginning with DOS version 2.00. Because of these two differences in the Boot Record's structure, most utility programs and even MS-DOS versions running in PC Compatibles as well as the Microsoft™ Windows® Operating Systems may consider these diskettes to be incorrectly formatted; even though their FAT12 file system is basically the same as the ones found on later MS-DOS diskettes! As we pointed out on our Tech Notes page, the main reason for this problem has to do with the so-called "compatibles" not containing actual clones of the IBM PC ROM chips, and deciding not to support the old IBM diskette capacities.[1]
Absolute Sector 0 (Track 0, Side 0, Sector 1) 0 1 2 3 4 5 6 7 8 9 A B C D E F 0000 EB 2F 14 00 00 00 60 00 20 37 2D 4D 61 79 2D 38 ./....`. 7-May-8 0010 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1............... 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0030 00 FA 8C C8 8E D8 BA 00 00 8E D2 BC 00 7C FB A1 .............|.. 0040 06 7C 8E D8 8E C0 BA 00 00 8B C2 CD 13 72 41 E8 .|...........rA. 0050 58 00 72 FB 2E 8B 0E 02 7C 51 BB 00 00 33 D2 B9 X.r.....|Q...3.. 0060 08 00 BE 01 00 56 B0 01 B4 02 CD 13 72 22 5E 58 .....V......r"^X 0070 E8 E7 00 2B C6 74 14 FE C5 B1 01 BE 08 00 3B C6 ...+.t........;. 0080 73 04 8B F0 EB 01 96 56 50 EB DD 2E FF 2E 04 7C s......VP......| 0090 BE 44 7D B8 42 7D 50 32 FF AC 24 7F 74 0B 56 B4 .D}.B}P2..$.t.V. 00A0 0E BB 07 00 CD 10 5E EB F0 C3 BB 00 00 B9 04 00 ......^......... 00B0 B8 01 02 CD 13 1E 72 34 8C C8 8E D8 BF 00 00 B9 ......r4........ 00C0 0B 00 26 80 0D 20 26 80 8D 20 00 20 47 E2 F3 BF ..&.. &.. . G... 00D0 00 00 BE 76 7D B9 0B 00 FC F3 A6 75 0F BF 20 00 ...v}......u.. . 00E0 BE 82 7D B9 0B 00 F3 A6 75 02 1F C3 BE F9 7C E8 ..}.....u.....|. 00F0 A5 FF B4 00 CD 16 1F F9 C3 0D 0A 4E 6F 6E 2D 53 ...........Non-S 0100 79 73 74 65 6D 20 64 69 73 6B 20 6F 72 20 64 69 ystem disk or di 0110 73 6B 20 65 72 72 6F F2 0D 0A 52 65 70 6C 61 63 sk erro...Replac 0120 65 20 61 6E 64 20 73 74 72 69 6B 65 20 61 6E 79 e and strike any 0130 20 6B 65 79 20 77 68 65 6E 20 72 65 61 64 F9 0D key when read.. 0140 0A 00 CD 18 0D 0A 44 69 73 6B 20 42 6F 6F 74 20 ......Disk Boot 0150 66 61 69 6C 75 72 E5 0D 0A 00 50 52 8B C6 BF 00 failur....PR.... 0160 02 F7 E7 03 D8 5A 58 C3 52 6F 62 65 72 74 20 4F .....ZX.Robert O 0170 27 52 65 61 72 20 69 62 6D 62 69 6F 20 20 63 6F 'Rear ibmbio co 0180 6D B0 69 62 6D 64 6F 73 20 20 63 6F 6D B0 C9 00 m.ibmdos com... 0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0 1 2 3 4 5 6 7 8 9 A B C D E F |
At offsets 0168h through 0175h, you'll find the name "Robert
O'Rear," but it's never used by the code; it was simply inserted there by the Boot Sector's author to identify his work. It was replaced by a
company name in the next revision (cf. version 1.10). As Harold Evans wrote in his work, They Made
America: From the Steam Engine to the Search Engine (©2004), it was seeing Bob O'Rear's name (known to be a Microsoft programmer) right here in the
Boot Sector that shocked Gary Kildall, since it meant, "Microsoft was in bed with IBM..." before he negotiated his deal with IBM in July, 1981.
The "B0" bytes (at offsets 181h and 18Dh) and the C9 (at offset 18Eh) are never used by the code. In the IBM PC DOS
1.10 Boot Sector, these file names are each followed by a single 30h byte. Note: If you remove the high-bit
from "B0," it would also become a 30h byte. Apparently, Bob O'Rear
(and/or the programming utilities available to him at the time), thought it would be necessary to mark the end of a string by either adding a high-bit to
the last character (see our notes at 7C9A below) or zero-terminating it, or both, but mistakenly terminated it with an ASCII zero instead
of a binary zero. In the end, the decrement counter (CX register) built into the REPZ followed by CMPSB
assembly instructions made neither of those necessary and the bytes were simply left there, since they never caused any problems. For a good discussion on
how these bytes most likely came about, see the second half of Michal Necasek's article here. But what about the C9 byte at the very end? I believe
it's likely a single-byte remnant of some Slack Space that was left at the end of FORMAT.COM and copied into every newly formatted diskette; including
the distribution diskette!
What it does:
1. Initializes critical registers and checks if the floppy drive is responding. (7C317C4D)
2. Checks for a System Boot disk in floppy drive (7CF4, 7CAA7CEB),
notifies user if none found (7CEC & 7CEF and 7C977CA9) and
waits for user to try another disk (7CF27CF8 and 7C52); endless loop,
until one is found, or user powers off the PC.
3. Loads System files (IBMBIO.COM and IBMDOS.COM) and 3 sectors of whatever follows[2]
into Memory (at 0000:0600 through 0000:2DFF) using:
(7C547C59) to initialize CX register for copying loop,
(7C5A7C6A) to copy first sector of IBMBIO.COM into: 0000:060007FF,
(7C687C89) to copy remaining System file bytes into: 0000:08002DFF.
4. If an error occurs while copying System files, the code at 7C6C, 7C907C96, and
the Display subroutine (7C977CA9) handle the disk error.
5. If no fatal error occurs, starts executing the IBMBIO.COM file in Memory (see: 7C8B).
IBM™ summarized what this Boot Sector does as follows: When the system is started (either System
Reset or power ON with the DOS diskette in drive A), the boot record is read into memory and given control. It checks the directory to assure that the first two files
listed are IBMBIO.COM and IBMDOS.COM, in that order. (An error message is issued if not.) The boot record then reads these two files into memory from absolute diskette
sectors (the file allocation table is not used to locate the sectors for these files), starting at segment X'60', offset 0 (absolute memory address X'600'), and jumps
to that location (the first byte of IBMBIO.COM).[3]
Here's a disassembly of the code (; with comments on every assembly instruction)
after
being loaded into Memory at locations 0000:7C00 through 0000:7DFF by the PC's BIOS:
7C00 EB2F JMP 7C31 ; Jump over reserved data area
Data Locations which Code Execution Jumps Over:
0 1 2 3 4 5 6 7 8 9 A B C D E F
7C02 14 00 00 00 60 00 20 37 2D 4D 61 79 2D 38 ....`. 7-May-8
7C10 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1...............
7C20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
7C30 00 .
7C31 FA CLI ; Disable maskable Interrupts 7C32 8CC8 MOV AX,CS ; Zero-out the Accumulator & 7C34 8ED8 MOV DS,AX ; set Data Segment to ZERO. 7C36 BA0000 MOV DX,0000 ; Zero-out DX and use it to 7C39 8ED2 MOV SS,DX ; set Stack Segment -> 0000 7C3B BC007C MOV SP,7C00 ; Set Stack Pointer to: 7C00 7C3E FB STI ; Enable Interrupts 7C3F A1067C MOV AX,[7C06] ; 0060h -> AX 7C42 8ED8 MOV DS,AX ; 0060h -> DS 7C44 8EC0 MOV ES,AX ; 0060h -> ES 7C46 BA0000 MOV DX,0000 ; Zero-out DX & use it to 7C49 8BC2 MOV AX,DX ; set: AX = 00 (Function 00 ; RESET DRIVES, of INT 13). 7C4B CD13 INT 13 ; Reset Floppy Disk drives; if ; CF=1(set) there's an error. 7C4D 7241 JC 7C90 ; If CF is set, jump to Drive ; failure routine; otherwise: 7C4F E85800 CALL 7CAA ; Is this a System Boot disk? 7C52 72FB JC 7C4F ; If not, try again; until... ; user finds one or gives up! 7C54 2E8B0E027C MOV CX,CS:[7C02] ; Push [0:7C02] = 0014h (20) 7C59 51 PUSH CX ; onto the Stack. ;===================================================================== ; INT 13, Function 02 (AH=02) parameters: ; Copies sectors from disk into Memory; using Track, Side & Sector: ; ; (IN): ; AL = Number of Sectors to read ; CH = Track number ; CL = Starting Sector number (bits 0-5) ; DH = Side number ; ES:BX = Start of Memory to copy sectors to ; ; If CF = 1 (set), then there was a read error! ;===================================================================== 7C5A BB0000 MOV BX,0000 ; Copy into ES:BX (0060:0000; ; same as Memory Address 0600) 7C5D 33D2 XOR DX,DX ; Side 0 7C5F B90800 MOV CX,0008 ; Track 0, Sector 8 7C62 BE0100 MOV SI,0001 ; SI -> 0001 ... 7C65 56 PUSH SI ; Saved on Stack for later 7C66 B001 MOV AL,01 ; Read 1 sector ;=========================================================================== ; System Files Loading Loop ;=========================================================================== 7C68 B402 MOV AH,02 ; Function 02 of INT 13 7C6A CD13 INT 13 ; Unless a disk read error occurred (handled below at 7C6C), the code and ; INT13 above copied the first sector of IBMBIO.COM (Absolute Sector 7) ; into Memory locations 0000:0600 through 07FF; overwriting the Directory ; entries that had been temporarily saved there. ; The following code (and INT 13 above) is looped through 3 times to copy ; the remainder of IBMBIO.COM (3 more sectors) & IBMDOS.COM (13 sectors) ; and the first 3 sectors of COMMAND.COM (on copies of the IBM PC DOS 1.0 ; distribution diskette) or whatever is in those next 3 sectors (which ; the boot sequence never makes use of[4]) into these Memory locations: ; ; 1st Loop: Copies Track 1 (8 sectors) into: 0000:0800 through 0000:17FF ; 2nd " : " Track 2 ( " ) into: 0000:1800 through 0000:27FF ; 3rd " : Only 3 sectors of Track 3 into: 0000:2800 through 0000:2DFF 7C6C 7222 JC 7C90 ; If disk read error (CF=1), ; jump to error handling routine. 7C6E 5E POP SI ; Restore SI -> 0001, 0008, 0008, 0003. 7C6F 58 POP AX ; Restore AX -> 0014, 0013, 000B, 0003. 7C70 E8E700 CALL 7D5A ; Multiplies SI by 512 and ; adds result to BX; details: ; 1st pass: SI=0001; BX=0000 -> BX=0200h -> 0060:0200 or: 0000:0800, ; 2nd : SI=0008; BX=0200 -> BX=1200h -> 0060:1200 or: 0000:1800, ; 3rd : SI=0008; BX=1200 -> BX=2200h -> 0060:2200 or: 0000:2800, ; 4th : SI=0003; BX=2200 -> BX=2800h -> N/A (never used above). 7C73 2BC6 SUB AX,SI ; 1st pass: 20 - 1 = 19 (AX=0013) ; 2nd : 19 - 8 = 11 (AX=000B) ; 3rd : 11 - 8 = 3 (AX=0003) ; 4th : 3 - 3 = 0 (AX=0000) 7C75 7414 JZ 7C8B ; Finished loading System code. ; There are only 8 Sectors per Track (8 SPT), so to read the 9th, 17th ; and 25th sectors, CH is incremented to read Tracks 01, 02 and 03: 7C77 FEC5 INC CH ; For the 1st, 2nd & 3rd loops: ; CH -> 01, 02 and 03. 7C79 B101 MOV CL,01 ; (Tracks 1/2/3), Sector 1. 7C7B BE0800 MOV SI,0008 ; Read 8 sectors from this track: ; AL=08 after "XCHG SI,AX" @7C86. 7C7E 3BC6 CMP AX,SI ; Compare by: AX - SI (set flags) 7C80 7304 JNB 7C86 ; Jump if not below zero. 7C82 8BF0 MOV SI,AX ; AX=0003 -> SI 7C84 EB01 JMP 7C87 7C86 96 XCHG SI,AX ; SI & AX exchange contents. 7C87 56 PUSH SI ; Save SI onto Stack. 7C88 50 PUSH AX ; Save AX onto Stack. 7C89 EBDD JMP 7C68 ; Copy more System code into Memory ; ------------------------------------------------------------------------ ; Transfer Code Execution to IBMBIO.COM (at 0000:0600): 7C8B 2EFF2E047C JMP FAR CS:[7C04] ; CS:[7C04] = 0060:0000, so... ; jump -> 0000:0600 (the first ; byte of IBMBIO.COM ) ; ------------------------------------------------------------------------ ;=========================================================================== ; Boot Disk Error Handling Routine: ;=========================================================================== 7C90 BE447D MOV SI,7D44 ; -> 0D,0A,"Disk Boot failur" etc. 7C93 B8427D MOV AX,7D42 ; 7D42 -> CD 18 (Code for: INT 18) 7C96 50 PUSH AX ; An INT 18 will be executed after ; displaying error message using ; subroutine below (7C97) and executing RETurn at 7CA9. ; INT 18 : Start CASSETTE BASIC ; Called by code above when there is no bootable disk available. Only PCs ; produced by IBM contain BASIC in ROM, so the action is unpredictable for ; compatibles; this interrupt often reboots the system, or has no effect at ; all! Network cards with their own BIOS can hook this interrupt to allow a ; diskless boot off the network (even when a hard disk is present if none ; of the partitions is marked as the boot partition). ;=========================================================================== ; Display Zero-terminated String Subroutine: ;=========================================================================== ;========================================================================== ; Function 0Eh = TELETYPE OUTPUT -> Display one character at a time ; (IN): ; AL = character to display ; BH = page number (IBM PC ROMs dated 4/24/81 and 10/19/81 ; require BH be the same as the current active page) ; BL = foreground color (graphics modes only) ;========================================================================== 7C97 32FF XOR BH,BH ; Page 0 7C99 AC LODSB AL,BYTE PTR DS:[SI] ; Moves one string byte ; character into AL ; and increments SI. ;-------------------------------------------------------------------------- ; At first glance this next instruction may appear to apply only to 3 bytes ; in the error messages seemingly obfuscated for some unknonwn reason, but ; it was necessary since some assemblers from that era automatically added ; a high bit to the last character of every string.[5] However, some kind ; of logic instruction would still be necessary here in order to set the ZF ; (zero-flag) when testing for zero-terminated strings; which is what the ; the code at 7C9C does, allowing the program flow to exit this subroutine! 7C9A 247F AND AL,7F ; Converts the bytes: F2 -> 72 ("r"), ; F9 -> 79 ("y") and E5 -> 65 ("e"). ; If AL contains a zero-byte, ZF -> 1 ;-------------------------------------------------------------------------- 7C9C 740B JZ 7CA9 ; Return if zero-flag set (ZF = 1). 7C9E 56 PUSH SI ; Save new SI value on Stack 7C9F B40E MOV AH,0E ; Function 0Eh of INT 10 7CA1 BB0700 MOV BX,0007 ; Light Gray or White character 7CA4 CD10 INT 10 ; Display character on screen 7CA6 5E POP SI ; Restore SI from Stack 7CA7 EBF0 JMP 7C99 ; Get next character 7CA9 C3 RET ;=========================================================================== ; Check for System Boot Disk ;=========================================================================== ;================================================================== ; INT 13, Function 02 (AH=02) parameters: ; Copies sectors from disk into Memory; using Track, Side & Sector: ; ; (IN): ; AL = Number of Sectors to read ; CH = Track number ; CL = Starting Sector number (bits 0-5) ; DH = Side number ; ES:BX = Start of Memory to copy sectors to ; ; If CF = 1 (set), then there was a read error! ;================================================================== 7CAA BB0000 MOV BX,0000 ; Copy into: ES:BX (0060:0000; ; same as Memory Address 0600) ; DX still zero, so: Side 0, 7CAD B90400 MOV CX,0004 ; Track 0 and Sector 4. ; (Beginning of Directory) 7CB0 B80102 MOV AX,0201 ; AL=01, (Read 1 Sector only) 7CB3 CD13 INT 13 ; Unless a disk read error occurred (handled below at 7CB6), then all ; 512 bytes of the 4th sector (Absolute Sector 3) have been read into ; Memory locations 0000:0600 and following, and the ; first two Directory entries (of 32 bytes each) should appear as: ; ----------------------------------------------------------------------- ; 0600 49 42 4D 42 49 4F 20 20 43 4F 4D 06 00 00 00 00 IBMBIO COM..... ; 0610 00 00 00 00 00 00 00 00 F7 02 02 00 80 07 00 00 ................ ; 0620 49 42 4D 44 4F 53 20 20 43 4F 4D 06 00 00 00 00 IBMDOS COM..... ; 0630 00 00 00 00 00 00 00 00 0D 03 06 00 00 19 00 00 ................ ; ; The yellow highlighted bytes above are interpreted by DOS as the dates ; "7-23-81" and "8-13-81" (see our Disk Contents page). The underlined ; bytes are file lengths of: 0780h = 1,920 bytes and 1900h = 6,400 bytes ; beginning at Cluster Numbers 02 and 06, respectively. ; ----------------------------------------------------------------------- 7CB5 1E PUSH DS ; Save DS (0060h) on Stack 7CB6 7234 JC 7CEC ; If CF=1 (set), Disk Read Error ; Jump to Error handling routine 7CB8 8CC8 MOV AX,CS ; CS -> AX (should be 0) 7CBA 8ED8 MOV DS,AX ; AX -> DS (should be 0) 7CBC BF0000 MOV DI,0000 ; Zero-out DI (start @ 0 offset) 7CBF B90B00 MOV CX,000B ; 0Bh = 11 (Number of filename ; characters to process below.) 7CC2 26800D20 OR BYTE PTR ES:[DI],20 ; Convert any ASCII ; "A-Z" bytes into ; lower case [a-z]. 7CC6 26808D200020 OR BYTE PTR ES:[DI+0020],20 ; Does the same (Note: [DI+0020] is in hex, +0020h = +32) ; for 2nd entry ; in Directory. 7CCC 47 INC DI ; Add 1 to DI -> next character 7CCD E2F3 LOOP 7CC2 ; Loop until all 11 characters ; in both entries are processed 7CCF BF0000 MOV DI,0000 ; Set offset to zero again. 7CD2 BE767D MOV SI,7D76 ; -> "ibmbio com" 7CD5 B90B00 MOV CX,000B ; Compare 11 characters below. 7CD8 FC CLD ; Clear Direction Flag; ensure ; SI and DI increment below. 7CD9 F3 REPZ ; Repeat CMPSB CX times: 7CDA A6 CMPSB ; Compare byte ES:[DI] to DS:[SI] 7CDB 750F JNZ 7CEC ; If not identical, this is not ; a System Boot Disk, so jump to ; error handling routine (7CEC) 7CDD BF2000 MOV DI,0020 ; Set offset (DI) to 020h (32) ; for second Directory entry. 7CE0 BE827D MOV SI,7D82 ; -> "ibmdos com" 7CE3 B90B00 MOV CX,000B ; 11 times again... 7CE6 F3 REPZ 7CE7 A6 CMPSB 7CE8 7502 JNZ 7CEC ; Not a System Boot Disk! ; Jump to error handling routine 7CEA 1F POP DS ; Restore Data Segment 7CEB C3 RET ;=========================================================================== ; Non-System Disk or Disk Error Handling Routine: ;=========================================================================== 7CEC BEF97C MOV SI,7CF9 ; -> 0D,0A,"Non-System disk" etc. 7CEF E8A5FF CALL 7C97 ; Display error message & return 7CF2 B400 MOV AH,00 7CF4 CD16 INT 16 ; Wait for keypress 7CF6 1F POP DS ; Restore Data Segment 7CF7 F9 STC ; Set the Carry Flag (CF=1) to ; notify code at 7C52 of error! 7CF8 C3 RET
9 A B C D E F 7CF9 0D 0A 4E 6F 6E 2D 53 ..Non-S 7D00 79 73 74 65 6D 20 64 69 73 6B 20 6F 72 20 64 69 ystem disk or di 7D10 73 6B 20 65 72 72 6F F2 0D 0A 52 65 70 6C 61 63 sk erro...Replac 7D20 65 20 61 6E 64 20 73 74 72 69 6B 65 20 61 6E 79 e and strike any 7D30 20 6B 65 79 20 77 68 65 6E 20 72 65 61 64 F9 0D key when read.. 7D40 0A 00 CD 18 0D 0A 44 69 73 6B 20 42 6F 6F 74 20 ......Disk Boot 7D50 66 61 69 6C 75 72 E5 0D 0A 00 failur.... 0 1 2 3 4 5 6 7 8 9 A B C D E F |
7D5A 50 PUSH AX ; Save AX and DX ... 7D5B 52 PUSH DX ; content on Stack 7D5C 8BC6 MOV AX,SI ; SI value is multiplied 7D5E BF0002 MOV DI,0200 ; by (200h = 512) and... 7D61 F7E7 MUL DI ; the result is added... 7D63 03D8 ADD BX,AX ; to, and stored in BX. 7D65 5A POP DX ; Restore content of 7D66 58 POP AX ; AX and DX registers 7D67 C3 RET
7D68 52 6F 62 65 72 74 20 4F Robert O 7D70 27 52 65 61 72 20 69 62 6D 62 69 6F 20 20 63 6F 'Rear ibmbio co 7D80 6D B0 69 62 6D 64 6F 73 20 20 63 6F 6D B0 C9 m.ibmdos com.. 0 1 2 3 4 5 6 7 8 9 A B C D E F |
Robert O'Rear, originally from the rural Texas Panhandle town of Wellington, earned his bachelor's degree in mathematics from Texas Western College (now UT, El Paso) in 1964 and went on to earn his master's degree from the University of Texas at Austin in 1966. After graduation, he worked for TRW Systems in the aerospace division writing mathematical analysis programs that supported targeting systems for ballistic missiles, spy satellites and the NASA Apollo program.
In 1977, he became the seventh employee of Bill Gates and Paul Allen's business venture, Microsoft®. As the company's chief mathematician and project manager, O'Rear co-authored the first version of MS-DOS along with its creator, Tim Paterson, and placed Microsoft's software into the first IBM® Personal Computer. After the release of the IBM PC in 1981, O'Rear moved into international sales and marketing, launching Microsoft's offices in Europe. He retired from the company in 1993.
1[Return to Text] Some 3rd party ROM upgrades, as noted on our Tech Notes page, may allow various MS-DOS versions to access and work with 160 KiB diskettes. Do you have a PC Compatible that can actually copy 160 KiB diskettes? And if so, under which version(s) of DOS?
2[Return to Text] Although the next file on the IBM PC DOS 1.00 distribution diskette is COMMAND.COM, it does not matter what the next file on the diskette is, since those 3 sectors copied into Memory locations 2800h through 2DFFh are never used during the whole boot process! (See Footnote 4 below.)
3[Return to Text] Disk Operating System, First Edition Revised (January 1982; ©Copyright International Business Machines Corporation 1981; IBM Product Number: 6172220), "DOS Initialization," APPENDIX B. DOS TECHNICAL INFORMATION, page B-2.
4[Return to Text] The fact that copies of these 3 sectors from COMMAND.COM are never used by the Boot Process in these Memory locations can easily be proven by formatting a diskette using /S to transfer the system files to it, erasing the COMMAND.COM file (using ERASE; PC DOS 1.0 did not call it DELETE), copying whatever other files you want to that diskette, and only then copying COMMAND.COM to that diskette, then, finally, putting that diskette in the A: drive and finding that you can boot-up from it! (It does not matter where COMMAND.COM is located on the diskette; only where IBMBIO.COM and IBMDOS.COM are located. THEREFORE, whatever happens to be copied from Absolute Sectors 24-26 (Clusters 19-21) at this point in the boot sequence does not matter; only later on is the code from COMMAND.COM made use of (wherever it happens to be located on the diskette).
5[Return to
Text] This pattern of setting the high bit on all ASCII bytes occurring at the end of a string (but not 0x0D Carriage
Return or 0x0A Line Feed bytes), can also be found in the IBMBIO.COM file at hex offsets 4B,
5D, 6F, B5, 2B1, 4CF and 4E3. It also occurs at 274h, but that's at the end of the "COMMAND CO" file name there. Presumably, after the strings were changed into "$-terminated strings,"
and Carriage Return and Line Feed bytes added where desired, the programmer(s) simply left the existing bytes and code as they were, since doing so caused no
issues! For more about these high-bit oddities, see the section, "Other Uses of High-Bit Termination" in the article we already mentioned above
at Michal Necasek's: OS/2 Museum.
Note: Neither the IBM PC DOS 1.10 Boot Sector nor its IBMBIO.COM file of
have any of these high bit set character bytes, so by then, the programmer(s) had eliminated them from the code.
First Published: August 2, 2005 (2005.08.02).
Updated: February 27, 2018 (2018.02.27); December 7, 2021 (2021.12.07); added all missing comments, revised somewhat.
December 8, 2021 (2021.12.08); added the section, What it Does. December 14, 2021 (2021.12.14); minor changes, note about unknown bytes.
December 20, 2021 (2021.12.20); minor changes, added Footnote. December 23, 2021 (2021.12.23); added another Footnote. January 11, 2022 (2022.01.11); corrected some
fuzzy statements, added footnote 3. January 14, 2022 (2022.01.14); added footnotes 2 and 4.
Last Update: July 26, 2024 (2024.07.26); corrected faulty code description at 7C9A.
You can reply to us here.
IBM PC DOS 1.00 Index
MBR
and Boot Records Index
The Starman's Realm Index