[ES:DI+2] byte MEMDISK minor version
[ES:DI+3] byte MEMDISK major version
[ES:DI+4] dword Pointer to MEMDISK data in high memory
- [ES:DI+8] dword Size of MEMDISK data in 512-byte sectors
+ [ES:DI+8] dword Size of MEMDISK data in sectors
[ES:DI+12] 16:16 Far pointer to command line
[ES:DI+16] 16:16 Old INT 13h pointer
[ES:DI+20] 16:16 Old INT 15h pointer
[ES:DI+24] word Amount of DOS memory before MEMDISK loaded
[ES:DI+26] byte Boot loader ID
- [ES:DI+27] byte Currently unused
+ [ES:DI+27] byte Sector size as a power of 2
+ (If zero, assume 512-byte sectors)
[ES:DI+28] word If nonzero, offset (vs ES) to installed DPT
This pointer+16 contains the original INT 1Eh
uint32_t boot_lba; /* LBA of bootstrap code */
uint8_t type; /* Type byte for INT 13h AH=08h */
uint8_t driveno; /* Drive no */
- uint16_t sector_size; /* Sector size in bytes (512 vs. 2048) */
+ uint8_t sector_shift; /* Sector size as a power of 2 */
const char *hsrc, *ssrc; /* Origins of H and S geometries */
};
printf("command line: %s\n", shdr->cmdline);
- hd_geometry.sector_size = 512; /* Assume floppy/HDD at first */
+ hd_geometry.sector_shift = 9; /* Assume floppy/HDD at first */
offset = 0;
if (CMD_HASDATA(p = getcmditem("offset")) && (v = atou(p)))
offset = v;
- sectors = xsectors = (size - offset) >> 9;
+ sectors = xsectors = (size - offset) >> hd_geometry.sector_shift;
hd_geometry.hsrc = "guess";
hd_geometry.ssrc = "guess";
hd_geometry.h = 255;
hd_geometry.s = 15;
/* 2048-byte sectors, so adjust the size and count */
- hd_geometry.sector_size = 2048;
- sectors = (size - hd_geometry.offset) >> 11;
+ hd_geometry.sector_shift = 11;
break;
case 1: /* 1.2 MB floppy */
hd_geometry.s = 15;
case 4:
hd_geometry.driveno = 0x80;
hd_geometry.type = 0;
- sectors = (size - hd_geometry.offset) >> 9;
break;
}
+ sectors = (size - hd_geometry.offset) >> hd_geometry.sector_shift;
+
/* For HDD emulation, we figure out the geometry later. Otherwise: */
if (hd_geometry.s) {
hd_geometry.hsrc = hd_geometry.ssrc = "El Torito";
hd_geometry.h = dosemu.h;
hd_geometry.s = dosemu.s;
hd_geometry.offset += dosemu.offset;
- sectors = (size - hd_geometry.offset) >> 9;
+ sectors = (size - hd_geometry.offset) >> hd_geometry.sector_shift;
hd_geometry.hsrc = hd_geometry.ssrc = "DOSEMU";
}
if (!(max_h | max_s)) {
/* No FAT filesystem found to steal geometry from... */
- if ((sectors < 4096 * 2) && (hd_geometry.sector_size == 512)) {
+ if ((sectors < 4096 * 2) && (hd_geometry.sector_shift == 9)) {
int ok = 0;
unsigned int xsectors = sectors;
/* Choose the appropriate installable memdisk hook */
if (do_eltorito) {
- if (geometry->sector_size == 2048) {
+ if (geometry->sector_shift == 11) {
bin_size = (int)&_binary_memdisk_iso_2048_bin_size;
memdisk_hook = (char *)&_binary_memdisk_iso_2048_bin_start;
} else {
pptr->sectors = geometry->s;
pptr->mdi.disksize = geometry->sectors;
pptr->mdi.diskbuf = ramdisk_image + geometry->offset;
+ pptr->mdi.sector_shift = geometry->sector_shift;
pptr->statusptr = (geometry->driveno & 0x80) ? 0x474 : 0x441;
pptr->mdi.bootloaderid = shdr->type_of_loader;
* for INT 0x13, AH=0x48 "EDD Get Disk Parameters" call on an
* El Torito ODD. Check for 2048-byte sector size
*/
- if (geometry->sector_size != 2048)
+ if (geometry->sector_shift != 11)
pptr->edd_dpt.flags |= 0x0002; /* Geometry valid */
}
if (!(geometry->driveno & 0x80)) {