Restore previous NV2A behavoir

This commit is contained in:
Luke Usher 2017-06-23 22:17:14 +01:00
parent 98b02aadcf
commit bafe542ce3
3 changed files with 101 additions and 20 deletions

View File

@ -59,6 +59,7 @@
#include <gl\glew.h>
#include <gl\GL.h>
#include <gl\GLU.h>
#include <cassert>
//#include <gl\glut.h>
#define NV_PMC_ADDR 0x00000000
@ -1235,28 +1236,68 @@ const NV2ABlockInfo* EmuNV2A_Block(xbaddr addr)
return nullptr;
}
uint32_t EmuNV2A_Read32(xbaddr addr)
uint32_t EmuNV2A_Read(xbaddr addr, int size)
{
const NV2ABlockInfo* block = EmuNV2A_Block(addr);
if (block != nullptr) {
return block->read(addr - block->offset);
switch (size) {
case 8:
return block->read(addr - block->offset) & 0xFF;
case 16:
return block->read(addr - block->offset) & 0xFFFF;
case 32:
return block->read(addr - block->offset);
default:
EmuWarning("EmuNV2A_Read: Invalid read size: %d", size);
return 0;
}
}
EmuWarning("EmuNV2A_Read32: Unhandled Read Address %08X", addr);
EmuWarning("EmuNV2A_Read%d: Unhandled Read Address %08X", size, addr);
return 0;
}
void EmuNV2A_Write32(xbaddr addr, uint32_t value)
void EmuNV2A_Write(xbaddr addr, uint32_t value, int size)
{
const NV2ABlockInfo* block = EmuNV2A_Block(addr);
if (block != nullptr) {
block->write(addr - block->offset, value);
return;
int shift = 0;
xbaddr aligned_addr = 0;
uint32_t aligned_value = 0;
uint32_t mask = 0;
switch (size) {
case 8:
shift = (addr & 3) * 8;
aligned_addr = addr & ~3;
aligned_value = block->read(aligned_addr - block->offset);
mask = 0xFF << shift;
// TODO : Must the second byte be written to the next DWORD?
block->write(aligned_addr - block->offset, (aligned_value & ~mask) | (value << shift));
return;
case 16:
assert((addr & 1) == 0);
shift = (addr & 2) * 16;
aligned_addr = addr & ~3;
aligned_value = block->read(addr - block->offset);
mask = 0xFFFF << shift;
// TODO : Must the second byte be written to the next DWORD?
block->write(aligned_addr - block->offset, (aligned_value & ~mask) | (value << shift));
return;
case 32:
block->write(addr - block->offset, value);
return;
default:
EmuWarning("EmuNV2A_Read: Invalid read size: %d", size);
return;
}
}
EmuWarning("EmuNV2A_Write32: Unhandled Write Address %08X (value %08X)", addr, value);
EmuWarning("EmuNV2A_Write%d: Unhandled Write Address %08X (value %08X)", size, addr, value);
return;
}

View File

@ -40,8 +40,8 @@
#define NV2A_ADDR 0xFD000000
#define NV2A_SIZE 0x01000000
uint32_t EmuNV2A_Read32(xbaddr addr);
void EmuNV2A_Write32(xbaddr addr, uint32_t value);
uint32_t EmuNV2A_Read(xbaddr addr, int size);
void EmuNV2A_Write(xbaddr addr, uint32_t value, int size);
void InitOpenGLContext();

View File

@ -146,7 +146,7 @@ uint32_t EmuX86_Read32Aligned(xbaddr addr)
}
// Access NV2A regardless weither HLE is disabled or not
value = EmuNV2A_Read32(addr - NV2A_ADDR);
value = EmuNV2A_Read(addr - NV2A_ADDR, 32);
// Note : EmuNV2A_Read32 does it's own logging
} if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
value = EmuNVNet_Read(addr - NVNET_ADDR, 32);
@ -181,16 +181,23 @@ uint32_t EmuX86_Read32(xbaddr addr)
uint16_t EmuX86_Read16(xbaddr addr)
{
uint16_t value;
if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
if (addr >= NV2A_ADDR && addr < NV2A_ADDR + NV2A_SIZE) {
if (!bLLE_GPU) {
EmuWarning("EmuX86_Read32Aligned(0x%08X) Unexpected NV2A access, missing a HLE patch. " \
"Please notify https://github.com/Cxbx-Reloaded/Cxbx-Reloaded which title raised this!", addr);
}
// Access NV2A regardless weither HLE is disabled or not
value = EmuNV2A_Read(addr - NV2A_ADDR, 16);
// Note : EmuNV2A_Read32 does it's own logging
} else if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
value = EmuNVNet_Read(addr - NVNET_ADDR, 16);
}
else {
} else {
if (g_bEmuException) {
EmuWarning("EmuX86_Read16(0x%08X) [Unknown address]", addr);
value = 0;
}
else {
} else {
// Outside EmuException, pass the memory-access through to normal memory :
value = EmuX86_Mem_Read16(addr);
}
@ -204,10 +211,18 @@ uint8_t EmuX86_Read8(xbaddr addr)
{
uint8_t value;
if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
if (addr >= NV2A_ADDR && addr < NV2A_ADDR + NV2A_SIZE) {
if (!bLLE_GPU) {
EmuWarning("EmuX86_Read32Aligned(0x%08X) Unexpected NV2A access, missing a HLE patch. " \
"Please notify https://github.com/Cxbx-Reloaded/Cxbx-Reloaded which title raised this!", addr);
}
// Access NV2A regardless weither HLE is disabled or not
value = EmuNV2A_Read(addr - NV2A_ADDR, 8);
// Note : EmuNV2A_Read32 does it's own logging
} else if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
value = EmuNVNet_Read(addr - NVNET_ADDR, 8);
}
else {
} else {
if (g_bEmuException) {
EmuWarning("EmuX86_Read8(0x%08X) [Unknown address]", addr);
value = 0;
@ -233,7 +248,7 @@ void EmuX86_Write32Aligned(xbaddr addr, uint32_t value)
}
// Access NV2A regardless weither HLE is disabled or not
EmuNV2A_Write32(addr - NV2A_ADDR, value);
EmuNV2A_Write(addr - NV2A_ADDR, value, 32);
// Note : EmuNV2A_Write32 does it's own logging
return;
}
@ -264,6 +279,18 @@ void EmuX86_Write32(xbaddr addr, uint32_t value)
void EmuX86_Write16(xbaddr addr, uint16_t value)
{
if (addr >= NV2A_ADDR && addr < NV2A_ADDR + NV2A_SIZE) {
if (!bLLE_GPU) {
EmuWarning("EmuX86_Write32Aligned(0x%08X, 0x%08X) Unexpected NV2A access, missing a HLE patch. " \
"Please notify https://github.com/Cxbx-Reloaded/Cxbx-Reloaded which title raised this!", addr);
}
// Access NV2A regardless weither HLE is disabled or not
EmuNV2A_Write(addr - NV2A_ADDR, value, 16);
// Note : EmuNV2A_Write32 does it's own logging
return;
}
if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
EmuNVNet_Write(addr - NVNET_ADDR, value, 16);
return;
@ -281,6 +308,19 @@ void EmuX86_Write16(xbaddr addr, uint16_t value)
void EmuX86_Write8(xbaddr addr, uint8_t value)
{
if (addr >= NV2A_ADDR && addr < NV2A_ADDR + NV2A_SIZE) {
if (!bLLE_GPU) {
EmuWarning("EmuX86_Write32Aligned(0x%08X, 0x%08X) Unexpected NV2A access, missing a HLE patch. " \
"Please notify https://github.com/Cxbx-Reloaded/Cxbx-Reloaded which title raised this!", addr);
}
// Access NV2A regardless weither HLE is disabled or not
EmuNV2A_Write(addr - NV2A_ADDR, value, 8);
// Note : EmuNV2A_Write32 does it's own logging
return;
}
if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
EmuNVNet_Write(addr - NVNET_ADDR, value, 8);
return;