DOS boot sector (either on the partition itself or in the diskette boot sector)
is loaded to 0000:7C00 and then jumped into it. This boot sector doesn't
make any assumptions about its initial registers. Boot sector will reset the
FDC controller (Windows 98 only when booting from the floppy).
Then it correctly calculates the first sector of the root directory entries
list and also the first sector of data zone (where the clusters reside). It
will use "hidden sectors" field of the partition boot sector to
correctly offset the whole partition for physical disk reads. Exact
calculations come out from the information found in:
Zone of bytes 003..03D inclusive
Zone of bytes 003..03F inclusive
MS-DOS 6.22 loads only the first sector of root directory. It checks
whether the very first two entries are "IO.SYS" and
"MSDOS.SYS", in this order. Only the exact 11 bytes of each
name are compared. When it matches, it will read the cluster number of
IO.SYS file and recalculate it to the sector offset on the disk. As the
last action it will read the first 3 sectors from this offset to
0070:0000. CPU is then jumped to 0070:0000. The loader contained in
the first 3 sectors of IO.SYS then expects some registers already prepared
and the root directory sector read at 0050:0000. First touches of
FAT are done in IO.SYS.
All reads are done through INT 0x13:AH=0x02 so all accessed sectors of all
filesystems have to be accessible by standard BIOS (below 8GB BIOS limit).
No LBA32 calls are implemented.
Summary of the requirements:
IO.SYS" and "MSDOS.SYS", in this order,
to be contained as the very first two entries in the root directoryIO.SYS" have to be continuous (linear)
on the disk.hidden sectors" field correctly set
Please honour in the following text always correctly the difference between
FAT32 (support for disk partitions larger than 2GB) and LBA32
(support for accessing data on disk above approx. 8GB limit)!
Windows 98 scan the whole root directory, through all of its sectors up to
the first 0 byte found in the first character of any directory entry
filename (which generally ends the entry list anyway). The scan is done in two
phases: First phase is for "WINBOOT.SYS", the second (due to
possible failure of the first phase) is for "IO.SYS". This boot
sector will generally make no differences in loading techniques of these two
files.
On successful filename match it will read the cluster number of it and
recalculate it to the sector offset on the disk. As the last action it will
read the first 4 sectors from this offset to 0070:0000. It will
check whether the first two characters are 'MZ' and also it will check for
0x424A (big-endian notation) on 0070:0200. CPU is then jumped to
0070:0200. The loader contained in the first 4 sectors of IO.SYS was
not analyzed but it generally doesn't make any further requirements on files
distribution on the disk. First touches of FAT are done in the chosen
file loaded.
Although even in Windows 98 boot record exists filename for
"MSDOS.SYS", the code really doesn't use it in any way. It was
probably left there to keep some sort of compatibility with broken third party
disk management software.
In the FAT32 boot record is also entry "Backup Boot Sector"
Please take care during modifications that this sector-relative offset of the
copy of the boot record refers to the whole 4 sectors:
LBA32 hard disk partitionsGenerally the whole chosen .SYS file is read through INT 0x13:AH=0x02
(standard BIOS - accessible only the first 8GB of physical disk). (The previous
sentence is described in detail in the following
Bug in Windows 98 IO.SYS section).
All other reads (the filesystem access, including "COMMAND.COM") are
performed depending on the partition type:
(without LBA32 marked filesystem type, e.g. 0x1,
0x4, 0x6 or 0xB) are limited to the first 8GB by BIOS
(LBA32-marked filesystem type, e.g. 0xC or 0xE)
are not limited by any capacity. The whole partition is accessed by INT
0x13:AX=0x4200 - so called Enhanced BIOS packet calls:
http://www.phoenix.com/products/specs.html
Summary of the requirements:
WINBOOT.SYS" or "IO.SYS" name, taken
in this order of priority. No requirements to position of such entry
in the root directory are made..SYS file have to be continuous
(linear) on the disk..SYS file has must be below the limit of standard
BIOS which is the first approx. 8GB of physical disk space.'MZ' in offset 0x0 of the file and 0x424A in
offset 0x200 of the file, both constants given here in big-endian
notation.hidden sectors" field correctly setThe original goal of Microsoft was probably to leave the BIOS limitation
only for the first 4 sectors of the chosen .SYS file (to not to require
BIOS-accessible the whole file). If you specify 0xC or 0xE value in
the third byte of the boot record (standard value is 0x90 - NOP
instruction), the whole rest of .SYS file is read correctly by LBA32.
Unfortunately the system doesn't recognize partitions with such changed
0x90 byte and due to this fact even COMMAND.COM is not readable in
such situation. I see this behaviour as evident bug - if you have some better
explanation/fix, please contact the team.
We supply a fix for this bug (although the bug is not serious, of course). The
0x90 byte (on offset 0x002) leave as it is, just modify two bytes in
your IO.SYS file: on offset 0x5F2 set the bytes 0x80, 0x7E
to the bytes 0xEB, 0x0A. Generally this should apply to all
Windows 98 variants, to be sure check the bytes around:
75 2E 80 7E 02 0C 74 06 | 80 7E 02 0E 75 22 33 F6
75 2E EB 0A 02 0C 74 06 | 80 7E 02 0E 75 22 33 F6
Already checked variants are provided below:
Length 222390,
orig. md5sum "4823258556ae481a19015c22e33e8a9e",
fixed md5sum "c6cbf356b13b963a354954f1f3d595a9".
Length 222390,
orig. md5sum "aebf26a7fc32aa0d740ab1a3b539637a",
fixed md5sum "d71b96afa511af4dd6f1d058a0ff71d6".