totalsecs = 0x0fffffff;
pw(ide, 60, (uae_u16)totalsecs);
pw(ide, 61, (uae_u16)(totalsecs >> 16));
- if (ide->ata_level) {
+ if (ide->ata_level > 0) {
pw(ide, 64, ide->ata_level ? 0x03 : 0x00); /* PIO3 and PIO4 */
pw(ide, 65, 120); /* MDMA2 supported */
pw(ide, 66, 120);
static void ide_identify_drive (struct ide_hdf *ide)
{
- if (!ide_isdrive (ide)) {
+ if (!ide_isdrive (ide) || ide->ata_level < 0) {
ide_fail (ide);
return;
}
static void ide_set_multiple_mode (struct ide_hdf *ide)
{
+ if (ide->ata_level < 0) {
+ ide_fail(ide);
+ return;
+ }
+
write_log (_T("IDE%d drive multiple mode = %d\n"), ide->num, ide->regs.ide_nsector);
if (ide->regs.ide_nsector > (ide->max_multiple_mode >> (ide->blocksize / 512 - 1))) {
ide_fail(ide);
static void ide_set_features (struct ide_hdf *ide)
{
+ if (ide->ata_level < 0) {
+ ide_fail(ide);
+ return;
+ }
+
int type = ide->regs.ide_nsector >> 3;
int mode = ide->regs.ide_nsector & 7;
int multi = flags & 1;
ide->lba48cmd = (flags & 2) != 0;
- if (multi && ide->multiple_mode == 0) {
+ if (multi && (ide->multiple_mode == 0 || ide->ata_level < 0)) {
ide_fail (ide);
return;
}
int multi = flags & 1;
ide->lba48cmd = (flags & 2) != 0;
- if (multi && ide->multiple_mode == 0) {
+ if (multi && (ide->multiple_mode == 0 || ide->ata_level < 0)) {
ide_fail (ide);
return;
}
} else if (cmd == 0x70) { /* seek */
ide_interrupt (ide);
} else if (cmd == 0xe0 || cmd == 0xe1 || cmd == 0xe7 || cmd == 0xea) { /* standby now/idle/flush cache/flush cache ext */
- ide_interrupt (ide);
+ if (ide->ata_level < 0) {
+ ide_fail(ide);
+ } else {
+ ide_interrupt(ide);
+ }
} else if (cmd == 0xe5) { /* check power mode */
ide->regs.ide_nsector = 0xff;
ide_interrupt (ide);
struct ide_hdf *add_ide_unit (struct ide_hdf **idetable, int max, int ch, struct uaedev_config_info *ci, struct romconfig *rc)
{
struct ide_hdf *ide;
+ bool vb;
alloc_ide_mem(idetable, max, NULL);
if (ch < 0)
ide->max_lba = ci.max_lba;
if (ide->lba48 && !ide->ata_level)
ide->ata_level = 1;
+ if (ini_getbool(ide->hdhfd.hfd.geometry, _T("IDENTITY"), _T("disabled"), &vb)) {
+ if (vb) {
+ ide->ata_level = -1;
+ ide->lba48 = false;
+ ide->lba = false;
+ ide->max_multiple_mode = 0;
+ }
+ }
write_log (_T("IDE%d HD '%s', LCHS=%d/%d/%d. PCHS=%d/%d/%d %uM. MM=%d LBA48=%d\n"),
ch, ide->hdhfd.hfd.ci.rootdir,