Index: trunk/src/VBox/Devices/PC/BIOS/ahci.c
===================================================================
--- trunk/src/VBox/Devices/PC/BIOS/ahci.c	(revision 69807)
+++ trunk/src/VBox/Devices/PC/BIOS/ahci.c	(revision 70333)
@@ -814,9 +814,10 @@
                 removable = *(abBuffer+0) & 0x80 ? 1 : 0;
 
-                bios_dsk->ahcidev[devcount_ahci].port = u8Port;
-                bios_dsk->devices[hd_index].type      = DSK_TYPE_AHCI;
-                bios_dsk->devices[hd_index].device    = DSK_DEVICE_CDROM;
-                bios_dsk->devices[hd_index].removable = removable;
-                bios_dsk->devices[hd_index].blksize   = 2048;
+                bios_dsk->ahcidev[devcount_ahci].port   = u8Port;
+                bios_dsk->devices[hd_index].type        = DSK_TYPE_AHCI;
+                bios_dsk->devices[hd_index].device      = DSK_DEVICE_CDROM;
+                bios_dsk->devices[hd_index].removable   = removable;
+                bios_dsk->devices[hd_index].blksize     = 2048;
+                bios_dsk->devices[hd_index].translation = GEO_TRANSLATION_NONE;
 
                 /* Store the ID of the device in the BIOS cdidmap. */
Index: trunk/src/VBox/Devices/PC/BIOS/ata.h
===================================================================
--- trunk/src/VBox/Devices/PC/BIOS/ata.h	(revision 69807)
+++ trunk/src/VBox/Devices/PC/BIOS/ata.h	(revision 70333)
@@ -180,42 +180,3 @@
 #define ATA_CMD_WRITE_VERIFY                 0x3C
 
-// for access to the int13ext structure
-typedef struct {
-    uint8_t     size;
-    uint8_t     reserved;
-    uint16_t    count;
-    uint16_t    offset;
-    uint16_t    segment;
-    uint32_t    lba1;
-    uint32_t    lba2;
-} int13ext_t;
-
-#define Int13Ext ((int13ext_t *) 0)
-
-// Disk Physical Table definition
-typedef struct {
-    uint16_t    size;
-    uint16_t    infos;
-    uint32_t    cylinders;
-    uint32_t    heads;
-    uint32_t    spt;
-    uint32_t    sector_count1;
-    uint32_t    sector_count2;
-    uint16_t    blksize;
-    uint16_t    dpte_offset;
-    uint16_t    dpte_segment;
-    uint16_t    key;
-    uint8_t     dpi_length;
-    uint8_t     reserved1;
-    uint16_t    reserved2;
-    uint8_t     host_bus[4];
-    uint8_t     iface_type[8];
-    uint8_t     iface_path[8];
-    uint8_t     device_path[8];
-    uint8_t     reserved3;
-    uint8_t     checksum;
-} dpt_t;
-
-#define Int13DPT ((dpt_t *) 0)
-
 extern void     ata_reset(uint16_t device);
Index: trunk/src/VBox/Devices/PC/BIOS/disk.c
===================================================================
--- trunk/src/VBox/Devices/PC/BIOS/disk.c	(revision 69807)
+++ trunk/src/VBox/Devices/PC/BIOS/disk.c	(revision 70333)
@@ -135,4 +135,138 @@
 }
 
+int edd_fill_dpt(dpt_t __far *dpt, bio_dsk_t __far *bios_dsk, uint8_t device)
+{
+    uint16_t    ebda_seg = read_word(0x0040,0x000E);
+
+    /* Check if buffer is large enough. */
+    if (dpt->size < 0x1a)
+        return -1;
+
+    /* Fill in EDD 1.x table. */
+    if (dpt->size >= 0x1a) {
+        uint64_t    lba;
+
+        dpt->size      = 0x1a;
+        dpt->blksize   = bios_dsk->devices[device].blksize;
+
+        if (bios_dsk->devices[device].device == DSK_DEVICE_CDROM) {
+            dpt->infos         = 0x74;  /* Removable, media change, lockable, max values */
+            dpt->cylinders     = 0xffffffff;
+            dpt->heads         = 0xffffffff;
+            dpt->spt           = 0xffffffff;
+            dpt->sector_count1 = 0xffffffff;
+            dpt->sector_count2 = 0xffffffff;
+        } else {
+            dpt->infos     = 0x02;  // geometry is valid
+            dpt->cylinders = bios_dsk->devices[device].pchs.cylinders;
+            dpt->heads     = bios_dsk->devices[device].pchs.heads;
+            dpt->spt       = bios_dsk->devices[device].pchs.spt;
+            lba = bios_dsk->devices[device].sectors;
+            dpt->sector_count1 = lba;
+            dpt->sector_count2 = lba >> 32;
+        }
+    }
+
+    /* Fill in EDD 2.x table. */
+    if (dpt->size >= 0x1e) {
+        uint8_t     channel, irq, mode, checksum, i, xlation;
+        uint16_t    iobase1, iobase2, options;
+
+        dpt->size = 0x1e;
+        dpt->dpte_segment = ebda_seg;
+        dpt->dpte_offset  = (uint16_t)&EbdaData->bdisk.dpte;
+
+        // Fill in dpte
+        channel = device / 2;
+        iobase1 = bios_dsk->channels[channel].iobase1;
+        iobase2 = bios_dsk->channels[channel].iobase2;
+        irq     = bios_dsk->channels[channel].irq;
+        mode    = bios_dsk->devices[device].mode;
+        xlation = bios_dsk->devices[device].translation;
+
+        options  = (xlation == GEO_TRANSLATION_NONE ? 0 : 1 << 3);  /* CHS translation */
+        options |= (1 << 4);    /* LBA translation */
+        if (bios_dsk->devices[device].device == DSK_DEVICE_CDROM) {
+            options |= (1 << 5);    /* Removable device */
+            options |= (1 << 6);    /* ATAPI device */
+        }
+#if VBOX_BIOS_CPU >= 80386
+        options |= (mode == ATA_MODE_PIO32 ? 1 : 0 << 7);
+#endif
+        options |= (xlation == GEO_TRANSLATION_LBA ? 1 : 0 << 9);
+        options |= (xlation == GEO_TRANSLATION_RECHS ? 3 : 0 << 9);
+
+        bios_dsk->dpte.iobase1  = iobase1;
+        bios_dsk->dpte.iobase2  = iobase2;
+        bios_dsk->dpte.prefix   = (0xe | (device % 2)) << 4;
+        bios_dsk->dpte.unused   = 0xcb;
+        bios_dsk->dpte.irq      = irq;
+        bios_dsk->dpte.blkcount = 1;
+        bios_dsk->dpte.dma      = 0;
+        bios_dsk->dpte.pio      = 0;
+        bios_dsk->dpte.options  = options;
+        bios_dsk->dpte.reserved = 0;
+        bios_dsk->dpte.revision = 0x11;
+
+        checksum = 0;
+        for (i = 0; i < 15; ++i)
+            checksum += read_byte(ebda_seg, (uint16_t)&EbdaData->bdisk.dpte + i);
+        checksum = -checksum;
+        bios_dsk->dpte.checksum = checksum;
+    }
+
+    /* Fill in EDD 3.x table. */
+    if (dpt->size >= 0x42) {
+        uint8_t     channel, iface, checksum, i;
+        uint16_t    iobase1;
+
+        channel = device / 2;
+        iface   = bios_dsk->channels[channel].iface;
+        iobase1 = bios_dsk->channels[channel].iobase1;
+
+        dpt->size       = 0x42;
+        dpt->key        = 0xbedd;
+        dpt->dpi_length = 0x24;
+        dpt->reserved1  = 0;
+        dpt->reserved2  = 0;
+
+        if (iface == ATA_IFACE_ISA) {
+            dpt->host_bus[0] = 'I';
+            dpt->host_bus[1] = 'S';
+            dpt->host_bus[2] = 'A';
+            dpt->host_bus[3] = ' ';
+        }
+        else {
+            // FIXME PCI
+        }
+        dpt->iface_type[0] = 'A';
+        dpt->iface_type[1] = 'T';
+        dpt->iface_type[2] = 'A';
+        dpt->iface_type[3] = ' ';
+        dpt->iface_type[4] = ' ';
+        dpt->iface_type[5] = ' ';
+        dpt->iface_type[6] = ' ';
+        dpt->iface_type[7] = ' ';
+
+        if (iface == ATA_IFACE_ISA) {
+            ((uint16_t __far *)dpt->iface_path)[0] = iobase1;
+            ((uint16_t __far *)dpt->iface_path)[1] = 0;
+            ((uint32_t __far *)dpt->iface_path)[1] = 0;
+        }
+        else {
+            // FIXME PCI
+        }
+        ((uint16_t __far *)dpt->device_path)[0] = device & 1; // device % 2; @todo: correct?
+        ((uint16_t __far *)dpt->device_path)[1] = 0;
+        ((uint32_t __far *)dpt->device_path)[1] = 0;
+
+        checksum = 0;
+        for (i = 30; i < 64; i++)
+            checksum += ((uint8_t __far *)dpt)[i];
+        checksum = -checksum;
+        dpt->checksum = checksum;
+    }
+    return 0;
+}
 
 void BIOSCALL int13_harddisk(disk_regs_t r)
@@ -349,13 +483,16 @@
 {
     uint64_t            lba;
-    uint16_t            ebda_seg = read_word(0x0040,0x000E);
     uint16_t            segment, offset;
-    uint16_t            npc, nph, npspt;
-    uint16_t            size, count;
     uint8_t             device, status;
+    uint16_t            count;
     uint8_t             type;
     bio_dsk_t __far     *bios_dsk;
     int13ext_t __far    *i13_ext;
+#if 0
+    uint16_t            ebda_seg = read_word(0x0040,0x000E);
+    uint16_t            npc, nph, npspt;
+    uint16_t            size;
     dpt_t __far         *dpt;
+#endif
 
     bios_dsk = read_word(0x0040,0x000E) :> &EbdaData->bdisk;
@@ -456,128 +593,8 @@
 
     case 0x48: // IBM/MS get drive parameters
-        dpt = DS :> (dpt_t *)SI;
-        size = dpt->size;
-
-        /* Check if buffer is large enough. */
-        if (size < 0x1a)
+        if (edd_fill_dpt(DS :> (dpt_t *)SI, bios_dsk, device))
             goto int13x_fail;
-
-        /* Fill in EDD 1.x table. */
-        if (size >= 0x1a) {
-            uint16_t   blksize;
-
-            npc     = bios_dsk->devices[device].pchs.cylinders;
-            nph     = bios_dsk->devices[device].pchs.heads;
-            npspt   = bios_dsk->devices[device].pchs.spt;
-            lba     = bios_dsk->devices[device].sectors;
-            blksize = bios_dsk->devices[device].blksize;
-
-            dpt->size      = 0x1a;
-            dpt->infos     = 0x02;  // geometry is valid
-            dpt->cylinders = npc;
-            dpt->heads     = nph;
-            dpt->spt       = npspt;
-            dpt->blksize   = blksize;
-            dpt->sector_count1 = lba;
-            dpt->sector_count2 = lba >> 32;
-        }
-
-        /* Fill in EDD 2.x table. */
-        if (size >= 0x1e) {
-            uint8_t     channel, irq, mode, checksum, i, translation;
-            uint16_t    iobase1, iobase2, options;
-
-            dpt->size = 0x1e;
-            dpt->dpte_segment = ebda_seg;
-            dpt->dpte_offset  = (uint16_t)&EbdaData->bdisk.dpte;
-
-            // Fill in dpte
-            channel = device / 2;
-            iobase1 = bios_dsk->channels[channel].iobase1;
-            iobase2 = bios_dsk->channels[channel].iobase2;
-            irq     = bios_dsk->channels[channel].irq;
-            mode    = bios_dsk->devices[device].mode;
-            translation = bios_dsk->devices[device].translation;
-
-            options  = (translation == GEO_TRANSLATION_NONE ? 0 : 1 << 3);  // chs translation
-            options |= (1 << 4);    // lba translation
-#if VBOX_BIOS_CPU >= 80386
-            options |= (mode == ATA_MODE_PIO32 ? 1 : 0 << 7);
-#endif
-            options |= (translation == GEO_TRANSLATION_LBA ? 1 : 0 << 9);
-            options |= (translation == GEO_TRANSLATION_RECHS ? 3 : 0 << 9);
-
-            bios_dsk->dpte.iobase1  = iobase1;
-            bios_dsk->dpte.iobase2  = iobase2;
-            bios_dsk->dpte.prefix   = (0xe | (device % 2)) << 4;
-            bios_dsk->dpte.unused   = 0xcb;
-            bios_dsk->dpte.irq      = irq;
-            bios_dsk->dpte.blkcount = 1;
-            bios_dsk->dpte.dma      = 0;
-            bios_dsk->dpte.pio      = 0;
-            bios_dsk->dpte.options  = options;
-            bios_dsk->dpte.reserved = 0;
-            bios_dsk->dpte.revision = 0x11;
-
-            checksum = 0;
-            for (i = 0; i < 15; ++i)
-                checksum += read_byte(ebda_seg, (uint16_t)&EbdaData->bdisk.dpte + i);
-            checksum = -checksum;
-            bios_dsk->dpte.checksum = checksum;
-        }
-
-        /* Fill in EDD 3.x table. */
-        if(size >= 0x42) {
-            uint8_t     channel, iface, checksum, i;
-            uint16_t    iobase1;
-
-            channel = device / 2;
-            iface   = bios_dsk->channels[channel].iface;
-            iobase1 = bios_dsk->channels[channel].iobase1;
-
-            dpt->size       = 0x42;
-            dpt->key        = 0xbedd;
-            dpt->dpi_length = 0x24;
-            dpt->reserved1  = 0;
-            dpt->reserved2  = 0;
-
-            if (iface == ATA_IFACE_ISA) {
-                dpt->host_bus[0] = 'I';
-                dpt->host_bus[1] = 'S';
-                dpt->host_bus[2] = 'A';
-                dpt->host_bus[3] = ' ';
-            }
-            else {
-                // FIXME PCI
-            }
-            dpt->iface_type[0] = 'A';
-            dpt->iface_type[1] = 'T';
-            dpt->iface_type[2] = 'A';
-            dpt->iface_type[3] = ' ';
-            dpt->iface_type[4] = ' ';
-            dpt->iface_type[5] = ' ';
-            dpt->iface_type[6] = ' ';
-            dpt->iface_type[7] = ' ';
-
-            if (iface == ATA_IFACE_ISA) {
-                ((uint16_t __far *)dpt->iface_path)[0] = iobase1;
-                ((uint16_t __far *)dpt->iface_path)[1] = 0;
-                ((uint32_t __far *)dpt->iface_path)[1] = 0;
-            }
-            else {
-                // FIXME PCI
-            }
-            ((uint16_t __far *)dpt->device_path)[0] = device & 1; // device % 2; @todo: correct?
-            ((uint16_t __far *)dpt->device_path)[1] = 0;
-            ((uint32_t __far *)dpt->device_path)[1] = 0;
-
-            checksum = 0;
-            for (i = 30; i < 64; i++)
-                checksum += read_byte(DS, SI + i);
-            checksum = -checksum;
-            dpt->checksum = checksum;
-        }
-
-        goto int13x_success;
+        else
+            goto int13x_success;
         break;
 
Index: trunk/src/VBox/Devices/PC/BIOS/ebda.h
===================================================================
--- trunk/src/VBox/Devices/PC/BIOS/ebda.h	(revision 69807)
+++ trunk/src/VBox/Devices/PC/BIOS/ebda.h	(revision 70333)
@@ -322,4 +322,39 @@
 #define EbdaData ((ebda_data_t *) 0)
 
+// for access to the int13ext structure
+typedef struct {
+    uint8_t     size;
+    uint8_t     reserved;
+    uint16_t    count;
+    uint16_t    offset;
+    uint16_t    segment;
+    uint32_t    lba1;
+    uint32_t    lba2;
+} int13ext_t;
+
+/* Disk Physical Table structure */
+typedef struct {
+    uint16_t    size;
+    uint16_t    infos;
+    uint32_t    cylinders;
+    uint32_t    heads;
+    uint32_t    spt;
+    uint32_t    sector_count1;
+    uint32_t    sector_count2;
+    uint16_t    blksize;
+    uint16_t    dpte_offset;
+    uint16_t    dpte_segment;
+    uint16_t    key;
+    uint8_t     dpi_length;
+    uint8_t     reserved1;
+    uint16_t    reserved2;
+    uint8_t     host_bus[4];
+    uint8_t     iface_type[8];
+    uint8_t     iface_path[8];
+    uint8_t     device_path[8];
+    uint8_t     reserved3;
+    uint8_t     checksum;
+} dpt_t;
+
 /* Note: Using fastcall reduces stack usage a little. */
 int __fastcall ata_read_sectors(bio_dsk_t __far *bios_dsk);
@@ -333,4 +368,5 @@
 
 extern void set_geom_lba(chs_t __far *lgeo, uint64_t nsectors);
+extern int edd_fill_dpt(dpt_t __far *dpt, bio_dsk_t __far *bios_dsk, uint8_t device);
 
 // @todo: put this elsewhere (and change/eliminate?)
Index: trunk/src/VBox/Devices/PC/BIOS/eltorito.c
===================================================================
--- trunk/src/VBox/Devices/PC/BIOS/eltorito.c	(revision 69807)
+++ trunk/src/VBox/Devices/PC/BIOS/eltorito.c	(revision 70333)
@@ -153,5 +153,4 @@
 extern  int     diskette_param_table;
 
-
 void BIOSCALL cdemu_init(void)
 {
@@ -488,4 +487,7 @@
     cdemu_t __far       *cdemu;
     bio_dsk_t __far     *bios_dsk;
+    int13ext_t __far    *i13x;
+    uint32_t            lba;
+    uint16_t            count;
 
     cdemu    = ebda_seg :> &EbdaData->cdemu;
@@ -654,17 +656,89 @@
         break;
 
+    case 0x41: // IBM/MS installation check
+        BX = 0xaa55;    // install check
+        SET_AH(0x30);   // EDD 2.1
+        CX = 0x0007;    // ext disk access, removable and edd
+        goto int13_success_noah;
+        break;
+
+    case 0x42: // IBM/MS extended read
+    case 0x44: // IBM/MS verify sectors
+    case 0x47: // IBM/MS extended seek
+
+        /* Load the I13X struct pointer. */
+        i13x = MK_FP(DS, SI);
+
+        count   = i13x->count;
+        segment = i13x->segment;
+        offset  = i13x->offset;
+
+        // Can't use 64 bits lba
+        lba = i13x->lba2;
+        if (lba != 0L) {
+            BX_PANIC("%s: function %02x. Can't use 64bits lba\n", __func__, GET_AH());
+            goto int13_fail;
+        }
+
+        // Get 32 bits lba
+        lba = i13x->lba1;
+
+        // If verify or seek
+        if (( GET_AH() == 0x44 ) || ( GET_AH() == 0x47 ))
+            goto int13_success;
+
+        BX_DEBUG_INT13_ET("%s: read %u sectors @ LBA %lu to %04X:%04X\n",
+                          __func__, count, lba, segment, offset);
+
+        nbsectors = count;
+        vlba      = lba;
+        ilba      = cdemu->ilba;
+
+        // start lba on cd
+        slba   = (uint32_t)vlba / 4;
+        before = (uint32_t)vlba % 4;
+
+        // end lba on cd
+        elba = (uint32_t)(vlba + nbsectors - 1) / 4;
+
+        _fmemset(&atapicmd, 0, sizeof(atapicmd));
+        atapicmd.command = 0x28;    // READ 10 command
+        atapicmd.lba     = swap_32(ilba + slba);
+        atapicmd.nsect   = swap_16(elba - slba + 1);
+
+        bios_dsk->drqp.skip_b = before * 512;
+        bios_dsk->drqp.skip_a = ((4 - nbsectors % 4 - before) * 512) % 2048;
+
+        status = pktacc[bios_dsk->devices[device].type](device, 12, (char __far *)&atapicmd, before*512, nbsectors*512L, ATA_DATA_IN, MK_FP(segment,offset));
+
+        bios_dsk->drqp.skip_b = 0;
+        bios_dsk->drqp.skip_a = 0;
+
+        count = (uint16_t)(bios_dsk->drqp.trsfbytes >> 9);
+        i13x->count = count;
+
+        if (status != 0) {
+            BX_INFO("%s: function %02x, status %02x !\n", __func__, GET_AH(), status);
+            SET_AH(0x0c);
+            goto int13_fail_noah;
+        }
+
+        goto int13_success;
+        break;
+
+    case 0x48: // IBM/MS get drive parameters
+        if (edd_fill_dpt(DS :> (dpt_t *)SI, bios_dsk, device))
+            goto int13_fail;
+        else
+            goto int13_success;
+        break;
+
     // all those functions return unimplemented
     case 0x0a: /* read disk sectors with ECC */
     case 0x0b: /* write disk sectors with ECC */
     case 0x18: /* set media type for format */
-    case 0x41: // IBM/MS installation check
-      // FIXME ElTorito Harddisk. Darwin would like to use EDD
-    case 0x42: // IBM/MS extended read
     case 0x43: // IBM/MS extended write
-    case 0x44: // IBM/MS verify sectors
     case 0x45: // IBM/MS lock/unlock drive
     case 0x46: // IBM/MS eject media
-    case 0x47: // IBM/MS extended seek
-    case 0x48: // IBM/MS get drive parameters
     case 0x49: // IBM/MS extended media change
     case 0x4e: // ? - set hardware configuration
@@ -702,8 +776,7 @@
     cdb_atapi           atapicmd;
     uint32_t            lba;
-    uint16_t            count, segment, offset, size;
+    uint16_t            count, segment, offset;
     bio_dsk_t __far     *bios_dsk;
     int13ext_t __far    *i13x;
-    dpt_t __far         *dpt;
 
     bios_dsk = ebda_seg :> &EbdaData->bdisk;
@@ -890,125 +963,9 @@
         break;
 
-    /// @todo Part of this should be merged with analogous code in disk.c
     case 0x48: // IBM/MS get drive parameters
-        dpt = DS :> (dpt_t *)SI;
-        size = dpt->size;
-
-        // Buffer is too small
-        if (size < 0x1a)
+        if (edd_fill_dpt(DS :> (dpt_t *)SI, bios_dsk, device))
             goto int13_fail;
-
-        // EDD 1.x
-        if (size >= 0x1a) {
-            uint16_t   blksize;
-
-            blksize = bios_dsk->devices[device].blksize;
-
-            dpt->size      = 0x1a;
-            dpt->infos     = 0x74;  /* Removable, media change, lockable, max values */
-            dpt->cylinders = 0xffffffff;
-            dpt->heads     = 0xffffffff;
-            dpt->spt       = 0xffffffff;
-            dpt->blksize   = blksize;
-            dpt->sector_count1 = 0xffffffff;  // FIXME should be Bit64
-            dpt->sector_count2 = 0xffffffff;
-        }
-
-        // EDD 2.x
-        if(size >= 0x1e) {
-            uint8_t     channel, irq, mode, checksum, i;
-            uint16_t    iobase1, iobase2, options;
-
-            dpt->size = 0x1e;
-            dpt->dpte_segment = ebda_seg;
-            dpt->dpte_offset  = (uint16_t)&EbdaData->bdisk.dpte;
-
-            // Fill in dpte
-            channel = device / 2;
-            iobase1 = bios_dsk->channels[channel].iobase1;
-            iobase2 = bios_dsk->channels[channel].iobase2;
-            irq     = bios_dsk->channels[channel].irq;
-            mode    = bios_dsk->devices[device].mode;
-
-            // FIXME atapi device
-            options  = (1<<4); // lba translation
-            options |= (1<<5); // removable device
-            options |= (1<<6); // atapi device
-#if VBOX_BIOS_CPU >= 80386
-            options |= (mode==ATA_MODE_PIO32?1:0<<7);
-#endif
-
-            bios_dsk->dpte.iobase1  = iobase1;
-            bios_dsk->dpte.iobase2  = iobase2;
-            bios_dsk->dpte.prefix   = (0xe | (device % 2))<<4;
-            bios_dsk->dpte.unused   = 0xcb;
-            bios_dsk->dpte.irq      = irq;
-            bios_dsk->dpte.blkcount = 1 ;
-            bios_dsk->dpte.dma      = 0;
-            bios_dsk->dpte.pio      = 0;
-            bios_dsk->dpte.options  = options;
-            bios_dsk->dpte.reserved = 0;
-            bios_dsk->dpte.revision = 0x11;
-
-            checksum = 0;
-            for (i = 0; i < 15; ++i)
-                checksum += read_byte(ebda_seg, (uint16_t)&EbdaData->bdisk.dpte + i);
-            checksum = -checksum;
-            bios_dsk->dpte.checksum = checksum;
-        }
-
-        // EDD 3.x
-        if(size >= 0x42) {
-            uint8_t     channel, iface, checksum, i;
-            uint16_t    iobase1;
-
-            channel = device / 2;
-            iface   = bios_dsk->channels[channel].iface;
-            iobase1 = bios_dsk->channels[channel].iobase1;
-
-            dpt->size       = 0x42;
-            dpt->key        = 0xbedd;
-            dpt->dpi_length = 0x24;
-            dpt->reserved1  = 0;
-            dpt->reserved2  = 0;
-
-            if (iface == ATA_IFACE_ISA) {
-                dpt->host_bus[0] = 'I';
-                dpt->host_bus[1] = 'S';
-                dpt->host_bus[2] = 'A';
-                dpt->host_bus[3] = ' ';
-            }
-            else {
-                // FIXME PCI
-            }
-            dpt->iface_type[0] = 'A';
-            dpt->iface_type[1] = 'T';
-            dpt->iface_type[2] = 'A';
-            dpt->iface_type[3] = ' ';
-            dpt->iface_type[4] = ' ';
-            dpt->iface_type[5] = ' ';
-            dpt->iface_type[6] = ' ';
-            dpt->iface_type[7] = ' ';
-
-            if (iface == ATA_IFACE_ISA) {
-                ((uint16_t __far *)dpt->iface_path)[0] = iobase1;
-                ((uint16_t __far *)dpt->iface_path)[1] = 0;
-                ((uint32_t __far *)dpt->iface_path)[1] = 0;
-            }
-            else {
-                // FIXME PCI
-            }
-            ((uint16_t __far *)dpt->device_path)[0] = device & 1;
-            ((uint16_t __far *)dpt->device_path)[1] = 0;
-            ((uint32_t __far *)dpt->device_path)[1] = 0;
-
-            checksum = 0;
-            for (i = 30; i < 64; ++i)
-                checksum += ((uint8_t __far *)dpt)[i];
-            checksum = -checksum;
-            dpt->checksum = checksum;
-        }
-
-        goto int13_success;
+        else
+            goto int13_success;
         break;
 
Index: trunk/src/VBox/Devices/PC/BIOS/notes.txt
===================================================================
--- trunk/src/VBox/Devices/PC/BIOS/notes.txt	(revision 69807)
+++ trunk/src/VBox/Devices/PC/BIOS/notes.txt	(revision 70333)
@@ -105,4 +105,12 @@
   appears to be valid despite the oddity.
 
+- Darwin 6.0.2 also uses an El Torito emulated hard disk. In addition, if
+  INT 13h/41h succeeds, Darwin uses INT13X to read from the emulated drive.
+
+- Symantec Ghost 11.5 bootable CD also uses El Torito hard disk emulation,
+  uses INT13X without checking for support, and crashes if INT13X is not
+  supported on the emulated drive.
+
+
  286 BIOS
  --------
Index: trunk/src/VBox/Devices/PC/BIOS/scsi.c
===================================================================
--- trunk/src/VBox/Devices/PC/BIOS/scsi.c	(revision 69807)
+++ trunk/src/VBox/Devices/PC/BIOS/scsi.c	(revision 70333)
@@ -598,8 +598,9 @@
             bios_dsk->scsidev[devcount_scsi].io_base   = io_base;
             bios_dsk->scsidev[devcount_scsi].target_id = i;
-            bios_dsk->devices[hd_index].type      = DSK_TYPE_SCSI;
-            bios_dsk->devices[hd_index].device    = DSK_DEVICE_CDROM;
-            bios_dsk->devices[hd_index].removable = removable;
-            bios_dsk->devices[hd_index].blksize   = 2048;
+            bios_dsk->devices[hd_index].type        = DSK_TYPE_SCSI;
+            bios_dsk->devices[hd_index].device      = DSK_DEVICE_CDROM;
+            bios_dsk->devices[hd_index].removable   = removable;
+            bios_dsk->devices[hd_index].blksize     = 2048;
+            bios_dsk->devices[hd_index].translation = GEO_TRANSLATION_NONE;
 
             /* Store the ID of the device in the BIOS cdidmap. */
