diff options
| author | SND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-09-27 13:45:20 +0000 |
|---|---|---|
| committer | SND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-09-27 13:45:20 +0000 |
| commit | 4917b2a1a132df036c65fb81b6d3ed0a1cebf599 (patch) | |
| tree | 0a744eeaedadaf5d33f68190ec0d3585cdd65c91 /libpcsxcore | |
| parent | f2761d7523b26d19f82f7b384b3b41efd0f60c67 (diff) | |
| download | pcsxr-4917b2a1a132df036c65fb81b6d3ed0a1cebf599.tar.gz | |
Vampire Hunter D title screen hack revisited. Fixes Tomb Raider II opaque water effect.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@87330 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
| -rwxr-xr-x | libpcsxcore/gpu.c | 9 | ||||
| -rwxr-xr-x | libpcsxcore/psxhw.c | 36 |
2 files changed, 30 insertions, 15 deletions
diff --git a/libpcsxcore/gpu.c b/libpcsxcore/gpu.c index 1c24ada3..60886aa7 100755 --- a/libpcsxcore/gpu.c +++ b/libpcsxcore/gpu.c @@ -22,9 +22,10 @@ #define GPUSTATUS_ODDLINES 0x80000000 #define GPUSTATUS_DMABITS 0x60000000 // Two bits -#define GPUSTATUS_READYFORCOMMANDS 0x10000000 +#define GPUSTATUS_READYFORCOMMANDS 0x10000000 // DMA block ready #define GPUSTATUS_READYFORVRAM 0x08000000 -#define GPUSTATUS_IDLE 0x04000000 +#define GPUSTATUS_IDLE 0x04000000 // CMD ready +#define GPUSTATUS_MODE 0x02000000 // Data request mode #define GPUSTATUS_DISPLAYDISABLED 0x00800000 #define GPUSTATUS_INTERLACED 0x00400000 @@ -128,7 +129,7 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU return; case 0x01000201: // mem2vram - bs=(bcr & 0xffff); + bs=(bcr & 0xffff); size = (bcr >> 16) * bs; // BA blocks * BS words (word = 32-bits) #ifdef PSXDMA_LOG PSXDMA_LOG("*** DMA 2 - GPU mem2vram *** %lx addr = %lxh, BCR %lxh => size %d = BA(%d) * BS(%xh)\n", @@ -152,7 +153,7 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU #endif return; - case 0x0401: // Vampire Hunter D: title screen linked list update + case 0x00000401: // Vampire Hunter D: title screen linked list update (see psxhw.c) case 0x01000401: // dma chain #ifdef PSXDMA_LOG PSXDMA_LOG("*** DMA 2 - GPU dma chain *** %8.8lx addr = %lx size = %lx\n", chcr, madr, bcr); diff --git a/libpcsxcore/psxhw.c b/libpcsxcore/psxhw.c index 0fdfd1d0..b753c2f3 100755 --- a/libpcsxcore/psxhw.c +++ b/libpcsxcore/psxhw.c @@ -26,6 +26,9 @@ #include "cdrom.h" #include "gpu.h" +// Vampire Hunter D hack +boolean dmaGpuListHackEn=FALSE; + void psxHwReset() { if (Config.SioIrq) psxHu32ref(0x1070) |= SWAP32(0x80); if (Config.SpuIrq) psxHu32ref(0x1070) |= SWAP32(0x200); @@ -201,14 +204,14 @@ u16 psxHwRead16(u32 add) { default: if (add >= 0x1f801c00 && add < 0x1f801e00) { - hard = SPU_readRegister(add); + hard = SPU_readRegister(add); } else { hard = psxHu16(add); #ifdef PSXHW_LOG PSXHW_LOG("*Unkwnown 16bit read at address %x\n", add); #endif } - return hard; + return hard; } #ifdef PSXHW_LOG @@ -412,7 +415,7 @@ void psxHwWrite16(u32 add, u16 value) { #endif return; case 0x1f801048: - sioWriteMode16(value); + sioWriteMode16(value); #ifdef PAD_LOG PAD_LOG ("sio write16 %x, %x\n", add&0xf, value); #endif @@ -424,7 +427,7 @@ void psxHwWrite16(u32 add, u16 value) { #endif return; case 0x1f80104e: // baudrate register - sioWriteBaud16(value); + sioWriteBaud16(value); #ifdef PAD_LOG PAD_LOG ("sio write16 %x, %x\n", add&0xf, value); #endif @@ -527,7 +530,7 @@ void psxHwWrite16(u32 add, u16 value) { default: if (add>=0x1f801c00 && add<0x1f801e00) { - SPU_writeRegister(add, value); + SPU_writeRegister(add, value); return; } @@ -546,16 +549,14 @@ void psxHwWrite16(u32 add, u16 value) { #define DmaExec(n) { \ HW_DMA##n##_CHCR = SWAPu32(value); \ \ - if ((SWAPu32(HW_DMA##n##_CHCR) & 0x01000000 || \ - (n == 2 && SWAPu32(HW_DMA##n##_CHCR) == 0x0401 && SWAPu32(HW_DMA##n##_BCR) == 0x0)) /* Vampire Hunter D */ && \ - SWAPu32(HW_DMA_PCR) & (8 << (n * 4))) { \ + if (SWAPu32(HW_DMA##n##_CHCR) & 0x01000000 && SWAPu32(HW_DMA_PCR) & (8 << (n * 4))) { \ psxDma##n(SWAPu32(HW_DMA##n##_MADR), SWAPu32(HW_DMA##n##_BCR), SWAPu32(HW_DMA##n##_CHCR)); \ } \ } void psxHwWrite32(u32 add, u32 value) { switch (add) { - case 0x1f801040: + case 0x1f801040: sioWrite8((unsigned char)value); sioWrite8((unsigned char)((value&0xff) >> 8)); sioWrite8((unsigned char)((value&0xff) >> 16)); @@ -636,7 +637,19 @@ void psxHwWrite32(u32 add, u32 value) { #ifdef PSXHW_LOG PSXHW_LOG("DMA2 CHCR 32bit write %x\n", value); #endif + /* A hack that makes Vampire Hunter D title screen visible, + /* but makes Tomb Raider II water effect to stay opaque + /* Root cause for this problem is that when DMA2 is issued + /* it is incompletele and still beign built by the game. + /* Maybe it is ready when some signal comes in or within given delay? + */ + if (dmaGpuListHackEn && value == 0x00000401 && HW_DMA2_BCR == 0x0) { + psxDma2(SWAPu32(HW_DMA2_MADR), SWAPu32(HW_DMA2_BCR), SWAPu32(value)); + return; + } DmaExec(2); // DMA2 chcr (GPU DMA) + if (HW_DMA2_CHCR == 0x1000401) + dmaGpuListHackEn=TRUE; return; #ifdef PSXHW_LOG @@ -717,6 +730,8 @@ void psxHwWrite32(u32 add, u32 value) { #ifdef PSXHW_LOG PSXHW_LOG("GPU STATUS 32bit write %x\n", value); #endif + if (value & 0x8000000) + dmaGpuListHackEn=FALSE; GPU_writeStatus(value); return; case 0x1f801820: @@ -775,8 +790,7 @@ void psxHwWrite32(u32 add, u32 value) { default: // Dukes of Hazard 2 - car engine noise if (add>=0x1f801c00 && add<0x1f801e00) { - SPU_writeRegister(add, value&0xffff); - + SPU_writeRegister(add, value&0xffff); add += 2; value >>= 16; |
