From f550678e07ce132bd3e05aac031577a69b4e63c7 Mon Sep 17 00:00:00 2001 From: "SND\\shalma_cp" Date: Sat, 30 Oct 2010 14:56:17 +0000 Subject: Tekken: cdrom.c - CD-XA volume controls - Fixes fadeout at end of match git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@58928 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/cdrom.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++------ libpcsxcore/cdrom.h | 2 ++ 2 files changed, 59 insertions(+), 7 deletions(-) (limited to 'libpcsxcore') diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index b0e3750a..de0acd62 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -1272,11 +1272,19 @@ void cdrWrite0(unsigned char rt) { #endif cdr.Ctrl = rt | (cdr.Ctrl & ~0x3); - if (rt == 0) { - cdr.ParamP = 0; - cdr.ParamC = 0; - cdr.ResultReady = 0; - } + if (rt == 0) { + cdr.ParamP = 0; + cdr.ParamC = 0; + cdr.ResultReady = 0; + } + + // Tekken: CDXA fade-out + else if( rt == 2 ) { + cdr.LeftVol = 0; + } + else if( rt == 3 ) { + cdr.RightVol = 0; + } } unsigned char cdrRead1(void) { @@ -1301,8 +1309,16 @@ void cdrWrite1(unsigned char rt) { #ifdef CDR_LOG CDR_LOG("cdrWrite1() Log: CD1 write: %x (%s)\n", rt, CmdName[rt]); #endif -// psxHu8(0x1801) = rt; - cdr.Cmd = rt; + + + // Tekken: CDXA fade-out + if( (cdr.Ctrl & 3) == 3 ) { + cdr.RightVol |= (rt << 8); + } + + + // psxHu8(0x1801) = rt; + cdr.Cmd = rt; cdr.OCUP = 0; #ifdef CDRCMD_DEBUG @@ -1637,6 +1653,18 @@ void cdrWrite2(unsigned char rt) { #ifdef CDR_LOG CDR_LOG("cdrWrite2() Log: CD2 write: %x\n", rt); #endif + + + // Tekken: CDXA fade-out + if( (cdr.Ctrl & 3) == 2 ) { + cdr.LeftVol |= (rt << 8); + } + else if( (cdr.Ctrl & 3) == 3 ) { + cdr.RightVol |= (rt << 0); + } + + + if (cdr.Ctrl & 0x1) { switch (rt) { case 0x07: @@ -1676,6 +1704,28 @@ void cdrWrite3(unsigned char rt) { CDR_LOG("cdrWrite3() Log: CD3 write: %x\n", rt); #endif + // Tekken: CDXA fade-out + if( (cdr.Ctrl & 3) == 2 ) { + cdr.LeftVol |= (rt << 0); + } + else if( (cdr.Ctrl & 3) == 3 && rt == 0x20 ) { +#ifdef CDR_LOG + CDR_LOG( "CD-XA Volume: %X %X\n", cdr.LeftVol, cdr.RightVol ); +#endif + + if( !cdr.Muted ) { + /* + Eternal SPU: scale volume from [0-ffff] -> [0,8000] + - Destruction Derby Raw movies (ff00) + */ + + // write CD-XA volumes + SPU_writeRegister( H_CDLeft, cdr.LeftVol / 2 ); + SPU_writeRegister( H_CDRight, cdr.RightVol / 2 ); + } + } + + // GameShark CDX CD Player: Irq timing mania if( rt == 0 && cdr.Irq != 0 && cdr.Irq != 0xff && diff --git a/libpcsxcore/cdrom.h b/libpcsxcore/cdrom.h index 697b9e97..82afa42c 100644 --- a/libpcsxcore/cdrom.h +++ b/libpcsxcore/cdrom.h @@ -92,6 +92,8 @@ typedef struct { u8 LidCheck; u8 FastForward; u8 FastBackward; + + u32 LeftVol, RightVol; } cdrStruct; extern cdrStruct cdr; -- cgit v1.2.3