Sponsoring website: Emergency Boot Kit


The  Boot Sector   of
IBM® Personal Computer™ DOS
Version 1.00 (1981)


Copyright © 2005, 2021, 2021 by Daniel B. Sedory

NOT to be reproduced in any form without Permission of the Author !

 

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]

A Disk Editor View of the Boot Sector

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!

 

An Examination of the Assembly Code
for the IBM® DOS 1.00 Boot Sector
as found in Memory during Execution

What it does:

1. Initializes critical registers and checks if the floppy drive is responding. (7C31—7C4D)
2. Checks for a System Boot disk in floppy drive (7CF4, 7CAA—7CEB),
    notifies user if none found (7CEC & 7CEF and 7C97—7CA9) and
    waits for user to try another disk (7CF2—7CF8 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:
      (7C54—7C59) to initialize CX register for copying loop,
      (7C5A—7C6A) to copy first sector of IBMBIO.COM into: 0000:0600—07FF,
      (7C68—7C89) to copy remaining System file bytes into: 0000:0800—2DFF.
4. If an error occurs while copying System files, the code at 7C6C, 7C90—7C96, and
    the Display subroutine (7C97—7CA9) 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         ; Jump if CF is set 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.
;--------------------------------------------------------------------------
; This next instruction applies only to 3 bytes in the error messages which
; at first may appear to have been obfuscated for unknonwn reasons. However
; some assemblers from that era automatically added a  high bit to the last
; character of a string; making the following code necessary. Yet, for some
; reason (too little time?),  Bob simply added the code (at 7C9C) to handle
; these messages as zero-terminated strings; leaving the altered characters
; and this instruction in place.[5]

 7C9A 247F          AND     AL,7F     ; Converts the bytes: F2 -> 72 ("r"),
                                      ;  F9 -> 79 ("y") and E5 -> 65 ("e").
;--------------------------------------------------------------------------
 7C9C 740B          JZ      7CA9      ; Return if zero-byte encountered.
 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

Location of Error Messages and Code in Memory

 
                                   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

; Multiply SI by 512, Add result to BX & Return:
 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


Location of  Boot Sector Author's
Name and File Names in Memory

 
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


Who is Robert (Bob) O'Rear ?

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.

 

 


Footnotes

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.

Last Update: January 14, 2022 (2022.01.14); added footnotes 2 and 4.

 

You can reply to us here.

IBM PC DOS 1.00 Index

MBR and Boot Records Index

The Starman's Realm Index