mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2025-02-18 02:05:39 +00:00
Use correct PCI IDs (Harry Tuttle)
This commit is contained in:
parent
80cf1f9b52
commit
9f5a19a04a
|
@ -457,7 +457,7 @@
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<roms>
|
||||||
<patches>
|
<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" />
|
<patch region="crom" bits="32" offset="0x4a45e4" value="0x60000000" />
|
||||||
</patches>
|
</patches>
|
||||||
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
|
@ -574,7 +574,7 @@
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<roms>
|
||||||
<patches>
|
<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" />
|
<patch region="crom" bits="32" offset="0x4a45e4" value="0x60000000" />
|
||||||
</patches>
|
</patches>
|
||||||
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
|
@ -850,11 +850,7 @@
|
||||||
</inputs>
|
</inputs>
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<roms>
|
||||||
<patches>
|
<!-- Base offset of program in CROM space: 0x6473c0 (0x0473c0 in the ROM) -->
|
||||||
<!-- 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>
|
|
||||||
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
<file offset="0" name="epr-19890b.20" crc32="0x9C16C3CC" />
|
<file offset="0" name="epr-19890b.20" crc32="0x9C16C3CC" />
|
||||||
<file offset="2" name="epr-19889b.19" crc32="0xD1F7E44C" />
|
<file offset="2" name="epr-19889b.19" crc32="0xD1F7E44C" />
|
||||||
|
@ -1128,6 +1124,10 @@
|
||||||
</inputs>
|
</inputs>
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<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">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
<file offset="0" name="epr-19734.20" crc32="0xBE897336" />
|
<file offset="0" name="epr-19734.20" crc32="0xBE897336" />
|
||||||
<file offset="2" name="epr-19733.19" crc32="0x6565E29A" />
|
<file offset="2" name="epr-19733.19" crc32="0x6565E29A" />
|
||||||
|
@ -1639,6 +1639,7 @@
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<roms>
|
||||||
<patches>
|
<patches>
|
||||||
|
<!-- Unemulated JTAG stuff -->
|
||||||
<patch region="crom" bits="32" offset="0x7c0c4" value="0x60000000" />
|
<patch region="crom" bits="32" offset="0x7c0c4" value="0x60000000" />
|
||||||
<patch region="crom" bits="32" offset="0x7c0c8" value="0x60000000" />
|
<patch region="crom" bits="32" offset="0x7c0c8" value="0x60000000" />
|
||||||
<patch region="crom" bits="32" offset="0x7c0cc" value="0x60000000" />
|
<patch region="crom" bits="32" offset="0x7c0cc" value="0x60000000" />
|
||||||
|
@ -1810,14 +1811,8 @@
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<roms>
|
||||||
<patches>
|
<patches>
|
||||||
<patch region="crom" bits="32" offset="0xf0e48" value="0x60000000" />
|
<!-- skip force feedback lever check -->
|
||||||
<patch region="crom" bits="32" offset="0x043dc" value="0x48000090" /> <!-- related to joystick feedback -->
|
<patch region="crom" bits="32" offset="0xf6e44" value="0x60000000" /> <!-- from MAME -->
|
||||||
<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" /> <!-- "" -->
|
|
||||||
</patches>
|
</patches>
|
||||||
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
<file offset="0" name="epr-21382a.20" crc32="0x69BAF117" />
|
<file offset="0" name="epr-21382a.20" crc32="0x69BAF117" />
|
||||||
|
@ -1876,7 +1871,8 @@
|
||||||
<file offset="0x800000" name="mpr-21377.22" crc32="0x720621F8" />
|
<file offset="0x800000" name="mpr-21377.22" crc32="0x720621F8" />
|
||||||
<file offset="0xC00000" name="mpr-21378.24" crc32="0x1FCF715E" />
|
<file offset="0xC00000" name="mpr-21378.24" crc32="0x1FCF715E" />
|
||||||
</region>
|
</region>
|
||||||
<!-- Force feedback controller prg
|
<!-- Force feedback controller prg -->
|
||||||
|
<!--
|
||||||
<region name="ffb_program" stride="1" chunk_size="1">
|
<region name="ffb_program" stride="1" chunk_size="1">
|
||||||
<file offset="0" name="epr-21119.ic8" crc32="0x65082B14" />
|
<file offset="0" name="epr-21119.ic8" crc32="0x65082B14" />
|
||||||
</region>
|
</region>
|
||||||
|
@ -1902,6 +1898,7 @@
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<roms>
|
||||||
<patches>
|
<patches>
|
||||||
|
<!-- skip force feedback lever check -->
|
||||||
<patch region="crom" bits="32" offset="0xf6dd0" value="0x60000000" /> <!-- from MAME -->
|
<patch region="crom" bits="32" offset="0xf6dd0" value="0x60000000" /> <!-- from MAME -->
|
||||||
</patches>
|
</patches>
|
||||||
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
|
@ -2293,16 +2290,6 @@
|
||||||
</inputs>
|
</inputs>
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<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">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
<file offset="0" name="epr-19897.20" crc32="0x25A722A9" />
|
<file offset="0" name="epr-19897.20" crc32="0x25A722A9" />
|
||||||
<file offset="2" name="epr-19898.19" crc32="0x4389D9CE" />
|
<file offset="2" name="epr-19898.19" crc32="0x4389D9CE" />
|
||||||
|
@ -2330,10 +2317,6 @@
|
||||||
</inputs>
|
</inputs>
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<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">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
<file offset="0" name="epr-19803.20" crc32="0x1E55A5B8" />
|
<file offset="0" name="epr-19803.20" crc32="0x1E55A5B8" />
|
||||||
<file offset="2" name="epr-19804.19" crc32="0xBBACA578" />
|
<file offset="2" name="epr-19804.19" crc32="0xBBACA578" />
|
||||||
|
@ -2362,18 +2345,6 @@
|
||||||
<encryption_key>0x29234e96</encryption_key>
|
<encryption_key>0x29234e96</encryption_key>
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<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">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
<file offset="0" name="epr-20920.20" crc32="0x428D05FC" />
|
<file offset="0" name="epr-20920.20" crc32="0x428D05FC" />
|
||||||
<file offset="2" name="epr-20919.19" crc32="0x7A0713D2" />
|
<file offset="2" name="epr-20919.19" crc32="0x7A0713D2" />
|
||||||
|
@ -2448,10 +2419,6 @@
|
||||||
</inputs>
|
</inputs>
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<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">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
<file offset="0" name="epr-20912.20" crc32="0xCD2C0538" />
|
<file offset="0" name="epr-20912.20" crc32="0xCD2C0538" />
|
||||||
<file offset="2" name="epr-20911.19" crc32="0xACB8FD97" />
|
<file offset="2" name="epr-20911.19" crc32="0xACB8FD97" />
|
||||||
|
@ -2581,10 +2548,6 @@
|
||||||
</inputs>
|
</inputs>
|
||||||
</hardware>
|
</hardware>
|
||||||
<roms>
|
<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">
|
<region name="crom" stride="8" chunk_size="2" byte_swap="true">
|
||||||
<file offset="0" name="epr-21534.20" crc32="0xD49AE219" />
|
<file offset="0" name="epr-21534.20" crc32="0xD49AE219" />
|
||||||
<file offset="2" name="epr-21533.19" crc32="0xEA728471" />
|
<file offset="2" name="epr-21533.19" crc32="0xEA728471" />
|
||||||
|
|
|
@ -26,9 +26,6 @@ CNew3D::CNew3D(const Util::Config::Node &config, std::string gameName)
|
||||||
m_textureRAM = nullptr;
|
m_textureRAM = nullptr;
|
||||||
m_sunClamp = true;
|
m_sunClamp = true;
|
||||||
m_shadeIsSigned = true;
|
m_shadeIsSigned = true;
|
||||||
|
|
||||||
// Fall-back mechanism for games with patched (not working) JTAG
|
|
||||||
if (m_gameName == "swtrilgy") m_shadeIsSigned = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CNew3D::~CNew3D()
|
CNew3D::~CNew3D()
|
||||||
|
@ -1665,8 +1662,6 @@ void CNew3D::SetSunClamp(bool enable)
|
||||||
|
|
||||||
void CNew3D::SetSignedShade(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;
|
m_shadeIsSigned = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -895,111 +895,113 @@ UINT8 CModel3::Read8(UINT32 addr)
|
||||||
// Other
|
// Other
|
||||||
switch ((addr >> 24))
|
switch ((addr >> 24))
|
||||||
{
|
{
|
||||||
// CROM
|
// CROM
|
||||||
case 0xFF:
|
case 0xFF:
|
||||||
if (addr < 0xFF800000)
|
if (addr < 0xFF800000)
|
||||||
return cromBank[(addr & 0x7FFFFF) ^ 3];
|
return cromBank[(addr & 0x7FFFFF) ^ 3];
|
||||||
else
|
else
|
||||||
return crom[(addr & 0x7FFFFF) ^ 3];
|
return crom[(addr & 0x7FFFFF) ^ 3];
|
||||||
|
|
||||||
// Real3D DMA
|
// Real3D DMA
|
||||||
case 0xC2:
|
case 0xC2:
|
||||||
return GPU.ReadDMARegister8(addr & 0xFF);
|
return GPU.ReadDMARegister8(addr & 0xFF);
|
||||||
|
|
||||||
// Various
|
// Various
|
||||||
case 0xF0:
|
case 0xF0:
|
||||||
case 0xFE: // mirror
|
case 0xFE: // mirror
|
||||||
|
|
||||||
switch ((addr >> 16) & 0xFF)
|
switch ((addr >> 16) & 0xFF)
|
||||||
{
|
{
|
||||||
// Inputs
|
// Inputs
|
||||||
case 0x04:
|
case 0x04:
|
||||||
return ReadInputs(addr & 0x3F);
|
return ReadInputs(addr & 0x3F);
|
||||||
|
|
||||||
// Sound Board
|
// Sound Board
|
||||||
case 0x08:
|
case 0x08:
|
||||||
if ((addr & 0xF) == 4) // MIDI control port
|
if ((addr & 0xF) == 4) // MIDI control port
|
||||||
return 0x83; // magtruck country check
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// System registers
|
return 0x83; // magtruck country check
|
||||||
case 0x10:
|
|
||||||
return ReadSystemRegister(addr & 0x3F);
|
|
||||||
|
|
||||||
// RTC
|
else
|
||||||
case 0x14:
|
return 0;
|
||||||
if ((addr & 3) == 1) // battery voltage test
|
break;
|
||||||
return 0x03;
|
|
||||||
else if ((addr & 3) == 0)
|
|
||||||
return RTC.ReadRegister((addr >> 2) & 0xF);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// Unknown
|
// System registers
|
||||||
default:
|
case 0x10:
|
||||||
//printf("CMODEL3 : unknown R8 mirror : %x\n", addr >> 16);
|
return ReadSystemRegister(addr & 0x3F);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
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:
|
case 0xF1:
|
||||||
if (addr < 0xF1120000)
|
if (addr < 0xF1120000)
|
||||||
{
|
{
|
||||||
// Tile generator accesses its RAM as little endian, no adjustment needed here
|
// Tile generator accesses its RAM as little endian, no adjustment needed here
|
||||||
return TileGen.ReadRAM8(addr & 0x1FFFFF);
|
return TileGen.ReadRAM8(addr & 0x1FFFFF);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 53C810 SCSI
|
// 53C810 SCSI
|
||||||
case 0xC0: // only on Step 1.0
|
case 0xC0: // only on Step 1.0
|
||||||
#ifndef NET_BOARD
|
#ifndef NET_BOARD
|
||||||
if (m_game.stepping != "1.0")
|
if (m_game.stepping != "1.0")
|
||||||
{
|
{
|
||||||
//printf("Model3 : Read8 %x\n", addr);
|
//printf("Model3 : Read8 %x\n", addr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
if (m_game.stepping != "1.0" && (NetBoard.IsAttached() && (m_config["EmulateNet"].ValueAs<bool>()))) // check for Step 1.0
|
if (m_game.stepping != "1.0" && (NetBoard.IsAttached() && (m_config["EmulateNet"].ValueAs<bool>()))) // check for Step 1.0
|
||||||
{
|
{
|
||||||
switch ((addr & 0x3ffff) >> 16)
|
switch ((addr & 0x3ffff) >> 16)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
//printf("R8 netbuffer @%x=%x\n", (addr & 0xFFFF), netBuffer[(addr & 0xFFFF)]);
|
//printf("R8 netbuffer @%x=%x\n", (addr & 0xFFFF), netBuffer[(addr & 0xFFFF)]);
|
||||||
return netBuffer[(addr & 0xFFFF)];
|
return netBuffer[(addr & 0xFFFF)];
|
||||||
|
|
||||||
case 1: // ioreg 32bits access in 16bits environment
|
case 1: // ioreg 32bits access in 16bits environment
|
||||||
if (addr > 0xc00101ff)
|
if (addr > 0xc00101ff)
|
||||||
{
|
{
|
||||||
printf("R8 ATTENTION OUT OF RANGE\n");
|
printf("R8 ATTENTION OUT OF RANGE\n");
|
||||||
MessageBox(NULL, "Out of Range", NULL, MB_OK);
|
MessageBox(NULL, "Out of Range", NULL, MB_OK);
|
||||||
}
|
}
|
||||||
printf("R8 ioreg @%x=%x\n", (addr & 0x1FF), netBuffer[0x10000 + ((addr & 0x1FF) / 2)]);
|
printf("R8 ioreg @%x=%x\n", (addr & 0x1FF), netBuffer[0x10000 + ((addr & 0x1FF) / 2)]);
|
||||||
return netBuffer[0x10000 + ((addr & 0x1FF) / 2)];
|
return netBuffer[0x10000 + ((addr & 0x1FF) / 2)];
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
if (addr > 0xc002ffff)
|
if (addr > 0xc002ffff)
|
||||||
{
|
{
|
||||||
printf("R8 ATTENTION OUT OF RANGE\n");
|
printf("R8 ATTENTION OUT OF RANGE\n");
|
||||||
MessageBox(NULL, "Out of Range", NULL, MB_OK);
|
MessageBox(NULL, "Out of Range", NULL, MB_OK);
|
||||||
}
|
}
|
||||||
//printf("R8 netram @%x=%x\n", (addr & 0x1FFFF), netRAM[addr & 0x1ffff]);
|
//printf("R8 netram @%x=%x\n", (addr & 0x1FFFF), netRAM[addr & 0x1ffff]);
|
||||||
return netRAM[((addr & 0x1FFFF) / 2)];
|
return netRAM[((addr & 0x1FFFF) / 2)];
|
||||||
/*case 3:
|
/*case 3:
|
||||||
//printf("R8 netram @%x=%x\n", (addr & 0x1FFFF), netRAM[addr & 0x1ffff]);
|
//printf("R8 netram @%x=%x\n", (addr & 0x1FFFF), netRAM[addr & 0x1ffff]);
|
||||||
return netRAM[((addr & 0x1FFFF) / 2)];*/
|
return netRAM[((addr & 0x1FFFF) / 2)];*/
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("R8 ATTENTION OUT OF RANGE\n");
|
printf("R8 ATTENTION OUT OF RANGE\n");
|
||||||
MessageBox(NULL, "Out of Range", NULL, MB_OK);
|
MessageBox(NULL, "Out of Range", NULL, MB_OK);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_game.stepping != "1.0") break;
|
else if (m_game.stepping != "1.0") break;
|
||||||
#endif
|
#endif
|
||||||
case 0xF9:
|
case 0xF9:
|
||||||
case 0xC1:
|
case 0xC1:
|
||||||
|
@ -1008,7 +1010,7 @@ UINT8 CModel3::Read8(UINT32 addr)
|
||||||
// Unknown
|
// Unknown
|
||||||
default:
|
default:
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
printf("CMODEL3 : unknown R8 : %x\n", addr >> 24);
|
printf("CMODEL3 : unknown R8 : %x\n", addr >> 24);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1083,7 +1085,7 @@ UINT16 CModel3::Read16(UINT32 addr)
|
||||||
|
|
||||||
// Unknown
|
// Unknown
|
||||||
default:
|
default:
|
||||||
//printf("CMODEL3 : unknown R16 mirror : %x\n", addr >> 16);
|
//printf("CMODEL3 : unknown R16 mirror : %x\n", addr >> 16);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1101,27 +1103,27 @@ UINT16 CModel3::Read16(UINT32 addr)
|
||||||
|
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
case 0xc0: // spikeout call this
|
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
|
// 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 ?
|
// sort of sync ack ? who writes this 16b value ?
|
||||||
{
|
{
|
||||||
UINT16 result;
|
UINT16 result;
|
||||||
switch ((addr & 0x3ffff) >> 16)
|
switch ((addr & 0x3ffff) >> 16)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
//printf("R16 netbuffer @%x=%x\n", (addr & 0xFFFF), FLIPENDIAN16(*(UINT16 *)&netBuffer[(addr & 0xFFFF)]));
|
//printf("R16 netbuffer @%x=%x\n", (addr & 0xFFFF), FLIPENDIAN16(*(UINT16 *)&netBuffer[(addr & 0xFFFF)]));
|
||||||
result = *(UINT16 *)&netBuffer[(addr & 0xFFFF)];
|
result = *(UINT16 *)&netBuffer[(addr & 0xFFFF)];
|
||||||
return FLIPENDIAN16(result); // result
|
return FLIPENDIAN16(result); // result
|
||||||
default:
|
default:
|
||||||
printf("CMODEL3 : unknown R16 : %x (C0)\n", addr);
|
printf("CMODEL3 : unknown R16 : %x (C0)\n", addr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Unknown
|
// Unknown
|
||||||
default:
|
default:
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
printf("CMODEL3 : unknown R16 : %x (%x)\n", addr, addr >> 24);
|
printf("CMODEL3 : unknown R16 : %x (%x)\n", addr, addr >> 24);
|
||||||
MessageBox(NULL, "CMODEL3 : Unknown R16", NULL, MB_OK);
|
MessageBox(NULL, "CMODEL3 : Unknown R16", NULL, MB_OK);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1237,7 +1239,7 @@ UINT32 CModel3::Read32(UINT32 addr)
|
||||||
|
|
||||||
// Unknown
|
// Unknown
|
||||||
default:
|
default:
|
||||||
//printf("CModel 3 unknown R32 mirror %x", (addr >> 16) & 0xFF);
|
//printf("CModel 3 unknown R32 mirror %x", (addr >> 16) & 0xFF);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1275,7 +1277,7 @@ UINT32 CModel3::Read32(UINT32 addr)
|
||||||
case 0:
|
case 0:
|
||||||
//printf("R32 netbuffer @%x=%x\n", (addr & 0xFFFF), FLIPENDIAN32(*(UINT32 *)&netBuffer[(addr & 0xFFFF)]));
|
//printf("R32 netbuffer @%x=%x\n", (addr & 0xFFFF), FLIPENDIAN32(*(UINT32 *)&netBuffer[(addr & 0xFFFF)]));
|
||||||
result = *(UINT32 *)&netBuffer[(addr & 0xFFFF)];
|
result = *(UINT32 *)&netBuffer[(addr & 0xFFFF)];
|
||||||
return _rotl(FLIPENDIAN32(result), 16);
|
return _rotl(FLIPENDIAN32(result), 16);
|
||||||
//return FLIPENDIAN32(result); // result
|
//return FLIPENDIAN32(result); // result
|
||||||
|
|
||||||
case 1: // ioreg 32bits access to 16bits range
|
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
|
#endif
|
||||||
case 0xF9:
|
case 0xF9:
|
||||||
case 0xC1:
|
case 0xC1:
|
||||||
|
@ -1329,7 +1331,7 @@ UINT32 CModel3::Read32(UINT32 addr)
|
||||||
// Unknown
|
// Unknown
|
||||||
default:
|
default:
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
printf("CMODEL3 : unknown R32 : %x\n", addr >> 24);
|
printf("CMODEL3 : unknown R32 : %x\n", addr >> 24);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1413,7 +1415,7 @@ void CModel3::Write8(UINT32 addr, UINT8 data)
|
||||||
|
|
||||||
// Unknown
|
// Unknown
|
||||||
default:
|
default:
|
||||||
//printf("CMODEL3 : unknown W8 mirror : %x\n", addr >> 16);
|
//printf("CMODEL3 : unknown W8 mirror : %x\n", addr >> 16);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1428,7 +1430,7 @@ void CModel3::Write8(UINT32 addr, UINT8 data)
|
||||||
TileGen.WriteRAM8(addr&0x1FFFFF, data);
|
TileGen.WriteRAM8(addr&0x1FFFFF, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
goto Unknown8;
|
goto Unknown8;
|
||||||
|
|
||||||
// MPC105/106
|
// MPC105/106
|
||||||
case 0xF8:
|
case 0xF8:
|
||||||
|
@ -1492,7 +1494,7 @@ void CModel3::Write8(UINT32 addr, UINT8 data)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (m_game.stepping != "1.0") break;
|
else if (m_game.stepping != "1.0") break;
|
||||||
#endif
|
#endif
|
||||||
case 0xF9:
|
case 0xF9:
|
||||||
case 0xC1:
|
case 0xC1:
|
||||||
|
@ -1553,7 +1555,7 @@ void CModel3::Write16(UINT32 addr, UINT16 data)
|
||||||
|
|
||||||
// Unknown
|
// Unknown
|
||||||
default:
|
default:
|
||||||
//printf("CMODEL3 : unknown W16 mirror : %x\n", addr >> 16);
|
//printf("CMODEL3 : unknown W16 mirror : %x\n", addr >> 16);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1578,28 +1580,29 @@ void CModel3::Write16(UINT32 addr, UINT16 data)
|
||||||
|
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
case 0xC0: // skichamp only
|
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:
|
switch ((addr & 0x3ffff) >> 16)
|
||||||
printf("CMODEL3 : unknown W16 : %x\n", addr >> 24);
|
{
|
||||||
break;
|
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
|
#endif
|
||||||
|
|
||||||
// Unknown
|
// Unknown
|
||||||
default:
|
default:
|
||||||
Unknown16:
|
Unknown16:
|
||||||
DebugLog("PC=%08X\twrite16: %08X=%04X\n", ppc_get_pc(), addr, data);
|
DebugLog("PC=%08X\twrite16: %08X=%04X\n", ppc_get_pc(), addr, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1693,7 +1696,7 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// MPC105/106
|
// MPC105/106
|
||||||
case 0xC0: case 0xD0: case 0xE0:
|
case 0xC0: case 0xD0: case 0xE0:
|
||||||
case 0xC1: case 0xD1: case 0xE1:
|
case 0xC1: case 0xD1: case 0xE1:
|
||||||
case 0xC2: case 0xD2: case 0xE2:
|
case 0xC2: case 0xD2: case 0xE2:
|
||||||
case 0xC3: case 0xD3: case 0xE3:
|
case 0xC3: case 0xD3: case 0xE3:
|
||||||
|
@ -1743,7 +1746,7 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
|
||||||
|
|
||||||
// Unknown
|
// Unknown
|
||||||
default:
|
default:
|
||||||
//printf("CMODEL3 : unknown W32 mirror : %x\n", addr >> 16);
|
//printf("CMODEL3 : unknown W32 mirror : %x\n", addr >> 16);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1780,7 +1783,7 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
|
||||||
case 0xC0: // step 1.0 only
|
case 0xC0: // step 1.0 only
|
||||||
#ifndef NET_BOARD
|
#ifndef NET_BOARD
|
||||||
if (m_game.stepping != "1.0")
|
if (m_game.stepping != "1.0")
|
||||||
goto Unknown32;
|
goto Unknown32;
|
||||||
#endif
|
#endif
|
||||||
#ifdef NET_BOARD
|
#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 ??)
|
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:
|
case 0:
|
||||||
//printf("W32 netbuffer @%x<-%x\n", (addr & 0xFFFF), data);
|
//printf("W32 netbuffer @%x<-%x\n", (addr & 0xFFFF), data);
|
||||||
//*(UINT32 *)&netBuffer[(addr & 0xFFFF)] = FLIPENDIAN32(data);
|
//*(UINT32 *)&netBuffer[(addr & 0xFFFF)] = FLIPENDIAN32(data);
|
||||||
*(UINT32 *)&netBuffer[(addr & 0xFFFF)] = _rotl(FLIPENDIAN32(data), 16);
|
*(UINT32 *)&netBuffer[(addr & 0xFFFF)] = _rotl(FLIPENDIAN32(data), 16);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: // ioreg 32bits access to 16bits range
|
case 1: // ioreg 32bits access to 16bits range
|
||||||
|
@ -1822,12 +1825,12 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
|
||||||
break;
|
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
|
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");
|
printf("Network pause\n");
|
||||||
NetBoard.CodeReady = false;
|
NetBoard.CodeReady = false;
|
||||||
NetBoard.Reset();
|
NetBoard.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*(UINT16 *)&netBuffer[(0xc0010088 & 0x3FFFF)] == FLIPENDIAN16(0x0080)) && NetBoard.CodeReady == false) // 88=110/2
|
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;
|
break;
|
||||||
}
|
}
|
||||||
else if (m_game.stepping != "1.0") break;
|
else if (m_game.stepping != "1.0") break;
|
||||||
#endif
|
#endif
|
||||||
case 0xF9:
|
case 0xF9:
|
||||||
case 0xC1:
|
case 0xC1:
|
||||||
|
@ -1862,8 +1865,8 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
|
||||||
|
|
||||||
void CModel3::Write64(UINT32 addr, UINT64 data)
|
void CModel3::Write64(UINT32 addr, UINT64 data)
|
||||||
{
|
{
|
||||||
//printf("write64 %x <- %x\n", addr, data);
|
//printf("write64 %x <- %x\n", addr, data);
|
||||||
Write32(addr+0, (UINT32) (data>>32));
|
Write32(addr+0, (UINT32) (data>>32));
|
||||||
Write32(addr+4, (UINT32) data);
|
Write32(addr+4, (UINT32) data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2024,8 +2027,8 @@ void CModel3::RunFrame(void)
|
||||||
if (m_gpuMultiThreaded)
|
if (m_gpuMultiThreaded)
|
||||||
SyncGPUs();
|
SyncGPUs();
|
||||||
|
|
||||||
/*if (NetBoard.IsAttached())
|
/*if (NetBoard.IsAttached())
|
||||||
RunNetBoardFrame();*/
|
RunNetBoardFrame();*/
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2037,19 +2040,19 @@ void CModel3::RunFrame(void)
|
||||||
if (DriveBoard.IsAttached())
|
if (DriveBoard.IsAttached())
|
||||||
RunDriveBoardFrame();
|
RunDriveBoardFrame();
|
||||||
#ifdef NET_BOARD
|
#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))
|
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 ?
|
// ppc irq network needed ? no effect, is it really active/needed ?
|
||||||
//RunNetBoardFrame();
|
//RunNetBoardFrame();
|
||||||
IRQ.Assert(0x10);
|
IRQ.Assert(0x10);
|
||||||
ppc_execute(200); // give PowerPC time to acknowledge IRQ
|
ppc_execute(200); // give PowerPC time to acknowledge IRQ
|
||||||
//RunNetBoardFrame();
|
//RunNetBoardFrame();
|
||||||
IRQ.Deassert(0x10);
|
IRQ.Deassert(0x10);
|
||||||
ppc_execute(200); // acknowledge that IRQ was deasserted (TODO: is this really needed?)
|
ppc_execute(200); // acknowledge that IRQ was deasserted (TODO: is this really needed?)
|
||||||
RunNetBoardFrame();
|
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
|
// 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 runnetboardframe is called after ppc irq assert/deassert, spikout works
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2342,7 +2345,7 @@ void CModel3::RunDriveBoardFrame(void)
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
void CModel3::RunNetBoardFrame(void)
|
void CModel3::RunNetBoardFrame(void)
|
||||||
{
|
{
|
||||||
NetBoard.RunFrame();
|
NetBoard.RunFrame();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2411,7 +2414,7 @@ bool CModel3::StartThreads(void)
|
||||||
// Set audio callback if sound board thread is unsync'd
|
// Set audio callback if sound board thread is unsync'd
|
||||||
if (!syncSndBrdThread)
|
if (!syncSndBrdThread)
|
||||||
{
|
{
|
||||||
SetAudioCallback(AudioCallback, this);
|
SetAudioCallback(AudioCallback, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
startedThreads = true;
|
startedThreads = true;
|
||||||
|
@ -2609,7 +2612,7 @@ void CModel3::DumpTimings(void)
|
||||||
timings.sndTicks, (timings.sndTicks > 10 ? '!' : ','),
|
timings.sndTicks, (timings.sndTicks > 10 ? '!' : ','),
|
||||||
timings.drvTicks, (timings.drvTicks > 10 ? '!' : ','),
|
timings.drvTicks, (timings.drvTicks > 10 ? '!' : ','),
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
timings.netTicks, (timings.netTicks > 10 ? '!' : ','),
|
timings.netTicks, (timings.netTicks > 10 ? '!' : ','),
|
||||||
#endif
|
#endif
|
||||||
timings.frameTicks, (timings.frameTicks > 16 ? '!' : ' '));
|
timings.frameTicks, (timings.frameTicks > 16 ? '!' : ' '));
|
||||||
}
|
}
|
||||||
|
@ -2647,7 +2650,6 @@ int CModel3::StartDriveBoardThread(void *data)
|
||||||
return model3->RunDriveBoardThread();
|
return model3->RunDriveBoardThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int CModel3::RunMainBoardThread(void)
|
int CModel3::RunMainBoardThread(void)
|
||||||
{
|
{
|
||||||
for (;;)
|
for (;;)
|
||||||
|
@ -2945,8 +2947,6 @@ ThreadError:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CModel3::Reset(void)
|
void CModel3::Reset(void)
|
||||||
{
|
{
|
||||||
// Clear memory (but do not modify backup RAM!)
|
// 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)
|
#define MEMORY_POOL_SIZE (0x800000 + 0x800000 + 0x8000000 + 0x4000000 + 0x20000 + 0x20000 + 0x80000 + 0x1000000 + 0x20000 + 0x1000000 + 0x10000)
|
||||||
#endif
|
#endif
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
#define OFFSET_NETBUFFER 0xC000000 // not really 128kb (64kb buffer 0000-ffff + i/o 10000-101ff)
|
#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_NETRAM 0xC020000 // 128 KB (c0020000-c003ffff)
|
||||||
#define MEMORY_POOL_SIZE (0x800000 + 0x800000 + 0x8000000 + 0x4000000 + 0x20000 + 0x20000 + 0x80000 + 0x1000000 + 0x20000 + 0x1000000 + 0x10000 + 0x40000)
|
#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
|
//8MB 8MB 128MB 64MB 128KB 128KB 512KB 16MB 128KB 16MB 64KB 256KB
|
||||||
#endif
|
#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.pvr = PPC_MODEL_603E; // 100 MHz
|
||||||
ppc_config.bus_frequency = BUS_FREQUENCY_66MHZ;
|
ppc_config.bus_frequency = BUS_FREQUENCY_66MHZ;
|
||||||
ppc_config.bus_frequency_multiplier = 0x15; // 1.5X multiplier
|
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
|
PCIBridge.SetModel(0x106); // some Step 1.x games use MPC106
|
||||||
else
|
else
|
||||||
PCIBridge.SetModel(0x105); // MPC105
|
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.pvr = PPC_MODEL_603R; // 66 MHz
|
||||||
ppc_config.bus_frequency = BUS_FREQUENCY_66MHZ;
|
ppc_config.bus_frequency = BUS_FREQUENCY_66MHZ;
|
||||||
ppc_config.bus_frequency_multiplier = 0x10; // 1X multiplier
|
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
|
PCIBridge.SetModel(0x106); // some Step 1.x games use MPC106
|
||||||
else
|
else
|
||||||
PCIBridge.SetModel(0x105); // MPC105
|
PCIBridge.SetModel(0x105); // MPC105
|
||||||
|
@ -3135,7 +3139,17 @@ bool CModel3::LoadGame(const Game &game, const ROMSet &rom_set)
|
||||||
|
|
||||||
// Initialize Real3D
|
// Initialize Real3D
|
||||||
int stepping = ((game.stepping[0] - '0') << 4) | (game.stepping[2] - '0');
|
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)
|
// MPEG board (if present)
|
||||||
if (rom_set.get_rom("mpeg_program").size)
|
if (rom_set.get_rom("mpeg_program").size)
|
||||||
|
@ -3272,7 +3286,7 @@ bool CModel3::Init(void)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
if (OKAY != NetBoard.Init(netRAM, netBuffer))
|
if (OKAY != NetBoard.Init(netRAM, netBuffer))
|
||||||
return FAIL;
|
return FAIL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PCIBridge.AttachPCIBus(&PCIBus);
|
PCIBridge.AttachPCIBus(&PCIBus);
|
||||||
|
@ -3287,7 +3301,7 @@ bool CModel3::Init(void)
|
||||||
|
|
||||||
CSoundBoard *CModel3::GetSoundBoard(void)
|
CSoundBoard *CModel3::GetSoundBoard(void)
|
||||||
{
|
{
|
||||||
return &SoundBoard;
|
return &SoundBoard;
|
||||||
}
|
}
|
||||||
|
|
||||||
CDriveBoard *CModel3::GetDriveBoard(void)
|
CDriveBoard *CModel3::GetDriveBoard(void)
|
||||||
|
@ -3298,7 +3312,7 @@ CDriveBoard *CModel3::GetDriveBoard(void)
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
CNetBoard *CModel3::GetNetBoard(void)
|
CNetBoard *CModel3::GetNetBoard(void)
|
||||||
{
|
{
|
||||||
return &NetBoard;
|
return &NetBoard;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -3311,9 +3325,9 @@ CModel3::CModel3(const Util::Config::Node &config)
|
||||||
SoundBoard(config),
|
SoundBoard(config),
|
||||||
DriveBoard(config),
|
DriveBoard(config),
|
||||||
#ifdef NET_BOARD
|
#ifdef NET_BOARD
|
||||||
NetBoard(config),
|
NetBoard(config),
|
||||||
#endif
|
#endif
|
||||||
m_jtag(GPU)
|
m_jtag(GPU)
|
||||||
{
|
{
|
||||||
// Initialize pointers so dtor can know whether to free them
|
// Initialize pointers so dtor can know whether to free them
|
||||||
memoryPool = NULL;
|
memoryPool = NULL;
|
||||||
|
@ -3411,7 +3425,6 @@ CModel3::~CModel3(void)
|
||||||
DSB = NULL;
|
DSB = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Inputs = NULL;
|
Inputs = NULL;
|
||||||
Outputs = NULL;
|
Outputs = NULL;
|
||||||
ram = NULL;
|
ram = NULL;
|
||||||
|
|
|
@ -263,12 +263,12 @@ void CReal3D::BeginFrame(void)
|
||||||
// If multi-threaded, perform now any queued texture uploads to renderer before rendering begins
|
// If multi-threaded, perform now any queued texture uploads to renderer before rendering begins
|
||||||
if (m_gpuMultiThreaded)
|
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);
|
Render3D->UploadTextures(it.level, it.x, it.y, it.width, it.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
// done syncing data
|
// done syncing data
|
||||||
queuedUploadTexturesRO.clear();
|
queuedUploadTexturesRO.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Render3D->BeginFrame();
|
Render3D->BeginFrame();
|
||||||
|
@ -631,9 +631,9 @@ void CReal3D::WriteDMARegister32(unsigned reg, uint32_t data)
|
||||||
IRQ->Assert(dmaIRQ);
|
IRQ->Assert(dmaIRQ);
|
||||||
break;
|
break;
|
||||||
case 0x10: // command register
|
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());
|
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))
|
else if ((data&0x80000000))
|
||||||
|
@ -678,6 +678,7 @@ void CReal3D::Flush(void)
|
||||||
|
|
||||||
UploadTexture(header,(uint16_t *)&textureFIFO[i+2]);
|
UploadTexture(header,(uint16_t *)&textureFIFO[i+2]);
|
||||||
DebugLog("Real3D: Texture upload completed: %X bytes (%X)\n", size*4, textureFIFO[i+0]);
|
DebugLog("Real3D: Texture upload completed: %X bytes (%X)\n", size*4, textureFIFO[i+0]);
|
||||||
|
|
||||||
i += size;
|
i += size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -868,7 +869,8 @@ uint32_t CReal3D::GetASICIDCode(ASIC asic) const
|
||||||
return it == m_asicID.end() ? 0 : it->second;
|
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;
|
step = stepping;
|
||||||
if ((step!=0x10) && (step!=0x15) && (step!=0x20) && (step!=0x21))
|
if ((step!=0x10) && (step!=0x15) && (step!=0x20) && (step!=0x21))
|
||||||
|
@ -878,7 +880,9 @@ void CReal3D::SetStepping(int stepping)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set PCI ID
|
// 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
|
pciID = 0x16C311DB; // vendor 0x11DB = Sega
|
||||||
else
|
else
|
||||||
pciID = 0x178611DB;
|
pciID = 0x178611DB;
|
||||||
|
|
|
@ -362,7 +362,8 @@ public:
|
||||||
* stepping 0x10 for Step 1.0, 0x15 for Step 1.5, 0x20 for Step 2.0, or
|
* 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.
|
* 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):
|
* Init(vromPtr, BusObjectPtr, IRQObjectPtr, dmaIRQBit):
|
||||||
|
|
Loading…
Reference in a new issue