What is Play! ?
Play! is a PlayStation2 emulator for Windows, macOS, UNIX, Android, iOS & web browser platforms. For more information about this project please visit the "About" section of this site.

Compatibility Status
Fetching compatibility status...

Development Log

Make 'Ys I & II Eternal Story' playable.
Posted on 2006-01-01 00:00:00
This development is the continuity of the previous one. The goal now is to make this game playable. I don't think there's much to do to be able to achieve this, since this game won't probably use any VIF/VU stuff. But it will most likely use the IPU (Image Processing Unit) that's used to help into the playback of the PSS movies.

But the first thing to do is to make the the DBCMAN IOP module report the controller status properly to the PAD2 library. Once that'll be done and that we'll be able to get past the dialog with asks if we want to play without the memory card, the game should start playing a movie. After the playback is finished, we'll probably have seen everything this game will be using, save for some unimplemented instructions.

As a parallel task, I'd like to implement that reset functionality discussed in the previous development. This will probably be done at the end.

As for today's work, I've been able to implement the basic stuff necessary to allow the game to process the gamepad status succesfully and locate where the button status bits are stored when using the DBCMAN module. Tomorrow, I should be able to unify the interfaces used by the PadHandler class to report the key/button status from the host computer to the IOP modules from the virtual machine.

Make 'Ys I & II Eternal Story' able to boot.
Posted on 2005-12-31 00:00:00
The user interface stuff for binding cdrom0 with a disk image/physical device is now complete. About the "rebinding while running" problem, I thought that reinitializing the ISO9660 object when resetting the virtual machine might be the best thing to do. Resetting would cause all IOP modules to close thier file handles and no references would be kept on the previous ISO9660 object.

So, the idea is that everytime you select the "boot from cdrom0" option, the virtual machine would be resetted. But the reset functionality isn't there yet, and that should be something interesting to add in the context of another development.

This is all for this development. It took quite a long time, but it was worth it. For the next one, I'll probably keep working with this game since there wouldn't be too much to do to make it work at a decent level. Probably only some basic IPU stuff and complete the DBCMAN aka PAD2 IOP module to report the controller status... Most 3D games would probably deal with the VIF stuff which I'd rather work on seperately.

Make 'Ys I & II Eternal Story' able to boot.
Posted on 2005-12-30 00:00:00
Implemented missing instructions MULA.S, MADD.S, MSUB.S. Well, only the basic functionality of these instructions (and some other previous FPU instructions) were implemented since they seem to check a lot of stuff related to overflowing and underflowing in reality. But, no one reads the FCSR to check if these flag bits are set or not, so the basic functionality is good for what it needs.

Added a stub for the "AllocSysMemory" function of IOP module "SYSMEM".

I rechecked the function that calls "SetVSyncFlag" and found out that it passes 2 addresses from its stack frame to it. It then loops waiting for the word value at the first address to be different from zero. So, I got rid of the patch and made "SetVSyncFlag" write a word value of 1 in the first address. It seems to work fine with this now.

During the time this peculiar system call is called, I saw that the program sends some non-system commands (0x4000) to the SIF manager on the IOP side. I think it tries to communicate with a module on the IOP and that this module has an handler registered for this command number. I have no clue why it doesn't use normal RPC calls instead, so it's a bit wierd. But I think this is all related to the sound stuff though, which I have no interest in for the moment.

The only thing remaining is the ability to bind the "cdrom0" device with a physical device. That's coming tomorrow.

Make 'Ys I & II Eternal Story' able to boot.
Posted on 2005-12-29 00:00:00
Implemented the necessary CLUT support to display the colors correctly for the 2 screens.


Screenshot #000063 Screenshot #000064


I've seen some unimplemented instructions pass by that I'll probably be working on tomorrow. And I still gotta fix the "SetVSyncFlag" problem. After those and finishing the cdrom binding dialog it should be all for this development.

Make 'Ys I & II Eternal Story' able to boot.
Posted on 2005-12-28 00:00:00
Tweaked the thread/semaphore stuff a bit so that a thread waiting for a semaphore gets woken up when another thread calls "SignalSema". Also implemented system calls "TerminateThread" and "DeleteThread". These fixes to the OS made the program able to go a bit further.

Made some changes in the "CDVDFSV" IOP module emulation: implemented the "init", "start", "seek" and "read" commands for the streaming function of this module. This allowed the program to go even further.

Next, there was a call to the system call "SetVSyncFlag" which is supposed to, I think, disable the v-sync interrupt handling from the OS. But I didn't want to play with this for now, so I decided to patch the executable so it doesn't hang at this place waiting for a v-sync interrupt to be asserted without being processed.

Then, after fixing the GS handler to be able to display 8-bit textures, some output from the game is now visible.


Screenshot #000061 Screenshot #000062


The first screen is the one when the memory card is being checked, and the second one is the one asking if you want to play without the memory card or not. The CLUT (palette) isn't taken in consideration for now, so that's why the stuff appears as grayscale images. This is pretty much as far as I wanted the thing to go for this development. It's not done yet though... I need to support the CLUT and get rid of the earlier patch.

Make 'Ys I & II Eternal Story' able to boot.
Posted on 2005-12-27 00:00:00
Made the filename of the executable show up in the title bar of the emulator.

Started to work on the dialog that will allow the configuration of the various virtual file system bindings. Much of the user-interface code is done, but the connection with the emulator isn't complete: First, I wanted to be able to support changing the cdrom0 binding in the emulator after confirmation by the user, but this is getting a bit problematic to support because of the way FILEIO file handles for the cdrom0 device keeps a reference to the ISO9660 object I want to reinitialize. I also want to be able bind a physical CD/DVD reader, but I'll work on this at the end of this development. The host, mc0 and mc1 devices are also configurable, but those aren't connected at all with the emulator.

Added a basic call stack window in the debugger.

I did some more work on trying to make the program go a bit further. I was able to identify some more functions and gain, hopefully, a better understanding of how the program seems to work. First, it seems that two memory buffers are allocated: one for sound commands and another one for graphics commands. The way the main loop seems to be layed out is first, reset the screen (clear buffers), update the pad status, process general commands that spawn threads, synchronize CD-ROM read commands, obtain a pointer to the sound command buffer and process it by calling the, what I think to be the, IOP sound module, obtain a pointer to the graphics command buffer and process the commands and finally wait for the next v-sync.

The problem right now though is that it doesn't seem to call any game logic code at all. I've been able to localize it, but nothing seems to get called.

But I think I found the problem. Seems like there's a problem with the semaphore/threads stuff. I'll be working on it tomorrow.

Make 'Ys I & II Eternal Story' able to boot.
Posted on 2005-12-18 00:00:00
Worked a little bit on the "CDVDFSV" IOP module emulation, but didn't do anything significant. I looked around in the code, and I came to the conclusion that it might not be the problem of this being unable to boot: All it does is read some sectors, then check for "SLPS_999.99" and "SYSTEM.CNF" files and do something with the sector position of SYSTEM.CNF. But nothing more than that.

So I turned my attention to a thread that's created by the program later on in the initialization phase. This thread seems to be responsible for initializing a couple of IOP modules at first, sleep for a while and wait to be woken up by the main thread after each vsync. But for some reason this thread fails and is destroyed. So this could be the source of the problem. I tried to change some stuff but without any success... I'll be investigating on this case.

There won't be any updates for a week because I'll be away to visit family for christmas. I'll hopefully have a lot to say when I come back.

Make 'Ys I & II Eternal Story' able to boot.
Posted on 2005-12-17 00:00:00
Changed some stuff to be able to start working on implementing some "CDVDFSV" functions:

- First, the arguments to a SIF RPC call can apparently be modified. For example, the "SearchFile" function will issue a RPC call and read back the arguments buffer to obtain the block address and file size. I dunno how this is possible though... To perform a RPC call, the library first DMAs the argument buffer into the IOP side and sends the command information after. The library never requests the argument buffer back in any way, so maybe the IOP DMAs it back on the EE side. Or maybe it's something specific to this particular function only.

- I also moved the ownership of the ISO9660 object from the "FILEIO" module implementation to the base PS2VM class. This will allow all IOP modules and other potentially interested modules to access the disk without having to know the "FILEIO" module which is a bit more hidden.

These changes should allow me to go further in the implementation of the "CDVDFSV" stuff.

Make 'Ys I & II Eternal Story' able to boot.
Posted on 2005-12-16 00:00:00
Implemented sub-function "kputs" of "Deci2Call" and system call "osPollSema".

Added stubs for "MCSERV" and "DBCMAN". But that didn't change much.

Debugged a bit further in the code and found out some things. This game graphics will probably just be rendered into a local framebuffer and that framebuffer will be uploaded into the GS after each frame is done. That framebuffer is cleared in an initialization phase. The display list that is used to render that framebuffer is also set at the same time. So, the program shouldn't do much on the GS side of things.

I also found out that it uses the "CDVDFSV" IOP module to read a file instead of the much simplier "FILEIO" module (IMHO). But this seems to be working with direct block accesses and such which isn't totally like what I initially thought it would work. Well, I'll investigate a bit more on this...

Make 'Ys I & II Eternal Story' able to boot.
Posted on 2005-12-15 00:00:00
Fixed the interrupt handling stuff a bit... It should be more stable now.

Rewrote most of the GIF module. Added support for the RGBAQ, UV and XYZF2 register addressing modes in the GIF packet.

Fixed a bug with ORI that was mixing a bit the cards on the GIF problems. Fixed XORI at the same time.

Even though now it sends some primivites, all it seems to draw is an empty rectangle. The texture it sends are just pixels set to 0.

I investigated the other system calls I haven't implemented, and it seems to send a message to the console using the "Deci2Call" system call saying that the version of the "MCSERV" IOP module is too old. Guess there's more work to do on this side then.

<< Older Log Entries Newer Log Entries >>