mirror of https://github.com/PCSX2/pcsx2.git
DEV9: Cleanup ATA.
This commit is contained in:
parent
7b428bb6b0
commit
c77d8b3709
|
@ -1,5 +1,5 @@
|
||||||
/* PCSX2 - PS2 Emulator for PCs
|
/* PCSX2 - PS2 Emulator for PCs
|
||||||
* Copyright (C) 2002-2020 PCSX2 Dev Team
|
* Copyright (C) 2002-2023 PCSX2 Dev Team
|
||||||
*
|
*
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
@ -46,15 +46,15 @@ void ATA::WritePaddedString(u8* data, int* index, std::string value, u32 len)
|
||||||
|
|
||||||
void ATA::CreateHDDinfo(u64 sizeSectors)
|
void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
{
|
{
|
||||||
const u16 sectorSize = 512;
|
constexpr u16 sectorSize = 512;
|
||||||
DevCon.WriteLn("DEV9: HddSize : %i", sizeSectors * sectorSize / (1024 * 1024));
|
DevCon.WriteLn("DEV9: HddSize : %i", sizeSectors * sectorSize / (1024 * 1024));
|
||||||
const u64 nbSectors = sizeSectors;
|
const u64 nbSectors = sizeSectors;
|
||||||
DevCon.WriteLn("DEV9: nbSectors : %i", nbSectors);
|
DevCon.WriteLn("DEV9: nbSectors : %i", nbSectors);
|
||||||
|
|
||||||
memset(&identifyData, 0, sizeof(identifyData));
|
memset(&identifyData, 0, sizeof(identifyData));
|
||||||
//Defualt CHS translation
|
//Defualt CHS translation
|
||||||
const u16 defHeads = 16;
|
constexpr u16 defHeads = 16;
|
||||||
const u16 defSectors = 63;
|
constexpr u16 defSectors = 63;
|
||||||
u64 cylinderslong = std::min<u64>(nbSectors, 16514064) / defHeads / defSectors;
|
u64 cylinderslong = std::min<u64>(nbSectors, 16514064) / defHeads / defSectors;
|
||||||
const u16 defCylinders = (u16)std::min<u64>(cylinderslong, UINT16_MAX);
|
const u16 defCylinders = (u16)std::min<u64>(cylinderslong, UINT16_MAX);
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
//Default Num of heads (Retired)
|
//Default Num of heads (Retired)
|
||||||
WriteUInt16(identifyData, &index, defHeads); //word 3
|
WriteUInt16(identifyData, &index, defHeads); //word 3
|
||||||
//Number of unformatted bytes per track (Retired)
|
//Number of unformatted bytes per track (Retired)
|
||||||
WriteUInt16(identifyData, &index, (u16)(sectorSize * defSectors)); //word 4
|
WriteUInt16(identifyData, &index, static_cast<u16>(sectorSize * defSectors)); //word 4
|
||||||
//Number of unformatted bytes per sector (Retired)
|
//Number of unformatted bytes per sector (Retired)
|
||||||
WriteUInt16(identifyData, &index, sectorSize); //word 5
|
WriteUInt16(identifyData, &index, sectorSize); //word 5
|
||||||
//Default Number of sectors per track (Retired)
|
//Default Number of sectors per track (Retired)
|
||||||
|
@ -133,7 +133,7 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
//Capabilities (0-Shall be set to one to indicate a device specific Standby timer value minimum)
|
//Capabilities (0-Shall be set to one to indicate a device specific Standby timer value minimum)
|
||||||
index += 1 * 2; //word 50
|
index += 1 * 2; //word 50
|
||||||
//PIO data transfer cycle timing mode (Obsolete)
|
//PIO data transfer cycle timing mode (Obsolete)
|
||||||
WriteUInt16(identifyData, &index, (u8)((pioMode > 2 ? pioMode : 2) << 8)); //word 51
|
WriteUInt16(identifyData, &index, static_cast<u8>((pioMode > 2 ? pioMode : 2) << 8)); //word 51
|
||||||
//DMA data transfer cycle timing mode (Obsolete)
|
//DMA data transfer cycle timing mode (Obsolete)
|
||||||
WriteUInt16(identifyData, &index, 0); //word 52
|
WriteUInt16(identifyData, &index, 0); //word 52
|
||||||
//
|
//
|
||||||
|
@ -150,23 +150,23 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
//Number of current sectors per track
|
//Number of current sectors per track
|
||||||
WriteUInt16(identifyData, &index, curSectors); //word 56
|
WriteUInt16(identifyData, &index, curSectors); //word 56
|
||||||
//Current capacity in sectors
|
//Current capacity in sectors
|
||||||
WriteUInt32(identifyData, &index, (u32)curOldsize); //word 57-58
|
WriteUInt32(identifyData, &index, static_cast<u32>(curOldsize)); //word 57-58
|
||||||
//PIO READ/WRITE Multiple setting
|
//PIO READ/WRITE Multiple setting
|
||||||
/*
|
/*
|
||||||
* bit 7-0: Current setting for number of logical sectors that shall be transferred per DRQ
|
* bit 7-0: Current setting for number of logical sectors that shall be transferred per DRQ
|
||||||
* data block on READ/WRITE Multiple commands
|
* data block on READ/WRITE Multiple commands
|
||||||
* bit 8: Multiple sector setting is valid
|
* bit 8: Multiple sector setting is valid
|
||||||
*/
|
*/
|
||||||
WriteUInt16(identifyData, &index, (u16)(curMultipleSectorsSetting | (1 << 8))); //word 59
|
WriteUInt16(identifyData, &index, static_cast<u16>(curMultipleSectorsSetting | (1 << 8))); //word 59
|
||||||
//Total number of user addressable logical sectors
|
//Total number of user addressable logical sectors
|
||||||
WriteUInt32(identifyData, &index, (u32)(nbSectors < 268435456 ? nbSectors : 268435456)); //word 60-61
|
WriteUInt32(identifyData, &index, static_cast<u32>(nbSectors < 268435456 ? nbSectors : 268435456)); //word 60-61
|
||||||
//DMA modes
|
//DMA modes
|
||||||
/*
|
/*
|
||||||
* bits 0-7: Singleword modes supported (0,1,2)
|
* bits 0-7: Singleword modes supported (0,1,2)
|
||||||
* bits 8-15: Transfer mode active
|
* bits 8-15: Transfer mode active
|
||||||
*/
|
*/
|
||||||
if (sdmaMode > 0)
|
if (sdmaMode > 0)
|
||||||
WriteUInt16(identifyData, &index, (u16)(0x07 | (1 << (sdmaMode + 8)))); //word 62
|
WriteUInt16(identifyData, &index, static_cast<u16>(0x07 | (1 << (sdmaMode + 8)))); //word 62
|
||||||
else
|
else
|
||||||
WriteUInt16(identifyData, &index, 0x07); //word 62
|
WriteUInt16(identifyData, &index, 0x07); //word 62
|
||||||
//DMA Modes
|
//DMA Modes
|
||||||
|
@ -175,7 +175,7 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
* bits 8-15: Transfer mode active
|
* bits 8-15: Transfer mode active
|
||||||
*/
|
*/
|
||||||
if (mdmaMode > 0)
|
if (mdmaMode > 0)
|
||||||
WriteUInt16(identifyData, &index, (u16)(0x07 | (1 << (mdmaMode + 8)))); //word 63
|
WriteUInt16(identifyData, &index, static_cast<u16>(0x07 | (1 << (mdmaMode + 8)))); //word 63
|
||||||
else
|
else
|
||||||
WriteUInt16(identifyData, &index, 0x07); //word 63
|
WriteUInt16(identifyData, &index, 0x07); //word 63
|
||||||
//Bit 0-7-PIO modes supported (0,1,2,3,4)
|
//Bit 0-7-PIO modes supported (0,1,2,3,4)
|
||||||
|
@ -220,7 +220,7 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
* bit 14: NOP
|
* bit 14: NOP
|
||||||
* bit 15: (Obsolete)
|
* bit 15: (Obsolete)
|
||||||
*/
|
*/
|
||||||
WriteUInt16(identifyData, &index, (u16)((1 << 14) | (1 << 5) | /*(1 << 1) | (1 << 10) |*/ 1)); //word 82
|
WriteUInt16(identifyData, &index, static_cast<u16>((1 << 14) | (1 << 5) | /*(1 << 1) | (1 << 10) |*/ 1)); //word 82
|
||||||
//Supported Feature Sets (83)
|
//Supported Feature Sets (83)
|
||||||
/*
|
/*
|
||||||
* bit 0: DOWNLOAD MICROCODE
|
* bit 0: DOWNLOAD MICROCODE
|
||||||
|
@ -239,7 +239,7 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
* bit 13: FLUSH CACHE EXT
|
* bit 13: FLUSH CACHE EXT
|
||||||
* bit 14: 1
|
* bit 14: 1
|
||||||
*/
|
*/
|
||||||
WriteUInt16(identifyData, &index, (u16)((1 << 14) | (1 << 13) | (1 << 12) /*| (1 << 8)*/ | ((lba48Supported ? 1 : 0) << 10))); //word 83
|
WriteUInt16(identifyData, &index, static_cast<u16>((1 << 14) | (1 << 13) | (1 << 12) /*| (1 << 8)*/ | ((lba48Supported ? 1 : 0) << 10))); //word 83
|
||||||
//Supported Feature Sets (84)
|
//Supported Feature Sets (84)
|
||||||
/*
|
/*
|
||||||
* bit 0: Smart error logging
|
* bit 0: Smart error logging
|
||||||
|
@ -256,19 +256,19 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
* bit 13: IDLE IMMEDIATE with UNLOAD FEATURE
|
* bit 13: IDLE IMMEDIATE with UNLOAD FEATURE
|
||||||
* bit 14: 1
|
* bit 14: 1
|
||||||
*/
|
*/
|
||||||
WriteUInt16(identifyData, &index, (u16)((1 << 14) | (1 << 1) | 1)); //word 84
|
WriteUInt16(identifyData, &index, static_cast<u16>((1 << 14) | (1 << 1) | 1)); //word 84
|
||||||
//Command set/feature enabled/supported (See word 82)
|
//Command set/feature enabled/supported (See word 82)
|
||||||
WriteUInt16(identifyData, &index, (u16)((fetSmartEnabled << 0) | (fetSecurityEnabled << 1) | (fetWriteCacheEnabled << 5) | (fetHostProtectedAreaEnabled << 10) | (1 << 14))); //Fixed //word 85
|
WriteUInt16(identifyData, &index, static_cast<u16>((fetSmartEnabled << 0) | (fetSecurityEnabled << 1) | (fetWriteCacheEnabled << 5) | (fetHostProtectedAreaEnabled << 10) | (1 << 14))); //Fixed //word 85
|
||||||
//Command set/feature enabled/supported (See word 83)
|
//Command set/feature enabled/supported (See word 83)
|
||||||
// clang-format off
|
// clang-format off
|
||||||
WriteUInt16(identifyData, &index, (u16)(
|
WriteUInt16(identifyData, &index, static_cast<u16>(
|
||||||
/*(1 << 8) | //SET MAX */
|
/*(1 << 8) | //SET MAX */
|
||||||
((lba48Supported ? 1 : 0) << 10) | //Fixed
|
((lba48Supported ? 1 : 0) << 10) | //Fixed
|
||||||
(1 << 12) | //Fixed
|
(1 << 12) | //Fixed
|
||||||
(1 << 13))); //Fixed //word 86
|
(1 << 13))); //Fixed //word 86
|
||||||
//Command set/feature enabled/supported (See word 84)
|
//Command set/feature enabled/supported (See word 84)
|
||||||
WriteUInt16(identifyData, &index, (u16)((1 << 14) | (1 << 1) | 1));
|
WriteUInt16(identifyData, &index, static_cast<u16>((1 << 14) | (1 << 1) | 1));
|
||||||
WriteUInt16(identifyData, &index, (u16)(
|
WriteUInt16(identifyData, &index, static_cast<u16>(
|
||||||
(1) | //Fixed
|
(1) | //Fixed
|
||||||
((1) << 1))); //Fixed //word 87
|
((1) << 1))); //Fixed //word 87
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
@ -278,7 +278,7 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
* bits 8-15: Transfer mode active
|
* bits 8-15: Transfer mode active
|
||||||
*/
|
*/
|
||||||
if (udmaMode > 0)
|
if (udmaMode > 0)
|
||||||
WriteUInt16(identifyData, &index, (u16)(0x7f | (1 << (udmaMode + 8)))); //word 88
|
WriteUInt16(identifyData, &index, static_cast<u16>(0x7f | (1 << (udmaMode + 8)))); //word 88
|
||||||
else
|
else
|
||||||
WriteUInt16(identifyData, &index, 0x7f); //word 88
|
WriteUInt16(identifyData, &index, 0x7f); //word 88
|
||||||
//Time required for security erase unit completion
|
//Time required for security erase unit completion
|
||||||
|
@ -306,7 +306,7 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
* bit 14: 1
|
* bit 14: 1
|
||||||
*/
|
*/
|
||||||
index = 93 * 2;
|
index = 93 * 2;
|
||||||
WriteUInt16(identifyData, &index, (u16)(1 | (1 << 14) | 0x2000)); //word 93
|
WriteUInt16(identifyData, &index, static_cast<u16>(1 | (1 << 14) | 0x2000)); //word 93
|
||||||
//Vendor’s recommended acoustic management value.
|
//Vendor’s recommended acoustic management value.
|
||||||
//94
|
//94
|
||||||
//Stream Minimum Request Size
|
//Stream Minimum Request Size
|
||||||
|
@ -319,7 +319,7 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
//98-99
|
//98-99
|
||||||
//Total Number of User Addressable Sectors for the 48-bit Address feature set.
|
//Total Number of User Addressable Sectors for the 48-bit Address feature set.
|
||||||
index = 100 * 2;
|
index = 100 * 2;
|
||||||
WriteUInt64(identifyData, &index, (u16)nbSectors);
|
WriteUInt64(identifyData, &index, static_cast<u16>(nbSectors));
|
||||||
index -= 2;
|
index -= 2;
|
||||||
WriteUInt16(identifyData, &index, 0); //truncate to 48bits
|
WriteUInt16(identifyData, &index, 0); //truncate to 48bits
|
||||||
//Streaming Transfer Time - PIO
|
//Streaming Transfer Time - PIO
|
||||||
|
@ -334,7 +334,7 @@ void ATA::CreateHDDinfo(u64 sizeSectors)
|
||||||
* bit 14: 1
|
* bit 14: 1
|
||||||
*/
|
*/
|
||||||
index = 106 * 2;
|
index = 106 * 2;
|
||||||
WriteUInt16(identifyData, &index, (u16)((1 << 14) | 0));
|
WriteUInt16(identifyData, &index, static_cast<u16>((1 << 14) | 0));
|
||||||
//Inter-seek delay for ISO-7779acoustic testing in microseconds
|
//Inter-seek delay for ISO-7779acoustic testing in microseconds
|
||||||
//107
|
//107
|
||||||
//WNN
|
//WNN
|
||||||
|
@ -384,7 +384,7 @@ void ATA::CreateHDDinfoCsum() //Is this correct?
|
||||||
counter += 0xA5;
|
counter += 0xA5;
|
||||||
|
|
||||||
identifyData[510] = 0xA5;
|
identifyData[510] = 0xA5;
|
||||||
identifyData[511] = (u8)(255 - counter + 1);
|
identifyData[511] = static_cast<u8>(255 - counter + 1);
|
||||||
counter = 0;
|
counter = 0;
|
||||||
|
|
||||||
for (int i = 0; i < (512); i++)
|
for (int i = 0; i < (512); i++)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* PCSX2 - PS2 Emulator for PCs
|
/* PCSX2 - PS2 Emulator for PCs
|
||||||
* Copyright (C) 2002-2020 PCSX2 Dev Team
|
* Copyright (C) 2002-2023 PCSX2 Dev Team
|
||||||
*
|
*
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
@ -381,35 +381,35 @@ void ATA::Write16(u32 addr, u16 value)
|
||||||
//DevCon.WriteLn("DEV9: *ATA_R_FEATURE 16bit write at address %x, value %x", addr, value);
|
//DevCon.WriteLn("DEV9: *ATA_R_FEATURE 16bit write at address %x, value %x", addr, value);
|
||||||
ClearHOB();
|
ClearHOB();
|
||||||
regFeatureHOB = regFeature;
|
regFeatureHOB = regFeature;
|
||||||
regFeature = (u8)value;
|
regFeature = static_cast<u8>(value);
|
||||||
break;
|
break;
|
||||||
case ATA_R_NSECTOR:
|
case ATA_R_NSECTOR:
|
||||||
//DevCon.WriteLn("DEV9: *ATA_R_NSECTOR 16bit write at address %x, value %x", addr, value);
|
//DevCon.WriteLn("DEV9: *ATA_R_NSECTOR 16bit write at address %x, value %x", addr, value);
|
||||||
ClearHOB();
|
ClearHOB();
|
||||||
regNsectorHOB = regNsector;
|
regNsectorHOB = regNsector;
|
||||||
regNsector = (u8)value;
|
regNsector = static_cast<u8>(value);
|
||||||
break;
|
break;
|
||||||
case ATA_R_SECTOR:
|
case ATA_R_SECTOR:
|
||||||
//DevCon.WriteLn("DEV9: *ATA_R_SECTOR 16bit write at address %x, value %x", addr, value);
|
//DevCon.WriteLn("DEV9: *ATA_R_SECTOR 16bit write at address %x, value %x", addr, value);
|
||||||
ClearHOB();
|
ClearHOB();
|
||||||
regSectorHOB = regSector;
|
regSectorHOB = regSector;
|
||||||
regSector = (u8)value;
|
regSector = static_cast<u8>(value);
|
||||||
break;
|
break;
|
||||||
case ATA_R_LCYL:
|
case ATA_R_LCYL:
|
||||||
//DevCon.WriteLn("DEV9: *ATA_R_LCYL 16bit write at address %x, value %x", addr, value);
|
//DevCon.WriteLn("DEV9: *ATA_R_LCYL 16bit write at address %x, value %x", addr, value);
|
||||||
ClearHOB();
|
ClearHOB();
|
||||||
regLcylHOB = regLcyl;
|
regLcylHOB = regLcyl;
|
||||||
regLcyl = (u8)value;
|
regLcyl = static_cast<u8>(value);
|
||||||
break;
|
break;
|
||||||
case ATA_R_HCYL:
|
case ATA_R_HCYL:
|
||||||
//DevCon.WriteLn("DEV9: *ATA_R_HCYL 16bit write at address %x, value %x", addr, value);
|
//DevCon.WriteLn("DEV9: *ATA_R_HCYL 16bit write at address %x, value %x", addr, value);
|
||||||
ClearHOB();
|
ClearHOB();
|
||||||
regHcylHOB = regHcyl;
|
regHcylHOB = regHcyl;
|
||||||
regHcyl = (u8)value;
|
regHcyl = static_cast<u8>(value);
|
||||||
break;
|
break;
|
||||||
case ATA_R_SELECT:
|
case ATA_R_SELECT:
|
||||||
//DevCon.WriteLn("DEV9: *ATA_R_SELECT 16bit write at address %x, value %x", addr, value);
|
//DevCon.WriteLn("DEV9: *ATA_R_SELECT 16bit write at address %x, value %x", addr, value);
|
||||||
regSelect = (u8)value;
|
regSelect = static_cast<u8>(value);
|
||||||
//bus->ifs[0].select = (val & ~0x10) | 0xa0;
|
//bus->ifs[0].select = (val & ~0x10) | 0xa0;
|
||||||
//bus->ifs[1].select = (val | 0x10) | 0xa0;
|
//bus->ifs[1].select = (val | 0x10) | 0xa0;
|
||||||
break;
|
break;
|
||||||
|
@ -502,18 +502,18 @@ s64 ATA::HDD_GetLBA()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return ((s64)regHcylHOB << 40) |
|
return (static_cast<s64>(regHcylHOB) << 40) |
|
||||||
((s64)regLcylHOB << 32) |
|
(static_cast<s64>(regLcylHOB) << 32) |
|
||||||
((s64)regSectorHOB << 24) |
|
(static_cast<s64>(regSectorHOB) << 24) |
|
||||||
((s64)regHcyl << 16) |
|
(static_cast<s64>(regHcyl) << 16) |
|
||||||
((s64)regLcyl << 8) |
|
(static_cast<s64>(regLcyl) << 8) |
|
||||||
regSector;
|
regSector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
regStatus |= (u8)ATA_STAT_ERR;
|
regStatus |= static_cast<u8>(ATA_STAT_ERR);
|
||||||
regError |= (u8)ATA_ERR_ABORT;
|
regError |= static_cast<u8>(ATA_ERR_ABORT);
|
||||||
|
|
||||||
Console.Error("DEV9: ATA: Tried to get LBA address while LBA mode disabled");
|
Console.Error("DEV9: ATA: Tried to get LBA address while LBA mode disabled");
|
||||||
//(c.Nh + h).Ns+(s-1)
|
//(c.Nh + h).Ns+(s-1)
|
||||||
|
@ -528,19 +528,19 @@ void ATA::HDD_SetLBA(s64 sectorNum)
|
||||||
{
|
{
|
||||||
if (!lba48)
|
if (!lba48)
|
||||||
{
|
{
|
||||||
regSelect = (u8)((regSelect & 0xf0) | (int)((sectorNum >> 24) & 0x0f));
|
regSelect = static_cast<u8>((regSelect & 0xf0) | static_cast<int>((sectorNum >> 24) & 0x0f));
|
||||||
regHcyl = (u8)(sectorNum >> 16);
|
regHcyl = static_cast<u8>(sectorNum >> 16);
|
||||||
regLcyl = (u8)(sectorNum >> 8);
|
regLcyl = static_cast<u8>(sectorNum >> 8);
|
||||||
regSector = (u8)(sectorNum);
|
regSector = static_cast<u8>(sectorNum);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
regSector = (u8)sectorNum;
|
regSector = static_cast<u8>(sectorNum);
|
||||||
regLcyl = (u8)(sectorNum >> 8);
|
regLcyl = static_cast<u8>(sectorNum >> 8);
|
||||||
regHcyl = (u8)(sectorNum >> 16);
|
regHcyl = static_cast<u8>(sectorNum >> 16);
|
||||||
regSectorHOB = (u8)(sectorNum >> 24);
|
regSectorHOB = static_cast<u8>(sectorNum >> 24);
|
||||||
regLcylHOB = (u8)(sectorNum >> 32);
|
regLcylHOB = static_cast<u8>(sectorNum >> 32);
|
||||||
regHcylHOB = (u8)(sectorNum >> 40);
|
regHcylHOB = static_cast<u8>(sectorNum >> 40);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -560,35 +560,27 @@ bool ATA::HDD_CanSeek()
|
||||||
|
|
||||||
bool ATA::HDD_CanAccess(int* sectors)
|
bool ATA::HDD_CanAccess(int* sectors)
|
||||||
{
|
{
|
||||||
s64 lba;
|
s64 maxLBA = std::min<s64>(EmuConfig.DEV9.HddSizeSectors, hddImageSize / 512) - 1;
|
||||||
s64 posStart;
|
|
||||||
s64 posEnd;
|
|
||||||
s64 maxLBA;
|
|
||||||
|
|
||||||
maxLBA = std::min<s64>(EmuConfig.DEV9.HddSizeSectors, hddImageSize / 512) - 1;
|
|
||||||
if ((regSelect & 0x40) == 0) //CHS mode
|
if ((regSelect & 0x40) == 0) //CHS mode
|
||||||
maxLBA = std::min<s64>(maxLBA, curCylinders * curHeads * curSectors);
|
maxLBA = std::min<s64>(maxLBA, curCylinders * curHeads * curSectors);
|
||||||
|
|
||||||
lba = HDD_GetLBA();
|
const s64 posStart = HDD_GetLBA();
|
||||||
if (lba == -1)
|
if (posStart == -1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//DevCon.WriteLn("DEV9: LBA :%i", lba);
|
//DevCon.WriteLn("DEV9: LBA :%i", lba);
|
||||||
posStart = lba;
|
|
||||||
|
|
||||||
if (posStart > maxLBA)
|
if (posStart > maxLBA)
|
||||||
{
|
{
|
||||||
*sectors = -1;
|
*sectors = -1;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
posEnd = posStart + *sectors;
|
const s64 posEnd = posStart + *sectors;
|
||||||
|
|
||||||
if (posEnd > maxLBA)
|
if (posEnd > maxLBA)
|
||||||
{
|
{
|
||||||
const s64 overshoot = posEnd - maxLBA;
|
const s64 overshoot = posEnd - maxLBA;
|
||||||
s64 space = *sectors - overshoot;
|
s64 space = *sectors - overshoot;
|
||||||
*sectors = (int)space;
|
*sectors = static_cast<int>(space);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* PCSX2 - PS2 Emulator for PCs
|
/* PCSX2 - PS2 Emulator for PCs
|
||||||
* Copyright (C) 2002-2020 PCSX2 Dev Team
|
* Copyright (C) 2002-2023 PCSX2 Dev Team
|
||||||
*
|
*
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
@ -105,7 +105,7 @@ bool ATA::IO_Write()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 imagePos = entry.sector * 512;
|
const u64 imagePos = entry.sector * 512;
|
||||||
if (FileSystem::FSeek64(hddImage, imagePos, SEEK_SET) != 0)
|
if (FileSystem::FSeek64(hddImage, imagePos, SEEK_SET) != 0)
|
||||||
{
|
{
|
||||||
Console.Error("DEV9: ATA: File seek error");
|
Console.Error("DEV9: ATA: File seek error");
|
||||||
|
@ -209,12 +209,13 @@ void ATA::IO_SparseCacheLoad()
|
||||||
memset(&hddSparseBlock[readSize], 0, hddSparseBlockSize - readSize);
|
memset(&hddSparseBlock[readSize], 0, hddSparseBlockSize - readSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store file pointer.
|
|
||||||
const s64 orgPos = FileSystem::FTell64(hddImage);
|
|
||||||
|
|
||||||
// Flush so that we know what is allocated.
|
// Flush so that we know what is allocated.
|
||||||
std::fflush(hddImage);
|
std::fflush(hddImage);
|
||||||
|
|
||||||
|
// Store file pointer.
|
||||||
|
const s64 orgPos = FileSystem::FTell64(hddImage);
|
||||||
|
pxAssert(orgPos != -1);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// FlushFileBuffers is required, hddSparseBlock differs from actual file without it.
|
// FlushFileBuffers is required, hddSparseBlock differs from actual file without it.
|
||||||
FlushFileBuffers(hddNativeHandle);
|
FlushFileBuffers(hddNativeHandle);
|
||||||
|
@ -234,11 +235,6 @@ void ATA::IO_SparseCacheLoad()
|
||||||
memset(hddSparseBlock.get(), 0, hddSparseBlockSize);
|
memset(hddSparseBlock.get(), 0, hddSparseBlockSize);
|
||||||
hddSparseBlockValid = true;
|
hddSparseBlockValid = true;
|
||||||
#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD)
|
#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD)
|
||||||
|
|
||||||
// Store file pointer.
|
|
||||||
const s64 orgPos = FileSystem::FTell64(hddImage);
|
|
||||||
pxAssert(orgPos != -1);
|
|
||||||
|
|
||||||
//Load into check buffer.
|
//Load into check buffer.
|
||||||
FileSystem::FSeek64(hddImage, HddSparseStart, SEEK_SET);
|
FileSystem::FSeek64(hddImage, HddSparseStart, SEEK_SET);
|
||||||
|
|
||||||
|
@ -281,11 +277,6 @@ void ATA::IO_SparseCacheLoad()
|
||||||
memset(hddSparseBlock.get(), 0, hddSparseBlockSize);
|
memset(hddSparseBlock.get(), 0, hddSparseBlockSize);
|
||||||
hddSparseBlockValid = true;
|
hddSparseBlockValid = true;
|
||||||
#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD)
|
#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD)
|
||||||
|
|
||||||
// Store file pointer.
|
|
||||||
const s64 orgPos = FileSystem::FTell64(hddImage);
|
|
||||||
pxAssert(orgPos != -1);
|
|
||||||
|
|
||||||
// Load into check buffer.
|
// Load into check buffer.
|
||||||
FileSystem::FSeek64(hddImage, HddSparseStart, SEEK_SET);
|
FileSystem::FSeek64(hddImage, HddSparseStart, SEEK_SET);
|
||||||
|
|
||||||
|
@ -512,8 +503,8 @@ bool ATA::HDD_CanAssessOrSetError()
|
||||||
if (!HDD_CanAccess(&nsector))
|
if (!HDD_CanAccess(&nsector))
|
||||||
{
|
{
|
||||||
//Read what we can
|
//Read what we can
|
||||||
regStatus |= (u8)ATA_STAT_ERR;
|
regStatus |= static_cast<u8>(ATA_STAT_ERR);
|
||||||
regError |= (u8)ATA_ERR_ID;
|
regError |= static_cast<u8>(ATA_ERR_ID);
|
||||||
if (nsector == -1)
|
if (nsector == -1)
|
||||||
{
|
{
|
||||||
PostCmdNoData();
|
PostCmdNoData();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* PCSX2 - PS2 Emulator for PCs
|
/* PCSX2 - PS2 Emulator for PCs
|
||||||
* Copyright (C) 2002-2020 PCSX2 Dev Team
|
* Copyright (C) 2002-2023 PCSX2 Dev Team
|
||||||
*
|
*
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
@ -53,7 +53,7 @@ void ATA::HDD_InitDevParameters()
|
||||||
DevCon.WriteLn("DEV9: HDD_InitDevParameters");
|
DevCon.WriteLn("DEV9: HDD_InitDevParameters");
|
||||||
|
|
||||||
curSectors = regNsector;
|
curSectors = regNsector;
|
||||||
curHeads = (u8)((regSelect & 0x7) + 1);
|
curHeads = static_cast<u8>((regSelect & 0x7) + 1);
|
||||||
PostCmdNoData();
|
PostCmdNoData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ void ATA::HDD_SetFeatures()
|
||||||
return;
|
return;
|
||||||
case 0x03: //Set transfer mode
|
case 0x03: //Set transfer mode
|
||||||
{
|
{
|
||||||
const u16 xferMode = (u16)regNsector; //Set Transfer mode
|
const u16 xferMode = static_cast<u16>(regNsector); //Set Transfer mode
|
||||||
|
|
||||||
const int mode = xferMode & 0x07;
|
const int mode = xferMode & 0x07;
|
||||||
switch ((xferMode) >> 3)
|
switch ((xferMode) >> 3)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* PCSX2 - PS2 Emulator for PCs
|
/* PCSX2 - PS2 Emulator for PCs
|
||||||
* Copyright (C) 2002-2020 PCSX2 Dev Team
|
* Copyright (C) 2002-2023 PCSX2 Dev Team
|
||||||
*
|
*
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
@ -42,7 +42,7 @@ void HddCreate::Start()
|
||||||
void HddCreate::WriteImage(std::string hddPath, u64 fileBytes, u64 zeroSizeBytes)
|
void HddCreate::WriteImage(std::string hddPath, u64 fileBytes, u64 zeroSizeBytes)
|
||||||
{
|
{
|
||||||
constexpr int buffsize = 4 * 1024;
|
constexpr int buffsize = 4 * 1024;
|
||||||
u8 buff[buffsize] = {0}; // 4kb.
|
const u8 buff[buffsize] = {0}; // 4kb.
|
||||||
|
|
||||||
if (FileSystem::FileExists(hddPath.c_str()))
|
if (FileSystem::FileExists(hddPath.c_str()))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue