From 1a95bd3088639ff5f63c2cc180fc8855a5bf975e Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 13 Oct 2024 16:28:18 +0100 Subject: [PATCH] DEV9: Support 8bit reads/writes for most ATA regs --- pcsx2/DEV9/ATA/ATA.h | 4 +-- pcsx2/DEV9/ATA/ATA_State.cpp | 49 ++++++++++++++++++------------------ pcsx2/DEV9/DEV9.cpp | 12 +++------ 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/pcsx2/DEV9/ATA/ATA.h b/pcsx2/DEV9/ATA/ATA.h index dc8449b772..b2d5a523a9 100644 --- a/pcsx2/DEV9/ATA/ATA.h +++ b/pcsx2/DEV9/ATA/ATA.h @@ -160,8 +160,8 @@ public: void ATA_HardReset(); - u16 Read16(u32 addr); - void Write16(u32 addr, u16 value); + u16 Read(u32 addr, int width); + void Write(u32 addr, u16 value, int width); void Async(u32 cycles); diff --git a/pcsx2/DEV9/ATA/ATA_State.cpp b/pcsx2/DEV9/ATA/ATA_State.cpp index 3e892727ce..e18bcc1e21 100644 --- a/pcsx2/DEV9/ATA/ATA_State.cpp +++ b/pcsx2/DEV9/ATA/ATA_State.cpp @@ -329,19 +329,23 @@ void ATA::ATA_HardReset() ResetEnd(true); } -u16 ATA::Read16(u32 addr) +u16 ATA::Read(u32 addr, int width) { switch (addr) { case ATA_R_DATA: + if (width == 8) + Console.Error("DEV9:ATA : ATA_R_DATA 8bit read???, Active %s", (GetSelectedDevice() == 0) ? "True" : "False"); + //else + // DevCon.WriteLn("DEV9: ATA: ATA_R_DATA %dbit read, Active %s", width, hard, (GetSelectedDevice() == 0) ? "True" : "False"); return ATAreadPIO(); case ATA_R_ERROR: - //DevCon.WriteLn("DEV9: *ATA_R_ERROR 16bit read at address %x, value %x, Active %s", addr, regError, (GetSelectedDevice() == 0) ? "True" : "False"); + //DevCon.WriteLn("DEV9: ATA: ATA_R_ERROR %dbit read %x, Active %s", width, regError, (GetSelectedDevice() == 0) ? "True" : "False"); if (GetSelectedDevice() != 0) return 0; return regError; case ATA_R_NSECTOR: - //DevCon.WriteLn("DEV9: *ATA_R_NSECTOR 16bit read at address %x, value %x, Active %s", addr, nsector, (GetSelectedDevice() == 0) ? "True" : "False"); + //DevCon.WriteLn("DEV9: ATA: ATA_R_NSECTOR %dbit read %x, Active %s", width, nsector, (GetSelectedDevice() == 0) ? "True" : "False"); if (GetSelectedDevice() != 0) return 0; if (!regControlHOBRead) @@ -349,7 +353,7 @@ u16 ATA::Read16(u32 addr) else return regNsectorHOB; case ATA_R_SECTOR: - //DevCon.WriteLn("DEV9: *ATA_R_NSECTOR 16bit read at address %x, value %x, Active %s", addr, regSector, (GetSelectedDevice() == 0) ? "True" : "False"); + //DevCon.WriteLn("DEV9: ATA: ATA_R_NSECTOR %dbit read %x, Active %s", width, regSector, (GetSelectedDevice() == 0) ? "True" : "False"); if (GetSelectedDevice() != 0) return 0; if (!regControlHOBRead) @@ -357,7 +361,7 @@ u16 ATA::Read16(u32 addr) else return regSectorHOB; case ATA_R_LCYL: - //DevCon.WriteLn("DEV9: *ATA_R_LCYL 16bit read at address %x, value %x, Active %s", addr, regLcyl, (GetSelectedDevice() == 0) ? "True" : "False"); + //DevCon.WriteLn("DEV9: ATA: ATA_R_LCYL %dbit read %x, Active %s", width, regLcyl, (GetSelectedDevice() == 0) ? "True" : "False"); if (GetSelectedDevice() != 0) return 0; if (!regControlHOBRead) @@ -365,7 +369,7 @@ u16 ATA::Read16(u32 addr) else return regLcylHOB; case ATA_R_HCYL: - //DevCon.WriteLn("DEV9: *ATA_R_HCYL 16bit read at address % x, value % x, Active %s", addr, regHcyl, (GetSelectedDevice() == 0) ? " True " : " False "); + //DevCon.WriteLn("DEV9: ATA: ATA_R_HCYL %dbit read %x, Active %s", width, regHcyl, (GetSelectedDevice() == 0) ? " True " : " False "); if (GetSelectedDevice() != 0) return 0; if (!regControlHOBRead) @@ -373,30 +377,28 @@ u16 ATA::Read16(u32 addr) else return regHcylHOB; case ATA_R_SELECT: - //DevCon.WriteLn("DEV9: *ATA_R_SELECT 16bit read at address % x, value % x, Active %s", addr, regSelect, (GetSelectedDevice() == 0) ? " True " : " False "); + //DevCon.WriteLn("DEV9: ATA: ATA_R_SELECT %dbit read %x, Active %s", width, regSelect, (GetSelectedDevice() == 0) ? " True " : " False "); return regSelect; case ATA_R_STATUS: - //DevCon.WriteLn("DEV9: *ATA_R_STATUS (Fallthough to ATA_R_ALT_STATUS)"); - //Clear irqcause + // Clear irqcause dev9.irqcause &= ~ATA_INTR_INTRQ; [[fallthrough]]; case ATA_R_ALT_STATUS: - //DevCon.WriteLn("DEV9: *ATA_R_ALT_STATUS 16bit read at address % x, value % x, Active %s", addr, regStatus, (GetSelectedDevice() == 0) ? " True " : " False "); + //DevCon.WriteLn("DEV9: ATA: %s %dbit read %x, Active %s", addr == ATA_R_ALT_STATUS ? "ATA_R_ALT_STATUS" : "ATA_R_STATUS", width, regStatus, (GetSelectedDevice() == 0) ? " True " : " False "); if (!EmuConfig.DEV9.HddEnable) return 0xff7f; // PS2 confirmed response when no HDD is actually connected. The Expansion bay always says HDD support is connected. - //raise IRQ? if (GetSelectedDevice() != 0) return 0; return regStatus; default: - Console.Error("DEV9: ATA: Unknown 16bit read at address %x", addr); + Console.Error("DEV9: ATA: Unknown %dbit read at address %x", width, addr); return 0xff; } } -void ATA::Write16(u32 addr, u16 value) +void ATA::Write(u32 addr, u16 value, int width) { if (addr != ATA_R_CMD && (regStatus & (ATA_STAT_BUSY | ATA_STAT_DRQ)) != 0) { @@ -406,47 +408,46 @@ void ATA::Write16(u32 addr, u16 value) switch (addr) { case ATA_R_FEATURE: - //DevCon.WriteLn("DEV9: *ATA_R_FEATURE 16bit write at address %x, value %x", addr, value); + //DevCon.WriteLn("DEV9: ATA: ATA_R_FEATURE %dbit write %x", width, value); ClearHOB(); regFeatureHOB = regFeature; regFeature = static_cast(value); break; case ATA_R_NSECTOR: - //DevCon.WriteLn("DEV9: *ATA_R_NSECTOR 16bit write at address %x, value %x", addr, value); + //DevCon.WriteLn("DEV9: ATA: ATA_R_NSECTOR %dbit write %x", width, value); ClearHOB(); regNsectorHOB = regNsector; regNsector = static_cast(value); break; case ATA_R_SECTOR: - //DevCon.WriteLn("DEV9: *ATA_R_SECTOR 16bit write at address %x, value %x", addr, value); + //DevCon.WriteLn("DEV9: ATA: ATA_R_SECTOR %dbit write %x", width, value); ClearHOB(); regSectorHOB = regSector; regSector = static_cast(value); break; case ATA_R_LCYL: - //DevCon.WriteLn("DEV9: *ATA_R_LCYL 16bit write at address %x, value %x", addr, value); + //DevCon.WriteLn("DEV9: ATA: ATA_R_LCYL %dbit write %x", width, value); ClearHOB(); regLcylHOB = regLcyl; regLcyl = static_cast(value); break; case ATA_R_HCYL: - //DevCon.WriteLn("DEV9: *ATA_R_HCYL 16bit write at address %x, value %x", addr, value); + //DevCon.WriteLn("DEV9: ATA: ATA_R_HCYL %dbit write %x", width, value); ClearHOB(); regHcylHOB = regHcyl; regHcyl = static_cast(value); break; case ATA_R_SELECT: - //DevCon.WriteLn("DEV9: *ATA_R_SELECT 16bit write at address %x, value %x", addr, value); + //DevCon.WriteLn("DEV9: ATA: ATA_R_SELECT %dbit write %x", width, value); regSelect = static_cast(value); //bus->ifs[0].select = (val & ~0x10) | 0xa0; //bus->ifs[1].select = (val | 0x10) | 0xa0; break; case ATA_R_CONTROL: - //DevCon.WriteLn("DEV9: *ATA_R_CONTROL 16bit write at address %x, value %x", addr, value); - //dev9Ru16(ATA_R_CONTROL) = value; + //DevCon.WriteLn("DEV9: ATA: ATA_R_CONTROL %dbit write %x", width, value); if ((value & 0x2) != 0) { - //Supress all IRQ + // Suppress all IRQ dev9.irqcause &= ~ATA_INTR_INTRQ; regControlEnableIRQ = false; } @@ -464,14 +465,14 @@ void ATA::Write16(u32 addr, u16 value) break; case ATA_R_CMD: - //DevCon.WriteLn("DEV9: *ATA_R_CMD 16bit write at address %x, value %x", addr, value); + //DevCon.WriteLn("DEV9: ATA: ATA_R_CMD %dbit write %x", width, value); regCommand = value; regControlHOBRead = false; dev9.irqcause &= ~ATA_INTR_INTRQ; IDE_ExecCmd(value); break; default: - Console.Error("DEV9: ATA: UNKNOWN 16bit write at address %x, value %x", addr, value); + Console.Error("DEV9: ATA: Unknown %dbit write at address %x, value %x", width, addr, value); break; } } diff --git a/pcsx2/DEV9/DEV9.cpp b/pcsx2/DEV9/DEV9.cpp index 6d92106e06..542f172f8d 100644 --- a/pcsx2/DEV9/DEV9.cpp +++ b/pcsx2/DEV9/DEV9.cpp @@ -704,8 +704,7 @@ u8 DEV9read8(u32 addr) if (addr >= ATA_DEV9_HDD_BASE && addr < ATA_DEV9_HDD_END) { - Console.Error("DEV9: ATA does not support 8bit reads %lx", addr); - return 0; + return dev9.ata->Read(addr, 8); } // Note, ATA regs within range of addresses used by Speed if (addr >= SPD_REGBASE && addr < SMAP_REGBASE) @@ -745,7 +744,7 @@ u16 DEV9read16(u32 addr) if (addr >= ATA_DEV9_HDD_BASE && addr < ATA_DEV9_HDD_END) { - return dev9.ata->Read16(addr); + return dev9.ata->Read(addr, 16); } // Note, ATA regs within range of addresses used by Speed if (addr >= SPD_REGBASE && addr < SMAP_REGBASE) @@ -811,10 +810,7 @@ void DEV9write8(u32 addr, u8 value) if (addr >= ATA_DEV9_HDD_BASE && addr < ATA_DEV9_HDD_END) { -#ifdef ENABLE_ATA - ata_write<1>(addr, value); -#endif - Console.Error("DEV9: ATA does not support 8bit writes %lx", addr); + dev9.ata->Write(addr, value, 8); return; } // Note, ATA regs within range of addresses used by Speed @@ -847,7 +843,7 @@ void DEV9write16(u32 addr, u16 value) if (addr >= ATA_DEV9_HDD_BASE && addr < ATA_DEV9_HDD_END) { - dev9.ata->Write16(addr, value); + dev9.ata->Write(addr, value, 16); return; } // Note, ATA regs within range of addresses used by Speed