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 "quake.elf" work.
Posted on 2005-11-07 00:00:00
Implemented instructions DIV1, MTLO and MADD.

Fixed another stupid bug while working on DIV1. There wasn't any allocated variables for the HI1 and LO1 registers, and was using unexisting array indexes 2 and 3 of variables HI and LO instead.

Everything seems to work nice now.


Screenshot #000044 Screenshot #000045


I still have to let the whole thing run to see if there's missing instructions. And it's also running kinda slow and the 20fps figure isn't realistic for the same reasons explained in previous posts.

After this, I'll need to make a decision whether I'll be working on supporting the other version that supports USB input devices or not.

Make "quake.elf" work.
Posted on 2005-11-05 00:00:00
Lots of bug fixing today.

Fixed a bug in LDL and SDR. LDL is using a 64-bits shift routine which was broken because of the emission of a "xor eax, edx" instruction instead of "xor eax, eax". SDR was using the same tables as SDL for some reason. I was probably not paying a lot of attention when I implemented these instructions.

Implemented instruction BC1TL.

Fixed a bug in C.EQ.S and C.LT.S instructions. First of all those weren't compiled to use the right comparaison instruction in x86 language. Unsigned jumps need to be used when moving the condition code register from the FPU to the main CPU and I was using signed ones. The order of the operands was also reversed.

Implemented instruction BC1FL.

The game now seems to be able to load, but it's still screwy. There's still some missing instructions that I'll need to implement.


Screenshot #000042 Screenshot #000043


Make "quake.elf" work.
Posted on 2005-11-04 00:00:00
Fixed the problem with the Quake logo not showing properly. It was caused by a bug in the DMAC emulation where a write to the D_STAT register with CIMx bits set to 0 would clear the interrupt mask bit. Only CIMx bits set to 1 should change the value of the mask. It was causing the interrupts not to be acknowledged properly upon the receival of a REND SIF command and made the SIF library to run out of SIF packets to call the "read" command of the FILEIO module.

Also fixed the problem with invalid memory accesses I described earlier. The program was being overwritten by GIF DMA transfers, since the GS and EE memory was shared, and that would generate invalid instructions. Seeing that, I concluded that there's was no way the GS would have its memory mapped into the EE address space. The GS has now its own 4MB of memory and all GIF DMA transfers are copied into this memory.

Implemented instruction PSUBW.


Screenshot #000041


It's now getting to the point where it's loading the map and other related files, but it still fails to load properly. I'll be working on that tomorrow.

Make "quake.elf" work.
Posted on 2005-11-03 00:00:00
Took some time do fix my IDE configuration and I was finally able to make the compiler optimizations work again.

I've been tracing through the emulated program hoping to find out why more than half of the console graphic is missing. Apparently, it's because it doesn't load correctly from the data files into memory, but I'm not sure about the details yet. More about this tomorrow.

Make "quake.elf" work.
Posted on 2005-11-02 00:00:00
Fixed OS functions RFU060, RFU061 and EndOfHeap. EndOfHeap wasn't reporting the address representing the end of the heap area and that was preventing the memory allocation routines (malloc) from working correctly. This also fixed the problem with fopen since it was using malloc.

Implemented the "lseek" function in FILEIO IOP module. Also, the program tries to open the files with the "mode" bitfield set to 0. I didn't make a big deal out of this for now, but that might indicate that there's a bug somewhere.

Implemented instructions PXOR, BC1T, C.LE.S, DIVU1.

I'm getting some graphical output with all this stuff fixed:


Screenshot #000040


Half of the Quake background is invisible though. I'm not sure this is caused by a DMA problem, but I doubt it, because the console text at the bottom is visible but there's no background behind this text either. Might be another bug in the CPU.

There's also some unaligned memory accesses occuring later on which I'll need to fix.

This screen shot was taken with a build without optimisation that refreshes the screen a lot more than normally, hence the 60 fps rate. The optimized binary generated by the new compiler I'm using doesn't work great and I'm working on finding why it's not working.

Make "quake.elf" work.
Posted on 2005-11-01 00:00:00
Implemented instructions PSUBB, PNOR, PAND, PCPYUD and BGTZL. All the nice MMI instructions are used for string operations (strcpy, sprintf, etc.). There's still one more missing that I could see by letting the program go, but this one can wait a bit.

I also decided to use some SSE stuff to implement PSUBB because it wouldn't be really great to have the 16 x 8-bit additions done using basic x86 stuff. I tried to keep a stack based interface for recompiling this kind of instruction, as I've been doing with everything else in order to have a better abstraction of the CPU used to recompile the MIPS program. While doing this though, I've seen that my FPU abstraction wasn't really good and that maybe I'll have to redo it in a near future.

I've been trying to put some order in the emulated program by putting some names on the functions. I've also been trying to find out why no files are being open for the moment. Quake should open all "PAK*.PAK" files present in the "host:ID1" directory, but right now, it doesn't even attempt to communicate with the SIF to open those files. I think I've found the problem but I still need to track it back to its source. Anyways, more on this tomorrow.

I've also found out that there were two versions of this port of Quake available. The first I've tried and on which I'm working on doesn't support input devices (keyboard and mouse). The newest one supports them, but uses some custom made IOP modules (in addition to the USB driver blunded with the BIOS) to be able to do so. I don't know if I want to work on this part, since I didn't find a solution for loading and executing custom made IOP modules yet... Humm, more food for though...

Make "quake.elf" work.
Posted on 2005-10-31 00:00:00
Implemented instructions MULTU1, MFHI1, MFLO1.

Some more unimplemented MMI instructions are showing up again though. I'm going to implement them tomorrow.

I checked the source code to the video driver for this Quake demo and to update the screen, it only copies Quake's frame buffer into the GS frame buffer (ie.: no primitives are being rendered). This is something used in the first demo I've been working on, and it should be interesting to see how the OpenGL GS handler will respond to that kind of input.

Make "quake.elf" work.
Posted on 2005-10-29 00:00:00
Got the reflection tables up for the EE architecture.

Also implemented MMI instructions PCPYH and PCPYLD. Couldn't really test them though, since the values used with these instructions were 0.

Some more unimplemented MMI instructions are showing up (MULTU1, MFLO1, MFHI1). Should have them implemented next time.

Make "quake.elf" work.
Posted on 2005-10-28 00:00:00
Finished most of the basic work for the new reflection engine and got rid of the old disassembler. I need to change the location of the coprocessor definition structures from the MIPS context to the MIPS architecture definition to be able to remove some useless arguments to the functions in the new engine.

I should be able to work on EE specific tables next and add that missing MMI instruction.

Make "quake.elf" work.
Posted on 2005-10-27 00:00:00
Been working on the new disassembly/reflection engine. I think I've decided on the principle but there's still some details to sort out. Should be almost done tomorrow.

<< Older Log Entries Newer Log Entries >>