Next Generation Emulation banner
101 - 120 of 676 Posts
Thanks for pointing that out ;)

I need to re-read that doc since I understand the PSX better now.

Still in testing phase:

Code:
gpu.c


#include "psxhw.h"
#include "gpu.h"
#include "psxdma.h"


#define GPUSTATUS_ODDLINES            0x80000000
#define GPUSTATUS_DMABITS             0x60000000 // Two bits
#define GPUSTATUS_READYFORCOMMANDS    0x10000000
#define GPUSTATUS_READYFORVRAM        0x08000000
#define GPUSTATUS_IDLE                0x04000000
#define GPUSTATUS_DISPLAYDISABLED     0x00800000
#define GPUSTATUS_INTERLACED          0x00400000
#define GPUSTATUS_RGB24               0x00200000
#define GPUSTATUS_PAL                 0x00100000
#define GPUSTATUS_DOUBLEHEIGHT        0x00080000
#define GPUSTATUS_WIDTHBITS           0x00070000 // Three bits
#define GPUSTATUS_MASKENABLED         0x00001000
#define GPUSTATUS_MASKDRAWN           0x00000800
#define GPUSTATUS_DRAWINGALLOWED      0x00000400
#define GPUSTATUS_DITHER              0x00000200


int gpuReadStatus()
{
	int hard;


	// GPU plugin
	hard = GPU_readStatus();


	// NOTE:
	// Backup option when plugins fail to simulate 'busy gpu'

	// TODO:
	// Check this with
	// - Hot wheels turbo racing
	// - Dukes of Hazzard
	// - (Chrono Cross)
#if 1
	if( HW_DMA2_CHCR & 0x01000000 )
	{
		hard &= ~GPUSTATUS_IDLE;
		hard &= ~GPUSTATUS_READYFORCOMMANDS;
	}
#endif


	return hard;
}


void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU
(move this here from psxdma.c)


void gpuInterrupt() {
	HW_DMA2_CHCR &= SWAP32(~0x01000000);
	DMA_INTERRUPT(2);
}
Code:
gpu.h

int gpuReadStatus();
Code:
psxdma.c

remove gpuInterrupt
remove psxDma2
Code:
psxhw.c

#include "gpu.h"


case 0x1f801814:
  hard = gpuReadStatus();
#ifdef PSXHW_LOG
  PSXHW_LOG("GPU STATUS 32bit read %lx\n", hard);
#endif
  return hard;
I'm kinda tired of toggling the gpu busy so this is a hacky workaround for plugins that don't support it.

If edgbla adds odd/even support in the counters, then we can go install a Chrono Cross interlace fix (ala ePSXe 160/170).



IDEA TO TEST:
If the DMA6 OTC uses the GPU DMA channel, are we allowed to use DMA2 simultaneously? Would this flag the GPU as 'busy'?

I'll need to find games to test this out.



AUTOMERGED:
Code:
void mdec1Interrupt() {
if (HW_DMA1_CHCR & SWAP32(0x01000000)) {
    // 1-time DMA transfer
    HW_DMA1_CHCR &= SWAP32(~0x01000000);

    //MDECOUTDMA_INT(PSXCLK / 1000 * BIAS);
    DMA_INTERRUPT(1);
}

// MDEC is already done (!!) - turn off busy flag
mdec.reg1 &= ~MDEC1_BUSY;
I removed that line from my build but wasn't sure. Forgot to test FF9 movies.
I'll test that game out and get back on this.


The part that bugs me is:
I doubt the MDEC is generating data at every cycle. Maybe it can but that seems awfully fast (S-DD1 is specialized hardware). SPC7110 had a delay I think.

But the ePSXe people get away with it so I don't know either.

Unfortunately Shadow Madness breaks if we turn off the MDEC1_BUSY flag too late. Hmm...

At least I've got another dev to look this over with. ;)


UPDATE #2:
Yup - setting 'BUSY off' too early (Shadow Madness fix) breaks FF9 opening movie.

Time to look at MDEC timings again.
 
New MDEC1 timing fixes

Thanks Whistler for correctly challenging my solution in this area. ;)

Code:
mdec.c

void psxDma1(u32 adr, u32 bcr, u32 chcr) {
..

// remove old calls to MDECOUTDMA_INT

/*
Absolute minimum DMA time:
		
# bytes written to memory *
  average cycles to create byte	/
  32-bit DMA per cycle


Note that FF9 Dali accepts 1-75~150
before slowdown occurs. No crash.
*/

dmacnt = (image - (u16 *)PSXM(adr)) * 1;

MDECOUTDMA_INT( (dmacnt / 4) / BIAS);

mdec.reg1 |= MDEC1_BUSY;
}


void mdec1Interrupt() {
  if (HW_DMA1_CHCR & SWAP32(0x01000000))
  {
    /*
    FF9 Dali FMV

    --Very-- picky on when the DMA_ACK(1) is received
    Shorter transfer times are better


    In reality, FF9 doesn't care about the BUSY flag
    as long as it stays -ON-. Which breaks Shadow Madness

	
    The MDEC_BUSY flag is the correct state:
    Shadow Madness videos immediately break when using
    the flipped values
    */

    HW_DMA1_CHCR &= SWAP32(~0x01000000);
    DMA_INTERRUPT(1);


    /*
    FF9 Dali Hackfix
				
    < 600 (BIAS = 1)

    Still have no idea about the timing
    */

    MDECOUTDMA_INT( (PSXCLK / 500) / BIAS);
  } else {
    //HW_DMA1_CHCR &= SWAP32(~0x01000000);

    /*
    Shadow Madness requires MDEC BUSY off
    - world map, hexite mines
    */

    mdec.reg1 &= ~MDEC1_BUSY;
  }
}
So FF9 movies work (including Dali). And Shadow Madness plays fully.
 
Time to fix Vib Ribbon CD swapping

(painful to get the -exact- event sequence correct)

Code:
cdrom.c

void cdrInterrupt() {
..
..
    	case CdlGetlocP:
        /*
        TODO:
        Only wipe subq data for DATA TRACK 01
        Not AUDIO CD or AUDIO TRACK

 	if (subq != NULL) {
        */
..
..
..
    	case CdlGetTN:
        // Unbreaks: Vib Ribbon CD swapping
	StopReading();

	cdr.CmdProcess = 0;
	SetResultSize(3);
..
..
..
	// check case open/close
	i = stat.Status;
	if (CDR_getStatus(&stat) != -1) {
		if (stat.Type == 0xff) cdr.Stat = DiskError;

		// case now open
		if (stat.Status & 0x10) {
			cdr.Stat = DiskError;

			cdr.Result[0] |= 0x11;
			cdr.Result[0] &= ~0x02;

                        /*
                        Vib Ribbon tells us that we should not stop the reading
                        else we break the CD detection loop

                        Must stop reading @ CdlGetTN for game to work
                        */
		}
		// case now closed
		else if (i & 0x10) {
			// Breaks: Vib Ribbon (fails to use CD swap detection)
			//cdr.StatP |= 0x2;

			cdr.StatP &= ~0x11;
			cdr.Result[0] |= 0x2;

			CheckCdrom();
		}
	}

	
	if (cdr.Stat != NoIntr && cdr.Reg2 != 0x18) {
		psxHu32ref(0x1070) |= SWAP32((u32)0x4);
		psxRegs.interrupt |= 0x80000000;
	}
Had to move the CD open/close check to the end of the interrupt - you can now trick games into giving read errors and recovering. Which helps with Vib a lot.

Audio CDs don't work (I think). The BIOS is a good place to test for that.

Not wiping the time data will fix 50% of in-game mode (ribbon line). The other half is undetermined.


(must use PEOPS DSound with IRQ Decoded Buffer hack)
Vib Ribbon CD Test:
Mount real CD
Boot game

At title screen, case open
Insert CD bin (no cue/ccd sheet)
Case close
Start normal game

At 'insert vib ribbon cd', case open
Re-insert real CD
close case
Goes in-game


UPDATE:
The PEOPS CDR detected a MUSIC CD through Vib Ribbon (SaPu 1.3 didn't work). Game only let me select track 1 though (CD had 2 tracks). But that's okay for me.

SPU plugin (PEOPS) doesn't seem to buffer the CDDA play (Eternal fails this game). And the game DMA transfers the CDDA sectors from the SPU to CPU. Probably causing my ribbon line to stay flat all the time.

Note that the Gameshark CDs use a CDDA play on a DATA sector (it still shows up in the SPU buffer and the CD does some hacky stuff on the data). No CDDA plays though - invalid area.
 
Note to self:
Shadow Madness needs some time before seeing MDEC_BUSY go down. Faking BUSY for one MDEC1_READ is not enough. Better to use current FF9 Dali fix.

Faking GPU Busy probably won't work either then for 1 read.
Use plugin faking - Chrono Cross, etc.


@DarkViperus:
It's up to
- Whistler (PCSX-Reloaded)
- madmab (PCSXBox v21)

whether / how they want to accept any of these patches.


Admittedly I don't like handing out my builds - random crashes, unsupported features, broken stuff, not up-to-date with PCSX-Reloaded project at all.

Personally offer -no- support for this:
1. Must use PEOPS / SaPU DVD5 plugins. A must. A must.
- DVD5 disc combining kits will work with this emu
- Don't use 'Run ISO'

2. Shark_Cheater is a half-way replacement for PEC.
- Study the inf if you want to add cheats

3. This build is much slower than the official
- Uses my tweaks and findings

4. If you test this and find a game that works here but not in the official, then go bug the PCSX-r devs. :p
- Likewise bug me about the opposite :cheesy:
- And restart game, turn off cheats before reporting a serious error

5. Expect random crashes
- Don't know why :sad:
- Won't accept reports about this

6. Check this post for updates / edits to the test emu
- Probably not often anymore

7. Disk swapping
- use F9 to open case
- change CD
- use F10 to close case

8. Download pcsxr-test.7z from Sendspace.com - send big files the easy way


Code:
08-10-2010
Added Whistler's Chrono Cross interlace fix  ;)
 
Code:
		case 0x1f801814:
			hard = GPU_readStatus();
			if (hard & 0x400000) {
				switch (Config.PsxType) {
					case PSX_TYPE_NTSC:
						if (hSyncCount > 262 - 240) hard ^= 0x80000000;
						break;

					case PSX_TYPE_PAL:
						if (hSyncCount > 312 - 256) hard ^= 0x80000000;
						break;
				}
			}
seems to be what epsxe 1.7 does... and chrono cross works without hacks in gpu plugin.
changes to rootcounter is not needed except removing one "static" keyword.
 
Vib Ribbon track works


Very important note:
TrackRelativeAddress +2 == AbsoluteRelativeAddress
only works for Track 01

ex. Vib Ribbon subQ
$01 = ADR
$02 = Track #
$01 = Index #
$00,$15,$45 = relative track address
$00 = filler
$01,$57,$45 = absolute track address



cdrom.c

Code:
case CdlGetlocP:
  SetResultSize(8);
  subq = (struct SubQ *)CDR_getBufferSub();

  // DATA + AUDIO has subchannel data
  if (subq != NULL) {
    cdr.Result[0] = subq->TrackNumber;
    cdr.Result[1] = subq->IndexNumber;
    memcpy(cdr.Result+2, subq->TrackRelativeAddress, 3);
    memcpy(cdr.Result+5, subq->AbsoluteAddress, 3);

    // subQ integrity check
    if( SWAP16(subq->CRC) != calcCrc((unsigned char *)subq + 12, 10) )
    {
      // wipe out time data
      memset( cdr.Result+2, 0, 3+3 );
    }
  } else {
    // Only works for TRACK 01
    Convert_LocalTime( cdr.Prev );

    cdr.Result[0] = 1;
    cdr.Result[1] = 1;
    memcpy( cdr.Result+2, cdr_localTime, 3 );
    memcpy( cdr.Result+5, cdr.Prev, 3 );
  }
        	
  cdr.Stat = Acknowledge;
  break;


cdrom.h

Code:
cdrStruct cdr;
--> move to cdrom.c


cdriso.c

Code:
#define btoi(b)	   ((b) / 16 * 10 + (b) % 16) /* BCD to u_char */
#define itob(i)    ((i)/10*16 + (i)%10)    /* u_char to BCD */

..
..

#include "cdrom.h"
extern cdrStruct cdr;

void playthread(void *param)


#ifdef _WIN32
  //Sleep(d);
  while( t - (long)GetTickCount() > 0 )
    Sleep(1);
#else
  usleep(d * 1000);
#endif

..
..

  t = GetTickCount() + CDDA_FRAMETIME;

  /*
  Hack:
  Must update CDR read cursor (local or absolute time?)

  Must convert to BCD format
  */
  sec = cddaCurOffset / CD_FRAMESIZE_RAW;
  sec2msf(sec, (char *)cdr.Prev);

  cdr.Prev[0] = itob( cdr.Prev[0] );
  cdr.Prev[1] = itob( cdr.Prev[1] );
  cdr.Prev[2] = itob( cdr.Prev[2] );

		
  if (subChanInterleaved) {

..
..

    // skip the subchannel data
    //fseek(cddaHandle, SUB_FRAMESIZE, SEEK_CUR);

    // Vib Ribbon: needs subQ for playback times
    fread( subbuffer, 1, SUB_FRAMESIZE, cddaHandle );
    }
  }
 else {
    s = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle);
	
    // Vib Ribbon: needs subQ for playback times
    if (subHandle != NULL) {
      fseek(subHandle, sec * SUB_FRAMESIZE, SEEK_SET);
      fread(subbuffer, 1, SUB_FRAMESIZE, subHandle);
    }
  }

..
..

long CALLBACK ISOplay(unsigned char *time) {

/*
Hack:
Must update CDR read pointer (local or absolute time?)
*/
cdr.Prev[0] = itob(time[0]);
cdr.Prev[1] = itob(time[1]);
cdr.Prev[2] = itob(time[2]);


if (SPU_playCDDAchannel != NULL) {


PEOPS DSound

xa.c

Code:
INLINE void MixCDDA(void)
{
 int ns;
 unsigned long l;

 for(ns=0;ns<NSSIZE && CDDAPlay!=CDDAFeed && (CDDAPlay!=CDDAEnd-1||CDDAFeed!=CDDAStart);ns++)
  {
   l=*CDDAPlay++;
   if(CDDAPlay==CDDAEnd) CDDAPlay=CDDAStart;
   SSumL[ns]+=(((short)(l&0xffff))       * iLeftXAVol)/32767;
   SSumR[ns]+=(((short)((l>>16)&0xffff)) * iRightXAVol)/32767;
  }
}

spu.c

Code:
static VOID CALLBACK MAINProc(UINT nTimerId,UINT msg,DWORD dwUser,DWORD dwParam1, DWORD dwParam2)

..
..

  // mix XA infos (if any)
  if(XAPlay!=XAFeed || XARepeat) MixXA();
  if(1) MixCDDA();

..
..

unsigned int cdda_ptr;

INLINE void FeedCDDA(unsigned char *pcm, int nBytes)

..
..

  *CDDAFeed++=(*pcm | (*(pcm+1)<<8) | (*(pcm+2)<<16) | (*(pcm+3)<<24));
  nBytes-=4;
  pcm+=4;


  /*
  Vib Ribbon
  $00000-$003ff  CD audio left
  $00400-$007ff  CD audio right
  */

  spuMem[ cdda_ptr ] = *pcm | (*(pcm+1)<<8);
  spuMem[ cdda_ptr+0x400 ] = *(pcm+2) | (*(pcm+3)<<8);

  cdda_ptr++;
  if( cdda_ptr >= 0x400 )
  {
    cdda_ptr &= 0x3ff;
  }

For this game, it's much easier to rely on the 'Run ISO' plugin. Fantastic stuff you did on it! :cool:

Don't know why but I couldn't get any CDDA to play through the speaker. (maybe I hacked the DSound plugin correctly)

Set the FPS to 50 though and I can see the track (bronze 1) exactly the same as ePSXe 1.7.0. The ribbon moves slower though than ePSXe (need confirmation), which is critical for a game like this one.

Regardless, it works now. Just not fully correct. :lol: :)


CDRISO notes:
You might want to do parsemds, parseccd first then parsecue.

Some CUE sheets have PREGAP, INDEX 00 + INDEX 01 (two-digits, two indexes).

I'd love it if you did subchannel faking like pSX and ePSXe. ;)


So my collection of problem games is likely finished. No plans to perfect them. Except for Legaia maybe - pSX had movie problems related to GPU DMA timings.

My limited role of troubleshooting basic core issues for PCSX-Reloaded is practically over. Thanks for the support. :smile: http://forums.ngemu.com/images/icons/icon14.gif

If I find more problem games though, you'll see me complain about them here. :D
 
GameShark Lite, GameShark Sampler doesn't work on any emulator i've tried, GameShark Lite stops on this screen

Image


oddly going over the code in a hexeditor it contains html code, maybe they made gameshark lite like website running on the ps1.

F1 2001 runs extremely slowly the ai / control is broken and it can't render the ****pit graphics properly with any plugin, this compatibilty bug with the ps3 also happens in psxfin v1.3
YouTube - Trying to play F12001 (PS1) on PS3... epsxe can play it fine but it still has ****pit rendering bug.

Sorry i'm no dev just reporting a emu problems i've had.
 
Thanks for being precisely clear on what the problems are. :)

Formula 1 200x - don't have the game. Suggestion to toggle the GPU 'fake busy flag' option.

GameShark Lite - had someone test this out for me.

Code:
int gpuReadStatus()
{
	int hard;


	// GPU plugin
	hard = GPU_readStatus();


	// ePSXe 1.7.0 - Chrono Cross interlace hack
	if (hard & 0x400000) {
		switch (Config.PsxType) {
			case PSX_TYPE_NTSC:
				if (hSyncCount > 262 - 240) hard ^= 0x80000000;
				break;

			case PSX_TYPE_PAL:
				if (hSyncCount > 312 - 256) hard ^= 0x80000000;
				break;
		}
	}


	// NOTE:
	// Backup option when plugins fail to simulate 'busy gpu'

	// TODO:
	// Check this with
	// - Hot wheels turbo racing
	// - Dukes of Hazzard

#if 1
	if( HW_DMA2_CHCR & 0x01000000 )
	{
		hard &= ~GPUSTATUS_IDLE;
		hard &= ~GPUSTATUS_READYFORCOMMANDS;
	}
#endif

	// Gameshark Lite - wants to see VRAM busy
        // - Must enable GPU 'Fake Busy States' hack
	if( (hard & GPUSTATUS_IDLE) == 0 )
		hard &= ~GPUSTATUS_READYFORVRAM;

	return hard;
}
I'm assuming the VRAM read / write is not available when DMA to/from GPU is in progress. This gets past the loading screen though.

Also told that the CD swapping still fails - uses a BIOS routine to check 'case open'. Hmm.

Need to use a real BIOS for testing.
 
WARNING:
Run ISO - cue sheets. Cannot handle PREGAP commands.
Causes major problems with CDDA games.


This will fix GameShark Lite CD swapping. Which broke Vib Ribbon. So that got repaired too.

cdrom.c
Code:
void cdrInterrupt() {
..
..
    	case CdlNop:
	SetResultSize(1);

        // GameShark Lite
	cdr.StatP |= 0x2;

     	cdr.Result[0] = cdr.StatP;
     	cdr.Stat = Acknowledge;
	break;
..
..
    	case CdlGetTN:
			// Unbreaks: Vib Ribbon CD check
			StopReading();
			StopCdda();

			cdr.CmdProcess = 0;
			SetResultSize(3);
			cdr.StatP |= 0x2;
..
..
	// check case open/close
	i = stat.Status;
	if (CDR_getStatus(&stat) != -1) {
		if (stat.Type == 0xff) cdr.Stat = DiskError;

		// case now open
		if (stat.Status & 0x10) {
			/*
			GameShark Lite: BIOS: a0 - a6 (check CDROM status)
			- Won't leave BIOS if DiskError happens

			Vib Ribbon -wants- DiskError for CD swap
			*/

			if( Irq != CdlNop )
			{
				cdr.Stat = DiskError;
				cdr.Result[0] |= 0x01;
			}

			// GameShark Lite: Wants -exactly- $10
			cdr.Result[0] |= 0x10;
			cdr.Result[0] &= ~0x02;
		}

		// case now closed
		else if (i & 0x10) {
			cdr.StatP &= ~0x11;
			cdr.Result[0] |= 0x2;

			// GameShark Lite: Wants -exactly- $42, then $02
			cdr.Result[0] |= 0x40;

			CheckCdrom();
		}
	}

cdriso.c

Code:
Remove all hacks for cdr.Prev
(Not needed anymore)


long CALLBACK ISOgetTD(unsigned char track, unsigned char *buffer) {
	if( track == 0 ) {
		unsigned int pos, size;
		unsigned char time[3];

		// Vib Ribbon: return size of CD
		// - ex. 20 min, 22 sec, 66 fra
		pos = ftell( cdHandle );
		fseek( cdHandle, 0, SEEK_END );
		size = ftell( cdHandle );
		fseek( cdHandle, pos, SEEK_SET );

		// relative -> absolute time (+2 seconds)
		size += 150 * 2352;

		sec2msf( size / 2352, time );
		buffer[2] = time[0];
		buffer[1] = time[1];
		buffer[0] = time[2];
	}
	else if (numtracks > 0 && track <= numtracks) {
Vib Ribbon still has a problem with playing Music CDs. Or Vib -> Music -> Vib. And the slow moving track (SPU plugin).

Guess: F1 2000 may have a 'read delay' problem. Xebra and FPSE run it correctly. Try running "ePSXe.exe -i" to enable this CPU feature.

Back to hibernation.
 
Did you mean 2001? not 2000? are you sure it works in Xebra I seem to remember the cars on the grid just stalling and not moving and when you pressed the button to accelerate / brake or reverse nothing happened only the change current view button responded correctly.
I'm talking about the official game by Studio 33 not the one made by EA Sports.
I don't understand how use fpse I couldn't workout what do with the commandline gui fork thing.

Also another GameShark cd doesn't work either just a black screen nothing else.
 
I can't confirm it for myself - need to borrow a physical or buy the game. Heard (hearsay) that F1 works on Xebra / FPSE. Maybe an older version of Xebra?

Now I see it: Formula One 2001 (PAL)
Formula 1 2001 Review for PlayStation: The last of the saga for the PSOne is not quite the best - GameFAQs
(Kept thinking of the PS2 one)

Guess there can be lots of things then that causes that glitch.
Thanks for the clarification kevstah2004.


Don't know anyone with the GameShark Sampler. Except you. ;)

Could you try this build out?
Download pcsxr-test.7z from Sendspace.com - send big files the easy way

Make sure you're using PEOPS SoftGPU.
You can use Run ISO or Run CDROM (DVD5 plugins only). Press F9/F10 to simulate CD open/close.

If it doesn't work, well.. maybe I'll get at it someday. Whenever. :)
 
No change for me with GameShark Lite still hangs on the loading screen, i'm using a CloneCD image dumped to redump.org standards and double checked with cdmage for errors, how did you get it past the loading screen? was I meant to do something to the cd swapping or was that to test for loading games once it'd loaded properly for me to load games with or without codes? I tried to run the image as well as mounting the image with deamon tools and loading it via the peops plugin.
IMAGE.IMG - CRC32: 07F69B1A
IMAGE.SUB - CRC32: BDAFA6A4
IMAGE.CCD - CRC32: A6E609FA

F1 2001 still the same with fake 'gpu busy' states set, the AI doesn't move and when I go accelerate it goes in reverse then shoots back to foward at a uncontrollabe speed, like I said epsxe is only one that can emulate it to a playable state but it has a rendering bug in the ****pit view all the outside views appear normally. I think it maybe protected by libcrypt, static attempted to make a ppf patch for it but for me it didn't make any difference. I've also tried making .SBI, .M3S files from converting a .SUB file.

Game id is SCES_034.04

Check your pm.
 
GameShark Lite:
Only my build works. PEOPS SoftGPU + Activate Special Game Fixes - Fake GPU Busy States. Tried it all the way through the CD swap plus reboot. Okay.

Virtual CloneDrive + Run ISO.


GameShark Sampler:
Uses some new trick. Eh.


Formula One 2001:
Might look at it later in the week, when I get more time.

Redump claims no LibCrypt. Still doesn't rule out picky subchannel / CDROM protection.
redump.org &bull; Formula One 2001


UPDATE:
For now, GS Sampler works with a cheat code:
D01239ae 3042
801239b0 0001

That turns off the VSync wait loop = emu error. Works totally fine afterwards.
 
My bad I forgot to enable Activate Special Game Fixes too, GS Lite now works this also allows pro action replay cdx3 NTSC-J to work.
GS CDX v3.4 stops on a loading cdx but might because it needs the cdx dongle.
Retested F1 2001 with epsxe in interepter core mode and it got rid of the ****pit rendeing bug, it seems to work fine now haven't noticed anything else wrong, I wish you luck fixing it in pcsx.
GS Sampler works too with that code enabled. Thanks for fixing all these issues :)
 
Thanks for contributing. :) :yay:

Note to devs: ePSXe interpreter mode activates the 'read delay' for load opcodes. Whistler mentions Xenogears 2.0 uses this trick to detect emus. And apparently this game too.

I've heard that Pro Action Replay CDX (or was it Gameshark CDX?) uses CdlPlay on DATA track. Need to check this myself though someday.

Took a quick peak at Formula One 2001 - that's insane for PCSX. It's not BIAS supposedly. I'll check this later in the week (non-priority now). :innocent:

GameShark Sampler masks the VSync interrupts, which kills it right now. Hmm.

Thanks again for helping, kevstah2004. :D
Now I feel like 'sleeping' again. With a snooze button. :lol:
 
Couldn't help myself: GameShark CDX 3.3 analysis

Program gets into a SIO16 read loop, waiting for RX_RDY. Even if there's no dongle available, by _default_ correct behavior may be to set RX_RDY when starting a device.


sio.c
Code:
void sioWrite8(unsigned char value) {
..
..
switch (value) {
case 0x01: // start pad
..
..
case 0x81: // start memcard
..
..
case 0xae: // GameShark CDX 3.3 - unknown, start dongle talk?
  StatReg |= RX_RDY;
  return;
default:
  StatReg |= RX_RDY;
  return;
Then we get the error message about placing a missing hardware unit in the memcard slot. Which I'm not interested in emulating. :p
 
Try this I haven't been able to get this gameshark/ar code to work fast enough with any emulator but with cheat engine and epsxe v1.7.0 I sort of semi got it to bypass the cdx dongle check for gameshark & action replay cdx v3.3, it said the codelist file was currupt though it maybe a problem with the code not activating quick enough because it was flicking constantly between the messages like the dongle was being pulled in and out in a loop.

00 = CDX found.
FF = CDX not found.
--------------------------
301FFE29 00?? = ePSXe.exe+110B01
301FFE2A 00?? = ePSXe.exe+110B02
301FFE2B 00?? = ePSXe.exe+110B03

301FFE3D 00?? = ePSXe.exe+110B15
301FFE3E 00?? = ePSXe.exe+110B16
301FFE3F 00?? = ePSXe.exe+110B17

It reads the save from
Code:
bu?0:DATELCODES
bu?0:CODELIST00
 
GS CDX 3.3 cheat codes:

; Dongle checks
800AFE60 0001
800AFE80 0001
800B0594 0001

; CD swap checks
800902F6 1000
800903E2 1000
80090B7C 0001
80090C00 0001
80090C5C 0001

That will take you past the dongle checks, into the game start.
Switch your CD at the menu. Then start the game.

NOTE: Emus may not be able to boot the new game properly. Unknown.



For my build, I've got a half-decent dongle faker. Takes me to corrupted codes dialog. Need to install magic keys to get to the menu.

CD swap uses a new trick - flush the results buffer / IRQs. Then read ~15 unknown bytes of CD whatever. Completely new to me.
 
101 - 120 of 676 Posts