Some work on CDVD.cpp. Slight change to the branch statements in Interpreter.cpp. Restore a change to Pcsx2Defs.h that got reverted.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1102 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
arcum42 2009-05-01 11:06:52 +00:00
parent b6ba2f050f
commit bc9e0b08ad
5 changed files with 643 additions and 709 deletions

View File

@ -58,8 +58,6 @@
// disable the default case in a switch
#define jNO_DEFAULT \
{ \
break; \
\
default: \
jASSUME(0); \
break; \

File diff suppressed because it is too large Load Diff

View File

@ -62,8 +62,8 @@ struct cdvdStruct {
u32 Sector;
int nSectors;
int Readed;
int Reading;
int Readed; // change to bool. --arcum42
int Reading; // same here.
int ReadMode;
int BlockSize; // Total bytes transfered at 1x speed
int Speed;
@ -89,45 +89,229 @@ struct cdvdStruct {
bool Spinning; // indicates if the Cdvd is spinning or needs a spinup delay
};
/*
Interrupts - values are flag bits.
0x00 No interrupt
0x01 Data Ready
0x02 Command Complete
0x03 Acknowledge (reserved)
0x04 End of Data Detected
0x05 Error Detected
0x06 Drive Not Ready
In limited experimentation I found that PS2 apps respond actively to use of the
'Data Ready' flag -- in that they'll almost immediately initiate a DMA transfer
after receiving an Irq with that as the cause. But the question is, of course,
*when* to use it. Adding it into some locations of CDVD reading only slowed
games down and broke things.
Using Drive Not Ready also invokes basic error handling from the Iop Bios, but
without proper emulation of the cdvd status flag it also tends to break things.
*/
enum CdvdIrqId
{
Irq_None = 0
, Irq_DataReady = 0
, Irq_CommandComplete
, Irq_Acknowledge
, Irq_EndOfData
, Irq_Error
, Irq_NotReady
};
/* is cdvd.Status only for NCMDS? (linuzappz) */
enum cdvdStatus
{
CDVD_STATUS_NONE = 0x00, // not sure ;)
CDVD_STATUS_SEEK_COMPLETE = 0x0A,
};
enum cdvdready
{
CDVD_NOTREADY = 0x00,
CDVD_READY1 = 0x40,
CDVD_READY2 = 0x4e // This is used in a few places for some reason.
//It would be worth checking if this was just a typo made at some point.
};
// Cdvd actions tell the emulator how and when to respond to certain requests.
// Actions are handled by the cdvdInterrupt()
enum cdvdActions
{
cdvdAction_None = 0
, cdvdAction_Seek
, cdvdAction_Standby
, cdvdAction_Stop
, cdvdAction_Break
, cdvdAction_Read // note: not used yet.
};
//////////////////////////////////////////////////////////////////////////////////////////
// Cdvd Block Read Cycle Timings
//
// The PS2 CDVD effectively has two seek modes -- the normal/slow one (est. avg seeks being
// around 120-160ms), and a faster seek which has an estimated seek time of about 35-40ms.
// Fast seeks happen when the destination sector is within a certain range of the starting
// point, such that abs(start-dest) is less than the value in the tbl_FastSeekDelta.
//
// CDVDs also have a secondary seeking method used when the destination is close enough
// that a contiguous sector read can reach the sector faster than initiating a full seek.
// Typically this value is very low.
enum CDVD_MODE_TYPE
{
MODE_CDROM = 0,
MODE_DVDROM,
};
static const uint tbl_FastSeekDelta[3] =
{
4371, // CD-ROM
14764, // Single-layer DVD-ROM
13360 // dual-layer DVD-ROM [currently unused]
};
// if a seek is within this many blocks, read instead of seek.
// These values are arbitrary assumptions. Not sure what the real PS2 uses.
static const uint tbl_ContigiousSeekDelta[3] =
{
8, // CD-ROM
16, // single-layer DVD-ROM
16, // dual-layer DVD-ROM [currently unused]
};
// Note: DVD read times are modified to be faster, because games seem to be a lot more
// concerned with accurate(ish) seek delays and less concerned with actual block read speeds.
// Translation: it's a minor speedhack :D
static const uint PSX_CD_READSPEED = 153600; // 1 Byte Time @ x1 (150KB = cd x 1)
static const uint PSX_DVD_READSPEED = 1382400 + 256000; // normal is 1 Byte Time @ x1 (1350KB = dvd x 1).
// Legacy Note: FullSeek timing causes many games to load very slow, but it likely not the real problem.
// Games breaking with it set to PSXCLK*40 : "wrath unleashed" and "Shijou Saikyou no Deshi Kenichi".
static const uint Cdvd_FullSeek_Cycles = (PSXCLK*100) / 1000; // average number of cycles per fullseek (100ms)
static const uint Cdvd_FastSeek_Cycles = (PSXCLK*30) / 1000; // average number of cycles per fastseek (37ms)
static const __unused char *mg_zones[8] = {"Japan", "USA", "Europe", "Oceania", "Asia", "Russia", "China", "Mexico"};
static const __unused char *nCmdName[0x100]= {
"CdSync",
"CdNop",
"CdStandby",
"CdStop",
"CdPause",
"CdSeek",
"CdRead",
"CdReadCDDA",
"CdReadDVDV",
"CdGetToc",
"",
"NCMD_B",
"CdReadKey",
"",
"sceCdReadXCDDA",
"sceCdChgSpdlCtrl",
};
enum nCmds
{
N_CD_SYNC = 0x00, // CdSync
N_CD_NOP = 0x01, // CdNop
N_CD_STANDBY = 0x02, // CdStandby
N_CD_STOP = 0x03, // CdStop
N_CD_PAUSE = 0x04, // CdPause
N_CD_SEEK = 0x05, // CdSeek
N_CD_READ = 0x06, // CdRead
N_CD_READ_CDDA = 0x07, // CdReadCDDA
N_DVD_READ = 0x08, // DvdRead
N_CD_GET_TOC = 0x09, // CdGetToc & cdvdman_call19
N_CMD_B = 0x0B, // CdReadKey
N_CD_READ_KEY = 0x0C, // CdReadKey
N_CD_READ_XCDDA = 0x0E, // CdReadXCDDA
N_CD_CHG_SPDL_CTRL = 0x0F, // CdChgSpdlCtrl
};
static const __unused char *sCmdName[0x100]= {
"", "sceCdGetDiscType", "sceCdReadSubQ", "subcommands",//sceCdGetMecaconVersion, read/write console id, read renewal date
"", "sceCdTrayState", "sceCdTrayCtrl", "",
"sceCdReadClock", "sceCdWriteClock", "sceCdReadNVM", "sceCdWriteNVM",
"sceCdSetHDMode", "", "", "sceCdPowerOff",
"", "", "sceCdReadILinkID", "sceCdWriteILinkID", /*10*/
"sceAudioDigitalOut", "sceForbidDVDP", "sceAutoAdjustCtrl", "sceCdReadModelNumber",
"sceWriteModelNumber", "sceCdForbidCD", "sceCdBootCertify", "sceCdCancelPOffRdy",
"sceCdBlueLEDCtl", "", "sceRm2Read", "sceRemote2_7",//Rm2PortGetConnection?
"sceRemote2_6", "sceCdWriteWakeUpTime", "sceCdReadWakeUpTime", "", /*20*/
"sceCdRcBypassCtl", "", "", "",
"", "sceCdNoticeGameStart", "", "",
"sceCdXBSPowerCtl", "sceCdXLEDCtl", "sceCdBuzzerCtl", "",
"", "sceCdSetMediumRemoval", "sceCdGetMediumRemoval", "sceCdXDVRPReset", /*30*/
"", "", "__sceCdReadRegionParams", "__sceCdReadMAC",
"__sceCdWriteMAC", "", "", "",
"", "", "__sceCdWriteRegionParams", "",
"sceCdOpenConfig", "sceCdReadConfig", "sceCdWriteConfig", "sceCdCloseConfig", /*40*/
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "", /*50*/
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "", /*60*/
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "", /*70*/
"", "", "", "",
"", "", "", "",
"", "", "", "",
"mechacon_auth_0x80", "mechacon_auth_0x81", "mechacon_auth_0x82", "mechacon_auth_0x83", /*80*/
"mechacon_auth_0x84", "mechacon_auth_0x85", "mechacon_auth_0x86", "mechacon_auth_0x87",
"mechacon_auth_0x88", "", "", "",
"", "sceMgWriteData", "sceMgReadData", "mechacon_auth_0x8F",
"sceMgWriteHeaderStart", "sceMgReadBITLength", "sceMgWriteDatainLength", "sceMgWriteDataoutLength", /*90*/
"sceMgReadKbit", "sceMgReadKbit2", "sceMgReadKcon", "sceMgReadKcon2",
"sceMgReadIcvPs2", "", "", "",
"", "", "", "",
/*A0, no sCmds above?*/
};
// NVM (eeprom) layout info
struct NVMLayout {
u32 biosVer; // bios version that this eeprom layout is for
s32 config0; // offset of 1st config block
s32 config1; // offset of 2nd config block
s32 config2; // offset of 3rd config block
s32 consoleId; // offset of console id (?)
s32 ilinkId; // offset of ilink id (ilink mac address)
s32 modelNum; // offset of ps2 model number (eg "SCPH-70002")
s32 regparams; // offset of RegionParams for PStwo
s32 mac; // offset of the value written to 0xFFFE0188 and 0xFFFE018C on PStwo
};
#define NVM_FORMAT_MAX 2
static NVMLayout nvmlayouts[NVM_FORMAT_MAX] =
{
{0x000, 0x280, 0x300, 0x200, 0x1C8, 0x1C0, 0x1A0, 0x180, 0x198}, // eeproms from bios v0.00 and up
{0x146, 0x270, 0x2B0, 0x200, 0x1C8, 0x1E0, 0x1B0, 0x180, 0x198}, // eeproms from bios v1.70 and up
};
#define btoi(b) ((b)/16*10 + (b)%16) /* BCD to u_char */
#define itob(i) ((i)/10*16 + (i)%10) /* u_char to BCD */
void cdvdReset();
void cdvdVsync();
extern void cdvdActionInterrupt();
extern void cdvdReadInterrupt();
void cdvdNewDiskCB();
u8 cdvdRead04(void);
u8 cdvdRead05(void);
u8 cdvdRead06(void);
u8 cdvdRead07(void);
u8 cdvdRead08(void);
u8 cdvdRead0A(void);
u8 cdvdRead0B(void);
u8 cdvdRead0C(void);
u8 cdvdRead0D(void);
u8 cdvdRead0E(void);
u8 cdvdRead0F(void);
u8 cdvdRead13(void);
u8 cdvdRead15(void);
u8 cdvdRead16(void);
u8 cdvdRead17(void);
u8 cdvdRead(u8 key);
u8 cdvdRead18(void);
u8 cdvdRead20(void);
u8 cdvdRead21(void);
u8 cdvdRead22(void);
u8 cdvdRead23(void);
u8 cdvdRead24(void);
u8 cdvdRead28(void);
u8 cdvdRead29(void);
u8 cdvdRead2A(void);
u8 cdvdRead2B(void);
u8 cdvdRead2C(void);
u8 cdvdRead30(void);
u8 cdvdRead31(void);
u8 cdvdRead32(void);
u8 cdvdRead33(void);
u8 cdvdRead34(void);
u8 cdvdRead38(void);
u8 cdvdRead39(void);
u8 cdvdRead3A(void);
void cdvdWrite(u8 key, u8 rt);
void cdvdWrite04(u8 rt);
void cdvdWrite05(u8 rt);
void cdvdWrite06(u8 rt);

View File

@ -183,10 +183,10 @@ void BGEZ() // Branch if Rs >= 0
void BGEZAL() // Branch if Rs >= 0 and link
{
_SetLink(31);
if (cpuRegs.GPR.r[_Rs_].SD[0] >= 0)
{
_SetLink(31);
doBranch(_BranchTarget_);
}
}
@ -217,9 +217,9 @@ void BLTZ() // Branch if Rs < 0
void BLTZAL() // Branch if Rs < 0 and link
{
_SetLink(31);
if (cpuRegs.GPR.r[_Rs_].SD[0] < 0)
{
_SetLink(31);
doBranch(_BranchTarget_);
}
}
@ -310,10 +310,10 @@ void BGEZL() // Branch if Rs >= 0
void BLTZALL() // Branch if Rs < 0 and link
{
_SetLink(31);
if(cpuRegs.GPR.r[_Rs_].SD[0] < 0)
{
_SetLink(31);
doBranch(_BranchTarget_);
}
else
@ -325,10 +325,10 @@ void BLTZALL() // Branch if Rs < 0 and link
void BGEZALL() // Branch if Rs >= 0 and link
{
_SetLink(31);
if(cpuRegs.GPR.r[_Rs_].SD[0] >= 0)
{
_SetLink(31);
doBranch(_BranchTarget_);
}
else

View File

@ -1313,76 +1313,25 @@ void psxHwWrite32(u32 add, u32 value) {
PSXHW_LOG("*Known 32bit write at address %lx value %lx", add, value);
}
u8 psxHw4Read8(u32 add) {
u8 hard;
u8 psxHw4Read8(u32 add)
{
//u8 hard;
u16 mem = add & 0xFF;
switch (add) {
case 0x1f402004: return cdvdRead04();
case 0x1f402005: return cdvdRead05();
case 0x1f402006: return cdvdRead06();
case 0x1f402007: return cdvdRead07();
case 0x1f402008: return cdvdRead08();
case 0x1f40200A: return cdvdRead0A();
case 0x1f40200B: return cdvdRead0B();
case 0x1f40200C: return cdvdRead0C();
case 0x1f40200D: return cdvdRead0D();
case 0x1f40200E: return cdvdRead0E();
case 0x1f40200F: return cdvdRead0F();
case 0x1f402013: return cdvdRead13();
case 0x1f402015: return cdvdRead15();
case 0x1f402016: return cdvdRead16();
case 0x1f402017: return cdvdRead17();
case 0x1f402018: return cdvdRead18();
case 0x1f402020: return cdvdRead20();
case 0x1f402021: return cdvdRead21();
case 0x1f402022: return cdvdRead22();
case 0x1f402023: return cdvdRead23();
case 0x1f402024: return cdvdRead24();
case 0x1f402028: return cdvdRead28();
case 0x1f402029: return cdvdRead29();
case 0x1f40202A: return cdvdRead2A();
case 0x1f40202B: return cdvdRead2B();
case 0x1f40202C: return cdvdRead2C();
case 0x1f402030: return cdvdRead30();
case 0x1f402031: return cdvdRead31();
case 0x1f402032: return cdvdRead32();
case 0x1f402033: return cdvdRead33();
case 0x1f402034: return cdvdRead34();
case 0x1f402038: return cdvdRead38();
case 0x1f402039: return cdvdRead39();
case 0x1f40203A: return cdvdRead3A();
default:
// note: notify the console since this is a potentially serious emulation problem:
PSXHW_LOG("*Unknown 8bit read at address 0x%x", add);
Console::Error( "IOP Unknown 8bit read from addr 0x%x", params add );
return 0;
}
//Console::WriteLn("psxHw4Read8 0x%x, %x", params add, mem);
return cdvdRead(mem);
PSXHW_LOG( "Known 8bit read from addr 0x%x = 0x%x", add, hard );
//PSXHW_LOG( "Known 8bit read from addr 0x%x = 0x%x", add, hard );
return hard;
//return hard;
}
void psxHw4Write8(u32 add, u8 value) {
void psxHw4Write8(u32 add, u8 value)
{
switch (add) {
case 0x1f402004: cdvdWrite04(value); return;
case 0x1f402005: cdvdWrite05(value); return;
case 0x1f402006: cdvdWrite06(value); return;
case 0x1f402007: cdvdWrite07(value); return;
case 0x1f402008: cdvdWrite08(value); return;
case 0x1f40200A: cdvdWrite0A(value); return;
case 0x1f40200F: cdvdWrite0F(value); return;
case 0x1f402014: cdvdWrite14(value); return;
case 0x1f402016: cdvdWrite16(value); return;
case 0x1f402017: cdvdWrite17(value); return;
case 0x1f402018: cdvdWrite18(value); return;
case 0x1f40203A: cdvdWrite3A(value); return;
default:
//PSXHW_LOG("*Unknown 8bit write at address %lx value %x", add, value);
Console::Notice("IOP Unknown 8bit write to addr 0x%x = 0x%x", params add, value);
return;
}
u16 mem = add & 0xFF;
//Console::WriteLn("psxHw4Write8 0x%x, %x", params add, mem);
cdvdWrite(mem, value);
PSXHW_LOG("Known 8bit write to addr 0x%x = 0x%x", add, value);
}