Wednesday, August 3, 2016

Round 1 - Fight!

It's been a while since my last update - I have since moved to Sydney, Australia, and have kept busy with PSX emulation in my limited free time.


The above image (rendered by the BIOS) is what I was stuck on for quite a while. Getting past this screen required a lot more efforts that what I hoped for, including redesigning my CD-ROM controller implementation almost entirely due to me not fully grasping some of the complex documentation. Quite a lot of fixes were brought in by executing/studying Amidog's CPU, GTE, and GPU tests (the latter still highlights significant errors). This hard work paid off as I can now reach and even play some games!


Crash Bandicoot and Spyro both show serious texturing issues. The original code I developed within the software renderer portion of the GPU does not handle texture V coordinates properly, impacting rasterization - I haven't spent time on fixing this yet, but it should be pretty straightforward.


Dino Crisis does not go further that the advisory screen seen above. This is due to LibCrypt, a copy protection scheme relying on erroneous sector position data stored within CD-ROM subchannels. I am currently *simulating* subchannel P, therefore preventing this game from successfully booting.


Street Fighter Alpha 3, being a 2D-only game, does not suffer the artefacts described earlier. Unfortunately, the DualShock controller implementation I have so far seems problematic as most titles seem to miss input strokes, making this game not comfortably playable yet.

I am now focusing on other aspects of the console such as the motion decoder (MDEC) at the moment. Another major task to come is the redesigning of part of my clock ticking system in order to improve overall performance - I simply cannot reach full speed at the moment without various hacks, and this led me to studying and thinking of potential techniques to fulfill this goal. A good candidate so far, which will be a challenge to implement in a generic way, is derived from the "timestamping" method described on NESDev's wiki here:
http://wiki.nesdev.com/w/index.php/Catch-up

This progress would not have been possible without the help of simias (running tests on the real console while working on his own emulator, rustation), as well as Ryphecha (mednafen author, who helped me decipher not-so-well documented features such as scanline rendering and whose source code was helpful to fix some of Amidog's tests). Stay tuned for more updates soon!