Use correct PCI IDs (Harry Tuttle)

This commit is contained in:
Ian Curtis 2018-07-09 08:06:06 +00:00
parent 80cf1f9b52
commit 9f5a19a04a
5 changed files with 594 additions and 618 deletions

View file

@ -457,7 +457,7 @@
</hardware>
<roms>
<patches>
<!-- Skips over cabinet network error (not required, but speeds up boot) -->
<!-- Skips over cabinet network error -->
<patch region="crom" bits="32" offset="0x4a45e4" value="0x60000000" />
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
@ -574,7 +574,7 @@
</hardware>
<roms>
<patches>
<!-- Skips over cabinet network error (not required, but speeds up boot) -->
<!-- Skips over cabinet network error -->
<patch region="crom" bits="32" offset="0x4a45e4" value="0x60000000" />
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
@ -850,11 +850,7 @@
</inputs>
</hardware>
<roms>
<patches>
<!-- Base offset of program in CROM space: 0x6473c0 (0x473c0 in the ROM) -->
<patch region="crom" bits="32" offset="0x0D8C4C" value="0x00000002" /> <!-- comm. mode: 00=master, 01=slave, 02=satellite -->
<patch region="crom" bits="32" offset="0x13FE38" value="0x38840004" /> <!-- an actual bug in the game code -->
</patches>
<!-- Base offset of program in CROM space: 0x6473c0 (0x0473c0 in the ROM) -->
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
<file offset="0" name="epr-19890b.20" crc32="0x9C16C3CC" />
<file offset="2" name="epr-19889b.19" crc32="0xD1F7E44C" />
@ -1128,6 +1124,10 @@
</inputs>
</hardware>
<roms>
<patches>
<!-- Secret debug menu -->
<patch region="crom" bits="32" offset="0x199DE8" value="0x00050208" />
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
<file offset="0" name="epr-19734.20" crc32="0xBE897336" />
<file offset="2" name="epr-19733.19" crc32="0x6565E29A" />
@ -1639,6 +1639,7 @@
</hardware>
<roms>
<patches>
<!-- Unemulated JTAG stuff -->
<patch region="crom" bits="32" offset="0x7c0c4" value="0x60000000" />
<patch region="crom" bits="32" offset="0x7c0c8" value="0x60000000" />
<patch region="crom" bits="32" offset="0x7c0cc" value="0x60000000" />
@ -1810,14 +1811,8 @@
</hardware>
<roms>
<patches>
<patch region="crom" bits="32" offset="0xf0e48" value="0x60000000" />
<patch region="crom" bits="32" offset="0x043dc" value="0x48000090" /> <!-- related to joystick feedback -->
<patch region="crom" bits="32" offset="0x029a0" value="0x60000000" /> <!-- skip force feedback setup? -->
<patch region="crom" bits="32" offset="0x02a0c" value="0x60000000" />
<!-- Additional patches from MAME for test menu -->
<patch region="crom" bits="32" offset="0xf776c" value="0x60000000" /> <!-- unemulated JTAG stuff -->
<patch region="crom" bits="32" offset="0xf7770" value="0x60000000" /> <!-- "" -->
<patch region="crom" bits="32" offset="0xf7774" value="0x60000000" /> <!-- "" -->
<!-- skip force feedback lever check -->
<patch region="crom" bits="32" offset="0xf6e44" value="0x60000000" /> <!-- from MAME -->
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
<file offset="0" name="epr-21382a.20" crc32="0x69BAF117" />
@ -1876,7 +1871,8 @@
<file offset="0x800000" name="mpr-21377.22" crc32="0x720621F8" />
<file offset="0xC00000" name="mpr-21378.24" crc32="0x1FCF715E" />
</region>
<!-- Force feedback controller prg
<!-- Force feedback controller prg -->
<!--
<region name="ffb_program" stride="1" chunk_size="1">
<file offset="0" name="epr-21119.ic8" crc32="0x65082B14" />
</region>
@ -1902,6 +1898,7 @@
</hardware>
<roms>
<patches>
<!-- skip force feedback lever check -->
<patch region="crom" bits="32" offset="0xf6dd0" value="0x60000000" /> <!-- from MAME -->
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
@ -2293,16 +2290,6 @@
</inputs>
</hardware>
<roms>
<patches>
<!--
VS215 is a modification of VS2 that runs on Step 1.5 boards. I
suspect the code here is trying to detect the system type.
The patch branches to 0xFFF01630:
0x48000000 + (0xFFF01630 - 0xFFF001A8) = 0x48001488
-->
<patch region="crom" bits="32" offset="0x1001a8" value="0x48001488" />
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
<file offset="0" name="epr-19897.20" crc32="0x25A722A9" />
<file offset="2" name="epr-19898.19" crc32="0x4389D9CE" />
@ -2330,10 +2317,6 @@
</inputs>
</hardware>
<roms>
<patches>
<!-- See note in VS215 -->
<patch region="crom" bits="32" offset="0x1001a8" value="0x48001488" />
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
<file offset="0" name="epr-19803.20" crc32="0x1E55A5B8" />
<file offset="2" name="epr-19804.19" crc32="0xBBACA578" />
@ -2362,18 +2345,6 @@
<encryption_key>0x29234e96</encryption_key>
</hardware>
<roms>
<patches>
<!--
Offset of program relative to CROM base: 0x600000 (0x200000 in the
ROM itself). Inexplicably, at PC=AFC1C, a call is made to FC78, which
is right in the middle of some totally unrelated initialization code
(ASIC checks). This causes an invalid pointer to be fetched. Perhaps
FC78 should be overwritten with other program data by then? Why is it
not? Or, 300138 needs to be written with a non-zero value, it is
loaded from EEPROM but is 0.
-->
<patch region="crom" bits="32" offset="0x2afc1c" value="0x60000000" /> <!-- 0x6afc1c from base of CROM -->
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
<file offset="0" name="epr-20920.20" crc32="0x428D05FC" />
<file offset="2" name="epr-20919.19" crc32="0x7A0713D2" />
@ -2448,10 +2419,6 @@
</inputs>
</hardware>
<roms>
<patches>
<!-- See note in VS215 -->
<patch region="crom" bits="32" offset="0x1001a8" value="0x48001488" />
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
<file offset="0" name="epr-20912.20" crc32="0xCD2C0538" />
<file offset="2" name="epr-20911.19" crc32="0xACB8FD97" />
@ -2581,10 +2548,6 @@
</inputs>
</hardware>
<roms>
<patches>
<!-- See note in VS215 -->
<patch region="crom" bits="32" offset="0x1001a8" value="0x48001488" />
</patches>
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
<file offset="0" name="epr-21534.20" crc32="0xD49AE219" />
<file offset="2" name="epr-21533.19" crc32="0xEA728471" />

View file

@ -26,9 +26,6 @@ CNew3D::CNew3D(const Util::Config::Node &config, std::string gameName)
m_textureRAM = nullptr;
m_sunClamp = true;
m_shadeIsSigned = true;
// Fall-back mechanism for games with patched (not working) JTAG
if (m_gameName == "swtrilgy") m_shadeIsSigned = false;
}
CNew3D::~CNew3D()
@ -1665,8 +1662,6 @@ void CNew3D::SetSunClamp(bool enable)
void CNew3D::SetSignedShade(bool enable)
{
if (m_gameName == "swtrilgy") return; // jtag has been patched out in star wars - todo fix this
m_shadeIsSigned = enable;
}

View file

@ -895,111 +895,113 @@ UINT8 CModel3::Read8(UINT32 addr)
// Other
switch ((addr >> 24))
{
// CROM
// CROM
case 0xFF:
if (addr < 0xFF800000)
return cromBank[(addr & 0x7FFFFF) ^ 3];
else
return crom[(addr & 0x7FFFFF) ^ 3];
if (addr < 0xFF800000)
return cromBank[(addr & 0x7FFFFF) ^ 3];
else
return crom[(addr & 0x7FFFFF) ^ 3];
// Real3D DMA
// Real3D DMA
case 0xC2:
return GPU.ReadDMARegister8(addr & 0xFF);
return GPU.ReadDMARegister8(addr & 0xFF);
// Various
// Various
case 0xF0:
case 0xFE: // mirror
switch ((addr >> 16) & 0xFF)
{
// Inputs
case 0x04:
return ReadInputs(addr & 0x3F);
switch ((addr >> 16) & 0xFF)
{
// Inputs
case 0x04:
return ReadInputs(addr & 0x3F);
// Sound Board
case 0x08:
if ((addr & 0xF) == 4) // MIDI control port
return 0x83; // magtruck country check
else
return 0;
break;
// Sound Board
case 0x08:
if ((addr & 0xF) == 4) // MIDI control port
// System registers
case 0x10:
return ReadSystemRegister(addr & 0x3F);
return 0x83; // magtruck country check
// RTC
case 0x14:
if ((addr & 3) == 1) // battery voltage test
return 0x03;
else if ((addr & 3) == 0)
return RTC.ReadRegister((addr >> 2) & 0xF);
return 0;
else
return 0;
break;
// Unknown
default:
//printf("CMODEL3 : unknown R8 mirror : %x\n", addr >> 16);
break;
}
// System registers
case 0x10:
return ReadSystemRegister(addr & 0x3F);
break;
// RTC
case 0x14:
if ((addr & 3) == 1) // battery voltage test
return 0x03;
else if ((addr & 3) == 0)
return RTC.ReadRegister((addr >> 2) & 0xF);
return 0;
// Tile generator
// Unknown
default:
//printf("CMODEL3 : unknown R8 mirror : %x\n", addr >> 16);
break;
}
break;
// Tile generator
case 0xF1:
if (addr < 0xF1120000)
{
// Tile generator accesses its RAM as little endian, no adjustment needed here
return TileGen.ReadRAM8(addr & 0x1FFFFF);
}
break;
if (addr < 0xF1120000)
{
// Tile generator accesses its RAM as little endian, no adjustment needed here
return TileGen.ReadRAM8(addr & 0x1FFFFF);
}
break;
// 53C810 SCSI
// 53C810 SCSI
case 0xC0: // only on Step 1.0
#ifndef NET_BOARD
if (m_game.stepping != "1.0")
{
//printf("Model3 : Read8 %x\n", addr);
break;
}
if (m_game.stepping != "1.0")
{
//printf("Model3 : Read8 %x\n", addr);
break;
}
#endif
#ifdef NET_BOARD
if (m_game.stepping != "1.0" && (NetBoard.IsAttached() && (m_config["EmulateNet"].ValueAs<bool>()))) // check for Step 1.0
{
switch ((addr & 0x3ffff) >> 16)
{
case 0:
//printf("R8 netbuffer @%x=%x\n", (addr & 0xFFFF), netBuffer[(addr & 0xFFFF)]);
return netBuffer[(addr & 0xFFFF)];
if (m_game.stepping != "1.0" && (NetBoard.IsAttached() && (m_config["EmulateNet"].ValueAs<bool>()))) // check for Step 1.0
{
switch ((addr & 0x3ffff) >> 16)
{
case 0:
//printf("R8 netbuffer @%x=%x\n", (addr & 0xFFFF), netBuffer[(addr & 0xFFFF)]);
return netBuffer[(addr & 0xFFFF)];
case 1: // ioreg 32bits access in 16bits environment
if (addr > 0xc00101ff)
{
printf("R8 ATTENTION OUT OF RANGE\n");
MessageBox(NULL, "Out of Range", NULL, MB_OK);
}
printf("R8 ioreg @%x=%x\n", (addr & 0x1FF), netBuffer[0x10000 + ((addr & 0x1FF) / 2)]);
return netBuffer[0x10000 + ((addr & 0x1FF) / 2)];
case 1: // ioreg 32bits access in 16bits environment
if (addr > 0xc00101ff)
{
printf("R8 ATTENTION OUT OF RANGE\n");
MessageBox(NULL, "Out of Range", NULL, MB_OK);
}
printf("R8 ioreg @%x=%x\n", (addr & 0x1FF), netBuffer[0x10000 + ((addr & 0x1FF) / 2)]);
return netBuffer[0x10000 + ((addr & 0x1FF) / 2)];
case 2:
case 3:
if (addr > 0xc002ffff)
{
printf("R8 ATTENTION OUT OF RANGE\n");
MessageBox(NULL, "Out of Range", NULL, MB_OK);
}
//printf("R8 netram @%x=%x\n", (addr & 0x1FFFF), netRAM[addr & 0x1ffff]);
return netRAM[((addr & 0x1FFFF) / 2)];
/*case 3:
//printf("R8 netram @%x=%x\n", (addr & 0x1FFFF), netRAM[addr & 0x1ffff]);
return netRAM[((addr & 0x1FFFF) / 2)];*/
case 2:
case 3:
if (addr > 0xc002ffff)
{
printf("R8 ATTENTION OUT OF RANGE\n");
MessageBox(NULL, "Out of Range", NULL, MB_OK);
}
//printf("R8 netram @%x=%x\n", (addr & 0x1FFFF), netRAM[addr & 0x1ffff]);
return netRAM[((addr & 0x1FFFF) / 2)];
/*case 3:
//printf("R8 netram @%x=%x\n", (addr & 0x1FFFF), netRAM[addr & 0x1ffff]);
return netRAM[((addr & 0x1FFFF) / 2)];*/
default:
printf("R8 ATTENTION OUT OF RANGE\n");
MessageBox(NULL, "Out of Range", NULL, MB_OK);
break;
}
}
else if (m_game.stepping != "1.0") break;
default:
printf("R8 ATTENTION OUT OF RANGE\n");
MessageBox(NULL, "Out of Range", NULL, MB_OK);
break;
}
}
else if (m_game.stepping != "1.0") break;
#endif
case 0xF9:
case 0xC1:
@ -1008,7 +1010,7 @@ UINT8 CModel3::Read8(UINT32 addr)
// Unknown
default:
#ifdef NET_BOARD
printf("CMODEL3 : unknown R8 : %x\n", addr >> 24);
printf("CMODEL3 : unknown R8 : %x\n", addr >> 24);
#endif
break;
}
@ -1083,7 +1085,7 @@ UINT16 CModel3::Read16(UINT32 addr)
// Unknown
default:
//printf("CMODEL3 : unknown R16 mirror : %x\n", addr >> 16);
//printf("CMODEL3 : unknown R16 mirror : %x\n", addr >> 16);
break;
}
@ -1101,27 +1103,27 @@ UINT16 CModel3::Read16(UINT32 addr)
#ifdef NET_BOARD
case 0xc0: // spikeout call this
// interresting : poking @4 master to same value as slave (0x100) or simply !=0 -> connected and go in game, but freeze (prints comm error) as soon as players appear after the gate
// sort of sync ack ? who writes this 16b value ?
// interresting : poking @4 master to same value as slave (0x100) or simply !=0 -> connected and go in game, but freeze (prints comm error) as soon as players appear after the gate
// sort of sync ack ? who writes this 16b value ?
{
UINT16 result;
switch ((addr & 0x3ffff) >> 16)
{
case 0:
//printf("R16 netbuffer @%x=%x\n", (addr & 0xFFFF), FLIPENDIAN16(*(UINT16 *)&netBuffer[(addr & 0xFFFF)]));
result = *(UINT16 *)&netBuffer[(addr & 0xFFFF)];
return FLIPENDIAN16(result); // result
default:
printf("CMODEL3 : unknown R16 : %x (C0)\n", addr);
break;
}
UINT16 result;
switch ((addr & 0x3ffff) >> 16)
{
case 0:
//printf("R16 netbuffer @%x=%x\n", (addr & 0xFFFF), FLIPENDIAN16(*(UINT16 *)&netBuffer[(addr & 0xFFFF)]));
result = *(UINT16 *)&netBuffer[(addr & 0xFFFF)];
return FLIPENDIAN16(result); // result
default:
printf("CMODEL3 : unknown R16 : %x (C0)\n", addr);
break;
}
}
#endif
// Unknown
default:
#ifdef NET_BOARD
printf("CMODEL3 : unknown R16 : %x (%x)\n", addr, addr >> 24);
MessageBox(NULL, "CMODEL3 : Unknown R16", NULL, MB_OK);
printf("CMODEL3 : unknown R16 : %x (%x)\n", addr, addr >> 24);
MessageBox(NULL, "CMODEL3 : Unknown R16", NULL, MB_OK);
#endif
break;
}
@ -1237,7 +1239,7 @@ UINT32 CModel3::Read32(UINT32 addr)
// Unknown
default:
//printf("CModel 3 unknown R32 mirror %x", (addr >> 16) & 0xFF);
//printf("CModel 3 unknown R32 mirror %x", (addr >> 16) & 0xFF);
break;
}
@ -1275,7 +1277,7 @@ UINT32 CModel3::Read32(UINT32 addr)
case 0:
//printf("R32 netbuffer @%x=%x\n", (addr & 0xFFFF), FLIPENDIAN32(*(UINT32 *)&netBuffer[(addr & 0xFFFF)]));
result = *(UINT32 *)&netBuffer[(addr & 0xFFFF)];
return _rotl(FLIPENDIAN32(result), 16);
return _rotl(FLIPENDIAN32(result), 16);
//return FLIPENDIAN32(result); // result
case 1: // ioreg 32bits access to 16bits range
@ -1316,7 +1318,7 @@ UINT32 CModel3::Read32(UINT32 addr)
}
}
else if (m_game.stepping != "1.0") break;
else if (m_game.stepping != "1.0") break;
#endif
case 0xF9:
case 0xC1:
@ -1329,7 +1331,7 @@ UINT32 CModel3::Read32(UINT32 addr)
// Unknown
default:
#ifdef NET_BOARD
printf("CMODEL3 : unknown R32 : %x\n", addr >> 24);
printf("CMODEL3 : unknown R32 : %x\n", addr >> 24);
#endif
break;
}
@ -1413,7 +1415,7 @@ void CModel3::Write8(UINT32 addr, UINT8 data)
// Unknown
default:
//printf("CMODEL3 : unknown W8 mirror : %x\n", addr >> 16);
//printf("CMODEL3 : unknown W8 mirror : %x\n", addr >> 16);
break;
}
@ -1428,7 +1430,7 @@ void CModel3::Write8(UINT32 addr, UINT8 data)
TileGen.WriteRAM8(addr&0x1FFFFF, data);
break;
}
goto Unknown8;
goto Unknown8;
// MPC105/106
case 0xF8:
@ -1492,7 +1494,7 @@ void CModel3::Write8(UINT32 addr, UINT8 data)
break;
}
else if (m_game.stepping != "1.0") break;
else if (m_game.stepping != "1.0") break;
#endif
case 0xF9:
case 0xC1:
@ -1553,7 +1555,7 @@ void CModel3::Write16(UINT32 addr, UINT16 data)
// Unknown
default:
//printf("CMODEL3 : unknown W16 mirror : %x\n", addr >> 16);
//printf("CMODEL3 : unknown W16 mirror : %x\n", addr >> 16);
break;
}
@ -1578,28 +1580,29 @@ void CModel3::Write16(UINT32 addr, UINT16 data)
#ifdef NET_BOARD
case 0xC0: // skichamp only
//printf("CModel 3 : write16 %x<-%x\n", addr, data);
//printf("CModel 3 : write16 %x<-%x\n", addr, data);
switch ((addr & 0x3ffff) >> 16)
{
case 0:
//printf("W16 netbuffer @%x<-%x\n", (addr & 0xFFFF), data);
*(UINT16 *)&netBuffer[(addr & 0xFFFF)] = FLIPENDIAN16(data);
break;
default:
printf("CMODEL3 : unknown W16 : %x\n", addr >> 24);
break;
}
switch ((addr & 0x3ffff) >> 16)
{
case 0:
//printf("W16 netbuffer @%x<-%x\n", (addr & 0xFFFF), data);
*(UINT16 *)&netBuffer[(addr & 0xFFFF)] = FLIPENDIAN16(data);
break;
break;
default:
//printf("CMODEL3 : unknown W16 : %x\n", addr >> 24);
break;
}
break;
#endif
// Unknown
// Unknown
default:
Unknown16:
DebugLog("PC=%08X\twrite16: %08X=%04X\n", ppc_get_pc(), addr, data);
break;
DebugLog("PC=%08X\twrite16: %08X=%04X\n", ppc_get_pc(), addr, data);
break;
}
}
@ -1693,7 +1696,7 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
break;
// MPC105/106
case 0xC0: case 0xD0: case 0xE0:
case 0xC0: case 0xD0: case 0xE0:
case 0xC1: case 0xD1: case 0xE1:
case 0xC2: case 0xD2: case 0xE2:
case 0xC3: case 0xD3: case 0xE3:
@ -1743,7 +1746,7 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
// Unknown
default:
//printf("CMODEL3 : unknown W32 mirror : %x\n", addr >> 16);
//printf("CMODEL3 : unknown W32 mirror : %x\n", addr >> 16);
break;
}
@ -1780,7 +1783,7 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
case 0xC0: // step 1.0 only
#ifndef NET_BOARD
if (m_game.stepping != "1.0")
goto Unknown32;
goto Unknown32;
#endif
#ifdef NET_BOARD
if (m_game.stepping != "1.0" && (NetBoard.IsAttached() && (m_config["EmulateNet"].ValueAs<bool>()))) // assuming there is no scsi card for step>1.0 because same address for network card (right or wrong ??)
@ -1790,7 +1793,7 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
case 0:
//printf("W32 netbuffer @%x<-%x\n", (addr & 0xFFFF), data);
//*(UINT32 *)&netBuffer[(addr & 0xFFFF)] = FLIPENDIAN32(data);
*(UINT32 *)&netBuffer[(addr & 0xFFFF)] = _rotl(FLIPENDIAN32(data), 16);
*(UINT32 *)&netBuffer[(addr & 0xFFFF)] = _rotl(FLIPENDIAN32(data), 16);
break;
case 1: // ioreg 32bits access to 16bits range
@ -1822,12 +1825,12 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
break;
}
if ((*(UINT16 *)&netBuffer[(0xc00100c0 & 0x3FFFF)] == FLIPENDIAN16(0x0000)) && NetBoard.CodeReady == true) // c0=180/2 // reset net when reboot - not perfect, I think memory must be cleared
{
printf("Network pause\n");
NetBoard.CodeReady = false;
NetBoard.Reset();
}
if ((*(UINT16 *)&netBuffer[(0xc00100c0 & 0x3FFFF)] == FLIPENDIAN16(0x0000)) && NetBoard.CodeReady == true) // c0=180/2 // reset net when reboot - not perfect, I think memory must be cleared
{
printf("Network pause\n");
NetBoard.CodeReady = false;
NetBoard.Reset();
}
if ((*(UINT16 *)&netBuffer[(0xc0010088 & 0x3FFFF)] == FLIPENDIAN16(0x0080)) && NetBoard.CodeReady == false) // 88=110/2
{
@ -1838,7 +1841,7 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
break;
}
else if (m_game.stepping != "1.0") break;
else if (m_game.stepping != "1.0") break;
#endif
case 0xF9:
case 0xC1:
@ -1862,8 +1865,8 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
void CModel3::Write64(UINT32 addr, UINT64 data)
{
//printf("write64 %x <- %x\n", addr, data);
Write32(addr+0, (UINT32) (data>>32));
//printf("write64 %x <- %x\n", addr, data);
Write32(addr+0, (UINT32) (data>>32));
Write32(addr+4, (UINT32) data);
}
@ -2024,8 +2027,8 @@ void CModel3::RunFrame(void)
if (m_gpuMultiThreaded)
SyncGPUs();
/*if (NetBoard.IsAttached())
RunNetBoardFrame();*/
/*if (NetBoard.IsAttached())
RunNetBoardFrame();*/
}
else
{
@ -2037,19 +2040,19 @@ void CModel3::RunFrame(void)
if (DriveBoard.IsAttached())
RunDriveBoardFrame();
#ifdef NET_BOARD
if (NetBoard.IsAttached() && (m_config["EmulateNet"].ValueAs<bool>()) && ((*(UINT16 *)&netBuffer[(0xc00100C0 & 0x3FFFF)] == 0xFFFF) || (netBuffer[(0xc00100C0 & 0x3FFFF)] == 0xFF) || (*(UINT16 *)&netBuffer[(0xc00100C0 & 0x3FFFF)] == 0x0001)) && (NetBoard.CodeReady == true))
{
// ppc irq network needed ? no effect, is it really active/needed ?
//RunNetBoardFrame();
IRQ.Assert(0x10);
ppc_execute(200); // give PowerPC time to acknowledge IRQ
//RunNetBoardFrame();
IRQ.Deassert(0x10);
ppc_execute(200); // acknowledge that IRQ was deasserted (TODO: is this really needed?)
RunNetBoardFrame();
// Hum hum, if runnetboardframe is called at 1st place or between ppc irq assert/deassert, spikout freezes just after the gate with net error
// if runnetboardframe is called after ppc irq assert/deassert, spikout works
}
if (NetBoard.IsAttached() && (m_config["EmulateNet"].ValueAs<bool>()) && ((*(UINT16 *)&netBuffer[(0xc00100C0 & 0x3FFFF)] == 0xFFFF) || (netBuffer[(0xc00100C0 & 0x3FFFF)] == 0xFF) || (*(UINT16 *)&netBuffer[(0xc00100C0 & 0x3FFFF)] == 0x0001)) && (NetBoard.CodeReady == true))
{
// ppc irq network needed ? no effect, is it really active/needed ?
//RunNetBoardFrame();
IRQ.Assert(0x10);
ppc_execute(200); // give PowerPC time to acknowledge IRQ
//RunNetBoardFrame();
IRQ.Deassert(0x10);
ppc_execute(200); // acknowledge that IRQ was deasserted (TODO: is this really needed?)
RunNetBoardFrame();
// Hum hum, if runnetboardframe is called at 1st place or between ppc irq assert/deassert, spikout freezes just after the gate with net error
// if runnetboardframe is called after ppc irq assert/deassert, spikout works
}
#endif
}
@ -2342,7 +2345,7 @@ void CModel3::RunDriveBoardFrame(void)
#ifdef NET_BOARD
void CModel3::RunNetBoardFrame(void)
{
NetBoard.RunFrame();
NetBoard.RunFrame();
}
#endif
@ -2411,7 +2414,7 @@ bool CModel3::StartThreads(void)
// Set audio callback if sound board thread is unsync'd
if (!syncSndBrdThread)
{
SetAudioCallback(AudioCallback, this);
SetAudioCallback(AudioCallback, this);
}
startedThreads = true;
@ -2609,7 +2612,7 @@ void CModel3::DumpTimings(void)
timings.sndTicks, (timings.sndTicks > 10 ? '!' : ','),
timings.drvTicks, (timings.drvTicks > 10 ? '!' : ','),
#ifdef NET_BOARD
timings.netTicks, (timings.netTicks > 10 ? '!' : ','),
timings.netTicks, (timings.netTicks > 10 ? '!' : ','),
#endif
timings.frameTicks, (timings.frameTicks > 16 ? '!' : ' '));
}
@ -2647,7 +2650,6 @@ int CModel3::StartDriveBoardThread(void *data)
return model3->RunDriveBoardThread();
}
int CModel3::RunMainBoardThread(void)
{
for (;;)
@ -2945,8 +2947,6 @@ ThreadError:
return 1;
}
void CModel3::Reset(void)
{
// Clear memory (but do not modify backup RAM!)
@ -3024,8 +3024,8 @@ void CModel3::Reset(void)
#define MEMORY_POOL_SIZE (0x800000 + 0x800000 + 0x8000000 + 0x4000000 + 0x20000 + 0x20000 + 0x80000 + 0x1000000 + 0x20000 + 0x1000000 + 0x10000)
#endif
#ifdef NET_BOARD
#define OFFSET_NETBUFFER 0xC000000 // not really 128kb (64kb buffer 0000-ffff + i/o 10000-101ff)
#define OFFSET_NETRAM 0xC020000 // 128 KB (c0020000-c003ffff)
#define OFFSET_NETBUFFER 0xC000000 // not really 128kb (64kb buffer 0000-ffff + i/o 10000-101ff)
#define OFFSET_NETRAM 0xC020000 // 128 KB (c0020000-c003ffff)
#define MEMORY_POOL_SIZE (0x800000 + 0x800000 + 0x8000000 + 0x4000000 + 0x20000 + 0x20000 + 0x80000 + 0x1000000 + 0x20000 + 0x1000000 + 0x10000 + 0x40000)
//8MB 8MB 128MB 64MB 128KB 128KB 512KB 16MB 128KB 16MB 64KB 256KB
#endif
@ -3100,7 +3100,10 @@ bool CModel3::LoadGame(const Game &game, const ROMSet &rom_set)
ppc_config.pvr = PPC_MODEL_603E; // 100 MHz
ppc_config.bus_frequency = BUS_FREQUENCY_66MHZ;
ppc_config.bus_frequency_multiplier = 0x15; // 1.5X multiplier
if (game.name == "scudp1")
if (game.name == "scudplusa"
|| game.name == "vs215" || game.name == "vs215o"
|| game.name == "vs29815" || game.name == "vs29915"
)
PCIBridge.SetModel(0x106); // some Step 1.x games use MPC106
else
PCIBridge.SetModel(0x105); // MPC105
@ -3110,7 +3113,8 @@ bool CModel3::LoadGame(const Game &game, const ROMSet &rom_set)
ppc_config.pvr = PPC_MODEL_603R; // 66 MHz
ppc_config.bus_frequency = BUS_FREQUENCY_66MHZ;
ppc_config.bus_frequency_multiplier = 0x10; // 1X multiplier
if (game.name == "bass" || game.name == "getbass")
if (game.name == "bass" || game.name == "bassdx" || game.name == "getbass")
PCIBridge.SetModel(0x106); // some Step 1.x games use MPC106
else
PCIBridge.SetModel(0x105); // MPC105
@ -3135,7 +3139,17 @@ bool CModel3::LoadGame(const Game &game, const ROMSet &rom_set)
// Initialize Real3D
int stepping = ((game.stepping[0] - '0') << 4) | (game.stepping[2] - '0');
GPU.SetStepping(stepping);
// Some step 2+ games need the older PCI ID (obvious symptom:
// vbl is enabled briefly then disabled so the game hangs)
bool step20_with_old_real3d;
if (game.name == "von2" || game.name == "von2a" || game.name == "von254g"
|| game.name == "dirtdvls" || game.name == "dirtdvlsa" || game.name == "dirtdvlsj"
|| game.name == "magtruck" || game.name == "lamachin"
)
step20_with_old_real3d = true;
else
step20_with_old_real3d = false;
GPU.SetStepping(stepping, step20_with_old_real3d);
// MPEG board (if present)
if (rom_set.get_rom("mpeg_program").size)
@ -3272,7 +3286,7 @@ bool CModel3::Init(void)
return FAIL;
#ifdef NET_BOARD
if (OKAY != NetBoard.Init(netRAM, netBuffer))
return FAIL;
return FAIL;
#endif
PCIBridge.AttachPCIBus(&PCIBus);
@ -3287,7 +3301,7 @@ bool CModel3::Init(void)
CSoundBoard *CModel3::GetSoundBoard(void)
{
return &SoundBoard;
return &SoundBoard;
}
CDriveBoard *CModel3::GetDriveBoard(void)
@ -3298,7 +3312,7 @@ CDriveBoard *CModel3::GetDriveBoard(void)
#ifdef NET_BOARD
CNetBoard *CModel3::GetNetBoard(void)
{
return &NetBoard;
return &NetBoard;
}
#endif
@ -3311,9 +3325,9 @@ CModel3::CModel3(const Util::Config::Node &config)
SoundBoard(config),
DriveBoard(config),
#ifdef NET_BOARD
NetBoard(config),
NetBoard(config),
#endif
m_jtag(GPU)
m_jtag(GPU)
{
// Initialize pointers so dtor can know whether to free them
memoryPool = NULL;
@ -3411,7 +3425,6 @@ CModel3::~CModel3(void)
DSB = NULL;
}
Inputs = NULL;
Outputs = NULL;
ram = NULL;

View file

@ -263,12 +263,12 @@ void CReal3D::BeginFrame(void)
// If multi-threaded, perform now any queued texture uploads to renderer before rendering begins
if (m_gpuMultiThreaded)
{
for (const auto &it : queuedUploadTexturesRO) {
for (const auto &it : queuedUploadTexturesRO) {
Render3D->UploadTextures(it.level, it.x, it.y, it.width, it.height);
}
}
// done syncing data
queuedUploadTexturesRO.clear();
// done syncing data
queuedUploadTexturesRO.clear();
}
Render3D->BeginFrame();
@ -631,9 +631,9 @@ void CReal3D::WriteDMARegister32(unsigned reg, uint32_t data)
IRQ->Assert(dmaIRQ);
break;
case 0x10: // command register
if ((data&0x20000000))
if ((data&0x20000000)) // DMA ID command
{
dmaData = 0x16C311DB; // Virtual On 2 expects this from DMA
dmaData = pciID;
DebugLog("Real3D: DMA ID command issued (ATTENTION: make sure we're returning the correct value), PC=%08X, LR=%08X\n", ppc_get_pc(), ppc_get_lr());
}
else if ((data&0x80000000))
@ -678,6 +678,7 @@ void CReal3D::Flush(void)
UploadTexture(header,(uint16_t *)&textureFIFO[i+2]);
DebugLog("Real3D: Texture upload completed: %X bytes (%X)\n", size*4, textureFIFO[i+0]);
i += size;
}
}
@ -868,7 +869,8 @@ uint32_t CReal3D::GetASICIDCode(ASIC asic) const
return it == m_asicID.end() ? 0 : it->second;
}
void CReal3D::SetStepping(int stepping)
void CReal3D::SetStepping(int stepping, bool step20_with_old_real3d)
{
step = stepping;
if ((step!=0x10) && (step!=0x15) && (step!=0x20) && (step!=0x21))
@ -878,7 +880,9 @@ void CReal3D::SetStepping(int stepping)
}
// Set PCI ID
if (step < 0x20)
// Some step 2+ games need the older PCI ID (obvious symptom:
// vbl is enabled briefly then disabled so the game hangs)
if ((step < 0x20) || step20_with_old_real3d)
pciID = 0x16C311DB; // vendor 0x11DB = Sega
else
pciID = 0x178611DB;

View file

@ -362,7 +362,8 @@ public:
* stepping 0x10 for Step 1.0, 0x15 for Step 1.5, 0x20 for Step 2.0, or
* 0x21 for Step 2.1. Anything else defaults to 1.0.
*/
void SetStepping(int stepping);
void SetStepping(int stepping, bool step20_with_old_real3d);
/*
* Init(vromPtr, BusObjectPtr, IRQObjectPtr, dmaIRQBit):