![]() |
![]() |
![]() |
![]() |
![]() |
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-02-03 00:00:00 |
Added support for DMA channel 9 (toSPR) because it was required by the motion compensation code to load the blocks from RAM to SPR.
Implemented instructions MTSAB, PEXTLB, PEXTUB, PSRLH, PCGTH. PEXTLB and PEXTUB were again a bit annoying to make work on the SSE target because of the register length difference. The program also uses the instruction QFSRV that's supposed to shift a 256-bits word (which is a combinaison of 2 normal 128-bits registers) right by the amount specified in SA (which is set using MTSAB and MTSAH). That's probably used to offset a block horizontally having the two lines of two adjacent blocks stored in the registers. Because it would be a bit annoying to implement right now and because the value of SA used when I came across the instruction was 0, I just implemented it as if it only could do the shift with SA equal to 0. I'll come back to this instruction when the movie will be able to play completely. Also isolated all the integer VU (MMI) stuff in one seperate module and decided that this module would have its own virtual stack much like the FPU stuff uses it's own stack. I'd also like to isolate all the stuff that generates executable code in a different class than the one that holds the memory space for the instructions, but I'll probably be doing that in the code generator optimization step that I'll undertake later on. I tried to check a bit the data production problem, but didn't find anything significant for the moment. I'll be investigating on this tomorrow. |
Make 'Ys I & II Eternal Story' playable.
Posted on 2006-02-01 00:00:00 |
Found out the place where the program was noticing itself about the rendered frame. It installs an DMAC handler on the GIF channel which is to be called when the frame display list has been done transferring. So, I added support for interrupts on this DMA channel.
But that wasn't enough to make it go further with the decoding. The interrupt handler for the v-blank line was checking the FIELD bit of the CSR and wouldn't set a memory address that would allow the DMAC interrupt handler to do its job properly without having rendered a frame on both even and odd fields of the screen. So, I made the FIELD bit change its value at each v-blank and that did the trick. Bit of a downside about this new thing is that everything else that the game is rendering seems to take this bit in consideration and that it will increment the vertical position of the primitives by one if rendering on an odd field. Added the motion code table to the VDEC command. Added the coded block pattern value decoding in the BDEC command. Now, the decoding can continue properly... But it's hitting another problem later because it seems to be out of data to work on and no one will DMA any more data to the IPU. But before that, it seems to make heavy use of unimplemented MMI instructions to accomplish, what I think is, motion compensation. I'll be working on implementing the MMI instructions tomorrow. |
Make 'Ys I & II Eternal Story' playable.
Posted on 2006-01-31 00:00:00 |
Tested/finalized the CSC IPU command.
Added support for the "destination x position" and "destination y position" members of the TRXPOS register when transfering image data to the GS. These were used when the decoded MPEG macroblocks are transfered to the GS. Made some other minor/esthetic changes in the debugger and in the DMAC module. The game can now display the first frame of the movie, but it won't go any further because there seem to be a problem with the game knowing this frame has been displayed. The interrupt handler for the v-blank line is the one responsible for displaying the frame, so the problem might lie somewhere in its code. I'll investigate on this case tomorrow. |
Make 'Ys I & II Eternal Story' playable.
Posted on 2006-01-30 00:00:00 |
Implemented the CSC command, but didn't have time to test it.
Fixed another small bug with the DCT coefficient decoding that was visible in that last screen shot. Tomorrow, I'll be testing the CSC command and see what's next to be done. |
Make 'Ys I & II Eternal Story' playable.
Posted on 2006-01-29 00:00:00 |
Finally got around ironing the most important bugs with the decoder (ie.: more system marker fixes, quantiser tables stupidity fixes, bad variable addition problems).
I've tried it with a movie from the game that has an interesting I-picture at the beginning and here's what it gives. I should able to add the CSC command emulation tomorrow. |
Make 'Ys I & II Eternal Story' playable.
Posted on 2006-01-28 00:00:00 |
Fixed some more decoding problems in the experimental decoder. Those were due to some system layer markers/data being present at the middle of anywhere (at the middle of a macroblock data bit stream for instance). I created a new specialization of the bit stream processing class and added the parsing of the system layer markers into it.
Now that's fixed, I've been able at last to see the first interesting I-picture of an MPEG bit stream... And it doesn't look very good. I've been playing with the source code of some other MPEG-2 decoder so that it dumps all the decoded blocks into stdout and I can see major differences between thier values and mine... There was a little problem with the default quantization matrix which wasn't of the good type (16-bits integers instead of 8-bits ones), but fixing that doesn't make the picture a lot better. I'll try to make it better tomorrow. |
Make 'Ys I & II Eternal Story' playable.
Posted on 2006-01-27 00:00:00 |
Wasn't able to do much these past couple of days. I worked to get the color space conversion to work correctly in my experimental MPEG-2 decoder, but I'm having some trouble decoding some other bit-streams that have an "interesting" I-picture at the beginning. Tomorrow, I'm going to work on finding out the cause of the decoding problems.
|
Make 'Ys I & II Eternal Story' playable.
Posted on 2006-01-25 00:00:00 |
Added the macroblock type (P-picture) VLC table support to the VDEC command.
With this, it's able to decode a second picture from the bit stream. After decoding those 2 pictures, the library uses the CSC (color space conversion) command on the first picture data to obtain RGB32 values. I'll be working on adding this in my experimental MPEG-2 decoder first, and I will then implement this command into the IPU emulation module. |
Make 'Ys I & II Eternal Story' playable.
Posted on 2006-01-24 00:00:00 |
Added support for reading the IPU_TOP register.
Fixed a little code generation bug for PSUBW on the SSE target. Implemented instructions PMINH, PMAXH, PPACB. PPACB was a bit annoying to implement since there's no direct equivalent on the x86. The instruction closest to it is PACKUSWB which does the same except that it clamps the word in a [0, 255] range instead of taking the 8 least significant bits. It was also a bit annoying to get it work on the SSE target because of the 64-bits size of the operands. These instructions were used in a routine that clamps the IDCT output in a [0, 255] range which it executes after 2 macroblocks are decoded. If I leave it running, it'll ask the IPU to decode a variable length code for the macroblock type for a different picture type than I. I'll be checking this tomorrow. |
Make 'Ys I & II Eternal Story' playable.
Posted on 2006-01-23 00:00:00 |
Added the accumulation of decoded/processed Y/Cr/Cb block data into the out FIFO.
Added the handling of the DMA channel 3 transfer (fromIPU) to transfer the blocks from the FIFO to the RAM/SPR. The basic handling required to execute the BDEC command should be complete now. What it should theorically do afterwards is keep sending this command till the first frame will be fully decoded. It should then after use the unimplemented instructions I've encountered previously to saturate the output of the IDCT. So, I'll be stepping through the code tomorrow to see which thing is going to need to be implemented next. |
<< Older Log Entries | Newer Log Entries >> |