PAL picture very cool, my TV was in PAL standard too, i dream about PAL filter

Added later:
I found bug in Sol-deace, this black border:

Moderator: AamirM
this one is weird (happen also in Gens but differently): Plane B VRAM setup is indeed interrupted by Hint which will set some VDP registers and therefore change the code/address values. When returning from interrupt, further VDP Data writes will be ignored, resulting in this black "gap".Shadow wrote:Thanks Ketsuban, and so CRAM do these color dots.
PAL picture very cool, my TV was in PAL standard too, i dream about PAL filter
Added later:
I found bug in Sol-deace, this black border:
0x00000816: 0x206E 0x0042 MOVEA.L (0x42,A6),A0
0x0000081A: 0x4E60 MOVE A0,USP
0x0000081C: 0x2F2E 0x0002 MOVE.L (0x2,A6),-(A7)
0x00000820: 0x3F2E 0x0000 MOVE.W (0x0,A6),-(A7)
0x00000824: 0x4CEE 0x1FFF 0x0006 MOVEM.L (0x6,A6),D0-D7/A0-A4
0x0000082A: 0x4E73 RTE
this subroutine seems weird in many ways: first, what's the point of setting the User Stack Pointer, I thought games always run in the Supervisor mode ? Secondly, it seems to push data on the stack (A7 pointer) then call RTE instruction as if it was an interupt callback function (but this subroutine is called from main loop).
Well, what happen is that when the Status register is pulled back from stack, the value returned is 0 which make all interrupts unmasked (previous value was 0x500)
EDIT2: found the issue, it's because of VRAM write timings and the delay between VDP FIFO slots in H32 mode: if the delay is a a little too short or too long, horizontal interrupt will end up corrupting scroll plane setup. Adjusting it a little make the interrupt triggers exactly between VRAM setup and fixes the graphical issue.
No.motke wrote:Hmm, this Russian guy is saying that Regen extensively uses Gens' GPL'd source code (see the spoiler). Is he correct?
That's what the game does. It takes tiles from the foot and moves them from the sprite plane to the scroll plane. Don't mind it; there are a lot of weird things going on behind the scenes.dtech wrote:when sprite layer is disabled, mickey's foot is still visible and animating around (how come?)
Pretty basic multitasking. It's using RTE for the switch into user mode then using TRAP #0 for the switch back.Eke wrote:EDIT: more weird stuff, here's the code that seems to accidentely unmask Horizontal Interrrupt too eraly (there is indeed no reason to use HINT during intro).
this subroutine seems weird in many ways: first, what's the point of setting the User Stack Pointer, I thought games always run in the Supervisor mode ? Secondly, it seems to push data on the stack (A7 pointer) then call RTE instruction as if it was an interupt callback function (but this subroutine is called from main loop).Code: Select all
0x00000816: 0x206E 0x0042 MOVEA.L (0x42,A6),A0 0x0000081A: 0x4E60 MOVE A0,USP 0x0000081C: 0x2F2E 0x0002 MOVE.L (0x2,A6),-(A7) 0x00000820: 0x3F2E 0x0000 MOVE.W (0x0,A6),-(A7) 0x00000824: 0x4CEE 0x1FFF 0x0006 MOVEM.L (0x6,A6),D0-D7/A0-A4 0x0000082A: 0x4E73 RTE
Well, what happen is that when the Status register is pulled back from stack, the value returned is 0 which make all interrupts unmasked (previous value was 0x500)
Yes i noticed it on my real thing, games contains alot of hidden bugs which happen on real things...TascoDLX wrote:this subroutine seems weird in many ways: first, what's the point of
Dumb game bug, though. It could've been avoided with just one line of code.
yeah, I noticed that , the TRAP 0 routine which is located a little above do the exact opposite of this fonction. Still it's rather strange that this is called during the main initialization (not the main loop) and it sets the interrupt mask to zero, isn't it ? And the SR is fetched from a memory address ($FF9920) that always return $0000 (it's cleared on startup with the whole RAM then is never modified).TascoDLX wrote: Pretty basic multitasking. It's using RTE for the switch into user mode then using TRAP #0 for the switch back.
.
exactly, there is a flag in RAM that is set when VDP writes loop are in progress which will prevent interrupts from changing VDP settings if set. For an unknown reason, the flag is not set for this specific portion of code (plane B setup).Dumb game bug, though. It could've been avoided with just one line of code.
Does disabling Autofix Checksum solve this?dtech wrote:* Game "show do milhao" (something from Brasil) does not work in the same way like a bunch of other poor quality carts: at startup, screen becomes filled red and that's it.
I don't consider that the main initialization, but that doesn't really matter. The thread for that intro sequence contains its own initialization, as do other threads. The routines merely provide a means for executing thread code. It's up to the programmers to decide where they want to put any init code (and if they want to scatter it around).Eke wrote:Still it's rather strange that this is called during the main initialization (not the main loop)
It is modified. It's written back in the trap routine. Although, for that intro sequence, it tends to write back $0000 anyway.Eke wrote:And the SR is fetched from a memory address ($FF9920) that always return $0000 (it's cleared on startup with the whole RAM then is never modified).
Actually, now I see what it's doing. It's using H-INT to set the window on the top and bottom, so that the text is clipped. But I believe that can be done just as easily with sprites. Oh well.Eke wrote:exactly, there is a flag in RAM that is set when VDP writes loop are in progress which will prevent interrupts from changing VDP settings if set. For an unknown reason, the flag is not set for this specific portion of code (plane B setup).